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