寫給想當程式員的朋友們
(一) 文章由來及個人經曆
我是一名電腦專業的本科畢業生,畢業已經1年多了。畢業後從事的是軟體編程工作,經常有其他專業的朋友想從事軟體編程工作,向我請教如何,因為我自覺涉行不深,不敢信口開河,無奈朋友信任,我不得不鄭重考慮一下這個問題了,來協助朋友選擇和回報朋友的信任。
這也就是此文的由來。
還是先談談我個人的經曆吧。(是不是有點俗套,但我覺得瞭解我的經曆,有助於理解我話的含義;我一向認為不瞭解古龍的生活經曆的,不會真正讀懂古龍的作品和古龍筆下的英雄的)我本科就讀於南方一所著名的高校(因為自己的不成氣,愧談母校名謂),學的就是電腦專業。上本科時,幾乎沒有認真的聽完一門專業課程,上課看報紙睡大覺,下課看錄影看小說看球賽,臨考抱佛腳,每次考試和課程設計都是矇混過關。(於之相對是,我選修的工商管理和經濟貿易方面的課到是聽得不亦樂乎,考的分數頗高,也許這才是我的真正興趣所在。)
總而言之,大學是混過來了,對專業的理解和掌握程度,應該沒有達到畢業要求的合格水平。(也很後悔,但是有什麼用呢,當時不知道珍惜;如果上天再給我一次機會的話,我一定會抓住,多看點美國大片少看點港片;現在,重回校園是我的一大理想)但是大學的學習使我有了一個簡單的知識架構(總算學費沒白交),我對一個朋友這樣形容過我的這個知識架構,“它不是鋼筋鑄的,是稻草紮的”,哈哈哈,不要笑,真的,我敢說很多本科畢業的朋友的本專業的知識架構也只不過是“稻草紮的”。直到現在,我一直覺得自己的基礎知識還是很薄弱,一直想抓點時間,把基礎書本好好的溫習一下。(此項任務正在計劃和實施中)
畢業後,分配到某研究所工作。當領導讓我選擇自己以後的工作方向時,我毫不猶豫的選擇了軟體(也不知道到底是對還是錯,但我決不後悔)。此研究所主要是以硬體為核心搞通訊控制裝置的研發生產;軟體是輔助,所以也不受什麼重視,很多搞軟體的人都跳槽走了,留下來的大都是一些已經廢掉和行將廢掉的“偽/萎”程式員(名副其實的“軟體人員”)。在這裡感覺不到什麼高緊張和高技術程度的研究和開發;軟體開發的技術含量極低,以致於大部分人只有半年的學習和開發經驗,以後都是這些知識和經驗的重複利用。(我問過其他到研究所工作的同學,他們說都一樣,嗚呼,我們的國防科研開發呀)對於軟體的開發,領導的意志和老掉牙的經驗在新課題的技術採用和開發中起了決定性作用,沒有明確的需求,沒有明確的開發計劃和進度,大家在一天一天一周一周的浪費著寶貴的時間,最後開發出來的東西修來改去,直至它變成垃圾。 我越來越認識到一點,要麼象那些廢人一樣廢掉,要麼自己去努力尋求出路,反正別指望從工作中得到什麼高明的經驗了(教訓倒也許有)。期間發生了一些感情上的糾紛,嚴重的影響了學習計劃和效果,直到現在浮躁的心仍然有些浮躁。
期間,我讀了一些書,看了一些文章,編過一些小常式,搞了一些沒有什麼技術含量的開發工作,也和一些前輩和高手們談過聊過。 我一直在思考幾個問題;如何學習軟體開發?如何搞軟體開發,國外的軟體開發到底其秘訣在何處?為何我們的軟體業一直在低水平徘徊?我們難道真的離了Microsoft就活不了?我們的程式員到底在浪費時間幹些什嗎?軟體開發到底是如何分類的?我們如何走自己的民族軟體之路?
我想了很久,一些想通了,一些還在想。但我知道有一點是肯定的,那就是我們一定要靠我們自己走出自己的軟體之路!跟在別人屁股後面永遠受制於人!
好了,關於經曆和牢騷就先寫這些吧,該進入我們的正題了。
(二) 你適合當程式員嗎,你知道編程式是怎麼回事嗎?
1、 程式員意味著要編程式。(如果你僅僅想得到一份高薪水的工作,喝喝咖啡就等老闆發薪水,我奉勸你還是另找一份更合適的工作,譬如練攤,真的,兄弟,這份工作不適合你)
2、你是學文的還是學理的,編程式也許需要浪漫,但更需要邏輯和嚴謹。(說坦白點就是,在你沒有找到樂趣以前,它很枯燥)
3、你有對新技術追求的熱情嗎?你有刨根問底的探索精神嗎?(熱情絕對是最重要的!你仔細思考一下自己的性格適合當程式員嗎?)
4、當程式員決不是什麼好差事,時刻需要學習,需要思考。(直到你成為那個可以引導別人去學習和思考的人,你才可以偷偷的嘿嘿笑,又一群傻蛋)
5、程式員的未來很迷茫。(但我認為關鍵看你自己!我希望你是一個有追求的人,不僅僅是混碗飯吃。因為真正的樂趣在於創造;如果你能改變軟體業的曆史,那才是英雄;不想成為Bill Gates,不想成為Dennis Ritchie和 Bjarne Stroustrup,我會說你沒有追求。有個關於程式員未來的笑話,也許你還沒聽過,你該聽一聽,摘抄如下:
一個程式員對自己的未來很迷茫,於是去問上帝。
“萬能的上帝呀,請你告訴我,我的未來會怎樣?”
上帝說“我的孩子,你去問Lippman,他現在領導的程式員的隊伍可能是地球上最大的”
於是他去問Lippman。
Lippman說“程式員的未來就是駕馭程式員”
這個程式員對這個未來不滿意,於是他又去問上帝。
“萬能的上帝呀,請你告訴我,我的未來會怎樣?”
上帝說“我的孩子,你去問Gates,他現在所擁有的財產可能是地球上最多的”
於是他去問Gates。
Gates說“程式員的未來就是榨取程式員”
這個程式員對這個未來不滿意,於是他又去問上帝。
“萬能的上帝呀,請你告訴我,我的未來會怎樣?”
上帝說“我的孩子,你去問侯捷,他寫的電腦書的讀者可能是地球上最多的”
於是他去問侯捷。
侯捷說“程式員的未來就是誘惑程式員”
這個程式員對這個未來不滿意,於是他又去問上帝。
“萬能的上帝呀,請你告訴我,我的未來會怎樣?”
上帝搖搖頭“唉,我的孩子,你還是別當程式員了”)
6、當程式員還是很有樂趣的。(當你學到新知識時,當你有新的思想見解時,當你有新的產品問世時,和知己探討你的成果時…我問你,覺得這些是樂趣嗎?)
7、當程式員不易也不難。(世間事有難易乎?為之…;不為…。你有決心和信心嗎?)
8、你真的要當程式員?是你自己的想法?
9、你捨得花錢買書嗎?(讀好書絕對是學習編程的最佳捷徑。你一定會說,現在電腦書籍真他媽的貴,沒法子,誰讓知識和技術在人家的腦袋,在人家的書裡呢;等你寫書時可以把價格定低一點,記著還有好多沒錢但想買書的兄弟很困難呀。要捨得買書,買好書,不好的的書不如不讀,其害大於其益,關於買什麼書,你可以問高手或看候捷的書評;準備一個小本子記錄你想買的書的名字,逛書店時看看,如果好就買下,記住要讀,別光買不看。)
10、我告訴你,程式就是:任何有目的的、預想好的動作序列,它是一種軟體。
11、編程式就是編寫程式。
12、你想好了嗎?(如果你想好了還是決定要當程式員,可以繼續往下讀;否則,你可以繼續尋找別的出路了。)
(三) 一個程式員應該具備的基礎知識和概念
1、電腦是有什麼組成的,CPU是什麼東西,其工作原理是什麼。(對於這些以及下面將要提到的概念我不會告訴你什麼答案,你可以看相應的教材,關於教材我會在下一部分詳述,記住理解最重要!)
2、機器語言和微指令集的概念。
3、程式的概念。
4、組合語言是低級語言但不是機器語言。
5、進階語言主要有那些?(C,C++,Basic,Pascal,Fortran,C#,Java等等;如果你是中國軟體業的英雄,你也寫一門語言,最好不用英語) 6、編譯器和解釋程式的概念和其原理。(編譯器是高手和專家編寫的)
7、HTML、XML等是標識性語言。
8、Prolog是人工智慧語言。
9、作業系統OS的概念和原理。(Windows98,Windows2000,Windows NT,UNIX,Linux,等等都是OS,還有一些即時OS,嵌入OS,編這些的絕對是高手)
10、Windows編程說白了就是Windows API的調用。(中國的程式員很多隻是會編windows程式,用的是VB,我的建議是這些程式員頂多隻是低級編碼員,我稱其是coder)
11、VC++、VB、BC、BCB、Delphi、VF等都只是編程的工具和環境,不是程式設計語言。
12、面向結構的設計概念。
13、物件導向的概念。(好好理解,兄弟,這個東西還是很重要的)
14、軟體工程的概念和原理。(如果你想當老總就需要好好研究了,系統分析員比編碼員要高一個等級,薪水也高喲) 15、資料庫的概念。(要熟悉一些著名的資料庫系統和語言的名字,如Orcle,SQL,DB2,DyBase等)
16、瞭解網路概念。
17、瞭解多媒體概念。
18、熟悉和掌握資料結構和基本演算法。
19、是不是要求太高了,別著急慢慢來,進步在不知不覺之中。(一旦開始學習,一個月以後你就會有一個基本的概念;兩個月以後你就會感覺自己有了全面的基礎知識;當你知道編程式是怎麼回事時,說明你已經入門了。也有很多人編了很多年程式還沒有入門呢,你不會希望自己步其後塵吧。要有信心和耐心。沉不住氣怎麼能成大事?!)
(四) 教材推薦
推薦的教材主要還是針對概念來的,最好選用名校的教學用書。
1、《電腦群組成原理》(熟悉)
2、《資料結構》(掌握)
3、《作業系統》(瞭解->熟悉)
4、《The C language》(掌握)
5、《編譯原理》(瞭解原理)
6、《組合語言》(瞭解)
7、《電腦網路》(瞭解)
8、《軟體工程》(瞭解)
9、《關聯式資料庫》(熟悉)
10、《The C++Languege 》(掌握)
11、《物件導向設計》(掌握;結合C++學習)
(五)一些經驗和體會
1、真正的程式員用C++;(一位專家說的)
2、動手去編程式;
3、動腦去思考;
4、要有良好的編程風格;
5、讀書,讀好書,盡量讀原版書!(我反覆強調這一點,讀書要有選擇,堅持讀好書,名家出的經典書,不要浪費實踐在一些粗製濫造的書上面;堅持博覽群書)
6、有自己的學習計劃;
7、總結自己的經驗教訓;(準備一個筆記本,記錄錯誤和心得)
8、不要怕學新東西;
9、要有軟體工程的思想;
10、善於發現問題,然後去尋找答案;
11、向高手請教;(要虛心直到你成為高手)
12、和同行交流;(不善於交流肯定不行)
13、懂得軟體的實質,不要被千變萬化的表象所迷惑;
14、真正要學慣用的是程式設計語言和方法,不是什麼庫,什麼類,什麼工具;(學用那些什麼庫都比較簡單,但光會這些庫,我覺得還遠遠不夠)
15、學習wiodows編程主要是學習windows OS和win32 API;
16、有空瞭解一下嵌入式開發;
17、有空瞭解一下PDA軟體開發;
18、瞭解一下.NET架構和C#語言,也許它是你新的衣食父母;
19、要有耐心,不要作浮躁的人;
20、對程式加註釋,並保留你的老程式;
21、學到的東西越多,瞭解的越多,你就越接近專家;
22、有空去逛逛CSDN,那裡有你很多知己;
23、要有信心成為一個優秀的程式;
(六)一些好書的推薦
1、《The C Programming language》 (Keinighan & Dennis Ritchie 1988)
2、《The C++ Programming Languague》(Bjarne Stroustrup 1997)
3、《Inside The C++ Object Model》 (lippmans)
4、《Effective C++》 (同上)
5、《More Effective C++》 (同上)
6、《Exceptional c++》
7、《C++物件導向高效編程》
8、《設計模式》
9、《Thinking In C++》
10、《The Standard C++ Bible》(一般推薦)
11、《The Art of Computer Programming 》
12、《Programming Windows》 (Charles Petzold)
13、《VC++5.0技術內幕》
14、《MFC 深入淺出》
15、《軟體需求》
16、《Advanced Windows》
17、《C++ primer》
18、《win32程式員參考手冊》
19、《用TCP/IP進行網際互連》
20、《COM 本質論》
(七)學習計劃
這個學習計劃是我個人定的,也共用給大家參考一下,共同進步吧。 1、《電腦群組成原理》
2、《作業系統》
3、《資料結構》
4、《組合語言》
5、《 C 》
6、《 C++ 》
7、《VC 技術內幕》
8、《Programming Windows》
9、《深入淺出MFC》
10、《Advanced Windows》
11、《Inside The C++ Object Model》
12、《Thinking in C++》
13、《Effective C++》
14、資料庫
15、網路
16、嵌入式OS和編程
17、硬體單片機
18、.NET和C#
19、軟體工程
20、UNIX和Linux
(八)後記
一年來浪費了大量的時間去摸索,去思考,走了很多的彎路,直到現在我還覺得自己是個編程的門外漢。我把我的一些體會和想法說出來(當然,很多都不一定正確,歡迎大家指正和討論),也許對一些想加入程式員行列的朋友有一些建議和協助。希望能協助這些朋友順利走上編程之路,成為高手。
如果真能如此,我也就很高興了。歡迎有興趣的朋友給我發E_mail(sjpsky@163.net);我這個人有兩大業餘愛好,其一就是讀武俠小說,其二就是結交英雄俠士。
後記:此文我用analyster的名字登入,發表在“csdn-程式人生”上了,有很多網友看了,回了,還收到幾個網友發來郵件,和我探討,我很感謝大家對我的信任和鼓勵。
我要說明的就是我的這篇小文,主要是想給“一些想成為程式員”的朋友一些建議,幫他們尋找一條自我培訓的捷徑,(其實世界上沒有什麼捷徑的,我覺得一切都在於悟性,師傅領進門,修行在個人,譬如我就修行不夠)少象我一樣作大量的無用功。還有,主要就是一個程式員應該具備的基本功(個人看法),有人稱其為“內功”,我覺得很對。沒有紮實的基本功,我們如何能夠做到遊刃有餘的編寫高品質高效能的優秀程式呢?
寫給想當程式員的朋友們
(一) 文章由來及個人經曆
我是一名電腦專業的本科畢業生,畢業已經1年多了。畢業後從事的是軟體編程工作,經常有其他專業的朋友想從事軟體編程工作,向我請教如何,因為我自覺涉行不深,不敢信口開河,無奈朋友信任,我不得不鄭重考慮一下這個問題了,來協助朋友選擇和回報朋友的信...