软件开发的历史与未来(第一部分)
即使回溯短短几年,软件工程的面貌也已有所不同。但如果回溯20年呢?70年前呢?我们还能认出当时的软件开发方式吗?
打孔卡时代
你知道为什么有些文本编辑器和开发者喜欢在代码达到80列后换行吗?甚至连Python自己的PEP 8风格指南也建议这样做!这与打孔卡有关。是的,就是我们在想象1960年代计算机时都会想到的打孔卡。
当时的软件开发人员使用打孔卡在大型主机计算机上存储和执行代码。实际的开发工作并不是在卡片本身上完成的,而是在称为编码表的特殊纸张上完成的。程序员会在这些(通常是)绿白相间的纸上编写代码和调试代码。这些编码表实际上可以容纳多行代码。
然后,这些编码表会被送到"打孔卡部门",转换成实际的打孔卡。这通常是在IBM 029等机器上完成的。每张卡片最多只能容纳80个字符(包括空格)。超过这个限制就需要新的卡片。这意味着你的单个编码表可能会产生多张卡片。
对于当时任何重要的软件,你都需要成堆的打孔卡。是的,1000行代码需要1000张卡片,而且必须按顺序排列。想象一下把这1000张卡片掉在地上!重新排序需要花费很长时间。当时的开发人员经常遇到这种情况,因此有些人想出了创造性的方法来指示这些卡片的顺序。
这些打孔卡通常用于批处理。意味着你将卡片堆放在计算中心,在计算时间可用时运行你的软件。这是一次性的事情,如果失败就失败了。你必须在纸上调试并重试。听起来很可怕,但这在当时是革命性的。
家庭编程时代
让我们从商业和大型机的世界退一步,回到家中。让我们认识一下卧室程序员。到1970年代中期,负担得起的家用计算机开始成为现实。计算机不再只是工作工具,爱好者开始将计算机用于个人用途——也许我们可以称之为个人计算机。
使用这些计算机,我们既回到了过去,也进入了未来。由于其有限的能力,任何严肃的软件都必须用机器代码或汇编语言编写(在某些情况下,甚至是实际拨动开关)。这使开发人员能够通过移动位来充分利用硬件的功能。
这里的开发环境是什么样的?以Tandy TRS-80 Model 1为例。开发人员(称呼这个时代的开发者为"开发者"感觉很奇怪)会通过盒式磁带加载一个名为EDTASM的工具,编写汇编代码,将其保存回磁带,然后汇编并运行它。听起来很简单对吧?但请记住,使用汇编语言时,你需要处理内存地址。意味着你要硬编码存储数据的内存位置。
并非所有东西都是汇编语言,我们很多人都是从一种叫做BASIC(初学者通用符号指令代码)的小语言开始的。这是许多人进入编程世界的入口。虽然它让我们创建的软件运行缓慢,但它仍然是软件,而且对任何人都可访问。
C语言的未来
啊,C语言。无处不在的语言。即使在2025年,你仍然到处都能看到C语言。从嵌入式开发到一些用Rust编写的包含不安全C代码的软件。
如果你想编写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。所有这些以及更多内容,将在本博客的第二部分中介绍。