學習編程有必要一字一句一行地照著例子打嗎?

看別人的代碼似乎有點懂,可是當自己動手去做的時候就什麼都不懂也不太記得了了,所以想問一下各位知友大神們支點招,應該如何學習編程並且能夠自己寫出代碼來,非常感謝&>_&<


很久以前我覺得這樣很笨,但後來我發現這是最聰明的入門辦法!

這樣做最開始是我前前前老闆教我的,當時還不是學編碼,而是研究開源方案。大家都知道開源方案稍微好點都會有自己的架構圖的,老闆要求我們不能拷貝粘貼,而是要用畫圖軟體自己重新畫。

我們當時很不理解啊,對著重畫一遍有什麼卵用,還不是一樣的架構啊,畫的還那麼丑!

但老闆堅持要我們這樣做,那也沒辦法啊,試試吧,畢竟老闆決定了給你加多少工資啊 :)

畫了之後我們才發現,尼瑪真是絕招啊,拷貝粘貼和自己畫,理解完全不一樣,為何這樣說呢?

我們舉個最簡單的例子,以下是MySQL官方的架構圖:

這個圖很清晰,很整潔是不是,一眼看過去就感覺一下子對mysql的架構就了解了,只需要不到20秒就掌握了MySQL架構,很爽吧?

然而,如果你自己對照畫一遍,會有什麼不一樣呢?

  • 看圖的時候一般人主要看結構和模塊,不會詳細關注每個細節,自己畫圖必須每個地方都覆蓋到,包括圖中的小字,這就強迫自己認真去看圖。例如圖中Parser和Optimizer的分工,看小字才能深度掌握。
  • 看圖的時候會認為圖的結構是理所當然的,但自己畫的時候就會想為什麼這樣畫,好像那樣畫也可以啊,這就有了更多思考和理解。例如圖中的Enterprise Management Services Utilities,為何是放在存儲引擎上面,而不是放在存儲引擎下面,或者縱向再延長一些?Pluggable Storage Engines為何有的圖標是插頭形狀,有的是「+」形狀?
  • 看圖的時候主要關注結構,畫圖的時候會思考流程。例如你自己畫這個架構圖的時候,腦海中自然會想起你寫過的sql語句,每個語句對應或者涉及哪些塊。

回到學習編程的時候,道理也是基本類似的,我以我最近學tensorflow的例子來說明吧。

這是原始代碼(僅僅截取一部分):

當你看這段代碼的時候,是不是重點只看到了幾個函數,例如inference、loss、inputs、train,每個函數的實現也只是過一下,看到調用了哪些api ?但實際上理解這段代碼,除了單個函數外,函數之間的關係才是關鍵,如果只是看代碼,是很難形成這種理解的,只有真正敲代碼-&>運行代碼-&>嘗試修改代碼,才能真正理解。另外,一直說的梯度下降演算法好像沒看到,只看到一個什麼「梯度下降優化器」,什麼情況?

下面是我敲了代碼並且運行之後自己的注釋:

因此,入門的時候,一字一句一行的照著例子打,看起來是效率最低,實際上是效率最高的方式,雖然花費了時間,但這個時間的投入產出比是最高的,因為這樣做迫使自己去思考、去理解。

當然,入門後就不要這樣做了,因為裡面的原理、邏輯、細節里都清楚了,那就沒必要這樣做了。


編程學習,掌握這個過程

抄比看有用,改比抄有用


當年學java,一開始老師就讓背那個標準板子:

public class Demo {
public static void main (String[] args) {
System.out.println("hello world");
}
}

為啥要背

你啥都不會不背行么

之後才知道int, String, double這些,還有方法,類,static,巴拉巴拉的,才理解我當時背的板子是個啥意思

一開始總是要模仿的

但是光模仿還不行,你要自己擴展下吧

比如你學了int a = 2;

你還學了int b = a + a;

那你是不是可以試試int c = a + 2;

你學了輸出hello world,那麼一句話會輸出,十句會不會

學了for循環,一般老師會帶著做99乘法表吧,乘法表你會,那改改能不能輸出一個三角形,一個空心的矩形,或是畫一個很垃圾但卻很實用的界面

學了輸入後,是不是可以試著做一個不好玩的遊戲

這個過程好比從中國製造到中國智造一樣

很多人說,哎呀,我想不過來

不打代碼,不去記【這裡的記純粹是大多了自然而然記住的那種】,鬼才能讓你會寫程序

再說一個大一的時候的體會

那次無聊寫一個大數的演算法【當然,一成都沒完成,就棄了】,在那之前,我代碼沒有上百行過。但那個項目我寫了有300行【別笑,就這300行,我打了兩天】。

在那之後,我再寫幾百行的代碼就沒這麼費勁了

第一次永遠是比較難的,但是只要做過了,再去做,就會簡單很多【現在那點代碼想好了幾分鐘搞定吧】


試一下不就知道了,何必在知乎問?


當然有必要。


有用啊,我當時書上每個例子都會照著敲一遍,培養一下『手感』,這種方法看似有點笨, 不過還是很有用的。等你十分熟練的時候,就能按照想法用編程語言實現自己想要的邏輯了。(初學者你會發現即使照著敲依然會碰到很多小錯誤,慢慢修改就熟練了)


沒有必要。如果你有了更好的想法,可以自己實現出來,然後和書上對比看看哪個更好。

過度照本宣科只會抹殺你的創造力,和探究精神。

況且書上的代碼也不是最優的。反正只要你有辦法,用自己的方式達到書上一樣的效果,就沒關係。

然後無論啥時候學習編程,都不要複製粘貼。就這樣。


如果是初學編程

且沒有靠譜的ide的情況下非常必要……

舉個例子

〔畢竟這年頭的大學編程教育有很大概率還是用VC++〕前兩天一個學妹問我室友她程序錯在哪了……一眼看過去只是四五處問題啊Σ(っ °Д °;)っ

中文左括弧,中文分號,

for循環在循環體不止一行的情況下沒寫大括弧(當然了哪怕只有一行還是強烈建議寫→_→)

for(int i=0,i&


瀉藥

我覺得不用,這跟我的學習方式有關

不管是學英語還是學編程,我用這種方式做,最後效果都很差

因為要理解上記憶,而不是這種抄寫式的記憶

至少我對這種學習方式感覺效果很一般

尤其是在外語學習上,後來火大了,不這麼搞了

就換一種方式,不停滴challenge我自己

比如我看到一個東西,我想把意思表達出來,就在想,用英語怎麼說

不會?正常,查唄,問唄,這樣積少成多,慢慢也就會了

因為經過我自己思考後做出來的東西,幾乎是忘不掉

但是抄出來的東西,沒有認真思考過,很容易就忘了

等到畢業答辯的時候,感覺用外語表達也沒那麼困難了

學編程也是一樣,不會,查唄,想唄,問唄

慢慢也就會了,無非就那點東西,多試幾次,自然就懂了

而且這樣做的好處就是,思維定勢少

很多時候我發現我做的東西,很多人似乎一開始就認為不可能完成的

但是經過我自己的推理論證之後,發現應該是可以的,然後就做出來了


沒入門時就是看書——練習——看書這樣的過程,沒有捷徑。

等入門了就是找點子——硬著頭皮自己寫——中途看看書——繼續寫——不懂的查資料——看看開源項目——看看自己有什麼能用的——完成項目;循環N次。

編程來說,一味看書是學不好的,或者說進步很慢,必須要有大量的練習,當你對語言沒有自己的理解的時候,照著書上的例子完整運行,然後自己發散著改改。

等有自己的理解了,就是做項目了,完整的做,寫的再爛也要寫,然後對照著開源軟體、設計範式等來檢查自己有哪些地方可以提高。

這裡的理解不是要你把語言各個方面都學會,語法會了就行了,如果你有其他語言的基礎,那麼看幾個小時語法,然後直接寫項目練習都是可以的。如果沒有基礎,那就不要偷懶了,找書上的例子練,不要複製,要自己手打上去。


有,請務必這樣做,抄的時候帶著腦子,可以試著結合自己的理解來中間插兩句,理清思路。

我本科學了四年編程,但大一可以說根本沒入門,就是因為我覺得我代碼和實現都看得懂,為什麼要一個個字母打出來浪費時間?然而每次碰到問題覺得腦海一片朦朧,C語言60飄過,上機更是慘不忍睹,懷疑自己是不是不適合這個學科。。。最後感覺C實踐課要掛,去圖書館隨便揪了本講C指針的書,每天吃完晚飯背著電腦35度的自習室一坐開始敲,半個月後拿滿績,從此才算入門編程。

眼高手低特別容易出現在學習編程的過程中,請務必,親自,帶著腦子,把那些字母敲出來,這是magic!我非常後悔,當年沒人告訴我這個,黃金時間在迷茫與困惑中浪費。


編程和游泳是一樣的,你把概念和方法看得在熟,也並沒有什麼卵用,掉進水裡可能會淹死,還是需要不斷的在水裡練習動作才能學會游泳。所以,只看不寫,看得再多,也可能寫不出1行正確的代碼。

照著別人的代碼練習,是為了鞏固和熟悉計算機語言語法知識。學習了每個語法後,可以做一些綜合性的練習去熟悉整個語言的語法,鞏固每個語法之間的聯繫。熟悉了語言的基本語法後,你就可以使用這個計算機語言去做程序了。也可以繼續深入學習語言的高階內容和底層實現。深入學習是為了更加靈活的使用語言。

語言只是工具,編程的核心是解決問題,即實現指定問題的演算法。不要過分重視語言的學習,而要不斷練習自己解決問題的能力。


學習任何東西都有一個套路

一般都是 先模仿再總結最後創新

編程其實和寫作文是一樣的

你覺得自己的寫的時候寫不出東西

是因為還肚子里的貨還不足

我剛開始也會有你這樣的問題

通過很長時間的練習(多敲代碼)才克服的

當然你也可以不用所有的例子都抄一遍

找那種自己覺得有意思的跟著做一遍

儘可能的加一些自己的功能

時間長了 就不會出現你說的問題了

加油


剛上大學的時候沒有電腦,但是學 C++ 不能不寫代碼呀。然後就紙上寫代碼,把譚浩強老師的 《C++ 面向對象程序設計》課後習題在紙上寫了一兩遍。雖然比較笨拙,但好歹當時沒放棄。

這兩三個月,僅在 stk 回答問題,積累的 python 代碼加註釋至少有 100 kb 的量。

對,一個字一個字敲的。


完全有必要,如果你是初學,那麼請你一個字母一個字母的對照抄下來,不然你運行程序的時候出各種錯誤以後還大罵原作者寫的爛代碼。

不要以為寫代碼可以簡寫什麼的,比如下面這個

他說這是他寫的knn代碼,讓我幫他看看,我傻眼了,我隨便百度了一個帖子讓他對照看看,他說他就是對著別人的代碼寫的,堅持要我看看他的代碼哪裡有問題。

我心想你他么的以為我瞎嗎?我絲毫看不出來這是對著別人代碼而寫成的。是多有創造力能把knn演算法抄成這樣的。。。


寫代碼寫的不是單純的代碼,寫的是邏輯,邏輯,邏輯。

你看別人寫的,那也是別人的邏輯和思維寫出來的,先學會模仿,然後在再形成自己的風格,然後靠著思維,思路,邏輯書寫屬於自己的代碼。

ps:你說你看別人的代碼有點懂,那你有沒有動手敲一下別人的代碼,有沒有思考別人為什麼這麼敲,這麼敲的好處優點是什麼,有沒有漏洞和缺陷,業務上你能看懂不,你自己敲能否敲這個水平。多思考些,多動手些,世界很美好的。


最高明的碼農越要親自打代碼


我覺得沒必要照著例子去抄,而是應該在你看懂了之後自己按著他的行為自己寫一遍,然後你會發現很多看的時候沒有注意的點,寫完後再對比一下差別什麼的


我認為這是入門最快的方式。打完就懂了,不打,有時候要看好幾遍才懂。


謝邀

其實是否需要一字一句敲入主要取決於你是否明白自己所敲的這行語句有什麼用,能否改動,怎麼改。如果你明白了語句的含義,那就沒必要按照例子上的做了,完全可以按照自己的想法寫,然後通過debug將程序寫正確,再和例子做比較,看看差異在哪裡,從而得到成長。

當然,對新手來說,肯定還是從一字一句敲入開始的。等成了老手,只需要看一眼文檔就夠了。


推薦閱讀:

刷題究竟要懷著什麼樣的心理?
如何利用 iPad 高效學習?
如何高效的使用錄音筆學習?
如何將知乎、豆瓣、LOFTER 上的一些文章保存在一處,高效整理?
如何高效的準備CPA考試?

TAG:編程 | 高效學習 | 寫代碼 |