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

來源: 兄貴 2022-11-09 12:41:24 [] [博客] [舊帖] [給我悄悄話] 本文已被閱讀: 次 (8648 bytes)

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

  • 糾結電腦語言,都是馬工的命。州大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

所有跟帖: 

美國CS本科生大部分都是用CPP的,大部分人很輕鬆自學JAVA,Python….語言確實不是個問題,至於匯編語言啥的,看自己的方 -青裁- 給 青裁 發送悄悄話 (44 bytes) () 11/09/2022 postreply 12:51:00

Go, Rust, Julia 都是潮流新語言 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 12:59:12

這是我背後的省略號代表的… -青裁- 給 青裁 發送悄悄話 (84 bytes) () 11/09/2022 postreply 13:00:00

據我所知,很多公司都在用Java. 一個公司要換編程語言很難。 -敗了又敗- 給 敗了又敗 發送悄悄話 (0 bytes) () 11/09/2022 postreply 12:54:00

說Java說正在死亡的語言, 好像早了一點。 看看各個IT行業的招人廣告, -總要注冊- 給 總要注冊 發送悄悄話 (61 bytes) () 11/09/2022 postreply 13:00:00

COBOL招工一時吃緊,因為沒有人學了,而很多銀行還在用 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 13:13:33

Java跟COBOL不一樣。 COBOL主要用於financial。 而 JAVA是真正的通用語言。 實際上它和C# -總要注冊- 給 總要注冊 發送悄悄話 (116 bytes) () 11/09/2022 postreply 13:22:50

哈哈,文章開頭第一段最歡樂 -田園景色1230- 給 田園景色1230 發送悄悄話 田園景色1230 的博客首頁 (0 bytes) () 11/09/2022 postreply 12:59:01

我隻知道,一個語言越差,對使用者的要求越高 -avw- 給 avw 發送悄悄話 (0 bytes) () 11/09/2022 postreply 12:59:43

有道理,所以老牌 JavaScript 越來越吃香了 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 13:05:40

俺麵試候選人,第一句話就是,你隨便選語言,我也不糾結語法錯誤,嘿嘿 -skyport- 給 skyport 發送悄悄話 skyport 的博客首頁 (0 bytes) () 11/09/2022 postreply 13:04:37

要看你做什麽 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (332 bytes) () 11/09/2022 postreply 13:11:43

讚,80年代就在中科院物理所寫code了, -DukeAB- 給 DukeAB 發送悄悄話 (0 bytes) () 11/09/2022 postreply 13:10:35

物理所為啥要寫code? -avw- 給 avw 發送悄悄話 (0 bytes) () 11/09/2022 postreply 13:23:43

不是物理所。是理論物理所。完全不同的單位 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 13:40:35

當年的理論物理所,看不起物理所。(現在不知道了) -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 14:30:49

郝柏林說,寫了一大堆書的譚浩強也是他早期的學生,沒學明白就寫了一大堆教科書 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 13:42:35

讚能寫會算……正吭哧吭哧寫conference abstract的仰望大牛 :) -成功的兔- 給 成功的兔 發送悄悄話 (0 bytes) () 11/09/2022 postreply 13:13:35

兄貴講古有一套,但對語言的認識有限.給年輕人提個醒,莫被誤導 :-). -raymn- 給 raymn 發送悄悄話 (0 bytes) () 11/09/2022 postreply 13:18:25

這裏根本沒有年輕人 -avw- 給 avw 發送悄悄話 (0 bytes) () 11/09/2022 postreply 13:21:39

看對誰而言.兄貴alpha上算FORTRAN題時,我在PDP-11上寫Prolog解釋器 -raymn- 給 raymn 發送悄悄話 (0 bytes) () 11/09/2022 postreply 13:24:38

每個人都有曆史局限性,我是當故事聽的 -avw- 給 avw 發送悄悄話 (0 bytes) () 11/09/2022 postreply 13:26:21

網上討論程序語言的,基本不懂程序語言設計原理和語言特點的來龍去脈.不信問他java/python FP的區別 -raymn- 給 raymn 發送悄悄話 (0 bytes) () 11/09/2022 postreply 13:33:32

java和python的FP,都挺令人失望的。都不支持最重要的immutability。P的lambda隻支持expre -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 14:40:48

C#的FP好很多 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 15:10:01

我很快用上VAX,比PDP好多了。VMS相當高級了 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 13:32:48

知道PDP-11/45的人應該有些年紀了,應該是退休人士? -hhtt- 給 hhtt 發送悄悄話 hhtt 的博客首頁 (0 bytes) () 11/09/2022 postreply 14:32:53

你們上來就是卡片,我是穿孔紙帶(用剪刀膠水 cut and paste),719機 -slow_quick- 給 slow_quick 發送悄悄話 slow_quick 的博客首頁 (440 bytes) () 11/09/2022 postreply 15:43:46

Java是在C++基礎上發展起來的語言。 一方麵強推C++, 另一方麵強砭Java是過時語言。 -總要注冊- 給 總要注冊 發送悄悄話 (182 bytes) () 11/09/2022 postreply 13:25:51

因為Java失去了C++很多優點。Java曾經名字是C++++。這導致微軟用了C#。但C++壽命比Java和C#都會長 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 13:37:34

javascript開發跟java是沒關係的,也促成了java的毀滅 -tibuko- 給 tibuko 發送悄悄話 tibuko 的博客首頁 (0 bytes) () 11/09/2022 postreply 13:25:00

Javascript 導致Java 毀滅? 這是哪兒的理論?請舉出有幾家公司是用 -總要注冊- 給 總要注冊 發送悄悄話 (34 bytes) () 11/09/2022 postreply 13:28:32

導致毀滅也許誇張了,但javascript導致java作為VM通用一統天下的理想毀滅是不錯的 -tibuko- 給 tibuko 發送悄悄話 tibuko 的博客首頁 (0 bytes) () 11/09/2022 postreply 13:30:00

Javascript 跟Java 風馬牛不相及。 隻能怪最初的網景公司起的這個破名字。 -總要注冊- 給 總要注冊 發送悄悄話 (92 bytes) () 11/09/2022 postreply 14:05:29

當然是沒啥關係,但在web就是幹死了java,公司麽還是用了java,但這語言確實並不很好 -tibuko- 給 tibuko 發送悄悄話 tibuko 的博客首頁 (0 bytes) () 11/09/2022 postreply 14:32:00

JavaScript is for Front End and Java is for Back End, -紐約故事- 給 紐約故事 發送悄悄話 紐約故事 的博客首頁 (52 bytes) () 11/09/2022 postreply 16:59:31

Java, .Net, PHP都phase out.基於Javascript的Node.js Angular React -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (90 bytes) () 11/09/2022 postreply 18:33:30

能取代Javascript也許是WebAssembly -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 18:37:10

兩者語言之間沒什麽關係,但誕生有關係的。Javascript是Netscape宣稱的用Script實現Hotjava功能 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 13:35:43

成功的語言一般宗教色彩淡點 -tibuko- 給 tibuko 發送悄悄話 tibuko 的博客首頁 (0 bytes) () 11/09/2022 postreply 13:27:00

是這樣。連NW不是也成了宗教了嗎 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 13:44:24

當年OO過度吹捧,現在FP又搞得像是神一樣,都是FAD -tibuko- 給 tibuko 發送悄悄話 tibuko 的博客首頁 (0 bytes) () 11/09/2022 postreply 13:29:00

Java本身是麵向OO的語言。 如果用Java寫functional programming, -總要注冊- 給 總要注冊 發送悄悄話 (194 bytes) () 11/09/2022 postreply 13:59:52

FP是Java非常重要的部分,而且是實實在在Java追趕先進的產物。殺雞牛刀的比喻搞反了 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 14:19:57

一個公司換語言不容易,一個碼工換個語言可太容易了。 -小糊塗仙2000- 給 小糊塗仙2000 發送悄悄話 (110 bytes) () 11/09/2022 postreply 13:32:03

-兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 15:44:43

ji語言是末稍,學啥沒啥關係 -12度圓缺- 給 12度圓缺 發送悄悄話 (1185 bytes) () 11/09/2022 postreply 13:35:15

確切地說,FP是消除scope之間的state dependency.好處還是很多的 -raymn- 給 raymn 發送悄悄話 (70 bytes) () 11/09/2022 postreply 13:40:56

同意 -12度圓缺- 給 12度圓缺 發送悄悄話 (0 bytes) () 11/09/2022 postreply 13:43:50

stateless 是更強的總結 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 14:29:28

感想後的感想,我覺得最重要的是 C/C++, SQL,Javascript -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (4793 bytes) () 11/09/2022 postreply 14:13:19

不是 -tibuko- 給 tibuko 發送悄悄話 tibuko 的博客首頁 (0 bytes) () 11/09/2022 postreply 14:34:00

太讚了,請問x++是不是c++的cloud version ? -qqdragon- 給 qqdragon 發送悄悄話 (0 bytes) () 11/09/2022 postreply 13:39:28

我感覺,微軟的X++是為了一統 OO設計,SQLtable,和XML文件的。微軟的東西還有F#,J#可以根據工作需要學 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 14:17:57

強讚:) -兩女寶媽- 給 兩女寶媽 發送悄悄話 兩女寶媽 的博客首頁 (0 bytes) () 11/09/2022 postreply 13:43:10

先點讚,再點評 -寶馬奔馳- 給 寶馬奔馳 發送悄悄話 (671 bytes) () 11/09/2022 postreply 13:51:49

精髓總結 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 14:21:34

語言不重要,重要的是跟上語言的新features. Java 8 stream 開始用FP。Java 不會死,不是語言多好,是開 -Red_May- 給 Red_May 發送悄悄話 (0 bytes) () 11/09/2022 postreply 14:15:00

確實很難預言。作為WrapUp JS的ASP, ASP.Net, PHP, Swing, JavaFX, Perl都不行 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (137 bytes) () 11/09/2022 postreply 14:25:50

我猜測一下,您可能熟悉很多語言,但沒做過production level 的應用。 -Red_May- 給 Red_May 發送悄悄話 (0 bytes) () 11/09/2022 postreply 14:36:00

如果在美國用過打卡和讀卡機做程序的,一定是前輩!兄貴,有沒有編過Assembly,這在美國七八十年代武器上用的。 -hhtt- 給 hhtt 發送悄悄話 hhtt 的博客首頁 (0 bytes) () 11/09/2022 postreply 14:30:35

應該問問兄貴玩沒有玩過Z80單板機。 -總要注冊- 給 總要注冊 發送悄悄話 (167 bytes) () 11/09/2022 postreply 14:42:19

Z80 在90年代還再用 -紐約故事- 給 紐約故事 發送悄悄話 紐約故事 的博客首頁 (0 bytes) () 11/09/2022 postreply 17:05:30

在中國單板機上編過 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 14:42:37

Java 將繼續存在。現在是API時代, Java SpringBoot是支持API 構建的框架, 大公司最好的語言. -成功鼠- 給 成功鼠 發送悄悄話 (0 bytes) () 11/09/2022 postreply 14:37:16

+1 就是我上麵說的。 -Red_May- 給 Red_May 發送悄悄話 (0 bytes) () 11/09/2022 postreply 14:39:00

+1 -bayview- 給 bayview 發送悄悄話 (0 bytes) () 11/09/2022 postreply 14:50:24

同意,當下的語言組合 Java SpringBoot API + JavaScript (React Framework -紐約故事- 給 紐約故事 發送悄悄話 紐約故事 的博客首頁 (0 bytes) () 11/09/2022 postreply 17:07:08

Angular even better。 -總要注冊- 給 總要注冊 發送悄悄話 (167 bytes) () 11/09/2022 postreply 17:56:44

Depends on the size of the project -紐約故事- 給 紐約故事 發送悄悄話 紐約故事 的博客首頁 (465 bytes) () 11/09/2022 postreply 18:34:25

非JS的都會被JS framework取代,而JS可能被WebAssembly取代。JAVA dying -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 18:44:57

Just repeat myself again, JS is for FrontEnd, whereas Java -紐約故事- 給 紐約故事 發送悄悄話 紐約故事 的博客首頁 (94 bytes) () 11/09/2022 postreply 18:58:22

Nodejs弱點像single-threading, 怎能與Java相提並論? -成功鼠- 給 成功鼠 發送悄悄話 (0 bytes) () 11/09/2022 postreply 20:07:30

沒有一種語言比Java更適合 Enterprise-grade應用, 更能處理concurrency, multithr -成功鼠- 給 成功鼠 發送悄悄話 (36 bytes) () 11/09/2022 postreply 20:08:20

編程語言是熟練工。隻會一種不行,會一種後其他也不難。 -加州lalin- 給 加州lalin 發送悄悄話 加州lalin 的博客首頁 (0 bytes) () 11/09/2022 postreply 15:21:02

Java 不會是 Dying Language -紐約故事- 給 紐約故事 發送悄悄話 紐約故事 的博客首頁 (0 bytes) () 11/09/2022 postreply 16:51:09

在MacPro上,如果用C哪個IDE比較好? -jonjon- 給 jonjon 發送悄悄話 (117 bytes) () 11/09/2022 postreply 18:20:15

Xcode -成功鼠- 給 成功鼠 發送悄悄話 (0 bytes) () 11/09/2022 postreply 18:24:31

現在幾乎都是 VSCode. 需要安裝。Xcode是蘋果自帶的 -兄貴- 給 兄貴 發送悄悄話 兄貴 的博客首頁 (0 bytes) () 11/09/2022 postreply 18:41:15

謝兩位。我過幾天去看一下 -jonjon- 給 jonjon 發送悄悄話 (0 bytes) () 11/09/2022 postreply 19:08:09

大廠用:Google C++,Java,python; Facebook:Java, C++, JavaScript, -泥川- 給 泥川 發送悄悄話 (76 bytes) () 11/10/2022 postreply 14:58:46

請您先登陸,再發跟帖!