如果硬件故障能够排除,那么最可能的错误源就是问题的编码。遗憾的是,理查德·布洛赫回忆说,编码容易遇到各种疏忽和谬误。一个编码师可能取了错误的运算数或者错误的算术运算。错误可能出在编码师的输入常量或初始值的计算上。遗漏和重复在编码师将指令转化成机器语言的过程中很常见,而穿孔带、穿孔卡片和插线板指令的准备也容易导致人为失误。“我们必须一步一步地检查操作,”坎贝尔明确地表示,“直到我们发现不对的地方,接着对照着电路表,试着弄清楚问题所在。”这不是一个简单直接的过程,因为编码错误可能会伪装成插头问题等。 马克一代的编码需要全面地考虑大量细小的步骤,然后书写出实施这些步骤的指令。例如,我们用离开房子去取邮件来做个类比。在高级计算机语言中,这套等义指令会类似于“走出前门,沿着马路一直走到街道的岔口处,然后你的左边就是邮箱”。在马克一代机器语言中,定义的指令可能听起来更像“找出你的右脚,将你的右脚向前一步,然后找出你的左脚,将你的左脚放到右脚前,重复此动作二十次……”为了将错误减到最少,霍珀必须将编码的细节都牢记于心,而不能在此过程中让步骤出现混乱。 解决这一问题需要发明防护性的工具、做法和方法。编码最初是用笔在标准编码纸上一行一行地手写出来的。编码纸留有注释的地方,能够让霍珀和布洛赫在每行编码的旁边附上方程式解释和书面说明。一份完整注释了的编码纸为问题提供了整洁易懂的记录,能够让第二个人进行复查核对。 计算机操作员拥有能够帮助他们从头至尾操作程序的明确说明书。对照插接图复查所有的插线板,重新设置控制数据开关编程了的标准操作步骤。在遇到故障的情况下,必须严格遵从再运行的指令,穿孔卡片上的初步输出数据在被重新输入之前会按照原始数据进行手工比较。正如布洛赫所回忆的,为了减少手工操作的错误和减少运行的时间,最好的编程技巧要求将操作员的干涉降到最少。 哈佛团队在战争时期没有做的事是钻研进行自动检查的硬件的可能性。尽管在贝尔实验室大家意识到了,并将大量的精力投入创建自检电路中这一情况,但是坎贝尔和艾肯最初并未预见此附加设计的需求,甚至是在未来的计算机中。“我认为,我们感觉这已经有了足够可靠的部件……我们在没有机械自检能力的情况下也会成功。”坎贝尔回忆说。 无故障穿孔纸带和操作员说明书并不能保证成功的结果。硬件运作自身就存在潜在的故障。错误的开关和继电器设置、不当插线、未能遵从再运行指令和数据穿孔卡片的错误排列都会为获得快又准的结果带来了巨大的挑战。不当的硬件操作甚至会具有致命性,一个叫做David Green的操作员不小心将其领带卡在了序列机制中而差点窒息而死的案例正好说明了这一点。 硬件臭虫、编码臭虫和操作臭虫的横行肆虐威胁到了第一台计算机的成功。让哈佛马克一代逃离失败的唯一法宝就是格雷斯·霍珀、理查德·布洛赫、罗伯特·坎贝尔和其他哈佛工作人员所设计出的独特性能和有效的操作方法。到了1946年春,罗伯特·伯恩斯回忆说,布洛赫“已经到了对程序了如指掌的程度,他能够告诉你哪个继电器出现了故障,哪个计数器坏了。”在承受着战争的冷酷压力的时候,他们已经掌握了马克一代。