如何熟練掌握多種編程語(yǔ)言
學(xué)習(xí)一種新的編程語(yǔ)言很像學(xué)習(xí)說(shuō)一種新的自然語(yǔ)言。
但是,正如我確定我的許多雙語(yǔ)和通俗的朋友會(huì)同意的那樣,有時(shí)在兩種或多種語(yǔ)言之間切換可能會(huì)造成混淆。
例如,我的母語(yǔ)是英語(yǔ),但是我在學(xué)校里被法語(yǔ)浸入法登記。雖然這肯定能使我精通兩種語(yǔ)言,但在我用英語(yǔ)工作時(shí)確實(shí)產(chǎn)生了一些意想不到的后果。在最長(zhǎng)的時(shí)間里,我會(huì)在許多單詞上加上E或?qū)⒚涝?hào)放在一組數(shù)字的末尾(32美元而不是32美元),這都是法語(yǔ)的要求,但并不存在用英語(yǔ)。經(jīng)過(guò)時(shí)間和實(shí)踐,這些混淆最終消失了,我現(xiàn)在可以無(wú)縫地(或多或少)在兩種語(yǔ)言之間切換。
我已經(jīng)注意到這種情況再次發(fā)生,盡管這次,我正在嘗試從C#和Java的結(jié)構(gòu)化世界過(guò)渡到Python。在上大學(xué)時(shí),我所有的課程都圍繞嚴(yán)格的編程語(yǔ)言(例如C#)進(jìn)行?,F(xiàn)在,我正在嘗試向數(shù)據(jù)科學(xué)過(guò)渡,而我目前正在學(xué)習(xí)Python。對(duì)于喜歡井井有條的事物的人來(lái)說(shuō),Python是一場(chǎng)噩夢(mèng)。對(duì)我來(lái)說(shuō),嚴(yán)重缺乏分號(hào),花括號(hào)和類型變量。好像我正在學(xué)習(xí)一種新語(yǔ)言(Python),這與我的母語(yǔ)(C#)完全不同。
學(xué)習(xí)類似的編程語(yǔ)言(例如C#,Java和JavaScript)類似于學(xué)習(xí)類似的自然語(yǔ)言。例如,通過(guò)了解法語(yǔ),我很容易掌握類似的語(yǔ)言,例如意大利語(yǔ),葡萄牙語(yǔ)和西班牙語(yǔ)。但是,學(xué)習(xí)一種與我所知道的語(yǔ)義不同的編程語(yǔ)言(Python)類似于學(xué)習(xí)冰島語(yǔ)或普通話對(duì)我的法語(yǔ)背景沒(méi)有多大幫助。
但是,正如我過(guò)去發(fā)現(xiàn)的那樣,學(xué)習(xí)一種新的編程語(yǔ)言與學(xué)習(xí)一種新的自然語(yǔ)言相同。此外,能流利使用多種編程語(yǔ)言涉及一些與我能流利使用多種自然語(yǔ)言時(shí)相同的基礎(chǔ)知識(shí)和技巧。
首先學(xué)習(xí)靜態(tài)類型和語(yǔ)法特定的語(yǔ)言
幾乎每篇標(biāo)題為"我應(yīng)該首先學(xué)習(xí)哪種編程語(yǔ)言?"的文章表明Python是某人學(xué)習(xí)的理想的第一語(yǔ)言。盡管我同意Python具有簡(jiǎn)單的語(yǔ)法和靈活性,因此它是一種很好的第一語(yǔ)言,但我相信以后將不再需要學(xué)習(xí)一些編程基礎(chǔ)知識(shí)。
因此,我將提供一些違反直覺(jué)的建議:首先學(xué)習(xí)靜態(tài)類型的和語(yǔ)法特定的語(yǔ)言。
與其學(xué)習(xí)會(huì)束手無(wú)策的語(yǔ)言,并為您提供進(jìn)入編程世界的舒適途徑,不如學(xué)習(xí)一種會(huì)因分號(hào)而忘記分號(hào)或因?yàn)閿?shù)據(jù)類型不正確而拒絕工作的語(yǔ)言。錯(cuò)誤。
靜態(tài)類型的語(yǔ)言
靜態(tài)類型的語(yǔ)言(例如C#和Java)要求將數(shù)據(jù)類型分配給它們的變量。數(shù)據(jù)類型包括字符串,整數(shù)和布爾值,僅舉幾例。變量綁定到它們?cè)诔跏蓟瘯r(shí)分配的數(shù)據(jù)類型,并且不能更改,否則,在運(yùn)行之前,代碼中將引發(fā)錯(cuò)誤。
另一方面,動(dòng)態(tài)類型化的語(yǔ)言(例如Python)不需要在變量初始化時(shí)分配數(shù)據(jù)類型。將在運(yùn)行時(shí)(在程序已編譯并運(yùn)行之后)檢查變量類型,以查看類型是否正確。
通過(guò)學(xué)習(xí)如何使用靜態(tài)類型的變量,您將對(duì)將來(lái)可以建立的數(shù)據(jù)類型有基本的了解。例如,JavaScript是一種快樂(lè)的小編程語(yǔ)言,將整數(shù)和字符串加在一起沒(méi)有問(wèn)題。但是,不了解數(shù)據(jù)類型會(huì)在以后出現(xiàn)錯(cuò)誤時(shí)引起問(wèn)題。通過(guò)嚴(yán)格地學(xué)習(xí)并獲得對(duì)數(shù)據(jù)類型的深刻理解,當(dāng)您學(xué)習(xí)動(dòng)態(tài)變量語(yǔ)言時(shí),可以輕松地避免很多麻煩,因?yàn)樵撜Z(yǔ)言具有可以隨時(shí)更改數(shù)據(jù)類型的變量。此外,首先學(xué)習(xí)靜態(tài)類型的語(yǔ)言將為您的編碼過(guò)程邏輯添加一層。
特定于語(yǔ)法的語(yǔ)言
學(xué)習(xí)新的自然語(yǔ)言時(shí),首先要學(xué)習(xí)字母,然后再學(xué)習(xí)該語(yǔ)言的單詞,句子結(jié)構(gòu),標(biāo)點(diǎn)符號(hào)和語(yǔ)法。
學(xué)習(xí)編程語(yǔ)言是相似的,因?yàn)槊糠N語(yǔ)言都有必須使用的特定語(yǔ)法,代碼才能正常工作。換句話說(shuō),每種編程語(yǔ)言都有一種方式,使它喜歡構(gòu)造其句子并形成其段落。
某些語(yǔ)言(例如Java和C#)的語(yǔ)法非常具體,如果您忘記了一個(gè)分號(hào)(分號(hào)通常放在代碼行的末尾,類似于句號(hào)),則它們將無(wú)法工作。放在句子的末尾以表示其結(jié)尾)。其他語(yǔ)言(例如Python)相對(duì)沒(méi)有必須遵循的語(yǔ)法結(jié)構(gòu)。例如,與C#相比,Python相對(duì)沒(méi)有分號(hào),并且?guī)缀鯖](méi)有花括號(hào)來(lái)組織其代碼。
首先學(xué)習(xí)語(yǔ)法特定的編程語(yǔ)言將使您對(duì)編寫(xiě)代碼時(shí)需要遵循的適當(dāng)結(jié)構(gòu)有充分的了解。通過(guò)了解適當(dāng)?shù)目s進(jìn)結(jié)構(gòu),以分號(hào)結(jié)尾的代碼行的必要性以及在大括號(hào)內(nèi)編寫(xiě)函數(shù)的要求,您將能夠編寫(xiě)出以下代碼:易于理解,更有條理,易于維護(hù)和調(diào)試。此外,這將為您提供一個(gè)模板,當(dāng)您開(kāi)始嘗試使用語(yǔ)法上不那么嚴(yán)格的新語(yǔ)言時(shí),可使用該模板編寫(xiě)代碼。
從本質(zhì)上講,現(xiàn)在就學(xué)習(xí)該學(xué)科,然后再獲得回報(bào)。
能夠流利使用您的母語(yǔ)
很難說(shuō)一門(mén)世界上每一種語(yǔ)言的生活,而不是很好地講一種語(yǔ)言,不是嗎?此外,如果您只懂每種語(yǔ)言,那么您對(duì)任何人都不會(huì)有用嗎?由于您既不會(huì)掌握很大的詞匯量,也不會(huì)對(duì)任何特定語(yǔ)言有很強(qiáng)的理解力,因此您甚至無(wú)法在Google Translate中輸入內(nèi)容來(lái)嘗試與來(lái)自世界各地的人進(jìn)行交流??赡苁悄銈儍蓚€(gè)最終都會(huì)非常困惑!
我認(rèn)為,編程語(yǔ)言也是如此。與其嘗試學(xué)習(xí)幾種不同的語(yǔ)言,而又不熟練地理解其中的任何一種,不如精通您的母語(yǔ)或所選語(yǔ)言。
我并不是建議您必須精通一種編程語(yǔ)言,然后再學(xué)習(xí)另一種。但是,在嘗試學(xué)習(xí)一種新語(yǔ)言之前,您應(yīng)該對(duì)一種語(yǔ)言的編程概念有深刻的了解。
為什么?好吧,當(dāng)您學(xué)習(xí)一種語(yǔ)言的代碼基礎(chǔ)時(shí),可以假定另一種語(yǔ)言的基礎(chǔ)基本相同。例如,if / else語(yǔ)句在您遇到的每種編程語(yǔ)言中都執(zhí)行相同的功能,但是唯一的區(qū)別在于您用于傳達(dá)它們的語(yǔ)法。例如,C#中的if / else語(yǔ)句要求使用大括號(hào)來(lái)組織語(yǔ)句,而Python中的if / else語(yǔ)句沒(méi)有大括號(hào),而是使用單個(gè)冒號(hào)和代碼縮進(jìn)來(lái)分隔每個(gè)語(yǔ)句。從根本上講,該語(yǔ)句在兩種語(yǔ)言中的工作方式相同。
就像您學(xué)會(huì)用母語(yǔ)說(shuō)"你好"和"再見(jiàn)"一樣。一旦理解了這些詞的含義以及如何使用它們,就可以學(xué)習(xí)如何用多種不同的語(yǔ)言說(shuō)"你好"和"再見(jiàn)"。這些單詞在不同的語(yǔ)言中將具有相同的含義,唯一的區(qū)別是您使用不同的語(yǔ)法編寫(xiě)它們并按照不同的約定使用它們。
通過(guò)了解您的第一種編程語(yǔ)言是偏愛(ài)單個(gè)類還是多個(gè)類,具有特定的變量命名約定,或者是否需要面向?qū)ο蟮慕Y(jié)構(gòu),您將逐漸掌握第一語(yǔ)言和后續(xù)語(yǔ)言。。精通一種語(yǔ)言后,隨著您對(duì)編程語(yǔ)言之間的差異有了更深入的了解,您將能夠更快地了解其他語(yǔ)言的細(xì)微差別。
不要用重音編碼
說(shuō)自然語(yǔ)言時(shí),如果有人說(shuō)的很重,您就可以理解。例如,即使我說(shuō)法語(yǔ)很重,我也被母語(yǔ)為法語(yǔ)的人所理解。因?yàn)槲沂褂玫氖欠ㄕZ(yǔ)約定,所以即使我使用了回旋的句子結(jié)構(gòu)或錯(cuò)誤地讀了一個(gè)單詞,他們也理解了我想要傳達(dá)的內(nèi)容。
為了能流利使用一種新的編程語(yǔ)言,您不能像使用已經(jīng)知道的語(yǔ)言一樣對(duì)其進(jìn)行編碼。如果您這樣做,則可能是該語(yǔ)言不一定會(huì)理解您要執(zhí)行的操作,或者它會(huì)以非常低效的方式來(lái)執(zhí)行您要執(zhí)行的操作。
在我使用Angular作為系統(tǒng)前端時(shí),我在大學(xué)的頂峰項(xiàng)目期間陷入了這個(gè)陷阱。我當(dāng)時(shí)非常了解JavaScript,并且知道Angular與JavaScript相似,所以我嘗試使用與JavaScript相似的約定在Angular中進(jìn)行編碼。對(duì)我來(lái)說(shuō)不幸的是,嘗試使用重音符號(hào)無(wú)法產(chǎn)生良好的代碼,這可能是由于不了解Angular的約定。我的代碼全部用Angular編寫(xiě),但是用沉重的JavaScript口音講話。
換句話說(shuō),請(qǐng)不要重復(fù)我的錯(cuò)誤-按照原意使用新語(yǔ)言,并且不要帶有重音符號(hào)。
通過(guò)使自己沉迷于新語(yǔ)言并強(qiáng)迫自己理解其所有獨(dú)特約定,您將學(xué)習(xí)如何以預(yù)期的方式使用該語(yǔ)言進(jìn)行編碼,而無(wú)需將其用作已經(jīng)知道的語(yǔ)言。這將使您能夠流利地使用多種語(yǔ)言,而不會(huì)用濃重的口音講所有這些語(yǔ)言。
例如,如果英語(yǔ)是您的母語(yǔ),但是您決定快速學(xué)習(xí)其他五種新語(yǔ)言,那么您最終可能會(huì)說(shuō)俄語(yǔ),意大利語(yǔ),斯瓦希里語(yǔ),意第緒語(yǔ)和阿拉伯語(yǔ),而且所有這些都帶有強(qiáng)烈的英語(yǔ)口音并使用英語(yǔ)約定。如果您選擇學(xué)習(xí)俄語(yǔ)的慣例,那么俄語(yǔ)母語(yǔ)的人就會(huì)明白您的意思。其他語(yǔ)言也是如此。如果您嘗試使用典型的英語(yǔ)句子結(jié)構(gòu)說(shuō)斯瓦希里語(yǔ),那么肯尼亞的某個(gè)人可能不會(huì)理解您。
花些時(shí)間閱讀編程語(yǔ)言提供的文檔,并對(duì)該語(yǔ)言的特定約定有所了解。這不僅會(huì)使您更加流利的語(yǔ)言,而且在與理解該語(yǔ)言并希望您能夠遵守其約定的其他人一起進(jìn)行團(tuán)隊(duì)項(xiàng)目時(shí),也將使您變得更有價(jià)值。
您最初可能不得不強(qiáng)迫自己編碼時(shí)沒(méi)有任何口音,但是當(dāng)您可以輕松地從一種語(yǔ)言切換到另一種語(yǔ)言時(shí),辛勤的工作將獲得回報(bào)。
最后的想法
本文概述了成為多語(yǔ)言編程語(yǔ)言時(shí)遇到的一些更獨(dú)特的想法,使之成為多語(yǔ)言編程語(yǔ)言。這些提示都對(duì)我有很大的幫助,但是如果我不提及其中一些更常規(guī)的提示,那將不會(huì)是一本非常有用的文章:
- 閱讀語(yǔ)言文檔,閱讀源代碼,使用自己的新語(yǔ)言用"單詞"復(fù)制代碼示例,為新語(yǔ)言編寫(xiě)備忘單等,從而完全沉迷于該語(yǔ)言。
- 繼續(xù)使用各種語(yǔ)言(例如Youtube,Medium和StackOverflow)使用新語(yǔ)言編寫(xiě)編碼教程。學(xué)習(xí)新的編程語(yǔ)言時(shí),您需要樂(lè)于助人。換句話說(shuō),積極學(xué)習(xí)將成為您的朋友。
- 使用您正在學(xué)習(xí)的新語(yǔ)言重新創(chuàng)建您已經(jīng)完成的項(xiàng)目(甚至是簡(jiǎn)單的項(xiàng)目),并盡力使用新語(yǔ)言。
- 參加要求您使用新語(yǔ)言的黑客馬拉松,Kaggle競(jìng)賽和編碼挑戰(zhàn)。
- 與非常了解該語(yǔ)言的人合作。與那些精通我要學(xué)習(xí)的語(yǔ)言的人一起,我從配對(duì)編程中學(xué)到了很多東西。在他們編寫(xiě)特定代碼的過(guò)程中聽(tīng)到他們的思考過(guò)程,使他們對(duì)語(yǔ)言的工作原理以及為什么他們以特定方式編碼解決方案有了很多了解。
我能提供的最佳建議是堅(jiān)持不懈。學(xué)習(xí)新語(yǔ)言很困難,編程語(yǔ)言也不例外。如果需要一點(diǎn)努力學(xué)習(xí),請(qǐng)不要放棄該語(yǔ)言。幸運(yùn)的是,互聯(lián)網(wǎng)上的多種資源可以幫助使學(xué)習(xí)過(guò)程更輕松,更直觀。
最重要的是,在學(xué)習(xí)新語(yǔ)言時(shí),請(qǐng)不要忘記應(yīng)用可用的建議和工具。從長(zhǎng)遠(yuǎn)來(lái)看,您不僅會(huì)更好地理解語(yǔ)言,而且還將成為更好的開(kāi)發(fā)人員或數(shù)據(jù)科學(xué)。
原文鏈接:
https://towardsdatascience.com/how-to-become-fluent-in-multiple-programming-languages-9f473c146b90