如何掌握所有的編程語言?

  還在討論哪種編程語言最具價值?還在頭疼怎麼快速掌握新的語言?本文給出了一勞永逸的辦法:掌握所有編程語言不是夢。

  


  以下爲譯文:

  我想在這裏討論的不是如何掌握一門編程語言,而是掌握所有的編程語言。

  許多初學者會寫信給我,問我應該學習哪種編程語言,以及如何學習編程語言。起初我總覺得這個問題太低級。但是漸漸地,我發現不僅是初學者,即便是許多知名科技公司的高級工程師實際上也對這個問題頗爲不解。

  今天,我打算花點時間回答這個擱置了很久的“低級”問題。我也希望與更多開發者分享我的想法。

  如果你有以下幾種困惑,那麼本文會對您所有幫助:

  你是初學者,不知道選擇哪門語言入門。

  你是高級程序員或團隊負責人,但你對新興語言感到困惑,不知道該投資哪門語言。

  你的團隊針對使用哪門語言爭論不休,甚至發生了一些不必要的衝突。

  你選用了一些時尚的編程語言,但是兩個月後發現它們都很坑。

  就我個人而言,如果遇到沒見過的語言,我會直接使用,而不會花很長時間學習。閱讀本文後,也許你會明白爲什麼我可以做到這一點。通過了解語言的特徵,每個程序員都可以像我一樣實現這個目標。至少我希望如此。

  ▌關注語言的特徵,而非語言本身

  許多開發人員很在意他們或別人是否可以熟練使用某種語言,他們常常會對不同語言的優點和缺點爭論不休。然而,對於我來說這些問題都不存在。儘管我撰寫了很多批評語言的文章,但我很少在實際工作中爭論語言本身。我發現最根本的原因是相對於語言本身,我更加重視語言的特徵。我可以用任何語言甚至很糟糕的語言寫出優秀的代碼。

  任何語言都是各種語言特徵的集合。例如,編程語言就像一臺計算機。其品牌可能是IBM、戴爾或蘋果。但是,你能說蘋果的電腦就一定比IBM好嗎?不能。首先你必須瞭解計算機的配置,例如處理器型號、內核數量、CPU的時鐘頻率、一級緩存、二級緩存……,內存和硬盤,顯示分辨率,還有顯卡、網卡等等。有時你還需瞭解每個硬件的兼容性。

  對於編程語言來說,這些計算機的配置則等同於語言特徵。以下是語言特徵的一些例子:

  變量定義

  數學運算

  for循環語句,while循環語句

  函數定義,函數調用

  遞歸

  靜態類型系統

  類型推斷

  Lambda表達式

  面向對象

  垃圾收集

  指針運算

  Goto語句

  語言特徵與計算機配置類似。在選擇計算機的時候,沒人會說戴爾的計算機就一定是最好的,他們會說這臺計算機的CPU是Intel i7處理器,比i5好,DDR3的內存比DDR2快很多,SSD硬盤的讀寫速度比普通硬盤快很多,ATI的顯卡性能很差,等等。

  編程語言也是如此。每種語言都有一組通用的特徵,例如變量、函數、條件語句和循環語句。只要你學習一種編程語言,並掌握基本概念,就可以將這些知識應用到其他語言中。因此,我們可以掌握語言的特徵,而不用浪費時間來選擇語言。

  當一個聰明的程序員開始接觸一種新的編程語言時,他們通常不會花費很多時間閱讀語言的手冊或書籍,而是選擇直接使用該語言來解決實際問題。例如,我用R語言執行一些複雜計算時遇到了一個問題。首先我會花幾分鐘瀏覽R語言手冊,瞭解該語言的特徵。然後我會從網上找到與該問題相關的R語言的程序,並對其進行修改,直到解決問題。在解決問題的過程中,你可以很快掌握該語言。

  ▌選擇一門合適的入門語言

  作爲初學者,你應該選擇一門沒有明顯缺陷的合適的編程語言。首先你應該掌握這門語言的特徵,然後將這些語言特徵應用到其他編程語言上。哪種語言作爲入門最合適呢?我個人認爲可以從下列語言着手:

  Scheme

  C

  Java

  Python

  JavaScript

  相反,我不推薦用下列語言作爲入門:

  Shell

  PowerShell

  AWK

  Perl

  PHP

  Basic

  Go

  一般來說,不應該使用腳本語言作爲入門語言,尤其是那些源自早期的Unix系統的語言。雖然與Unix shell相比,PowerShell有所改進,但它依然沒有擺脫腳本語言的根本問題——他們的設計者不知道自己在幹什麼。

  初學者利用腳本語言學習編程時無法掌握到關鍵點,這是一個非常嚴重的問題。腳本語言經常會將一些系統工具的知識(例如正則表達式、互聯網等)添加到語法中,這不僅浪費了初學者的很多時間,而且導致他們無法真正掌握編程最關鍵的概念:變量、函數、遞歸、類型等等。

  ▌掌握關鍵特徵,忽略次要特徵

  初學者應該關注編程語言最關鍵的特徵,而不要爲次要內容分神。我發現在許多編程課的開頭,經常有學生在學習用“printf”函數輸出“Hello World!”時,老師要求他們記住“printf”函數的諸多複雜的輸出格式,例如%d、%F、 %. 2f等等。

  然而,衆所周知,輸入和輸出操作根本不是語言的主要部分。與核心的特徵相比,這都是次要的。一些初學者在學習了幾周的Java後,仍然對“printf”功能感到惱火。雖然他們寫了幾百行“printf”函數,但仍然不明白變量和函數是什麼,甚至不知道如何使用算數語句和循環語句!

  許多初學者認爲編程很難學的最大的一個原因是,他們以爲記不住%d、%F、 %. 2f就不可能深入學習!

  ▌自己動手實現語言的特徵

  在學習了基本的語言特徵並使用它們編寫代碼之後,下一步就是實現這些特徵。只有你動手實現不同的語言特徵,才能算是完全掌握了它們。

  一位編程大師曾經說過,理解一門編程語言的最佳方式是自己動手實現它,這意味着你需要編寫一個解釋器來實現它的語義。但是我認爲可以對這句話做略微的改動:完全掌握語言的一個特徵的最佳方式是自己動手實現它。你不需要實現整個語言,因爲歸根結底我們要使用是語言的特徵。只要你自己動手實現了語言的一個特徵,那麼你就可以掌握所有語言中這個特徵的實現與使用。鄭州中原科大婦科醫院 http://www.120zzzzyy.com/

  例如,在學習SICP時,很多人可能會選擇使用Scheme來實現一個面向對象系統。面向對象系統的Scheme的語法與其他語言(如Java、C ++、Python等)有很大的不同。但是,它可以幫助你理解所有面向對象(OOP)語言中面向對象的概念。它甚至可以幫助你理解各種面向對象實現方法之間的差異。

  直接學習面向對象編程語言無法掌握這一點,因爲在你學習Java、C ++、Python等語言時,你只是一個用戶,在使用Scheme親自動手實現面向對象系統之後,你就成爲了創造者。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章