第一台计算机一天要花费数百万美元,相当于今天的数千万美元。 促使他们成立的公司一年最多只能卖出几十个。 计算机本身(称为大型机)和制造它们的公司都是巨大,缓慢且笨拙的野兽。 编程是一项缓慢的工作。
七十年代以前,程序员并没有像现在这样直接在计算机上进行编码。 程序员手工编写或键入代码。 然后由数据录入员(有时是程序员自己)将其转换为3 1/4英寸高的打孔卡。 每张打孔卡都是程序的一行,上帝帮助程序员的卡座被打翻或掉落,因为只有最昂贵的打孔机才对卡进行编号。
程序员发明了各种技巧来为遭受这种命运的悲伤日子做准备。 请注意,卡片左侧的标记中绘制的对角线。 如果(或更通常地, 当 )某人放下了纸牌堆,对角线将有助于使它们按正确的顺序排列并返回。
卡片重新排序后-看起来很脏-程序员将在计算机上请求一些时间,并将这批打孔卡提交到队列中(上面的方框是一个队列。不是那么花哨,是吗?)。
在高峰时段,通常排队等候提交一批卡片。 稍后的某个小时(几小时甚至几天),计算机操作员将运行该程序,并将结果的打印输出与打孔卡一起返回给程序员。 如果没有结果,或者有错误,程序员将仔细阅读他们的代码以查找错误,并将其与打孔卡进行比较,以查看是否在按键打孔中犯了印刷错误。
许多早期的生产率改进只是进步,减少了此过程的周期时间。 最终,打孔卡已过时。
大型计算机制造商(例如Rand / Sperry,IBM,Burroughs和Honeywell)将为他们推向市场的每种新型计算机创建一个操作系统(OS)。 操作系统是控制硬件的特殊程序,并提供对计算机上运行的所有其他程序的硬件访问。 直到1964年,几乎没有听说过一种类型的计算机硬件能够运行除其自己独特的操作系统以外的任何软件。
1964年,通过引入带有OS / 360操作系统的IBM System / 360计算机系列,提高了生产率。 该系列计算机是第一个通过通用操作系统在所有系列计算机之间提供互操作性的计算机。 这意味着在一种型号的计算机上编写的程序可以在该系列的任何其他计算机上运行,而无需重写或重新编译。 这本身就是生产率的主要提高,但是它还允许程序员在相对便宜的机器上测试代码(这样可以更轻松地获得时间),然后在更昂贵,更大容量的计算机上运行或生产,从而进一步提高了生产率。
System 360还是一种流行的计算机(以及数字设备PDP-10),用于分时共享服务 。 分时服务局将使用电传打字机银行从同时工作的多个程序员那里收集程序,然后将这些程序通过调制解调器发送到大型计算机,以使用“备用周期”执行,这是高级用户不使用CPU的时刻。优先职位。
这是交互式编程的开始。 但是,仍然没有今天的情况。 有电动打字机而不是屏幕,十秒的响应时间被认为是快速的,而且不必等待几分钟或几小时即可看到程序的结果。 仍然比打孔卡有了很大的改进。
尽管System / 360引入了使用阴极射线管(CRT)的IBM 2250视频显示终端(VDT),但电传打字终端仍然很受欢迎。 只需查看2250的价格即可了解原因。 一个显示器花费超过一百万美元的四分之一。 这相当于今天的两百万美元,相当于System / 360计算机本身的成本。 直到1970年代后期,VDT的价格才变得足够低,以至于它们可以取代电传打字机。
我认为,System / 360对世界的最持久贡献是弗雷德·布鲁克斯(Fred Brooks)的著作《 神话人月》 。 但是那本书直到十年后才会出现,因此您必须等待我在本系列后面的文章中向您详细介绍。
1965年,一家名为Digital Equipment Corporation的新贵公司推出了一款名为PDP-8的小型计算机 。 它很小,因为它只有冰箱那么大。 它也有一个迷你的价格。 一个人可以以与一台System / 360相同的价格购买一打PDP-8。 这意味着一打程序员可以拥有一台“专用”计算机,而以前从未使用过计算机的人现在可以使用。 PDP-8之后是PDP-10,正如我所提到的,PDP-10在创建分时工具中起了重要作用,并且是最终成为Internet的研究项目的骨干,Internet进而创建了黑客社区 。²许多著名的如今,计算机领域的名字从分时服务开始。
十年末,一个时代即将结束。 巨型计算机制造商处在他们看不见的悬崖边缘。 小型计算机和个人计算机(PC)即将改变世界。 到目前为止,硬件设计一直是电气工程师公认的科学和职业,而编程则是具有实际职业(例如数学或物理学)的人出于个人兴趣从事的副业。 但是,随着计算机科学学科的兴起,这种情况发生了变化,该学科专注于编程和软件作为创新的引擎。 软件最终将变得比硬件更重要,在这方面最有影响力的两个人是唐纳德·努斯和唐纳德·迪克斯特拉。
我很遗憾地说,在这里我不会写太多有关Knuth的文章。 他确实是计算历史上最有影响力的思想家之一,但是他的工作稀少,高度数学化,并且对数学语言没有广泛而扎实的理解的任何人都无法访问。 就个人而言,我花了一天的时间阅读他的《计算机编程艺术》的一页,而其中的第七卷长达2000页。 您可能已经猜到:我从未完成。 哎呀,Knuth没完蛋! 50年后,他只出版了七卷计划中的第四卷的第一部分。 他的工作在使计算合法化和发展作为一门科学的过程中起到了很大的作用,但是,以我的拙见,他在提高编程的生产率方面没有起到太大的作用,这就是本书的目的。
迪克斯特拉(Dijkstra)是一位荷兰物理学家和数学家,他非常喜欢编程。 迪克斯特拉(Dijkstra)害怕离开物理学家的崇高职业而从事大多数人认为是业余爱好的工作,但遭到了他的老板的说服,他的数学家放弃了从事编程的学术数学生涯,对他说:“这里有自动计算机。留下来,那只是我们的开始,难道[他,Dijkstra]不能成为在未来几年内将编程成为一门受人尊敬的学科的人之一吗?”。³
迪克斯特拉(Dijkstra)迎接挑战,并致力于做到这一点。
以免读者认为我高估了1957年很少有人想到编程的情况,允许我提供以下轶事:当Dijkstra与Maria C. Debets结婚时,他被要求作为婚姻仪式的一部分来陈述自己的职业。 当局不接受他宣布自己是程序员的声明,因为当时荷兰没有这样的职业。
Dijkstra和其他学者(例如Niklaus Wirth)将大部分精力都集中在ALGOL(本系列第一部分中介绍)作为“结构化编程”的旗手身上。 这是否意味着汇编,FORTRAN和COBOL中的所有编程都是非结构化的? 在某种程度上,是的,我将在下面进一步解释。
在最初的20年编程历史中,该领域中的大多数程序员(都是写在现实生活中使用的程序的人)都是自学成才的。 没有程序员的学校,没有正式的实践,没有知识体系,没有学科可言。 程序员要么从导师那里学习,要么追求自己的直觉和直觉。
1983年,埃德·纳瑟(Ed Nather)在Usenet posted上发布了《梅尔的故事》,这是一个说明这一现实的真正令人愉快的故事。梅尔是一名裸机程序员。 实际上,“裸机”的术语文件条目就是这个故事。
如果您不了解以下故事中的每个字词或技术细节,请不要担心,您仍然会喜欢它,而且我相信您会明白的。 这是对《 Datamation 》杂志编辑的一封有点自重的信的幽默讽刺,这封信回收了1980年代的Real Men Do n't Eat乳蛋饼,并命名为Real Programmers Do n't Use PASCAL⁶作者声称FORTRAN是“真正的程序员”将使用的唯一语言。 Pascal是一种非常结构化的语言,也许是所有语言中最结构化的一种。 故事结束后,我将对此进行解释。
梅尔的故事
最近一篇致力于编程的“男子气概”方面的文章提出了一个光头而未变的声明:
真正的程序员用Fortran编写。
在这个轻度啤酒时代,手持计算器和“用户友好”软件时代,他们也许现在就这样做了,但在“旧时代”中,“软件”一词听起来很有趣,而Real Computers是由鼓和真空管制成的,真正的程序员用机器代码编写。 不是Fortran。 不是RATFOR。 甚至不是汇编语言。 机器码。 原始的,未经修饰的,难以理解的十六进制数。 直。
为了避免新一代程序员在对这个辉煌过去的无知中长大,我有责任尽我所能描述一代代程序员如何编写代码。 我称他为梅尔,因为那是他的名字。
我去梅尔(Royal McBee Computer Corp.)工作时第一次见到梅尔,这家打字机公司现已倒闭了。 该公司生产了LGP-30,这是一种小型的,便宜的(按当今的标准)鼓式存储计算机,而刚开始生产RPC-4000,这是一种经过改进,更大,更好,更快的鼓式存储设备。电脑。 核心成本太高,而且无论如何也无法保留。 (这就是为什么您没有听说过公司或计算机的原因。)
我被雇用为这个新奇迹编写Fortran编译器,而Mel是我探索奇迹的指南。 梅尔不赞成编译器。
他问:“如果程序无法重写自己的代码,那有什么用?”
梅尔用十六进制编写了公司拥有的最受欢迎的计算机程序。 它在LGP-30上运行,并在计算机展览会上与潜在客户打了二十一点。 其效果始终是戏剧性的。 LGP-30的摊位在每个展会上都挤满了人,IBM销售人员围坐在一起互相交谈。 我们是否从未讨论过这个实际出售的计算机是一个问题。
梅尔的工作是为RPC-4000重新编写二十一点程序。 (端口?这是什么意思?)新计算机具有一对一的寻址方案,其中除操作代码和所需操作数的地址外,每条机器指令还具有第二个地址,该第二个地址指示何处,在转鼓上,找到了下一条指令。 用现代的话说,每条指令后都跟着去! 将* that *放在Pascal的烟斗中并抽烟。
梅尔(Mel)喜欢RPC-4000,因为他可以优化代码:也就是说,在鼓上找到指令,这样一个人完成工作时,下一个就可以到达“读取头”并可以立即执行。 有一个程序可以做到这一点,即“优化汇编程序”,但梅尔拒绝使用它。
他解释说:“您永远不知道它将放置在什么地方”,因此您必须使用单独的常量。
我很久以前才明白这一点。 由于梅尔知道每个操作代码的数值,并分配了自己的感光鼓地址,因此他编写的每条指令也可以视为数字常数。 如果它具有正确的数值,他可以选择一个较早的“加”指令,然后乘以该指令。 他的代码对其他人来说不容易修改。
我将梅尔的手动优化程序与优化的汇编程序输出的相同代码进行了比较,而梅尔的运行速度始终更快。 那是因为还没有发明程序设计的“自上而下”的方法,而Mel也不会使用它。 他首先编写了程序循环的最内部部分,因此它们将成为硒鼓上最佳地址位置的第一选择。 优化的汇编程序还不够聪明,无法做到这一点。
即使笨拙的Flexowriter需要输出字符之间的延迟才能正常工作,Mel也从未编写过时间延迟循环。 他只是将指令放在鼓上,所以每一个连续的指令在需要时都只是“过去”了。 鼓必须再执行一次完整的旋转才能找到下一条指令。 他为这一程序创造了一个难忘的名词。 尽管“最优”是一个绝对术语,例如“独特”,但使其相对成为一种普遍的口头惯例:“不是很理想”或“不太理想”或“不是很理想”。 梅尔称最大延时位置为“最悲观”。
在他完成了二十一点程序并使其运行之后(“甚至优化了初始化程序”,他自豪地说),他从销售部门收到了“变更请求”。 该程序使用了一个优雅的(优化的)随机数生成器来混洗“卡片”并从“卡片组”中进行交易,一些销售人员认为这太公平了,因为有时客户会流失。 他们希望梅尔修改程序,以便在控制台上设置感应开关时,他们可以改变赔率并让客户获胜。
梅尔退缩了。 他认为这显然是不诚实的,而且确实影响了他作为程序员的个人品格,因此他拒绝这样做。 首席销售员与梅尔(Mel),大老板(Big Boss)进行了交谈,并在老板的敦促下,与一些资深程序员进行了交谈。 梅尔终于屈服并编写了代码,但他却倒退了测试,当打开感应开关时,程序就会作弊,每次都赢。 梅尔对此很高兴,声称自己的潜意识是无法控制的道德,并坚决拒绝解决。
在梅尔离开公司以更环保的态度离开之后,大老板让我看一下代码,看看我是否可以找到测试并撤消它。 我有点勉强地同意看。 跟踪梅尔的代码是一次真正的冒险。
我常常觉得编程是一种艺术形式,只有真正精通同一奥术的人才能欣赏它的真正价值。 这个过程的本质使人们看不到可爱的宝石和出色的妙招,有时甚至永远无法掩盖。 您可以通过阅读代码(即使是十六进制的代码)也可以学到很多关于一个人的知识。 我认为梅尔是一个无名的天才。
也许当我发现一个没有测试的无辜循环时,我最大的震惊就来了。 没有测试。 *没有*。 常识说,它必须是一个闭环,程序将在其中无限循环。 但是,程序控制直接通过它,并安全地从另一端通过。 我花了两个星期才弄清楚。
RPC-4000计算机具有称为索引寄存器的真正现代化的功能。 它允许程序员编写程序循环,该循环使用内部的索引指令。 每次通过时,索引寄存器中的数字都会添加到该指令的地址中,因此它将引用系列中的下一个数据。 他只需要每次都增加索引寄存器。 梅尔从未使用过它。
取而代之的是,他会将指令拉入机器寄存器,在其地址中添加一个,然后再存储回去。 然后,他将直接从寄存器执行修改后的指令。 编写该循环是为了考虑到这一额外的执行时间-就像该指令完成时一样,下一条指令正好在感光鼓的读取头下方,可以开始使用。 但是循环中没有测试。
当我注意到索引寄存器位(位于指令字中的地址和操作代码之间的位)被打开时,最重要的线索就出现了-但梅尔从未使用索引寄存器,一直使它为零。 当光亮时,我几乎看不见了。
他将正在处理的数据放置在内存顶部附近(指令可以寻址的最大位置),因此,在处理完最后一个数据之后,增加指令地址将使其溢出。 进位将向操作码添加一个,从而将其更改为指令集中的下一个:跳转指令。 果然,下一条程序指令位于地址0处,程序顺利进行。
我没有与Mel保持联系,所以我不知道他是否曾经屈服于自从那些漫长的日子以来淹没在编程技术中的大量变革。 我喜欢认为他没有。 无论如何,给我留下了深刻的印象,我放弃了寻找令人讨厌的测试,并告诉大老板我找不到它。 他似乎并不感到惊讶。
当我离开公司时,如果您打开正确的感应开关,二十一点程序仍然会作弊,我认为应该是这样。 我对破解Real Programmer的代码感到不自在。
正如这个故事很好地说明的那样,前几代程序员已经习惯了使用特有的方法和高度个性化的编程风格来按自己的意愿进行操作。 有时候,他们之间对学者及其为促进结构化程序设计所做的努力感到不满。
为了使非程序员的读者受益,结构化编程的概念与编程语言紧密相关,因此人们称其为“结构化编程语言”,有时也简称为“结构化语言”。 在非结构化语言中,代码的格式不会为我们提供有关控制流 (执行语句或指令的顺序)的任何线索。 这是用伪代码 (不是用任何特定计算机语言编写的程序的描述)写成的样子:
1 START PROGRAM
2 GET list_of_names from user
3 COUNT = number of items in list_of_names
4 READ first item from list_of_names
5 DO thing a
6 DO thing b
7 IF result of thing b is TRUE GOTO line 11
8 DO thing c
9 DO thing d
10 END IF
11 DELETE first item from list_of_names
12 SUBTRACT 1 from COUNT
13 IF COUNT = 0
14 EXIT
15 END IF
16 GOTO LINE 4
17 END IF
18 END PROGRAM
只要列表中有要处理的名称,该代码就会循环,并且如果第7行的结果“评估”为TRUE,它将跳过第8和9行。 只需看一眼,该代码的结构就不会告诉您。 您必须逐行阅读才能知道。 即使这样,也没有线索告诉您第8行和第9行是特殊情况,“事物b的结果”通常为TRUE。
“结构化语言”将是不提供GOTO指令(上面的第7和16行),而是提供更高级别的概念(如WHILE和FUNCTION)的语言,如下例所示:
START PROGRAM
GET list_of_names from user
WHILE list_of_names is not empty
READ first item from list_of_names
DO thing a
DO thing b
IF result of thing b is TRUE
DO somethingSpecial
END IF
DELETE first item from list_of_names
END WHILE
FUNCTION somethingSpecial
DO thing c
DO thing d
END FUNCTION
END PROGRAM
这两个示例执行相同的操作; 但是,结构化编程的支持者认为,第二种方法更具可读性,较少出错,并且易于编写/更快,因此提高了生产率。 尤其重要的是可读性,因为在发生这种情况时,程序员要花更多的时间来阅读已经编写的代码(即使是自己编写的代码),而不是编写代码。time
六十年代,迪克斯特拉发表了七篇论文。 在1996年对一千多名计算机科学教授进行的民意测验中,其中四篇论文被选为有史以来有关计算机科学的38篇最具影响力的论文之一。 但是到目前为止,他最知名的贡献是为保护结构化编程而写的一小段短五页的信,该信于1968年发送给当时计算机科学领域的领先期刊《计算机协会 》 杂志的编辑。 迪克斯特拉(Dijkstra)给这封信写了一个不切实际的标题: “反对Goto声明的案例” ,但编辑Niklaus Wirth(于1970年创建Pascal)使用当时流行的新闻陈词滥调地将标题更改为“ Go To Statement About Harmonful ” 。
给编辑的这封信引发了至少二十年的争论,并且(可能)仍然是有史以来最知名的(但也许读得最少的)计算机科学文章。 寻找当代的引文和讨论不必走远。 该出版物在许多方面都具有重要意义,尤其是它引发了最早的(也许是第一个) 好家伙其中⁸或宗教战争 真正的程序员不使用PASCAL和梅尔的故事都只是小例子。 从1970年起,狂热的倡导和极权主义者对竞争性概念模型的至高无上的主张将标志着编程的进步。
编程(可能比其他任何应用科学都重要)激发了对完美和纯净的狂热追求。 弗雷德·布鲁克斯(Fred Brooks)提出,这可能是由于以下事实:“ 与诗人一样,程序员的工作仅与纯粹的思想观念有所不同。 他通过发挥想象力在空中空中建造城堡。 很少有创作媒体如此灵活,易于抛光和返工,因此能够实现宏伟的概念结构。”⁹
《 商业内幕 》( Business Insider)在2015年1月的一篇文章中对“ 程序员为什么会因编程语言而陷入'宗教战争' ”这一浪漫的解释,说:“ ……每种编程语言所代表的哲学与产品所代表的意义一样。”
自从发表《认为有害的声明》以来,就没有缺乏发动战争的理由。 在其出版之前,仅创建了200种语言,但是从那时起,又产生了数千种语言。
在本系列文章中,我将不再写许多重要的语言,因为我特别关注企业IT和IT项目失败。 例如,我喜欢Python和Ruby语言,但是它们在公司IT和项目失败中没有扮演重要角色。 相反,您会发现研究人员正在使用Python进行数据挖掘和人工智能。 而且,Python和Ruby都经常出现在Google,Dropbox或Uber这样的互联网公司中,而在创业公司中也很常见。
我认为1949年后的头二十年是编程的黑暗时代。 从那时起,没有多少历史文献可供编程 。 有关计算机本身的历史文档很多。 如我先前所写,硬件工程受到高度尊重和认可。 电气工程行业的组织得很好,有据可查,并且被认为非常重要。 然而程序员却默默无闻。
典型的程序员是自学成才的,具有高度的内在动力。 除了少数年轻的神童外,程序员比以前受过高等教育的可能性更高,他们通常拥有硕士或博士学位,这就是他们成为计算机附近的任何事物的开始。 他们往往是非常聪明的一群。
没有程序员的学校或课程,而当计算机花费数百万美元时,就不会有临时的程序员。 仅仅由于当时成为一名程序员有多么困难,它们才是人类最耀眼的光芒。
对于我们所知道的每一个Dijkstra或Knuth或Wirth,都有一千个Mels,它们创造出纯净的天才,优雅和稀有之美的作品,这些东西将永远丢失,因为磁带和打孔卡保留了最深刻的思想。隐藏的一代变得过时,被毫不客气地装在了看不见的盒子里。
“程序员的麻烦在于,在为时已晚之前,您永远无法说出程序员在做什么。”
〜西摩·克雷
克雷超级计算机的发明者
[1] 恐龙 :n .:任何需要高架地板和特殊电源的硬件。 与较新的基于微处理器的机器相比,尤其适用于旧的小型机和大型机。 在1998年Unix EXPO的一句名言中,比尔·乔伊(Bill Joy)将大型IBM显示器中的液冷大型机与一只吃草的恐龙“用卡车在外面泵送体液”进行了比较。 IBM并不感到高兴。 比较大铁 ; 另请参见大型机 。 http://www.catb.org/jargon/html/D/dinosaur.html
[2] http://www.catb.org/jargon/html/T/timesharing.html
[3] Dijkstra,EdsgerW。“谦虚的程序员”。 ACM通讯 ,第15卷,没有。 1972年10月,第859–866页。 计算机器协会(ACM) ,doi:10.1145 / 355604.361591。
[4] EW Dijkstra存档 。 &James,Mike(2013年5月1日)。 “ Edsger Dijkstra-编程诗 ” 。
i-programmer.info。 于2015年8月12日检索。
[5]“ Usenet是全球性的分布式讨论系统” https://en.wikipedia.org/wiki/Usenet
[6] Post,Ed(1983年7月)。 “真正的程序员不使用Pascal” 。 数据化 。 ( 原始内容 存档 于2012-02-02)。 “……真正的程序员使用FORTRAN。 吃乳蛋饼的人使用PASCAL…”
[7] Martin,Robert C.和Lei Han。 干净的代码。 电子工业出版社,2012
[8] http://www.catb.org/jargon/html/H/holy-wars.html
[9] Brooks,Frederick P. 神话般的月刊和其他有关软件工程的文章 。 教堂山,北卡罗来纳大学教堂山分校计算机科学系,1974年,第21页
[10] http://www.businessinsider.com/why-coders-get-into-religious-wars-over-programming-languages-2015-6
本文是我即将出版的《混沌工厂》一书的节选,该书解释了为什么大多数公司和政府无法编写“有效”的软件,以及如何对其进行修复。
From: https://hackernoon.com/https-medium-com-it-explained-for-normal-people-big-iron-6aee4e32ed51