學會10多種語言是種什么樣的體驗?
80年代末,我***次接觸了Apple II電腦上的BASIC編程語言,從此走上了一條程序人生。十多年前我在博客園上開通了自己的博客,由于下象棋時經常出點“毒”招,所以網名干脆就叫“毒龍的程序人生”,2016年8月底申請公眾號,名字就叫“申龍斌的程序人生”了。
回想這些年,由于項目需要或興趣使然,竟然學了十多種編程語言。
BASIC
***次接觸計算機大概是在1987年,當時我的學校竟然引進了20臺昂貴的Apple II計算機,我連如何操作電腦都不會,直接就學BASIC語言。
那時也不懂什么結構化編程,反正就是抄著書上的代碼學,雖沒寫出什么成規(guī)模的BASIC程序,但也算編程入門了。記得曾把幾個程序小心翼翼地保存在一張1.2M的大軟盤中,可惜現在軟盤也沒了蹤影,所以一行BASIC代碼現在也沒有留下,想懷念懷念過去都沒了可能。
FORTRAN
FORTRAN是在讀本科時學的,當時科學計算很流行,這是數學系的必修課。一個班幾十人連接一臺大型機(我已經忘了它的名字),提交程序后得等上十多分鐘才能看到程序的編譯結果,所以代碼要寫得非常認真,提前把代碼寫在本子上,仔細檢查各種語法和邏輯錯誤,否則上機1小時可能連編譯都無法通過。
參加工作時竟然還用FORTRAN語言做過項目,當時有一位北大畢業(yè)的CHAI師傅,能用FORTRAN寫上幾百行的代碼,我就跟著他修改這一堆代碼。當時能寫代碼的人就是高手,不管什么可維護性,GOTO語句滿天飛,每做一個項目就復制、修改一份源程序,***程序版本混亂,無法維護。
最讓我震驚的是當時MIPS工作站上的一套國外開發(fā)的地震解釋軟件,竟然包含了全部的FORTRAN源代碼,那套代碼有上萬行,注釋詳細,邏輯清晰。
那時的我明白了結構化編程的重要性,即使語言本身的特性不好,也同樣能夠寫出可維護的優(yōu)美代碼。
PASCAL
大學里開了《數據結構》這門課,所有的例子代碼都是用PASCAL語言寫的,所以我又學了PASCAL語言。
以前學FORTRAN和BASIC時,養(yǎng)成了非結構化編程的壞毛病,因為有行號,語句之間可以隨意跳轉,也沒有模塊化的概念,亂用全局變量,程序的可維護性幾乎為零。PASCAL這門語言的特點就是嚴謹,begin和end雖然啰嗦,但結構非常清晰,靠這門語言養(yǎng)成了結構化編程的好習慣。
工作后還曾經用Dephi(在Pascal基礎上升級的面向對象的可視化編程語言)寫過一個小項目,可惜也沒有實際的應用效果。
C
C語言因為性能好,被UNIX、Windows各種機器所支持,所以使用廣泛。大學時我們班里沒有開這門課,我跑到計數班去聽這門課,上機課就混他們的機時。
C語言中指針等概念雖然麻煩,但還是慢慢掌握了。我一開始學語言的動機實際上就是想著寫游戲,當時俄羅斯方塊正流行,自己也嘗試著寫一個。有一次,老師在微機課上巡查,發(fā)現我正在玩俄羅斯方塊,當場對我提出嚴厲的批評。
我輕輕地按下一個功能鍵,游戲馬上停止,此時顯示出一排排的C代碼,我正在調試自己寫的C程序呢。老師盯著看了看,無語,向其他學生走去。
實際上,自己根本不可能沉迷于自己寫的小游戲,而是更關心如何讓動畫更流暢、代碼如何寫得更簡潔,如何調整難度級別、改進一下記分系統(tǒng)等等。在寫游戲的過程中,逼得自己去掌握了編程的語法和算法。
工作后,這門語言的用處還挺大,當時分到物探方法室工作,主要接觸UNIX工作站,只有C語言能用也會用,所以就經常幫著師傅們寫點小程序,做些上萬行數據的統(tǒng)計、格式轉換之類的小活,實際上可是幫了他們的大忙。
Visual Basic
Visual Basic可視化式的編程開發(fā)開創(chuàng)了一個新的時代,當時用鼠標點點拖拖就可以產生一個Windows程序,這種感覺太美妙了,由于我有以前的BASIC基礎,所以學這種語言飛快。
Visual Basic這款產品的兼容性真是沒得說,最早的開發(fā)環(huán)境是在Windows 98上開發(fā)的,后來windows升級到2000, xp,windows 7,它仍能運行。
我現在仍在維護的一個用VB寫的程序就是瑞士積分編排程序的表格生成器SwissTab,前前后后修改了無數次,至今仍在一些比賽中發(fā)揮作用。
CASL
CASL這語言估計很多人沒聽說過,它并不是一門真正的語言,只是一門考試用的匯編語言。參加工作后,項目并不多,就去報考高級程序員試試,其中有一道大題就是寫CASL這種匯編語言。
由于我并非計算機專業(yè)畢業(yè),基礎知識薄弱,想通過高級程序員還是非常有難度的。***年我沒有通過,來年我把那套高程教材幾乎都翻爛了,把所有的練習題都做了一遍,把歷年的高程題都試了一遍,從而順利通過,那時是1996年。就因為這個高級程序員證,還提前2年混到了中級職稱。
JAVA
JAVA語言大概是在2000年學的,此時的JAVA語言火得一塌糊涂,“一次編寫,到處運行”的理念好像是各個軟件項目的救命稻草。本來以為它的優(yōu)勢是桌面端程序,沒想到后來服務器程序卻變成了它的強項,J2EE/EJB大行其道,寫個服務器端程序非要吹出J2EE四個字來。
當前室里幾個人組成了一個團隊,寫出了勝利信息網網站發(fā)布系統(tǒng),2003年上線,一直沿用到了現在。這種跨平臺的語言真是節(jié)省了大量的工作量,我們的java,JSP程序都在windows端編寫、調試,***的程序部署在unix機器上的weblogic上,非常方便。
此系統(tǒng)被強行交給信息室維護,項目和人員全部解散,以后我再也沒有用JAVA做過項目。
C#
這是在項目中應用最多的一門語言,相對其它語言來說,在Windows上開發(fā),學習門檻較低,在國企里能建立起這樣一支隊伍已屬不易。現在帶著團隊還在完善、推廣和維護的系統(tǒng)就是EDSS系統(tǒng)了。
另外用C#寫的幾個小程序:
- 用C#寫的CGM解析程序
- 以前用C#寫的一個中國象棋引擎程序
- Eclipse油藏模型解析程序
- SeismicPro地震剖面顯示程序
- LDM地震數據體的存儲格式分析與應用
- AlphaGo挑戰(zhàn)李世石,我的點格棋程序挑戰(zhàn)孩子
Haskell
2008年,無意中接觸到純函數式編程語言Haskell。這種語言與以前學的命令式編程(Imperative Programming)完全不是一種思路。Haskell語言是一群數學家發(fā)明的,寫起來就像一條條公式,欣賞一下這段優(yōu)美的快速排序代碼:
- qsort [] = []
- qsort (x:xs) = qsort smaller ++ [x] ++ qsort larger
- where
- smaller = [ a | a <- xs, a < x ]
- larger = [ b | b <- xs, b >= x ]
用一行代碼打印100以內的勾股數:
- [(x,y,z) | x<-[1..100], y<-[x..100], z<-[y..100], x*x + y*y == z*z]
后來出現的新編程語言很多都借鑒了函數式編程語言中的語法特點,Python中也能寫出類似這樣的語句。
Objective-C
2011年,蘋果APP非常吃香,我也交了99刀的學費體驗了一把蘋果開發(fā)者。歷經一年的折磨,踩了無數坑,終于提交了一個小程序XQViewer,當時也不懂什么推廣和流量,最終只賣出了幾美金,連第二年的開發(fā)者證書費用都交不起,更別談用APP掙錢了。
R
看《大數據時代》和《赤裸裸的統(tǒng)計學》這本書時,又學了一點R語言,這門語言中竟然全部都是向量計算,統(tǒng)計功能強大,我試著用R分析孩子們的考試成績,短短的代碼,立刻可以生成多種直觀的分析圖表。
我的教訓
1)學習新技能時沒有目的和計劃性,雖然學了10多種編程語言,只有C#算是用得最熟練的,其它的都不精,連最重要的前端JavaScript竟然都沒好好學。不管學哪門語言,一定要寫一款產品,然后不斷打磨它。
2)各種語言實際上主要分為兩大體系:過程式(或命令式)、函數式,過程式陣營中掌握JAVA或C#即可,純函數式的編程語言幾乎沒有,只要了解Haskell或Lua等的理念即可,實際上現代的編程語言都已經吸收了函數式編程的先進思想。
3)學了一堆語言的一點點好處,就是當遇到一個實際問題時,馬上會想到用某種語言解決起來會更加簡潔高效。
4)學了十多種語言后,再學其它語言時,只用一、二周就能學完所有語法,比如Python。其實最麻煩的部分是每種語言都帶著龐大的類庫,這些東西只能通過項目慢慢熟悉。
5)學了這些語言后,現在發(fā)現只剩下一個優(yōu)勢了,就是當別人編程遇到障礙時,能夠很快發(fā)現對方可能的錯誤,看來我的使命就是輔導別人學編程了。
【本文為51CTO專欄作者“申龍斌”的原創(chuàng)稿件,轉載可通過作者微信公眾號(申龍斌的程序人生)獲取聯系】