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





























