【編者按】本文作者為 Chris Ward,主要分享了 Chris 在多年的編程教學(xué)中,積累下的一些經(jīng)驗(yàn)教訓(xùn),以及在他眼中,新手學(xué)習(xí)語言時(shí)的注意事項(xiàng)。文章系國內(nèi) ITOM 管理平臺(tái) OneAPM 編譯呈現(xiàn)。
和許多我這個(gè)歲數(shù)的人一樣,我學(xué)編程是從BASIC語言開始的。那時(shí)候,你會(huì)買很多雜志回家,雜志上有整篇整篇的代碼,教你編游戲,或者是一些基礎(chǔ)的應(yīng)用程序–你和朋友們花了好幾個(gè)小時(shí)勤勤懇懇地把那些都敲進(jìn)電腦里,結(jié)果卻發(fā)現(xiàn)這兒或那兒有一個(gè)印刷錯(cuò)誤,反正游戲就是運(yùn)行不了。于是你們只好作罷。其實(shí)這件事最大的意義就是能和朋友一起玩兒,而爸媽還覺得你是在學(xué)習(xí)呢。
BASIC語言是有缺陷,但我喜歡它雖然羅嗦,卻很清晰。這也是為什么用它來實(shí)現(xiàn)任何功能,都得花上很長的篇幅。 現(xiàn)在發(fā)布的這些語言幾乎都沒有這么“棒”的語法了(包括強(qiáng)制必須給出行數(shù))。
5 LET S = 0
10 MAT INPUT V
20 LET N = NUM
30 IF N = 0 THEN 99
40 FOR I = 1 TO N
45 LET S = S + V(I)
50 NEXT I
60 PRINT S/N
70 GO TO 5
99 END
(感謝Wikipedia)
但你得承認(rèn),作為一個(gè)新手,你完全可以理解上面的代碼在做什么。
數(shù)年以后,我通過學(xué)習(xí)一系列的語言,掌握了“現(xiàn)代的”編程方法,包括PHP、Lingo、C++、Visual Basic、以及Java。我肯定學(xué)習(xí)了面向?qū)ο缶幊陶Z言,但多數(shù)時(shí)候我覺得它們還是面向過程的。有很多年,我一直在用Drupal,但這一點(diǎn)也沒用,Drupal直到版本8開始才有真正的OOP(面向?qū)ο螅└拍睢?/p>
時(shí)光快進(jìn)到現(xiàn)在,也是我為什么寫這篇文章的部分原因。在過去的幾個(gè)月里,我都一直在教柏林的敘利亞難民們編程,我們選擇的語言是Ruby(以及Rails)。
是否適合教新手學(xué)Ruby?
暫且不說近年來,越來越多的程序員棄Ruby而去(這是另一碼事)。我們(老師們)也不確定是否應(yīng)該選Ruby。整個(gè)Ruby社群的人都非常贊成和歡迎別人的加入。因?yàn)樗麄兊闹С?,加上自身的?jiān)持不懈,也有不少人真的學(xué)成了。
然而,我們注意到Ruby能夠吸引經(jīng)驗(yàn)豐富的程序員的地方,對(duì)新手來說恰恰是令人迷惑和困擾的。我寫這篇文章的本意并不是把它做成一篇“Ruby抨擊論”。我喜歡Ruby,它的這些問題在其他的語言中也存在。不過最近教新手的經(jīng)驗(yàn),剛好給了我實(shí)際的例子來說明我的觀點(diǎn)。我也承認(rèn),這當(dāng)中有一些問題可能是因?yàn)槲医淌诘捻樞蛴姓`,或者忘了給他們講解那些有經(jīng)驗(yàn)的程序員們做過的一些任務(wù),至少當(dāng)時(shí)忘了講。
快捷工具
程序員都有點(diǎn)懶 – 或者更準(zhǔn)確地說,我們希望可以不要重復(fù)地一直敲同樣的樣板代碼,而是把注意力放在項(xiàng)目中重要且獨(dú)特的地方。Rails的腳手架剛(scaffold)好可以實(shí)現(xiàn)這一點(diǎn),通過少量的命令,你就可以搭建好一個(gè)MVC應(yīng)用程序的基礎(chǔ)。
但是對(duì)于新手來說,這些工具卻并不好懂。新手們無法理解剛剛被創(chuàng)建的東西是什么,為什么要?jiǎng)?chuàng)建這些,這些東西應(yīng)該放在哪里,怎么放?
快捷語法
對(duì)一個(gè)有經(jīng)驗(yàn)的程序員來說,寫這段代碼
(0..100).each {
print i
}
比寫這段
var i;
for (i=0;i<100;i++)>100;i++)>
print i;
}
當(dāng)然更快捷、更有意義。事實(shí)上,這的確更有效率:不需要初始化一個(gè)變量,或是寫這種全用分號(hào)隔開的恐怖語法。但是從新手的角度來思考呢?以Ruby為例,新手可以理解的為數(shù)不多的詞只有each
和print
。其他的有什么用?我并不是說,初學(xué)者就無法掌握這些概念,只是說在某種程度上,第二段代碼實(shí)際上更加清晰,更容易讓學(xué)生理解究竟發(fā)生了什么。
“隨心所欲”的語言
一度曾有這樣一種趨勢:程序員們可以隨心所欲寫語言–而不用考慮變量類型等等。這種趨勢的名氣現(xiàn)在已經(jīng)大不如前了–至少可以說,越來越多的更加嚴(yán)謹(jǐn)?shù)恼Z言出現(xiàn)了。它們的速度和效率的確更高一籌,但我在想這是不是也是風(fēng)頭轉(zhuǎn)變的又一佐證。需要你遵循一定步驟的語言,可能會(huì)花費(fèi)你更多的學(xué)習(xí)時(shí)間,但能做什么不能做什么往往要明確的多。
投入實(shí)際的工作
通常,我們?cè)敢庾寣W(xué)生接受一些最有用最“貼近實(shí)際”的概念,并且能盡早地開始實(shí)踐。當(dāng)下的許多“編碼學(xué)習(xí)”程序都聚焦于讓參與者“可以開始工作”。我可以另寫一篇文章,闡述一下這些程序中的問題(我應(yīng)該會(huì)去寫的),但總的來說,這些程序有可能讓學(xué)生過早地接觸到一些概念。下面是我根據(jù)最近的經(jīng)驗(yàn),舉出的一些明顯的例子。
面向?qū)ο缶幊蹋∣OP)
OOP是許多現(xiàn)代編程語言的基礎(chǔ)概念。但這個(gè)概念通常在剛介紹完基礎(chǔ)知識(shí),如變量、邏輯和循環(huán)之后,就被直接扔給學(xué)生了。學(xué)生還沒完全理解程序究竟是怎樣的呢,就遇到了一堆難題。
OOP的概念在高級(jí)應(yīng)用程序中更有用。而當(dāng)我們編寫基本的程序時(shí),基本無需用到OOP,它只會(huì)增加不必要的麻煩。通過對(duì)比,老師們可以給出一些術(shù)語和例子–如動(dòng)物和車輛–但是基本沒有實(shí)際的必要與用途。
版本控制
版本控制也差不多。如果你是一個(gè)團(tuán)隊(duì)的成員,在一個(gè)大項(xiàng)目中工作,總有常規(guī)改動(dòng)的話,那么版本控制是非常有用的。但如果你是一個(gè)人工作,或者是在一個(gè)小團(tuán)隊(duì)中工作的話,版本控制的概念就過于復(fù)雜了。Git是個(gè)非常棒的工具,但是它的工作流程卻很糟糕–漏做一步會(huì)搞亂所有的東西,同時(shí)剛開始的那么多次merge也是讓人非常頭暈的。
好吧 Chris,那么你覺得我們應(yīng)該怎么做呢?
問得好。批評(píng)起來總是很容易的。而且誰說我就是對(duì)的呢?首先,我想告訴大家一兩個(gè)我在教學(xué)過程中發(fā)現(xiàn)的有用的小竅門,然后我想聽聽大家關(guān)于新手入門語言的反饋建議,及理由。
不做任何假設(shè)
我知道這話你已經(jīng)聽過很多遍了。但我希望你可以試著再深入地了解一下。先來看看這個(gè)片段摘要:
如果你不做任何假設(shè),那么你也不會(huì)失去任何東西。
好吧,可能有時(shí)候還是會(huì)有所失去,但是并不多。在實(shí)際操作中,這意味著,你不應(yīng)當(dāng)假設(shè)有人聽說過你最喜歡的那個(gè)構(gòu)建系統(tǒng)/語言/IDE/編輯器,或者假設(shè)任何人有著與你相同的經(jīng)驗(yàn)。即使你認(rèn)為他們有,也不代表他們真的有。當(dāng)然,如果你想先問問的話,那么就去問問–但是記得要再確認(rèn)一下。
在必要的情況下,人們通常愿意接受重復(fù)。如果有些東西他們已經(jīng)理解了,但是還得再聽一遍解釋,他們多半不太介意,也許在聽的過程中還能了解一些新的點(diǎn)呢。
背景
這對(duì)我來說是個(gè)重要的話題。程序員往往很擅長告訴你一個(gè)東西很炫酷,但是并不擅長闡述為什么。當(dāng)你在教學(xué)時(shí),不要只告訴學(xué)生們這個(gè)東西更快、更好、更大,還要同時(shí)解釋為什么這個(gè)東西對(duì)他們或者對(duì)你來說是個(gè)好選擇。學(xué)生們會(huì)比之前聽的更好,學(xué)的更好,記的更牢。
社群
盡管聽起來可能很矛盾,但是有一些語言(特別是Ruby和Python)有著非常強(qiáng)大的、試圖培養(yǎng)新手的社群。這些社群或者并不能真的讓語言變得更容易理解,但是堅(jiān)持的人往往會(huì)發(fā)現(xiàn)社群可以幫助他們輕松地?cái)U(kuò)展知識(shí)量。最重要的是,社群越支持,就越能減少新手可能遭受的負(fù)面影響。
最適合學(xué)習(xí)的編程語言
這是你看本文的目的,我親愛的讀者!我希望你能告訴我,你認(rèn)為什么才是最容易學(xué)習(xí)和理解的語言呢?同時(shí),也請(qǐng)告訴我你為什么這樣想。如果你曾有過相關(guān)的教學(xué)經(jīng)驗(yàn)的話,都有哪些發(fā)現(xiàn)呢?
幾周后,我會(huì)收集相關(guān)的故事,寫一篇后續(xù)文章。文中我會(huì)(在新手的幫助下)平實(shí)地闡述這些語言真正的易用性,以及最佳的教授方法。
我知道你對(duì)于我的這篇文章一定也有一些意見,這很好。請(qǐng)和我們分享你的觀點(diǎn)吧!請(qǐng)盡量提一些有建設(shè)性的意見,并盡量從新手的角度出發(fā)。謝謝!
本文系 OneAPM 工程師整理呈現(xiàn)。OneAPM 能為您提供端到端的應(yīng)用性能解決方案,我們支持所有常見的框架及應(yīng)用服務(wù)器,助您快速發(fā)現(xiàn)系統(tǒng)瓶頸,定位異常根本原因。分鐘級(jí)部署,即刻體驗(yàn),性能監(jiān)控從來沒有如此簡單。想閱讀更多技術(shù)文章,請(qǐng)?jiān)L問 OneAPM 官方技術(shù)博客。
聯(lián)系客服