如何自學計算機編程?

今年大二,專業國際貿易,現在對編程很感興趣,我想自學,想請教我非計算機專業的學生該如何自學計算機編程?

謝謝你們回答我的問題,我有很久沒有看過我提問的問題了,沒想到關注的人還挺多的,現在題主已經大三了,馬上大四,現在在自學UI設計。剛學了不到兩個月,放幾張圖吧,小白,臨摹的不好。這是今天臨摹的插畫。

這是昨天做的圖標。

歡迎大家和我交流分享。
題主現在已經確定好方向了,正在努力自學中,謝謝大家的回答,我會加油噠~


前面的很多人寫的回答都很好,答主本科研究生6年一直學的都是機械,學業中偶爾用到編程,都是非常簡單的,寫個function,寫個loop,僅此而已,對計算機運行原理一竅不通,甚至分不清bit和byte的區別(毫無誇張)。找工作時候誤打誤撞進了軟體行業,開始自學編程,利用每天下班時間看書看open course, 學會了一些計算機的和編程基礎知識,現在就職谷歌,坐標美利堅。

之所以想補充,是因為其他回答大多說的如果將編程作為一個興趣學習,個人覺得,要把編程,或者說軟體工程師作為你未來的職業,僅僅pick up一門語言,寫簡單程序,是不夠的。理解計算機程序的運行原理和理解很多相關的知識很重要,否則在學習的路上對很多概念只能是一知半解,走不了太遠。以下列一些計算機的基本概念和相關的課程,答主覺得對成為一個優秀的程序員是很有幫助的,也是必須的。

1. 計算機系統,推薦課程: UC berkely CS61C,理解難度高,不過非常重要!
link: https://www.youtube.com/watch?v=gJJeUFyuvvgamp;amp;list=PL-XXv-cvA_iCl2-D-FS5mk0jFF6cYSJs_

此課程講述了計算機程序是如何運行的,一些計算機,程序的基本概念,例如計算機彙編指令,內存,寄存器的意義,進程和線程的區別。這些概念的理解對一個程序員是至關重要的。懂了這些,才能在程序設計和編寫中考慮到一些基本的問題,例如如何和為什麼要防止內存泄漏,如何寫程序可以減少cache miss提高performance.

2. 數據結構和演算法, 推薦課程:UC berkely CS61B, 理解難度中高,重要的不能再重要
link: https://www.youtube.com/watch?v=mFPmKGIrQs4amp;amp;list=PLZBP-86GmPTxpbvoFFzad0qYw5dKA8MV2

如果不理解基本的數據結構和演算法而編程,基本相當於不懂力學就去建造一個大樓,樓可能能建起來,但是你敢住,我可不敢。程序的基本作用是存儲數據和處理數據,可以把數據結構和演算法理解成完成這兩項任務的基本工具和思想。

3. 網路基礎知識,推薦課程:Stanford Network, 理解難度中等,很重要
link: Introduction to Computer Networking

我就不用說網路在軟體中有多重要了,除非你只是想寫個計算器,否則這些基本概念肯定要懂。這個課程基本講解了網路building blocks, 瀏覽器是如何從你打入一個字母組成的網址,到把一個可以interactive(交互)的頁面顯示給你,雖然這發生在短短一秒內,但後台發生了很多事情,才能保證這個網頁傳到你的瀏覽器上。從dns ,router,到load balancer, 再到http, tcp/ip, html, css, javascript。上完這個課程,基本就清楚了。

先寫到這……有人有興趣我再繼續更新,後面還有,大概寫了4分之一

/*
睡了一覺起來看到這麼多贊同真實受寵若驚,既然大家這麼有興趣,我接著碼字。我爭取每天抽出一段時間更新,答主有個剛出生3個月的娃,時間比較不穩定。首先要解釋幾件事情,答主自學Computer Science或者說編程的過程完全在國外完成,所以所有學習資料和視頻都是英文的,很多術語我也只知道英文的,對大家理解帶來的不便先表示歉意。不過說到這,我認為做到兩件事情對高效學習CS有很大幫助. 第一,學好英文,盡量用英文學習關於CS的概念。這麼說並不是因為我崇洋媚外,而是客觀的說,就算我國科研技術和編程水平已經和美國差距不大,但就教學水平和教材質量來說,還差了很多條街,而且很多CS的概念會直接用英文呈現在編程語言當中(stack, heap, tree, array, list, map, graph),即使你學的時候用的是中文,編程的時候還是要知道英文,寫英文,直接學英文省去了二次學習。第二,翻牆。這一點的原因不僅僅是國外的教材和課程視頻大多在牆外的網站(幾乎所有公開課在youtube上,我會把上面提到課程的link)。還有就是,我去年曾經回國在公司的北京office工作過一段時間,試著用了一下百度,就搜索編程技術相關的問題上,百度的搜索結果質量被google甩了不知道多遠。上面寫過的課程我會貼YouTube鏈接,這些課程能寫的作業強烈建議大家跟著寫,因為編程水平是靠寫代碼寫出來的。
*/

4. 資料庫
這個topic我沒有什麼推薦的課程,因為大多數我看到的資料庫課程都是在講如何使用sql資料庫。資料庫的知識我認為分兩部分,作為一個入門的程序員,可能只需要知道寫簡單的sql語句,如何create databse, create table, insert, update and query. 這是資料庫學習的第一部分,我建議利用一些可以邊學邊寫的網站學習這部分,實戰才會印象深刻,這裡推薦一個網站(不知道需不需要翻牆)Learn to code, 他們家有很多課程,都不錯,大家不需要用付費版本,免費版足夠。 資料庫的第二個層面,我認為才是資料庫的精髓,這部分我是靠閱讀網上的文章加繼續搜索學習的,就是資料庫的運行原理,具體說,就是資料庫是怎麼樣實現快速查找的,想像一下,一個表有很多列,例如一個人的資料,姓名,性別,住址,年齡。那麼比如我要查找一個年齡區間的人,資料庫不可能每次都去根據年齡排序,再輸出,排序的複雜度是n*logn, 就算不排序, 每次輸出的複雜度也是n, 這對於動輒上百萬記錄的資料庫來說,速度是不能接受的,所以資料庫會用到幾種特殊結構的tree去存儲這些列,保證在輸出的時候,複雜度基本在logn。關於這些tree是如何實現的,可以獨立寫一篇很長的文章,建議大家先學會並理解幾個基本的tree structure(數據結構和演算法里有講到),順便在這裡推薦一個微信公眾號,事先聲明,這個公眾號跟我沒有任何關係,只是他家文章水平普遍較高,公眾號的名字叫"開點工作室「,裡面有一片講資料庫實現的文章寫的非常好,很深刻。

/* 這周一直在加班,外加出差,一直沒有更新,十分不好意思,周末有點時間我來更新一下*/

5. 操作系統 推薦課程 Berkeley CS 162
link: https://www.youtube.com/watch?v=1IcZB26STUEamp;amp;list=PL-XXv-cvA_iBDyz-ba4yDskqMDY6A1w_c
推薦書:Computer Systems: A Programmer"s Perspective

操作系統(英文縮寫OS)其實即使是經驗豐富的軟體工程師都很少有非常熟悉的,因為實在難點太多,太難理解,其中有很多雞生蛋,蛋生雞的問題,答主自己也並沒有理解的非常好,但我認為對於一些基本概念的粗淺理解也是很重要的,例如OS如何schedule process的,如何管理內存的,如何實現各個process切換的,文件系統是怎麼實現的,還有最難理解但也一定要有一些理解的一個概念--鎖(mutex lock)。我之前在Oracle的工作經歷主要負責的提高操作系統的性能,所以理解較一般不在這個領域的程序員的會深刻一些。說一說為什麼鎖很重要,現在很少有程序是單線程了(javascript除外),在多線程的運行環境下,如果沒有鎖基本上就會天下大亂了。舉個最簡單的買牛奶的例子,假如你和別人合租有個室友,你們倆每天都喝牛奶,有一天你回家發現沒有牛奶了出去買牛奶,然而在你室友回來後你還沒回來之前你室友無法判斷你是否已經去買牛奶了,如果他認為你已經去了而自己沒去,你們家裡會有一瓶牛奶,如果他認為你沒去自己也去了,你們家裡就會有兩瓶牛奶,如果他認為你去了而你沒去,你們家就沒有牛奶了。這種在多線程程序中會出現不確定結果或錯誤結果的情況很可怕,需要解決。那麼解決方案就是鎖,在這個例子里,鎖就是一個貼紙,如果你去買牛奶後貼一張紙告訴你室友你去買了,那麼對於你室友這個就很容易解決了,如果他看到沒有牛奶,沒有貼紙,他就去貼一張紙條告訴你他去買了,結果是你們家有一瓶牛奶。如果他看到沒有牛奶但你貼了紙條,那他就知道你已經去買了,他就不用去買了,結果還是你們家只會有一瓶牛奶。這樣程序執行結果就不會有不確定性。當然,真正的鎖實現上比這個複雜而且會有很多種鎖,但基本原理就是這樣的。關於這方面,和第2點一起,推薦一本書,我寫在了開頭,這本書開頭3章不太好懂,講的是一些很基礎的計算機實現原理,不過要堅持看下去,看不懂就多看幾遍,配和網上搜索,也可以給我發信,不過我時間非常有限,盡量回答,沒時間回答大家不要怪罪。

6. Version Control System. 推薦Git. 推薦教學網站:
Learn Git with Bitbucket Cloud

Version Control system,我不知道如何翻譯比較靠譜,意思就是版本控制系統。先說說為什麼我們需要它,版本控制系統幫助你更好管理你的程序,更好的幫助一個小組在程序上進行合作。舉個例子,比如你用word寫文章,想像每次你保存都不會覆蓋,而會保存成一個新的文件,並且這個文件名會記錄你和上一次保存的變化以及你的保存時間(這個保存叫commit),這樣如果你在一次改動的時候如果覺得改動的太差,你不用手動改回到上一次保存,這個系統會幫你一鍵回到任何一個你之前的保存,這樣你在每次保存後就可以放心大膽的改動,不用擔心如果程序沒改好導致前面的成果全部廢掉,因為你隨時可以回到任何一個前面的版本。再說說它的第二個作用,就是合作,假設你程序寫到一半,發現這個程序需要的工作量遠遠超過你之前的預期而你需要別人的幫忙,於是你有了一個合作夥伴,這個合作夥伴用這個工具copy(這的copy一般叫clone)了你的文章,這樣他瞬間就得到了你之前所有的版本。當你們倆分頭編輯了很多之後,這個工具可以實現一鍵合併你們倆的修改的內容(merge),如果你們修改的內容有衝突(merge conflict),這個工具會告訴你們有衝突的地方並讓你們逐一選擇選擇誰的修改,當合併好之後,這次合併對於你們倆來說又都只是一次commit, 隨時可以回到各自合併前的版本。Version Control有很多,比較popular的有git, perforce 和Mercury,個人最喜歡的是git, 大家可以先學學git.

--------------------------------------------------------------------------------------------------------

2017/5/26 更新:

十分抱歉這麼長時間沒有時間更新了,前一段時間因為剛有了小孩所以十分忙。在這期間接到了很多問題和評論,謝謝大家喜歡這個回答。從大家的問題中我發現還是有很多學工科或者其他學科的人有興趣學習寫代碼的,但我發現很多問題不是問不到點子上就是過於general。例如,我學xxx專業的現在想學寫代碼,應該怎麼辦,或者說,我決定開始寫代碼,聽說Java不錯,能不能說說怎麼學Java. 我覺得我在上面的回答想跟大家傳遞的我的想法是,如果想轉做一個水平還不錯,有職業發展的碼農,寫代碼這件事要有規劃,系統的學。如果你剛開始接觸寫代碼,我就教你怎麼寫Java, 就好像你想做一個建築工程師/設計師,我上來就教你怎麼用鎚子釘釘子,怎麼用鉅子鋸木頭,但即時你鎚子和木頭都用的很熟練了,你還是不做不了建築師,因為你不知道建一個哪怕是一個小房子,應該需要幾塊木頭,每塊木頭多長,每塊木頭應該怎麼連接,應該在哪釘釘子,應該用什麼樣的木頭和釘子。所以,學Java並不是最重要的,學之前你應該知道學會了應該怎麼用, 不然就是很盲目的。我很希望能幫助到大家,回答一些大家的問題,帶大家寫寫代碼,所以我在考慮每周找個時間做個直播,回答大家的問題或者講點基礎的東西。對我來說比較方便的時間是周末的早晨,也就是各位周末的晚上,我想了解一下有多少人有興趣,希望有興趣跟我交流的朋友給我留言或者發站內信,如果有興趣交流的朋友多,我可以利用周末的時間跟大家交流


自學計算機編程有一個難點在於,你很難在一開始有些小喜悅。哪怕編一個好玩一點點的程序,你都需要從變數,循環和運算開始一個一個學起。

就像學外語一樣,當你背完一大堆字母和單詞後,你才會體會到用外語溝通的一點點樂趣。錯一點就全錯,就不可能講好。所以你得花很多時間背字母單詞。很多人在這個時候就放棄了。這就是自學技術的一大門檻——枯燥

有什麼方法可以讓你學得又輕鬆又開心呢?答案還是有的。那就是通過遊戲來學習。蘋果2016年度最佳遊戲中,有一款叫Human Resource Machine的遊戲,就是用遊戲的形式,教會你編程的主要思想。

下載地址:Human Resource Machine

這遊戲基本上把面向過程的編程方法和思想都涵蓋在其中,讓你邊玩邊學會了,而且還是使用有點難度的彙編語言... 連編程世界中的經典的冒泡排序都有....我自己硬花了一個通宵玩通關了,至今還意猶未盡...

後來去百度,才發現很多玩家都玩瘋了...還在比誰用的步數更少.... 人力資源機器吧_百度貼吧

當然,如果你沒有那麼多的時間學編程,你還可以在下面這個APP上,利用坐公交等電梯等碎片時間,學習swift語言(蘋果最時髦的開發語言)。

下載地址:Swifty

這個應用的優點在於,它非常淺顯易懂,可以用非常簡單的例子教會你比較複雜的實現語法。而且你每懂一個語法,它就會幫你記錄並存下一個里程碑,讓你很容易堅持下來。


說說自己的事情吧,大學學的電路+信號,編程課只有一門C語言,和單片機編程的東西。而且C語言不算強制專業課,所以學的稀爛,基本不會,你問我冒泡演算法咋寫,我只能一臉懵逼看著你,考試咋過的?背歷年題啊!!!。

快畢業,發現自己還可以走編程這條路啊,開始琢磨怎麼寫網站,那時候流行的struts/hibernate/spring,說干就干買了本書J2EE的書,發現根本看不明白啊,又買了一本JAVA基礎,啃書上的課後題,啃到不明白的地方就好友列表的大腿子們使勁問,感謝當年這些做安卓遊戲的大佬不殺之恩!!!!之後就做開始準備做個登錄註冊練練手,然後發現光有程序不行啊,還TNND需要資料庫,百度:sqlSever OR oracle, 發現Oracle太大下不動,下了sqlSever,倒騰兩天終於做出來,這期間還遇到ORM的問題,當時直接用JDBC鏈接資料庫的方式實現的- -,妥妥黑歷史啊,之後開始分析需要做的網站需要有什麼功能,基本當時就是一個個功能逐個實現在再糅合一起的,當然BUG多成山,有時候一個BUG想不明白搞一晚上- -,個人比較蠢,記憶力弱渣,就搞了個記事本,出了什麼BUG怎麼解決的就寫下來,日後同樣錯誤就直接翻。

之間還去W3C看HTML標籤都有什麼用,css可以幹嘛,那時候想不明白的直接dreamweaver拖啊,要用到啥JS效果,那時候也不會寫JS,直接搜有沒有同樣的解決方法,複製過來用,發現TNND不能直接用,就開始琢磨JS到底怎麼寫的才能用。磕磕絆絆的臨近畢業前可算做完了,就拿去當畢業設計了,現在看到當時的代碼冗餘多的爆炸。

之後憑著這個作品找到了一個工資低到炸了的工作2000+,個人還做的津津有味,當時還是很感激別人給了自己這個機會,有幸接觸到安卓/PHP/python/ruby各種領域的程序員,然後第一個工作就是實現界面,各種管理系統的界面,還得做兼容問題(FF和ie),現在我都想說IE你大爺,
自從做了這個工作以後我就再也沒怎麼寫過java,html/css/js使用熟練度水漲船高,當然還有PS,最常聽到的就是:來來來這個界面給你去做,圖要好好切,我一度懷疑自己是個美工,因為給的圖是用excel畫出來的,具體的界面還得自己找素材做- -,PS當時絕壁用的比JS還熟練。

後來公司有一個互聯網應用來著,大家都沒時間,領導讓我獨立完成,因為比較簡單,數據層很少,大部分展示用的,就是記錄遊戲數據說明的,說用PHP就行,然後就看了PHP,不得不說PHP的框架真多,看的我狗眼都快花了,啃了啃愣是做出來了,當時還是很滿意的,而且這次接觸了MYsql,熟悉了大量資料庫知識,比如索引,視圖和存儲過程還有資料庫的許可權控制,在一個就是我TNND學會用linux了= =。

到後來公司啟用了EXTjs,開始發現js這東西很有意思啊,就開始各種啃JS,閉包原型鏈什麼的,琢磨自己的東西,這算是真正的才入了前端這個大坑吧,個人有強迫症,其實這個強迫症幫了大忙,就是琢磨不出來也會死命琢磨知道通了為止,EXT是個基於AJAX的框架,所以在這期間狂啃了HTTP協議,只是為了用來調試和看得懂請求和返回的信息哈哈哈哈。

再後來Rails框架學了Ruby,爬蟲學了Python,後來主做前端附帶Python,這些都學起來很快了- -。尤其是Python本身好理解,第二個其實有些東西跟JS很像八九不離十。Ruby蠻喜歡是這語言的語法真的優雅,之後接觸Redis/MongoDB/nodejs/ES6/babel/webpack/gulp/git/react/vue大概就是我走過的路,雖然泥濘但是不後悔。


-----------------------我是分割線-----------------------------------

說說怎麼學:主要是興趣驅動,如果沒有興趣早晚有一天會喪失學下去的動力。


選一個自己喜歡的方向入手,會讓自己更有動力去激勵自己,比如喜歡IOS/Android/JavaWeb/PhpWeb/PythonWeb/RubyWeb,喜歡就上啊,先從語言基礎開始學,寫出來的BUG琢磨清楚為什麼出BUG,最好有個編程大佬朋友可以問問的,不然就上stackoverflow,你會發現世界上不僅僅你犯過這麼傻嗶的錯誤,原來還有這麼多傻嗶像我一樣啊!!!

這期間肯定會接觸面向對象的思想啊啥的,看不懂就看看網上各種大佬的帖子,講的通俗易懂的比比皆是。

基礎過後肯定是想做項目:

資料庫可以先不去深入,但是基本的增刪改查要知道,記不出語句可以存一個TXT,下次照著敲,敲多了就記住了,我就是這樣的,個人記憶力弱渣沒辦法。

第二個是學會分析自己要做的項目,分析出功能,在紙上電腦上PS啥的畫畫,分析出具體的功能,讓自己的腦子不是一團漿糊,這樣才能知道該如何去做,逐個功能去實現,之後就變成了一個完整的大項目,當然這裡面肯定會有很多問題代碼冗餘啊啥的。

第三個你會發現你的項目問題很多,開始審視自己寫過的項目,擠出時間來重構代碼,你會發現你會學到更多的東西。

然後就是業餘時候多看看新聞帖子,漲漲姿勢,有益於編程的!


廢話寫了一堆:主要一句話,別太懶。


謝邀, 被google大神邀請誠惶誠恐. 雖然我編程水平在他面前就是個渣, 估計是看到題主的"非計算機專業的學生"如何學編程來吩咐我回答一下.

利益相關: 金融學專業, 大三臨時想去玩ACM, 準備了1個月, 比賽時在隊伍中作出了75%的貢獻, 得了區域賽銀.

我C++, matlab, R 什麼的都是大學自學的, 以前玩的是pascal,vb. 我的經驗是, 以某種目的為驅動去學編程是最快的. 你如果隨便買本編程書看, 什麼c++ primer 之類的, 就算你看完了你還是不會編程. 或者說你選修了學校計算機課, 學完了拿了90+ 可還是不會. 但是如果你本身想實現一點什麼東西, 以這個為出發點學, 很快能學會. 比如說, 你對數據挖掘有興趣, 然後看了那些演算法書, 打算自己實現一個演算法, 這個時候你選擇了一個語言, 例如c++, 然後你就可以看看基礎的語法就開始寫吧. 或者說你接到一個單子做一個小軟體, 然後你就可以看看基礎的東西, 直接開始做, 不會的google 或 百度. 這樣編程能力提高的很快, 千萬別想著要看完一遍書做到任何知識點倒背如流再開始實踐, 這樣會學的很慢.

題主國貿專業應該對李嘉圖模型頗熟悉, 你寫個程序實證一下世界各國的情況, 寫完之後肯定寫程序能力會提高不少.

=================================================================
這裡說的編程可能不是知乎上主流軟體工程開發的那種, 那種我也不會, 或許學那種真的要把編程書看的很認真. 我寫c++從來都是在class里用public定義變數. 我這裡說的是用程序去實現一些需要的計算. 題主國貿專業, 估計也是問的這種類型的編程吧?

我面試ucb的mfe時沒答上來虛函數是啥,傻逼了。果然非專業碼農對這些無能為力。更新:後來面試還是過了呢 ...

=================================================================

最後去投行當了個純程序員 ... 上一節說的那些我也會了 ...


如果你不想當程序員的話,那就看《Haskell 趣學指南》。如果你想當程序員,那就是用對個人用戶免費但是功能又跟專業版一樣多的Visual Studio 2013 Community 配合 C++Primer (沒有Plus) 5th 中文版看。


網易的 計算機專業體系匯總。
可以照著買書,自己跟著課程學習


推薦《python簡明教程》,2小時上手。


百度一下計蒜客

感覺那個網站還不錯,很適合剛剛入門的人學習編程。


看書 沒有第二個辦法


可以上網易雲課堂,計蒜課。
如果有英語一點基礎可以上coursera,近期有一個口碑非常好的python課Rice大學的(只有字幕中文。
python本身就是大家公認的入門好語言,這個課程也非常周到~老師也很幽默,並且不用搭設編程環境。
可以試試!~


我是這樣自學編程的。
學校時有C和matlab基礎。C語言是公共必修,兩個學期。matlab做過若干科學計算。
某天突發奇想,開始自學編程。一開始就走了野路子,自學VC,考軟考中級。後來了解到科班路線,自學CSAPP,CLRS,資料庫,網路,龍虎鯨書。看了Cpp primer,effective cpp,深入cpp對象模型,cpp tamplates。這個階段刷完CLRS習題算告一段落。
第二階段,來這裡見識一些大神,知道函數式編程和PLT這麼回事。囫圇過了一遍SICP,EOPL,TAPL,ATAPL,Mitchell的PLT,又沾了一點數理邏輯和範疇論的皮毛。於是自己做了一個玩具語言。
後續打算看看PRML,deep learning,NLP和分散式計算的一些書?
--------------------------------------
補充,我是在工作的同時自學的。出學校時只會C語言和matlab,對CS幾乎一無所知,也就白白浪費了最好的學習時機。後面因為工作中也需要自己寫一些小工具,看到某種可能性也發現自己的興趣所在,才走上這條道路。最早的時候是excel的VBA和VC寫圖形界面調用matlab,再後來也寫一些VC程序控制串口通信設備做自動化。然後全面激發了對編程的興趣全身心投入CS。若人真正下定了決心,時間、精力都不是問題。現在網路這麼發達,什麼知識都非常容易獲取,唯一阻礙你學習的就是你的惰性和不自信。另外要有一個危機感,知識貶值周期越來越短。就算不是在IT行業,在傳統行業,產品換代、工藝升級,舊的經驗一文不值,20年經驗被3年經驗的新人隨便替換,因為新人學習的成本越來越低。社會節奏逼著人越來越快,跟不上就玩完。
最後說一句,英文非常重要。盡量看原版經典。實在不行就看翻譯版。書的挑選是關鍵中的關鍵。好書能激發人的興趣。越看越痛苦的書要遠離。


強烈推薦

Learn | Codecademy

2015.2.25

2015.10.24更

open-source-society/computer-science · GitHub

http://www.freecodecamp.com/


我是那種超級打醬油的自學者+程序員。

真正開始自學是在高二的時候,在新華書店看到一本給初中還是高中生看的VB入門的書。相比起外面的編程書來說,那本東西全彩+圖文並茂,講得十分透徹簡單易懂。覺得「原來編程也這麼簡單?」就這麼被書燃起了編程的慾望,於是買回來開始了自學。

然而因為自己領悟能力不夠,或者說書上面講得不好什麼吧。像WHILE循環語句這些當時一直看著,也一直不懂。但自己也沒多逼自己去硬啃,畢竟是循著愛好而去學。既然看不懂,就先放著沒理。

也因為興趣的緣故,自己做了各種各樣的一些小程序出來自娛自樂。但學習的過程中有個不太好的地方是,學了基礎以後,後面的沒太多系統地去學。都是想做什麼功能,自己又不會的時候,才下心思專門去鑽研那方面的知識。

後來做的一款小軟體登了報紙,有一家從來沒聽過的公司聯繫來說要整個軟體的版權買下來,當時也不知道是騙子還是什麼,也沒鳥過別人。

再接著高三的時候,參加省裡面的信息科技大賽,做了兩款軟體參賽,但兩款都只拿了3等獎(當時只有1等獎和2等獎才能以特長生保送)。

最後雖然分數達到了本A,但因為偏科嚴重,沒有本A學校願意接收,進了一所211院校的本B獨立學院,讀的專業也和編程無關。做不成天才少年,就做了天殘少年。

那時候自己不服輸,當時計算機系有高中的同學在,他們大一時候學的是VB,就找了他們計算機系的課本來看,從頭到尾自己全部會的。不服輸,在他們考完試以後,托關係搞來了他們期末考的試卷,自己一做,100分。

當時學校允許大二時候修雙專業,剛好大二上學期我們專業要學C++,後來期末考試自己成績98分,就更有衝動說自己修雙專業證明自己。可碰巧大二下學期大病,掛科+重修再掛。學校規定說如果掛過科就不能修雙專業,最後只能放棄這個念頭。

那時候網上關於VB的資料感覺越來越少,而關於C#的資料也越來越豐富。學過一陣子http://VB.NET,但感覺C#的風頭要碾壓VB的樣子,就開始改為自學C#。

大學畢業找工作,由於專業問題投程序員的崗位沒被任何公司錄用。後來國內某上市互聯網公司打電話問說,我們這程序員滿人了,有個產品的崗位你看要來做不,後來就進來這公司做產品的崗位。

在這公司做產品並不是純粹產品的崗位那麼簡單,同時也得兼顧策劃、編輯、運營這些工作,後來知道我自學過PS,偶爾也要做一下美工設計的一些簡單工作。做了大概1年多以後,碰上公司新上一個社區遊戲項目,由於剛好程序員那邊工作比較緊分不出身,那邊的老大就和我們老大商量說,既然誰誰誰學過編程,這個項目就他來做吧。於是自己第一次開始做商業化的程序項目,可做了大概2個月多吧,項目就被斃了,因為效率實在太慢。沒辦法,因為非但編程,這個項目的產品、策劃、數值、劇情文案都是由我自己來完成,一個人實在做不了太多這些。

後來沒在原來的公司做,就去現在的公司,一家純粹的民營企業,但公司主業不在軟體和互聯網上面。有一回,公司要弄網站,於是就自學了HTML、CSS和http://ASP.NET,接著又自學了JQUERY和一些SEO優化。

再再後來,公司要開發軟體項目,這裡並沒有軟體工程師,就由我自己一個人去完成。老闆又要那種屌炸天特效的效果,於是自己又自學了WPF。

現在公司的軟體項目裡面,產品設計、UI設計、編程都是我自己一個人去自學,去獨立完成。但我在公司的職位是銷售員。

說實在的,我混得並不太好。但希望我的經歷能給到樓主一些啟示吧。有興趣的話可以在評論裡面相互交流。

-------------------------------------
更新於2017年1月1日

最近在幫朋友做一個有趣的項目,一個電商的展示平台,前端HTML5,後端http://ASP.NET,後台使用WPF製作(通過WEBSEVICE交換數據),同時還附帶爬蟲功能來捉取同行的資訊。

想起做爬蟲這東西,以前和自己系的一個師弟聊過,師弟說我用.NET做這東西簡直蛋疼,python可簡單強大多了。

我這個半文盲的人對做爬蟲python和.NET哪個更好真沒個說法,我想說的是我的這個師弟。

他和我是同一個專業,大二還是大三才真正開始學編程,按道理說當時的起點我比他要高。後來畢業以後他進了一家公司做程序員,輾轉幾家公司現在在阿里當上了技術大牛。

對比起來,現在的我真的真的可是遜色多了。

人生這東西啊,像大海的浪一樣時高時低,誰也說不清,但求無愧於心便好。


(學習國際貿易的話,英文應該很好吧....
題主可以:
0.在amazon,o"reilly上搜索幾本入門的編程書籍。
1.在谷歌上搜幾篇入門的101教程。
2.看完教程看完書立刻打開IDE,編輯器把學到的敲出來。
3.入了門以後,可以看一些進階的書籍,教程,也就可以做一些作品啦!後面就看題主自己了。
4.搜索關鍵字:learn、programming、beginner


說說我的經歷,從小打遊戲,性格內向。高中畢業進入社會,挖過隧道,當過超市保安,在洗浴中心跑過堂,在快遞公司簽過單,然後進入機關負責網站內容發布,打開了新世界的大門

第一次接觸cms。好奇,學怎麼用。

網頁圖片不夠美,學ps

網頁布局不夠美,學html,css

網頁動畫一點都不酷,學jquery

網站有些業務cms沒有,學php

老是自己手工找內容,麻煩,學python

一切看起來都美了,發現php確不夠美了,學java。

發現現代web兼容性已經不是頭等問題,重新學js。打開另一新世界大門

學oop,學原型鏈,學git,glup,less,sass,webpack,npm,node,bootstrap,angular,vue,html5,css3,react,react native,ionic,flash socket,websocket,knock,es 6,es 7,express,mongodb,mongoose,validator 還有,還有還有更多更多(學海無涯回頭是岸 )

然後你就入門了,然後你就知道下一步該怎麼學了。

興趣永遠是最好的老師

經驗的話就一句,別說不知道,干不完就加班


一個小學僧的粗淺經驗


首先實名反對初中生全棧工程師 @Xiaooooolan 的答案。

我要聲明一點,不是要打擊某人或者類似的人。我也是從中二走過來的。

我自大一加入我校網路信息協會,一直在新人培訓方面活躍,我想對於你的疑問我還是有一定的資格前來回答的。

一、方向選擇

只是會用 JS(包括 jQuery Angular Vue 之類的)、HTML、CSS、會運行 MC 伺服器、會一點 swift 還不能被稱作全棧。

曾經我天真地以為全棧就是 前端+後端+伺服器運維,後來我給自己詞典中的全棧增加了 網路,再後來是 嵌入式

後來發現,如果硬要說自己是全棧的話,還得能和哈雷大神那樣從二極體開始造個超算(硬體)並用二進位寫個配套系統才行(笑)。

前面提到的每一樣,都不是簡簡單單就能「會」的,那些知識是海量的,比如前端、後端、伺服器,官方非官方的手冊KB 可是很龐大的哦。

總之,少年,路還很長。

所以你需要選擇一個起始的方向。

我在協會的新人培訓中,把技術類培訓大體分為三個方向:

  • 網頁界面 -&> 前端
  • 功能邏輯 -&> 後端
  • 服務運維

(沒錯我們沒有桌面和移動開發)

如果你非要一口氣吃個大胖子,很遺憾,沒有捷徑。

人生苦短,快穿女裝。

二、看書

不要看「7天入門」、「21天入門」、「30天深入淺出」、「60天從入門到精通」、「90天走上人生巔峰」什麼的,這些書雖然不全是一無是處,但是並沒有太多的幫助。

個人推薦一些經典的動物書O"REILLY 出品,大部分有中文譯本)。

列舉一些我經常推薦的書:

前端方向:

  • 《HTML和XHTML權威指南》
  • 《CSS權威指南》
  • 《JAVASCRIPT權威指南》
  • 《HTML CSS設計與構建網站》(這個不是動物書)
  • 《jQuery Cookbook》(jQuery 是 Javascript 的一個庫)

後端方向:

  • 《PHP程序設計》
  • 《Python學習手冊》
  • 《Perl語言入門》
  • 《Java編程思想》(傳說中的 Think in JAVA)
  • 《Head First C#》

服務運維方向:

  • 《鳥哥的Linux私房菜》
  • 《精通Windows Server 2012 R2》(Minasi Mark)

更多書目不再羅列,知乎上有很多問題討論相關書籍。

另外不要忘記官方手冊官方文檔,這是比第三方的書籍更精準的參考資料。

人生苦短,快穿女裝。

三、搜索與提問

避免做伸手黨,伸手黨通常不太受歡迎。遇到問題首先去試著搜索,查找下是否有人遇到相同或相似的問題,一般能找到解決方案。

既然要做計算機,就不要把眼光局現在百度搜索、百度貼吧和國內所謂的「專業論壇」上,多用用 Google,多看看 Reddit,多翻翻 Stackoverflow,這些渠道高到不知道哪裡去了。

搜索也是需要技巧的,要學會提取關鍵詞。把你的問題用幾個單詞描述出來(不一定成句子)或者把你遇到的問題中關鍵信息找出來。

另外不要看國內各種轉載的博客,好多都是複製過來完事兒,將過時的甚至錯誤的信息弄得鋪天蓋地,完全沒有幫助,甚至會讓你走更多彎路。(所以我推薦使用英文搜索並避免使用百度,因為百度的英文搜索能力太差了,舉例說明,竟然會把 C# 的報錯信息匹配到只有一個單詞相似的 VC 6.0 的相關文章)

搜索無果,需要提問,建議先閱讀下《提問的智慧》,這裡有一份中文翻譯:ryanhanwu/How-To-Ask-Questions-The-Smart-Way。

人生苦短,快穿女裝。

四、工具

工欲善其事,必先利其器。找對適合你的工具。

個人常用效率工具:

  • Dash (Mac) Zeal (多平台) 查手冊
  • Sublime Text 3 (多平台) Atom (多平台) VS Code (多平台) 帶代碼著色編輯器,擴展豐富
  • Visual Studio (Win) 強大的 IDE,C#、Windows C++ 開發利器 (配合 JetBrains ReSharper)
  • JetBrains 全家桶 (多平台) 各種語言 IDE,功能強大
  • Vim (多平台) 輕便的編輯器,各平台上均能找到帶 GUI 版本

以及你需要的運行環境:

  • PHP : XAMPP / LAMP
  • Ruby
  • Java
  • ...

不過,工具還是適合自己的才是最好的。

人生苦短,快穿女裝。

最後,祝你在碼農的世界有一個美妙的體驗。


推薦到網上下個視頻教程,學起來比較簡單省力。初學者讀書學編程太費力了。


推薦幾個學習網站:
中國大學MOOC
lintCode
leetCode
先學C語言,再學數據結構,然後學會演算法分析。最後再學其他語言就好啦。C++,java,js,html5,css……
備註:c語言是最基本的,學會它再學其他語言就很容易入門。


因為工作經常要用到excel所以研究了下自帶函數,由於自帶函數不能滿足我的需要,所以自學了vba,又是因為工作的關係,研究了revit的二次開發,還在學,為了做個小玩具自學單片機,那就必須學c了,無聊時學了下python,html,mathlab,然後補了數學建模,語法,線數,微積分,然後對excel又有了新的想法,學編程首先要有想法,程序只是實現想法的工具。


幫你約個程序員鄰家男孩,@蕭井陌


推薦閱讀:

TAG:計算機 | 用戶界面設計 | 自學 | 計算機科學 | UI設計入門 |