一個程序員的遠古追憶——葵花寶典

  張無忌之所以最后能成為張無忌,其中一個重要的原因是他撿到了瀟湘子掉的《九陽真經》,不然恐怕連命都不保了,就自然不用說后面沾小昭的光學到《乾坤大挪移》,再然后的什么明教教主、郡主駙馬之類的就更不用想了。同樣段譽要不是誤打誤撞看到了《六脈神劍》,大概也就不需要想象以后的逍遙日子了。所以說,要想當個武林高手,總得有本武林秘籍。甭管是掉洞里撿的,還是街頭給老流氓忽悠買的,總之得弄上那么一本。

  其實學電腦學編程,道理是一樣的,你得弄本寶典。先不說弄來了學得會學不會,至少嘛,需要撐個場面的時候,拿出來嚇唬嚇唬人得保證有效先。想當年我就是抱著這種想法,忍痛割舍了十幾根冰棍錢,弄了本《QBasic 程序設計》。不過現在回想起來,看樣子沒上當,多少是從這些寶典里面學到了一些本事,確實沒白虧了那點冰棍錢。

  要說我怎么就這么好運氣呢。九十年代那會,對我們這樣的小P孩來說,撿個武林寶典還確實不是什么難事。為什么這么說呢? 說起來這個主客觀原因還都有。

  首先說主觀原因,那時候其實不管是個什么書,有本書看,尤其是有本編程的專業書看,這本身就是件不容易的事情。所以說,先不管好書賴書,反正找著本書可以肯定的是當初我們這種小孩一定是好好看認真看的。所以就算寫的再糟糕,能寫出書來的人畢竟多少是有些水準的。因此但凡是書,只要認真的讀了,就一定能夠多少學到些本事。

  我們當時具體是什么情況呢? 那時候首先沒有網絡,想學個啥都得去找本書。然后當時市面上都哪些書流行呢? 首先是教學教輔類,那個永遠是個鋪天蓋地的陣勢。之后是什么奇聞異趣、小說雜志之類的東西。再之后才有些偏門偏角的計算機書籍。而且這些計算機書里面,五筆字型絕對是占了半壁江山,然后是什么WPS文檔處理啦、DOS入門啦之類的。真正要輪到編程了,那就是少之又少了?,F在要是在哪個老社區里面吼一嗓子,說你們老程序員當年第一本書是啥,恐怕半數以上都得占到譚浩強的隊伍里頭去。當時就是這么個情況,編程的書很稀缺。所以弄到了,心思也不會飄忽,一本書能讀上幾年。想想看,幾年的時間讀一本書,鐵杵都能磨成針了,怎么會學不好? 所以這個是個主觀原因:獲取信息的途徑少,書少,所以拿到一本書能夠非常認真的讀。

  當然,現在書市上的局面其實也差不多,亂七八糟不相干的書總是最多的。不過至少計算機專業書這個領域,書少局面在接近2000年的時候就瞬間改善了。這是給我的印象。有那么一陣我似乎好久沒去逛書店了,大概是初三中考那段時間。等放了假,終于可以泡書店的時候了。一進門,好嘛,提前跨世紀了。整個計算機書架瞬間擴大了幾倍體積。什么PhotoShop、Flash、匯編、VB等等等等,都如雨后春筍般一呼啦全鉆出來了。當時就是劉姥姥進大觀園了,眼花繚亂了——要有這樣的感受的人,恐怕還都得趕上時候,2000年以后入行的人大概都不會有過這種體驗了。當場我就傻了,說這么多書看哪本好呢?不過照顧下自己手頭就三倆鋼蹦兒的實際情況,再結合一貫的把蒜種水缸里冒充水仙倒裝蒜的德性,我是在瞬間的震驚之后立刻冷靜下來:想想其它東西從頭學還要重新入門遭人白眼,我還是老老實實接著學我那本QBasic多少還能冒充個高人的好。所以現在回頭想想,偶爾裝會兒蒜其實也是有益身心健康的,至少沒把自己弄成個樣樣都會半截的半瓶醋。總結下來,還是當年那個觀點,剛入行的時候,專注是個好事情。

  再說撿到寶典的客觀原因。其實就簡單多了。

  那時候本身會計算機的就不多,能寫書做專家的就自然更少了。而且,寫書的這些老先生們,主要都是清華北大的,本身水準就頂呱呱的。再就是一個非常重要的原因,當年那些大學老師、校長啦都是實在人,不講究什么論文數、項目數之類的花里胡哨的,在學校里就好好當老師,這是人家的基本宗旨。所以不論是上課嘴巴講的,還是寫書上讓咱沾沾光的,里面教書育人四個字是貫穿始終的。為什么說一本書有人寫的好,有人寫的差呢。其實說白了就差別在這四個字上的。

  我大學畢業以后,有段時間是在弄Matlab相關的事情。當時我就有個深刻體會,最好的Matlab書是哪本? 哪都不用去找, 就是Matlab自己的幫助文檔。怎么講呢?其一是這個文檔內容很全, 而且講到一個具體的技術領域的時候, 它會比較全面的對技術領域的背景進行交代。比如說我當年學神經網絡,我就沒看別的書,直接Matlab的NN工具箱的文檔就是很不錯的教材。真的叫深入淺出,公式、算法、思路、圖示面面俱到。更重要的是,它還幫你列參考文獻。其二原因呢,就非常有對比性了。這個文檔當年是英文版的,沒中文的東西,中文的Matlab什么情況呢?就一個字,抄。抄啥,就是抄這個幫助文檔,英文換成中文來抄,還超出一個一個精品教材來。你說有必要嘛,除了去騙騙啥都不懂的專家評委,要這種書有啥用?而且抄把,你也遵循個信達雅也好啊,人家好,除了函數參考,前言后語那些Matlab文檔最出彩的地方全都給省了去了。為啥,人家教授找的那些學生勞動力做做機械勞動勉強還可以,但要是讓人家理解思想、轉述想法,這不是要了人家命了。

  所以,看到了吧,一本書,用心寫和用腳寫多少會有些差異的。當年譚浩強老先們寫書,那是真真正正的用心在寫。讀書的人哪里容易犯混、哪里會踩到坑,提前幾章的時候人家就幫你把路鋪墊好了。一本書教的不僅僅是具體的語法、技巧,更重要的,人家把編碼的價值觀、算法的引導、數據結構的簡單應用、計算機的基本原理,能滲透的都給你滲透了。等到真正學到后面這些東西的時候,給我的感覺只有一個:“哦,數值計算聽起來牛逼哄哄的東西,搞半天就是這個呀”。為啥,咱學QBASIC的時候就做過這些題了,不陌生啊。所以說呢,我多少年來學計算機只有一個感覺,沒遇到過難學的,這個首先就要感謝給我啟蒙的這些教材的作者,人家一本書已經幫我們提前鋪了幾年的路了。

  再說幾個例子。一個是編碼格式的事情。我幾乎天天都會遇到這樣的家伙,尤其是一些目前正在讀研的學生(這些人似乎從來沒學過寫程序,讀研了居然要做個什么什么的應用程序來混學位)。怎么樣呢?啪啪啪鋪一屏幕代碼給我,然后說大神啊幫幫忙,我程序運行不了。天哪,那代碼我都不忍直視,我說你學編程的時候,書上或者老師沒教你什么叫縮進嗎? 等你幫他把代碼格式調整好以后,問題自然就看見了,大括號少打了。這種混我犯過沒?說老實話,我還真的從來沒犯過。為什么,因為我記得我當年學的啟蒙書里第一個例子,老先生就花了好幾百子的篇幅來告訴我為什么需要用縮進。而且我當年也是虛心學習,并且形成了一個敵視一切縮進錯誤甚至斷行不對的代碼、認為非我族類的價值觀。

  還有一個是當年講結構化編程的時候,老先生也是花了挺多的篇幅,介紹流程圖、NS框圖、MS框圖。然后我也是非常認真的學著畫這幾個圖。這個上面獲得的教益也是非常大的。雖然現在除了流程圖偶爾用一下,NS框和MS框基本上都不用了。不過我從里面學懂的是什么呢?只有一個事實,任何一個圖有一個嚴格的代碼范式與其對應,任何一個規范的代碼范式可以用一個圖來表達。這個很重要哦。包括我后來學物理、學機械、學UML、學分析、學管理,在我眼里,每遇到一種圖,我總是嘗試找出它后面的公式表示、算法表示和編碼表示,在我眼里圖是活的,是可以運算的。甚至于現在接近中年了,開始學著總結了,我都開始從哲學層面去理解這么多種表示的內在原因。當然這是題外話,不多扯,想一起來擺擺龍門陣的可以到這里去看。反正當年關于圖文一致這個價值觀,就像是萊昂納多的一個種子想法,就是在那時候種下的。

  還有就是關于著名的GOTO的事情, 老先生當年講我們要避免使用GOTO, 又講到我們也要注意到如果固定了范式能夠保護好環境的話, 可以借助GOTO進行優化。我一開始不懂后一句是什么意思,不過我是老老實實聽話不用GOTO的。直到我學深度優先的時候,才明白后一句的意思。深度優先兩種實現方式,一個是遞歸法、一個是回溯法。遞歸法很直白,但是因為當年都是33MHz,只有幾十KB的內存的機器,遞歸深一層資源就耗掉不少,所以很多問題機器跑不起來。但是回溯法呢,好是好,但是那時候小,很喜歡犯懶,回溯那個東西思維邏輯要繞一點。咱不喜歡去背那個邏輯,結果回溯法總是沒法一遍寫成功。所以呢,編程技能上有缺陷,怎么辦?想來想去(其實想的那些時間就夠背下回溯法了,不過咱真是懶人,胡思亂想可以,讓我去背書沒門),終于想出個辦法,先用遞歸把代碼寫好,然后手工加個棧來存儲環境,在遞歸的for循環內部植入一個GOTO跳進跳出循環,手工壓棧保護環境或者手工恢復環境,用非遞歸的程序去模擬遞歸的過程。嘿,還真讓我給弄出來了,寫起來直白程度不亞于遞歸,而資源消耗程度不亞于回溯法。結果給我命名成擬遞歸,然后堂而皇之的拿去用,一點不怵。這一會,我弄懂了老先生將GOTO的完整想法,范式這個東西是人做的,既然是范式自然是要遵守。但是畢竟要想到一點,這個東西是人做的,必要的時候也可以去建立自己的范式。要說創造性,絕不能說中國人,或者象牙塔里面的書呆子沒有創造力,沒有創造力只有一個原因,因為他沒學懂而已。

  然后還有當年做的課后習題里面的那些梯形法求積分、牛頓法求根、二分法查找,甚至于串口通訊。你真的不能夠想象,如今所謂的各種寶典里面,還會如此兼容并包的去在一本入門性的書籍面講到這些東西,為一個學生之后幾年甚至十幾年的學業做鋪墊。

  再想想看,這樣的書而且還是講個一個剛剛入門啥都不懂的小孩的,然后竟然能夠讓他讀懂。你說說,不叫它葵花寶典,叫什么好呢?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容