學習一門新的語言是一種冒險。我老是熱衷於嘗試新的東西——學習新的語法,瞭解不一樣的模式,乃至完全改變思惟方式。不幸的是,許多開發人員對此不覺得然,甚至多是深惡痛絕的——學習新語言,就得走出溫馨區,花時間花精力來學習新的理念和方法。html
這段日子,我天天都要用大約5種不一樣的語言來寫不一樣的項目!python
我應該先學哪一種語言?android
有關這方面的討論真可謂數不勝數。不少剛進入編程社區的初學者,都會問這個問題,簡直就是前赴後繼。有些人建議先學不費力的,如Python和Ruby,也有的人認爲應該先學例如C、C++和GO這類難一些的低層次的內容。我要說的是咱們在選擇新的語言以前,應該注意如下幾個要點。ios
類型系統git
從個人經驗和先前的學習路徑看,這是最重要的概念之一。我很慶幸我一開始學的是C,接着嘗試了C ++,一段時間以後,我又投入了Java的懷抱。而後是Scala,以及如今我開始玩Ruby。同時,我對Objective-C、Python、甚至是OCaml也有所涉及。哦,對了,最近我正在搗鼓Swift和CoffeeScript。程序員
若是我一開始學的是JavaScript、Python或Ruby,那麼後面去理解什麼是類型和變量就會很是困難。理解靜態和動態以及弱類型和強類型系統之間的區別,對於領悟語言的工做原理是相當重要的。我沒法想象,若是我一開始不能掌控類型,那麼後面涉及到的聲明與定義,以及彙編與解釋之間的差別,會是讓人多麼頭大的一件事。github
不過,也有不少開發人員但願能有立竿見影的效果:既想快速看到結果,又不肯意過多地瞭解細節。他們喜歡接軌新的應用程序。最好是不用動腦子的語言,碰到這樣的他們最開心了。由於在他們眼中,掌握 integer、string和boolean是學習編程的超級大障礙。最好可以毋須分辨類、對象和方法,直接寫代碼:golang
scala> println(「Hello World!」)算法
Hello World!npm
>>> 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.reddit.com/r/programmers
●http://www.reddit.com/r/cscareerquestions/
●http://www.reddit.com/r/learnprogramming/
●http://www.reddit.com/r/programming
你也點擊http://stackoverflow.com/tags 或http://www.reddit.com/subreddits在特定的語言社區中尋求幫助。許多樂於助人的高手就在那裏等你。
函數庫
函數庫之因此重要是由於它能讓你有效利用現有資源,而沒必要再「從新發明輪子」。咱們一般須要解決特定問題,實現業務規則,處理重要進程,從數組中找出所需元素,利用給定字符串,過濾特定集合等等。最好語言自己或者第三方函數庫可以提供一些能夠加快開發進程的實用程序、輔助工具和數據結構。
下面是一些不一樣語言的社區函數庫代碼倉庫:
●iOS:https://cocoapods.org/
●Android:https://android-arsenal.com/
●Java、Scala、Groovy:https://search.maven.org/
●Haskell:https://hackage.haskell.org/packages/
●GO:http://golang.org/pkg/
●Ruby:https://rubygems.org/
●Python:https://pypi.python.org/pypi
●.NET:https://www.nuget.org/packages
●JavaScript:https://www.npmjs.com/
保持對第三方支持可擴展性、開放性和易於集成等方面的審查。
從創造者/維護人員那兒得到文檔和支持
你閱讀文檔嗎?文檔是否是易於理解的,全面的,最新的?更新頻率如何?有多少維護人員,是否也在社區中?從文檔中你能提取多少信息?你可否輕鬆駕馭不一樣的部分?
這是一個很是有效的觀察報告。只要有創造者提供有助於學習和理解語言的文檔,其餘的其實無所謂。例如,Ruby就有很多提供文檔的網站,如:https://www.omniref.com/,http://ruby-doc.org/。 Scala也有至關不錯的API說明書http://www.scala-lang.org/api/current/。
語言的創造者對待社區的態度也很重要。他可否像Ruby創始人Matz同樣願意接受和傾聽反饋?他是否像Scala之父Martin Odersky同樣有着純粹的經營方針?又或者他是否會像Clojure的發明者同樣鼓勵社區發展?
資源和實例——博客、GitHub代碼倉庫
下面是一些可做爲起步指導的好例子:
●http://docs.scala-lang.org/overviews/
●https://www.ruby-lang.org/en/documentation/
●https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/index.html
●http://arcturo.github.io/library/coffeescript/,http://autotelicum.github.io/Smooth-CoffeeScript/
至於網上教程,下面這些是很不錯的門戶網站,如:
●https://www.codeschool.com/
●http://www.codecademy.com/
●http://www.pluralsight.com/
●http://teamtreehouse.com/
●http://tutsplus.com/
●http://www.lynda.com/
●https://www.udemy.com/
不妨去看一看。
資金
沒錯,前面咱們談論了思想、激情,以及一些抽象的概念,可是最後全部這一切都歸結到資金,也就是金錢。在選擇語言以前最好先搞清楚哪一種薪酬/需求相對比較高。固然,你也能夠純粹是由於好玩而選擇它。新事物總在不斷地出現和發展,雖然這能夠拓寬咱們的視野,但學一些有用的東西仍是很是重要的。在這種狀況下你有如下兩種解決方案:
●學習當前市場上最流行/需求量最大的語言/技術/框架。這能確保你不但能找到工做,還能得到優渥的報酬。
●按照本身的觀點學習。這可能有點不可思議。由於誰也不能打包票說下一個流行的就必定是這種編程語言。試想一下,10年前你要是說Ruby會成爲當前社會的寵兒,誰會相信。還有Scala和GO,沒人知道以後,好比說,5年之後它們會發生什麼變化。若是你如今選擇了它們——那麼,要麼你將成爲高薪專家,由於之後會變得很是普及;要麼你只是掌握了一種沒用的,被淘汰的語言。
點擊這裏查看市場分析:https://gooroo.io/analytics。
我要不要一次學習多種編程語言?
剛開始——不要這麼作。從長遠來看——是的,你應該學習多種編程語言。
當你剛踏上編程之旅時,你應該只專一於一種語言。你須要掌握全部的概念,全神貫注於學習某個特定區域。
當你已是一個有必定經驗的程序員,那狀況就有所不一樣了。因爲你已經知道內部機制和程序的工做原理,這時你須要作的就是學習新的語法和新的範式,由於不少概念在不一樣語言裏面都是相通的。
萬事開頭難,一旦正確起步以後,就會像滾雪球同樣越滾越順。
總結
那麼歸根究底咱們爲何要學習新的語言呢?由於沒有哪一種工具是適用於全部目標的。而咱們有着不一樣的項目,不一樣的問題,不一樣的體系結構。也許在啓用新的應用程序和選擇技術堆棧以前,咱們首先應該考慮的是解決實際的業務問題,而後才能選擇出最切合實際的最佳工具。
不要從工具和興趣愛好入手。要從問題着手,而後找出解決方案。只有在瞭解這些的基礎上,你才能選出合適的語言,幫助你用最有效的方式實現業務規則。
固然,若是你通曉多種編程語言,那你確定能更快,更高效。由於你老是能夠挑選出完美的工具,用最經濟的方式解決問題,並提供最有力的實現。
書籍
下面這些是我認爲對你們學習初級概念頗有幫助的書。
工具
下面這些工具能夠用於比較編程語言——不但包含語法,還包括社會普及程度和社會支持程度。
●http://learnXinYminutes.com/
●http://HyperPolyglot.org/
●http://RosettaCode.org/wiki/Rosetta_Code
●http://githut.info/
資源
下列資料展現了學習不一樣的語言和新架構的方法和原理。
●https://www.youtube.com/watch?v=lkVI4JmnMAM
●https://www.youtube.com/watch?v=FPBVxpl8NMo
●http://www.slideshare.net/squixy/scala-vs-ruby-45694031
最後,若有不一樣意見,歡迎指正。