為什麼計算機專業好多年了,就是學不會編程?
本人計算機在讀碩士,說來慚愧,本科沒有認真鑽研編程,也組團弄過ACM(無氣球)。運氣好讀了個985碩士,一直在努力學習編程,可是就是沒有解決問題的思路和編程語言的技能,總是踏步不前,真的很自我懷疑,傷人,怎麼才能改變這個困境,多苦多難我都能接受,只要能有所改變,希望各位高人指點迷津啊!
我相信很多人會有這個問題,我理解其根本原因在於學習編程和在實際場景里會編程解決問題有相當差距。比如你學習數學,在一定量的題海的輔助下加上理解原理和規律,就能開始解決實際問題,然而數學之實際問題也是習題為主,和日常生活並不大量相關。編程水平高,除了個別科學家,主要也是依靠題海戰,尤其編程屬於非常典型的工科,其理論知識和實踐的比率大概3對7,你需要大量練習。然而,在編程的學習過程當中,你會發現學習材料和習題嚴重脫離實際場景,這是由於大量的學習組織者他們不是一流的實際工作者導致的。這解釋了一個常見現象,書看過很多,上手什麼都不會。要解決這個問題,刷題是沒用的,acm也好,其他的也好。主要有兩個方法,其一是去正規企業實習或者就是和前輩組成工作室,從網上接一些項目練習。
主要的觀點就是需要大量實際生活經驗。
你不自己手寫幾百萬剛代碼,畢竟是不會懂的代碼是敲出來的,把書上所有的代碼敲出來調試。
每天上機3小時敲代碼,敲1000行以上,連續上機100天,就會有代碼條件反射思想,如同練打字一樣。
看開源代碼,調試開源代碼,有java,c,c++,c#,python比較多,把github上的優秀的代碼下載下來,構建好編譯環境,不斷調試,不斷看各個功能模塊,各個框架設計方案。建議搞個大的項目,如mongodb,hadoop,redis,h2,sqlite,這種帶通信,線程,存儲多個方面的代碼。
「取乎其上,得乎其中;取乎其中,得乎其下」,要學就學好的項目。java的開源項目比較容易看懂,oop相對規範,風格相對統一,容易調試,可以看一下java開源最大的apache基金會的項目。在java中Apache的頂級項目影響力遠超國內大公司,國內大公司多是開發自用應用軟體,軟體開發以通用基礎件水平為高,國內水平上相對要差一些。Welcome to The Apache Software Foundation!。
如果你對c/c++感興趣,可以下Redis,SQLite,LevelDB,Memcached,Nginx的源碼,這幾個項目代碼行數很小,有的不到2w,但代碼功能很強大,是代碼中的精品之作。
如果你覺得英文閱讀不行,我以前也和你一樣,我後來是花了10元錢買了一本紙質的英文詞典,約1w-1.5w詞左右(太厚了不好拿,背起來也吃力),放在枕頭下每天早上起來背一些,日積月累,看英文文檔也就不會很吃力了,看英文關鍵是要認識單詞,我只是學單詞不學口語的,因為我又不出國,學了用不上的東西也是浪費生命。可以搜索下載一些apress等幾個英文出版的英文書看看,它們的pdf有目錄。另外別一定迷信老外的東西,老外的東西只是外國比較多,能傳播的是精品,所以你看到的全是精品,平均起來一國也沒多少精品,很多應用軟體需要漢化改造後才適合習慣使用,這就造就了很多本土公司。
如果你編程時有的領域覺得數學不行,或是編程和數學無法聯接起來,或是對CRUD要改進,建議你看數學手冊,如數學辭海之類,數學手冊對整個數學知識系統有個整體了解,有的數學手冊有專門的計算機數學篇章,知道出現了什麼樣的問題,屬於數學問題,可能你解決不了的問題數學上早就有解決公式,你可以不知道很多數學公式的具體含義,但需要形成整個數學知識體系,這樣編程時遇到難題不至於被嚇倒,知道什麼樣的問題用什麼樣的數學方面知識可以解決,很多你需要解決問題的知識實際上隱藏在各類不同的數學學科中很深。數學是人類知識的精華,不用白不用。我想你想破頭也想不出歐拉公式。有時記憶下數學知識大綱比學習整個知識點在解決問題時要有效得多,大腦在搜索這類知識時就有了地圖,有了戰略方向。如我在分析數據時發現很多在數據分析轉換成小波信號後特徵很明顯提取,在計算NP問題時有規劃演算法,群智能演算法等多種,四元數可用於坐標變換,樸素貝葉斯,SVM可用於不同場合分類,斯特靈公式可計算n階乘近似值,很多決策問題是運籌數學裡的知識,有的程序適應性可以設計成PID,遺傳演算法可以和並行演算法結合,卡爾曼濾波演算法解決噪音,深度學習演算法可以識別類似圖片等。對於太hard的問題,可以想辦法用第三方解決,東西是死的,人是活的。
選好別人的做好的軟體,把這個軟體的功能分析成詳細的需求說明書,一條一條的,再一條一條做項目,不斷優化項目,爭取功能做到一模一樣。當年張大千就是靠模仿別人的畫來提升功力,最後能以假亂真。
對語言和框架熟悉後,拔掉網線開發,效率提高十倍。
程序員看到一款軟體,總是在想這個軟體的框架和演算法是怎麼實現的,美工看到一款軟體,總是在想這個軟體的風格設計和ps圖片是怎麼處理的,銷售看到一款軟體總是在想我怎麼才能把軟體賣出去賺到錢這個軟體的推銷亮點是什麼,老闆看到一款軟體總是在想這個軟體需要多少投資能賺多少利潤。所以你不能站在一個學生的角度,只是了解片斷代碼的功能,而要對整個軟體設計工程,軟體的社會環境有個整體了解,這樣編程時才會恰到好處,否則沒有標準不知菜要炒幾分熟才是好的,無法從整體上把握。
一個英文詞典+數學大綱+Github+Apache+機械鍵盤+電腦+大屏顯示器+茶杯,夠了。資本論中看到從事別的職業,買得起生產資料的都是資本家,OK,生產資料大家都買得起,關鍵是從商品到貨幣的「驚險一躍」。
謝邀。
理解你的心情。
你說在努力,我不知道你通過什麼方式努力的,但我猜你應該沒有獨立完成過一個項目吧。
1. 首先,編程不同於解數學題, 不是題海戰術可以解決的,編程的過程也不用經過一步步的推理演繹換算論證,編程在某種意義上比解數學題簡單多了,也比它有意思多了。編程好似造房子,腦海里先有個房子的大體輪廓,然後再按照思路一磚一瓦加上去。
2. 鍛煉編程能力最有效的方法是自己動手寫,而不是停留在看書做題,也不是總看別人的代碼。
3. 很多人認為把編程語言學精通了,把框架搞明白了,把所有理論知識準備齊了,才可以開始寫代碼,那你就錯了,寫代碼的過程也是鞏固知識的過程。
4. 還有很多人認為一定要先把數學學好,把數據結構與演算法學會,才可以開始編程,那你又錯了,很多工作了多年的程序員,寫了多年代碼,根本就沒涉及或者很少涉及到演算法和數學。我想很多編程初學者的興趣和自信心都被扼殺在這一步,這兩座樹立在面前的高山,擋住了許多人繼續下去的勇氣。
數學和演算法不重要麼?重要,你大可以在編程的過程中去學習它們,又或者有的時候根本不用專門去學習,因為只有在某些情景下才需要用到複雜的演算法和數學知識。
(這一段目測會被某些人噴)
假如你是絕頂聰明的高手,具有強悍的智商和邏輯思維能力,那麼你可以從數學和演算法學起,我沒意見相反很贊同,但這裡我針對的更多是像我一樣一看演算法腦袋就炸了的擁有普通智商的普通人,根本就沒必要從演算法學起,試問,做個計算器需要複雜的演算法么,需要知道什麼是NP難么?
5. 前面說這麼多,只是想告訴大家,儘快的動起手來,編程沒想像中複雜,也沒想像中可怕,可以說基本沒什麼壁壘。基本上語言學個七七八八,裝個開發環境,就可以開始了。
6. 先從簡單的開始,比如先在控制台寫個一個函數就可以實現的功能,接下來學習類庫和框架寫帶界面的,然後寫多線程的,再然後搞個帶網路通信的,接著弄個帶資料庫的。。以此類推,以最終功能導向去學習涉及到知識。
7. 編程實際的過程就是,編程語言+類庫+API+框架 作為骨架,計算機理論知識 (如網路,操作系統,資料庫,演算法等)作為血肉,來構建一個豐滿的實物的過程。
8. 語言這麼多,方向這麼多,選哪個?隨便哪個都行,任選其一,把它做好,就很了不起。
9. 總結:儘快動起手來,騷年~~
99年,我被招進了hw,做操作系統。
即使大學期間做過商業項目,首次面對幾百萬行c代碼時,也是蒙圈的。
前2年,我只編了2000多行代碼。這2000多行代碼,還編的我戰戰兢兢,生怕出了版本事故,吃不了兜著走。(OS任何一行代碼崩潰都可能導致整個電話交換機停機,停機什麼後果hw的人都懂)。
雖然編的不多,但我看了多少行代碼呢?
整整50萬行!
是的,我把整個操作系統源碼都看了一遍。看完的結論是
這特么誰寫的,怎麼可以這麼NB!
不但性能極高,代碼還非常少。你一看就懂,但你自己絕壁想不出來要這樣寫!
可是想不出來,不代表我不能模仿啊 。(^……^)
後來,就進入了模仿模式。當然不是簡單的模仿,是在理解精髓的情況下靈活運用。什麼時候用表驅動,什麼時候用狀態機,什麼時候用資源池……
所以,題主明白了嗎?
"點亮技能樹,你得有基礎技能啊!"
我學歷沒你高,估計智商也沒你高。我這麼資質平庸的人都能hold住OS級別的代碼,你也一定可以的。
多看,多接觸商業項目,多練習,你一定可以度過這個門檻。
加油!編程是「以戰養戰」的成長過程。最重要的是,要設定一個實際問題,用你所學的語言和技術去實現它,比如自己從socket api開始,寫一個http伺服器,類似這種,一定要不斷去解決實際問題,以戰養戰,在實戰中成長起來。
拿學數學舉例子吧,對大多數人而言,學數學的時間也不短,好說歹說也有十年了。但是依舊有很多人學不懂數學。之前有一段時間我認為我自己某些課程學懂了,結果過了一陣回頭一看,發現之前並沒有懂。然而對於一些人來說,可能學過一遍就能夠真正理解這門課程。因此,學習的時間長短並不能表示一個人掌握了這門學科。
無論是CS還是數學,都是需要在實戰中練習的,編程的話最好就是在實戰中練習,通過做項目,了解業務的方式鞏固之前所學的知識點。數學的話就是通過做科研,做了科研才知道是否掌握了以前所學的東西。評價一個人的方式永遠都是做出來了什麼產品,做出來了什麼樣的科研難題,而不是評價這個人讀過多少本編程的書籍,讀過多少門數學課。
實踐才是檢驗真理的唯一標準。
先要自信,後要動手。
簡版答案:因為你沒有熱愛、努力、訓練,詳細版如下(我把我知乎專欄的文章搬過來了)
原文在:我知乎專欄
我認為最重要的有三點
- 熱愛
- 努力(多做項目,每天學習編程 5小時以上)
- 解決問題的能力
這三點保證了其次最重要的就是
- 選好方向(深度和廣度都得保證,最好是80%時間專精保證深度,20%時間來涉獵各種知識保證廣度)
- 學會思考
1. 熱愛
編程這麼有趣的事,竟然還有錢賺 (by c++ 之父)
這個幾乎是最重要的,我見過的所有大牛都是都編程無比熱愛。
我大一也迷茫過,「編程是我所喜愛的東西嗎?」,我花了一年時間來確認並給了肯定的答案,現在我非常喜歡寫 優雅的代碼,順便喜歡技術帶給我的 能力、自信、錢。
然後選擇方向上,最好由你的興趣決定,follow your heart
2. 努力
熱愛和努力往往決定了你在編程的路上能走多遠。
第一點做到了,這一點應該是順理成章的。
其中最重要的是,要 learn by doing。也就是做中學,多做項目,非常重要。讓你寫的程序從100行到1000行,再到萬行,就好比看著你創造的城市在一點點的擴大,當然要確保代碼的優美,時刻思考,不然那不是城市,而是垃圾堆。每碰到一個問題,解決它並思考它都可以讓你受益匪淺。
還有就是看書,仔細閱讀一本經典的書(做筆記、寫博客、思考、把理論付諸於實踐),勝過看十本普通的書,一百本爛書。所以選書很重要。練習、思考更重要。
總結一下,努力就是我後面說的 基本功 和 熟練度 的積累過程,記住 量變導致質變
3. 解決難題的能力
這個複雜一點,是程序員的 核心競爭力,我覺得解決問題的過程無外乎三點
- 透徹理解問題是什麼
- 弄清導致問題的根本原因
- 尋找最佳解決方案
有一種說法是面對 谷歌編程,面對 stackoverflow 編程,其實當你把這三點弄透,你就知道為啥了。你搜索之前應該弄懂前兩點,看前人的經驗來完成第三點。所以根本不是谷歌幫你編程,而是你在使用谷歌這個工具,最關鍵的還是你自己,不同人用谷歌搜索的效果是天差地別的。英文搜索質量遠高於中文搜索。
搜索的思想和谷歌技巧 SimplyY 的博客:如何用好 Google 等搜索引擎
除了搜索的技巧,基本功、熟練度、膽量 也很重要
基本功
- 當然基本功很重要,不然你不可能真的能理解問題,比如你不會數據結構,然後面對這方面問題,肯定是一臉懵逼的。
- 說白了,當你真的懂了一個問題,問題的答案就是呼之欲出的。而透徹的懂一個問題,需要你對這個問題的方方面面有一定的了解和思考。
熟練度
無他,為熟能爾 (by 賣油翁)
量變導致質變,當你解決了數千個問題後,谷歌了上萬次,你會發現你再用谷歌,就是一目十行,眼睛跟老鷹一樣,瞬間就鎖定到了答案。
膽量
對於新手,編程學習的路途中有個膽量問題,對於絕大多數人這個問題還很嚴重。
- 谷歌不會,翻牆好難
- 英文好多,英語好難
- 自學好難,代碼、編程書看不懂,編程好難
- 這裡出 bug 了,debug 好難
- 做項目好難,我不敢寫有趣的項目
我還是 qq 問一下別人吧。
於是海量的伸手黨就出現了。
其實說白了,就是,大家都沒有解決這個問題的膽量,都不敢自己一個人去解決問題,總是在自己的安逸區里活著,雖然這是共性,但是一定要有意識的克服,不然你會一直沒有進步。
記得有人說過這樣一句話,在公司上班,假如技術上的大問題來了,而你沒有膽量去解決,而是總是交給別人,ok,別人就會一直進步,最後成為你的主管,你的大主管,你的大大主管,而你原地踏步,說不定還會被新來的淘汰。
並且,沒有膽量熟練度就無從談起,做有趣的項目就無從談起,你學的所有基本功就會持續荒廢,學而不用就會怎麼樣?忘記!
所以膽量是編程入門的 基石。
方向
深度和廣度都得保證,最好是80%時間專精保證深度,20%時間來涉獵各種知識保證廣度
選擇方向上,很大一部分是取決你的興趣的,你對演算法感興趣 or 工程 or 數據 or 優美的代碼,這個要慎重選擇,我花了半年時間才選擇的,多了解、多嘗試,發現自己的興趣點,再為之努力,潛下心來學習,挖深領域。
具體怎麼學
谷歌搜。
具體怎麼學編程 也是一個 待解決的問題,我的經驗就是看書、做項目、多思考,但是對於不同方向 具體細節是不一樣的,答案知乎、論壇里很多很多,學會如何高效學習是一件很重要的事情。
最後: 總結一下非常重要的東西
- 熱愛
- 努力(學會自學)
- 解決難題的能力
- 基本功
- 編程能力:語言語法、debug 能力、寫優雅的代碼、數據結構、演算法
- 底層知識:操作系統、計算機網路、編譯原理等
- 各領域特定知識:根據你的方向來
- 熟練度
- 膽量
- 工具(君子生非異也,善假於物也)
- 英語 非常重要
- 搜索:谷歌(學會用英文搜)
- 社區:github、stackoverflow等
- 各類英文文檔:MDN、dash(osx 專屬,全平台文檔利器在這裡 http://devdocs.io/ )
- 成果
- 紮實的基本功
- 多寫幾個有一定規模(純代碼量 3k 行以上)的有趣的項目,最好都發布在 github 上
- 等(看完十本經典編程書?)
http://devdocs.io/ :
關於大學裡怎麼學好編程,我回答了不少大學生學編程的題目
so,大家直接翻我之前回答吧。
沒關係的,說說我大學時候的經驗吧。1.刷題。當時我們學3門語言,c,c++,java。所有的例題,課後題,都自己寫一遍,不看書,只看題目,就當高中做題一樣,有bug調試,遇到不懂的查資料,寫完後驗證邊界條件,然後跟書上的答案比較一下,看看書上用的什麼思路,最後寫點記錄,就跟錯題本差不多,每天看看。建議細細地學習演算法書,每個題目都超級超級有意思,用代碼實現是非常好玩的。這個過程略痛苦,但是如果要打牢基礎,這個還是很有必要的。額…一家之言。2.做項目這個要是沒項目可以在網上找歷年的畢設題目,以及設計實驗。比如做個網站,當時我記得我做過一個很吊的東西,把華為的ensp和wireshark聯繫起來,模擬網路實驗,很有意思,做完成就感老高老高了。你可以做一些app什麼的。3.就可以做一些自己喜歡的東西了當時我想寫小說,但是word用著很不舒服。。就是感覺不舒服。。。。。沒別的意思,自己感覺哈。然後我就自己寫了個差不多類似於文本編輯器的東西,規定了小說的格式,很有成就感~總的來說,還是毅力,興趣,時間。三者必不可少,我永遠都忘不了自己當年調試了一周的bug只是文件格式不對,忘不了實現野人過河遊戲的激動,以及每天十幾個小時的編程時間(那幾個月,月消費不到300。。。一學期花了差不多1000塊錢,也是一種回憶了)
謝邀。
上面的高票答案已經答得很好很好了。
如果一定要我說點啥的話:少看點書,多練。
原諒我矯枉過正。
如果我推薦你找個老師培訓一下,一定會被噴。
但是去培訓是對的。
國外的編程訓練營不少常青藤學校畢業的人。花錢向別人請教沒什麼不對。說真的,編程這事不是所有人都適合,如果都參加過ACM拿到985碩士這樣的底子都學不好編程,那還學它幹嗎?
換一個自己擅長的努力方向吧,強求自己去編程,不光耽誤自己也耽誤別人。實踐!
學以致用。
多擼github,多上stackoverflow.
我學習編程比較晚,但個人覺得進步還是比較快的。 現在一條腿在門內,一條腿在門外。談一點我的一點想法,也就是妄答一下。
首先要掌握基本的計算機原理,然後學習一門語言。懂了計算機原理和語言,有台計算機,理論上就可以自己造輪子了。我們學習編程碼那麼多代碼,本質上不就是自己在造輪子嗎,只是很多時候是模仿造和參考造而已。學習語言的時候,先找那種簡單的體現語法但是不包含業務知識的例子。有些例子包含了作者自己所在行業的業務知識,是不好的。看了別人的例子,舉一反三,自己寫自己的例子。這樣語言學習入門快。入了門以後,就可以找一些好的入門書體系化一下,就基本掌握了這門語言。
掌握語言之後,將學習數據結構與演算法和編程結合起來。這個裡面很重要的是要多想,寫寫畫畫。任何一種數據結構及演算法的出現都是有它的理由。需要我們去弄懂設計者或曰發明者的思路。弄懂了思路之後,自己去實現這種數據結構或演算法。因為已經掌握了編程語言和計算機原理了呀。這個過程,有時不是一蹴而就,就要去思考解決出現的問題,輔以查資料和閱讀他人的代碼。因此,還是建議盡量學好語言,不然實現數據結構和演算法時太痛苦了。如果語言溜溜的,數據結構和演算法的思路也釐清了,自己實現了數據結構和演算法的天才感是很強的。這樣的話,就自己實現了數據結構或演算法。最後,就是總結了。主要還是思路吧。過了很長時間,看自己寫的東西是最適合自己的。
對於編程實際開發方面的。我的經驗也不多。但都是能把實際問題解決了。雖然效率和優雅性和大神比是很渣的,不過,有一點是重要的。那就是對實際問題本身的理解很重要,之後才是借用計算機技術和編程去解決它。面對一個搞清楚了的問題,自然會形成自己的思路。在這個過程會調用到平常學習的那些模式,就是套路吧。然後參考下別人的思路。有了思路就有了解決方案。一個解決方案中,不管是自己的還是參考別人的,都會有一些小的疑問,一些平常的問題理解起來不難,搜一搜看看別人的解答也知道了,但有些關鍵的點,是需要計算機基礎知識和數學的。這個時候就把人給區分開來了。不管別人怎麼說,我還是認為數學和計算機基礎非常非常重要。關鍵在於,不能學好了再開始編程,而是邊學邊做,在做中學。在實踐中去體會和深化。
貼一篇我去年寫的博客,裡面有我學編程的感悟。
批量修改字幕文件中的時間,c語言實現 - CGGUANG的博客 - 博客頻道 - CSDN.NET你雖然在學習具體編程上遇到了一點暫時的困難,但是你絕對有值得我學習的領域,在那個領域裡,我又成了小白,你又成了前輩或老師。這個原則適用於所有的提問者。
還要多閱讀別人的代碼。這一點我做的很不好。可能像現階段的我半吊子是自視最高的吧。我強調的是:
不僅要多寫,也要多想。寫也是驗證自己的想法的過程。多想,但不要想多,心中有點譜就要開始編程,邊做邊想。實在沒搞清楚,做不下去,就停下來,再想,輔以查資料閱讀他人代碼。等想清楚了再動手,是屬於一定級別的,不是學習階段的。
貼一下我認同的或參考了的回答鏈接:
為什麼計算機專業好多年了,就是學不會編程? - 知乎為什麼計算機專業好多年了,就是學不會編程? - 知乎為什麼計算機專業好多年了,就是學不會編程? - 知乎為什麼計算機專業好多年了,就是學不會編程? - 知乎為什麼計算機專業好多年了,就是學不會編程? - 知乎為什麼計算機專業好多年了,就是學不會編程? - 知乎知乎的回答 引用竟然現在沒了答者後綴了,看來是個bug
編程能力,並非語言決定的。
而是由程序員解決問題的抽象思維能力決定的。程序能解決的問題,都是理論上人能解決的問題。如果你缺乏這種能力,或者難以對問題進行抽象或轉化成等價問題,那麼對編程語言本身的了解並沒有什麼幫助。建議不要好高騖遠,先從一個簡單到無法再簡單的需求開始,自己獨立完成項目,並對其進行迭代。好多人把編程當作一門知識去學習,那是肯定學不會的。因為它只是門手藝,算不上知識。
所以不要試圖通過看書就想學會編程,手藝嘛,熟能生巧,多做就可以了。從來沒聽說過學打鐵的可以通過一本書能把打鐵學好。
那編程完全不需要知識了嗎?
顯然並不是,編程的知識和編程入門關係並不大,是在你手藝入門之後才需要關注的東西,是你之後能不能走的更遠的保障if(代碼寫得少){
多敲代碼;
}
else{
改行;
}
剛剛拿到一份易語言寫的物流管理系統源碼,看的雲里霧裡,這源碼作者跟題主簡直就是兩個極端。
推薦閱讀:
※為什麼 .NET 就業市場不大?
※25歲,如何職業規劃?
※C#好還是JAVA好?
※SpringMVC的工作原理是什麼樣的,跟Spring的關係是怎麼樣的?