什么是卓越代码(Great Code)?场景不同,角色不同,对卓越的定义自然有所不同。既然没有统一的标准,似乎可以放过不提。然而,本书系列题为《编程卓越之道》,又如何可以轻易放过对卓越的认识?细品作者Randall Hyde采纳的定义:
卓越代码是按照一套一致的优秀软件特征编写出来的,首要考虑的是优秀软件特征。特别是,卓越代码要遵循一套规则,这套规则能够指导程序员在用源码实现算法时的决策。
单就定义而言,依旧语焉不详。关于什么是优秀软件特征,或许大家可以从书中寻觅到答案。而我却透过书名,隐隐捕捉到Randall Hyde的一个观点——没有深谙计算机底层原理,不可能写出卓越的代码。——这也正是本书(卷1)的核心思想:深入理解计算机。
听听作者自己的解释:
了解了计算机如何表示数据,就了解了高级语言的数据类型是被如何转换到机器层次的;了解了CPU如何执行机器指令,就了解了高级语言应用程序中各种操作的代价;了解了内存性能,就了解了如何组织高级语言中的变量和其他数据,让缓存和内存的访问最优。
此言非虚。正如要学好Java,就有必要了解JVM的工作原理,而要彻底了解JVM,怎能不知道计算机的底层原理?以指令集为例,这是汇编程序员天天使用的基本编程要素,而Java程序员就鲜少涉猎。殊不知,这些Java程序员编写的每行代码都会被编译为运行在JVM中的指令。对照来看,恰好本书介绍了短指令和长指令在空间、性能与复杂度的取舍,而JVM则采用了折中的变长指令,允许操作码后跟零字节或多字节的操作数(operand)。同一条知识,打通了从计算机底层到高级语言开发的通路。
作为一名汇编语言高手,Randall Hyde极为推崇汇编语言对程序员的助力。他在本书后记中建议:“有一种强迫自己在机器层次编写代码的方法就是使用汇编语言。”许多新生代的程序员对此建议或许不以为然,毕竟,如今使用汇编语言的机会可谓少之又少,它的重要性已经淡化。
遥想当年,在我的大学时代,汇编语言还是计算机专业最重要的一门编程语言课,当然,也是公认最难啃的硬骨头。当时还能熟练编写汇编程序的我,早已不记得这门语言的大部分语法了。我不知道,学习和使用汇编语言是否真的有助于写出卓越代码?我也不知道,我之所以没能写出什么卓越代码,是否与我汇编水平不高有关?但我深信,倘若具有高超的汇编开发能力,必然理解计算机底层运行的细节;倘若能很好地掌握汇编语言,学习任何一门高级语言,也就不在话下。
当软件系统规模如滚雪球一般变得越来越大时,我们已不可能像当初求伯君那样用汇编语言去写十几万行的WPS。虽然使用的语言不同,编程态度却应该一以贯之。然而,当我们写出动辄数百万行代码的应用系统时,是否真的思考过每条语句背后的代价?——问程序员,有多少人以写出卓越代码为己任?问代码,又有多少是深谙计算机底层原理的程序员写出来的?我们这个行业,因为竞争加剧的原因,程序员变得更加地浮躁。没有办法让自己静下来,沉心打磨基础;当开发技能成为一种快餐时,还有谁会力求编码的精益求精?又有多少人舍得花费宝贵的时间来深入理解计算机?然则,“九尺之台起于垒土”,没有扎实的基础,开发的能力究竟能提升多高,编程的生涯究竟能走多远,我深表怀疑。
真的非常钦佩Randall Hyde多年如一日孜孜于《编程卓越之道》系列的写作,使之成为计算机图书中不朽的经典。而作者并不满足已经取得的成就,推陈出新,出版了本书的第2版。第2版加入了新鲜的元素,却又不损经典质量的一分一毫。如果你刚刚踏上编程之旅,我强烈推荐你阅读本书。正所谓“磨刀不误砍柴工”,这些底层原理和底层细节,看似对你的开发没有直接帮助,但它真的可能会决定你未来的高度!是为推荐序。
《解构领域驱动设计》作者 张逸