How (not) to apply for a software job

Ben Hoyt

软件求职:千万别这么做

原文由 Ben Hoyt 发布,订阅该博客

我审阅过大量简历和笔试作答,其中很多都写得不怎么样。本文要说的,就是申请软件工程师岗位时有几件事千万别做。

我在 Canonical 工作(关于我们的招聘流程,请看文末的尾注),不过我觉得这些建议在任何公司求职时都适用。

其中大部分是关于写作的建议,写简历、求职信以及求职申请中其他需要动笔的部分时都用得上。事实上,我认为这些建议对任何非虚构写作都适用。

先说说背景:想想你的读者是谁——一位忙碌的招聘经理,或是一位被安排来审阅你(以及其他几百份)申请材料的工程师。他们只能依据有限的信息做判断,想招的是那些脱颖而出、真正做过东西、并且善于沟通的人。

别用 ChatGPT

我知道它只是个工具,但请先听我说完。一开始我对“别用 ChatGPT”是加了限定语的——“如果要用,就得小心用”。但我现在强烈建议:干脆别用。至少截至 2023 年 9 月,用它只会让你听起来像个机器人。

候选人刚开始(明显地)用 AI 写申请材料时,我会因为“作弊”直接把他们筛掉。后来我改变了做法:我把所有材料都当作人写的来评判,写得不好就淘汰。

问题在于,所有明显用了 AI 工具的稿件都很糟糕:语法也许无可挑剔,却枯燥乏味,而且几乎没有体现候选人自身的经历。

我们公司有一个相当开放的问题:“请描述你在软件运维和线上服务运行方面的经验”。下面是一个典型的 ChatGPT 回答:

我拥有 5 年软件运维和生产环境服务管理的经验。在之前的工作中,我在部署和维护生产服务方面发挥了关键作用,运用了 Python 和 Golang 等多种技术和工具。我成功负责了部署和发布管理流程,实施了稳健的监控方案以保障系统健康,并有效管理了各类故障,注重快速解决和根因分析。我的经验还包括为应对需求增长而开展的可扩展性建设,以及为提升系统性能所做的优化工作。

为什么说这段糟透了?因为它是华而不实、被动空洞的套话,没有任何具体细节。既不有趣,也没有个人色彩,几乎可以套在任何软件工程师身上。

对比一下这个生动、具体的回答:

我学编程是从给叔叔的汽修店做一个追踪汽车配件的网站开始的(用的是 PHP 和 MySQL)。我加了一个简单的健康检查,每分钟 ping 一次网站,出错就给我发邮件。进入第一份正式工作后不久,我用 Ansible 和 Python 脚本自动化了他们许多值班流程。最近,我所在的团队负责三个微服务,运行在用 Terraform 管理的 EKS 集群上。我为公司搭建了 Datadog 的日志和监控系统,并参与了与 DevOps 团队共同的值班轮换。

具体、生动、真实!当然还可以进一步改进,比如说明自动化给团队带来了什么帮助:“这把我们的部署时间从 2 小时缩短到了 15 分钟”。但即便如此,也已经比前面那个版本好太多了。

如果你不是以英语为母语,也完全没关系——比起完美无瑕却空洞的套话,我更想看到带有瑕疵却真实反映你经历的文字。

更好的提示词能让 ChatGPT 听起来更真实吗?能,更好的提示确实能改善措辞。但它不可能凭空编出基于你个人经历的文字。你当然可以用拼写和语法检查工具来润色,但请确保那终究是你自己写的东西。

别写华丽的空话

别写上面那种句子:“运用了 Python 和 Golang 等多种技术和工具”。你的重点会被淹没在一堆大词里。直接说“我用过 Python 和 Go”就行——审阅者会感谢你的简洁。

再举个例子,有位候选人的表述大致如下。他们:

  • 对 Java 有着出神入化的精通(他又不是James Gosling
  • 他们的征程就此开启(他又不是Bilbo Baggins
  • 他们巧妙地构建了程序(他又不是Stradivarius
  • 他们拓展了自己的专业造诣(不仅是专家,还是“扩展版”专家)
  • 他们精心打造了 Lambda 函数(我更喜欢手工定制的 Lambda)
  • 他们充分利用了 Spring Boot(难道不是仅仅用了它吗?)
  • 他们迅速适应(有点审美疲劳了)
  • 他们一丝不苟地阅读了文档(不错,我可以请他们来做校对)
  • 他们拥抱了面向对象编程(就像 90 年代的每个人一样)
  • 而他们带来了扎实的经验(但他们带来的是扎实的 Forth 经验吗?)

我怀疑这是 ChatGPT 写的,但也不确定——也许只是用了同义词词典。不管怎样,请别把形容词和副词开到 11 档。

我建议去掉那些夸张的修饰语,把上面那份清单改成这样:

  • 我熟悉 Java
  • 我开始做……
  • 我构建了……
  • 我学了……
  • 我编写了 Lambda 函数
  • 我用过 Spring Boot
  • 我适应了……
  • 我阅读了文档
  • 我使用面向对象编程(或者干脆删掉这句)
  • 我积累了经验

别光说,要展示!

这一点很简单:别告诉读者该怎么想你,直接展示你做过什么。上面那些糟糕的例子不仅是华丽空话的问题,更是光说不做的问题。

说“我巧妙地构建了程序”是在告诉读者该如何评价你;而写“我用 500 行 Java 实现了一个快速的 POSIX Make 子集”则是在展示你实际做出的东西。如果是开源项目,能附上 GitHub 仓库链接就更好了。

记住,你的读者是招聘经理,他想看到的是你具体完成过什么。

别写得太笼统

我们的另一个面试问题是“你会如何为线上服务设计和实现新功能?”

很多候选人(同样,可能是借助了 AI 工具)回答的却是这个问题:“教科书是如何定义软件开发生命周期的”。但我们想听的是自己的经验,用你自己的话讲出技术细节。

下面这段就过于笼统:

设计和实现新软件始于收集需求、编写规格说明、征求利益相关者的反馈,然后进行高质量的实现。实现完成后,自动化测试和人工 QA 很重要。接着我们部署软件,并确保做好监控。

不妨改成这样:

我喜欢简洁的规格说明和事前规划。比如在设计新的认证服务时,我写了一份 3 页的规格文档,其中包含架构图和 API 接口的简要说明。在部署到生产环境之前,我认为对真实服务器做负载测试很重要,所以我搭建了一个类似的预发布环境,测试它能承载多少并发请求。上线后,监控至关重要:我用过 Datadog,也用过 Prometheus 这类开源工具来发现和诊断问题。

总之,别写得太笼统。除非你写的是参数多态。(抱歉,没忍住。)

别玩行话宾果

这和华丽空话、内容空泛密切相关:尽量别用那些没什么实际意义的商业行话。我今天早些时候就看到这样一句:

进行了全面的数据解读与分析,以得出可执行的洞察,为客户创造价值。

除了听起来像是《办公室》里的讽刺台词,这句话基本什么也没说。几乎每个在电脑前工作的人都在“解读和分析数据”,也都希望“得出可执行的洞察”为客户创造价值。

堆砌行话在某些人看来也许显得聪明,但在我看来,这不过是掩盖了你其实没说什么的事实。

如果你是数据科学家,不妨这样说:

作为 Sunnyville 医院的数据科学家,我使用 Python 和 Pandas 分析来自医疗设备的大量数据(每天数 GB),从中发现异常,帮助医生改进手术室的操作流程。

这不仅说明了你的职责,还讲清了你所在的领域、使用的工具、你的“客户”是谁,以及你如何帮助他们。

别无视要求

你可能会觉得这还用说吗,但有些候选人似乎就是不擅长遵照要求。

比如,申请表上写着“为减少偏见,笔试作答请保持匿名”,却有人在开头就写上自己的全名,这可不是什么好信号。我们都会犯错,所以我不会仅因此就直接淘汰,但无视要求肯定不会给你加分。

一些简历小技巧

以上所有建议同样适用于简历。不过,针对简历还有几点额外的小技巧。

检查你的 GitHub 主页

如果你要附上 GitHub 主页链接,请确保上面有拿得出手的项目。如果只是些像 fork-of-popular-project-i-never-touchedrandom-university-assignmenthalf-baked-data-science-script 这样的仓库,那就干脆别放链接。

但如果你有两三个精心整理、令你自豪的项目,那就一定要放上链接。

展示你做过的东西

把关于 GitHub 主页的建议推广一下:展示你做过的东西。这是初创公司最看重的信号之一,对大公司同样有效。

如果是你自己做的项目,就附上它的网站或 GitHub 项目页。如果是对某个热门开源项目的重要贡献,用一两句话描述清楚,并附上你的 PR 链接。

即便是在闭源公司的工作,你也可以通过清晰具体地描述你负责的产品部分来展示成果。例如:

在 Shopify 工作期间,我重新设计了他们的 HTML 邮件模板,使点击率几乎翻倍,从 15% 提升到了 27%。

用英语(或要求的语言)写作

如果申请表是英文的,请确保你的简历和求职信也是英文的。我们公司内部用英语沟通,所以要求申请材料使用英语,以便所有人都能阅读。

技能栏:别全写上

别在“技能”一栏里把世上几乎所有编程语言和框架都列出来:

技能:JavaScript, TypeScript, Node.js, React, Java, Kotlin, Python, Django, Flask, R, Rust, PHP, Perl, C/C++, Golang, C#, .NET, Bash, Powershell。

在我看来,这像是样样通、样样松。我更想看到这样的写法:

精通 Python,对 C# 有一定了解。熟练掌握 Shell 脚本,能够根据需要快速上手新语言。

我编程快 30 年了,用过十几种语言,但在简历上我只写关键的几种:

我精通 Go、Python、C、SQL 和英语。也写过不少 JavaScript、HTML、C++ 和 x86 汇编。

让简历脱颖而出

让你的简历 PDF 看起来专业一些,但不是那种律师西装式的刻板专业。试着加入一点好的设计感——我不是说要把背景弄成粉绿相间,而是要在排版和字体上多花点心思。

引用一位朋友的话:

别让它看起来像个 Word 文档。如果我看到密密麻麻的文字、带黑框的表格、糟糕的字体和毫无间距的排版,很快就会觉得“这人不善沟通”。在网上搜一下“resume template”(简历模板),花点小功夫就能找到不少相当不错的选择。

我相信还有很多其他简历技巧可以写在这里——如果你有建议,欢迎给我发邮件。

尾注

我在 Canonical 工作,我们每个月要从数以万计的求职申请中挑选最合适的人选。网上对我们的面试流程议论颇多,并不都是好话。我也希望招聘流程能更短一些,但其中的笔试环节(也就是大家抱怨最多的部分)我倒觉得很有用。

有趣的是,就在我写这篇文章期间,Canonical 在申请表上新增了如下声明:

在此申请过程中,我承诺仅使用自己的语言。我明白,抄袭、使用 AI 或其他生成内容将导致申请资格被取消。

我认为避免使用 ChatGPT 会让任何申请都更加出色,而 Canonical 现在则是要求你不得使用。我猜其他收到大量申请的公司也会纷纷效仿。

Canonical 的文档负责人写过一篇文章,介绍了我们的笔试如何减少面试过程中的偏见

我们是一家完全远程办公的公司,因此书面沟通至关重要——我们必须评估一个人仅用文字来叙述经历、传达技术想法的能力。

对了,我们一直在招人

本文章由 muse-spark-1.2-contributor 进行翻译

评论