自學編程十年,依然沒有編寫出過什麼有用的東西,想知道下一步怎麼走?

95年第一次接觸計算機,從小學開始學習dos、wps和QBasic,學學忘忘,沒什麼感覺。2003年(初中一年級時)家裡有了電腦,開始自學編程,從QBasic開始。很快轉開始學習VB和Delphi,沒有網路,到電腦城購買盜版光碟,別的同學都買遊戲,只有我買程序開發的軟體。16歲(2005年)折騰裝機和操作系統,開始學習Linux,給自家神舟電腦上安裝了紅旗、RedHat。高二一年把電腦報出的《編碼魔法師delphi入門實戰》從頭到尾打了一遍。高考,因家人強烈反對報考計算機專業而學習了材料(有不少親戚在北京搞it,家人覺得他們過得真心辛苦)。高考完成的暑假,賣出了收集7年的電腦報,廢紙賣了300多。大學讀書第一件事就是加入計算機協會,並成功在半年內成為協會主力,成為社區網管。並自學C語言,把清華大學那本數據結構學完,把《windows遊戲開發大師》學完,準備考研計算機。後來家人幫我找了其它學校的大牛導師~~還是材料。瞬間沒了沒有複習考研的動力,複習數學時光想著演算法之類,走到圖書館就直奔計算機科學的書架,沒有考上研究生。建築企業工作一年,一邊工作一邊學習VBA,寫了不少小工具。再次考研(還是材料),考公務員。都考上了,現在工作,跟編程沒有一點關係。9月去讀研,跟編程還是沒有一點關係。

目前開始自學C#。2013年了,正式自學編程快十年了,可是回頭看,自己什麼也沒有編寫出來過。不知道是不是自己真的沒有天賦,平時別人在玩我都在學習,比計算機專業的同學學習還是要努力一點。可能主要是學習時間不連續吧,從來沒有渡過從新手到熟手的平台期。不求自己能夠變成多麼厲害的大牛,只求真正進入編程的大門。

這些年學習過:C(也是學得最好的,寫了15k行左右的代碼吧,主要是書上的例子),python(學到面向對象那裡學不下去了,各種帶有對象的例子都看不太會),C++(也是面向對象很難理解),Delphi pascal(初中時學的,寫了2k左右的代碼,上高中後放棄),Matlab(處理一些數據,用得不多),VB(學得第二種語言,用得不多,),VBA(常用,做統計與數據處理工作,非常方便),VBS(配合VBA實現一點自動化);正在學習C#(目前在跟對象較勁,但是只看類圖還是什麼實現不出來,沒有流程圖很難實現類的方法),用書是《Head First C#》和《Beginning Visual C#》。

知道點html,css,對網路、javascript無愛,懷念單機時代的軟體。

最好有達到有能力編寫「聖劍英雄傳」一類的小遊戲,或者有能力編寫出PyMol一類的專業程序。有生之年有可能嗎?

(英語不成問題,已經開始大量閱讀原版書。我的問題是,不喜歡看電腦屏幕,喜歡看書。總是把代碼先寫一遍,再在電腦上輸入,以減少用電腦的時間。)

———————————————————————————————————————

發現「身為一個基礎學科的研究生,你是如何提高自己的編程能力的?「這個問題更適合自己的現狀,作為一個非it從業者,我需要用編程解決現實的問題,只有在解決現實的問題中才能真正提高自己。


你的問題在於沒找到一個「正確」的道路。

你所學習,所投入精力的方向與你想要的方向其實並不大相同。也就是說,你想去超市,結果逛到了書店。

你現在的水平,說句不大好聽的,和你十年前沒有任何區別。

小的時候學學這個,學學那個,買本編程書從頭敲到尾。這當然沒人說你什麼,甚至你那麼小就開始編程而不是玩遊戲大家還會稱讚你。但你想想,自己現在是不是也還是這樣。只不過把Delphi換成了C#,VB換成了VBA。

我不大清楚你的「學完」是指什麼。看完所有章節做完所有習題?還是自己動手寫了所有常式?感覺你這種說法和知乎上一個著名的問題大學兩年讀了大概 200 本書,為什麼感覺讀書的價值還是沒有體現出來呢?差不多。就像你小的時候裝上了Linux,是不是過了段時間發現用得最多的還是Windows?再過段時間發現Linux都好久沒啟動過。

就拿C#來說。以你的基礎,學會語法用不了一周的時間。這時候你可千萬別說學完C#或者學會C#了。距離「會」還差的很遠很遠。這門語言提供了各種機制來滿足生產需要。想要把這些東西都了解了都要花幾周的時間,更別說融會貫通了。知道是一回事,會用是另一回事。你如果沒寫過需要幾十個類的項目,恐怕很難體會到「面向對象」和「設計模式」的重要。更別說那些匿名函數之類的,了解會用很簡單,但知道什麼時候用,怎麼用就很難了。

不是所有努力都會有好的結果,關鍵是找對方向。你說你比計算機專業的同學更努力。我相信你在編程上花了更多的時間。但他們的優勢在於會被學校逼著學習更多的內容。雖然他們沒有努力,但是走的是一條更專業化的道路。這條道路是教育部規定好的。自學一定要有人指導,不然很容易走上民科道路。

編程不是目的,而是工具。就像你不會為了開車而學開車,你開車肯定是有目的地的,這只不過是一種交通方法。編程也一樣。當做興趣學學沒什麼不好。學一百種語言也無所謂。

千萬別學一百種語言,只學會了Hello World的一百種寫法。

至於項目什麼的,只要你想總還是會有的。有可能Github上的項目對你來說有點難,你可以自己寫寫。比如寫個貪吃蛇之類的。這東西總有個過程。

另外,把代碼現在紙上寫一遍不是個好習慣。你可以用紙畫設計圖,可以算公式,可以設計繼承關係,唯一不能幹的就是在紙上寫實際的代碼。不然你的思維將永遠被限制在紙上。你想想一千行的代碼你要怎麼拿紙寫?你可以寫幾十頁,然後敲到電腦里,關鍵是你會這麼做么?恐怕你寫到第五頁就已經控制不了整個結構了。你要是連分支循環都在紙上寫的一清二楚,你還是扔掉紙,面對電腦吧。


不要想著為了做事而做事,為了學習而學習,用程序解決你真實想要解決的問題,這樣你就會覺得自己做的事情有意義了。

考慮一下,現在的軟體,什麼讓你不滿,你最需要什麼功能?如果你有強烈的需求跟動力,就開始去做。

從這個角度,初學者使用開源操作系統最合適了,因為這個系統中任何一個環節,你都可以開始動手修改。


題主要想一想自己到底遇到的問題是什麼?

我不認可「沒有編寫出過什麼有用的東西」這個說法,我認為應該是:「沒有想過可以編寫什麼有用的東西」或者是「想編寫有用的東西時,發現xx不會」。建議題主自己想想清楚,你具體是那種情況

建議題主將編程的目標確定清楚,定一個明確的目標之後會更加有動力。

我說的目標不是某個語言,或者某個技術,而是一個確實可以幫助到題主日常生活/工作的軟體。

先舉幾個例子,可以根據自己的情況選擇或者變化:

1、爬蟲,如果還在找工作,那麼做一個爬蟲可以避免你登陸不同網站,不斷進行重複查詢的工作。(ps,我自己就寫過一個簡單的爬蟲,可以把特定網站的內容爬下來)

2、手寫識別軟體,其實現在orc庫等都已經很普遍了,而題主不是喜歡紙上寫么,可以考慮自己寫一個手寫識別軟體。關鍵是要方便,比如要可以安裝在自己的手機上,拍完自動轉化為源文件,而且需要可以增加自定義內容(比如寫在第一行的是對應的紙上內容要保存的路徑)

3、其他的隨身app,每個人都應該有一些事情是希望可以通過手機方便的完成的,為什麼不自己找一個自己需要的需求自己來實現一個呢?


讀那麼多書,不如做個項目提高快。


讀了!

你的問題是,沒有發現問題和解決問題的慾望。單純為編程而編程。

良方是:

把你的書本放到遠一點的地方,從github上找一個你覺得值得嘗試的開源程序,然後獨立的,自主的,完成它已經實現的功能。

結論:

書的作用,在於幫助你,而不是教條你。


看完題主的描述,略有感觸。

# 追憶

同題主一樣,接觸 PC 還算早。

緣因,當年逗留網吧被抓,然後老爹老媽就給家中備置了 PC 一台,

依稀記得是 賽揚 的 U,不到 1GHz,自那時起,淪為了不折騰會死星人。

弄壞 —— 裝系統/拆機箱 —— 弄壞 —— 裝系統/拆機箱 ,不管是自己的還是別人的。

初中三年基本就是這麼過來的。

也不知道是因為性格(略自閉),還是因為折騰這些東西,

在小城鎮里的中學,分數還不錯,以至於有了後面的經歷。

高中,若是在當地,可以免費就讀(因為分數),

可能是當時過早的接觸了網路,也認識了一幫狐朋狗友,集體外出求學,各種考試。

成都七中(四川)都是沒考上的,不過總算是認清了自我,雖然有預計。

接著他們大都去了綿陽中學,而我轉戰到了樂山一中(都是外招生考試)。

編程的開始算是在那時吧,PASCAL,為了信息奧賽什麼的。

其實,說是編程,還不如說是數學問題的解答,

比賽的時候,還有用 C 語言的,評判標準也僅僅是個結果。

於是,依稀有點覺悟,編程只是個手段

大學(西安,長安大學,計算機專業不是強項),

計算機協會,因為計算機專業不強,所以成了愛好者自娛自樂的場所,

如題主一樣,出入女生寢室如入無人之地,以至於至今單身,XD ~

(女生寢室比男生寢室亂太多了!!!)

另,或許因為有過編程方面的訓練,軟體應用方面也會學得非常快。

所以,常去老師要活做,當然是「什麼都不懂,但什麼都能做」,

給了承諾,儘力做好,讓人覺得自己靠譜。

給別人方便,留自己機會。

一直覺得計算機方面的東西實踐性非常強,

有具體的事可做,才能學得足夠快。

大學也就是這麼過的,多做多想了,

至於成績,掛科——補考,因為沒準備,

補考也沒準備,不過補考是開卷,順便鍛煉下信息檢索能力。

回過頭來,看大學折騰的事,各種軟體應用就不說了,

編程方面,單片機(C)溫度檢測器,Excel 自動化表格(VB),各種網站(PHP、HTML、CSS、JavaScript),ArcGIS Engine 二次開發(C#)……

現在在去看看當時的代碼,一個字,丑。

不過也沒什麼了,成長嘛,一步到位反而讓人覺得不踏實。

大學畢了業,跑去桂林當地質工作者,專業對口,然後父母說要什麼編製。

後來發現沒什麼可玩的,半年後,

回了成都,開始做了 Web 前端,慢慢沉下來,繼續折騰人生。

# 定位

前面說了那麼多,希望對題主有所幫助,

對過往有個適當的總結,「所經歷的一切,才造就了現在的我。」,

做過的東西不要丟掉,會有驚喜。(當年 C# 寫的一段圖形編程的代碼段,直接在現在的一個 Canvas 項目中用到了。)

並且想清楚自己到底想要的是什麼,(又考研,又考公務員。)

自稱有編程興趣,卻沒讓人看到有編程的心。

編程,真的只是一種實現需求的手段

為什麼要編程,因為現在做的事讓人不爽。

比如上面說到的 溫度檢測器,

當時在學院試驗場玩,有個試驗是要定時記錄室外試驗的溫度,半夜都得起來 ……

便弄了這麼個玩意(當然最後學院拿到經費,購置了工業化的成品)。

至於,下一步,想想自己的慾望是啥嘛。

可供建議:

1、放棄鐵飯碗,追尋自己想要的。

(總想著與編程無關了,就會墮落,當不編程就吃不上飯的時候 ……)

2、發現自己工作可提高效率的地方,編程,解決之。

(不一定是代碼,可以是另一種工作方式,這也是編程。)

3、「白天工作,晚上工作」——《黑客與畫家》

(一份養活自己的工作,一份興趣相關的事。比如折騰開源社區那些可玩的項目。)


學 C# 的話,可以玩 Kinect SDK 了。

能把編程作為終生的興趣沒什麼不好,沒必要一定要做出「有用」的東西。


其實題主一直沒有踏踏實實深入一門語言去學,一直也就是走馬觀花,到處學學。

舉兩個例子:你去學一門武功,把招式秘籍背下來,能照著打了,是不是就可以行走江湖了?你去學一門樂器,DoReMi每個音階與和弦都能演奏出來了,是不是就可以上台表演了?即使是打個太極拳強身健體,或是彈個吉他裝文藝,也是得時常拿出來練練的。所以編程也是這樣的事情。我個人的經驗:如果學的一門語言或技術是我要去使用的,那很快就能上手;否則的話,即使我收拾好心情、做好準備去認真學,要不了多久也會忘掉。原因就在於沒有後續的練習。

題主就是一直沒有「然後」。

當年我學吉他,和弦都按得很熟練,但彈熟了幾首曲子後就不知道還能怎樣。直到後來找到了志同道合的朋友,組了樂隊,才體會到其中的樂趣。如今你學編程,一定也有同樣的困惑,我基礎都學完,怎麼也沒有什麼感覺。

所以我對你的建議:多交流討論,不斷尋找學習的點,持續練習。不管你有方向上的還是細節上的、理論上的還是應用上的問題,總歸能找到討論和解答的人,幫你在編程道路上更進一步。自己一個人看教程看視頻是無法取得這種效果的。

歡迎你來我們的聚集地看看,也許會改變你接下來的路。

Crossin的編程教室

微信:crossincode

qq群:295921816


你「學」了這麼久,卻沒有想正經自己開始動手做一套完整的東西,哪怕簡單粗糙bug重重,換言之,你一直待在所謂的「舒適區域」,這樣的時間積累是沒有太多意義的。

我覺得,真要學會一門技術,就要不斷挑戰自己,當然難度不能過大,我覺得比較合適的是在你只有60分的時候挑戰一下70分難度的,做到了再挑戰80分難度的,依此類推。但是重點在於,你要真的開始動手去做,而不僅僅停留在看書和簡單的編碼上。帶著問題去學習,是我認為效率最高的學習方式之一。


瀉藥。

從你的自學,考試經歷來看,題主的智力和能力是可以肯定的。

從你的困惑,父母安排的經歷來看,我覺得題主缺乏一些情操。

是想像力和自信。

-------------------------充滿想像力和自信的分界線-------------------------

大學學的是機械專業,囫圇吞棗地學了C語言。

在大家麻木地用 * 號輸出一個金字塔,尋找N個數字中的最大值的時候,

同樣的,我也只掌握了for, if, goto等數據結構。

但我興奮地對自己說:「我要用C語言做一個《貪吃蛇》遊戲!」

我馬上問了自己3個問題:

如何在屏幕上繪圖?

如何在屏幕上隨機地生成點?

如何響應鍵盤的操作?

每解決一個問題都為我帶來由衷的快樂,支撐我向著目標邁進。

學過許多語言,寫程序多年,唯獨沒有寫過任何一個「Hello World」,

這個世界很美好,有許多許多程序可以做的事情,

敢想,敢做。


1k,15k太少了,我一個項目寫個20k左右的代碼毫無壓力。當然還不是垃圾代碼。。有邏輯,有業務,有抽象類(還不包括我修改,刪除的那些最終統計不到的代碼),我工作快6年了,畢業的時候不如你初中水平。。看到你所頭疼的問題,比如不理解面向對象,不理解繼承,這些問題,一開始都是屬於新手很費解,無法感受到的東西。

只有等到你代碼寫到一定量級了,你覺得卧槽這個東西為什麼我一直在重複實現,重複調用,重複初始化的時候,你就會思考更高級一點的東西了。

看你的描述更像是時間上的浪費,而不是真正的學習。而且就單純說是實現桌面軟體而不是web軟體,我怎麼想也想不出,可以容易到在紙上寫完所有代碼……

能舉例幾個你覺得很ok的工具和代碼上來嗎,我們幫你看看好了~


不要指望想清楚軟體的每一個細節之後再動手,現在就打開編輯器開始寫。

從會的部分開始寫,不要想太多太遠,直到寫不下去的時候再去看書、搜索、去論壇問都可以。

當解決問題後不要發散,馬上回來繼續寫。

重複上面的過程。

先定一個小點的目標,比如就寫個貪吃蛇吧。你現在可以開始寫了。


我覺得題主喜歡先在紙上寫一遍代碼是把做材料實驗的壞習慣帶到了寫程序里。大概你做材料實驗的時候,都要先想方設法設計好實驗,也就是說「紙上談兵」的過程很重要,因為材料實驗花的錢多吧,實驗耗材什麼的。但是寫程序不一樣,做一次實驗的成本幾乎為0,你應該想方設法早點開始實驗,寫程序是一件實踐大大大與理論的事情。

計算機科學(如果可以稱之為科學的話)誕生的時間沒多少年,並沒有很多公認的有效的理論,你從書上看來的東西還不一定都是正確的呢。也可能現在是正確的,過個兩三年就又不是了。

還有,程序語言也算是語言的一種,你想想,一個小孩剛開始學語言的時候不都是學一個詞就說一個詞的么?你見過一個小孩是在完全學會了語言之後才開口講話的嗎?


不喜歡看電腦屏幕,喜歡編程。

代碼先寫一邊,再輸入電腦。

我凌亂了,我覺得你更適合去研究演算法原理理論什麼的,開發工程講究的是效率……


《聖劍英雄傳》幾萬行代碼,還真不是小遊戲,雖然代碼在今天看來已經有點落後了,但掌握了它的開發技術,基本上是月薪2萬以上級別的中高級程序員了。

建議從python入手,學寫點小工具或小遊戲,堅持每天下班後練下兩小時,上班沒什麼事也可以翻翻書看,慢慢培養編程的感覺


你把菜刀都磨成針了,卻沒有想到去切菜。


不要再去泛泛地學習了,這是一個偷懶的做法。

《計算機程序設計藝術》的高德納,就是針對具體一個問題一個問題解決下來出了四本牛閃閃的書。

你應該找一個問題,嘗試用程序解決掉它,然後在博客上論壇上知乎上把解題過程公布出來。


//題主我說話不好聽,請您多擔待:

//重口味時間到了。

你也不小了,還沒意識到你學材料完全是他媽在浪費時間?多大的人了?還是家裡讓你幹啥就幹啥?你就打算這麼度過你的一生?

剛開始看,還感覺你挺勤奮的,然後呢?你跟我說你c++學不會?你找3天啥也別干,就自己寫個類封裝下socket,然後再繼承它,封個http連接,smtp連接。

啥?不想學c++?可以,用純c寫個嵌入式操作系統,然後找個工作。我不信你找不到。

少TM研究什麼語言好。就把c和c++弄明白就行。你不是擅長c嗎?那就把常用演算法實現一遍,研究網路編程,用socket把各種功能實現一遍。讀開源代碼,學彙編(別再跳進學語言的坑,就看清每個指令是幹啥的以及c代碼是怎麼編譯成彙編的,看不懂就寫c程序然後單步彙編調試)。

話說你說你擅長c我還以為擅長到懂編譯原理呢,看到後面我猜你不懂。當然要是你猜錯了那我是SB.

你也別嫌我說話狠,要是實在覺得難聽就私信我我把答案刪了。

也是成年人了,大學選錯專業的蠢事我也干過,但讀研還要重蹈覆轍我真心理解不上去。錯過喜歡專業那種痛苦是忘不掉的,更不可能忘了痛苦明知後果還將錯就錯。

所以你可能不喜歡計算機,只是喜歡一些流於形式的東西(語言的語法之類),以顯示你和其他人不同;或者你意志不堅定,根本不知道自己想做什麼。

說了這麼多,也用去了一些時間。如需刪除請提問者私信。我這時間也不多,就到這吧。


看你學了這麼多語言,卻沒說你做了些什麼軟體,只是照書敲有什麼意思呢?

編程是思維,思想、而不是語言,語言只是工具而已。

多看多想多寫、不用完全照書學,先想想自己需要個什麼軟體,然後慢慢去實現,實踐中會學到更多。

既然對JS不感興趣,就別去搞Web 開發,做手機軟體,或者PC軟體。

祝你好運


如果你想在材料方面繼續,並發揮你計算機方面的優勢的話,計算化學/計算材料學應該很適合啊,往大里說,你可以寫自己的模擬程序,由少積多,比如可以先寫一個簡單的平面波包,然後加上幾個比較實用而別的包沒有普遍提供的功能;往小里說,這個專業日常還是需要一點編碼能力的,在數據處理等方面需求比較大。

據我所知,本專業國內幾位大老闆都有開發自己軟體包的想法,但生源不太好找,物理、化學、材料口的學生(平均)編碼能力相對來說還是有點弱,而真正在這方面有比較好訓練的兄弟們都跳到更賺錢的行業了(老老實實讀理科博士的話,確實比較拮据)。

當然前面這些都有一個前提,就是你願意在材料方面發展。就我看來這種基礎還是比較受歡迎的。前期肯定主要放在學術上,但假如你真能做好一個東西,賺錢未必不可能

下面是吐槽:

「出入女生寢室如入無人之地」,沒妹了那你進女生寢室還有啥意思。。。


推薦閱讀:

如何使一個變數的名稱等於另一個變數的值?-.net?
.NET Core是否會取代.NET Framework?
為什麼沒有新的支持底層達到類似C++這種程度,而易用性達到C#的語言出現?
.NET Core 開源對移動開發有什麼意義?
C#的開發,什麼時候用到了棧的先進後出機制?

TAG:編程 | NET | 自學編程 |