如果你是位有点儿经验的程序员,定然多次遇到过这类困境。我们有专用来形容这事的词:沼泽(wading)。我们趟过代码的水域。我们穿过灌木密布、瀑布暗藏的沼泽地。我们拼命想找到出路,期望有点什么线索能启发我们到底发生了什么事;但目光所及,只是越来越多死气沉沉的代码。
如果你是位有点儿经验的程序员,定然多次遇到过这类困境。我们有专用来形容这事的词:沼泽(wading)。我们趟过代码的水域。我们穿过灌木密布、瀑布暗藏的沼泽地。我们拼命想找到出路,期望有点什么线索能启发我们到底发生了什么事;但目光所及,只是越来越多死气沉沉的代码。
习艺之要有二:知和行。你应当习得有关原则、模式和实践的知识,穷尽应知之事,并且要对其了如指掌,通过刻苦实践掌握它。
想成为更好的程序员,你一定要阅读一些程序员必备的几本书。看看是哪几本?
你的代码在哪道门后面?你的团队或公司在哪道门后面?为什么会在那里?只是一次普通的代码复查,还是产品面世后才发现一连串严重问题?我们是否在战战兢兢地调试自己之前错以为没问题的代码?客户是否在流失?经理们是否把我们盯得如芒刺在背?当事态变得严重起来,如何保证我们在那道正确的门后做补救工作?答案是:技艺(craftsmanship)。
这是本有关编写好程序的书。它充斥着代码。我们要从各个方向来考察这些代码。从顶向下,从底往上,从里而外。读完后,就能知道许多关于代码的事了。而且,我们还能说出好代码和糟糕的代码之间的差异。我们将了解到如何写出好代码。我们也会知道,如何将糟糕的代码改成好代码。
什么是整洁代码?有多少程序员,就有多少定义。
鲍勃大叔又是怎么想的呢?在作者眼中整洁代码是什么样的?本书将以详细到吓死人的程度告诉你,我和我的同道对整洁代码的看法。我们会告诉你关于整洁变量名的想法,关于整洁函数的想法,关于整洁类的想法,如此等等。我们视这些观点为当然,且不为其逆耳而致歉。对我们而言,在职业生涯的这个阶段,这些观点确属当然,也是我们整洁代码派的圭旨。
重构不是包治百病的万灵丹,也绝对不是所谓的“银弹”。不过它的确很有价值,尽管它不是一颗“银弹”,却可以算是一把“银钳子”,可以帮你始终良好地控制自己的代码。重构是一个工具,它可以(并且应该)用于以下几个目的。
重构的唯一目的就是让我们开发更快,用更少的工作量创造更大的价值。 重构技术就是以微小的步伐修改程序。如果你犯下错误,很容易便可发现它。 傻瓜都能写出计算机可以理解的代码。唯有能写出人类容易理解的代码的,才是优秀的程序员。
本书是一本为专业程序员编写的重构指南。我的目的是告诉你如何以一种可控且高效的方式进行重构。你将学会如何有条不紊地改进程序结构,而且不会引入错误,这就是正确的重构方式。
本书的首要目标读者群是想要学习重构的软件开发者,同时对于已经理解重构的人也有价值——本书可以作为一本教学辅助书。在本书中,我用了大量篇幅详细解释各个重构手法的过程和原理,因此有经验的开发人员可以用本书来指导同事。
尽管本书的关注对象是代码,但重构对于系统设计也有巨大影响。资深设计师和架构师也很有必要了解重构原理,并在自己的项目中运用重构技术。最好是由有威望的、经验丰富的开发人员来引入重构技术,因为这样的人最能够透彻理解重构背后的原理,并根据情况加以调整,使之适用于特定工作领域。如果你使用的不是JavaScript而是其他编程语言,这一点尤其重要,因为你必须把我给出的范例用其他编程语言改写。
下面我要告诉你,如何能够在不通读全书的情况下充分用好它。
Unix是怎么来的?贝尔实验室是怎样的机构?寥寥数位研究员组成的小团队是如何改变世界的?是什么让Unix成为可能,并推动它 演化?
本书主要的写作目的是讲述计算机历史上某个极具生产力和发展性的时期中的一些精彩往事。理解我们习以为常地使用的技术如何演化而来,颇为要紧。有人顶住压力、克服时间限制,做出了定义技术发展方向和路径的决策。越了解历史,我们越感激那些带来Unix的发明天才,或许也越能理解现代计算机系统是如何发展成现在这个样子的。仅就那些如今看起来大错特错抑或倒行逆施的选择而言,常常也是在当时可用资源限制之下所能考虑和实现的必然结果。
本书不仅写到技术内容,还写了许多幕后故事,写了那些天才人物的个性,以及Unix诞生和发展的独特创造性环境。
科技创新的发生还与另一件有趣的事相关。Unix诞生地贝尔实验室是很出色的机构,它既制造出许多好点子,也投资了这些好点子。多个改变世界的发明由贝尔实验室而起,它的运作机制足资学习。
Unix的故事当然也贡献了大量有关设计和构造软件,以及有效利用计算机的洞见,我会在书中一一指出。例如,Unix软件哲学倡导合用既有软件,完成很多不同任务,而不是从头写个新软件。这个例子简明又生动,它在编程领域体现了“分而治之”的故技:将大任务切分为多个小任务,每个小任务都变得更可控,然后再以各种不可思议的方式将之整合到一起。
多数软件开发的书都是有关软件开发本身的,本书却不是。有大量的书论述如何编写优质代码、如何利用各种技术,但是很难找到一本能够告诉我“如何成为一名优秀的软件开发人员”的书。
毋庸置疑,这本书并不是在讨论“你能做什么”,这本书讨论的是“你自己”——关于你的职业生涯、你的生活、你的身体、你的思想以及你的灵魂——如果你确信灵魂存在的话。现在,我并不希望你把我想象成为某种类型的疯子。我不是一个持超验主义思想的和尚,能坐在地板上一边冥想一边抽着仙人掌叶子做成的卷烟,还试着帮你提升到更高层次的顿悟。恰恰相反,我觉得你会发现我是一个非常脚踏实地的人,我不过恰好正在思索——作为一名软件开发人员如何超越编写代码本身?
我拥抱所有的软件开发方法。这意味着,我认为,如果你想真正成为一个更好的软件开发人员(或者其他真正优秀的人才),你需要把重点放在整个“人”上,而不只是你生活中的一两个领域。
这就是这本书的由来,也是这本书的初衷。现在,显然我不可能在这本书的短短篇幅里包罗万象、涵盖生活当中的方方面面,我也没有丰富的经验或智慧来解决这个如此广泛的课题,但我可以通过将本书的内容聚焦于软件开发人员的生活主要方面,在这里我恰好有一些经验和专业知识也许可以让你最大可能地受益。
在这本书里,你会发现不少看似无关的主题串联在一起,但这种无序的背后其实另有深意。本书共分为七篇,每一篇都聚焦在软件开发人员生活的不同方面。如果你想为这些内容分类和分组,最简易的方法是将它们看成是事业、思想、身体和精神四个方面。
技术管理者是当今宝贵而稀缺的中坚力量。但是技术不断创新突破,行业瞬息万变,对技术管理者来说,这个时代机会无处不在,规则却无迹可寻或有迹难寻。
机会无处不在,是因为激荡前行的互联网等新兴行业给技术管理者们带来了非常广阔的发展空间和丰富的锻炼机会。行业发展迅速,业务高度不确定且充满挑战,技术快速升级迭代。在这样的背景下,管理者有机会得到全方位充分的锻炼,有管理才华的人得以“天高任鸟飞”。很多年轻的管理者脱颖而出,短短几年就已管理成百上千名员工,甚至成长为大公司的高管。这与传统行业相比,无疑是非常快的成长速度。
规则无迹可寻或有迹难寻,是由于互联网行业还需要时间进行体系化的沉淀,管理者缺乏系统而有效的行为模式来参考和学习。具体体现在:一方面,由于业务快节奏发展,很多管理者尚未形成系统的方法论,新晋管理者的学习过程容易变成跟着上级照猫画虎,缺乏深入思考和沉淀;另一方面,互联网公司本身也很年轻,其管理机制还在持续进化中。
本书的精彩之处,是结合了互联网行业的管理实践经验与管理理论,为技术管理者提供了一个系统的“管理全景图”。这使得定位管理问题、探讨解决方案都有据可依、有章可循。
除了管理框架,本书还对管理实践中的具体问题进行了深入的分析和探讨,例如:
这些问题都是技术管理者在实际工作中的“切身之痛”,作者逐层拆解,力求讲清楚个中道理,而非头痛医头脚痛医脚地堆砌应对策略,真正做到了知和行的统一。
同时,作者在书中分享的很多理念对知识型团队的管理者也是非常有用的,例如: