個人資料
  • 博客訪問:
正文

學哪一個計算機語言好?個人經驗分享篇

(2022-11-09 12:41:24) 下一個

我幾次分享學習計算機語言的經驗,都會受到擠兌,比如:

  • 糾結電腦語言,都是馬工的命。州大LS的CS混混就好了
  • 語言是載體,思想才是精華 
  • 學一門語言就夠了
  • 掌握匯編語言和任何其他一門語言就夠了
  • 所有語言最後都形成機器語言,所以一樣快
  • 等等

其實我都已經分別回答過了這些迷思,不過覺得意猶未盡,所以再嘮叨幾句,供剛剛有小孩想學計算機的參考.

1)作為計算機專業,是不是就學一門語言就夠了?

我的答案是否定的。如果找一個編程的工作,也許一門語言就夠了。我九十年代進入一家銀行,裏麵大多數都是沒上過大學的程序員,隻會Cobol,照樣在銀行工作了2、30年沒問題。

但是一個年輕人主修計算機,顯然是不夠的。好比說,你一輩子隻吃飯,也餓不死,但天底下這麽多好吃的東西,為什麽不去吃吃呢?再說,天底下那麽多帥哥美女,如果你隻交往過一個,你有可能成為情場高手嗎?

不同的語言有不同的優勢,不同的功能,新的語言不斷的在創造出來,起碼有了幾千門計算機語言了。年輕人,你不希望自己被禁錮在一個語言裏吧

80年代初,我在理論物理所跟郝柏林學計算機,他同時教我們C和LISP,還有用於數學推導的 Reduce語言。他說他是中國第一個懂C和Lisp的人,而且也是中國第一個懂Fortran的人,1972年經周總理批準,理論物理所進口了中國第一台小型機,他成了中國第一個在小型機上用FORTRAN編程的人,70年代他在中國推廣了FORTRAN,80年代他在中國推廣C,我們算是中國第一批學C的人,當時我已經有了在alpha小型機上編程Fortran的經驗,我寫Fortran的時候,程序是寫在紙上,然後把程序給機房的小姐姐工作人員,由她打孔,然後再由機器讀打孔卡片如下:


FORTRAN編程給我的感覺就是計算機編個程,太難了,經常要看小姐姐的臉色,她如果發脾氣,不給你打孔,你的code就隻是紙上談兵。

而郝柏林給我們使用的Reduce語言,居然可以人機交互,給他一個多項式a^2-b^2要求因式分解,它能馬上輸出(a+b)(a-b). 給它一個5次方程,它馬上給你給解了。太神奇了。

40年前就知道,作為年輕人,隻學一門語言不行啊。想想看,一輩子隻吃一道菜,睡一個人,可行嗎?

2)是不是所有語言都一樣?

如果所有語言都一樣,為什麽這麽多的天才們還在創造新的語言呢?早期不同語言可以通過 link 把目標文件連起來,現在語言大部分都是產生Virtual Machine上的assembly. 所以不同語言運行的速度,安全性等等都是完全千差萬別的。

3)匯編語言要不要學?

幾乎沒有匯編語言的工作,即使操作係統,從windows到linux, 97%以上都是用C來寫的。所以學匯編語言肯定不能幫你找到工作,但是如果你想成為比其他編程員更厲害的人,你就得精通匯編語言。匯編語言也有高級匯編語言,和低級(或者說基礎)匯編語言。現代語言(除了C/C++)基本上不容許Goto語句,而低級匯編語言隻有Goto,沒有子程序,沒有for loop,沒有 if else,所以要理解高級語言是如何通過低級語言來實現的。

絕大多數程序員,都會碰到一些bug後,束手無策。為什麽?因為不了解底層語言,如果你懂了底層匯編語言,你就能幫他解決問題。另外,很多Code,都有安全漏洞、安全隱患,如果深入到匯編語言,你就比較容易的發現這些安全漏洞和安全隱患。

當年高校的匯編語言是非常重視的,從單板機的匯編語言,到Motorola 68000 匯編語言,到 RISC-V ASM, 到當年被瞧不起的x86, 到逐漸重視的 x64, 以前匯編語言是重中之重的必修課,現在好像很多計算機專業也就草草的瀏覽一下皮毛。

4)到底應該學哪些語言呢?

Java曾經如日中天,2004年之前,Java勢不可擋,不僅橫掃各種語言,甚至橫掃所有操作係統。連微軟都在搞Visual J++,而且從 VJ++1.0,直接跳到 VJ++6.0 不然就跟不上趟了。2003年聖誕節前的微軟年會上,J++組粉墨登場,興致勃勃的展示微軟的JVM,完勝Sun Microsystems的JVM,計算機世界將真正進入 write once, run anywhere. 什麽計算機語言,什麽操作係統,都不重要了。Java將一統江湖,一統天下。 報告人沒有等待到同事們的掌聲,相反的是比爾蓋茨上了講台,問道:是誰給你發的工資?是Java嗎?不是!而是 Windows!是Microsoft Office! 蓋茨宣布,解散J++團隊,下崗一半,分流一半,成立C#,搞 .NET,微軟的口號是:write whatever you want, run Windows

今天的Java,已經行將就木,被批的無一是處。遙想1995年,Java因為推出Hotjava web browser 而一舉大紅大紫。Hotjava 是第一個動態瀏覽器,為了推廣Java,很多java coding大賽,我當年也參加了,沒得到千元大獎,但得到了厚厚Java書。Netscape受到嚴重威脅,不得不屈尊和Java達成協約,共同開發新的JavaScript作為瀏覽器客戶端,再由Java,PHP,C#包裝成OO給程序員用。時至今日,Java,PHP,越來越衰,C#轉入遊戲業,而JavaScript成了Full stack的不二選擇。

所以現在學Java,不是與時俱進的選擇,但無奈AP考試隻考它,所以還是得學。

如果想參加USACO等等競賽,C++是不二選擇,不僅速度快,而且有強大的算法庫 STL

數據的處理,你可以不必用SQL寫,你可以用C,C++甚至任何一個語言寫,通過產生的bytecode injection 到數據庫產生 stored procedures 或者 user functions,但是這需要更高的權限,也需要一樣對於數據庫的理解,為什麽不把SQL也學了呢。 而且SQL是NoSQL的基礎,不需要Join而已,有了SQL,對寫 key-value, Graph database 等等的 query,也是基本基礎。

再者是functional programming language. 雖然業界用到的純fp不多,但functional programming是完全不同的理念,圖靈的state machine的理念是萬物皆數,萬物皆state。state可以是數,是table(SQL),是矩陣(量子力學),是各種數、array等等的組合(Object Oriented Languages), 而圖靈的博士導師Alonzo Church 卻認為 計算皆函數,計算機應該是 stateless machine,即沒有State。隻有你給它一個自變量,它給你一個返回函數值,計算機本身是幹淨的,沒有痕跡的。很明顯,functional programming有很多好處, 因為沒有state, 所以沒有 side effects, 不容許mutation,可以同時運行進行並行計算,debug非常簡單,而且幾乎沒有什麽隱藏的bug。

所以和匯編語言一樣,學習functional programming,不是為了找相關的工作,而是寫出更好的code。現在Java, Python, C#, C++,,,,等等都支持functional programming

同理,學習C語言,其目的之一是使你成為一名更好的程序員,即使不用C。所以也是值得學的,因為它幫助你理解計算機是如何運作的。

總結一下,學習計算機語言,要帶著熱情去學,帶著探險的激情去學,而不是帶著畏懼的心情去學。多多益善的學。學習各種語言的特點,特別是要注意學習各種不同類型的語言。比如在學 distributed system時,是否用Go語言去做作業,學操作係統的時候,用 Rust語言去練習,學遊戲編程的時候,用一下C#,圖像處理時用用Julia。。。。不僅Open your eyes開了眼界, 而且了解到很多你以為不能做,或者很難做的事情,其實其他語言易如反掌。

最後一點,盡量避免dying language, 比如 PHP,VB,LISP,甚至 Java

[ 打印 ]
閱讀 ()評論 (0)
評論
目前還沒有任何評論
登錄後才可評論.