程序员

谁说大牛才配开发出好产品?

100offer程序员拍卖原创,转载需授权

据统计,大约35%的程序员感到职业压力造成的心理负担,75%的程序员认为他们需要心理帮助。对于这种「焦虑」心理,不同的人有不同的应对方法。Jacob Kaplan Moss认为,大部分程序员应该承认自己的平庸(mediocre),而平庸的程序员也能开发出好产品。

作为著名 Python 框架 Django 的 Co-Creater 和核心开发者,Jacob Kaplan Moss的编程能力毋庸置疑,但是在2015年Pycon大会上,他却说自己只是一个平庸的程序员,这是为什么呢?

大部分人在大部分领域都是平庸的,编程也不例外

Jacob最近刚完成了他的第一次50公里马拉松,发现有很多数字可以量化跑步者的表现:步伐、距离、海拔落差等等。如果100分是满分,那么Jacob的水平是68分,极限耐力跑女王Ann Trason则是98分。

这差距并不令人惊讶,如果绘制一张比赛成绩图,你会得到一个熟悉的「正态分布」曲线。曲线的中部是大多数人的平均水平,在曲线的两端是极好和极坏。几乎每一个可以测量的技能,最终呈现出的分布都是这个曲线。

Jacob说他是一个平庸的程序员,我们都不相信。我们从未与Jacob一起工作过,在缺乏任何其他数据的情况下,为什么不认为他在曲线的中间呢?部分原因是因为缺乏测量编码能力的方法,代码行数可不是指标。

程序员认为他们的工作领域有严密的逻辑,但事实上,我们甚至无法准确地衡量某人编程能力。缺少数据的时候,人们开始编故事,似乎一个人要么是一个了不起的程序员,要么是一个毫无价值的程序员——基本没有中间状态,这是一件非常奇怪的事。

这将意味着,编程技巧的分布似乎是一条U形曲线。贴着Django的标签,Jacob看起来不是一个糟糕的程序员,所以一定是一个特别优秀的程序员。

但是,如果你能以某种方式正确的衡量编程能力,这条曲线也必定是正态分布。正如大部分人在大部分领域都是平庸的,大多数程序员都是平均水平。

编程神话与现实

不要迷信大神,编程是一项可以学习的技能

经常有人在知乎问,「我已经20岁了,学编程还来得及吗?」国外流行的「10x Programmer」、「Real Programmer」这些概念,让大家以为只有精通某些原理或者长得像Mark Zarkerberg才算是一个真正的程序员,而一个使用各种云服务以及 API 快速搭建自己应用的人就不算,这非常可笑。

据美国劳工部统计,到2020年,也就是五年之后,将有150万的编程岗位空缺。欧盟公布的数字也差不多,三年之后,2018年缺口将达到120万。这意味着我们需要做一些让更多的人进入我们的行业。但是,编程天才的神话却把行业门槛设置得特别高,令很多人望而却步。

当一个职业的前途分成两个极端:最顶尖和最糟糕,就会逼着这个行业的人全力以赴。编程天才的过分夸大,就在折磨行业内的人,如果你不是最顶尖的大神,就是糟糕的码农,所以不得不用一切时间来工作、加班和学习,时时刻刻焦虑,害怕掉队,导致影响生活。

还是拿跑步来说,去年有超过一百万人跑了马拉松,难道他们都有与生俱来的跑步天赋?显然不是,只要有一双跑鞋,谁都可以去参赛。虽然跑了50公里,但是Jacob认为自己仍然是一个平庸的跑者,但是有什么关系呢?跑步的人有很多种,专业运动员、锻炼身体的老人、参加马拉松的爱好者等等。为什么编程就一定要做Real Programmer,做不到就觉得自己不配编程呢?

或许我们应该改变这种态度,编程并不需要太多的激情或天赋,它只是一项可以学习的技能,做一个平庸的程序员并不丢人。

平庸不等于糟糕,写烂代码永远是不可接受的

那么,现实生活中的平庸程序员应该是怎样的呢?有人是这样下定义的:

他们是会使用一些现成工具的程序员。他只知道最简单的命令语法,但懂得在哪能找到更复杂命令的语法。他不知道如何编写最高效的代码,但懂得在必要时如何重写和测试比较高效的代码。他可以克服重重困难独辟蹊径达到目标,但他把每个困难视为挑战,并自信会找到每一个困难的解决方法。他可能需要较长时间才能完成,但总能达到目标。他不知道如何创建一个DLL,但在必要时可以弄懂。
——Alan Norton

是的,如果说创造了各种工具和里程碑的程序员是神,那么如果你能做一个熟练运用这些工具的程序员——所谓平庸程序员,你也足够称得上优秀。

但是,在轰轰烈烈的互联网运动中,虽然工资在水涨船高,但是仍有不少程序员存在一种「焦虑」的心理。他们担心自己会的东西明天可能就不值钱了,他们会的东西可能别人培训个2、3个月也能跨进这个门槛。

一种焦虑的背后是技能的虚浮,没有杀手锏,没有深挖。只有绣花拳,只有浮于表面。疲于追赶的背后的是对未来的恐惧和未知的迷茫。另一种焦虑的背后是对「神」的仰止,对「匠人精神」的崇拜,对「平庸技能」的不满。

如果是前者,除了打好自己的技能基础别无他法;如果是后者,则要调整自己的心态:不是大牛组成的团队才配开发好东西。

承认自己的平庸,不等于承认自己是个糟糕的程序员,也不等于给自己设定上限。

如何让自己一般的编程技能发挥出最佳效果?

诚然,一名平庸的程序员可能永远也写不出「10x程序员」能写出的代码,但是只要掌握一定的方法,也能让自己一般般的编程技能在工作中发挥出最佳效果。

  • 明确要求——预先得到完整、精确的系统要求清单。如果你直接开始编码就意味着你没有针对系统设计的要求来进行。
  • 分析和设计——获得分析和设计权。一名普通程序员获得了分析和设计权,就拥有了一个超越一名伟大的程序员的优势。
  • 项目计划——使用经过慎重考虑后的项目计划也是平庸程序员的一个优势。
  • 经常翻阅手册、指南——备齐参考材料以供不时之需。
  • Copy & Paste——自己写出可以在新项目中重复使用的代码,而不是拷贝其他人写的代码,更不要使用在其他公司写的代码。
  • 毅力——永不放弃,相信自己能完成任何编程任务。
  • 工具——用一切手段来获取所需工具,从而完成自己的任务。不要怕向你的经理提出自己的要求,只这些要求是合理的,一个优秀的经理会尽最大努力找到一种方式来满足你的需求。
  • 好手气——随手写的代码竟然运行得很好,真是运气。
  • 适度学习——至少,每个月买一两本新书,相信我,可以减轻新技术带来的焦虑。

100offer说:

工程师文化是典型的「能力崇拜」文化,面对那些惊世骇俗的编程天才,普通人难免感叹和自卑;面对竞争激烈的的职场,难免生出几分焦虑。

承认自己的平庸,并不是为自己的不作为找借口,也不是给自己上限,而是一种坦然的态度。摆正对技术的态度,脚踏实地、厚积薄发;同时对新技术保持关注,不盲目跟风,看清楚它里面的核心,生活和工作都会更从容。

参考:
Alan Norton,《一名平庸程序员的自白》
Jacob的演讲非常精彩,观看视频请戳「阅读原文」,不用翻墙。