如何将生产力提高20倍?给新手程序员的入行建议
本文节选自《On Java 中文版 进阶卷》:https://weread.qq.com/web/reader/fe032450813ab69c2g012052

看来大家都已经准备好了,准备好闯入这个真实的世界。这很像给一个人灌输了关于英语的所有知识,然后对他说“出去写个好故事吧”,但学校能为你做的可能也就这么多了。更理论化的背景其实无济于事。这并不是说理论不好,你终究还是会需要一些的。我虽然很认同诺门大学的教育理念,但仍然认为在试图理解事物背后的理论之前,知道如何去做会更有帮助——于我来说,理论需要更长的时间才能掌握。在大脑慢慢理解它的时候,知道功能层面的信息会非常有用。
在学校能学到的东西就这么多,而且它们与你最终在工作中所做的事情也并不十分相关。因此,我打算给你提供点见解,来帮助你更好地进入软件开发的真实世界,并缓解这种冲击。
大学里的学习是非常结构化的。我们甚至称其为一门科学,它承诺世界上存在相同的结构和活动。更重要的是,你已经开始期待一定程度的成功了,就像你在课堂项目和任务中所经历的那样。但真实世界并不会如你期望的那样。
统计数据发人深省:50%~80%的编程项目会失败。这个范围有些大,因为人们不会夸大自己的失败,所以我们必须做些猜测。无论如何,这让这个世界听起来很不可靠。工程项目的结果会好很多,主要是因为它必须是好的。糟糕的软件通常只会惹恼人,但糟糕的工程会害死人。
一个更令人着迷的指标是:5%程序员的生产力是其他95%程序员的20倍。如果这是一门科学,就像它声称的那样,那么我们可以弄清楚如何让每个人都达到相同的水平。
我们假设这遵循二八定律。大约80%的程序员不读书、不参加会议、不继续学习,除了在大学学习的内容之外,他们什么都不做。也许他们在一家大公司找到了一份工作,可以在那里一遍又一遍地做同样的事情。另外20%的人在他们的职业生涯里挣扎:阅读、尝试学习、听播客、参加用户组,有时还参加会议。这20%中的80%还不是很成功,他们还处于开始阶段,还在努力。这20%中的另外20%——大约5%程序员的生产力提高了20倍。
那么你如何能成为这神奇的5%中的一员呢?

这些人不是那些能记住所有动作、手指在键盘上飞舞、发出系统命令的人。根据我的经验,这5%的人必须努力才能到达这个境界,必须努力才能留在这个境界,而关键就是不断学习。
由于工作的性质,我遇到过非常多这样的人。他们阅读了很多书,并且随时准备应对看起来值得深入的新概念。我认为,如果要参加会议,他们会非常挑剔。他们把大部分时间花在提高效率和解决问题上。
这里最大的问题是,要知道你正在追求将生产力提高20倍,这影响到你所做的一切。永远不要只是“暴力地实现某些东西”,而是使用可以得到的最好的工具、技术和想法。总是尽力而为。
更进一步说,要明白突破点并不总是来自显而易见的事情,或是我们被告知的内容,或是关于怎么做才有效的普遍想法。能够分析并理解情况,发现问题的突破点,才是必不可少的。为此,你需要清晰的头脑和超然的视角。例如,选择不同的编程语言有时会产生巨大的差异,但通常来说,这并不是很重要。尽管如此,比起可能产生更大实际影响的事情(例如架构决策),人们还是会将所有时间都花在其他决定上。
因此,你必须不断学习并自学新技术,但这并不是那么简单。学习更多编程知识绝对是件好事,但你不能只学编程知识。例如,编程有两个最大的痛点。
读代码的人比写代码的人多。如果人们无法阅读你的故事,他们就无法改进或修复。不可读的代码会带来真正的成本,我们称之为“技术债务”。
代码审查是发现软件缺陷最有效的方法,但我们通常“没有时间”。
我们来自1和0的世界,愿意相信事物是确定的,相信对同一组输入来说,每次都能获得相同的输出。我之所以知道这些,是因为在很长一段时间内自己也相信这一点。在还是一名物理本科生时,我花了一些力气才开始——只是开始——清醒过来。许多年后,在一个研讨会上,一位与会者告诉了我这些年来我一直在学习的东西:
所有的模型都是错误的。有些是有用的。
我们这个行业还很年轻,甚至可以说很原始。真的,我们对什么有效知之甚少,总是觉得自己已经找到了解决所有问题的灵丹妙药。结果就是,新想法出现、流行、对新问题无能为力,然后不再受欢迎。我们不断经历这个从繁荣到萧条的轮回,每个轮回都会持续数年。不过有些想法似乎更具持久力。例如,敏捷方法中的许多想法似乎对生产力和质量产生了一些真正的影响。这是因为它们更关注人们在一起工作的问题,而不是技术。

我从Gerald Weinberg那里学到了很多东西。他早期写过几本关于编程技术的书,后来转行了,自己写过或与人合著了50多篇关于编程过程的文章。他最著名的一句话是“不管别人告诉你什么,这都是人的问题”。
通常来说,决定项目成败的是流程和人员:你日常是如何工作的,架构师是谁,经理是谁,你在编程团队中与谁一起工作,你如何沟通,最重要的是你如何解决遇到的流程和人员问题。如果你认为这一切都与技术有关,并相信其他方面的事情都是可以轻易克服的,那么很快就会陷入困境。那些“其他”方面的事情才是项目顺利进行的最大助力。
在第一份工作中,我看到很多经理做出了愚蠢的决定,因此很自然地得出结论:经理和管理层都是愚蠢的。这也是我们这个职业中普遍的观点:如果你没有聪明到做技术,那就做管理吧。随着时间的推移,我慢慢了解到,管理工作并不愚蠢,只不过非常非常难,这就是我们仍然在做出愚蠢决定的原因。管理比技术困难得多,因为前者几乎不涉及确定性因素。管理全部要靠猜测,所以如果没有很好的直觉,就可能会做出愚蠢的决定。
举个例子,一些公司采取了这样一种政策:在规定的一段时间结束后,每个团队都会得到评价,最末的10%或20%的人会被解雇。作为对这一政策的回应,拥有优秀团队的聪明经理会额外雇用一些人,从而可以在不损害团队的情况下抛弃他们。这不是一种好政策。事实上,这个政策很侮辱人,会从内部侵蚀公司的士气。这是你在大学里没有学到的东西之一,但也是你必须知道的,即使它似乎与编程没有直接的关系。
还有一个例子:人们会问你完成特定任务所需的最短时间。你会尽力猜测,而他们则会假设你真的可以做到。对于这样的估计,你必须告诉他们:对于所有的估计,你在这段时间内实际完成的概率是0%,该猜测只是概率曲线的开始。每个猜测都必然伴随着这样的概率曲线,因此所有概率的组合会产生一条真实的曲线,表明项目可能何时完成。你可以通过阅读一本名为《与熊共舞 : 软件项目风险管理》的小书来了解更多信息。

你需要关注经济学和商业,而两者都远非精确科学。在上下班途中听听音频书和讲座吧。你需要了解潜在的业务问题,这样才能发现自己公司的走势,并及早采取行动。刚开始工作的时候,我很不理解那些关注商业问题的人——那是穿西装的人要考虑的东西,并不是真正的技术。但是关注商业问题的人才是聪明人。
播客是一个重要的信息来源。任何人都可以制作播客内容,虽然其中很多质量不高,但也有一些真正闪耀的宝石,特别是那些专门涵盖专业话题的播客。我从这些播客中学到了很多东西,它们让我与时俱进(可以听一下我与James Ward的播客:Happy Path Programming)。
这是你在学校学不到的另一件事。商业世界和编程世界都以追逐流行而出名,它们都在追逐那些承诺将事情做得更好的时尚方法。简单的时尚方法很容易让人看出荒谬之处,或者在短时间内暴露无遗。另一些则比较难以让人发现问题,它们包含一些道理或真相,所以你无法迅速驳斥。有时,你必须去伪存真,因此必须锻炼批判性思维。
我曾经看到一个食品袋上写着:“研究表明,每周至少与家人共进5次晚餐的儿童和青少年,饮酒的可能性降低了50%。”它暗示的结论是,一起吃晚饭可以防止酗酒。一起吃晚饭是主导因素吗?是否还有其他原因能导致人们回家吃饭并且远离酒精?
以下是许多人真诚相信的事情。
公司不再需要盈利。现在是新经济时代。
房地产总是上涨,即使工资没有上涨。
大学必须有传统校园,而不能是写字楼的形式。
当你来自1和0的世界时,情况就更难了。在那里,我们真的、真的很想相信一切都是确定的。比这更困难的是,你已经知道简单添加开发人员或扩展系统都会改变系统的主导因素,而周围的每个人仍然认为这一切都应该是确定的。
有一本书用研究报告揭穿了有关管理人员和项目的错误观点。它碰巧是基于软件的,但几乎可以应用于任何地方。这本书叫作《人件》。它小巧有趣,我向所有人推荐它。唉,它真的不是一本回答问题的书,它只是坚定地摧毁了许多被广为认同的观点——关于人们如何在编程相关的业务环境中工作。这本书最好的一点就是提醒你注意:接受一个错误的想法并围绕它建立一个糟糕的世界有多么容易。它可以帮助你提出问题。
当带着从过去几年学到的技术知识进入新工作,再想起我今天告诉你的内容时,你很可能会觉得,公司里的每个人都愚蠢地做出了糟糕的决定。但是,我还要告诉你一条来自Gerald Weinberg的重要格言,它并没有真正回答任何问题,只是让你理解发生了什么。他说:“事情之所以变成这样,是因为它们本来就是这样的——走到现在的每一步都是合乎逻辑的。”这就是传说中的“温水煮青蛙”(这是另一个误解,青蛙实际上跳了出来)。因此,从你全新的角度来看,事情可能很荒谬,但请记住,中间的每个决定,都是别人权衡问题过后所选择的当时看起来最好的选项。这种观点并不能解决任何问题,但是可以让你对被困住的人多一点儿同情。
你需要犯很多错误才能把事情弄清楚。所以要谦虚,并不断提出问题。
