务实(Pragmatic)这个词来自拉丁语 pragmaticus ------ "精通业务",该词又来源于希腊语 πραγματικός ,意思是 "适合使用"。
"务实" 一词源远流长。
编程是一门技艺。简单地说,就是让计算机做你想让它做的事情(或是你的用户想让它做的事情)。作为一名程序员,你既在倾听,又在献策;既是传译,又行独裁;你试图捕捉难以捉摸的需求,并找到一种表达它们的方式,以便仅靠一台机器就可以从容应付。你试着把工作记录成文档,以便他人理解;你试着将工作工程化,这样别人就能在骑上有所建树;更重要的是,你试图在项目时钟的滴答声中完成所有这些工作。你每天都在创造小小的奇迹。
编程是一门技艺。同时它也需要和别人沟通。程序员可以和人很好地沟通,如果不能,可能就不会有人知道他,因为他是靠作品交流的。
这就让务实主义有了用武之地。你不应该拘泥于任何特定的技术,而应该拥有足够广泛的背景和经验基础,以便在特定的情况下选择合适的解决方案。你的背景来自对计算机科学基本原理的理解,而你的经验来自广泛的实际项目。理论结合实践会让你变得强大。
实践是检验真理的唯一标准。不必拘泥于特定技术,要有足够广泛的背景和经验基础,以便在特定的情况下选择合适的解决方案。背景来自于对计算机科学基本原理的理解,而经验来自广泛的实际项目。
调整方法去适应当前的情况和环境。对所有影响项目因素的相对重要性进行判断,并通过经验找到适当的解决方案。随着工作的进展,你要不断地这样做。
根据具体情况变通,依据经验和已有知识进行判断。
作为务实的程序员,会共有许多以下特征:
早期的采纳者/快速的适配者
你对技术和技巧有一种直觉,喜欢尝试。当接触新东西时,你可以很快地掌握它们,并把它们与其他的知识结合起来。你的信心来自经验。
好奇
你倾向于问问题。这真不错------你怎么做到的?你对那个库有意见吗?总在听人说起的量子计算到底是什么?符号链接是怎么实现的?你热衷于收集各种细微的事实,坚信它们会影响自己多年后的决策。
批判性的思考者
你在没有得到证实前很少接受既定的现实。当同事们说 "因为就该这么做",或者供应商承诺会解决所有问题时,你会闻到挑战的味道。
现实主义
你试图理解所面临的每个问题的本质。这种现实主义让你对事情有多困难、需要用多长时间有一个很好的感知。一个过程应该很难,或是需要点时间才能完成,对这些的深刻理解,给了你坚持下去的毅力。
多面手
你努力熟悉各种技术和环境,并努力跟上新的进展。虽然目前的工作可能要求你在某个专门领域成为行家,但你总是能够进入新的领域,迎接新的挑战。
我们把最基本的特征留到最后。所有务实的程序员都有这个特征。它足够基本,完全可以作为提示来加以声明。
提示 1 关注你的技艺
我们觉得,如果你不关心怎么把软件开发好,那么软件开发领域就再也没什么好谈的事情了。
提示 2 思考!思考你的工作
为了成为一名务实的程序员,我们要求你在做事的时候,思考一下自己正在做什么。这不是对当前实践做的一次性审计
而是对每天里每一个项目所做的每一个决定进行的批判性评估。不要用自动辅助驾驶系统偷懒,而是要不断地思考,即时地批判自己的工作。 IBM 公司的座右铭 "思考!",实属每个务实程序员的真言。
关注怎么把软件开发好最重要;
思考工作的意义;
多面手
现实主义
批判的思考者
好奇
早期的采纳者/快速的适配者
如果你觉得这听起来很困难,那么你就表现出了现实主义的特征。这会占用你一些宝贵的时间
可能是已经处于巨大压力之下的时间。当然会有回报, 你能更积极地投入喜欢的工作,对越来越多的学科有掌控感,对不断进步产生愉悦感 。从长期来看,时间投资将得到回报,因为你和你的团队将变得更高效,能编写出更容易维护的代码,并且在会议上花的时间更少。
处于巨大压力之下,让自己保持愉悦感。
务实的个体,大型的团队
有些人认为在大型团队或复杂的项目中没有个性的空间。"软件是一门工程学科,"他们说,"如果团队成员个体自行其是,软件就会崩溃。"
大型团队中不容许个体特征呈现。
我们强烈反对这种看法。
诚然,软件构造有工程的成分。然而,这并不妨碍个体的技艺。想想中世纪在欧洲建造的大教堂,每一座都需要数千人年的努力,时间跨度长达几十年。从中吸取的经验教训被传递给下一代的建造者,最终一代代累积的造诣推动了结构工程的发展。而木匠、石匠、雕刻师和玻璃工人都是手工艺人
通过吃透工程要求,其创造所体现出的整体水准,已远超建筑中纯机械的部分。正是他们对个人贡献的信念支撑着这些项目:我们,采集的只是石头,却必须始终展望着未来的大教堂。
在一个项目的整体结构中,总有个性和技艺的空间。考虑到软件工程的当前状态,这一点尤为正确。今天的土木工程师,很难接受中世纪大教堂建造者使用的技术
百年后我们的工程看上去也一样古老,而我们的技艺仍将受到尊重。
#1 我的源码让猫吃了
注重实效的程序员的特征是什么?我们觉得是他们处理问题、寻求解决方案时的态度、风格、哲学。他们能够直接跃出直接的问题去思考,总是设法把问题放在更大的语境中,总是设法注意更大的图景。毕竟,没有这样的更大的语境,你有怎能注重实效?你又怎能做出明智的妥协和有见识的决策?
他们成功的关键是他们对自己所做的每件事情负责,关于这一点,我们将在 "我的源码让猫给吃了" 中加以讨论。因为负责,注重实效的程序员不会坐视他们的项目土崩瓦解。在 "软件的熵" 中,我们将告诉你怎样使你的项目保持整洁。
大多数人发现自己很难接受变化,有时是出于好的理由,有时只是因为固有的惰性。在 "石头汤与煮青蛙" 中,我们将考察一种促成变化的策略,并(处于平衡的兴趣)讲述一个忽视渐变危险的两栖动物的警世传说。
理解你的工作的语境的好处之一是,了解你的软件必须有多好变得更容易了。有时接近完美是唯一的选择,但常常会涉及各种权衡。我们将在 "足够好的软件" 中探究这一问题。
当然,你需要拥有广泛的知识和经验基础才能赢得这一切。学习是一个持续不断的过程。在 "你的知识资产" 中,我们将讨论一些策略,让你 "开足马力"。
最后,我们没有人生活在真空中。我们都要花大量时间与他人打交道。在 "交流!" 中列出了能让我们更好地做到这一点的几种途径。
注重实效的编程源于注重实效的思考的哲学。本章将为这种哲学设立基础。