程序人生:初學編程必須建造 5 大“支柱”,20年經(jīng)驗大??偨Y(jié)!
隨著眾多傳統(tǒng)工作面臨失業(yè)風險,編程成為21世紀必備的技能。網(wǎng)上有許多編程的資料,也有各種各樣的培訓班,但是很多都沒有抓住編程的重點方面,其教菜鳥的辦法很糟糕。為此,有20多年編程經(jīng)驗的Rainer Hahnekamp?總結(jié)?了新手學習編程的5大支柱,希望初學者能夠從中掌握到學習的方法。

我編程都已經(jīng)超過20年了。在這段時間內(nèi),很高興能跟很多人一起工作,我從他們身上學到了很多。同時我也接觸了很多的學生,他們都是剛剛大學畢業(yè)的新人,這時候我就得擔負起老師或者導師的角色。
最近,我作為培訓師參與到一項教完全的初學者學編程的計劃當中。
學習如何編程是很難的。我經(jīng)常發(fā)現(xiàn)大學課程和新手訓練營沒有抓住編程的重點方面,其教菜鳥的辦法很糟糕。
為此,我愿將我所認為的一門成功的編程課程必備的5大支柱分享給大家。一如以往地,我會將介紹放在主流web應用的背景下。
菜鳥的目標是掌握編程的基礎并且理解庫和框架的重要性。
像云、一般運營或者開發(fā)工具這樣的高級主題不應該成為課程的一部分。說到設計模式我也持懷疑態(tài)度。這需要的經(jīng)驗是初學者所不具備的。
那么我們就來看看程序員新手應該從何開始。

測試驅(qū)動開發(fā)(TDD)
TDD帶來了很多好處。不幸的是,這是一個高級主題,初學者恐怕還沒有完全準備好。
初學者不應該寫測試。對于他們的基礎技能水平來說這要求太高了。相反,他們應該學習如何使用測試以及配合測試。
每一門編程課程都應該以練習為核心。我把練習拓展到單元測試,給學生一個已經(jīng)為運行那些測試做好設置的環(huán)境。
學生需要做的就只是寫他們的代碼然后看著testrunner的燈從紅色變成綠色。結(jié)果的游戲化是一個很好的副效應。
比方說:如果選定技術是Spring,我在一個Spring項目內(nèi)會提供練習和測試。學生不需要知道Spring的任何事情。他們所需要做的就是知道練習和觸發(fā)測試的按鈕在什么位置。
此外,學生必須知道如何使用調(diào)試器并且要有一個讀取﹣求值﹣輸出循環(huán)(REPL)環(huán)境。在運行時分析代碼的能力以及有一個進行小型實驗的場地對于TDD要說是必不可少的。
要點是要確保學生在習得核心變成技能之后不需要學習基本的TDD行為。在學生職業(yè)生涯后期改變習慣要比現(xiàn)在學習這些習慣困難得多。這就是為什么他們應該從一開始就感受單元測試的原因。
在其以后的職業(yè)生涯里,他們應該會對沒有進行單元測試的項目感到厭惡。他們應該本能的將缺少單元測試視為反模式。

基礎優(yōu)先
我經(jīng)常聽說菜鳥應該馬上從框架開始學習。這就好比把人放到賽車上讓對方避免轉(zhuǎn)向過度一樣教人如何開車。這根本是忽視了他們?nèi)匀粫褎x車誤認成油門的事實。
一開始讓學生學Angular這樣的框架也是同理。初學者首先需要理解編程的基礎。在使用別人的代碼之前,的他們需要熟悉基本要素以及寫代碼意味著什么。
函數(shù)、變量、條件、循環(huán)這些改變對于新手來說完全就是陌生的。這四個要素構成了編程的基礎。程序構成的一切都要靠它們。
學生都是第一次聽說這些概念,但是他們最終精通這些概念是極其重要的。如果學生沒掌握這些基礎,后續(xù)的一切看起來就像是魔術一樣,會導致迷惑和沮喪。
教師應該在這些基礎上花更多的時間。不過,悲哀的是,很多人向前推進得太快了。問題在于很多教師沒能從學生的角度去考慮問題。他們編程有些年頭了,已經(jīng)忘了初學者必須應對的問題類型是什么了。這相當類似于專業(yè)賽車手。賽車手是無法想象某人剎車前還要想一下的。他的動作都是自動的。
我設計練習會利用這四種要素的結(jié)合,一方面要具有挑戰(zhàn)性,同時在合理的時間范圍內(nèi)又是可以解決的。
一個很好的例子是羅馬與阿拉伯數(shù)字的轉(zhuǎn)換。這個挑戰(zhàn)需要學生有耐心。一旦他們成功應用了4個要素解決了這個問題,其積極性就會得到很大的促進。
基礎很重要。在學會基礎之前不要貿(mào)然前進。

庫和框架
在學生花費了大量時間去編程后,他們必須知道大多數(shù)代碼已經(jīng)以庫或者框架的形式存在了。這與其說是一種模式不如說是一種理念。
就像我之前寫過那樣:現(xiàn)代開發(fā)者了解并選擇合適的庫。他們不會浪費時間自己去寫一個充滿bug的版本。
要想讓這種理念轉(zhuǎn)變成功,“基礎階段”的例子應該用Moment.js、Jackson、Lodash或者Apache Commons等知名的庫來解決。
這樣一來,學生馬上就能理解庫的價值了。之前他們曾經(jīng)絞盡腦汁去解決這些復雜問題?,F(xiàn)在他們發(fā)現(xiàn)庫一下子就把那些練習給搞定了。
跟TDD類似,學生應該對同時吹噓自己編寫的狀態(tài)管理庫秒殺Redux保持懷疑態(tài)度。
說到框架,一旦理解了庫的用處之后學生理解其重要性就會毫無問題。
取決于課程的時間長短,專門開辟時間將框架也許會比較困難。但是正如我已經(jīng)指出那樣,最重要的方面是心態(tài)的轉(zhuǎn)變——從一切都白手起家自己寫轉(zhuǎn)到使用庫來實現(xiàn)。
我沒有給這根支柱添加工具,因為工具只對有經(jīng)驗的開發(fā)者有用。在現(xiàn)在這個早期階段,學生不需要了解如何集成和配置工具。

師傅與徒弟
我20出頭的時候曾想學鋼琴。我不想找老師,以為我自己就能學。5年后,我咨詢了一位專業(yè)家教。怎么說呢。那1個月內(nèi)我學到的東西就比我5年時間學到的還要多。
我的鋼琴老師指出了我在演奏過程中出現(xiàn)的錯誤,那些是我自己聽不到的,這讓我意識到一些我從未想象過的東西。畢竟,她給我灌輸了音樂和藝術的理念,這些都不是我這個搞技術的人能了解的。
編程也一樣。如果某人對編程毫無經(jīng)驗,則自學就是個糟糕想法。盡管有很多成功故事,但我質(zhì)疑其效率。
相反,應該有一種“師徒”關系。一開始時,師傅給出規(guī)則讓徒弟遵守——盲從!師傅可能會解釋一下規(guī)則,但通常推理會超出徒弟的理解范圍。
這些內(nèi)化的規(guī)則會形成一道安全網(wǎng)。如果一個人迷路了,能保證有一些安全地帶可以返回。
教學不應該是獨白。師傅必須因材施教。應該看看學生是怎么做的,然后給出建議,根據(jù)他們的進展情況調(diào)整課程速度。

挑戰(zhàn)與激勵
“我們來做個Facebook克隆版吧!”這話不是出自有一群資深開發(fā)者和數(shù)百萬歐元預算撐腰的CEO。而是來自一門針對程序員的介紹性課程的練習。這樣一項任務幾乎是不可能的。甚至更糟的是,學生被放到仙境里面被哄騙以為自己有做超出自身能力的技能。
教師無疑是意識到這點的,但出于激勵的原因還是設立這樣的練習。
練習的主要目標不是娛樂。練習應該圍繞著特定技術設立,同時應該幫助學生理解那項技術。
激勵是好的,但不要犧牲掉內(nèi)容:編程不易。如果學生缺乏內(nèi)在動機,編碼這條路也許不合適。
新手應該體會到成為職業(yè)開發(fā)者意味著什么。在投入大量時間之前他們應該知道等待他們的是什么。
比方說,很多商業(yè)應用圍繞著復雜表格進行處理。創(chuàng)建表格是練習可以賦予的一項重要技能。開發(fā)類似Facebook那樣的應用也許不是學生馬上就能學習的最佳課程。
類似地,非程序員可能會對開發(fā)者每天寫的代碼行數(shù)至少感到驚訝。甚至有時候我們還刪除代碼或者一事無成。
為什么?因為總有狀況發(fā)生。我們花費了無數(shù)時間去修復一些極其怪異的bug,結(jié)果最后發(fā)現(xiàn)只是拼寫錯誤而已。一些工具工作不了可能僅僅因為一個庫進行了小型的版本升級?;蛘咭驗槟橙送洶岩粋€文件添加到git而系統(tǒng)崩潰。這樣的事情可以一直列下去。
學生應該享受這些練習。在時間壓力下面向一個未知庫的練習未必合適。

現(xiàn)實生活中不是每天都充滿陽光。初學者應該對編程的現(xiàn)實做好充分準備。
最后建議
最后但并非最不重要的一點:一個人無法在2周、2月或甚至2年之內(nèi)成為職業(yè)程序員。這需要時間和耐心。
培訓師不應該趕時間或者做出虛假承諾。他們應該聚焦在學生是否理解了概念上面,而不是趕得太快。
原文鏈接:?https://medium.freecodecamp.org/the-main-pillars-of-learning-programming-and-why-beginners-should-master-them-e04245c17c56

另外,UP在主頁上傳了一些學習C/C++編程的視頻教程,有興趣或者正在學習的小伙伴一定要去看一看哦!會對你有幫助的~
歡迎評論、點贊、收藏、投幣、轉(zhuǎn)發(fā)