如果你打算学习编程,成为一名开发者,并找到一份工作,这本书将为你展示如何实现。

这本书已编写完毕,完全免费。你可以在此阅读。

(这是英文原文链接:https://www.freecodecamp.org/news/learn-to-code-book/ 感谢中文版译者:Xing LiuKeren Ma、Kate Shao、songyp0505PapayaHUANGJasonLiNicholas ZhanSuxiongAlan Luoluojiyin、刘俊、Casey Cui、Paula,校对者:Miya Liu

几年前,纽约市的 5 家头部出版商之一找到我,希望与我合作出书。我和他们当面聊了下,可当时我根本抽不出时间来写书。

现在我终于有时间写书了,而且我打算让大家在 freeCodeCamp 上免费阅读我写的这本书。

信息本身即是自由且免费的,对吧?🙂(译者注:原文 “Information wants to be free” 旨在表达信息本应无障碍地被人们获取,见此词条,英文中的 free 既有“自由”也有“免费”之意;另外,此处译文参考自这里

这本书包括了我对学编程和成为开发者的许多思考,因此篇幅较长,通读可能需要几个小时。

以下是我的个人经历:

  • 30 多岁开始学习编程
  • 然后成为软件工程师
  • 之后,我于 8 年前(2015 年)创办了 freeCodeCamp.org。现在,每天都有一百多万人来这里学习数学、编程和计算机科学

在这之前,我是一名从未接触过编程的英语老师。不过,我在开始学习编程一年后就获得了我的第一份开发者工作。

在这个过程中,我没有花一分钱购买书籍或参与任何课程。

(确切地说我其实花钱了,因为我经常跑到周边城市参加了技术会议。后文中会提到,这些钱花得非常值得。)

做了几年软件工程师之后,我觉得是时候改变一下了:我想教会其他人如何实现职业生涯的转换。

一开始我尝试着做了一些技术类的教学工具,但反响平平。直到有一个周末,我上线的 freeCodeCamp.org 竟成为了爆款,吸引了很多用户,逐步构建了 freeCodeCamp 社区。

一直以来,我们在社区内互相帮助。现在,全世界的人们得以通过 freeCodeCamp 来为自己的第一份技术工作做准备。

你也许会想:“我可能没那么多时间读完整本书”。

没关系,你可以把它存为书签;之后有空了随时回来继续读。这本书会一直在这里等你。

或许你还可以尝试在社交网络上分享,说:“看,我在读这本书”,并附上链接。你可能想不到,这是一种很好的激励方式,有助于你尽快读完这本书。

我这样说的目的不是要把书卖给你;其实在你打开这个页面的时候,这本书就已经是你的了。我是想告诉你,这本书绝对值得你抽出一些时间来读完😉。

我理解,你的时间很宝贵。所以这本书里绝对不会有任何的虚构和炒作,只会有直率且可执行的建议。

我会尽力在这本书的每一章内容里多写一些我的思考和理解。

噢对了,书都应该有个目录的吧。

来,请看目录:

目录

前言:本书适合的人群

这本书适合所有正在考虑从事软件开发职业的人。

如果你打算从事一份工作时间灵活、薪资高、解决问题方式不死板的工作,软件开发职位很可能符合你的需求。

当然,学习软件开发离不开这三点:时间机遇

你可能已人到中年,上有老下有小,平日空闲时间不多。

你可能很年轻,或许还不具备提升薪资的能力,因此还没有攒下

或者你所在的城市技术氛围不浓,离那些着重发展科技的城市(如旧金山、柏林、东京、班加罗尔)比较远。

还有人患有残疾;有人饱受年龄、种族、性别歧视;有人因移民身份或犯罪记录四处碰壁。

对这些人来说,他们的机遇本身就比其他人少。

每个人的起点不同,周围环境和资源也不尽相同;学习编程和找到开发者工作对这些人来说会比其他人更困难。

但无论你的起点和资源如何,我都会尽力给出我认为适合的建议。

总之,请继续读下去,你一定会有所收获。

文中涉及的专业词汇

我会尽力在提到新词的时候顺便给出定义。

有些词汇出现频率很高,比如:

“编程”(programming)和“写码”(coding)意思相同。

“应用”(app)是 application 的缩写;且这里的 app 是泛指,包括但不限于在手机、电脑、游戏主机甚至冰箱上运行的应用(译者注:作者不认为 app 是 iPhone 手机应用的专属称谓)。

“软件工程师”(software engineer)和“软件开发者”(software developer)意思相同。

技术圈的一些人对此持有不同意见,仿佛“软件工程师”这一职位已饱经沧桑,其发展史横跨几个世纪,就好像机械工程师和土木工程师一样。也许多年后你的孙辈会这么认为,但至少目前,软件开发这一领域尚处于发展初期。

以下引用一位名人说过的话:

如果建筑师像程序员写程序那样造房子,那么一只路过的啄木鸟就足以摧毁整个社会 —— 杰拉德·温伯格(计算机科学家、作家、大学讲师)

所有人都可以学习编程吗

是的,我坚信只要驱动力足够,人人都可以学习编程。归根结底,我认为学习编程是一个与驱动力有关的挑战,而不是靠天资吃饭。

曾经,我们的祖先在广袤的非洲草原上生活了几千年,然后才迁徙到了欧洲、亚洲和美洲。那时根本没有电脑。

编程也显然不是经历了几千年发展的技术,计算机和智能手机是在 1980 - 2010 年间经历飞速发展的。

虽然我也认同天资和兴趣可以让学习编程之路走得更加顺利,但对于想从事开发者职业的人来说,我觉得花时间去练习和敲代码才是正道。

很多人是这样,他们会开始学习编程,然后遇到困难,同时感到非常受挫,进而放弃。

我也放弃过,事实上我之前因为受挫放弃了好几次。

但和那些最终成功入行的人一样,我都是在放弃后的几天调整好心情,然后重新回来接受挑战。

说了这么多,我是想告诉你:学习编程并获得一份开发者工作其实并不容易;对于一些有特殊情况的人来说更是难上加难。

我不想在这里为自己编造一个逆境翻盘的人设。我是从 30 多岁开始学习编程的,在这之前我也确实没有任何编程或计算机科学的学习经验。不过:

我在美国中产阶级的家庭里长大,我是这个家庭的第四代,而且我的母语是英语。我读过大学,我的父亲和爷爷也都读过大学;我的曾祖父(爷爷的父亲)是来自瑞典的农民。

这几代以来,我的家庭很幸运,至少我们没有受到战争、饥荒、奴隶制的影响。

因此,在我身上并没有逆境翻盘的剧本,我也不打算编造这样的故事来激励你。

如果你对这类经历感兴趣,其实开发者社区中有一些人经历过逆境翻盘,稍后我会在这本书里提到一些人,供你参考。

我不打算吹捧软件开发,也不打算为学习编程这件事情画饼,构建出一个虚幻的乌托邦。

相反地,我只会为你提供学习技术的方法建议,以及如何获得一份可以养家糊口的好工作。

如果你学习编程的目的是找一份好的、稳定的工作,那没问题。

或者你学习编程的目的是为了自己创业,那也没问题。

一些人认为,学习编程最重要的是要对编程有极大的兴趣,而且要有全身心投入学习编程的决心:就是那种甘愿辞掉自己工作,一周七天都在搞开源项目,并乐在其中。

我确实认识一些对编程有如此兴趣的人,但同时我也认识很多不这么硬核的人:他们在一周的劳顿后,更愿意在周末探索自然,或者和朋友玩桌游。

人都是这样,我们会更倾向于做自己擅长的事情。你会在学习写代码的过程中逐渐提升自己的编程水平,进而提升对编程的兴趣。

那么说到底,这本书的受众到底是谁?其实就是想要学习编程、并获得一份开发者工作的每个人。

无论你本身是“极客”,还是个内向的人,或者你是个理性的激进分子,你都可以学习编程。

或者你还有以上没提到的其他特质,那也无妨。这些都不会成为你学习编程道路上的绊脚石。

总之,只要你是想学好编程并通过编程赚钱的人,那这本书就是为你量身打造的。

在通读此书前,请你花一点时间读完以下的概论章节。

概论

学习编程本身并不容易,而想要拿到一份软件开发职位其实更难。不过对于大多数人来说,这份努力一定是值得的。

编程是高薪的、包含创新性工作的脑力劳动。职业发展路线也很明确:高级开发、技术领头人、管理岗、CTO,然后或许可以成为 CEO。

任何行业都需要软件开发。在所有软件开发职位中,非技术类公司约占 66%;这类公司包括农业、制造业、政府部门、以及像是银行和医院这样的服务业。

如果你很担心软件开发这一职业会在你退休之前被自动化工具取代,不妨这样考虑:编程本身就是在让事情自动化。因此就算将来编程可以自动化,那也会是最后被自动化取代的职业。

如果你看到了这里,希望你和我的想法一致,认为软件开发是一份不错的职业。接下来,咱们来讨论下如何进入软件开发领域吧。

打造自己的技术栈

你需要学习如下内容:

  • 前端开发:HTML、CSS、JavaScript
  • 后端开发:SQL、Git、Linux、网页服务器
  • 科学运算:Python 及其相关

以上提到的都是有 20 多年的发展史,而且发展相对成熟的领域。不论你将来为哪家公司效劳,都大概率会用到上面提到的这些技术。

学习这些东西的最好方式是做项目,最好是在学习过程中坚持一天做几个小项目。顺便,freeCodeCamp 上的课程里总共有几十个项目。

freeCodeCamp 核心课程里的一些版块(Certification:认证)
freeCodeCamp 核心课程里的一些板块(Certification:认证)

拓展自己的人脉

人脉广的人一般能更快找到自己想要的工作。

内向虽然不是问题,但有时候你或多或少要跳出自己的舒适圈。

不如从为自己创建 GitHub、Twitter、LinkedIn 和 Discord 账号开始吧。

尽量多参加技术会议,哪怕是需要坐火车、高铁、飞机去的那种。我建议你把学习编程的资金预算花在通勤和技术会议门票上,而不是花在购买书和课程上。

多与有识之士攀谈,认真听取他们的观点,而且记住他们的名字。

然后在 LinkedIn 上添加他们为好友,在 Twitter 上关注他们。如果你参加的技术会议有会后聚餐的安排,不要错过。

提升自己的圈内名声

可以考虑为自己做的项目录制一段 demo,然后发到网上。

尝试申请成为技术会议的演讲人,越大型的会议越好。

在程序员的聊天频道里,花一些时间帮助那些比你晚入行的朋友们。

参与贡献开源项目。开源项目的开发和公司里的软件开发其实有很多相似之处。

这些事情可以同时做,没有先后顺序。 不要拖延。

与其海投职位等结果,不如考虑多认识些人,让他们帮你内推。哪怕你认识人力资源部门的朋友,也会有帮助。

在拿到 offer 之前,不要停下面试的脚步;甚至你也可以选择不接受第一份 offer,要有耐心。

你的第一份开发职位一定是对你来说最有挑战性的。建议考虑至少做两年。别忘了,在这个过程中,你不只是在学习,还有收入。

找到工作也绝不意味着学习的终止。事实上,在公司与团队合作和维护代码都是学习的过程。

当然,身体健康一样重要。别忘了按时作息,保证睡眠和运动。

只要有足够的驱动力,任何人都可以学习编程并找到一份开发工作。

区别只是你有多想成为开发者,以及你在找工作的过程中有多坚持。

保持信念:你一定可以的!

谨以此书献给 freeCodeCamp 全球社区成员。

感谢所有在过去 8 年中支持我们的慈善机构和使命的人们。

正是因为你们的志愿服务和慈善行动,我们才能够帮助这么多人学习代码,获得他们的第一份开发者工作。

从 2014 年我第一次部署的那个简陋的开源项目开始,这个社区已经发展得非常好。我现在只是这个全球社区的一个小部分。

我很荣幸还能在这里,与你们大家一起工作。我们一起面对我们这个时代的基本问题:获取信息的机会,获得教育的机会,以及学习使用那些塑造未来的工具的机会。

这项事业仍处发展早期。我不幻想在我的有生之年每个人都能知道如何编码。但是,就像古腾堡圣经在 1455 年加速了扫盲一样,我们可以通过免费、开放的学习资源继续加速技术扫盲。

再次感谢大家。

并特别感谢 Abbey Rennemeyer 帮助编辑和反馈,以及感谢 Estefania Cassingena Navone 帮助设计封面。

接下来是这本书的正文。

第一章:如何打造自己的技术栈

“每个艺术家一开始都是业余爱好者。” ― Ralph Waldo Emerson

掌握如何编程是一条漫长的道路。

对我来说,这是条崎岖的路。

但对你来说不必这样。

我将分享一些策略,帮助你尽可能顺利地学习编程。

首先,请让我带你了解我在 2011 年是如何学习编程的。

之后我会分享在这过程中我学到了什么。

我会向你展示如何比我更高效地学习。

故事时间:一个 30 多岁的老师是怎么教他自己编程的

我曾是一名老师,运营一所英语学校。我们有大概 100 个从世界各地前往加州的成年学生。他们通过学习提高英语能力以进入研究生学校。

学校的大部分老师热爱教学。他们热衷于和学生在城市里逛,以帮助他们提高口语能力。

但这些老师并不喜欢文书工作:出勤报告、成绩报告、移民文书。

我希望老师们能花更多时间和学生相处,而花更少时间在办公桌前做文书工作。

但我对计算机了解什么呢?

编程?难道不需要聪明才智就能会编程吗?我甚至不能配置一个 WiFi 路由器。并且我的数学很差。

直到有一天,我决定把一切都抛到一边,然后想:“我要去试一试编程。试一试,我能失去什么呢?”

我开始在谷歌上搜索诸如“如何自动点击浏览网站”之类的问题。以及“如何将网站数据导入 Excel”。

我当时没有意识到,我正在学习如何自动化工作流程。

于是学习开始了。首先是 Excel 的宏。然后是一个叫 AutoHotKey 的工具,你可以用它对你的鼠标进行编程,使其移动到屏幕的某些坐标上,点击,复制文本,然后移动到不同的坐标上并粘贴它。

在黑暗中摸索了几周后,我想出了如何将一些任务自动化的方法。我可以打开一个 Excel 电子表格和一个网站,运行我的脚本,10 分钟后回来,电子表格将被完全填充。

这是一个业余爱好者做的事。开发人员可能称之为“肮脏的黑客”。但它完成了工作。

我利用我新发现的自动化技能,继续简化学校的工作。

很快,老师们几乎不需要碰电脑。我只是用我最基本的技能,就完成了几个老师的工作。

这对学校产生了明显的影响。以前,我们的很多时间都被电脑上机械的工作捆绑住了,而现在我们有了自由。

老师们更高兴了。他们可以花更多时间与学生相处。

学生们也更高兴了。他们告诉他们在家乡的所有朋友,“你一定要来看看这所学校”。

很快,我们成为整个学校系统中最成功的学校之一。

这让我更有底气。我记得我自己在想:“也许我可以学习编码。”

我在棋牌游戏之夜认识了一些软件工程师。他们有传统的教育背景,拥有加州理工学院、哈维穆德学院和其他著名计算机科学课程的学位。

在当时,30 多岁的人学习编程的情况要少得多。

我鼓起勇气与这些朋友中的一些人分享我的梦想。

我想学习如何正确编程。我希望能够像他们那样以写代码为生。也许还能写出能为学校赋能的软件。

我与我的开发者朋友分享这些梦想,“我想做你做的事”。

但他们会耸耸肩,然后说一些类似的话:

“我的意思是,你可以试试。但你将不得不饮下整个知识的海洋。”

“这是个竞争相当激烈的领域。你怎么能和那些从小就开始编码的人共事?”

“你作为一名教师已经做得很好了。你为什么不坚持做你擅长的事情?”

这让我在几周里迷失了方向。我会在晚上进行长时间的反思性散步。我会在星空下思索我的未来。这些人是对的吗?我是说——他们真的知道,对吗?

但每天早上我都会回到我的办公桌前,看着我的脚本运行,看着我的报告以超人的速度自行编译,看着我的电脑为我效劳。

我确实想到了一个问题:也许这些朋友只是想把我从心痛中拯救出来。也许他们只是不知道有谁在 30 多岁时学会了编程。所以他们认为这是不可能的。

这就像……多年来,医生认为一个人在 4 分钟内跑完一英里是不可能的。他们认为你的心脏会因为跑得太快而爆炸。

但后来有人成功做到了,并且他的心脏没有爆炸。

Roger Bannister ——一个 25 岁的牛津大学学生--打破了这个心理障碍--其他许多人也都做到了。迄今为止,已有超过 1000 人跑出了 4 分钟以下的成绩。

像冠军一样奔跑(照片来源:大英百科全书)
Roger Bannister 像冠军一样奔跑(照片来源:大英百科全书)

而且,我也不是在做什么大胆的、史无前例的事情,比如在这里跑了 4 分钟的路程。多年来,很多著名的开发者都设法自学了编程。

哎呀,Ada Lovelace 在 19 世纪 40 年代就自学了编程。而她甚至没有一台可用的计算机。她只是了解了她的朋友 Charles Babbage 的计算机在理论上是如何工作的。

她写了几个最早的计算机算法。她被公认是世界上第一个计算机程序员。没有人教她,因为没有人可以教她。无论她有什么自我怀疑,她显然克服了这种怀疑。

我不是 Ada Lovelace。我只是一个拥有一台可用的电脑、良好的互联网连接,并且能够使用 Google 搜索数十亿个网页的老师。

我掰开指关节,眯起眼睛。我要自学编程。

陷入教程地狱

“如果你工作了 10 年,你是得到了 10 年的经验还是把 1 年的经验重复获得了 10 次?你必须对你的活动进行反思,以获得真正的经验。如果你把学习作为一个持续的承诺,你会得到经验。否则,无论你工作了几年,你都不会获得经验。” - Steve McConnell,软件工程师

在接下来的几个星期里,我花了很多时间在谷歌上搜索,并做一些在网上遇到的随机教程。

哦,看,一个 Ruby 教程。

呃,哦,开始变得困难了。我得到了教程中没有提到的错误信息。嗯……这到底是怎么回事……

哦,看,一个 Python 教程。

人类的心理是个有趣的东西。当事情开始变得困难的时候,我们会问:我这样做对吗?

也许这个教程已经过时了。也许它的作者不知道他们在说什么。甚至还有人在使用这种编程语言吗?

当你在编码过程中面对模棱两可的错误信息时,邻家的草分外青,这山望着那山高。

假装我已经取得了进展是很容易的。是时候去吃午饭了。

我在咖啡馆里遇到一个朋友。“你的编码工作进展如何?”他们会问。

“很好。我今天已经编码了 4 个小时。”

“太棒了。有机会我很想看看你在做什么。”

“当然”,我说,即使我知道我什么都没做,“很快你可以看到。”

也许我会去书店,买一本新的 JavaScript 书。

买书是世界上最好的感觉。因为这也有种你在购买时间来阅读它们的感觉。

而这正是我在学习代码的几周后的情况。

我读了几本编程书籍的前 100 页,但没有完成任何一本。

我写了几本编程教程的前 100 行代码,但没有完成。

我不知道,但我被困在了一个被开发者亲切地称“教程地狱”的地方。

教程地狱是指你从一个教程跳到另一个教程,重新学习同样的基本原理。但从未真正超越基本原理。

因为超越基本原理——这需要一些真正的努力。

培养一个程序员需要一个村庄

学习编程榨干了我所有的空闲时间。但我并没有取得什么进展。我现在可以在不看键盘的情况下输入{*字符。但也就这样了。

我知道我需要帮助。也许是一些像 Yoda 一样的导师,他可以教我方法。是的,如果有这样的人存在,那肯定会让一切变得不同。

我发现附近有一个叫做“黑客空间(hackerspace)”的地方。当我第一次听到这个名字时,我有点忐忑不安。难道黑客不做非法的事情吗?我是一名英语教师,喜欢玩棋盘游戏。我并不想惹麻烦。

好吧,我拨通了列出的号码,和一个叫 Steve 的人交谈。我紧张地问:“你们不做违法的事,是吗?”Steve 笑了起来。

事实证明,“黑客”这个词被他称为一个超负荷的术语。是的-—“黑客”可以指恶意闯入一个软件系统。但 “黑客”也可以指更平凡的事情:编写计算机代码。

一些东西可以是“黑客”,意味着它不是一个优雅的解决方案。然而,你可以有“聪明的黑客”——一个巧妙的技巧,使你的代码更有效地工作。

简而言之:不要害怕“黑客”这个词。

Facebook 的企业园区在混凝土上用巨大的字母写着 “hack” 一词(图片来源:彭博社)
Facebook 的企业园区在混凝土上用巨大的字母写着 “hack” 一词(图片来源:彭博社)

就我而言,我很少使用这个词,因为它太令人困惑了。而且我认为最近很多黑客空间已经意识到了这种模糊性。他们中的许多人现在称自己为“创客空间”。

因为这就是创客空间的全部内容--制造东西。

Steve 邀请我在星期六下午参观黑客空间。他说该地区的几个开发人员会在那里。

当我第一次走进 Santa Barbara 黑客空间的大门时,我被震撼了。

这个地方闻起来有一股电气的味道。临时搭建的桌子上摆放着电烙铁、LED 灯条、业余爱好者的 Arduino 电路板和成堆的 Roomba 真空机器人。

与我通过电话的那个 Steve 也在那里,他向我问好。他戴着眼镜,头发向后梳理,留着山羊胡须。他总是面带微笑。当你问他问题时,他不会迅速回答,而是先点点头,思考几秒钟。

Steve 是一个充满激情的程序员,曾在加州大学圣巴巴拉分校学习数学和哲学。他对这些学科仍然充满热情。但他真正热爱的是 Python。

Steve 打开了投影仪,做了一个非正式的“闪电演讲”。他正在演示他写的一个应用程序,该程序可以识别视频中的二维码,并将其替换为图像。

观众中有人在他们的笔记本电脑上调出了一个二维码,并把它放在摄像机前。然后,Steve 的应用程序将二维码替换成一张比萨饼的图片。

观众中有人喊道:“你能让比萨饼旋转吗?”

Steve 在一个名为 Emacs 的代码编辑器中打开了他的代码,并开始实时地对其进行修改。他毫不费力地在他的代码编辑器、命令行和应用程序运行的浏览器之间进行切换,“热加载”代码的更新。

对我来说,这就是魔法。我无法相信 Steve 在几个小时内就完成了这个应用程序。而现在,他正在根据听众的要求,不断增加新的功能。

我想:“这家伙是个天才”。

那天晚上,活动结束后,我和他留了下来,我这样告诉他。

我们一起吃了三明治。我对他说:“我可以在我的整个职业生涯中编码,但不能像你一样好。如果 10 年后我的代码能达到你的一半,我就很高兴了。”

但 Steve 反驳了我,他说:“我没有什么特别的。不要限制自己。如果你坚持编码,你可以轻易地超过我。”

我丝毫不相信他对我说的那些话。但是,仅仅是他说这句话的事实就使我产生了蝴蝶效应。

他是一个相信我的开发者。他看到了我——一个偶遇的老师——一个“脚本小子”的定义——并认为我可以成功。

Steve 和我一直聊到深夜。他给我看了他那台价值 200 美元的上网本电脑,即使以 2011 年的标准来看,它的性能也是非常差的。

“你不需要一个强大的电脑来构建软件”,Steve 告诉我,“今天的硬件是令人难以置信的强大。计算机之所以慢,只是因为它们运行的臃肿软件使它们变慢。买一台现成的笔记本电脑,清空硬盘,在上面安装 Linux,然后开始编码。”

我记下了他的笔记本电脑的型号,并在当晚回家后订购了完全相同的一台。

在用 Stack Overflow 调试了我的新电脑几天后,我成功地安装了 Ubuntu。我开始学习如何使用 Emacs 代码编辑器。到了下一个星期六,我知道了一些命令,并很快就把它们展示了出来。

Steve 点头表示赞同。他说,“太棒了。但你在码什么?”

我不明白他的意思。“我在学习如何使用 Emacs。来看看。我记住了……”

但 Steve 看起来若有所思。“这些很酷。但你需要一个项目。总要有一个项目。然后学习你在完成该项目过程中需要学习的东西。”

我除了写过几个脚本以帮助我的学校的老师之外,我从来没有完成过任何东西。但我开始明白他所说的是什么意思。

这一刻我恍然大悟。一直以来,我都被困在教程的地狱里,兜兜转转,什么也没完成。

Steve 说:“我希望你用 HTML5 建立一个项目。下周六,我希望你在黑客空间展示它。”

听到他的话,我感到很羞愧。但我站直了身子,对他说:“这个计划听起来不错。我这就开始做。”

除了你,没有人可以让你成为一个开发者

“我试着解放你的心灵,尼奥。但我只能带你到门口,你必须自己走过去。”(莫斐斯,1999 年电影《黑客帝国》)

第二天早上,我在上班前起得特别早,在网上搜索 “HTML5 教程”之类的东西。在之前的教程地狱中,我已经了解了很多相关知识。我没有跳过,而是放慢脚步,准确地跟着教程走,输入每一条命令。

通常情况下,一旦我完成一个教程,我就会去找另一个教程。但是,我却开始练习教程中的代码。我对自己想做的项目有了初步的想法,我打算制作一个纯 HTML5 的文档页面。

---

如果你不知道什么是 HTML5,让我快速地解释一下。它只是 HTML 的一个较新的版本,从 20 世纪 90 年代的第一个网页开始,它就已经存在了。

如果一个网站是一个身体,那么 HTML 就是骨头。其他一切都建立在这些骨骼之上。(你可以把 JavaScript 看作是肌肉,把 CSS 看作是皮肤)。

让我们重新回到故事上来。

---

我已经知道在 HTML 中,你可以通过使用 ID 属性链接到同一个网页的不同部分。所以我想:如果我沿着左边放一个目录会怎么样?点击左边的不同选项(item),右边的页面就会相应地滚动并显示这些项目。

半个小时内,我就编出了一个粗略的原型。

但是又到了去学校报到的时间了,我只好中断编程。整整一天,我所想的都是我的项目,以及我应该如何最好地完成它。

我飞快地跑回家,打开我的笔记本电脑,花了整整一个晚上来编码。

我把官方和使用创作共用许可证(Creative Commons license)的 HTML 文档直接复制到我的页面,把它“硬编码”到 HTML 中。

然后,我花了大约一个小时的时间在 CSS 上,让所有东西看起来都是正确的,并使用绝对定位来保持侧边栏的位置。

我尽可能多地使用了 HTML5 的新“语义”标签。

轰——项目完成了。

一股成就感涌上心头。我慢跑到附近的一个足球场,绕着球场跑了几圈,庆祝一下。我成功了,我完成了一个项目。

我当时就决定:从现在开始,我所做的一切都将成为一个项目。我将努力使它成为一个成品。

第二天晚上,我走到讲台上,插上我的笔记本电脑,展示了我的 HTML5 网页。我回答了在场的开发者们关于 HTML5 的问题。

有时我会弄错一些东西,这时我会听到听众说,“这听起来不对——让我查查文档。”

人们并不害怕纠正我。但他们都很有礼貌,而且乐于提供支持。我甚至不觉得他们在纠正我,感觉他们比较像是在纠正公共记录,以免有人带着错误的信息离开。

我没有感到任何可能在在职教师会议上发表演讲的焦虑。

相反地,我几乎觉得自己是观众的一部分,与他们一起学习。

毕竟,这些都是新兴的开发工具。我们都在努力了解如何使用它们。

我的演讲结束后,史蒂夫走过来对我说:“还不错。”

我尴尬地笑了很久,没有说什么,只是对自己很满意。

然后史蒂夫眯着眼睛,抿起嘴。他说:“今晚开始你的下一个项目。”

我的编码之旅的经验教训

我们会在接下来的每一章中查看年轻的 Quincy的编码之旅。但现在我想把这里的一些教训分解一下。我还想回答你可能有的一些问题。

为什么学习编码如此困难

学习任何新技能都是困难的。无论是运球,还是给汽车换油,或是说一门新的语言。

有几个特别的原因让学习代码如此困难,而其中一些是编码所特有的。

第一个原因是,大多数人不明白编码到底是什么。那么,我这就来告诉你。

什么是编码?

编码是用计算机能理解的方式告诉计算机要做什么。

所谓的编码就仅仅是这样而已。

但你不要搞错了,与计算机沟通是很难的。按照人类的标准,它们很“愚蠢”。它们会完全按照你的要求去做,但除非你擅长编码,否则它们可能不会做你“想”让它们做的事。

你可能在想:那服务器呢?数据库呢?网络呢?

归根结底,这些都是由一层层的软件控制的,而这些软件都是由代码所组成。从最上层一路往下都是代码所构成的,直到抵达最底层的物理硬件,也就是在电路板上移动的电子。

在计算机发展最初的几十年里,开发人员编写的代码是“接近金属”的,意思是他们通常是直接在硬件上操作,将比特从 0 翻转到 1,再翻转回来。

但是,当代的软件开发涉及许多 "抽象层"——一个程序运行在另外的程序之上,仅仅几行 JavaScript 代码就可以完成一些非常强大的事情。

在 20 世纪 60 年代,一个 “bug”(虫子,也有程序错误的意思)可能是一只昆虫在一个房间大小的计算机中爬来爬去,并在其中一个电路中被烧毁。

1945 年发现的史上第一个计算机虫子是一只飞蛾,它被困在哈佛大学一个房间大小的计算机的面板中(图片:Public Domain)
1945 年发现的史上第一个计算机虫子是一只飞蛾,它被困在哈佛大学一个房间大小的计算机的面板中(图片:Public Domain)

今天,我们编写的代码比物理硬件高出了许多抽象层。

这就是编码。它比过去要容易得多。而且它每年都在变得更加容易。

不夸张地说,几十年后,编码将变得如此简单和普遍,以至于大多数年轻人都会知道如何编码。

为什么即使在 2023 年,学习编码仍然很难

即使在 2023 年,学习编码也是如此困难,有三大原因。

  1. 工具仍然很原始。

  2. 大多数人不善于处理模棱两可的问题,而学习编码面对的就是这样的问题。人们常会迷失方向。

  3. 大多数人不善于处理持续的负面反馈,而学习编码常常会收到一个又一个残酷的错误信息,会使人感到沮丧。

现在我将更详细地——讨论这些困难。我还会教你一些实用的策略来克服每一项困难。

工具仍然是原始的

来自《星际迷航:下一代》着魔似的巴克利(Barclay)在全息甲板(Holodeck)上编程
来自《星际迷航:下一代》着魔似的巴克利(Barclay)在全息甲板(Holodeck)上编程

“计算机,开始新的程序,创建如下:工作站的椅子,现在创建一个标准的字母数字控制台,定位在左手;现在为右手创建一个标志性的显示控制台。将这两个控制台与企业主计算机核心相连,利用神经扫描界面。”——巴克利,来自《星际迷航:下一代》第四季第 19 集:“第 N 度”

上面我拿了我最喜欢的科幻电视剧《星际迷航:下一代》中的一段作为例子,告诉你这就是人们在未来可能的编程方式。

《星际迷航》中的每个角色都会编码。医生、保安人员、飞行员,甚至小韦斯利-克鲁舍(Wesley Crusher,由儿童演员威尔-惠顿扮演)也能让飞船上的计算机听从他的命令。

当然,每个人都会编码的原因之一是他们生活在一个后稀缺的 24 世纪社会,可以获得免费的高质量教育。

另一个原因是,在未来,编码会容易得多。你只需准确地告诉计算机要做什么,然后,如果你足够精确,计算机就会执行。

如果编程就像用简单的英语对计算机说指令一样容易呢?

我们已经朝着这个目标取得了重大进展。想一想以前我们的祖母,她们在房间大小的大型计算机和成堆的打孔卡(punch cards)之间奔波。

20 世纪 50 年代使用打卡机的计算机(图片:NASA)
20 世纪 50 年代使用打卡机的计算机(图片:NASA)

过去,即使是一个简单的应用程序的编程也需要严谨的指令。

这里有两个“凯撒密码(Cesar Cypher)”的例子,这是经典的计算机科学家庭作业项目。

这也被称为 “ROT-13”,因为你将字母 ROT 了 13 个位置。例如,A 变成 N(A 后 13 个字母),B 变成 O(B 后 13 个字母)。

我将向你展示这个程序的两个例子。这两个例子都来自创作共用许可证的罗塞塔代码(Rosetta Code)项目。

首先,这是 x86 汇编中的程序:

format 	ELF 	executable 3
entry 	start
	
segment	readable writeable
buf	rb	1
	
segment	readable executable
start:	mov	eax, 3		; syscall "read"
	mov	ebx, 0		; stdin
	mov	ecx, buf	; buffer for read byte
	mov	edx, 1		; len (read one byte)
	int	80h

	cmp	eax, 0		; EOF?
	jz	exit

	xor 	eax, eax	; load read char to eax
	mov	al, [buf]
	cmp	eax, "A"	; see if it is in ascii a-z or A-Z
	jl	print
	cmp	eax, "z"
	jg	print
	cmp	eax, "Z"
	jle	rotup
	cmp	eax, "a"
	jge	rotlow
	jmp	print

rotup:	sub	eax, "A"-13	; do rot 13 for A-Z
	cdq
	mov	ebx, 26
	div	ebx
	add	edx, "A"
	jmp	rotend
	
rotlow:	sub	eax, "a"-13	; do rot 13 for a-z
	cdq
	mov	ebx, 26
	div	ebx
	add	edx, "a"

rotend:	mov	[buf], dl
	
print: 	mov	eax, 4		; syscall write
	mov	ebx, 1		; stdout
	mov	ecx, buf	; *char
	mov	edx, 1		; string length
	int	80h

	jmp	start

exit: 	mov     eax,1		; syscall exit
	xor     ebx,ebx		; exit code
	int     80h

下面是 Python 中的同一程序:

import string

TRANSLATION_TABLE = str.maketrans(
    string.ascii_uppercase + string.ascii_lowercase,
    string.ascii_uppercase[13:] + string.ascii_uppercase[:13] +
    string.ascii_lowercase[13:] + string.ascii_lowercase[:13]
)


def rot13(s):
    """Return the rot-13 encoding of s."""
    return s.translate(TRANSLATION_TABLE)


if __name__ == "__main__":
    """rot-13 encode the input files, or stdin if no files are provided."""
    import fileinput
    for line in fileinput.input():
        print(rot13(line), end="")

更简单,更容易阅读,对吗?

而在未来,编码将像对你的宇宙飞船说的那样简单。

“计算机,开始新程序。把我说的每一个字母,替换成英语字母表中 13 个位置之后出现的字母,然后将结果读回给我。这个词就是 ‘banana’”。

然后你的电脑会说:“Onanan”。

我们正在做的事情被称为“声明式编程(declarative programming)”。我们在宣布“计算机,你应该这样做”。而计算机足够聪明(编程足够好),能够理解我们的指令并执行它们。

在 2023 的今天,我们大多数正在使用的代码风格就是“命令式编程”。我们一步步地告诉计算机,我们要做什么。

计算机很呆,所以我们必须帮它们把一只脚放在另一只脚前面,以让它知道怎么走路。

现在,这个领域尚未成熟。

人类早期的工具是逐渐从石头进化到青铜再进化到铁,而软件工具也有进化的过程,不过速度要快得多。

我们现在所处的程序进化的阶段可能相当于青铜时代。但在我们的有生之年,我们可能会达到铁器时代。

学习编程是一个模糊的过程

学习编程的时候,你可能经常会问自己:“我是在明智地分配我的时间吗?我现在学的是正确的工具吗?这些书的作者和课程制作者真的知道他们自己在说什么吗?”

模糊性会迷惑你的每一次学习。“我的测试案例失败是因为教程过时了,而且我使用的框架发生了重大变化?还是我只是做错了?”

正如我之前在《教程地狱》中提到的,你还得应对“这山望着那山高”的问题。

很多开发者在面临这个问题的解答时,都会用一个他们自认为很聪明的 “RTFM” 原则作为答案,即 “Read the Freaking Manual(直接啃手册)”。但是这个答案也并不是那么有用,甚至会让问题变得更加复杂,该读哪本手册?读哪个章节?

另一个问题是:你没有清晰的了解你不知道的事情,以至于你往往不能清楚地表达出你想问的问题。

如果你甚至不能问出正确的问题,你会在学习历程中颠簸而行。

这会让学编程这件事变得格外辛苦,因为在你做这个软件之前,很大几率没人试着做过和你这个完全相同的软件。

因此,你在过程中遇到的问题大概率是前所未有的,而且可能没有人可以帮你。

人们每天在谷歌上输入的查询中,有 15% 是以前从未被搜索过的。如果你正在搜索的内容正是属于这 15%,那可能有点不妙。

我的理论是:大多数开发人员会想出如何解决一个问题,然后简单地继续前进,而不会把它记录在任何地方,因此,你可能是少数不得不为相同的问题找出自己的解决方案的开发者之一。

然后,当然我们还有很多古老的论坛主题和 Stackflow 页面。

来自 XKCD 的绘画
来自 XKCD 的绘画

如何在学习编程的时候不迷失方向

好消息是:当你练习多了以后,能力自信都会随之而来。

很快你就会知道在 Google 上搜什么了。对于文档通常是如何组织的,以及在哪里寻找目标信息,你很快就会有第二直觉,而且你也会知道该在哪里问哪些问题。

我希望这些含糊不清的问题都能有一个简单的答案,但是你不得不承认,学习编程就是一个含糊不清的过程。而且即使是有经验的开发者也会为模棱两可的问题而烦恼。

毕竟,在编程时,你可以无限地重复使用你以前遇到的问题的解决方案,就这方面来说,编程是一份稀有的职业。

因此,作为一名开发者,你总是在做一些你以前从未做过的事情。

人们总是认为软件开发就是把代码输进电脑里,但软件开发实际上是关于学习。

在你的职业生涯中,你会花很大一部分时间去认真思考。又或是盲目地将命令输入提示符,试图了解一个系统是如何运作的。

而且你会花很长时间跟别人开会,比如管理者、顾客、开发者同事。学习需要解决的问题,这样你就可以建立一个解决方案。

适应这种模糊的感觉,你就会走得更远。

编程是在一个又一个的错误信息中学习的

很多学习编程的人有时感觉像是撞到了墙上,因为进展并不像他们期待中的那么快。

一个很大的原因是:编程的反馈回路比其他领域密集得多。

在很多学校里,你的老师会给你布置一些作业,然后给它们打分之后再返回给你。在一个学期里,你可能只有十几次得到反馈的机会。

你可能会对自己自言自语道:“完了,那门课的考试考砸了,期中考试之前得好好学习了。”

或许你老师会在你的书卷上用红笔标出要点,来帮助你改善工作。

在考试或试卷上得到一个糟糕的成绩真的会让人心情糟糕一整天。

而这一般就是我们作为人类对反馈的思考方式。

如果你花时间在编程上,你会知道电脑是很快的,他们可以在毫秒内将你的代码执行完毕。

大多数情况下你的代码会崩溃。

如果你比较幸运的话,你会得到一个错误信息。

而如果你足够幸运的话,你会得到一个“堆栈记录”以及导致程序崩溃的那一行代码,堆栈记录指的是当计算机遇到错误时试图做的一切操作。

在本地运行 freeCodeCamp 时的堆栈跟踪错误信息
在本地运行 freeCodeCamp 时的堆栈跟踪错误信息

上面就是来自电脑的当面的负面反馈,不是每个人都能接受整天看到这种情况。

想象一下,如果每次你把你的学期论文交给老师,他们都会把大红的 “F” 写在上面。再想象一下,在你还没来得及眨眼的时候,他们就这样做了。一遍又一遍。

编码有时就是这种感觉,你想抓住电脑,然后不停地质问它:“你为什么就是不理解我写的代码?”

怎样才能不感到沮丧

再重复一遍,关键是练习。

随着时间的推移,你会对模糊的错误信息和像屏幕一样长的堆栈记录形成一种容忍。

编程永远不会比你刚开始的时候更难。

你不仅不知道自己在做什么,而且你也不习惯接受这种不近人情的、快速的、负面的反馈。

所以这里有一些小建议:

第一个建议:知道不是只有你一个人在这方面做得不好

每个学习代码的人都会试图与计算机进行心灵融合(Vulcan Mind Meld),让它理解自己,在这个过程中对抗沮丧。(这是另一个来自《星际迷航》的参考资料)。

当然,很多人在他们是孩子的时候就开始编程了。他们会表现得像他们一直很擅长编程,但他们很可能也曾像我们这些成年人一样挣扎过,而随着时间的推移,他们只是忘记了曾经挣扎的时刻。

把电脑看作你的朋友,而不是对手,电脑有什么错,它只是想让你把自己的指令明确一些罢了。

第二个建议:呼吸

很多人在面对错误信息的时候,本能反应都是咬紧牙关。然后重新在代码编辑器中盲目的修改代码,希望以某种幸运的方式通过这个问题。

这样是行不通的,下面解释了为什么这么说。

宇宙是很复杂的。软件也是很复杂的。你不太可能具有《阿甘正传》主人公的运气,一路坦途。

阿甘做他该做的事,并以不寻常的运气抓到了虾子
阿甘做他该做的事,并以不寻常的运气抓到了虾子

你可能听说过“无限猴子定理”。这是一个思想实验,实验内容是让你想象黑猩猩在打字机上打字。

如果你有一个新闻编辑室,里面都是黑猩猩在做这件事,要多久才会有一只黑猩猩随机打出 “to be or not to be” 这句话?

假设每只黑猩猩每秒钟打一个随机字符。他们中的一个可能需要1万亿年的时间来输入 “to be or not to be”,那是 10 的 18 次方,十亿个十亿。

即使假设黑猩猩保持健康,打字机定期维修,当它们中的一个设法打出 “to be or not to be” 时,银河系将是一个寒冷、黑暗的虚空。

我为什么要告诉你这一切?因为你不希望成为那些黑猩猩中的一员。

在这段时间里,你几乎肯定可以想出办法来教那些黑猩猩如何打英文单词。它们可能会设法打出《哈姆雷特》的全部内容,而不仅仅是其中最著名的一句。

即使你真的很幸运,通过了这个 bug,你会学到什么?

因此,与其惊慌失措,不如花些时间,理解代码,理解正在发生的事情,然后修复错误。

务必花时间去理解错误的代码,不要成为一个 quintillionarian(五亿年)的黑猩猩。(我认为 quintillionarian 意味着一个五亿岁的人,虽然根据谷歌,以前没有人用过这个词)。

与其盲目地尝试,寄希望于简单地跳过错误信息,不如放慢速度。

深吸一口气,伸个懒腰,起身去拿一杯热饮。

未来的自己会感谢你把这作为一个有教育意义的时刻。

第三个建议:使用“橡皮鸭”调试

找一只橡皮鸭子,把它放在你的电脑旁边。每当你遇到错误信息时,试着向你的橡皮鸭解释你觉得发生了什么。

当然,这是很蠢的,这怎么可能有帮助呢?

除非真的有帮助。

“橡皮鸭调试”对于让自己慢下来、尝试专注于眼前的工作是很有帮助的。

当然,你不一定要用橡皮鸭子。你可以向你的宠物仙人掌解释你的 Python 应用程序,解释你的 SQL 查询给那只一直跳到你键盘上的猫。

大声解释你的想法似乎能帮助你更好地处理这一情况。

大多数人是怎么学习编程的呢

现在让我们来谈谈通往第一份开发者工作的传统途径。

为什么要在意别人是怎么做的呢?剧透警告:没必要。

做好自己的事情就可以了。

这就是说,你可能会怀疑自己和你对学习所做的决定,你可能会向往没有走过的路。

我在这一部分的目标是安抚你可能有的任何焦虑。

计算机科学学位的重要性

大学学位对于准备从事软件开发职业的人来说仍然是一个黄金标准,尤其是计算机科学的学士学位。

在你开始说“但我没有计算机科学学位”之前,不用担心,你不需要计算机科学学位就能成为一名开发人员

但它们的用处是不可否认的,下面将解释原因。

首先,你会想“为什么开发者需要学习计算机科学”,毕竟,有史以来最著名的开发者之一对该领域有这样的评价:

“计算机科学教育不能使任何人成为专家级的程序员,就像研究画笔和颜料不会让人成为专家级的画家一样。” - Eric Raymond,开发人员、计算机科学家和作家。

计算机科学系在传统上是数学系的一部分,20 世纪 60 年代和 70 年代的大学不知道该把整个计算机的事情放在哪里。

在其他大学,计算机科学被认为是电气工程的延伸。直到最近,即使是加州大学伯克利分校--世界上最伟大的公立大学之一--也只是把计算机科学学位和电气工程结合作为双学位。

但大多数大学现在已经开始了解计算机科学作为一个研究领域的重要性。

截至本文写作时,计算机科学是你能得到的报酬最高的学位,甚至高于专注于金钱的领域,如金融和经济学。

根据 Glassdoor,美国的计算机科学专业平均在第一份工作中比其他专业赚得更多。70000 美元对一个刚从大学毕业的人来说是一笔不小的收入。

高于护理专业(59000 美元)、金融专业(55000 美元)和建筑专业(50000 美元)。

OK--所以获得计算机科学学位可以帮助你找到一份高薪的入门工作。这可能对任何人都不是新闻,但这是为什么呢?

雇主如何看待学士学位的问题

你可能已经听到科技界的一些大雇主说“我们不再要求求职者有学士学位”之类的话。

谷歌这么说过,苹果也这么说过。

而且我相信他们,他们不再需要本科学位。

我们已经有很多 freeCodeCamp 的校友在这些公司找到了工作,其中有些人没有相应的学士学位。

但那些找到这些工作的 freeCodeCamp 校友可能必须是特别强的候选人,以克服他们没有学士学位的事实。

你可以看一下这些职位空缺,他们判断候选人的标准有很多:

  1. 工作经验
  2. 教育
  3. 作品集和项目
  4. 他们是否有已经在该公司工作的人的推荐?(我们将在第二章深入讨论建立你的网络)
  5. 其他声誉方面的考虑(我们将在第三章中讨论建立你的声誉)

对于这些不要求学士学位的雇主来说,教育只是几个考虑因素中的一个。如果你在其他方面比较强,他们可能会选择面试你--不管你是否曾经踏入过大学的教室。

只需注意,拥有学士学位将使你更容易获得面试机会,即使在这些“可选择学位”的雇主那里。

为什么那么多开发者的岗位特别要求有计算机科学的学位呢

我经常告诉人们,学士就是学士。因为就大多数意图和目的而言,它是有用的。

想进入美国军队成为一名军官,而不是一名入伍服役的成员?你将需要一个学士学位,但任何专业都可以。

想获得工作签证到国外工作吗?你可能需要一个本科学位,但任何专业都可以。

而对于许多写着“需要学士学位”的职位空缺--任何专业都可以。

这是为什么呢?你在大学里学习的科目难道一点都不重要吗?

我的理论是这样的:你在大学里学了什么没有你是否完成大学学业重要。

雇主倾向于选择那些能够通过自己的方式通关(完成大学学业)的人。

你当然可以成绩垫底,一直挂科,一半的在校时间都在缓考,但是学位就是学位。

你知道以最后一名的成绩毕业于医学院的学生被称作什么吗?“医生”。

对于大部分雇主来说,就是这样的道理。

多数情况下,HR 只是通过招聘过滤软件的勾选框来筛选简历,过滤掉没有学位的应聘人员。他们可能完全没看过这些被筛选掉的简历。

必须强调,并不是所有HR都这样。但大多数 HR 都这样,在美国如此,在其他国家可能更是如此。

这很糟糕,但这就是劳动力市场目前的状况,在几十年后可能会好转也可能没有变化。

这就是为什么我总是鼓励十几二十多岁的年轻人认真考虑获得一个学士学位。

并不是为了大学本身:

  • 教育本身(你可以在线免费学习世界上最好大学的课程,所以这并不构成高额学费的充分理由)
  • 如宿舍生活、交友、自我探索等“大学经验”(美国学生基本不住在学校,也就没有类似的经验)
  • 通识课程帮助你成为“全面人才”(听说过 “Freshman 15”(大一胖三斤半)这个笑话吗?但确实有很多大一新生过劳肥)

再说一遍,学士学位真正的意义(美国人花十万美元甚至更多来支付大学 4 年的学费)是因为许多雇主要求学历。

当然,获得学士学位还有其他的好处,如:更多从军的选择、更容易获得工作签证等。

还有一个好处是:如果你想要成为一名医生、牙医或者教授,你必须先拥有学士学位,然后再进入研究生院。

已经铺垫得差不多了,让我直言不讳地回答你的问题。

成为一个软件工程师需要大学学历吗

不需要。很多雇主都不需要你有学士学位。

但学士学位可以帮助你更快获得面试机会,获得更高的工资。

副学士(Associate degree)文凭呢,有含金量吗

理论上是的。在科技行业的某些领域的确需要副学士文凭,这个文凭也会帮助你更快获得面试机会。

虽然如此,我不鼓励你为了副学士文凭而去读大学。我更鼓励你待够 4 年,拿到大学文凭,这个的含金量更高。

美国教育部的数据显示,在整个职业生涯中,大学学历的薪资比副学士学历高 31%。

而对于计算机科学学位来说,这两种学历的区别更加显著。

如果没有大学学历,过了年龄还申请学士学位值得吗

假设你三十多岁,你参加过一些学院和大学的课程,并且你已经完成了头两年的学业可以获得副学士学位。

“重返校园”值得吗?

是的,重返校园值得!

但我并不认为你应该辞掉工作脱产学习。

脱产学习是为“传统”学生设计的。他们通常在 18 到 22 岁之间(如果服过兵役可能年龄稍长一些),除了高中校外打工和暑期实习,并未有任何工作经验。

传统的大学的学费高昂,一般学生会结合奖学金、家庭基金和学生贷款来支付。

作为一个工作了的成年人,你获得这些现金资助的渠道更少。与此同时,你也没有一个刚毕业的高中生时间宽裕。

但这并不意味着你就要放弃获得学士学位的梦想了。

与其加入一个传统大学,我更推荐三十岁以上的成年人参与线上非盈利大学。有两所名声在外、收费合理的大学:西部州长大学( Western Governor's University)和美国人民大学( University of the People)。

一些本地社区大学和州立大学的衍生项目也提供学位。许多项目都是线上的,其中一部分还可以自己管理学习进度,你可以根据自己的工作安排完成学业的时间。

做好研究功课。如果一个大学看上去不错,推荐你使用 LinkedIn 找到该学校校友,向他们寻求帮助。询问他们的经验,他们觉得这些课程是否物有所值。

我不推荐通过借贷的方式来获得学位。去一个学费没那么贵的学校更好。学位只是一个学位而已,只要是来自一个授权的机构,基本上就可以服务于你需要用学位达成的大部分目的。

如果你已经有学士学位,有必要再回到校园,读一个计算机科学专业吗

没有必要,既浪费钱又浪费时间!

如果你已经拥有学士学位——即便和科学、科技、工程、数学(non-STEM)无关——你已经获得大学能提供的大部分价值了。

那计算机科学的研究生学历呢

这对职业进阶有助益,但你可以在已经有开发者工作经验之后再去申请。

许多雇主会支付员工继续教育的学费。

我技术领域的很多伙伴都参加了佐治亚理工学院的计算机科学研究生的课程。

佐治亚理工学院的计算机科学部不仅仅在全美数一数二,而且其研究生学位完全线上,费用也合理。

但我不鼓励你现在就去申请,先找一份开发者工作。(本书之后的章节会详细介绍)

未来学位还会这么重要吗

是的,我认为学士学位会在未来几十年,甚至是几百年依旧保持重要的地位。

学士学位已经存在超过 1000 年了。

许多美国顶尖学校比美国历史还悠久。(哈佛有 400 年历史)

学士学位的消亡这一说法实属夸大。

一些圈子开始抨击大学,倡导学位无用论。

但如果你查看相关数据,会发现事实并非如此。学位和薪资息息相关。

同时,一个学位也可以帮助你获得更安全、稳定以及更有成就感的工作。

当然,你也可以通过做甲板工,为石油钻井服务赚得丰厚的收入。

但你也可以作为一个开发人员,在恒温的办公环境,通过维护服务器、修补代码库赚取同样丰厚的收入。

前者工作环境危险,对背部有损伤;而后者工作环境舒适,你可以从事 40 年

许多抨击大学的“意见领袖”本身从自己的大学学历获益。

我认为倡导“大学无用论”的其中一个理由是:很难将学习与获得地位提升联系起来。

大学只是阶级信号的一种形式吗——即富裕阶级将财富传承到下一代的一种方式?总体来说,在哈佛找到一位富家子弟比穷苦学子的概率要大 20 倍。

事实是:人生的本质就是不公平。但这并不改变劳动力市场的运行规律。

你可以选择简单模式,完成学位,并且在职业道路上获得更多机会。

或者是困难模式,省下一些时间和金钱,但是需要更谨慎地选择雇主。

我的许多朋友在获取成功的路上两种模式切换使用。

计算机科学学士学位包含哪些内容

大学学历的替代品有哪些

我已经在成人教育领域耕耘了二十多年,我看到了许多大学学历的替代品。

当然包含一些认证项目和集训班(bootcamp)。

雇主并不认可这些的含金量,而且它们很少要求严格。

旁注:当我说“认证项目”时,我指的是你参加一个课程,然后在最后获得一个认证。这些项目的价值有限。但是来自亚马逊和微软等公司的基于考试的认证是相当有价值的。我们将在后面更深入地讨论这些。

我常常告诉人们:到底去不去攻读学位,这是一个问题。

我遇到过很多没有学士学位的人,他们是汽车修理工、电工或从事其他行业的人。他们可以清楚地学会一套技能,应用它,并保住一份工作。

我遇到过很多没有学士学位的记账员、律师助理和其他“知识工作者”。他们可以清楚地学会一套技能,应用它,并保住一份工作。

这些人可以自学代码,使用免费的学习资源并与志同道合的人交流。

其中一些人的个人目标一直是回去完成他们的学士学位。这是攻读学位的一个很好的理由。

但不适用于每一个人。

如果你想要获得正规教育,你可以去攻读学士学位;如果你不想,别参与这些项目。自学就可以。

培训班和认证项目仅给你提供课程大纲和同侪压力。这并不赖,但值得你花上千美元吗?

如何自学代码

大部分开发者都是自学的,即便是有计算机科学学士学位的程序员也在 Stack Overflow 的年度调查中宣称自己是“自学”。

大部分在职程序员认为自己的“自学的”(图片:Stack Overflow 2016 调查)
大部分在职程序员认为自己的“自学的”(图片:Stack Overflow 2016 调查)

因为代码需要终生学习。不断有新的工具需要学习,新的过气代码需要重新规划,新的问题需要解决。

所以不论你是否接受了正规教育,你都要知道:你必须擅长自学。

“自学”开发意味着什么

但当我提到自学时,我指的是自主学习——在正规教育之外学习。

很少有人在任何事情上都是真正“自学成才”的。例如,艾萨克·牛顿自学了微积分,因为当时没有微积分书籍。他必须边做边弄明白并发明它。

同样地,爱达·勒芙蕾丝自学了编程。因为在她之前,没有编程。她发明了它。

有人可能会告诉你:“你不是真正的自学,因为你是从书本或在线课程中学习的。所以你有老师。”它们是正确的,但只是在最狭义的意义上。

如果有人对你自称是自学成才提出异议,只需说:“按照你的标准,只要不是被狼养大的,就不能声称自己是自学成才的。”

将本书的这一部分指给他们看,并告诉他们 “Quincy 预料到了你的傲慢”,然后继续你的生活。

人生苦短,别浪费时间。

你就是自学成才的!

什么是自主学习

作为自学者,你将整理自己的学习资源,选择从哪里学习什么。这就是“自主学习”的本质。

但是你怎么知道你学习正确的技能,并利用正确的资源呢?

社区就派上用场了。

世界上有各种学习者的社区,相互帮助提高技能。

社区是一个很难定义的词。Twitter Tech 话题是一个社区吗? freeCodeCamp 论坛呢?还是许多专门针对特定代码技能的 Discord 组和 reddit 话题?

我认为这些都是社区。如果经常有人活跃,互相帮助,我就认为这是一个社区。

面对面的活动呢?奥克兰的 Ruby 开发人员月度聚会?纽约市创业社区聚会?德克萨斯州中部 Linux 用户组?

这些社区可以是在线的、面对面的,或者两者兼而有之。

我们将在“建立你的网络”一章中更多地谈及社区。但最大的收获是:你在这些社区中遇到的新朋友可以帮助你缩小选择范围,知道要学什么,要从哪些资源中学习。

我应该先学习什么编程语言

简短的回答是:这并不重要。学好一门编程语言后,学习第二语言就容易多了。

有不同类型的编程语言,但今天大多数开发是使用“高级脚本语言”,如 JavaScript 和 Python。这些语言放弃了 C 语言等“低级编程语言”的效率,得到的回报是:更容易使用。

今天的计算机比 1970 年代和 80 年代快数十亿倍。那时人们用 C 等语言编写大部分程序。现在计算机速度足以弥补脚本语言的相对低效。

值得注意的是,JavaScript 和 Python 本身都是用 C 语言编写的,而且它们每年都在变得更快——这要归功于它们庞大的开源代码贡献者社区。

Python 是用于科学计算(数据科学和机器学习)的强大语言。

还有 JavaScript……好吧,JavaScript 无所不能。它是终极的瑞士军刀型编程语言。 JavaScript 是将万维网连接在一起的胶带。

“任何可以用 JavaScript 编写的应用程序,最终都会用 JavaScript 编写。” – 阿特伍德定律 (Jeff Atwood, Stack Overflow 和 Discourse 创始人)

你的整个职业生涯都可以使用JavaScript,并不需要学习第二门语言。(话是这么说,但是你之后可能会学习 Python,或者其他语言。)

所以我建议从 JavaScript 开始。它不仅比 Java 和 C++ 等语言更易于使用,而且更易于学习。对于懂 JavaScript 的人来说,工作机会要多得多。

通过 Indeed 获得的职位搜索截图,我输入了 “javascript”,地区是美国,搜索结果为 68838 个工作”(图片:Stack Overflow 2016 调查)
通过 Indeed 获得的职位搜索截图,我输入了 “javascript”,地区是美国,搜索结果为 68838 个工作

其他需要你专注的技能是 HTMLCSS。如果网页是躯体,那么 HTML 就是骨架,而 CSS 则是皮肤。(Javascript 将会是肌肉——使得网页的运转及交互成为可能。)

你可以在一个下午就学些 HTML 和 CSS。但就像本书提到的其他工具一样,它们入门容易精通难。

Linux 的学习也不应错过。Linux 驱动着这个世界大多数的服务器,而且在你的职业生涯中,你也会在 Linux 命令行中运行大量命令。

如果你有一台 Mac 的话, MacOS 提供的终端工具,可以接受几乎所有与 Linux 相同的命令。( MacOS 和 Linux 有一个共同的祖先,即 Unix )。

但是如果你的电脑是 Windows 系统,你需要安装 WSL(Windows Subsystem for Linux)。安装后你就可以在电脑上运行 Linux 命令。如果你想更进一步,你甚至可以在同一台电脑上同时安装 Windows 和 Linux 两套操作系统。

如果想在电脑上安装 Linux,我推荐在最开始选择 Ubuntu ——一个最被广泛使用(并且文档完备)的 Linux 发行版。因此它应该是对新手最为友好的。

不要误会, Linux 比 Windows 和 MacOS 都更难以使用一些。但是你的努力将换得一个极其迅速、安全且高度可定制的操作系统。

而且,你再也不用为一个操作系统的许可而付费了。除非你想这么做。尽管 Red Hat 的软件都是开源的,但它仍是一家价值 10 亿美元的公司,这都源于其他企业愿意付费获得它的帮助及对 Linux 服务器的支持。

你还会想学习 Git。开发团队会使用这个版本控制系统进行代码更新上的协作。

你可能已经听说过 GitHub。GitHub 是个让开发者更容易进行开源项目协作的网站。它拓展了 Git 的一些特性。你将会在本书“如何建立你的声誉”一章中增进对 GitHub 的了解。

还有 SQL 以及关系型数据库如何运作。这些是信息经济中的主力军。

你可能还听说过 NoSQL 数据库(非关系型数据库,如图形数据库,文档数据库和键/值数据库。)你会在今后学习到更多。但最初请专注于 SQL。

最后,你还会希望了解网路服务器如何运作。Node.js 和 Express.js 会是一个好的起点。

当你听到“全栈开发”这个词的时候,它代表联结前端(HTML、CSS 和 JavaScript)与后端(Linux、SQL 数据库和 Node + Express)。

还有很多你希望学习的工具,例如 React、 NGINX、 Doker 和测试库。你可以在学习途中随心选择。

但你应该将 90% 的职前学习时间,用在以下的关键技能上:

  1. HTML
  2. CSS
  3. JavaScript
  4. Linux
  5. Git
  6. SQL
  7. Node.js
  8. Express.js

学会了这些工具,你将有能力构建大多数主流的网页和手机应用。而且你也达到了大多数入门级开发工作的门槛。(当然,许多职位的描述中还会包括其他工具,但我们将在本书的后续部分进行探讨。)

现在你可能在想:真不错,但我要如何学习这些呢?

我在哪里可以学习编程

好问题。这里有一个由经验丰富的软件工程师和教师设计的完整课程,它是为忙碌的成年人而设计,内容完全免费并且可以自由掌控学习进度。

是的,我说的就是 freeCodeCamp 核心课程。它能帮助你学习:

  • 前端开发
  • 后端开发
  • 工程数学
  • 科学计算(使用 Python 探索数据科学和机器学习)

迄今为止,已有数千人完成了这一核心课程并获得了一份开发者工作。他们不需辞去日常的工作、贷款或冒任何风险,只需利用上他们的晚上和周末。

实际上,freeCodeCamp 已经成为大多数人自学编程的默认路径。

如果没有其他的资源,你可以将 freeCodeCamp 核心课程作为基本的学习资源,并从这里开始拓展。你可以学习大多数工作都需要的核心技能,也可以涉猎你感兴趣的技术。

有大量的书籍和课程可以供你学习数十年。有些可以在公共图书馆中找到,或通过每月订阅获取。(你或许也可以通过图书馆免费获得其中的一些订阅服务)。

此外,freeCodeCamp 目前拥有近 1000 门免费的完整课程,内容从 AWS 认证准备,到移动应用开发,再到 Kali Linux。

自学编程从未如此简单。

打磨你的技能是项终身事业

我们已经探讨了为什么自学编程可能是最好的方式,以及如何去做。

我们也聊过了自学的替代方案,例如获得计算机科学的学士或硕士学位。

我们还讨论了你应该先重点专注于哪些具体的工具。

现在,让我们换换思路,关注下如何打造另一支柱:你的人际关系。

第二章:如何拓展自己的人脉

“独行者速,众行者远。” – 非洲谚语

人际关系网络这个词,你可能会感到畏惧。

人际关系网络可能会让人联想到尴尬的招聘会:身着闷热的西装,拼命把你的简历送到任何愿意接受它的人手中。

人际关系网络可能还会让人想到充斥着酒精的观看聚会,而你在要那里假装对一项从未关注过的运动充满兴趣。

人际关系网络可能还会让人想到在领英上向一个几乎不认识的人发送“生日快乐”,或者给他们的状态点赞,以希望他们能注意到你。

但是人际关系网络不需要总是这样。

在本章,我会分享自己在结识人们上学到的一切。我会向你展示如何获得他们的信任,并且如何让他们在寻求帮助时第一个想到你。

因为说到底,这就是人际关系网络的全部内容。帮助人们解决问题。做一个有益于他人的人。

我会向你展示如何建造一个强大的、可以在未来数十年内为你提供支持的人际关系网络。

故事时间:一位老师如何在 30 岁时,在科技圈建立人际关系网络

故事时间前情回顾:Quincy 通过阅读、观看免费在线课程和与开发者在当地的黑客空间共度时光,学习了一些编程知识。他刚刚完成了他的第一个项目,并作了首次技术演讲。

有了基础的编程技能,我对编程已初窥门径。

接下来要做什么呢?毕竟,我是个彻底的科技圈圈外人士。

虽然我是科技圈的新人,但却久经职场。近十年来,我通过学校工作和教英语谋生。

作为一名老师,我靠传授知识获取报酬。而作为开发者,我也可以靠写代码获得收入。

我已经知道了一个关于工作本质的重要真理:你认识谁决定一切。

我深知人际关系网络的能量。我了解机遇之路上总有个守门人。

在我和一份赚钱的开发者工作中,只隔着一个愿意说“对,这个叫 Quincy 的的人,似乎值得加入我们的团队”的招聘经理。

当然,作为一个科技圈门外汉,我并不了解他们的文化。

学院派的文化更加得正式。

你穿着正装。

用新奇的学院派术语来表明自己是这个群体的一员。

你想方设法在每次谈话中提及你去了 X 大学,或者你在 Y 教授手下做助教,抑或你在期刊 Z 上发布了文章。

职业发展是不同的。会议是不同的。权力结构是不同的。

而我并没有一开始就立即接受这个事实。

在最开始的几场科技活动中,我身着西装参加。

我在口袋中一直放着折叠整齐的简历副本。

我甚至带了名片。我订购了阳极氧化铝片,用激光刻上我的名字、邮箱、甚至包括传奇教育家约翰·杜威的一句话:

“任何开始思考的人,都将世界的某一部分置于危险中。” —— 约翰·杜威

这至今仍然是我最喜欢的一句话。

但说回惨淡的现实。

“Hi,我是 Quincy。这是我的红色铝制名片。先说声抱歉,它在你回家的航班上,可能会触发金属探测仪。”

我当时有些用力过猛。而我所交谈的每个人都可能痛苦地发现了这一点。

我在 Meetup.com 上,报名了每一个我能找到的开发者活动。圣巴巴拉是一个小地方,但是靠近洛杉矶。所以我也开车参加洛杉矶的活动。

我很快学聪明了,将我的西装换成了牛仔裤和卫衣。我还注意到了没有人会送出名片。所以我也不再携带名片。

从在黑客空间中遇到的开发者的那里,我得到了提示:怀有激情,但不张扬。保留一些你的热情。

我还阅读了一些书以更好地理解开发者文化。

《编程人生》 是本来自于 1980 年代的好书。

《黑客:计算机革命的英雄》 是本来自 1990 年代的好书。

对于更现代的文化资源,可以关注下《黑客军团》这部剧集。剧中的角色有些极端,但是它很好地表现了许多开发者的心态和举止。

很快,我的谈吐更像一位开发者,而不是教师。我不再尴尬地冒进。

我每周都会参加几次本地与科技有关的活动。我最喜欢的活动甚至不是开发者活动,而是圣巴巴拉创业之夜。开发者们会在这个几周举办一次的活动中,介绍他们的产品原型。一些进行代码演示的开发者甚至可以从天使投资人——投资早期公司的有钱人——处获得资金。

组织这个活动的人叫 Mike。他一定认识很多圣巴巴拉的开发者和企业家。

当我终于鼓起勇气向 Mike 介绍自己时,我就崇拜他了。他是个超级马拉松运动员,静息心率在 40 以下。有着完美修剪的头发和胡子。对我而言,他是这个星球上最酷的人了。他总是举止得体,彬彬有礼。

Mike 完全不是一个技术型的人。他的工作是产品经理。他虽然在科技和用户体验设计上了解很多,但却完全不知道如何写代码。

有时,开发者们会忽视非技术型的人。他们会说:“他只是个商人”或“她只是个甩手掌柜”。但是我从没听到有谁这样谈论 Mike,他赢得了所有人的尊重。

我特意观察了 Mike 与其他开发者打交道方式。毕竟,只写了几个月代码的我,也不能完全摆脱“非技术型”这个标签。

我的旧习惯时常显露。我总有炫耀自己所学和所做的冲动。

很多开发者对他们的技能和成就保持谦逊。他们会说:“我对 Python 有所涉猎。“而缺乏安全感的我,则大放厥词:“我用 Python 写了许多算法。我做梦都在写 Python。”

后来,当我回家谷歌了那位开发者的姓名,才了解到他是主流 Python 库的核心贡献者。我羞愧不已。

我很快学会了不要吹嘘自己的成就或技能。你正在谈话的人很可能比你更懂编程。只是他们中的大多数不会主动说出这个事实。

再没有比自信地打开笔记本电脑炫耀代码,但别人抛出了一堆你完全没有准备好回答的问题更糟糕的事情了。

参加活动的前几个月对我而言是趟谦逊之旅。但是这些活动也让我有动力继续打磨我的技能。

不久,南加州附近的人都开始注意到我。他们会说:“我总在这些活动中遇到你。你叫什么来着?”。

有天晚上,一个开发者说:“让我们在推特上加个好友吧。”。我当时认为推特只是一个噱头性网站,几天前才勉勉强强建立了一个推特账户。你能用区区 140 个字符真正表达什么呢?我基本不发推。但是我确实已经有了一个推特账户,所以她加了我。

这鼓舞我投入更多时间,去塑造自己的网络形象。我弱化了自己领英页面的正式性,提升了友善度。我研究社区中的其他开发者如何在网络上展示自己。

在几个月内,我结识了众多领域中的人:

  • 经验丰富的开发者
  • 非技术型或半技术型、在科技公司工作的人
  • 招聘经理和招聘人员
  • 以及最重要的,和我一样处在职业生涯中期,想要转入科技行业的同伴

为什么这些同伴是最重要的?在帮我谋求一份工作这件事上,他们应该是最帮不上忙的,对吧?

好吧,我来告诉你一个秘密:假设招聘经理招来了新的开发人员,对他们进行培训,然后这些新人完全胜任了自己的工作。那么这个招聘经理就会问:“我可以到哪里找到更多像你一样的人呢?”

你的同伴是你人际关系网络中,最重要的拼图之一。通过和我同时学习编程的人,我获得了许多自由职业的工作机会和工作面试机会。

我们一同成长。我们是兄弟和姐妹。这些纽带是最为紧密的。

总之,这几个月的人际关系,都最终在我进入市中心高级酒店的酒吧、参加开发者活动的某个晚上开花结果。

在下一章会有这部分的更多内容。现在,让我们多聊聊建立人际关系网络的艺术和科学。

认识谁真的决定一切吗

你可能听过这么一句话,成功“不只在于你知道什么,更在于你认识谁”。

现实中,你知道什么、你认识谁,都能帮助你成功。

是的,你的关系可能会帮助你获得梦想工作。但如果你没有金刚钻,缺乏获得成功的技能,你在这份工作中不会有好的表现。

但是让我们假定你已经遵循我在第一章中提出的建议,主动地培养自己的技能。什么时候是开始建立人际关系网络的正确时间呢?

最好的开始时间是昨天

但你无需时间机器去做这件事。你已经有了一个人际关系网络。它可能比你想要的要小很多,但是你确实已经认识了一些人。

他们可能是你家乡的朋友,或你父母的同事。任何一个你过去相识的人都可能为你提供帮助,即使只是微不足道的帮助。

因此,第一步是对你认识的人进行全面梳理。请不要担心,我并不是要你现在就去接触任何人,也不是要对你的人际关系征税。

三思而后行,先制定一个行动计划。

首先,让我们一起来列出所有你认识的人。

如何打造个人关系网看板

从创建一个熟人清单开始。

你可以使用电子表格,也可以像销售人员那样使用客户关系管理工具(CRM)来做这件事。但就我们这里要做的事情而言,它们可能有点大材小用了。

我推荐使用像 Trello 这样的看板工具,它是免费的。

你将创建五大列:“待评估”、“待联系”、“待回复”、“最近联系”、“暂不联系”。

然后创建标签,这样你就可以根据你对他们的了解程度对他们进行分类了。这里有一些可供你参考的标签想法:"儿时好友"、"家庭的朋友"、"前同事"、"同学"、"参加技术活动认识的朋友"。

现在你可以开始创建卡片了。每张卡片可以只有他们的名字,如果你有时间的话,可以在卡片上添加一张照片。

这是我创建的 Trello 看板,你可以从中得知个人关系网看板可能是什么样子的。我使用了我最喜欢的童年电影(1989 年的经典电影《忍者神龟》)中的人物。

Personal_Network_Board___Trello_--
我的个人关系网看板:副业中一起打击犯罪的朋友们

你可以开始从你的社交媒体帐号,甚至你老旧的毕业纪念册(如果你有的话)添加联系人。

他们中的许多人不会再有任何帮助。但为了全面起见,我建议你依然添加他们。你永远不知道什么时候你会想起:"噢……某某在 XYZ 公司得到了一份工作,我应该与他们联系。"

这个过程可能要花一两天的时间。但要知道,这是一项投资。这个看板能够在你的职业生涯中为你所用。

你可能会认为“我不需要这样做,我已经有一个领英账户了”。这或许能行得通,但是领英又大又杂。但你想在这里让信号最大化,让噪音最小化。这也是我鼓励你创建这个专门的个人关系网看板的原因。

在你把人添加到你的看板的同时,还可以给他们贴上标签。花点时间来研究看板中的每一个人。他们这些天都在忙什么?他们有工作吗?还是在开公司?

当你发现了和他们有关的事情,可以在每张卡片上添加笔记。他们最近是否参加了跑步 5 公里的募捐活动?他们的祖母最近是否庆祝了九十大寿?这些信息看起来可能不相关,但如果某个人在社交媒体上分享这些事情,那就说明这些事情对他们来说很重要。

努力对人们产生兴趣。发现他们的日常生活,发现他们的抱负。通过了解他们的动机和目标,你将更深入地洞察到你如何才能帮到他们。

正如我之前所说,缔结盟友的最佳方式是帮助他人。我们将在稍后详细讨论这个问题。

对于你添加到个人关系网看板中的每个人,逐一思考他们是否值得联系,然后把他们放入“待联系”或“暂不联系”中。

你可能想知道:为什么这一列叫 “暂不联系”?因为你永远不知道认识的某个人在何时会帮上忙。永远不要把任何友谊或熟人关系视为理所当然。

在你填满看板,给每个人贴上标签,并将他们分门别类之后,就可以开始联系了。

如何为关系网延伸做准备

在联系并试图给人留下印象时,请牢记:简单为上,不要啰嗦。

大家都很忙,他们并不能记住太多和你有关的事情。如果你想完全讲清楚自己是谁,最好方法是写一份个人简历。

如何在社交媒体写个人简历

你希望自己的信息在你所有的社交媒体账户中都是一致的。

以下是我的自我介绍:

“我叫 Quincy,是 freeCodeCamp 的一名老师,住在德克萨斯州的达拉斯。我可以帮助你学习编程。”

去写你自己的简历吧。看看你能否把它压缩到 100 个字甚至更少。尽量避免使用花哨的词语或专业术语。

把你的身份提炼成几个字可能很难,但这是一个很重要的过程。

记住:人们很忙,他们并不需要知道你的生活往事。随着你对他们的了解的深入,你可以慢慢地说出更多和你有关的细节。随着时间的推移,他们也会在问你问题的同时更好地了解你。

好了,记得准备好一张带有你的笑脸的照片。

如何制作社交媒体头像

如果你有钱,直接去找一个当地的摄影师,付钱让他们给你拍一些专业的头像。

或许你有一个从事摄影的朋友,他可以免费为你拍照。

我自己使用预装在 MacOS 上的 Photobooth 拍了头像。我的朋友在 Photoshop 中花了大约 10 分钟修正了一些背景和阴影。他可能使我的牙齿看起来要略微白了一点。下面是我的头像:

Michael_Headshot_B_W_Full_heic
我的头像:我在任何地方都使用这张照片

一定要用你的眼睛微笑,这样你才不会看起来像个机器人。或者更好一点,想一些非常有趣的事情,我就是这样做的。然后,你的笑容就会显得很真诚。

从不同的角度拍很多照片,然后使用最好看的那一张。

我建议你使用一张看起来和你的日常生活贴近的始终如一头像。不要使用试图将你的吸引力最大化的经过大量修改的照片。你希望人们能够在活动中通过你的照片认出你。而且,你不想让美颜吓到别人,你想让他们感到安心。

说到让人安心:不要戴墨镜,也不要努力地看起来很酷。你要看起来友好、平易近人。在这方面,有的一个很好的带有讽刺意味的测试:看看你的照片。如果你迷路了,你在街上看到这个人,你会有勇气向他们问路吗?

选好了头像之后,就在所有的地方使用同一张照片。把它放在你所有的社交媒体账户上。

在你的个人网站上使用它,甚至你还可以将个人照片添加到你的电子邮件帐户

我建议常年来使用同一张照片。每次你改变它,都会冒着有些人不会立即认出你的风险。即使是灯光、角度或背景的细微变化,也会使人们失去熟悉感。

一定要保留一张高清版本的照片。这样,当你在别人的会议上的演讲,或他们的播客中的客串的时候,他们就可以用这张照片来宣传了。(别担心,假以时日,你能做到的)。

如何与过去的人联系

现在简历和照片都已就绪,你已经做好与人交谈的准备了。

15 年前,我会说你应该给人们打电话,而不是给他们发消息。但随着智能手机的出现,相关文化已经发生了很大的变化。大多数人都不会很好地回应电话了。

同样,我也不建议在谈话接近尾声的时候才邀请别人去喝咖啡或吃午餐。人们很忙,可能会觉得这个请求有些尴尬。

你需要直奔主题,越快越好。

那么,你需要奔入的主题是什么呢?

本质上如下:

  1. 我知道你
  2. 我喜欢你
  3. 我敬佩你的做的事情

就是这样。

人们喜欢被了解,喜欢被人喜欢,喜欢自己做的事情和生活受到关注。

我们以往认识的人们都会在生日当天得到认可。在过去,人们可能会通过短信、社交媒体,甚至打电话的方式祝我们生日快乐。

但一年中的其它 364 天呢?人们也喜欢在这些日子里得到认可。

哈哈,这里有一个认可别人的简单方法。

第 1 步:研究这个人。在谷歌上搜索他们,阅读他们最近发布在社交媒体上的内容,阅读他们的领英账户。如果他们发布了家庭照片,更要多花点时间看一下。

第 2 步:想一想你可以说点什么,从而让他们的一天变得更加美好。

第 3 步:选择一个他们最近比较活跃的社交媒体平台,直接给他们发一条信息。

我将分享一个模板,但永远不要逐字逐句地使用任何模板,因为如果收件人将你的信息键入谷歌中进行搜索,他们会发现这是一个模板,而你所有的良苦用心都会白费。

如果我突然给一个几个月或几年没有联系过的人发信息,我会说这样的话:

“嘿,[姓名],我希望你的[新的一年/春天/一周]有一个有趣的开始。祝贺你[获得新工作/晋升/迎来宝宝/完成项目]。你做这些事情令人深受鼓舞。”

像这样简短而有针对性的东西。问候+祝贺+赞美。这就是基本公式。

不要只是说说,而是真的让人感受到。

真的想让这个人感到被认可。真的想照亮他们的一天。真的想鼓励他们继续向他们的目标迈进。

人类非常善于察觉不诚恳。不要试图过度推销。不要给他们任何理由去想“这个人想从我这里得到什么”。

这就是为什么这方面最重要的事情是:要简短。要尊重人们的时间。没有人想要一封长信,他们会觉得有义务对其进行长时间的回应。

因为,跟我说一遍,人们很忙

如何建立更深入的联系

因为人们是如此忙碌,他们往往会因为这些陌生人能为他们做什么而更多地看到陌生人:

  • 这个人开着巴士送我去上班。
  • 这个人按照我喜欢的方式给我做饮料。
  • 人力资源部门的这个人回答我关于休假的问题。
  • 这个人为我准备了一份 acid 爵士乐的播放列表,让我在写代码时听。
  • 这个人每周都会给我发送有用的电子邮件,提供免费的编程资源。

你为人们做什么,体现出你是怎样的人。

我知道,我知道。这听起来可能过于简化,甚至愤世嫉俗,你在生活中绝对不会这样对待亲密的朋友和家人。

但是对于那些几乎不认识你的人--他们只是在日常工作中遇到你--这可能是他们了解你的方式。

你必须给人们一个关心你的理由。你必须激励他们更多地了解你。

在你能成为某人的亲密朋友——他们真正关心的人,并且在你不在的时候他们会想你——之前,你需要从一个对他们有帮助的人开始。

而这正是我们在这里要做的。我们要通过提供帮助来建立更深的关系。

这将是一个漫长的过程。而且你应该在找工作之前提前开始。你最不希望看到的是,有人认为“哦,你只是因为需要我的东西才联系我”。

恰恰相反,你联系他们是因为你有东西可以提供给他们。

毕竟,你拥有一个人可以获得的最强大的技能之一。使机器服从你的意志的能力。你是一个程序员。

这就是擅长编码的感觉
这就是擅长编码的感觉

或者,至少,你正在成为一个程序员。

所以你已经有了一个很好的理由去接触人们。

你可能听说过陌生电话(cold call) 这个词。这就是你在对某人几乎一无所知的情况下给他打电话,并试图向他们推销东西。这并不容易,绝大部分的冷电话都以对方挂断而告终。

但是,你对对方了解的信息越多,电话就越温暖,你就越有可能成功。

现在,你在这里不是在卖东西。正如我前面提到的,你也不是在给他们打电话。你是在给他们发送一条直接信息。

也许这是通过 Twitter、LinkedIn、Discord、Reddit,任何地方,但你是用一段文字跟他们联络。

正如我所说,最有力的开场白,最有可能得到回应的方法,是随意地提供帮助。

如果我在做这件事,这里有一个我将使用的简单模板。记住不要逐字逐句地使用这个模板。用你对朋友说的语气重写它:

“嘿[姓名],祝贺你[新工作/晋升/新生儿]。我一直在学习一些编程,并正在建立我的作品集。我立刻想到了你,你是一个能完成很多事情的人。有没有什么工具或应用程序可以让你的生活更轻松?我也许可以为你编码,作为我的练习。”

这是一个强有力的方法,因为它是个性化的,不会让人觉得是自动生成的。如今,人们收到如此多的自动信息,以至于他们很快就会无视任何甚至类似于自动信息的东西。

这就是为什么我手动发送我所有的信息,而不依赖自动化。慢慢地逐一编写信息比试图用脚本或邮件合并来节省时间更好。

最快的被屏蔽的方法是给别人发消息说 嗨,你好吗? 其中明显少了一个名字,证明这个消息是一个模板。

有时我收到的信息用我的姓而不是我的名,嘿,拉森。 什么,我现在是在军事学校吗?

而且,LinkedIn 上的很多人已经开始在他们名字的开头加上一个表情符号。这使得检测自动信息变得很容易,因为没有人会在他们的直接信息中包括这个表情符号。

当一条信息的开头是“嗨🍜莎拉,你在找新工作吗?”那么你就知道这是一条批量信息。

还要注意的是,我上面的模板并没有说“我们是同学”或类似的话。除非你几天前刚认识某人,否则你不应该说明你们俩是怎么认识的。

为什么?因为提醒人们你们是如何认识的行为本身会促使一些人退一步想:“哎呀,我几乎不认识这个人。”

如何让对话持续下去

同样,你的目标是得到他们的回应,这样你就可以开始一个来回的对话。

这些信息传递平台有一种休闲的感觉。保持随意。

不要发送单一的、多段落的信息。保持你的信息短而快。你不想让他们觉得回复你是件苦差事。

一旦你让他们回复你,就开始在你的个人网络板上做笔记,这样你以后就能记住这些事实。

也许他们确实有一些应用程序的想法或工具的想法。很好。向他们询问有关问题。看看你是否可以为他们建立它。

从画出用户界面的简单模型开始。如果你想看起来更复杂,就用绘图纸。给它拍张照片,然后发给他们,“像这样的东西?”

这将表明你对帮助他们是认真的。而且我愿意打赌,对大多数人来说,这将是一种新的体验。

“你在帮助我?你在为我创建这个应用程序?”这将会打动人,他们将有可能记住它,即使这个应用程序本身没有任何进展。

从那里开始,你可以随着谈话的流程走。也许它消失了。不用担心。随它去吧。你可以在几周后找到一个理由来继续对话。

这些社交媒体直接信息的好处是整个信息记录都在那里。下次你给他们发信息时,他们可以直接滚动并看到“哦,这是那个提议为我建立应用程序的人”。而不是你在面对面的谈话中可能遇到的“你是谁来着?”的疑问。

再次重申,保持一切自然和昂扬。如果感觉谈话进行得很慢,那没问题。因为你将进行许多其他对话。保持热度,你将成为一只忙碌的蜜蜂,建立你的人际联系。

如何认识新朋友并扩大你的人际网络

我们已经谈到了如何与你已经认识的人联系。这些联系仍然存在,即使它们多年来已经有点弱了。

但你如何建立全新的联系?

这不是一件容易的事。但我有一些建议,可以使这个过程不那么令人生畏。

首先,第一次与人见面,比在网上见面要有效的多。

当你见到某人的时候,你的记忆有更多的信息可以获取:

  • 这个人的长相,他们的姿势,以及他们如何在空间中移动
  • 他们的声音和他们说话的方式
  • 场地的灯光、声音、香气、温度和总体感觉
  • 还有许多其他的小细节,这些都会在你的记忆中留下烙印

与一个人当面交谈 10 分钟,比来回几十条信息,跨越几周的通信建立更深的联系。

这就是为什么我强烈建议:走出去,在当地的活动中认识人们。

如何在城市周边的当地活动中结识朋友

哪些活动?如果你住在一个人口稠密的城市,你可能有大量的选择供你支配。你可能每周都能去参加几个晚上的科技活动,而且通勤时间最少。

如果你住在一个小镇上,你可能不得不坚持在当地的聚会上认识人,比如书展、冰激凌社交活动、体育赛事。

如果你去教堂、清真寺或寺庙,也要认识那里的人。

是的,我知道这可能听起来很荒谬,“在足球比赛中站在我旁边看台的那个人?他们会以某种方式帮助我找到一份开发者的工作?”

也许吧,也许不是,但不要把人撇开。

那个人可能经营一个小企业。

他们可能和一个在财富 500 强公司担任工程副总裁的朋友一起上学。

也许他们也是一名软件工程师。毕竟,我们有数以百万计的软件工程师在那里。而且我们并不都住在硅谷。😉

当你遇到一个新的人时,你不想立即掏出你的手机,说 我可以把你加入我的 LinkedIn 的联系人吗?

相反,你要表现得冷静,介绍一下自己。

记住他们的名字。 名字是建立关系不可或缺的。如果你不善于记名字,就练习记住它们。你可以在看电视节目或电影时,试着记住每个角色的名字,不管他们是不是大明星,通过这种方式练习。

如果你忘记某人的名字,不要猜测。只要说 可以再问一下你的名字吗,第二次一定要记住它。

与他们握手或碰拳,与他们谈论任何感觉自然的话题。如果谈话结束了,不用担心。随它去吧。

你随着时间的推移建立关系。这不是指与某人相处的总时间,而是指你在较长的时间跨度内与该人见面的次数。

很有可能你会在未来再次见到这个人。也许几周后,在同一个确切的地点。而就是你采取行动的时候:

你好[姓名],[你们上次谈的事情]进展如何?

从中断处继续对话。 如果他们看起来像是对你的个人社交关系板(Personal Network Board)有帮助的人,请问他们 嘿,你接下来[星期几]在做什么?你想和我一起去[其他即将举行的本地活动]吗?”

始终牢记你即将到来的一周的活动,所以你可以邀请人们加入你。

这是一个让人们在一个安全的公共空间与你一起玩耍的好方法。而且你还提供了一些有价值的东西,让他们意识到即将到来的活动。

如果他们看起来感兴趣,你可以说“太棒了。我有什么最好的方式给你留言,并把活动的细节告诉你?”

你现在有了他们的电子邮件或社交媒体或电话号码,你们的关系可以从那里展开。

这可能听起来像是一种慢热的方法。为什么如此谨慎?

同样,人们很忙。聪明人会保护他们的时间和他们的个人信息。

有太多的吸血鬼想利用人们,试图向他们推销东西,诈骗他们,让他们加入他们的多层次营销计划,或以其他方式向他们传教。

让其他人克服这种不信任的最好方法是:在以前的接触中已经作为一个通情达理的人,出现在他们的视野中。

如何利用你的人际网络

我们将在第四章详细讨论如何利用你的网络。现在,将你的网络纯粹视为时间和精力的投资。

我喜欢把我的人际关系想象成一个果园。我正在建立关系,照顾它们,确保它们健康。

谁知道这些关系何时会长成大树并结出果实。 目标是继续植树,在未来的某个时候,这些树将帮助维持你的生命。

不断散发正能量,不断使用你的技能甚至是你自己的人际关系网络来帮助人们。(在你认识的两个人之间进行礼貌的介绍很少是一个坏举动。)

做一个善良、体贴、乐于助人的人。

永远不要对求职过程的缓慢感到不耐烦。

永远不要让自己感到被轻视或冷落。

永远不要让自己嫉妒别人的成功。

有因就有果。有一天你会收获你所播种的东西。如果你播种的是正能量,你就为自己的丰收做了准备。

第三章:如何提升自己的圈内名声

“获得良好声誉的方法是努力成为你希望呈现的样子。” - 苏格拉底

现在你已经开始建立你的技能和你的人际网络,你已经准备好开始建立你的声誉。

你可能从零开始,一个完全的技术新人。或者你可能已经有了一些信誉,你可以从你的其他工作中带来。

在本章中,我将分享如何在同行中建立良好声誉的实用技巧。这将是获得自由职业者客户、第一份工作以及在事业上取得进展的关键。

但首先,我是如何建立我的声誉的。

故事时间:一位 30 多岁的教师是如何建立起开发者的声誉的

故事时间前情回顾:Quincy 开始建立他的网络,包括开发人员、企业家和科技界的招聘经理。他经常参加城市周围的黑客空间和科技活动。但他还没有爬上竞技场,测试自己的实力……。

当我终于鼓起勇气去参加我的第一次黑客马拉松时,我的编码之旅已经有几个月了。

有一天,我遇到了一个特别讨厌的错误,我不知道如何解决它。所以我做了很多人在这种情况下会做的事情。我通过浏览网页来拖延时间。这时我看到了它。创业周末(Startup Weekend EDU)。

创业周末是一个长达 54 小时的比赛,包括建立一个应用程序,然后将其提交给评审团。这些活动也奖励你的编码、设计和创业知识。

这个特别的活动--在硅谷的中心地带举行,有一个由教育家和教育企业家组成的评审团。由于我有成人教育的背景,这似乎是我第一次参加黑客马拉松的理想选择。

我把这个活动告诉了史蒂夫。然后我说出了那句神奇的话,“由我来开车”。这很好,因为史蒂夫没有驾驶执照。

有了史蒂夫的加入,我们与来自圣巴巴拉黑客空间的几个开发人员组成了我们的团队。

我花了几周时间准备这次活动,研究评委和他们工作的公司。我研究了赞助商。当然,我还像少林寺的和尚一样练习编码。

终于,经过一个月的准备,迎来了大周末。 我们挤进我的 2005 年丰田卡罗拉,车上的透明涂层已经剥落,放上一些充满活力的音乐,开始了我们 5 小时的车程。

在路上,我们讨论了我们应该建造什么。当然,它将是以教育为重点的。最好是满足高中生的需求,因为这些是评审人员的公司所关注的年级。

但这个应用程序应该做什么?它将如何使人们的生活更轻松?

我回想了一下我自己在高中的时候。我没有什么可说的,因为我只上了一年就退学了。(我确实设法学习并通过了普通教育证书,我们称之为“普通教育发展证书 Good Enough Degree”,同时在 Taco Bell 工作,最后才上了大学)。

但我确实记得高中时的一个痛点,在这么多年后仍然响起。英语论文。

现在我喜欢写作。但我不喜欢用 MLA 格式写作,因为它有严格的引用规则。我曾经害怕准备文献引用页。我的老师总是会因为我的引文格式不正确而扣我的分。

在听了车上其他乘客的很多好主意后,我开始说了。 我说:“我有个主意。我们应该编写一个应用程序,为你创建引文。”

而有人笑着说:“Out of sight”

史蒂夫说,“嘿,这是个好名字。我们可以用 C 称它为 Out of Cite

我们都笑了起来,觉得自己很聪明。然后我们开始讨论实施细节。

当我们到达会场时,那里有大约 100 名其他开发人员。那是一个开放式的办公空间,低矮的隔间两边是白板。

我听到了关于其中一个开发者的窃窃私语,“嘿,是那个去年赢得比赛的家伙。”我听到人们说。他们向一个被粉丝包围的、看起来很自负的开发者打手势,“也许他会让我加入他的团队。”

活动开始时,大家纷纷发表意见。任何人都可以走到房间前面,拿起麦克风,为他们想要建立的应用程序做 60 秒的演讲。

我太紧张了,感觉就像一个外星人要从我的胸膛里冲出来。 所以很自然地,我排在第一位。 撕掉创可贴,对吧?

我满头大汗,疯狂地打着手势,飞快地完成我的演讲。我说了这样一段话“引文很糟糕。我的意思是,它们并不糟糕。它们是必要的。你需要把它们添加到你的论文中。但准备引文的工作很糟糕。让我们建立一个应用程序,为你填写你的工作引文页。谁支持我?”

房间里很安静。然后人们意识到我已经讲完了,他们按照惯例给了我掌声。主持人从我手中拿过麦克风,把它交给下一个人,而我昂首阔步回到我的座位。

演说结束后,就到了组队的时间。我们的圣巴巴拉小分队互相看了看,说“我想我们是一个团队”。

我们弄清了 WIFI 密码,抢到了最合适的工作场所:一个角落里的办公室,有一扇可以真正关闭的门。

我开始在白板上写下 UI 模型。我说:“我们想要的东西总是一击即中。就在你的浏览器的菜单栏里。”

“像一个浏览器插件”,史蒂夫说。

“是的,让我们建立一个浏览器扩展。”

我向他们展示了论文可能需要的三种格式的例子,MLA、APA 和 Chicago。

“我们能不能同时生成这三种格式,让他们可以直接复制粘贴?”我问道。

“我们可以做得更好”,史蒂夫说,“我们可以为他们每个人设置一个按钮,把引文直接放到他们的剪贴板中。”

我们工作得很快,在星期五晚上结束时创造了一个简单的 MVP(最小可行产品)。它所做的只是抓取当前网站的元数据,并将其结构化为一个引文。但它成功了。

由于这是我第一次参加黑客马拉松,我不想承受住在旅馆里的压力。所以我花钱买了一个酒店房间。我们有两张单人床,所以每天晚上我们都会轮流睡在地板上。

星期六早上,我们的野心越来越大。我走到白板前,对团队说,“引用网站是伟大的,所有的。但学生们引用的很多东西都是在书本或学术论文中。我们也需要能够为这些东西生成引文。”

我们找到了一个 API,我们可以用它来获取基于 ISBN(用于书籍的序列号)的引文信息。我们还写了一个脚本,可以根据 DOI(用于学术论文的序列号)搜索学术论文,然后从结果页中 爬取数据。

到了星期六晚上,我们的浏览器扩展的代码终于完成了。于是我坐下来,开始准备演示幻灯片。我把很多最后的编码工作留给了我的队友,而我则反复排练了几个小时的演讲。

尽管轮到我在床上睡觉,但由于紧张,我几乎无法闭目养神。我在这里,就在科技生态系统的中心。硅谷。

作为一名教师,我经常在我的同行面前发表演讲,有时是几十个人,但这是不同的。

我将向一屋子雄心勃勃的开发者还有评委发表演讲,还有拥有博士学位的人,其中一些人已经创办了自己的科技公司。他们将对我们的工作进行评估。我很害怕自己会以某种方式搞砸。

由于无法入睡,我打开了我的电子邮件。创业周末的工作人员发出了一封电子邮件,其中包括一本书的 PDF。这是一本非官方的科技创业经典顿悟的 4 个步骤精益创业 的混搭。

现在,我已经读过这些书,因为它们是 2010 年代初期想要构建软件产品的任何人的必读书籍。但我还阅读了数十本其他创业书籍。他们的很多见解都汇集在一起,形成了一堆建议。

凌晨 4 点,我无法入睡,于是我开始阅读。这些书真正触及的一件事是构建人们愿意支付的东西。客户验证的最终形式。

就在那时我意识到:你知道什么能真正推动我的演讲越过终点线吗?产品市场契合度的证明。证明我们正在构建的应用程序解决了人们遇到的实际问题。真的能解决,以至于他们会打开钱包。

这启发了我。我应该带着我们的应用程序到路上去,把它推销给人们。

那是星期天早上。我该去哪里寻找我的潜在客户呢?好吧,我们的酒店正好位于斯坦福大学主校区附近。

我开车带着我的团队去了活动地点并且挥手告别说:“等从客户那里拿到了实实在在的现金,我就回来的。”

我的队友笑了。我不确定他们是否觉得我是认真的。他们说:“那你不要迟到啊。”

但我是认真的。我在笔记本电脑上运行了一个应用程序的范例,在GPS中输入斯坦福,然后开始了我的任务。

我曾经在俄克拉荷马州一所十分普通的州立大学学习。因此当我来到这所世界上最好的大学时,我真的感到力不从心。

斯坦福大学的学费是每年五万美元。但我驾驶着一辆价值为其十分之一的小汽车,开进了他们的停车场。

这时的校园就像一座鬼城,但是是一座富丽堂皇的鬼城,因为到处都是青铜雕像和标志性的拱门。

我自言自语道:“今天这个时候成绩最好、最刻苦的学生都去哪里了?那些不会浪费时间去手动创建他们的论文参考文献的人。”

我走进主图书馆,正好经过安检台和一个写着“禁止推销”的牌子。

我在书架周围来回溜达,发现几个人正在学习。其中一个孩子正在读着厚厚的课本,认真地做着笔记。就他了。

我溜到他旁边的座位坐下。“你好。你喜欢文献引文吗?”

“什么?”

”文献引文。就像是论文参考文献。“

“嗯……”

“就是论文最后一页,在那里你会列出所有的……”

“我知道论文参考文献是什么。”

“好吧,来看看这个。”我像个毒贩子一样拉开夹克衫,然后掏出我那 200 美元的笔记本电脑。当我发表了那尴尬的推销词时,他迁就了我一会儿。

我说:“看这里,我有一个浏览器插件。我去任何网站,仅需点击这个按钮,它就会为我创建一个引用。”

这个孩子挑起眉毛。“它能做 MLA 吗?”

我强忍着兴奋说:“MLA、APA,甚至 Chicago 都可以。请看。”我点击了按钮,并且出现了三个引用-每个都有自己的复制按钮。

那个孩子点了点头,似乎很感兴趣。因此我试图尽快完成交易。

“如果我告诉你,我打算将这个应用程序按年订阅。但是如果你现在注册,你就能无限制使用,不仅是一年,而是永久。”

那个孩子思考了一会儿。

据说,沉默是销售最好的朋友。因此我坐在那里很长时间,完全沉默地盯着他。

最后他说:“很酷,我加入了。”

“太棒了。这应该需要 20 美元。”

那孩子退缩了,“什么?这么贵?”

这是风险资本补贴初创企业的时代,Uber 和 Lyft 在争夺市场份额的过程中,乘客每次乘车,它们都在亏损。因此,他的反应并不完全令人惊讶。

我快速思考了一会儿。“那么,你身上带了多少现金?”

他摸了摸钱包说,“五美元。”

我看着那张皱巴巴的钞票,耸了耸肩,“成交。”

他笑了,我给他发了一封电子邮件,告诉他如何安装这个程序。我说:“还有一件事。让我们一起照相吧。”

我将相机调成自拍模式。他开始微笑,我说:“拿起这五美元吧。”

我又花了一个小时在图书馆向人们推销,并设法获得了另一个付费客户。然后我跑回活动地点,与团队一起完成我们的程序原型。

那天下午,我做了我至今认为是我人生中最好的一次演讲。我们现场演示了这个应用程序,效果非常好。

演讲结束时,我展示了我与那位斯坦福学生的合影,他们现在是我们的付费客户。当我举起那张现金时,观众爆发出热烈的掌声。

总的来说,这是我一生中最令人振奋的经历之一。我们获得了第二名,并从赞助该活动的一家公司那里获得了一些 API 额度。

在会后派对上,我仅仅吃了些披萨,这样我就有更多时间和所有人交流了。我在 LinkedIn 上联系了他们。并且在 Twitter 上关注了他。我和人们一起自拍,并贴上了这个活动的标签。

这是我编程旅程中的一个分水岭。我向那个房间里的人证明了我可以帮助设计、编码,甚至销售一款应用。更重要的是,我也向自己证明了这一点。

参加黑客马拉松巡回赛

从那一刻起,我就迷上了黑客松。那一年,我参加了几十场。我成了一名公路战士,沿着海岸来回奔跑,尽可能地参加每一场比赛。

从现在开始将会变得更难了。因为我已经没有任何一个团队了。我只能靠自己。

我到达后,尽可能多地与人见面,然后走上前去,提出一个我认为可能会获得评委青睐的想法。

有时人们加入我的团队,有时我加入其他人的团队。

我不仅仅想要设计应用程序,我也想编写它们。我所达到的效果常常超出我的预期。

在很多黑客松比赛中,我直到上台前的最后几分钟都在努力修复漏洞。因为有时我的应用程序会在现场演示时崩溃。

在拉斯维加斯的一次黑客马拉松中,我无意将代码库搞得一团糟,以至于我们不得不使用幻灯片。我双手抱头坐在观众席上,无助地看着我的团队成员演示我们的应用程序,尽可能去假设其如何工作——如果我能让它工作的话。因此我们在评委面前表现不佳。

但我一直在努力。不断到达新的城镇,入住旅馆,去会场,尽可能多地吃免费的披萨。

我的队伍获得第二或第三的次数太多了,我几乎数不清。但我们从来没有在黑客松比赛中直接获胜。

破茧而出

直到圣地亚哥的一次活动。我永远不会忘记当我们创造的东西赢得了观众和评委的支持的感觉,以至于我们的胜利就像一个注定的结局。

他们宣布我们中奖后,我记得从后门溜到停车场,打电话给我的祖父母。我告诉他们我终于做到了。我帮助开发了一个应用程序,并精心准备了一场演讲,赢得了一场黑客马拉松第一名。

我不知道我的祖父母对软件开发或黑客松了解多少。但他们说他们为我感到骄傲。

现在他们去世了,但我经常回想起这段对话。我珍惜他们的鼓励。他们对一位 30 多岁的老师的信任,并且这位老师正疯狂地想成为一名开发人员。

从那以后,我一直在参加黑客松。在此过程中,我不断组建新的团队,学习新的工具。你永远不会忘记第一次让 API 工作的场景或者终于摸索出 Git 命令是如何工作的。你永远不会忘记那些在你身边忙碌的人,他们试图让应用程序在演示过程中保持一致。

TechCrunch Disrupt 黑客松、DeveloperWeek 黑客松、ProgrammableWeb 黑客松、The $1 Million Prize Salesforce 黑客松......这么多大型的黑客马拉松,学到了这么多东西。这是锻造我的开发能力的熔炉。

在这个过程中,我不仅成功地提升了自己的技能和人脉,而且我现在也赢得黑客松的名声。

我可以交付一个产品。

这使我成了一个有名的人物。

这种声誉对我获得第一批自由职业者客户、第一份开发人员工作,以及最重要的——相信自己作为开发人员的直觉至关重要。

为什么你的影响力很重要

影响力在社会中的起源可以追溯到人类的史前时期。当时在大多数部落和定居点,都有一些系统来记录交易记录。

在有现金之前,仍然存在信贷。

它可能是一份书面账簿,也可能是一位长者把所有这些记录都记在了脑子里。

除了原始的账目,还有一种不那么具体但同样重要的东西。

“约翰真会给马钉铁蹄。”

或者“简是全国最会讲故事的人。”

或者“杰在三年前的冬天对抗入侵者,拯救了我们。”

你会注意到这些例子都涉及到某人擅长某事。不仅仅是做一个讨人喜欢的好人。

做一个冷静、脚踏实地的人当然很有帮助。但这不是《大人物勒布斯基》,我们不能只靠魅力活下去。

大人物勒布斯基(左),他没有工作,没有技能,也没有精力,但他很冷静,冷静得不得了
大人物勒布斯基(左),他没有工作,没有技能,也没有精力,但他很冷静,冷静得不得了

开发人员很容易说:“哦,是的。我对 JavaScript 了如指掌。我可以为你构建任何类型的 JavaScript 应用程序,在你能想到的任何设备上运行。”

或者可以说:“我总是在预期内提前发布代码。”

但你怎么知道他们没有夸大其词呢?

毕竟,一个狡猾的人曾经说过:

“如果你只能擅长一件事,那就擅长撒谎。

那么你什么都擅长了。”

(这句话的真实出处不详。但我愿意想象这句话是 20 世纪 20 年代一个戴着大礼帽和单片眼镜的骗子说的。)

任何人都会撒谎。有些人确实如此。

在我职业生涯的早期,我曾有过一个不愉快的经历——解雇一位谎称自己有硕士学位的老师。几年过去了,却没有人发现他。

每年,他都会在年度报告上撒谎,这样他就能比其他老师得到更高的加薪。因此每年他都能逃脱惩罚。

但有一天,一个小小的差异被我发现了。我查看了他的档案,给一些大学的记录部门打了电话,发现他从来没有完成学位。

当我抓住他的时候,那真是史酷比的时刻。“如果不是因为你们这些该死的孩子,我本来可以逃脱惩罚的。”

知道这个人在学校教书多年,薪水比其他许多老师都高——仅仅因为他愿意撒谎,这让人很难受。

说谎的战利品总是在那里,闪闪发光。有些人愿意向这种诱惑屈服。

雇主们知道这一点。他们知道你不能相信任何声称知道全栈 JavaScript 开发的人。对于那些能获得公司徽章、公司电子邮件地址和生产数据库的密钥的人,你必须保持谨慎。

这就是为什么雇主使用行为面试问题——试图抓住那些更有可能不诚实的人。

你可以说我天真,但我相信大多数人天生善良。大多数人都愿意遵守规则,只要这些规则是合理公平的。

但是,如果十个人中就有一个人是糟糕的雇员,这意味着我们所有人都要接受更高的审查。

最糟糕的情况不仅仅是为了赚更多的钱而撒谎,而是出售公司机密,破坏与客户的关系,或以夸大数字的名义违反法律。

历史上有很多员工为了自己的个人利益,对雇主造成灾难性的损失。

因此,大多数大公司的开发人员招聘过程都是苛刻的。也许应该如此。但不幸的是,这使得“每个人”都更难得到开发人员的工作——即使是最诚实的求职者。

作为开发人员,我们需要证明我们的技能同我们所说的那样一样强大。我们需要证明,我们的职业道德是坚定的,因为我们的雇主需要它。

这就是影响力发挥作用的地方。它减少了歧义。它降低了交易对手风险。对雇主来说,提供工作机会,与你签订雇佣合同会更安全。

这意味着,如果你的影响力足够大,你就可以从侧门进入公司,而不是像其他求职者那样从正门进入。

有些公司甚至有内部招聘人员,他们可以快速跟踪你的面试过程。良好的声誉也可以帮助你在薪资谈判中掌握更多的议价权。

因此,让我们来谈谈如何建立良好的影响力,并成为管理者们追捧的对象。

如何建立开发者的个人影响力

作为一名开发者,至少有六种经过时间考验的方法可以建立你的影响力:

  1. 黑客马拉松
  2. 为开源做出贡献
  3. 创建面向开发人员的内容
  4. 在大厂工作,步步高升
  5. 建立自由职业者客户的作品集
  6. 创建你自己的开源项目、公司或慈善机构

如何寻找黑客马拉松和其他开发者比赛

黑客马拉松代表了同时建立你的声誉、人际关系网络和提供你的编码技能的最直接方式。

大多数黑客马拉松是免费的,并向公众开放。你只需要有时间和预算去旅行。

如果你住在一个有很多黑客活动的城市--比如旧金山、纽约、班加罗尔或北京--你也许可以通勤到活动现场,然后回家睡在自己的床上。

尽管我住在圣巴巴拉,那里每隔几个月才有一次黑客大会,但我在旧金山有一个老同学,他让我睡在他的沙发上。这让我有机会参加更多的活动。

黑客马拉松曾经是硬核活动。人们会喝能量饮料,睡在地板上,都是为了在演讲时间前完成他们的项目。

但是,黑客马拉松的组织者正逐渐变得更加关注这些活动的健康和可持续性。毕竟,很多参与者都有孩子,或者有要求很高的全职工作,他们不可能在整个周末全力以赴地写代码。

找到即将举行的活动的最好方法是用谷歌搜索“黑客马拉松[你的城市名称]”,然后浏览出现的各种活动日历。其中许多是由大学、当地雇主,甚至是以教育为重点的慈善机构举办的。

如果你想赢得比赛,我建议提前做研究。

活动赞助商是谁?通常是面向开发者提供服务的公司,它们提供 API、数据库工具或各种软件产品的服务。这些赞助商可能会在活动中设立展位,你可以与他们的开发者支持者交谈。这些人被雇来教人们如何使用该公司的工具。有时你甚至会在这些展位上遇到关键员工或创始人,这也是一个很好的交流机会。

通常情况下,黑客马拉松会提供针对赞助商的奖品,“对[赞助商] API 的最佳使用”。将你的时间集中在将特定的赞助商工具纳入你的项目中,而不是试图赢得大奖,这可能更容易。你仍然可以在你的 LinkedIn 或你的履历表上把这些作为胜利。胜利就是胜利。

有时,黑客马拉松是如此高调--或者奖金如此可观--以至于尝试直接赢得比赛是有意义的。

在我参加黑客马拉松的过程中,我赢得了相当于几个月租金的现金奖励,几年的免费联合办公空间,甚至是纽约市联合国大楼的私人参观机会。

在巡回赛中,我遇到了一些人,他们的主要收入来源是赢得黑客马拉松的现金奖励。我认识的一个开发者在同一个黑客马拉松上成功赢得了九个赞助商的奖金。他设法将所有这些赞助商的工具整合到他的项目中--而且还赢得了总分第二名。

如果你在黑客马拉松上经常遇到的一些人后来成立了有风险投资的公司,或者启动了著名的开源项目,请不要感到惊讶。

你在黑客马拉松常客中看到的雄心壮志水平比普通开发者要高得多。毕竟,这些人完成了一周的工作,然后直接进入周末的工作。这些人不怕从油锅里跳出来,跳进火里。

如何为开源项目做贡献

为开放源代码做贡献是建立自己声誉的最直接方式之一。大多数雇主都会看你的GitHub档案,其中会突出显示你的 Git 提交历史。

raisedadead__Mrugesh_Mohapatra__--

以上是 Mrugesh Mohapatra 的 GitHub 简介,他为 freeCodeCamp.org 做了大量的平台开发和 DevOps 工作。注意看他的活动栏是多么的绿。仅在过去一年就有 2208 个贡献。

许多开源项目的维护者,如Linux基金会、Mozilla(火狐),当然还有 freeCodeCamp 自己,对代码质量有很高的标准。

你可以通过阅读开放的 GitHub 问题来寻找已知的错误或功能请求。然后你可以进行代码修改,并打开一个拉取请求(pull request)。如果维护者合并了你的拉取请求,这将是你的一大收获。

在科技公司找到工作的最好方法之一是成为他们仓库中多产的开放源码贡献者。

开源贡献是建立自己声誉的好方法,因为你所做的一切都在公众面前。而且你还可以得到其他开发者审查和接受你的工作的社会证明

如果你对通过开放源码建立你的声誉感兴趣,那么你可以这样开始。

阅读希拉里-尼亚昆迪的开源入门综合指南

如何创建面向开发者的内容

开发人员是人。和其他人一样,当他们不工作、不睡觉、不和朋友和家人在一起的时候,他们想用自己的时间做些什么。

对许多人来说--包括我自己--这意味着花时间在别人的想法上:书籍、视频散文、互动体验,如视觉小说

你可以广泛地将这些称为“内容”。我不太喜欢这个词,因为它使这些作品听起来像一次性的。但人们就是这样称呼它。

软件开发是一个令人难以置信的广泛领域,你可以访问许多不同的主题,有开发者生活方式的博客、编码面试准备教程、Twitch 上的编码直播流,以及开发者访谈播客。

可能有整个类别的开发者内容,我们甚至还没有想到,这将在未来十年内打破。

如果你对电影、新闻或创意写作感兴趣,开发者内容可能是建立自己声誉的好方法。

你可以选择一个特定的主题,逐渐被视为专家。

例如,有一些开发者专门从事特定技术栈的教程。

我的朋友安德鲁-布朗是一位来自多伦多的前 CTO,他已经通过了所有主要的 DevOps 考试。他创建了为所有 AWS、Azure 和谷歌云认证做准备的免费课程,还经营着一个考试准备服务。

世界上有超过2000万的软件开发人员。可能有很多人会消费你的内容,他们会知道你是谁。

如何在大公司工作中提升地位

你可能已经看到一个开发人员被介绍为“前 Googler” 或“前 Netflix 工程师”。

一些科技公司有如此严格的招聘程序--以及如此高的标准--甚至在该公司获得一份工作都是一个很大的成就。

雇主看候选人以前在哪里工作有一些实际原因。它减少了招聘失败的风险。

你可以通过努力提高自己的声望等级来建立自己的声誉。你可以从一个本地公司晋升到财富 500 强公司,并最终进入大型科技巨头公司之一。

当然,在巨头公司工作并不适合所有人。我将在第四章中更多地谈论这个问题。但要知道,这是你建立自己声誉的一个选择。

如何通过建立自由职业者客户组合来建立自己的声誉

你可以通过以自由职业者的身份与公司合作来建立自己的声誉。

自由职业者通常从事较小的单人项目。因此,这可能是在当地建立你的声誉的一个更好的策略。

例如,如果你为当地的一家银行做了很好的工作,这可能足以说服当地的一家律师事务所也与你签约。

做一个“家乡的英雄”是有道理的。我知道很多开发者可以通过亲自参加会议和认识当地人来有效地与网络竞争。

如何建立你的开发作品集

一旦你建立了一些项目,你就会想把它们展示出来。做到这一点的最好方法是用短视频。

人们都很忙。他们没有时间拉下你的代码并在自己的电脑上运行它。

如果你把人们送到一个网站,他们可能不会完全掌握他们正在看的东西,以及为什么它是如此特别。

这就是为什么我建议你使用屏幕捕捉工具来录制 2 分钟的视频演示(demo)。

两分钟的时间应该足够展示项目如何运作。一旦你完成了这些,你就可以解释一些实施细节,以及你所做的设计决定。

但总是,总是从演示开始。人们希望看到一些作品。他们想看到的是视觉上的东西。

一旦你用你的应用程序运行的引人注目的演示吸引了人们,你就可以解释你想要的所有细节。你的听众了解了更多的背景,也会更感兴趣。

两分钟也是一个神奇的长度,因为你可以把视频上传到推特上,当人们滚动经过它时,它就会在推特上自动播放。自动播放的视频在 Twitter 上被观看的可能性要高得多。它们消除了必须点击播放按钮的摩擦,或导航到另一个网站。

一个 Twitter 克隆项目的视频演示,由 freeCodeCamp 的校友建立。这个视频没有画外音解释,只有 2 分钟的 UI 演示。但它仍然非常好。

你可以把这些项目演示视频放到 YouTube、Twitter、你的 GitHub 档案,当然还有你自己的作品集网站上。

为了捕捉这个视频,我建议使用 QuickTime,它是 MacOS 内置的。如果你是在 Windows 上,你可以使用 Game Recorder,它在 Windows 10 中是免费的。

如果你想要一个更强大的工具,OBS 是免费和开源的。它比较难学,但可以无限地定制。

至于录音技巧:保持你的字体大小尽可能大,并使用外部麦克风。任何你能找到的麦克风--即使是廉价的耳机--都会比对着你的笔记本电脑的内置麦克风说话好。

投入尽可能多的时间来录制和重新录制片段,直到你掌握了它。

能够演示你的项目和介绍你的代码是你整个职业生涯中都会用到的宝贵技能。练习演讲的时间永远不会被浪费。

如何启动你自己的开源项目、公司或慈善机构

成为创始人是建立开发者声誉的最快--但也是风险最大的方式。

它的风险最大,因为你在用你的时间、金钱,甚至可能是你的个人关系作赌注--所有这些都是为了一个未知的结果。

如果你为开放源码贡献了足够长的时间,你建立一个作为开发者的声誉。

如果你在黑客马拉松赛场上磨练了足够长的时间,你建立起作为一个开发者的声誉。

但是,你可以尝试启动创业项目数十年而没有得到牵引力。而在这一过程中,你的时间、金钱和关系都会被浪费掉。

创业已经超出了本书的范围。但如果你对它感兴趣,我将给你这个快速建议。

企业家是一个法语单词,本质上翻译为 "承担风险的人"。

大多数创业者都会失败。有些失败是由于他们无法控制的情况。但很多失败是由于不了解他们所承担的风险的性质。

不要急于创建一个项目、公司或慈善机构。尝试为已经在你感兴趣的领域开展工作的其他组织工作。

通过为别人工作,你在有收入的情况下学习。你可以接触到这些工作,以及围绕这些工作的风险。而且,你可以为最终的创业项目积累储蓄。

如何避免毁掉你的声誉

“建立一个好的声誉需要一生,但你可以在一分钟内失去它。” - 威尔-罗杰斯,演员,牛仔,是我的在俄克拉荷马城长大的英雄之一。

建立你的声誉是一场马拉松,而不是一场短跑。

它可能需要几年的时间来建立一个足够强大的声誉,以打开正确的大门。

但就像在一场竞争激烈的马拉松比赛中,一个趔趄会让你失去宝贵的时间。导致受伤的跌倒可能使你完全退出比赛。

不要在互联网上说傻话

人们过去经常说一些愚蠢的事情。这些话可能会在空气中停留几分钟,而每个人都会畏惧。但这些话最终都会消散。

现在,当人们说蠢话时,他们经常在网上说。而且是用不可磨灭的墨水。

始终认为,当你在网站上输入东西并按下回车键时,它将被保存到一个数据库中。该数据库将在世界各地的几个数据中心进行备份。

你可以证明数据的存在,但没有办法证明没有数据。

你应该假设,就所有的意图和目的而言,猫已经离开了袋子。没有办法让猫回到袋子里。无论你刚才说了什么:那都是在你的永久记录上。

你可以删除这句话。你可以删除你的账户。你甚至可以尝试把它从谷歌搜索结果中删除。但是有人可能已经在网站时光倒流机(Wayback Machine)上备份了它。而当这些数据库中的某一个在几年后不可避免地被黑客攻击时,这些数据可能仍然在那里的某个地方,准备重新出现。

这个时代,做一个大嘴巴,挺可怕的。所以不要这样做。在你说话之前先想想。

我的建议,可能听起来很懦弱:摆脱在网上与人争论的习惯。

有些人遵守“如果你没有好话可说,就不要说”的操场规则。

我更喜欢“公开表扬,私下批评”。

我将公开承认某人在开发者社区所做的好工作。如果我看到一个让我印象深刻的项目,我会说出来。

但是,我一般不会拆穿别人。即使是那些应得的人。

在一场战斗中,每个人都看起来很脏。

你不希望看起来怒气冲冲,撕毁别人的论点,或对刚刚说了一些蠢话的人进行狗刨。

当然--尖刻的机智可以在短期内为你赢得网络积分。但它也可能使人们对你的爱少一点,对你的恐惧多一点。

我也努力避免抱怨。是的,如果我发推特抱怨航班被取消,我可能会得到更好的客户服务。

但是人们都很忙。他们中的大多数人不想利用他们稀少的时间,滚动浏览社交媒体,看我因为大事件中的小纰漏而发牢骚。

所以这就是我对使用社交媒体的建议。尽量保持积极的态度。

如果这是一个你坚信的问题,我不会阻止你说出你的想法。只是在你打字之前要考虑,在你点击发送之前要考虑。

不要过度承诺和不充分交付

我看到开发者破坏自己声誉的最常见的方式之一是过度承诺和交付不足,使他们自己的声誉受到损害。这不一定是一个致命的错误,但它是不好的。

还记得吗,我说过在拉斯维加斯黑客马拉松上,我完全没有及时完成项目,而我们不得不使用幻灯片,而不是一个运行的应用程序。

是的,那是我学习代码旅程中的最低点之一。我的队友们都很有礼貌,但我相信他们对我很失望。毕竟,我过于自信了。我对自己在那个时间段内能够取得的成绩作出了过高的承诺,而我却没有兑现。

谦虚地估计自己的能力要好得多。

记住伊卡洛斯的寓言,他用蜡质的翅膀飞得太靠近太阳。如果他能采取更有分寸的方法。上升得慢一点。那么他的翅膀就不会融化,他也就不会坠入大海,留下一个内疚的父亲。

1690px-Pieter_Bruegel_de_Oude_-_De_val_van_Icarus

Pieter Bruegel the Elder的《伊卡洛斯坠落的风景》,约1560年。伊卡洛斯本可以是一个竞争者。他本可以成为一个人物。但相反,他只是双腿消失在海里。农民和牧羊人不屑于从他们的工作中抬起头来看一看他的渺小。

在声誉受损前,控制住瘾

如果你有未经治疗的毒瘾、酒瘾或赌瘾,请先寻求帮助。开发者找工作可能是一个漫长而艰苦的过程。你要全神贯注地去做这件事。

即使是像视频游戏成瘾这样看似无害的东西也会分散你的注意力,并占用你太多的时间。值得先把它控制住。

我不是医生。我也不打算给你讲 "毒品是坏事"。但我要说的是:你可能听说过硅谷的风潮,在那里,开发人员滥用药物,认为他们可以以某种方式提高他们的编码或解决问题的能力。

有一段时间,那里的开发者们有使用微剂量 LSD 和安非他命的趋势。

我的直觉反应是:这些东西可能给你带来的任何优势都可能是不可持续的,而且在一个较长的时期内是净负值。

不要感受到服用精神活性药物的同伴压力。不要感受到在欢乐时光喝酒的同伴压力。(自从 7 年前我的女儿出生后,我还没有喝过这么多的啤酒。我不觉得我错过了什么。)

如果你正在从毒瘾中恢复,请注意学习代码和获得开发人员的工作将是一个紧张的过程。给自己定个节奏,这样你就不会有复发的风险。

你不希望在职业转型过程的最后阶段--取得了如此大的成就--却让旧的习惯重新出现,使你的努力付诸东流。

尝试将你的职业生活与你的个人生活分开

你可能听说过这样一句话:“不要把生意和娱乐混在一起”。

作为一个开发者,你将成为一个有实力的人。你将从你所在城市的其他人那里获得一定程度的尊重。也许没有医生或宇航员那么多。但仍然如此。人们将仰视你。

你将和一些以你为榜样的人们交谈。

不要炫耀你的财富。不要表现得好像你比其他人更聪明。

不要滥用权力来获得你在关系中想要的东西。

这将使你不被你周围的人喜欢。而且,如果你的行为以某种方式被捕获并发布到网上,它可能会在你的职业生涯中持续困扰着你。

永远不要忽视你拥有多少,以及你有多少可失去。

使用讲述者技巧

在这一章节的最后,让我来分享一个给自己打气的小技巧。

首先,请记住,你是你自己编码之旅中的英雄。在你的脑海中有一个剧场,每个人都在关注你——他们都支持你。

讲述者技巧是,当你在执行一系列操作时,在脑海中讲述你的动作。

Quincy 大步穿过黑客空间,他的笔记本电脑夹在胳膊下。他将马克杯放在热水器下面,然后放入一个新鲜的茶包。 他拉动拉杆。当热气腾腾的水装满他的杯子时,他用他最好的英国口音大声说道:“茶。 伯爵茶。 热的。”

他手里拿着提神饮料,钻进一个隔间,将笔记本电脑平放在桌面上,并瞥见了一位开发者的目光。他们对视了一会儿。Quincy 微微地点头,表示注意到了这位开发者。开发者也点头回应,仿佛是在心灵感应般地分享着这种情绪:“我看到你了,朋友。我看到你出现了。我看到你把事情做好了。”

这可能听起来很荒谬。当然啦,这是很荒谬的。但我一直这样做,而且还很有效。

即使是在脑海中讲述生活中最平凡的时刻,也能帮助你充满活力。将摆在你面前的时刻具体化,可以使你的目的明确。

而当你以时代为单位思考你的生活时(“Taco Bell 时代”),这就更有效了。或者拐点(“通过高考”)。

这与建立你的声誉有什么关系?你的声誉本质上概括了“你是谁”,你对周围的人意味着什么。

通过更认真地对待自己,通过把你的生活想象成一部电影,你会逐渐了解你是谁,以及你有一天想成为的人。

通过讲述你的行为,你可以在自己的脑海中照亮它们。我为什么要那样做?我在想什么?在这里有更好的举动吗?

很多人都在不知不觉中破坏了自己的声誉,只是因为他们养成了坏习惯。

多年来,我一直认为我必须一直“有趣”。我会找任何机会加入一些自嘲的幽默。很多人意识到我在做什么,觉得很好玩。 但他们中的很多人不明白,只是觉得我是个混蛋。

我为什么要那样做?我想这可以追溯到小学,那时我总是想成为班上的小丑,逗别人笑。

但几十年后,这种用笑声来填补沉默的条件反射对我来说并不合适。

“当你重复地犯一个错误时,它就不再是错误了。 它是一项决定。” – Paulo Coelho

如果我没有注意到这个坏习惯,我可能会坚持更长时间。 但是有了讲述者技巧,我行为的尴尬就暴露无遗了。

我确信我有很多其他的思维方式和行为方式都不是最理想的。 在讲述者技巧的帮助下,我希望将来能够发现它们并加以完善,以免给人留下错误的印象。

你的声誉将成为你的遗产

想想看在你的故事的结尾,你想成为谁。 你希望人们如何看待你在地球上的时间。 然后从那里向后推进。

电影结尾你想成为的那个人。 你希望人们钦佩的那个英雄。 为什么不从现在就开始这样装扮自己呢?

你能想象成为一名成功的开发者会是什么样子吗? 开发出了人们依赖的软件系统?

那个未来的你——他们会怎么想? 他们将如何处理情况和解决问题? 他们会如何谈论他们的成就? 他们的挫折?

仅仅想一想未来的自己,就能帮助你理清思路。 你的优先事项。

我经常考虑“Quincy 老头”和他不是很好的腰。 他每隔 30 分钟就得借口跑去上厕所。

但 Quincy 老头仍然尽力为自己的事业尽力。 尽管关节酸痛,他还是能动。 尽管头脑一片模糊,他还是在思考。

Quincy 老头还是想把事情做好。 他为自己所取得的成就感到自豪,但他并没有花太多时间回顾过去。 他期待那天他要做什么,以及他要完成什么目标。

我经常想起 Quincy 老头,然后倒回到今天。

我今天可以做出哪些决定,使我明天成为值得钦佩的人? 我必须等上几十年才能赢得那个声誉吗? 或者我可以从未来借用一些尊重吗?

通过像我未来的自己那样思考,我可以采取一些行动来为我赢得现在的正面声誉吗?

我相信你现在可以利用你未来的声誉——你的传承。 想想你未来的自己和你将取得的成就。 并将其用作引导你前进的路标。

我希望这些工具——讲述者技巧和想象你未来的自我技巧——不仅能帮助你思考声誉的本质。 我希望它们也能帮助你采取具体步骤来提高你的声誉。

因为建立声誉——让自己名声大噪——是作为开发人员获得可持续成功的最可靠途径。

对很多人来说,成功可能意味着很多事情。 但来自大多数文化的大多数人都会同意:成功的一个重要方面是为自己和家人提供食物。

这就是我们接下来要讨论的内容。

如果你一直在培养自己的技能、人脉和声誉,那么获得一份开发人员的工作并没有那么复杂。

请注意,我说的是并不复杂——工作量仍然很大。 并且这可能是一种折磨。

首先,让我告诉你我是如何找到第一份工作的。

故事时间:一位 30 多岁的老师是如何获得第一份开发人员工作的

故事时间前情回顾:Quincy 在黑客马拉松赛道上表现出色,甚至赢得了一些赛事。 他正在建立自己作为一名使用 JavaScript 的“危险”开发人员的声誉。 不是超级熟练。 只是危险...

我刚刚在圣巴巴拉市中心的图书馆结束了漫长的一天学习、喝茶和做项目。

住在加利福尼亚最好的事情就是天气。 我们开玩笑说,当你在郊区租了一套价格过高的单居室公寓时,你不是在为室内买单——你是在为室外买单。

我的目标是尽可能少地呆在那个狭窄的、有 100 年历史的老鼠窝里,利用剩下的时间就在城里四处走走。

那是一个美丽的星期三晚上。 我还有两天时间准备那个周末的黑客马拉松。 我的大脑因为那一天的编码而乱成一团。 我妻子工作到很晚,所以我查看了日历,想找点事做。

在每个月的第一个星期一,我会规划南加州当月即将举行的所有科技活动,所以如果我有精力的话,我总会找到一个我可以参加的科技活动。

啊——今晚是圣巴巴拉 Ruby on Rails 聚会,我已经回复了。

我对 Ruby on Rails 了解不多,但我用它完成了几个小项目。 更多的时候,我是一名 JavaScript 和 Python 开发人员。

但是我想,管他呢。 我需要保持建立人脉的势头。 并且会场就在几个街区之外。

我走进去,只有几个开发人员围坐在桌子旁聊天。 我很快发现,他们都在当地的一家初创公司工作,一起维护着一个庞大的 Ruby on Rails 代码库。 他们中的大多数人已经在那里工作了几年。

在这一点上,我在过去的一年里建立了我的技能、我的人脉和我的声誉,所以我能够在谈话中持有自己的观点。

但我也意识到自己能力的局限性,所以我保持谦虚的态度,低调。我见过许多其他成功的开发人员在技术活动中操纵对话的方式。

很明显,会议桌上的一位开发人员是工程总监。他直接向 CTO 汇报。

然后很明显,他们正在寻找 Ruby on Rails 开发人员。

我对自己的背景和能力持坦率态度,“我的背景是成人教育,教英语和办学。我大约一年前才开始学习编码。”

但出乎意料的是,他毫不在意。“行吧,如果你想过来面试,我们可以看看你是否适合这个团队。”

那天晚上,我走在回家的路上,感觉浑身像是通了电似的。那是一种恐惧,而不是兴奋。

我觉得还没有准备好。而且我甚至没有在找工作。我只是靠积蓄过活,全职学习编码,并通过我妻子的工作获得健康保险。

我是一个强迫性储蓄者。人们会因此而为难我。 我会自己换机油,自己剪头发,甚至在叫外卖的时候自己在家煮米饭——只是为了省几块钱。

在我当老师的十年间,我成功地存下了将近四分之一的税后收入。我会在 Craigslist 上购买旧的游戏,然后在 eBay 上出售它们。这听起来可能很愚蠢,但这对我来说是一个重要的收入来源。

我们存这一切是为了什么?我们不确定。也许将来某个时候在加利福尼亚买房子?但这意味着我不必急着找一份工作。我知道我处于一个特权位置,我试图通过每天学习更多来充分利用它。

所以简而言之,我认为我还没有为我的第一份开发人员工作做好准备。我担心如果他们雇用我,那将是一个大错误。他们会意识到我是多么缺乏经验,解雇我,然后我必须在以后的工作面试中解释失败的原因。

当然,我现在知道我错误地看待了这个机会。但是让我把这个故事讲完。

当我申请安排面试的时候,他们找我要简历。 我不知道该怎么做,所以我把我所有的专业经验都写在了那里。这些年来我工作过的所有学校。(我故意遗漏了在 Taco Bell 得来速工作的时间。)

当然,我的工作经验都与编码无关。但我该怎么办,递给他们一张白纸?

好吧,我确实有一个我构建的线上项目组合。最重要的是,我有一份我赢得或参加的所有黑客马拉松的清单。 所以我包括了那些。

在面试前的最后几个小时,我重温了过去一年中使用过的所有 Ruby on Rails 教程,以刷新记忆。 然后我穿上连帽衫、牛仔裤和背包,走到他们的办公室。

办公室经理是一位和蔼可亲的女士,她带我到开发人员分区,并将我介绍给他们的小型开发团队。 他们大概有十几个人,大多数穿着牛仔裤和连帽衫,年龄从 20 出头到 40 出头。 其中两人是女性。

我轮流在乱七八糟的桌子和电缆中穿行,与他们每个人握手并自我介绍。 这是我作为课堂老师记住学生名字的所有经验都派上用场的地方。 我能够记住他们所有的名字,所以在那天晚些时候当我离开时,我可以跟他们每个人道别:“很高兴见到你,[名字]。 期待能和你一起工作。”

首先我见了工程总监。 我们走进一间小办公室,关上了门。

墙上的白板上写满了统一建模语言(UML)图的草图。 彩虹般的马克笔列出了各种服务器和服务之间的关系。

我一直盯着那块白板,担心他会派我去解决一些编码问题并展示我的技能。也许是著名的 fizzbuzz 问题? 也许他想让我反转二叉树?

但他甚至从未提到过白板。他只是坐在那里,一直盯着我看。

他们是一家约有 50 名员工的公司,拥有大量风险投资资金和数以千计的付费客户——主要是小企业。 他们以务实为荣。他们从来没有问过我在学校学的是什么,或者我过去做过什么工作。 他们真正关心的是......

“听着。 我知道你会写代码”,他说。“你一直在写代码,赢了黑客马拉松。我检查了你的一些组合项目。对于刚接触编码的人来说,代码质量还可以。所以对我来说,真正的问题是——你能了解我们在这里是如何做事的吗?你能和团队中的其他开发人员一起工作吗? 最关键的是:你能把事情做好吗?”

我咽了咽口水,身体前倾,尽我所能地鼓起信心。“可以,”我说,“我相信我可以。”

他说:“很好,很好,可以。去楼下的越南米粉餐厅等着。[CTO 的名字]应该马上就过去。”

于是和 CTO 边吃边聊,主要是听。我了解到人们会将智慧投射到安静的人身上。专心聆听不仅可以帮助你变得更聪明,甚至可以让你看起来更聪明。

这种方法奏效了。会议持续了大约一个小时。米粉很好吃。我学到了很多关于公司历史和近期目标的知识。CTO 说,“好的,回去和[工程总监]谈谈。”

我也这样做了。然后他给了我一份工作。

现在,我要强调。这不是大多数人获得第一份开发人员工作的方式。

你可能在想,“哎呀,Quincy 只是随便做做,就得到了他甚至都没有寻找过的开发人员工作。要是我们都能这么幸运就好了。”

这当然就是我当时的感觉。但在下一节中,我将探讨雇主与开发者之间的关系。我如何找到那份工作,与其说是我作为面试者的技能,不如说是之前一年的编码、人脉和声誉建设的成果。

这不是一份轻松的工作,在一家大型的科技公司,有着丰厚的薪酬、福利和公司保龄球馆。这是一个合同工的角色,薪水与我作为老师的薪水大致相同。

但这是一项开发工作,一家公司付钱让我写代码。

我现在是一名专业的开发人员了。

雇主想要什么

转眼间十年过去了,我现在已经在桌子的两边都坐过了。我作为开发者接受过招聘经理的面试,我也以招聘经理的身份面试过开发人员。

我花了很多时间与正在找工作的开发人员通电话。他们中的一些人已经申请了数百份工作,但只收到了几次面试的“回电”。

我还花了很多时间与经理和招聘人员通电话,试图更好地了解他们如何招聘以及他们在寻找什么。

我认为开发人员对招聘过程感到沮丧的大部分原因,都归结为误解。

雇主最看重一件事:可预测性。

你认为雇主会喜欢哪位候选人?

X 是拥有十倍效率的“摇滚明星”天才程序员。X 还具有令人难以置信的生产力。但 X 经常对同事脾气暴躁,还经常错过最后期限或会议。

Y 是一个不错的程序员,输出速度较慢但更始终如一。Y 与同事相处融洽,很少错过会议或截止日期。

Z 在输出上与 Y 相似,能够与同事和睦相处,按时完成任务。但是 Z 在过去 3 年里换了 3 次工作。

好吧,你可能会从我到目前为止所说的一切中猜到:Y 是首选候选者。这是因为雇主最看重可预测性。

X 是一些新任经理可能会在招聘时犯的错误的陷阱候选人。如果你好奇为什么雇用 X 会是一个糟糕的主意,请阅读《我们解雇了我们的顶尖人才,我们做出的最佳决定》

我将 Z 添加到此列表只是为了说明一个观点:尽量不要过于频繁地更换工作。

你可以通过从雇主到雇主的阶梯式跳跃快速增加收入。接受录用通知后,你就可以开始申请新工作。 但这会遭到许多招聘经理的排斥。

毕竟滚石不生苔。 你会进入然后退出代码库,还没来得及了解它们的工作原理。

考虑一下:经理可能需要 6 个月或更长时间才能让新开发人员跟上速度,让他们可以为团队带来正向收入。

在那之前,新员工本质上是在消耗公司资源,从同事那里吸收时间和精力,而同事必须让他们入职,帮助他们找到解决代码库的方法,并修复他们的错误。

大多数雇主都厌恶风险

假设一个经理雇用了错误的开发者。 花点时间想象一下,这对团队来说会有多糟糕。

平均而言,填补一家公司的开发人员职位需要大约 3 个月的时间。 雇主必须首先:

  • 获得预算,来雇佣一个已经被老板批准的开发人员
  • 编写职位描述
  • 在求职网站上发布职位并与招聘人员沟通
  • 筛选简历——其中许多都是盲目申请尽可能多的工作的求职者的低成本努力
  • 开始面试过程,这可能涉及让候选人飞到当前城市并住在酒店
  • 涉及许多其他团队成员的多轮面试。 对于一些雇主来说,这是一个为期数天的事情
  • 选择最终候选人,并谈判报价......
  • 许多候选人无论如何都不会接受
  • 签订合同和帮员工入职
  • 给与让他们访问敏感的内部系统的权限
  • 将他们介绍给他们的队友,并确保每个人都相处得很好
  • 然后是几个月的非正式培训,让员工了解一项服务或遗留代码库的一部分
  • 让他们沉浸在团队的做事方式中

简而言之——大量的工作。

现在想象一下,在完成所有这些之后,新员工说:“嘿,我刚刚从另一家公司得到了更高的薪资。拜拜了,您嘞。”

或者想象该员工并不可靠,经常在工作开始后几个小时才出现。

再想象一下,该员工与未经许可的药物、酒精或赌博成瘾、愤怒问题作斗争——或者只是被发现是一个争强好斗、破坏团队的人。

现在你必须重新开始整个过程,并为该职位寻找新的候选人。

招聘是很难的。

所以你可以明白为什么雇主厌恶风险。 他们中的许多人会忽略看似合格的候选人,直到找到他们认为有 99% 把握的人。

因为雇主非常厌恶风险,所以求职者受苦

如果你现在认为招聘很困难,等你了解了工作申请流程有多复杂再感叹吧。你或许已经对它再熟悉不过了。就像这样……

  • 你必须准备简历。同时,你将在整个求职过程中不断地摸索着做决定。
  • 你必须在网上四处寻找职位空缺,研究雇主,并且评估他们是否适合你。
  • 大多数职位的申请都需要填表,你将不得不一遍又一遍地重新填写简历,希望表单不会因服务器错误或 JavaScript 验证错误而崩溃。
  • 提交这些工作申请后,你必须等待雇主处理它们。有一些雇主并不会人工审阅所有申请,因为他们收到的申请实在太多了。(比如谷歌每天能收到 9000 份申请。)雇主会使用软件来筛选。内部招聘人员 平均只花 6 秒查看每份简历。通常你的申请甚至永远不会被人工审阅。
  • 你可能永远不会收到公司的任何回复。他们几乎没有动机告诉你他们为什么拒绝你(他们不希望你提起歧视诉讼)。如果你幸运的话,你会收到一封“我们已经决定选择其他候选人”的电子邮件。
  • 所有你花在申请这些工作上的时间——可能是每周几个小时——是消耗精力的,当然,也是无偿的。

是吧。所以你可以看到招聘过程对雇主,尤其对求职者来说都是一场噩梦。

但如果你坚持下去,你最终可以拿到一些 offer。毕竟好运也是连着来的。

以下是一位 freeCodeCamp 贡献者在 12 周内的求职数据:

在投递了 291 份申请之后,他最终收到了 8 个 offer
在投递了 291 份申请之后,他最终收到了 8 个 offer

随着 offer 的陆续到来,起薪也越来越高。当然,请注意,这是在世界上消费水平最高的城市之一——旧金山的工作薪资。

到第 12 周时,在他收到的 offer 里,起薪几乎是第 2 周的两倍
到第 12 周时,在他收到的 offer 里,起薪几乎是第 2 周的两倍

这位开发者得到面试的几率相当高。而且他的谈判能力也很强。如果你感兴趣,可以在这里了解更多关于他求职过程的内容。

但正如我之前所说,其实从“旁门”进入一家公司会更容易一些。

这就是我写这本书的原因之一。我不希望你们都在雇主的“前门”排队。

如果你建立了自己的技能、人脉和声誉,你就可以绕过很多工作申请流程

在本书中,我一直在教你一些增加“走运”获得工作机会可能性的技巧。

“运气是准备遇见机会。如果你在机会来临时没有做好准备,你就不会'幸运'。” —— 奥普拉·温弗瑞

这就是为什么在整本书中我都鼓励你同时发展这三个领域,并且从第一天起就开始考虑它们——在你找工作之前。

我没有特意找工作但却找到了工作的故事可能看起来有点蠢。但这种情况发生的频率可能比你想象的要高。

现实是:学习编程很困难。

但是知道如何编程很重要。

在每个行业中——几乎在世界上的每个公司中——管理者们都在试图找到用软件处理他们的流程的方法。

这就意味着需要开发人员。

你可能听说过科技行业偶尔会出现大规模裁员。 但是,如果你缩小并查看更长的时间线,开发人员的招聘趋势无疑是增长的。

我希望凭借优秀的技能、强大的人脉和良好的声誉,你将额外耗费最少的精力并找到一份好工作。

希望在我们有生之年的某一天,雇主和有技能的员工可以更容易地找到彼此,而无需漫长、残酷的工作申请和面试过程。

我应该在第一份开发工作谈判薪资吗

只要你礼貌地进行谈判沟通,尝试提高你的薪水通常不会有什么坏处。

我写过一篇更详细的关于如何进行开发工作的薪资谈判的文章。

从本质上讲,谈判更高的起薪取决于你有多少筹码。

你的雇主有工作要完成。他们有多需要你来为他们工作?他们还有什么其他选择?

而你需要收入来生活。你有什么其他的选择?你的备选计划是什么?

如果你有另一家雇主提供的工作机会,并且愿意支付某个金额的薪水,你可以将其作为谈判薪资的筹码。

如果你的最佳后备计划是回到学校并获得研究生学位……那不算特别强大的筹码,但总比没有好。你可以在薪资谈判的过程中提到它。

回想一下我之前描述的漫长的招聘过程。雇主必须经过至少十几个步骤才能与候选人到达将要发放 offer 的那一步。他们可能已经预料到你会进行薪资谈判,并不会对此感到惊讶。

现在,如果你和我一样,有家公司突然给你一份工作,你可能会觉得谈判薪资很尴尬。

《辛普森一家》里的史密瑟斯
《辛普森一家》里的史密瑟斯

我承认——在我上面写的故事里,当我的经理给我这份工作时,我没有谈判。

回想起来,我本应该协商我的报酬吗?也许吧。

我有什么筹码吗?可能不多。我的备选计划是继续参加编程比赛,在公共图书馆喝茶和写代码。

我也许能去谈判并每小时多赚几美元。但在他们给我那份工作的那一刻,报酬是我最后才考虑到的事情。我只是欣喜若狂,因为我即将成为一名专业的开发人员。

顺便说一句,一旦你在一家公司担任开发人员一年左右,你可能会想要求加薪。我已经写了更详细的关于作为开发人员如何要求加薪的文章。但归根结底都是同一件事:谈判筹码。

你应该找猎头帮忙搜寻开发职位吗

是的。如果你能找到一位猎头来帮助你找到第一份开发工作,那么你应该这样做。

我已经写过关于为什么猎头是你找工作时被低估的工具的文章。

许多雇主会向猎头支付中介费,用以向他们输送高质量的求职者。

猎头的目标和奖励机制与作为求职者的你完全一致:

  1. 他们将根据你的起薪获得报酬,因此他们倾向于帮助你协商到尽可能高的起薪。
  2. 他们成功输送的候选人越多——输送的速度越快——他们赚的钱就越多。所以他们会希望帮助你尽快找到工作,这样他们就可以转向其他求职者。
  3. 因为他们只有在你成为一名正式员工(并且至少待 90 天)后才会得到报酬,所以他们会努力确保你能胜任这份工作,并且适合公司的文化。

话说回来,如果猎头要求你为任何事情付钱给他们,那就是危险信号。

并不是所有的猎头都是相同的。在与猎头合作之前先做个调查。即使他们最终得到了雇主的报酬,你仍然在花时间帮助他们把你推荐到合适的位置。时间是很宝贵的。

说到时间,有一种可以让你更快达到写代码获得报酬的方法——即便你还在为求职做准备——做一些自由开发者的工作。

如何找到自由客户

我鼓励初级开发人员在开始找工作之前尝试获得一些自由客户。这里有三个很好的理由:

  1. 获得自由客户比找到全职工作要容易得多。
  2. 自由职业的风险较小,因为你可以在不辞去日常工作的情况下进行。
  3. 你可以更快地开始通过写代码获得报酬,并更快地开始构建你的专业作品集。

获得自由客户比找到开发工作要容易得多。这是为什么?

想想当地的小型企业。它可能只是一个经营餐馆、商店、管道公司或者律师事务所的家庭。

这些企业中有多少可以从交互式网站、后台管理系统和工具中受益,以自动化他们的日常工作流程呢?答案当然是他们中的大多数。

然而这些公司中有多少能够聘请全职软件开发人员来构建和维护这些系统呢?没有那么多。

这就是自由职业者的用武之地。他们可以根据具体情况提供更加经济实惠的服务。小型企业可以为单个项目或短期聘请自由职业者。

如果你正在积极建立你的人脉,你遇到的一些人可能会成为你的客户。

例如,你可能会遇到一位想要更新其网站的本地会计师,他可能想添加安排咨询或接受信用卡支付的能力。这些是小型企业可能要求的常见功能,你可能会非常擅长实现它们。

你可能还会遇到需要 ERP 系统、CRM 系统、库存系统或无数其他工具之一的小型企业的管理者。

在许多情况下,你可以为他们部署和配置一个开源工具。然后你可以教他们如何使用那个系统。你可以按月向他们收取服务费,让你“随叫随到”并准备好解决可能出现的问题。

我应该签订自由职业合同吗

你需要找到一个标准的合同模板,修改它,然后请律师审核。

让当地的面包店与你签订合同只是为了帮助更新他们的网站或社交媒体形象,这可能会让人感到尴尬。但这样做会让整个交易比单纯的握手协议更专业。

一家小企业不太可能会因为几千美元而将你告上法庭。但如果发生这种情况,你会很高兴自己签了合同。

我应该为自由职业的工作收取多少费用

我会把你日常工作中做的所有事情考虑在内,计算出你的时薪,然后支付双倍的薪资。这听起来可能是很多钱,但自由职业比常规工作要难得多。你必须学习很多东西。

或者,你可以以单个项目为单位计费,“我将以 1000 美元的价格为你部署和配置此系统。”

请务必指定你愿意维护项目的时间范围。你不希望人们在 3 年后打电话给你,希望你回来修复一个没有人维护的系统。

我如何确保自由客户会付钱给我

很多其他的自由职业者——包括我自己——都使用这种简单的方法:在开始工作之前预先索取一半的报酬。当你能证明你已经完成了一半时,就要求他们支付另一半。

尽量在你真正完成项目之前拿到所有报酬,这样,客户就无法用未支付的报酬来试图让你做额外的工作。

如果你已经得到全额报酬,那么你之后为客户所做的工作将传达这个意思:“我为你付出了更多。”

这带来了一种完全不同的气氛:“啊哦——你会为我做的所有工作付钱给我吗?”

我应该使用像 Upwork 或者 Fiverr 这样的自由职业网站吗

如果你在一些偏远地区并且在当地找不到任何客户,你可以尝试其中的一些自由职业网站。但除此之外,我不会关注它们。原因如下:

当你尝试在自由职业网站上找兼职工作时,你是在与世界各地的所有自由职业者竞争。他们中的许多人居住在生活成本比你低得多的城市。他们中的一些人甚至不会像你一样真正关心自己的声誉,并且可能愿意接受低于标准报酬的工作。

在某种程度上,这些网站助长了一种“逐底竞争”现象,即提供最廉价劳动力的人通常会得到这份工作。

如果你转而专注于通过自己的本地人际关系寻找客户,你将不必与这些国外的自由职业者竞争。

需要寻求自由开发者帮助的人也是如此。如果你想雇用一名自由职业者,我强烈建议你与可以见到面的人一起工作,他与你的社区有联系。

在你的城市生活了几年,并且与你有很多交集的人——他们不太可能试图占你的便宜。如果你和你的合作方都关心自己的声誉,那么你们会成就一段有效的合作伙伴关系。

你们可能成为彼此履历中的成功故事。

我什么时候应该停止自由职业并开始找正式工作

如果你有能力以自由职业维生,你可能只想继续做下去。慢慢地,你甚至可以建立自己的软件开发机构,并聘请其他开发人员来帮助你。

话说回来,如果你渴望拥有稳定的开发工作,那么你可能很走运。如果你坚持足够长的时间,自由客户可能会给你全职工作。在某些时候,客户以较低的时薪给你提供一份全职工作可能更经济实惠。你得到一份稳定的每周工作 40 小时的工作,而他们全职获得你的技能。

当你找到工作时,你也可以保留一些自由客户。这是很好的收入补贴。但请记住,正如我们将在下一章中了解到的那样,你的第一份开发工作可能会需要你非常尽职尽责。至少在一开始的时候是这样。

成为职业开发者的第一年会有多疯狂呢?让我们来谈谈这个。

第五章:如何在第一份工作中取得成功

“待在港口的船很安全。但这不是造船的目的。” —— 格蕾丝·霍珀,数学家,美国海军少将,计算机科学先驱

一旦你获得第一份开发工作,那就是真正学习的开始。

你将学习如何与其他开发人员一起高效工作。

你将学习如何浏览大型遗留代码库。

你将学习版本控制系统、持续集成和持续交付工具(CI/CD)、项目管理工具等。

你将学习如何在技术管理者手下工作。如何在截止日期前交付。以及如何解决工作中的大量分歧。

最重要的是,你将学会如何管理自己。

你将学习如何突破影响我们所有人的心理障碍,例如冒名顶替综合症。你将了解到自己的极限,以及如何稍微地超越它们。

故事时间:一名 30 多岁的老师如何在他的第一份开发工作中取得成功

故事时间前情回顾:昆西在当地一家科技初创公司找到了他的第一份开发工作。他将成为维护一个庞大、复杂的代码库的十几名开发人员中的一员。他不知道自己在做什么……

我凌晨 4 点醒来,再也睡不着了。我努力尝试睡着。但是焦虑就像在我的胸口燃烧一样,恐慌包围了我。

我在教育领域工作了十年,先当辅导员,然后当老师,接着担任校长。

几个小时后,我将从头开始,成为一名开发人员。

我过去的任何学习——过去的成功——对我的新职业来说有什么意义吗?

我做了我感到焦虑时最常做的事——跑步。我跑下山坡,头灯在黑暗中摇晃。当我到达海滩时,太阳慢慢爬上树梢,我沿着大海奔跑。

当我回到家时,我妻子已经出门上班了。她告诉我不要担心。她说,“即使你因为不知道自己在做什么而被解雇,我依然爱你。”

当我到达我的新办公室时,那里没有人。作为一名教师,我习惯于 7 点 30 分准时到校。但我很快意识到,大多数软件开发人员并没有那么早开始工作。

所以我盘腿坐在入口走廊上,在我的上网本上按照教程写代码。

一名员工朝我走来,脸上带着紧张的表情。她可能认为我是一个来占位的闲杂人等。我向她保证我确实在她的公司工作,并说服她让我进去。

穿过空荡荡的开放式办公室走向开发人员工作的区域,我感觉像在做梦,只有出口标志的灯光指引着我的路。

我在一张空的站立式办公桌上设置了我的上网本,并完成了编码教程。

过了一会儿,我周围的灯光亮了起来。我的老板来了。起初他并没在意我的存在。他只是在办公桌前坐下,开始敲击他的机械键盘。

“拉森”,他终于开口了。“你准备好迎接你这个重要的第一天了吗?”

我还没准备好。但我想表现出我的信心。所以我说了最早出现在我最喜欢的 80 年代电影之一《妖魔大闹唐人街》中的一句台词:“我生来就准备好了。”

big-trubs-born-ready

你可能已经听过上百万次“我天生就准备好了”。但这句话最早是在 1986 年杰克·伯顿(Jack Burton)对他的朋友王驰(Wang Chi)说的,当时他们正准备在他的死亡仓库中与一位千年老巫师对峙。我不敢相信我的父母当时让我看这个,但我很高兴他们这么做了。

“好极了”,我的老板说,“那么先给你配一台电脑。”

“哦,我已经有了一个”,我敲了敲我 200 美元的上网本说,“这个宝贝正在运行 Linux Mint,我已经自定义了我的 .emacs 文件,以便能够……”

“我们是一家 Mac 商店”,他说着走向储藏室。他搜寻了一会儿,然后出现了。“这是一个已经用了 3 年的模型,但它应该还够用。我们把它重置到出厂设置。”

我开始说我已经熟悉我的电脑配置,而且我用它能更快地工作,但他并不接受。

“我们都在使用相同的工具。它使协作变得更加容易。你要知道,惯例优于配置。”

那是我第一次听到“惯例优于配置”这个词,但在接下来的几天里它会出现很多次。

我花了接下来的几个小时来配置我的新电脑,而其他开发人员陆续到了公司。

接近上午 10 点时,我们开始了团队“站会”。我们站在白板前围成一圈,轮流汇报当天的工作。

每个人都提供简洁、准确的进展更新。

轮到我了,我开始自我介绍。当时我已经非常紧张了,结果这时候迈克走了进来,他是超级马拉松运动员,也主持举办圣塔芭芭拉的初创企业活动。他正在吃一些小胡萝卜,那天早上他已经跑了大约 30 英里。

在我结束后,迈克说话了,欢迎了我并且说他在一些活动中见过我。然后,他用 15 秒的时间讲述了有关他正在写一些功能的工作。

整个会议只进行了大约 10 分钟,大家就各自回到了自己的办公桌。

我最终让公司的代码库在我的新笔记本电脑上运行。这是一个已经发展了 5 年多的 Ruby on Rails 应用程序。我运行了 “rake stats” 命令,发现它有数百万行代码。我不寒而栗。我怎么可能能理解这些东西呢?

我的隔壁桌,一个看起来粗鲁的、留着胡子的开发人员说,“嗯,其中大部分只是包。你实际要处理的代码库可能只有 100000 行。别担心。你会掌握它的窍门的。”

我咽了咽口水,心想:“这还不到一百万呢,还行。”

“顺便说一句,我叫 Nick”,他自我介绍道,“如果你需要任何帮助,请告诉我。我已经在这个代码库上摸索了好几年,所以我应该可以帮到你。”

在接下来的几天里,我向 Nick 提问了每一个我遇到的内部系统问题。

终于,Nick 开始将他的聊天状态设置为“代码模式”,并戴上了降噪耳机。他转身背对我,用肢体语言说:“让我一个人待一会,我也要完成自己的工作。”

这是我关于团队动力学到的第一个教训。你不想因为提问太多而不受欢迎,你需要更善于自己学习。

但这个代码库很庞大,除了内部注释和内容相当少的团队 wiki 外,基本什么都没有。

这个代码库是闭源的,只有我身边的人在进行开发,也没办用 Stack Overflow 搜索,我只能在黑暗中摸索。

我开始纠结该骚扰哪个邻桌同事提问,但又感觉这样是在消耗队友的热情。

我开始过分担忧,连最简单的问题也羞于提问。我定了一个规矩:先自己摸索两小时再去向别人求助。

有一次,折腾了几个小时后,我终于求助了。主管发现我整个上午都没有进展,问我:“为什么不早点开口呢?”

我遇到的另一个难题是理解代码库,包括整体和微服务部分。

整个代码库有几千个单元测试和集成测试。贡献新的代码时也要编写测试,用来确认新代码实现了预期功能,且不会破坏现有的功能。

往往我提交了自认为充分测试的代码,却影响了其他我没有考虑到的部分,破坏了程序构建(break the build)。其他人在根本问题解决之前无法合并代码,整个团队都很失望。

程序一周会出几次问题,我不是唯一一个犯这种错误的人,但我感觉都是我的错。

有段时间我觉得自己不是做开发的料,我自己想着,“开什么玩笑呢?怎么突然就决定来做开发了呢?”

我不断回想起一年前我刚刚开始学习编程的时候,其他开发朋友们对我说过的话。

“你怎么和那些从小学编程的人共事?”

“为什么不去做你擅长的事呢?”

“你怕不是得痛饮知识的海洋。”

我离开电脑的时间越来越长。办公室的厨房里摆满了零食,我不停找借口起来吃零食,不管怎样,只要能摆脱那种不知道自己在做什么的感觉就行。

最开始几个月很难。每日立会的时候,我感觉每个人都在飞快前进,修补 bug、发布新功能,只有我没什么可说的,我还在做前一天的那个功能。

每天醒来去上班时我都感到恐惧,“今天就是他们炒我鱿鱼的日子。”

但是工作中每个人都很友善,很有耐心。遇到真的无法解决的问题我会去求助,渐渐地,我有了一点进展,还修复了一两个 bug。

我浏览代码库的速度越来越快,代码出错时,我读取堆栈轨迹的速度也越来越快,也能更快地发布新功能了。

每次老板叫我去办公室时,我都在想:“完了,这次没跑了,我今天就要被炒鱿鱼了。”但他只是给我更多bug来修,更多要开发的功能。谢天谢地。

最离谱的就在这了:我怕被解雇怕得要死,他却完全不知道怎么回事。

当然,我也听说过“冒名顶替者综合症”,但我没有意识到这件事会发生在我身上,我这肯定是得了“编程很烂”综合症,对吧?

有一天我坐在 Nick 旁边,看他好像很累,我去厨房给他拿了瓶汽水。

我回来后,他打开拉环喝了一口,靠在椅子上,盯着满是代码的显示器,“这个 bug 啊,哥们我花了三周时间来修,做梦都在调试。”

“三周时间修一个 bug ?”我问道。我从未听说过这样的事。

“有些 bug 更难修,这个就坏得很。”

这句话给了我当头一棒。我总是把我的任务按份处理,比如修一个 bug 要半天时间,超过了半天就肯定是我做的不对。

但是,有着加利福尼亚大学的计算机科学学位、多年同一代码库工作经验的尼克却在一个bug上困住了三个星期。

也许是我对自己太苛刻了,可能我修的一些 bug 不是“半天的 bug”,而是“两三天的 bug ”。是,我缺乏经验,工作也慢。但就算这样,我是不是给自己设立了不切实际的标准呢?

在开发新功能时,有的功能开发要 5 天,甚至是两周时间而修 bug 的时候没有这样的时间规划,但其实修复 bug 所需的时间也是不同的。

回家后,我深入了解了下“冒名顶替综合症”,也缓解了不少焦虑。

在接下来的几个月里,我还在为代码库构建新功能,与队友合作。虽然工作还是很难很费脑,但开始没有那么困难了。

每天午餐时,我都会和队友一起下棋。有一周有一个全公司的国际象棋锦标赛。

几轮后,轮到我和 CEO 对弈。

这位 CEO 的下棋风格很不一般,他开局开得很不好,少有棋手会做出这样的选择,最初我取得了领先。

但接下来的几步,他慢慢地夺回了比赛的控制权,最终占了上风,打败了我。

我问他在经营公司的同时,怎么还有时间保持棋艺精湛,他说:“没有,我一年只下一两次。”

他停顿了一会儿,手停着不动,好像准备开始演讲。他说:“我叔叔是一名优秀的棋手,他给了我一个简单的建议:“轮到你的对手时,放慢速度,试着从他们的角度来理解比赛——他们为什么要这么做?”

他鞠了一躬,然后告辞去开会了。

这些年,我不停在想他说的话,我想他的建议不仅仅适用于国际象棋,也适用于任何对局。

重复任务就该自动化

关于软件开发我还学到了一个经验。由于我是团队中资历最浅的人,就经常被分配到没有人愿意做的苦差事,其中一项任务就是“代码保姆”。

每当有人破坏了代码,我就会 pull 主分支的最新版本,并使用 git bisect来找到破坏代码的提交。

打开提交,运行测试,找出出错的地方,向破坏 build 的人发送消息,告知要修复的地方。

这套流程我做的飞快。在充满迷惑的 bug 报告和含糊不清的功能请求的一天里,我期待着 build 出错,这样只需要花上很短的时间,我就能感受到自己的价值。

没过多久团队中有人说:“build 出错的频率太高,应该自动化一下。”

我什么也没说,但产生了戒心。这可不是什么好主意,一个脚本怎么能像我这个有血有肉的开发人员一样找到有问题的提交呢?

但又过了几天,果不其然,队友随手写了一个脚本,我再也不用做代码保姆了。

收到 build 出错的消息,没过多久,又收到是哪个 commit 破坏了 build ,需要谁来修复,总感觉怪怪的。

我感到气愤,什么也没说,但心里想:“这是我的工作,脚本抢了我的活。”

当然,现在每每回想起自己的反应我都感到好笑。我想象着自己已经 40 多岁了,每周还要放下几次别的事情,来做代码保姆。

工作中,如果一项任务可以自动化,可以分解成计算机可以可靠完成的小步骤,那么就应该自动化。

你的时间应该留给更有趣的工作。

这张 XKCD 的图表,帮你弄清一项任务是否值得投入时间来实现自动化
这张 XKCD 的图表,帮你弄清一项任务是否值得投入时间来实现自动化

多听老人言

我向团队里每个人都学到了很多。我从 Mike 那里学到了产品设计概念。他带我在沙滩上跑步,教我如何用前脚掌跑步,前脚掌先于脚跟着地,这样对关节更为友好。

从Nick那里我学到了敏捷软件工程(agile software engineering)的概念,他帮我从图书馆挑选了软件开发书籍,甚至还邀请我去他家参加乔迁派对,那次我见到了他的几个孩子。

在这家公司工作了大概一年时间,我觉得到了创业的时候了,我想要做与在线学习相关的内容。我找到CTO坐下谈话,把要离开的消息告诉了他。

我说:“很感激大家雇用了我,显然我是全公司最弱的开发者。”

他大笑着说:“当然,最开始你是团队中最烂的开发者,我得说,现在你还是团队中最烂的开发者。”

我坐在那里尴尬地笑着,朝他眨了眨眼睛,不知道他是不是因为我要离开而生气。

然后他说,“但这很聪明,你是个聪明人。你总是想成为乐队里最差的乐手,希望身边都是比你优秀的人,这样你才能成长。”

两周后,我检查了当天的代码更改,交接了我未完成的工作,把 Mac 电脑重置为出厂设置,交给了主管。

我和队友们握了握手,走出门,走在被夜幕笼罩的加州。

我全力以赴,争取签约自由职业维持收入。我在奥克兰物色了一套公寓,与旧金山市场南的科技中心隔桥相望。

我已经是一个有一年经验的专业开发人员了。

我已经准备好追寻新的梦想,采取新的行动。

我走向了创业之路。

开发者第一年的经验教训

作为专业开发者的第一年,我做了很多正确的选择,我给自己打个 B-。

但如果有机会重新来过,有些选择会不同。

接下来是我的建议,希望这些建议能使你的学习效果最大化,减少你的烦恼。

丢下自负

许多进入软件开发领域的人都是从最底层开始的,你可能会获得“初级开发者”的头衔。

人到中年,头衔里还有个“初级”总觉得有点尴尬。但只要耐心、努力,就能克服这一点。

每天我都面临的问题是:我有十年的专业经验了。我不是个入门员工。是,我是个开发新手,但我在教学与管理方面都经验丰富。(上一份教学工作中,我管理了 30 名员工。)

但尽管过去的工作经验丰富,我仍然是个入门级的开发者,我还是个新手。

我也很想大喊“我当过老板,不需要你来照顾”,但事实是我确实需要别人来手把手带领。

要是不小心影响了生产怎么办?在应用中引入了安全漏洞怎么办?清空了整个数据库怎么办?加密了重要的东西却把密码忘了怎么办?

这些灾难经常发生,并不只有新开发者才会犯这些错误。

现实情况是,新开发者就是个闯祸鬼,很努力很小心翼翼,却搞坏了所有东西。

不要对队友失去耐心,别总想提你的高等学位、获得的奖项、或者市长给你的城市钥匙。(好吧,也许最后一项没有发生在我身上。)

这不仅仅会让你很难相处,也会分散你对手头工作的注意力。

在做开发者的最初几个月里,我把过去的成就作为一种安慰。“是,我编程很烂,但我教英语语法还不错,我跟你讲过我以前管理过一所学校吗?”

手指放在键盘上,眼睛盯着代码编辑器,就必须抛弃过去的自己。只有今天的工作完成之后,今晚才可以陶醉于昨天的成就。

但首先,你要接受再次成为初学者所带来的所有情绪,专注于手头的任务,完成任务。

可能只是“冒名顶替者综合症”

几乎我认识的每个人都经历过“冒名顶替者综合症”。那种你不属于这里的感觉,感觉队友随时会发现你的代码有多糟糕,暴露你不是“真正的开发人员”。

在某种程度上,这种感觉并没有不会消失,它总是在脑海中,在尝试做新的事情时随时蠢蠢欲动。

“能帮我处理这个错误信息吗?” “嗯……找我可能不太合适吧。”

“能和我一起编程实现这个功能吗?” “嗯……是不是找别人更好啊。”

“能在接下来的会议上做个演讲吗?” “嗯……你确定是我吗?”

我见过一些高级工程师进入职业生涯十多年后,仍不时患上“冒名顶替者综合症”。

当你觉得自己能力不足或毫无准备时,这可能只是一种“冒名顶替者综合症”。

当然,如果你递给我一把手术刀,说“帮我做心脏手术”,我会觉得自己是个骗子。在某种程度上,如果真的做不到,感觉力不从心是完全合理的。

问题是,如果你一直在做软件开发,一些事情你明明做得到,却仍然莫名其妙地焦虑。

我不是医生,但直觉上认为对大多数人来说,“冒名顶替者综合症”会随着时间的推移逐渐消失,练习得越多,也就更有信心。

但有时,这种感觉还是会出现。我也承认,在做一项新任务或一段时间没有做的任务时,我有时会感到“冒名顶替者综合症”。

关键是要接受它,要记住,可能只是“冒名顶替者综合症”。

继续前进吧。

找到团体,但不要陷入团体

找到第一份开发者工作后,你将与其他开发者一起工作,你找到了一个团体。

你和他们有很多共事的时间,感觉成为了一个紧密的单位。

但请不要忽视周围的非开发人员。

前文中我提到了产品经理 Mike,他也负责创业活动。他“不懂技术”,在编码方面的知识有限,但我敢说我从他身上学到的东西和其他人一样多。

你可能会和其他部门的人一起工作——设计师、产品经理、项目经理、IT人员、QA人员、营销人员,甚至是财务和会计人员,从这些人身上也可以学到很多东西。

确实,你应该与团队其他开发者之间建立牢固的联系。但请保持好奇,在餐厅或公司活动中与不同的人一起活动,你永远不知道谁会是下一个帮你学习技能、建立人脉或声誉的人。

不要太舒适,也不要太早专攻

我经常给第一次学习代码的人这样建议:“从一般的编码技能(JavaScript、SQL、Linux 等等)开始学起,然后专门从事这项工作。”

我的想法是一旦学会了最常用的工具,就可以学习那些不太常用的工具。

比如说,学会了 PostgreSQL,很容易就能学会 MySQL。学会了 Node.js,很容易就能学会 Ruby on Rails 或 Java Spring Boot。

但有些人在工作中太早专精了,老板可能会要求他们“专管”某个API或特性。如果在这方面做得好,老板可能就会继续给类似的项目。

你只负责管理自己,而老板在管理很多人,无法细致地了解你能力和兴趣,可能会把你看成“某专业人”,只给你安排相关的任务。

但你知道自己擅长什么,对什么感兴趣,可以尝试自愿走出舒适区。如果能让老板给你分配舒适区之外的任务,就能继续扩展技能,并可能与新的团队合作。

记住:老板要为你工作上的表现负责,而你要为自己的整个职业生涯负责。

接受那些既能履行对雇主的义务,又能为自己的长期职业目标做好准备的项目。

后记:相信自己,你能行

在这里我只想留下一句话,那就是:你能够做到

你能够学会这些概念。

你能够学会这些工具。

你能够成为一名开发者。

接下来,在有人愿意花钱让你编写代码的时候,你就会成为一名专业的开发者。

学习编程,找到第一份开发工作,这个过程令人生畏,但请不要气馁。

坚持下去总会成功,一切都在于练习。

创建一个项目,给朋友展示自己的项目,为朋友创建项目。

建立人际网络,帮助你遇到的人。有付出就有回报,你总会得到回报。

现在还不算太晚,人生漫漫。

多年以后,当你回顾这一刻的时候,你会为做出的改变而欣慰。

做好长期计划,计划好不确定性。

但最重要的是,不要停止编写代码。继续参加活动,继续与朋友分享你的成功。

正如老子所说:

“千里之行,始于足下。”

读完这本书,你就已经迈出了一步,说不定已经朝着目标走了许多步。

一鼓作气,继续保持阅读这本书的势头。

现在就开始编写下一个项目。

永远记住:

你能够做到。