雖然說語言學(xué)得好,Bug 修到老。但是行走技術(shù)江湖,學(xué)習(xí)多門語言防身,依然是每個奮戰(zhàn)在一線程序員的必備功課。
那么,編程語言究竟應(yīng)該怎么學(xué)?這個問題大概比“救女友還是救老媽?”更值得關(guān)心,畢竟一門編程語言會一直伴隨你,在你身處代碼前線之中,幫忙提刀挽弓,沖鋒陷陣。
為此,我們采訪了一些程序員,獲得了一些問題。
我是初學(xué)者,應(yīng)該先學(xué)哪門語言,從哪門入手比較好?
我比較懶,學(xué)哪門語言可以畢生通用?
學(xué)習(xí)哪一門語言更容易獲得大廠面試機會?
大廠面試上機時,用哪門語言更方便?
我是后端工程師,有必要學(xué)習(xí)一門前端語言么?
學(xué)習(xí)一門語言,應(yīng)該具體深入到什么程度?
新語言層出不窮,要不要每一個都掌握?
關(guān)于編程語言,來自 Airbnb 的技術(shù)經(jīng)理,朱赟博士在她的極客時間專欄文章“編程語言漫談”中給出了如下的建議。
*** ***
很多時候工程師們爭論的問題,不再是對和錯、是與否的問題,而是每個人的觀點應(yīng)用到相關(guān)的場景中的時候帶來的優(yōu)劣比較。也就是說,是不是把合適的技術(shù)用到了正確的場景中。平衡是我們在這個階段要著重考慮的,這種平衡有時候是時間復(fù)雜度,有時候是空間復(fù)雜度。
1、初學(xué)者不要糾結(jié)“先學(xué)哪種語言”,這種時間花得很不值得,還不如隨便挑一個語言,跳進去游幾圈試試。對于工程師來說,學(xué)習(xí)第一門編程語言只是萬里長征的第一步,只要你還在這個領(lǐng)域,就不可能只學(xué)一種語言,只會一種語言的工程師根本就不能稱之為工程師。
2、如果你不能用一種編程語言的基本特性寫出好代碼,那換成另外一種語言也無濟于事,你會寫出同樣差的代碼。比如,你的 Java 代碼寫得很糟糕,那么換成 Go、Ruby,你的代碼也會一樣糟糕,甚至更差。
所以,基本掌握了一門語言的功能和語法特性之后,要去做實踐和練習(xí),能寫生產(chǎn)代碼了,再回過頭來去看編程語言的本質(zhì),了解這門編程語言的設(shè)計原理,能力邊界和高級功能,這樣有助于你更快更好掌握其他編程語言。
3、很多人覺得不要用腳本語言入門,我覺得不一定,尤其現(xiàn)在就著人工智能浪潮搞機器學(xué)習(xí)的人,用 Python 入門就很好。另外,腳本語言在面試中絕對占優(yōu)勢。平時工作中我對 Ruby、Python、C 、和 Java 的熟練程度差不多,但是面試中使用 Ruby 或者 Python 答題,寫代碼的時間估計是那兩者的一半。
關(guān)于更多的面試語言詳情,可以參考我之前的專欄文章“硅谷面試:那些你應(yīng)該知道的事兒”。如果讓我推薦一門腳本語言,那就是 Python,關(guān)于 Pythond 的歷史和語言特性,可以參考池老師之前寫過的“人生苦短,我用 Python”一文。
4、后端工程師要熟練掌握一門前端語言,前端工程師也要熟練掌握一門后端語言。倒不是為了提倡全?;蚨鄠€能力儲備,而是兩者的編程思維模式很不一樣。知己知彼,在架構(gòu)設(shè)計和解決具體問題時,才會有更精確的判斷。另外,現(xiàn)在大前端的概念也比較流行,也就是大前端工程師能夠同時掌握 Web 編程語言、iOS 和 Android 編程語言,原生技術(shù)(iOS 和 Android)和 Web 的配合會越來越緊密。
5、SQL 是一門非常非常重要并且應(yīng)該熟練掌握的語言(雖然它不能被稱為程序語言),我在這里用了兩個非常,因為很多工程師有些過于輕視 SQL 了,并為此付出了慘重的代價。
如果你平時的編程工作涉及到業(yè)務(wù)功能,而不是純粹的技術(shù)架構(gòu),一定會使用到數(shù)據(jù)庫。SQL 就是數(shù)據(jù)的語言,通過它你可以和數(shù)據(jù)建立連接和溝通。如果你的數(shù)據(jù)訪問模式寫得很差,輕則代碼性能一塌糊涂,重則引發(fā) Bug,而涉及數(shù)據(jù)的問題,Bug 等級都比較高,后果可能很嚴重。
(關(guān)于 SQL,可以參考朱赟專欄文章“每個工程師都應(yīng)該了解的:數(shù)據(jù)庫知識”。)
6、無論使用什么語言,工程師都應(yīng)該能夠基于這種語言搭建測試框架,寫好測試代碼和寫業(yè)務(wù)代碼一樣重要,甚至更重要。工作后你會發(fā)現(xiàn),可能有時候我們只花五分鐘寫了一個程序,而為其寫一個差不多能夠覆蓋所有功能路徑的測試用例集卻花了一個小時。
(關(guān)于測試,可以參考朱赟專欄文章“每個工程師都應(yīng)該了解的:A/B 測試”。)
7、最后的,也是最重要的是:在任何時候都要用并發(fā)的、分布式的思維去看待你的程序。因為競爭條件或者并發(fā)中的不確定因素(比如調(diào)用順序)導(dǎo)致的 Bug,僅僅理解語言的基本特性,根本不能解釋。每種語言都有自己的并發(fā)編程模式(比如 Go 的 Goroutine,Java 的 ForkJoinPool,Swift 的 Swift Grand Central Dispatch 等)。學(xué)習(xí)每一種語言,都應(yīng)該去深入了解它的并發(fā)模型,在這個多核的時代,不懂并發(fā)的程序員不可能是個好工程師。
最近幾年我主要使用 Ruby 和 Java 編程,這兩門語言的優(yōu)缺點就不在這里說了,網(wǎng)上有很多類似的觀點。如果你還不知道應(yīng)該學(xué)習(xí)哪一門編程語言,那么就從 Java 開始吧。
(關(guān)于 Java,后面朱赟會更新一篇“Java 開發(fā)的中常見問題”專欄文章。)
編程語言,你看它是山,它就是山;看它是水,它就是水。你可以把它當(dāng)做一門簡單的編程語言,有語法,有特性,也有優(yōu)缺點,但這樣的語言也可以復(fù)雜到去實現(xiàn)和解釋各種計算模型和理論。一門編程語言到底能做什么,完全和工程師怎么去用,在什么場景中用息息相關(guān)。
轉(zhuǎn)自:InfoQ
聯(lián)系客服