怎樣學會編程的思考方式?
我是一名即將大一升大二的學生,
專業是信息與計算科學,主要是學數學以及計算機的課程。
我比較喜歡計算機的課程,至今已經學了C和C 。
但是,有一個問題很困擾我,
就是我覺得自己根本就還是沒有編程的思想,比如說,
我可以看懂別人的代碼,
但是如果要我拋開書本自己完完全全寫代碼的話,我根本就沒有任何的想法和思緒。
所以,求高手幫忙解開我的困惑,謝謝!
1.畫流程圖,編程第一步的思維是流程,先做什麼,後做什麼,那部分要重複做。
2.畫類關係圖,這個需要一定的抽象能力,但是對大學生來說,還是比較簡單的,就是那些是共有的那些是私有的,那個是父類,那些是子類okay,什麼是編程的思考方式。你要先明白。寫程序是一個類似做數學題的過程。是一個將具體問題抽象成問題模型再研究相應的演算法加以解決的過程。
於是你主要需要的思想就是具體問題抽象化和抽象問題具體化的思想。
怎麼學會,這就看你從小到大接受的數學課的教育達不達得到那個水平了。
至於未來的演算法啊什麼的,都是在這之後了。
先從簡單的開始,先從用演算法解決數學問題開始,然後再往實際應用上來靠,會感覺輕鬆一些。
實際上,在大學之前的信息學競賽教育中,都是以演算法為重,而不怎麼和實際掛鉤的。但是學會了抽象化這個思想之後再和實際聯繫的話就很容易了。
問其所以然。不要停留在問what上,試試問問why,然後去找到答案。
編程其實是邏輯的體現,而最終的目的是實現需求,就像你要證明一道空間幾何題,最後都是要證明出結論,而得出結論的方法可以各種各樣,坐標、畫圖等等,這個證明的過程就是你邏輯處理的過程,你現在欠缺的就是如何把一個具體問題如何抽象成編程過程,這個只能靠自己多想多寫,這個轉換過程是編程的基礎,只有掌握了這個基礎,你才能算入門了,接下去就是如何掌握更好的轉換方法,這就是設計模式了,不過你估計還沒到這個程度,所以先一步步來吧
我覺得樓主的問題可以分成兩個部分。第一個部分:為什麼看了很多的代碼,但是自己編不出好的代碼? 第二部分:怎樣培養良好的編程思想?
第一個部分:1)養成從問題出發的習慣。先看看別人解決的是什麼問題,根據問題,自己構思解決的辦法。如果通過自己的努力解決了該問題,就比較自己的演算法和別人的演算法的優劣。這樣就能夠建設性的吸收百家之長。2)願意花時間和精力去專研。如果少了這一步,很難說得上能夠學到什麼。
第二部分:1)學好數學,尤其是數學建模。建模能力的提高可以幫助自己想出合理的演算法來解決問題。2)學習系統觀。經常用系統的思維方式來考量自己想要解決的每個問題。
久而久之,我相信,能夠提高自己的編程思維,也能夠根據特定問題寫出好的代碼。
簡單談一下我自己的體會吧。
思想的建立肯定不是一時的事,是一個時間的積累。但從我學習java的過程中發現,雖然是時間的積累,但也需要一定的悟性。佛家講究漸悟,和頓悟。從這個角度看編程思想的建立一定是頓悟得來的,但是如何頓悟呢?
這一切就要從面向對象入手,理解並建立面向對象的思想對於一個程序員來說是絕對重要的,面向對象是什麼?面向對象是一種對現實世界理解和抽象的方法(百度百科)簡而言之,程序其實就是將現實世界用計算機語言描繪出來,然後交個計算機運行。這一個描繪的過程就是抽象,而對抽象出的對象的操作,就是面向對象。
例如:C語言是一種面向對象的語言(對C語言了解不多,一下只是自己的理解)他就好像是一個剛剛創業的人一樣,一切的事情都要自己做,財務、人事、公關等等等。而Java這類的面向對象語言,是一個已經有一定規模的公司,裡面有財務部、人事部、公關部等部門,而作為老闆只需要對各個部門進行指揮,而不用再去處理這些業務的細節。這就是我理解的面向對象。(為了不把回答寫成面向對象 與面向過程的對比,以下只寫一些面向對象的思想)
那麼,面向對象的思想就要求程序員必須有很強的抽象能力,我們必須要把我們所看到的東西抽象出來然後對它進行操作:再舉例:
西門慶調戲潘金蓮,首先這個動作里有兩個類,我們要先用語言表示出來,已提出潘金蓮與西門慶很多童鞋的腦海里肯定會有一個圖像感,潘金蓮光著屁股。。。(扯遠了)在腦海里的圖像也是一種抽象,但不是我們要的。我們要的是用語言表示,而一個人說來簡單,但是信息量是非常大的我們不可能抽象出全部信息,只需要取出我們需要的信息,在這句話里,西門慶的主要屬性是name 還有一個 調戲的方法在這命名play吧。而潘金蓮也是有一個name屬性,當然被調戲還要有一個反應的方法命名為cry,ok現在我們已經抽象出來兩個對象。我簡單用java表示一下
public class ximen{
private String name;
public void play(Pan pan){
pan.cry();
}
}
public class pan{
private String name;
public void cry(){
System.out.println("西門大官人,不要啊");
}
}
好了這就是我抽象出來的類,於是main方法只需要創建對象,並且調用對象的方法,就完成了調用,在我初學編程語言的時候一直不能正確的建立思想,原因大概就是自己的想像力太豐富了,本來嗎,西門慶調戲潘金蓮這麼有圖像感的事怎麼就這麼幾行代碼就寫出來,看著當時就軟了,其實程序就是這樣或者說抽象就是這樣,我們會忽略大部分東西,而提取出對我們有意義的屬性或者事件,比如上述例子中,我們沒有抽象人的性別,身高,三圍等等,因為這些我們不需要。對於方法來說,我們沒有去表現調戲的細節而是用兩個方法,一個是調戲的開始,另一個是調戲後潘金蓮的反應。先寫這麼多吧,這就是我對編程膚淺的理解,希望能幫到你一點
多編程。把教材後面的所有練習題都上機寫一遍,就有編程的思考方式了。
個人覺得問題可能是沒有將編程與某一領域結合的緣故。也就是按樓主說的,樓主目前水平是到了已經熟練掌握c/c++的水平。此時再學c/c++本身沒什麼意義,因為基礎知識就那麼一點。而應該做的是要結合某一領域的知識,再繼續學習。在這個學習中自然就有了「編程思想」,比如去研究linux下的系統編程,去研究別人的代碼,理解別人的思想。這樣慢慢就會有了linux下「編程思想",總之個人覺得,樓主可先不要太在意有沒有」編程思想「,而是應該考慮下自己的興趣是什麼,然後找一個相關領域(比如:linux下的嵌入式開發、linux網路編程、win32編程,等等太多了,都可以)深入下去。在這個過程中再去尋找」編程思想「。
敲完100000條後再看。
1、動手做。千萬別光說不練,看了一堆的書沒寫過1萬行以上的代碼;
2、在實踐中再總結;
3、適當看一下軟體工程、敏捷、當然還有面向對象、設計模式等等書,但是你現在別沉迷進去,還是得在實踐中總結。
量變引起質變。
其實不困難,按照書上最簡單的完整的例子,跟著他的步驟來完成一個完整的程序
不管你是完全照著書一個一個敲,還是瞥一眼就能搞定。
然後,思考 為什麼在這一步需要這樣做,目的是什麼。
這種寫法,模式是什麼,可以用在其他的地方么?
帶著 思考 從最簡單的小程序開始,由小及大。
你才大二,有的是時間。
另外,多和同好(不一定是同學)討論,一個人容易陷入思考泥潭。
佔個位 我成大神之後再回答這個問題 (傲嬌臉)
問題抽象很重要啊。。。
將問題進行抽象,用計算機的結構和邏輯來對現實世界及業務關係進行建模本身就是編程最困難的部分,也是軟體開發的複雜性所在。多練習會有很大的幫助,經驗很重要,面對困難不要放棄
要學習分拆,以大化小,以繁化簡單的能力....
然後再訓練自己有從小觀大,的全局思維能力...
推薦閱讀:
※你什麼時候對 Erlang 感到絕望?
※作為程序猿,能為自己最喜歡的編程語言做些什麼實質的行動?
※各個編程語言都有哪些「黑點」?
※C++17 有哪些值得注意的新特性?
※你是如何自學 Python 的?