高質(zhì)量C++/C編程指南(一)

字號:

前言
    軟件質(zhì)量是被大多數(shù)程序員掛在嘴上而不是放在心上的東西!
    除了完全外行和真正的編程高手外,初讀本書,你先的感受將是驚慌:“哇!我以前捏造的C++/C程序怎么會有那么多的毛???”
    別難過,作者只不過比你早幾年、多幾次驚慌而已。
    請花一兩個小時認真閱讀這本百頁經(jīng)書,你將會獲益匪淺,這是前面N-1個讀者的建議。
    一、編程老手與高手的誤區(qū)
    自從計算機問世以來,程序設(shè)計就成了令人羨慕的職業(yè),程序員在受人寵愛之后容易發(fā)展成為毛病特多卻常能自我臭美的群體。
    如今在 Internet 上流傳的“真正”的程序員據(jù)說是這樣的:
    (1) 真正的程序員沒有進度表,只有討好領(lǐng)導(dǎo)的馬*精才有進度表,真正的程序員會讓領(lǐng)導(dǎo)提心吊膽。
    (2) 真正的程序員不寫使用說明書,用戶應(yīng)當自己去猜想程序的功能。
    (3) 真正的程序員幾乎不寫代碼的注釋,如果注釋很難寫,它理所當然也很難讀。
    (4) 真正的程序員不畫流程圖,原始人和文盲才會干這事。
    (5) 真正的程序員不看參考手冊,新手和膽小鬼才會看。
    (6) 真正的程序員不寫文檔也不需要文檔,只有看不懂程序的笨蛋才用文檔。
    (7) 真正的程序員認為自己比用戶更明白用戶需要什么。
    (8) 真正的程序員不接受團隊開發(fā)的理念,除非他自己是頭頭。
    (9) 真正的程序員的程序不會在第就正確運行,但是他們愿意守著機器進行若干個 30 小時的調(diào)試改錯。
    (10) 真正的程序員不會在上午 9:00 到下午 5:00 之間工作,如果你看到他在上午 9:00 工作,這表明他從昨晚一直干到現(xiàn)在。
    ……
    具備上述特征越多,越顯得水平高,資格老。所以別奇怪,程序員的很多缺點竟然可以被當作優(yōu)點來欣賞。就象在武俠小說中,那些獨來獨往、不受約束且?guī)c邪氣的高手令人崇拜。我曾經(jīng)也這樣信奉,并且希望自己成為那樣的“真正”的程序員,結(jié)果沒有得到好下場。
    我從讀大學(xué)到博士畢業(yè)十年來一直勤奮好學(xué),累計編寫了數(shù)十萬行 C++/C 代碼。有這樣的苦勞和疲勞,我應(yīng)該稱得上是編程老手了吧?
    我開發(fā)的軟件都與科研相關(guān)(集成電路 CAD 和 3D 圖形學(xué)領(lǐng)域),動輒數(shù)萬行程序,技術(shù)復(fù)雜,難度頗高。這些軟件頻頻獲獎,有一個軟件獲得首屆中國大學(xué)生電腦大賽軟件展示一等獎。在 1995 年開發(fā)的一套圖形軟件庫到 2000 年還有人買。羅列出這些“業(yè)績”,可以說明我算得上是編程高手了吧?
    可惜這種個人感覺不等于事實。
    讀博期間我曾用一年時間開發(fā)了一個近 10 萬行 C++ 代碼的 3D 圖形軟件產(chǎn)品,我內(nèi)心得意表面謙虛地向一位真正的軟件高手請教。他雖然從未涉足過 3D 圖形領(lǐng)域,卻在幾十分鐘內(nèi)指出該軟件多處重大設(shè)計錯誤。讓人感覺那套軟件是用紙糊的華麗衣服,扯一下掉一塊,戳一下破個洞。我目瞪口呆地意識到這套軟件毫無實用價值,一年的心血白化了,并且害死了自己的軟件公司。
    人的頓悟通常發(fā)生在心痛的時刻,在沮喪和心痛之后,我作了深刻反省,“面壁”半年,重新溫習(xí)軟件設(shè)計的基礎(chǔ)知識。補修“內(nèi)功”之后,又覺得腰板硬了起來。博士畢業(yè)前半年,我曾到微軟中國研究院找工作,接受微軟公司一位資深軟件工程師的面試。他讓我寫函數(shù) strcpy 的代碼。
    太容易了吧?
    錯!
    這么一個小不點的函數(shù),他從三個方面考查:
    ( 1 )編程風格;
    ( 2 )出錯處理;
    ( 3 )算法復(fù)雜度分析(用于提高性能)。
    在大學(xué)里從來沒有人如此嚴格地考查過我的程序。我化了半個小時,修改了數(shù)次,他還不盡滿意,讓我回家好好琢磨。我精神抖擻地進“考場”,大汗淋漓地出“考場”。這“高手”當?shù)靡蔡C囊了。我又好好地反省了。
    我把反省后的心得體會寫成文章放在網(wǎng)上傳閱,引起了不少軟件開發(fā)人員的共鳴。我因此有幸和國產(chǎn)大型 IT 企業(yè)如華為、上海貝爾、中興等公司的同志們廣泛交流。大家認為提高質(zhì)量與生產(chǎn)率是軟件工程要解決的核心問題。高質(zhì)量程序設(shè)計是非常重要的環(huán)節(jié),畢竟軟件是靠編程來實現(xiàn)的。
    我們心目中的老手們和高手們能否編寫出高質(zhì)量的程序來?
    不見得都能!
    就我的經(jīng)歷與閱歷來看,國內(nèi)大學(xué)的計算機教育壓根就沒有灌輸高質(zhì)量程序設(shè)計的觀念,教師們和學(xué)生們也很少自覺關(guān)心軟件的質(zhì)量。勤奮好學(xué)的程序員長期在低質(zhì)量的程序堆中滾爬,吃盡苦頭之后才有一些心得體會,長進極慢,我就是一例。
    現(xiàn)在國內(nèi) IT 企業(yè)擁有學(xué)士、碩士、博士文憑的軟件開發(fā)人員比比皆是,但他們在接受大學(xué)教育時就“先天不足”,豈能一到企業(yè)就突然實現(xiàn)質(zhì)的飛躍。試問有多少軟件開發(fā)人員對正確性、健壯性、可靠性、效率、易用性、可讀性(可理解性)、可擴展性、可復(fù)用性、兼容性、可移植性等質(zhì)量屬性了如指掌?并且能在實踐中運用自如??!案哔|(zhì)量”可不是干活小心點就能實現(xiàn)的!
    我們有充分的理由疑慮:
    ( 1 )編程老手可能會長期用隱含錯誤的方式編程(習(xí)慣成自然),發(fā)現(xiàn)毛病后都不愿相信那是真的!
    ( 2 )編程高手可以在某一領(lǐng)域?qū)懗鰳O有水平的代碼,但未必能從全局把握軟件質(zhì)量的方方面面。
    事實證明如此。我到上海貝爾工作一年來,陸續(xù)面試或測試過近百名“新”“老”程序員的編程技能,質(zhì)量合格率大約是 10 %。很少有人能夠?qū)懗鐾耆腺|(zhì)量要求的 if 語句,很多程序員對指針、內(nèi)存管理一知半解, …… 。
    領(lǐng)導(dǎo)們不敢相信這是真的。我做過現(xiàn)場試驗:有部門新進 14 名碩士生,在開歡迎會之前對他們進行“ C++/C 編程技能”摸底考試。我問大家試題難不難?所有的人都回答不難。結(jié)果沒有一個人及格,有半數(shù)人得零分。競爭對手公司的朋友們也做過試驗,同樣一敗涂地。
    真的不是我“心狠手辣”或者要求過高,而是很多軟件開發(fā)人員對自己的要求不夠高。
    要知道華為、上海貝爾、中興等公司的員工素質(zhì)在國內(nèi) IT 企業(yè)中是比較前列的,倘若他們的編程質(zhì)量都如此差的話,我們怎么敢期望中小公司拿出高質(zhì)量的軟件呢?連程序都編不好,還談什么振興民族軟件產(chǎn)業(yè),豈不胡扯。
    我打算定義編程老手和編程高手,請您別見笑。
    定義 1 :能長期穩(wěn)定地編寫出高質(zhì)量程序的程序員稱為編程老手。
    定義 2 :能長期穩(wěn)定地編寫出高難度、高質(zhì)量程序的程序員稱為編程高手。
    根據(jù)上述定義,馬上得到第一推論:我既不是高手也算不上是老手。
    在寫此書前,我閱讀了不少程序設(shè)計方面的英文著作,越看越羞慚。因為發(fā)現(xiàn)自己連編程基本技能都未能全面掌握,頂多算是二流水平,還好意思談什么老手和高手。希望和我一樣在國內(nèi)土生土長的程序員朋友們能夠做到:
    ( 1 )知錯就改;
    ( 2 )經(jīng)常溫故而知新;
    ( 3 )堅持學(xué)習(xí),天天向上。
    二、本書導(dǎo)讀
    首先請做附錄B的C++/C試題(不要看答案),考查自己的編程質(zhì)量究竟如何。然后參照答案嚴格打分。
    ( 1)如果你只得了幾十分,請不要聲張,也不要太難過。編程質(zhì)量差往往是由于不良習(xí)慣造成的,與人的智力、能力沒有多大關(guān)系,還是有藥可救的。成績越差,可以進步的空間就越大,中國不就是在落后中趕超發(fā)達資本主義國家嗎?只要你能下決心改掉不良的編程習(xí)慣,第二次考試就能及格了。
    ( 2)如果你考及格了,表明你的技術(shù)基礎(chǔ)不錯,希望你能虛心學(xué)習(xí)、不斷進步。如果你還沒有找到合適的工作單位,不妨到上海貝爾試一試。
    ( 3)如果你考出85分以上的好成績,你有義務(wù)和資格為你所在的團隊作“C++/C編程”培訓(xùn)。希望你能和我們多多交流、相互促進。半年前我曾經(jīng)發(fā)現(xiàn)一顆好苗子,就把他挖到我們小組來。
    ( 4)如果你在沒有任何提示的情況下考了滿分,希望你能收我做你的徒弟。
    編程考試結(jié)束后,請閱讀本書的正文。
    本書第一章至第六章主要論述C++/C編程風格。難度不高,但是細節(jié)比較多。別小看了,提高質(zhì)量就是要從這些點點滴滴做起。世上不存在好的編程風格,一切因需求而定。團隊開發(fā)講究風格一致,如果制定了大家認可的編程風格,那么所有組員都要遵守。如果讀者覺得本書的編程風格比較合你的工作,那么就采用它,不要只看不做。人在小時候說話發(fā)音不準,寫字潦草,如果不改正,總有后悔的時候。編程也是同樣道理。
    第七章至第十一章是專題論述,技術(shù)難度比較高,看書時要積極思考。特別是第七章“內(nèi)存管理”,讀了并不表示懂了,懂了并不表示就能正確使用。有一位同事看了第七章后覺得“野指針”寫得不錯,與我切磋了一把。可是過了兩周,他告訴我,他忙了兩天追查出一個Bug,想不到又是“野指針”出問題,只好重讀第七章。