明明我活这么好,偏偏大厂就是不要?

这是一个困扰我多年的问题:我活好要价又低,可大厂就是不要。今天无意中听了一场郑大的直播,突然受到启发,知道原因了。

我的故事


我面过好几次阿里的职位,有好几次都走到最后的 HR 面了,但就是从没有拿到过 Offer。其中最让我不可思议的一次是,几年前阿里文娱一个高 P 通过 github 找到我的联系方式,说是看了我的个人项目以及代码提交记录,觉得我很不错,问我有没有意向考虑阿里的机会。我那时在一个创业小厂,一个人要干很多人的活,比 996 还狠,关键还经常拿不到工资,苦于没有好的机会,当然一口答应下来。

但是,我也没有非常猴急,而是问了具体的项目情况。了解到是音视频相关,而且最近很着急做一个视频弹幕方案,我说能不能给我两天时间,我做一个 demo,再参加面试?面试官觉得这个态度很好,也答应了,并加了我的微信。两天后,我把做好的 demo 链接(https//ass-editor.js.org/)通过微信发给了面试官,面试官看了后非常满意,并约了第二天的正式电话面试时间。

我当时非常激动,觉得这个职位就是给我准备的,面试官明确表示了这个 demo 正是他们想要的,所以这是我的面试历史中,感到最有信心的一次。但是没有想到,我最有信心的一次面试,结果竟然终止于一面,连二面的机会都没有拿到!

第二天,电话面试开始,面试官首先就告诉我,说把 demo 给他的主管看了,主管也感到非常满意!我听了开心极了,以为 Offer 唾手可得了。接下来,面试官说还是需要问一些技术问题,以做个全面考察。面试官非常有耐心,各种启发式提问,给我充足的时间思考,足足聊了一个小时。

但是具体什么问题,我现在已经不记得了,因为完全不懂,根本不在我的涉猎范围内。但是面试官非常客气和礼貌,只是让我等通知。挂完电话我心想,虽然各种知识点都没有答上来,但是我的 demo 做得这么好,面试官可能在和主管沟通中会帮我争取一下,然后等几天后就接到他主管的面试电话了。没想到,挂完面试电话没过几分钟,就有 HR 打电话来,通知我面试失败!

我懵了……

后来我多次回想起这件事,越想越不能理解。虽然很多问题答不上来,但是我活好呀:遵循好的工程实践比如自动化部署、测试驱动开发。两天时间搞定最小可用产品并上线,代码放在 github 上,完全没有推广的情况下,得到 21 颗星,和 9 个 fork。这么棒的开发工程师,怎么连二面机会都没有拿到呢!
image.png

别人的故事


我活好,但大厂不要。为什么?这难道是我一个人的困惑?非也,我后来发现别人也有同样的困惑。TDD 是程序员的专业素养(参见《代码整洁之道》),有很多 TDD 的拥趸们,为自己的 TDD 技能感到自豪,但同时又苦于大厂根本就不看重自己所自豪的地方。
image.png
难道是阿里的独特之处?非也,比如这位牛人,所有项目都达到近乎 100% 测试覆盖率(SonarQube 扫描结果)以及全部代码质量都在 A 的那种,去面试了腾讯,结果只通过了一面:
image.png

为什么明明活好大厂却不要?


听了郑大的直播,听到郑大总结的一类老程序员,不能区分知识和技能,总是用自己的技能去理解知识,因此总是得不到提升(不记得原话,大意如此)。比如业界在长时间里总结出来的优秀设计模式沉淀下来,就属于知识。这类老程序员不愿意去学习,而是习惯于自己在实践中摸索,形成一套渐进于业界的标准设计模式,但是又不到位。这个总结让我顿悟了:

活好,只能证明你的技能;但是大厂,往往更注重对知识的考察。

image.png
比如有人质疑过微软总是喜欢问各种算法,说如果有人把所有的算法背下来,既背下来实现代码,还背下来他们的复杂度、优劣区别等等,不是很容易通过你们的面试吗?微软给出的回答是:如果真有这样的候选人,那么肯定是我们要找的人。

虽然有很多相反类型的人,只知道学知识,却不注重运用和练习,没有消化成自己的,于是就又忘记了,没有什么用。但是作为程序员,更应该小心自己走到另一个极端,就是太注重练习和不断提高自己在某方面的技能,却极少花时间学其他知识,于是坐井观天,对自己的局限性没有认知。不仅进不了大厂,在小厂里也长年没有提升。

Bob 大叔做程序员做到 70 多岁,还在持续为业界作出贡献并且拥有极大的影响力,但是很多程序员到了 35 岁甚至 30 岁就开始焦虑自己的职业生涯,很大原因就是只提高自己的技能,却忽视了扩展自己的知识面。

总结


还是用 Bob 大叔的《代码整洁之道》中的关于坚持学习的一段话来总结吧(练习同样重要,书里也有同样强调,但本文是专门写给活好的程序员的,略去练习部分):

你知道什么是N-S(Nassi-Schneiderman)图表吗?如果不知道,那为什么不了解一下呢?你知道“米利型”(Mealy)和“摩尔型”(Moore)这两种状态机的差别吗?你应该知道的。你能不需查阅算法手册就可写出一个快速排序程序吗?你知道“变换分析”(Transform Analysis)这个术语的意思吗?你知道如何用数据流图进行功能分解吗?你知道“临时传递数据”(Tramp Data)的意思吗?你听说过“耦合性”(Conascence)吗?什么是Parnas表呢?

近50年来,各种观点、实践、技术、工具与术语在我们这一领域层出不穷。你对这些了解多少呢?如果想成为一名专业开发者,那你就得对其中的相当一大部分有所了解,而且要不断扩展这一知识面。

下面列出了每个专业软件开发人员必须精通的事项。

设计模式。必须能描述GOF书中的全部24种模式,同时还要有POSA书中的多数模式的实战经验。 设计原则。必须了解SOLID原则,而且要深刻理解组件设计原则。 方法。必须理解XP、Scrum、精益、看板、瀑布、结构化分析及结构化设计等。 实践。必须掌握测试驱动开发、面向对象设计、结构化编程、持续集成和结对编程。 工件。必须了解如何使用UML图、DFD图、结构图、Petri网络图、状态迁移图表、流程图和决策表。

读书,看相关文章,关注博客和微博,参加技术大会,访问用户群,多参与读书与学习小组。不懂就学,不要畏难。如果你是.NET程序员,就去学学Java;如果你是Java程序员,就去学学Ruby;如果你是C语言程序员,就去学学Lisp;如果你真想练练脑子,就去学学Prolog和Forth吧!

—— [美] Robert C. Martin《代码整洁之道:程序员的职业素养》

我的故事后续


看了我的那段最有信心然而惨败的面试经历,有人一定会追问,难道就没有找面试官了解详情吗?当然有,毕竟我们都相互加了微信,而且成了朋友圈的点赞之交,还是有些沟通的。甚至有一次他来上海玩,我还约了和他在星巴克喝了杯咖啡。他给我的反馈是,根据我的资历,他们期待我达到 P7,但是面试评定下来,只到 P6+,还是差了点。我当时还在某创业小厂,已经几个月没拿到工资了,我说给我 P6 也行啊。他说大可不必,让我千万不要自降身价。然后说在阿里的程序员,不懂 Java 的确少见,不太适合,但是别的地方也许可以。

写到这儿,我很惭愧,竟然一直没有去学习 Java。就此打住,我要去学习 Java 了,以及好好研究 SpringCloud,有兴趣一起学习的程序员朋友,欢迎加我微信共同进步:
image.png