何为工程师?首先我们要理解何为工程。按照《说文解字》的解释,“工”有巧饰的意思。南唐文字训诂学家徐锴说:“为巧必遵规矩、法度,然后为工。”“程”有路程、过程、步骤或者规程的含义。“工”与“程”二字结合起来,就是按照一定的流程、标准和规则精巧地创造有价值的器物和培养能力的过程。再加上一个“师”字,强调的就不仅是做这件事的过程与结果了,还强调做这件事的人。
中国是一个工程师大国,依靠着千百万名勤勤恳恳、任劳任怨的工程师,为人类做出了众多伟大的工程成就,为百姓福祉、社会进步、民族复兴和国家兴盛做出了巨大的贡献。但我认为,工程师作为一种极具专业性的职业,并未得到应有的关注和尊重。
人们很容易凭表象把工程师理解成一群只知“苦哈哈”埋头工作、缺乏情趣之人。同时,由于社会,甚至包括工程师群体自身对工程师这种职业的偏见、轻视或者抵触,人们经常不重视工程师这种伟大职业的终身能力培养,过多地把心思放在对工程师职称的计较上,有时甚至会为应该称某人为工程师还是高级工程师而争得面红耳赤。殊不知,工程师是一种值得一个人终身追求的“职业”,为人类做贡献则是这种伟大职业的职责。一名工程师可以因为对社会做出的贡献而获得应有的“职称”,但是反过来,如果有了职称而没有实现对社会的贡献和自身能力的终身培养,那么这种职称反而会成为阻碍自身发展甚至破坏自身职业成长的枷锁。
“卓越工程师系列”的两位作者,一位是来自优步、雅虎等顶尖企业的工程主管威尔·拉森(Will Larson),他是享誉世界的工程师,他通过《技术领导力的要素》( Staff Engineer )与《工程管理的要素》( An Elegant Puzzle )两本书告诉我们,一名工程师的成长路径是怎样的。一名优秀的工程师,绝不会仅靠努力工作就能实现自己的追求;一名优秀的工程领导,也绝不会仅凭拥有一个看似耀眼的头衔就能够管理好工程项目与团队。
对一名工程师而言,对技术的掌控力和对技术趋势的洞察力是其最基本的技能。除此之外,所有人应有的“软实力”,比如待人接物、组织建设、协调沟通、推广交流和应对复杂与不确定性的本领与实践,也是一名工程师不可或缺的基础能力。为什么?因为工程师也是人,或者说,工程师首先是人。
在本系列的第三本书《软件设计的要素》中,作者丹尼尔·杰克逊向工程师们提出了一个尖锐的问题:为什么有些软件设计得一鸣惊人,而有些却一败涂地?软件是一个复杂的巨系统,这本书以系统化的视角和以人为本的价值观,为软件设计者提供了一个全新的变革性视角。
在我看来,要想成长为一名优秀的工程师,首先要学会如何做人。人都做不好,如何做好一名工程师?
其次,要有科学精神和技术能力。想要高效解决复杂系统性问题,预见尚不存在的“结构”,做到跨越性创新,工程师思维是一个可以安心依靠的利器。
工程师不只要做事,而且要务实且有效地做事。工程方法与科学精神和技术能力构成一个有机的整体,相辅相成,唯一的不同是侧重点不同。科学重在永无止境地探索,不怕犯错,永远在改错的路上;技术重在能力的提高,不断利用科学知识的进步和工程实现的结果拓展技术能力的边界;而工程方法则是在有限的条件下灵巧、务实地实现人类的共同目标。
那么如何“务实”,如何“探索”,如何“提高”,如何“灵巧”?这就是湛庐文化“卓越工程师系列”图书希望给读者带来的答案。
要是由我来总结,我可以说这套书是由两名始终在工程一线的工程师写下来的实践之学,不是让我们照搬照抄的,而是拿来借鉴和体悟的。如同近来大火的《奥本海默》电影中的一句台词:“……理论只能把你带到这么远……”剩下的都是工程的实践,但实践是最难的,因为它要变成一种习惯。
悟性就在你的脚下。
我很高兴这本书被翻译成中文,并有机会与读者分享我的想法,这不仅是因为中国软件行业的快速发展,还因为中国的研究人员在塑造软件未来方面发挥着越来越重要的作用。
自从这本书的英文版发行(2021年12月)以来,已经过去了两年多。我现在对这本书中的观点有了新的看法。这本书获得的热烈反响让我感到振奋,但我也意识到,我本可以更直接地指出概念设计是如何提供了一种新的、非常不同的软件设计和构建方式。
我想在这里概述一下这本书的一些关键创新内容,使读者提前了解它们。所有这些(除了最后一个)都在书中有详细讨论。
概念模型是软件核心的想法可以追溯到20世纪80年代以用户为中心的计算模型的出现。在那个年代,特别有影响力的还有唐纳德·诺曼(Donald Norman)的著作《日常事物的设计》( The Design of Everyday Things ),其中心思想是机器(无论是不是软件)用户的心智模型必须与设计师的心智模型一致,因为后者的心智模型代表了机器的实际运作方式。根据诺曼的说法,设计师的任务是在用户界面中“投射”这个底层的模型。诺曼在他的书中举了一个例子,一个典型的美国冰箱有两个控制装置,一个标有“新鲜食品室”,一个标有“冷冻室”,这给人的印象是两个控制装置分别控制其对应冰箱室的温度。但实际上,正如诺曼解释的那样,一个控制装置负责调整两个冰箱室共用的压缩机,另一个控制装置负责调整一个阀门,该阀门决定了流向每个冰箱室的冷空气比例。诺曼指出,这种冰箱的设置使得成功操作冰箱几近不可能,比如,关闭标有“冷冻室”的控制装置会启动压缩机并使冷冻室和新鲜食品室都变得更冷。
多年前,当我第一次读到《日常事物的设计》这本书时,我以为这是对底层设计模型的批判。但仔细阅读后,我意识到这里的重点不在于该模型,而在于模型在用户界面中的“投射”或呈现方式。诺曼承认,即使用户有正确的心智模型,冰箱仍然难以使用。但这不是分析的重点,也不是概念模型思想的实质。诺曼在书中的分析主要关于心理学(这本书的第一版书名就叫《日常事物的心理学》),这本书与其说是关于底层机制的设计,不如说是关于用户界面的设计。
而我这本书中的概念思想非常不同。《软件设计的要素》的重点不在于底层概念模型的投射,而在于概念模型的设计,即塑造概念使其满足用户的需求。概念与其说是心理上的,不如说是计算上的。这本书表明,如果基本概念不正确,就没有办法在用户界面中解决这个问题。此外,对于冰箱这种物理实体来说,很难改变其底层的概念模型(例如,因为每个冰箱室拥有单独的恒温器和压缩机太昂贵了);而对于软件来说,底层概念的设计没有这样的限制。如果说概念有任何成本,那么这种成本恰恰是由于概念与用户需求之间的不匹配以及由此产生的复杂性带来的。
概念在理解软件中起着重要作用,这个想法也许并不新鲜。但这些概念究竟是什么?在本书之前,概念是模糊的,这使得很难在软件中识别概念。更糟糕的是,即使我们能够在许多不同的软件中识别出同一些概念,我们也没有办法分解这些概念并一次描述一个。在我的书中,我提出了一个简单而灵活的概念定义:概念是一种独立的服务,由状态和操作组成,它能实现用户的目的。我将展示如何一次定义一个概念,并将它们组合在一起(但不会使它们相互依赖)。
创新和创业专家经常争辩说,成功来自于一个简单而精确的想法。概念设计提供了一种将这一专家建议付诸实践的方法。创新设计通常依赖于一两个关键概念,这些概念将其与现有设计或竞争对手的设计区分开来。这些关键概念抓住了创新的本质,其成功(或失败)将取决于它们给用户带来了多少价值。例如,图层概念是Adobe Photoshop成功的原因,它完全改变了这个软件的轨迹。
不过,关键概念不需要都像图层概念那样微妙。Zoom因其会议概念主导了视频会议市场,它允许一个人提前创建会议,然后将链接发送给其他人,其他人甚至没有Zoom账号也可以选择加入会议。相比之下,以前的视频会议软件使用呼叫概念,该概念源于电话,参与者由发起者手动添加到会议中,并要求每个参与者在会议开始时就在场。一旦用户体验过会议概念,就知道呼叫概念完全不切实际!
概念可以使软件实现更广泛的模块化。当我在麻省理工学院教学生如何进行概念设计以及如何实现他们的设计时,我开始意识到概念设计与传统的面向对象的设计有多么不同。面向对象的设计通常将与对象类型关联的所有状态和功能归为一个类别,这往往会将完全不相关的模块状态和功能组合在一起,更糟糕的是,会将功能分散到多个类别中。
例如,假设设计一个拼车软件,该软件将可能一起乘车的用户联系在一起,并规划他们的路线。在传统的面向对象的设计中,该软件可能有一个具有用户属性(例如用户名和密码、家庭和工作地址、首选出发时间等)的用户类别,也可能有一个包含用户和路线等的拼车类别。
这种设计的问题在于用户类别包含属于用户身份验证的功能以及属于拼车类别的功能;本该属于拼车类别的功能却被分散在两个类别中。在概念设计中,只需要定义一个用于用户身份验证的概念和一个用于拼车的概念,每个概念仅包含相关的功能和状态。
虽然这本书没有讨论实现,但通过将每个概念都变成一个模块来编写概念设计是很简单的。在Web软件中,概念之间的同步成为调用概念操作的控制器的功能。
在我的书出版时,GPT还没有问世。毫无疑问,像GPT这样的大语言模型(LLM)将极大地改变软件开发实践。我对概念设计与LLM的契合方式感到非常兴奋。例如,LLM非常擅长生成少量代码,但不能构建整个软件。概念似乎恰好提供了基于LLM的代码生成所需的模块化。软件设计师可以使用LLM为每个概念生成代码,然后通过概念组合来构建整个软件。这是我的研究小组正在研究的一种方法。
我的书出版后,一家大型美国软件公司已将概念设计作为其软件开发过程的核心。引入概念直接赋予了设计师权力;特别是产品经理,他们被赋予了更大的责任,确保所有的概念在公司生产的不同产品中以一致的方式运行。更令人惊讶的是,概念似乎有助于使不同的工作保持一致,例如将营销、销售和工程结合在一起,以便每位工作人员都对公司产品的本质有着相同的理解。
不管你在软件设计中担任什么角色,我都希望你会喜欢这本书,并且希望这本书让你以新的方式思考软件及其设计。