如何在職系統學習編程?
只是對編程感興趣,希望能系統了解相關知識,實現一些簡單的應用。在網上看到的總是「精彩」的隻言片語,不系統,養不成能力。可能是入門這個檻還沒過。希望能有一個學習的環境,嘗試過北大青鳥之類的在職培訓班,感覺很差。有什麼比較好的辦法嗎?
謝@楊博 邀請。
這個問題對我來說算是一個新課題,但也許也不算新課題。採用這麼糾結的說法,是因為我首先是計算機系出身的,沒有在職學習計算機入門的需求;但我的經歷實際上一直處在一個學非所用的狀態,也就是學了個什麼之後工作變動,而工作要求的是另一種東西。所以我在應用學習上或許有些經驗,但原理學習上來說僅僅是個人經驗,姑妄言之,足下姑妄聽之。
首先在知道自己怎麼學習之前,我的建議是弄明白自己希望做什麼。是希望做應用開發,還是專註於學術。這個選擇直接決定了學習的方法。如果樓主的目的是做應用開發,那麼我首先不建議去跟大學的計算機專業課。因為計算機系的課程大部分還是以原理為主,講求的是打基礎,對於那些希望做應用的人來說不是一個好的學習方法。用一個不太恰當的比方,做毒膠囊的肯定多少理解一些化學,但那些昧良心的傢伙不見得個個都能把苯的分子式給你寫出來。軟體開發也是一樣的,
從我的理解上看,我個人認為樓主是希望以應用開發作為最終目的,恰好這也是我擅長的。所以我從這裡開始。
一般地說計算機知識分為兩類(事實上就我所知的大部分功課學科都是如此),一類是純工程,一類是純學術。純工程講究的是用起來,特徵是分類詳細而且子方向之間有門檻,純學術講究的是為什麼,特徵是研究的東西比較抽象而且多半和數學有關係。具體到計算機,純工程的內容包括:- 程序設計語言和搭配的軟體框架。比如HTML/Javascript和jQuery,C#和.NET,Objective-C和Cocoa。
- 應用和工具以及其對應的協議。比如網路應用離不開瀏覽器和HTML協議;網路管理離不開各種郵件、SSH以及相關的各種協議;安全就離不開認證、證書和對應的NTLM、Kerberos和PKI協議。
學術味道比較重的內容包括:
- 各種演算法的證明、可計算性描述。包括那些計算機系出身的半吊子最愛拿來唬人的圖靈完備的概念。
- 具體領域相關的演算法。比如信號處理,用於通信、語音和圖形處理。又比如PKI背後的安全模型倚仗的非對稱加密和哈希演算法,還有編譯原理背後的自動機理論。
當然具體到實踐上,我們也能看到有很多工作的要求不是那麼涇渭分明地區別學術和應用知識。比如編譯和圖形方面的開發,本身是工程,但對程序員的學術功底要求非常高。不過我相信這些很可能不是樓主希望關注的東西。
那麼作為無基礎,以應用開發為目的的開發,我的建議是這樣:- 一邊學習語言,一邊動手寫應用。如今的應用開發環境已經越來越友好,比如Android,由於引入了Java平台,我們不像用C寫程序的時代那樣時時刻刻注意內存泄漏。雖然質量上剛開始無法保證,但隨便做一個小應用裝在自己的手機上玩玩開始沒問題的。別怕程序難看,一開始很正常。順便說一句,我個人不推薦從App Store開始,因為它的審核相對較嚴,而且一開始就要投資,如果不是認真地想做點應用還是算了。
- 在從應用入手的過程中掌握基礎的軟體開發知識。包括但不限於:通用的數據結構(數組、鏈表、哈希表、二叉樹)以及對應的時間和空間複雜度;內存使用的常識(泄漏、垃圾收集,引用計數等),基礎的演算法(排序、二分查找)。這裡的原則是盡量使用程序框架給出的設施,而不是自己寫。先把程序做出來,然後在這個基礎上用自己寫的函數去替換框架的版本,看看自己是不是正確理解了程序。另一個原則是遇到問題力求弄明白,因為這些東西是基礎知識,明白了之後到處都可以用。
- 對於那些和具體領域相關性明顯的應用,我的建議是不求甚解。比如證書的原理,對於應用來說理解證書的簽發和認證過程是要點,如果把大把的時間消耗到證明大素數分解的正確性和MD5碰撞的產生率,那就是走偏了。這些內容需要的知識更適合交給數學家解決,而對試圖專註應用的人來說,即使明白了這些也不能幫助你更好地使用PKI。
等有了一個應用之後,下一個步驟就可以考慮優化。這個階段的要求是:
- 理解程序性能分析。這個階段的路子走得對不對很大程度上取決於前一個階段是不是走偏了。我曾經見過很多半吊子的數學狂(包括很多科班出身的),他們在這個階段很容易陷入所謂「數學證明決定論」的圈子。也就是不用工具,只憑從書本上看來的演算法複雜度來決定軟體的優化。這實際上是不對的。正確的方法是藉助工具,主要的工具包括調試器(debugger)、代碼覆蓋(code coverage)和性能分析(profiler),用實驗來確定你的軟體哪裡跑得慢,以及為什麼跑得慢。
- 嘗試手動優化。手動優化的方法很多,首選的做法是在性能分析的基礎上選擇更高效的演算法和數據結構。這個階段也有它容易走偏的地方,就是很多人津津樂道的「用C改寫Java」,或者「用彙編改寫C」。特別是後者,如今計算機行業里用彙編的人不多,能搞這個的往往會被人盲目崇拜。但是作為應用來說,這些優化往往是以調試時的複雜度和日後維護的複雜性為代價的。所以如果不是實驗的結果表明不做不行,則不要隨意進行這樣的優化。
- 用!用!用!你的軟體做得好不好不是證明出來的,而是用出來的。很多時候自己寫的程序在寫完第一次跑的時候可能啥事也沒有,但真的用到用戶環境里去就亂七八糟到處開花。首先我們必須正視這一點,即沒有人寫出來的程序第一次跑就100%不出錯(別聽信那些所謂的「程序證明」愛好者的胡話,他們未必真的寫過一個程序),所以不要害怕。另一方面要重視這一點,遇到問題必須自己調試解決,才能讓軟體真正做到可用。這個階段的任務是不要讓任何一個程序錯誤跑掉,堅決抵制所謂「既然這樣做不行,那樣做就可以了吧」的誘惑,有問題就就地解決,才能真正提高程序的質量。
以上大概就是寫一個小軟體的全過程。如果能堅持到這個時候,我相信樓主已經能夠很好地把握軟體開發的過程了。等到自己軟體玩得轉了,再可以考慮參加一些開源項目之類的,但那個話題相對較遠,以後再說吧。
最後一個問題:開發過程中遇到問題怎麼辦?
我的建議是:首先看官方範例,比如Android的例子在SDK里就有很多,甚至自己有一個記事本小應用。先從這些例子開始。如果遇到不懂的,看SDK,如果不行就上Stackoverflow問問題,或者知乎上也未嘗不可。我個人不建議找中文網站。計算機開發的國際語言是英語,英文資料要比中文資料豐富而且準確很多。
還有一個小建議是勤於記筆記。有些很奇怪的小問題在文檔里未必能提到,多記一些個人筆記,隨時備忘比較好。
最後祝樓主成功。最好的環境是一個精彩的書目。最好是先有人推薦一個領域的列表,然後你去詢問關於某個領域的書目。獨自在家學習。有問題到 Stackoverflow 上詢問。累了出去走走,看看小說。
推薦你上http://www.udacity.com以及http://www.coursera.com去選擇一下課程。我這方面的經驗是這樣的:
- 參加某個課程,完成相關的作業。這個過程基本可以保證足夠的「基礎」,就是你起碼了解一個框架。
- 其次是參加他們論壇的討論,這個時候你可以獲取更多的信息,知道某些東西為啥如此。
- 最後,你自己用學到的東西去實現以下自己想做的東西,比如寫一個RSS閱讀器等等。
目前的在線教育比較火!上班空閑的時間可以上去看看。
- Coursera:這是我最早接觸的在線教育的網站,世界各地有名大學的課程(什麼金融學,經濟學等等),有帶中文字幕的課程,如果英語再好點,那麼你就幸福了。網易與coursera合作了一個中文社區點擊查看.
- Codecademy:也是最早在線互動編程網站,練習的英文很基礎,通過實際的例子來學習編程,可以學習HTML,CSS,Python,Ruby,php等編程語言。
- Teamtreehouse:跟Codecade類似,所有授課都是通過視頻教學以及在線測試,除了codecademy可以學些的那些語言外,還可以學習iOS和Android等等。
- 計蒜客:計蒜客的前身就是泡麵吧,其特點與codecademy相似,提供在線互動編程體驗,學習各種編程語言,主要是入門,但是要深入學習,還得靠自己。
- 實驗樓:實驗樓跟計蒜客差不多,但是實驗樓屬於成體系的在線學習,從基礎到實踐都有較完整的體驗。
- 泡麵吧:大家看互聯網新聞都應該知道泡麵吧的故事,後面改了名稱,後面我會寫出來,現在這個站點定位是在線教育資源導航站點,上面收集了不少跟在線教育相關的網站,非常不錯!
最主要的是不是純學習語言,需要學習計算思維和編程思路。
看視頻學。書上你不知道哪裡是重點。然後做東西給大家看。視頻讓人快速上手,看書學得精細,提問解答疑惑
五月同等學力在職研究生開設大數據專業,報名條件是大專及以上學歷可參加,學習時間一般是在周末。對外經濟貿易大學開設在職研究生課程班。對外經濟貿易大學在職研修 公眾號 uibeyx
想百度和騰訊都有課堂,有的免費的有的收費的,根據自己的需求,再買一些書籍配合網路課程一般效果還是不錯的
最好是方法邊用邊學,現學現賣,一個完整的項目下來,就會懂得很多!
推薦閱讀:
※如果想要拿到regional金,該如何制定一年計劃?
※有什麼方法可以快速了解學習matlab?
※21歲女生應該從職高輟學學編程嗎?能靠自學或者培訓班成為一個優秀的程序員嗎?
※如何說服女友學編程?
※自學計算機,列印沙漏研究倆小時還有希望么?