最近和幾個同道談論了一些程式,架構,軟體的問題,大家身在此山中,繞來繞去,始終沒有能有明確清晰的結論。我把一些想法寫在這裡,供專家指正。
幾乎所有程式員都知道“程式 = 資料結構+演算法”這句名言。但是在實際的學習和工作中,也有不少人產生了疑問。 例如:
1) 我寫了二叉樹的周遊演算法實現,在這裡,二叉樹是資料結構,周遊的實現細節是演算法。我寫的C 程式就是結果。 但是我這個程式有什麼用呢? 在Java 中,似乎沒有指標,那我可以不必瞭解二叉樹麼?
2) 我找到了工作,成了一名程式員, 但是我發現所有的演算法別人已經實現了,我只要調用就可以了。似乎我公司的軟體和資料結構,演算法的關係都不大。那我當初辛辛苦苦學習的資料結構和演算法有用麼? 如何區分一個好的程式員和不好的程式員呢?
3) 我來到軟體公司上班後,發現公司以前同事寫的程式真是垃圾,根本無法維護。我要推翻重寫!後來一個老員工笑嘻嘻地告訴我,我們現在看到的程式,就是去年的新員工憤怒地推翻重寫之後的結果,大家反映還沒有以前的版本好用呢。
那麼我們軟體行業賴以生存的“軟體”, 我們程式員用來安生立命的“程式”是什麼?
程式,在這裡指的是來源程式,就是一行一行的代碼。仔細看過去,它們的確是建立在資料結構上的一些演算法。光有代碼還是不行的,這些一行一行的代碼不會 自己運行,得有人編譯成機器能懂的目標代碼,而編譯不僅僅是 cc 和 link 命令, 對於一個複雜的軟體,我們要用各種檔案來描述各個程式檔案之間的依賴關係,編譯參數,連結參數,等等。這些都是軟體的構建。
軟體團隊的各個人員每天都在不斷地修改各種原始碼,怎麼保證軟體在不斷的修改中能保證品質,不至於崩潰? 有些時候,我們要為某個需求寫一些特殊功能,然後不久要把這些功能再合并回主要版本。這是原始程式碼控制的問題 – 有時候也叫組態管理。 我們還有一系列的工具和程式來保證程式的正確性,這些工具和程式本身應該更正確,才能保證別的軟體的品質,對麼? 這種保證品質的工作叫 Quality Assurance, 也叫軟體測試 – Testing.
一個軟體要有人買,就得先找到顧客,顧客有各種需求,有些靠譜,有些不靠譜,我們要把這些靠譜的需求都實現了,一群人要從需求分析,設計,實現(寫資料結構和演算法),測試,到最後發布軟體。這一個過程就是軟體項目的管理。
一個好的軟體,即使功能和同類軟體區別不大,但是會讓人感覺到非常好用。這就是軟體的“使用者體驗”特別好。 使用者體驗和資料結構,演算法沒什麼關係,但是很多非常成功的軟體就贏在這個方面。
有了軟體,我們就要賣出去賺錢,有很多種賺錢的方式,有立馬交錢買斷,也有“先試用再交錢”,也有“免費用,看廣告”,也有“免費用,程式也不是我 寫的,如果有問題,付我錢,我就來諮詢…”當然還有在使用者不知道的情況下就安裝了軟體,然後使用者怎麼也擺脫不掉。最近還出現了 A公司要挾使用者必須卸載 B公司的軟體, 然後才能運行... 等等。這些都是軟體賺錢的商業模式。 有些做法是合法的, 有些看似合情合理, 但是不怎麼合法. 有些不合理, 但是也沒有法。 在相關法律完善之前, 軟體行業還有一個行規, 軟體工程師應該有一個職業道德來約束 IT 人的行為。
上面的這些和軟體開發活動(構建管理,原始程式碼控制,軟體測試,專案管理)是軟體工程的核心部分。 廣泛意義上的軟體工程也包括使用者體驗 (User Experience) 等。 所以,我覺得:
軟體 = 程式 + 軟體工程
弄清楚這一點,是進行所有和程式,軟體,架構等相關討論的基礎。一個擴充的推論是:
軟體企業 = 軟體 + 商業模式
不消說,商業模式也會影響軟體的需求,例如有人要開發社會網路軟體,同時提供豐富的API 讓別人能在上面開發,這個對API的支援會成為這個軟體一個重要的特徵。
回到本文開頭的疑惑,答案也很清楚 - 程式是基本功,但是除了程式之外,軟體工程決定了軟體的命運。
軟體產業還是一個相對年輕的產業,軟體工程的概念是1969年第一次提出來的。下面用曆史更長的航空產業做一個比較。
100個小孩裡有99 個疊過紙飛機,像下面這樣:
"設計/製造紙飛機" 的過程, 看起來技術含量不高, 但是也有很多竅門。 有些小孩在飛行前, 會用嘴對著紙飛機哈一口氣, 這裡面也許有深奧的道理, 也許只是迷信。 在跟著這些飛機奔跑,歡呼的時候,這些小孩心裡一定有“我長大了要在天上飛”的想法。紙飛機,航模飛機和真飛機一樣,都體現了基本的理論。 (我不懂這些理論,我就不多談“空氣動力學”之類的了)。
多年以後,很多人還有“在天上飛”的想法。有人居然就實現了:
這是美聯社的報道 這位哥們說 – 當你夏天躺在草地上的時候,你看白雲飄過,你有沒有幻想能跳到雲朵上面? 所以他有一天忍不住就要實現他的幻想。 BEND, Ore. (AP) - Last weekend, Bend gas station owner Kent Couch settled down in his lawn chair with some drinks and snacks - and a parachute. Attached to the lawn chair were 105 balloons of various colors, each 4 feet around. Bundled together, the balloons rise three stories high. Couch carried a global positioning system device, a two-way radio, a digital camcorder and a cell phone. He also had instruments to measure his altitude and speed and about four plastic bags holding five gallons of water each to act as a ballast - he could turn a spigot, release water and rise. Destination: Idaho. Nearly nine hours later, Couch was short of Idaho. But he was 193 miles from home, in a farmer's field near Union, having crossed much of Oregon at 11,000 feet and higher. Why would Couch try such a flight? "When you're a little kid and you're holding a helium balloon, it has to cross your mind," he told the Bend Bulletin. "When you're laying in the grass on a summer day, and you see the clouds, you wish you could jump on them," he told the Bulletin. "This is as close as you can come to jumping on them. It's just like that." |
和有些人看似“瘋狂”的想法比起來,有些人不但瘋狂,而且瘋狂了好幾年。 在1903 年冬天,萊特(Wright) 兄弟經過幾年的努力,在寒風凜冽的海灘上試飛了他們的飛機。 它飛了36.5 米,曆時12秒。試飛之後,大家還來不及在飛機面前合影留念,一陣狂風吹來,把飛機吹了幾個跟頭,大部分重要組件都毀壞了。
現在,航空業已經成為了一個幾百億美元市場的工業,上百萬的人每天在這個行業工作 (飛機設計, 製造, 銷售, 輔助裝置的設計, 製造, 銷售, 民用航空的服務, 安全, 地勤, 飛機場的設計, 建設, 維護),更多的人每天都享受到它帶來的便利,當然還有種種苦惱。
扯了這麼多,這個和程式,軟體,軟體工程,有什麼關係呢,我們可以做一個類比:
航空 |
軟體 |
影響(如果成功/失敗會如何) |
玩具,基本知識: 紙飛機/航模 |
資料結構/演算法 |
影響自己,會增加/減少對這類知識的興趣。 這類知識也有比賽,如航模比賽,程式演算法比賽,但是比賽之後,這些演算法高手寫的程式的可維護性怎樣? 有人會拿著程式去發布為商業軟體麼? |
業餘愛好者的嘗試: 氣球+沙灘椅升空 |
用Javascript, Ruby 寫寫網站 |
氣球升空成功 - 當地晚報會報道。 程式能跑起來,自己部落格寫寫。失敗之後,很快會撿起新的愛好。 |
先行者的探索: 萊特兄弟飛行 |
軟體業的創新 |
總結經驗,即使飛機只飛了36米,明白人還是看到了劃時代的意義。 很多軟體原型也是這樣。 失敗之後,如果還有錢的話,還要繼續創新。 |
成熟的工業: 飛機製造業 民航 |
Taobao, Ali-pay, Win7 |
影響一個公司,一個行業,波及到相關的行業和人員。 |
在成熟的航空工業中,一個飛機發動機從構思到最後運行,不知道要經曆過多少人, 多少工序,多少流程,多少相關知識的驗證。 我們無法想象,如果最後某個商用型號的發動機在飛行時發現問題,最初的設計師會自己爬到引擎中敲敲打打,然後鑽出來說,“繼續飛吧,我搞定了”。 然而, 在軟體行業中, 很多軟體工程師往往以做這樣的事而自豪。
我們平時在部落格和論壇上討論各種和程式相關的問題,是上面表格中哪一個層次上談論“程式”呢? IT 專業的大學畢業生去找工作的時候說, 我懂軟體工程, 我畫了很多圖, 寫了很多文檔, 最後得了很高的分數... 這些同學是真的懂軟體工程?
擴充閱讀:
1.Bop的豆瓣首頁:http://book.douban.com/subject/3004255/
2.互動網購買連結:http://www.china-pub.com/38070
3.“《編程之美》,IT人求職面試必讀”連結:
http://www.google.com.hk/search?complete=1&hl=zh-CN&newwindow=1&q=編程之美+-+微軟技術面試心得+鄒欣&meta=&aq=f&oq=