<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>


    路慢慢其休遠兮,吾將上下而求素
    posts - 17,comments - 7,trackbacks - 0
    好的開始是成功的一半,本文首先會試圖告訴你什么是程序員?為什么要做這樣的程序?正確的入門方法是什么?
    程序員只有在理解了以上內容的基礎上,才能進一步更快地提高自身技能,這時候再開始程序的設計。其實,對一個軟件的開發者來說,真正重要的不在于這行代碼怎么寫,那些代碼應該怎么寫,關鍵是思路的問題,而思路事實上是經驗的積累。經驗是使你從最初的封閉的思維方式,到最后形成開放式的思維的一個過程。將我十幾年程序生涯中獲得的一些經驗告訴讀者,使大家少走彎路也是我想寫這本書的主要目的。
    1.1 程序≠軟件
    現在很多人以為程序就是軟件,軟件就是程序。事實上,軟件和程序在20世紀80年代時,還可以說是等同的,或者說,在非pc領域里它們可能還會是等同的,比如說某個嵌入式軟件領域,軟件和程序可能是等同的。但是,在pc這個領域內,現在的程序已不等于軟件了。這是什么意思呢?
    1. 軟件發展簡述
    在20世紀80年代的時候,pc剛誕生,這時國內還沒有幾個人會寫程序。那么,如果你寫個程序,別人就可以拿來用。這時候的程序就能產生價值,這個程序就直接等同于軟件。
    但軟件行業發展到現在,這里以中國的情況為例(美國在20世紀80年代,程序已經不等同于軟件了),程序也不等同于軟件了。因為現在會寫程序很容易,但是你的這個程序很難產生什么樣的商業意義,也不能產生什么價值,這就很難直接變成軟件。要使一個程序直接變成軟件,中間就面臨著很高的門檻問題。這個門檻問題來自于整個行業的形成。
    現在,你寫了一個程序以后,要面臨商業化的過程。你要宣傳,你要讓用戶知道,你要建立經銷渠道,可能你還要花很多的時間去說服別人用你的東西。這是程序到軟件的一個過程。這門檻已比較高了。
    我們在和國內的大經銷商的銷售渠道的人聊天時,他們的老板說,這幾年做軟件的門檻挺高的,如果你沒有五、六百萬做軟件,那是“玩”不起來的。我說:“你們就使門檻很高了。”他說:“那肯定是的。如果你寫個“爛”程序,明天你倒閉了,你的東西還占了我的庫房,我還不知道找誰退去呢。我的庫房是要錢的呀!現在的軟件又是那么多!”
    所以,如果你沒有一定的資產的話,經銷商都不理你。實際情況也是這樣的,如果你的公司比較小,且沒什么名氣,你的產品放到經銷商庫房,那么他最多給你暫收,產品銷不動的話,一般兩周絕對會退貨。因為現在經銷商可選擇的余地已很多了,所謂的軟件也已經很多了。而程序則更多,程序都想變成軟件,誰都說自己的是“金子”。但只有經受住用戶的檢驗,才能成為真正的“金子”。
    這就是美國為什么在20世紀90年代幾乎沒有什么新的軟件公司產生的原因。只是原來80年代的大的軟件公司互相兼并,我吞你,你吃我。但是,寫程序的人很多,美國的程序變軟件的門檻可能比我們還高,所以很多人寫了程序就丟在網上,就形成了共享軟件。
    2. 共享軟件
    共享軟件是避開商業渠道的一種方法。它避開了商業的門檻,因為這個行業的門檻發展很高以后就輕易進不去了。我寫個程序丟在網上,你下載就可以用,這時候程序又等于軟件。共享軟件是這樣產生的,是因為沒有辦法中的辦法。如果說程序直接等于軟件的話,誰也不會輕易把程序丟到網上去。
    開始做共享軟件的人并不認為做它能賺錢,只是后來用的人多了,有人付錢給他了。共享軟件使得程序和軟件的距離縮短了,但是它與商業軟件的距離會進一步拉大。商業軟件的功能和所要達到的目標就不是一個人能“玩”得起來的了。這時的軟件也已不是幾個人、一個小組就能做出來的了。這就是在美國新的軟件公司沒法產生的原因。比如netscape網景是在1995~1996年產生的新軟件公司,但是,兩三年后它就不見了。
    1.1.1 商業軟件門檻的形成
    1. 商業軟件門檻的形成
    商業軟件門檻的形成是整個行業發展的必然結果。任何一個行業初始階段時的門檻都非常低,但是,只要發展到一定的階段后,它的門檻就必然抬高。比如,現在國內生產小汽車很困難,但在20世紀50年代~60年代的時候,你裝4個輪子,再加上柴油機等就形成汽車。那時的萊特兄弟裝個螺旋槳,加兩個機翼,就能做飛機。整個行業還沒有形成的時候,絕對可以這樣做,但是,到整個行業形成時,你就做不了了。所有的行業都是這樣的。
    為什么網站一出來時那么多人去擠著做?這也是因為一開始的時候,看起來門檻非常低,人人都可以做。只要有一個服務器,架根網線,就能做網站。這個行業處于初始階段時,情況就是這樣的。但這個行業形成后,你就輕易地“玩”不了了。
    國內的軟件發展也是如此。國內的軟件自從軟件經銷商形成以后,這個行業才真正地形成。有沒有一個渠道是判斷一個行業是否形成的很重要的環節。任何一個行業都會有一個經銷渠道,如果渠道形成了,那么這個行業也就形成了。第一名的經銷商是1994年~1995年成立的,也就是說,中國軟件行業大概也就是在1995年形成的,至今才經歷8年時間的發展。
    有一種浮躁的思想認為,中國軟件產業應該很快就能趕上美國。美國軟件行業是上世紀80年代形成的,到現在已經發展了20多年了。中國軟件行業才8年,8年才是一個懵懂的小孩,20多歲是一個強壯的青年,那么他們的力量是不對等的。但也要看到,當8歲變成15歲的時候,它真正的能量才會反映出來。
    2. 軟件門檻對程序員的影響
    現在中國軟件行業正在形成。所以,現在做一個程序員一定要有耐心,因為現在已經不等于以前了。你一定要把所有的問題搞清楚,然后再去做程序。
    對于程序員來說,最好的工作環境是在現有的或者初始要成立的公司里面,這是最容易成功的。個人單槍匹馬闖天下已經很困難了。即使現在偶爾做兩個共享軟件放在網上能成名,但是也已經比較困難了。因為現在做軟件的人已經很多了。這也說明軟件已經不等于程序了,程序也不等于軟件。
    程序要變成軟件,這中間是一個商業化的過程。沒有門檻以前,它沒有這個商業過程,現在有這個行業了,它中間就有商業化的過程。這個商業的過程就不是一個人能“玩”的。
    如果你開始做某一類軟件的時候,別人已經做成了,這時你再決定花力氣去做,那么你就要花雙倍的力氣去趕上別人。
    現在的商業軟件往往是由很多模塊組成的,模塊是整個系統的一部分。個人要完整地寫一個商業系統幾乎是不可能的。軟件進入windows平臺后,它已經很復雜了,不像在dos的時候,你寫兩行程序就能賣,做個zip也能賣。事實上,美國的商業編譯器也不是一個人能“玩”的。現在你可能覺得它是很簡單的,甚至linux還帶了一個gcc,且源程序還在。你可以把它改一改,做個vc試一試,看它會有人用嗎?它能變成軟件嗎?即使你再做個界面,它也還是一個gcc,絕對不會成為visual c++那樣能商業化的軟件。
    可見,國外軟件行業的門檻要比中國的高很多了。我覺得我們中國即使再去做這樣的東西,也沒有多大的意義了。這個門檻你是追不過來的。不僅要花雙倍的力氣,而且在這么短的時間內,你還要完成別人已經完成過的工作,包括別人所做的測試工作。只有這樣,才能做到你的軟件與別人有競爭力,能與它做比較。
    1.1.2 認清自己的發展
    如果連以上認識都不清楚,很可能就以為去書店買一本mfc高手速成之類的書,編兩個程序就能成為軟件高手。就好像這些書是“黃金”,我學兩下,學會了vc、mfc,就能做一個軟件拿出去賣了。這種想法也不是不行,最后一定能行,但要有耐心,還要有機遇。機遇是從耐心中產生的,越有耐心,就越有機遇。你得非常努力,要花很多的精力,可能還要走很多的彎路。
    如果你是從mfc入手的,或是從vb入手的,則如要做出一個真正的能應用個人領域的通用軟件,就會走非常多的彎路。直接的捷徑絕對不是走這兩條路。這兩條路看起來很快,而且在很多公司里面確實需要這樣的東西,比如說我這家公司就是為另一個家公司做系統集成的,那我就需要這樣的東西,我不管你具體怎么實現,我只需要達到這個目標就行了。
    任何軟件的實現都會有n種方法,即使你是用最差的那種方法實現的,也沒有問題,最后它還是能運行。即使有問題,再改一改就是。但是,做通用軟件就不行了,通用是一對多,你做出來的軟件以后要面向全國,如果將來自由貿易通到香港也好,通到國外也好,整個產品能銷到全世界的話,這時候,通用軟件所有做的工作就不是這么簡單了。所以說,正確的入門方法就很關鍵。
    如果你僅僅只是想混口飯吃,找個工作,可能教你成為mfc的高手之類的書對你就足夠了。但是,如果你想做一個很好的軟件,不僅能滿足你謀一碗飯吃,還能使你揚名,最后你的軟件還能成為很多人用,甚至你還想把它作為一個事業去經營,那么這第一步就非常關鍵。這時就絕對不能找一本mfc或找一本vb的書學兩下就行,而是要從最底層開始做起,從最基本做起。
    1.2 高手是怎樣練成的
    1.2.1 高手成長的六個階段
    程序員怎樣才能達到編程的最高境界?最高境界絕對不是你去編兩行代碼,或者是幾分鐘能寫幾行代碼,或者是用什么所謂的可視化工具產生最少的代碼這些工作,這都不是真正的高手境界。即使是這樣的高手,那也都是無知者的自封。
    我認為,一個程序員的成長可分為如下六個階段。
    ? 第一階段
    此階段主要是能熟練地使用某種語言。這就相當于練武中的套路和架式這些表面的東西。
    ? 第二階段
    此階段能精通基于某種平臺的接口(例如我們現在常用的win 32的api函數)以及所對應語言的自身的庫函數。到達這個階段后,也就相當于可以進行真實散打對練了,可以真正地在實踐中做些應用。
    ? 第三階段
    此階段能深入地了解某個平臺系統的底層,已經具有了初級的內功的能力,也就是“手中有劍,心中無劍”。
    ? 第四階級
    此階段能直接在平臺上進行比較深層次的開發。基本上,能達到這個層次就可以說是進入了高層次。這時進入了高級內功的修煉。比如能進行vxd或操作系統的內核的修改。
    這時已經不再有語言的束縛,語言只是一種工具,即使要用自己不會的語言進行開發,也只是簡單地熟悉一下,就手到擒來,完全不像是第一階段的時候學習語言的那種情況。一般來說,從第三階段過渡到第四階段是比較困難的。為什么會難呢?這就是因為很多人的思想變不過來。
    ? 第五階級
    此階段就已經不再局限于簡單的技術上的問題了,而是能從全局上把握和設計一個比較大的系統體系結構,從內核到外層界面。可以說是“手中無劍,心中有劍”。到了這個階段以后,能對市面上的任何軟件進行剖析,并能按自己的要求進行設計,就算是ms word這樣的大型軟件,只要有充足的時間,也一定會設計出來。
    ? 第六階級
    此階段也是最高的境界,達到“無招勝有招”。這時候,任何問題就純粹變成了一個思路的問題,不是用什么代碼就能表示的。也就是“手中無劍,心中也無劍”。
    此時,對于練功的人來說,他已不用再去學什么少林拳,只是在旁看一下少林拳的對戰,就能把此拳拿來就用。這就是真正的大師級的人物。這時,win 32或linux在你眼里是沒有什么差別的。
    每一個階段再向上發展時都要按一定的方法。第一、第二個階段通過自學就可以完成,只要多用心去研究,耐心地去學習。
    要想從第二個階段過渡到第三個階段,就要有一個好的學習環境。例如有一個高手帶領或公司里有一個好的練手環境。經過二、三年的積累就能達到第三個階段。但是,有些人到達第三個階段后,常常就很難有境界上的突破了。他們這時會產生一種觀念,認為軟件無非如此,認為自己已無所不能。其實,這時如果遇到大的或難些的軟件,他們往往還是無從下手。
    現在我們國家大部分程序員都是在第二、三級之間。他們大多都是通過自學成才的,不過這樣的程序員一般在軟件公司也能獨當一面,完成一些軟件的模塊。
    但是,也還有一大堆處在第一階段的程序員,他們一般就能玩玩vb,做程序時,去找一堆控件集成一個軟件。
    現在一種流行的說法是,中國軟件人才現在是一個橄欖型的人才結構,有大量的中等水平的程序員,而初級和高級程序員比較少。而我認為,現在中國絕大多數都是初級的程序員,中級程序員很少,高級的就更少了。所以,現在的人才結構是“方塔”形,這是一種斷層的不良結構。而真正成熟的軟件人才結構應該是平滑的三角形結構。這樣,初級、中級、高級程序員才能充分地各施所長。三種人才結構對比如圖1.1所示。
    圖1.1 三種人才結構對比
    1.2.2 初級程序員和高級程序員的區別
    一般對于一個問題,初級程序員和高級程序員考慮這個問題的方法絕對是不同的。比如,在初級程序員階段時,他會覺得vb也能做出應用來,且看起來也不錯。
    但到了中級程序員時,他可能就不會選擇vb了,可能會用mfc,這時,也能做出效果不錯的程序。
    到高級程序員時,他絕對不是首先選擇以上工具,vb也好,vc也好,這些都不是他考慮的問題。這時考慮的絕對是什么才是具有最快效率、最穩定性能的解決問題的方法。
    軟件和別的產品不同。比如,在軟件中要達到某個目標,有n種方法,但是在n種方法中,只有一種方法或兩種方法是最好的,其他的都很次。所以,要做一個好的系統,是很需要耐心的。如果沒有耐心,就不會有細活,有細活的東西才是好東西。我覺得做軟件是這樣,做任何事情也是這樣的,一定要投入。

    程序員到達最高境界的時候,想的就是“我就是程序,程序就是我”。這時候我要做一個軟件,不會有自己主觀的思路,而是以機器的思路來考慮問題,也就是說,就是以程序的思考方式來思考程序,而不是以我去設計程序的方式去思考程序。這一點如果不到比較高的層次是不能明白的。
    你設計程序不就是你思考問題,然后按自己的思路去做程序嗎?
    其實不是的。在我設計這個程序的時候,相當于我“鉆”入這個程序里面去了。這時候沒有我自己的任何思維,我的所有思維都是這個程序,它這步該怎么走,下步該怎么走,它可能會出現什么情況。我動這個部分的時候,別的部分是否要干擾,也許會動一發而牽全身,它們之間是怎么相互影響的?
    也只有到達這個境界,你的程序才能真正地寫好,絕對不是做個什么可視化。可視化本身就是“我去設計這個程序”,而真正的程序高手是“我就是程序”,這兩種方法絕對是不同的。比如,我要用vb去設計一個程序,和我本身就是一個程序的思維方式,是不一樣的。別人也許覺得操作系統很深奧,很復雜,其實,如果你到達高手狀態,你就是操作系統,你就能做任何程序。
    對待軟件要有一個全面的分析方法,光說理論是沒有用的。如果你沒有經過第一、第二、第三、第四這四個階段,則永遠到達不了高境界。因為空中樓閣的理論沒有用,而這些必須是一步一步地去做出來。
    一個高級程序員應該具備開放性思維,從里到外的所有的知識都能了解。然后,看到世界最新技術就能馬上掌握,馬上了解。實際上,技術到達最高的境界后,是沒有分別的。任何東西都是相通的,只要你到達這個境界以后,什么問題一看就能明白,一看就能抓住最核心的問題,最根本的根本,而不會被其他的枝葉或表象所迷惑,做到這一步后才算比較成功。
    從程序員本身來說,如果它到達這一步以后,他就已經形成了開闊的思維。他有這種開放性思維的話,他就能做戰略決策,這對他將來做任何事情都有好處。事實上,會做程序后,就會有一種分析問題的方法,學會怎么樣把問題的表象剖開,看到它的本質。這時你碰到任何具體的問題,只要給點時間,都能輕而易舉地解決。實際上,對開發計算機軟件來說,沒有什么做不了的軟件,所有的軟件都能做,只是看你有沒有時間,有沒有耐心,有沒有資金做支撐。
    這幾年,尤其是這兩三年,估計到2005年前,中國軟件這個行業里面大的軟件公司就能形成。現在就已經在形成,例如用友,它上市后,地位就更加穩固了。其他大的軟件企業會在這幾年內迅速長大。這時候,包括流通渠道、經銷商的渠道也會迅速長大。也就是說,到2005年以后,中國軟件這個行業的門檻比現在還要高很多,與美國不會有太大的差別。此時,中國軟件才真正體現出它的威力來。如果你是這些威力中的一員,就已經很厲害了。
    別人可能知道比爾?蓋茨是個談判的高手,是賣東西的高手,其實,比爾?蓋茨從根本上來說是個程序高手,這是他根本中的根本。他對所有的技術都非常敏感,一眼就看到本質,而且他本身也能做程序,時常在看程序。現在他不做董事長,而做首席設計師,這時他就更加接近程序的本質。因為他本身就有很開闊的思維,又深入到技術的本身,所以他就知道技術的方向。這對于一個公司,對他這樣的人來說,是非常重要的。
    如果他判斷錯誤一步,那公司以后再回頭就很難了。計算機的競爭是非常激烈的,不能走錯半步。很多公司以前看上去很火,后來就
    銷聲匿跡了,就是因為它走錯一步,然后就不行了。為什么它會走錯?因為他不了解技術的本質在哪里,技術的發展方向在哪里。
    比爾?蓋茨因為父母是學法律的,所以他本身就很能“侃”,很有說服力,而他又是做技術的,就非常清楚技術的方向在哪里,所以他才能把方向把握得很準確,公司越來越大。而別的公司只火一陣子,他卻火了還會再火。就算微軟再龐大,你如果不把握好軟件技術的最前沿,一樣也會玩完。就像intel時刻把握著cpu的最新技術,才能保證自己是行業老大。技術決定它的將來。

    所以,程序員要能達到這樣的目標,就要有非常強的耐心和非常好的機遇才有可能。事實上,現在的機會挺好的,2005年以前機會都非常大,以后機會會比較小。但是,如果有耐心的話,你還是會有機會的,機會都是出在耐心里。我記得有句話說“雄心的一半是耐心”,我認為雄心的三分之二都是耐心。如果你越有野心,你就越要有耐心,你的野心才有可能實現。如果你有野心而沒有耐心,那都是胡思亂想,別人一眼就能看穿。最后在競爭中,對手一眼就看到你的意圖,那你還有什么可競爭的?

    1.2.3 程序員是吃青春飯的嗎
    很多人都認為程序員是三十歲以前的職業,到了三十歲以后,就不應再做程序員了。現在的很多程序員也有這種想法,我覺得這種想法很不對。
    在20世紀80年代末到90年代初,那時軟件還沒有形成行業,程序員不能以此作為謀生的手段時,你必須轉行,因為你年輕的時候不用考慮吃飯的問題,天天“玩”都可以,但是以后就不可能了。
    據我了解,微軟里面的那些高手,幾乎都是四五十歲的,而且都是做底層的。他們是上世紀70年代就開始“玩”程序的,所以對于整個計算機,他們是太清楚了。現在有些人主觀臆斷地希望微軟第二天倒閉就好了,但那可能性太小了。因為那些程序員是從cpu是4004的時候開始,玩到現在奔騰iv,沒有哪一代東西他們沒有經歷過。
    你知道他們現在正在玩什么嗎?現在正在玩64位的cpu。你說你普通的程序員,有這個耐心嗎?沒有這個耐心,你絕對做不了,你也絕對做不了高手。他為什么能做?因為他不僅是玩過來的,而且他還非常有耐心,每一步技術他都跟得上,所以對他來說,沒有任何的難度和壓力。
    因為計算機技術沒有任何時候是突變的。它的今年和去年相差不會很大,但是回過頭來看三年以前的情況,和現在的距離就很大。所以說,如果你每年都跟著技術進步的話,你的壓力就很小,因為你時刻都能掌握最新的技術。但是,如果你落下來,別說十年,就是三年,你就趕不上了。
    如果你一旦趕不上,就會覺得非常吃力;如果你趕不上,你就會迷失方向;如果你迷失了方向,你就覺得計算機沒有味道,越做越沒勁。當你還只是有個思路的時候,別人的產品都做出來了,因為你的水平跟別人相差太遠,人家早就想到的問題,你現在才開始認識。水平越高,他就看得越遠,那么他的思維就越開闊;水平越低,想的問題就越窄。
    64位cpu是這個十年和下個十年最重要的技術之一,誰抓住這個機會,誰就能抓住未來賺錢的商機。cpu是英特爾設計的,對這一點他肯定清楚。舉例來說,如果從64位的角度來看現在的32位,就像從現在的角度去看dos。你說dos很復雜嗎?當你在dos年代的時候,你會覺得dos很復雜。你說現在的windows不夠復雜嗎?windows太復雜了,但是你到了64位的時候再去看windows,就如同現在看dos一樣。
    整個64位系統的平臺和思維方式、思路都比現在更開闊,打個比方說,現在的windows里面能開n個dos窗口,每個dos窗都能運行一個程序。到達64位的時候,操作系統事實上能做到開n個x86,開n個windows 98,然后再開n個windows 95都沒有問題,系統能做到這一步,甚至你的系統內開n個windows nt都沒有關系。這就是64位和32位的差別。所以,微軟的那些“老頭”,四、五十歲的那幾個做核心的人,現在正在玩這些東西。你說微軟的技術它能不先進嗎?是linux那幾個玩家能搞定的嗎?
    微軟的技術非常雄厚,世界計算機的最新技術絕對集中在這幾個人手里。而且這幾個人的思維模式非常開闊,誰都沒有意識到的東西他早就開始做了。現在64位的cpu都出來一二年了,你說有什么人去做這些應用嗎?沒有,有的就是那幾個unix廠商做好后給自己用的。

    所以,追求技術的最高境界的時候,實際上是沒有年齡限制的。對我來說,現在都三十三了,我從來沒有想過退出這行,我覺得我就能玩下去,一直玩到退休都沒有問題。我要時刻保持技術的最前端,這樣的話對我來說是不困難的,沒有任何累的感覺。
    很多人說做程序不是人干的事情,是非人的待遇。這樣,他們一旦成立一個公司,做出一點成績,在輝煌的時候馬上就考慮退出。因為他們太苦了,每天晚上熬夜,每天晚上燒了兩包煙還不夠,屋子里面簡直就缺氧了,好像還沒有解決問題。
    白天睡覺,晚上干活,那當然累死了,這是自己折騰自己。所以,做程序員一定要有一種正常的心態,就是說,你做程序的時候,不要把自己的生活搞得顛三倒四的。如果非得搞得晚上燒好多煙才行,這樣你肯定折騰不到三十歲,三十歲以后身體就差了。
    事實上,

    好的開始是成功的一半,本文首先會試圖告訴你什么是程序員?為什么要做這樣的程序?正確的入門方法是什么?
    程序員只有在理解了以上內容的基礎上,才能進一步更快地提高自身技能,這時候再開始程序的設計。其實,對一個軟件的開發者來說,真正重要的不在于這行代碼怎么寫,那些代碼應該怎么寫,關鍵是思路的問題,而思路事實上是經驗的積累。經驗是使你從最初的封閉的思維方式,到最后形成開放式的思維的一個過程。將我十幾年程序生涯中獲得的一些經驗告訴讀者,使大家少走彎路也是我想寫這本書的主要目的。
    1.1 程序≠軟件
    現在很多人以為程序就是軟件,軟件就是程序。事實上,軟件和程序在20世紀80年代時,還可以說是等同的,或者說,在非pc領域里它們可能還會是等同的,比如說某個嵌入式軟件領域,軟件和程序可能是等同的。但是,在pc這個領域內,現在的程序已不等于軟件了。這是什么意思呢?
    1. 軟件發展簡述
    在20世紀80年代的時候,pc剛誕生,這時國內還沒有幾個人會寫程序。那么,如果你寫個程序,別人就可以拿來用。這時候的程序就能產生價值,這個程序就直接等同于軟件。
    但軟件行業發展到現在,這里以中國的情況為例(美國在20世紀80年代,程序已經不等同于軟件了),程序也不等同于軟件了。因為現在會寫程序很容易,但是你的這個程序很難產生什么樣的商業意義,也不能產生什么價值,這就很難直接變成軟件。要使一個程序直接變成軟件,中間就面臨著很高的門檻問題。這個門檻問題來自于整個行業的形成。
    現在,你寫了一個程序以后,要面臨商業化的過程。你要宣傳,你要讓用戶知道,你要建立經銷渠道,可能你還要花很多的時間去說服別人用你的東西。這是程序到軟件的一個過程。這門檻已比較高了。
    我們在和國內的大經銷商的銷售渠道的人聊天時,他們的老板說,這幾年做軟件的門檻挺高的,如果你沒有五、六百萬做軟件,那是“玩”不起來的。我說:“你們就使門檻很高了。”他說:“那肯定是的。如果你寫個“爛”程序,明天你倒閉了,你的東西還占了我的庫房,我還不知道找誰退去呢。我的庫房是要錢的呀!現在的軟件又是那么多!”
    所以,如果你沒有一定的資產的話,經銷商都不理你。實際情況也是這樣的,如果你的公司比較小,且沒什么名氣,你的產品放到經銷商庫房,那么他最多給你暫收,產品銷不動的話,一般兩周絕對會退貨。因為現在經銷商可選擇的余地已很多了,所謂的軟件也已經很多了。而程序則更多,程序都想變成軟件,誰都說自己的是“金子”。但只有經受住用戶的檢驗,才能成為真正的“金子”。
    這就是美國為什么在20世紀90年代幾乎沒有什么新的軟件公司產生的原因。只是原來80年代的大的軟件公司互相兼并,我吞你,你吃我。但是,寫程序的人很多,美國的程序變軟件的門檻可能比我們還高,所以很多人寫了程序就丟在網上,就形成了共享軟件。
    2. 共享軟件
    共享軟件是避開商業渠道的一種方法。它避開了商業的門檻,因為這個行業的門檻發展很高以后就輕易進不去了。我寫個程序丟在網上,你下載就可以用,這時候程序又等于軟件。共享軟件是這樣產生的,是因為沒有辦法中的辦法。如果說程序直接等于軟件的話,誰也不會輕易把程序丟到網上去。
    開始做共享軟件的人并不認為做它能賺錢,只是后來用的人多了,有人付錢給他了。共享軟件使得程序和軟件的距離縮短了,但是它與商業軟件的距離會進一步拉大。商業軟件的功能和所要達到的目標就不是一個人能“玩”得起來的了。這時的軟件也已不是幾個人、一個小組就能做出來的了。這就是在美國新的軟件公司沒法產生的原因。比如netscape網景是在1995~1996年產生的新軟件公司,但是,兩三年后它就不見了。
    1.1.1 商業軟件門檻的形成
    1. 商業軟件門檻的形成
    商業軟件門檻的形成是整個行業發展的必然結果。任何一個行業初始階段時的門檻都非常低,但是,只要發展到一定的階段后,它的門檻就必然抬高。比如,現在國內生產小汽車很困難,但在20世紀50年代~60年代的時候,你裝4個輪子,再加上柴油機等就形成汽車。那時的萊特兄弟裝個螺旋槳,加兩個機翼,就能做飛機。整個行業還沒有形成的時候,絕對可以這樣做,但是,到整個行業形成時,你就做不了了。所有的行業都是這樣的。
    為什么網站一出來時那么多人去擠著做?這也是因為一開始的時候,看起來門檻非常低,人人都可以做。只要有一個服務器,架根網線,就能做網站。這個行業處于初始階段時,情況就是這樣的。但這個行業形成后,你就輕易地“玩”不了了。
    國內的軟件發展也是如此。國內的軟件自從軟件經銷商形成以后,這個行業才真正地形成。有沒有一個渠道是判斷一個行業是否形成的很重要的環節。任何一個行業都會有一個經銷渠道,如果渠道形成了,那么這個行業也就形成了。第一名的經銷商是1994年~1995年成立的,也就是說,中國軟件行業大概也就是在1995年形成的,至今才經歷8年時間的發展。
    有一種浮躁的思想認為,中國軟件產業應該很快就能趕上美國。美國軟件行業是上世紀80年代形成的,到現在已經發展了20多年了。中國軟件行業才8年,8年才是一個懵懂的小孩,20多歲是一個強壯的青年,那么他們的力量是不對等的。但也要看到,當8歲變成15歲的時候,它真正的能量才會反映出來。
    2. 軟件門檻對程序員的影響
    現在中國軟件行業正在形成。所以,現在做一個程序員一定要有耐心,因為現在已經不等于以前了。你一定要把所有的問題搞清楚,然后再去做程序。
    對于程序員來說,最好的工作環境是在現有的或者初始要成立的公司里面,這是最容易成功的。個人單槍匹馬闖天下已經很困難了。即使現在偶爾做兩個共享軟件放在網上能成名,但是也已經比較困難了。因為現在做軟件的人已經很多了。這也說明軟件已經不等于程序了,程序也不等于軟件。
    程序要變成軟件,這中間是一個商業化的過程。沒有門檻以前,它沒有這個商業過程,現在有這個行業了,它中間就有商業化的過程。這個商業的過程就不是一個人能“玩”的。
    如果你開始做某一類軟件的時候,別人已經做成了,這時你再決定花力氣去做,那么你就要花雙倍的力氣去趕上別人。
    現在的商業軟件往往是由很多模塊組成的,模塊是整個系統的一部分。個人要完整地寫一個商業系統幾乎是不可能的。軟件進入windows平臺后,它已經很復雜了,不像在dos的時候,你寫兩行程序就能賣,做個zip也能賣。事實上,美國的商業編譯器也不是一個人能“玩”的。現在你可能覺得它是很簡單的,甚至linux還帶了一個gcc,且源程序還在。你可以把它改一改,做個vc試一試,看它會有人用嗎?它能變成軟件嗎?即使你再做個界面,它也還是一個gcc,絕對不會成為visual c++那樣能商業化的軟件。
    可見,國外軟件行業的門檻要比中國的高很多了。我覺得我們中國即使再去做這樣的東西,也沒有多大的意義了。這個門檻你是追不過來的。不僅要花雙倍的力氣,而且在這么短的時間內,你還要完成別人已經完成過的工作,包括別人所做的測試工作。只有這樣,才能做到你的軟件與別人有競爭力,能與它做比較。
    1.1.2 認清自己的發展
    如果連以上認識都不清楚,很可能就以為去書店買一本mfc高手速成之類的書,編兩個程序就能成為軟件高手。就好像這些書是“黃金”,我學兩下,學會了vc、mfc,就能做一個軟件拿出去賣了。這種想法也不是不行,最后一定能行,但要有耐心,還要有機遇。機遇是從耐心中產生的,越有耐心,就越有機遇。你得非常努力,要花很多的精力,可能還要走很多的彎路。
    如果你是從mfc入手的,或是從vb入手的,則如要做出一個真正的能應用個人領域的通用軟件,就會走非常多的彎路。直接的捷徑絕對不是走這兩條路。這兩條路看起來很快,而且在很多公司里面確實需要這樣的東西,比如說我這家公司就是為另一個家公司做系統集成的,那我就需要這樣的東西,我不管你具體怎么實現,我只需要達到這個目標就行了。
    任何軟件的實現都會有n種方法,即使你是用最差的那種方法實現的,也沒有問題,最后它還是能運行。即使有問題,再改一改就是。但是,做通用軟件就不行了,通用是一對多,你做出來的軟件以后要面向全國,如果將來自由貿易通到香港也好,通到國外也好,整個產品能銷到全世界的話,這時候,通用軟件所有做的工作就不是這么簡單了。所以說,正確的入門方法就很關鍵。
    如果你僅僅只是想混口飯吃,找個工作,可能教你成為mfc的高手之類的書對你就足夠了。但是,如果你想做一個很好的軟件,不僅能滿足你謀一碗飯吃,還能使你揚名,最后你的軟件還能成為很多人用,甚至你還想把它作為一個事業去經營,那么這第一步就非常關鍵。這時就絕對不能找一本mfc或找一本vb的書學兩下就行,而是要從最底層開始做起,從最基本做起。
    1.2 高手是怎樣練成的
    1.2.1 高手成長的六個階段
    程序員怎樣才能達到編程的最高境界?最高境界絕對不是你去編兩行代碼,或者是幾分鐘能寫幾行代碼,或者是用什么所謂的可視化工具產生最少的代碼這些工作,這都不是真正的高手境界。即使是這樣的高手,那也都是無知者的自封。
    我認為,一個程序員的成長可分為如下六個階段。
    ? 第一階段
    此階段主要是能熟練地使用某種語言。這就相當于練武中的套路和架式這些表面的東西。
    ? 第二階段
    此階段能精通基于某種平臺的接口(例如我們現在常用的win 32的api函數)以及所對應語言的自身的庫函數。到達這個階段后,也就相當于可以進行真實散打對練了,可以真正地在實踐中做些應用。
    ? 第三階段
    此階段能深入地了解某個平臺系統的底層,已經具有了初級的內功的能力,也就是“手中有劍,心中無劍”。
    ? 第四階級
    此階段能直接在平臺上進行比較深層次的開發。基本上,能達到這個層次就可以說是進入了高層次。這時進入了高級內功的修煉。比如能進行vxd或操作系統的內核的修改。
    這時已經不再有語言的束縛,語言只是一種工具,即使要用自己不會的語言進行開發,也只是簡單地熟悉一下,就手到擒來,完全不像是第一階段的時候學習語言的那種情況。一般來說,從第三階段過渡到第四階段是比較困難的。為什么會難呢?這就是因為很多人的思想變不過來。
    ? 第五階級
    此階段就已經不再局限于簡單的技術上的問題了,而是能從全局上把握和設計一個比較大的系統體系結構,從內核到外層界面。可以說是“手中無劍,心中有劍”。到了這個階段以后,能對市面上的任何軟件進行剖析,并能按自己的要求進行設計,就算是ms word這樣的大型軟件,只要有充足的時間,也一定會設計出來。
    ? 第六階級
    此階段也是最高的境界,達到“無招勝有招”。這時候,任何問題就純粹變成了一個思路的問題,不是用什么代碼就能表示的。也就是“手中無劍,心中也無劍”。
    此時,對于練功的人來說,他已不用再去學什么少林拳,只是在旁看一下少林拳的對戰,就能把此拳拿來就用。這就是真正的大師級的人物。這時,win 32或linux在你眼里是沒有什么差別的。
    每一個階段再向上發展時都要按一定的方法。第一、第二個階段通過自學就可以完成,只要多用心去研究,耐心地去學習。
    要想從第二個階段過渡到第三個階段,就要有一個好的學習環境。例如有一個高手帶領或公司里有一個好的練手環境。經過二、三年的積累就能達到第三個階段。但是,有些人到達第三個階段后,常常就很難有境界上的突破了。他們這時會產生一種觀念,認為軟件無非如此,認為自己已無所不能。其實,這時如果遇到大的或難些的軟件,他們往往還是無從下手。
    現在我們國家大部分程序員都是在第二、三級之間。他們大多都是通過自學成才的,不過這樣的程序員一般在軟件公司也能獨當一面,完成一些軟件的模塊。
    但是,也還有一大堆處在第一階段的程序員,他們一般就能玩玩vb,做程序時,去找一堆控件集成一個軟件。
    現在一種流行的說法是,中國軟件人才現在是一個橄欖型的人才結構,有大量的中等水平的程序員,而初級和高級程序員比較少。而我認為,現在中國絕大多數都是初級的程序員,中級程序員很少,高級的就更少了。所以,現在的人才結構是“方塔”形,這是一種斷層的不良結構。而真正成熟的軟件人才結構應該是平滑的三角形結構。這樣,初級、中級、高級程序員才能充分地各施所長。三種人才結構對比如圖1.1所示。
    圖1.1 三種人才結構對比
    1.2.2 初級程序員和高級程序員的區別
    一般對于一個問題,初級程序員和高級程序員考慮這個問題的方法絕對是不同的。比如,在初級程序員階段時,他會覺得vb也能做出應用來,且看起來也不錯。
    但到了中級程序員時,他可能就不會選擇vb了,可能會用mfc,這時,也能做出效果不錯的程序。
    到高級程序員時,他絕對不是首先選擇以上工具,vb也好,vc也好,這些都不是他考慮的問題。這時考慮的絕對是什么才是具有最快效率、最穩定性能的解決問題的方法。
    軟件和別的產品不同。比如,在軟件中要達到某個目標,有n種方法,但是在n種方法中,只有一種方法或兩種方法是最好的,其他的都很次。所以,要做一個好的系統,是很需要耐心的。如果沒有耐心,就不會有細活,有細活的東西才是好東西。我覺得做軟件是這樣,做任何事情也是這樣的,一定要投入。

    程序員到達最高境界的時候,想的就是“我就是程序,程序就是我”。這時候我要做一個軟件,不會有自己主觀的思路,而是以機器的思路來考慮問題,也就是說,就是以程序的思考方式來思考程序,而不是以我去設計程序的方式去思考程序。這一點如果不到比較高的層次是不能明白的。
    你設計程序不就是你思考問題,然后按自己的思路去做程序嗎?
    其實不是的。在我設計這個程序的時候,相當于我“鉆”入這個程序里面去了。這時候沒有我自己的任何思維,我的所有思維都是這個程序,它這步該怎么走,下步該怎么走,它可能會出現什么情況。我動這個部分的時候,別的部分是否要干擾,也許會動一發而牽全身,它們之間是怎么相互影響的?
    也只有到達這個境界,你的程序才能真正地寫好,絕對不是做個什么可視化。可視化本身就是“我去設計這個程序”,而真正的程序高手是“我就是程序”,這兩種方法絕對是不同的。比如,我要用vb去設計一個程序,和我本身就是一個程序的思維方式,是不一樣的。別人也許覺得操作系統很深奧,很復雜,其實,如果你到達高手狀態,你就是操作系統,你就能做任何程序。
    對待軟件要有一個全面的分析方法,光說理論是沒有用的。如果你沒有經過第一、第二、第三、第四這四個階段,則永遠到達不了高境界。因為空中樓閣的理論沒有用,而這些必須是一步一步地去做出來。
    一個高級程序員應該具備開放性思維,從里到外的所有的知識都能了解。然后,看到世界最新技術就能馬上掌握,馬上了解。實際上,技術到達最高的境界后,是沒有分別的。任何東西都是相通的,只要你到達這個境界以后,什么問題一看就能明白,一看就能抓住最核心的問題,最根本的根本,而不會被其他的枝葉或表象所迷惑,做到這一步后才算比較成功。
    從程序員本身來說,如果它到達這一步以后,他就已經形成了開闊的思維。他有這種開放性思維的話,他就能做戰略決策,這對他將來做任何事情都有好處。事實上,會做程序后,就會有一種分析問題的方法,學會怎么樣把問題的表象剖開,看到它的本質。這時你碰到任何具體的問題,只要給點時間,都能輕而易舉地解決。實際上,對開發計算機軟件來說,沒有什么做不了的軟件,所有的軟件都能做,只是看你有沒有時間,有沒有耐心,有沒有資金做支撐。
    這幾年,尤其是這兩三年,估計到2005年前,中國軟件這個行業里面大的軟件公司就能形成。現在就已經在形成,例如用友,它上市后,地位就更加穩固了。其他大的軟件企業會在這幾年內迅速長大。這時候,包括流通渠道、經銷商的渠道也會迅速長大。也就是說,到2005年以后,中國軟件這個行業的門檻比現在還要高很多,與美國不會有太大的差別。此時,中國軟件才真正體現出它的威力來。如果你是這些威力中的一員,就已經很厲害了。
    別人可能知道比爾?蓋茨是個談判的高手,是賣東西的高手,其實,比爾?蓋茨從根本上來說是個程序高手,這是他根本中的根本。他對所有的技術都非常敏感,一眼就看到本質,而且他本身也能做程序,時常在看程序。現在他不做董事長,而做首席設計師,這時他就更加接近程序的本質。因為他本身就有很開闊的思維,又深入到技術的本身,所以他就知道技術的方向。這對于一個公司,對他這樣的人來說,是非常重要的。
    如果他判斷錯誤一步,那公司以后再回頭就很難了。計算機的競爭是非常激烈的,不能走錯半步。很多公司以前看上去很火,后來就
    銷聲匿跡了,就是因為它走錯一步,然后就不行了。為什么它會走錯?因為他不了解技術的本質在哪里,技術的發展方向在哪里。
    比爾?蓋茨因為父母是學法律的,所以他本身就很能“侃”,很有說服力,而他又是做技術的,就非常清楚技術的方向在哪里,所以他才能把方向把握得很準確,公司越來越大。而別的公司只火一陣子,他卻火了還會再火。就算微軟再龐大,你如果不把握好軟件技術的最前沿,一樣也會玩完。就像intel時刻把握著cpu的最新技術,才能保證自己是行業老大。技術決定它的將來。

    所以,程序員要能達到這樣的目標,就要有非常強的耐心和非常好的機遇才有可能。事實上,現在的機會挺好的,2005年以前機會都非常大,以后機會會比較小。但是,如果有耐心的話,你還是會有機會的,機會都是出在耐心里。我記得有句話說“雄心的一半是耐心”,我認為雄心的三分之二都是耐心。如果你越有野心,你就越要有耐心,你的野心才有可能實現。如果你有野心而沒有耐心,那都是胡思亂想,別人一眼就能看穿。最后在競爭中,對手一眼就看到你的意圖,那你還有什么可競爭的?

    1.2.3 程序員是吃青春飯的嗎
    很多人都認為程序員是三十歲以前的職業,到了三十歲以后,就不應再做程序員了。現在的很多程序員也有這種想法,我覺得這種想法很不對。
    在20世紀80年代末到90年代初,那時軟件還沒有形成行業,程序員不能以此作為謀生的手段時,你必須轉行,因為你年輕的時候不用考慮吃飯的問題,天天“玩”都可以,但是以后就不可能了。
    據我了解,微軟里面的那些高手,幾乎都是四五十歲的,而且都是做底層的。他們是上世紀70年代就開始“玩”程序的,所以對于整個計算機,他們是太清楚了。現在有些人主觀臆斷地希望微軟第二天倒閉就好了,但那可能性太小了。因為那些程序員是從cpu是4004的時候開始,玩到現在奔騰iv,沒有哪一代東西他們沒有經歷過。
    你知道他們現在正在玩什么嗎?現在正在玩64位的cpu。你說你普通的程序員,有這個耐心嗎?沒有這個耐心,你絕對做不了,你也絕對做不了高手。他為什么能做?因為他不僅是玩過來的,而且他還非常有耐心,每一步技術他都跟得上,所以對他來說,沒有任何的難度和壓力。
    因為計算機技術沒有任何時候是突變的。它的今年和去年相差不會很大,但是回過頭來看三年以前的情況,和現在的距離就很大。所以說,如果你每年都跟著技術進步的話,你的壓力就很小,因為你時刻都能掌握最新的技術。但是,如果你落下來,別說十年,就是三年,你就趕不上了。
    如果你一旦趕不上,就會覺得非常吃力;如果你趕不上,你就會迷失方向;如果你迷失了方向,你就覺得計算機沒有味道,越做越沒勁。當你還只是有個思路的時候,別人的產品都做出來了,因為你的水平跟別人相差太遠,人家早就想到的問題,你現在才開始認識。水平越高,他就看得越遠,那么他的思維就越開闊;水平越低,想的問題就越窄。
    64位cpu是這個十年和下個十年最重要的技術之一,誰抓住這個機會,誰就能抓住未來賺錢的商機。cpu是英特爾設計的,對這一點他肯定清楚。舉例來說,如果從64位的角度來看現在的32位,就像從現在的角度去看dos。你說dos很復雜嗎?當你在dos年代的時候,你會覺得dos很復雜。你說現在的windows不夠復雜嗎?windows太復雜了,但是你到了64位的時候再去看windows,就如同現在看dos一樣。
    整個64位系統的平臺和思維方式、思路都比現在更開闊,打個比方說,現在的windows里面能開n個dos窗口,每個dos窗都能運行一個程序。到達64位的時候,操作系統事實上能做到開n個x86,開n個windows 98,然后再開n個windows 95都沒有問題,系統能做到這一步,甚至你的系統內開n個windows nt都沒有關系。這就是64位和32位的差別。所以,微軟的那些“老頭”,四、五十歲的那幾個做核心的人,現在正在玩這些東西。你說微軟的技術它能不先進嗎?是linux那幾個玩家能搞定的嗎?
    微軟的技術非常雄厚,世界計算機的最新技術絕對集中在這幾個人手里。而且這幾個人的思維模式非常開闊,誰都沒有意識到的東西他早就開始做了。現在64位的cpu都出來一二年了,你說有什么人去做這些應用嗎?沒有,有的就是那幾個unix廠商做好后給自己用的。

    所以,追求技術的最高境界的時候,實際上是沒有年齡限制的。對我來說,現在都三十三了,我從來沒有想過退出這行,我覺得我就能玩下去,一直玩到退休都沒有問題。我要時刻保持技術的最前端,這樣的話對我來說是不困難的,沒有任何累的感覺。
    很多人說做程序不是人干的事情,是非人的待遇。這樣,他們一旦成立一個公司,做出一點成績,在輝煌的時候馬上就考慮退出。因為他們太苦了,每天晚上熬夜,每天晚上燒了兩包煙還不夠,屋子里面簡直就缺氧了,好像還沒有解決問題。
    白天睡覺,晚上干活,那當然累死了,這是自己折騰自己。所以,做程序員一定要有一種正常的心態,就是說,你做程序的時候,不要把自己的生活搞得顛三倒四的。如果非得搞得晚上燒好多煙才行,這樣你肯定折騰不到三十歲,三十歲以后身體就差了。
    事實上,我基本上就沒有因為做程序而熬夜的。

    好的開始是成功的一半,本文首先會試圖告訴你什么是程序員?為什么要做這樣的程序?正確的入門方法是什么?
    程序員只有在理解了以上內容的基礎上,才能進一步更快地提高自身技能,這時候再開始程序的設計。其實,對一個軟件的開發者來說,真正重要的不在于這行代碼怎么寫,那些代碼應該怎么寫,關鍵是思路的問題,而思路事實上是經驗的積累。經驗是使你從最初的封閉的思維方式,到最后形成開放式的思維的一個過程。將我十幾年程序生涯中獲得的一些經驗告訴讀者,使大家少走彎路也是我想寫這本書的主要目的。
    1.1 程序≠軟件
    現在很多人以為程序就是軟件,軟件就是程序。事實上,軟件和程序在20世紀80年代時,還可以說是等同的,或者說,在非pc領域里它們可能還會是等同的,比如說某個嵌入式軟件領域,軟件和程序可能是等同的。但是,在pc這個領域內,現在的程序已不等于軟件了。這是什么意思呢?
    1. 軟件發展簡述
    在20世紀80年代的時候,pc剛誕生,這時國內還沒有幾個人會寫程序。那么,如果你寫個程序,別人就可以拿來用。這時候的程序就能產生價值,這個程序就直接等同于軟件。
    但軟件行業發展到現在,這里以中國的情況為例(美國在20世紀80年代,程序已經不等同于軟件了),程序也不等同于軟件了。因為現在會寫程序很容易,但是你的這個程序很難產生什么樣的商業意義,也不能產生什么價值,這就很難直接變成軟件。要使一個程序直接變成軟件,中間就面臨著很高的門檻問題。這個門檻問題來自于整個行業的形成。
    現在,你寫了一個程序以后,要面臨商業化的過程。你要宣傳,你要讓用戶知道,你要建立經銷渠道,可能你還要花很多的時間去說服別人用你的東西。這是程序到軟件的一個過程。這門檻已比較高了。
    我們在和國內的大經銷商的銷售渠道的人聊天時,他們的老板說,這幾年做軟件的門檻挺高的,如果你沒有五、六百萬做軟件,那是“玩”不起來的。我說:“你們就使門檻很高了。”他說:“那肯定是的。如果你寫個“爛”程序,明天你倒閉了,你的東西還占了我的庫房,我還不知道找誰退去呢。我的庫房是要錢的呀!現在的軟件又是那么多!”
    所以,如果你沒有一定的資產的話,經銷商都不理你。實際情況也是這樣的,如果你的公司比較小,且沒什么名氣,你的產品放到經銷商庫房,那么他最多給你暫收,產品銷不動的話,一般兩周絕對會退貨。因為現在經銷商可選擇的余地已很多了,所謂的軟件也已經很多了。而程序則更多,程序都想變成軟件,誰都說自己的是“金子”。但只有經受住用戶的檢驗,才能成為真正的“金子”。
    這就是美國為什么在20世紀90年代幾乎沒有什么新的軟件公司產生的原因。只是原來80年代的大的軟件公司互相兼并,我吞你,你吃我。但是,寫程序的人很多,美國的程序變軟件的門檻可能比我們還高,所以很多人寫了程序就丟在網上,就形成了共享軟件。
    2. 共享軟件
    共享軟件是避開商業渠道的一種方法。它避開了商業的門檻,因為這個行業的門檻發展很高以后就輕易進不去了。我寫個程序丟在網上,你下載就可以用,這時候程序又等于軟件。共享軟件是這樣產生的,是因為沒有辦法中的辦法。如果說程序直接等于軟件的話,誰也不會輕易把程序丟到網上去。
    開始做共享軟件的人并不認為做它能賺錢,只是后來用的人多了,有人付錢給他了。共享軟件使得程序和軟件的距離縮短了,但是它與商業軟件的距離會進一步拉大。商業軟件的功能和所要達到的目標就不是一個人能“玩”得起來的了。這時的軟件也已不是幾個人、一個小組就能做出來的了。這就是在美國新的軟件公司沒法產生的原因。比如netscape網景是在1995~1996年產生的新軟件公司,但是,兩三年后它就不見了。
    1.1.1 商業軟件門檻的形成
    1. 商業軟件門檻的形成
    商業軟件門檻的形成是整個行業發展的必然結果。任何一個行業初始階段時的門檻都非常低,但是,只要發展到一定的階段后,它的門檻就必然抬高。比如,現在國內生產小汽車很困難,但在20世紀50年代~60年代的時候,你裝4個輪子,再加上柴油機等就形成汽車。那時的萊特兄弟裝個螺旋槳,加兩個機翼,就能做飛機。整個行業還沒有形成的時候,絕對可以這樣做,但是,到整個行業形成時,你就做不了了。所有的行業都是這樣的。
    為什么網站一出來時那么多人去擠著做?這也是因為一開始的時候,看起來門檻非常低,人人都可以做。只要有一個服務器,架根網線,就能做網站。這個行業處于初始階段時,情況就是這樣的。但這個行業形成后,你就輕易地“玩”不了了。
    國內的軟件發展也是如此。國內的軟件自從軟件經銷商形成以后,這個行業才真正地形成。有沒有一個渠道是判斷一個行業是否形成的很重要的環節。任何一個行業都會有一個經銷渠道,如果渠道形成了,那么這個行業也就形成了。第一名的經銷商是1994年~1995年成立的,也就是說,中國軟件行業大概也就是在1995年形成的,至今才經歷8年時間的發展。
    有一種浮躁的思想認為,中國軟件產業應該很快就能趕上美國。美國軟件行業是上世紀80年代形成的,到現在已經發展了20多年了。中國軟件行業才8年,8年才是一個懵懂的小孩,20多歲是一個強壯的青年,那么他們的力量是不對等的。但也要看到,當8歲變成15歲的時候,它真正的能量才會反映出來。
    2. 軟件門檻對程序員的影響
    現在中國軟件行業正在形成。所以,現在做一個程序員一定要有耐心,因為現在已經不等于以前了。你一定要把所有的問題搞清楚,然后再去做程序。
    對于程序員來說,最好的工作環境是在現有的或者初始要成立的公司里面,這是最容易成功的。個人單槍匹馬闖天下已經很困難了。即使現在偶爾做兩個共享軟件放在網上能成名,但是也已經比較困難了。因為現在做軟件的人已經很多了。這也說明軟件已經不等于程序了,程序也不等于軟件。
    程序要變成軟件,這中間是一個商業化的過程。沒有門檻以前,它沒有這個商業過程,現在有這個行業了,它中間就有商業化的過程。這個商業的過程就不是一個人能“玩”的。
    如果你開始做某一類軟件的時候,別人已經做成了,這時你再決定花力氣去做,那么你就要花雙倍的力氣去趕上別人。
    現在的商業軟件往往是由很多模塊組成的,模塊是整個系統的一部分。個人要完整地寫一個商業系統幾乎是不可能的。軟件進入windows平臺后,它已經很復雜了,不像在dos的時候,你寫兩行程序就能賣,做個zip也能賣。事實上,美國的商業編譯器也不是一個人能“玩”的。現在你可能覺得它是很簡單的,甚至linux還帶了一個gcc,且源程序還在。你可以把它改一改,做個vc試一試,看它會有人用嗎?它能變成軟件嗎?即使你再做個界面,它也還是一個gcc,絕對不會成為visual c++那樣能商業化的軟件。
    可見,國外軟件行業的門檻要比中國的高很多了。我覺得我們中國即使再去做這樣的東西,也沒有多大的意義了。這個門檻你是追不過來的。不僅要花雙倍的力氣,而且在這么短的時間內,你還要完成別人已經完成過的工作,包括別人所做的測試工作。只有這樣,才能做到你的軟件與別人有競爭力,能與它做比較。
    1.1.2 認清自己的發展
    如果連以上認識都不清楚,很可能就以為去書店買一本mfc高手速成之類的書,編兩個程序就能成為軟件高手。就好像這些書是“黃金”,我學兩下,學會了vc、mfc,就能做一個軟件拿出去賣了。這種想法也不是不行,最后一定能行,但要有耐心,還要有機遇。機遇是從耐心中產生的,越有耐心,就越有機遇。你得非常努力,要花很多的精力,可能還要走很多的彎路。
    如果你是從mfc入手的,或是從vb入手的,則如要做出一個真正的能應用個人領域的通用軟件,就會走非常多的彎路。直接的捷徑絕對不是走這兩條路。這兩條路看起來很快,而且在很多公司里面確實需要這樣的東西,比如說我這家公司就是為另一個家公司做系統集成的,那我就需要這樣的東西,我不管你具體怎么實現,我只需要達到這個目標就行了。
    任何軟件的實現都會有n種方法,即使你是用最差的那種方法實現的,也沒有問題,最后它還是能運行。即使有問題,再改一改就是。但是,做通用軟件就不行了,通用是一對多,你做出來的軟件以后要面向全國,如果將來自由貿易通到香港也好,通到國外也好,整個產品能銷到全世界的話,這時候,通用軟件所有做的工作就不是這么簡單了。所以說,正確的入門方法就很關鍵。
    如果你僅僅只是想混口飯吃,找個工作,可能教你成為mfc的高手之類的書對你就足夠了。但是,如果你想做一個很好的軟件,不僅能滿足你謀一碗飯吃,還能使你揚名,最后你的軟件還能成為很多人用,甚至你還想把它作為一個事業去經營,那么這第一步就非常關鍵。這時就絕對不能找一本mfc或找一本vb的書學兩下就行,而是要從最底層開始做起,從最基本做起。
    1.2 高手是怎樣練成的
    1.2.1 高手成長的六個階段
    程序員怎樣才能達到編程的最高境界?最高境界絕對不是你去編兩行代碼,或者是幾分鐘能寫幾行代碼,或者是用什么所謂的可視化工具產生最少的代碼這些工作,這都不是真正的高手境界。即使是這樣的高手,那也都是無知者的自封。
    我認為,一個程序員的成長可分為如下六個階段。
    ? 第一階段
    此階段主要是能熟練地使用某種語言。這就相當于練武中的套路和架式這些表面的東西。
    ? 第二階段
    此階段能精通基于某種平臺的接口(例如我們現在常用的win 32的api函數)以及所對應語言的自身的庫函數。到達這個階段后,也就相當于可以進行真實散打對練了,可以真正地在實踐中做些應用。
    ? 第三階段
    此階段能深入地了解某個平臺系統的底層,已經具有了初級的內功的能力,也就是“手中有劍,心中無劍”。
    ? 第四階級
    此階段能直接在平臺上進行比較深層次的開發。基本上,能達到這個層次就可以說是進入了高層次。這時進入了高級內功的修煉。比如能進行vxd或操作系統的內核的修改。
    這時已經不再有語言的束縛,語言只是一種工具,即使要用自己不會的語言進行開發,也只是簡單地熟悉一下,就手到擒來,完全不像是第一階段的時候學習語言的那種情況。一般來說,從第三階段過渡到第四階段是比較困難的。為什么會難呢?這就是因為很多人的思想變不過來。
    ? 第五階級
    此階段就已經不再局限于簡單的技術上的問題了,而是能從全局上把握和設計一個比較大的系統體系結構,從內核到外層界面。可以說是“手中無劍,心中有劍”。到了這個階段以后,能對市面上的任何軟件進行剖析,并能按自己的要求進行設計,就算是ms word這樣的大型軟件,只要有充足的時間,也一定會設計出來。
    ? 第六階級
    此階段也是最高的境界,達到“無招勝有招”。這時候,任何問題就純粹變成了一個思路的問題,不是用什么代碼就能表示的。也就是“手中無劍,心中也無劍”。
    此時,對于練功的人來說,他已不用再去學什么少林拳,只是在旁看一下少林拳的對戰,就能把此拳拿來就用。這就是真正的大師級的人物。這時,win 32或linux在你眼里是沒有什么差別的。
    每一個階段再向上發展時都要按一定的方法。第一、第二個階段通過自學就可以完成,只要多用心去研究,耐心地去學習。
    要想從第二個階段過渡到第三個階段,就要有一個好的學習環境。例如有一個高手帶領或公司里有一個好的練手環境。經過二、三年的積累就能達到第三個階段。但是,有些人到達第三個階段后,常常就很難有境界上的突破了。他們這時會產生一種觀念,認為軟件無非如此,認為自己已無所不能。其實,這時如果遇到大的或難些的軟件,他們往往還是無從下手。
    現在我們國家大部分程序員都是在第二、三級之間。他們大多都是通過自學成才的,不過這樣的程序員一般在軟件公司也能獨當一面,完成一些軟件的模塊。
    但是,也還有一大堆處在第一階段的程序員,他們一般就能玩玩vb,做程序時,去找一堆控件集成一個軟件。
    現在一種流行的說法是,中國軟件人才現在是一個橄欖型的人才結構,有大量的中等水平的程序員,而初級和高級程序員比較少。而我認為,現在中國絕大多數都是初級的程序員,中級程序員很少,高級的就更少了。所以,現在的人才結構是“方塔”形,這是一種斷層的不良結構。而真正成熟的軟件人才結構應該是平滑的三角形結構。這樣,初級、中級、高級程序員才能充分地各施所長。三種人才結構對比如圖1.1所示。
    圖1.1 三種人才結構對比
    1.2.2 初級程序員和高級程序員的區別
    一般對于一個問題,初級程序員和高級程序員考慮這個問題的方法絕對是不同的。比如,在初級程序員階段時,他會覺得vb也能做出應用來,且看起來也不錯。
    但到了中級程序員時,他可能就不會選擇vb了,可能會用mfc,這時,也能做出效果不錯的程序。
    到高級程序員時,他絕對不是首先選擇以上工具,vb也好,vc也好,這些都不是他考慮的問題。這時考慮的絕對是什么才是具有最快效率、最穩定性能的解決問題的方法。
    軟件和別的產品不同。比如,在軟件中要達到某個目標,有n種方法,但是在n種方法中,只有一種方法或兩種方法是最好的,其他的都很次。所以,要做一個好的系統,是很需要耐心的。如果沒有耐心,就不會有細活,有細活的東西才是好東西。我覺得做軟件是這樣,做任何事情也是這樣的,一定要投入。

    程序員到達最高境界的時候,想的就是“我就是程序,程序就是我”。這時候我要做一個軟件,不會有自己主觀的思路,而是以機器的思路來考慮問題,也就是說,就是以程序的思考方式來思考程序,而不是以我去設計程序的方式去思考程序。這一點如果不到比較高的層次是不能明白的。
    你設計程序不就是你思考問題,然后按自己的思路去做程序嗎?
    其實不是的。在我設計這個程序的時候,相當于我“鉆”入這個程序里面去了。這時候沒有我自己的任何思維,我的所有思維都是這個程序,它這步該怎么走,下步該怎么走,它可能會出現什么情況。我動這個部分的時候,別的部分是否要干擾,也許會動一發而牽全身,它們之間是怎么相互影響的?
    也只有到達這個境界,你的程序才能真正地寫好,絕對不是做個什么可視化。可視化本身就是“我去設計這個程序”,而真正的程序高手是“我就是程序”,這兩種方法絕對是不同的。比如,我要用vb去設計一個程序,和我本身就是一個程序的思維方式,是不一樣的。別人也許覺得操作系統很深奧,很復雜,其實,如果你到達高手狀態,你就是操作系統,你就能做任何程序。
    對待軟件要有一個全面的分析方法,光說理論是沒有用的。如果你沒有經過第一、第二、第三、第四這四個階段,則永遠到達不了高境界。因為空中樓閣的理論沒有用,而這些必須是一步一步地去做出來。
    一個高級程序員應該具備開放性思維,從里到外的所有的知識都能了解。然后,看到世界最新技術就能馬上掌握,馬上了解。實際上,技術到達最高的境界后,是沒有分別的。任何東西都是相通的,只要你到達這個境界以后,什么問題一看就能明白,一看就能抓住最核心的問題,最根本的根本,而不會被其他的枝葉或表象所迷惑,做到這一步后才算比較成功。
    從程序員本身來說,如果它到達這一步以后,他就已經形成了開闊的思維。他有這種開放性思維的話,他就能做戰略決策,這對他將來做任何事情都有好處。事實上,會做程序后,就會有一種分析問題的方法,學會怎么樣把問題的表象剖開,看到它的本質。這時你碰到任何具體的問題,只要給點時間,都能輕而易舉地解決。實際上,對開發計算機軟件來說,沒有什么做不了的軟件,所有的軟件都能做,只是看你有沒有時間,有沒有耐心,有沒有資金做支撐。
    這幾年,尤其是這兩三年,估計到2005年前,中國軟件這個行業里面大的軟件公司就能形成。現在就已經在形成,例如用友,它上市后,地位就更加穩固了。其他大的軟件企業會在這幾年內迅速長大。這時候,包括流通渠道、經銷商的渠道也會迅速長大。也就是說,到2005年以后,中國軟件這個行業的門檻比現在還要高很多,與美國不會有太大的差別。此時,中國軟件才真正體現出它的威力來。如果你是這些威力中的一員,就已經很厲害了。
    別人可能知道比爾?蓋茨是個談判的高手,是賣東西的高手,其實,比爾?蓋茨從根本上來說是個程序高手,這是他根本中的根本。他對所有的技術都非常敏感,一眼就看到本質,而且他本身也能做程序,時常在看程序。現在他不做董事長,而做首席設計師,這時他就更加接近程序的本質。因為他本身就有很開闊的思維,又深入到技術的本身,所以他就知道技術的方向。這對于一個公司,對他這樣的人來說,是非常重要的。
    如果他判斷錯誤一步,那公司以后再回頭就很難了。計算機的競爭是非常激烈的,不能走錯半步。很多公司以前看上去很火,后來就
    銷聲匿跡了,就是因為它走錯一步,然后就不行了。為什么它會走錯?因為他不了解技術的本質在哪里,技術的發展方向在哪里。
    比爾?蓋茨因為父母是學法律的,所以他本身就很能“侃”,很有說服力,而他又是做技術的,就非常清楚技術的方向在哪里,所以他才能把方向把握得很準確,公司越來越大。而別的公司只火一陣子,他卻火了還會再火。就算微軟再龐大,你如果不把握好軟件技術的最前沿,一樣也會玩完。就像intel時刻把握著cpu的最新技術,才能保證自己是行業老大。技術決定它的將來。

    所以,程序員要能達到這樣的目標,就要有非常強的耐心和非常好的機遇才有可能。事實上,現在的機會挺好的,2005年以前機會都非常大,以后機會會比較小。但是,如果有耐心的話,你還是會有機會的,機會都是出在耐心里。我記得有句話說“雄心的一半是耐心”,我認為雄心的三分之二都是耐心。如果你越有野心,你就越要有耐心,你的野心才有可能實現。如果你有野心而沒有耐心,那都是胡思亂想,別人一眼就能看穿。最后在競爭中,對手一眼就看到你的意圖,那你還有什么可競爭的?

    1.2.3 程序員是吃青春飯的嗎
    很多人都認為程序員是三十歲以前的職業,到了三十歲以后,就不應再做程序員了。現在的很多程序員也有這種想法,我覺得這種想法很不對。
    在20世紀80年代末到90年代初,那時軟件還沒有形成行業,程序員不能以此作為謀生的手段時,你必須轉行,因為你年輕的時候不用考慮吃飯的問題,天天“玩”都可以,但是以后就不可能了。
    據我了解,微軟里面的那些高手,幾乎都是四五十歲的,而且都是做底層的。他們是上世紀70年代就開始“玩”程序的,所以對于整個計算機,他們是太清楚了。現在有些人主觀臆斷地希望微軟第二天倒閉就好了,但那可能性太小了。因為那些程序員是從cpu是4004的時候開始,玩到現在奔騰iv,沒有哪一代東西他們沒有經歷過。
    你知道他們現在正在玩什么嗎?現在正在玩64位的cpu。你說你普通的程序員,有這個耐心嗎?沒有這個耐心,你絕對做不了,你也絕對做不了高手。他為什么能做?因為他不僅是玩過來的,而且他還非常有耐心,每一步技術他都跟得上,所以對他來說,沒有任何的難度和壓力。
    因為計算機技術沒有任何時候是突變的。它的今年和去年相差不會很大,但是回過頭來看三年以前的情況,和現在的距離就很大。所以說,如果你每年都跟著技術進步的話,你的壓力就很小,因為你時刻都能掌握最新的技術。但是,如果你落下來,別說十年,就是三年,你就趕不上了。
    如果你一旦趕不上,就會覺得非常吃力;如果你趕不上,你就會迷失方向;如果你迷失了方向,你就覺得計算機沒有味道,越做越沒勁。當你還只是有個思路的時候,別人的產品都做出來了,因為你的水平跟別人相差太遠,人家早就想到的問題,你現在才開始認識。水平越高,他就看得越遠,那么他的思維就越開闊;水平越低,想的問題就越窄。
    64位cpu是這個十年和下個十年最重要的技術之一,誰抓住這個機會,誰就能抓住未來賺錢的商機。cpu是英特爾設計的,對這一點他肯定清楚。舉例來說,如果從64位的角度來看現在的32位,就像從現在的角度去看dos。你說dos很復雜嗎?當你在dos年代的時候,你會覺得dos很復雜。你說現在的windows不夠復雜嗎?windows太復雜了,但是你到了64位的時候再去看windows,就如同現在看dos一樣。
    整個64位系統的平臺和思維方式、思路都比現在更開闊,打個比方說,現在的windows里面能開n個dos窗口,每個dos窗都能運行一個程序。到達64位的時候,操作系統事實上能做到開n個x86,開n個windows 98,然后再開n個windows 95都沒有問題,系統能做到這一步,甚至你的系統內開n個windows nt都沒有關系。這就是64位和32位的差別。所以,微軟的那些“老頭”,四、五十歲的那幾個做核心的人,現在正在玩這些東西。你說微軟的技術它能不先進嗎?是linux那幾個玩家能搞定的嗎?
    微軟的技術非常雄厚,世界計算機的最新技術絕對集中在這幾個人手里。而且這幾個人的思維模式非常開闊,誰都沒有意識到的東西他早就開始做了。現在64位的cpu都出來一二年了,你說有什么人去做這些應用嗎?沒有,有的就是那幾個unix廠商做好后給自己用的。

    所以,追求技術的最高境界的時候,實際上是沒有年齡限制的。對我來說,現在都三十三了,我從來沒有想過退出這行,我覺得我就能玩下去,一直玩到退休都沒有問題。我要時刻保持技術的最前端,這樣的話對我來說是不困難的,沒有任何累的感覺。
    很多人說做程序不是人干的事情,是非人的待遇。這樣,他們一旦成立一個公司,做出一點成績,在輝煌的時候馬上就考慮退出。因為他們太苦了,每天晚上熬夜,每天晚上燒了兩包煙還不夠,屋子里面簡直就缺氧了,好像還沒有解決問題。
    白天睡覺,晚上干活,那當然累死了,這是自己折騰自己。所以,做程序員一定要有一種正常的心態,就是說,你做程序的時候,不要把自己的生活搞得顛三倒四的。如果非得搞得晚上燒好多煙才行,這樣你肯定折騰不到三十歲,三十歲以后身體就差了。
    事實上,我基本上就沒有因為做程序而熬夜的。我只經歷過三次熬夜,一次是在學校的時候,1986年剛接觸計算機時,一天晚上跟一個同桌在計算機室內玩游戲,研究了半天,搞著搞著就到了天亮,這是第一次。然后在畢業之前,在286上做一個程序。還有一次就是超級解霸上市前,那時公司已吹得很大了,那天晚上沒法睡覺。
    一般來說,我也是十二點鐘睡覺,第二天七點就起了。所以說,只有具有正常的生活、正常的節奏,才有正常的心態來做程序員,這樣,你的思路才是正常的,只有正常的東西才能長久。搞疲勞戰或者是黑白顛倒,時間長久后就玩不轉了,玩著玩著就不想玩了。

    好的開始是成功的一半,本文首先會試圖告訴你什么是程序員?為什么要做這樣的程序?正確的入門方法是什么?
    程序員只有在理解了以上內容的基礎上,才能進一步更快地提高自身技能,這時候再開始程序的設計。其實,對一個軟件的開發者來說,真正重要的不在于這行代碼怎么寫,那些代碼應該怎么寫,關鍵是思路的問題,而思路事實上是經驗的積累。經驗是使你從最初的封閉的思維方式,到最后形成開放式的思維的一個過程。將我十幾年程序生涯中獲得的一些經驗告訴讀者,使大家少走彎路也是我想寫這本書的主要目的。
    1.1 程序≠軟件
    現在很多人以為程序就是軟件,軟件就是程序。事實上,軟件和程序在20世紀80年代時,還可以說是等同的,或者說,在非pc領域里它們可能還會是等同的,比如說某個嵌入式軟件領域,軟件和程序可能是等同的。但是,在pc這個領域內,現在的程序已不等于軟件了。這是什么意思呢?
    1. 軟件發展簡述
    在20世紀80年代的時候,pc剛誕生,這時國內還沒有幾個人會寫程序。那么,如果你寫個程序,別人就可以拿來用。這時候的程序就能產生價值,這個程序就直接等同于軟件。
    但軟件行業發展到現在,這里以中國的情況為例(美國在20世紀80年代,程序已經不等同于軟件了),程序也不等同于軟件了。因為現在會寫程序很容易,但是你的這個程序很難產生什么樣的商業意義,也不能產生什么價值,這就很難直接變成軟件。要使一個程序直接變成軟件,中間就面臨著很高的門檻問題。這個門檻問題來自于整個行業的形成。
    現在,你寫了一個程序以后,要面臨商業化的過程。你要宣傳,你要讓用戶知道,你要建立經銷渠道,可能你還要花很多的時間去說服別人用你的東西。這是程序到軟件的一個過程。這門檻已比較高了。
    我們在和國內的大經銷商的銷售渠道的人聊天時,他們的老板說,這幾年做軟件的門檻挺高的,如果你沒有五、六百萬做軟件,那是“玩”不起來的。我說:“你們就使門檻很高了。”他說:“那肯定是的。如果你寫個“爛”程序,明天你倒閉了,你的東西還占了我的庫房,我還不知道找誰退去呢。我的庫房是要錢的呀!現在的軟件又是那么多!”
    所以,如果你沒有一定的資產的話,經銷商都不理你。實際情況也是這樣的,如果你的公司比較小,且沒什么名氣,你的產品放到經銷商庫房,那么他最多給你暫收,產品銷不動的話,一般兩周絕對會退貨。因為現在經銷商可選擇的余地已很多了,所謂的軟件也已經很多了。而程序則更多,程序都想變成軟件,誰都說自己的是“金子”。但只有經受住用戶的檢驗,才能成為真正的“金子”。
    這就是美國為什么在20世紀90年代幾乎沒有什么新的軟件公司產生的原因。只是原來80年代的大的軟件公司互相兼并,我吞你,你吃我。但是,寫程序的人很多,美國的程序變軟件的門檻可能比我們還高,所以很多人寫了程序就丟在網上,就形成了共享軟件。
    2. 共享軟件
    共享軟件是避開商業渠道的一種方法。它避開了商業的門檻,因為這個行業的門檻發展很高以后就輕易進不去了。我寫個程序丟在網上,你下載就可以用,這時候程序又等于軟件。共享軟件是這樣產生的,是因為沒有辦法中的辦法。如果說程序直接等于軟件的話,誰也不會輕易把程序丟到網上去。
    開始做共享軟件的人并不認為做它能賺錢,只是后來用的人多了,有人付錢給他了。共享軟件使得程序和軟件的距離縮短了,但是它與商業軟件的距離會進一步拉大。商業軟件的功能和所要達到的目標就不是一個人能“玩”得起來的了。這時的軟件也已不是幾個人、一個小組就能做出來的了。這就是在美國新的軟件公司沒法產生的原因。比如netscape網景是在1995~1996年產生的新軟件公司,但是,兩三年后它就不見了。
    1.1.1 商業軟件門檻的形成
    1. 商業軟件門檻的形成
    商業軟件門檻的形成是整個行業發展的必然結果。任何一個行業初始階段時的門檻都非常低,但是,只要發展到一定的階段后,它的門檻就必然抬高。比如,現在國內生產小汽車很困難,但在20世紀50年代~60年代的時候,你裝4個輪子,再加上柴油機等就形成汽車。那時的萊特兄弟裝個螺旋槳,加兩個機翼,就能做飛機。整個行業還沒有形成的時候,絕對可以這樣做,但是,到整個行業形成時,你就做不了了。所有的行業都是這樣的。
    為什么網站一出來時那么多人去擠著做?這也是因為一開始的時候,看起來門檻非常低,人人都可以做。只要有一個服務器,架根網線,就能做網站。這個行業處于初始階段時,情況就是這樣的。但這個行業形成后,你就輕易地“玩”不了了。
    國內的軟件發展也是如此。國內的軟件自從軟件經銷商形成以后,這個行業才真正地形成。有沒有一個渠道是判斷一個行業是否形成的很重要的環節。任何一個行業都會有一個經銷渠道,如果渠道形成了,那么這個行業也就形成了。第一名的經銷商是1994年~1995年成立的,也就是說,中國軟件行業大概也就是在1995年形成的,至今才經歷8年時間的發展。
    有一種浮躁的思想認為,中國軟件產業應該很快就能趕上美國。美國軟件行業是上世紀80年代形成的,到現在已經發展了20多年了。中國軟件行業才8年,8年才是一個懵懂的小孩,20多歲是一個強壯的青年,那么他們的力量是不對等的。但也要看到,當8歲變成15歲的時候,它真正的能量才會反映出來。
    2. 軟件門檻對程序員的影響
    現在中國軟件行業正在形成。所以,現在做一個程序員一定要有耐心,因為現在已經不等于以前了。你一定要把所有的問題搞清楚,然后再去做程序。
    對于程序員來說,最好的工作環境是在現有的或者初始要成立的公司里面,這是最容易成功的。個人單槍匹馬闖天下已經很困難了。即使現在偶爾做兩個共享軟件放在網上能成名,但是也已經比較困難了。因為現在做軟件的人已經很多了。這也說明軟件已經不等于程序了,程序也不等于軟件。
    程序要變成軟件,這中間是一個商業化的過程。沒有門檻以前,它沒有這個商業過程,現在有這個行業了,它中間就有商業化的過程。這個商業的過程就不是一個人能“玩”的。
    如果你開始做某一類軟件的時候,別人已經做成了,這時你再決定花力氣去做,那么你就要花雙倍的力氣去趕上別人。
    現在的商業軟件往往是由很多模塊組成的,模塊是整個系統的一部分。個人要完整地寫一個商業系統幾乎是不可能的。軟件進入windows平臺后,它已經很復雜了,不像在dos的時候,你寫兩行程序就能賣,做個zip也能賣。事實上,美國的商業編譯器也不是一個人能“玩”的。現在你可能覺得它是很簡單的,甚至linux還帶了一個gcc,且源程序還在。你可以把它改一改,做個vc試一試,看它會有人用嗎?它能變成軟件嗎?即使你再做個界面,它也還是一個gcc,絕對不會成為visual c++那樣能商業化的軟件。
    可見,國外軟件行業的門檻要比中國的高很多了。我覺得我們中國即使再去做這樣的東西,也沒有多大的意義了。這個門檻你是追不過來的。不僅要花雙倍的力氣,而且在這么短的時間內,你還要完成別人已經完成過的工作,包括別人所做的測試工作。只有這樣,才能做到你的軟件與別人有競爭力,能與它做比較。
    1.1.2 認清自己的發展
    如果連以上認識都不清楚,很可能就以為去書店買一本mfc高手速成之類的書,編兩個程序就能成為軟件高手。就好像這些書是“黃金”,我學兩下,學會了vc、mfc,就能做一個軟件拿出去賣了。這種想法也不是不行,最后一定能行,但要有耐心,還要有機遇。機遇是從耐心中產生的,越有耐心,就越有機遇。你得非常努力,要花很多的精力,可能還要走很多的彎路。
    如果你是從mfc入手的,或是從vb入手的,則如要做出一個真正的能應用個人領域的通用軟件,就會走非常多的彎路。直接的捷徑絕對不是走這兩條路。這兩條路看起來很快,而且在很多公司里面確實需要這樣的東西,比如說我這家公司就是為另一個家公司做系統集成的,那我就需要這樣的東西,我不管你具體怎么實現,我只需要達到這個目標就行了。
    任何軟件的實現都會有n種方法,即使你是用最差的那種方法實現的,也沒有問題,最后它還是能運行。即使有問題,再改一改就是。但是,做通用軟件就不行了,通用是一對多,你做出來的軟件以后要面向全國,如果將來自由貿易通到香港也好,通到國外也好,整個產品能銷到全世界的話,這時候,通用軟件所有做的工作就不是這么簡單了。所以說,正確的入門方法就很關鍵。
    如果你僅僅只是想混口飯吃,找個工作,可能教你成為mfc的高手之類的書對你就足夠了。但是,如果你想做一個很好的軟件,不僅能滿足你謀一碗飯吃,還能使你揚名,最后你的軟件還能成為很多人用,甚至你還想把它作為一個事業去經營,那么這第一步就非常關鍵。這時就絕對不能找一本mfc或找一本vb的書學兩下就行,而是要從最底層開始做起,從最基本做起。
    1.2 高手是怎樣練成的
    1.2.1 高手成長的六個階段
    程序員怎樣才能達到編程的最高境界?最高境界絕對不是你去編兩行代碼,或者是幾分鐘能寫幾行代碼,或者是用什么所謂的可視化工具產生最少的代碼這些工作,這都不是真正的高手境界。即使是這樣的高手,那也都是無知者的自封。
    我認為,一個程序員的成長可分為如下六個階段。
    ? 第一階段
    此階段主要是能熟練地使用某種語言。這就相當于練武中的套路和架式這些表面的東西。
    ? 第二階段
    此階段能精通基于某種平臺的接口(例如我們現在常用的win 32的api函數)以及所對應語言的自身的庫函數。到達這個階段后,也就相當于可以進行真實散打對練了,可以真正地在實踐中做些應用。
    ? 第三階段
    此階段能深入地了解某個平臺系統的底層,已經具有了初級的內功的能力,也就是“手中有劍,心中無劍”。
    ? 第四階級
    此階段能直接在平臺上進行比較深層次的開發。基本上,能達到這個層次就可以說是進入了高層次。這時進入了高級內功的修煉。比如能進行vxd或操作系統的內核的修改。
    這時已經不再有語言的束縛,語言只是一種工具,即使要用自己不會的語言進行開發,也只是簡單地熟悉一下,就手到擒來,完全不像是第一階段的時候學習語言的那種情況。一般來說,從第三階段過渡到第四階段是比較困難的。為什么會難呢?這就是因為很多人的思想變不過來。
    ? 第五階級
    此階段就已經不再局限于簡單的技術上的問題了,而是能從全局上把握和設計一個比較大的系統體系結構,從內核到外層界面。可以說是“手中無劍,心中有劍”。到了這個階段以后,能對市面上的任何軟件進行剖析,并能按自己的要求進行設計,就算是ms word這樣的大型軟件,只要有充足的時間,也一定會設計出來。
    ? 第六階級
    此階段也是最高的境界,達到“無招勝有招”。這時候,任何問題就純粹變成了一個思路的問題,不是用什么代碼就能表示的。也就是“手中無劍,心中也無劍”。
    此時,對于練功的人來說,他已不用再去學什么少林拳,只是在旁看一下少林拳的對戰,就能把此拳拿來就用。這就是真正的大師級的人物。這時,win 32或linux在你眼里是沒有什么差別的。
    每一個階段再向上發展時都要按一定的方法。第一、第二個階段通過自學就可以完成,只要多用心去研究,耐心地去學習。
    要想從第二個階段過渡到第三個階段,就要有一個好的學習環境。例如有一個高手帶領或公司里有一個好的練手環境。經過二、三年的積累就能達到第三個階段。但是,有些人到達第三個階段后,常常就很難有境界上的突破了。他們這時會產生一種觀念,認為軟件無非如此,認為自己已無所不能。其實,這時如果遇到大的或難些的軟件,他們往往還是無從下手。
    現在我們國家大部分程序員都是在第二、三級之間。他們大多都是通過自學成才的,不過這樣的程序員一般在軟件公司也能獨當一面,完成一些軟件的模塊。
    但是,也還有一大堆處在第一階段的程序員,他們一般就能玩玩vb,做程序時,去找一堆控件集成一個軟件。
    現在一種流行的說法是,中國軟件人才現在是一個橄欖型的人才結構,有大量的中等水平的程序員,而初級和高級程序員比較少。而我認為,現在中國絕大多數都是初級的程序員,中級程序員很少,高級的就更少了。所以,現在的人才結構是“方塔”形,這是一種斷層的不良結構。而真正成熟的軟件人才結構應該是平滑的三角形結構。這樣,初級、中級、高級程序員才能充分地各施所長。三種人才結構對比如圖1.1所示。
    圖1.1 三種人才結構對比
    1.2.2 初級程序員和高級程序員的區別
    一般對于一個問題,初級程序員和高級程序員考慮這個問題的方法絕對是不同的。比如,在初級程序員階段時,他會覺得vb也能做出應用來,且看起來也不錯。
    但到了中級程序員時,他可能就不會選擇vb了,可能會用mfc,這時,也能做出效果不錯的程序。
    到高級程序員時,他絕對不是首先選擇以上工具,vb也好,vc也好,這些都不是他考慮的問題。這時考慮的絕對是什么才是具有最快效率、最穩定性能的解決問題的方法。
    軟件和別的產品不同。比如,在軟件中要達到某個目標,有n種方法,但是在n種方法中,只有一種方法或兩種方法是最好的,其他的都很次。所以,要做一個好的系統,是很需要耐心的。如果沒有耐心,就不會有細活,有細活的東西才是好東西。我覺得做軟件是這樣,做任何事情也是這樣的,一定要投入。

    程序員到達最高境界的時候,想的就是“我就是程序,程序就是我”。這時候我要做一個軟件,不會有自己主觀的思路,而是以機器的思路來考慮問題,也就是說,就是以程序的思考方式來思考程序,而不是以我去設計程序的方式去思考程序。這一點如果不到比較高的層次是不能明白的。
    你設計程序不就是你思考問題,然后按自己的思路去做程序嗎?
    其實不是的。在我設計這個程序的時候,相當于我“鉆”入這個程序里面去了。這時候沒有我自己的任何思維,我的所有思維都是這個程序,它這步該怎么走,下步該怎么走,它可能會出現什么情況。我動這個部分的時候,別的部分是否要干擾,也許會動一發而牽全身,它們之間是怎么相互影響的?
    也只有到達這個境界,你的程序才能真正地寫好,絕對不是做個什么可視化。可視化本身就是“我去設計這個程序”,而真正的程序高手是“我就是程序”,這兩種方法絕對是不同的。比如,我要用vb去設計一個程序,和我本身就是一個程序的思維方式,是不一樣的。別人也許覺得操作系統很深奧,很復雜,其實,如果你到達高手狀態,你就是操作系統,你就能做任何程序。
    對待軟件要有一個全面的分析方法,光說理論是沒有用的。如果你沒有經過第一、第二、第三、第四這四個階段,則永遠到達不了高境界。因為空中樓閣的理論沒有用,而這些必須是一步一步地去做出來。
    一個高級程序員應該具備開放性思維,從里到外的所有的知識都能了解。然后,看到世界最新技術就能馬上掌握,馬上了解。實際上,技術到達最高的境界后,是沒有分別的。任何東西都是相通的,只要你到達這個境界以后,什么問題一看就能明白,一看就能抓住最核心的問題,最根本的根本,而不會被其他的枝葉或表象所迷惑,做到這一步后才算比較成功。
    從程序員本身來說,如果它到達這一步以后,他就已經形成了開闊的思維。他有這種開放性思維的話,他就能做戰略決策,這對他將來做任何事情都有好處。事實上,會做程序后,就會有一種分析問題的方法,學會怎么樣把問題的表象剖開,看到它的本質。這時你碰到任何具體的問題,只要給點時間,都能輕而易舉地解決。實際上,對開發計算機軟件來說,沒有什么做不了的軟件,所有的軟件都能做,只是看你有沒有時間,有沒有耐心,有沒有資金做支撐。
    這幾年,尤其是這兩三年,估計到2005年前,中國軟件這個行業里面大的軟件公司就能形成。現在就已經在形成,例如用友,它上市后,地位就更加穩固了。其他大的軟件企業會在這幾年內迅速長大。這時候,包括流通渠道、經銷商的渠道也會迅速長大。也就是說,到2005年以后,中國軟件這個行業的門檻比現在還要高很多,與美國不會有太大的差別。此時,中國軟件才真正體現出它的威力來。如果你是這些威力中的一員,就已經很厲害了。
    別人可能知道比爾?蓋茨是個談判的高手,是賣東西的高手,其實,比爾?蓋茨從根本上來說是個程序高手,這是他根本中的根本。他對所有的技術都非常敏感,一眼就看到本質,而且他本身也能做程序,時常在看程序。現在他不做董事長,而做首席設計師,這時他就更加接近程序的本質。因為他本身就有很開闊的思維,又深入到技術的本身,所以他就知道技術的方向。這對于一個公司,對他這樣的人來說,是非常重要的。
    如果他判斷錯誤一步,那公司以后再回頭就很難了。計算機的競爭是非常激烈的,不能走錯半步。很多公司以前看上去很火,后來就
    銷聲匿跡了,就是因為它走錯一步,然后就不行了。為什么它會走錯?因為他不了解技術的本質在哪里,技術的發展方向在哪里。
    比爾?蓋茨因為父母是學法律的,所以他本身就很能“侃”,很有說服力,而他又是做技術的,就非常清楚技術的方向在哪里,所以他才能把方向把握得很準確,公司越來越大。而別的公司只火一陣子,他卻火了還會再火。就算微軟再龐大,你如果不把握好軟件技術的最前沿,一樣也會玩完。就像intel時刻把握著cpu的最新技術,才能保證自己是行業老大。技術決定它的將來。

    所以,程序員要能達到這樣的目標,就要有非常強的耐心和非常好的機遇才有可能。事實上,現在的機會挺好的,2005年以前機會都非常大,以后機會會比較小。但是,如果有耐心的話,你還是會有機會的,機會都是出在耐心里。我記得有句話說“雄心的一半是耐心”,我認為雄心的三分之二都是耐心。如果你越有野心,你就越要有耐心,你的野心才有可能實現。如果你有野心而沒有耐心,那都是胡思亂想,別人一眼就能看穿。最后在競爭中,對手一眼就看到你的意圖,那你還有什么可競爭的?

    1.2.3 程序員是吃青春飯的嗎
    很多人都認為程序員是三十歲以前的職業,到了三十歲以后,就不應再做程序員了。現在的很多程序員也有這種想法,我覺得這種想法很不對。
    在20世紀80年代末到90年代初,那時軟件還沒有形成行業,程序員不能以此作為謀生的手段時,你必須轉行,因為你年輕的時候不用考慮吃飯的問題,天天“玩”都可以,但是以后就不可能了。
    據我了解,微軟里面的那些高手,幾乎都是四五十歲的,而且都是做底層的。他們是上世紀70年代就開始“玩”程序的,所以對于整個計算機,他們是太清楚了。現在有些人主觀臆斷地希望微軟第二天倒閉就好了,但那可能性太小了。因為那些程序員是從cpu是4004的時候開始,玩到現在奔騰iv,沒有哪一代東西他們沒有經歷過。
    你知道他們現在正在玩什么嗎?現在正在玩64位的cpu。你說你普通的程序員,有這個耐心嗎?沒有這個耐心,你絕對做不了,你也絕對做不了高手。他為什么能做?因為他不僅是玩過來的,而且他還非常有耐心,每一步技術他都跟得上,所以對他來說,沒有任何的難度和壓力。
    因為計算機技術沒有任何時候是突變的。它的今年和去年相差不會很大,但是回過頭來看三年以前的情況,和現在的距離就很大。所以說,如果你每年都跟著技術進步的話,你的壓力就很小,因為你時刻都能掌握最新的技術。但是,如果你落下來,別說十年,就是三年,你就趕不上了。
    如果你一旦趕不上,就會覺得非常吃力;如果你趕不上,你就會迷失方向;如果你迷失了方向,你就覺得計算機沒有味道,越做越沒勁。當你還只是有個思路的時候,別人的產品都做出來了,因為你的水平跟別人相差太遠,人家早就想到的問題,你現在才開始認識。水平越高,他就看得越遠,那么他的思維就越開闊;水平越低,想的問題就越窄。
    64位cpu是這個十年和下個十年最重要的技術之一,誰抓住這個機會,誰就能抓住未來賺錢的商機。cpu是英特爾設計的,對這一點他肯定清楚。舉例來說,如果從64位的角度來看現在的32位,就像從現在的角度去看dos。你說dos很復雜嗎?當你在dos年代的時候,你會覺得dos很復雜。你說現在的windows不夠復雜嗎?windows太復雜了,但是你到了64位的時候再去看windows,就如同現在看dos一樣。
    整個64位系統的平臺和思維方式、思路都比現在更開闊,打個比方說,現在的windows里面能開n個dos窗口,每個dos窗都能運行一個程序。到達64位的時候,操作系統事實上能做到開n個x86,開n個windows 98,然后再開n個windows 95都沒有問題,系統能做到這一步,甚至你的系統內開n個windows nt都沒有關系。這就是64位和32位的差別。所以,微軟的那些“老頭”,四、五十歲的那幾個做核心的人,現在正在玩這些東西。你說微軟的技術它能不先進嗎?是linux那幾個玩家能搞定的嗎?
    微軟的技術非常雄厚,世界計算機的最新技術絕對集中在這幾個人手里。而且這幾個人的思維模式非常開闊,誰都沒有意識到的東西他早就開始做了。現在64位的cpu都出來一二年了,你說有什么人去做這些應用嗎?沒有,有的就是那幾個unix廠商做好后給自己用的。

    所以,追求技術的最高境界的時候,實際上是沒有年齡限制的。對我來說,現在都三十三了,我從來沒有想過退出這行,我覺得我就能玩下去,一直玩到退休都沒有問題。我要時刻保持技術的最前端,這樣的話對我來說是不困難的,沒有任何累的感覺。
    很多人說做程序不是人干的事情,是非人的待遇。這樣,他們一旦成立一個公司,做出一點成績,在輝煌的時候馬上就考慮退出。因為他們太苦了,每天晚上熬夜,每天晚上燒了兩包煙還不夠,屋子里面簡直就缺氧了,好像還沒有解決問題。
    白天睡覺,晚上干活,那當然累死了,這是自己折騰自己。所以,做程序員一定要有一種正常的心態,就是說,你做程序的時候,不要把自己的生活搞得顛三倒四的。如果非得搞得晚上燒好多煙才行,這樣你肯定折騰不到三十歲,三十歲以后身體就差了。
    事實上,我基本上就沒有因為做程序而熬夜的。我只經歷過三次熬夜,一次是在學校的時候,1986年剛接觸計算機時,一天晚上跟一個同桌在計算機室內玩游戲,研究了半天,搞著搞著就到了天亮,這是第一次。然后在畢業之前,在286上做一個程序。還有一次就是超級解霸上市前,那時公司已吹得很大了,那天晚上沒法睡覺。
    一般來說,我也是十二點鐘睡覺,第二天七點就起了。所以說,只有具有正常的生活、正常的節奏,才有正常的心態來做程序員,這樣,你的思路才是正常的,只有正常的東西才能長久。搞疲勞戰或者是黑白顛倒,時間長久后就玩不轉了,玩著玩著就不想玩了。

    posted on 2005-10-21 17:32 Steve 閱讀(253) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲精品无码久久久久A片苍井空| 亚洲欧洲无卡二区视頻| 日本亚洲欧美色视频在线播放| 最近最新高清免费中文字幕 | 国产精品亚洲成在人线| 色婷婷亚洲十月十月色天| 最新久久免费视频| 成人永久免费高清| 亚洲黄色片在线观看| 一级毛片免费毛片毛片| 日韩亚洲国产二区| h视频免费高清在线观看| 国产成人毛片亚洲精品| a级在线免费观看| 亚洲欧洲日韩国产综合在线二区| 久久免费美女视频| 亚洲第一精品电影网| 国产免费黄色无码视频| 久久国产亚洲电影天堂| 成在线人直播免费视频| 亚洲伊人成无码综合网| 日本视频在线观看永久免费| 亚洲一区二区三区电影| 一个人看www在线高清免费看| 456亚洲人成影院在线观| 国产成人啪精品视频免费网| 一级做a爰片久久毛片免费陪 | 亚洲电影免费在线观看| 国产亚洲大尺度无码无码专线 | 成人午夜免费福利| 国产精品亚洲AV三区| 亚洲精品无码你懂的网站| 亚洲一卡2卡三卡4卡无卡下载| 国产网站在线免费观看| 国产高潮久久免费观看| 久久丫精品国产亚洲av不卡| 成人毛片免费观看视频在线| 又大又硬又粗又黄的视频免费看| 日韩亚洲AV无码一区二区不卡| 免费理论片51人人看电影| www在线观看播放免费视频日本|