按:作为09年个人计划的一部分,我将系统地讨论如何使用合适的语言工具构建工业强度的软件。这既是对个人经验的总结升华,也是对运行在千万的服务器和桌面中的不良代码的公开宣战。
感谢技术的积累和进步,原先作为科学家的工具的数字计算技术现在早已渗透到生活的方方面面,软件工程师的群体也在爆炸式增长。当9岁的孩子也可以使用代码涂鸦,有人可能以为编写软件的门槛已经低到极致。但是,有尊严的软件工程师仍然以极大的精力和热情精化着信息世界的基石。尽管从新手到专家不能一蹴而就,但是那里总有别人走过的路,旁边歪斜的路牌上画着大大的惊叹号,疑问号,省略号或者不可辨识的潦草贴士。戏谑,玩笑不绝于耳。
软件开发式纯粹依赖于智力的活动,虽然它对体力的挑战同样严酷。其他基础学科的从业者很快就发现,从事软件创造所面临的制约要少得多:购买一台普通的桌面机器以及配置一个可用的编程环境要比起申请研究经费简直如同儿戏一样容易。这也是为什么那么多科学家转行计算机科学的原因(不过因为在他们看起来这些根本不算科学,但是又不能掉了身份,只能在计算机后面加上科学的后缀,谓之“计算机科学”)。作为第一批的软件开拓者,他们的著作充斥着市场并被一批一批的后继者奉为圭臬。他们可以教授卓越的技术,但却不足以作为工业标准程序员的指南。对比建筑工程,力学工程甚至化学工程,软件工程的标准一直以五花八门著称。有借鉴其他工程标准的ISO系列,也有学术气息浓郁的CMM系列,更有不计其数的以企业为单位的内部执行细则。这些东西使得构建软件的机构更容易在其他领域获得认可,却并不能正真从本质上改善软件的构建过程。常常可以发现,一个成功的项目背后的因素往往是个别天才型人物的极力推动。
软件比其他工程协助项目的最大不同在于,人们认为软件应该是“软”的(的确如此),所以简单的修改应该很容易(那可未必)。同时,关于从事软件开发的从业人员,有两种极端的思想都能找到大批追随者并且二者可以并行不悖。一种认为软件的单纯的智力创造活动,是天才的行为,所以我们常常可以在报纸上读到天才如何在一夜之间完成一个卓越的项目;另一种则是软件纯粹可以按照传统的工程经验构建,所以我们需要大量的软件蓝领。这些都不能帮助构建工业强度的软件,其思想却误导了绝大多数的软件工程师。
软件开发,本质上,是控制和分解复杂性,并且把复杂性实现为特定规则的过程。从这方面讲,我们要强调其中参与的智力活动部分。另一方面,我们必须有效协作,这就引出了额外的复杂性。我们必须确保,我们分解实现某种复杂性本身的复杂性加上协作的复杂性以及其他引入复杂性的总量小于问题的初始复杂性,这才是成功的软件实现。所以问题可以归结为,如何有效地减少实现的复杂性以及协作的复杂性?
这里强调的工业强度的实现。先定义什么是工业强度的实现。定义总是困难的,特别是对没有明确定义的概念界定内涵外延。工业强度的代码至少应该包含如下特质:
1. 自解释和合理抽象
2. 合理使用资源
3. 没有安全漏洞
4. 并行执行安全
5. 不违反直觉
6. 一致而协调的风格
7. 良好的外部组织结构
8. 干净的编译结果
9. 符合人因工程学基本原理
10. 以可维护为第一要素
其中前五条更关注于实现,而后面五条更关注于协作。本质上,实现和协作是相辅相成的,无需细说。我们的目的是以可控的常量复杂性处理可伸缩的复杂问题。注意,我们强调的是人以及其中的协作,而不强调外部的管理。
我们的工具很大程度上影响了我们的实现能力,就如同我们的思想很大程度决定于我们的语言能力。所以这里的讨论不是在真空中进行。我们会以常用的工业实现工具,如C/C++语言,作为补充。但是需要注意的是其指向的东西。我用手指着月亮,您不能只关注我的手。
下一节将讨论复杂性这个最具复杂性的问题。