編程新手:看懂很多示例,卻依然寫不好一個程序
最近在和學員的溝通中,發現不少初學者面臨這樣一個問題:了解了一些基本的語法,看得懂書上的示例,但是面臨一個新的編程問題時,依然感到無從下手。究其原因,主要是兩個方面:
- 整體上,不曉得如何把問題轉化為程序語言。
- 細節上,不知道用什么方法去實現某個功能。
比如我們碼上行動的編程實例里有一道題,大意是:生成 200 個優惠碼,每個優惠碼由8位字母組成(包括大小寫)。
當然題目本身難度不高,和我們公眾號【每周一坑】欄目里的題相比,這個算是小 case 了。不過如果你是一個剛剛接觸編程不久,才掌握條件判斷、循環、列表的新手來說,還是有點小挑戰的。
以這題來說,有人是直接對生成一串字符沒有想法,不知道怎么辦。更多的人可能會有些思路,但在具體的環節,比如如何產生隨機字母、如何拼成字符串、如果判斷重復上遇到麻煩。從學員的評論中可以看出,很多人驚呼:原來還有 xxx 這個函數、還有 yyy 這個模塊,完全都不知道。
那么在開發程序的時候,怎么去解決類似的問題,并且找到合適的方法呢?我簡單分享下幾點經驗:
1. 學會分解問題
有個關于數學家當消防員的笑話:
消防隊長問:如果巷子里一個貨倉著火了怎么?數學家答:把消火栓接到軟管上,打開水龍頭,把火澆滅。隊長說:完全正確!那如果你來到巷子發現貨倉沒著火怎么處理?數學家答:把貨倉點著,這樣問題簡化到一個已知問題上了。
拋開笑話本身的夸張,作為一個程序員,你也需要有類似的邏輯思維:分解和轉化問題。
- 生成 200 個優惠碼 => 生成 1 個優惠碼,循環 200 次
- 生成 1 個 8 位優惠碼 => 生成 1 個字符,循環 8 次
- 生成 1 個隨機字符 => 生成一個隨機數,轉成字符
生成一個隨機數,這是個我們很早就提過的一個問題,用 random 模塊即可實現。那么這個問題的思路就已經比較清楚了。剩下的就是處理好過程中的細節:如果從數字轉換為字符、如何循環、如何拼接等等。
不過肯定會有同學說,我都不知道數字還能轉成字符。也會有同學表示,其實根本不用繞這個彎,明明可以直接生成隨機的字符。沒錯,就和點燃貨倉的數學家一樣,我們這個邏輯沒問題,但實際看來還是有點二。所以另外一個重要的經驗:
2. 學會使用搜索
雖然大多數程序員在大學里的專業屬于計算機科學(science),但在企業中的角色卻是工程師(engineer)。也就是說,編程是一項更偏向實踐而非理論的工作。我們的目標是解決問題,需要掌握的是解決問題的手段和方法。對于程序員來說,搜索就是非常有效的一種尋找解法的途徑。
但可能很多沒有編程經驗的同學會覺得,學編程時通過搜索找到一個解法是一種“作弊”的方式,自己并沒有真正理解怎么解決問題。這種想法大可不必。即使經驗豐富的程序員,也會在處理問題之前,通過搜索來尋找有沒有更合適的解決方案。通過搜索找到解法這個行為本身會比寫出這個小程序對你來說更有價值。這里我曾寫過一篇,關于如何使用搜索引擎:編程初學者如何使用搜索引擎。
就優惠碼這個問題來說,通過一些簡單的搜索,就可以發現不少類似的問題解法。當然你不能去搜“如何制作 8 位優惠碼”,而是搜“Python 生成隨機字符串”這樣的關鍵字。然后你就了解到:可以用 random 的 sample、shuffle,另外還有 string 這種模塊可以利用。
順便扯遠些。有同學曾經問過:你們的教程是不是包括了找工作需要的知識點。這也是一種類似的誤區。我們不是去參加高考,按照考綱復習完備,然后再上考場。現在的計算機行業可以說比任何一個行業的更新都要快,你永遠不可能“完全”掌握某個領域的知識之后再去開發,你需要不斷去面對新的技術和新的問題。所以編程相關的知識是變化的,要掌握的是不變的解決方法。
況且對于任何一個領域來說,知識的分布就像這張圖,當你越進一步,你面對的知識空白就越多。這也是為什么很多同學學完基礎之后,表示找不到一本合適的教材來進階。因為根本就不存在這樣的教材。在初級階段,你提升能力的模式是 學習技能->拿技能去練習,而到了一定程度之后,提升能力的方式則必須是 遇到問題->想辦法去解決問題,是一個由被動變主動的過程。所以,想更進一步的同學,不要去找教材,而是去找問題,再用好“搜索”這個偉大工具去解決它。
我們秉持的教學方法也是一樣:我們不是給你教材,全互聯網的資源都應該是你的教材。我們給你問題,以及如何去找解決問題的方法。
3. 學會查文檔
在程序員屆有這樣一個詞:RTFM(Read The Fuxxing Manual,去讀TMD文檔手冊)
類似還有一個 STFW(Search The Fuxxing Web),就是對應我前面說的第 2 點。
我曾經一位老師指著一本厚厚的編程教材跟我們說:你們根本不用去記這些函數,只要用的時候知道去哪里查就足夠了。
搜索可以告訴你有哪些解決方法,而官方的文檔則是更明確的告訴你該怎樣使用,參數有什么限制,需要注意的地方等等。唯一遺憾的是,大多數 Fuxxing Manual 都是英文寫的。所以你說,英語不好到底能不能學編程。我只能說,可以,但強烈建議你好好補一下英語。(預告一下:我們已經整理了一份適合 Python 學習的英語詞匯表,并做成了單詞本,即將放出。)
還是回到這道題目,通過 Python 官方文檔,你就會知道 random 模塊還能做哪些隨機操作,以及 string 模塊可以生成哪些字符串。
我沒有找到特別好的 Python 官方文檔中文版,usyiyi.cn 這個算是相對新且完整的。如果各位有知道更好的,歡迎留言指出。
最后,還有提一點老生常談:
4. 不斷練習,積累經驗
我已說過無數遍:編程如樂器,學會語法只是開始,還需要不斷練習來掌握。每個程序員都是一行行代碼堆出來的。如果你剛學編程不久,覺得自己缺少編程思維,經常感嘆原來還有這種操作,寫長一點代碼就老出 bug 的話,相信我,你只是寫得太少,看得太少。不用妄自菲薄,也不用急于求成,踏踏實實地先多練一練。等你把一本教程的示例代碼都自己在電腦上輸入運行一遍之后,我們再來談談什么是編程思維。這不是什么我獨創的奇葩教學法,大多數程序員和計算機教師應該都認同這點。
【本文是51CTO專欄機構“Crossin的編程教室”的原創文章,轉載請通過微信公眾號(rossincode)聯系原作者】