软件开发的历史与未来(第一部分)
即使回溯短短几年,软件工程的面貌也已有所不同。但如果回溯20年呢?40年甚至70年前呢?我们还能认出当时的软件开发方式吗?
现代开发者的理想环境
当今时代的开发者已经习惯了完美的开发环境。从精心调校的vim/emacs配置到庞大的AI驱动套件,软件开发变得异常便捷。内置语言服务器、代码检查工具、自动文档生成、语法高亮,甚至版本控制——这些都是现代软件开发生态系统的产物。我们仿佛生活在梦想中!
但事情并非一直如此。
打孔卡时代
你知道为什么有些文本编辑器和开发者喜欢在代码达到80列后换行吗?甚至连Python的PEP 8风格指南也这样建议!这与打孔卡有关。是的,就是我们在想象1960年代计算机时都会想到的打孔卡。
当时的软件开发者在大型主机上使用打孔卡存储和执行代码。实际开发并不是在卡片上进行的,程序是写在所谓的编码表上——一种通常为绿白相间的纸张,程序员在上面编写和调试代码。这些表格可以容纳多行代码。
然后这些表格会被送到"打孔卡部门",转换成实际的打孔卡。这通常使用IBM 029等机器完成。每张卡片最多只能容纳80个字符(包括空格)。超过这个限制就需要新卡片,这意味着单张编码表可能产生多张卡片。
对于当时任何重要的软件,都需要成堆的打孔卡。1000行代码就需要1000张卡片,而且必须按顺序排列。想象一下不小心打翻这1000张卡片!重新排序将花费大量时间。当时的开发者经常遇到这种情况,因此有些人发明了创意性的卡片顺序标识方法。
这些打孔卡通常用于批处理。意味着你将卡片堆送到计算中心,在计算资源可用时运行软件。这是一次性的操作,如果失败就彻底失败。你必须在纸上调试后重试。这听起来很可怕,但在当时却是革命性的。
家用计算机时代
让我们从商业和大型机的世界退一步,回到家中。遇见卧室程序员。到1970年代中期,负担得起的家用计算机开始成为现实。Altair 8800、IMSAI 8080、Commodore PET、Apple II和TRS-80的世界正向开发者走来。
由于这些计算机能力有限,任何严肃软件都必须用机器码或汇编语言编写(在某些情况下甚至是直接拨动开关)。这让开发者能够通过操作比特来充分利用硬件能力。汇编语法取决于计算机使用的架构(Z80、MOS 6502、Intel 8080等),有时甚至取决于使用的汇编器。
注意: 汇编器和汇编语言通常被混用,但实际上是不同的。汇编语言是实际的语法和指令,与架构紧密耦合;而汇编器是将汇编代码转换为机器码的软件。
以Tandy TRS-80 Model 1为例:开发者通过磁带加载EDTASM工具,编写汇编代码,保存回磁带,然后汇编并运行。听起来简单?但使用汇编时,你需要处理内存地址——即硬编码存储数据的内存位置。编辑器也存在于同一内存中,你必须注意它可能占用你想要在生产环境中使用的地址范围。
并非所有都是汇编语言。很多人是从BASIC语言开始的。这是许多人进入编程世界的入口。虽然它创建的软件运行缓慢,但这仍然是软件,而且对任何人都可访问。
C语言的兴起
啊,C语言。无处不在的语言。即使在2025年,你仍然随处可见C语言的身影。从嵌入式开发到某些用Rust编写的软件中包含的不安全C代码。
C语言由Dennis Ritchie于1972-73年在贝尔实验室创建,最初用于构建在Unix上运行的实用程序。直到1980年代,C语言才获得广泛流行。
如果你想学习C语言,必须了解"K&R C"——这是由Dennis Ritchie和Brian Kernighan编写的权威著作。无论你决定使用哪个版本的C语言,这本书中的内容都必须有效。
当时的开发者如何用C语言构建软件?他们如何学习?
从书籍开始。是的,书籍!由于当时语言(及其框架)相对简单,软件工程师可以通过几本书掌握所有知识。这些不仅是参考文档,更是展示C语言可能性的指南。
关于版本控制:当时还没有git(git直到2005年才出现),软件版本控制相当手动。从开发者本地管理源代码的方式,到使用墙图让开发者"认领"特定源代码文件的所有权。迭代速度很慢,软件主要作为物理介质发布,空中更新并不常见。
暂停与反思
让我们在此暂停,反思30多年来我们走了多远。从绿纸和打孔卡,到操作比特和编译C语言。实际上,变化并不算大。看看C语言的"hello world",与FORTRAN相比并没有太大差别。
重要的是,软件开发方式的变化将在未来几十年大幅加速。从面向对象编程到Web,从JVM到LLM——所有这些内容将在本博客的第二部分探讨。
第二部分将在接下来几周内发布于AWS Builder Center。