软件工程平|别再垒代码了( 二 )


随着系统越来越复杂,大部分的系统都很难一个人完成,需要团队一起完成,而且需要持续的迭代。写代码这门手艺,就变成了一项软件工程,如何协调多人也就变成了软件管理。
软件工程的一代宗师迈克尔·杰克逊(Michael A. Jackson,不是那位歌坛巨星),《程序设计原理》的作者,曾哀叹软件行业普遍缺乏专业性,充满了业余人员,“手中有个锤子,看到什么都是钉子”,谁都可以开发性命攸关的软件。
人们经常会比较软件开发生产率和硬件制造生产率。后者在 20 年内至少翻了 1000 倍,从劳动密集型的装配车间,到自动化的流水线工业。而前者仍然是手工作坊。
著名的《人月神话》一书中,阐释了软件系统的复杂性。在规模上,软件实体可能比任何由人类创造的其他实体更复杂,至少在语句的级别上,没有任何部分是相同的。如果有相同的情况,我们就会把它合并成供调用的子函数。在这个方面,软件系统与电脑、建筑或者汽车都大不相同,后者往往存在大量重复的部分。
目前大部分的系统都是多人开发,先拆成不同的模块分散开发,然后再合并代码,这时候也会导致非常多的问题。这么多人写出来的东西,质量到底怎么样,可以打个大大的问号。
除了复杂性,软件开发中最根本的任务是构建在规格说明、需求设计之上的复杂概念结构,次要任务才是使用编程语言来表达这个抽象实体。这和数学和物理学完全不同,数学家和物理学家可以为复杂的现象建立简化的模型,并通过试验来验证。因为这些模型中忽略的复杂度,不是被研究对象的根本属性。软件则恰恰相反,复杂度是本质特性,不能被忽略。
由于软件的复杂度,造成了很多软件开发的经典问题。团队之间的沟通非常困难,导致了产品瑕疵、进度延迟、成本超支;列举可能的状态变得十分困难,影响了软件产品的可靠性;由于函数的复杂性,造成了程序难以阅读和使用;由于结构的复杂,造成很多安全机制状态上的不可见性。
系统越来越复杂,代码越来越看不懂,还有很多管理上的噩梦。
比如,怎么适应客户需求的瞬息万变,如何管理不同层级的开发人员,离职了怎么交接,诸此种种难题,成了企业数字化转型的“最后一公里”。
低代码和微服务
为了解决软件开发的经典难题,计算机科学家在不懈努力。主要的理论就是用有力的工具来辅助人工劳动,提高劳动生产率,改善工作质量,由此产生了 CASE(Computer-Aided Software Engineering),即计算机辅助软件工程。
最简单的工具,比如产生图表的自动图形工具。在 Excel 里就提供这样的工具,不用编程,拖拽鼠标就能完成复杂的图表。
低代码(low-code)成为新的流行语,本质上就是希望结合可视化开发技术和代码生成来减少手动编码,以此来加快应用程序交付。事实上,软件工程的整个历史都是关于提高抽象层次的。
低代码可以追溯到模型驱动工程。1991 年,在著名的 CAiSE 会议的第 1 版中,可以找到这样的论文:“给定最终模型,可以自生成完整的计算机化信息系统”。
像 Google 的 AppMaker ,微软的 PowerApps ,都是新一代的低代码软件开发平台。
2020 年 10 月 19 日,在加拿大的蒙特利尔,举办了第一届低代码研讨会。会议是 ACM / IEEE 举办的 MODELS 2020 的一部分。
除了低代码,还有一个浪潮就是微服务(Microservices)。因为大部分的软件都已经在云上,2005 年,Peter Rodgers 博士首先提出了 Micro-Web-Service 的概念,核心想法是让服务由类似 Unix 管道的访问方式使用,复杂的服务背后是使用简单的 URI 来开放接口。
2014 年,微服务的概念形成。微服务就是单一应用程序构成的小服务,服务依照业务功能设计,以全自动的方式部署,与其他服务使用 HTTP API 通信。服务也具备最小的规模集中管理能力(例如 Docker),服务可以用不同的编程语言与数据库等组件实现。
虽然听起来简单,但是实现微服务体系结构非常困难。目前最流行的有两个框架,一个是 Netflix 开放了一个 Java 平台的开源框架,叫 Spring;另外一个是 Google 设计并捐赠给 Linux 基金会的 K8s 。
Spring 下,又有一个有名的 Spring Boot ,可以轻松创建独立的、生产级别的,基于 Spring 的应用程序,并且运行它们。它和著名的虚拟化软件 VMware 背后是同一家公司。
从人治到法治
2016 年,陈定玮手下有 150 位工程师,给银行、金融这样的大客户做软件开发。当时,微服务正在兴起,陈定玮却经历着各种阵痛。