我媽 1969 年學(xué)編程,那時(shí)候程序員是怎樣寫代碼的
前段時(shí)間,人類登月 50 周年,我們推送阿波羅飛船制導(dǎo)軟件的負(fù)責(zé)人 Margaret Hamilton 的文章,她是上世紀(jì)六七十年代的先鋒人物。
此外,我們還在微博發(fā)了另外一個(gè)阿波羅計(jì)劃女程序員的故事,母女兩代都是程序員。
(有人誤解成 Lin Clark 的媽媽是 Margaret,其實(shí)不是)
今天在 Reddit/programming 看到一篇熱文,看標(biāo)題的第一眼,我以為又是和阿波羅計(jì)劃相關(guān)的故事。
打開后發(fā)現(xiàn),雖然不像阿波羅計(jì)劃故事那樣偉大,但還也是一個(gè)兩代都是程序員的故事。那個(gè)時(shí)代,大學(xué)里都沒有編程課,我們可以從中了解到當(dāng)年第一批程序員是怎么樣學(xué)習(xí)和工作流程……
原作者 Emil Ernerfeldt 是一個(gè)瑞典斯德哥爾摩程序員,他媽媽 Marianne Ernerfeldt 出生于 1947 年,高中沒畢業(yè)時(shí)就想當(dāng)程序員。該文是 Emil 在 2018 年 12 月采訪媽媽所寫。
為什么你想當(dāng)程序員?
大約是 1965~1966 年,我決定成為一名程序員。我讀過一篇文章,上面有一幅流程圖,看到我就想“這個(gè)適合我”。
1967 年我高中畢業(yè),那時(shí)候的大學(xué)還沒有教編程,但索爾納有一個(gè)為期 6 個(gè)月的課程,后來變成了 12 個(gè)月的課程。而且我有資格申請(qǐng)學(xué)生貸款,于是我就申請(qǐng)了。
與此同時(shí),瑞典的國有鐵路公司 SJ 發(fā)布了招聘實(shí)習(xí)生的廣告,提供為期一年的帶薪培訓(xùn)項(xiàng)目,你可以學(xué)習(xí)了解 SJ 運(yùn)營的所有不同部門。SJ 有一個(gè)計(jì)算機(jī)部門,所以我也申請(qǐng)了,希望能進(jìn)。
然而,SJ 的 50 個(gè)實(shí)習(xí)生名額,結(jié)果有 700 人申請(qǐng),所以有一個(gè)復(fù)雜的篩選過程和各種各樣的測(cè)試。最終我進(jìn)去了!
還要說一句,當(dāng) SJ 管理層發(fā)現(xiàn)實(shí)習(xí)生項(xiàng)目手冊(cè)同時(shí)發(fā)給了男學(xué)生和女學(xué)生時(shí),他們非常不高興!被錄取的女性并不多,但我們是少數(shù)。
在培訓(xùn)期間,我們參觀了 SJ 的所有部門,了解了從火車和鐵路到通信工作原理(SJ有自己的電線和電話線)。一年之后,我從實(shí)習(xí)生轉(zhuǎn)正了,但那是一份無聊的工作。
終于在 1969 年,我聽說 SJ 開始了一個(gè)內(nèi)部編程培訓(xùn)項(xiàng)目,所以我申請(qǐng)了。經(jīng)過更多的測(cè)試,我和另外三個(gè)人在 1969 年開始編程培訓(xùn)。我們是兩個(gè)女生和兩個(gè)男生。
(1976 年的 IBM System/370 )
編程培訓(xùn)是怎么樣的?
首先,我們參觀了 SJ 公司的計(jì)算機(jī)部門,并拿到了計(jì)算機(jī)是什么的綱要等材料。然后我們?cè)?IBM 上課,IBM 在斯德哥爾摩的一棟大樓里有一臺(tái)“訓(xùn)練機(jī)”。我們班上大概有50~100人,但我們被分開了,每個(gè)教室里有 8 個(gè)人。教室前面有 2 個(gè)電視屏幕。老師在另一個(gè)房間,每個(gè)老師大概對(duì)應(yīng) 10 個(gè)教室,每個(gè)教室的人都可以用按鈕吸引注意力,然后用麥克風(fēng)提問。超現(xiàn)代的!
首先我們學(xué)習(xí)了一些關(guān)于 IBM OS 的知識(shí),然后我們學(xué)習(xí)了 PL/I,這是 IBM 自己的編程語言。它是 Cobol 的一個(gè)更現(xiàn)代的版本,具有 Cobol 還沒有(但以后會(huì)有)的特性,比如生成表和查詢。所以 PL/I 在當(dāng)時(shí)是一種更好的編程語言,也更簡(jiǎn)單??梢允褂糜⒄Z單詞編寫代碼,比如 DO WHILE 等。它是一個(gè)非常好的編程語言!
在瑞典,政府機(jī)構(gòu)處于數(shù)據(jù)處理的最前沿,銀行和其他機(jī)構(gòu)遠(yuǎn)遠(yuǎn)落后。因此,在 IBM 的課程中,雖然大多數(shù)是來自其他機(jī)構(gòu)的人員,但 SJ 處于最前沿。
在學(xué)完第一個(gè) IBM 課程之后,我回到了 SJ,開始了我的第一個(gè)實(shí)踐項(xiàng)目。我們四個(gè)人做了一個(gè)約會(huì)程序,你可以輸入男性和女性的特征,然后用我們自己發(fā)明的算法計(jì)算匹配,然后我們開始編寫項(xiàng)目代碼!
后來我學(xué)了更多的課程,比如匯編。我們有一位主管在工作中幫助我們。
(我畫流程圖的模板)
你的工作怎么樣?
我們先畫流程圖,然后用鉛筆寫代碼。然后把代碼交給打孔機(jī),代碼將被打孔到打孔卡上。打孔卡有 80 列,其中 72 列用于代碼,8 列用于排序,所以每一行代碼最多可以有 72 個(gè)字符寬。
(程序員的那些事 注:打孔卡有 80 列,這個(gè) 80 是不是很熟悉呢? 現(xiàn)在有些編程規(guī)范中,仍然在強(qiáng)調(diào)每行代碼不要 80 個(gè)字符。)
你必須把代碼寫清楚,這樣操作打孔機(jī)的女性才能讀懂。在 SJ 工作了幾年之后,我們找到了幾個(gè)專門負(fù)責(zé)讀取我們代碼的人,他們真是幫了大忙。他們主要會(huì)打數(shù)據(jù)卡:來自 SJ 的時(shí)間報(bào)告、每節(jié)火車車廂行駛了多遠(yuǎn)等等。打孔機(jī)看起來像一臺(tái)普通的打字機(jī),可以在卡片上打孔。在每一列上面,它還將以明文輸入字母。
(IBM 的打孔卡)
我們也曾經(jīng)在打孔卡上放蛋糕,所以打孔卡的用途很廣的。
剛開始的時(shí)候,程序很小,但后來可能變成幾米長的卡片盒。每一行代碼都變成了一張打孔卡。每一行和每一張卡片有一條指令。所以打孔機(jī)會(huì)把程序(成千上萬張卡片)還給我們。
我們還必須創(chuàng)建“控制卡”,由它來決定某個(gè)穿孔卡是要編譯還是要執(zhí)行,以及它是什么語言等等。控制卡有一個(gè)單獨(dú)的顏色。第一張卡片是一張工作卡,上面有我的名字,所以打孔機(jī)操作員知道該把東西還給誰。
我們把打孔卡盒放在一張?zhí)厥獾淖雷由稀?/span>操作員穿著白大褂來了,拿著盒子去運(yùn)行程序。
有時(shí)候,我們每天只有一次運(yùn)行程序的機(jī)會(huì),因?yàn)槲覀兂绦騿T在機(jī)器大廳中的優(yōu)先級(jí)最低。所以我們不得不同時(shí)做幾個(gè)項(xiàng)目,以保持忙碌,不至于閑著。
最后,這些卡片連同“睡衣紙”一起送還,其中包含錯(cuò)誤代碼和行號(hào)。
(Pajama paper /睡衣紙)
我們有機(jī)會(huì)打幾個(gè)孔,這樣我們就可以自己做一些小的修正。
然后我們必須創(chuàng)建測(cè)試文件,看看程序是否產(chǎn)生了預(yù)期的結(jié)果。如果沒有,你就會(huì)坐下來做“桌面測(cè)試”(用筆和紙思考),試著想想“到底出了什么問題?” 因此,要使程序正確運(yùn)行,可能需要相當(dāng)長的時(shí)間。
我們有幾臺(tái)機(jī)器。我們從一開始就有 IBM 360 大型機(jī),還有一些更老的機(jī)器。后來我們得到了 IBM 370。
在 70 年代末,公司有了 Alfaskop 終端機(jī),但我們沒有個(gè)人的終端機(jī),而是共用一個(gè)終端機(jī)室。如果我們想要對(duì)程序進(jìn)行更改時(shí),不得不爭(zhēng)用終端機(jī)的時(shí)間。程序會(huì)在屏幕上出現(xiàn),我們可以修改。在 1979 年離開 SJ 之前,我從未擁有過自己的終端機(jī)。
Alfaskop 3700
說說你的同事
SJ 的計(jì)算機(jī)部門大約有 40 名程序員和系統(tǒng)工程師。我所有的同事都像我一樣,在公司內(nèi)部接受培訓(xùn),只有少數(shù)例外:有幾個(gè)和我年齡相仿的人參加了我之前提到的索爾納為期 6 個(gè)月的課程。但除此之外,沒有其他的方法來學(xué)習(xí)編程——因?yàn)檫@是一個(gè)全新的職業(yè)!有些同事曾經(jīng)是司機(jī)!大多數(shù)人甚至沒有高中文憑。
系統(tǒng)工程師的工作主要與規(guī)格、程序的輸入和輸出等有關(guān)。作為程序員,我們是問題的解決者,我們制作流程圖并找出解決問題的方法。
在機(jī)器大廳里大約有 10 名機(jī)器操作員。他們穿著白大褂,處理磁帶存儲(chǔ)、磁盤和打孔卡。我們很少被允許進(jìn)入機(jī)器大廳的內(nèi)室。入口處有一個(gè)“關(guān)門”的牌子。
機(jī)器大廳很大。早期的機(jī)器(IBM 1400)占地約 10~20 m²,但后來的機(jī)器是小冰箱那樣的體積。
打孔卡部門由 50 名年輕女性組成。如果 SJ 其他部門想拜訪計(jì)算機(jī)部門,最有趣的肯定是打孔卡部門,因?yàn)樵?SJ 的大多數(shù)人是男性咯!
在我們 40 名程序員中,只有 5~6 個(gè)女性。我是這群年輕人中的一員,但大多數(shù)程序員都比我大 10 歲左右(我出生于 1947 年)。在 70 年代末,我們招了一些新員工,他們接受了為期 12 個(gè)月的培訓(xùn)。
你做了什么?
1969 年春天,SJ 在線預(yù)訂服務(wù)推出了,24/7 運(yùn)行時(shí)間。它在當(dāng)時(shí)非常先進(jìn),完全是用匯編程序編寫的。這是 SJ 非常出色的一點(diǎn),在瑞典沒有其他公司能和我們相提并論。我很幸運(yùn)能在這樣一家敢于冒險(xiǎn)的公司接受教育!
我們創(chuàng)建程序,一旦完成并經(jīng)過測(cè)試,就把交給別人。其他人負(fù)責(zé)維護(hù),我們負(fù)責(zé)編寫新的程序!主要是收集關(guān)于鐵路運(yùn)營的統(tǒng)計(jì)數(shù)據(jù)(例如工資單),然后這些程序?qū)⒍ㄆ谶\(yùn)行(例如每個(gè)月)。
1979 年,在 SJ 工作了十年之后,我跳槽去了銀行部門工作。