本篇博客是《軟件開發(fā)者成長完全攻略》系列翻譯文章第 4 章勿侯。
原文地址:What Programming Language Should I Learn
軟件開發(fā)領(lǐng)域的新手中最常見的一個(gè)問題就是他們應(yīng)該學(xué)習(xí)哪門編程語言。對于某些有抱負(fù)的開發(fā)者,這個(gè)問題成為他們從未跨過去的絆腳石环肘。
我曾經(jīng)教授過很多的開發(fā)者磅氨,他們總是自己進(jìn)行預(yù)測或者在做了決定后變卦擅这,從一門語言換到另一門語言驯击,他們永遠(yuǎn)都在擔(dān)心自己做錯(cuò)了選擇硝清。
如果你也曾經(jīng)為選擇哪門編程語言而感到過焦慮,那么這一章就是為你而寫的脚囊。
首先,我會先消除你的某些疑慮桐磁;接著悔耘,我會給出一些實(shí)際的考慮因素來幫助你選擇自己將要進(jìn)行學(xué)習(xí)的第一門編程語言。
選擇哪門語言其實(shí)并沒有那么重要
是的我擂,你沒有看錯(cuò)標(biāo)題衬以。
學(xué)習(xí)哪門語言其實(shí)并不像你認(rèn)為的那樣重要。我說這句話是有很多原因的校摩,但是其中最重要的一個(gè)就是雖然有這么多的編程語言看峻,但是他們從本質(zhì)上來講都是很相似的。
是的衙吩,他們的語法可能是不一樣的互妓。是的,編程語言也許看起來都是不一樣坤塞。他們可能擁有完全不同的特性集合冯勉。但是,在本質(zhì)上摹芙,所有的編程語言都比你第一眼看到的那樣有更多的共同點(diǎn)灼狰。
幾乎所有的編程語言都有基礎(chǔ)的分支結(jié)構(gòu),循環(huán)浮禾,方法或者函數(shù)調(diào)用以及在更高層次組織代碼的方法交胚。有很多的編程語言甚至相似到只要你掌握了其中一門,你就基本上掌握了其它幾門盈电。
C# 跟 Java 就是一個(gè)很好的例子蝴簇。同時(shí),JavaScript 也跟他們兩個(gè)中的任意一個(gè)很相像挣轨。
掌握第一門編程語言永遠(yuǎn)都是最困難的军熏。一旦你掌握了一門編程語言,再學(xué)習(xí)第二門就會簡單很多了卷扮。當(dāng)你掌握了二門或者以上的編程語言后荡澎,之后學(xué)習(xí)編程語言的難度對你來說都是呈指數(shù)型下降的均践。
當(dāng)你對一門編程語言一知半解 —— 或者是一無所知 —— 的時(shí)候,上面的這些話聽起來似乎有點(diǎn)不可信摩幔,但是在我的職業(yè)生涯過程中彤委,我學(xué)習(xí)過至少 10 門不同的編程語言,我可以向你保證或衡,只有第一焦影、第二門語言是最難的。
編程語言遠(yuǎn)比你想像中的來得相似封断,你也可以很容易地在不同語言間進(jìn)行切換斯辰,然后之后再繼續(xù)進(jìn)行學(xué)習(xí)。這意味著坡疼,即使你已經(jīng)開始學(xué)習(xí)一門語言了彬呻,但是如果發(fā)現(xiàn)它并不是你的菜,或者你找了一份需要使用不同語言開發(fā)的工作柄瑰,這都不是什么大問題闸氮。你為學(xué)習(xí)第一門編程語言做的很多努力都不會白費(fèi)。
你也會發(fā)現(xiàn)很多開發(fā)者的職位 —— 特別是像微軟以及 Google 這樣的大公司 —— 沒有要求一門具體的編程語言教沾。
甚至是我自己參加過的很多面試蒲跨,他們只要求我使用自己覺得最舒服的語言來解決提出的編程問題,而并沒有限制我一定要掌握哪門具體的語言授翻。
選擇一門編程語言的考量
因此或悲,我真心覺得選擇哪門語言作為你第一門學(xué)習(xí)的語言,并沒有那么重要藏姐。但是如果你還是覺得難以抉擇隆箩,接下來我會跟你一起從幾個(gè)方面進(jìn)行考量。
工作前景及未來
我會說羔杨,對于你們中的大多數(shù)人捌臊,首要的考慮因素是這門語言能幫你找到什么樣的工作,以及這門語言的未來發(fā)展如何兜材。
就目前而言理澎,對于大多數(shù)的流行語言來說,在任何時(shí)候都有大量的工作可供選擇曙寡。不同語言的流行程度可能會上升或下降糠爬,但是如果你關(guān)心的工作的問題,你可能會從那些最主流举庶,最受歡迎的語言中進(jìn)行選擇执隧。
在本書寫作的時(shí)候,最流行的語言有這些:
- C#
- Java
- Python
- Ruby
- JavaScript
- C++
- PHP
對于使用這些語言的開發(fā)者來說,他們永遠(yuǎn)都不會缺工作镀琉。這意味著峦嗤,取決于你現(xiàn)在處于世界上的哪個(gè)地方,如果你不想進(jìn)行搬遷的話屋摔,你就需要更加認(rèn)真的進(jìn)行選擇烁设。
例如,你現(xiàn)在住在阿肯色州的某個(gè)小城鎮(zhèn)钓试,那里只有一家技術(shù)公司装黑,而且這家技術(shù)公司全部使用 Java 進(jìn)行開發(fā),那么我會建議你去學(xué)習(xí) Java弓熏。
我可以假設(shè)你們中的大多數(shù)都不是這種情況恋谭,但是如果這真的是你現(xiàn)在的處境,那么我猜你的決定已經(jīng)相當(dāng)明顯了挽鞠。
如果你樂意搬遷或者計(jì)劃做一個(gè)自由職業(yè)者箕别,你可以選擇一門比較古怪,比較小眾的語言滞谢,然后成為這門語言為數(shù)不多的專家中的一個(gè)。
但是除抛,如果你是一個(gè)剛剛起步的新手狮杨,我還是建議你選擇一門比較主流的語言。
除了從工作的角度進(jìn)行考量到忽,你還要考慮這門編程語言的未來發(fā)展橄教。
在本書寫作的時(shí)候,Objective-C 可能不是入門的一個(gè)好選擇喘漏,因?yàn)榇蠖鄶?shù)的 iOS 開發(fā)者正在轉(zhuǎn)向 Swift 护蝶,并且 Apple 正在大力推薦 Swift 編程語言。
如果你已經(jīng)在使用 Objective-C 進(jìn)行開發(fā)了翩迈,你也不用擔(dān)心持灰;現(xiàn)在還有大量的基于 Objective-c 的應(yīng)該需要進(jìn)行維護(hù)。只是它可能不是未來的最佳選擇负饲。
當(dāng)然堤魁,我們都沒有水晶球,所以無法預(yù)測哪門語言會流行返十,而哪門語言會衰落妥泉。不久之后,我預(yù)測了 JavaScript 的衰亡洞坑,但是這并沒有發(fā)生盲链。
我曾經(jīng)去參加了一個(gè)開發(fā)者大會,其中一位發(fā)言人是 Objective-C 的合作發(fā)明者,大概是 20 世紀(jì) 80 年代的時(shí)候刽沾。
這位發(fā)言人本慕,Tom Love,寫了一本斷定 JavaScript 已死的書悠轩。然而间狂,在我這本書寫作的時(shí)候,JavaScript 已經(jīng)是世界上最受歡迎的五大編程語言之一火架。(我還聽說有人聲稱它已經(jīng)到了前三鉴象。)這里的關(guān)鍵點(diǎn)就在于,我們永遠(yuǎn)無法預(yù)測什么事會發(fā)生何鸡。
Ruby 在它流行之前也沉寂了好幾年纺弊。JavaScript 可以說是一門設(shè)計(jì)得最爛的語言,一開始只用于在 web 頁面上顯示一些彈窗和警告框骡男;而現(xiàn)在它成為最受歡迎的語言之一淆游。
所以,不要去預(yù)測未來隔盛,除非你真的有一個(gè)水晶球犹菱。如果真是這樣,快忘了編程吧吮炕,華爾街才是你的歸宿腊脱。
Hey Jhon
你為何要如此厭惡 JavaScript 呢?JavaScript 并不令人討厭龙亲,你才是陕凹。
我知道這聽起來像是我在搞事,并且讓你覺得我在針對 JavaScript鳄炉《虐遥可能這會讓你感覺 JavaScript 給我的童年帶來的創(chuàng)傷,并留下了深深的情感傷疤拂盯。
好吧佑女,讓我跟你講一個(gè)關(guān)于 JavaScript 是如何產(chǎn)生的小故事 —— 這個(gè)故事很短,請?jiān)试S我把它講完谈竿。
1995 年的五月份珊豹,當(dāng)時(shí)還在 Netscape 工作的 Brendan Eich 利用了 10 天的時(shí)間發(fā)明了 JavaScript,并將它作為網(wǎng)頁設(shè)計(jì)師與兼職開發(fā)者都能容易上手的“膠水語言”榕订。(這段信息是從 Wikipedia 上獲取的店茶。)因此,我想表達(dá)的只是 JavaScript 這門語言一開始并沒有經(jīng)過慎重考慮劫恒,然后在 10 天之內(nèi)被拼湊出來了贩幻。
這就是事實(shí)轿腺,這就是發(fā)生過的事 —— 不要忽略這些信息。說過這些之后丛楚,我想告訴你族壳,我并不厭惡 JavaScript。我只是不認(rèn)為它是一門設(shè)計(jì)優(yōu)雅的語言趣些,并且我不是特別喜歡它仿荆,僅此而已。<br />
目前坏平,新版本的 JavaScript (現(xiàn)在被稱為 ECMAScript)已經(jīng)好多了拢操,并且它原本的缺陷部分也被做了很多增強(qiáng)的改進(jìn)。
實(shí)際上 —— 我不想承認(rèn)這一點(diǎn) —— 我現(xiàn)在已經(jīng)有點(diǎn)喜歡它了...僅僅是有一點(diǎn)而已舶替。
盡管如此令境,我的觀點(diǎn)并沒有那么重要。
我是一個(gè)務(wù)實(shí)的人顾瞪。顯然 JavaScript 是一門非常流行的語言舔庶,并且它幾乎無處不在。
所以陈醒,不管我喜歡還是討厭惕橙,我都得擁抱它 —— 同時(shí)保留我噴它的權(quán)力。
如果到現(xiàn)在你還沒有被我說服钉跷,你可以自己考慮下吕漂,為什么關(guān)于 JavaScript 最暢銷的書叫作 JavaScript: The Good Parts。
你感興趣的技術(shù)
當(dāng)你選擇編程語言的時(shí)候尘应,另一個(gè)很好的考量標(biāo)準(zhǔn)就是:你對哪項(xiàng)技術(shù)最感興趣。
如果你從技術(shù)開始進(jìn)行選擇吼虎,那么編程語言就更加容易確定了犬钢。我知道很多程序員對開發(fā) Android 應(yīng)用感興趣,因?yàn)樗麄儫釔圻@項(xiàng)技術(shù)思灰。
對于他們中的大部分人來說玷犹,Java 會是一個(gè)好選擇,因此它是開發(fā) Android 應(yīng)用的原生語言洒疚。(雖然歹颓,你也可以使用很多其它的語言開發(fā) Android 應(yīng)用,如 C#油湖,Ruby 甚至是 JavaScript巍扛。)根據(jù)自己最感興趣的技術(shù)來選擇第一門編程語言是很有好處的,因?yàn)閷W(xué)習(xí)第一門編程語言會有相當(dāng)?shù)碾y度乏德。
你對自己所學(xué)習(xí)的東西越感興趣撤奸,越興奮吠昭,你就能越容易地堅(jiān)持下去,并克服在這過程中最困難的學(xué)習(xí)曲線胧瓜。
我真的很想開發(fā) iOS 應(yīng)用矢棚,因?yàn)槲覄倓偸盏搅艘话?iPhone 手機(jī),我現(xiàn)在對這項(xiàng)技術(shù)感到十分興奮府喳。這種興奮感可以激勵(lì)我蒲肋,讓我更容易地去學(xué)習(xí) Objective-C 并構(gòu)建自己的第一個(gè) iOS 應(yīng)用。
如果我對這項(xiàng)技術(shù)沒有那么感興趣钝满,那么我可能不會堅(jiān)持這么久兜粘。不要害怕基于自己的興趣以及興奮感來選擇一門編程語言。你的激情可以帶你渡過學(xué)習(xí)過程中最困難的一段路程舱沧。
難度級別
另外一個(gè)主要的考慮因素就是難度級別妹沙。某些編程語言就是要比別的語言更難學(xué)。通常情況下熟吏,我不建議從 C++ 開始學(xué)習(xí)距糖,因?yàn)楦渌Z言比起來,C++ 學(xué)習(xí)難度要高很多牵寺。
C++ 需要你手動管理內(nèi)存悍引、指針以及一些其它一些很麻煩的構(gòu)造方法,這些東西很容易將一個(gè)初學(xué)者嚇退帽氓。
它是一門很棒的語言 —— 到現(xiàn)在依然是我的最愛 —— 但不是一門好學(xué)的語言趣斤。
一門類似 C#,Lua黎休,Python浓领,Ruby 或者 PHP 的語言,會讓你的入門變得更加容易势腮。甚至還有專門為初學(xué)者量身定做的語言联贩,比如說 Scratch 或者 Basic。
如果你是真心想學(xué)習(xí) C++捎拯,我并不會打擊你泪幌,但是至少你要知道你將面對的是什么,或者你會愿意選擇一門更加容易的入門的語言署照。
可用的資料
你可能還需要考慮學(xué)習(xí)這門語言時(shí)在網(wǎng)上能找得到的資料祸泪。有一些比較奇葩的語言可能沒有多少相關(guān)的書籍,在線視頻建芙,或者其它可用的資源没隘,這就會導(dǎo)致他們更難以學(xué)習(xí)。
其它更流行的編程語言就會有大量的在線教程禁荸,可供參加的培訓(xùn)機(jī)構(gòu)升略,或者其它可利用的學(xué)習(xí)資料微王,所以在初學(xué)一門語言時(shí),請務(wù)必先確認(rèn)這門語言有足夠多的學(xué)習(xí)資料品嚣。
現(xiàn)在網(wǎng)上已經(jīng)有了大量針對于初學(xué)者的教程炕倘,因此關(guān)于資料的考量已經(jīng)不如以前那么重要了,但是它確實(shí)還是值得考慮的一點(diǎn)翰撑。
你可能還需要考慮的一點(diǎn)就是你現(xiàn)有的可用資源罩旋,比如說電腦(學(xué)習(xí) iOS 需要用 Mac),或者軟件等眶诈。一門難學(xué)的語言可能會因?yàn)榫W(wǎng)上有大量相關(guān)的交互式在線教程而變得更容易涨醋。
你可以使用瀏覽器直接在線學(xué)習(xí) JavaScript 而不用在電腦上安裝任何東西。而類似 C++ 這樣的語言需要下載并安裝一些軟件逝撬,這一步對于初學(xué)者來說可能不是那么簡單浴骂。
關(guān)于可用資源的最后一點(diǎn),你應(yīng)該考慮到自己認(rèn)識的人宪潮。
誰是你可以尋求幫助的人溯警?有誰可以在你陷入困境的時(shí)候?yàn)槟憬鉀Q困惑,或者可以幫助你更快速地學(xué)習(xí)嗎狡相?
在選擇第一門編程語言的時(shí)候梯轻,我當(dāng)然不會把資源當(dāng)成最大的考慮因素,但是它也確實(shí)是我們需要認(rèn)真考慮的一點(diǎn)尽棕。
適用性
最后喳挑,讓我們談?wù)勥m用性。
不同的編程語言會在各自不同的環(huán)境和技術(shù)中有更好的適用性滔悉。
比如說在寫作本書的時(shí)候伊诵,得益于微軟或者 Xamarin(現(xiàn)在也是微軟的)這樣的公司,C# 就是一門適用性很強(qiáng)的語言回官。如果你學(xué)習(xí)了 C#曹宴,它不僅僅可以用于 Windows 和 web 編程,它現(xiàn)在可以適用于任何平臺孙乖,因此它的適用性是相當(dāng)高的。
你可以使用 C# 來編寫 Linux 或者 Mac 應(yīng)用份氧,甚至你可以完全使用 C# 來開發(fā) Android 和 iOS 應(yīng)用唯袄。
還有其它很多的語言也具有很高的適用性。
舉例來說蜗帜,Ruby 也被移植到了許多不同的開發(fā)平臺恋拷,并且被用于很多的技術(shù)領(lǐng)域中。JavaScript 也是一門適用性很高的語言厅缺。你甚至可以使用 JavaScript 來控制 Arduino 開發(fā)板和控制機(jī)器人蔬顾。(如果你想知道怎么做的話宴偿,可以參考我朋友 Derick Bailey 的文章。)相對而言诀豁,其它語言就沒有這么高的適用性了窄刘。
如果你學(xué)習(xí)的是 R 或者 Go,那么你就會被限制于這些語言設(shè)計(jì)時(shí)所針對的技術(shù)和平臺舷胜。
有越來越多的語言 —— 特別是流行的語言 —— 被移植到了更多的開發(fā)平臺上娩践,并且可以在不同的技術(shù)中使用了,然而確實(shí)還是有一些語言沒有這樣多才多藝烹骨。
所以翻伺,如果你今天想成為一個(gè) web 開發(fā)者,而明天想學(xué)習(xí) Android 開發(fā)沮焕,或者你就是想涉及不同的平臺和技術(shù)吨岭,那么你就要考慮下選擇學(xué)習(xí)的這門語言有多大的適用性了。
關(guān)于選擇編程語言的最后一些想法
盡管我給了你一些在選擇你的第一門編程語言時(shí)需要考慮的問題峦树,但是我想再次強(qiáng)調(diào)的是具體學(xué)習(xí)的語言并沒有那么重要辣辫。
更重要的是你選擇一門語言,并堅(jiān)持學(xué)習(xí)它足夠長的時(shí)間空入,克服它的學(xué)習(xí)曲線并熟練地使用它络它。
很多剛起步的開發(fā)者都會感到很沮喪,因?yàn)樗麄冇X得自己根本就沒有掌握它歪赢。關(guān)于這一點(diǎn)化戳,我會在下一章“學(xué)習(xí)你的第一門編程語言”中討論到。
只要穩(wěn)住埋凯,并堅(jiān)持學(xué)習(xí)下去点楼,你一定會越來越熟練。我向你保證白对。
在某個(gè)階段它會變得無聊掠廓,或者你覺得自己選錯(cuò)了語言,導(dǎo)致你在不同的語言中來回切換甩恼,但是 —— 請相信我 —— 這并不是一個(gè)好主意蟀瞧。
最后,請考慮一下条摸。當(dāng)我剛剛開始學(xué)習(xí)編程時(shí)悦污,深入了解一門語言是開發(fā)者要掌握的一項(xiàng)最重要的技能。我會買一堆的 C++ 書籍钉蒲,并嘗試去學(xué)習(xí)這門語言的所有細(xì)節(jié)切端。
而在今天,這不再是一門如此重要的技能了顷啼。
現(xiàn)在的編程都是基于更高層的抽象踏枣,更多的是使用這門語言的庫或者框架昌屉,而非語言本身的特性。當(dāng)然茵瀑,了解一門語言 —— 并且很好地掌握它 —— 依然很重要间驮,但是精通一門語言的重要性已經(jīng)不如以往了。
這就是為什么我讓你不要那么糾結(jié)于第一門學(xué)習(xí)的語言瘾婿。你所需要做的就是學(xué)習(xí)一門語言然后堅(jiān)持下去 —— 至少在目前應(yīng)該如此蜻牢。
關(guān)注
如果你喜歡這篇文章,可以關(guān)注我的公眾號偏陪,隨時(shí)獲取我最新的博客文章抢呆。