我想在這里討論的不是如何掌握一門編程語言,而是掌握所有的編程語言。
許多初學者會寫信給我,問我應該學習哪種編程語言,以及如何學習編程語言。起初我總覺得這個問題太低級。但是漸漸地,我發(fā)現(xiàn)不僅是初學者,即便是許多知名科技公司的高級工程師實際上也對這個問題頗為不解。
今天,我打算花點時間回答這個擱置了很久的“低級”問題。我也希望與更多開發(fā)者分享我的想法。
如果你有以下幾種困惑,那么本文會對您所有幫助:
你是初學者,不知道選擇哪門語言入門。
你是高級程序員或團隊負責人,但你對新興語言感到困惑,不知道該投資哪門語言。
你的團隊針對使用哪門語言爭論不休,甚至發(fā)生了一些不必要的沖突。
你選用了一些時尚的編程語言,但是兩個月后發(fā)現(xiàn)它們都很坑。
就我個人而言,如果遇到?jīng)]見過的語言,我會直接使用,而不會花很長時間學習。閱讀本文后,也許你會明白為什么我可以做到這一點。通過了解語言的特征,每個程序員都可以像我一樣實現(xiàn)這個目標。至少我希望如此。
▌關注語言的特征,而非語言本身
許多開發(fā)人員很在意他們或別人是否可以熟練使用某種語言,他們常常會對不同語言的優(yōu)點和缺點爭論不休。然而,對于我來說這些問題都不存在。盡管我撰寫了很多批評語言的文章,但我很少在實際工作中爭論語言本身。我發(fā)現(xiàn)最根本的原因是相對于語言本身,我更加重視語言的特征。我可以用任何語言甚至很糟糕的語言寫出優(yōu)秀的代碼。
任何語言都是各種語言特征的集合。例如,編程語言就像一臺計算機。其品牌可能是IBM、戴爾或蘋果。但是,你能說蘋果的
對于編程語言來說,這些計算機的配置則等同于語言特征。以下是語言特征的一些例子:
- 變量定義
- 數(shù)學運算
- for循環(huán)語句,while循環(huán)語句
- 函數(shù)定義,函數(shù)調(diào)用
- 遞歸
- 靜態(tài)類型系統(tǒng)
- 類型推斷
- Lambda表達式
- 面向?qū)ο?/li>
- 垃圾收集
- 指針運算
- Goto語句
語言特征與計算機配置類似。在選擇計算機的時候,沒人會說戴爾的計算機就一定是最好的,他們會說這臺計算機的CPU是Intel i7處理器,比i5好,DDR3的內(nèi)存比DDR2快很多,SSD硬盤的讀寫速度比普通硬盤快很多,ATI的顯卡性能很差,等等。
編程語言也是如此。每種語言都有一組通用的特征,例如變量、函數(shù)、條件語句和循環(huán)語句。只要你學習一種編程語言,并掌握基本概念,就可以將這些知識應用到其他語言中。因此,我們可以掌握語言的特征,而不用浪費時間來選擇語言。
當一個聰明的程序員開始接觸一種新的編程語言時,他們通常不會花費很多時間閱讀語言的手冊或書籍,而是選擇直接使用該語言來解決實際問題。例如,我用R語言執(zhí)行一些復雜計算時遇到了一個問題。首先我會花幾分鐘瀏覽R語言手冊,了解該語言的特征。然后我會從網(wǎng)上找到與該問題相關的R語言的程序,并對其進行修改,直到解決問題。在解決問題的過程中,你可以很快掌握該語言。
▌選擇一門合適的入門語言
作為初學者,你應該選擇一門沒有明顯缺陷的合適的編程語言。首先你應該掌握這門語言的特征,然后將這些語言特征應用到其他編程語言上。哪種語言作為入門最合適呢?我個人認為可以從下列語言著手:
- Scheme
- C
- Java
- Python
- JavaScript
相反,我不推薦用下列語言作為入門:
- Shell
- PowerShell
- AWK
- Perl
- PHP
- Basic
- Go
一般來說,不應該使用腳本語言作為入門語言,尤其是那些源自早期的Unix系統(tǒng)的語言。雖然與Unix shell相比,PowerShell有所改進,但它依然沒有擺脫腳本語言的根本問題——他們的設計者不知道自己在干什么。
初學者利用腳本語言學習編程時無法掌握到關鍵點,這是一個非常嚴重的問題。腳本語言經(jīng)常會將一些系統(tǒng)工具的知識(例如正則表達式、互聯(lián)網(wǎng)等)添加到語法中,這不僅浪費了初學者的很多時間,而且導致他們無法真正掌握編程最關鍵的概念:變量、函數(shù)、遞歸、類型等等。
▌掌握關鍵特征,忽略次要特征
初學者應該關注編程語言最關鍵的特征,而不要為次要內(nèi)容分神。我發(fā)現(xiàn)在許多編程課的開頭,經(jīng)常有學生在學習用“printf”函數(shù)輸出“Hello World!”時,老師要求他們記住“printf”函數(shù)的諸多復雜的輸出格式,例如%d、%F、 %. 2f等等。
然而,眾所周知,輸入和輸出操作根本不是語言的主要部分。與核心的特征相比,這都是次要的。一些初學者在學習了幾周的Java后,仍然對“printf”功能感到惱火。雖然他們寫了幾百行“printf”函數(shù),但仍然不明白變量和函數(shù)是什么,甚至不知道如何使用算數(shù)語句和循環(huán)語句!
許多初學者認為編程很難學的最大的一個原因是,他們以為記不住%d、%F、 %. 2f就不可能深入學習!
▌自己動手實現(xiàn)語言的特征
在學習了基本的語言特征并使用它們編寫代碼之后,下一步就是實現(xiàn)這些特征。只有你動手實現(xiàn)不同的語言特征,才能算是完全掌握了它們。
一位編程大師曾經(jīng)說過,理解一門編程語言的最佳方式是自己動手實現(xiàn)它,這意味著你需要編寫一個解釋器來實現(xiàn)它的語義。但是我認為可以對這句話做略微的改動:完全掌握語言的一個特征的最佳方式是自己動手實現(xiàn)它。你不需要實現(xiàn)整個語言,因為歸根結底我們要使用是語言的特征。只要你自己動手實現(xiàn)了語言的一個特征,那么你就可以掌握所有語言中這個特征的實現(xiàn)與使用。
例如,在學習SICP時,很多人可能會選擇使用Scheme來實現(xiàn)一個面向?qū)ο笙到y(tǒng)。面向?qū)ο笙到y(tǒng)的Scheme的語法與其他語言(如Java、C ++、Python等)有很大的不同。但是,它可以幫助你理解所有面向?qū)ο螅∣OP)語言中面向?qū)ο蟮母拍?。它甚至可以幫助你理解各種面向?qū)ο髮崿F(xiàn)方法之間的差異。
直接學習面向?qū)ο缶幊陶Z言無法掌握這一點,因為在你學習Java、C ++、Python等語言時,你只是一個用戶,在使用Scheme親自動手實現(xiàn)面向?qū)ο笙到y(tǒng)之后,你就成為了創(chuàng)造者。
▌總結
無論是初學者還是高級程序員,你都應該更加關注語言的特征,而不是使用哪種語言。只有這樣,你才能快速掌握新語言并編寫高質(zhì)量的代碼。
未經(jīng)允許不得轉(zhuǎn)載:445IT之家 » 如何掌握所有的編程語言?