⑴ 普通程序員如何向人工智慧方向轉型
當下,人工智慧已經成為越來越火的一個方向。普通程序員,如何轉向人工智慧方向,是知乎上的一個問題。
這個學習路線是這樣設計的:首先了解這個領域,建立起全面的視野,培養起充足的興趣,然後開始學習機器學習的基礎,這里選擇一門由淺入深的課程來學習,課程最好有足夠的實驗能夠進行實戰。基礎打下後,對機器學習已經有了充足的了解,可以用機器學習來解決一個實際的問題。
這時還是可以把機器學習方法當作一個黑盒子來處理的。實戰經驗積累以後,可以考慮繼續進行學習。這時候有兩個選擇,深度學習或者繼續機器學習。深度學習是目前最火熱的機器學習方向,其中一些方法已經跟傳統的機器學習不太一樣,因此可以單獨學習。除了深度學習以外,機器學習還包括統計學習,集成學習等實用方法。
如果條件足夠,可以同時學習兩者,一些規律對兩者是共通的。學習完後,你已經具備了較強的知識儲備,可以進入較難的實戰。這時候有兩個選擇,工業界的可以選擇看開源項目,以改代碼為目的來讀代碼;學術界的可以看特定領域的論文,為解決問題而想發論文。
無論哪者,都需要知識過硬,以及較強的編碼能力,因此很能考察和鍛煉水平。經過這個階段以後,可以說是踏入AI領域的門了。「師傅領進門,修行在個人」。之後的路就要自己走了。
下面是關於每個階段的具體介紹:
0.領域了解
在學習任何一門知識之前,首先第一步就是了解這個知識是什麼?它能做什麼事?它的價值在什麼地方?如果不理解這些的話,那麼學習本身就是一個沒有方向的舟,不知道駛向何處,也極易有沉船的風險。了解這些問題後,你才能培養出興趣,興趣是最好的引路人,學習的動力與持久力才能讓你應付接下來的若干個階段。關於機器學習是什麼,能做什麼,它與深度學習以及人工智慧的關系,可以看我寫的博客從機器學習談起。
1.知識准備
如果你離校過久,或者覺得基礎不牢,最好事先做一下准備復習工作。「工欲善其事,必先利其器」。以下的准備工作不多,但足以應付後面階段的學習。
數學:復習以下基本知識。線性代數:矩陣乘法;高數:求導;概率論:條件與後驗概率。其他的一些知識可以在後面的學習的過程中按需再補;
英文:常備一個在線英文詞典,例如愛詞霸,能夠不吃力的看一些英文的資料網頁;
FQ:可以隨時隨地上Google,這是一個很重要的工具。不是說網路查的不能看,而是很多情況下Google搜出來的資料比網路搜的幾十頁的資料還管用,尤其是在查英文關鍵字時。節省時間可是很重要的學習效率提升;
2.機器學習
機器學習的第一門課程首推Andrew Ng的機器學習。這門課程有以下特點:難度適中,同時有足夠的實戰例子,非常適合第一次學習的人。cs229這門課程我這里不推薦,為什麼,原因有以下:
時間:cs229的時間太早,一些知識已經跟不上當今的發展,目前最為火熱的神經網路一筆帶過。而Cousera上神經網路可是用了兩個課時去講的!而且非常詳細;教學:Ng在cs229時候的教學稍顯青澀,可能是面對網路教學的原因。有很多問題其實他都沒有講清楚,而且下面的人的提問其實也很煩躁,你往往不關心那些人的問題。這點在Coursera上就明顯得到了改善,你會發現Ng的教學水平大幅度改善了,他會對你循循善誘,推心置腹,由淺入深的教學,在碰到你不明白的單詞術語時也會叫你不要擔心,更重要的,推導與圖表不要太完善,非常細致清晰,這點真是強力推薦;字幕:cs229的字幕質量比Coursera上的差了一截。Coursera上中文字幕翻譯經過了多人把關,質量很有保證;作業:cs229沒有作業,雖然你可以做一些,但不會有人看。這點遠不如Coursera上每周有deadline的那種作業,而且每期作業提交上去都有打分。更重要的是,每期作業都有實際的例子,讓你手把手練習,而且能看到自己的成果,成就感滿滿!
3.實踐做項目
學習完了基礎課程,你對機器學習就有了初步了解。現在使用它們是沒有問題的,你可以把機器學習演算法當作黑盒子,放進去數據,就會有結果。在實戰中你更需要去關心如何獲取數據,以及怎麼調參等。如果有時間,自己動手做一個簡單的實踐項目是最好的。
這里需要選擇一個應用方向,是圖像(計算機視覺),音頻(語音識別),還是文本(自然語言處理)。這里推薦選擇圖像領域,這裡面的開源項目較多,入門也較簡單,可以使用OpenCV做開發,裡面已經實現好了神經網路,SVM等機器學習演算法。項目做好後,可以開源到到 Github 上面,然後不斷完善它。實戰項目做完後,你可以繼續進一步深入學習,這時候有兩個選擇,深度學習和繼續機器學習;
4.深度學習
深度學習:深度學習是目前最火熱的研究方向。有以下特點:知識更新快,較為零碎,沒有系統講解的書。因此學習的資源也相對零散,下面是一些資源介紹。其中不推薦的部分並不代表不好,而是在這個初學階段不合適:
推薦,UFLDL:非常好的DL基礎教程,也是Andrew Ng寫的。有很詳盡的推導,有翻譯,且翻譯質量很高;推薦,Deep learning (paper):2015年Nature上的論文,由三位深度學習界的大牛所寫,讀完全篇論文,給人高屋建瓴,一覽眾山小的感覺,強烈推薦。如果只能讀一篇論文了解深度學習,我推薦此篇。這篇論文有同名的中文翻譯;推薦,Neural networks and deep learning:這本書的作者非常擅長以淺顯的語言表達深刻的道理,雖然沒有翻譯,但是閱讀並不困難;推薦,Recurrent Neural Networks:結合一個實際案例告訴你RNN是什麼,整篇教程學完以後,會讓你對RNN如何產生作用的有很清晰的認識,而這個效果,甚至是讀幾篇相關論文所沒有的;不推薦,Neural Networks for Machine Learning University of Toronto Coursera:深度學習創始人教的課,最大的問題是太難,而且老先生的吐字有時不是很標准;不推薦,Deep Learning (book):同樣也是由深度學習大牛所寫的書,但感覺就像是第二作者,也就是他的學生所寫的。很多內容都講了,但是感覺也沒講出什麼內容來,只是告訴你來自那篇論文,這樣的話可能直接閱讀論文更合適。不推薦,cs231n:李菲菲的課程,很有名,專門講CNN。但是這門課程有一個最大的問題,就是沒有字幕,雖然有youtube的自動翻譯字幕,但有還不如沒有。
5.繼續機器學習
深度學習未必就是未來的一定主流,至少一些大牛是這么認為的。傳統的機器學習有如下特點,知識系統化,有相對經典的書。其中統計學習(代表SVM)與集成學習(代表adaboost)是在實踐中使用非常多的技術。下面是相關資源:
推薦,機器學習(周志華):如果是在以前,機器學習方面的經典教材首推PRML,但現在周老師的書出來以後,就不再是這樣了。首先推薦讀周老師的書。這本書有一個特點,那就是再難的道理也能用淺顯精煉的語言表達出來。正如周老師的名言:「體現你水平的地方是把難的東西講容易了,而不是把容易的東西講難,想把一個東西講難實在太簡單」;
不推薦,Pattern Recognition And Machine Learning:當前階段不推薦。PRML是以貝葉斯的觀點看待很多機器學習方法,這也是它的一大特色。但對於初學者來說,這種觀點其實並無必要。而且此書沒有中文翻譯,當前階段硬啃很容易放棄;
6.開源項目
當知識儲備較為充足時,學習可以再次轉入實踐階段。這時候的實踐仍然可以分兩步走,學習經典的開源項目或者發表高質量的論文。開源項目的學習應該以盡量以優化為目的,單純為讀代碼而學習效果往往不太好。好的開源項目都可以在Github 里搜索。這里以深度學習為例。深度學習的開源優秀庫有很多,例如torch,theano等等,這里列舉其中的兩個:
推薦,DeepLearnToolbox:較早的一個深度學習庫,用matlab語言撰寫,較為適合從剛學習的課程轉入學習。遺憾的是作者不再維護它了;
推薦,tensorflow:Google的開源庫,時至今日,已經有40000多個star,非常驚人,支持移動設備;
7.會議論文
較好的課程都會推薦你一些論文。一些著名的技術與方法往往誕生於一些重要的會議。因此,看往年的會議論文是深入學習的方法。在這時,一些論文中的內容會驅使你學習數學中你不擅長的部分。有時候你會覺得數學知識儲備不夠,因此往往需要學習一些輔助課程。
當你看完足夠的論文以後,在這個階段,如果是在校學生,可以選擇某個課題,以發論文為目的來學習研究。一般來說,論文是工作的產物。有時候一篇基於實驗的論文往往需要你寫代碼或者基於開源項目。因此開源項目的學習與會議論文的工作兩者之間是有相關的。
兩者可以同時進行學習。關於在哪裡看論文,可以看一下CCF推薦排名,了解一下這個領域里有哪些優秀的會議。
下面介紹兩個圖像與機器學習領域的著名頂級會議:
CVPR:與另兩個會議ICCV和ECCV合稱計算機視覺領域的三大會,注意會議每年的主頁是變動的,因此搜索需要加上年份;Conference on Neural Information Processing Systems:簡稱NIPS,許多重要的工作發表在這上面,例如關於CNN的一篇重要論文就是發表在上面;
8.自由學習
到這里了,可以說是進入這個門了。下面可以依據興趣來自由學習。前階段不推薦的學習資源也可隨意學習,下面是點評:
cs229:Ng寫的講義很不錯,其中關於SVM的推導部分很清晰,想學習SVM推薦;Neural Networks for Machine Learning:大牛的視角跟人就是不一樣,看看Hinton對神經網路是怎麼看的,往往會讓你有種原來如此的感悟。其實看這門課程也等同於讀論文,因為幾乎每節課的參考資料里都有論文要你讀;CS231n: Convolutional Neural Networks for Visual Recognition:最新的知識,還有詳細的作業。國內應該有團隊對字幕進行了翻譯,可以找找;PRML:作為一門經典的機器學習書籍,是很有閱讀必要的,會讓你對機器學習擁有一個其他的觀察視角;
五.總結
本文的目的是幫助對AI領域了解不深,但又想進入的同學踏入這個門。這里只說踏入,是因為這個領域的專精實在非常困難,需要數年的積累與努力。在進行領域學習前,充分認識自己的特點,制定合適的學習方法是十分重要的。
首先得對這個領域進行充分了解,培養興趣。在學習時,保持著循序漸進的學習方針,不要猛進的學習過難資源;結合著學習與實踐相輔的策略,不要只讀只看,實際動手才有成就感。學習某個資源時要有充分的目的,不是為了學開源項目而看代碼,而是為了寫開源項目而看;不是為了發論文而寫論文,而是為了做事情而寫論文。
本文來自公眾號:「大技術技術匯」,guanzhu了解大數據行業學習大數據技術和學習路線,還有免費學習資料放送。
如果一個學習資源對你過難,並不代表一定是你的問題,可能是學習資源的演講或撰寫人的問題。能把難的問題講簡單的人才是真正有水平的人。所以,一定要學習優質資源,而不是不分青紅皂白的學習。最後,牢記以興趣來學習。學習的時間很長,過程也很艱難,而只有興趣才是讓你持之以恆,攻克難關的最佳助力。
⑵ 程序員的邏輯思維可以從哪些方面進行培養呢
程序員邏輯思維的培養對軟體工程非常重要,思維快的能快速編寫邏輯代碼。可以從一下幾個方面進行慢慢培養。
第一:明確學習目的
邏輯思維學習編程對多數IT業人員來說都是非常有用的。學編程,做一名編程人員,從個人角度講,可以解決在軟體使用中所遇到的問題,改進現有軟體,可以為自己找到一份理想的工作添加重要得砝碼,有利於在求職道路上謀得一個好的職位;從國家的角度,可以為中國的軟體產業做出應有的貢獻,一名優秀的程序員永遠是被爭奪的對象。學習編程還能鍛煉思維,使我們的邏輯思維更加嚴密;能夠不斷享受到創新的樂趣,將一直有機會走在高科技的前沿,因為程序設計本身是一種創造性的工作。知識經濟時代給我們帶來了無限的機會,要想真正掌握計算機技術,並在IT行業里干出一番事業來,有所作為,具有一定的編程能力是一個基本條件和要求。
第二打好基礎,學好基礎知識對我們開發也很重要學編程要具備一定的基礎,總結之有以下幾方面:
首先是數學基礎 從計算機發展和應用的歷史來看計算機的數學模型和體系結構等都是有數學家提出的,最早的計算機也是為數值計算而設計的。因此,要學好計算機就要有一定的數學基礎,出學者有高中水平就差不多了。
其次是邏輯思維能力的培養 學程序設計要有一定的邏輯思維能力,「邏思力」的培養要長時間的實踐鍛煉。要想成為一名優秀的程序員,最重要的是掌握編程思想。要做到這一點必須在反復的實踐、觀察、分析、比較、總結中逐漸地積累。因此在學習編程過程中,我們不必等到什麼都完全明白了才去動手實踐,只要明白了大概,就要敢於自己動手去體驗。誰都有第一次。有些問題只有通過實踐後才能明白,也只有實踐才能把老師和書上的知識變成自己的,高手都是這樣成材的。最後是選擇一種合適的入門語言 面對各種各樣的語言,應按什麼樣的順序學呢?程序設計工具不外乎如下幾類: 1)本地開發 應用軟體開發的工具有:Visual Basic 、Delphi 、VC++ ( C++ Builder ) 等;資料庫開發工具有:Visual Foxpro 、Oracle Developer 、Power Builder 等。 2)跨平台開發 開發工具如 Java 等。 3)網路開發 對客戶端開發工具如:Java Script 等;對伺服器開發工具如:PHP 、ASP 、JSP 、ISAPI 、NSAPI 、CGI 等。 以上不同的環境下幾種開發工具中 VB 法簡單並容易理解,界面設計是可設化的,易學、易用。選 VB 作為入門的方向對出學者是較為適合的。
第三:注意理解一些重要概念
一本程序設計的書看到的無非就是變數、函數、條件語句、循環語句等概念,但要真正能進行編程應用,需要深入理解這些概念,在理解的基礎上應用,不要只簡單地學習語法、結構,而要吃透針對這些語法、結構的應用例子,做到舉一反三,觸類旁通。
第四:掌握編程思想,編程思想使用較多的就是oop編程思想
學習一門語言或開發工具,語法結構、功能調用是次要的,最主要是學習它的思想。例如學習 VC 就要學習 Windows 的內在機理、什麼是線程......;學習 COM 就要知道VTALBE 、類廠、介面、idl......,關鍵是學一種思想,有了思想,那麼我們就可以觸類旁通。
第六:多實踐、多交流,一切思維來自項目開發的積累
掌握編程思想必須在編程實際工作中去實踐和體會。編程起步階段要經常自己動手設計程序,具體設計時不要拘泥於固定的思維方式,遇到問題要多想幾種解決的方案。這就要多交流,各人的思維方式不同、角度各異,各有高招,通過交流可不斷吸收別人的長處,豐富編程實踐,幫助自己提高水平。親自動手進行程序設計是創造性思維應用的體現,也是培養邏輯思維的好方法。
第七:養成良好的編程習慣
編程入門不難,但入門後不斷學習是十分重要的,相對來說較為漫長。在此期間要注意養成一些良好的編程習慣。編程風格的好壞很大程度影響程序質量。良好的編程風格可以使
程序結構清晰合理,且使程序代碼便於維護。如代碼的縮進編排、變數命令規則的一致性、代碼的注釋等。
第八:上網學編程
在網上可以學到很多不同的編程思想、方法、經驗和技巧,有大量的工具和作品及相關的輔導材料供下載
8.加強計算機理論知識的再學習
思維培養學編程是符合「理論→實踐→再理論→再實踐」的一個認識過程。一開始要具有一定的計算機理論基礎知識,包括編程所需的數學基礎知識,具備了入門的條件,就可以
開始編程的實踐,從實踐中可以發現問題需要加強計算機理論知識的再學習。程序人人皆可編,但當你發現編到一定程度很難再提高的時候,就要回頭來學習一些計算機科學和數
學基礎理論。學過之後,很多以前遇到的問題都會迎刃而解,使人有豁然開朗之感。因此在學習編程的過程中要不斷地針對應用中的困惑和問題深入學習數據結構、演算法、計算機
原理、編譯原理、操作系統原理、軟體工程等計算機科學的理論基礎和數理邏輯、代數系統、圖論、離散數學等數學理論基礎知識。這樣經過不斷的學習,再努力地實踐,編程水平一定會不斷提高到一個新高度。
這就是總結出來的思維培養模式,希望能幫到你,謝謝!
⑶ 作為剛入職的java程序員,一年時間內如何提升自己的實力,更有競爭力
剛入職,就意味著你有基礎,但是還沒有到精通,那以下這幾點你要好好看看
1.用好互聯網
在你入行的第一年,肯定會遇到各種各樣的問題,但不用擔心,這些問題其他人肯定也遇到過。
這是一個開源的時代!人們習慣將解決辦法記錄在網上。
越早的學會使用goole尋求幫助,問題就會越早得到解決。(但是在看別的代碼或解決bug的時候,不能直接Ctrl+C,Ctrl+V,要弄明白其中的原理)
2.養成良好的編譯習慣
你是公司的一員,是團隊協作來完成整個項目的,也就是說你的代碼不僅要你自己看得懂,更要讓團隊中的小夥伴和你的領導看得懂。
所以起名稱規范一些,保持代碼結構清晰,多寫一點注釋!
3.基礎理論很重要
如果你只想成為一個普通的碼農,基礎理論知識的確沒那麼重要;
但當你想往上走,想成為一名專業的架構師,數據結構、操作系統原理、資料庫原理等基礎知識是必不可少的,這些基礎知識決定了你能在技術這條路上走多久,走多遠!
4.不斷學習
這不是什麼雞湯,而是程序員界一個殘酷的現實。就拿游戲開發者來說 一個引擎unity3D,幾個月就要更新換代一次,是想,你如果不學新技術根本就無法繼續操作,如果技術一年不跟進,你和unity3D就會形同陌路。任何課程、資料都該看要看。
5.你是一個開發者,而不是一個碼農
很多新人在入行前幾年一直以一個流水線員工的心態做業務,這樣是不行的。
於自身發展來說,長期重復的工作使你接觸不到核心業務,限制你能力的拓深和發展;於企業而言,企業需要的不是只會搬磚的碼農,而是一個開發者。
6.多讀優秀的代碼
山外有山,人外有人。
世界上比你優秀的程序員太多了,想要跟著大神學習進階,還得感謝這個開源的時代。不錯的平台有很多,裡面有很多優秀的程序員們的代碼,只要你需要就可以閱讀。
希望這些建議對你有用,有所收獲。
⑷ 程序員如何進階
鏈接:http://pan..com/s/1p1G4NCUtPNVvkkXE7qxFbQ
程序員進階攻略。如何才能持續成長,是每一個程序員都繞不開的話題。入行之初,你可能會困惑於技能選擇的方向和掌握的方法;編程前期,你可能會苦惱於Bug的調試與修復;技術水平達到瓶頸期,你可能又急於尋求突破和上升。除此之外,職業倦怠了,如何去面對?技術停滯了,如何去解決?人到中年,是選擇工作還是選擇生活?換工作?換城市?換方向?如是種種,磨蝕著曾經的樂觀和現在的不甘,是放任自流還是逆流而上?
課程目錄:
開篇詞 (1講)
開篇詞 | 程序行知:走在同樣的路上,遇見自己的風景
征途:啟程之初 (4講)
01 | 初心:為什麼成為一名程序員?
02 | 初惑:技術方向的選擇
03 | 初程:帶上一份技能地圖
04 | 初感:別了校園,入了江湖
修煉:程序之術 (10講)
05 | 架構與實現:它們的連接與分界?
......
⑸ 畢業之後從事程序員,該怎樣規劃自己的職業方向呢
第一,應屆畢業生需要快速積累經驗。
履歷和學歷都非常重要,如果哪個欠缺,就趁年輕趕緊彌補。一線互聯網公司對於學歷和履歷尤其看重。你前期不要過分看重薪資,如果一個大廠和一個小公司同時向你拋出橄欖枝,即使小公司給的再多,也要優先考慮大公司。假如你不是985高校或者碩士,你就要從技術層面快速提高自己。如果你在小公司里工作,爭取三年內進入一線互聯網公司。如果想要在這一行業長久發展,要有市場行情分析的能力,去學習最火的大數據,機器學習演算法等領域,必要時可以果斷轉行。
第五,最重要的一點:多存錢,為了以後做自己的產品
你是否甘願一直打工,一直看他們眼色?不,程序員高傲的內心不允許他這樣做。所以,老老實實多存點錢,為了以後自己創業做資金儲備才是王道。
⑹ 程序員如何在35歲瓶頸期的時候,找到自己的方向
1程序員的困惑
程序員是一個神奇的職業。日復一日面對著電腦,一行一行地碼著代碼,給人的印象是呆頭呆腦,不善於交流和溝通,加班是經常的事,彷彿永遠都有干不完的活,身心都很疲憊。但事實上呢?
大多數程序員,他們熱愛編程, 對很多技術充滿興趣, 總是希望學習並嘗試新奇的技術, 在業余也花了很多時間學習工作中暫時用不到,但是自己很感興趣並且很看好的技術,從進入到第一家軟體公司,後來一直沒有離開軟體行業。
⑺ 要成為一名專業的程序員,從零開始需要怎麼一步步來比較好,要把最底層的先學精通嗎(個人認為)求學長
前言
你是否覺得自己從學校畢業的時候只做過小玩具一樣的程序?走入職場後哪怕沒有什麼經驗也可以把以下這些課外練習走一遍(朋友的抱怨:學校課程總是從理論出發,作業項目都看不出有什麼實際作用,不如從工作中的需求出發)
建議:
不要亂買書,不要亂追新技術新名詞,基礎的東西經過很長時間積累而且還會在未來至少10年通用。
回顧一下歷史,看看歷史上時間線上技術的發展,你才能明白明天會是什麼樣。
一定要動手,例子不管多麼簡單,建議至少自己手敲一遍看看是否理解了里頭的細枝末節。
一定要學會思考,思考為什麼要這樣,而不是那樣。還要舉一反三地思考。
註:你也許會很奇怪為什麼下面的東西很偏Unix/Linux,這是因為我覺得Windows下的編程可能會在未來很沒有前途,原因如下:
現在的用戶界面幾乎被兩個東西主宰了,1)Web,2)移動設備iOS或Android。Windows的圖形界面不吃香了。
越來越多的企業在用成本低性能高的Linux和各種開源技術來構架其系統,Windows的成本太高了。
微軟的東西變得太快了,很不持久,他們完全是在玩弄程序員。詳情參見《Windows編程革命史》
所以,我個人認為以後的趨勢是前端是Web+移動,後端是Linux+開源。開發這邊基本上沒Windows什麼事。
啟蒙入門
1、 學習一門腳本語言,例如Python/Ruby
可以讓你擺脫對底層語言的恐懼感,腳本語言可以讓你很快開發出能用得上的小程序。實踐項目:
處理文本文件,或者csv (關鍵詞 python csv, python open, python sys) 讀一個本地文件,逐行處理(例如 word count,或者處理log)
遍歷本地文件系統 (sys, os, path),例如寫一個程序統計一個目錄下所有文件大小並按各種條件排序並保存結果
跟資料庫打交道 (python sqlite),寫一個小腳本統計資料庫里條目數量
學會用各種print之類簡單粗暴的方式進行調試
學會用Google (phrase, domain, use reader to follow tech blogs)
為什麼要學腳本語言,因為他們實在是太方便了,很多時候我們需要寫點小工具或是腳本來幫我們解決問題,你就會發現正規的編程語言太難用了。
2、 用熟一種程序員的編輯器(不是IDE) 和一些基本工具
Vim / Emacs / Notepad++,學會如何配置代碼補全,外觀,外部命令等。
Source Insight (或 ctag)
使用這些東西不是為了Cool,而是這些編輯器在查看、修改代碼/配置文章/日誌會更快更有效率。
3、 熟悉Unix/Linux Shell和常見的命令行
如果你用windows,至少學會用虛擬機里的linux, vmware player是免費的,裝個Ubuntu吧
一定要少用少用圖形界面。
學會使用man來查看幫助
文件系統結構和基本操作 ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip …
學會使用一些文本操作命令 sed/awk/grep/tail/less/more …
學會使用一些管理命令 ps/top/lsof/netstat/kill/tcpmp/iptables/dd…
了解/etc目錄下的各種配置文章,學會查看/var/log下的系統日誌,以及/proc下的系統運行信息
了解正則表達式,使用正則表達式來查找文件。
對於程序員來說Unix/Linux比Windows簡單多了。(參看我四年前CSDN的博文《其實Unix很簡單》)學會使用Unix/Linux你會發現圖形界面在某些時候實在是太難用了,相當地相當地降低工作效率。
4、 學習Web基礎(HTML/CSS/JS) + 伺服器端技術 (LAMP)
未來必然是Web的世界,學習WEB基礎的最佳網站是W3School。
學習HTML基本語法
學習CSS如何選中HTML元素並應用一些基本樣式(關鍵詞:box model)
學會用 Firefox + Firebug 或 chrome 查看你覺得很炫的網頁結構,並動態修改。
學習使用Javascript操縱HTML元件。理解DOM和動態網頁(Dynamic HTML: The Definitive Reference, 3rd Edition - O'Reilly Media) 網上有免費的章節,足夠用了。或參看 DOM 。
學會用 Firefox + Firebug 或 chrome 調試Javascript代碼(設置斷點,查看變數,性能,控制台等)
在一台機器上配置Apache 或 Nginx
學習PHP,讓後台PHP和前台HTML進行數據交互,對伺服器相應瀏覽器請求形成初步認識。實現一個表單提交和反顯的功能。
把PHP連接本地或者遠程資料庫 MySQL(MySQL 和 SQL現學現用夠了)
跟完一個名校的網路編程課程(例如:http://www.stanford.e/~ouster/cgi-bin/cs142-fall10/index.php ) 不要覺得需要多於一學期時間,大學生是全職一學期選3-5門課,你業余時間一定可以跟上
學習一個javascript庫(例如jQuery 或 ExtJS)+ Ajax (非同步讀入一個伺服器端圖片或者資料庫內容)+JSON數據格式。
HTTP: The Definitive Guide 讀完前4章你就明白你每天上網用瀏覽器的時候發生的事情了(proxy, gateway, browsers)
做個小網站(例如:一個小的留言板,支持用戶登錄,Cookie/Session,增、刪、改、查,上傳圖片附件,分頁顯示)
買個域名,租個空間,做個自己的網站。
進階加深
1、 C語言和操作系統調用
重新學C語言,理解指針和內存模型,用C語言實現一下各種經典的演算法和數據結構。推薦《計算機程序設計藝術》、《演算法導論》和《編程珠璣》。
學習(麻省理工免費課程)計算機科學和編程導論
學習(麻省理工免費課程)C語言內存管理
學習Unix/Linux系統調用(Unix高級環境編程),,了解系統層面的東西。
用這些系統知識操作一下文件系統,用戶(實現一個可以拷貝目錄樹的小程序)
用fork/wait/waitpid寫一個多進程的程序,用pthread寫一個多線程帶同步或互斥的程序。多進程多進程購票的程序。
用signal/kill/raise/alarm/pause/sigprocmask實現一個多進程間的信號量通信的程序。
學會使用gcc和gdb來編程和調試程序(參看我的《用gdb調試程序》)
學會使用makefile來編譯程序。(參看我的《跟我一起寫makefile》)
IPC和Socket的東西可以放到高級中來實踐。
學習Windows SDK編程(Windows 程序設計 ,MFC程序設計)
寫一個窗口,了解WinMain/WinProcere,以及Windows的消息機制。
寫一些程序來操作Windows SDK中的資源文件或是各種圖形控制項,以及作圖的編程。
學習如何使用MSDN查看相關的SDK函數,各種WM_消息以及一些常式。
這本書中有很多常式,在實踐中請不要照抄,試著自己寫一個自己的常式。
不用太多於精通這些東西,因為GUI正在被Web取代,主要是了解一下Windows 圖形界面的編程。@virushuo 說:「 我覺得GUI確實不那麼熱門了,但充分理解GUI工作原理是很重要的。包括移動設備開發,如果沒有基礎知識仍然很吃力。或者說移動設備開發必須理解GUI工作,或者在win那邊學,或者在mac/iOS上學」。
2、學習Java
Java 的學習主要是看經典的Core Java 《Java 核心技術編程》和《Java編程思想》(有兩卷,我僅鏈了第一卷,足夠了,因為Java的圖形界面了解就可以了)
學習JDK,學會查閱Java API Doc Java Platform SE 6
了解一下Java這種虛擬機語言和C和Python語言在編譯和執行上的差別。從C、Java、Python思考一下「跨平台」這種技術。
學會使用IDE Eclipse,使用Eclipse 編譯,調試和開發Java程序。
建一個Tomcat的網站,嘗試一下JSP/Servlet/JDBC/MySQL的Web開發。把前面所說的那個PHP的小項目試著用JSP和Servlet實現一下。
3、Web的安全與架構
學習HTML5,網上有很多很多教程,以前酷殼也介紹過很多,我在這里就不羅列了。
學習Web開發的安全問題(參考新浪微博被攻擊的這個事,以及Ruby的這篇文章)
學習HTTP Server的rewrite機制,Nginx的反向代理機制,fast-cgi(如:PHP-FPM)
學習Web的靜態頁面緩存技術。
學習Web的非同步工作流處理,數據Cache,數據分區,負載均衡,水平擴展的構架。
實踐任務:
使用HTML5的canvas 製作一些Web動畫。
嘗試在前面開發過的那個Web應用中進行SQL注入,JS注入,以及XSS攻擊。
把前面開發過的那個Web應用改成構造在Nginx + PHP-FPM + 靜態頁面緩存的網站
4、學習關系型資料庫
你可以安裝MSSQLServer或MySQL來學習資料庫。
學習教科書里資料庫設計的那幾個範式,1NF,2NF,3NF,……
學習資料庫的存過,觸發器,視圖,建索引,游標等。
學習SQL語句,明白表連接的各種概念(參看《SQL Join的圖示》)
學習如何優化資料庫查詢(參看《MySQL的優化》)
實踐任務:設計一個論壇的資料庫,至少滿足3NF,使用SQL語句查詢本周,本月的最新文章,評論最多的文章,最活躍用戶。
5、一些開發工具
學會使用SVN或Git來管理程序版本。
學會使用JUnit來對Java進行單元測試。
學習C語言和Java語言的coding standard 或 coding guideline。(我N年前寫過一篇關C語言非常簡單的文章——《編程修養》,這樣的東西你可以上網查一下,一大堆)。
推薦閱讀《代碼大全》《重構》《代碼整潔之道》
高級深入
1、C++ / Java 和面向對象
我個人以為學好C++,Java也就是舉手之勞。但是C++的學習曲線相當的陡。不過,我覺得C++是最需要學好的語言了。參看兩篇趣文「C++學習信心圖」 和「21天學好C++」
學習(麻省理工免費課程)C++面向對象編程
讀我的 「如何學好C++」中所推薦的那些書至少兩遍以上(如果你對C++的理解能夠深入到像我所寫的《C++虛函數表解析》或是《C++對象內存存局(上)(下)》,或是《C/C++返回內部靜態成員的陷阱》那就非常不錯了)
然後反思為什麼C++要干成這樣,Java則不是?你一定要學會對比C++和Java的不同。比如,Java中的初始化,垃圾回收,介面,異常,虛函數,等等。
實踐任務:
用C++實現一個BigInt,支持128位的整形的加減乘除的操作。
用C++封裝一個數據結構的容量,比如hash table。
用C++封裝並實現一個智能指針(一定要使用模板)。
《設計模式》必需一讀,兩遍以上,思考一下,這23個模式的應用場景。主要是兩點:1)鍾愛組合而不是繼承,2)鍾愛介面而不是實現。(也推薦《深入淺出設計模式》)
實踐任務:
使用工廠模式實現一個內存池。
使用策略模式製做一個類其可以把文本文件進行左對齊,右對齊和中對齊。
使用命令模式實現一個命令行計算器,並支持undo和redo。
使用修飾模式實現一個酒店的房間價格訂價策略——旺季,服務,VIP、旅行團、等影響價格的因素。
學習STL的用法和其設計概念 - 容器,演算法,迭代器,函數子。如果可能,請讀一下其源碼。
實踐任務:嘗試使用面向對象、STL,設計模式、和WindowsSDK圖形編程的各種技能
做一個貪吃蛇或是俄羅斯方塊的游戲。支持不同的級別和難度。
做一個文件瀏覽器,可以瀏覽目錄下的文件,並可以對不同的文件有不同的操作,文本文件可以打開編輯,執行文件則執行之,mp3或avi文件可以播放,圖片文件可以展示圖片。
學習C++的一些類庫的設計,如: MFC(看看候捷老師的《深入淺出MFC》) ,Boost, ACE, CPPUnit,STL (STL可能會太難了,但是如果你能了解其中的設計模式和設計那就太好了,如果你能深入到我寫的《STL string類的寫時拷貝技術》那就非常不錯了,ACE需要很強在的系統知識,參見後面的「加強對系統的了解」)
Java是真正的面向對象的語言,Java的設計模式多得不能再多,也是用來學習面向對象的設計模式的最佳語言了(參看Java中的設計模式)。
推薦閱讀《Effective Java》 and 《Java解惑》
學習Java的框架,Java的框架也是多,如Spring, Hibernate,Struts 等等,主要是學習Java的設計,如IoC等。
Java的技術也是爛多,重點學習J2EE架構以及JMS, RMI, 等消息傳遞和遠程調用的技術。
學習使用Java做Web Service (官方教程在這里)
實踐任務: 嘗試在Spring或Hibernate框架下構建一個有網路的Web Service的遠程調用程序,並可以在兩個Service中通過JMS傳遞消息。
C++和Java都不是能在短時間內能學好的,C++玩是的深,Java玩的是廣,我建議兩者選一個。我個人的學習經歷是:
深究C++(我深究C/C++了十來年了)
學習Java的各種設計模式。
2、加強系統了解
重要閱讀下面的幾本書:
《Unix編程藝術》了解Unix系統領域中的設計和開發哲學、思想文化體系、原則與經驗。你一定會有一種醍醐灌頂的感覺。
《Unix網路編程卷1,套接字》這是一本看完你就明白網路編程的書。重要注意TCP、UDP,以及多路復用的系統調用select/poll/epoll的差別。
《TCP/IP詳解 卷1:協議》- 這是一本看完後你就可以當網路黑客的書。了解乙太網的的運作原理,了解TCP/IP的協議,運作原理以及如何TCP的調優。
實踐任務:
理解什麼是阻塞(同步IO),非阻塞(非同步IO),多路復用(select, poll, epoll)的IO技術。
寫一個網路聊天程序,有聊天伺服器和多個聊天客戶端(服務端用UDP對部分或所有的的聊天客戶端進Multicast或Broadcast)。
寫一個簡易的HTTP伺服器。
《Unix網路編程卷2,進程間通信》信號量,管道,共享內存,消息等各種IPC…… 這些技術好像有點老掉牙了,不過還是值得了解。
實踐任務:
主要實踐各種IPC進程序通信的方法。
嘗試寫一個管道程序,父子進程通過管道交換數據。
嘗試寫一個共享內存的程序,兩個進程通過共享內存交換一個C的結構體數組。
學習《Windows核心編程》一書。把CreateProcess,Windows線程、線程調度、線程同步(Event, 信號量,互斥量)、非同步I/O,內存管理,DLL,這幾大塊搞精通。
實踐任務:使用CreateProcess啟動一個記事本或IE,並監控該程序的運行。把前面寫過的那個簡易的HTTP服務用線程池實現一下。寫一個DLL的鉤子程序監控指定窗口的關閉事件,或是記錄某個窗口的按鍵。
有了多線程、多進程通信,TCP/IP,套接字,C++和設計模式的基本,你可以研究一下ACE了。使用ACE重寫上述的聊天程序和HTTP伺服器(帶線程池)
實踐任務:通過以上的所有知識,嘗試
寫一個服務端給客戶端傳大文件,要求把100M的帶寬用到80%以上。(注意,磁碟I/O和網路I/O可能會很有問題,想一想怎麼解決,另外,請注意網路傳輸最大單元MTU)
了解BT下載的工作原理,用多進程的方式模擬BT下載的原理。
3、系統架構
負載均衡。HASH式的,純動態式的。(可以到Google學術里搜一些關於負載均衡的文章讀讀)
多層分布式系統 – 客戶端服務結點層、計算結點層、數據cache層,數據層。J2EE是經典的多層結構。
CDN系統 – 就近訪問,內容邊緣化。
P2P式系統,研究一下BT和電驢的演算法。比如:DHT演算法。
伺服器備份,雙機備份系統(Live-Standby和Live-Live系統),兩台機器如何通過心跳監測對方?集群主結點備份。
虛擬化技術,使用這個技術,可以把操作系統當應用程序一下切換或重新配置和部署。
學習Thrift,二進制的高性能的通訊中間件,支持數據(對象)序列化和多種類型的RPC服務。
學習Hadoop。Hadoop框架中最核心的設計就是:MapRece和HDFS。MapRece的思想是由Google的一篇論文所提及而被廣為流傳的,簡單的一句話解釋MapRece就是「任務的分解與結果的匯總」。HDFS是Hadoop分布式文件系統(Hadoop Distributed File System)的縮寫,為分布式計算存儲提供了底層支持。
了解NoSQL資料庫(有人說可能是一個過渡炒作的技術),不過因為超大規模以及高並發的純動態型網站日漸成為主流,而SNS類網站在數據存取過程中有著實時性等剛性需求,這使得目前NoSQL資料庫慢慢成了人們所關注的焦點,並大有成為取代關系型資料庫而成為未來主流數據存儲模式的趨勢。當前NoSQL資料庫很多,大部分都是開源的,其中比較知名的有:MemcacheDB、Redis、Tokyo Cabinet(升級版為Kyoto Cabinet)、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。
⑻ 軟體研發工程師(程序員)怎麼規劃自己的職業發展方向
軟體工程師的職業規劃主要有以下幾步:
兩年以上的小型企業-四年左右的中型企業-大型企業或跨國集團公司
第一步,小企業的軟體開發設計編程人員;
第二步,進入大中型企業,同樣的軟體設計編程工作,工資就可能完全不同了,一般都在3000元以上,做了部門經理時,還可高達5000元或以上;
第三步,學習更全面的知識成為普通的軟體工程工資高達3500元以上;
第四步,學習更全面的知識成為專業的軟體工程師,如軟體設計工程師,系統分析工程師的工資就可以高達8000元以上,做大型企業或專業軟體公司IT經理的工資就更高了,基本在萬元以上。。
⑼ 程序員,如何少走彎路,成為一名技術專家或者架構師
#1 專業技能
@首先當然基礎知識要扎實,一些經典的專業書籍一定要看。比如,設計模式,演算法,數據結構,所在領域的編程語言的專業書籍等.關於不同的能力階段,需要讀取什麼類型的書籍,請參考ThoughtWorks(中國)程序員讀書雷達,每年都有更新。
@作為架構師,review別人的代碼並給出合理的建議是基本功,比如變數或者方法命名的規則;所以代碼大全,重構,改善既有代碼的設計,Clean code 等等肯定需要看。
@ 對於某一個技術領域或者業務領域,一定要有一門技術是精通的,因為這樣你才能體會到以後遇到自己不懂的技術的時候,如何能夠快速成為這一方面的行家。
@ 平常有時間一定要多多進行代碼的訓練,也就是Martin Flower常說的Kata練習,這個比喻來自於跆拳道,跆拳道選手一般每天都會找一些基本的招式,進行反復的練習,從而訓練肌肉的條件發射,那麼對於我們程序員來說,一定也要進行持續的編程訓練,比如上面提到的那位同事,給的建議是,雖然把大部分時間花在了溝通和協調上面,沒有機會寫代碼,但是自己一定要利用業余時間,自己找一些例子來聯系,比如,參與開源項目,或者到網上去搜索一些大師的經典Kata聯系的例子;或者看工作裡面是否有一些小工具,是否能夠提升自己的溝通效率,當然已經天天寫代碼的童鞋們除外。請參考我轉發的另外一篇文章和另外一篇介紹能在線練習Kata code的文章.
@ 最好能夠在精通一門語言的基礎之上,學習其他的語言,從而站在一個更高的角度,對於程序語言有一個更高層次的抽象認識,比如,學了Java之後,可以學學Ruby,Groovy,C#等等,其實語言之間都是相互借鑒的,比如Lamba表達式,連java也慢慢的向函數式編程方向靠攏。
@ 如果有時間,一定要自己維護一個博客,既然選擇了架構師,就決定了自己以後不僅僅是一個技術專家,同時也要成為一個佈道師,為企業組織或者社會上的其他IT同行們貢獻自己的一些微薄之力。
@ 多參加一些社會上舉辦的軟體專業會議或者活動,了解當前比較流行的技術和框架。
@ 這條不提倡,我以前有一個同事,幾乎每年都要更新簡歷1~2次,目的不是真正的換工作,而是通過面試得到當前市場上大部分公司正在使用什麼技術和框架。對於這條,請慎用!!!!
@如果有結對編程的機會一定要好好珍惜,特別是和高手大拿一起結對的時候。
@如果大家上面都已經做的非常的好了,這個時候可以看看架構設計方面的書籍,比如企業應用架構模式,架構之美等等。
@ 去51Job上搜索架構師這個職位標簽,看看不同行業的企業對於架構師的技術要求和標准,然後結合自己當前所處的行業和你自己的技術特點,比如擅長前段或者後端,有選擇性的學習一些自己感興趣的技術或者方法。
@ 關於常用的網站,沒有定論,筆者主要是根據搜索的結果去發現適合自己的網站,所以需要讀者掌握一定的搜索的技巧,筆者一般喜歡用英文搜索,這樣的話資料比較全也比較新;如果下載電子書的話或者查看博客的話 一般會首選CSDN;如果是解決工作中的問題的話,在StackOverFlow上面被解答的概率是最大的,此外平常自己也需要去積累一些自己感興趣的技術的人氣比較旺的網站列表,比如一般和Window相關的就是MSDN;如果對Java入門比較感興趣,可以看看這個網站。對於一些開源的框架,一般都會有想對應的社區,google一搜索,很快就能找到。另外一個德國人寫的博客的非常的精緻,如果對Eclipse插件開發特別感興趣的朋友們可以去參考它。
@大家如果時間和精煉允許,最好能在Github開源和分享自己平常寫的代碼。這樣一方面可以熟悉git用法,另外一方面也可以把自己平常練手的代碼免費保存,何樂而不為呢?
@如果大家平常遇到什麼問題,可以到StackOverFlow上面去尋找答案;當然,如果你能自己注冊一個StackOverFlow賬號那是最好不過的,這樣不但可以提問,還可以幫助別人,同時上面還有很多工作簽證的工作機會。
#2 軟技能(現代社會,一個合格科學家不僅僅是某一個行業的技術專家同時也是一名專業的社會活動家)
@遇到問題,一定要多想,遇到一個問題,如果解決了,就要反思為什麼能夠解決,如果以後遇到類似的問題,
如何更快速的解決。
@英語的重要性,不言而喻,因為現在很多新技術的框架的中文文檔非常的少,即使翻譯成中文,也是二手的了(國內自己的開發的一些開源框架除外)
@ 有時間的話,看一些溝通方面的書籍,如果有參與溝通的機會的時候,一定要想如何把溝通做的更好更舒暢。
@ 如果有機會的話,可以參加PMP的考試,關於如何備考PMP,請大家參閱另外一篇文章:如何備考PMP,但是如果不想參加的話,也沒有關系,至少要涉獵到項目管理方面的書籍,否則以後如果成為架構師之後,客戶或者管理者給你說一些項目管理上一些專業術語時,到時候就會一頭霧水。
@架構師其實從某種意義上就是一種角色,而不是一種職位。一定要時時刻刻保持空杯心態。
@一定要有一顆保持飢渴學習和耐得住寂寞的赤子之心。
@當前的技術節湊是非常快的,特別是結婚以後又有小孩了。一定要好好的利用自己碎片時間,對於一些技術,當時讀不懂不要緊,但是一定要記住和了解其關鍵詞,這個主要是為了拓寬自己的視野。比如,當前你想自己開發一個系統,結果已經有一個開源框架實現了,而且還很穩定,這個時候,自己就沒有必要重復發明輪子了。
@與不同的技術、編程語言、設計模式和結構等(甚至是它並沒有在日常中給予你直接的幫助)打交道。你永遠都不知道這些知識是否會在未來派上用場,但是對你絕對是有益無害。
@在工作中,能夠幫助到別人解決技術難題,一定要盡量全力以赴,因為這不但可以贏得同事的好感和口碑,同時也能增長你解決問題的經驗和提高你的技術思維能力
@ 一定要掌控好自己的時間,對工作沒有幫助的會議,能不參加盡量不要參加,當然,企業安全,公司規章制度如果是強制性的,該參加還得參加,但是如果沒有工作效率和扯皮的會議,盡量避免參加。
@程序員要耐得住寂寞,要在自己的領域深挖,不能看啥火,就學啥,一定要有自己的想法和判定,如果決定不了,可以向資深的同事或者朋友溝通。
@盡量參與到項目中的編碼,因為架構師不能與項目脫離。
@ 如果有機會可以鍛煉一下自己在大眾環境下的演講和PTT的能力。
@有機會多做知識分享,因為你一旦分享了知識,你就會對這門技術有深刻的印象,同時也能樹立在同事中的良好的技術形象,從而贏得更多的專家影響力而不是職位影響力。
上面只是我當前能想到的,知易行難,知道了上面的一些經驗,並不代表年輕程序員們就能馬上成功,畢竟這需要一個鳳凰涅槃和實踐的過程,但是肯定能幫助有志於於此的年輕程序員們少走一些彎路,限於筆者水平,如有總結不恰當或者不到位的地方,還望批評指正。