許多正在學(xué)習(xí)編程的學(xué)生感到困惑孵滞。他們學(xué)習(xí)了許多語言,如c鸯匹、python和java坊饶。他們覺得他們可以用這門語言一段時(shí)間,也可以用另一門語言一段時(shí)間殴蓬,但他們并不精通這門語言匿级。我們?nèi)绾尉毩?xí)一門編程語言才能熟練?
一般來說,當(dāng)你接觸到一種語言的編譯器/虛擬機(jī)/IDE(你可以以各種形式接觸它——例如痘绎,編寫模板haskell將接觸haskell的AST津函,所以我認(rèn)為這是可以的),你將被迫理解該語言代碼的內(nèi)部表示(AST的定義)孤页,以便實(shí)現(xiàn)你能用這種編程語言寫的所有可能的代碼(你現(xiàn)在都知道了所有的語言結(jié)構(gòu)尔苦,它們的所有組合都是可能的代碼),你就精通編程語言了散庶。您將認(rèn)識(shí)到@override只是一個(gè)注釋,printf的第一個(gè)參數(shù)只是一個(gè)普通字符串凌净,std::cout只是一個(gè)支持左移位運(yùn)算符的全局對(duì)象悲龟。
其次,當(dāng)你用這種語言寫很多代碼時(shí)冰寻,你會(huì)知道它的整個(gè)生態(tài)须教,未來的發(fā)展趨勢(shì),競(jìng)爭(zhēng)對(duì)手的發(fā)展斩芭,初學(xué)者可能會(huì)犯的錯(cuò)誤轻腺,各種平臺(tái)上的各種漏洞,以及如何用這種語言做其他語言能做的事情划乖,然后你將在“軟件工程”的層次上精通這門語言贬养。同時(shí),如果我在這兩個(gè)方面精通一門語言琴庵,我想我可以說我問心無愧地精通這門語言误算。
工作經(jīng)驗(yàn)少的人很容易陷入語言的迷戀中,判斷自己的熟練程度迷殿。事實(shí)上儿礼,在工作了幾年之后,你會(huì)發(fā)現(xiàn)語言其實(shí)只是一個(gè)非城焖拢基本的東西蚊夫。
歸根結(jié)底,就是解決問題懦尝。一個(gè)能力強(qiáng)的人必須有解決問題的能力知纷。更不用說沒有必要用程序來解決問題。即使在編寫程序時(shí)陵霉,人們通常也很難區(qū)分人屈扎。它往往不是對(duì)語言的掌握,而是對(duì)領(lǐng)域知識(shí)的抽象能力撩匕、對(duì)框架的熟悉程度鹰晨、對(duì)網(wǎng)絡(luò)的了解程度、對(duì)操作系統(tǒng)的了解程度等。
例如模蜡,每個(gè)人都可以編寫一段代碼從數(shù)據(jù)庫中讀取數(shù)據(jù)漠趁,但大多數(shù)人無法解決數(shù)據(jù)讀取速度慢的問題,這通常與您使用的編程語言無關(guān)忍疾。
當(dāng)然闯传,我希望有更有效的方法來掌握編程語言。
1卤妒、看看官方文件甥绿。以python為例,官方文檔寫得非常好则披,包括設(shè)計(jì)思想共缕、各種模塊、編程規(guī)范等士复,這是學(xué)習(xí)一門語言图谷,甚至任何技術(shù)最直接、最有效的方法阱洪。
2便贵、邊學(xué)邊練。主流語言可以用來解決一些常見的問題冗荸。比如文件的讀寫承璃、網(wǎng)絡(luò)請(qǐng)求、數(shù)據(jù)庫操作蚌本、常用的排序算法等绸硕,這些最常見、最常用的需求的實(shí)現(xiàn)可以很快實(shí)現(xiàn)基本的掌握魂毁。
3玻佩、對(duì)比學(xué)習(xí)。每種語言都有自己的特點(diǎn)席楚,也有自己的優(yōu)缺點(diǎn)咬崔。與思考相比,我們可以更透徹地理解烦秩。例如垮斯,當(dāng)你學(xué)習(xí)一些歌朗,你知道內(nèi)置的編曲只祠。其他語言兜蠕,如python,可以做些什么來達(dá)到編排的效果抛寝?
4熊杨、解決實(shí)際問題曙旭。除了以上練習(xí)手的問題外,更能有效地解決工作中的實(shí)際問題晶府。畢竟桂躏,這是學(xué)習(xí)一門語言的目的。在這個(gè)過程中遇到的困難會(huì)迫使你深入研究語言的某些部分川陆。顯然剂习,這些部分是你現(xiàn)在需要關(guān)注的。知道重點(diǎn)较沪,有針對(duì)性地學(xué)習(xí)鳞绕,效率自然高。