學習一門新的語言是一種冒險。我總是熱衷於嘗試新的東西——學習新的語法,了解不同的模式,乃至徹底改變思維方式。不幸的是,許多開發人員對此不以為然,甚至可能是深惡痛絕的——學習新語言,就得走出舒適區,花時間花精力來學習新的理念和方法。
這段日子,我每天都要用大約 5 種不同的語言來寫不同的項目!
- 我應該先學哪種語言?
有關這方面的討論真可謂數不勝數。很多剛進入編程社區的初學者,都會問這個問題,簡直就是前赴後繼。有些人建議先學不費力的,如 Python 和 Ruby,也有的人認為應該先學例如 C、C++ 和 GO 這類難一些的低層次的內容。我要說的是我們在選擇新的語言之前,應該注意以下幾個要點。
- 類型系統
從我的經驗和先前的學習路徑看,這是最重要的概念之一。我很慶幸我一開始學的是 C,接著嘗試了 C ++,一段時間之後,我又投入了 Java 的懷抱。然後是 Scala,以及現在我開始玩 Ruby。同時,我對 Objective-C、Python、甚至是 OCaml 也有所涉及。哦,對了,最近我正在搗鼓 Swift 和 CoffeeScript。
如果我一開始學的是 JavaScript、Python 或 Ruby,那麼後面去理解什麼是類型和變量就會非常困難。理解靜態和動態以及弱類型和強類型系統之間的區別,對於領悟語言的工作原理是至關重要的。我無法想像,如果我一開始不能掌控類型,那麼後面涉及到的聲明與定義,以及彙編與解釋之間的差異,會是讓人多麼頭大的一件事。
不過,也有很多開發人員希望能有立竿見影的效果:既想快速看到結果,又不願意過多地了解細節。他們喜歡接軌新的應用程序。最好是不用動腦子的語言,碰到這樣的他們最開心了。因為在他們眼中,掌握 integer、string 和 boolean 是學習編程的超級大障礙。最好能夠毋須分辨類、對象和方法,直接寫代碼:
scala> println(“Hello World!”) Hello World! >>> print "Hello World!" Hello World! 2.2.1 :001 > puts "Hello World!" Hello World!
不可否認這種途徑能夠給人信心,讓人覺得自己學到了新的東西。
首先,請明確你屬於哪種類型,擺正自己的位置。你想要探究隱藏起來的工作原理嗎,喜歡深入研究本地執行嗎?願意去理解語言結構嗎?又或者你只在乎能有快速的結果,不想了解虛擬機和編譯工作,並且語言內部機制對你而言也一點都不重要?
- 從自己的利益角度考慮
你可能需要處理哪些數據?你打算寫複雜的業務系統還是相對簡單的 CRUD 創業公司?請基於可能會讓自己感興趣的內容來確定工作領域。
所以,如果你確定你想要去企業工作,那麼你可以試試 Java 或者.NET。如果你傾向於黑客並高度注重安全問題,那麼不妨學習 C/C ++ 或 Bash。如果你夢想成為一名 Web 開發人員,那麼先掌握 PHP、JavaScript 或 Ruby 吧。如果你想要編寫一些機器、機器人、汽車或其他電子方面的程序——也行,先學 C ++ 或 Python 吧。你喜歡搗鼓移動設備?那麼 Java、Swift 或 C#就應該是你的首選。如果你喜歡數學和算法,那麼 Lua、Erlang 或 R 就很適合你。等等等等,不勝枚舉。總之——一切取決於你的目的和愛好。
- 語言內部機制
你有組織化的堆棧內存嗎?你在程序中傳遞變量時使用引用類型還是只使用值類型?你是否利用指針和析構函數來控制對象的生命週期?你是自行清理存儲器還是使用相關的垃圾收集器?你是否計算和跟踪引用類型和子類?
這些都是我們平時不會關心的問題。但是有時候,它們卻是一些你不得不處理的概念,所以理解內部機制很重要。雖然現在你會覺得這些概念很複雜,理解起來很難,因為終有一天,你會慶幸自己現在的選擇,有道是,書到用時方恨少,不要到用的時候追悔莫及。
- 我應該學習哪些語言?
- 社區——StackOverflow、Reddit
下面是一些 Reddit 上面有關於通用編程的內容:
·http://www.r
eddit.com/r/ programmers ·http://www.r
eddit.com/r/ cscareerques tions/
你也點擊http://stack
- 函數庫
函數庫之所以重要是因為它能讓你有效利用現有資源,而不必再“重新發明輪子”。我們通常需要解決特定問題,實現業務規則,處理重要進程,從數組中找出所需元素,利用給定字符串,過濾特定集合等等。最好語言本身或者第三方函數庫能夠提供一些可以加快開發進程的實用程序、輔助工具和數據結構。
下面是一些不同語言的社區函數庫代碼倉庫:
Android:https://andr
oid-arsenal. com/ Java、Scala、Groovy:https://sear
ch.maven.org / Haskell:https://hack
age.haskell. org/packages / Python:https://pypi
.python.org/ pypi .NET:https://www.
nuget.org/pa ckages JavaScript:https://www.
npmjs.com/
保持對第三方支持可擴展性、開放性和易於集成等方面的審查。
- 從創造者 / 維護人員那兒獲得文檔和支持
你閱讀文檔嗎?文檔是不是易於理解的,全面的,最新的?更新頻率如何?有多少維護人員,是否也在社區中?從文檔中你能提取多少信息?你能否輕鬆駕馭不同的部分?
這是一個非常有效的觀察報告。只要有創造者提供有助於學習和理解語言的文檔,其他的其實無所謂。例如,Ruby 就有不少提供文檔的網站,如:https://www.
語言的創造者對待社區的態度也很重要。他能否像 Ruby 創始人 Matz 一樣願意接受和傾聽反饋?他是否像 Scala 之父 Martin Odersky 一樣有著純粹的經營方針?又或者他是否會像 Clojure 的發明者一樣鼓勵社區發展?
- 資源和實例——博客、GitHub 代碼倉庫
下面是一些可作為起步指導的好例子:
·http://docs.
scala-lang.o rg/overviews /
至於網上教程,下面這些是很不錯的門戶網站,如:
·https://www.
codeschool.c om/
不妨去看一看。
- 資金
沒錯,前面我們談論了思想、激情,以及一些抽象的概念,但是最後所有這一切都歸結到資金,也就是金錢。在選擇語言之前最好先搞清楚哪種薪酬 / 需求相對比較高。當然,你也可以純粹是因為好玩而選擇它。新事物總在不斷地出現和發展,雖然這可以拓寬我們的視野,但學一些有用的東西還是非常重要的。在這種情況下你有以下兩種解決方案:
● 學習當前市場上最流行 / 需求量最大的語言 / 技術 / 框架。這能確保你不但能找到工作,還能獲得優渥的報酬。
● 按照自己的觀點學習。這可能有點難以想像。因為誰也不能打包票說下一個流行的就一定是這種編程語言。試想一下,10 年前你要是說 Ruby 會成為當前社會的寵兒,誰會相信。還有 Scala 和 GO,沒人知道之後,比如說,5 年以後它們會發生什麼變化。如果你現在選擇了它們——那麼,要么你將成為高薪專家,因為以後會變得非常普及;要么你只是掌握了一種沒用的,被淘汰的語言。
點擊這裡查看市場分析:https://goor
- 我要不要一次學習多種編程語言?
剛開始——不要這麼做。從長遠來看——是的,你應該學習多種編程語言。
當你剛踏上編程之旅時,你應該只專注於一種語言。你需要掌握所有的概念,全神貫注於學習某個特定區域。
當你已經是一個有一定經驗的工程師,那情況就有所不同了。由於你已經知道內部機制和程序的工作原理,這時你需要做的就是學習新的語法和新的範式,因為很多概念在不同語言裡面都是相通的。
萬事開頭難,一旦正確起步之後,就會像滾雪球一樣越滾越順。
- 總結
那麼歸根究底我們為什麼要學習新的語言呢?因為沒有哪種工具是適用於所有目標的。而我們有著不同的項目,不同的問題,不同的體系結構。也許在啟用新的應用程序和選擇技術堆棧之前,我們首先應該考慮的是解決實際的業務問題,然後才能選擇出最切合實際的最佳工具。
不要從工具和興趣愛好入手。要從問題著手,然後找出解決方案。只有在了解這些的基礎上,你才能選出合適的語言,幫助你用最有效的方式實現業務規則。
當然,如果你通曉多種編程語言,那你肯定能更快,更高效。因為你總是可以挑選出完美的工具,用最經濟的方式解決問題,並提供最有力的實現。
- 書籍
下面這些是我認為對大家學習初級概念很有幫助的書。
- 工具
下面這些工具可以用於比較編程語言——不但包含語法,還包括社會普及程度和社會支持程度。
·http://learn
XinYminutes. com/
- 資源
下列資料展示了學習不同的語言和新架構的方法和原理。
·https://www.
youtube.com/ watch?v=lkVI 4JmnMAM ·https://www.
youtube.com/ watch?v=FPBV xpl8NMo ·http://www.s
lideshare.ne t/squixy/sca la-vs-ruby-4 5694031
最後,如有不同意見,歡迎指正。
譯文鏈接:http://www.codeceo.com/article/be-a-polyglot-programmer.html
英文原文:Be a polyglot programmer
翻譯作者:碼農網 – 王國峰
- 延伸閱讀
(本文轉載自合作夥伴《碼農網》;未經授權,不得轉載)