电话

18600577194

当前位置: 首页 > 资讯观点 > 软件开发

回溯软件开发的历史与未来(第一部分)

标签: 2025-11-13 

即使我们只回溯几年,软件工程看起来也会有些不同。但如果我们将时间回溯20年,70年呢?我们甚至还能认出那时的软件开发方式吗?

在这个时代,我们开发者已经习惯了拥有完美的开发环境。从精心调整的vim/emacs设置到这些巨大的AI驱动的套件,使软件开发变得如此方便。内置的语言服务器、检查器、自动文档生成、语法高亮,甚至是版本控制。所有这些都是现代软件开发生态系统的一部分。我们都在享受梦想!

然而事情并非一直如此。即使我们回溯几年,情况看起来也会有些不同。但如果我们将时间回溯20年、40年、70年呢?我们还能否认认出那时的软件开发方式?让我们一起来探索,看看软件开发的历史是怎样的,以及我们未来可以期待什么。

用这张卡做什么?

你知道为什么一些文本编辑器和开发者在达到80列后喜欢将他们的代码换行吗?即使Python自己的PEP 8 Style guide也建议这样做!好吧,这与打孔卡有关。是的,打孔卡,当我们试图想象20世纪60年代的计算机时,我们都会想到的东西。那时,我们的软件开发同行使用打孔卡在大型主机计算机上存储和执行代码。

实际的开发并不是在卡片本身上进行的,而是编写在一个叫做编码表的东西上。这是一个通常为绿色和白色的纸张,程序员会在上面编写代码和调试代码。这些表实际上可以容纳多行代码。你可以在这里看到一个例子:

一张旧的打孔卡

然后这些卡片会被送到一个“打孔卡部门”,在那里它们会被转换成实际的打孔卡。这通常是在像IBM 029这样的机器上完成的。IBM 029。这张卡上最多可以容纳80个字符(包括空格)。就是这样。如果超过这个限制,你需要一张新卡。这意味着你的单个编码表可能会生成多个卡片。

在那个时候的任何重要软件,都需要大量的打孔卡片。是的,1000行代码需要1000张卡片。而且你需要按顺序排列它们。现在,想象一下掉落那堆1000张卡片!这需要我很久才能把它们重新排列好。当时的开发者经常遇到这种情况——所以一些人采取了创造性的方法来表示这些卡片的顺序。

那么这些打孔卡发生了什么,它们是如何使用的?通常它们用于批处理。这意味着你会把一叠卡片送到一个计算中心,在计算时间可用时他们会运行你的软件。这是一次性的,如果失败了——就失败了。你必须在纸上调试并再次尝试。听起来很可怕,但在当时这是革命性的。

如果你想尝试自己编写打孔卡,有人制作了这个优秀的基于网页的模拟器,试试看吧!

我们在家里就可以 编程。

让我们从商业和大型机的世界中退一步,回家吧。让我们见见我们的卧室编码员。到20世纪70年代中期,负担得起的家用计算机开始成为现实。计算机不再只是工作的东西,业余爱好者开始使用计算机进行个人事情——也许我们可以称之为,我不知道……个人计算机。世界Altair 8800、IMSAI 8080、Commodore PET、Apple II和TRS-80的领域正在向开发者靠近。

有了这些计算机,我们既回到了过去,又走向了未来。由于它们的局限性,任何重要的软件都必须用机器码或汇编语言(或在某些情况下,实际翻转开关)。这使得开发者能够通过移动比特来充分利用硬件。汇编语言的语法取决于计算机使用的架构(Z80、MOS 6502、Intel 8080...),有时甚至取决于所使用的汇编器。

注意:

汇编器 和 汇编 通常被互换使用。但在实际上,它们是两种不同的东西。汇编 是实际的语言,语法—指令的使用,会与架构紧密耦合。而 汇编器 是将你的 汇编代码 转换为 机器代码 的软件,即你的计算机知道如何执行的代码。

例如,在 Commodore 64上,ADC $c汇编代码通过汇编器$69 $0c转换成机器代码。

一个用于TRS-80计算机系统的汇编语言代码片段。

一个用于TRS-80计算机系统的汇编语言代码片段。它包括LDA、LDX和STA等指令,以及内存地址#$400和#$600。通过使用START、SCREEN和WAIT等标签来组织代码。

这里的开发环境是什么样的?让我们以Tandy TRS-80 Model 1为例。开发者(称这个时代的开发者为“devs”感觉很奇怪)会通过工具,通过EDTASM磁带加载,编写汇编代码,将其保存回磁带,然后汇编并运行。听起来很简单对吧?但是记得我之前说的“...通过移动比特...”吗?对于汇编,你需要处理内存地址。这意味着,你需要硬编码数据存储的内存位置。那么编辑器呢?编辑器是否也存在于相同的内存中?是的,它确实存在,你必须考虑到这一点,因为它可能会存在于你想要在PROD中使用的地址范围内(这感觉真的很奇怪)。

例如,当我为 Commodore 64编写一些汇编代码时,我会根据我当前是在编写软件还是将软件推送到生产环境,使用两种不同的ORG定义(我的起始内存位置)。在开发过程中,我的汇编器和编辑器会干扰工作。嗯……这一定是第一个出现“但在我的机器上可以运行”的情况

不是一切都是汇编语言,我们中的许多人(包括亲爱的读者你)都是从一种叫做BASIC(初学者通用符号指令代码)的小语言开始的。这是许多人进入编程世界的一个入口。虽然它允许我们创建非常缓慢的软件,但它仍然是软件,并且对任何人都是可访问的。我第一行代码是在 Commodore 64 上用 BASIC 编写的。

在你最喜欢的C64模拟器中尝试这段简单的代码。

10 PRINT CHR$(205.5+RND(1));

20 GOTO 10

无处不在的C

啊,C!这种语言无处不在。即使在2025年,你仍然会在很多地方看到C。从嵌入式开发到甚至一些用Rust写的包含不安全C代码的软件。我在高中时第一次接触C。那是2004年,我们使用了精彩的Borland C(不是C#或C++... C)。C是由Dennis Ritchie在贝尔实验室于1972-73年创建的。它最初是为在Unix上运行的实用程序而制作的(据说你仍然可以在互联网上找到一个非常早期的C编译器的源代码)。C语言在20世纪80年代才广泛流行。

如果你想写C语言,你需要了解"K&R C"。这实际上是一本书,由Dennis Ritchie和Brian Kernighan所写,这本书已经成为 C语言的圣经。无论你使用哪个版本的C语言,这本书中的内容必须能工作。这是我高中时得到的书之一,也是让我真正喜欢上C语言的原因。

好的,那么开发人员在过去(甚至现在)是如何使用 C 语言来编写软件的?他们是如何知道需要做些什么的?

一个编码环境的截图,可能是Borland C++ IDE,显示了一个名为NONAME00.CPP的单个程序文件。程序包括 #include 

让我们从学习书籍开始。是的,书籍!由于语言(及其框架)相当简单(没有7^32个JavaScript框架),当时的软件工程师只需从几本书中就能了解所有内容。

封面标题为《ANSI C 书籍》

封面标题为《ANSI C 书籍》。标题下注明“使用 C 语言编程”,并显示作者名字“Al Kelley 和 Ira Pohl”。顶部可见“第二版”,字体清晰且粗重。

这些不仅仅是参考文档,而是展示了C语言可能性的书籍。然后你只需找一个热衷于软件开发的工程师,让他们尽情想象这种神奇的新(或旧)语言所能带来的可能性!当我尝试学习汇编时,我也曾有过类似的经历——语法很简单,但通过实验和创意,你可以走得非常远。

那编写软件呢?他们当时使用git吗?不,git直到2005年才出现,所以当时软件版本控制还是相当手动的工作。从开发人员自己管理本地源代码到甚至有墙上的图表,开发人员可以“宣称”对某些源代码文件的所有权。对于那些能够使用共享(多用户)系统或拥有早期的某些网络存储版本的人来说,分享源代码就像分发软盘一样简单。

那时,迭代速度很慢。软件以物理媒介形式发布(主要是),而空中更新并不普遍(某些软件可以通过调制解调器进行更新,但这不是大多数用户的常规做法)。因此,像我们今天这样体验用户反馈并不那么迅速。

如果你从未有机会使用C语言,在你的ESP32上放下MicroPython实现,给C语言一个机会。这需要你一些时间来适应,但因为许多现代语言的灵感都来自于C语言,你应该能够完美地融入其中。只是要小心处理所有的垃圾。

停下来,闻闻90年代的气味

好的,我在这个帖子上已经聊够了。我们先暂停一下,回顾一下在过去的30多年里我们取得了多大的进展。从绿色纸张和穿孔卡片,到移动比特和编译C语言。嗯,实际上并没有那么远。如果你看看C语言,它的“Hello World”示例与FORTRAN语言的差异并不大。

#include <stdio.h>

int main() {

  printf("Hello, World!\n");

  return 0;

}

问题是,我们进行软件开发的方式将会大规模地在未来几十年内加速变化。从面向对象编程到网络。从JVMs到LLMs。所有这些以及后续更多内容,将在本文的第二部分中讨论。我会在接下来的几周内在北京心玥软件公司资讯观点版块上发布第二部分。请确保在那里继续阅读!