大牛——心聲

如何成爲編程高手java

第一階段
此階段主要是能熟練地使用某種語言。這就至關於練武中的套路和架式這些表面的東西。
 
第二階段
此階段能精通基於某種平臺的接口(例如咱們如今經常使用的Win 32的API函數)以及所對應語言的自身的庫函數。到達這個階段後,也就至關於能夠進行真實散打對練了,能夠真正地在實踐中作些應用。
 
第三階段
此階段能深刻地瞭解某個平臺系統的底層,已經具備了初級的內功的能力,也就是「手中有劍,心中無劍」。
 
第四階級
此階段能直接在平臺上進行比較深層次的開發。基本上,能達到這個層次就能夠說是進入了高層次。這時進入了高級內功的修煉。好比能進行VxD或操做系統的內核的修改。
 
這時已經再也不有語言的束縛,語言只是一種工具,即便要用本身不會的語言進行開發,也只是簡單地熟悉一下,就手到擒來,徹底不像是第一階段的時候學習語言的那種狀況。通常來講,從第三階段過渡到第四階段是比較困難的。爲何會難呢?這就是由於不少人的思想變不過來。
 
第五階級
此階段就已經再也不侷限於簡單的技術上的問題了,而是 能從全局上把握和設計一個比較大的系統體系結構,從內核到外層界面。能夠說是「手中無劍,心中有劍」。到了這個階段之後,能對市面上的任何軟件進行剖析,並能按本身的要求進行設計,就算是MS Word這樣的大型軟件,只要有充足的時間,也必定會設計出來。
 
第六階級
此階段也是最高的境界,達到「無招勝有招」。這時候, 任何問題就純粹變成了一個思路的問題,不是用什麼代碼就能表示的。也就是「手中無劍,心中也無劍」。
 
此時,對於練功的人來講,他已不用再去學什麼少林拳,只是在旁看一下少林拳的對戰,就能把此拳拿來就用。這就是真正的大師級的人物。這時,Win 32或Linux在你眼裏是沒有什麼差異的。
 
每個階段再向上發展時都要按必定的方法。第1、第二個階段經過自學就能夠完成,只要多用心去研究,耐心地去學習。
 
要想從第二個階段過渡到第三個階段,就要有一個好的學習環境。例若有一個高手帶領或公司裏有一個好的練手環境。通過2、三年的積累就能達到第三個階段。可是,有些人到達第三個階段後,經常就很難有境界上的突破了。他們這時會產生一種觀念,認爲軟件無非如此,認爲本身已無所不能。其實,這時若是遇到大的或難些的軟件,他們每每仍是無從下手。
 
如今咱們國家大部分程序員都是在第2、三級之間。他們大多都是經過自學成才的,不過這樣的程序員通常在軟件公司也能獨當一面,完成一些軟件的模塊。
 
可是,也還有一大堆處在第一階段的程序員,他們通常就能玩玩VB,作程序時,去找一堆控件集成一個軟件。
 
 
同窗們咱們如今還處在第一階段啊,革命還沒有成功,同志還須努力!!!
如何成爲編程高手...- -
 
世界上並無成爲高手的捷徑,但一些基本原則是能夠遵循的。
  1. 紮實的基礎。數據結構、離散數學、編譯原理,這些是全部計算機科學的基礎,若是不掌握他們,很難寫出高水平的程序據個人觀察,學計算機專業的人比學其餘專業的人更能寫出高質量的軟件。 程序人人都會寫,但當你發現寫到必定程度很難再提升的時候,就應該想一想是否是要回過頭來學學這些最基本的理論。不要一開始就去學OOP,即便你再精通OOP,遇到一些基本算法的時候可能也會一籌莫展。
  2. 豐富的想象力。不要拘泥於固定的思惟方式,遇到問題的時候要多想幾種解決問題的方案,試試別人從沒想過的方法。豐富的想象力是創建在豐富的知識的基礎上,除計算機之外,多涉獵其餘的學科,好比天文、物理、數學等等。另外,多看科幻電影也是一個很好的途徑。
  3. 最簡單的是最好的。這也許是全部科學都遵循的一條準則,如此複雜的質能互換原理在愛因斯坦眼裏不過是一個簡單得不能再簡單的公式:E=mc2。簡單的方法更容易被人理解,更容易實現,也更容易維護。遇到問題時要優先考慮最簡單的方案,只有簡單方案不能知足要求時再考慮複雜的方案。
  4. 不鑽牛角尖。當你遇到障礙的時候,不妨暫時遠離電腦,看看窗外的風景,聽聽輕音樂,和朋友聊聊天。當我遇到難題的時候會去玩遊戲,並且是那種極暴力的打鬥類遊戲,當負責遊戲的那部分大腦細胞極度亢奮的時候,負責編程的那部分大腦細胞就獲得了充分的休息。當從新開始工做的時候,我會發現那些難題如今居然能夠迎刃而解。
  5. 對答案的渴求。人類天然科學的發展史就是一個渴求獲得答案的過程,即便只能知道答案的一小部分也值得咱們去付出。只要你堅決信念,必定要找到問題的答案,你纔會付出精力去探索,即便最後沒有獲得答案,在過程當中你也會學到不少東西。
  6. 多與別人交流。三人行必有我師,也許在一次和別人不經意的談話中,就能夠迸出靈感的火花。多上上網,看看別人對同一問題的見解,會給你很大的啓發。
  7. 良好的編程風格。注意養成良好的習慣,代碼的縮進編排,變量的命名規則要始終保持一致。你們都知道如何排除代碼中錯誤,卻每每忽視了對註釋的排錯。註釋是程序的一個重要組成部分,它能夠使你的代碼更容易理解,而若是代碼已經清楚地表達了你的思想,就沒必要再加註釋了,若是註釋和代碼不一致,那就更加糟糕。
  8. 韌性和毅力。這也許是"高手"和通常程序員最大的區別。A good programming is 99% sweat and 1% coffee。高手們並非天才,他們是在無數個日日夜夜中磨練出來的。成功能給咱們帶來無比的喜悅,但過程倒是無比的枯燥乏味。你不妨作個測試,找個10000之內的素數表,把它們全都抄下來,而後再檢查三遍,若是可以不間斷地完成這一工做,你就能夠知足這一條。
我考高程
[原創] (寫於1999-08-23)
中專三年級的時候,我已經經過了全國三級(B),但一次偶然的機會我知道了還有一個程序員考試,更重要的是程序員考試比全國三級更權威,經過率更低,而且過了中程就至關於助工,過了高程就至關於工程師,多棒呀,因而我知道我要幹什麼了。
我先報考的是中級程序員水平,程序員考試分上午試題與下午試題,上午試題主要是理論知識,包括數據結構、數據庫原理等等之類的東西,下午試題是C語言,我看過參考題目,知道這須要的是真本事,是須要平時的不斷積累。理論知識則沒有多大問題,無非是把本書啃上幾遍。我先買了幾本參考書,開始背理論知識,穿梭於鏈表、範式之間,雖然雲裏霧裏不知所云,但以爲還有點心得。爲了提升本身的C編程水平,特別是對一些基本算法的熟悉,我開始把數據結構上的一些算法試着本身用C來實現一遍,當時用的是TC2.0,一個個的算法憑着本身的理解變成了一個個的程序,檢索、排序、鏈表、隊列等等,我以爲本身進入狀態了,不過惋惜的是,考試的時候下午試題搞得我不知所措,手忙腳亂,才發現本身學的那點皮毛根本不算什麼。
中專四年級我沒有再報中級程序員,而是直接報了高級程序員水平,由於我以爲上次就是我過輕敵,此次乾脆背水一戰,來就來大的。上次考試之後,個人C語言水平有了更進一步的提升,高程上午試題有30%是計算機英語題,爲此我還花了一段時間啃了遍《計算機英語》,雖然本身的英語水平差得不行,但在計算機英語方面我仍是自認爲不錯的,看通常的英文技術資料沒有問題。
考高程前正值實習,我實習的工做是在一家百貨大樓站櫃,我天然是難耐「寂寞」,私自跑到一家電腦公司裏作打工,但又不能讓學校知道,因而天天上午去百貨大樓站櫃,中午至晚上九點半在電腦公司裏打工,可當時不知天高地厚的我還報了四門自學考試課程,再加上即將面臨的高程考試,我成了個徹徹底底的大忙人,天天早上六點多起來,騎車四十分鐘去百貨大樓報到上班,中午去電腦公司報到,工做至晚上九點半,而後騎自行車回校。爲了充分利用每一分鐘,我想了不少的辦法。例如站櫃的時候,反正沒有多少顧客,就在貨票的背面默寫英文單詞,繞着櫃檯自言自語默記,一有機會就溜到貨櫃裏看《計算機網絡》,在電腦公司裏我主要是作輔導員,爲一些上機的人解決一些問題,空閒的時候就拿出一本《數據結構》,邊走邊唸唸有詞。晚上騎車回校的時間也不能放過,邊騎邊回憶一些知識點,爲此在這段時間裏我撞過一輛公共汽車,摔過一跤,並與一輛迎面過來的三輪車撞個正着,直至在一個明媚的早晨,由於走神闖了紅燈,自行車被沒收爲止。
這段時間過得緊張、刺激、充實,時間被最高效率的利用,天然有努力便有回報,四門自考課程都過了,這但是在之前時間充裕的時候都沒有創造過的紀錄,更重要的是,高程居然過了,分數線是上午48,下午48,我上午是59,下午是59。這段日子使我明白了,其實時間並非最重要的,效率纔是最重要的。還有就是必定要給本身壓力,更重要的是使我明白了,有一份耕耘就會有一份收穫,這一點對每個人都是公平的。
〖一.◆如何成爲一個優秀程序員有指導意義的好文章〗- -                                     
 
此人網名爲xiaomazhw2001,如今,有篇文章寫的不錯,對學編程的人有必定的啓發,把它轉帖以下:
    給你們學習C的一點建議! 220.202.194.11
我始終認爲,對一個初學者來講,IT界的技術風潮是不能夠追趕的,並且也沒有能力去追趕。我時常看見本身的DDMM們把課本扔了,去賣些價格不菲的諸如C#, VB.Net 這樣的大部頭,這讓我感到很是痛心。而許多搞不清指針是咋回事的BBS站友眉飛色舞的討論C#裏面能夠不用指針等等則讓我以爲可笑。C#就象當年的ASP同樣,「忽如一晚上春風來,千樹萬樹梨花開」,結果許多學校的信息學院成了「Web 學院」。96,97級的很多大學生都去作Web 了。固然我沒有任何歧視某一行業的意識。我只是以爲若是他們把追趕這些時髦技術的時間多花一點在基礎的課程上應該是能夠走得更遠的。
幾個誤區
 
   初學者對C#風潮的追趕其實也只是學習過程當中常常遇到的幾個誤區之一。我將用一些實際的例子來講明這些現象,你能夠循序漸進的看看本身是否是屬於其中的一種或者幾種:
認爲計算機技術等於編程技術:
有些人即便沒有這個想法,在潛意識中也有這樣的衝動。讓我奇怪的是,許多信息學院的學生也有這樣的念頭。認爲計算機專業就是編程專業,與編程無關的,或者不太相關的課程他通通都無論,極端的學生只要書上沒帶「編程」兩個字他就不看。
其實編程只是計算機技術應用過程當中一種複雜性最低的勞動,這就是爲何IT業最底層的人是程序員(CODER)。 計算機技術包括了多媒體,計算機網絡,人工智能,模式識別,管理信息系統等等這些方面。編程工做只是在這些具體技術在理論研究或者工程實踐的過程當中表達算法的過程。編程的人不必定對計算機技術的瞭解就必定很高。而一個有趣的現象是,很多大師級的計算機技術研究者是不懂編程的。網上的炒做和現實中良好的工做待遇把編程這種勞動神祕化了。其實每個程序員內心都明白,本身這些東西,學的時候並不比其它專業難,因此天然也不會高檔到哪裏去。
咬文嚼字的孔已己做風:
我見過一本女生的《計算機網絡原理》教材,這個女生像小學生同樣在書上劃滿了橫槓槓,筆記作得滿滿的,打印出來必定比教材還厚。我不明白的是,像計算機網絡原理這樣的課程有必要作筆記?咱們的應試教育的確害了很多學生,在上《原理》這一類課程的時候許多學生像學《馬列原理》同樣逐字背誦記憶。這乃是我見過的最愚蠢的行爲。所謂《原理》,便是須要掌握它爲何這樣作,學習why,而不是how(怎樣作)。極端認真的學生背下以太網的網線最大長度,數據幀的長度,每一個字段的意義,IP報頭的格式等等,可是忘了路由的原則,忘了TCP/IP協議設計的宗旨。總之許多人花了大量的時間把書背得倒背如流卻等於什麼也沒學。
在學習編程的時候這些學生也是這樣,他們確切的記得C++語法的各個細節。看完了C++教程後看《Thinking in C++》(確實是好書),《Inside C++》,《C++ reference》,this C++, that C++……,而後是網上各類各樣的關於C++語法的奇聞逸事,而後發現本身又忘了C++的一些語法,最後回頭繼續惡補…。有個師弟就跟我說:「C++ 太難了,學了這裏忘了那裏,學了繼承忘了模板。」個人回答道:「你不去學就容易了」。我並無教壞他,只是告訴他,死摳C++的語法就和孔已己炫耀茴香豆的茴字有幾種寫法同樣毫無心義。你根本不須要對的C++語法太關心,動手編程就是了,有不記得的地方一查MSDN就立馬搞定。我有個結論就是,實際的開發過程當中對程序語法的瞭解是最微不足道的知識。這是爲何我在爲同窗用Basic(我之前從沒有學過它)寫一個小程序的時候,只花了半個小時看了看語法,而後再用半個小時完成了程序,而一個小時後我又徹底忘記了Basic 的全部關鍵字。
不顧基礎,盲目追趕時髦技術:
終於點到題目上來了。大多數的人都但願本身的東西可以立刻跑起來,變成錢。 這種想法對一個已經進入職業領域的程序員或者項目經理來講是合理的,並且IT技術進步是如此的快,不跟進就是失業。可是對於初學者來講(尤爲是時間充裕的大中專在校生),這種想法是另人費解的。一個並未進入到行業競爭中來的初學者最大的資本即是他有足夠的時間沉下心來學習基礎性的東西,學習why 而不是how。時髦的技術每每容易掌握,並且愈來愈容易掌握,這是商業利益的驅使,爲了最大化的下降軟件開發的成本。但在IT領域內的現實就是這樣,越容易掌握的東西,學習的人越多,並且淘汰得越快。每一次新的技術出來,都有許多初學者跟進,這些初學者因爲缺少必要的基礎而使得本身在跟進的過程當中花費大量的時間,而等他學會了,這種技術也快淘汰了。基礎的課程,比方數據結構,操做系統原理等等雖然不能讓你立馬就實現一個linux(這是許多人嘲笑理論課程無用的緣由),但它們可以顯著的減小你在學習新技術時學習曲線的坡度。並且對於許多關鍵的技術(比方Win32 SDK 程序的設計,DDK的編程)來講甚至是不可或缺的。
一個活生生的例子是我和個人一個同窗,在大一時我還找不到開機按紐,他已經會寫些簡單的彙編程序了。我把大二的全部時間花在了彙編,計算機體系結構,數據結構,操做系統原理等等這些課程的學習上,而他則開始學習HTML和VB,並追趕ASP的潮流。大三的時候我開始學習Windows 操做系統原理,學習SDK編程,時間是漫長的,這時我纔可以用VC開發出象模象樣的應用程序。我曾一度由於同窗的程序已經可以運行而本身還在學習如何建立對話框而懊惱不已,但臨到畢業才發現本身的選擇是何等的正確。和我談判的公司開出的薪水是他的兩倍還多。下面有一個不很恰當的比方:假設學習VB編程須要4個月,學習基礎課程和VC的程序設計須要1年。那麼若是你先學VB,再來學習後者,時間不會減小,仍是1年,而反過來,若是先學習後者,再來學VB,也許你只須要1個星期就能學得很是熟練。
幾個重要的基礎課程
 
若是你是學生,或者若是你有充足的時間。我建議你仔細的掌握下面的知識。個人建議是針對那些但願在IT技術上有所成就的初學者。同時我還列出了一些書目,這些書應該都還能夠在書店買到。說實在的,我在讀其餘人的文章時最大的心願就是但願做者列出一個書單。
大學英語-不要以爲可笑。我極力推薦這門課程是由於沒有專業文檔的閱讀能力是不可想象的。中文的翻譯每每在猴年馬月纔會出來,而如今的許多出版社乾脆就直接把E文印刷上去。學習的方法是強迫本身看原版的教材,開始會看不懂,用多了天然熟練。吃得苦下得狠心絕對是任何行業都須要的品質。
計算機體系結構和彙編語言-關於體系結構的書遍地都是,並且也大同小異,卻是 彙編有一本很是好的書《80x86彙編語言程序設計教程》(清華大學出版社,黑色封面,楊季文著)。你須要着重學習386後保護模式的程序設計。不然你在學習現代操做系統底層的一些東西的時候會以爲是在看天書。
計算機操做系統原理-咱們的開發老是在特定的操做系統上進行,若是不是,只有一種可能:你在本身實現一個操做系統。不管如何,操做系統原理是必讀的。這就象咱們爲一個芯片製做外圍設備時,芯片基本的工做時序是必需瞭解的。這一類書也不少,我沒有發現哪一本書很是出衆。只是以爲在看完 了這些書後若是有空就應該看看《Inside Windows 2000》(微軟出版社,我看的是E文版的,中文的書名想必是Windows 2000 技術內幕之類吧)。關於學習它的必要性,ZDNET上的另外一篇文章已經有過論述。
數據結構和算法-這門課程可以決定一我的程序設計水平的高低,是一門核心課程。我首選的是清華版的(朱戰立,劉天時)。不少人喜歡買C++版的,但我以爲沒有必要。C++的語法讓算法實現過程變得複雜多了,並且許多老師喜歡用模塊這一東西讓算法變得更復雜。卻是在學完了C版的書之後再來瀏覽一下C++的版的書是最好的。
軟件工程-這門課程是越到後來就愈加現它的重要,雖然剛開始看時就象看馬哲同樣不知所云。個人建議是 看《實用軟件工程》(黃色,清華)。不要花太多的時間去記條條框框,看不懂就跳過去。在每次本身完成了一個軟件設計任務(無論是練習仍是工做)之後再來回顧回顧,每次都會有收穫。
Windows 程序設計-《北京大學出版社,Petzold著》我建議任何企圖設計Windows 程序的人在學習VC之前仔細的學完它。並且前面的那本《Inside Windows 2000》也最好放到這本書的後面讀。在這本書中,沒有C++,沒有GUI,沒有控件。有的就是如何用原始的C語言來完成Windows 程序設計。在學完了它之後,你纔會發現VC實際上是很容易學的。千萬不要在沒有看完這本書之前提早學習VC,你最好碰都不要碰。我知道的許多名校甚至都已經用它做爲教材進行授課。可見其重要。
上面的幾門課程我認爲是必學的重要課程(若是你想作Windows 程序員)。
對於其它的課程有這樣簡單的選擇方法:若是你是計算機系的,請學好你全部的專業基礎課。若是不是,請參照計算機系的課程表。若是你發現本身看一本書時沒法看下去了,請翻到書的最後,看看它的參考文獻,找到它們並學習它們,再回頭看這本書。若是一本書的書名中帶有「原理」兩個字,你必定不要去記憶它其中的細節,你應該以一天至少50頁的速度掌握其要領。儘量多的在計算機上實踐一種理論或者算法。
你還能夠在CSDN上閱讀到許多書評。這些書評可以幫助你決定讀什麼樣的書。
日三省乎己    
天天讀的書太多,容易讓人迷失方向。必定要在天天晚上想一想本身學了些什麼,還有些什麼相關的東西須要掌握,本身對什麼最感興趣,在一本書上花的時間太長仍是不夠等等。同時也應該多想一想將來最有可能出現的應用,這樣可以讓你不是追趕技術潮流而是引領技術潮流。同時,努力使用如今已經掌握的技術和理論去製做具備必定新意的東西。堅持這樣作可以讓你真正成爲一個軟件「研發者」而不只僅是一個CODER。
把最多的時間花在學習上
這是對初學者最後的忠告。把每一個星期玩CS或者CS的時間壓縮到最少,不玩它們是最好的。同時,若是你的ASP技術已經可以來錢,甚至有公司請你兼職的話,這就證實你的天分可以保證你在努力的學習以後取得更好的收益,你應該去作更復雜的東西。眼光放長遠一些,這不管是對誰都是適用的。
相信你已經可以決定是否學習C#或者何時去學它了。
程序員的四個境界
  國學大師王國維先生認爲古今成大事業、大學問者,必通過三種境界,第一種境界:「昨夜西風凋碧樹。獨上高樓,望盡天涯路」;第二種境界:「衣帶漸寬終不悔,爲伊消得人憔悴」,第三種境界:「衆裏尋他千百度,驀然回首,那人卻在燈火闌珊處」。一代宗師真是體察入微,寥寥數語,道盡了求道者的心路歷程,將一我的由淺嘗、迷茫到徹悟的過程盡數歸納,可謂入木三分。
  IT行業可謂如今的熱門行業,程序員也是不少人羨慕的工做。薪水高,不用東跑西顛,敲敲鍵盤,看看屏幕,一切工做全都搞定,輕鬆而方便。果然如此嗎?不盡然,實際上,程序員的職業生涯也是一個求道的過程,須要不斷的提升和學習,IT行業知識更新之快,常讓程序員們有隨時掉隊的危險,無一日不戰戰兢兢,不敢稍有懈怠。
  程序員的職業生涯也可分爲四個階段, 初級程序員(菜鳥)、高級程序員(熟練工)、系統程序員(高手)、軟件大師(大師),其做品也經歷四種境界:
  · 能夠運行的程序
  · 健壯、高效的程序
  · 結構優美的程序
  · 思想深邃的程序
   程序員的必經第一個階段都是編寫能夠運行的程序。不少人的編程生涯是從「Hello World」開始,當第一次按照教科書上的步驟,將源文件編輯完後,編譯、鏈接、運行,在屏幕上顯示出「Hello World」時,心中的激動一點也不亞於阿里巴巴打開了寶庫的大門。初級程序員的目標通常是讓程序能運行起來,他們迷惑於庫函數的衆多,不知道該用那一個,他們還要學習基本的語法,以使程序編譯經過。初級程序員通常不會考慮設計模式、軟件結構等問題。記得本人編寫的第一個較大的程序是本人的本科畢業論文題目——一個計算機輔助實驗系統,開發工具爲Turbo C,在DOS下開發(那個時候Windows還不太流行,怎麼樣,年代夠久遠吧),整個軟件大約7000行代碼,在當時已經能幹很多事,在DOS下也能顯示很多花裏胡哨的圖形界面,支持中文,支持鼠標操做(那時候在DOS下須要本身處理鼠標事件中斷),當時還頗受好評。但是今天再從新溫習過去的做品,真有點摻不忍睹,整個軟件毫無結構可言,一共分紅兩個源文件仍是因爲編譯器不支持一個太大的源文件而被迫分開,整個系統就是源代碼的簡單堆砌。相信每一個程序員都須要經歷這個階段,它是程序員職業生涯的開始,沒有捷徑能夠跨越,只有不斷的實踐、學習和總結。
   第二階段的程序員已積累了很多的編程經驗,語法和庫函數再也不是障礙,他們已再也不知足於程序正確運行、功能實現無誤。他們須要瞭解程序背後發生的事情,須要瞭解操做系統的原理和調度機制,內存管理,文件系統組織等;瞭解開發工具的細節,如C的函數調用機制,參數的傳送機制、堆棧的創建過程等;瞭解C++的封裝、繼承和多態性背後的機制,虛函數實現機理等。他們不只知道程序應該如何運行,還知道它爲何這樣運行,能編寫高效、魯棒的程序。
   第三階段的程序員能構建結構優美的軟件系統,軟件系統結構的合理性、可擴展性、可維護性、可測試性是系統程序員考慮的重點,結構優美的軟件系統同一棟完美的建築羣同樣,每一個部分各司其職,搭配合理。本人一直認爲,一個好的軟件系統應當具備美學特徵,如簡潔、和諧、層次感等,一個好的軟件系統應當是簡潔的,易於理解的;應當是和諧的,每一個部分高內聚、低耦合,既分工又合做;應當是井井有條,易於維護和移植。因此,本人建議那些進行軟件系統設計的程序員,當你設計完一個系統後,須要問問本身:"它美嗎?",若是答案是否認的,那麼我建議你須要從新考慮系統的設計,若是答案是確定的,那麼,恭喜你,你已經達到一個至關高的水平。
  最後一級也許是每一個程序員夢想達到的頂峯,程序設計再也不是簡單的工具,而是大師們改變世界的魔杖,從C到C++,再到COM和COBRA,再到XML和WEB SERVICES,每次改變,不是軟件語法和開發工具的升級,而是用軟件構建現實世界模型的改變,是一種軟件思想的革命,軟件具備了靈魂和智能。若是沒有理解這一點,認爲C++只是更好的C,COM只是更好的C++話,你就沒有了解它們的精髓和思想性。
 
 
程序員的七宗"罪"
  雖然軟件工程的思想已被絕大部分程序員所接受,但要將這種思想轉化爲軟件開發過程當中的種種自覺行爲卻不是一件很容易的事。究其緣由,有不少因素,如不少程序員缺少專業化的訓練,重技巧,輕規範,包括一些計算機專業科班出身的程序員也存在這種問題;再如不少公司只注重軟件產品的開發結果,不注重開發過程,客觀上也影響了程序員的目標取向。如此種種,使不少中國的軟件公司難以邁上一個新的臺階,發展壯大也就無從談起。程序員們做爲軟件產品的創造者,固然也難辭其咎。
  下面所列不過是產品開發過程當中諸多問題中的其中幾個,也許你不會犯這樣的錯,我仍是引用一句老話:「有則改之,無則加勉」。
一宗罪:以偏概全
  你們都知道,在對一種產品決定立項開發前,都須要進行產品開發的可行性進行分析,而其中的市場分析相當重要,其實市場分析無外乎三點,一是要開發的產品是有市場需求的,二是公司有能力獲取這份市場,三是公司能從產品中獲益(不必定是指賺錢,如公司戰略利益等)。看似簡單的幾點,想要徹底弄清楚決非易事,因此不少產品的市場分析容易「以偏概全」,如經過個別用戶的特定要求或報刊雜誌的片面報道將產品市場無限擴大(分析人員本身想象的),技術驅動而忽略用戶需求和成本(如銥星計劃)等,至使產品開發完後沒有預期的市場效果。想要全面而準確地的進行產品的市場分析確實是很不容易,須要平時的積累和理性的分析思考,不能靠撞大運。
二宗罪:畫貓成虎
  你們也許有這樣的經歷,產品開發完畢交付用戶使用後,用戶老是不滿意,如不符合他們的使用習慣,功能設置不合理等。因此產品的需求分析是如此重要,沒有正確的需求,軟件開發得再好,技術再先進,也不過是當擺設的花瓶。程序員們,尤爲是系統分析員容易犯的第二宗罪就是「畫貓成虎」,曲解了用戶的要求。一份好的需求分析不是簡單地將用戶的每一個具體的需求點記錄下來,而是要洞察用戶每一個具體要求背後的動機,將分散的需求點串成一個有機的總體,基於需求並「超越需求」。一個好的系統分析員不只是一位軟件專家,還要是一個出色的領域知識專家和溝通者。
三宗罪:好大喜功
  項目延期好象是軟件開發一個必經的步驟。項目經理在制定開發計劃時,每每過於樂觀,每一個開發階段都按最樂觀的估計來計算開發時間,而沒有充分考慮到軟件開發的特殊性和不可預見性,程序員可能都有這樣的經歷,一個很是小的BUG可能要耽誤很長的時間,使開發進行不下去。因此項目經理切忌「好大喜功」,由於項目的不斷延期會打擊項目成員的信心和士氣,長此以往,會使你們產生一種慣性:項目延期是正常的。固然,這也不能徹底怪罪項目經理們,由於在國內,不少項目計劃都是採用倒排序的方法,即先肯定產品交付的時間表,再依次倒推測試、實現、設計和分析所需的時間,而整個開發的時間每每是那些從沒實際開發過產品的領導來拍腦殼決定的。
四宗罪:只顧眼前
  即使是最優秀的系統分析員也不能保證所提供的軟件系統需求不會變化,因此軟件設計人員要充分考慮這一點,不能僅僅"只顧眼前"的需求,還要有必定的前瞻性,知足可預見的將來需求,軟件系統的可擴展性和可維護性對於一個大型、複雜、長生命週期的軟件系統來講相當重要。打個比方理解一下軟件的可擴展性,給一個10歲的孩子作一條褲子(需求),你不能將褲子的長度裁減得剛剛與孩子的身高合適(設計/實現),由於孩子長身體很快,到他11歲時褲子已經短了(需求變化),有兩種方法解決,一是將短了的褲子丟棄,重作一條(從新開發系統),但成本很高;二是將在褲腿上接上一段接着穿,但不美觀且不宜操做(維護成本高)。而最恰當的作法是將褲子裁減得稍長過如今的要求,將長的部分反縫在褲腿裏,等孩子長高後,拆線將原來長的部分放下一點就能夠了(擴展方便),既方便又不失美觀。可見,可擴展性並不是軟件系統專利,裁縫們早已理解了這一點並付與實踐。
五宗罪:得過且過
  軟件設計須要經過軟件實現成爲最終的產品,優秀的設計須要靠一行一行的代碼體現,而有些程序員對軟件實現的態度是,最小知足原則,「得過且過」,對於系統的容錯性,安全性,效率考慮甚少,知足基本功能便可,沒有持續改進的態度和精神。
六宗罪:自我安慰
  產品實現是否達到設計要求在公司內部須要測試驗證,嚴格的測試對於保證軟件產品的質量是必須的,而出於時間、資金等緣故,不少軟件產品並無通過嚴格的測試就已交付給用戶使用,程序員們老是善於"自我安慰":應該沒問題吧。"想固然"不能消除缺陷,只有測試再測試纔是科學的精神。
七宗罪:敝帚自珍
  技術老是向前發展的,不要過於「敝帚自珍」,抱着原有的東西不願放棄,軟件產品也有生命週期,該終結時要絕不猶豫。
 
 
程序員的七種武器
信息技術的發展時間雖然不長,但其爆炸式的發展速度使信息技術迅速覆蓋社會和人類生活的各個角落。程序員們是這場信息化浪潮的見證者之一,更是其中的主要參與者,這是時代賦予每一個程序員的機會和責任。
信息技術的更新速度是驚人的,程序員的職業生涯則是一個要求不斷學習的過程,永遠不能固步自封。本人在工做期間曾看見過不少程序員只要有閒暇時間就瀏覽一些沒有太大做用的網頁,在網上聊天,打遊戲,浪費了大量的時間,十分不可取。而另一種狀況是,IT技術的突飛猛進使不少程序員眼花繚亂,什麼都想學,卻又不知從何學起,今天看看這個,明天學學那個, 貪多不熟
雖然IT技術發展迅速,但不少技術都是有規律可循, 一些基本的概念、原理和方法還很通用,能夠觸類旁通。本人根據本身的體會和經驗,向那些剛剛踏入IT行業的新程序員們或正在迷茫的程序員們推薦程序員必須掌握的七種武器,有了這七種武器,雖不敢說笑傲江湖,但將本身立於不敗之地仍是能夠的。
第一種武器:開發工具
至少熟練掌握兩到三種開發工具的使用,這是程序員的立身之本,其中C/C++和JAVA是我重點推薦的開發工具, C/C++以其高效率和高度的靈活性成爲開發工具中的利器,不少系統級的軟件仍是用C/C++編寫。而JAVA的跨平臺和與WEB很好的結合是JAVA的優點所在,而本人對SUN公司的「網絡即計算機」的概念至關欣賞,並相信JAVA即其相關的技術集JAVA One會成爲將來的主流開發工具之一。其次,若是能掌握一種簡便的可視化開發工具,如VB,PowerBuilder,Delphi,C++ Builder,則更好,這些開發工具減少了開發難度,並可以強化程序員對象模型的概念。另外,須要掌握基本的腳本語言,如shell,perl等,至少能讀懂這些腳本代碼。
第二種武器:數據庫
 爲何數據庫是如此重要?不少應用程序都是以數據庫的數據爲中心,而數據庫的產品也有很多,其中關係型數據庫還是主流形式,因此程序員至少熟練掌握一兩種數據庫,對關係型數據庫的關鍵元素要很是清楚,要熟練掌握SQL的基本語法。雖然不少數據庫產品提供了可視化的數據庫管理工具,但SQL是基礎,是通用的數據庫操做方法。若是沒有機會接觸商業數據庫系統,能夠使用免費的數據庫產品是一個不錯的選擇,如mySQL, Postgres等。
第三種武器:操做系統
當前主流的操做系統是Windows,Linux/Unix,熟練地使用這些操做系統是必須的,但只有這些還遠遠不夠。要想成爲一個真正的編程高手,須要深刻了解操做系統,瞭解它的內存管理機制、進程/線程調度、信號、內核對象、系統調用、協議棧實現等。Linux做爲開發源碼的操做系統,是一個很好的學習平臺,Linux幾乎具有了全部現代操做系統的特徵。雖然Windows系統的內核實現機制的資料較少,但經過互聯網仍是能獲取很多資料。只有對操做系統有必定的瞭解後,你會發現本身上了一個新的臺階。
第四種武器:網絡協議TCP/IP
 在互聯網如此普及的今天,若是您尚未對互聯網的支撐協議TCP/IP協議棧有很好的掌握,就須要迅速補上這一課,網絡技術已改變了軟件運行的模式,從最 早的客戶/服務器結構,到今天的WEB Services,再到將來的網格計算,這一切都離不開以TCP/IP協議棧爲基礎的網絡協議支持,因此,深刻掌握TCP/IP協議是很是必要的。至少,你須要瞭解ISO七層協議模型,IP/UDP/TCP/HTTP等經常使用協議的原理和三次握手機制。
第五種武器:DCOM/CORBA/XML/WEB Services
隨着技術的發展,軟件與網絡的無縫結合是必然趨勢,軟件系統的位置無關性是將來計算模式的重要特徵之一, DCOM/CORBA是當前兩大主流的分佈計算的中間件平臺,DCOM是微軟COM(組件對象模型)的擴展,而CORBA是OMG支持的規範。程序員須要作的不只僅是利用商業的開發平臺來開發軟件,而是要理解這些技術的初衷,即爲何須要這項技術,若是你能理解了這一點,再回頭看這些技術的具體實現,就如庖丁解牛,迎刃而解。XML/WebServices重要性不言而喻, XML以其結構化的表示方法和超強的表達能力被喻爲互聯網上的「世界語」,是分佈計算的基石之一。
第六種武器:軟件工程與CMM
現代大型軟件系統的開發中,工程化的開發控制取代我的英雄主義,成爲軟件系統成功的保證,一個編程高手並不必定是一個優秀的程序員,一 個優秀的程序員是將出色的編程能力和開發技巧同嚴格的軟件工程思想有機結合,編程只是軟件生命週期中的其中一環,優秀的程序員應該掌握軟件開發各個階段的基本技能,如市場分析,可行性分析,需求分析,結構設計,詳細設計,軟件測試等。一句話能夠歸納個人見解:「創意無限,流程保證」。
第七種武器:強烈的好奇心
什麼纔是一個程序員的終極武器呢,那就是強烈的好奇心和學習精神。沒有比強烈的好奇心和學習精神更好的武器了,它是程序員們永攀高峯的源泉和動力所在。
 
  "程序員之路漫漫兮,吾將上下而求索",但願與全部的程序員共勉。但願知識、經驗能共分享,爲中國的信息技術發展添本身的一份力。
 
附:給編程愛好者的忠告
  近來有很多人問我是學Vb好仍是學C好,還有人問Vc和C++Builder哪一個更好,還有人說只要是面向對象的就是好的因此C++和Java最有前途。以我從事計算機教育多年的經驗我要告訴這些編程愛好者, 若是隻是一味追求學會一門所謂的最早進的編程語言(事實上不存在最優),而忽視了編程思想和基礎知識無疑是犯了學習編程的大忌
  就拿面向對象來講,人們一提到它就讚不絕口,然而又有多少人領會到什麼是面向對象的思想,我想若是沒有真正作過大項目的人是很難體會到其優越性的,這不是經過學習C++或Java就能掌握的。個人意思是編程注重的是想法而不是語言,這就是計算機專業要開設「算法分析」和「數據結構」的緣由,若是一頭鑽到某一門語言中無疑於做繭自縛,束縛了本身的思想,打一個很差的比方一個程序員的工做性質和民工沒什麼兩樣只是在壘磚頭,而真正的計算機人才應該是一個設計師、工程師。
  如今國外的一些優秀的計算機著做的都是一些從事如生物、化學等領域的專家,我想這是由於他們之前沒學過計算機,沒有被某些傳統的觀點所束縛,從宏觀上來看待問題,反而在思想上有所突破,這是值得咱們深思的。
一個程序員的奮鬥歷程
來源:PCPP.CN 點擊數:122 更新時間:2006-2-17 責任編輯:^A^無謂自我  減少字體 增大字體
收藏到: 娛樂ViVi 新浪ViVi 博採中心 和訊 天極網摘 Poco 365Key
 
  這些日子我一直在寫一個實時操做系統內核,已有小成了,等寫完我會所有公開,但願可以爲國內IT的發展盡本身一份微薄的力量。最近看到不少學生朋友和我當年同樣沒有方向 ,因此把個人經歷寫出來與你們共勉,
但願能給剛如行的朋友們一點點幫助。 一轉眼我在IT行業學習工做已經七年多了,這期間我作過網頁,寫過MIS、數據庫,應用程序,作過通訊軟件、硬件驅動、協議棧,到如今作操做系統內核和IC相關開發,這中間走了不少彎路,也吃了很多苦。
  我上的是一個三流的高校,就連同一個城市的人多數都不知道。由於學校很差也就沒有期望能靠學校名氣找一個好工做。全部的但願都寄託在本身的努力上了,大一開學前的假期我就開始了學習,記得我買的第一本書是《計算機基礎DOS3.0》,你們別嚇着了,其實當時已經普及了DOS6.22了,只是我在書店裏看到了DOS4.0,5.0,6.0的書,覺得像英語那樣是第4、5、六冊,記得當時處處找DOS1.0,如今想一想也幸虧我沒有找到:)開學前我學完了PASCAL,那時既沒有計算機也沒有人能夠請教,我連程序是什麼的概念都沒有, 只好死記硬背代碼,而後拿紙寫,我一直到大三才有了一臺486,在這以前用紙寫了多少程序我也記不清楚了,只知道最長的一個我拿A4大小的草稿紙寫了30多頁,個人C語言、C++ 、VC都是在這樣的條件下入門的。因此說條件是能夠克服的,但願個人經歷多少給條件艱苦的同窗們一點信心。第一次上機是在我姐夫的機房,個人心情激動的無與倫比,可是一上機我馬上傻了眼,他們用的是英文版的Win3.1,個人那點DOS知識都見了鬼,上機提心吊膽的一陣瞎摸,一不當心把Word弄成了全屏,怎麼都還不了原,當時真是心急如焚,我覺得機器被我弄壞了。第一個C語言程序,就是那個經典的HelloWorld,我調了幾個星期,上機機會很是少,也沒有書告訴我開發環境(TC2.0)須要設置,並且開始我都不知道有編譯器,我甚至自做聰明把寫好的程序擴展名從.c改爲.exe,結果可想而知。大一學完了C、X86的彙編、數據結構、C++。因爲精力都花在自學上了,大一下四門課掛了彩,三類學校就是這點好,掛上一二十門也照樣畢業。不過扯遠點說,我那麼刻苦都及不了格,可見咱們國家的計算機教育有多死板。
  大二準備學VC和BC,當時難以取捨,後來選了VC,不爲別的,只爲書店裏兩本書,VC 那本便宜6塊錢。個人努力在班上無人能及,學的日夜不分,大三有了計算機後更是如此, 不少次父親半夜教訓我說我不要命了,我一直以爲本身基礎差,記憶又不行,條件也很差 ,因此以爲只有多花點時間才能遇上別人。竟然後來有許多朋友說我有學計算機的天賦, 讓我啼笑皆非。我用的是486,16M內存,1G硬盤,當時同窗們的配置都是P166MMX,我安裝 一個Windows NT4.0須要一個通宵,編譯一個BC5.0嚮導生成的程序須要近兩個小時,個人顯示器是個二手的,輻射很是大,開機屏幕冒火花,看起來很酷的:),有一次程序寫的過久,以爲怎麼白色的編輯器背景變成了紫色,覺得顯示器壞了,後來才發現眼睛不行了,不過說來也奇怪,到今天個人視力還能保持1.5,真是個奇蹟。可是就是那臺破機器陪伴了我兩年,讓我學會了VC、Delphi、SQLServer等。後來那臺機器給我阿姨打字用,據她說一天她正打的開心,一股青煙夾着火苗從顯示器鑽出來,以後它才壽終正寢。
 
 
  大三假期找了個機會在一個計算機研究所實習,與其說實習不如說是作義工,工做了兩個月一分錢沒有拿。可是這兩個月對個人發展幫助很大,讓我早一步瞭解了社會,剛去的時候我固然是一竅不通,在那裏我熟悉了網絡,學會了Delphi和Oracle。因爲工做很認真, 獲得了比較好的評價,在一位長者的引薦下,我開始和他們一塊兒作項目,這使我在大三大四就有了本身的收入,大四又找了兩家MIS公司兼職,雖然錢很少,可是在學生期間有1000多的收入我已經很是知足了,我終於用本身賺的錢把計算機換了。大四下開始找工做,這時個人工做經驗已經比較多(固然如今想一想很是幼稚),開始聽父母的想去那個研究所, 實習過那個部門也但願我能去,可是不知道爲何最後不了了之,這種單位就是比較官僚 ,我一氣之下就到了我兼職的一個公司作MIS的TeamLeader。在大三到畢業一年的時間,作過了各類MIS,從煤氣、菸廠、公安、鐵路、飲食到高校,什麼有錢作什麼,工做也很辛苦 ,常常加班和熬通宵,從跟客戶談需求到設計、編碼、測試、交付都要上。那時以爲頗有成就感,以爲本身還不錯,如今想一想真是很膚淺。
  剛走上工做崗位的學生很容易被誤導,各類開發工具讓人眼花繚亂,同時也以爲很受 公司器重,但這樣工做永遠是一個低層次的開發者。不要跟我說什麼系統分析有多麼多麼重要,多麼多麼難。你覺得本身跟用戶談需求作設計就是系統分析和設計了嗎,國內又有幾個公司可以作的很到位很規範?我是ISO9000內審員,也在Rational公司受過屢次培訓,拿了4個證書,還有一個公司讓我去作CMM。這些我聽過不少,可是不少事情到國內就變了性質,一個公司不是經過了ISO9000或者CMM就能規範了,我如今在一家有幾十年歷史的外企工做,裏面的管理不是通常國內企業能及的。做爲一個畢業不久之前沒有步入過社會的學生,幾乎不可能在很短的時間掌握系統分析和設計,面向對象、UML只是一個工具,關鍵是人自己的思想,不是說你熟悉了C++、Rose就可以作出好的設計,相反若是你具有了很高的素質,你能夠用C寫出比別人用C++更加模塊化的程序。
  話說遠一些,國內軟件開發行業有一個怪圈,不少人以爲VC > Delphi > VB,真是很搞笑。這幾個軟件我都作過開發,說白了他們都是工具,應該根據應用的須要選擇採用哪一個,而不是以爲哪一個上層次。若是你由於用某個開發工具頗有面子而選擇的話,只能說明你很淺薄。若是說層次,那麼這些工具都不上層次,由於它們用來用去都是一些系統的API,微軟的朋友不會由於你記住他們多少個API或者多少個類就會以爲你很了不得,你永遠只是他們的客戶,他們看重的是你口袋裏的銀子。我也作過系統內核,我也封裝過不少API,一樣我也不會看重那些使用這些API作二次開發的客戶,除非他可以做出本身獨到的設計。
  至於有人認爲C++ > C那更是讓人笑掉大牙,不妨你去打聽一下,如今有幾個操做系統內核是用C++寫的,又有幾個實時系統用的是C++,固然我也不是說C++很差,可是目前的內核和實時系統中C++還沒法與C匹敵,至於說C++適合作應用系統的開發那是另一回事。因此個人觀點是不在於你用什麼工具和語言,而在於你幹什麼工做。你的設計體現了你的技術層次。
  這樣幹了一年我以爲很是苦悶,作的大多數都是熟練工種的活,我的技術上沒有太多 的提升也看不到方向。因此決定離開這個城市去上海,尋求更好的發展,而且打算放棄我之前的MIS轉到通訊行業。
 
  寫到這裏不能不提到我女友,咱們是在來上海前半年認識的,她大四在我公司實習,公司派她給我寫文檔,咱們的感情發展的很快。她告訴我不少事情,她家本來是改革開放的第一批暴發戶,她母親愛打牌,輸掉了幾百萬,還欠了不少債,她有男友,可是她對他沒有感情,只由於他給了她母親兩萬多塊錢,後來還強迫她寫了四萬塊的借條,她男友背叛過她而且不止一次打她,如今逼她結婚否則就要她還錢。這人竟然仍是一個高校的老師!她母親把父親給她的學費花了,由於拖欠學費她沒有辦法拿到畢業證。她母親如今有病須要錢,我拿出了本身的一點積蓄而且跟朋友們接了一些,替她交了學費並給她母親看 病(後來才知道看病的錢又不知所終,就連她母親是否是有病我都不知道,但她也是沒有辦法)。這個時候我家知道了一些事情,堅定反對我和她在一塊兒,她原來的男友也極力破壞。無奈之下咱們決定早必定離開這個傷心的城市,而且瞞着咱們家。因爲時間倉促,我只準備了4000塊錢,她僅有的幾百塊錢也被她母親要去了,我買了三張票,一張是中午的,兩張是晚上的,中午個人家人把我送上船,他們一離開我就下了船,我和她乘坐晚上的船離開了這個我和她生活了不少年的城市,帶走的只是一身債務。沒有來過上海的咱們兩個性倔強,都不肯意去麻煩同窗和朋友。來到上海是傍晚6點半,咱們都不知道該去哪裏,咱們找了一個20塊錢的旅館,這個房間連窗戶都沒有,7月份的天氣酷熱難耐,房間裏很是悶熱。次日咱們開始租房子,由於身上的錢很少,咱們基本都是步行,花了一個星期時間,不知道在浦東轉了多少圈後找到了一個400塊的房子,可是咱們都不瞭解上海是付三壓一,還要付半個月的中介費,買了一些鍋碗瓢盆後,咱們身上只有800塊錢了,工做都尚未着落,這800塊錢要支持到咱們拿到第一個月工資,爲了省錢咱們本身作飯,天天買菜只花兩塊錢,她很是喜歡吃(也可能她在大學常常捱餓的願意),看到她如今這樣省吃儉用我真的很不忍心。她之前的男友也沒有放過她,常常打電話來騷擾,而且來上海看她,還說了很多恐嚇她的話,她過於善良,說他之前畢竟幫助過她,叫我不要與他通常見識。之後的天天在家就是苦等面試通知,本來我想迅速找一家MIS公司解決眼前的困難,可是她堅持讓我不要放棄本身的理想,終於功夫不負有心人,我找到了一家通訊公司,4000塊的工資雖然趕不上MIS公司給我開出的價位,但也夠在上海生存。她也找到了工做,第一天上班她哭了,這是她來上海第一次流淚,我內心很難受也很感動。
  因爲是全新的行業,我把本身降到了零點,我學的VC、Delphi、數據庫派不上用場, 擺在我面前的是嵌入式、協議、信令一些我從未接觸過的知識。我知道我沒有退路,因而拼命的學習,我把本身當作一個應屆畢業生同樣,一分努力一分收穫,半年過去我終於熟悉了工做,而且獲得了公司的表彰,薪水也加了一級。後面的日子裏咱們省吃儉用,把欠朋友的1萬多塊錢還了,日子終於上了正軌。這時女友告訴我她想考研究生,我也很支持,因而她辭職在家備考。
  另外,在這裏我要感謝個人ProjectManager,他原來是一個大通訊公司的產品經理, 對人很是和藹,我從他那裏學到了不少知識,並且他也給了我許許多多無私的幫助。在工做上他給我充分的空間和信任。記得公司安排我維護一個接入服務器軟件,因爲代碼量不算過小(5萬行),資料和文檔都不齊全,我維護起來很是吃力,因此想從新把它作一遍, 公司領導不太支持,可能以爲工做量太大,可是他極力支持我,私下裏他讓我放手去作, 個人維護工做他擠時間作。在他的支持下,我花了半年時間完成了接入服務器的軟件,而且實現了一個相對完整的TCP/IP協議棧。在這裏我學會了嵌入式系統設計、驅動開發、TCP/IP和不少通訊的知識,我花了一年時間終於使本身從MIS開發轉到了通訊行業,而且站穩了腳跟。個人開發大量是對硬件的直接操做,再也不受微軟的操做系統,VC、Delhpi這些開發工具的約束,我終於看到了另一片天空。
  我作事情喜歡追根問底,隨着開發的深刻,軟件開發與硬件聯繫愈來愈緊密,硬件知 識的匱乏又對個人發展產生了障礙,並且芯片技術基本上掌握在國外公司的手裏,這對作系統級設計是一個很是大的制約,一個新產品出來,第一道利潤(也每每是最豐厚的利潤)經常都被IC公司如Intel、Motorola賺去了,國內的廠商只能喝點湯。因此我決心解決本身的硬件技術障礙,並打算離開通訊行業,進入IC設計相關領域。
  固然我明白若是我對硬件瞭解的很是少,沒有哪家IC公司會仁慈到招我這樣一個一竅不通的人來培訓。因此我必須努力打好基礎,學一些相關知識爲之後作準備。就像我開始從MIS轉到通訊同樣,我看過大量通訊方面的書,而且給一個ISP作過RADIUS計費分揀臺,在這樣的背景下這家通訊公司纔給了我這個機會。我在的通訊公司是作系統設計的,有很多PCB Layout硬件人員,日常我就注意向他們學習,因爲我作的是軟件,在公司看硬件資料很差意思,因此開始只好在家看,剛來上海工做我連續一年都在加班,後來不加了,由於我要擠出時間學習,一般我12點左右睡,次日5點半起,我上班比較早,地鐵上若是人很少我也用來看書。學習固然不會是一路順風的,有些實在不懂的問題就積累起來問硬件人員,他們的幫助使我學習進度快了不少,由於在沒有人點撥的狀況下自學,個人一半時間是花在解決疑難問題上,但這種問題常常是別人的一句話就可讓我豁然開朗,我很是慶幸我有這樣的學習環境。在後面的一年裏,我學會了看硬件原理圖,學會了簡單的硬件設計(模擬電路方面還有不小的差距),事情就是這樣的,當你安安份份作軟件,別人永遠認爲你是軟件開發人員,在你開始學習硬件時別人未必會認同,有位中興通信的朋友還對我說過,一我的不可能把全部東西都學完。我也明白這一點,但我但願本身作的更好。但當你熟悉硬件後你們又會以爲你好像本來就是軟硬件都懂的,同事們也都習覺得常了。這個時候我能夠把硬件資料堂堂正正的拿到公司看,沒有人再大驚小怪了。 讓我比較自豪的是我經過本身的努力作了一個IAD(軟交換的終端設備)系統方案,包含軟硬件的選型、設計等內容,這個方案獲得了公司和同事們的認同,讓我感到很是欣慰。
 
 
  技術是相輔相成的,當個人硬件有了必定的進步後,個人軟件設計也有了很大的提升 ,我能夠從更深層次理解問題,我作的接入服務器CPU是Motorola PowerPC860,熟悉的朋友都知道860 QMC與軟件的批量數據傳輸一般採用BD表的方式,硬件人員作驅動的時候習慣採用固定BD表,每接收或發送數據都將數據從BD表拷貝到用戶Buffer,或從用戶Buffer拷貝到BD表,因爲理解的比較深刻,我本身從新實現了這個過程,採用動態BD表的方式,驅動從一個網口接收數據,提交給個人軟件進行三層交換,直至從另外的接口發送出去,沒有進行一次拷貝。這樣的設計大大提升了性能,使系統的指標接近理論值。軟硬件的結合使個人設計水平上了一個臺階。我如今寫的這個操做系統,編譯後我把程序反編譯成彙編,找出其中不優化的代碼,而後在C程序中進行調整。舉個例子,不少CPU沒有專門的乘法指令,這個你們應該都知道,在這種CPU上進行一個乘法操做經常會花費大量的指令週期, 有的朋友會說這個我知道,我會盡可能避免採用×號,可是事情每每不是那麼簡單,你知道
C語言中數組的下標操做是怎麼實現的嗎?仔細看看反彙編的代碼你就會明白,一樣是經過下標的定位操做,C編譯器會有時候會產生位移指令,但有時候會用乘法實現,二者效率每每是天壤之別,因此明白這些問題你才能將系統性能提高到極致。一些問題就很少說了,有興趣的話之後能夠共同探討。
  話說遠一點,我由衷的但願在軟件上作的比較深刻的朋友們有機會學學硬件以及其它 相關知識,尤爲是作底層開發和嵌入式設計的。這對軟件技術的提升有很是大的幫助,不然不少事情你只知道該這樣但不會明白爲何該這樣。我這個觀點在我如今的IC公司Project Manager那裏也獲得了驗證。他告訴咱們公司如今的802.11芯片產品的軟件經理本來是作該芯片硬件設計的,某某某本來是作軟件的,如今在作IC,相似的例子還有不少,只是在國內這樣的風氣不是很是流行。
  我有一些心得體會與你們分享,只有當我幹好本職工做後,我纔會學習與工做關係不 大的技術,這樣公司的上司纔不至於反感,在入門階段的問題我一般不去問那些資深人士 ,而是問一些資歷比較淺的朋友,好比剛畢業不久的學生,由於他們每每會跟你詳細的講解,而資深人士一般以爲你的問題太簡單,因此回答的也很簡單,我又很差意思多問。等技術上了必定的層次後我纔會問他們,他們也能給你比較深刻的回答。另外,有些朋友說我機會比較好,他們也但願能從事新的工做惋惜沒有機會,我聽了只有苦笑,個人機會了解的人都應該知道,我沒有出生在什麼IT世家:)也沒有誰一路提拔我,全部的路都是本身走出來的,我母親去世比較早,個人後母(我叫她阿姨)看着我努力過來的,一次她看我大年30還在寫程序,她說像我這樣努力木頭都能學出來。
  個人最終目的是IC而不是PCB,因此我下一步的準備開始學習IC設計的知識。公司的同事沒有懂IC設計的,後面的路又要靠本身了,我買了很多相關的書,在網上也查了不少的資料,我花了大量的時間去學習VHDL,而且用軟件進行了一些簡單的設計和仿真(沒有設計ASIC,只是針對FPGA),隨着學習的深刻,我漸漸明白了IC設計的基本流程,同時也明白了這條路的艱辛。這個時候我已經作好了跳槽的準備,我向一家業界又必定知名度的IC設計公司投了簡歷,並經過了漫長的面試(4個多小時)。其餘的一切我都比較滿意,惟獨薪資差強人意,我也明白緣由,由於我是這個行業的新人,我沒有經驗,我再一次將本身清零了。公司老闆問我6000多一個月能不能接受,我知道他也是照章辦事。想一想我通訊行業的朋友們,基本上都是年薪10萬以上,月薪過萬的也比比皆是,朋友們也幫我介紹了很多待遇不錯的公司,我該怎麼選擇,當時我很猶豫,我熱愛個人事業,我向往個人追求, 但我也是一個普通的人,我也須要養家餬口,我也想早一點買房買車。生活給我出了一道難題。
  愛因斯坦在63歲時說過「一我的沒有在30歲之前達成科學上的最大成就,那他永遠都不會有。」這句話給了我很大的壓力和震動,我立刻就26歲了,離30只有四年時間,我必須抓緊這幾年寶貴的時間,努力達到我技術上的最高峯。爲了這個理想,爲了能離本身的夢更近一些,我選擇了這家IC公司,我明白本身的薪資和公司剛進來的碩士研究生相差無幾, 但爲了從此的發展只能忍受,一切又得從新開始。換行業是一個很是痛苦的過程,尤爲從一個春風得意的位置換到一個陌生的崗位,感受象從溫暖的被子裏鑽出來跳進冰水中,讓人難以接受。在原來那家通訊公司,我是惟一兩年時間漲了五次工資的員工,公司和同事都給了我極大的承認,工做上也經常被委以重任。但如今這一切都成了過去,在新的公司我只是一個新人,沒有人知道也沒有人在乎我過去的成績。我決定從新開始,我把本身看做新畢業的學生,我要用本身的努力獲得公司的承認。進入新的行業是很是痛苦的,我告訴本身必須忍受這一切,雖然外面有不少誘惑,可是既然做出了選擇我就不容許本身輕易放棄。
 
  我如今已經在這家新公司上了一個多月的班,開始很是艱難,如今慢慢適應了。第一 個月結束時,Team Leader找我談話,說我是新進員工中最優秀的一個,我內心很欣慰,這也算對我努力的一個確定吧。在這裏還要感謝個人女友,她給了我很大的支持和鼓舞, 每次在我動搖的時候她都在鼓勵我,讓我堅持本身的理想,剛來上海是她讓我不要勉強去作MIS,此次也是她讓我頂住了月薪過萬的誘惑,沒有她我可能不會有今天的成績。 如今的公司有本身的操做系統,本身的CPU、DSP和其它芯片,在這裏我能學到世界上最早進的技術,咱們的設計開發再也不徹底依賴別人的硬件和系統,這讓我很開心。我打算等工做步入正軌後,全力學習新的知識,實現個人理想。
  在後面的兩年裏我給本身定下了幾個目標:
  一.努力作好本職工做,在工做上獲得公司和同事們的認同;
  二.努力學習IC硬件設計知識,多向同事請教,並利用一切機會多實踐;
  三.實現個人實時操做系統的主要部分,完成TCP/IP協議棧模塊,並免費發佈源代碼;
  四.和我女友結婚並買一套小房子,這是最重要的,由於我明白事業是能夠重來的,可是珍貴的感情很難失而復得。
  在這裏提一下我如今開發的操做系統,它是一個實時嵌入式系統,目前支持如下特性:
  a.支持時間片輪轉調度和基於優先級調度,最多64個優先級;
  b.搶佔式實時內核;
  c.爲了便於移植,主體用標準C實現;
  d.彙編代碼很是少,不到100行;
  e.支持任務管理,各任務有獨立的堆棧;
  f. 進程同步和通訊目前完成了Semaphore,Message Queue正在調試;
  g.實現了定時系統調用;
  h.能夠在windows上仿真調試
  我還打算下一步實現優先級反轉保護,Event Flag,Data Pipe,內存管理(之前實現過)、驅動接口等。 在這以後我還會努力完善它,好比加入文件系統,協議棧、調試接口等。但願朋友們提出本身的意見和建議,在此不勝感激!
  後記:
  就像有的朋友說的,個人經歷或許會給一些朋友產生誤導,在這裏我必須說明一下。 我來上海之前學習過於拼命,經常晚上只睡3個多小時,我身高1米71,那時只有108斤(我如今130多),家人也說我這樣拼命活不過60歲,可是當時的我太執拗,我對他們說只要能實現理想活50歲我就夠了。那時的拼命使個人身體受到了影響,有一次早上忽然腰肌劇痛難忍,痛的我倒在牀上站不起來。雖然我如今已經比較注意,但有時候還會隱隱做痛。後來在女友說服了我,來上海之後我再也不如此。我常常引用父親的一句話「身體是革命的本錢」。
  並且我也發現拼命不是辦法,我能夠熬一兩個通宵,最多的一次我連續工做了三天三夜, 可是我半個月都沒有恢復過來,這樣是否是得不償失?學習工做應該是一個長期的過程, 像馬拉松而不是百米衝刺。我如今很是注意調整學習和工做的強度,我要保證天天儘可能有相對充沛的精力,一些年輕的朋友以爲本身也應該拼命努力,這讓我多少有些擔憂,若是個人故事能讓你在學習工做上多一點興趣,我會感到很開心,但若是誤導了某些朋友,讓你作一些不值得的付出,我會感到很內疚。
  技術沒有貴賤之分,我之前換行業是由於本身的興趣所致,而不是對哪一個行業有什麼偏見。我但願個人經歷不要給朋友一個錯誤的導向,以爲我始終向更高的技術發展。其實各行各業作到頂尖都是很困難的。話又說回來雖然技術沒有貴賤,可是門檻是有高低的, 不管如何,作IC的門檻要比作網頁的高,這一點無能否認。國家各類人才都是須要的,可是做爲我的奮發向上的想法仍是應該有的,努力在本身喜歡的行業上作的更好,而不該該停留在比較膚淺的層次上。
 
  我是一個本身以爲比較有自知之明的人,或許我最大的優勢就是知道本身有不少缺點 :)。個人故事中不少的曲折和錯誤都是由個人缺點形成的,但願你們用審慎的眼光看待個人經歷,不要被個人「花言巧語」所迷惑。我學習有些爲所欲爲,這給我帶來了無盡的麻煩,也大大阻礙的個人發展。記得我小時候成績比較出色,可是後來學習嚴重偏科,致使我中學成績一再滑坡,也沒有考上什麼好的學校,小時候的一個朋友,當時的成績和我相仿,可是沒有我這個缺點,她上了清華,後來在去了美國深造,在一個著名導師手下研究理論科學,這何嘗不是一條更好的出路。另外個人學習方法也是在不斷改善中的,過去 的學習過於講究數量和時間,那樣學習既苦而已效率不高,如今我很是注意學習的效率和技巧,這樣纔是學習的捷徑(固然不是指投機取巧),好比說學一相對陌生的技術,若是有條件,不妨問一問有經驗的人,不須要問不少,每每他不經意的幾句話會給你很是大的幫助,甚至超過你看一個星期的書。帶着這樣的思想再去學習你會節省不少時間,這樣何樂不爲呢?這些年中我學了很多的東西,因爲開始很是盲目,因此學的東西雜亂無章,如今回想起來讓我哭笑不得,我把大量的時間浪費在一些沒有必要深刻了解的知識上,畢竟一我的的精力是有限度的。不少朋友很我同樣都背過五筆字形,的確它是個不錯的輸入法,可是對一個研發人員它絕對不值得你去背,你的時間應該花在有價值的地方。我這樣的事情還作過不少,我背過CCED、WPS的命令和快捷鍵,在dBase基本退出歷史舞臺後我還花了不少時間去學習它的使用。因此個人學習在前期缺少規劃,沒有明確的短時間目的、中期目標,只有一個虛無飄渺的長期的理想。這就像作設計同樣,好的設計是從需求抽象到代碼有不少過程,而不能獲得了需求就馬上開始開始編碼。
  固然這麼些年的學習和工做多多少少有些收穫,下面我說說個人一些學習的心得,這 些方法未必正確,我也在不斷探索和改進中。個人學習和工做有相對明確的目標,我不會一時心動而去學習某一技術,在下決定以前我會考慮不少,包括長期的發展,我的路線的規劃,須要付出的代價、可能遇到的困難及解決的辦法等等,在決定後還會制定更加明確的計劃,包括短時間、中期和長期的,身邊能夠利用到的資源(包括好的書籍、資料、軟硬件環境,也包括有經驗的朋友或者師長),以及每個階段是怎麼過渡到高一階段的計劃,每每在一個學習階段一旦上路後會走的相對順利,可是跨階段一般比較麻煩,好比從學習基礎知識轉到實踐。另外我買書也有本身的方法,如今世面上高質量的書遠不如低質量書多,對於一個陌生的技術,每每在第一次買書會選擇錯誤,即便買到一本好書可是它的方向也未必適合你,因此我一般會先在網上查找一些該技術的介紹,有了一點點概念後再去買一本比較薄、相對便宜而且內容相對泛泛而談的書,這是國內做者最善於寫的書:) ,再把它瀏覽一遍後我就會基本明白這門技術的要點,後面買書和制定計劃就會明確的多。不然一開始就想找本好書每每比較困難,並且買回來後努力學習,有時候學了一半才發現是本低質量的書或者是相對過期技術,讓人很是懊惱。另外讓有經驗的人幫你介紹,一般也是一個不錯的選擇。
  有些朋友想學通訊、嵌入式開發,但總以爲本身沒有軟硬件環境,我就按個人瞭解給 你們介紹一下怎麼創建這樣的環境,固然我瞭解的只是我學習和工做的方向。通訊我作的是數據網方面的工做,包括TCP/IP、二三層交換、對接入網、H.323和軟交換也有一點認識。這些軟硬件環境都是能夠在PC上構建的。你甚至能夠在一個沒有網卡的PC上創建一個包含多個路由器、接入服務器、VoIP網關、網守、主機等的仿真網絡環境,並且與實際的網絡至關接近,固然這須要你有清晰的網絡概念和必定的網絡知識,我一直在努力開發一套軟件將這個過程簡化,目前試驗已經作完,我可能會將它融入個人操做系統外圍擴展軟件中。這樣的方法我沒法用簡單的語句講的很清楚,我能夠說一下大概的思想,就是在PC上實現仿真網卡,(知道Windows怎麼在沒有網卡的機器實現虛擬網卡技術的朋友都應該會明白),而後每個仿真網卡對應一個虛擬設備,如路由器或者主機。你也能夠藉助第三方工具完成部分工做,如VmWare等。我如今就是利用一個仿真網卡作本身的開發的。
  至於嵌入式開發環境更加容易實現,PC就是一個很是大的硬件平臺,現有的嵌入式操 做系統一般都支持X86,你能夠在上面作開發,經過軟盤Boot或者使用虛擬機裝載,我用VxWorks作了試驗,在一臺PC上跑Windows和VxWorks兩個系統。另外Windows上的兼容DOS的16位仿真X86環境也爲不少操做系統提供了絕佳的試驗環境,個人操做系統在Windows上就是這樣實現的。Linux在嵌入式中應用也比較普遍,它在網上有大量的資料,並且也相對比較容易實踐。同時不少完善的嵌入式開發環境支持軟件仿真,如Tornado、WinCE等。
 
編程高手幾種必學的編程語言
http://www.souzz.net 2006-02-02 文章出處:希賽網
 
 
我本身在學習編程的過途中有的幾個疑問,1)什麼編程語言我須要學。 2)學多少種纔算能夠。最後經過我本身學習感覺和對其餘編程高手(主要是新聞組)的請教,我認爲找到了滿意個人答案。拋磚引玉,作個參考吧。
  對於初學者,我建議從 python 開始學。由於它在語言設計上很整潔,幫助文件也很全面。並且也是 object-oriented (O-O),儘管我把它做爲一個初學者開始的語言,並不表明它的用處和功能不強大。實際上它是個功能強大,能夠用來作大的編程工程的語言。
  我知道國內對 python 可能還不瞭解,由於它相對來講也比較新(1990),到如今有12年的歷史了,可是它在國外已經被普遍接受和認同,快速發展。不過我知道郵電出版社最近剛出了一本介紹 python 編程的書,你們能夠查詢。python 的主頁 www.python.org
  Java 也是個很好的語言來開始學編程。不過它比 python 複雜。國外的大學如今都採用 java 做爲電腦專業的凱時語言。總之我以爲除了 python 以外,它也能夠做爲一個極好的初學者語言。
  不過,會了這兩種語言,並不表明你就是一個編程員了。學會編程的關鍵就是 -- 「 編程思想「 。 學會怎樣用一種很「 普遍的思惟「 去考慮「 編程問題 「,也就是這種思惟是能夠放之於任何一種編程語言均可以解決問題的,而不是侷限於單純的一種語言。這樣當你須要學習一種新的語言時,你只要學習他的語法等等就能夠了,至於怎樣用這種語言解決編程問題不是早就在你的腦子裏了嗎。因此,這也就是爲何不少程序員能夠拿到一種語言,一兩個星期就能夠使用的很熟練了。這,也一樣要求你去學幾種徹底不一樣的語言。
  C 語言是很是有效率的,不少時候你都須要考慮內存的管理等底層的東西。很惋惜這些都須要你去花不少的時間去作,問每個 C/C++ 的程序員,用 C/C++ 編程是否是一個很頭疼的事。好消息是,如今的機器都已經很高級,運算的很快,在不少時候咱們是不用考慮用 C/C++ 去作,忽略它所帶來的好處,固然除非這個工程真的很須要處理底層的東西(象 內核的編輯,3-D 圖形等)。不少時候 python, java 等均可以實現。另外在如今不少工程所要求的時間都不是足夠充裕來用 C/C++ 去作,因此在商業上時間就是金錢,這個代價誰也付不起。
  我這裏並無說 C/C++ 很差,你不該該學。相反我以爲咱們應該學,但不是做爲一個初學者的語言來學。在 C 和 C++ 之間,我推薦先學 C 。.由於它相對來講較小,簡單。做爲一種底層編程語言,C,你能夠學到很直接的內存管理,指針,等。另外,不少語言都是用 C 來設計的, 好比 perl , java, python
  其它語言值得一學的有 perl , Lisp(固然你也很一說 effile, proflog),提到 perl 是由於它的實用性,普遍的應用在網絡和系統管理,perl 提倡 "There is always more than one way to do it" 這主要是從 perl 的語法以及它的獨特設計上來得到,記得用幾行code 你就能夠寫出頗有效率的程序?這也就是爲何我很喜歡perl 了。可是perl 的語法着實讓不少人頭疼 並且對於用 perl 寫的大型程序,維護性不是很好,python 就沒有這方面的問題,這也是爲何不少 perl 的用戶轉向了 python 。不少人用 perl 的目的和用 python 同樣,避免在不要求 C 的效率時 使用 C。
  Lisp 聽說是頗有啓迪性的語言,會讓你成爲一個更好的程序員.(我尚未到達那個程度 :-)
  我我的推薦 (python, java, C ,perl, 和 Lisp),由於他們使用不一樣的方法來編程,每一種都會在某種程度上交給你些頗有價值的東西。
  談到學習編程,單純的上課和看書只會讓你學習語言的特性等,只有學會用編程的思想來思考纔是你終生受用的。這些只能依靠 「 練習 「 具體就是 1) 讀程序 2) 寫程序 看似簡單,但堅持下來你纔會真正體會到,這裏沒有其餘能夠投機取巧的方法學習編程了。
  至於學多少種,是越多越好吧。但並非指每一個都精通,我想你們也沒那麼多時間和精力。但在你有了堅實的編程經驗和基礎,瞭解其它語言的設計方法、構造會開闊你的眼界,沒準何時你也能夠編出本身的語言(咱中國人編的!!) :-)
  要提醒你們的是,若是每種語言老是略學皮毛,而後又急匆匆的跳到另一種語言,那你就會一事無成,永遠彷徨在初學者的門檻邊。我想這句話不僅是對程序員,對咱們來講也是生活中的一個道理。
成爲軟件高手的幾個忌諱
   http://www.souzz.net 2006-02-04 文章出處:希賽網
 
 
1) 不會英語:CS源於美國,重量級的文檔都是英文的。不會英語,那麼你只能忍受拙劣的翻譯和大延遲的文檔(翻譯出來的文檔幾乎都是好久之前出版的東西)。
2) 急於求成:什麼都沒學習就開始編程是最大的忌諱。寫C++程序語法都能錯,數據結構連線性表都不知道,數據庫不知道關係模型,TCP編程不知道socket,仍是先坐下來學習幾年再說(若是說工做急需,我只能說:早幹嗎去了)
3) 過於好問:勤學好問是一種很好的品質,可是若是把勤學丟了,只留下好問,就是一個惡劣的素質了。事無鉅細都去請教別人,一則會讓人厭煩,二則因爲沒有系統學習過程,也是不可能學習好的。
4) 只會豔羨別人和說別人不應拿那麼多錢,而本身卻收入微薄:老實說,絕大多數狀況下,收入的高低和你的水平是有正相關關係的。不是否定有關係的存在,可是絕對不會10我的中9我的有關係而獨獨你沒有。少抱怨一些多學習一些,提高本身才是最重要的。
5) 過於不求甚解和過於求甚解。瞭解爲何是很重要的,可是要學習的東西不少,若是什麼都弄明白,那麼估計頭髮白了尚未找到全部答案。固然若是什麼都不想細緻瞭解,那麼只能去作藍領了。
6) 過度崇拜他人:我想信不少人都是很厲害的,值得你們崇拜,可是若是過於崇拜,把他們的話當成聖經就沒有必要了。你須要突破他們,而不是崇拜他們。
7) 不想吃苦:IT業高收入和高競爭是聯繫在一塊兒的。沒有付出永遠別想進步。
相關文章
相關標籤/搜索