代碼自己不會寫,看一遍別人的還懂,這是對這門語言不會么?

大一老師總是讓寫點小程序,自己不會,但是別人寫完我能看懂,WHY?


鼓勵!能看懂已經表明有一定的能力掌握。

這應該是學習編程的人都有的過程,並且是一個持久的過程。我不是說你將永遠只會看不會寫,而是說,只要你保持學習,就永遠都會有我們能看懂,但自己沒法順溜寫出來的代碼。不管什麼語言。比如:

床前明月光,疑是地上霜。舉頭望明月,低頭思故鄉。


抄作業容易,寫作業難。剛開始學嘛,這樣很正常。只能說明你進度慢。還沒到說會不會的時候。


知其然不知其所以然,(略


說明語言語法沒熟
上學期給別的學校的同學寫大作業,就和你說的一樣,演算法明白,能在紙上模擬出來,代碼能看懂,就是自己不會寫,甚至連修改代碼局部的邏輯都不會

你需要從頭練習,從你能自己寫出來的難度開始,一點一點練


我跟題主正好相反,做ACM題的時候經常一發AC,過幾天再看就看不懂自己寫了啥


我剛學編程的時候也這樣。我的方法其實很簡單,應該也適合你,那就是先不要寫程序,先寫注釋,並且不要先考慮優化的事情,能實現功能先。

首先要建立一種理念,那就是寫出合乎語法的代碼是非常簡單,就像你看同學的代碼一樣,狗屁不會也能看出來他哪裡語法不對,所以最簡單的事最後再做,因為瞬間就能做完。

其次是靜下心來研究最基本的思路,不要管你的代碼是否優雅,演算法是否已經是最優之類的高大上的東西,先把課本上最基本的課後習題弄會,再去考慮高大上的演算法優化問題。

比如Boyer–Moore majority vote algorithm https://en.m.wikipedia.org/wiki/Boyer%E2%80%93Moore_majority_vote_algorithm。先不要上來就想寫for或者while循環之類的,先看描述,然後寫注釋:
//1,找個A存輸入進來的人名B,找個C計票數;
//2,如果C不等於0,如果A里存的本來就是B,那麼票數加1,也就是C+1,如果A里存的不是B,那麼票數減一;
//3,如果C等於0,那就把B存到A里,並把C加一;
//4,一直這樣搞,直到沒有人名需要存了為止;
//5,最後A里存的人名就是當選的人。

這時候,仍然不要急著寫代碼。比如你要搞明白,為什麼第三步里,把B存到A里時,C要加一呢?你一想,哦,B進來了,說明有人投了B一票嘛,所以C要從0變成一了。然後你補充注釋3為:

//3,如果C等於0,那就把B存到A里,並把C加一,B進來了,說明有人投了B一票嘛,所以C要從0變成一了;


就這樣一點一點,把所有想不明白的點都扣明白,都寫到注釋里,然後再開始寫代碼。怎麼寫代碼呢?

//1,找個A存輸入進來的人名B,找個C計票數;


A = B; C = 0;

這樣寫出來,肯定語法不對嘛。但是別急,你看看報錯,為什麼不對?哦,A沒聲明類型,什麼是聲明類型呢?就是得告訴編譯器,A是個什麼玩意,C也是一個道理,所以代碼變成了:

String A = B; int C = 0;

嗯,好多了,但是還是有錯,哦,B是什麼玩意,編譯器還是不知道啊,這時候你恍然大悟,B是一大堆要輸入的人名里的其中一個啊,我得一個一個存到A里啊。於是有了:

String[] arr_names = { "Jake", "Jake","slow","fuck"};

for($$){
String A = arr_names[i]; int C = 0;
}

嗯,好多了。for裡面寫什麼還沒想好,沒關係,回頭再補嘛,抄書總會吧?

(然而這個是錯的,錯的很蠢,但是你後邊用debugger就能知道錯在哪,並且知道為什麼錯了)

這樣慢慢慢慢一個字元一個字元的扣,最後一個奇醜無比的Boyer–Moore majority vote algorithm就被你寫出來了。你猜怎麼著?你竟然忘了吃午飯!而且一天都過去了!這就是編程的樂趣。

最後的最後,是雞湯時間。其實那些成績很好的同學,在最初學編程的時候,都經歷過這樣一個過程,無非是人家小時候就經歷過了,現在不需要經歷了,或者是人家爽的忘乎所以忘記吃午飯的時候,你在食堂邊吃的爽邊思考一會兒作業抄誰的好而已。

所以說,編程這種東西,想成癮是很難得,但是成癮了以後,你就是那個大神。

共勉吧。

(手機碼字,希望看到的朋友順手給個贊,謝謝)


謝邀,第一次認真回答問題。

我感覺大部分人在剛剛接觸編程的時候,都會遇到這種問題。

一門語言很少有人能稱得上真正「會」,基本語法會了一般就夠解決絕大部分問題了。

很多人不會寫程序是在於動手之前沒有考慮清楚,在寫代碼之前,你應該已經想好了大部分內容。

不是說軟體架構師要比程序員工資高許多麼,就是因為思路要比代碼重要的多。

至於思路就只能多做一些程序(前期可以參考,但到後面要靠自己)去鍛煉一下思維了。


這不當年做數學題的感覺么 特別是那種需要畫輔助線才能解決的問題


題主你還差最後一步。 看完別人的代碼,然後隔兩個小時然後背著寫一遍,能自己完全寫出來並且自己調試通過么? 如果能,這才叫會。


我看別人寫得小說(以及其它一切文章)時,也有這種感覺。


我自己不會寫小說,可是他們寫的小說我就能看懂。


所以,看懂是一回事,會不會寫是另外一回事。
加油吧,認真學吧,你能學會的。←_←


背不下來一堆堆的函數名,記不住拼寫。

如果是這樣的話,就用最基本的函數自己寫一個。

然後你就會開始做成本核算,是自己寫一個划算,還是背現成的划算。


會,但是不熟練
解決方法是多看多寫——這裡的「寫」包括「從頭照著寫一遍」


寫得太少


我覺得你是懂語言不懂方法,你需要深入學習計算機基礎課程比如數據結構、演算法導論、操作系統等等。

如果你一直學不會把實際需求抽象為計算邏輯的能力,那麼說明你不適合做程序員。或者說你只能做個搬磚的程序員。


同作為一個初學者,很理解題主的困惑。

其實作為一個基礎的小程序,也包括了語言,數據結構和演算法問題,所以能看懂但自己不會寫可能是有多重原因的。


以上學期給導師教CPP 的大一新生(非計算機學院)實驗課看堂經歷為例。

他們中大部分人都是能勉強看懂書上的代碼,但是自己把一樣的代碼敲進電腦就是跑不起來,更別說要自己寫的了,很多是比較低級的錯誤:

1.粗心,不熟練。如 i和1,0和o,=和 ==弄混。這可能與學校規定大一學生不能帶電腦,且都不是計算機專業有關,缺少練習。

2.不會使用合適的數據結構。畢竟他們沒有學過《數據結構》這門課,比如寫楊輝三角的時候部分學生不使用二維數組,因為輸出的三角形而不是矩形(囧

3.演算法問題。同樣也是沒學過,所以也就缺少相應的概念。簡單問題的時間複雜度/空間複雜度比較高,印象比較深刻的是一個統計一個給定字元串中每個數字,從0到9出現的次數,他先找出幾個0,再找1,2,......,9。

此外還有一些當初我自己剛接觸 CPP時也會疑惑的地方。比如函數參數傳遞方式,作用域,函數重載,頭文件 和 namespace 的作用等等。直到後來我自己看了《C++ Primer》,跟著書後習題思考,才漸漸明白。上課的教材薄薄一本書從基礎入門要寫到虛函數,中間必然少了很多比較原理的東西,只教你最基本的用法但是部分關鍵的「為什麼」並沒有告知,再加上缺少必要的練習就會困惑。

後來課上給他們安利了vector ,string 這些順序容器和《C++ Primer》,Visual Studio,告訴他們要想學好 CPP要從這些開始,還有很長的路要走。畢竟學姐是看了《C++ Primer》前14章,《Effective C++》,《More Effective C++》,《演算法導論》,《STL源碼分析》,刷了幾道LeetCode 後才能給他們肉眼 debug。(學渣捂臉

研二的老學姐站在講台上望去,滿眼都是自己大一的影子。


浮躁


作為一個初中學歷,現在掌握多門編程語言,也參加過一些商業項目開發的小程序開發人員。我希望以我自己的經驗告訴你這背後的原因和克服的方法。

1、先有期望才有學會的動力
我最開始學的是一門 Windows 下的腳本,我為什麼學習他,是因為我想自己製作一些工具和軟體,實現自動化安裝一些程序或自動化實現一些功能。有了這個期望以後,我才去研究和大量搜索這個腳本語言相關的知識,先從實現一個小小的功能點開始,比如先彈出一個對話框,然後一步一步順序的寫業務流程,最後再學習優化代碼和業務邏輯,去除重複代碼等封裝的操作。這是學習編程語言和熟練一門編程語言的重要過程。沒有期望,老師講的東西左耳進右耳出。現在有些教育機構做的不錯,以實際應用案例來給大家講解,這樣大家知道真實的應用場景後理解起來就相對容易,要做一個功能的時候也就知道從何下手了。

2、語言僅僅是工具,重要的是實現業務的思路
開始學習一門編程語言非常枯燥,但還是上面說的那樣,有了期望我覺得你完全可以打敗枯燥。一門編程語言的語法和自己學習新的其他國家的語言一樣,先從最基礎的學起,了解背景和歷史,這都非常重要。比如學習 C 語言你要了解計算機發展史等、學習 Web 開發語言要了解 Web 的發展史等等。但無論你學什麼語言,它僅僅是人創造出來的一種與計算機交流的語言,重要的還是你心中要清楚,你想如何與計算機交流,利用這門語言提供的什麼方法可以實現你與計算機交流的這個功能。深入思考、多與他人討論,你慢慢就會有思路的。

3、看別人如何實現某個功能的
看不懂很正常,不會做也是正常的,沒有誰上來就會的。老師天生就是教會學習如何學習的,學生天生就是要邊學邊習的,老師講一個案例,你應該融會貫通想辦法通過其他案例自己多做出幾種實現方法。當自己沒有思路時,現在的搜索引擎無比強大,按自己遇到問題的問題去搜索,大部分還是可以找到對應的思路的。遇到別人給出的解決方案,自己要把每一句代碼都理解清楚,做好示例代碼的備註,然後嘗試自己照抄來寫,如果不清楚複製粘貼過來,你一樣還是不會寫的。

以上就是我自己在學習編程語言過程中一些想法和思路,希望對題主有所幫助。自從我學會第一本腳本語言之後,再學期其他語言的時候都是一通百通的,僅僅需要了解其語言的語法和開發場景,業務的實現都是在自己腦袋裡面的。


我都不明白現在的人為何開口閉口就來問,然後花大量的時間去回復別人,去看別人的經歷或者他們的故事,這樣不是很浪費時間么?如果你連寫代碼的基礎能力都沒有那不就該多寫么?你試試一百多條回復,你挨個看一遍,要花多少時間?你還要評論,還要扯來扯去,不好還要吵架。


這是思維的問題,就是你不知道如何去解決問題。


推薦閱讀:

27歲IT孕婦女的我,難道真的就此窮途末路了?
為什麼有些行業仍在廣泛使用 1990 年代流行的傳呼機?
怎麼用中文設計編程語言?
瀏覽器是如何識別惡意站點並提示的?
怎麼看待鬥魚TV這段時間負面不斷?是鬥魚出現了問題,還是行業出現了瓶頸?

TAG:學習 | 代碼 | C | IT行業 |