软件工程的起点是编写代码。人们想让计算机帮忙做事。人们需要告诉计算机具体步骤。这些步骤就是程序。早期程序员直接和机器对话。他们使用二进制代码。一和零组成指令。这个过程非常麻烦。一个小程序需要很长时间。程序员容易出错。查找错误非常困难。
程序员想要更简单的方法。他们发明了汇编语言。汇编语言用简短单词代替二进制。这些单词代表操作。比如“ADD”表示加法。“MOV”表示移动数据。计算机不懂这些单词。需要一个翻译程序。这个程序叫汇编器。汇编器把单词变成机器码。编写程序变得容易一些。程序规模仍然很小。
后来出现了高级语言。FORTRAN语言面向科学计算。COBOL语言面向商业管理。这些语言更接近人类语言。程序员写“x=y z”。这很像数学公式。编译器负责翻译。编译器把高级语言变成机器码。程序员不用关心机器细节。他们可以专注解决问题。程序规模开始变大。
大程序带来新问题。一个人很难完成所有代码。需要多人合作。多人写代码容易混乱。你的代码可能影响我的代码。程序结构变得重要。人们提出“软件工程”概念。像建造桥梁一样建造软件。需要规划、设计、测试和维护。编程不再是个人艺术。编程是系统工程。
代码管理很重要。多人修改同一文件怎么办?版本控制工具出现了。CVS是早期工具。后来有Subversion。现在最流行是Git。版本控制记录每次修改。谁改了代码?什么时候改的?改了什么地方?这些信息都保存着。程序员可以并行工作。他们可以在不同分支上开发。最后合并到一起。团队协作效率提高。
程序功能越来越多。代码变成一团乱麻。修改一处可能引发多处错误。人们需要好的代码结构。结构化编程思想出现。程序由顺序、选择、循环组成。避免随意跳转。程序逻辑更清晰。接着是面向对象编程。程序由对象组成。对象包含数据和操作。对象模拟现实事物。汽车是一个对象。它有颜色、速度等数据。它有启动、加速等操作。对象之间通过消息通信。代码复用变得容易。可以继承现有对象。可以扩展新功能。大型系统更好组织。
编写代码只是开始。程序有很多错误。这些错误叫“bug”。必须找出并修复错误。这个过程叫调试。调试很花时间。有时比写代码时间还长。测试是关键环节。程序员自己测试。也有专门测试人员。测试分为多种。单元测试检查单个模块。集成测试检查模块组合。系统测试检查整个软件。测试发现问题。开发者修复问题。软件质量得到保证。
用户需求经常变化。今天要这个功能。明天要那个功能。软件必须适应变化。传统开发模式像瀑布。需求分析、设计、编码、测试、维护。一步一步向下流。前一步完成才能下一步。问题很快暴露。需求会变化。设计时需求已经变了。瀑布模型不适应变化。
新方法被提出。敏捷开发流行起来。敏捷强调快速响应变化。软件迭代开发。先做出一个简单版本。这个版本可以运行。然后不断添加功能。每两三周一个循环。每个循环交付新功能。客户可以早点看到软件。客户可以及时反馈。团队根据反馈调整。软件更符合客户需要。
软件规模继续变大。一个软件可能由几百万行代码组成。几百万行代码由上千人编写。如何协调这么多人?如何管理这么多代码?软件工程需要工具链。需求管理工具记录需求。设计工具画结构图。编码工具写代码和提示错误。测试工具自动运行测试用例。项目管理工具跟踪任务进度。这些工具组成开发环境。开发效率大大提升。
软件运行环境也变了。以前软件装在个人电脑上。现在软件常在云端。用户通过浏览器访问软件。或者通过手机应用访问。软件变成服务。这种模式叫SaaS。软件需要一直运行。软件需要服务大量用户。这对开发提出新要求。软件必须可靠。软件必须能扩展。用户增加时系统能处理。系统不能崩溃。
开发方式也在更新。人们谈DevOps。开发团队和运维团队合作。传统上两个团队分开。开发团队写完代码交给运维团队。运维团队部署和维护。中间有堵墙。信息流动不畅。DevOps打破这堵墙。开发者关心运行情况。运维者参与开发过程。自动化工具连接两边。代码提交后自动测试。测试通过自动部署。部署后自动监控。问题出现自动报警。修复速度更快。
开源软件影响深远。源代码公开让大家使用。大家可以修改和分享。Linux操作系统是开源软件。无数程序员贡献代码。开源软件推动技术进步。公司也支持开源。他们开放部分代码。他们建立开发者社区。社区帮助改进软件。软件质量提升很快。新工具新技术快速传播。
人工智能进入软件工程。机器帮助写代码。机器分析大量代码。机器学习编程模式。机器可以提示代码补全。机器可以找出潜在错误。机器可以生成简单代码。程序员工作量减少。程序员专注创造性工作。人工智能也改变软件本身。软件具备智能能力。软件能识别图像。软件能理解语言。软件能推荐内容。软件工程必须适应这种变化。
安全问题越来越重要。软件连接整个世界。网络攻击随时发生。软件漏洞导致数据泄露。软件工程需要考虑安全。安全不是最后添加的功能。安全要从设计开始。代码要防范攻击。数据要加密保护。系统要定期检查。安全成为软件核心属性。
软件在我们生活中无处不在。手机里的应用是软件。电视里的系统是软件。汽车的控制器是软件。银行的交易系统是软件。软件工程不断进步。软件工程让软件更好。软件工程让软件更可靠。软件工程让软件更安全。编写软件还是靠人。工具帮助人。方法指导人。最终是人解决问题。软件工程本质是人的工程。人们合作创造有用工具。工具改变世界。