软件一开始就是写程序。人们用纸带打孔。计算机很慢。程序也很小。几个人就能完成。写程序就是告诉机器做什么。那时候没有软件工程。大家觉得程序能运行就行。
计算机变快了。能做的事情多了。程序越来越大。一个人写不完。需要很多人一起写。问题出现了。大家写的代码不一样。合在一起经常出错。程序像一团乱麻。修改一个地方会影响其他地方。软件经常延期。成本越来越高。质量却不好。用户不满意。这就是软件危机。
人们开始思考。写软件不能只靠编程。需要像建房子一样有计划。这就是软件工程。软件工程把写软件当成一个工程。它需要方法。需要管理。需要工具。软件工程强调过程。从想做什么开始。到设计怎么做。再到写代码。最后测试和维护。每个阶段都有明确任务。文档很重要。它记录软件的样子和怎么做。大家看文档就知道软件的情况。
结构化编程出现了。它要求程序有清晰的结构。程序用顺序、选择、循环三种基本结构。这样程序好读好改。GOTO语句要少用。它会让程序跳来跳去。程序像面条一样混乱。结构化编程让程序变得清爽。
接着是面向对象。它把数据和操作数据的方法放在一起。这就是对象。对象像现实世界的东西。比如一个“窗口”对象。它有大小、颜色这些数据。也有打开、关闭这些操作。对象可以重复使用。对象之间通过消息通信。面向对象让软件更贴近人的思维。它提高了代码的复用性。大型软件更容易构建。
软件过程模型发展起来。瀑布模型最早出现。它把开发分成需求、设计、编码、测试这些阶段。像瀑布一样往下流。每个阶段必须完成才能进入下一个。它要求需求一开始就很清楚。但实际中需求经常变化。瀑布模型显得僵硬。
于是有了迭代模型。软件不是一次做完。而是先做一个简单的版本。然后一次次增加功能。每次迭代都经历完整的开发周期。用户可以早点看到软件。可以提出意见。开发方向可以调整。风险降低了。
敏捷开发影响很大。它认为变化是正常的。文档不是最重要的。人和沟通更重要。软件要尽早交付。欢迎需求变化。敏捷开发有Scrum等方法。团队很小。工作以周为单位。每天开短会。快速响应变化。敏捷开发让开发变得更灵活。
软件工具越来越重要。编译器、调试器是基本工具。集成开发环境把多种工具合在一起。写代码、找错误、管理文件更方便。版本控制系统记录代码的每一次改动。多人修改同一份代码不会混乱。可以回到任何一个历史版本。
开源运动改变了软件生态。源代码公开。全世界开发者都可以参与。Linux操作系统就是这样开发的。开源软件质量很高。大家共同检查代码。Bug发现得快。修复也快。开源促进了共享和创新。
软件架构变得关键。架构是软件的骨架。它决定软件怎么组织。好的架构让软件健壮、灵活、容易扩展。微服务架构现在很流行。一个大型软件拆成很多小服务。每个服务独立运行。服务之间通过接口通信。这样一部分服务出问题不影响其他部分。不同服务可以用不同技术开发。更新和维护更方便。
云计算普及了。软件不再只跑在个人电脑上。可以跑在远端的服务器集群。通过网络提供服务。这就是云服务。开发者不用自己买很多机器。按需租用计算资源。软件部署和扩展变得简单。云计算提供了强大的后台支持。
人工智能进入软件工程。AI可以帮忙写代码。比如自动补全代码。从注释生成代码片段。AI可以检查代码错误。发现潜在的安全漏洞。AI还可以协助测试。生成测试用例。甚至自动修复一些Bug。软件开发的部分工作自动化了。
软件已经无处不在。手机里的应用是软件。电视、汽车、手表里也有软件。冰箱、空调这些家电也由软件控制。软件连接一切。物联网让无数设备联网。软件工程面临新挑战。设备多种多样。网络环境复杂。对安全性和可靠性要求极高。
软件开发不再是少数专家的事。低代码平台出现了。用图形化界面拖拽组件。配置一些参数就能生成应用。普通人也能制作简单软件。这加快了企业应用的开发速度。专业开发者可以聚焦复杂问题。
软件工程关注质量。测试是保证质量的重要手段。单元测试检查一个个小模块。集成测试检查模块组合。系统测试检查整个软件。测试要尽早进行。自动化测试很多。代码提交后自动运行测试。质量门禁阻止有问题的代码合并。
团队协作方式在变。远程办公多了。开发工具支持在线协作。多人可以同时编辑同一份设计文档。代码评审在线进行。沟通记录可追溯。团队分布在不同时区也能高效工作。
安全问题突出。软件漏洞可能造成巨大损失。安全不能最后才考虑。要在需求、设计、编码每个阶段都考虑安全。有安全编码规范。有自动化安全扫描工具。渗透测试模拟黑客攻击。DevSecOps把安全融入开发和运维全过程。
软件工程还在发展。量子计算可能带来新变化。软件形式可能不同。工程方法也需要调整。软件与物理世界融合更深。数字孪生在虚拟世界复制物理实体。软件工程需要新的理论和实践。
软件工程的目标没有变。它要高效地做出可靠有用的软件。它用系统的方法管理复杂。它适应技术的变化。它服务于人的生活和工作。软件工程是实践的学问。它从问题中来。到解决问题中去。它朴素而坚实。它是这个数字时代的基石。