1.3 杰出实战程序员
除了拥有实战信念、荣誉感和为人真诚外,杰出的实战程序员还得拥有以下特质。
● 懂得质疑。
● 结果驱动(也就是HR口中的结果导向)。
● 高产出。
● 化繁为简、直击要点。
好的软件开发工程师不仅仅是程序员
成为一名靠得住的工作伙伴要求的技能不仅仅是在计算机前编写代码,还需要善于沟通,能够提出有建设性的反馈,同时也能虚心接受别人的意见。就连林纳斯·托瓦兹(Linus Torvalds)[3]也承认应该增强自己的沟通技巧。然而这些东西不在本书里。去交些朋友吧!你会在社交当中学到的。
[3] 他是Linux操作系统和Git源代码控制软件的创建者。他秉持着这么一种观点:如果参与你项目的志愿者在技术上出错了,那么骂他们一顿也是可以的。
1.3.1 懂得质疑
一个懂得质疑的人常常会自省,并质疑那些被广为接受的观点,而对这些观点的解构能够让你看得更清楚。
很多图书、软件开发专家,包括斯拉沃伊·日热克(SlavojŽižek)[4]都强调过懂得批判和具有好奇心的重要性,但是,他们几乎没有给你一点实在的东西,让你能够将它们运用到实际工作中去。在本书里你可以看到很多有名的技术,还有一些最佳实践的例子,你也会看到为什么它们没有所声称的那么有效。
[4] 他是一名现代哲学家,他有一个毛病,就是喜欢批判这世间的一切事物,没有例外。
批评一门技术并不代表这门技术没有用处。技术批评能扩大你的眼界,让你能够鉴别出在某些应用场景中更合用的技术。
本书的目标并不是全面介绍每一种编程技术,而是给你一种视角去了解怎么样对待那些最佳实践,然后根据它们的优缺点排个顺序,并且通过这些优缺点来权衡利弊。
1.3.2 结果驱动
你当然可以说你是世界上最好的程序员,对于软件开发当中的复杂问题能有自己的见解,也可以自豪地说你为代码做了最好的设计。但是,如果不能产品交付,这些就都是空话。
根据芝诺(Zeno)[5]的悖论,你如果想要到达终点,就必须先到达这个路程的一半。这是一个悖论,是因为你到达一半之前必须到达那一半路程中的一半,以此类推,这会让你哪里都去不了。根据芝诺悖论衍生出的观点:要做出一个正式产品,就必须达成开发周期中的各个节点和里程碑,否则最终目标不可能实现。以结果为导向,意味着以里程碑为导向,以进展为导向。
[5] 芝诺是一个生活在几千年前的古希腊人,他喜欢问一些悲观的问题,自然而然,不讨喜的他一本作品都没有流传下来。
“为什么说一个项目会推迟一年?……一天推迟一点呗。”
——弗雷德·布鲁克斯(Fred Brooks),《人月神话》
为了得到结果可能意味着牺牲代码的质量、优雅性和技术追求。重要的是,你要时刻反思自己在做什么,为了谁在做。
牺牲代码的质量并不意味着牺牲产品的质量,如果你测试得当,并且需求写得非常明确,你甚至可以用PHP[6]去写。嗯,这可能有点不给面子,但是你在未来会尝到苦头,因为糟糕代码最终会“反噬”你。这可能就叫“代码现世报”。
[6] PHP发明之初是为了证明不设计一门编程语言也能完成工作,据我所知,虽然PHP经过这么多年的发展,但还是常常出现在各种编程语言笑话里。当然,现在它是一门出色的编程语言,但还是得优化自己的形象。
你在本书后面部分学到的部分技巧会帮你做出好决策,得到圆满结果。
1.3.3 高产出
提升开发速度的关键是经验、清晰的需求,以及机械键盘。哈哈,开个玩笑。与此相反,机械键盘几乎不会对你的开发速度有任何帮助,它们只是看起来很酷而已。不过,在打扰别人方面,它倒是可以为你助力。事实上,我完全不认为打字速度快可以提升开发速度。你对于自己打字速度的自信,倒是可能会使得你写出一些画蛇添足的代码。
有些技术是可以从别人的经验和“血泪史”当中学到的。在本书中,你将看到这样的例子。你学到的那些本领能让你写出更简练的代码,更快做出决定,这会尽可能让你少背一些“技术债”,并且会避免你以后花好多天来努力搞明白半年前你写的代码到底是一堆什么东西。
1.3.4 接受复杂性和模糊性
复杂性是可怕的,但是模糊性更可怕,因为它甚至会让你不知道该怕到什么程度,于是就更害怕了。
如何处理模糊性,是微软招聘人员时面试的核心问题之一。在面试中经常会涉及一些假设性的问题,比如说在纽约有多少间小提琴维修店;洛杉矶有多少个加油站;或者总统有多少位特勤人员,他们的任务是什么,时间表是怎么样的,请在白宫的地图上列出他们的名字并标注其行动路线;等等。
解决这种问题有一些小技巧。先厘清你在这种问题上获取到的所有信息,然后根据这些信息想出一个大致区间。比如说你可以先从纽约市的人口入手,推测其中拉小提琴的人大概有多少。这些信息会让你对市场规模有概念,了解到市场能有多大竞争空间。
类似地,当你遇到一些包含未知数的问题时,比如说预估开发某功能需要多长时间,你就可以通过已知信息来尽可能缩小结果的估计范围。你可以“榨干”自身所长,利用所假之物,将那些模棱两可的部分减到最少。
有趣的是,处理复杂问题的方法也是类似的。可以将那些看起来复杂到无法入手的问题,分解为一个个更便于管理、复杂度更低、更简单的小问题。
你的思路越清晰,就越能解决未知的问题。接下来你在本书中学到的技巧,可用于理清一些事情,并使你在面对模糊性和复杂性方面更有信心。