標籤:

如何有效的練習並且提升寫代碼的能力?

大一,軟體工程專業,在學習了C語言之後,到了暑假買了電腦想好好練習一暑假,但是感覺上機上代碼比想像中要困難,而且效率也很低。經常弄好長時間回過頭來發現自己的收穫微乎極微。希望都有有經驗的人指點迷津。


謝邀。

以 C 語言為例子,提升寫代碼能力正確步驟如下。

1. 先把語法學個 20%

內容: 代碼規範 (大括弧,花括弧,分號,注釋),基本數據類型,變數,運算符,表達式,輸入輸出。

2. 上機寫 Hello World

安裝開發環境,新建一個 Hello World 工程,在裡面折騰一下前面學到的東西,列印到控制台。

3. 把語法學至 40%

內容:&< If,else&>, &, &< for&>, &< while&>

4. 繼續折騰 Hello World

還是那個工程,把第三步學到的東西,再寫到代碼裡面折騰折騰,看看控制台輸出有啥不一樣。

5. 把語法學至 50%

內容: 函數。學習函數的定義,返回值,形參實參,函數的調用方式,全局變數,局部變數等。

6. 還是 Hello World

依然是那個工程,把第五步學到的東西,用代碼實現,再看看控制台輸出。

7. 把語法學至 70%

內容: 一維數組、二維數組、結構體,共同體,枚舉 。

8. 沒錯,還是 Hello World

在 Hello World 裡面練習第七步複雜變數的用法。

9. 把語法學至 80%

內容: 指針

10. Hello World, Hello World

在這個你已經非常熟悉的工程里練習下指針的用法。此時你應該學會開發環境的基本調試功能,看下程序運行時的變數與指針的內存結構。以此深入了解指針。

11. 把語法學至 90%

內容: C 標準庫,Windows / Linux C 語言擴展庫。C 語言內存布局 (全局,Static, 堆,棧 等)。

12. Hello World 說三遍

在 Hello World 中練習前面學的,比如打開修改關閉一個文件,比如創建線程。通過開發環境的調試功能,深入了解 C 語言數據單元內存的創建原理。

---------------------語法學完分割線----------------------

語法終於學完了。

理論上,你可以用 C 語言做任何想做的事情了。

但這也是一個循序漸進的過程。

接下來需要大量的實踐。

13. 看別人的代碼

寫完了語法和標準庫,但是還是不知道如何開始,那就去看下別人的代碼吧,寫代碼可以先從修改和模仿開始。去哪找別人的代碼?開源項目這麼多,隨便找,多的是。

14. 寫自己的代碼

看完別人的,可以試著自己寫了,其中可以學習剩下的 C 語言編程技巧,例如函數指針,回調函數。

寫代碼的方式有很多種:

  • 參與開源項目
  • 去公司實習
  • 參加比賽
  • 隨便寫點啥

15. 鞏固理論知識

當你參與到複雜的項目的時候,你會發現光靠那點破語法是遠遠不夠的。

當你寫帶網路通信的程序,需要學習計算機網路。當你發現你的代碼無比繁冗且低效的時候,需要學習數據結構與演算法。當你寫編譯器的時候,需要了解編譯原理。當你寫操作系統的時候,需要學習操作系統原理。

16. 最後兩步反覆循環,直至你發現再學不到什麼新東西為止

我近期的 Live 會說到這個,有興趣可以參加。

知乎 Live - 全新的實時問答


step 1:「抄」

文雅地說,叫借鑒與模仿,把書上的基本習題抄一遍,去csdn GitHub抄點源碼。你不抄怎麼知道編程語言的語法結構?你不抄怎麼知道漢諾塔問題的遞歸實現?你不抄怎麼知道怎樣簡潔把鏈表插入刪除節點?你不抄怎麼會發出以下感嘆:

step 2: 默寫

把你抄的默寫下來,因為抄了不一定記住,背過了也會忘,當你閉著眼睛都能默打出來,你已經對這個問題有了認知。

step 3: 理解

對於一個問題,當你默寫了很多次以後你就會產生一個疑問,為啥這個是對的,還有沒有更簡單點的方法。例如哈夫曼樹,你可以嘗試去證明它的合理性。

step 4: 應用

各大oj上肯定有不少練習,嘗試用以學過的知識解答,舉一反三,說白了就是理論學完了,該刷題了。當然我們無法把一種語言抽離出來,這時候做點項目什麼的有利於加深對軟體開發的認知和對語言的宏觀理解。

step 5: 拓展

當你刷夠了很多題,你對這個問題的理解已經趨於完善。當你站著巨人的肩膀上,你要嘗試看到更遠的風景,比如嘗試用更低的時間複雜度實現某一種演算法。這時候你會發現以前抄的好的代碼或者來源reference源碼多麼elegant。

step 6: 買一本書

By the way,推薦一個回答:怎樣系統學習C++編程https://www.zhihu.com/question/23447320/answer/24657827


我就說說我的一些看法,不一定正確,供參考。我覺得學習C語言,從入門到能編寫一定規模的代碼,也就是從初級到中級,有如下幾個階段。

1. 語法學習。這個過程少不了的,而且這個過程非常枯燥無味。語法從最開始的基本數據類型,幾種控制結構,循環,函數,數組,結構體等等。在學習的過程中,你屁股一定是坐不住的,像我這種自控力極強的人,當年也是學的想哭。

這個階段一定要選一本非常基礎的教程。我當年用的是譚老的教程,雖然現在有不少人指責此書,說有錯誤也好,說代碼不規範也罷,但在我看來,至少這本書把我領進門,講的已是非常易懂了。至今我手頭還有這本書。

2. 語法提高練習。上一步結束後,只能說你懂了一些語法,會寫基本的hello world程序了,但是你對語法理解的還不深入。這一階段就是對上一步的查漏補缺。我建議選擇一本經典的國外書籍。比如我現在手邊有c primer plus,c指針等。精讀老外的書,細到理解每一句話,有什麼想法,或者理解了什麼,都記錄下來。有什麼疑問需要編程驗證的,馬上去做。書後的習題,一定要自己做一遍,再對照參考答案,看看你的答案和人家的答案差在哪裡。好好研讀書中的例子,那些例子都是很好的範例,都是以後自己寫代碼要參考的。

學完一章後,都要回憶下這章老外都講了什麼,自己理解了哪些東西,有什麼靈感也要記錄下來。

3. 詢問。在上述兩步中,你一定會遇到不懂的地方,可以上網查,可以問別人,可以編程去理解,等等,不要放過每一個問題。你也可以私信或值乎跟我交流。

4. 上機。其實這一步在第2步中就已經開始了。在做書後習題時,免不了要寫代碼,那就放開膽子去寫。遇到困難,可以寫個偽代碼,寫下自己的思路,在吃飯時,睡覺前想想怎麼將偽代碼或者思路轉換為實際的代碼,如果實在寫不出來,想想自己是不是哪個知識點沒有掌握或者模稜兩可的。

也可以網上找些習題,自己上機練習。

一定要最後去看參考答案。

5. 數學。其實很多編程的習題都是基於一些數學知識。比如編程找素數,啥叫素數?有啥特徵?這都是數學問題,掌握好一些基本的數學知識,才能寫出代碼。再比如求階乘,矩陣逆轉等,都是純粹的數學知識。

6. 編碼規範。我承認,譚的書在這方面做得不好,可能他想盡量簡單點,好讓初學者入門吧。我們自己寫代碼一定要養成良好的編程習慣,比如if(0==表達式),函數盡量簡單,變數命名要有意義等等。

先說這麼多吧,等想起來其他的再補充。


代碼的能力你說是什麼能力?

可讀性?可維護性?擴展性?執行效率?

好多呢~

參考 code complete 第二版 。

絕對不是抄出來的!不斷思考,重構,改進。

盡量做功能完整的東西,而不是四處抄代碼。

除了寫代碼 還要分析代碼的執行。

不斷的寫,不斷的琢磨,改進。


網上有不少大神說要多練習,說的不錯,但是她們是大神,說的不那麼接地氣。

說點親身經歷吧,當初為了編寫兩個數字a和b交換的程序愣是想不明白為什麼還要第三個變數為什麼不能直接直接跟現實中一樣a=b然後b=a。後來只有硬背下來找個中間量的方法,然後在遇到這個問題直接把答案敲出來,後來自己看彙編明白什麼是內存結構才知道為什麼要個中間變數,以至於見到用加法來實現交換的方法立刻驚為天人……

現在回想起來編程是個需要正反饋的過程(新人也許還沒入門在遇到難點就放棄了,我想說你如果真喜歡編程就開始吧)。

每次編程前先想好怎麼實現(至少 是大致實現,然後開始調試)如果怎麼想都想不起來那就背下來吧,背多了,記多了隨著積累就理解了,這個過程應該是長期的、愉快的!!!

如果你不是那就先看書,隨便拿本C語言書,找例題試著自己編寫出來,不懂看答案敲一遍,然後不看答案敲一遍和答案對比,直至和答案一樣……

記得有個外行問起我來程序員是幹什麼的?我回答是個「翻譯官」,就是把人類的思想用C語言之類的翻譯成機器可執行的代碼bulabula,外行一臉懵逼的樣子,然後我換了種說法,拿操作系統提供的磚瓦蓋房子,外行瞬間懂了。

而你現在的階段還不具備蓋房的能力,必須經歷一段時間的練習和閱讀計算機專業的書籍以後才會明白很多道理,so,不要心急,年輕人


刷題刷題刷題,重要的事情說三遍。

雖然是個我末流的Acmer,但是堅持了兩年明顯感覺不管是對語言的駕馭能力和演算法的熟悉程度都有了比較明顯的提升,會對語言的特性有更深刻的理解。

編程就是說話,說的多了,語法自然不會成為束縛,然後開始學些用著高級的結構解決問題,讓代碼變得簡潔優美。然後再去談做項目上的事情吧。寫代碼的時候注意培養好習慣,良好的排版,適當的註解,有必要的時候整理成自己的筆記,方便再次查看。

枯燥?抱歉,這個真的無法避免,這可能也是導致大部分計算機專業的人代碼能力差的主要原因。如果覺得一味地編程刷題很枯燥無味的話,可以自己動手做些有趣的東西,我曾經做過一個貪吃蛇,就在Dos窗口執行。既然枯燥難以,只好苦中作樂吧……保持興趣也很重要。

每一樣技術如果當成專業來做的話難免需要標準化,精細化,當一樣東西不再能放鬆身心和回復精力,而是需要大量耗費精力的時候,堅持下去就越是困難。不像遊戲,不像手機,不用耗費什麼,只需要動動手,劃劃屏幕,即使是什麼感覺也沒有,還是會享受這種輕鬆愜意的感覺。

或者說,編程能讓你獲得成就感的話,是不是更能讓你堅持下去呢?我給你個建議吧,去輔導萌新上機,如果能有問必答,對自己的信心能有很大的鼓勵,但如果不能的話,也是可以體會到自身的不足,藉此督促自己吧。

希望對你有用


作為過來人,你學代碼的那本書,或者那個人,絕對對你有難以想像的影響。

最好最快的辦法,找個完整的項目,找份好代碼。抄!就是抄!一行行手打,學習怎樣變數命名,怎樣函數命名,怎麼異常處理等等等等。。慢慢的這份代碼就是你的了。

然後再試著去自己寫


21分鐘學會寫編譯器 - 知乎專欄


第一步:

找兩本書,對比學習,抄書上的碼,看第二遍默寫(理解默寫)

第二步:

在某些OJ上刷題,鞏固一些基礎知識,並且在做的時候學,學會一些演算法

第三步:

如果是C++,去學一學Qt,如果是python就不管了,開始做一些有界面的產品,一方面是提高興趣,一方面鞏固知識點。

第四步:

進入學——寫循環,逐步擴展你的只是體系,不久你就6了


小白謝邀。)

之前看到一個提問,很喜歡(原諒沒找到出處,侵刪)。

Q:如何正確編程?

A不可能的,放棄正確

(初學者最好都走完一遍錯誤,再到達正確.)

有點偏題,望有幫助.


其實效率低只是頭一兩個月,等這一兩個月把大部分比較傻的編譯錯誤都犯過之後,你就能很好的解決編譯問題了,之後就是打log和debug。

像樓上說的一樣,很多時候不明白的東西只要記住就行了,對的路只有一條,但錯的路有很多條,非要搞懂為什麼錯,錯在哪裡也不是不可以,但有一個度。而且很多時候你沒搞明白的過去了很久再回頭看看,會發現哦,原來是這樣的。


推薦閱讀:

初始化、顯式初始化、隱式初始化。這幾個區別是什麼?
在使用lib時,代碼都被鏈接到exe中去了嗎?
學習C++,應該循序漸進的看哪些書?
和團隊做物理引擎,做到商業程度還需要什麼?

TAG:程序員 | CC |