abstrak:C語言確實(shí)顯得有些老舊。最近一版權(quán)威性的C語言還是1988年發(fā)布的;在接近30年的時間里,這個語言的作者一直都沒有對它進(jìn)行過更新,可見它有多過時了。現(xiàn)在,一說到必須有所了解的編程語言,大家都會想到Rust、Go或是Clojure,卻很少有人會想到C語言。但是我的同事Myles和我都不是追求潮流的人,因此我們堅持讓所有學(xué)生都熟練掌握C語言。之所以要求學(xué)生學(xué)習(xí)這門古老的編程語言,我們有下面4個理由:在
C語言確實(shí)顯得有些老舊。最近一版權(quán)威性的C語言還是1988年發(fā)布的;在接近30年的時間里,這個語言的作者一直都沒有對它進(jìn)行過更新,可見它有多過時了。現(xiàn)在,一說到必須有所了解的編程語言,大家都會想到Rust、Go或是Clojure,卻很少有人會想到C語言。
但是我的同事Myles和我都不是追求潮流的人,因此我們堅持讓所有學(xué)生都熟練掌握C語言。
之所以要求學(xué)生學(xué)習(xí)這門古老的編程語言,我們有下面4個理由:
在灣區(qū)的web和移動初創(chuàng)企業(yè)之外的地方,C語言依然是一個被廣泛應(yīng)用的編程語言;
許多現(xiàn)代編程語言都受到了C語言的影響;
C語言能讓你像計算機(jī)一樣思考;
在編寫軟件的時候,你現(xiàn)在所使用的大部分工具,都是使用C(或C++)語言所開發(fā)的。
對于第一條理由,如果你就是想在灣區(qū)的web或是移動初創(chuàng)企業(yè)找一份工作的話,你可以忽略它。但是第二條原因是你無法回避的。而大多數(shù)工程師,都應(yīng)該重視第三條理由,要想做好計算機(jī)工作,你就必須要理解計算機(jī)的思考方式。對于第四條理由,它也是非常難以忽略的。
掌握C語言,意味著你可以更好的理解你所使用的各種工具。例如,對于web開發(fā)者來說,他們必須要透徹的理解瀏覽器、操作系統(tǒng)以及所使用的各種語言,而這一切都是以C語言為基礎(chǔ)的。
我們的大多數(shù)學(xué)生,在使用直譯式語言的時候,都會同時使用那些用C語言所編寫的流行的實(shí)施工具。我們經(jīng)常做這樣一個聯(lián)系:讓學(xué)生們編寫一個Python字節(jié)碼解釋器,從而讓他們更好的理解堆棧式機(jī)器和直譯式語言;在進(jìn)行這個練習(xí)的時候,學(xué)生需要仔細(xì)閱讀CPython的部署。另外,ruby的實(shí)施參考也是用C語言編寫的,還有大部分JavaScript部署,他們是用C++編寫的。
在學(xué)習(xí)hashmaps和動態(tài)數(shù)組的時候,我們有兩種方式:第一,自己進(jìn)行部署,使用一種能讓我們具體對內(nèi)存布局進(jìn)行思考的語言;第二,閱讀相關(guān)優(yōu)秀的部署實(shí)例。學(xué)生要想理解Python列表或是ruby數(shù)組的工作方式,我們同樣有兩種方式:第一,讓他們從頭自己編寫一個版本;第二,閱讀標(biāo)準(zhǔn)庫部署的資源——在沒有接觸過C語言的情況下,要想徹底理解這些概念,基本上是不可能的事情。
如果不掌握C語言,要想了解操作系統(tǒng)也會變得更加困難。我們現(xiàn)在所使用的大部分操作系統(tǒng),都是用C語言編寫的,C語言的標(biāo)準(zhǔn)庫與syscall接口緊密相連,而且大部分與操作系統(tǒng)相關(guān)的概念都需要你先熟悉C語言。
在計算機(jī)網(wǎng)絡(luò)方面,雖然對C語言不熟練并不會影響你的日常工作,但是那些要想了解操作系統(tǒng) TCP/IP 堆棧的從業(yè)者,會逐漸意識到C語言的重要性。
最后再來說說數(shù)據(jù)庫,關(guān)鍵值存儲,消息隊列和其他分布式操作系統(tǒng)技術(shù),要想獲得較高的性能,它們都需要你對C語言有所了解。
很多軟件工程師可能對C語言并不了解,在某一個狹小領(lǐng)域內(nèi)的日常工作,或許并不需要你掌握基礎(chǔ)知識。但是我們要求學(xué)生必須要打好基礎(chǔ),而C語言就是計算機(jī)科學(xué)工作的先決條件。如果你也有著較高的目標(biāo),那么我建議你暫時擱置那些潮流語言,花幾個周末的時間去學(xué)學(xué)看上去有些過時的C語言。