第一篇:優(yōu)秀程序員修煉之路
優(yōu)秀程序員修煉之路
“為人寫程序”
初級的程序員或經(jīng)驗不足的程序員往往只意識到自己的程序是寫給計算機的,而不會在意程序其實也是寫給人的,或在意得不夠、不全面。
寫給機器的程序,往往追求的是運行正確、執(zhí)行效率能滿足要求。但程序員的任務(wù)僅僅就是把業(yè)務(wù)邏輯轉(zhuǎn)成機器能編譯的計算機語言嗎?
其實,程序首先(注意,是首先)是寫給人的。第一,程序是寫給看代碼的人的。第二,程序是寫給用程序的人的。了解這一點,才能理解寫程序為什么要有代碼規(guī)范,為什么要有各種文檔,為什么寫子程序時要命好名,為什么要分層,為什么要學(xué)設(shè)計模式,為什么要寫測試用例,為什么要推敲按鈕的擺放,為什么要按XHTML標(biāo)準(zhǔn)寫Web界面,為什么要用AJAX ? ?理解了這一點,才能更好的做好上面種種事情。
誰都在說“細(xì)節(jié)決定成敗”,誰都知道要注意細(xì)節(jié)。為什么大家都在講細(xì)節(jié),有的人能通過細(xì)節(jié)打敗對手,有的人連細(xì)節(jié)在哪一方都不知道,這就是水平的高低所在。我們要有心理準(zhǔn)備:細(xì)節(jié)不是喊一聲就會出現(xiàn)在你面前的。感知到細(xì)節(jié),這是一個需要不斷學(xué)習(xí)和實踐,甚至有人指導(dǎo)的過程。這個過程有長有短,要看個人的學(xué)習(xí)能力,領(lǐng)悟能力。但最起碼,我們首先要有一個方向。找程序的細(xì)節(jié),方向就是“為人寫程序”,在你做設(shè)計,寫代碼,擺弄界面的時候,心里時刻記住這一點,幾個項目下來,你自然能看到很多細(xì)節(jié)了。
“內(nèi)外兼修”
武俠電影里的高手,往往都是通過奇門心法,內(nèi)力陡增而成為高手的。但我們做程序的,要成為高手,“內(nèi)外兼修”才能事半功倍。內(nèi),指的是需求把握,設(shè)計思想,設(shè)計模式等。外,指的是寫代碼時的規(guī)范,做界面時的嚴(yán)謹(jǐn)?shù)取?/p>
看武俠看多了的我們,偏內(nèi)輕外的特點是很明顯的??纯磿昀飳懺O(shè)計模式主題的書籍和指導(dǎo)代碼規(guī)范的書籍的數(shù)量和銷量對比就是一個很好的證明。但是就算設(shè)計模式一套一套,但寫的類卻給人看半天也看不出思路的話,一兩年之后,你仍將陷入一個個泥潭中。
再舉個例子,有的人自稱ASP.NET程序員,而且他寫出來的后臺代碼也層次清晰,條理清楚,但是做出來的界面,結(jié)構(gòu)與表現(xiàn)混雜,一大堆IDE自動生成的垃圾代碼充斥其中,該用單選框的用文本框,按鈕放在誰都想不到的地方,不該用戶操作的要用戶操作,一步可操作完的搞成幾步也不能完成操作??很顯然,他不可能做出成功的產(chǎn)品。也許他也知道界面要合理,但是就是因為他不修外功,認(rèn)為我是搞.NET這種先進技術(shù)的,去補習(xí)什么HTML、JavaScript、CSS不是自貶身價嗎?其實,認(rèn)真研究過HTML、JavaScript這些技術(shù)的人都會體味到,運用這些技術(shù)比流行的.NET、Java更有挑戰(zhàn)性,而且你獲得直接操作用戶界面元素的能力后,以前那種做界面效果、接口功能時有心無力的情形將一去不返,這是很痛決的!
如何學(xué)習(xí)開發(fā)語言,成為合格程序員
要成為一個優(yōu)秀的程序員,不僅要掌握開發(fā)語言的框架,理解開發(fā)語言的原理,而且要對DHTML架輕就熟,甚至對各種瀏覽器之間的差異也要有所了解,所以做程序員是一件很有挑戰(zhàn)的工作。那么如何學(xué)習(xí)程序開發(fā),并最終成為優(yōu)秀的程序員呢?
我認(rèn)為可以分為兩個步驟來走:首先,熟悉開發(fā)語言的各種標(biāo)準(zhǔn)控件的用法,了解語言工作原理。接著,朝“內(nèi)”和“外”兩個方向擴展自己的知識和技能。
例如在Visual Studio.NET這樣優(yōu)秀的IDE幫助下,我們使用各種ASP.NET控件,掌握ASP.NET基本的工作原理應(yīng)該是比較容易的。如能輔以幾個簡單的項目練習(xí)一下比較復(fù)雜的DataGrid、DataList等數(shù)據(jù)綁定控件的話,基本掌握ASP.NET是應(yīng)該沒有多大問題的。
之后,我們就可以朝兩個進階方向前進了?!靶迌?nèi)”的話,深刻理解面向?qū)ο蟮木幊趟枷胧潜匦薜?,然后是各種的B/S框架的模式(比如MVC)的理解,最后是設(shè)計模式等等軟件工程的概念和技術(shù)?!靶尥狻眲t更重實踐。首先,做項目時注意把一些可以實現(xiàn)在客戶端的邏輯用DHTML在客戶端實現(xiàn)出來,以此掌握結(jié)合服務(wù)端、客戶端技術(shù)的方法,加深對HTML的DOM對象的理解,熟練常用的JavaScript技巧。進而練習(xí)對Web界面的結(jié)構(gòu)、數(shù)據(jù)、表現(xiàn)三者進行分離的規(guī)劃、設(shè)計與實現(xiàn)。
如此看來,學(xué)習(xí)開發(fā)語言也并不是一件很難的事情,注意“為人寫程序”,“內(nèi)外兼修”,自然就能做出合格的應(yīng)用程序。
中心就業(yè)部 2008年6月30修訂
第二篇:程序員之路
程序員之路
“程序員”,提起這個名稱便讓我們的腦海中閃出一長串名字:一手開創(chuàng)現(xiàn)代軟件業(yè)恐龍——Microsoft的比爾·蓋茨;現(xiàn)在中華民族軟件業(yè)之代表金山公司的掌門人——求伯君;微軟的噩夢、自由軟件的代表、Linux之父芬蘭小伙L(fēng)inus Torvalds……這些在IT業(yè)內(nèi)被無數(shù)人津津樂道的名字,都是從一個小小的程序員開始做起的。隨著他們的軟件日益流行,他們的名字也逐漸為人人所推崇和尊敬。很多年輕人也以他們?yōu)榘駱樱瑝粝胫鲆幻绦騿T,最后成為新一代的IT英雄。在這里,筆者作為一個職業(yè)程序員的角度,想和大家談?wù)勛约旱母惺?。為什么要做一個程序員
談到這個問題似乎會讓人覺得太簡單、太幼稚??纯船F(xiàn)在程序員舒適的工作環(huán)境、豐厚的薪水、過著“快樂”的白領(lǐng)生活一切仿佛都不言自明。其實這是只看到了程序員的一面。我們的另一面則不為關(guān)注:沒日沒夜的工作,通宵加班是家常便飯;整天和鍵盤打交道,把自己的代碼改來改去幾十甚至上百遍,目的只是為了想抓住一個小小的Bug……這種枯燥的生活又有誰能切身體會?沒有對軟件事業(yè)本身的執(zhí)著、對源代碼近乎朝圣般的癡迷,這一切都是普通人不能忍受的。但是當(dāng)你的程序完全通過了測試,成為一個合格的產(chǎn)品。這個時候的喜悅,又是如此強烈地激蕩在你胸中。也只有真正熱愛編程的人,才會感到其中真正的快樂。所以如果有人問你為什么要做一個程序員,那就告訴他你有足夠的勇氣面對每一次調(diào)試失敗、有堅定耐心和信心來寫好每一行代碼。這是我的熱愛,編程就是一種樂趣!
學(xué)編程是先學(xué)什么?
對于廣大編程初學(xué)者來說,存在著這樣普遍的認(rèn)識:學(xué)習(xí)程序設(shè)計選擇編程語言很重要,開口閉口就是Visual Basic、Visual C++、Delphi、Power Builder等一些現(xiàn)在一些比較流行的開發(fā)工具。經(jīng)??匆娪谐鯇W(xué)者問:我學(xué)C/C++,究竟是學(xué)Visual C++好呢,還是學(xué)Borland C++ Builder好呢?或者就是要求在Visual Basic和Delphi之間做出選擇。學(xué)習(xí)程序設(shè)計和學(xué)習(xí)程序設(shè)計語言究竟是怎么一種關(guān)系呢?初學(xué)者究竟應(yīng)該如何取舍呢?就此我們打個簡單的比方:學(xué)習(xí)程序設(shè)計就好比學(xué)習(xí)射擊,而程序設(shè)計語言就對應(yīng)射擊中的氣槍、手槍、步槍等各種槍械。學(xué)習(xí)射擊必須要選擇一種槍械,不可能沒有槍還能學(xué)好射擊的,也不可能同時學(xué)會使用所有的槍械。但是,如果掌握一種槍械的射擊,再學(xué)別的槍就觸類旁通了。因為在熟悉一種槍械的同時,也學(xué)習(xí)了射擊技術(shù)本身。再學(xué)其他的,自然事半功倍。學(xué)習(xí)程序設(shè)計也是一樣,必然要從學(xué)習(xí)一門程序設(shè)計語言開始入手。同時在學(xué)習(xí)的過程中,不但要掌握這門語言語法本身,還要學(xué)會編程的思想,這是所有程序設(shè)計語言的基礎(chǔ)。程序設(shè)計語言,是“一法通,萬法皆通”的。
建議:學(xué)習(xí)程序設(shè)計不必苛求一定要從某一種語言入手,可以在Visual Basic、Delphi、Borland C++ Builder、DOS下的Pascal、Turbo C(或Borland C)等中間選擇自己比較容易接受的一種進行學(xué)習(xí)。從中主要學(xué)習(xí)的是編程本身的思想,學(xué)習(xí)的是用程序設(shè)計的眼光來看待問題?;蛟S,學(xué)習(xí)的效果不能馬上看到,但是可以學(xué)到扎實的基本功,而這對于將來的進一步發(fā)展是有很大好處的。這些基本功包括:
一、強化邏輯分析和建立數(shù)學(xué)模型的能力 編程的目的是什么?是要解決現(xiàn)實中的問題。而現(xiàn)實中的問題是用自然語言描述
1 的,目前的計算機對之是無法理解。我們要做的就是必須用計算機能理解的方式將之“告訴”計算機。也就需要我們對現(xiàn)實問題進行邏輯分析,建立合適的數(shù)學(xué)模型,然后以程序和數(shù)據(jù)的形式輸入計算機,讓計算機幫我們來分析解決。一個簡單的例子就是計算機對于顏色的處理辦法:用R、G、B三色分量來各表示一種顏色,對于顏色的處理被轉(zhuǎn)化為對R、G、B三個整數(shù)的處理。我們只要改變這三個整數(shù),就可以改變成為另外一種顏色。對于其他的現(xiàn)實問題,我們也要象這樣使之可以被計算機所“理解”。這是編程所要解決的第一步,否則就根本沒有程可編。這是建立在“經(jīng)驗”上的,是要在學(xué)習(xí)過程中逐步積累的。
二、數(shù)據(jù)結(jié)構(gòu)和算法知識
程序設(shè)計發(fā)展到現(xiàn)在,已經(jīng)有了一套比較普遍、完整的數(shù)學(xué)模型(我們稱之為數(shù)據(jù)結(jié)構(gòu))和對應(yīng)這些數(shù)學(xué)模型的處理方法(也就是算法)。目前的程序就是以之為基礎(chǔ)的。在程序員中間流傳著一句經(jīng)驗之談:“好的數(shù)據(jù)結(jié)構(gòu)是程序的一半?!逼渲匾钥梢娨话?。作為一個程序員,如果不知道數(shù)據(jù)結(jié)構(gòu)中堆棧、隊列、鏈表、樹,不知道算法中的查找、排序、樹的遍歷、遞歸,這簡直是不可想象的。我們所說的“編程的思想”也就是具體表現(xiàn)為這兩點。所以,一般的數(shù)據(jù)結(jié)構(gòu)和算法知識是學(xué)習(xí)程序設(shè)計過程中必須掌握的,這樣在以后的程序開發(fā)過程中就可以覺得得心應(yīng)手。
三、豐富的實踐經(jīng)驗
程序設(shè)計本身就是一門實踐性很強的學(xué)科。一個只存在于紙上的程序如同沒有翅膀的鳥永遠(yuǎn)不能飛翔在現(xiàn)實的天空。任由代碼寫得再巧妙,風(fēng)格再優(yōu)美,也是一張紙上的一連串字符而已。就好比是一份作文練習(xí),或許寫得很好,但是不交給老師去批閱,和一張白紙又有什么區(qū)別呢?在這里,程序就是作文,而計算機就是老師。只有把“作文”交給“老師”,只有從通過調(diào)試的程序中才能印證自己的構(gòu)想是否正確,或者看到有什么缺陷。當(dāng)然也少不了要多和同行交流,尤其是隨著互聯(lián)網(wǎng)的普及,在網(wǎng)上我們也可以看到別人編寫的例子和源程序,作為現(xiàn)代的程序員,這也是千萬不可錯過的好機會。
最后,作為一個程序員還有一點小要求:身體素質(zhì)比較好,能熬夜才行。有規(guī)矩,成方圓
程序開發(fā)是一件靈活性很強的工作。例如:變量I增加1,在C語言里面可以有I++、++I、I+=
1、I=I+1等多種寫法。但是,這并不說明編程就可以順心所欲,天馬行空。良好的編程習(xí)慣可以提高工作效率,減少不必要的失誤。尤其是對于初學(xué)者來說更是要注意的:
第一點:編程的時候,首先要建立好的數(shù)據(jù)結(jié)構(gòu)。在前面已指出“好的數(shù)據(jù)結(jié)構(gòu)是程序的一半?!?,這句經(jīng)驗之談自然有其道理所在。編程序的時候,如果在開始的時候設(shè)計錯數(shù)據(jù)結(jié)構(gòu),那么在后來不得不花大代價修改程序。筆者自己就曾有過這樣的慘痛教訓(xùn):一個程序?qū)懥?500多行,突然發(fā)現(xiàn)基本數(shù)據(jù)結(jié)構(gòu)不合理,結(jié)果全部推翻重寫?!澳サ恫徽`砍柴工”絕對不是老生常談。在開始寫代碼之前做好數(shù)據(jù)結(jié)構(gòu)的研究和準(zhǔn)備工作往往可以達到事半功倍的效果。
第二點:代碼盡可能重用,盡量模塊化。無論是面向過程還是面向?qū)ο?,代碼重用都是基本原則之一。例如:如果要畫一個青蘋果和一個紅蘋果,就寫一個函數(shù)來畫蘋果,把顏色作為參數(shù)傳進去。這樣只要調(diào)用同一個函數(shù)傳不同參數(shù)就可以實現(xiàn)畫不同的蘋果。這樣做的好處一是程序比較容易理解,另外修改也方便,只要修改一個地方就可以讓兩個蘋果都發(fā)生改變。這點在開發(fā)一些短小程序中還感覺不出,但是在以后開發(fā)大型程序的時候,工作的效率就明顯提高不少。這就是
2 聰明人做聰明事,以最小的代價取得最大的收獲。
第三點:良好的編寫風(fēng)格。一個程序,不可能是絕對完美,以后永不用修改的。既然要修改,就必然要重讀和理解原來的代碼。而良好的編程風(fēng)格,可以使人更方便和迅速理解程序的結(jié)構(gòu),從而可以最大限度地提高修改的效率。在這里,筆者舉出一些比較好編程的風(fēng)格要求:1.統(tǒng)一有意義的命名規(guī)范:一個變量叫nCount明顯比叫iii更容易被理解其真實邏輯含義和數(shù)據(jù)類型。所以不要怕麻煩,變量和函數(shù)名多起幾個字母,有意義一點,將來理解起來比較方便。2.代碼的逐層縮進格式。這幾乎已經(jīng)成為一種標(biāo)準(zhǔn),這種格式使得代碼之間的層次關(guān)系非常明顯,對于程序的邏輯理解有很大的幫助。3.代碼位置的有條理性。把相關(guān)功能的代碼集中起來,放在一起,這樣在以后閱讀代碼的時候,可以盡量避免在不同文件模塊之間頻繁切換。函數(shù)內(nèi)部的邏輯不要太復(fù)雜,代碼行數(shù)不要太長:由于要考慮到以后的理解,所以函數(shù)內(nèi)部的邏輯不要寫得很復(fù)雜,例如循環(huán)嵌套以三層為宜,代碼行數(shù)以一屏左右為好,太長的代碼不利于理解。如果循環(huán)的確多、代碼的確長,就應(yīng)該考慮重新再劃分為更細(xì)的子函數(shù)。好的編程風(fēng)格當(dāng)然不止這些,這也需要在學(xué)習(xí)過程中慢慢體會。
第四點:注重程序測試,注意異常處理。這是業(yè)余編程愛好者和職業(yè)程序員的一個很明顯的差別。業(yè)余編程愛好者往往只注重程序可以正常運行,而職業(yè)程序員除此之外還必須關(guān)注程序在異常情況下也必須正常運行,至少可以正常終止。而這是建立在對程序進行充分測試的基礎(chǔ)上的。多用不同情況去測試自己的程序,可以發(fā)現(xiàn)更多的隱藏的Bug,從而提高自己程序的質(zhì)量。
千里之行始于足下。做程序員也是這樣,這世上不僅沒有平坦大道,還有更多的曲折和困難。但是只要真心熱愛軟件開發(fā),愿意為之而付出,最后勝利的金蘋果必將使你體會到個中樂趣。來吧,還猶豫什么,踏上這條程序員之路,昂首向前走吧!
3
第三篇:程序員修煉 收藏
程序員修煉 收藏
程序就是一系列按步驟進行的操作序列,它有好多種級別,比如最低級的微程序、次低級的匯編程序、高級的各種編程語言程序、最高級的腳本語言程序,也許我列的不對,但沒關(guān)系,我要說的是不管是那個級別的程序,其本質(zhì)都是操作的邏輯序列。大多數(shù)系統(tǒng)和應(yīng)用程序都是建立在高級編程語言上的,比如C、C++、C#、FORTRAN、BISIC、JAVA等等,就讓我們只關(guān)注這一級的編程能力吧。因此如果一個程序員的邏輯能力不高,他永遠(yuǎn)都不能成為一名具有合格職業(yè)水準(zhǔn)的程序員,我們在下面的討論有關(guān)編程能力的方方面面,最終都是為了最大程度地提高和實現(xiàn)一名程序員的邏輯能力。
一、掌握基礎(chǔ)知識:十六年寒窗的持續(xù)積累
從7歲讀小學(xué)起,經(jīng)過16年的學(xué)習(xí),你從軟件專業(yè)本科畢業(yè)后,必須完成以下幾門專業(yè)課程的學(xué)習(xí):計算機組成、操作系統(tǒng)原理、匯編語言、數(shù)據(jù)結(jié)構(gòu)、編譯原理、數(shù)據(jù)庫原理、軟件工程、結(jié)構(gòu)性設(shè)計語言(PASCAL、C)、面向?qū)ο笤O(shè)計語言(C++、C#)、計算機網(wǎng)絡(luò)等,你最好還懂一些算法分析、分布式系統(tǒng)、計算機圖形學(xué)、形式邏輯、人工智能原理、軟件設(shè)計模式、軟件構(gòu)架/框架等研究生的課程,16年來,你積累的除了知識,更重要的是形成最適合自己的學(xué)習(xí)方法和工作方法。這些是你具備程序員職業(yè)水準(zhǔn)的基礎(chǔ)能力,不要受什么計算機軟件怪杰之類傳奇的影響,那不過是小概率事件,而且這些怪杰們就算沒有讀過軟件本科和研究生,也往往自學(xué)了大多數(shù)專業(yè)課程,很可能比在校學(xué)習(xí)的學(xué)生對這些課程的精髓部分理解的更好,還有他們的工作方法和思維方式是特別而高效的,但普遍性差,可以借鑒,不宜模仿。好,所以現(xiàn)在你只需要問問自己,那些課程和知識都學(xué)會并掌握了嗎?如果是,那就準(zhǔn)備好進行實踐了。
二、在實踐中提高:成為一名高水平的Coder
好了,你畢業(yè)了,在校功課都不錯,也找了一個專業(yè)對口的工作,你想大展鴻圖了,可是別急,你的翅膀還不夠硬,不信我們說來看看。
通常,你在工作中都會用到某一種單位/公司固定的操作系統(tǒng)和編程語言開發(fā)環(huán)境,比如Windows、UNIX、LINUX等操作系統(tǒng),又比如用VC、VB、PB、Delph、JAVA、Motif/XWindow、QT、OpenGL、OpenInventor等編程語言和開發(fā)環(huán)境,我們在后面把它們合稱為開發(fā)環(huán)境。就在校學(xué)習(xí)的有關(guān)開發(fā)環(huán)境的知識而言,大概你距工作需要的差距是不小的,當(dāng)某個操作系統(tǒng)和編程語言環(huán)境成為你的飯碗時,就不應(yīng)也不能用通過課程/認(rèn)證考試之類的眼光和要求來評價你的能力,即使你能考100分。你需要深入地學(xué)習(xí)該操作系統(tǒng)和編程語言環(huán)境的各類開發(fā)手冊的所有內(nèi)容,你會說大多數(shù)你都用不上,其實你既對又不對,對的是單從使用的角度而言,你確實用不上開發(fā)手冊的大多數(shù)內(nèi)容,比如龐大的VC開發(fā)類庫和復(fù)雜的開發(fā)環(huán)境,你在實際工作中能用到的不到總數(shù)的1/10或1/5,不對的地方在于,你用到的部分不是孤立存在的,它們是整個體系中的一部分,只有對整個體系有了一個較完整的了解,才能得心應(yīng)手、隨心所欲地用好你用到的部分,你才算初步具備在這種開發(fā)環(huán)境下進行Coding的職業(yè)水準(zhǔn)(還遠(yuǎn)不夠程序員的職業(yè)水準(zhǔn)呢),而這只是剛開始。如何才能真正掌握一種開發(fā)環(huán)境的全面的知識呢,最原始的辦法就是讀開發(fā)指南/教程、參考手冊,一般來講,學(xué)習(xí)開發(fā)指南/教程時,你如果是一個認(rèn)真的人,都會完成5/10~7/10左右內(nèi)容的學(xué)習(xí)和練習(xí),如果你想成為職業(yè)選手,就應(yīng)該完成9/10以上內(nèi)容的學(xué)習(xí)和練習(xí)。參考手冊不同,大多數(shù)所謂的“程序員”們只是用到了才翻翻,這差的太遠(yuǎn)了,你應(yīng)該象讀開發(fā)指南/教程一樣,每個環(huán)節(jié)都要讀,比如VC,參考手冊中的每個類,類的每個函數(shù),都要讀上幾遍,它們往往是一小伙一小伙地糾纏在一起使用的,開始時讀得你毫無頭緒、心煩意亂,不要緊,還有一手呢,如果你開發(fā)環(huán)境安裝的全面,它們往往都有開發(fā)商做的demo例子可看,你就進入另一個境界了,開始時你關(guān)注demo中的具體技術(shù),后來你發(fā)現(xiàn)這些demo的程序?qū)懙亩歼€算不錯,結(jié)構(gòu)簡單但合理,如果你真的用心,就一定能發(fā)現(xiàn)一些個別的demo是極品,它所展現(xiàn)的程序邏輯結(jié)構(gòu)是你設(shè)計不出來的,你現(xiàn)在有點更關(guān)心它的程序設(shè)計構(gòu)架,甚于對你原始目的(某種相關(guān)的技術(shù)/技巧)的關(guān)注,這時的你,開始了從一名Coder向一名Programmer的轉(zhuǎn)變,你會忍不住要看看開發(fā)商提供的源程序,比如.h和.cpp,通常你會找到include路徑下所有的.h程序,你才知道,哇!好多好多東東在參考手冊中都沒提到,你要學(xué)的太多了,沒時間顧及其它的業(yè)余愛好了,現(xiàn)在知道為什么程序員是年輕人的職業(yè)了吧,你要有足夠多的時間才行,即使你的智商有160。如果你走到這一步,在你工作的團隊中,已經(jīng)是經(jīng)常有人向你請教技術(shù)問題,經(jīng)常有人請求你幫忙debug,你已是公認(rèn)的“高手”了,別得意,因為你仍然是個Coder,為什么這么說呢,你想想,你已深入了解了這個開發(fā)環(huán)境中的各種技能,知道一名Coder如何用好這些東西,可是你能設(shè)計的出提供給Coder們用的東西嗎?唔??,你想了想,可能還不太行。對了,就是這樣,你還是一名小我境界的程序員呢,本質(zhì)是個Coder,當(dāng)然已是一名高水平的Coder了,然而你需要進一步登堂入室才能成為一名真正的程序員。
讓我們繼續(xù)吧,通常你都是從精通一種編程環(huán)境開始的,假設(shè)你已經(jīng)較為精通在Windows下用VC開發(fā)軟件了,這時在技術(shù)和技巧方面你將面臨一小一大兩個挑戰(zhàn),第一個小挑戰(zhàn)是如果公司/單位改換了開發(fā)環(huán)境,比如用LINUX下的QT交互語言工具進行開發(fā),你不過是把前面掌握VC的過程再來一遍,由于在主觀上經(jīng)歷了VC工具的學(xué)習(xí)過程,在客觀上各種開發(fā)環(huán)境都有太多相似的方面,這回你掌握的應(yīng)該較快。要小心,在這時第一次誘惑之門打開了,因為你感覺良好,看!這回這么快,我就這么好地掌握了新的開發(fā)環(huán)境,你開始關(guān)注其它暫時還用不到的同類環(huán)境,比如VB、Delph、JAVA,如饑似渴地掌握各種開發(fā)工具,證明自己的學(xué)習(xí)能力和價值,但你忘了一點,你仍然是個Coder,只不過是一個在好多開發(fā)環(huán)境下都能編程的Coder,就像你生活在中國,因而精通了漢語,工作需要你又掌握了英語,然后你就來了勁,把俄語、日語、阿拉伯語、拉丁語,等等等等,都學(xué)習(xí)個遍,我只能說,有點BT。你忘了自己是個職業(yè)人,同一類的東西工作中用得到才需學(xué)習(xí),太多太多的Coder們喜歡在一起比較和炫耀自己會掌握了幾種開發(fā)工具,不信你看看招聘時的求職書就知道了,sigh!他們中絕大多數(shù)人永遠(yuǎn)都只能停留在這個層次上,心浮氣躁,一生都再也當(dāng)不成真正的程序員了??偨Y(jié)一下,其實你在這時需要的是對自己掌握新開發(fā)環(huán)境的能力的自信,而不是一遍遍地重復(fù)來證明自己。第二個大挑戰(zhàn)就是你明白了只掌握VC是不夠的,你發(fā)現(xiàn)自己有點淺薄,有很多東東你會用但你不太懂,很多方面支持VC編程的知識你都沒掌握,比如操作系統(tǒng)的源碼、網(wǎng)絡(luò)協(xié)議知識、Windows 的注冊表、進程和線程的基礎(chǔ)知識、硬件驅(qū)動方面的知識、ActiveX、Windows 龐大的 API,又是一個等等等等,這些基礎(chǔ)知識的學(xué)習(xí)和掌握可是要花費大量時間的,你再一次深切地感到時間太不夠用了,因為這時的你大概有許多俗務(wù)纏身了,所以有點沮喪,還不用提IT業(yè)每天不知有多少新東西在發(fā)布,KAO,永遠(yuǎn)都跟不上,越拉越遠(yuǎn)了。哎!別氣餒,振作一點,你還是忘記了自己是個職業(yè)人,既然好多東東在工作中你永遠(yuǎn)都沒機會用,那么干嘛要學(xué)呢?用什么才學(xué)什么,最多預(yù)測到馬上要用什么,先一步學(xué)什么好了,要知道沒有人是真正的、無所不精的全科大夫,除非你是神,但如果你還在耐著性子看這篇文章,你肯定是個人嘛。
OK,一般工作后三五年,你經(jīng)歷了上述過程,經(jīng)受了誘惑和考驗,終于明白了一個道理:你要的是強勁的學(xué)習(xí)知識的能力,是對某種軟件知識/技能的有深度的精通,一種摸到它的根的深度,而不是已掌握的技能的種類和數(shù)量。這時無論誰用他掌握了多少種你不會的技能來嚇唬你都沒用,你對他的層次只有蔑視。通過幾年的學(xué)習(xí)和工作,要記住最重要的一點,永遠(yuǎn)最重要:對自己學(xué)習(xí)IT知識能力的自信,一個程序員一生都要不停地進行高強度的學(xué)習(xí),用心問問自己,有沒有這個自信?別用虛榮心來騙自己哦,如果沒有的話,那就不必花費你寶貴的時間向下看了,作者在此感謝你有耐心看到這里,現(xiàn)在建議你關(guān)閉這篇文章,趁著年輕,當(dāng)機立斷轉(zhuǎn)行吧!
三、注重邏輯:成為一名職業(yè)程序員
好,再前進一點點,你就要成為一名職業(yè)程序員了,讓我們繼續(xù)來完成這個任務(wù)吧!我們在前一節(jié)提到過,“你發(fā)現(xiàn)一些個別的demo是極品,它所展現(xiàn)的程序邏輯結(jié)構(gòu)是你設(shè)計不出來的,你現(xiàn)在有點更關(guān)心它的程序設(shè)計構(gòu)架,甚于對你原始目的(某種相關(guān)的技術(shù)/技巧)的關(guān)注”,其實你是在關(guān)注這個demo程序作者的思維邏輯,所有程序的本質(zhì)就是邏輯。技術(shù)你已經(jīng)較好地掌握了,但只有完成邏輯能力的提高,你才能成為一名職業(yè)程序員。打一個比方吧,你會十八般武藝,刀槍棍棒都很精通,但就是力氣不夠,所以永遠(yuǎn)都上不了戰(zhàn)場,這個力氣對程序員而言就是邏輯能力(其本質(zhì)是一個人的數(shù)學(xué)修養(yǎng),注意,不是數(shù)學(xué)知識)。邏輯能力也是逐步提高的,開始時你一定是用直觀的邏輯能力來編程的,怎么想就怎么編,不對就再改,在改進中提高自己的邏輯能力,從直觀邏輯能力提高到抽象邏輯能力,這是很正常的。提前說一句吧,到達邏輯能力的至高境界,其表現(xiàn)是用數(shù)學(xué)語言來描述問題和問題的解決辦法,高度抽象!好,說回來吧,你要提高邏輯能力,最快的辦法就是讀別人寫的結(jié)構(gòu)優(yōu)秀的程序。優(yōu)秀的代碼是百讀不厭的(這句話是我抄來的),暫時放放對其中某種技術(shù)和技巧的關(guān)注吧,你要推導(dǎo)和學(xué)習(xí)的是這些好程序的邏輯結(jié)構(gòu),它們是被精心設(shè)計出來的。你可以先捂住這個demo程序,自己設(shè)計一個功能相同的程序結(jié)構(gòu),然后比較一下demo的程序結(jié)構(gòu),如果差距較大,那你就不應(yīng)簡單地改進一下,而是要把demo作者設(shè)計的過程在心里復(fù)原一遍,做到這一點也許有點困難,但這種事干的多了,你就會越干越快,越來越得心應(yīng)手,你的邏輯能力飛速提升,你能看得上的邏輯結(jié)構(gòu)優(yōu)秀的程序開始不多了,下一步就是練習(xí)。從工作中開始吧,如果你有空閑,你需要做至少兩類練習(xí),一類是算法練習(xí),所有的經(jīng)典算法都是經(jīng)典的邏輯,題目有的是,像個好學(xué)生一樣吧,每年的國內(nèi)國際編程競賽都有邏輯要求非常高的題,你可以只選一兩道難題來做做。當(dāng)你可以把復(fù)雜的單遞歸程序(只有A調(diào)A)變成非遞歸程序時,已經(jīng)不錯了,如果你能看得懂雙遞歸程序(A調(diào)A、A調(diào)B、B調(diào)A、B調(diào)B都有),我為你鼓掌!你不必往下看了,我有點不好意思啦――班門弄斧,你快滾蛋吧!另一類是把以前和當(dāng)前你工作中你不滿意的程序推倒重新設(shè)計一遍,這非常重要,省時省力,因為你熟悉需求,技術(shù)上也沒問題,目的就是改進程序的邏輯結(jié)構(gòu),很劃算哦,唯一要克服的就是:你對推翻以前工作中那點小小成就的心理障礙,如果你真想優(yōu)秀,說句粗話:這點心理障礙算個屁,一遍遍反復(fù)地推倒已有的成果只能使自己快速進步,放手干吧,沒什么好可惜的,馬恩早就在《共.產(chǎn).黨宣言》里說過了:在這個過程中,你失去的只有鎖鏈(禁錮你思想的鎖鏈)。
讓我們來總結(jié)一下,經(jīng)過自我否定后,再生的你盡管對過去的“業(yè)績”還有一些眷戀,但已是一個初步具備職業(yè)水準(zhǔn)的程序員了,掌握了相應(yīng)的技術(shù)和技巧,具備了較高的抽象邏輯思維能力,最主要的特征是:能自覺地自我否定,不斷地追求更高水平的邏輯能力。
在這個過程中,如果你能注意以下一些小的方面,你前進的步伐也許會快一些。
l 從編譯原理的角度來理解你工作中使用的高級語言,如果你做到這一點,至少有兩個好處,第一個好處是避免一大堆低水平重復(fù)出現(xiàn)的編譯錯誤。一名優(yōu)秀的Coder平均在一個工作日中應(yīng)該完成200行以上的源碼,其編譯錯誤應(yīng)該控制在5個以下,要知道這200行源碼不是一次完成的,所以大多數(shù)情況下你都要追求一次編譯通過,而一名職業(yè)水準(zhǔn)的程序員,應(yīng)該進一步做到即使用purify這類的工具來檢查源碼,也不會存在嚴(yán)重的內(nèi)存泄露。第二個好處是可以提高源碼的可讀性和效率。規(guī)范地編寫你的代碼使你自己的邏輯清晰,因為你明白多加幾個括號和空行、多換行對齊、多注釋,編譯器是會自動識別的,不影響程序執(zhí)行的效率,反過來,控制好遞歸調(diào)用和循環(huán)內(nèi)的if語句才是提高程序效率的關(guān)鍵,要全力避免遞歸,但要深刻理解遞歸,能通過自己建立堆棧來把遞歸程序轉(zhuǎn)換成非遞歸程序,要求還是較高的哦!
l 避免思維陷阱,只要你是人就一定有自己的思維慣性,這一定又會表現(xiàn)在你的程序邏輯中,有時你就是從這個慣性中跳不出來(誰都有這個時候),但要心里有數(shù)才行,所以你需要幫助,如果你有幾個水平相若或更高的職業(yè)伙伴,太好了,當(dāng)遇到花30分鐘還打不下的bug時,就別浪費時間了,找他們吧,最要緊的是能思路清晰明確地表述你的問題,通常你自己在這個過程中或者伙伴中就有人把問題解決了,又快又好。另外,有幾個可以良性競爭的職業(yè)伙伴是人生的一件幸事,1+1>2,大家各有所長,你最好做到及時公開你的成果,技不壓身嘛,IT發(fā)展的這么快,你再優(yōu)秀,那點東東也沒有什么值得隱藏的,所以你可以技術(shù)或水平不夠高,但千萬不可以讓真正具有職業(yè)水準(zhǔn)的選手鄙視你的職業(yè)品質(zhì)和行為。
l 有自己debug的特點,下面的說法作者不敢太肯定,只是經(jīng)驗之談。即使在VC這種高度完善的開放環(huán)境下,你仍然應(yīng)該要求自己僅憑打印語句就能debug。這也有兩點好處,第一個好處是,遇到bug你會認(rèn)真想問題所在,而不是用debug工具一步步簡單地追蹤卡在哪兒了,你定位bug范圍的方式是從大到小、從粗到精,這是一種自頂向下的思維方式,而用工具追蹤,容易形成自底向上的思維方式,這不算好,你應(yīng)該先看到森林,再看到樹木。我反復(fù)提及:程序就是邏輯過程,大多數(shù)程序從main函數(shù)開始,是由數(shù)據(jù)結(jié)構(gòu)和功能子程序組成的一個樹形結(jié)構(gòu)的邏輯過程(要認(rèn)清即使是面向?qū)ο蟮某绦蛘Z言也是一樣的),它的執(zhí)行過程是深度優(yōu)先的,但你定位bug應(yīng)該是廣度優(yōu)先的,好好想想這一點,嗯?第二個好處是強迫你思考并記住而不是用工具看到調(diào)用過程,你大腦的抽象邏輯思維能力和胳膊上肌肉的力量一樣,都是練出來的,如果你的bug是程序結(jié)構(gòu)上的邏輯錯誤引起的,這一點就非常重要了,順便說一句,最難打的bug就是程序邏輯結(jié)構(gòu)錯誤導(dǎo)致的bug。你要是真正明明白白地認(rèn)識到這兒了,那我就沒什么東西可以告訴你了??傊?,程序員的職業(yè)水準(zhǔn):生產(chǎn)效率和程序質(zhì)量,主要是取決于源碼中bug的數(shù)量和debug的速度,而不是取決于編寫源碼的速度。給你一個我自己定義的考查一個職業(yè)程序員的指標(biāo):一個合格水準(zhǔn)的職業(yè)程序員,編程的時間如果算一份的話,其累計debug的時間不能超過一份,真正職業(yè)高手累計debug的時間應(yīng)該控制在0.5份以下,如何?你關(guān)上門悄悄問問自己,你花費在編程和debug上的時間比例是多少?如果你把程序員作為自己一生的職業(yè),那么就永遠(yuǎn)都要牢記一點:追求做一個0 bug的優(yōu)秀程序員!這是任何一個想成為職業(yè)程序員的人的理想,請相信:堅忍不拔地追求實現(xiàn)這個理想將讓你出類拔萃!
l 做好程序的單元測試,這是另一項考查你是否是一名具有合格職業(yè)水準(zhǔn)的程序員的一個必要指標(biāo)。其實在你拿到需求的時候就要準(zhǔn)備單元測試用例了,并且這些用例將直接影響你的詳細(xì)設(shè)計(有關(guān)軟件設(shè)計本來是該放在第四節(jié)講的)。我們還是打比方吧,當(dāng)你拿到一個需求時,除了分析它靜態(tài)的功能外,還應(yīng)明確它動態(tài)的操作/執(zhí)行過程,把這個動態(tài)過程明確地用流程圖畫出來,比如分為A~Z的26步,其中A又可以進一步分解為A1~A5的5步,直到不能再分解為止。又比如說A3步不可分解了,那么你應(yīng)該把A3步的正常操作和所有五花八門的異常操作都列出來,確保正常的操作肯定正確,異常的操作起碼程序不退出才行。這樣你就要寫好多好多的測試用例,說句老實話,我也從來不寫!但我一般會列一個提綱,比如A3步有正常的操作a、b、c、d、e共5項,異常的操作有f、g、h、i、j、k、l、m、n共9項,你在進行單元測試時都應(yīng)該跑一遍,這樣的程序都還不敢說質(zhì)量如何好,但起碼可以說較穩(wěn)定吧!如果要想在進行單元測試時干得快、效率高,那么在進行詳細(xì)設(shè)計時,你就應(yīng)該把A3步中對所有正常操作和異常操作的判斷都設(shè)計好,在編程實現(xiàn)A3步時,使得程序的結(jié)構(gòu)合理高效,對不對?所以,如果你在工作中是割裂地看待軟件工程中從需求、分析、設(shè)計、編程、測試等各個環(huán)節(jié),恐怕水平很有限喔!但如果你在分析需求時就能看到測試的問題,并改進設(shè)計和實現(xiàn),為此做好相應(yīng)的準(zhǔn)備工作,嘿嘿,整個軟件開發(fā)過程你的效率會高很多,通常你在一個開發(fā)團隊中就會高度自信的,你已越過當(dāng)一名偏頗、露骨的高手的境界,成為一個平靜的高手,這可是The best in the best!,用周星星的話說:是高手之高高手,因為別人看不出你高在哪兒,沒見你有什么高招或特拚命干,但反正你就是干得又快又好、又省力。關(guān)于進行單元測試還有很多復(fù)雜的方法,在此本文只提到了最基本的一點,目的是讓你在工作上考慮周全、安排有序,其它的自己琢磨吧,沒有人能替你吃飽飯!
l 如果你是用C++編程,我再簡單談?wù)動嘘P(guān)內(nèi)層釋放的一個小技巧,就是對所有你編寫的類,在構(gòu)造和析構(gòu)函數(shù)中加打印語句,統(tǒng)計每個類在運行程序時構(gòu)造和析構(gòu)的地方,如果是配對的,那么起碼沒有對象類一級的內(nèi)層在程序運行結(jié)束時沒有釋放,然后你就可以把打印語句刪掉了,招數(shù)雖土,但管用!
l 還有其它一些好習(xí)慣,在這里我隨筆寫一些,你要是有不同看法也請一笑過之吧。編程時應(yīng)該對齊縮進,一個縮進用一個tab鍵,一般是4個空格,嚴(yán)格遵守開發(fā)團隊的編程規(guī)范也是非常重要的。一個子程序不應(yīng)超過30行(不算空行),其內(nèi)多重循環(huán)不應(yīng)超過3層,否則都應(yīng)該分裂成兩個子程序,個別算法程序可以長一些,但也不宜超過200行。通常一個類的所有成員函數(shù)總和不宜超過1500行,多了就應(yīng)該考慮分解成兩個類(這個工作最好在設(shè)計時就完成)。每完成一小段程序,比如15~30行,就立即編譯運行,不要假裝高手,先敲它一大堆程序,再編譯運行,妄想一次成功,體驗一種假爽的、虛榮的快感,或炫耀給別人看,這么做只能證明自己是一個不折不扣的傻瓜,裝酷而已。因為只要有一次不成功,你就會花費大量的時間來調(diào)程序,別人的進度在這時就遠(yuǎn)遠(yuǎn)地超過你了,平常心是道,還是修煉真功夫吧!孫子兵法里關(guān)于這一點有明確的闡述,我就不引用了,但建議你真的不要這么干,除非你確實就是這樣總是一次就成功的天才,那你還看這篇文章干什么呢?我又不是寫給你們這些天才們看的。再就是有學(xué)會買好書、讀好書,關(guān)于計算機和軟件方面的書太多了,時間有限,比如有一個叫侯捷的家伙,幾乎寫的每本書都不錯,張國峰的C++編程也不錯,這只是我的個人意見啊,好書多著呢,列出來比這篇文章長好多倍,我就不多說了。還有一招,要是你運氣好,能搞到一些著名軟件系統(tǒng)的源碼,好好讀讀吧,在此我只能告訴你,Linux操作系統(tǒng)的一些源碼不錯,是開放的,你可以合法地搞到,其它的不要說是我建議你侵犯知識版權(quán)啊!
四、天生神力:成為系統(tǒng)分析員
本來就論述如何成為一名職業(yè)程序員而言,本文已基本完成任務(wù)了,但《菜根譚》有言:竭世機樞,似一滴投于巨壑,窮諸玄辯,若一毫置于太虛。既已乘興到此,何妨多置一毫于太虛呢,作者不才,干脆盡興寫算了。
你要是運氣好,直接進入了一個嚴(yán)格規(guī)范生產(chǎn)的軟件企業(yè)就業(yè),剛開始就應(yīng)該是按別人做好的軟件設(shè)計來實現(xiàn)編程,你可以有機會直接學(xué)習(xí)軟件設(shè)計,當(dāng)你積累的足夠多了,能夠?qū)ζ渲械囊恍┰O(shè)計提出好的改進建議,而且干得又快又好,就會漸漸地展露頭角,我相信你終有一天成為一名軟件設(shè)計人員(注意,不是軟件產(chǎn)品設(shè)計人員),步入系統(tǒng)分析員的行列,但這還需其它的一些條件和自我修煉。如果你在一個不規(guī)范的軟件企業(yè)工作,那也不錯,你很可能直接就有機會進行軟件設(shè)計,然后開發(fā)、測試,甚至還不得不自己定義需求,把軟件開發(fā)過程的各個環(huán)節(jié)走一個遍,當(dāng)然這樣對你的要求更高,而且你也不容易得到及時有益的指點,在正態(tài)分布的情況下,你應(yīng)該是成長的很慢。但不管就業(yè)的單位如何,如果你決心要成為頂尖軟件職業(yè)選手,通常什么客觀困難都阻擋不了你,然而你個人的因素可能會阻止你的前進。下面提出的觀點純屬一己之見,傷人自尊之處作者在此提前道歉,并建議你除非對本文有強烈的興趣,否則就請直接看第五節(jié)或放下別看了。丑話已說在前頭了,在各種軟件開發(fā)組織的發(fā)展過程中的事實也證明,只有少數(shù)程序員能成為系統(tǒng)分析員,我想這一點不是我杜撰的吧,因此你要是在看接下來的部分時感到氣憤難當(dāng),那也實在沒著,純屬活該,因為作者只是在說明自己的觀點而已,你最多可以呲之以鼻,表示一下你的輕蔑好了,但沒有任何理由可以罵人!
作者自己沒有到微軟面試過,但身處軟件行業(yè),關(guān)于微軟的許多東東當(dāng)然還是有耳聞的,據(jù)說微軟招聘一名程序員要過五個已經(jīng)成為微軟程序員的面試關(guān),而且是一票否決制,又據(jù)說大多數(shù)面試題并非編程,而是一些有關(guān)邏輯和智力的題,作者私下也做過許多流傳的微軟面試題,并對此做法深以為然。程序的本質(zhì)就是邏輯,所以幾十年前就有人提出編程是一門藝術(shù),而藝術(shù)是要靠天份的,這一點少有人反對。一個人的邏輯能力可以不斷提高,但其能到達的終極邏輯能力的層次必定為其天生智力所限制,這一點就讓人不易接受了。好笑啊!人們可以公開承認(rèn)自己沒有某種或全部的藝術(shù)天份,但要說自己邏輯天份不夠,換句話說承認(rèn)自己笨、IQ不夠高,往往是要怒發(fā)沖冠的,其實這又有什么區(qū)別呢?話都說到這兒了,再次建議你如果不夠自信,就跳過這一節(jié)吧,直接看第五節(jié),好嗎?
好了,把話題說回來,你已經(jīng)成為一門合格的職業(yè)程序員了,如果要想成為從事軟件系統(tǒng)設(shè)計的職業(yè)系統(tǒng)分析員,第一件事就是悄悄找一個標(biāo)準(zhǔn)智商測試的網(wǎng)站或其它渠道,嚴(yán)格認(rèn)真的測一測自己的智商,如果IQ低于130(正常智商是110),就請別費勁了,打消掉成為系統(tǒng)分析員的念頭吧!好!好!先請你冷靜一下,好好想想,其實微軟面試時就是在測你的智商和邏輯數(shù)學(xué)素質(zhì)呢,這就是本節(jié)的標(biāo)題為“天生神力”的原因,因為設(shè)計就是從無到有地進行創(chuàng)造,無論是軟件還是其它行業(yè)都一樣,可以有借鑒的,沒有現(xiàn)成的,設(shè)計就是創(chuàng)造!如果你IQ在130以上,又決心要當(dāng)一名職業(yè)軟件系統(tǒng)分析員,其實你不過是要準(zhǔn)備好吃更大的苦而已,有什么好虛榮的呢?
修煉還是從基本功開始的,過程和成為一名職業(yè)程序員差不多。必須使用設(shè)計工具這一點是不用多說的。在工作中,你基本上遇到的是兩類方式的設(shè)計,一個是結(jié)構(gòu)化設(shè)計,另一個是面向?qū)ο笤O(shè)計,就個人經(jīng)驗而言,面向?qū)ο蟮脑O(shè)計更好。如果你工作中不得不采用結(jié)構(gòu)化的設(shè)計,你必須熟練地掌握數(shù)據(jù)流圖和控制流圖的分析和設(shè)計,一般來講,如果你把一個軟件中用到的數(shù)據(jù)模型設(shè)計好了,針對功能化的流程,不難設(shè)計出數(shù)據(jù)流圖,但下一步設(shè)計控制流圖才是挑戰(zhàn),如果你按照需求走不通設(shè)計好的控制流圖,那么你或別人在按照這個設(shè)計編程實現(xiàn)時,必定也走不通,沒有奇跡會發(fā)生,還是在設(shè)計階段嚴(yán)格要求吧,又有一點需要牢記:返工是最慢的。當(dāng)你在進行控制流圖的設(shè)計時,也不要妄想得到需求人員提供給你明確的指點,通常他們要是能夠把需求的功能和操作次序?qū)懲暾脑挘銘?yīng)該就感恩戴德了,從需求中整理出功能、操作的拓?fù)浯涡蚝蜅l件是你作為系統(tǒng)分析員的職責(zé)??纯矗菦]有一點圖論的基礎(chǔ)和拓?fù)鋵W(xué)的入門知識,你是當(dāng)不好一個職業(yè)系統(tǒng)分析員的,即使你天賦不錯,必要的數(shù)學(xué)和邏輯素質(zhì)仍然不可或缺。也不用氣餒,永遠(yuǎn)沒有最好的設(shè)計,只有更好的設(shè)計,反復(fù)地進行設(shè)計迭代,勇于推翻舊的設(shè)計,你將快速進步。如果你在工作中是采用面向?qū)ο筮M行設(shè)計的,那就更有利了,有關(guān)面向?qū)ο笤O(shè)計的書太多了,不用作者在此多費口舌,建議精讀一本經(jīng)典的書,比如北大邵維忠等編譯的《面向?qū)ο蟮姆治觥?,有些方法和技巧可能過時,但其邏輯的基本原理是非常正確的,其本質(zhì)是,你在邏輯上是如何認(rèn)識這個世界的,你就是如何設(shè)計軟件體系結(jié)構(gòu)的,然后讀讀其它書,觸類旁通,自己創(chuàng)造機會多實踐,成功自然會到來的,總之,不管是結(jié)構(gòu)化設(shè)計還是面向?qū)ο笤O(shè)計,評價一下自己的軟件系統(tǒng)設(shè)計方案吧,有好多指標(biāo)呢,比如是否均勻和平衡?局部獨立性強不強?有沒有歧異的結(jié)構(gòu)?有沒有層次太多或太少?有沒有某個層次太大、太廣?是不是邏輯結(jié)構(gòu)先復(fù)雜了再化簡的?還是只會設(shè)計簡單的,復(fù)雜不起來(這一點是笨哦,如果出現(xiàn)多次,請你不要意氣用事,轉(zhuǎn)行吧)?最重要的一點,是否容易理解、實現(xiàn)和改進?你自己會得出評價的。如果有機會看到別人的設(shè)計,一定不要錯過學(xué)習(xí)的機會,自己推導(dǎo)一遍,認(rèn)真比較比較,獲益會較多。
走到這一步,你就應(yīng)該關(guān)注設(shè)計模式了,首先還是學(xué)習(xí),這方面的好書有的是,但一般在工作中用到的設(shè)計模式較為單一,應(yīng)該多嘗試一下其它的設(shè)計模式。其次必須要明白設(shè)計模式不是設(shè)計思路,也不能代替設(shè)計思路,比方你要從A到B修一條路,設(shè)計模式只是讓你選擇,是修水泥的還是柏油的?是高架路還是普通的,但線路必須你自己定,而線路就是設(shè)計思路,模式對思路是有影響,但不能代替,所以如果你的智商高達250,我相信你直接用匯編語言也能寫出面向?qū)ο蟮某绦騺?。第三在此有一個陷阱,很多系統(tǒng)分析員生搬硬套設(shè)計模式,全然不懂如何融會貫通,在你的一項具體工作中,往往是以一種設(shè)計模式為主,其它模式為輔的,思維不拘泥于形式才是關(guān)鍵,而且也為你到達更高的軟件設(shè)計的境界做好準(zhǔn)備。
唉!都不知該怎么向下寫好了,因為已達到作者水平的極限了,我胡亂說一點,你湊合看吧。軟件設(shè)計最終的層次是:以無法為有法、以無限為有限,這句話是李小龍說的,不是我說的。再拾人牙慧一把,類比一個故事吧,金大俠在《倚天屠龍記》里講到張無忌初學(xué)太極,學(xué)會的標(biāo)志是把剛學(xué)的招數(shù)全忘了,記住的是太極的道理和精神,和李小龍有些相似喔,軟件設(shè)計也一樣,忘記所有的設(shè)計模式,隨心所欲進行設(shè)計才是至高境界,所以你能到達多高的軟件設(shè)計的境界最終將取決于你的哲學(xué)素質(zhì),這一點實在是不好寫啊,你自己領(lǐng)悟吧!作者只有祝福了!
五、職業(yè)人的終極目標(biāo):全面修煉,成為Leader
這一節(jié)更不好寫,涉及到太多其它非技術(shù)方面的因素,特別是個人人生觀和世界觀的修煉,如果本帖的點擊率超過作者私下期望的一個數(shù)值,那我就爭取盡力厚著臉皮再補上吧。我只說一句,雖然大家都知道軟件開發(fā)是一個團隊性的工作,但追求參與一個大型軟件系統(tǒng)的成功開發(fā),是一名軟件人員的本能,就像拿破侖說的不想當(dāng)元帥的士兵不是好士兵,所以不追求實現(xiàn)大系統(tǒng)的軟件人員,也不是一個好的職業(yè)軟件人員,但你只有成為Leader,領(lǐng)導(dǎo)一個優(yōu)秀的軟件開發(fā)團隊,才有機會實現(xiàn)這個終極職業(yè)目標(biāo),對不對? 好吧,不管你現(xiàn)在的感受如何,我都謝謝你能讀到這里!我不習(xí)慣假謙虛,就不說什么作者水平有限,本文拋磚引玉,歡迎大家批評斧正之類的客套話了,雖然作者水平確實有限。所以我認(rèn)為你盡管有權(quán)砸磚,但實在沒必要搞回帖、或回罵、或頂之類的玩意兒,我只是盡興寫一點多年從事軟件開發(fā)工作的體驗,因此接下來我就高掛免戰(zhàn)牌,不回復(fù)任何回帖了。再次謝謝你能有耐心讀到這里!希望本文對你有所裨益,祝你成功!再見!
本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/carefree31441/archive/2008/07/10/2635287.aspx
第四篇:如何走上優(yōu)秀Java程序員之路?
004km.cn
如何走上優(yōu)秀Java程序員之路?
或許每一個人都有一個高薪夢,Java程序員也不例外,高薪的前提是具備高薪的能力。本文就為大家介紹如何從一名普通碼農(nóng)進階成優(yōu)秀的Java程序員。下面為大家介紹Java程序員的4個習(xí)慣,希望對你有所幫助。
時刻保持求知欲。
吸取新知識,千萬不要局限于Java程序員領(lǐng)域,就算是你有了10年以上的Java程序員經(jīng)歷,你也得要使勁地學(xué)習(xí),因為你在計算機這個充滿一創(chuàng)造力的領(lǐng)域,每天都會有很多很多的新事物出現(xiàn)。
尤其是互聯(lián)網(wǎng)領(lǐng)域的程序員,你需要跟上時代的步伐,不僅需要了解新的程序語言、個人開發(fā)工具、團隊協(xié)同工具等等,更需要去閱讀一些業(yè)內(nèi)的新聞,并到一些熱門的社區(qū)去參與在線的討論。
使用版本管理工具管理你的代碼。
如果你的軟件開發(fā)團隊開發(fā)的源代碼并沒有版本管理系統(tǒng),那么你的軟件開發(fā)能力會一直處于石器時代而停滯不前。
004km.cn 使用什么樣的版本管理工具依賴于你的團隊的大小和地理分布,你也許正在使用最有效率或最沒有效率的工具來管理你的源代碼。但一個優(yōu)秀的程序員總是會使用一款源碼版本管理工具來管理自己的代碼。
務(wù)必一定養(yǎng)成文檔交流的習(xí)慣。
程序猿最討厭的兩件事:第一件事是給自己的代碼寫文檔,第二件呢?是別人的程序沒有留下文檔。
這是一個笑話,卻是一個大實話。優(yōu)秀的程序員需要習(xí)慣用優(yōu)質(zhì)的文檔來進行交流,而不是無盡的吐槽和嫌棄。
養(yǎng)成文檔交流的習(xí)慣,除了在代碼中保持良好的注釋風(fēng)格之外,為了讓你和你的團隊容易的明白你的意圖和想法,更需要寫下更詳細(xì)的說明文檔。這不僅是一種團隊的離線交流的方法,更是一種知識傳遞的方法。
Markdown是一個很好的文檔編寫工具,可以讓你不受工具編輯器的限制來表達你的思路和想法。代碼和流程圖混合表達,無論是在哪個平臺,通行無阻。
所以,你可以利用WordPress搭建一個對外的博客,用Markdown寫博客與外界交流;也可以利用“有道云協(xié)作”輕松建立一個完備的團隊內(nèi)部Wiki,用它原生支持的Markdown編輯器來寫內(nèi)部交流文檔,不僅支持版本對照,還能讓知識和經(jīng)驗靈活的在內(nèi)外部流動和分享。
004km.cn 與非技術(shù)人員建立良好的溝通機制
據(jù)說,殺一個程序員不需要用槍,改三次需求就可以了。也有人說,PM是程序員的天敵。
其實,與其在這種相生相殺的關(guān)系中糾結(jié)和碰撞,不如大家一起坐下來,建立一個良好的溝通機制,依托于優(yōu)秀的協(xié)同工具,共同高效率的推薦開發(fā)工作。
但是互聯(lián)網(wǎng)行業(yè)里,程序員沒辦法要求不懂代碼的產(chǎn)品經(jīng)理用SVN和自建Wiki來管理需求文檔,更沒辦法讓設(shè)計人員理解版本管理的重要性。所以,使用通用性強,簡單易上手的“有道云協(xié)作”來建立團隊wiki是個不錯的選擇。養(yǎng)成以上習(xí)慣,不會使你立刻變成年薪百萬的程序員,卻可以讓你走在正確的道路上!
第五篇:JAVA程序員之路
怎么學(xué)好java
JAVA程序員之路
很多網(wǎng)友問我學(xué)習(xí)Java有沒有什么捷徑,我說“無他,唯手熟爾”。但是我卻很愿意將自己學(xué)習(xí)的一些經(jīng)驗寫出來,以便后來者少走彎路,幫助別人是最大的快樂嘛!
要想學(xué)好Java,首先要知道Java的大致分類。我們知道,自從Sun推出Java以來,就力圖使之無所不包,所以Java發(fā)展到現(xiàn)在,按應(yīng)用來分主要分為三大塊:J2SE,J2ME和J2EE,這也就是Sun ONE(Open Net Environment)體系。J2SE就是Java2的標(biāo)準(zhǔn)版,主要用于桌面應(yīng)用軟件的編程;J2ME主要應(yīng)用于嵌入是系統(tǒng)開發(fā),如手機和PDA的編程;J2EE是Java2的企業(yè)版,主要用于分布式的網(wǎng)絡(luò)程序的開發(fā),如電子商務(wù)網(wǎng)站和ERP系統(tǒng)。J2SE開發(fā)桌面應(yīng)用軟件比起VC,VB,DEPHI這些傳統(tǒng)開發(fā)語言來說,優(yōu)勢好象并不明顯。J2ME對于初學(xué)者來說,好象又有點深奧,而且一般開發(fā)者很難有開發(fā)環(huán)境。所以現(xiàn)在應(yīng)用最廣泛又最好學(xué)的就是J2EE了。J2EE又包括許多組件,如
Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要學(xué)習(xí)起來可不是一兩天的事。那么又該如何學(xué)習(xí)J2EE呢?當(dāng)然Java語法得先看一看的,I/O包,Util包,Lang包你都熟悉了嗎?然后再從JSP學(xué)起。如果你學(xué)過HTML,那么事情要好辦的多,如果沒有,那你快去補一補HTML基礎(chǔ)吧。其實JSP中的Java語法也不多,它更象一個腳本語言,有點象ASP。然后你就該學(xué)一學(xué)Servlet了。Servlet就是服務(wù)器端小程序,他負(fù)責(zé)生成發(fā)送給客戶端的HTML文件。JSP在執(zhí)行時,也是先轉(zhuǎn)換成Servlet再運行的。雖說JSP理論上可以完全取代Servlet,這也是SUN推出JSP的本意,可是Servlet用來控制流程跳轉(zhuǎn)還是挺方便的,也令程序更清晰。接下來你應(yīng)該學(xué)習(xí)一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代碼的混亂方式了,這種方式跟ASP又有什么區(qū)別呢?還好,SUN提供了Javabean可以把你的JSP中的Java代碼封裝起來,便于調(diào)用也便于重用。接著就是EJB了,EJB就是Enterprise JavaBean,看名字好象它是Javabean,可是它和Javabean還是有區(qū)別的。它是一個體系結(jié)構(gòu),你可以搭建更安全、更穩(wěn)定的企業(yè)應(yīng)用。它的大量代碼已由中間件(也就是我們常聽到的Weblogic,Websphere這些J2EE服務(wù)器)完成了,所以我們要做的程序代碼量很少,大部分工作都在設(shè)計和配置中間件上。至于JDBC,就不用我多說了,你如果用java編過存取數(shù)據(jù)庫的程序,就應(yīng)該很熟悉。還有,如果你要用Java編發(fā)送電子郵件的程序,你就得看看Javamail了。
好了,對Java和J2EE有了一些基本概念之后,你就應(yīng)該編一些程序了,千萬不要紙上談兵哦。最好找一些有實例且?guī)Ч獗P的書來看,這樣看到好的程序就可以直接Ctrl+C再Ctrl+V,也不用勞您老大架再親自把它再輸一遍吧,再說直接復(fù)制還不用怕出錯,何樂而不為呢!還有就是要經(jīng)常上一些好的Java編程文章,有好的文章要Cut下來,有問題盡管問,只要問題不是太傻,一般高手都會回答你的。下面介紹幾個好的Java方面的編程網(wǎng)站:
CSDN論壇http:/// 中國最有名的技術(shù)論壇,《程序員》雜志就是他們出版的,你可以在上面提出問題,馬上就有人回答你,如果你覺得好,你可以給那人加分;
Java研究組http:/// 那里Java資料比較全;
java.com.cn http://.cn/ 看這域名就知道有多牛,注冊用戶快接近一萬了,同時在線人數(shù)也在一千左右,人氣很旺的;
IBM的開發(fā)者網(wǎng)http:// IBM永遠(yuǎn)的藍色巨人;
那么我書也看了,程序也做了,別人問我的問題我都能解決了,是不是就成為高手了呢?當(dāng)然沒那么簡單,這只是萬里長征走完了第一步。不信?那你出去接一個項目,你知道怎么下手嗎,你知道怎么設(shè)計嗎,你知道怎么組織人員進行開發(fā)嗎?你現(xiàn)在腦子里除了一些散亂的代碼之外,可能再沒有別的東西了吧!你現(xiàn)在最缺的是實際的工作經(jīng)驗,而不是書本上那些憑空想出來的程序。所以你快去找一份Java的編程工作來做吧(如果是在校學(xué)生可以去做兼職啊),在實踐中提高自己,那才是最快的。不過你得祈禱在公司里碰到一個高手,而且他還愿意不厭其煩地教你,這樣好象有點難哦!
還有一個辦法就是讀開放源碼的程序了。我們知道開放源碼大都出自高手,他們設(shè)計合理,考慮周到,再加上有廣大的程序員參與,代碼的價值自然是字字珠嘰,鏗鏘有力(對不起,最近《金裝四大才子》看多了)。學(xué)Java必讀的兩個開源程序就是Jive和Pet Store.。Jive是國外一個非常著名的BBS程序,完全開放源碼。論壇的設(shè)計采用了很多先進的技術(shù),如Cache、用戶認(rèn)證、Filter、XML等,而且論壇完全屏蔽了對數(shù)據(jù)庫的訪問,可以很輕易的在不同數(shù)據(jù)庫中移植。論壇還有方便的安裝和管理程序,這是我們平時編程時容易忽略的一部份(中國程序員一般只注重編程的技術(shù)含量,卻完全不考慮用戶的感受,這就是我們與國外軟件的差距所在)。Jive的資料在很多網(wǎng)站上都有,大家可以找來研究一下。相信你讀完代碼后,會有脫胎換骨的感覺。遺憾的是Jive從2.5以后就不再無條件的開放源代碼,同時有l(wèi)icence限制。不過幸好還有中國一流的Java程序員關(guān)注它,外國人不開源了,中國人就不能開源嗎?這里向大家推薦一個漢化的Jive版本—J道。Jive(J道版)是由中國Java界大名鼎鼎的banq在Jive2.1版本基礎(chǔ)上改編而成, 全中文,增加了一些實用功能,如貼圖,用戶頭像和用戶資料查詢等,而且有一個開發(fā)團隊在不斷升級。你可以訪問banq的網(wǎng)
http:/// 去下載,或到同濟技術(shù)論壇的服務(wù)器上
ftp://nro.shtdu.edu.cn去下,安裝上有什么問題,可以到論壇上去提問。Pet Store.(寵物店)是SUN公司為了演示其J2EE編程規(guī)范而推出的開放源碼的程序,應(yīng)該很具有權(quán)威性,想學(xué)J2EE和EJB的朋友不要錯過了。
你一定會高興地說,哈哈,原來成為Java高手就這么簡單啊!記得我也曾碰到過一個項目經(jīng)理,號稱Java很簡單,只要三個月就可以學(xué)會。其實說這種話的人就如當(dāng)年小日本號稱“三個月拿下中國”一樣大言不慚。不是我潑你冷水,你現(xiàn)在只是學(xué)到了Java的骨架,卻還沒有學(xué)到Java的精髓。接下來你得研究設(shè)計模式了。設(shè)計模式是高級程序員真正掌握面向?qū)ο蠛诵乃枷氲谋匦拚n。設(shè)計模式并不是一種具體“技術(shù)”,它講述的是思想,它不僅僅展示了接口或抽象類在實際案例中的靈活應(yīng)用和智慧,讓你能夠真正掌握接口或抽象類的應(yīng)用,從而在原來的Java語言基礎(chǔ)上躍進一步,更重要的是,設(shè)計模式反復(fù)向你強調(diào)一個宗旨:要讓你的程序盡可能的可重用。關(guān)于設(shè)計模式的資料,還是向大家推薦banq的網(wǎng)http:///,他把GOF的23種模式以通俗易懂的方式詮釋出來,純Java描述,真是經(jīng)典中的經(jīng)典。有時間再研究一下MVC結(jié)構(gòu)(把
Model-View-Control分離開的設(shè)計思想)吧,現(xiàn)在很流行的Structs就是它的一種實現(xiàn)方式,不過Structs用起來實在是很繁,我們只要學(xué)習(xí)其精髓即可,我們完全可以設(shè)計自己的MVC結(jié)構(gòu)。然后你再研究一下軟件Refactoring(重整)和極限XP編程,相信你又會上一個臺階。
做完這些,你不如整理一下你的Java代碼,把那些經(jīng)典的程序和常見的應(yīng)用整理出來,再精心打造一番,提高其重用性和可擴展性。你再找?guī)讉€志同道合的朋友成立一個工作室吧,你可以去承接一些項目做了,一開始可能有些困難,可是你有技術(shù)積累,又考慮周全,接下項目來可以迅速作完,相信大家以后都會來找你的,所以Money就嘩啦啦的來了。。。
當(dāng)然你也可以參加一些開源項目,一方面可以提高自己,另一方面也是為中國軟件事業(yè)做貢獻嘛!開發(fā)者在互聯(lián)網(wǎng)上用CVS合作開發(fā),用QQ,MSN,E-mail討論聯(lián)系,天南海北的程序員分散在各地卻同時開發(fā)同一個軟件,是不是很有意思呢?
下面介紹兩個好的開源項目網(wǎng)站:
湖北省軟件公共開發(fā)平http://gro.clinux.org/
共創(chuàng)聯(lián)http://cosoft.org.cn/
哇,好高興哦,我終于成為高手了!非也,非也。古人云:“識時務(wù)者為俊杰”。你知道計算機界現(xiàn)在的發(fā)展形勢嗎?你知道微軟的.NET藍圖和SUN ONE計劃之間的明爭暗斗嗎?你知道計算機技術(shù)將向何處發(fā)展嗎?其實從各大計算機廠商最近的動作,都可以看出來“Web服務(wù)將是下一代互聯(lián)網(wǎng)應(yīng)用的制高點”,而微軟的.NET藍圖和SUN ONE計劃的斗爭焦點,也就是Web服務(wù)。Web服務(wù)就是一個嶄新的分布式計算模型,它是一系列標(biāo)準(zhǔn)的綜合(XML,SOAP,UDDI,WSDL和WSFL等)。它使得不同語言編寫的軟件能夠輕易的集成起來,使網(wǎng)絡(luò)資源和Web站點變成一種服務(wù)而不是混亂的垃圾場。不遠(yuǎn)的將來,我們就可以在家里點擊一下鼠標(biāo),就可以完成出門旅游的全部準(zhǔn)備工作,包括定飛機票,定旅游線路,定好房間等。請注意,這所有的一切都是Web站點間自動完成的,再也不用象現(xiàn)在一樣,表面上是電子商務(wù),實際上很多環(huán)節(jié)都是人工操作。也許你會覺得這是天方夜談,不過就近的說,你也很有可能承接一個項目,要集成兩個企業(yè)的ERP系統(tǒng)。很有可能上游企業(yè)的系統(tǒng)是用Dephi編的,而下游企業(yè)的系統(tǒng)是用Java編的。你說你是Java高手,大家都看者你怎么做呢。所以啊,你還得學(xué)習(xí)新技術(shù),如Web服務(wù),而且你Dephi也要懂一點吧(Dephi6現(xiàn)在已經(jīng)提供Web服務(wù)的控件了)。你編的Java系統(tǒng),可能要和.NET集成,所以你.NET要懂一點吧?到最后,你可能發(fā)現(xiàn)你已經(jīng)成為Java高手了,但很多時間卻在搞別的技術(shù)。太極張三豐里說,最厲害的招式就是沒有招式,可能就是這個道理吧!因為剛剛興起,所以網(wǎng)上Web服務(wù)的資料不是很多,我還是給大家推薦幾個網(wǎng)站吧:
中國UDDI技術(shù)聯(lián)http:///developerWorks/cn/xml/index.shtml?csdn IBM可是Web服務(wù)的力推者
嗚…你費勁千心萬苦,總算成為Java高手了,怎叫人不由喜極而泣呢!是啊,真不容易,真不簡單,真叫人感動啊!那么打個電話告訴我吧,什么?我的電話號碼是多少?昏到,你打電話問不就知道了嗎,真是的……
如上是在網(wǎng)上考下來的,但個人認(rèn)為SCJP證書也好,程序員等級證書也好,不要太看重它;關(guān)鍵是你手中有沒有技術(shù),能不能拿出活來。我面試時候都是以證書為參考,主要衡量你的手段還是提問技術(shù)性問題以及一些編程方面的基礎(chǔ)問題。建議不要把證書看的太重。