软件开发的历史与未来(第一部分)
即使只回溯几年,软件工程的面貌也已经有所不同。但如果回到20年前呢?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等),有时甚至取决于使用的汇编器。
注意: 汇编器和汇编语言往往被互换使用,但实际上是两个不同的东西。汇编语言是实际的语言、语法——使用的指令,与架构紧密耦合。而汇编器是将汇编代码组装成机器码的软件——你的计算机知道如何执行的东西。
例如,在Commodore 64上,ADC $c汇编代码通过汇编器转换为$69 $0c机器码。
这里的开发环境是什么样的?以Tandy TRS-80 Model 1为例。开发者(称呼这个时代的开发者为"开发者"感觉很奇怪)会通过盒式磁带加载名为EDTASM的工具,编写汇编代码,保存回磁带,然后汇编并运行。听起来很简单对吧?但记住我说过的"…通过移动比特…"?使用汇编时,你要处理内存地址。意味着你要硬编码存储数据的内存位置。但是编辑器呢?编辑器也存在于同一内存中吗?是的,你必须记住这一点,因为它可能存在于你想在生产环境中使用的地址范围内。
例如,当我在Commodore 64上编写汇编时,会根据当前是编写软件还是推送到生产环境,使用两个不同的ORG定义(我的起始内存位置)。在开发过程中,我的汇编器和编辑器会碍事。嗯…这一定是"但在我的机器上能工作"的第一个案例。
并非所有东西都是汇编语言,我们中的许多人(我正看着你呢,亲爱的读者)都是从一种叫做BASIC(初学者通用符号指令代码)的小语言开始的。这是许多人进入编程世界的入口。虽然它让我们能创建运行缓慢的软件,但它仍然是软件,对任何人都可访问。我的第一行代码就是在Commodore 64上的BASIC中编写的。
C语言的兴起
啊,C语言。无处不在的语言。即使在2025年,你仍然到处都能看到C语言。从嵌入式开发到一些用Rust编写的包含不安全C代码的软件。
C语言由Dennis Ritchie于1972-73年在贝尔实验室创建。最初是为了构建在Unix上运行的实用程序。C语言直到1980年代才获得广泛流行。
如果你想编写C语言,你需要了解"K&R C"。这实际上是一本书,由Dennis Ritchie和Brian Kernighan编写,已经成为C语言的圣经。它被认为是C语言的最低共同标准,无论你决定使用哪个版本的C,这本书中的内容都必须有效。
那么开发者当时(甚至现在)如何用C构建软件?他们如何学习需要做什么?
从学习开始…书籍。是的,书籍!由于语言(及其框架)相当简单(没有7^32个JavaScript框架),当时的软件工程师可以从几本书中获得所有知识。
这些不仅仅是参考文档,而是展示C语言可能性的书籍。然后你只需要找一个热切的软件工程师,让他们在这个神奇的新语言提供的可能性中尽情发挥!我在学习汇编时也经历过类似的事情——语法不多,但通过实验和创造力,你可以走得很远很远。
编写软件呢?他们当时使用git吗?不,git直到2005年才出现,所以当时的软件版本控制相当手动。从开发者有自己的本地源代码管理方式,甚至有墙图让开发者可以"声明"某些源代码文件的所有权。对于那些能够在共享(多用户)系统上工作,或者拥有某些网络存储早期版本的人来说——源代码共享就像分发软盘一样简单。
当时,迭代很慢。软件(大部分)以物理介质发布,空中更新不那么常见(某些软件可以通过调制解调器更新,但对大多数用户来说不是标准做法)。所以体验用户反馈,就像我们今天这样,没有那么迅速。
停下来闻闻90年代
好吧,我在这篇文章中说得够久了。让我们在这里暂停,反思我们在30多年里走了多远。从绿纸和打孔卡,到移动比特和编译C语言。嗯…实际上没有那么远。如果你看C语言,它的"hello world"与FORTRAN相差不远。
|
|
事实是,我们进行软件开发的方式将在未来几十年内大幅加速。从面向对象编程到Web,从JVM到LLM。所有这些还有更多,将在本博客的第二部分中讨论。
我将在接下来几周内在AWS Builder Center发布第二部分。请确保在那里关注我!
再见!