如何学习编程并获得开发者工作 [全书]
如何学习编程并获得开发人员工作[完整书籍]
如果你想学习编码并找到一份开发人员的工作 ,你来对地方了。这本书将向你展示如何做到这一点。
是的,这就是整本书-完全免费-就在freeCodeCamp这个页面上。
2023年10月20日更新:我制作了一本免费的完整有声读物版本,并将其发布为freeCodeCamp Podcast的第100集。你可以在你最喜欢的播客播放器中搜索它。记得订阅。我也在下面嵌入了它,以方便你。
https://play.libsyn.com/embed/episode/id/28380047/height/192/theme/modern/size/large/thumbnail/yes/custom-color/2a4061/time-start/00:00:00/playlist-height/200/direction/backward/download/yes
几年前,一家来自纽约市的五大出版商找到了我,希望和我签一本书的合同。我和他们见面了,但没有时间写书。
嗯,我终于有时间了。我决定将这本书免费发布在freeCodeCamp上。
信息想要自由,对吧?🙂
阅读完全需要您几个小时。但这就是它了。关于学习编码和成为开发人员工作的见解。
我在以下过程中学到了这些:
- 三十多岁时学习编码
- 然后担任软件工程师
- 然后在过去的8年里运行freeCodeCamp.org。今天,每天有超过一百万人访问该网站学习数学,编程和计算机科学。
我曾经是一名英语教师,以前从未接触过编程。而我只用了一年的时间就学会了足够的编程知识,从而获得了我的第一份软件开发工作。
而且,我没有花钱购买书本或课程。
(我确实花了一些钱去附近的城市参加技术活动。并且正如你在本书后面将看到的那样,这是值得的投资。)
在担任软件工程师工作几年后,我感觉准备好了。我想教其他人如何进行职业转型。
我开发了几个技术教育工具,但没有人对它们感兴趣。但是后来的一个周末,我开发了freeCodeCamp.org。一个充满活力的社区迅速聚集在这个平台上。
在这一过程中,我们共同帮助了彼此。如今,世界各地的人们都使用freeCodeCamp准备自己的技术初体验。
你可能会想:我不知道我是否有时间阅读整本书。
别担心。你可以将它加入收藏夹,可以随时回来,根据需要分多次阅读。
你还可以在社交媒体上分享它。分享“我正在阅读这本书”,并提供链接,是一种令人惊讶的有效方法,能够说服自己读完一本书。
我之所以这样说,是因为我并不想向你推销这本书。当你打开这个网页时,你已经“购买”了这本书。现在我的目标是向你保证,投入时间读完这本书将会是值得的。😉
我保证尊重你的时间。这里没有炒作或废话,只有直接可操作的建议。
我会尽可能在每一章中提供尽可能多的见解。
这提醒起我:目录在哪里?
啊,这就是它:
目录
- 前言:这本书适合谁?
- 500字执行摘要
- 第一章:如何培养技能
- 第二章:如何建立你的社交网络
- 第三章:如何建立你的声誉
- 第四章:如何为编码赚钱 – 自由职业客户和工作搜索
- 第五章:怎样在你的第一份开发者工作中取得成功
- 结语:你能成功
前言:这本书是为谁准备的?
这本书适合任何考虑从事软件开发职业的人。
如果你正在寻找一份灵活、高薪且涉及大量创造性问题解决的职业,那么软件开发可能适合你。
当然,每个人在自己的编码之旅中拥有一定的资源:时间,金钱和机会。
你可能年纪较大,并且可能有孩子或需要照顾的老年亲属。所以你可能有较少的时间。
或者你可能年轻,没有太多时间来积攒储蓄或获得提高收入的技能。所以你可能拥有较少的金钱。
你可能住在远离旧金山、柏林、东京或班加罗尔等主要科技城市的地方。
或者你可能有身体或精神上的残疾。年龄歧视、种族歧视和性别歧视是真实存在的。移民身份可能会使就业搜索变得复杂。犯罪记录也会造成困扰。
所以你可能机会较少。
对于有些人来说,学习编码并获得开发工作将会比其他人更加困难。每个人从自己的起点出发,凭借手头所能利用的资源来面对这个挑战。
但无论你的起点如何 – 在时间、金钱和机会方面 – 我将尽力给你提供可行的建议。
换句话说:别担心 – 你来对地方了。
术语快速说明
每当我使用新术语时,我都会尽力给出定义。
但是有一些术语我会一直使用。
我会将 “programming” 和 “coding” 互换使用。
我会将 “app” 用于它的原意 – 作为任何应用程序的简称,无论它在手机、笔记本电脑、游戏机还是冰箱上运行。(抱歉,史蒂夫·乔布斯。iPhone并非对 “app” 这个词有专利控制。)
我还会将 “software engineer” 和 “software developer” 互换使用。
你可能会遇到一些在技术领域有意见的人。仿佛软件工程是一些有着几个世纪历史的高级领域,就像机械工程或土木工程一样。谁知道呢 – 也许对于你的孙辈来说真的会是这样。但我们仍然处在软件开发作为一个领域的早期阶段。
就让我引用 Gerald Weinberg,一位程序员、作家和大学教授的这句话吧,以防你在称呼自己为软件工程师时感到尴尬:
“如果建筑工人像程序员写程序一样建造建筑物,那么第一只啄木鸟来的时候就会毁灭文明。” – Gerald Weinberg,程序员、作家和大学教授
任何人都能学会编码吗?
是的。我相信任何一个充满动力的人都能学会编码。学习编码最终是一个动力性挑战,不是能力问题。
在非洲的大草原上 – 早期人类居住了数千年,然后才传播到欧洲、亚洲和美洲 – 有计算机吗?
编程技能从来都不是在千年间被筛选出来的东西。我们所知的计算机(台式机、笔记本电脑、智能手机)是在80年代、90年代和00年代诞生的。
是的 – 我确实相信能力也起了一定作用。但无论如何,任何想成为专业开发人员的人都需要在键盘前投入时间。
绝大多数试图学习编码的人会感到沮丧并放弃。
我也一样。我感到沮丧并放弃过,不止一次。
但就像其他最终成功的人一样,几天后我又回来了,再次尝试。
我之所以说这些,是因为我想承认:学习编码和获得开发工作很困难。而且由于各种情况,对于某些人来说比其他人更加困难。
我不会假装在学习编码时面临了真正的困境。是的,我三十多岁,没有编程或计算机科学的正式背景。但请考虑以下事实:
我在美国中产阶级中长大 – 是一个英语家庭的第四代美国人。我上过大学。我父亲上过大学。他的父亲也上过大学。(他之前的祖父母是来自瑞典的农民。)
我从一种代际特权中获益,这是一些家庭能够随着时间推移而获得的动能,当他们没有被战争、饥荒或奴隶制度所撕裂时。
所以这就是我对你的重要警告:我并不是那种能激励你克服困难的励志人物。
如果你需要灵感,那么在开发者社区中有很多人已经战胜了真实的困境,你可以去寻找他们。
我并不打算把软件开发事业提升到一个新的高度,也不会描绘一个只要每个人都学会编程就可以实现的科幻乌托邦。
相反,我只会给你一些建议,告诉你如何获得这些技能,以及如何找到好工作,以养活家人。
学习编程是为了找个好的稳定工作没有什么不对。
为了自己创业而学习编程也没有错。
你可能会遇到这样的人,他们说你必须对编程充满激情,甚至成为你的梦想。他们说你上完全职工作后,整个周末都要为开源项目做贡献。
我认识一些对编程非常热衷的人。但我也认识很多人,在完成了一个辛苦的工作周之后,只想去大自然中度假,或者和朋友们玩桌游。
人们通常喜欢做自己擅长的事情。通过不断提高编程水平,你也能对编程产生一定程度的热情。
简而言之,这本书适合谁?对于任何想要提高编程水平并成为开发人员的人来说。仅此而已。
你不必自称为“极客”,内向或信仰驱动的活动家。也不需要承担任何这样的刻板印象。
如果你正认真学习编程,以达到能够靠编程谋生的程度,那么这本书就是为你准备的。
你应该先阅读本书的快速概要,然后再阅读其余部分。
500字执行摘要
学习编程很难。成为软件开发人员更难。但对许多人来说,这是值得努力的。
编程是一个高薪、智力挑战和创造性回报的领域。你前进的职业道路非常明确:高级开发人员、技术领导、工程经理、首席技术官,甚至是首席执行官。
你可以在几乎任何行业找到工作。约三分之二的开发者工作并不属于我们传统意义上的“科技”领域-而是在农业、制造业、政府和银行、医疗等服务行业。
如果你担心在退休之前你的工作可能会被自动化,考虑一下:编程其实就是自动化的行为。因此,就本质而言,编程将是最后一个完全自动化的职业。
自动化正在影响编程,事实上已经影响了几十年。
GPT-4和Copilot等生成型人工智能工具可以帮助我们从命令式编程转向声明式编程,让计算机更接近高级目标。换句话说,就像星际迷航中的编程。
尽管我们现在有了计算器,但你仍然应该学习数学。尽管我们现在有了可以编写代码的AI工具,但你仍然应该学习编程。
我说服你将编程作为你的职业了吗?
很好。以下是进入这个领域的方法。
建立你的技能。
你需要学习:
- 前端开发: HTML, CSS, JavaScript
- 后端开发: SQL, Git, Linux 和 Web 服务器
- 科学计算: Python 及其众多库
这些都是成熟的技术,拥有二十多年的历史。无论你在哪家公司工作,你几乎肯定会使用其中大部分工具。
学习这些工具的最佳方法是构建项目。尽量每天都写一些代码。如果你按照freeCodeCamp的课程从头到尾学习,你将学会所有这些,并编写几十个项目。
建立你的人脉。
找工作很大一部分取决于你认识谁。
成为内向的人是可以接受的,但你需要跳出自己的舒适区。
创建 GitHub、Twitter、LinkedIn 和 Discord 账户。
参加技术聚会和会议。如果必要的话,进行旅行。(你学习编程的大部分预算应该用于旅行和活动门票,而不是购买书籍和课程。)
向独自站着的人打招呼。让其他人多说话,真正聆听。记住人们的名字。
在 LinkedIn 上添加联系人,关注他们的 Twitter,并参加之后的派对。
树立良好声誉。
分享你项目的短视频演示。
继续申请在越来越大的会议上演讲。
在黑客空间待一段时间,帮助那些比你更新的编码新手。
贡献开源项目。这项工作与专业软件开发类似。
同时提升你的技能、人脉和声誉。不要让自己拖延最困难的部分。
与其通过“正门”申请工作,不如利用你的人脉通过“侧门”获得面试机会。招聘人员也可以提供帮助。
一直面试直到开始收到职位提议。不过,你不需要接受第一个提议,要有耐心。
你的第一个开发者工作会是最难的。尽量在那里至少待上两年,并从中学习并得到报酬。
真正的学习开始于你在工作中与团队合作,与庞大的遗留代码库一起工作。
最重要的是睡眠和锻炼。
任何有足够动力的人都可以学会编程,达到足够的水平从而获得一份开发者工作。
问题只是你有多渴望,并且在求职过程中能保持多么坚持。
记住:你可以做到。
这本书奉献给全球 freeCodeCamp 社区。
感谢您在过去8年中支持我们的慈善事业和使命。
多亏您的志愿精神和慈善捐助,我们才能帮助这么多人学习编程并获得他们的首份开发者工作。
这个社区从我在2014年第一次部署的谦卑的开源项目开始增长。我现在只是这个全球社区的一小部分。
能够继续在这里与大家一起工作是一种特权。我们共同面对着我们这个时代的根本问题。信息获取的机会。教育的机会。以及塑造未来的工具的机会。
现在仍然是初期阶段。我并不幻想在我的有生之年每个人都会懂得如何编程。但就像古腾堡圣经在1455年加速了读写能力一样,我们可以继续通过免费、开放的学习资源加速科技素养的发展。
再次感谢大家。
特别感谢 Abbey Rennemeyer 对本书的编辑反馈,以及 Estefania Cassingena Navone 对书籍封面的设计。
现在,开始阅读这本书吧。
第1章:如何提升你的技能
“每个艺术家起初都是业余者。”― 拉尔夫·瓦尔多·爱默生
成为一名优秀编程者的路程是漫长的。
对我来说,这是一条模糊的路。
但对你来说,不必如此。
在这一章中,我将分享一些学习编程的策略,以尽量顺利地掌握编程。
首先,请容我带你回顾一下我在2011年学习编程的经历。
然后,我将分享我从这个过程中学到的东西。
我会告诉你如何比我更加高效地学习。
故事时间:一个30多岁的教师如何自学编程?
我是一名经营一所英语学校的教师。我们有大约100名成年学员,他们从世界各地来到加利福尼亚学习。他们正在学习高级英语,以便能够进入研究生院。
我们学校的大多数教师都热爱教学。他们喜欢与学生在城市中交流,帮助他们提高口语英语。
但这些教师不喜欢办公室里的文书工作:出勤报告、成绩报告、移民文件等。
我希望我们的教师能够有更多时间与学生在一起,而不是被桌子绑住做文书工作。
但是,我对计算机了解多少呢?
编程?难道要聪明才能做到吗?我几乎连WiFi路由器的设置都不会。而且我的数学成绩很糟糕。
然而,有一天我抛开了这些顾虑,心想:“你知道吗,我要试试看。我失去了什么?”
我开始通过谷歌搜索诸如“如何自动点击网站”和“如何将网站数据导入Excel”的问题。
当时我并没有意识到,我正在学习如何自动化工作流程。
学习的开始。从Excel宏开始。然后是一个叫AutoHotKey的工具,你可以编写脚本,让你的鼠标在屏幕上的特定位置移动,点击,复制文本,然后移动到不同的坐标并粘贴。
经过几周的摸索,我找到了自动化一些任务的方法。我可以打开Excel电子表格和一个网站,运行我的脚本,然后回来10分钟后,电子表格就完整地填充了。
那是业余爱好者的作品。开发人员可能称之为“糟糕的黑客行为”。但它解决了问题。
我利用我新发现的自动化技能继续简化学校的工作流程。
很快,教师们几乎不用碰电脑。我用我粗浅的技能完成了几个教师的工作。
这对学校产生了显而易见的影响。我们过去花在电脑上机械重复工作上的时间现在解放了。
教师们更开心了。他们有更多时间和学生在一起。
学生们更开心了。他们告诉他们祖国的朋友:“你们一定要来看看这所学校。”
很快,我们成为整个学校系统中最成功的学校之一。
这进一步鼓舞了我。我记得当时心里想:“也许我能学会编程。”
我认识一些来自我棋局夜晚的软件工程师。他们的背景很传统,拥有加州理工学院、哈维莫德学院和其他著名计算机科学项目的学位。
那时候,30多岁的人学习编程还远未普及。
我鼓起勇气和一些朋友分享我的梦想。
我想学习如何正确地编程。我想能够像他们一样以编程为生。甚至想编写能给学校提供动力的软件。
我把这些梦想告诉我的开发者朋友。“我想做你们所做的事情。”
但他们只是耸了耸肩。然后他们会说一些这样的话:
“我是说,你可以试试。但你会需要吸取一海量的知识。”
以及:“这是一个相当有竞争力的领域。你怎么能与从小就开始编程的人竞争呢?”
还有:“你作为一名教师已经过得不错了。为什么不继续做你擅长的事情呢?”
这些话对我造成了打击几个星期。我经常在夜晚漫长地思考。在星空下思考我的未来。这些人说得对吗?我是说-他们肯定会知道,对吧?
但每天早上我依然坐在我的桌子前。看着我的脚本运行。看着我的报告以超人的速度编译完成。看着我的计算机听令行事。
我想到了这样一个想法:也许这些朋友只是想拯救我免受心痛之苦。也许他们只是不认识任何在30多岁时学习编程的人。所以他们认为这是不可能的。
就像…多年来,医生们认为在4分钟内跑完一英里是不可能的。他们认为你的心脏会因为跑得太快而爆炸。
但后来有人成功了。他的心脏并没有爆炸。
当时,25岁的牛津大学学生罗杰·班尼斯特突破了这种心理障碍,很多其他人也做到了。迄今为止,已有1000多人跑过4分钟英里。
而我所做的事情并不像跑4分钟英里那么大胆和前所未有。多位著名开发者多年来都设法自学编程。
当然,艾达·洛夫莱斯在19世纪40年代自学编程。她甚至没有一台工作的计算机。她只是理解了她的朋友查尔斯·巴贝奇的计算机在理论上的工作方式。
她创作了一些最早的计算机算法。她被广泛认为是世界上第一位计算机程序员。没有人教她。因为没有人可以教她。无论她当时是否怀疑自己,她显然克服了障碍。
现在,我并不是Ada Lovelace。我只是一个已经有一台工作电脑、良好的互联网连接和用Google搜索数十亿个网页的能力的老师。
我握紧了拳头,凝视着屏幕。我要做到这一点。
陷入教程地狱
“如果你工作10年,你是获得了10年的经验还是获得了1年的经验10次?你必须反思你的活动才能获得真正的经验。如果你把学习作为一个持续的承诺,你就会获得经验。如果你不这样做,不管你有多少年经验,也不会有所提升。” – Steve McConnell,软件工程师
接下来的几周里,我在谷歌上搜索并做了一些遇到的随机教程。
哦看,一个Ruby教程。
哦不,它开始变得困难了。我收到了教程里没有提到的错误信息。嗯…这里发生了什么…
哦看,一个Python教程。
人的心理是有趣的。当一些事情开始变得困难时,我们会问:我是不是做对了?
也许这个教程已经过时了。也许它的作者不知道他们在说什么。还有人在使用这种编程语言吗?
当你在编程会话几个小时后面对模糊的错误信息时,对面的草看起来更绿了。
我很容易假装自己取得了进展。是时候去吃午饭了。
在咖啡馆里我会见到一个朋友。”你的编程进展如何?”他们会问。
“很好。我今天已经编了4个小时的代码了。”
“太棒了。我很想看看你在构建什么。”
“当然没问题,”我会说,知道我什么都没有建立。”很快。”
也许我会去图书馆借一本新的JavaScript书。
有句古话说买书给人最好的感觉。因为它还感觉像是在购买阅读这些书的时间。
而这正是几周学习编码后我发现自己所处的境地。
我已经读完了几本编程书的前100页,但没有完成任何一本。
我已经写了几个编程教程的前100行代码,但没有完成任何一个。
我不知道,但我陷入了开发者们亲切称之为“教程地狱”的地方。
教程地狱是你从一个教程跳到另一个教程,学习然后重新学习相同的基础知识。但从未真正超越基础。
因为超越基础?哦,那需要真正的努力。
培养一个编程人才需要整个村庄
学习编码已经占据了我所有的空闲时间。但我没有取得太多进展。现在我可以不看键盘地打出{
和*
这两个字符了。但也仅此而已。
我知道我需要帮助。也许是一位像尤达那样的导师,他能教我编程的方式。是的,如果这样的人存在,肯定会有所不同。
我了解到附近有一个叫做“黑客空间”的地方。当我第一次听到这个名字时,我有点紧张。黑客不是做非法的事吗?我是个喜欢玩桌游的英语老师。我不想找麻烦。
好吧,我拨通了上面列出的电话号码并与一个名叫史蒂夫的人交谈。我紧张地问:“你们不做任何非法的事情,对吧?” 史蒂夫笑了。
事实证明,“Hack”的这个词是他称之为一个多义词。是的,“Hack”可以意味着恶意地侵入软件系统。但“Hack”也可以意味着一些更平凡的事情:编写计算机代码。
一些东西可以是“hacky”,意味着它不是一个优雅的解决方案。然而,你也可以有“一个聪明的Hack”,一种使你的代码更高效工作的独创性技巧。
简而言之:不要害怕“Hack”这个词。
就我个人而言,我很少使用这个词,因为它太令人困惑了。我认为最近很多黑客空间已经意识到这种含糊不清。他们中的许多人现在称自己为“创客空间”。
因为这就是一个黑客空间的全部意义 – 制作东西。
史蒂夫邀请我星期六下午参观黑客空间。他说该地区的几个开发人员会在那里。
我第一次走进圣巴巴拉黑客空间的门口时,简直被震撼了。
这个地方散发着一股电火花的味道。它的临时桌子上摆满了焊接烙铁、LED灯带、业余Arduino电路板和一堆堆机器人吸尘器。
和我电话里说话的那个史蒂夫在那里,他向我打招呼。他有一副眼镜,梳橄榄油头,蓄着络腮胡子。他总是面带微笑。而当你问他一个问题时,他不会立刻回答,而是点点头,思考几秒钟。
史蒂夫是一个对编程充满激情的程序员,他曾在加州大学圣塔芭芭拉分校学习数学和哲学。他对这些学科仍然充满激情。但他真正热爱的是Python。
史蒂夫打开投影仪给了一个非正式的“闪电演讲”。他演示了一个他编写的应用程序,可以在视频中识别QR码并替换成图片。
观众中的某人在他们的笔记本电脑上打开了一个QR码,并将其放在摄像头前。史蒂夫的应用程序随后用一张披萨图片替换了QR码。
观众中有人喊道:“你能让披萨旋转吗?”
史蒂夫打开了一个名为Emacs的代码编辑器,并实时对其进行更改。他可以轻松地在代码编辑器、命令行和应用程序运行的浏览器之间切换,“热加载”更新代码。
对我来说,这简直就是魔法。我无法相信史蒂夫仅用几个小时就开发了这个应用程序。现在他正在根据观众的要求即兴添加新功能。
我心想:“这家伙真是个天才。”
当晚活动结束后,他和我留了下来。
我们一起吃三明治。我对他说:“如果从事编程可以让我像你这样优秀,即使经过10年,我只能写一半的代码,我也会感到非常高兴。”
但史蒂夫反驳道:“我并没有什么特别的。不要给自己设限。如果你坚持编程,你可以轻松超越我。”
现在,我一秒钟都不相信他对我说的话。但他说出这些话让我心里暗暗激动。
这就是他:一个相信我的开发人员。他看到了我 – 一个普通的教师 – 一个典型的“脚本小子”的定义,却相信我能成功。
史蒂夫和我聊到深夜。他向我展示了他的200美元的便携式电脑,即便按照2011年的标准,它的性能也相当低劣。
“构建软件不需要一台强大的计算机,”史蒂夫告诉我。“如今的硬件非常强大。计算机之所以慢,仅因为运行在上面的臃肿软件使它们变慢。购买一台现成的笔记本电脑,擦除硬盘,安装Linux,然后开始编码。”
我记下了他的那款电脑型号,并在当晚回家后订购了同款。
经过几天与Stack Overflow一起调试我的新电脑,我成功安装了Ubuntu。我开始学习如何使用Emacs代码编辑器。到了下个星期六,我已经掌握了一些命令,并迫不及待地展示出来。
史蒂夫点了点头表示赞赏。他说:“太棒了。但你在做什么项目?”
我不明白他的意思。“我正在学习如何使用Emacs。瞧瞧,我记住了……”
但史蒂夫显得若有所思。“那很酷,但你需要一个项目。始终保持一个项目。然后在完成该项目的过程中学习你所需要的。”
除了给我学校的教师写了几个脚本来帮助他们,我从未完成过任何项目。但我开始明白他说的是什么。
我开始意识到,我一直陷入教程地狱,不停地循环,什么也没有完成。
史蒂夫说:“我希望你使用HTML5建立一个项目。下个星期六,我希望你在黑客空间展示它。”
他的话让我感到害怕。但我挺直了腰杆说:“听起来不错。我接受了。”
没有人能让你成为开发人员,只有你自己
“我试图解放你的思想,Neo。但我只能给你展示大门。你必须自己走进去。” – 1999年电影《黑客帝国》中的摩菲斯
第二天早上,我在上班前特意早早醒来,搜索了一些类似“HTML5教程”的东西。我已经在之前的教程地狱里学到了很多。但与其跳过,我决定放慢节奏,一丝不苟地跟着教程进行,每个命令都亲自输入。
通常,我完成一个教程后就会去找另一个教程。但这次,我开始玩弄教程中的代码。我有一个简单的项目构想,我要做一个HTML5文档页面,而且要纯粹使用HTML5来编写。
让我简要解释一下HTML5。它只是HTML的新版本,自上世纪90年代的第一个网页以来就一直存在。
如果一个网站是一个身体,HTML就是骨架。其他的一切都依附于这些骨架之上。(你可以把JavaScript看作是肌肉,CSS看作是皮肤。但是我们继续故事吧。)
我知道在HTML中,你可以使用ID属性链接到同一个网页的不同部分。所以我想:如果我在左侧放一个目录,然后点击左侧的不同项目,右侧的页面就会滚动到相应的项目处。
不到半个小时,我就编码完成了一个初步的原型。
但是该去上学报道了。整天,我一直想着我的项目,以及我应该如何最好地完成它。
我匆忙回家,打开笔记本电脑,整个晚上都在编码。
我把官方(和使用创意共享许可证的)HTML文档直接复制到我的页面中,将其“硬编码”到HTML中。
然后,我花了大约一个小时的时间来处理CSS,让一切看起来正确,并使用绝对定位来保持侧边栏的位置。
我尽量使用尽可能多的HTML5的新的“语义”标签。
完成了。
一股成就感涌上心头。我跑到附近的足球场围着场地跑圈,庆祝自己的成就。我做到了。我完成了一个项目。
然后,我立刻决定:从现在开始,我做的每一件事都将成为一个项目。我将一直努力,朝着某个完成品的目标前进。
第二天晚上,我走上讲台,连接上我的笔记本电脑,展示了我的HTML5网页。我回答了开发者们关于HTML5的问题。
有时候我会答错一些问题,观众中的某个人会说:“那听起来不对啊,让我查一下文档。”
人们毫不犹豫地纠正我的错误。但他们礼貌而支持。甚至感觉不像是在纠正我,而更像是在纠正公共记录,以免有人带着错误的信息离开。
我没有感到任何焦虑,就像在一次教师培训会议上发表演讲那样。
相反,我几乎觉得自己是观众中的一员,与他们一同学习。
毕竟,这些工具是新的兴起的。我们都在努力理解如何共同使用它们。
在我演讲结束后,史蒂夫走过来对我说:“不错。”
我尴尬地笑了很长时间,没有说什么,只是对自己感到满意。
然后史蒂夫眯起眼睛,嘟起嘴唇。他说:“今晚开始你的下一个项目吧。”
从编码之旅中学到的经验
我们将在以下的每一章中了解年幼的昆西在他的编码之旅中的经历。但现在我想分解一些这里的经验,并回答一些你可能有的问题。
为什么学习编码那么难?
学习任何新技能都很困难。无论是踢足球、换车油还是学说一门新语言。
学习编码之所以难,是因为有几个特殊的原因,其中一些是编码特有的。
首先,大多数人并不完全理解编码究竟是什么。好的,我来告诉你。
什么是编码?
编码就是用一种计算机可以理解的方式告诉计算机做什么。
就是这样。编码说到底就是这么简单。
现在,别搞错。与计算机进行交流是很困难的。从人类的标准来看,它们是“愚蠢”的。它们会完全按照你的指示去做。但除非你擅长编码,否则它们可能不会按照你的意愿去做。
您可能会想到:服务器呢?数据库呢?网络呢?
归根结底,所有这些都由一层层的软件控制。代码。这就是代码。最终,您会接触到物理硬件,它将电子在电路板上移动。
在计算的最初几十年中,开发人员编写的代码都是“贴近底层”的 – 经常直接操作硬件,从0变为1,再从1变为0。
但是现代软件开发涉及许多“抽象层” – 程序运行在程序之上 – 所以只需几行JavaScript代码就可以完成一些非常强大的事情。
在20世纪60年代,一个“bug”可能指的是一只昆虫在房间大小的计算机内爬行,并在电路中的其中一个部件中受到电击。
今天,我们编写的代码对应的是物理硬件上层的抽象层。
这就是编码。相比过去,它变得更容易了。而且每年都在变得更容易。
当我说几十年后编码会变得如此简单和常见,以至于大多数年轻人都会如此时,我并不夸张。
为什么学习编码多年来仍然如此困难?
学习编码之所以如此困难,有以下三个主要原因,即使在今天也是如此:
- 工具仍然很原始。
- 大多数人不擅长处理歧义性,而学习编码就是有歧义的。人们会迷失方向。
- 大多数人不擅长处理不断的负面反馈。而学习编码则是接连不断的错误信息。人们会感到沮丧。
现在,我将更详细地讨论每个难题,并为您提供对每个难题克服的一些实用策略。
工具仍然很原始
“计算机。开始新程序。创建如下。工作站椅子。现在创建一个位于左手边的标准字母数字控制台。现在在右手边创建一个图标显示控制台。将两个控制台连接到企业号的主计算机核心,利用神经扫描接口。”- 星际迷航:下一代第4季第19集“N次方”中的巴可莱
这是未来编程的一种方式。这是我最喜欢的科幻电视剧《星际迷航:下一代》中的一个例子。
《星际迷航》中的每个角色都会编码。医生、安全官员、飞行员都会。甚至小威斯利·克鲁希尔(由童星威尔·韦顿扮演)也能让飞船的计算机按照他的命令工作。
当然 – 每个人都会编码的原因之一是他们生活在后稀缺的24世纪社会,拥有免费的高质量教育。
另一个原因是在未来,编码将变得更加容易。您只需准确地告诉计算机要做什么 – 如果您足够准确,计算机就会执行。
如果编程就像用普通英语对计算机发出指令一样简单,那该多好呀?
好吧,我们已经在朝着这个目标取得了显著进展。想想我们的祖母们,她们在房间大小的大型机计算机之间穿梭,并带着一叠打孔卡。
过去,即使编写一个简单的应用程序也需要仔细的指令。
这里有两个“凯撒密码”的示例,经典的计算机科学作业项目之一。
这也被称为“ROT-13”,因为您将字母向后旋转13个位置。例如,A变为N(A后面的13个字母),B变为O(B后面的13个字母)。
我将向您展示此程序的两个示例。
首先,这是x86汇编程序的示例:
format ELF executable 3entry start segment readwritebuf rb 1 segment readexecutestart: mov eax, 3 ; 系统调用 "读取" mov ebx, 0 ; 标准输入 mov ecx, buf ; 读取字节的缓冲区 mov edx, 1 ; len(读取一个字节) int 80h cmp eax, 0 ; 是否EOF? jz exit xor eax, eax ; 将读取的字符加载入eax mov al, [buf] cmp eax, "A" ; 查看是否为ASCII码的a-z或A-Z范围内 jl print cmp eax, "z" jg print cmp eax, "Z" jle rotup cmp eax, "a" jge rotlow jmp printrotup: sub eax, "A"-13 ; 对A-Z进行ROT 13转换 cdq mov ebx, 26 div ebx add edx, "A" jmp rotend rotlow: sub eax, "a"-13 ; 对a-z进行ROT 13转换 cdq mov ebx, 26 div ebx add edx, "a"rotend: mov [buf], dl print: mov eax, 4 ; 系统调用写入 mov ebx, 1 ; 标准输出 mov ecx, buf ; *char mov edx, 1 ; 字符串长度 int 80h jmp startexit: mov eax,1 ; 系统调用退出 xor ebx,ebx ; 退出代码 int 80h
这个x86汇编示例来自知识共享许可的Rosetta Code项目。
这是相同的程序,用Python编写:
def rot13(text): result = [] for char in text: ascii_value = ord(char) if 'A' <= char <= 'Z': result.append(chr((ascii_value - ord('A') + 13) % 26 + ord('A'))) elif 'a' <= char <= 'z': result.append(chr((ascii_value - ord('a') + 13) % 26 + ord('a'))) else: result.append(char) return ''.join(result)if __name__ == "__main__": input_text = input("输入要使用ROT-13进行编码/解码的文本:") print("编码/解码后的文本:", rot13(input_text))
这个Python示例直接来自GPT-4。我以《星际迷航》中皮卡德船长询问船舱电脑的方式对其进行了提示。
以下是我向它说的内容:”电脑。新程序。将我说的每个字母替换为在英文字母表中后面13个位置出现的字母。然后将结果读给我听。单词是香蕉。”
GPT-4生成了这段Python代码,并将结果读给我听:”Onanan”。
我们在这里所做的被称为声明式编程。我们在声明:“电脑,你应该这样做。”计算机足够聪明,能够理解我们的指令并执行它们。
现在,大多数开发者今天使用的编码风格是命令式编程。我们逐步告诉计算机要做什么。因为历史上,计算机相当愚蠢。所以我们必须帮助它们一步一步地前进。
软件开发领域还不够成熟。
但就像早期人类工具的发展一样——从石器时代到青铜时代再到铁器时代——软件工具也在发生同样的变化。而且速度更快。
我们现在可能仍处于编程的铜器时代。但我们可能会在我们的一生中进入铁器时代。生成式人工智能工具如GPT变得越来越强大和可靠。
开发者社区在使用像GPT这样的工具在软件开发中的实用性上仍存在分歧。
一方面,有些“成为自己的老板”的企业家影响者说着这样的话:“你不再需要学习编程。ChatGPT可以为你编写所有的代码。你只需要一个应用的点子。”
另一方面,有着几十年编程经验的“老一代”开发者们持怀疑态度,他们中的许多人质疑像GPT这样的工具在生成生产级代码方面是否真的有用。
与大多数事情一样,真正的答案可能介于两者之间。
您不必费力寻找人们以一种应用程序想法开始,然后提示ChatGPT需要的代码的YouTube视频。有些人甚至可以将该代码组合在一起,制作出一个可以运行的应用程序。
大型语言模型如GPT-4令人印象深刻,它们的改进速度更加令人印象深刻。
然而,许多开发人员对这些工具到底有多有用持怀疑态度。他们质疑我们能否让AI停止“产生幻觉的”错误信息。
这是“可解释性”的根本问题。要真正理解类似GPT-4这样的黑盒AI内部发生了什么,可能需要几十年的时间。在此之前,我们应该仔细核对它所说的一切,并假定其中会有许多错误和安全漏洞。
能够让计算机为您做某件事情与理解计算机如何做某件事情之间有很大的差距。
许多人可以驾驶汽车。但能够修理汽车的人要少得多,更不用说从零开始设计新汽车了。
如果您想要开发解决新问题的强大软件系统-并且希望这些系统快速而安全-您仍然需要学习如何正确编写代码。
这意味着您需要在许多模棱两可的情况中摸索。
学习编码是一个模棱两可的过程
当您学习编码时,您会不断问自己:“我是否明智地利用了时间?我是否在学习正确的工具?这些书籍作者/课程创作者真的知道他们在说什么吗?”
不确定性笼罩着您的每一次学习。 “我的测试用例失败是因为教程已过时,并且我正在使用的框架已经发生了重大变化?还是我只是做错了?”
就像之前提到的教程地狱一样,您还必须应对“对岸的草更绿”病症。
这进一步加剧了开发人员面临的问题,而他们认为回答问题是一种聪明的做法,这些问题是“RTFM”,意思是“阅读该死的手册”。这并不是很有帮助。哪个手册?哪个部分?
另一个问题是:您不知道自己不知道的事情。通常您甚至不能明确提出您试图提问的问题。
如果连正确的问题都无法提出,您将陷入困境。
这在编码方面特别困难,因为可能没有人尝试构建与您建立的完全相同的应用。
因此,您遇到的一些问题可能是前所未有的。可能没有别人可以求助。
人们每天在Google中键入的查询中有15%是以前从未搜索过的。如果您是键入这些查询之一的人,那不是好消息。
我认为大多数开发人员将会找到解决问题的方法,并简单地继续前进,而无需在任何地方记载下来。因此,您可能是数十名开发人员之一,为同一问题发明了自己的解决方案。
然后,当然还有旧的论坛帖子和StackOverflow页面。
学习编码时如何不迷失方向
好消息是:通过实践,您会变得更加“能力”和“自信”。
很快,您将确切地知道该搜索什么。您将对文档的结构和查找内容的位置有第二感。您将知道在哪里提出哪个问题。
我希望有一种更简单的解决方案来解决模棱两可的问题。但您只需要接受它。学习编码是一个模棱两可的过程。即使是经验丰富的开发人员也在与模棱两可的问题作斗争。
毕竟,编码是一种罕见的职业,您可以无限制地重用以前遇到的问题的解决方案。
因此,作为开发人员,您始终在做以前从未做过的事情。
人们认为软件开发就是将代码键入计算机。但实际上,它是关于学习的。
您将花费大部分时间思考的非常困难。或者在提示符中盲目输入命令,以了解系统的工作原理。
您还将花费大量时间与其他人进行会议:经理,客户,同事开发者。了解需要解决的问题,以便构建解决方案。
适应不确定性,你就能走得更远。
学习编码就是一个接着一个错误信息的过程
很多学习编码的人感觉到了瓶颈。进步不如他们预期的那么快。
其中一个巨大的原因是:在编程中,反馈循环比其他领域更紧密。
在大多数学校里,老师会给你布置任务,然后批改这些任务并把它们还给你。在一个学期里,你可能只有几次获得反馈的机会。
“天哪,我完全考砸了那个考试,”你可能会对自己说。“我需要更努力地为期中考试学习。”
也许你的老师会在纸上用红墨水留下笔记来帮助你提高你的工作。
在考试或论文上得到差评真的会毁了你一天的心情。
而这就是我们通常对待反馈的方式,作为人类。
如果你花了很多时间编码,你就会知道计算机非常快。它们可以在几毫秒内执行你的代码。
大部分时间你的代码会崩溃。
如果你幸运的话,你会得到一个错误信息。
如果你真的幸运的话,你会得到一个“堆栈跟踪” – 也就是计算机在遇到错误时尝试执行的所有操作 – 还有导致程序崩溃的代码行号。
现在是计算机给出这种直接的负面反馈。不是每个人都能忍受整天都看到这样的反馈。
想象一下,每次你把论文交给老师,他们都会在上面写上大大的红色“F”然后交还给你。而且往往他们这么做都比你眨眼的时间还要快。一而再,再而三。
有时编码就是这样的感觉。你想抓起电脑冲它大喊,“为什么你就不能理解我想做什么呢?”
如何不让自己沮丧
关键还是要多练习。
随着时间的推移,你会对模糊的错误信息和一屏幕长的堆栈跟踪产生耐心。
编码永远不会比你刚开始学习时更难。
你不仅不知道自己在做什么,而且你不习惯接收到如此冷冰冰的、如雨点般的负面反馈。
所以这里有一些建议:
建议1:要知道你并不是独一无二的烂
每个学习编码的人都会遇到与计算机融为一体、让它理解你的沮丧。(这又是另一个《星际迷航》的参考)
当然,有些人从小就开始编程。他们可能表现得好像他们一直擅长编程。但他们很可能和我们这些成年人一样,一度束手无策,随着时间的推移,他们只是忘记了那些曾经充满挫折的小时。
把计算机当做你的朋友,而不是敌人。它只是在要求你澄清你的指令。
建议2:深呼吸。
当很多人收到错误信息时,他们的自然反应是咬牙切齿。然后回到他们的代码编辑器中,开始盲目地更改代码,希望以某种方式顺利过关。
这是行不通的。我告诉你为什么。
宇宙是复杂的。软件也是复杂的。你不太可能只凭运气就可以做出好的东西。
你可能听说过无限猴子定理。这是一个思想实验,你可以想象一下猩猩在打字机上打字。
如果你有一群猩猩在新闻编辑室里这样做,那么在他们随机打字的几率下,有多长时间会有一个猩猩通过随机机会输入出“生存还是毁灭。”这句话?
假设每只猩猩每秒钟打出一个随机字符。一个猩猩能够通过随机机会输入“生存还是毁灭”可能需要10^18(即一百兆)年。也就是说,在其中的任何一个猩猩设法敲出“生存还是毁灭”之前,大约需要持续一千亿亿年。
即使假设猩猩们保持身体健康,打字机也得到定期维护 – 当其中一只猩猩成功地打出“生存还是毁灭”时,银河系早就变成一个寒冷黑暗的虚空了。
为什么要告诉你这一切呢?因为你不想成为那些黑猩猩之一。
在那段时间里,你几乎肯定可以想办法教那些黑猩猩如何打出英文单词。他们可能会成功地打出《哈姆雷特》的全部内容,而不仅仅是其中最著名的一句。
即使你某种方式幸运地避开了错误,你学到了什么呢?
所以,与其抱怨,不如花点时间。理解代码。理解发生了什么。然后解决错误。
始终花时间理解错误的代码。不要成为一个拥有一百万亿年寿命的黑猩猩。(我想这意味着一个拥有一百万亿年寿命的人,尽管根据谷歌的说法,从来没有人打出过那个词。)
与其盲目尝试,希望跳过错误信息,不如放慢脚步。
深呼吸。伸展一下。起来倒杯热饮。
将来的你会感激你将这当作一个有教益的时刻。
提示3:使用橡皮鸭调试
拿一只橡皮鸭子,放在电脑旁边。每当遇到错误信息时,试着向你的橡皮鸭子解释你认为发生了什么。
当然,这很愚蠢。这有什么帮助呢?
但事实就是这样。
橡皮鸭调试是一个很好的工具,可以让你放慢脚步并经过头脑中的问题进行交流。
当然你并不一定要使用橡皮鸭。你可以向你的宠物仙人掌解释你的Python程序,或者向总是跳到你键盘上的猫解释你的SQL查询。
事实上,大声解释你的思路似乎可以帮助你更好地处理情况。
大多数人如何学习编程?
现在让我们谈谈通往第一份开发人员工作的传统途径。
为什么你要关心别人都在做什么?剧透警报:你其实不需要这样。
你就做你自己好了。
话虽如此,你可能会怀疑自己和自己关于学习的决定。你可能渴望走未选择的道路。
我在这个部分的目标是缓解你可能有的任何焦虑。
计算机科学学位的重要性
大学学位仍然是为从事软件开发职业做准备的金标准。尤其是计算机科学的学士学位。
在开始说“但是我没有计算机科学学位”的时候,不要担心。你不需要计算机科学学位成为一名开发人员。
但是它们的用处不可否认。我会解释为什么。
首先,你可能会想:为什么开发人员需要学习计算机科学?毕竟,有史以来最杰出的开发人员之一对这个领域有这样的评价:
“计算机科学教育不能使任何人成为专家程序员,就像学习画笔和颜料不能使任何人成为专业画家一样。”– Eric Raymond,开发者,计算机科学家和作者
计算机科学系传统上是数学系的一部分。上世纪60年代和70年代的大学并不知道如何处理这个完整的计算机事物。
在其他大学,计算机科学则被视为电气工程的延伸。直到最近,即使是加州大学伯克利分校这样世界上最伟大的公立大学之一,也只是将计算机科学学位作为一种与电气工程相关的双主修提供。
但是大多数大学现在已经理解到计算机科学作为一门学科的重要性。
就我撰写本文时而言,计算机科学是你可以获得的最高薪水的学位。甚至高于以金钱为重点的领域,如金融和经济学。
根据Glassdoor的说法,美国的计算机科学专业毕业生在他们的第一份工作中赚取的平均薪水超过了其他任何专业。 7万美元。对于刚刚从大学毕业的人来说,这是一大笔钱。
超过了护理专业(5.9万美元),金融专业(5.5万美元)和建筑专业(5万美元)。
好了,获得计算机科学学位可以帮助你得到一份高薪的入门级工作。这对于没有人来说可能并不是什么新闻。但是为什么呢?
雇主对学士学位的看法
你可能听说过一些科技行业的大型雇主说过一些话,比如“我们不再要求求职者拥有学士学位”。
谷歌就这么说过。苹果也这么说。
我相信他们。他们不再需要学士学位。
我们有很多自由编码营的校友在这些公司找到了工作,其中一些人没有学士学位。
但是那些自由编码营的校友能够得到这些工作,可能是因为他们是优秀的候选人,能够克服没有学士学位的缺点。
你可以将这些工作机会看作是根据一系列标准来评判候选人:
- 工作经验
- 教育背景
- 作品集和项目
- 他们是否有现任公司员工的推荐信?(我们将在第2章详细讨论建立您的人际关系网)
- 其他声誉因素(我们将在第3章详细讨论建立您的声誉)
对于那些不要求学士学位的雇主而言,教育只是其中的一个考虑因素。如果你在其他方面更强,他们可能会选择面试你 – 无论你是否曾经进过大学课堂。
需要注意的是,即使在这些“可选学位”雇主处,拥有学士学位也会更容易获得面试机会。
为什么如此多的开发人员工作需要计算机科学学位?
我经常告诉人们,学士就是学士。因为在大多数情况下确实如此。
想要以军官身份而不是入伍人员进入美国军队?你需要一个学士学位,但任何专业都可以。
想要获得工作签证去国外工作?你可能需要一个学士学位,但任何专业都可以。
对于那么多要求“学士学位必需”的工作机会 – 任何专业都可以。
为什么会这样?大学里你学什么并不重要,重要的是是否毕业了。
雇主正试图挑选那些能够顺利走完这个成人仪式的人。
当然,的确可以这样说,你可能是班级中最差的学生,不断重修课程,半时间都在受学术监督处分。但学士学位就是学士学位。
你知道在医学院里完成学业并排名最后的学生会被称为什么吗? “医生。”
对于大多数雇主来说,也是这样。
在许多情况下,人力资源人员只是在他们的工作申请筛选软件中打勾。他们会筛选掉没有学位的申请人。在这种情况下,他们可能甚至不会看没有学位的人的工作申请。
再次强调,不是每个雇主都是这样。但其中很多是。在美国,也许在其他国家更是如此。
虽然这很糟糕,但这是目前劳动市场的工作方式。它可能在未来几十年内发生改变,也可能不会。
这就是为什么我总是鼓励年轻人认真考虑获得学士学位。
这不是因为大学营销自己的任何原因:
- 学习本身。(你可以免费在线上学习一些最好的大学课程,所以这本身不能证明高昂的学费的合理性。)
- “大学经历”,住在宿舍,交新朋友和自我发现。(大多数美国大学生从不住在校园,所以他们真的无法体验到这些。)
- 帮助你成为“全面发展的人”的通识课程。(听说过大一新生长胖15斤吗?这当然是个笑话。但是很多大学新生因为经历的压力而增重。)
再次强调,获得学士学位的真正价值 – 美国人为了大学四年要付出10万美元甚至更多的原因 – 是因为许多雇主要求学位。
当然,获得学士学位还有其他好处,比如我提到的:扩大军事职业选择和更容易获得工作签证。
其中之一是:如果您想成为医生、牙医、律师或教授,您首先需要获得学士学位。然后您可以利用此学位进入研究生院。
好了 – 这是很多背景信息。现在允许我直接回答你的问题。
作为软件开发人员,您是否需要大学学位?
不需要。有很多雇主会在没有学士学位的情况下雇佣您。
一个学士学位将使您在许多雇主面试中更容易获得机会。而且它也可能帮助您获得更高的薪水。
那学士学位有什么价值呢?
从理论上讲,是有价值的。在某些技术领域,可能需要持有副学士学位。而且我认为它总能增加您通过面试的机会。
但是,我不建议为了获得副学士学位而去上大学。我百分之百鼓励您继续上学,直到获得更有用的学士学位。
根据美国教育部的数据,职业生涯中,拥有学士学位将比只有副学士学位多赚31%。
而我相信,计算机科学学士学位的差距更大。
如果您现在没有学士学位,晚些时候去大学获得学士学位是不是值得?
假设您已经30多岁了。也许您上过一些大学课程。也许您完成了前两年的学习并获得了副学士学位。
这样做有意义吗?
是的,这样做可能是有意义的。
但我认为全职回到学校并不明智。
全日制学生生活方式实际上是为“传统”学生设计的。也就是年龄在18至22岁之间(如果有军役经历可能稍大一些),还没有进入工作岗位超出高中/暑期工作的人。
传统大学需要花费很多钱,而且假设学生会通过奖学金、家庭资金和学生贷款等方式支付费用。
作为一名在职成年人,您将比较难获得这些资金来源。更重要的是,您的时间比最近的高中毕业生少得多。
但这并不意味着您必须放弃获得学士学位的梦想。
我建议超过30岁的人不要选择传统大学,而是选择在线的非盈利大学。两所声誉良好且学费相当合理的大学是西部州长大学和人民大学。
您还可以找到一些提供学位的本地社区学院或州立大学延伸课程。其中许多课程都是在线的。其中一些课程甚至可以根据您的工作时间安排来自主学习。
做好调查。如果一所学校看起来不错,我建议找到一位该校校友在LinkedIn上进行交流。向他们询问他们的经验,以及他们是否认为这个学位对他们来说是值得的。
我建议不要为了获得学位而负债。选择一所便宜的学校要好得多。毕竟,学位就是学位。只要它来自认可的机构,对大多数目的来说应该是可以的。
如果您已经获得学士学位,回去再获得一门计算机科学学士学位有意义吗?
不是。第二个学士学位几乎从不值得花费时间和金钱。
如果您已经获得任何学士学位(即使是非STEM领域),您已经获得了大学的大部分价值。
那计算机科学硕士学位呢?
对职业发展来说,这些学位可能会有帮助。但是您应该在已经作为开发人员工作后再去追求这些学位。
许多雇主会支付员工的继续教育费用。
我在技术圈的很多朋友都参加过乔治亚理工学院的计算机科学硕士学位。
乔治亚理工学院的计算机科学系是美国最好的学院之一。而且这个学位项目不仅完全在线,而且价格相当合理。
但我不建议现在去读。首先专注于找到一个开发人员的工作。(我们会在本书的后续章节中深入介绍这个问题)。
学位在未来是否还会有影响?
是的,我认为大学学位在未来几十年甚至几个世纪内都会继续有影响。
大学学位已经存在1000多年了。
美国的许多顶级大学比美国本身还要古老。(哈佛大学已有400多年历史)
大学学位的消亡被夸大了。
在某些圈子里,抨击大学并说学位不再重要已经流行起来。
但是,如果你看一下统计数据,这显然是不对的。它们确实会对终身收入产生影响。
而且同样重要的是,它们可以开启更安全、更稳定、最终更充实的职业。
当然,作为离岸甲板工人,为油井提供服务,你可以赚很多钱。
但是,作为一名开发人员,为机房提供服务并修复代码库的工作同样可以赚很多钱,并且在一个有空调的办公室中工作,可以做40年的工作。
其中一份工作是危险的、劳累的工作,而另一份工作是你可以舒适地做40年的工作。
很多批评大学的“思想领袖”本身受益于大学教育。
我认为很多人认为学位“没用”的原因之一是:很难将所学与身份提升相分离。
大学只是一种阶级信号,是富人继续给他们的孩子传递优势的方式吗?毕竟,在哈佛大学找到一个富孩子的几率是找到一个穷孩子的3倍。
事实是:生活基本上不公平。但这并不改变劳动力市场的运作方式。
你可以选择简单模式,获得一份会给你未来带来更多选择的学位。
或者你可以选择困难模式,节省时间和金钱,并且只对你申请的雇主更加挑剔。
我有很多朋友都成功地使用了两种方法。
大学学位的替代方案有哪些?
我在成人教育领域工作了近20年,但我还没有看到一个令人信服的替代方案来取代大学学位。
当然,有证书项目和训练营。
但是这些在雇主心目中的重要性没有大学学位高,而且很少有那么严格。
顺便说一下:当我说“证书项目”时,我指的是你参加一个课程,最后获得一份证书。这些价值有限。但是像亚马逊和微软这样的公司的基于考试的认证却非常有价值。我们稍后会更深入地讨论这些。
我告诉人们的是:是否要获得学位是个问题。
我遇到很多汽车修理工、电工或从事其他某种职业的人,他们没有学士学位。他们显然可以学习技能,应用技能,并保住一份工作。
我遇到很多簿记员、助理律师和其他“知识工作者”,他们没有学士学位。他们显然可以学习技能,应用技能,并保住一份工作。
在很多情况下,这些人可以自己学习编程,利用免费的学习资源和和志同道合的人相处。
其中一些人一直有回去完成学士学位的个人目标。这是一个很好的理由去做。
但这并不适合每个人。
如果你想要正规教育,去追求学士学位。如果你不想要正规教育,就不要参加任何课程。自学吧。
训练营和其他证书项目主要要给你提供一定的结构和一些同行压力。这并不是件坏事。但是值得为此支付数千美元吗?
如何自学编程
大多数开发人员都是自学成才的。即使那些获得计算机科学学士学位的开发人员在像Stack Overflow年度调查这样的行业调查中,他们通常也会自报为“自学”。
这是因为学习编程是一个终身过程。学习新的工具,解读新的遗留代码库,解决新的问题是不断进行的。
所以无论你是追求正规教育与否,要知道:你需要擅长自学。
成为“自学”的开发人员意味着什么?
不是为了挑刺,但当我提到自学时,我指的是自我指导学习-在正规教育之外的学习。
很少有人在任何领域是真正的“自学者”。例如,艾萨克·牛顿自学微积分,因为当时还没有微积分的书。他必须一边摸索一边发明。
同样地,阿达·洛夫莱斯(Ada Lovelace)自学了编程。因为在她之前没有编程。她是发明了它。
有人可能会告诉你:“你不算真正的自学者,因为你是通过书籍或在线课程学习的。所以你有老师。” 他们是正确的,但只是在最狭义的意义上。
如果有人对你自称自学有意见,只需要说:“按照你的标准,任何没有和狼一起长大的人都不能自称在任何事情上都是自学的。”
指向这本书中的这一节给他们看,并告诉他们:“昆西(Quincy)早就预料到了你们的势利。”然后继续你的生活。
因为看,生命太短暂了,对吧?
你是自学的。
自主学习是什么?
作为一个自学者,你将会策划自己的学习资源。你将会选择从何学习。这就是“自主学习”的本质。
但你如何知道你正在学习正确的技能和利用正确的资源?
嗯,这就是社群的用处。
全世界有很多学习者社群,彼此帮助扩展技能。
社群是一个很难定义的词。Twitter上的科技人是否算作社群?freeCodeCamp论坛呢?或是许多致力于特定编码技能的Discord群组和Subreddit论坛?
我认为所有这些都是社群。只要有人经常在那里互相帮助,我就认为那是一个社群。
那么面对面的活动呢?奥克兰市的Ruby开发者月度聚会?纽约市的创业社群聚会?中得克萨斯州Linux用户组?
这些社群可以是在线的,也可以是线下的,或者二者混合。
我们将在建立你的社群网络章节中更多地讨论社群。但重要的是:你在这些社群中结识的新朋友可以帮助你缩小学习选项和选择合适的学习资源。
我应该先学习哪种编程语言?
简短的回答是:其实并不重要。一旦你学会了一种编程语言,学习第二种语言就会容易得多。
有不同类型的编程语言,但今天大多数开发都使用”高级脚本语言”,如JavaScript和Python。这些语言放弃了”C语言之类的低级编程语言”所带来的原始效率。作为回报,它们更容易使用。
今天的计算机比20世纪70年代和80年代要快上亿倍,当时大部分程序都是用C语言编写的。这种速度远远弥补了脚本语言的相对低效。
值得注意的是,JavaScript和Python本身都是用C语言编写的,而且它们每年都变得越来越快-这要归功于他们庞大的开源代码贡献者社群。
Python是强大的科学计算语言(数据科学和机器学习)。
至于JavaScript… 嗯,JavaScript无所不能。它是终极的瑞士军刀编程语言。JavaScript是连接万维网的胶带。
“任何可以用JavaScript编写的应用,最终都会用JavaScript编写。” – 阿特伍德定律(Jeff Atwood,Stack Overflow和Discourse创始人)
你可以在整个职业生涯中都使用JavaScript编程,从不需要学习第二种语言。(这也不是说你不想学习Python,以及其他一些语言。)
所以我推荐从JavaScript开始。不仅比Java和C++之类的语言更容易使用,学习也更容易。并且对于懂JavaScript的人,有更多的工作机会。
你还需要专注于的其他技能是HTML和CSS。如果网页是一个身体,HTML就是骨骼,CSS就是皮肤。(JavaScript则是肌肉,使得网站能够移动和交互。)
你可以在一个下午学会一些HTML和CSS。就像我在这里提到的大多数工具一样,它们很容易学,但很难精通。
你还应该学习如何使用Linux。Linux运行着世界上绝大部分的服务器,你职业生涯中很大一部分时间都会在Linux命令行中运行命令。
如果你使用的是Mac,MacOS有一个终端可以接受几乎和Linux相同的命令。(MacOS和Linux有一个共同的祖先Unix。)
但如果你使用的是Windows PC,你需要安装WSL,即Windows子系统Linux。然后你就能在你的PC上运行Linux命令。如果你想尝试一下冒险,你甚至可以在同一台电脑上双启动Windows和Linux操作系统。
如果你打算在电脑上安装Linux,我推荐你从Ubuntu开始。它是最广泛使用(也有广泛文档)的Linux发行版。所以它应该是最宽容的。
毫无疑问,相比Windows和MacOS,Linux要难用得多。但是你努力付出的回报是一个非常快速、安全且高度可定制的操作系统。
另外,你再也不需要为操作系统许可证付费了。除非你想要。Red Hat是一家市值达数十亿美元的公司,尽管它的软件是开源的,因为公司为他们在Linux服务器上提供服务和支持而付费。
你还需要学习Git。这是一个版本控制系统,开发团队通过它协调对代码库的更改。
你可能听说过GitHub。它是一个使开发者更容易协作开源项目的网站。它还扩展了Git的一些功能。你将在后面的“如何建立你的声誉”章节中了解更多关于GitHub的内容。
你还需要学习SQL和关系数据库的工作原理。它们是信息经济的中流砥柱。
你还会听到很多关于NoSQL数据库(非关系型数据库,如图数据库、文档数据库和键值存储)的内容。你可以稍后了解更多关于这些的内容。但首先要专注于SQL。
最后,你还需要学习Web服务器的工作原理。你可以从Node.js和Express.js开始。
当你听到“全栈开发”这个术语时,它指的是将前端(HTML、CSS、JavaScript)与后端(Linux、SQL数据库和Node + Express)结合在一起。
还有很多其他的工具你要学习,比如React、NGINX、Docker和测试库。你可以边学边掌握这些。
但你在求职前的90%时间里应该专注于以下关键技能:
- HTML
- CSS
- JavaScript
- Linux
- Git
- SQL
- Node.js
- Express.js
如果你学习了这些工具,你就可以构建大多数主要的Web和移动应用程序,并且你将具备大多数入门级开发者的资格。(当然,很多职位描述还会包括其他工具,但我们会在本书后面讨论这些。)
所以你可能会想:太好了。我如何学习这些技能?
我该在哪里学习编程?
有趣的是你这么问。有一份完整的课程由有经验的软件工程师和教师设计。它以繁忙的成年人为目标受众而设计。而且它完全免费和自主学习。
没错。我说的是freeCodeCamp核心课程。它将帮助你学习:
- 前端开发
- 后端开发
- 工程数学
- 和科学计算(包括用于数据科学和机器学习的Python)
至今已经有成千上万的人完成了这个核心课程并获得了开发者的工作。他们不需要辞职、贷款,或者真正冒任何风险,只不过是牺牲了一些晚上和周末的时间。
实际上,freeCodeCamp已成为大多数自学编程的人的默认路径。
如果没有其他选择,freeCodeCamp核心课程可以成为你学习的“基地”,你可以从这里开始拓展。你可以学习大多数工作所需的核心技能,也可以涉猎你感兴趣的技术。
有数十年的书籍和课程可供学习。其中一些可以在公共图书馆或通过月订阅服务获取。(而且你可能还可以通过公共图书馆免费获得一些订阅服务。)
此外,freeCodeCamp现在有近1000门免费的完整课程,涵盖了从AWS认证准备到移动应用开发再到Kali Linux的各个方面。
现在,自学编程从未如此容易。
培养技能是终身的事业
我们已经讨论过为什么自学可能是最好的方式,以及如何进行自学。
我们还讨论过自学的替代方案,比如获得计算机科学学士学位或硕士学位。
我们还讨论了你应该首先学习哪些具体工具。
现在,让我们转变思路,讨论如何打造你的人脉网络。
第二章:如何建立你的人脉网络
“如果你想走快,就一个人走。如果你想走远,就要一起走。” – 非洲谚语
“人脉。”你可能听到这个词感到不安。
提到人脉,你可能会联想到尴尬的招聘会上,穿着沉闷的西服,拼命把你的简历塞给任何愿意接受的人。
提到人脉,你可能会想起充满酒精的观看派对,你假装对一项你甚至都不关注的运动感兴趣。
提到人脉,你可能会想起在领英上对你几乎不认识的人说“生日快乐”,或者点赞他们的状态更新,希望他们注意到你。
但是人脉不一定就是那样的。
在本章中,我将告诉你我学到的有关结识人们的一切。我会教你如何赢得他们的信任,在他们需要帮助时成为他们记忆中的首选。
因为说到底,这就是关键。帮助别人解决问题。为人服务。
我会教你如何建立一个强大的人脉网络,为你未来几十年的发展提供支持。
故事时间:三十多岁的教师如何在科技领域建立人脉?
上一次的故事时间中,昆西通过阅读书籍、观看免费在线课程以及在当地的黑客空间与开发者交流,学会了一些编码知识。他刚刚完成了自己的第一个项目,并且进行了自己的第一个科技演讲…
好吧,现在我已经掌握了一些基本的编码技能。我现在可以用编程的方式摆脱困境了。
接下来该怎么办呢?毕竟,我是一个完全外行人。
嗯,虽然我对技术是新手,但我并不是新手。近十年来,我一直在学校工作并教授英语来谋生。
作为一名教师,我通过传授知识来获得报酬。作为一名开发者,我将通过编码获得报酬。
我已经了解了一项非常重要的工作真理:认识的人很重要。
我知道人脉的力量。我知道机会之路正好经过门卫。
唯一阻碍我获得一份有利可图的开发者工作的,只是一位可以说:“是的。昆西这个人似乎值得加入我们团队。”的招聘经理。
当然,作为一个技术外行人,我并不了解这个行业的文化。
学术文化要正式得多。
你要穿西服。
你要使用高级的学术术语来证明你是“内部圈子”的一部分。
你要找到办法在每次对话中都提到你是从某所大学毕业的,或者你在Y博士的指导下当助教,或者你曾在Z杂志发表过文章。
职业发展是不同的。会议是不同的。权力结构是不同的。
而我并没有立刻意识到这一点。
我参加的前几次技术活动,我穿西服。
我随时在口袋里放着整齐折叠的简历副本。
我甚至还带着名片。我订购了阳极氧化铝的金属片,使用激光切割机在上面刻上我的名字、电子邮件地址,甚至还有传奇教育家约翰·杜威的一句名言:
“任何开始思考的人都会危及部分世界。” – 约翰·杜威
这仍然是我至今最喜欢的一句话。
但说实话,这样太过了。
“嗨,我是昆西。这是我的红铝名片。提前道歉——它可能会在你飞回家的航班上引起金属探测门的响。”
我做得太过了。而且对每个我说话的人来说,这可能显而易见。
我上了Meetup.com,为了每一个我能找到的开发者活动都报名了。圣巴巴拉是个小镇,但它靠近洛杉矶。所以我也开车去那里参加活动。
我很快聪明起来,把西装换成了牛仔裤和连帽衫。而且我注意到其他人都不发名片。所以我停止携带它们。
我从我在黑客空间认识的开发人员那里得到了灵感:充满激情,但低调。保持一些热情的保留。
我读了很多书,以更好地了解开发者文化。
《The Coders at Work》是一本来自20世纪80年代的好书。
《Hackers: Heroes of the Revolution》是一本来自20世纪90年代的好书。
如果你想了解更多当代文化资源,可以看看电视剧《Mr.Robot》。它的角色有点极端,但他们很好地捕捉到了许多开发人员的心态和举止。
很快,我说话的风格更像开发者,没有那么尴尬。
每周我会参加几次当地与科技相关的活动。我最喜欢的活动甚至不是开发者活动,而是圣巴巴拉创业之夜。每隔几周,他们会有一个活动,开发者会展示他们的原型。一些展示他们的代码的开发者甚至能够从天使投资者那里获得资金支持——这些天使投资者是投资早期创业公司的富人。
主办活动的家伙叫迈克。他一定认识圣巴巴拉的每一个开发者和企业家。
当我最终鼓起勇气向迈克介绍自己时,我被他迷住了。他是一位超级马拉松运动员,静止时心率低至40多。头发和胡须都整齐。对我来说,他是地球上最酷的人。总是很有品位。总是很尊重。
迈克是“非技术性”的。他的工作是产品经理。虽然他对技术和用户体验设计很了解,但他不会编程。
有时开发者会把非技术性的人推到一边。“他只是个商人,”他们会说。或者说:“她是个穿西装的人。”但我从来没听到有人这样评价迈克。他得到了每个人的尊重。
我特意观察迈克与开发者的互动方式。毕竟,我离“非技术性”的人还不远。我只学了几个月的编程。
往往我的旧习惯会悄然浮出水面。在对话中我会有炫耀我学到的东西或我建立的东西的冲动。
很多开发者对自己的技能或成就都很谦虚。他们可能会说:“我对Python有所涉猎。”而不安全感的我会张嘴说些类似这样的话:“哦,是啊。我在Python上编写了这么多算法。我在睡觉时都写Python。”
然后我会回家搜索那个开发者的名字,发现他们是某个重要Python库的核心贡献者。然后我会自责。
我很快学到了不要吹嘘我的成就或技能。你和一个人交谈的时候,很有可能对方比你更擅长编程。但他们中的大多数人都不会主动透露这个事实。
没有比自信地拿出你的笔记本电脑,展示你的代码,然后有人问你一堆你完全准备不好回答的问题更糟糕的了。
我参加这些活动的头几个月是一次令人羞愧的经历。但这些活动给我带来了动力,继续发展我的技能。
很快,南加利福尼亚的人们开始认出我来了。他们会说:“我在这些活动中不断遇到你。你叫什么名字来着?”
有一天晚上一个开发者说,“我们在Twitter上互相关注吧。”我几天前勉强设置了一个Twitter账号,认为那只是一个有噱头的网站。仅仅用140个字符能传达多少信息呢?我几乎没怎么发过推文。但是我已经准备好了Twitter账号,她也关注了我。
这激励我花更多时间完善我的线上形象。我使我的LinkedIn变得不那么正式,更加友好。我看看社区里其他开发者是如何在网上展示自己的。
几个月后,我认识了许多领域的人:
- 有经验的开发者
- 在科技公司工作的非技术人员或半技术人员
- 招聘经理和招聘人员
- 最重要的是,我那些也处在职业中期并试图进入科技行业的同行
为什么同伴是最重要的呢?他们肯定不能帮我找到工作,对吗?
好吧,让我告诉你一个秘密:假设一个招聘经理招聘了一个新的开发人员,对他们进行培训,结果他们在工作中表现得非常优秀。那个招聘经理会问:我在哪里可以找到更多像你这样的人呢?
你的同伴是你网络中最重要的一部分。我获得的很多自由职业机会和工作面试机会都来自于和我同时开始学习编程的人。
我们一起成长。我们是战友,如同兄弟姐妹。这些纽带是最紧密的。
无论如何,在过去几个月的社交网络中,有一天晚上我走进一家豪华市区酒店的酒吧参加了一个开发者活动。
但是,在接下来的章节中详细讨论这个。现在让我们更多地谈谈建立你的人脉关系的艺术与科学。
真的是凭借你认识的人吗?
或许你听说过这样的表达:“成功更多的是取决于你认识的人,而不是你知道的东西。”
在实际操作中,两者都很重要。
是的,你的关系可能帮助你找到梦想中的工作。但如果你不懂得该如何应对,没有成功所需的技能,你将在这个职位上无法应付。
但让我们假设你正在积极地建立自己的技能。你已经按照第一章的建议去行动了。那么,开始建立你的人脉关系的最佳时机是什么时候呢?
最佳的开始建立人脉关系的时机是“昨天”。
但你不需要时光机来做到这一点。因为你已经有了人脉关系。它可能比你希望的要小很多,但你确实认识一些人。
他们可能是你故乡的朋友,或者是你父母的同事。你过去认识的任何人都可能帮到你。
所以第一步是充分清点你认识的人。别担心,我不是要求你立刻联系任何人,或者对你的个人关系施加压力。
在行动之前先思考一下。制定一个策略。
首先,我们来清点一下你认识的所有人。
如何建立个人人脉关系平台
你可以从创建一个你认识的人的列表开始。
你可以用电子表格或类似销售人员使用的客户关系管理工具(CRM)来完成这项工作。但对于我们在这里做的事情来说,那可能有点过头了。
我建议使用类似Trello这样的看板工具,它是免费的。
你要创建 5 列:“待评估”,“待联系”,“等待回复”,“最近联系”,和“暂时不联系”。
然后你要创建标签,这样你就可以按照你认识他们的方式对人进行分类。下面是一些标签的示例: “童年朋友”,“家庭朋友”,“前同事”,“同学”,“科技活动的朋友”。
接下来你可以开始创建卡片。每个卡片上只需要写上他们的名字,如果你有时间,可以在卡片上添加一张照片。
这是我创建的 Trello 看板,给你一个大概的个人人脉关系平台是什么样子的。我使用的是我最喜欢的经典1989年电影《忍者神龟》中的角色。
你可以浏览你的社交媒体账号,甚至是你的老校友录(如果你有的话),然后开始添加人员。
其中很多人对你没有任何帮助。但出于全面考虑,我建议你将他们添加进去。你永远不知道什么时候你会想起:“哦,某某人在XYZ公司找到了一份工作。我应该联系他们。”
这个过程可能需要一天或两天的时间。但明白这是一个投资。你将能够在你的整个职业生涯中使用这个平台。
你可能会想:“我不需要做这个,我已经有一个领英账号了。”那可能还好,但领英是一个粗糙的工具。你想要最大化信号并尽量减少噪音。这就是为什么我鼓励你创建这个专门的个人人脉关系平台。
当您向板上添加人员时,可以对他们进行标记。花点时间研究这些人。他们最近在忙些什么?他们有工作吗?经营一家公司吗?
您可以向每张卡片添加备注,以便在了解他们的新情况时添加。他们最近参加了筹款5公里长跑吗?他们的奶奶最近庆祝了90岁生日吗?这些事实可能看起来无关紧要。但是,如果这些人在社交媒体上分享这些事实,那就意味着这些事实对他们来说很重要。
努力对人感兴趣。他们的日常生活。他们的抱负。通过了解他们的动机和目标,您将对如何帮助他们有更深入的了解。
正如我之前所说,建立联盟的最佳方式是帮助别人。我们很快会详细讨论这个话题。
对于您添加到个人网络板上的每个人,请考虑是否值得与他们联系。然后将他们放入“待联系”或“暂不联系”列中。
您可能会想:为什么这一列称为“暂不联系”?因为你永远不知道什么时候认识某个人可能会有帮助。永远不要将任何友谊或熟人关系视为理所当然。
一旦您填满了您的板子,对每个人进行了标记,并将他们分到了不同的列中,您就可以开始联系他们了。
网络外展的准备工作
在外展和留下印象时,要记住的主要事情是:保持简单。
人们很忙,他们只能记住有关您的有限事实。您希望将自己的信息简化到基本要素。而做到这一点的最佳方式就是撰写个人简介。
如何为社交媒体撰写个人简介
您希望在所有社交媒体帐户上保持一致的形象。
这是我如何介绍自己的:
“我是昆西。我是freeCodeCamp的一名教师。我住在德克萨斯州达拉斯。我可以帮助您学习编码。”
请写下您自己的简介。看看能否将其简化为100个字符以下。尽量避免使用花哨的词语或术语。
将您的身份压缩为几个词可能有些困难。但这是一个重要的过程。
记住:人们很忙。他们不需要知道您的生平故事。随着您与这些人更加熟悉,您可以逐渐填补作为一个人的详细信息。随着他们提问,他们会逐渐更好地了解您。
关于这点,您需要一张您微笑的好照片。
如何拍摄社交媒体头像照片
如果您有足够的钱,找一位当地摄影师付费拍摄一些专业头像照片。
您甚至可能有一位摄影爱好者朋友,可以免费帮您拍摄。
我自己拍了自己的头像照片,使用的是预装在MacOS上的照相亭。我的朋友花了大约10分钟,在Photoshop中调整了一些背景和阴影。他可能稍微让我的牙齿白一些。这就是它的样子:
确保微笑也能展现在您的眼睛中,这样您看起来不会像机器人。或者更好的是,想一些真的很有趣的事情,就像我这里做的那样。那么微笑就会是真实的。
从不同角度拍摄大量照片,然后使用看起来最好的那一个。
我建议使用一张看起来与您日常形象相符的头像照片。不要使用经过大量Photoshop处理的照片来增加吸引力。您希望参加活动的人能够从您的照片中认出您。您也不想因为您的美丽而让人们感到害怕。您希望让他们感到放松。
说到让人们感到放松:请不要戴墨镜,或者过于追求酷感。您想要给人友好和可亲的感觉。这方面的一个很好的测试是:看看您的照片。如果你迷路了,在街上看到这个人,你敢向他们询问方向吗?
选择好头像照片后,将同一张照片用在所有社交媒体账户上。
将它用于个人网站。 甚至可以在你的电子邮件帐户中添加个人照片。
我建议你多年都使用同一张照片。每次更换照片,都有可能有些人不能立即认出你。即使是光线、角度或背景的微小变化也会使人们对你的熟悉感产生困惑。
一定要保留照片的高清版本。这样人们就可以用它来宣传你在他们的会议上的演讲,或者你在他们的播客中的嘉宾出场。别担心 – 时间到了,你会成功的。
如何与过去的人联系
既然你的个人简介和照片都处理好了,你可以开始与人们交流了。
15年前,我会说你应该打电话给人们,而不是发短信。但是随着智能手机的推出,文化发生了很大的变化。大多数人不喜欢接电话。
同样地,我不建议在对话开始时就邀请人们喝咖啡或吃午餐。人们很忙,可能会觉得这个请求很尴尬。
你需要直接切入主题,并快速做到。
那么你需要切入的主题是什么?
基本上:
- 我认识你
- 我喜欢你
- 我尊重你的工作
就是这样。
人们喜欢被认识。他们喜欢被喜欢。他们希望别人注意到他们的工作和生活。
大部分人都能在他们的生日得到认可。来自我们过去的人可能会发来“生日快乐”的短信、社交媒体帖子,甚至打电话给我们。
但是其他364天呢?人们也希望在那些天里被认可。
所以,这里有一个简单的方式可以认可别人。
步骤1:了解这个人。谷歌搜索他们。阅读他们最近的社交媒体帖子。阅读他们的LinkedIn。如果他们发布了家庭照片,确实花时间看一看。
步骤2:考虑一些你可以说的话,可能能让他们的一天变得更美好。
步骤3:选择一个他们最近活跃的社交媒体平台。给他们发送一条私信。
我要分享一个模板,但是永远不要直接使用任何模板,因为如果接收者在谷歌搜索你的消息,他们会发现那是一个模板,你的好意就会被浪费。
如果我要给几个月或几年没有联系的人发送信息,我会说这样的话:
“嗨[name],希望你的[新年/春天/一周]开始得很愉快。恭喜你[新工作/晋升/新宝宝/完成的项目]。看到你在努力中真是鼓舞人心。”
像这样简短而直接。问候+祝贺+赞美。这是基本的公式。
不要只是说这些话。真心实意地说。希望这个人感到被认可。真心希望能让他们的一天变得更美好。真心希望鼓励他们继续朝着目标前进。
人类很擅长察觉不真诚。不要过分吹嘘。不要让他们觉得“这个人需要我什么东西。”
这就是为什么这一点非常重要:简洁。尊重别人的时间。没有人想要一封长信,他们会觉得有义务长篇大论地回复。
因为 – 再次和我一起说- 人们都很忙碌。
如何建立更深层次的联系
因为人们很忙,他们经常倾向于根据陌生人能为他们做什么来看待陌生人:
- 这个人开车带我去上班。
- 这个人按我喜欢的方式为我做饮料。
- 这个人在人力资源部门回答我的请假问题。
- 这个人为我编写了一份出色的酸爵士音乐播放列表让我在编码时听。
- 这个人每周通过电子邮件给我发送免费的编码资源。
在某种程度上,你是为别人做什么而存在的。
我知道,我知道。这听起来可能过于简单化。甚至有些愤世嫉俗。但这对于你生活中的亲密朋友和家人绝对不是真实的。
但对于那些几乎不了解你的人,他们在日常生活中遇到你时可能就是这样看待你的。
你需要给别人一个关心你的理由。你需要激发他们对你更多了解的兴趣。
在你成为某人亲密的朋友之前,成为对他们有帮助的人是必要的。
这就是我们现在要做的事情。我们将通过提供帮助来建立更深入的关系。
这将是一个漫长的过程。你应该在找工作之前就开始了这个过程。你最不想要的是有人认为“哦,你只是找我因为你需要我帮忙”。
相反,你是找他们因为你有东西可以给予他们。
毕竟,你拥有一个人可以掌控机器的最强大的技能之一。你是一个程序员。
或者,至少,你正在成为一个程序员的路上。
所以你已经有了一个好的理由去联系人。
你可能听过“冷呼叫”的术语。这是指你几乎对对方一无所知,然后试图向他们销售某种产品。这是不容易的,绝大多数冷呼叫都以对方挂断电话结束。
但你对对方了解得越多,电话就越温暖,成功的可能性也就越大。
现在,你并不是在这里销售任何东西。正如我之前提到的,你也没有打电话给他们。你是在给他们发一条直接消息。
也许是通过Twitter、LinkedIn、Discord、Reddit等方式。但你正在用一段文字与他们取得联系。
正如我所说的,最有可能得到回应的强有力的开场方式就是随意地提供帮助。
如果我要做到这一点,这是我会使用的一个简单的模板。请记住不要直接使用这个模板,重新以你自己的声音重写它,就像你对朋友说的那样:
“嘿[name],恭喜你[新工作/晋升/新宝宝]。我一直在学习一些编程知识,并在打造我的作品集。当我需要一个能够让你的生活更轻松的工具或应用时,我立刻想到了你。也许我可以为你编写它,以便练习。”
这是一个强有力的方法,因为它是个性化的,不会给人自动化的感觉。如今人们收到很多自动化的消息,他们很快就会忽视任何类似于自动化消息的东西。
这就是为什么我手动发送所有的消息,不依赖自动化的原因。逐一慢慢地撰写消息要比使用脚本或邮件合并来节省时间更好。
最快被屏蔽的方式就是向某人发送一个开始为“Hi , how’s it going?”的消息,很明显这是个模板,首名字这里缺失了。
有时我收到的消息使用的是我的姓而不是名字。“嘿Larson。”什么,我现在是军校的学员吗?
LinkedIn上很多人在名字前面放了一个表情符号。这使得检测到自动化的消息变得容易,因为没有人会在他们的直接消息中包含那个表情符号。
当一条消息以“嗨🍜Sarah,你在找新工作吗?”开头时,你知道这是一条大量发送的消息。
还要注意,我上面的模板没有说“我们在学校里一起上过课”之类的话。除非你几天前刚认识某人,否则你不应该指明你们两个是怎么认识的。
为什么呢?因为提醒别人你们怎么认识会让某些人退后一步思考:“天呐,我几乎不了解这个人。”
如何继续对话
再次,你的目标是得到他们的回应,这样你就可以开始一个来回的对话。
这些通讯平台给人一种随意的感觉。保持随意。
不要发送一条单一的多段落消息。让你的消息简短而有趣。你不希望对方觉得回复你是一项烦琐的任务。
一旦你得到他们的回复,开始在你的个人社交板上做笔记,这样你以后就能记住这些信息。
也许他们确实有一些应用想法或者工具想法。太好了。问他们一些相关的问题。看看是否可以为他们建造一个。
首先,草拟一个简单的用户界面。如果你想显得更有品味,可以使用图纸。拍张照片发给他们。“像这样的?”
这将表明你是认真帮助他们的。我敢打赌大多数人都不曾有过这样的体验。
“你帮我?你为我创建这个应用?”这将是一种奉承,他们很可能会记住。即使应用本身没有取得任何成就。
从那里开始,你可以顺着对话的方向继续进行。也许对话会渐渐消失,没关系。任其消失。几周后你总能找到重启对话的理由。
这些社交媒体直接消息的好处是整个消息记录都在那里。下一次你给他们发消息,他们只需要往上滑动,就可以看到“哦,这就是那个主动建造应用的人。”不再有“你是谁?”的疑惑,这种情况在面对面的对话中可能会出现。
再次强调,保持一切随意和积极向上。如果对话感觉进展缓慢,也没有关系。因为你将会有几十个其他对话进行。火上的铁越多,你将会变得越忙碌,建立你的社交网络。
如何结识新朋友并扩大你的人际网络
我们已经谈过如何接触那些你已经认识的人。即使这些联系在多年中有些失去联系了。
但是如何建立全新的联系呢?
这并不是一件容易的事情。但是我有一些建议,可以让这个过程变得不那么可怕。
首先,与人面对面初次见面比线上相遇要有更大的影响力。
当你面对面地与某人交谈时,你的记忆会有更多信息:
- 人的外貌、姿势以及他们在空间中的动作方式
- 他们的声音和说话的方式
- 场所的灯光、声音、气味、温度以及整体感受
- 以及那些深深烙在记忆中的许多其他小细节
与某人亲自交谈10分钟,可能比数周的来回消息可以建立更深的联系。
这就是为什么我强烈建议:走出去,在当地的活动上结识人们。
如何在城镇附近的本地活动中结识新朋友
有哪些活动呢?如果你住在一个人口稠密的城市,你可能有很多选择。你可能每个星期晚上都能去技术活动,交通也很方便。
如果你住在一个小镇,你可能只能参加当地的聚会来结识人。书展、冰淇淋社交活动、体育赛事。
如果你去教堂、清真寺或寺庙,也要与那里的人交往。
是的,我意识到这听起来可能有些荒谬。“那个和我一起站在足球比赛看台上的人?他们怎么能帮助我找到开发工作呢?”
也许。也可能不会。但是不要对人轻易下结论。
那个人可能经营着一家小企业。
他们可能和一个朋友在学校认识,那个朋友是一家财富500强公司的工程副总裁。
还有可能——只是可能——他们也是一名软件工程师。毕竟,全球有数百万名软件工程师。我们并不都住在硅谷。😉
当你结识一个新人时,你不想立即拿出手机说“我可以把你加入我的领英专业人际网络吗?”
相反,你想要保持冷静。自我介绍。
记住他们的名字。名字对于建立关系至关重要。如果你对记名字很差,试着练习记住它们。当你看电视节目或电影时,可以尝试记住每个角色的名字,无论他们多么次要。
如果你忘记了某人的名字,不要猜。只需说“你的名字是什么”并确保第二次记住它。
和他们握手或拳头碰一下。和他们谈论自然的事情。如果对话逐渐停下来,别担心。随它去。
你在一段时间内建立关系。这不是与某人共度的总时间 — 而是在较长时间内与这个人见面的次数。
将来有很大的机会再次见到这个人。也许几个星期后在同一个地点。那就是你行动的时候:
“嘿[name],[你上次谈论的事情]怎么样了?”
接上了之前的对话。如果他们似乎是你个人关系网络板上的有用补充,邀请他们“嘿,[星期几]你下次有什么打算?你想和我一起去[即将举行的本地活动]吗?”
永远要牢记即将来临的一周活动,这样你就可以邀请人们与你一起参加。
这是一个在安全、公共的场所与人们一起消磨时间的绝佳方式。而且你提供了一些有价值的东西 — 让他们了解即将举行的活动。
如果他们感兴趣,你可以说:“太棒了。和你联络和获取活动详情的最佳方式是什么?”
砰 — 你现在有了他们的电子邮件、社交媒体或电话号码,你们的关系可以从此展开。
这听起来可能是一种缓慢的方法。为什么那么小心翼翼?
再次强调,人们都很忙。聪明人对自己的时间和个人信息都有防范意识。
外面有太多吸血鬼想利用人们 — 试图向他们推销东西、欺诈他们、让他们参与他们的多级营销计划,或以其他方式布道给他们。
帮助其他人克服这种防御性策略的最好方法就是在之前的接触中已经成为一个合理的人。
如何利用你的关系网络
我们将在第四章更详细地讨论如何利用你的关系网络。现在,把你的关系网络纯粹视为时间和精力的投资。
我喜欢把我的关系网络比作一片果园。我在种植关系。照料它们,确保它们健康。
谁知道这些关系何时会生长成树并结果。目标是不断种植树木,未来的某个时刻,这些树木将帮助你维持生活。
保持积极的能量。使用你的技能,甚至你自己的人脉,提供帮助给别人。(在你认识的两个人之间进行礼貌的介绍很少会是一个错误的举动。)
成为一个友善、体贴、乐于助人的人。
永远不要对求职的进展感到不耐烦。
永远不要让自己感到受轻视或冷落。
永远不要嫉妒别人的成功。
善有善报。你将来会收获你所播种的。如果你播种的是积极的能量,你将为自己创造丰盛的收获。
第三章:如何建立你的声誉
“赢得良好的声誉的方法是努力成为你想要看起来的样子。” — 苏格拉底
现在,你已经开始建立你的技能和你的关系网络,你准备开始建立你的声誉。
你可能是从零开始 — 技术上的一个完全新手。或者你可能已经有一些可信度可以从你的其他工作带来。
在这一章中,我将分享一些实用的技巧,告诉你如何在同行中建立一个出色的声誉。这将是获得自由职业客户、第一份工作和在职业生涯中晋升的关键。
但首先,我来说说我是如何建立我的声誉的。
故事时间:一个30多岁的教师如何建立起作为开发者的声誉?
上一次的故事时间里:昆西(Quincy)开始建立与技术开发者、企业家和招聘经理的关系网络。他频繁出没于城市中的黑客空间和技术活动。但他还没有迈入竞技场,测试自己的能力…
我已经在我的编码之旅中进行了数个月,才终于鼓足了勇气去参加我的第一个黑客马拉松。
有一天,我遇到了一个特别棘手的错误,我不确定该如何修复它。所以我做了很多人在这种情况下会做的事情:我通过浏览网页拖延时间。那时我看到了它。创业周末教育。
创业周末是一项为期54小时的比赛,涉及构建一个应用,然后向评委团队展示。这些活动奖励你对编码、设计和创业的知识。
这场特殊的活动在硅谷的中心地带举行,评委由教育家和教育企业家组成。凭借我在成人教育方面的背景,这对我来说似乎是一个理想的首次黑客马拉松。
我把这个活动告诉了史蒂夫。然后我说了一个神奇的词:“我来开车。” 这很好,因为史蒂夫没有驾驶执照。
有了史蒂夫的加入,我们从圣巴巴拉黑客空间找来了几个开发人员,团队这样就凑齐了。
我花了几个星期准备这个活动,研究评委和他们所在公司。我研究了赞助商。当然,我还像少林寺的和尚一样练习编码。
最后,经过一个月的准备,大周末来了。我们挤进我的2003年丰田Corolla,车漆脱落,放上一些高能音乐,开始了5个小时的开车。
在路上,我们讨论了我们应该构建什么。当然应该是以教育为重点。最好是迎合高中学生,因为这是评委公司关注的学生级别。
但这款应用程序应该做什么呢?它怎样可以让人们的生活更轻松?
我回忆起我在高中的时光。我没有太多经验,因为我只上了一年就辍学了。(我在塔可钟工作时,设法自学并通过了GED ——足够好的学位,然后最终去上了大学。但这是另一回事。)
但我记得从高中时代开始,一直到现在仍然存在的痛点:英语论文。
我喜欢写作。但我不喜欢用严格的MLA格式写作,带有其刚性引用规则。我曾经害怕准备一份工作著录页。我的老师总是因为我的引文格式不正确扣分。
在车上听了其他乘客提出的很多可行的想法之后,我决定发言。我说:“我有一个主意。我们应该编写一个可以为你创建引文的应用。”
然后有人笑了笑说:“太好了。”
史蒂夫说:“嘿,这是个好名字。我们可以叫它Out of Cite(引文生成器)。”
我们都笑了起来,觉得自己很聪明。然后我们开始讨论实施细节。
当我们到达目的地时,已经有大约100名其他开发人员在那里了。这是一个开放式办公空间,低矮的小隔间两旁是白板。
我听到其他人低声说着那些开发人员中的一个。“嘿,是去年赢得比赛的那个家伙,”我听到人们说。他们朝一个自负的开发者示意。“也许他会让我加入他的团队。”
活动从提案开始。任何人都可以走到房间前端,抓住麦克风,为他们想要构建的应用程序发表60秒的提案。
我非常紧张,感觉就像有个外星人要从我的胸腔爆发出来。所以自然而然地,我第一个上前。拔掉创可贴,对吧?
我出汗并且手舞足蹈,飞快地完成了我的提案。我说了这样的话:“引文这玩意儿特烦人。我是说,它们并不烦人。它们是必需的。你需要将它们添加到你的论文中。但是准备引文太烦人了。我们来建一个填写工作著录页的应用。有人和我一起吗?”
房间里很安静,然后大家意识到我已经说完了,于是给了我应有的掌声。主持人把麦克风从我手中拿过来,交给下一个人,我蹦蹦跳跳地回到了我的座位上。
提案结束后,是组建团队的时间。我们圣巴巴拉团队相互看着说:“我猜我们就是一个团队了。”
我们找到了wifi密码,占据了最好的工作空间:一个带有实质上可以关闭的门的角落办公室。
我开始在白板上画UI模型。我说:“我们想要一个一键即得的东西。就在你的浏览器菜单栏里。”
“就像一个浏览器插件,”史蒂夫说。
“是的。让我们建一个浏览器插件。”
我向他们展示了论文可能要求的三种格式:MLA、APA和芝加哥。
“我们可以同时生成这三种格式吗,这样他们只需复制粘贴?”我问。
“我们可以做得比那更好,”史蒂夫说道。”我们可以为每个人都设计一个按钮,直接将引文放入剪贴板中。”
我们快速地工作,到周五晚上时就创建了一个简单的MVP(最小可行产品)。它的功能只是获取当前网站的元数据,并将其构造成引文。但它有效。
作为我第一次参加黑客马拉松,我不想承受住宿的压力。所以我花大钱租了一间酒店房间。我们有两张单人床,所以每晚我们会轮流谁要睡在地板上。
周六早上,我们的雄心壮志增长了。我走到白板旁对团队说:”引用网页挺好,不过很多学生引用的东西都在书籍或学术论文中。我们也需要能够为这些内容生成引文。”
我们找到了一个可以根据ISBN(书籍使用的序列号)获取引文信息的API。并且我们编写了一个脚本,可以根据DOI(学术论文使用的序列号)搜索学术论文,并从结果页面中获取数据。
到了周六晚上,我们的浏览器插件的代码真的开始协同工作了。所以我坐下来开始准备演示幻灯片。我把最后的编码工作交给了我的队友,而我为了多次排练自己的演讲,几个小时都没法安然入眠。
尽管轮到我睡在床上,但由于紧张,我几乎无法入睡。我就在科技生态圈的中心,硅谷。
作为一名教师,我经常在同行面前发表演讲,有时候他们有数十个人。但这次情况不同。
在几个小时内,我将在一个充满雄心壮志的开发者的房间里做演示。还有评委们。一些博士学位的人,其中一些是自己创办科技公司的人。他们将评估我们的工作。我真怕自己会搞砸。
无法入睡,我打开了我的电子邮箱。创业周末的工作人员已发送了一封邮件,其中包含一本书的PDF。这是一本非官方的整合了科技初创经典《觉悟的4步骤》和《精益创业》的混搭书。
现在,我已经读过这些书了,因为它们是2010年代初任何希望构建软件产品的人的必读物。但我还读过其他几十本创业书籍。其中很多见解都混杂在一起,形成了一些建议的混合浆糊。
此时已经是凌晨4点了,而我无法入睡。所以我开始阅读。这些书中真正强调的一点是构建人们愿意为之付费的东西。这是最终形式的客户验证。
那时我意识到:要真正推动我的演讲成功,我需要产品市场适应的证明。证明我们正在构建的应用能够解决人们真正面临的问题。问题严重到他们愿意拿出钱来。
这给了我灵感。我应该带着我们的应用走上路,向人们卖它。
但此时已经是周日早上了。我将在哪里找到潜在顾客呢?好巧不巧,我们的酒店刚好位于斯坦福大学的主校区附近。
我驾车带着我的团队前往活动场地,挥手告别并说:”我会在有了顾客的冷硬现金后回来的。”
我的队友们笑了。我不知道他们是否认真。他们说:”只是别迟到做演讲就行了。”
但我是认真的。我在我的笔记本电脑上运行了应用的原型。我在GPS上输入了斯坦福,并展开了我的任务。
现在,我在俄克拉荷马州的一所非常便宜的州立大学学习。所以当我开车来到世界上最顶尖的大学之一时,我感到非常不自在。
斯坦福的学费每年是5万美元。而我开着一辆价值不到这个数十的汽车停在他们的停车场。
这个时候,校园里是一个鬼城。但无论如何也是一个豪华的鬼城。青铜雕像。标志性的拱门随处可见。
我问自己:在这个时间段,最有成就、最努力的学生在哪里?那些没有时间浪费在手动创建引文页上?
我走进主图书馆,径直走过安全台和一个写着”禁止招揽”的牌子。
我在书架周围漫步,找到了几个正在学习的人。有个孩子正在认真地阅读一本厚厚的教科书时专心记笔记。中了!
我滑到了他旁边的座位上。“嘘,嘿,你喜欢引用吗?”
“什么?”
“引用,你知道的,就像参考文献页一样。”
“嗯……”
“你知道的,你论文的最后一页,你必须列出所有的……”
“我知道什么是参考文献页。”
“好吧。那么看这个。”我把夹克拉到一边,就像一个毒贩一样,掏出了我的200美元的小笔记本电脑。他耐心地听了我尴尬的销售宣传。
我说:“看这个。我有一个浏览器插件。我打开任何网站,点击按钮,然后嘿!它会为我创建一个引用。”
那个孩子扬起眉毛。“它能做MLA吗?”
我忍住兴奋,说:“MLA,APA,甚至芝加哥都可以。看吧。”我点击了按钮,出现了三个引用–每个都有自己的复制到剪贴板按钮。
那个孩子点了点头,似乎有点印象深刻。所以我试图完成这次销售。
“如果我告诉你,我即将推出一款年度订阅的应用程序。但是如果你现在注册,我将获得无限访问,不仅仅是一年,而是一生。”
那个孩子思考了一会儿。
我听说沉默是销售员最好的朋友。所以我坐在那里,忍受了一段非常尴尬的沉默,盯着他。
最后他说:“很酷,我加入。”
“太棒了。要付二十美元。”
那个孩子退缩了。“什么?太贵了。”
当然,那是风险投资补贴的创业企业时代,在这个时代,优步和Lyft每一次乘车都在赔钱,争夺市场份额。所以那个孩子的反应并不完全令人惊讶。
但是我反应迅速。“嗯,你身上有多少现金?”
他摸索着他的钱包,然后说:“五块钱。”
我看着皱巴巴的钞票耸耸肩。“成交。”
他微笑了,我给他发了封邮件,告诉他如何安装。然后我说:“还有一件事。我们一起来拍张照片吧。”
我把手机调到自拍模式。他开始笑了,我说:“拿起那五美元的钞票。”
我花了另一个小时在图书馆里向人们推销,还成功获得了另一位付费顾客。然后我飞奔回活动场地,与团队完成了原型的最后定稿。
那天下午,我做了我认为一生中最好的演讲。我们现场演示了这个工作的应用程序,它完美无缺地运行。
我们以我拍摄的照片为结束,与斯坦福的学生们一起拍照,他们现在是我们的付费用户。当我拿着我们赚到的现金时,观众爆发出掌声。
总的来说,那是我生活中最令人振奋的经历之一。我们获得了第二名,并从赞助该活动的一家公司获得了一些API积分。
在派对上,我大口吃了一些比萨饼,这样我就有更多时间与每个人进行网络交流。我连接了LinkedIn。我在Twitter上关注了他们。我和人们一起自拍,并大量使用活动的标签。
这是我编程之旅的一个分水岭时刻。我向那个房间里的人们证明了我可以帮助设计、编码甚至销售一个应用。更重要的是,我向自己证明了这一点。
参加黑客马拉松
从那一刻起,我迷上了黑客马拉松。那一年,我参加了几十场比赛。我成为了一个公路勇士,在沿海地区往返,参加我能参加的每一个比赛。
从这以后,事情会变得困难得多。我不再有一个团队了。我孤军奋战。
我到达比赛地点,尽可能地认识更多的人,然后上去侃侃而谈我认为可能会打动评委的想法。
有时候有人加入我的团队。有时候我加入别人的团队。
我不仅仅想设计应用程序,我也想编程它们。我经常超出了我的能力范围。
有很多黑客马拉松比赛,在上台演讲之前的最后几分钟仍然在努力解决错误。有时候我的应用程序在演示时崩溃。
在拉斯维加斯的一个黑客马拉松比赛中,我把代码搞得一团糟,我们只能使用幻灯片。我坐在观众席上,头埋在双手中,无助地看着我的团队成员演示我们的应用程序如何理论上工作–如果我能让它工作的话。我们在评委面前表现不佳。
但我还在继续努力。继续来到新城镇,入住青年旅社,参加活动,尽可能多地吃免费披萨。
我的团队曾经多次获得第二或第三名,但我们从未成功赢得过一场黑客马拉松。
突破
直到圣地亚哥的一场活动。我永远不会忘记那种建造一些东西赢得观众和评委的感觉,以至于我们的胜利似乎是板上钉钉。
在他们宣布我们为冠军后,我记得偷偷从后门走出去到停车场,给我的祖父母打电话。我告诉他们我终于做到了。我帮助建立了一个应用程序,制定了一个赢得黑客马拉松的计划。
我不知道我的祖父母对软件开发或黑客马拉松有多少了解。但他们说他们为我感到骄傲。
现在他们不在了,我经常回想起这次对话。我珍视他们的鼓励。他们对一个年过三十的教师孙子努力尝试成为一名开发者的信任。
在那之后,我继续参加黑客马拉松。我继续组建新团队,学习新工具。你永远不会忘记第一次让API工作的时刻。或当你终于弄懂某个Git命令的时候。而且你永远不会忘记与你并肩奋斗的人们,试图在演示中保持应用程序的完整性。
TechCrunch Disrupt黑客马拉松。DeveloperWeek黑客马拉松。ProgrammableWeb黑客马拉松。100万美元奖项Salesforce黑客马拉松。如此之多的大型黑客马拉松,如此多的学习。这是锻炼我的开发技能的熔炉。
我不仅成功建立了我的技能和人脉——我现在也有了一个能真正赢得黑客马拉松的声誉。
我可以交付项目。
这使我成为了备受瞩目的人物。
而这个声誉对于获得我第一个自由职业客户、第一份开发工作以及最重要的是信任自己作为开发者的直觉至关重要。
为什么你的声誉如此重要
声誉在社会中的作用已经可以追溯到人类史前时代。在大多数部落和定居地,都存在一些系统来跟踪谁欠谁什么。
在现金出现之前,存在着信用。
这可能是一本书写的分类账。或者可能是一个年长者只是把所有这些记录都记在脑子里。
除了纯粹的会计,还有一种更加抽象但同样重要的感觉,人们带着这种感觉。
“约翰真的很懂怎样给马铁鞋。”
或者“简是这片土地上最好的讲故事的人。”
或者“杰伊在战斗中的勇气在三年前拯救了我们免受入侵者的伤害。”
你会注意到这些例子都涉及到某人在某方面的专长。而不仅仅是一个好人,一个讨人喜欢的人。
成为一个冷静、务实的人肯定是有帮助的。但这不是《大白松鼠》(The Big Lebowski),我们不能仅凭魅力生存。
一个开发者很容易说:“哦,没问题。我对JavaScript了如指掌。我可以为您构建任何类型的JavaScript应用程序,适用于您能想到的任何设备。”
或者说:“我总是按时且在预算内发布代码。”
但你怎么知道他们没有夸大其词呢?
毕竟,一个阴险的人曾经说过:
“如果你只能擅长一件事,那就擅长撒谎。然后你在任何事情上都很牛。”
(这句话的真实出处未知。但我喜欢想象它是由一个戴着礼帽和单片眼镜的1920年代骗子说出的。)
任何人都可以说谎。有些人确实如此。
在我职业生涯早期,我曾经不得不解雇一位谎称拥有硕士学位的教师。多年过去了,没有人发现他的谎言。
每年,他都会在他的年度文件上撒谎,这样他就可以获得比其他教师更高的工资涨幅。而且每年,他都逃脱了惩罚。
但有一天,一个小小的不符之处引起了我的注意。我审查了他的档案,打电话给一些大学的记录部门,发现他从未费心完成学位。
当我逮住他的时候,真是个“史酷比杜”时刻。“我本来能逃得过的,要不是你们这些该死的孩子。”
知道这个人在学校任教多年,并获得比其他教师多得多的薪水,只是因为他愿意撒谎,真让人沮丧。
撒谎的收益总是闪耀着。有些人愿意屈服于这样的诱惑。
雇主知道这一点。他们知道不能相信每个声称掌握全栈 JavaScript 开发的人。在给一个公司徽章、公司电子邮件地址和你的生产数据库的钥匙之前,你必须谨慎选择。
这就是为什么雇主采用行为面试问题的原因——试图抓住那些更擅长撒谎的人。
请原谅我天真的信念,我相信大多数人天生善良。只要规则相对公平,大多数人愿意遵守规则。
但是,即使十分之一的人是灾难性的大坏蛋,这意味着我们所有人都要接受更严格的审查。
最糟糕的情况不仅仅是有人撒谎赚更多的钱。还有一些人为了自己的利益而出卖公司机密,破坏与客户的关系,或者以增加他们的数字来违法。
历史上有很多雇员对雇主造成了灾难性的破坏。
因此,大多数大公司的开发人员招聘过程非常患得患失。也许是应该这样的。不幸的是,这使得每个人都更难得到开发人员的工作——即使是最诚实的候选人。
作为开发人员,我们需要证明我们的技能和我们所说的一样强大。我们需要证明我们的职业道德和雇主所需要的一样坚定。
这就是声誉的作用。它降低了不确定性。降低了交易对手风险。使雇主更安全地提供工作机会,并与你签订雇佣合同。
这意味着,如果你有足够强大的声誉,你可能能够通过“旁门左道”进入公司,而不是其他申请人排队等候的正门。
某些公司甚至有在职招聘人员,可以快速推进你的面试过程。强大的声誉也可以帮助你在薪资谈判中获得更多的议价权。
因此,让我们来说说如何建立自己的声誉,并成为经理们追捧的人。
作为开发人员如何建立声誉
以下至少有六种经过时间考验的方法可以建立自己作为开发人员的声誉。它们是:
- 黑客马拉松
- 为开源项目做贡献
- 创造面向开发者的内容
- 在一家有 “家喻户晓” 的公司中晋升
- 建立自己的自由职业客户组合
- 发起自己的开源项目、公司或慈善机构
如何找到黑客马拉松和其他开发者比赛
黑客马拉松代表了最迅速建立声誉、扩展人脉和提升编码技能的方式。
大多数黑客马拉松是免费的,对公众开放。你只需要有时间和预算去旅行。
如果你住在像旧金山、纽约、班加罗尔或北京这样有很多黑客马拉松的城市,你可能能够通勤参加活动,然后回家在自己的床上睡觉。
尽管我住在圣巴巴拉,那里每隔几个月才举办一次黑客马拉松,但我有一个在旧金山的老同学让我住他的沙发。这让我能够参加更多的活动。
过去,黑客马拉松是一场强度很大的活动。人们会狂飙能量饮料,在地板上睡觉,全力以赴完成他们的项目。
但黑客马拉松的组织者逐渐开始更加关注这些活动的健康和可持续性。毕竟,许多参与者有孩子要照顾,或者有要求很高的全职工作,不能整个周末都全力以赴编码。
找到即将举行的活动的最好方法是谷歌搜索“黑客马拉松 [你的城市名]”,浏览搜索结果中出现的各种活动日历。其中许多由大学、本地雇主甚至有教育焦点的慈善机构组织。
如果你打算去赢得胜利,我建议提前做好研究。
活动赞助商是谁?通常会是面向开发者的公司,他们提供API、数据库工具或各种软件即服务(Software-as-a-Service)。
这些赞助商很可能会在活动中设立摊位,你可以与他们的开发者倡导者交流。倡导者是那些被付钱来教人们如何使用公司工具的人。有时你甚至会在这些摊位上遇到关键员工或创始人,这也是一个很好的社交机会。
很多时候,黑客马拉松会提供特定赞助商的奖品。“最佳使用 [赞助商] 的API”。将你的时间集中在将特定赞助商的工具整合到你的项目中,可能会比争取大奖更容易。但你仍然可以在LinkedIn或简历上标注这些成就。无论如何,胜利就是胜利。
有时候,黑客马拉松活动的知名度非常高,或者奖品非常丰厚,那么努力争取竞赛冠军是值得的。
在我参加黑客马拉松的时候,我赢得了数个月的租金现金奖、数年的免费协同工作空间,甚至还参观了纽约市的联合国大楼。
在黑客马拉松的圈子里,我遇到了那些以赢得黑客马拉松现金奖为主要收入来源的人。我认识一个开发者,他在同一场黑客马拉松中赢得了九个赞助商奖项。他成功将所有这些赞助商工具整合到他的项目中,并获得了总体第二名。
如果你在黑客马拉松中经常遇到一些人,他们后来创立了风险投资公司或推出了知名的开源项目,也不要感到意外。
在黑客马拉松的常客中,你会看到比普通开发者更高的野心。毕竟,这些人会在一周工作结束后立刻进入一个周末的工作状态。这些人敢于从炉灶跳入火坑。
如何为开源项目贡献
为开源项目做贡献是你能够立即建立声誉的途径之一。大多数雇主都会查看你的GitHub个人资料,其中会突出显示你的Git提交历史。
许多开源项目维护者,如Linux Foundation、Mozilla(Firefox)以及当然还有我们自己的freeCodeCamp,都对代码质量有比较高的标准。
你可以阅读开放的GitHub问题,找到已知的错误或功能请求。然后你可以进行代码更改并提交一个拉取请求。如果维护者合并了你的拉取请求,这将是你的重要成就。
在技术公司找工作的最佳途径之一就是成为他们仓库的活跃开源贡献者。
开源贡献是建立声誉的绝佳方式,因为你所做的一切都是公开的。你还可以通过其他开发者审查和接受你的工作来获得社交证明。
如果你有兴趣通过开源项目建立声誉,以下是入门的方法。
阅读Hillary Nyakundi的详尽指南,了解有关开源项目入门的内容。
如何创建开发者相关内容
开发者也是人。和其他人一样,当他们不工作、睡觉或和朋友家人在一起时,他们也想找点活动来做。
对许多人来说(包括我自己),这意味着花时间涉足其他人的思维。阅读书籍,观看视频文章,体验像视觉小说这样的交互体验。
你可以广义地将这些称为”内容”。我不是很喜欢这个词,因为它让这些作品显得可有可无。但这就是人们称呼它的。
软件开发是一个非常广泛的领域,有很多不同的主题可以涉及。有开发者生活博客、编程面试准备教程、Twitch上的编程直播,还有像freeCodeCamp Podcast那样的开发者访谈播客。
可能还有完全未曾被我们想到的开发者内容类别,在未来十年内会成为热门。
如果你对电影、新闻工作或创意写作感兴趣,开发者内容可能是建立声誉的好办法。
你可以选择一个特定的主题,并逐渐被视为专家。
比如,有些开发者专门针对特定技术栈制作教程。
我的朋友安德鲁·布朗是多伦多的一位前首席技术官,他通过创建免费课程来为你准备所有的AWS、Azure和Google Cloud认证考试,并且还经营一项考试准备服务。
全球有超过3千万软件开发者。这是很多潜在的内容消费者,也是会了解你的人。
如何通过在大公司工作来提升地位
你可能见过有人被介绍为“前谷歌员工”或“前Netflix工程师”。
一些科技公司的招聘流程非常严格,标准也很高,甚至能在这些公司找到工作就是一大成就。
雇主们关注候选人之前工作的一些实际原因。这样可以降低招聘失败的风险。
通过逐级升迁的方式逐渐建立声誉是一种方法。你可以从当地雇主逐渐晋升到财富500强公司,并最终进入一家大型科技巨头。
当然,工作在一家大型企业并不适合每个人。我将在第4章讨论这个问题。但是要知道,这是你建立声誉的一种选择。
通过与自由职业客户建立作品集来建立声誉
你可以通过与公司合作作为自由职业者来建立声誉。
自由职业开发者通常从事一人项目。因此,这可能是在本地建立声誉的更好策略。
例如,如果你为一家当地银行提供了优秀的工作,这可能足以说服当地的律师事务所也聘请你。
成为“家乡英雄”有其优点。我认识很多开发者,他们可以通过亲自参加会议并与当地人建立联系,有效地与在线竞争对手竞争。
如何创建开发者作品集
一旦你有一些项目,你就会想要展示它们。而最好的方法就是用短视频。
人们很忙。他们没有时间下载你的代码并在自己的电脑上运行。
而如果你把人们引导到一个网站,他们可能无法完全理解他们看到的内容,以及为什么它如此特别。
这就是为什么我建议你使用屏幕录制工具录制2分钟的视频演示。
两分钟足够展示项目的工作原理。在那之后,你可以解释一些实现细节和设计决策。
但是请务必始终从演示开始。人们想要看到东西运行起来。他们希望看到东西的可视化效果。
一旦你用令人信服的应用程序运行演示吸引了人们,你可以解释所有你想要的细节。你的观众现在会有更多的背景知识,并且更感兴趣。
两分钟也是一个魔法时长,因为你可以将该视频上传到推特,当人们在推特上滚动屏幕时,它将自动播放。自动播放视频在推特上更有可能被观看。它们消除了点击播放按钮或导航到其他网站的阻力。
你可以将这些项目演示视频放在YouTube、推特、你的GitHub简介和当然是你自己的作品集网站上。
对于录制此视频,我建议使用MacOS自带的QuickTime。如果你使用Windows,你可以使用Windows 10中免费的Game Recorder。
如果你想要一个更强大的工具,OBS是免费开源的。它更难学习,但可以无限定制。
至于录制技巧:请将字体大小尽可能大,并使用外部麦克风。任何你能找到的麦克风,即使是廉价耳机的麦克风,都会比使用笔记本电脑内置的麦克风效果更好。
投入尽可能多的时间来录制和重新录制,直到你掌握它为止。
能够演示你的项目并展示你的代码是你职业生涯中的宝贵技能。投入时间练习演示永远不会浪费。
如何开始你自己的开源项目、公司或慈善机构
成为创始人是建立开发者声誉最快、但也最具风险的方式。
它最具风险,因为你押注的是你的时间、你的金钱,甚至可能是你的个人关系 – 这一切都是未知的结果。
如果你长时间投入到开源项目中,你将建立起作为开发者的声誉。
如果你长时间参与黑客马拉松,你将建立起作为开发者的声誉。
但是你可以花几十年尝试创办企业项目而没有任何进展。同时还可能浪费你的时间、金钱和人际关系。
创业超出了本书的范围。但如果你对此感兴趣,我会给你一些建议:
大多数创业者失败了。有些失败是由于他们无法控制的环境。但还有很多人失败是因为他们不了解他们所面临的风险的性质。
不要急于创办项目、公司或慈善机构。尽量为那些已经在你感兴趣的领域做工作的其他组织工作。
通过为别人工作,你可以得到报酬来学习。你会接触到这项工作以及围绕它的风险。你也可以为将来的创业冒险储备财富。
如何不毁掉你的声誉
“建立良好声誉需要一生的时间,但你只要一分钟就能破坏它。”- 威尔·罗杰斯,演员、牛仔,我在俄克拉荷马城长大时的偶像之一
建立声誉是一场马拉松,而不是短跑。
不断积累声誉足够强大以打开正确的门可能需要多年时间。
但就像在一场竞争激烈的马拉松比赛中,一次失误可能会浪费宝贵的时间。如果失误导致受伤,可能会使你完全退出比赛。
不要在互联网上说愚蠢的话
过去人们经常说一些愚蠢的话。这些话可能会在空气中挂上几分钟,每个人都会为此而皱眉。但是话语最终会消散。
现在当人们说愚蠢的话时,他们往往是在网上说的。而且是用不可磨灭的墨水写下的。
请始终假设,当你把某些东西输入网站并按下回车键时,它将保存在数据库中。该数据库将在全球多个数据中心进行备份。
你可以证明数据的存在,但无法证明数据的不存在。
就目前而言,你应该假设已经无法收回。无法收回。你刚才说的任何话:都会出现在你的永久记录中。
你可以删除这条评论。你可以删除你的帐户。你甚至可以尝试从谷歌搜索结果中擦除它。但是有人可能已经将其备份到互联网档案馆中。并且当这些数据库在未来的几年内不可避免地被黑客攻击时,这些数据可能仍然存在于某个地方,准备重新出现在某个地方。
现在是言辞粗鲁时刻。所以不要。在说话之前三思。
我的建议可能听起来很懦弱:戒掉在网上和人们争论的习惯。
有些人坚持操场上的规则:“如果你没话好说,就不要说任何话。”
我更喜欢“公开赞美,私下批评”的做法。
我会公开认可在开发者社区做出的好工作。如果我看到一个让我印象深刻的项目,我会这样说。
但我通常不会去批评别人。即使是那些应该得到批评的人。
在争吵中,每个人都显得肮脏。
你不想显得愤怒,在撕碎某人的论点、或是对刚说了愚蠢话的人进行群嘲。
当然 – 尖刻的智慧在短期内可能会给你赢得网络声望。但它也可能让人们稍微喜欢你一点少一点,并且对你多一点恐惧。
我也试图克制抱怨。是的,如果我威胁要在社交媒体上发推文来抱怨航班取消,我可能会得到更好的客户服务。
但人们很忙。他们中的大多数不想浪费他们宝贵的时间浏览社交媒体,只是看到我对于在宏观范围内算是轻微不便而抱怨。
那就是我对使用社交媒体的建议。试着保持积极的态度。
如果这是一件你坚信的事情,我不会阻止你说出自己的想法。只是在你敲下字之前要先思考,敲下发送之前要再次思考。
不要过度承诺,做不到
我看到开发者毁了自己声誉的最常见方式之一就是过度承诺,却未能兑现。这不一定是致命的错误,但是很糟糕。
还记得我之前提到过拉斯维加斯黑客马拉松吗?我完全没能在演示前完成项目,我们不得不使用幻灯片而不是一个可行的应用程序。
是的,那是我学习编程过程中最低点之一。我的队友很礼貌,但我确定他们对我感到失望。毕竟,我过于自信。我在那个时间范围内过度承诺了我能达到的目标,但未能兑现。
对自己的能力进行适度的估计要好得多。
还记得伊卡洛斯的寓言吗?他用蜡做的翅膀离太阳太近,结果翅膀融化后落入大海,给他留下了愧疚的父亲。
在损害声誉之前解决上瘾问题
如果你有未经治疗的药物、酒精或赌博上瘾问题,首先要寻求帮助。开发者求职可能是一个漫长而艰苦的过程。你希望以全部注意力投入其中。
即使是似乎无害的电子游戏成瘾也会分散你的注意力,占用太多的时间。值得先控制好这个问题。
我不是医生,我不会给你一堆“吸毒是不好的”之类的讲话。但我会说:你可能听说过硅谷的一些潮流,开发者滥用药物,以为这样可以提高他们的编程或解决问题能力。
有一段时间有个“微量服用LSD”的趋势,还有一段时间流行药物安非他命。
我的直觉是:这些可能给你带来的任何优势都可能是不可持续的,并且在更长的时间段内是负面的。
不要因为同伴压力而服用精神药物。不要因为在开心时光里同伴的压力而喝酒。(自从我女儿8年前出生以来,我一口啤酒也没喝过,我觉得我什么也没有错过。)
如果你正在康复,要注意学习编程和找一份开发者工作会是一个压力很大的过程。适度的控制自己的步伐,以免引发复发。
你不希望在职业转换过程中取得了很多成就后,旧习惯再次出现,前功尽弃。
尽量区分职业生活和个人生活
你可能听说过这样一个表达:“不把业务和娱乐混在一起。”
作为一个开发者,你将成为一个很有实力的人。你将在你所在城市里获得一定程度的尊重。
可能不像医生或宇航员那样多。但仍然会有人仰慕你。
你将与那些渴望成为你一样的人交谈。
不要炫耀你的财富。
不要表现得你比其他人聪明。
不要滥用权力关系以满足你的欲望。
这会让身边的人讨厌你。如果被某种方式捕捉并发布在网上,它可能会在你的整个职业生涯中成为你的伏笔。
永远不要忘记你拥有多少。以及你有多少可以失去的。
使用旁白技巧
我将用一个小技巧来结束本章,让自己振奋起来。
首先,记住你是自己编程旅程中的英雄。在你内心的剧场里,你是每个人都在看着的人 – 他们为你加油。
叙述技巧是在你做事时在脑海中叙述你的行动。
昆西越过黑客空间,他的笔记本电脑夹在胳膊下。他把杯子放在热水分配器下面,放入一袋新茶。他拉开把手。当滚烫的水注入杯子时,他用他最好的英国口音大声说道:“茶。伯爵灰。热。”手持充满活力的饮品,他滑入一个包间,把笔记本电脑放在桌面上,并与一名开发人员对视。他们目光交汇了一秒钟。昆西微微低头,稍微鞠躬,承认开发人员的存在。开发人员回鞠一礼,像是在传递这样的思想:“朋友,我看到你了。我看到你出现。我看到你把事情做好了。”
这听起来可能很荒谬。是的,它确实很荒谬。但我一直这样做。而且这很有效。
在你的头脑中叙述甚至是生活中最平凡的时刻,可以帮助你激发活力。将展示在你面前的时刻凝结成形,并给你明确的目标。
当你把生活以不同时期(比如“塔可钟年代”)或转折点(比如“通过GED考试”)方式来思考时,效果会更好。
这与建立你的声誉有何关联?你的声誉本质上就是关于你是谁的概括。你对周围人的意义。
通过更认真对待自己,通过将生活视为一部电影,你正在逐渐了解自己。以及你未来想成为的人。
通过叙述你的行动,你在自己的内心中对其投射更亮的光芒。我刚才为什么这样做?我在想什么?那里有更好的动作吗?
很多人都不自觉地破坏了他们的声誉,只是因为他们养成了坏习惯。
多年来,我一直以为自己必须一直“幽默”。我会寻找任何机会注入一些自我嘲笑的幽默。很多人意识到我在做什么,并觉得很有趣。但也有很多人不理解,只是产生了我是个混蛋的印象。
我为什么那样做?我想这始于小学时期,我总是试图成为班级小丑并让人们发笑。
但几十年后,这种用笑声填补沉默的习惯未能帮助我。
“当你一再重复一个错误时,它就不再是错误,而是决定。”– 保罗·柯艾略
如果没有叙述技巧,我可能会一直继续这个坏习惯下去。但现在,我意识到了自己行为的尴尬之处。
我相信我还有很多其他想法和做事方式是次优的。通过叙述技巧的帮助,我希望在将来能够识别它们并改进它们,以免给人们留下错误的印象。
你的声誉将成为你的遗产。
想想你在故事结束时想成为什么样的人。关于人们如何看待你在地球上的时光。然后从那里逆推。
你想要成为电影结束时的那个人。你想要人们钦佩的那个英雄。为什么不从现在开始以那种姿态面对自己呢?
你能想象成为一名成功的开发人员是什么感觉吗?开发人员建立的软件系统是人们所依赖的吗?
那个未来的你 – 他们会怎么想?他们会如何应对情况并解决问题?他们会如何谈论他们的成就?他们的挫折?
仅仅思考你未来的自己就可以帮助你澄清思路。你的优先事项。
我经常想着“老昆西”,他背有点不好。每30分钟他都不得不借口去上洗手间。
但老昆西仍然尽力利用手头的资源。他尽管关节疼痛依然行动。尽管头脑迷糊,他仍思考。
老昆西仍然希望完成任务。他为自己取得的成就感到自豪,但他不会花太多时间回顾过去。他会展望今天要做的事情以及要实现的目标。
我经常想到老昆西,并从那里逆推到我今天所处的位置。
今天我可以做出哪些决定,为了成为明天值得钦佩的人?我需要等几十年才能赢得声誉吗?还是可以从未来借来一些这种尊重?
通过以未来的自己的思维方式思考,我能够采取一些行动来赢得当前的良好声誉吗?
我相信你可以立即利用你未来的声誉 – 你的遗产。只要思考你未来的自己和你将要完成的事情。并将其作为指引你向前发展的航点。
我希望这些工具 – 叙事者技巧和可视化未来自己的技巧 – 不仅能帮助你思考声誉的本质,也能帮助你采取具体行动来提升声誉。
因为建立声誉 – 为自己打响名号 – 是作为开发者可持续成功的最可靠途径。
成功对于不同的人有不同的定义。但大多数人 – 来自各种文化 – 都会同意:成功的一个重要方面是为自己和家人解决温饱问题。
下面我们要讨论的就是这个。
第四章:如何通过编程获得报酬 – 自由职业客户和求职
如果你已经积累了技能、关系网和声誉,那么找一份开发者工作并不是那么复杂。
注意,我说的不是复杂 – 但仍然需要大量努力。而且可能会是一种磨砺。
首先,让我告诉你我如何找到第一份工作。
故事时间:一个30多岁的教师如何找到第一份开发者工作?
上一次在故事时间里,Quincy积极参加黑客马拉松,甚至赢得了其中一些比赛。他开始建立自己作为“危险”的JavaScript开发者的声誉。并不是非常有技术,只是有点“危险”…
我刚刚结束了一天漫长的学习,坐在圣巴巴拉市中心图书馆里,喝着茶,做着项目。
住在加利福尼亚州的最好之处就是天气。我们会开玩笑说,当你在郊区租了一个价格昂贵的一卧室公寓时,你付的并不是里面的东西 – 你付的是外面的东西。
我的目标是尽量少呆在那个狭小的100年老老鼠洞里,把剩下的时间都在城里走走看看。
那是一个美丽的星期三晚上。离那个周末的黑客马拉松还有两天时间。而我已经被一天的编程彻底击垮了。我妻子晚上要工作,所以我查了一下日历,找点事情做。
每个月的第一个星期一,我会计划一下南加州附近的所有科技活动,这样我就总有一个可以参加的科技活动,如果我有精力的话。
啊 – 今晚是圣巴巴拉的Ruby on Rails聚会,我已经预约过了。
我对Ruby on Rails并不是很了解,但我已经完成了几个小项目。我更多的是JavaScript和Python开发者。
但我想,管他呢。我需要保持我建立关系网的势头。而且那个聚会场所就在几个街区之外。
我走进去,只看到几个开发者围着一张桌子聊天。很快就清楚他们都在一家当地创业公司工作,维护着一个庞大的Ruby on Rails代码库。他们中的大多数人已经在那里工作了几年。
现在,在这个时候,我已经花了一年的时间来建立我的技能、关系网和声誉。所以在对话中我能够不输给任何人。
但我也对自己的能力有所了解。所以我保持谦逊。低调。这正是我在科技活动中看到过很多成功开发者对话的方式。
很快就清楚桌子上的一个开发者是工程总监。他直接向首席技术官汇报。
然后很快就清楚他们正在寻找雇佣Ruby on Rails开发者。
我坦率地介绍了我的背景和能力。“我的背景是成人教育。教授英语和管理学校。我刚刚开始学习编程大约一年。”
但这个人出奇地镇定自若。“如果你想来面试一下,我们可以看看你是否适合这个团队。”
那天晚上,我走回家时感到一种电流。这种感觉更多的是恐惧而不是兴奋。
我觉得我还远远不准备好。而且我甚至不是在找工作。我只是靠我的储蓄生活,全职学习编程,并通过我妻子的工作来享受健康保险。
我是个强迫性的储蓄者。人们常常对我指手画脚。我自己换机油,剪自己的头发,甚至在我们点外卖的时候也自己在家里做饭 – 只是为了省几块钱。
在我作为一名教师工作了十年的时间里,我已经设法存下了近四分之一的税后收入。然后我会在Craigslist上买旧的视频游戏,然后在eBay上转卖。这听起来可能很傻,但对我来说是一个相当可观的收入来源。
我们将这一切存下来是为了什么呢?我们也不确定。也许是为了将来能在加州买房子?但这意味着我不必拼命去找工作。我知道我处于一种特权地位,我尽力每天都学到更多知识。
所以简而言之,我觉得我还没有准备好迎接我的第一份开发者工作。我担心如果他们雇佣我,那将是一个大错误。他们会意识到我有多么没有经验,把我解雇掉,然后我将不得不在以后的面试中解释那次失败。
当然,现在我知道我当时用错误的方式看待这个机会。但是让我继续讲完这个故事。
当我安排我的面试时,他们要求我提交一份简历。我不太确定该怎么做,所以我把我所有的职业经历都列了出来。所有我曾经工作过的学校。(我没有列出我在Taco Bell管理司机窗口的经验。)
当然,我的所有工作经验都与编码无关。但我应该怎么办?递给他们一张空白纸?
嗯,我的在线项目作品集还有一个非常重要的优势,那就是我列出了所有我赢得或进入前列的编程马拉松。所以我把它们也包括在内。
在面试前的最后几个小时,我重新复习了过去一年我所学的所有Ruby on Rails教程,以便恢复记忆。然后,我穿上我的连帽衫、牛仔裤和背包,走到他们的办公室。
办公室经理是个很好的女士,她带我去了开发者团队的办公区,并向他们介绍了我。其中大约有十几个人,大多数穿着牛仔裤和连帽衫,年龄从20多岁到40多岁不等。其中有两个人是女性。
我依次穿过各个办公桌和电缆的纠缠,与每个人握手并介绍自己。我的经验作为课堂教师记住学生名字的能力在这时派上了用场。我能记住他们所有的名字,这样在离开时,我可以与他们每个人跟进:“很高兴见到你[name]。我会很高兴与你一起工作。”
首先,我见到了工程主任。我们走进了一个小办公室,关上了门。
墙上的白板上画满了统一建模语言(UML)图的草图。五颜六色的干擦笔描绘出了各种服务器和服务之间的关系。
我不停地瞥着那个白板,担心他会让我去解决一些编码问题,展示我的技能。也许是著名的fizzbuzz问题?也许他希望我把一个二叉树反转过来?
但他甚至没提到那个白板。他只是一直专注地看着我。
这家公司有大约50名员工,有许多风险投资资金,以及数千个付费客户——主要是小企业。他们以务实著称。他们从来没有询问过我在学校学过什么,或者过去做过什么工作。他们真正关心的是……
“听着。我知道你会编程,”他说。“你一直在编程,赢取编程马拉松。我看了你的一些项目作品集。对于一个刚开始学编程的人来说,代码质量还不错。所以对我来说,真正的问题是——你能否学会我们这里的工作方式?你能与团队中的其他开发人员合作吗?最重要的是:你能够完成工作吗?”
我咽了一口口水,向前倾身,尽力展示出所有的自信。“是的,”我说。“我相信我可以。”
他说:“很好。很好。好吧。去楼下的越南河粉店等着。[首席技术官]一会儿就会下来。”
所以我在吃面条时与首席技术官交谈。主要是听着。我知道人们会认为安静的人很聪明。专注倾听不仅帮助你变得更聪明,甚至让你看起来更聪明。
这种方法奏效了。会议持续了大约一个小时。面条很好吃。我了解了公司的历史和近期目标。首席技术官说:“好了,回去和[工程主任]谈谈吧。”
是的,我确实做到了。然后他给了我一份工作。
现在,我想强调一下。这不是大多数人得到他们的第一份开发工作的方式。
你可能在想,“哎呀,这个奎因斯大夫找到了一个他甚至没找的开发工作。只要我们都能这么幸运就好了。”
当时对我来说确实是这样的。但在接下来的部分中,我将探讨雇主和开发人员之间的关系。以及我得到这份工作与我作为面试人的技能之间的关系,更多的是由之前一年的编码、网络建立和声誉塑造决定的。
这份工作不是在一个大型科技公司的轻松工作,拥有所有的补偿、福利和公司保龄球球道。这只是一份和我当老师时赚的钱差不多的承包工作。
但这是一份开发工作。一个公司支付我来编写代码。
我现在是一名专业的开发人员。
雇主想要什么
快进十年。我现在既做过开发者面试官,又被雇佣经理面试过。
我和许多正在找工作的开发者通话了很多个小时。其中一些人已经申请了数百个工作,只有几个获得了工作面试的回复。
我也和经理和招聘人员通话了很多个小时,试图更好地了解他们是如何雇佣和寻找人才的。
我认为开发者对招聘过程的许多沮丧都源于误解。
雇主最看重的是可预测性。
以下这些候选人中,你认为雇主更喜欢哪一个?
X 是一个“顶级”开发人员,经常有天才的灵感。X的生产力也时而爆发性地很高。但X经常对同事不满,常常错过期限或会议。
Y 是一个还不错的开发人员,更稳定地有较慢但更一致的产出。Y与同事相处良好,很少错过会议或期限。
Z 在产出上与Y类似,能够与同事良好相处并符合期限。但Z在过去的3年中换了3份工作。
好了,从我之前所说的,你可以猜到:雇主更喜欢的是 Y。这是因为雇主最看重的是可预测性。
X 是一个陷阱候选人,但有些初次担任经理的人可能会错误地雇用他。如果你想知道为什么雇用X会是个糟糕的主意,请阅读 我们解雇了我们的顶级人才。最好的决定。
我将Z 添加到这个列表中只是为了证明一点:尽量不要频繁换工作。
你可以通过从一个雇主跳到另一个雇主来迅速提高收入。你可以在接受一个职位提议后立即开始申请新工作。但这会不少雇用经理望而却步。
毕竟,滚石不生苔。你会在了解代码库的工作之前就频繁更换工作。
考虑一下:让一个新员工达到能够为团队带来净正面影响的水平,通常需要6个月或更长时间。
在那之前,新员工实际上是对公司资源的负担,消耗他们的同事的时间和精力,帮助他们融入团队、找到代码库的方向并修复他们的错误。
大多数雇主是风险规避者
假设一个经理雇用了错误的开发人员。想一想这对团队有多糟糕。
平均来说,在一家公司填补一个开发人员职位需要大约3个月的时间。雇主首先需要:
- 获得上司批准雇佣开发人员的预算
- 编写工作描述
- 在招聘网站上发布工作并与招聘人员沟通
- 筛选简历 – 其中许多将是缺乏努力的候选人,他们盲目地申请尽可能多的工作
- 开始面试过程,可能涉及将候选人飞到城市并安排住宿
- 多轮面试,涉及许多团队成员。对于某些雇主来说,这是一个数天的过程
- 选择最终候选人,并谈判一个聘用提议…
- 然而许多候选人根本不会接受提议
- 签订合同并进行员工入职
- 使他们可以访问敏感的内部系统
- 介绍他们给团队成员,并确保他们之间相处得不错
- 数月的非正式培训,员工需要了解一个服务或遗留代码库的一部分
- 最后,让他们深入了解团队的工作方式
简而言之 – 非常辛苦的工作。
现在想象一下,在完成所有工作后,新员工说:“嘿,我刚从另一家公司接到了更高的报价。拜拜,哟。”
或者想象一下,员工不可靠,经常在工作日开始后几个小时才出现。
或者想象一下,员工在未经治疗的药物、酒精或赌博成瘾、愤怒问题方面有困难 – 或者竟然是一个消极攻击性的人,破坏团队。
现在你不得不重新开始整个过程,寻找该职位的新候选人。
招聘很难。
所以你可以看到为什么雇主们对风险持谨慎态度。他们中的许多人会推让看似合格的候选人,直到找到一个他们觉得99%确定的人。
由于雇主对风险持谨慎态度,求职者会受到影响
如果你认为招聘很难,等你听到求职过程的情况。你可能已经对此非常熟悉。但以下是一些情况…
- 你必须准备好你的简历。在此过程中,您将不断对您的求职过程进行反思。
- 您必须在网上寻找工作机会,研究雇主,并评估他们是否适合您。
- 大多数工作机会将会导致网页表单,您必须一遍又一遍地重新输入您的简历,希望该表单不会因为服务器错误或JavaScript验证错误而崩溃。
- 一旦您提交这些职位申请,您必须等待雇主处理。一些雇主收到如此多的申请,以至于他们无法手动审查所有申请。(仅Google每天收到9,000份申请。)雇主会使用软件筛选申请。内部招聘人员平均每张简历花费6秒钟的时间。您的申请往往甚至不会被人工审核。
- 您可能永远都不会从公司那里听到任何消息。他们没有动机告诉您为什么拒绝您(他们不希望您提起歧视诉讼)。如果幸运的话,您可能会收到其中一封“我们选择与其他候选人合作”的电子邮件。
- 您投递这些工作的时间,潜在地每周都会花费数小时,心理上非常疲惫,而且当然是无偿的。
哇。所以你可以看到,对于雇主,尤其是对于求职者来说,招聘过程是一个噩梦。
但是,如果您坚持下去,最终会得到工作机会。而且当机会来临时就会像雨后春笋。
以下是一位freeCodeCamp贡献者在12周时间内进行的求职数据:
随着工作机会的增加,起薪也越来越高。当然要注意,这是在旧金山的工作,这是世界上最昂贵的城市之一。
这位开发者的面试机会相当强大。他的谈判能力也很强。如果您有兴趣,可以阅读更多关于他的过程。
但正如我之前所说,通过旁门花了会更容易进入一家公司。
这就是我写这本书的原因之一。我不希望你继续排队等候这些雇主的前门。
如果您发展技能、建立人脉和声誉,您可以绕开很多职位申请过程。
在本书的整个过程中,我一直在教授您增加“幸运”得到工作机会的技巧。
“好运是准备遇上机遇的时刻。如果当机遇来时,您没有做好准备,那么您就不会有‘好运’。” – 奥普拉·温弗里
这就是为什么在本书中我鼓励您同时发展这三个领域,并在您找工作之前,从一开始就开始思考它们。
我的找工作的经历可能听起来有点傻。但这种情况比你想象的要频繁。
现实是:学习编程很难。
但懂得编程很重要。
在每个行业,几乎世界上每家公司的经理都在努力找出将他们的流程推向软件层的方法。
这就意味着需要开发人员。
你可能时不时听说科技行业裁员的大事。这些裁员往往影响的是非开发人员。但很多开发人员也常常失去工作。
为什么公司会裁员,而他们却花费了很多时间和金钱招聘和培训这些开发人员呢?除了破产的情况外,我不知道这个问题的答案。我也不确定是否有人知道。
越来越多的证据表明,裁员会破坏公司的长期价值。但实际上,许多首席执行官感受到投资者的压力,要进行裁员。并且当几家公司同时裁员时,其他首席执行官可能会跟风。
尽管有裁员,但大多数经济学家预计开发人员和其他与软件相关的工作岗位的数量将继续增长。例如,美国劳工统计局预计未来十年开发人员将增加15%。
就业市场可能现在很紧张,但很少有人预计这个低迷时期会持续下去。
我希望,有着强大的技能、强大的人际网络和强大的声誉,你将能够在艰难的就业市场中找到一份好工作。
希望有一天,雇主和有技能的员工能更容易地找到彼此——而不需要漫长而残酷的求职申请和面试过程。
开发人员面试过程中的预期
一旦你开始进行工作面试,你将会体验到可怕的开发人员面试过程和臭名昭著的编程面试。
一个典型的面试流程可能包括:
- 进行在线编程技能评估或进行“电话筛选”
- 如果你通过了第一轮面试,就会有第二轮基于电话或视频的技术面试
- 如果你通过了前两轮面试,就会有一次前往公司办公室的“现场”面试。这通常涉及与人力资源、招聘经理和普通员工进行多次面试。
在整个过程中,你将面临考察你的问题,测试你的问题解决能力、算法和数据结构、调试和其他技能。
面试官可能让你在代码编辑器上解决这些编码问题。但通常你需要站在白板前手写解决方案。
要记住的关键是,面试官不只是期望你给出正确答案。他们还想要了解你的思维方式。
他们想知道:你是否理解编程和计算机科学的基础知识?或者你只是机械地复述你记住的一堆解决方案?
现在,练习算法和数据结构是一种有效的方法。但你还需要能够边写解决方案边大声思考,并解释你的思维过程。
练习时最好边编程边大声自言自语。或者,如果你感到有冒险精神,可以在直播平台上直播自己的编程过程。
Twitch有很多“直播编程”频道,人们可以在观众面前“公开学习”,通过构建项目来学习。作为额外的好处,如果你愿意像这样展示自己,这也将帮助你建立自己作为开发人员的声誉。
在白板面试中,还有一点要记住:你的面试官。他们不只是坐在那里等你结束。他们一直都在和你待在一起,有意识和无意识地观察和评估你。
尽量使面试过程对你的面试官更有互动性。微笑并时不时进行眼神交流。试着观察他们的肢体语言。他们是否放松?当你解释某些问题时,他们是否点头表示同意?
你的面试官可能知道他们想在你的代码中找到什么。所以看看你是否能从他们那里得到一些提示。通过大声地向自己提问或提出观察,你可能能够引起面试官的关注,并让他们觉得在这个过程中参与其中。
你希望你的面试官喜欢你。你希望他们支持你,这样他们可能会忽略你编程技能的一些不足,或忽视你在代码中可能犯的一些错误。
你正在向雇主推销自己作为一个工作候选人。确保你的面试官感觉他们得到了一份好交易。
对于可能需要通过的行为面试,同样要记住这一点。这些面试更多地涉及的是你的“文化匹配”,而不仅仅是你的编程能力(我希望我能告诉你这意味着什么,但每个经理对此的定义略有不同)。
在这些行为面试中,你需要说服面试官你有很强的沟通能力。
能流利的运用你面试的语言并熟悉相关行话肯定会有帮助。你可以通过定期收听技术播客(比如freeCodeCamp播客)来学到很多。
你的面试官试图建立的一个重要点是:你是否冷静且善于与他人合作?展示这一点的最好方式就是保持礼貌,不使用粗言秽语,也不偏离主题。
你不想因为与无关的话题进行辩论,比如体育竞争。我也建议不要试图纠正面试官,即使他们说的事情你认为是愚蠢或错误的。
如果你对这家公司有不好的感觉,你不必接受他们的工作邀请。雇主经常会放弃候选人。作为候选人,你也有权利放弃一个雇主。面试本身可能不是解决冲突的最佳时机。
我应该在我第一份开发者工作中协商薪资吗?
试图向上协商起薪通常不会有任何损失,只要你礼貌地这样做。
关于如何协商开发者的工作报价薪资,我已经写了很多内容。
基本上,谈判更高的起薪的关键在于你拥有多少杠杆。
你的雇主有工作要做。你的雇主有多么需要你为他们工作?他们还有其他选择吗?
而你需要收入来生存。你还有其他选择吗?你有备用计划吗?
如果你从另一个雇主那里获得了一份支付一定金额的工作报价,你可以将其作为协商薪资的杠杆。
如果你的最佳备选计划是回校继续深造… 那个不是特别强大的杠杆,但总比没有好。你可以在薪资谈判过程中提到它。
回想一下我之前描述的漫长招聘过程。雇主在与候选人达成工作报价之前必须经历至少十几个步骤。他们已经计划让你协商,不会对此感到惊讶。
现在,如果你和我一样处在一种突然被公司提供工作的情况下,你可能会觉得在协商时感到尴尬。
我承认,在我上面讲述的事情中,当我的经理给我提供工作时,我没有协商。
回顾起来,我应该协商我的薪酬吗?可能吧。
我有杠杆吗?可能没有太多。我的备选计划就是继续参加黑客马拉松比赛,继续在公共图书馆里啜饮茶水和编码。
也许我本可以协商,多要一些时薪。但在他们给我工作的那刻,薪酬是我最后考虑的事情。我对能成为一名专业开发者感到兴奋。
顺便说一下,一旦你在一家公司工作了一年左右,你可能会想要提薪。我已经详尽地写了关于如何作为开发者要求加薪的文章。但归根结底,这取决于同样的事情:杠杆。
你在开发者求职中是否应该使用招聘人员?
是的。如果你能找到一个招聘人员帮助你找到第一份开发者工作,我认为你应该这样做。
我已经详细讲解了为什么招聘人员是你工具箱中被低估的工具。
很多雇主会给招聘人员支付一个介绍费来推荐高质量的求职者。
招聘人员的激励与你作为求职者的目标是一致的:
- 因为他们根据你的起薪获得报酬,所以他们有动力帮助你协商尽可能高的起薪。
- 他们安排的候选人越多,越快安排上工,他们赚的钱就越多。所以他们会希望帮助你尽快找到工作,然后继续寻找其他求职者。
- 因为他们只有在你作为员工成功并至少工作90天后才能得到报酬,所以他们会确保你在能力上合格,适合公司的文化。
话虽如此,如果招聘人员要求你为任何事情付钱,那是一个警示信号。
并非所有的招聘人员都是一样的。在与招聘人员合作之前,请进行一些调查研究。即使他们最终是由雇主支付报酬,你仍然投入了时间来帮助他们为你找工作。而时间是宝贵的。
说到时间,你可以在准备找工作的同时开始赚钱编程 – 这就是找一些自由职业客户。
如何找到自由职业客户
我鼓励新开发者在他们开始找工作之前尝试找一些自由职业客户。以下是三个好处:
- 找到自由职业客户要比找到全职工作容易得多。
- 自由职业工作更少风险,因为你可以在白天工作的同时进行。
- 你可以更早开始赚钱编程,并且更早开始建立你的专业工作作品集。
找到自由职业客户比找到开发者工作要容易得多。为什么会这样呢?
想想小型地方企业。可能只是一家经营餐厅的家庭。或者商店。或者水暖公司。或者律所。
这些企业有多少可以通过拥有一个互动网站、后端管理系统以及自动化常见工作流程的工具而受益呢?大部分都可以。
现在,有多少这些公司能够负担起全职的软件开发人员来构建和维护这些系统呢?不多。
这就是为何需要自由职业者的原因。他们可以以经济的、案件为基础的方式工作。一个小企业可以雇佣一个自由职业者来完成一个项目,或者雇佣他们短期工作。
如果你正在积极建立你的人脉网络,你可能会遇到一些成为你客户的人。
例如,你可能会遇到一个想要更新网站的当地会计师。可能还希望能够安排咨询,或接受信用卡支付账单的功能。这些是小型企业可能要求的常见功能,你可能会在实施它们方面变得相当擅长。
你也可能会遇到需要ERP系统、CRM系统、库存系统或无数其他工具的小企业经理。
在许多情况下,你可以部署和配置一个开源工具给他们。然后你只需教他们如何使用该系统。并向他们收取每月的服务费用,以保持你的”随叫随到”并随时准备解决可能出现的问题。
自由职业工作应该使用合同吗?
你会想要找到一个标准的合同模板,进行个性化定制,并请律师批准。
让本地面包店与你签订合同只是为了帮助他们更新网站或社交媒体存在感可能会感到尴尬。但这样做将使整个交易感觉更专业,而不仅仅是口头协议。
一个小企业不太可能因为几千美元的事情将你告上法庭。但在这种情况下,你会庆幸自己签署了合同。
自由职业工作我应该收取多少费用?
我会将你在白天工作中的收入作为基准,计算你的小时工资,并翻倍。这听起来可能是很多钱,但自由职业工作要比正常工作难得多。你需要学习很多东西。
或者,你可以一次性收费。”我将花费1000美元为您部署和配置这个系统。”
只要确保指定一个你愿意维护项目的时间范围。你不希望人们在3年后给你打电话,期望你回来修复一个已经没有人维护的系统。
如何确保自由职业客户支付我报酬?
许多其他自由职业者 – 包括我自己 – 使用这种简单方法:在开始工作之前先要求你的报酬的一半。当你证明你已经完成了一半的工作时,再要求另外一半的报酬。
在实际完成项目之前,总是尽量在收到全部费用。这样,客户就无法用报酬来对你施加压力,并试图在你身上多做额外的工作。
如果你已经收到了全部报酬,那么你为客户所做的额外工作将传递这样的信息:”我正在超额履行义务为您服务”。
这与:”哎呀,你会给我做这么多工作付钱吗?”的感觉完全不同。
我应该使用Upwork或Fiverr这样的自由职业网站吗?
如果你在一个农村地区,并且找不到当地的客户,你可以尝试一些自由职业网站。但否则我不会过分关注它们。以下是原因:
当你试图在自由职业网站上获得合同时,你要与全世界的自由职业者竞争。其中许多人生活在比你低得多的城市。其中一些人甚至并不真正在意他们的声誉,可能愿意提供次品的工作。
在某种程度上,这些网站促进了”将底价”的现象,通常将工作以最低价格提供的人得到了工作。
如果你转而专注于通过你自己的本地网络找到客户,你就不必与这些国外的自由职业者竞争。
对于那些寻求自由职业开发者帮助的人也是一样。如果你想雇佣自由职业者,我强烈建议与那些你可以与面对面会面的人合作,与你的社区有联系的人。
那些在你的城市居住了几年,并且经常参加与你相同的社交聚会的人,他们更不太可能试图利用你。如果你和你的对方都关心他们的声誉,那么你们都会投资于一个有效的合作伙伴关系。
你们每个人可以成为对方案例研究中的成功故事。
自由职业就像经营一个一人公司,这意味着有很多隐形工作。
不要低估经营自己的自由职业开发实践中涉及的”隐形工作”的数量。
首先,你可能想创建自己的法律实体。
在美国,最常见的方法是创建一个有限责任公司(LLC)并作为该公司开展业务 – 即使只有你一个人在那里工作。
这可以简化你的税务问题。如果不幸犯下错误并被客户起诉,你的法律实体可以帮助保护你的个人责任,以便进入破产的是你的LLC,而不是你个人。
你还可以考虑购买责任保险以进一步保护自己。
请记住,自由职业工作结束时,你通常必须在年底支付税款,所以一定要为此做好储备。
要创建你的LLC,你当然可以在网上找到文件模板,并自行申请。但是如果你是认真对待自由职业的,我建议与一位小型企业律师和/或会计师商讨,确保你正确地建立了一切。
何时停止自由职业,开始找工作?
如果你能够通过自由职业支付生活费,你可能只想继续这样做。随着时间的推移,你甚至可能能够建立自己的软件开发机构,并雇佣其他开发人员帮助你。
但是,如果你渴望稳定的开发者工作,你可能会很幸运。如果你坚持与自由职业客户合作足够长的时间,他们可能会转为全职工作。在某个时候,对客户而言,只要以较低的小时费率提供给你全职工作可能是经济上合理的。你获得了每周40小时工作的稳定性,他们获得了你的全职技能。
当你找到工作时,你甚至可能保留一些自由职业客户。这可以作为你收入的一个额外来源。但要记住,正如我们将在下一章中了解到的那样,你的第一份开发者工作可能是一个占据所有时间的责任。至少起初是这样。
作为职业开发者的第一年会有多激动人心呢?好吧,让我们来谈谈这个。
第五章:如何在你的第一份开发者工作中取得成功
“港口的船是安全的。但船不是为此而建造的。” – Grace Hopper,数学家,美国海军准将,计算机科学先驱
一旦你找到了第一份开发者工作,真正的学习就开始了。
你将学习如何与其他开发人员高效地合作。
你将学习如何遇到庞大的旧代码库。
你将学习版本控制系统,持续集成和持续交付工具(CI/CD),项目管理工具等。
你将学习如何在工程经理的指导下工作。如何在截止日期之前完成工作。以及如何在工作中处理许多模棱两可的问题。
最重要的是,你将学习如何管理自己。
你将学习如何突破影响我们所有人的心理障碍,比如冒名顶替综合症。你将了解自己的极限,以及如何略微超越它们。
故事时间:三十来岁的教师如何在他的首份开发工作中取得成功?
上一期的故事时间:昆西在当地科技初创企业找到了他的首份开发工作。他将成为维护庞大而复杂的代码库的众多开发者之一。而他对自己要做什么一无所知……
我早上4点醒来,无法再入睡。我试过了。但我的胸口有一种灼烧感。这是一种焦虑。惊恐。
我在教育领域工作了十年。先是辅导员,然后是教师,再后来是学校主任。
在几个小时后,我将从头开始,作为一名开发者工作。
我过去的学习经历,过去的成功是否在这个新职业中有任何作用呢?
当我感到焦虑时,我总是会去跑步。我飞奔下山,我的头灯在黑暗中晃动。当我到达海滩时,太阳从树梢升起,我在海洋旁边跑步。
当我回到家时,我的妻子已经出门上班了。她告诉我不要担心。她说,“即使你因为不知道自己在做什么而被解雇,我仍然会爱你。”
当我到达新办公室时,没有人在那里。作为一名教师,我习惯于早晨7:30准时到校。但我很快意识到大多数软件开发人员并不会那么早开始工作。
所以我盘腿坐在入口大厅,使用我的小型笔记本电脑进行编码教程。
一名员工走向我,脸上带着紧张的表情。她可能以为我是一个擅自进入的人。但我向她保证,我确实在她公司工作,并说服她让我进去。
穿过空荡荡的开放式办公室,只有出口标志的灯光指引着我,感觉非常离奇。
我在一个空旷的站立式办公桌上安装好我的小型笔记本电脑,完成我的编码教程。
过了一会儿,周围的灯光亮了起来。我的老板已经到了。起初,他没有注意到我的存在。他只是坐在他的办公桌前,用他的机械键盘迅速敲击着键盘。
“拉森,”他终于说道。“准备好迎接你的大开工日了吗?”
我并没有准备好。但我想要表现出自信。所以我说出了《小小过家家》(Big Trouble in Little China)这部我最喜欢的80年代电影中的经典台词:“我天生就准备好了。”
“太好了,”我的老板说。“让我给你弄一台电脑。”
“哦,我已经有一台了。”我敲打着我的200美元款式。 “这个宝贝正在运行Linux Mint,我已经按照自己的需求自定义了我的.emacs文件……”
“我们都使用Mac。”他走到一个储藏室。他在里面翻找了一会儿,然后出现了。“给你,这是一台三年前的型号,但应该可以用。我们将它恢复到出厂设置。”
我想要说我已经熟悉我的设置,并且使用它可以工作得更快,但他无法接受。
“我们都使用同样的工具。这样做合作起来更容易。约定大于配置,你知道的。”
那是我第一次听到“约定大于配置”这个短语,但在接下来的几天里,它将经常被提及。
接下来的几个小时里,我配置了我的新工作电脑,其他开发人员也渐渐走了进来。
我们开始了我们的团队“站立会议”,当时已经接近上午10点钟。我们都站在白板旁边的一个圈子里。轮到我们报告当天的工作。
每个人都简洁准确地报告状态。
轮到我时,我开始介绍自己。我已经足够焦虑了,这时走进来的竟然是那个跑过圣巴巴拉创业活动的超级马拉松选手迈克。他正在嚼着一些小胡萝卜,当天早上已经跑了大约30英里。
在我完成之后,麦克说话了,欢迎我,并说他在一些活动中见过我。然后,他简单介绍了一下他正在开发的某个功能,只用了15秒。
整个会议只持续了大约10分钟,然后每个人都回到了自己的办公桌上。
最终,我成功地把公司的代码库运行到了我的新笔记本电脑上。它是一个经过5年发展的Ruby on Rails应用程序。我运行了rake stats
命令,发现代码有几百万行。我感到不知所措。我怎么可能理解这么多代码呢?
我的邻居,一个粗鲁而有胡须的开发者说道:“嗯,绝大部分都是包。你要实际处理的代码只有大概10万行。别担心,你会逐渐适应的。”
我吞了口口水,心里想着:“那可比几百万行少多了。这还好。”
“顺便说一下,我叫尼克”,他自我介绍道,“如果你需要帮助,随时告诉我。我在这个代码库里面摸爬滚打了好几年了,所以我应该能帮到你。”
在接下来的几天里,我向尼克提了很多关于我遇到的每个内部系统的问题。
最后,尼克开始将聊天状态设为“代码模式”,戴上降噪耳机。他稍微转过身,身体语言表达着:“离我远点,我也要做一些自己的工作。”
这是我关于团队动态的早期教训之一。你不希望因为问太多问题而让人觉得你没完没了。你需要更擅长自主学习。
但这是一个庞大的代码库,而且几乎没有文档,只有内联注释和一个相当简单的团队维基页面。
由于这是一个只有我周围的开发人员在使用的闭源代码库,我无法在Stack Overflow上找到特定逻辑所在的位置。我只能在黑暗中摸索。
我开始轮流找我周围的邻居询问特定问题。但我觉得我很快就会让他们对我作为一个队友的热情消失殆尽。
我过度纠正了自己。我变得害羞,连一些简单的问题都不敢问。我给自己定了一个规矩,如果卡住了我会试着自己解决2个小时,然后再寻求帮助。
在某个时刻,经过几个小时的挣扎,我终于寻求了帮助。当我的经理发现我整个早上都卡住了,他问道:“你为什么不早点寻求帮助?”
另一个困难是理解代码库本身-“单体”以及众多微服务。
这个代码库有数千个单元测试和集成测试。每当你提交新的代码贡献时,你也应该编写测试。这些测试有助于确保你的代码执行了应该执行的操作,并且不会破坏任何现有功能。
我经常会通过提交我认为经过充分测试的代码来“破坏构建”,结果会导致我没考虑到的应用程序的某个部分出现问题。这让整个团队感到沮丧,因为在根本问题修复之前,他们无法合并自己的代码。
构建(build)每周都会多次失败。而且不只是我一个人犯这种错误。但我感觉就好像是我一个人这样。
有些日子,我觉得自己不适合成为一个开发者。我会对自己说:“我在做什么呢?我是一天早上起来就决定要成为一个开发者的?”
我越来越频繁地休息一会儿离开电脑。办公室里有一个摆满零食的厨房。我会找借口去拿一些零食。任何东西都可以拖延我对自己完全不了解的压倒性感觉。
最初的几个月非常艰难。在早上的站立会议上,感觉每个人都在快速进展。解决问题和发布功能。我觉得自己无话可说。我还在处理昨天的同一个功能。
每天早上醒来准备上班时,我会感到恐惧。“今天他们会解雇我。”
但是当我去上班的时候,每个人都很友善,很有耐心。如果我真的陷入困境,我会寻求帮助。我会取得一些进展,也许修复一两个错误。
我在遍历代码库时越来越快。当我的代码出错时,我读取堆栈跟踪的速度也越来越快。我比以前更快地发布新功能。
每次老板叫我进办公室时,我会心想:“哦不,我是对的。今天我要被炒鱿鱼了。”但是他只会给我分配一些更多的错误修复或功能开发。哎呀。
真是太离奇了 – 我吓坏了,心里想,我要被炒了,而他却毫不知情,一切似乎都没问题。
当然,我之前听说过”冒牌者综合症”这个词。但我没有意识到我正在经历的就是这种症状。毫无疑问,我只是在受折磨,因为我是”烂在编码上”的那种症状,对吧?
有一天我坐在尼克旁边,他看起来很焦躁。我主动提出去厨房给他拿一罐苏打水。
回来后,他打开罐子,喝了一口,歪在椅子上,凝视着充满代码的显示器。”这个错误,伙计。花了三个星期来修复这一个错误。这个问题让我如此头疼,以至于我睡觉都在调试它。”
“三个星期来修复同一个错误?”我问道。我从未听说过这种事。
“有些错误比其他错误更难解决。这是那种非常狡猾的错误之一。”
感觉就像有人用鲑鱼拍了我一巴掌。我将我的工作视为一块块任务。好像修复一个错误应该只需要半天的时间,如果超过这个时间,就说明我做错了什么。
但是尼克只是一个从加州大学获得计算机科学学位、在同一个代码库上工作多年的人,他对一个错误困扰了三个星期。
也许我对自己太苛刻了。也许我修复的一些错误不一定是”半天的错误”,可能是”两天或三天的错误”。是的,我经验不足,速度慢。但即使如此,也许我对自己设立了不切实际的标准。
毕竟,当我们为功能预算时间时,有时我们会有”五天功能”甚至”两周功能”。虽然我们没有为错误这样做,但它们可能也是类似的。
我回家后,阅读了更多关于冒牌者综合症的资料。我读到的解释了我许多的焦虑。
在接下来的几个月里,我持续为代码库开发功能。我继续与团队合作。这仍然是困难且令人费脑子的工作。但开始变得稍微容易一点了。
每天午餐时,我和队友打桌游互相交流。有一周,我们举办了全公司范围的国际象棋锦标赛。
几轮比赛后,我与CEO对局。
CEO有一种古怪的下棋风格。他使用了一种很少有认真国际象棋选手会选择的愚蠢开局。我能够在比赛早期取得领先。
但在接下来的几步中,他慢慢地重新获得对局的控制。最终他占上风,击败了我。
当我问他如何在经营一家公司的同时保持他的象棋技巧时,他说:”哦,我不费心思很久地来下国际象棋。我一年只下一两次而已。”
然后他停顿了一下,手停在他面前,仿佛准备发表一个讲座。他说:”我叔叔是一个富有竞争力的国际象棋选手。他给了我一条仅有的建议: 每当对手移动时,放慢速度,试着从他们的角度去理解对局 – 他们为什么会做这个动作?“
然后他鞠了一躬,离开去开会了。
这些年来,我对他所说的事情思考了很多。我意识到这个建议不仅适用于国际象棋,还适用于任何对抗性的场景。
如果你不断地做一项任务,你应该自动化它
我在软件开发方面学到的另一个教训是:作为团队中最初级的人,我经常被分配那些其他人不想做的”苦力活”。其中一个任务就是成为”构建监督者”。
每当有人破坏了构建过程,我会拉取我们主要分支的最新版本,使用git bisect
来尝试找出导致构建破坏的提交。
我会打开那个提交,运行测试,弄清楚出了什么问题。然后我会给破坏构建的人发送一条消息,告诉他们需要修复的内容。
我做这件事非常快。在充满困惑的错误报告和模棱两可的功能请求的一天里,我期待构建出错。这会让我有机会快速感觉到自己的有用性。
没过多久,团队中有人说:“由于构建经常出错,我们应该将其自动化。”
我什么也没说,但我感到有些防御。这主意很糟糕。一个脚本怎么可能像我这样的肉体开发者一样好地找到罪恶的提交?
过了几天。但果然,我的一个队友编写了一个脚本。我不再是构建管理员了。
看到构建失败的消息,然后片刻后看到一条消息说是哪个提交破坏了构建,需要谁去修复,这感觉很奇怪。
我感到愤愤不平。我什么也没说,但我心里在想:“那是我的工作。那个脚本夺去了我的工作。”
但当然,现在回想起来我笑了。我想象着自己,现在已经40多岁了,每周还要几次抛下一切,成为构建管理员。
因为实际上,如果一个任务可以自动化 – 如果你可以将其分解为计算机可以可靠完成的离散步骤 – 那么你应该考虑将其自动化。
你可以用你的时间做更有趣的工作。
来自村长们的教训
我从团队中的其他人那里学到了很多东西。我从Mike那里学到了产品设计概念。他带我去沙滩上跑步,并教我如何用前脚掌跑步,让脚的前半部分在脚跟之前着地。这对关节稍微好一些。
而我从Nick那里学到了敏捷软件工程概念。他帮我从公司图书馆里挑选了一些好的软件开发书籍。他甚至邀请我参加了他的新房聚会,我见到了他的孩子们。
在为公司工作了大约一年后,我觉得是时候尝试自己的运气,围绕在线学习建立一些项目。我与首席技术官坐下来告诉他我要离开了。
我说:“非常感谢你们雇佣我,尽管我显然是公司里最差的开发者。”
他只是笑了笑,说:“当然,当你加入时,你是团队中最差的开发者。我会说你现在仍然是团队中最差的开发者。”
我坐在那里尴尬地微笑着,眨着眼睛,不确定他是不是生气我要走。
然后他说:“但那很聪明。你很聪明。因为你总是想成为乐队中最差的音乐家。你总是想周围都是比你更优秀的人。这是你成长的方式。”
两周后,我提交了当天的代码更改,并交接了我未完成的工作。我将我的Mac恢复到出厂设置并交给了我的经理。
我和我的队友握手,走出门,走进加利福尼亚的夜晚。
我迅速行动,安排自由职业合同以维持生计。我在旧金山市场区技术的核心区域对面找到了一间公寓。
我现在是一名专业开发者,已经有一年的经验。
我准备做新的梦想和采取新的行动。
作为开发者的第一年教训
在我作为一名专业开发者的第一年里,我做对了很多事情。我给自己打个B-。
但如果我有机会重新开始,有些事情我会做得有所不同。
这里有一些小贴士。希望这些能最大化你的学习并减少你的痛苦。
把你的自我放在门外
许多进入软件开发领域的人将从最底层开始。你可能拥有的一个职位是“初级开发人员”。
对于一个中年人而言,在你的职称中加上“初级”这个词可能会感觉有点尴尬。但凭借一些耐心和努力,你可以超越它。
我每天都面临一个问题 – 我拥有10年的专业经验。我不是一个初级员工。是的,我对开发是新手,但我在教学甚至人员管理方面已经非常有经验。(我曾管理过我最近的教学工作中的30名员工。)
然而 – 尽管有我过去的工作经验 – 我仍然是一个初级开发人员。我仍然是一个新手。一个初学者。一个菜鸟。
尽管我很想尖叫“我曾经是老板 – 我不需要你来看管我”,但事实是我确实需要有人看管。
如果我意外破坏了生产环境怎么办?如果我在应用程序中引入了安全漏洞怎么办?如果我抹掉整个数据库怎么办?或者加密了重要的东西然后丢失了密钥怎么办?
这些灾难经常发生。
事实是,作为一名新手开发人员,你就像在中国商店里的一头公牛,试图小心行走,但却把一切都撞得粉碎。
不要让自己对队友变得不耐烦。抵制提及你的高级学位、你的工作获得的奖项,或者那次市长给你城市的钥匙的诱惑。(好吧,也许最后那个从未发生在我身上。)
不只是因为这样会让你难以相处。因为这会让你分散注意力,无法专注于手头的任务。
在我开发人员生涯的头几个月里,我利用过去的成就作为一种安抚剂。“是的,我的代码很糟糕,但我在教英语语法方面非常出色。我提到我以前曾经经营过一所学校吗?”
当你的手指在键盘上,眼睛盯着代码编辑器时,你必须放下过去的自己。你可以在今晚沉醉于昨天的成就之中,当今天的工作完成后。
但是现在,你需要接受作为一个新手再次出现的所有情绪。你需要专注于手头的任务,完成工作。
这可能只是冒牌综合症在作祟
我认识的几乎每个人都曾经有过冒牌综合症。那种感觉你不属于这里。那种感觉你的队友随时都会看到你糟糕的代码,揭示你不是一个“真正的开发人员”。
在某种程度上,这种感觉不会消失。当你尝试做一些新事物时,它总是在你的脑海中潜伏,准备在你头脑清晰时出现。
“你能帮我解决这个错误信息吗?”“嗯…我不确定我是最适合问的人。”
“你能和我一起做这个功能的配对编程吗?”“嗯…如果你找不到更合适的人的话,我猜我可以。”
“你能在即将举行的会议上发表演讲吗?”“嗯…我?”
我曾经遇到过一些资深工程师,他们在职业生涯的十多年里偶尔仍然受到冒牌综合症的困扰。
当你感到不够格或准备不足时,这可能只是冒牌综合症。
当然 – 如果你把手术刀递给我,说:“帮我做心脏手术”我会感到像一个冒牌货一样。从某种程度上来说,如果你确实在某个领域有所不足,感到超纲是完全合理的。
问题是,如果你一直在练习软件开发,你也许能够做某件事情,但却还是莫名其妙地感到焦虑。
我不是医生。但我的直觉是 – 对于大多数人来说 – 冒牌综合症会随着时间的推移逐渐减弱,随着你获得更多的实践经验和建立更多的自信。
但它可能随机出现。我不怕承认,当我做一项新任务,或者一段时间没有做某件事时,我有时会感到冒牌综合症的刺痛。
关键是要接受它:“这可能只是冒牌综合症在作祟。”
然后继续前进。
寻找你的部落。但不要陷入部落主义陷阱
当你得到第一份开发人员工作时,你将与其他开发人员一起工作。耶 – 你找到了你的部落。
你将花很多时间与他们在一起,你们可能开始感觉像一个紧密的团队。
但不要忽视你周围的非开发人员。
在我上面的故事中,我提到了Mike,这位也组织创业活动的产品经理。他是“非技术性的”。他对编码的了解充其量是有限的。但我敢说,我从他那里学到的东西与公司中的任何其他人一样多。
你可能会与其他部门的其他人一起工作——设计师、产品经理、项目经理、IT人员、QA人员、营销人员,甚至是财务和会计人员。你也可以从这些人身上学到很多东西。
是的,你应该专注于与团队中的其他开发人员建立牢固的联系。但要保持好奇心。在午餐室或公司活动中与其他人交流。你永远不知道谁会成为帮助你提升技能、扩大人脉或塑造声誉的下一个人。
不要过早地变得太舒适和过于专业化
我经常向那些刚开始编程之旅的人提供这样的建议:“学习通用编码技能(JavaScript、SQL、Linux等),然后在工作中再专攻。”
这个想法是,一旦你了解了最常用的工具是如何工作的,就可以继续学习那些不太常见的工具。
例如,一旦你学会了PostgreSQL,就可以很容易地学习MySQL。一旦你学会了Node.js,就可以很容易地学习Ruby on Rails或Java Spring Boot。
但有些人在工作中过早地进行专业化。他们的老板可能要求他们“负责”某个API或功能。如果他们在这方面做得很好,他们的老板可能会继续给他们类似的项目。
你只管理自己,但你的老板管理很多人。他们可能太忙了,没有时间充分了解你的能力和兴趣。他们可能把你视为“XYZ的人”,只给你那方面的任务。
但你知道自己擅长什么,对什么感兴趣。你可以尝试主动参与自己不熟悉的项目。如果你能让老板分配这些项目给你,你将能够继续扩展自己的技能,并有可能与新团队合作。
记住:你的老板可能负责你在工作中的表现,但你应该对自己整个职业生涯的表现负责。
接受既能履行对雇主的义务,又能为你的长远职业目标打下良好基础的项目。
结语:你能做到
如果有一条信息我想在这里留给你,那就是:你能做到。
你 能够 学会这些概念。
你 能够 学会这些工具。
你 能够 成为一名开发人员。
然后,有人给你钱让你帮他们编写代码的时候,你就会毕业成为一名专业开发人员。
学习编程并找到第一份开发工作是一个令人生畏的过程。但不要被吓倒。
如果你坚持下去,最终你会成功。这只是一个练习的问题。
完成你的项目。向朋友展示。为朋友做项目。
拓展你的人脉。帮助你沿途遇到的人。善有善报。你将得到你应得的回报。
现在还不晚。生命很长。
多年后回望这一刻,你会为自己采取行动而感到高兴。
计划需要很长时间。计划会有不确定性。
但最重要的是,保持回到键盘的动力。继续参加活动。与朋友分享你的成功。
正如老子曾经说过:
“千里之行,始于足下。”
通过完成这本书,你已经迈出了一步。嘿,你可能已经为实现目标迈出了很多步骤。
势头至关重要。所以要保持你在过去几个小时里已经建立起来的前进势头。
从今天开始编写你的下一个项目。
永远记住:
你能做到。
Leave a Reply