六个月前,我为此预留的银行存款是 $0,没有计算机科学学位,浏览器里开着一个“如何成为开发者”的标签页。上周,我签下了我的第一份开发工作录用通知。
我写这篇文章不是为了向你推销训练营或课程——这两样我都没买。我写它是因为几乎所有我被告知的关于如何拿到第一份工作的说法,结果都成了干扰,让我偏离了唯一真正有效的那件事。
真正有效的那件事不是学更多东西。而是交付。
我以为这份工作是什么(以及它实际上是什么)
头六周我做了所有人告诉你要做的事。我看课程。我做练习。我用四个框架把待办事项应用重写了四遍。我还开始——这是最扎心的部分——刷 LeetCode 连续打卡,因为论坛上有人说那才是“真正的”开发者苦练的东西。
我每一天都很忙,却毫无进展。原因如下,而我花了长得令人难堪的时间才看明白:
规则是:教程教你跟随。而工作是要你做决定。你可以完成一百个教程,却从未真正做过一次决定——该构建什么、该砍掉什么、当东西突然坏掉且没有“下一课”按钮时该怎么办。
课程里的一切都被限定在让你不会失败的范围内。需求是固定的,答案是存在的,顺利路径是铺好的。工作中这些全都不成立。工作是模糊的需求、半可用的 API,以及用户做出你从未想象过的操作。我花了六周练习一个根本没人会为此招聘的游戏。
所以我放弃了教程,定下一条规则:我只构建陌生人能用的东西。
让我拿到工作的作品集(以及没让我拿到的那个)
我第一个“作品集”是三个仓库:待办事项应用、天气仪表盘,以及一个大家都爱克隆的网站的半成品克隆。标准配置。一出生就死了。从来没有招聘官打开过一个天气应用克隆后产生过任何感觉。
让我拿到面试的作品集是三个完全不同的东西:
- 为我表姐的美发沙龙做的一个小型预约工具——真实的预约、真实的客户、真实的“周六它坏了,我得在他们开门前修好”。
- 为一家靠纸质笔记本运营的本地商店做的一个库存追踪器。
- 我为自己做的一个小发票应用,后来有三个自由职业者开始用。
它们都不出彩作为代码。让它们在面试中起作用的是,每一个都有一个不是我本人的用户,以及一个关于生产环境出了岔子、我把它修好的故事。
规则是:招初级工程师的人不会问你学到了什么。他们问的是你交付了什么,是陌生人真正用过的东西。前者是可核查的,后者只是一种感觉。
我第一次说出“一个真实客户因为我的代码里的竞态条件重复预订了,这是我如何发现并修复它的”时,我看着面试官的姿态变了。那句话比我整份“技能”清单起的作用都大。这就是我学过这个和这事发生在我身上
的区别。
我如何在没团队的情况下交付真实应用(令人不适的部分)
这里有一部分有些人不会喜欢,我宁愿直说也不愿藏着:我不可能一边手写每一行代码一边学习基础知识,还在六个月内交付三个真实运行的应用。时间根本不够。让我能以那种速度前进的,是把“构建应用”和“理解应用”当作两份分开的工作。我会先快速让一个能运行、已部署的版本立起来——真实的数据库、真实的用户、真实的 URL——然后我会去读它、弄坏它,再重建那些我不理解的部分。先交付、后理解,与课程教的方式是反的,而这是唯一能让我保持动力的顺序,因为一个上线的东西是你没法对自己撒谎的东西。
规则是:一个有一个真实用户的已部署应用,一周教给你的东西比教程一个月教的还多——因为用户会做你发誓没人会做的事,而现在这是你的问题,不是讲师的。
重点从来不是“别学基础知识”。我在调试一个线上预订竞态时学到的基础知识,比我在任何课程里学到的都多。重点是这个线上应用就是课程,它按我需要的精确顺序制定了自己的教学大纲。
这六个月,说实话(只讲轮廓,不假装精确)
我不会给你一份虚假的逐日计划,因为我的计划并不干净,你的也不会。轮廓才是教训:
- 第 1–6 周:教程和 LeetCode。感觉很有成效。其实并没有。如果我能删掉的话,这就是我会删掉的部分。
- 第 7–14 周:第一个真正的应用(那个预约工具)。我把它丑陋地发布了,不停地弄坏它,公开地修复它。在这里学到的东西比在其他所有地方加起来还多。
- 第 15–20 周:又做了两个真正的应用,每一个都比上一个更快,每一个都有一个我能向面试官指出的真实用户。
- 第 21–26 周:开始投递。被拒了很多次。但每一次回电都追溯到同一件事——一个真实的应用,有一个真实的用户和一个真实的实战故事,而不是一张证书。
我后来数过:我得到的面试机会几乎全部来自那三个真实的应用。那些教程、那个连续打卡、我半途收集的证书——在决定是否录用我的那个房间里,它们一个都没被提起过。
规则是:一个有三个真实应用、有真实用户的作品集,在他们真正做决定的那个房间里,胜过一架子证书。证书说明你参加过。已发布的应用说明你能完成。
如果你正处在我六个月前的位置
你不需要我这条一模一样的路径。你需要的是停止做那件只是感觉像进步的事,开始做那件可被检验的事:
- 挑一件某个真实的人真正需要的东西。不是克隆项目。你姑姑的预约、你自己的发票、你团队那张本该做成应用的电子表格。越小越真实,越好。
- 在它还不好之前就发布它。一个有一个用户的线上 URL,胜过一个没有一个用户的完美仓库。尽早到令人尴尬地部署。
- 然后去理解你发布的东西。故意弄坏它。像读陌生人写的一样读你自己的代码。基础正是在那里最终扎根的。
- 留住那些实战故事。每一句“它坏了,我修好了”都是一句话,在面试中会比你的整个技能清单表现得更出色。
学位能让你通过一些筛选。我不会假装不是这样。但真正让你被录用的——在一个人做决定时那个房间里起作用的东西——是证据,证明你能把一件模糊的事变成现实,并在它坏掉时让它继续运行。
规则是:在你还是个初级时,看起来像高级的最快方式,就是已经发布过某个经受过真实用户接触而存活下来的东西。这你造不了假,而且你不需要学位就能拥有它。