如何成為多編程語言人才?這有一份獨門訣竅
本文轉載自公眾號“讀芯術”(ID:AI_Discovery)
學習一種新的編程語言就像學一門新的語言。相信許多學習兩門或多門語言的朋友都會認同,在雙語或多語言間轉換難免令人混淆。
例如,我的母語是英語,在學校里參加了沉浸式法語課程。這一方面使我的英法雙語都達到了十分流利的水平,一方面也對我英語的使用造成了意想不到的效果。
很長一段時間中,我都會在許多單詞末尾加上“E”,或是在數字后面加上美元符號(32$而不是$32),這些要求都只存在于法語當中,而非英語。經過一段時間的練習,我終于不再混淆,現在能夠英法雙語無縫切換了。
然而,這種情況又一次發生了——我試圖從C#和Java 轉換到Python。大學時,我所有的課程都圍繞著C#這樣嚴謹的編程語言展開。如今我準備進軍數據科學,現在正在學習Python。
對于喜歡有條理有組織的事物的人來說,Python簡直是一個噩夢。對我而言,分號、花括號和類型變量嚴重不足,就好像我正在學習一門新語言,而它與我的母語(C#)截然不同。
學習相似的編程語言(比如C#,Java和JavaScript)就像學習幾種相似的語言。比如,因為我會法語,所以學習意大利語、葡萄牙語、西班牙語這些相似的語言也會比較容易。但我目前所掌握的語言卻無助于學習編程語言(Python),因為它們在語義上完全不同,就像我會法語也無助于我學習冰島語或普通話。
要想熟練掌握多種編程語言,你需要用到一些掌握多種自然語言時的基本知識和技巧。
首先學習靜態類型和句法特定的語言。
幾乎每篇標題為“我應該先學習哪種編程語言?”的文章都認為Python是最適合初學者的編程語言。我同意Python句法簡單,結構靈活,適合入門,但卻無法學到一些后期必要的編程基礎知識。因此,我要提的建議似乎聽起來很不合理:首先學習靜態類型和句法特定的語言。
與其學習溫和的入門級編程語言,不如學容錯率極低的編程語言,一旦漏掉分號就會立馬出錯,一旦數據類型錯誤就會停止運行。
-
靜態類型的語言
靜態類型的語言(例如C#和Java)需要將數據類型分配給它們的變量。數據類型包括字符串、整數和布爾值等等。變量在初始化時必須與所分配的數據類型綁定,并且不能更改,否則運行前代碼將會出錯。
動態類型化的語言(例如Python)則無需在變量初始化時分配數據類型,而是在程序編譯并運行后,再檢查變量類型是否正確。
通過學習靜態類型變量,學習者將對以后需要使用的數據類型有一個基本的了解。例如,JavaScript是一種簡單易懂的編程語言,能輕松結合整數和字符串。
但如果不了解數據類型,就可能在程序出錯時遇到問題。通過嚴格的學習和對數據類型的深入了解,就能在學習帶變量的動態類型語言時省去不少麻煩,從而即時更改數據類型。此外,先學靜態類型的語言有助于增強編碼過程的邏輯性。
-
語法特定的語言
學習新的自然語言時,首先要學習字母,然后學習單詞、句子結構、標點符號和語法。學習編程語言的過程也是類似的,因為每種語言都有特定的語法,必須使用它才能讓代碼正常工作。換句話說,每種編程語言都有特別的遣詞造句、形成段落的方式。
有些語言(例如Java和C#)的語法非常具體,哪怕只少了一個分號(通常位于代碼行末尾,類似于句子末尾的句號,放在句子的末尾以表示句子結束),都會導致無法運行。而有些語言(例如Python)則幾乎沒有硬性的語法規則。例如,與C#相比,Python中需要用到的分號和花括號都相對較少。
先學語法特定的編程語言有助于充分了解寫代碼時需要用到的結構,比如縮進結構、代碼行必須以分號結尾、函數要加花括號等。這能使寫出的代碼更簡單易懂,條理清晰,方便維護調試。而且,其還可以提供一個寫代碼的模板,方便在學習其他語法不那么嚴謹的編程語言時使用。
總之,先掌握嚴格的規則,將來定會收獲回報。
熟練掌握第一語言
如果世界上每種語言都懂一點,卻沒有一種能說得流利,那你將會很難生存。既沒有龐大的詞匯量,也無法理解別人的話,甚至無法使用谷歌翻譯與來自異國的人交流,最后只會使雙方困惑不已。
編程語言也是如此。與其蜻蜓點水地學習很多種語言,卻全都淺嘗輒止,不如熟練掌握初學的那門語言,或是專攻一門。這并不是說任何人都必須先精通一種編程語言,然后才能開始學習另一種。但在嘗試學習新語言之前,要對先一種語言的編程概念有深刻的了解。
為什么呢?學習一種語言的代碼基礎時,可以假設另一種語言大致相同。例如,每種編程語言中的if/else的作用都相同,唯一的不同就在于怎么表示它。例如,C#中的if / else必須位于花括號中,而Python中的if / else沒有花括號,而是用冒號和縮進來分隔。但根本上說,if / else的句式在兩種語言中的作用相同。
就像用母語說“你好”和“再見”一樣。一旦理解了含義,明白了如何使用,就可以學會用多種不同的語言說“你好”和“再見”。這幾個詞在不同的語言中代表相同的含義,唯一的區別就是寫法不同。
通過了解編程語言是單級還是多級、有無特定的變量命名法,或是否要求目標導向型結構,學習者可以更加熟練地掌握第一語言以及后來學習的其他語言。精通一種語言后,就能夠越來越快地了解語言之間的細微差別。
編碼不要帶“口音”
用自然語言交流時,即使別人口音很重,通常我們也能理解。例如,雖然我說法語口音很重,但法國人也能聽懂。這是因為我遵循了法語的慣例,所以即使句子結構彎彎繞繞或單詞念錯,他們也能理解我想要傳達的內容。
要掌握一門新的編程語言,不能把它當作一門“已經會了的語言”來進行編碼,否則很可能事與愿違,或者效率極低。
我就曾掉進過這樣的陷阱。大學時我最出色的項目以Angular作為系統前端,我當時很熟悉JavaScript,我知道Angular與JavaScript相似,于是嘗試套用JavaScript的方法,用Angular編碼。
糟糕的是,這種“帶口音”的編碼成果欠佳,這可能是不了解Angular的規則所致。我的代碼全部用Angular編寫,但卻帶著濃重的JavaScript“口音”。不要和我犯一樣的錯——遵循新語言的規則,不要帶“口音”編碼。
只有使自己沉浸在新語言的環境中,強迫自己理解所有特殊規則,才能正確使用新語言進行編碼。這樣就能在掌握多種語言的同時不帶“口音”。
例如,如果一個英語母語者決定速成五種新語言,最終他也許能說俄語、意大利語、斯瓦希里語、意第緒語和阿拉伯語,但出口都帶著濃厚的英語口音和習慣。相反,如果去學習俄語講話的習慣,那么俄語母語者就能聽懂。其他語言也是如此。如果用典型的英語句式說斯瓦希里語,那肯尼亞人可能會聽不懂。
花些時間閱讀編程語言的文獻,去感受某種語言的習慣。這不僅有助于掌握這門語言,也使你在團隊項目中更有價值,讓其他也會這門語言的人對你抱有期待。
最初你可能不得不強迫自己不帶“口音”地編碼,但當你能流暢切換兩種語言之時,就是努力得到回報之日。
本文概述了我在學習多種編程語言過程中的一些竅門。這些小訣竅對我幫助很大,但為了盡善盡美,這里也要提出幾個更常規的方法:
- 閱讀相關語言的文獻、閱讀源代碼、把用來做例子的代碼用新語言寫出來、列一份有關新語言的備忘錄,通過這些方法讓自己完全沉浸在所學語言的環境中。
- 利用各種資源(例如Youtube、Medium和StackOverflow)學習編碼語言的教程。要更勇于嘗試,換句話說,學習新的編程語言需要主動學習。
- 用所學語言把以前做過的項目再做一次(哪怕是特別簡單的項目),并盡可能發揮它的用處。
- 參加黑客馬拉松、卡格爾比賽等需要用到所學語言的編程比賽。
- 和熟知這門語言的人合作。我總是在搭檔編程項目中受益匪淺。傾聽他們在寫代碼時的思考過程,為了解編程語言的運作方式和原理提供許多啟發。
我能給出的最好的建議是持之以恒。學習一門新的語言很難,編程語言也不例外。不要因為有點難學就放棄這門語言。所幸網上有很多資源可供使用,能讓學習過程更輕松自然一些。
最重要的是,學習新語言時要盡可能利用手邊的設備和工具。長此以往,不僅能幫助你更好地理解這門語言,也能讓你成為更好的開發人員或數據科學家。