基礎都掌握了卻還是敲不出代碼?編程新手如何快速提升coding能力?

編輯 | Levene & Emma

專欄 | 九章演算法

相信很多初學編程的朋友都有這樣的苦惱:為什麼我感覺自己基礎都掌握了,但是學校的課程結束後再進行編程時還是什麼都不會呢?

通常新手程序員會以不同的方式來表達這個疑問,比如:

  • 「我通過在線課程學習了Python,但是我還是不知道怎麼用它來編程。」
  • 「我知道這個理論,可是怎麼把它運用到我的代碼里啊?」
  • 「我知道while循環,但我就是不知道何時何地使用它們。」
  • 「循環數組變數我都知道,然而我不知道如何將他們組合起來。」

現在在我們來客觀的談一談這個問題。

首先要說的是,如果你覺得自己基礎都掌握了,但是就是不能在沒有他人指導的情況下寫出一個程序,那麼我只能說你並沒有真正掌握這些基礎知識。

我能理解你面對這一情況內心的沮喪,但是你要知道這是成為一名優秀程序員必經的一個階段,所以即使你有千百個不願意也不得不面對這個現實。

接下來我們就來探討一下,為什麼那麼多學生會在上完編程課程後不能「順利出師」,並會針對這個問題給大家一些小建議,希望能助你在優秀程序員的路上越走越遠。

一、造成這一問題的原因

1.「人造」的編程環境

造成這個問題的一大因素是在線編碼課程為學生提供了一個「人造」的編程環境,在這個「人造」的編程環境中學生們通常都會在一個已經包含了指令和提示的網頁上練習代碼。

然而這並不是編程真正的打開方式。所以課程結束後,當沒有人再為學生提供這樣一個「虛假」「舒適」的編程環境時,面對真正的編程環境,學生們就開始不知所措,失去了目標和方向。

當然,在線課程提供這種「人造」的編程環境並不是全然不好的。因為建立一個真正的編程環境通常是很複雜並且在真正的編程環境里進行編程會讓初學者感到沮喪。而在線課程提供的這種「人造」的編程環境允許你不用建立起自己的編程環境就可以獲得許多編程經驗。

然而,這種「舒適的」編程環境雖然在一定程度上減輕了你在初學編程階段的挫折苦痛,但是它也只是將學習編程的挫折苦痛攔截到課程結束後,等課程一結束,它們就會出現在你面前。

2.過度的指導

當你結束了一個在線課程,或是學習完一本書,或是在現實編程中接受他人建議時,你都能從中得到很多的提示和指導。在這種情況下,你甚至可以在剛拿到一個程序時就能知道你要輸入什麼甚至知道這個程序的最終結果。

然而當你試圖自己建立一個項目的時候,你只能看到一片空白的輸入框:沒有指令、沒有提示、更沒有人告訴你下一行要輸入什麼。像這樣從一個簡單的環境跳到一個困難的環境,你自然會感到驚慌失措甚至自我懷疑。

接受過度指導的另一個後果是:學習了語法但沒有學習到編程的概念。

語法就是你輸入的特定編程語言的文本,比如if和 while。但是每種語言的語法都是不盡相同的,而你在學習編程時,不只是要學習編程語言的語法,更重要的是要學習他們的概念,比如分支和迭代。

了解概念能讓你理解代碼實際上能做成什麼,以及代碼如何用不同的語言實現。

所以如果有人說他們知道while循環,但是不知道何時何地使用它的話,那他們肯定還沒有真正理解迭代的概念。

但是,我並沒有說接受指導是不好的。因為當你剛開始學習的時候,你肯定需要有人來指點迷津。如果完完全全自學沒有接收到任何建議指導的話,你可能會像一隻無頭蒼蠅一樣在編程世界裡盲目飛行。

而在你的編程生涯的每個階段,你也都需要有人來指導你,但是一定不要接受過多的指導。因為作為初學者,如果接受了過多的指導就會給你一個錯覺:編程很簡單。這就會造成當你不能成功地獨自寫出程序時,對自己的編程人生感到懷疑。

九章演算法所有在線課程都配套課後演算法實戰作業,通過 lintcode online judge, 為你創造獨立完成代碼的良好環境。學完課程後,同步獨立完成作業,可以收穫意想不到的進步。

二、如何解決這個問題

1.創建一個真正的編程環境

每種編程語言需要的編程環境都是不同的。

想要創建一個真正的編程環境,首先,你需要一個文本編輯器或一個IDE(集成開發環境)。然後你需要找出對你正在學習的語言來說最適合的編輯器並安裝它。

其次,你需要知道如何創建並運行一個包含代碼的文件

  • 如果你是使用一個IDE來作為你的文本編輯器,例如:Visual Studio、Xcode或Eclipse,那麼這個功能就會被構建到IDE中。你就需要了解如何創建一個新項目以及需要點擊什麼按鈕來運行代碼。
  • 但是如果你沒有使用IDE,那麼你可能就需要學習如何利用命令行來運行代碼。你可以找一些入門指導或者上YouTube看一些免費的教學視頻來學習使用命令行。

最後,一旦你可以編寫代碼,並且能夠正常運行程序,那麼基本上你就開始正式步入專業程序員的道路了。

2.從刷演算法題開始,瘋狂積累代碼量

當你還是一個新手的時候,你需要瘋狂的積累你的代碼量,你可以從基本的問題出發,做一些簡單的問題,怎麼輸入數據,怎麼輸出數據,然後熟悉各種數據結構,各種常見演算法,瘋狂的刷題。

比如,lintcode 就是一個很不錯的刷題網站。不會怎麼辦!看答案。推薦在這裡對照查看lintcode演算法題的答案:jiuzhang.com/solution/ 。先了解答案是怎麼寫的,然後自己實現一遍。

一般來說,刷題應該循序漸進,從易到難。你可以先從easy難度的問題做起,每一個程序也就20-40行左右,甚至你可以一旦AC,反覆提交,以增強自信心,雖然這只是一個玩笑,但是它可以讓你提高你對編程的自信,對編程的喜愛,當你有自信的時候,你才能真正的把一件事情做好。當你反覆解決一個又一個的問題的時候,你要告訴自己我是個天生的編程者!然後你就可以挑戰更高難度的問題,當你積累到10W以上的代碼量的時候,你會發現你會有一個質變。一切將變的順手。當以前要想半天的語句,現在信手拈來。恭喜你跨出了很重要的一步。

3.從小項目做起

嘗試去做一些稍微超過自身水平的項目並不是一件壞事,因為你可能會發現它很有趣並且它能激勵你學習更多的東西;但是從另外的角度來看,如果浪費了不少時間項目卻毫無進展,也會讓你感到灰心、沮喪。

一千個人就有一千個哈姆雷特,適合別人的方法不一定就適合你。所以當激勵法對你起反作用的時候,也許你就該考慮從基礎的小項目做起了,畢竟所有東西都是從零開始的。

剛開始的時候,你可以編寫一些基於文本的程序,因為編寫這種程序比編寫其他程序相對來說更容易一些,它只需要掌握:如何在屏幕上顯示字元串;以及如何獲取用戶輸入的字元串。

確實基於文本的程序寫出來並不像3D圖形的程序寫出來那樣酷炫。然而如果你想要寫3D圖形的程序,你就必須對集合、線性代數和微分都有一定程度的了解。而即使是寫出一個帶有按鈕和文本框的普通GUI也是很難的,更別說寫出一個3D圖形的程序了。

當然這也一定程度上取決於你所學習的編程語言,也許你所學習的編程語言不需要你懂多少數學,但是需要你多多少少對面向對象的程序設計和複雜的對象圖有較為深入的理解。

我的建議是:先設計一段時間的文字遊戲。比如做一些像「猜數字」、「多選題」等小遊戲來進行一場小小的文字洗禮;又或者,設計一些可以在現實生活中派上用場的小程序,可以是一個時間跟蹤器,又或者是在你的學習或工作上能夠幫助到你的計算公式;然後你就可以通過這些小項目來深入學習你所選擇的編程語言的所有特性。

4. 練習白板寫代碼

你必須不需要任何指令地從零開始編寫自己的代碼。也就是說你要從一個空白文檔(白板、白紙等)開始,然後在不聽從任何指示的情況下自己敲出每行代碼。

從這一步開始意味著你已經準備好迎接腥風血雨了。因為後面你將花費大量的時間進行調試,並要嘗試理解每個bug。但是在每次檢測和修復bug的時候,你的編程技能都能得到相應提高,並且你也能獲得真正的編程經驗。這就是作為程序員學習和成長的方式。

當然你也可以通過查看別人的代碼來獲取經驗,但是你不能直接複製黏貼,因為如果你直接複製黏貼的話,這樣的學習將毫無意義。你要做到的是:認真分析別人的代碼;得出它是如何正常運行的結論;然後再運用獲取的經驗來進行獨立編程。

5.不懂就問:懂得如何尋求幫助

在學習編程的過程中,你肯定會遇到一些你自己無法解決的問題和一些你無法靠自己修復的錯誤。雖然這只是你學習編程的一部分,但如果你已經花了2h+來嘗試解決你的問題未果時,為了提高工作效率,就應該轉向尋求專業幫助了。

然而有些學生在學習編程時會在沒有嘗試過自己解決問題的情況下立刻尋求別人的幫助,這不管是在IT領域還是其他領域,都是不被贊成的。因為不管出現了什麼難題,都要自己先去儘力解決才有學習的意義。不然最終還是回到了「靠著別人的指導過活最終自己什麼也沒學到」這個問題上。

那麼我們應該如何尋求幫助呢?

  • 基本的問題你可以先google一下,網路世界那麼大,單靠這個你就能解決不少問題。
  • 如果你遇到一些靠個人之力無法解決的問題,要注意的是即使他人幫助你解決問題,也不要直接把別人的答案複製黏貼到你的問題上。你要做的是分析答案並了解錯誤背後的原因,只有這樣當你下次再遇到相同的錯誤的時候,才能靠自己修復錯誤。
  • 另外,如果你經常遇到一些靠個人之力無法解決的問題,最有可能的原因是你做的項目太大了以至於遠遠超過了你的自身水平,這裡就要重申一下上一條建議:從小項目做起,一步一步提升自己的水平。

6.正確的提出問題並尋求幫助

也經常會有初學者羞於提問或拒絕提問,很大一部分原因是他們認為編程社區裡面的那些大神有些不友好甚至態度有些令人生畏,所以他們不想跟這些人打交道,這對於初學者來說是非常可怕的事情。

其實,雖然有些專業的程序員會在回答時有些「直言不諱」,但是如果你以正確的方式提出你的問題,你會發現社區里的很多大神是非常友好的,並且他們往往能夠一針見血的點出你的問題所在,同時能給出解決方案。

如果你根據下面的指導提出問題,肯定可以吸引很多友好的程序員幫助你解決問題。可能還能防止一些雖然脾氣有些暴躁但是很善良的程序員一邊幫你解決問題一邊對你發脾氣。

  • 發布出確切的錯誤點。這是最重要的一個部分,因為如果回答問題的人沒看到確切的錯誤信息,就意味著他們要浪費自己的時間來找出你的程序的錯誤所在再給予解決方案。
  • 如果你也不知道確切的錯誤信息,那麼請說明你推測的會發生錯誤的部分,和實際發生的情況。比如:「我希望輸出5,但卻實際輸出了7」。通常,問題不出現在你的代碼中,而出現在你期望和實際的差異中。所以如果你沒有闡述你期望得到的結果,你能得到的回答就只有類似「這代碼看起來很好啊」或者「這代碼有什麼問題啊」這樣的回答。
  • 粘貼出你的所有代碼。一般情況下,看不到完整的代碼來調試問題是很困難的。如果代碼不是太多,最好的提問方式就是將代碼完整粘貼到Github Gist和 Pastebin.com 中,然後把相關鏈接放在問題里。
  • 複製出來的代碼格式要正確,而不是簡單的複製黏貼。你要學會如何對你的代碼進行排版,使它看起來更便於閱讀。

舉個例子,正確的複製格式它應該是

def foobar

puts 1 + 2 / 3 end

而不是:

def foobar

puts 1 + 2 / 3

end

  • 指出你已嘗試過的方法。這證明你已經儘力了,而不是有問題沒有進行思考就直接扔出來讓大家幫忙。
  • 使用正確的編程術語。雖然你還只是一個初學者,並不能將所有的專業術語都使用正確。但是你最好還是盡自己所能使用正確的專業術語。因為努力學習常用專業術語並正確使用它們對你以後的發展也是很有幫助的。

三、總結

最後總結一下這篇文章所提到的建議

  1. 給自己創建一個真正的編程環境,使用IDE或者空白文本編輯器(白板)來編寫程序。
  2. 一定要從頭到尾自己編寫所有的代碼,不要在沒有理解的情況下直接複製黏貼他人的代碼來欺騙自己。
  3. 從小項目開始做起,編寫一些基於文本的程序來練習你正在學習的編程語言,然後再慢慢的進行一些更大更複雜的項目。
  4. 瘋狂的練習,編寫大量的代碼。在學習理論知識的時候就要不斷地嘗試把理論應用到自己的代碼當中。學習、實踐;學習、實踐;學習、實踐······
  5. 要先學會自己解決問題,當自己解決無果,陷入困境時,要懂得如何尋求幫助。
  6. 不要羞於提問或拒絕提問,要懂得運用正確的方式尋求他人的幫助。

毋庸置疑,學習編程並不容易。特別是當你剛剛上完編程課程,開始走上自己的獨立編程之路時,這種感覺就會更加的強烈。但是請你不要就此質疑自己的編程能力,除了一小部分天才之外,誰不是一步一步從小菜鳥走上大神之路的呢。

最後,在這裡也祝願大家都能在編程之路上愉快的越走越遠。

推薦閱讀

秋季校招備戰指南 | 國內IT技術崗位求職攻略

為什麼辭去上一份工作 | 常見面試問題解析

你是領導者還是追隨者 - 面試常見問題解析

收到更好的offer, 如何毀掉已簽約offer?

歡迎關注我的微信公眾號:九章演算法(ninechapter)。

精英程序員交流社區,定期發布面試題、面試技巧、求職信息等。

推薦閱讀:

無我編程十誡
【遊戲框架系列】五彩繽紛
談點編程之外的事情
看不見的設計
LeetCode刷題筆記 06 ZigZag Conversion

TAG:编程 | 程序员 | 求职 |