第一篇:程序員培養(yǎng)心得
中專一年級的第二學期,我決定選擇電腦作為我的主攻方向。最開始我選擇計算機等級考試作為檢驗自己能力的一種手段。計算機等級考試只是一種能力的證明。它不與任何職稱、待遇掛上勾。二年級的時候,我通過了全國計算機二級考試;同時這一年,我決定選擇軟件開發(fā)作為我今后的道路。三年級的時候,我通過了全國三級(B)。
后來我和老虎了解到國家有一個軟件水平與資格考試。它由是軟件行業(yè)最權(quán)威的考試,通過率極低,當時每年的通過率僅在10%左右。不知現(xiàn)在有沒有變化。并且它的通過與職稱評定相結(jié)合。也就是現(xiàn)在常說的以考代評。當時軟件水平考試通過的級別與職稱的關(guān)系是這樣子的:
初級程序員 技術(shù)員 ;程序員 助理工程師;高級程序員 工程師;系統(tǒng)分析員 高級工程師
通過全國三級(B)以后,我們原打算再報考全國四級的。但了解到軟件水平考試后,我們決定放棄全國四級,參加軟件水平考試。--正是由于它極低的通過率與相關(guān)的待遇吸引了我們?nèi)ヌ魬?zhàn)。
買來大綱,研究一番后,我們決定先考程序員。也就是相當于助理工程師一級。那時我們剛18歲,也不知天高地厚。買來幾本參考書,一陣亂啃。然而老天呀,沒有任何人給我們上過計算機課,編譯原理里的那些什么形式語言/制導(dǎo)翻譯、數(shù)據(jù)庫原理中的什么模型定義/函數(shù)依賴,一開始就把我給弄得昏頭轉(zhuǎn)向。但這關(guān)總要挺過的。于是我把書看過一遍又一遍,書都翻爛。周六周日就到省圖書館去參考大學計算機專業(yè)的教材,竟然后來都看懂了。理論性的東西十分好辦。只有理解了,要背要記很容易。
軟件水平考試真正有難度的地方是下午場的考試。因為上午考基礎(chǔ)知識,大家只要死記硬背就沒有什么大問題。下午場考程序設(shè)計,題型比較靈活,難度也比較大。那時我已有一定的C語言基礎(chǔ),也用C寫過一些小程序??荚囈蟮囊恍?shù)據(jù)結(jié)構(gòu)實現(xiàn)、算法求解之類的問題覺得比較好對付。例如用遞歸算法找個什么數(shù)列呀,如何用回溯法解決狼怎樣才能抓到小羊呀,還有什么猴兒吃桃、皇后走棋、查找排序之類的問題,也挺容易的實現(xiàn)了。對于下午場,我很有把握。
進考場。上午考得還算順利。一些涉及高數(shù)和英語的分數(shù)估計會丟掉不少。下午場的考試同樣考得很辛苦,那些指向指針的指針七指八指,指得我心慌意亂。不過總的感覺還好。出考場,一對答案,有幾成把握能通過。上午場可能比較險點,但估計問題不大;下午場通過肯定是鐵定了的。
哪知考試成績一出來,頓時讓我傻了眼。上午場竟然考得奇好,50多分(總分75分),下午場則慘不忍睹,才40多分。老虎和我也差不多,都是輸在了下午場。
第二年,我們決定放棄程序員,直接考高級程序員??偨Y(jié)經(jīng)驗,還是在于自己的基礎(chǔ)不牢固,準備不充分。這一次,我制訂了一個詳細的安排表,根據(jù)計劃安排進度。遇到難題今時求證。不可否認,高級程序員比程序員要難多了。所面對的問題了不再是解決猴兒吃桃那么簡單。那段時日時間本來就比較緊張。記得有次晚上躺在床上點燭看書,看得迷迷糊糊之際,蠟燭倒了下來,把書給燒著了。幸虧發(fā)現(xiàn)得早。--否則后果不堪設(shè)想。我把理論
知識搞定后,然后花大力氣對付下午場的程序設(shè)計。CASL匯編、測試用例、軟件工程方法、C程序的實例應(yīng)用,我一個一個地來啃。我沒有基礎(chǔ),沒有人教,甚至連一個可以問的人也沒有。學得還是比較艱難和辛苦。但是,每當想起我們現(xiàn)在為之付出的努力對將來是值的時,我們便又恢復(fù)了信心。我們利用一切可利用的時間備戰(zhàn)。我甚至想方設(shè)法通過各種途徑弄來歷年試卷,一一進行分析。--那個時候,互聯(lián)網(wǎng)還剛剛起步,不象現(xiàn)在這樣要查個資料,通過網(wǎng)絡(luò)很方便地就搞定了。
同時我們還報了四門自考。我以高程為主。高程在10月12日考試。自考在10月28日開始。這一兩個月的努力終于得到了回報:高程和自考全部通過了!
很多朋友經(jīng)常寫信問我怎樣應(yīng)付程序員/高級程序員的考試。就我的經(jīng)驗來說,有這么幾點:
1.掌握好的學習方法,合理安排時間。--這是最重要的。
2.基礎(chǔ)理論要吃透。對于程序設(shè)計,一定要多動手,多實踐。
3.一定要找出以前的試卷,進行分析了解。
我想,不論什么事,只要認準了一個目標,然后朝之不懈地努力,就一定實現(xiàn)??荚囀沁@樣,干事業(yè)是這樣,甚至追求愛情也是這樣。這個道理,每個人都懂。關(guān)鍵在于實際行動
第二篇:SAS程序員高級程序員考試心得
摘自:http://forum.yorkbbs.ca/showtopic-611095.aspx forcode:一個牛人,34天把初級高級sas認證全過了
SAS程序員/高級程序員考試心得
一、為什么要考SAS程序員/高級程序員
我選擇考SAS主要是因為三個原因:其一,我讀的研究導(dǎo)向的金融碩士有一門課需要用到SAS,我想先熟悉一下;其二,一位在Hedge Fund工作的前任校友,在介紹求職經(jīng)驗談到SAS時說The much the better;其三,網(wǎng)上大家的評論都是:SAS是在實業(yè)界使用最廣泛,雇主最認可的企業(yè)級統(tǒng)計軟件。那么是不是這樣呢,我做了一點研究工作:我打開網(wǎng)站,登錄后點擊JobSearch,分別輸入各個統(tǒng)計相關(guān)軟件的名稱,從而得到和統(tǒng)計軟件相匹配的工作的數(shù)目如下:
1.SAS: Jobs 1-25 of 2989 matches.2.Stata: Jobs 1-25 of 40 matches.3.SPSS: Jobs 1-25 of 768 matches.4.SPlus: Jobs 1-25 of 26 matches.5.Eviews: Jobs 1-15 of 15 matches.6.Matlab: Jobs 1-25 of 1043 matches
7.tsp: Jobs 1-25 of 76 matches.8.limdep: Jobs 1-3 of 3 matches.9.Minitab: Jobs 1-25 of 224 matches.10.Statistica: Jobs 1-6 of 6 matches.11.Excel: Jobs 1-25 of thousands.由上可見,Excel是使用最廣泛的,這也很合理。然后就是SAS和Matlab,其他軟件在某個特定領(lǐng)域可能有較廣泛的應(yīng)用,但是在實業(yè)界的雇 主認可方面就要差一些。Stata很強大,也很好用(比SAS易學易用),很多搞研究的朋友都用它。但在實業(yè)界的認可實在是低了一些。但是有一點要注意,以上只是對SAS的雇主認可程度,不是對SAS認證的認可程度。我感覺這個認證知道的人是不多的。不過得到這個認證應(yīng)該能夠向雇主證明自己在SAS應(yīng)用方 面達到了專業(yè)水準,這就足夠了。
我覺得一個東西有用,而且對于自己的職業(yè),自己的job market niche有幫助,就有必要掌握它。古人云,工欲善其事,必先利其器。又有俗語說,磨刀不誤砍柴工。能夠先系統(tǒng)地把一個軟件學習一下,在應(yīng)用的時候就能節(jié) 省大量的時間和精力,也為工作提供更大的靈活性。通過考試以后,事實也證明了我的設(shè)想,對SAS的各個模塊特別是Macro和Proc SQL的掌握(都是Advanced Programming的內(nèi)容),給我以后的research project帶來很多便利。我只需要所有的輸入,然后一切都在SAS中解決,而沒有學過SAS的同學就非常吃虧,一邊上專業(yè)課,一邊學SAS。很多 data manipulation一復(fù)雜,就傻眼了。只好或者手動操作,或者在Excel做運算,再導(dǎo)入到SAS中進行分析。
潛在的陷阱
SAS程序員/高級程序員考試涉及的是純編程的內(nèi)容,完全不涉及SAS的各個功能強大的模塊。雇主很可能不了解這一點,我們就有可能獲得更多的機 會。但是,自己不要陷入這個陷阱。對雇主所要求的功能模塊要熟悉,不要等到要用的時候說,對不起,雖然我是SAS程序員/高級程序員,但是我沒有學過這個 模塊。
SAS程序員/高級程序員考試并不難,認真看資料,認真看Practice Exam,仔細記筆記。大家投入合理的時間,應(yīng)該都可以通過。此外,我考SAS是在2006年的夏天,對于資料的時效性以及SAS公司可能有的改動,大家 要注意(這個考試不是太熱門,改動即使有也不會太大)。
二、SAS程序員考試心得
我先在網(wǎng)上查了一下SAS認證的信息,看了一下別人的考試心得。主要的網(wǎng)站有:
SAS Certification Home :
等相關(guān)網(wǎng)址查看購買方法。
全部準備完畢,花了約14天時間。然后去考試,考試費用同樣5折,是US $75(我和SAS聯(lián)系,得知上次使用的Promotional Code還沒有過期,這次在Prometric上注冊考試時可以繼續(xù)使用)。考試也沒有什么問題。對于SAS Advanced Programming, 只要認真看了資料4、5、6,考試一定過。
歡迎大家討論。
因為我家里不能上網(wǎng),沒能及時回復(fù),請諒解。我覺得你不要太著急,如果你覺得SAS對你有幫助,多花
點時間準備也不影響大局。況且現(xiàn)在在網(wǎng)上預(yù)約考試很方 便,你完全可以準備好了再預(yù)約。我都是復(fù)習得差不多了才預(yù)約兩三天以后的考試。文中的資料1、2、3都是在SASOR網(wǎng)站上下載的。
培訓教材下載網(wǎng)址:
Summaries and Quizzes of SAS Online Tutor for Base Programming:
http://sasor.feoh.net/modules.php?name=Downloads&d_op=getit&lid=2
Base Programming Practice Exam
http://sasor.feoh.net/modules.php?name=Forums&file=viewtopic&t=1404&highlight=Practice+Exam&sid=ff7e5483bd780a7cba125f74db103706
我記得我還下載到過答案和解釋的,不過現(xiàn)在找不到了。
希望這些能夠?qū)δ阌兴鶐椭?/p>
Alternative Download address
little sas book:
http://newdisk.cn/pick.aspx?code=902832243
SAS online tutor base:
http://newdisk.cn/pick.aspx?code=1951014386
SAS online tutor advance:
http://newdisk.cn/pick.aspx?code=370540326
第三篇:一個C++程序員的心得
六年前,我剛熱戀“面向?qū)ο蟆保∣bject-Oriented)時,一口氣記住了近十個定義。六年后,我從幾十萬行程序中滾爬出來準備寫點心得體會時,卻無法解釋什么是“面向?qū)ο蟆保拖笳f不清楚什么是數(shù)學那樣。軟件工程中的時髦術(shù)語“面向?qū)ο蠓治觥焙汀懊嫦驅(qū)ο笤O(shè)計”,通常是針對“需求分析”和“系統(tǒng)設(shè)計”環(huán)節(jié)的?!懊嫦?qū)ο蟆庇袔状髮W派,就象如來佛、上帝和真主用各自的方式定義了這個世界,并留下一堆經(jīng)書來解釋這個世界。
有些學者建議這樣找“對象”:分析一個句子的語法,找出名詞和動詞,名詞就是對象,動詞則是對象的方法(即函數(shù))。
當年國民黨的文人為了對抗毛澤東的《沁園春·雪》,特意請清朝遺老們寫了一些對仗工整的詩,請蔣介石過目。老蔣看了氣得大罵:“娘希匹,全都有一股棺材里腐尸的氣味?!蔽铱戳藥浊ы摰能浖こ藤Y料,終于發(fā)現(xiàn)自己有些“弱智”,無法理解“面向?qū)ο蟆钡睦碚摚瑫r醒悟到“編程是硬道理。”
面向?qū)ο蟪绦蛟O(shè)計語言很多,如Smalltalk、Ada、Eiffel、Object Pascal、Visual Basic、C++等等。C++語言最討人喜歡,因為它兼容C 語言,并且具備C 語言的性能。近幾年,一種叫Java 的純面向?qū)ο笳Z言紅極一時,不少人叫喊著要用Java 革C++的命。我認為Java 好比是C++的外甥,雖然不是直接遺傳的,但也幾分象樣。外甥在舅舅身上玩耍時灑了一泡尿,倆人不該為此而爭吵。
關(guān)于C++程序設(shè)計的書藉非常多,本章不講C++的語法,只講一些小小的編程道理。如果我能早幾年明白這些小道理,就可以大大改善數(shù)十萬行程序的質(zhì)量了。
1.C++面向?qū)ο蟪绦蛟O(shè)計的重要概念
早期革命影片里有這樣一個角色,他說:“我是黨代表,我代表黨,我就是黨。”后來他給同志們帶來了災(zāi)難。
會用C++的程序員一定懂得面向?qū)ο蟪绦蛟O(shè)計嗎?
不會用C++的程序員一定不懂得面向?qū)ο蟪绦蛟O(shè)計嗎?
兩者都未必。就象壞蛋入黨后未必能成為好人,好人不入黨未必變成壞蛋那樣。
我不怕觸犯眾怒地說句大話:“C++沒有高手,C 語言才有高手?!痹谟肅 和C++編程8年之后,我深深地遺憾自己不是C 語言的高手,更遺憾沒有人點撥我如何進行面向?qū)ο蟪绦蛟O(shè)計。我和很多C++程序員一樣,在享用到C++語法的好處時便以為自己已經(jīng)明白了面向?qū)ο蟪绦蛟O(shè)計。就象擠掉牙膏賣牙膏皮那樣,真是暴殄天物呀。
人們不懂拼音也會講普通話,如果懂得拼音則會把普通話講得更好。不懂面向?qū)ο蟪绦蛟O(shè)計也可以用C++編程,如果懂得面向?qū)ο蟪绦蛟O(shè)計則會把C++程序編得更好。本節(jié)講述三個非?;A(chǔ)的概念:“類與對象”、“繼承與組合”、“虛函數(shù)與多態(tài)”。理解這些概念,有助于提高程序的質(zhì)量,特別是提高“可復(fù)用性”與“可擴充性”。1.1 類與對象
對象(Object)是類(Class)的一個實例(Instance)。如果將對象比作房子,那么類就是房子的設(shè)計圖紙。所以面向?qū)ο蟪绦蛟O(shè)計的重點是類的設(shè)計,而不是對象的設(shè)計。類可以將數(shù)據(jù)和函數(shù)封裝在一起,其中函數(shù)表示了類的行為(或稱服務(wù))。類提供關(guān)鍵字public、protected 和private 用于聲明哪些數(shù)據(jù)和函數(shù)是公有的、受保護的或者是私有的。
這樣可以達到信息隱藏的目的,即讓類僅僅公開必須要讓外界知道的內(nèi)容,而隱藏其它一切內(nèi)容。我們不可以濫用類的封裝功能,不要把它當成火鍋,什么東西都往里扔。
類的設(shè)計是以數(shù)據(jù)為中心,還是以行為為中心?
主張“以數(shù)據(jù)為中心”的那一派人關(guān)注類的內(nèi)部數(shù)據(jù)結(jié)構(gòu),他們習慣上將private 類型的數(shù)據(jù)寫在前面,而將public 類型的函數(shù)寫在后面,如表8.1(a)所示。
主張“以行為為中心”的那一派人關(guān)注類應(yīng)該提供什么樣的服務(wù)和接口,他們習慣上將public 類型的函數(shù)寫在前面,而將private 類型的數(shù)據(jù)寫在后面,如表8.1(b)所示。
很多C++教課書主張在設(shè)計類時“以數(shù)據(jù)為中心”。我堅持并且建議讀者在設(shè)計類時“以行為為中心”,即首先考慮類應(yīng)該提供什么樣的函數(shù)。Microsoft 公司的COM 規(guī)范的核心是接口設(shè)計,COM 的接口就相當于類的公有函數(shù)[Rogerson 1999]。在程序設(shè)計方面,咱們不要懷疑Microsoft 公司的風格。
設(shè)計孤立的類是比較容易的,難的是正確設(shè)計基類及其派生類。因為有些程序員搞不清楚“繼承”(Inheritance)、“組合”(Composition)、“多態(tài)”(Polymorphism)這些概念。2回頂部 1.2 繼承與組合
如果A 是基類,B 是A 的派生類,那么B 將繼承A 的數(shù)據(jù)和函數(shù)。示例程序如下: class A { public: void Func1(void);void Func2(void);};class B : public A { public: void Func3(void);void Func4(void);};// Example main(){ B b;// B的一個對象
b.Func1();// B 從A 繼承了函數(shù)Func1 b.Func2();// B 從A 繼承了函數(shù)Func2 b.Func3();b.Func4();}
這個簡單的示例程序說明了一個事實:C++的“繼承”特性可以提高程序的可復(fù)用性。正因為“繼承”太有用、太容易用,才要防止亂用“繼承”。我們要給“繼承”立一些使用規(guī)則:
一、如果類A 和類B 毫不相關(guān),不可以為了使B 的功能更多些而讓B 繼承A 的功能。
不要覺得“不吃白不吃”,讓一個好端端的健壯青年無緣無故地吃人參補身體。
二、如果類B 有必要使用A 的功能,則要分兩種情況考慮:
(1)若在邏輯上B 是A 的“一種”(a kind of),則允許B 繼承A 的功能。如男人(Man)是人(Human)的一種,男孩(Boy)是男人的一種。那么類Man 可以從類Human 派生,類Boy 可以從類Man 派生。示例程序如下: class Human { ? };class Man : public Human { ? };class Boy : public Man { ? };
(2)若在邏輯上A 是B 的“一部分”(a part of),則不允許B 繼承A 的功能,而是要用A和其它東西組合出B。例如眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是頭(Head)的一部分,所以類Head 應(yīng)該由類Eye、Nose、Mouth、Ear 組合而成,不是派生而成。示例程序如下: class Eye { public: void Look(void);};class Nose { public: void Smell(void);};class Mouth { public: void Eat(void);};class Ear { public: void Listen(void);};// 正確的設(shè)計,冗長的程序 class Head { public: void Look(void){ m_eye.Look();} void Smell(void){ m_nose.Smell();} void Eat(void){ m_mouth.Eat();} void Listen(void){ m_ear.Listen();} private: Eye m_eye;Nose m_nose;Mouth m_mouth;Ear m_ear;};
如果允許Head 從Eye、Nose、Mouth、Ear 派生而成,那么Head 將自動具有Look、Smell、Eat、Listen 這些功能: // 錯誤的設(shè)計
class Head : public Eye, public Nose, public Mouth, public Ear { };
上述程序十分簡短并且運行正確,但是這種設(shè)計卻是錯誤的。很多程序員經(jīng)不起“繼承”的誘惑而犯下設(shè)計錯誤。
一只公雞使勁地追打一只剛下了蛋的母雞,你知道為什么嗎?
因為母雞下了鴨蛋。
本書3.3 節(jié)講過“運行正確”的程序不見得就是高質(zhì)量的程序,此處就是一個例證。3回頂部 1.3 虛函數(shù)與多態(tài)
除了繼承外,C++的另一個優(yōu)良特性是支持多態(tài),即允許將派生類的對象當作基類的對象使用。如果A 是基類,B 和C 是A 的派生類,多態(tài)函數(shù)Test 的參數(shù)是A 的 指針。那么Test 函數(shù)可以引用A、B、C 的對象。示例程序如下: class A { public: void Func1(void);};void Test(A *a){ a->Func1();} class B : public A { ? };class C : public A { ? };// Example main(){ A a;B b;C c;Test(&a);Test(&b);Test(&c);};
以上程序看不出“多態(tài)”有什么價值,加上虛函數(shù)和抽象基類后,“多態(tài)”的威力就顯示出來了。
C++用關(guān)鍵字virtual 來聲明一個函數(shù)為虛函數(shù),派生類的虛函數(shù)將(override)基類對應(yīng)的虛函數(shù)的功能。示例程序如下: class A { public: virtual void Func1(void){ cout<< “This is A::Func1 n”} };void Test(A *a){ a->Func1();} class B : public A { public: virtual void Func1(void){ cout<< “This is B::Func1 n”} };class C : public A { public: virtual void Func1(void){ cout<< “This is C::Func1 n”} };// Example main(){ A a;B b;C c;Test(&a);// 輸出This is A::Func1 Test(&b);// 輸出This is B::Func1 Test(&c);// 輸出This is C::Func1 };
如果基類A 定義如下: class A { public: virtual void Func1(void)=0;};
那么函數(shù)Func1 叫作純虛函數(shù),含有純虛函數(shù)的類叫作抽象基類。抽象基類只管定義純虛函數(shù)的形式,具體的功能由派生類實現(xiàn)。
結(jié)合“抽象基類”和“多態(tài)”有如下突出優(yōu)點:
(1)應(yīng)用程序不必為每一個派生類編寫功能調(diào)用,只需要對抽象基類進行處理即可。這一招叫“以不變應(yīng)萬變”,可以大大提高程序的可復(fù)用性(這是接口設(shè)計的復(fù)用,而不是代碼實現(xiàn)的復(fù)用)。
(2)派生類的功能可以被基類指針引用,這叫向后兼容,可以提高程序的可擴充性和可維護性。以前寫的程序可以被將來寫的程序調(diào)用不足為奇,但是將來寫的程序可以被以前寫的程序調(diào)用那可了不起。4回頂部 良好的編程風格
內(nèi)功深厚的武林高手出招往往平淡無奇。同理,編程高手也不會用奇門怪招寫程序。良好的編程風格是產(chǎn)生高質(zhì)量程序的前提。2.1 命名約定
有不少人編程時用拼音給函數(shù)或變量命名,這樣做并不能說明你很愛國,卻會讓用此程序的人迷糊(很多南方人不懂拼音,我就不懂)。程序中的英文一般不會太復(fù)雜,用詞要力求準確。匈牙利命名法是Microsoft 公司倡導(dǎo)的[Maguire 1993],雖然很煩瑣,但用習慣了也就成了自然。沒有人強迫你采用何種命名法,但有一點應(yīng)該做到:自己的程序命名必須一致。
以下是我編程時采用的命名約定:
(1)宏定義用大寫字母加下劃線表示,如MAX_LENGTH;
(2)函數(shù)用大寫字母開頭的單詞組合而成,如SetName, GetName ;
(3)指針變量加前綴p,如*pNode ;
(4)BOOL 變量加前綴b,如bFlag ;
(5)int 變量加前綴i,如iWidth ;
(6)float 變量加前綴f,如fWidth ;
(7)double 變量加前綴d,如dWidth ;
(8)字符串變量加前綴str,如strName ;
(9)枚舉變量加前綴e,如eDrawMode ;
(10)類的成員變量加前綴m_,如m_strName, m_iWidth ;
對于int, float, double 型的變量,如果變量名的含義十分明顯,則不加前綴,避免煩瑣。如用于循環(huán)的int 型變量i,j,k ;float 型的三維坐標(x,y,z)等。2.2 使用斷言
程序一般分為Debug 版本和Release 版本,Debug 版本用于內(nèi)部調(diào)試,Release 版本發(fā)行給用戶使用。斷言assert 是僅在Debug 版本起作用的宏,它用于檢查“不應(yīng)該”發(fā)生的情況。以下是一個內(nèi)存復(fù)制程序,在運行過程中,如果assert 的參數(shù)為假,那么程序就會中止(一般地還會出現(xiàn)提示對話,說明在什么地方引發(fā)了assert)。//復(fù)制不重疊的內(nèi)存塊
void memcpy(void *pvTo, void *pvFrom, size_t size){ void *pbTo =(byte *)pvTo;void *pbFrom =(byte *)pvFrom;assert(pvTo!= NULL && pvFrom!= NULL);while(size--> 0)*pbTo + + = *pbFrom + +;return(pvTo);}
assert 不是一個倉促拼湊起來的宏,為了不在程序的Debug 版本和Release 版本引起差別,assert 不應(yīng)該產(chǎn)生任何副作用。所以assert 不是函數(shù),而是宏。程序員可以把assert 看成一個在任何系統(tǒng)狀態(tài)下都可以安全使用的無害測試手段。
很少有比跟蹤到程序的斷言,卻不知道該斷言的作用更讓人沮喪的事了。你化了很多時間,不是為了排除錯誤,而只是為了弄清楚這個錯誤到底是什么。有的時候,程序員偶爾還會設(shè)計出有錯誤的斷言。所以如果搞不清楚斷言檢查的是什么,就很難判斷錯誤是出現(xiàn)在程序中,還是出現(xiàn)在斷言中。幸運的是這個問題很好解決,只要加上清晰的注釋即可。這本是顯而易見的事情,可是很少有程序員這樣做。這好比一個人在森林里,看到樹上釘著一塊“危險”的大牌子。但危險到底是什么?樹要倒?有廢井?有野獸?除非告訴人們“危險”是什么,否則這個警告牌難以起到積極有效的作用。難以理解的斷言常常被程序員忽略,甚至被刪除。[Maguire 1993]
以下是使用斷言的幾個原則:
(1)使用斷言捕捉不應(yīng)該發(fā)生的非法情況。不要混淆非法情況與錯誤情況之間的區(qū)別,后者是必然存在的并且是一定要作出處理的。
(2)使用斷言對函數(shù)的參數(shù)進行確認。
(3)在編寫函數(shù)時,要進行反復(fù)的考查,并且自問:“我打算做哪些假定?”一旦確定了的
假定,就要使用斷言對假定進行檢查。
(4)一般教科書都鼓勵程序員們進行防錯性的程序設(shè)計,但要記住這種編程風格會隱瞞錯誤。當進行防錯性編程時,如果“不可能發(fā)生”的事情的確發(fā)生了,則要使用斷言進行報警。5回頂部
2.3 new、delete 與指針
在C++中,操作符new 用于申請內(nèi)存,操作符delete 用于釋放內(nèi)存。在C 語言中,函數(shù)malloc 用于申請內(nèi)存,函數(shù)free 用于釋放內(nèi) 存。由于C++兼容C 語言,所以new、delete、malloc、free 都有可能一起使用。new 能比malloc 干更多的事,它可以申請對象的內(nèi)存,而malloc 不能。C++和C 語言中的指針威猛無比,用錯了會帶來災(zāi)難。對于一個指針p,如果是用new申請的內(nèi)存,則必須用delete 而不能用free 來釋放。如果是用malloc 申請的內(nèi)存,則必須用free 而不能用delete 來釋放。在用delete 或用free 釋放p 所指的內(nèi)存后,應(yīng)該馬上顯式地將p 置為NULL,以防下次使用p 時發(fā)生錯誤。示例程序如下: void Test(void){ float *p;p = new float[100];if(p==NULL)return;?// do something delete p;p=NULL;// 良好的編程風格 // 可以繼續(xù)使用p p = new float[500];if(p==NULL)return;?// do something else delete p;p=NULL;}
我們還要預(yù)防“野指針”,“野指針”是指向“垃圾”內(nèi)存的指針,主要成因有兩種:
(1)指針沒有初始化。
(2)指針指向已經(jīng)釋放的內(nèi)存,這種情況最讓人防不勝防,示例程序如下: class A { public: void Func(void){?} };void Test(void){ A *p;{ A a;p = &a;// 注意a 的生命期 } p->Func();// p 是“野指針”,程序出錯 } 2.4 使用const
在定義一個常量時,const 比#define 更加靈活。用const 定義的常量含有數(shù)據(jù)類型,該常量可以參與邏輯運算。例如: const int LENGTH = 100;// LENGTH 是int 類型 const float MAX=100;// MAX 是float 類型 #define LENGTH 100 // LENGTH 無類型 #define MAX 100 // MAX 無類型
除了能定義常量外,const 還有兩個“保護”功能:
一、強制保護函數(shù)的參數(shù)值不發(fā)生變化
以下程序中,函數(shù)f 不會改變輸入?yún)?shù)name 的值,但是函數(shù)g 和h 都有可能改變name的值。void f(String s);// pass by value void g(String &s);// pass by referance void h(String *s);// pass by pointer main(){ String name=“Dog”;f(name);// name 的值不會改變 g(name);// name 的值可能改變 h(name);// name 的值可能改變 }
對于一個函數(shù)而言,如果其‘&’或‘*’類型的參數(shù)只作輸入用,不作輸出用,那么應(yīng)當在該參數(shù)前加上const,以確保函數(shù)的代碼不會改變該參數(shù)的值(如果改變了該參數(shù)的值,編譯器會出現(xiàn)錯誤警告)。因此上述程序中的函數(shù)g 和h 應(yīng)該定義成: void g(const String &s);void h(const String *s);
二、強制保護類的成員函數(shù)不改變?nèi)魏螖?shù)據(jù)成員的值
以下程序中,類stack 的成員函數(shù)Count 僅用于計數(shù),為了確保Count 不改變類中的任何數(shù)據(jù)成員的值,應(yīng)將函數(shù)Count 定義成const 類型。class Stack { public: void push(int elem);void pop(void);int Count(void)const;// const 類型的函數(shù) private: int num;int data[100];};int Stack::Count(void)const { ++ num;// 編譯錯誤,num 值發(fā)生變化 pop();// 編譯錯誤,pop 將改變成員變量的值 return num;} 6回頂部 2.5 其它建議
(1)不要編寫一條過分復(fù)雜的語句,緊湊的C++/C 代碼并不見到能得到高效率的機器代碼,卻會降低程序的可理解性,程序出錯誤的幾率也會提高。
(2)不要編寫集多種功能于一身的函數(shù),在函數(shù)的返回值中,不要將正常值和錯誤標志混在一起。
(3)不要將BOOL 值TRUE 和FALSE 對應(yīng)于1 和0 進行編程。大多數(shù)編程語言將FALSE定義為0,任何非0 值都是TRUE。Visual C++將TRUE 定義為1,而Visual Basic 則將TRUE定義為-1。示例程序如下: BOOL flag;?
if(flag){ // do something } // 正確的用法 if(flag==TRUE){ // do something } // 危險的用法 if(flag==1){ // do something } // 危險的用法 if(!flag){ // do something } // 正確的用法
if(flag==FALSE){ // do something } // 不合理的用法 if(flag==0){ // do something } // 不合理的用法
(4)小心不要將“= =”寫成“=”,編譯器不會自動發(fā)現(xiàn)這種錯誤。
(5)不要將123 寫成0123,后者是八進制的數(shù)值。
(6)將自己經(jīng)常犯的編程錯誤記錄下來,制成表格貼在計算機旁邊。小結(jié)
C++/C 程序設(shè)計如同少林寺的武功一樣博大精深,我練了8 年,大概只學到二三成。所以無論什么時候,都不要覺得自己的編程水平天下第一,看到別人好的技術(shù)和風格,要虛心學習。本章的內(nèi)容少得可憐,就象口渴時只給你一顆楊梅吃,你一定不過癮。我借花獻佛,推薦一本好書:Marshall P.Cline 著的《C++ FAQs》[Cline 1995]。你看了后一定會贊不絕口。會編寫C++/C 程序,不要因此得意洋洋,這只是程序員基本的技能要求而已。如果把系統(tǒng)分析和系統(tǒng)設(shè)計比作“戰(zhàn)略決策”,那么編程充其量只是“戰(zhàn)術(shù)”。如果指揮官是個大笨蛋,士兵再勇敢也會吃敗仗。所以我們程序員不要只把眼光盯在程序上,要讓自己博學多才。我們應(yīng)該向北京胡同里的小孩們學習,他們小小年紀就能指點江山,評論世界大事。
第四篇:SAS程序員高級程序員考試心得
摘自:http://forum.yorkbbs.ca/showtopic-611095.aspx forcode:一個牛人,34天把初級高級sas認證全過了
SAS程序員/高級程序員考試心得
一、為什么要考SAS程序員/高級程序員
我選擇考SAS主要是因為三個原因:其一,我讀的研究導(dǎo)向的金融碩士有一門課需要用到SAS,我想先熟悉一下;其二,一位在Hedge Fund工作的前任校友,在介紹求職經(jīng)驗談到SAS時說The much the better;其三,網(wǎng)上大家的評論都是:SAS是在實業(yè)界使用最廣泛,雇主最認可的企業(yè)級統(tǒng)計軟件。
那么是不是這樣呢,我做了一點研究工作:我打開004km.cn/pick.aspx?code=1951014386 SAS online tutor advance:
http://newdisk.cn/pick.aspx?code=370540326
第五篇:一個老程序員的心得
1個老程序員的心得
[size=4]不知不覺做軟件已經(jīng)做了十年,有成功的喜悅,也有失敗的痛苦,但總不敢稱自己是高手,因為和我心目中真正的高手們比起來,還差的太遠。世界上并沒有成為高手的捷徑,但一些基本原則是可以遵循的。
1.扎實的基礎(chǔ)。數(shù)據(jù)結(jié)構(gòu)、離散數(shù)學、編譯原理,這些是所有計算機科學的基礎(chǔ),如果不掌握他們,很難寫出高水平的程序。據(jù)我的觀察,學計算機專業(yè)的人比學其他專業(yè)的人更能寫出高質(zhì)量的軟件。程序人人都會寫,但當你發(fā)現(xiàn)寫到一定程度很難再提高的時候,就應(yīng)該想想是不是要回過頭來學學這些最基本的理論。不要一開始就去學OOP,即使你再精通OOP,遇到一些基本算法的時候可能也會束手無策。
2.豐富的想象力。不要拘泥于固定的思維方式,遇到問題的時候要多想幾種解決問題的方案,試試別人從沒想過的方法。豐富的想象力是建立在豐富的知識的基礎(chǔ)上,除計算機以外,多涉獵其他的學科,比如天文、物理、數(shù)學等等。另外,多看科幻電影也是一個很好的途徑。
3.最簡單的是最好的。這也許是所有科學都遵循的一條準則,如此復(fù)雜的質(zhì)能互換原理在愛因斯坦眼里不過是一個簡單得不能再簡單的公式:E=mc2。簡單的方法更容易被人理解,更容易實現(xiàn),也更容易維護。遇到問題時要優(yōu)先考慮最簡單的方案,只有簡單方案不能滿足要求時再考慮復(fù)雜的方案。
4.不鉆牛角尖。當你遇到障礙的時候,不妨暫時遠離電腦,看看窗外的風景,聽聽輕音樂,和朋友聊聊天。當我遇到難題的時候會去玩游戲,而且是那種極暴力的打斗類游戲,當負責游戲的那部分大腦細胞極度亢奮的時候,負責編程的那部分大腦細胞就得到了充分的休息。當重新開始工作的時候,我會發(fā)現(xiàn)那些難題現(xiàn)在竟然可以迎刃而解。
5.對答案的渴求。人類自然科學的發(fā)展史就是一個渴求得到答案的過程,即使只能知道答案的一小部分也值得我們?nèi)ジ冻?。只要你堅定信念,一定要找到問題的答案,你才會付出精力去探索,即使最后沒有得到答案,在過程中你也會學到很多東西。
6.多與別人交流。三人行必有我?guī)?,也許在一次和別人不經(jīng)意的談話中,就可以迸出靈感的火花。多上上網(wǎng),看看別人對同一問題的看法,會給你很大的啟發(fā)。
7.良好的編程風格。注意養(yǎng)成良好的習慣,代碼的縮進編排,變量的命名規(guī)則要始終保持一致。大家都知道如何排除代碼中錯誤,卻往往忽視了對注釋的排錯。注釋是程序的一個重要組成部分,它可以使你的代碼更容易理解,而如果代碼已經(jīng)清楚地表達了你的思想,就不必再加注釋了,如果注釋和代碼不一致,那就更加糟糕。
8.韌性和毅力。這也許是“高手”和一般程序員最大的區(qū)別。A good programming is 99% sweat and 1% coffee。高手們并不是天才,他們是在無數(shù)個日日夜夜中磨練出來的。成功能給我們帶來無比的喜悅,但過程卻是無比的枯燥乏味。你不妨做個測試,找個10000以內(nèi)的素數(shù)表,把它們?nèi)汲聛?,然后再檢查三遍,如果能夠不間斷地完成這一工作,你就可以滿足這一條。
這些是我這幾年程序員生涯的一點體會,希望能夠給大家有所幫助 做了快三年的程序員了,有一點小體會和大家分享一下.1.好鋼是由鐵煉成的.一名好的程序員必須經(jīng)過千錘百煉才行, 挫折是程序員最大的寶,要能承受挫折,戰(zhàn)勝挫折,只有不斷經(jīng)受挫折,從挫折中吸取經(jīng)驗,教訓,這樣你才能成為真正的程序員.2.手是好漢,眼是懶漢.看會不是目的,要會寫,勤動手,熟練書寫各種常用代碼,在學習之初 可以不借助IDE來書寫代碼,反復(fù)練習,熟能成巧,毋庸置疑.3.穩(wěn)中求勝,小心使得萬年船.程序員最忌諱毛躁.代碼多,項目大的時候,錯誤是在所難免的,但低級錯誤一定不能犯,盡量把錯誤壓到最低,這就要求我們程序員養(yǎng)成穩(wěn)重,多思維的方式,切忌浮躁,養(yǎng)成良好的書寫習慣和正確的思維方式.4.做就做程序員,不要做高級打字員.每個程序員都是從基礎(chǔ)學起的,在學的時候一定要把握好方向不要被眾多的語言,概念所迷惑,學的是語言,學的是編程思想不要在IDE上下功夫,研究哪個好,哪個壞,要敢于創(chuàng)新,程序是死的人是活的,在活人手里,也要讓程序活起來.多學多看數(shù)據(jù)結(jié)構(gòu)等書多看別人的成型代碼,學習別人的思想,使自己成為真正的程序員.5.敢想敢做,持之以恒,一切皆有可能!
一點薄思庸見送給賽迪網(wǎng)java版的初學者們,僅代表本人個人意見,如有任何各位大蝦有好的方法或意見可以跟帖提出.java開發(fā)八榮八恥
以動手實踐為榮,以只看不練為恥。以打印日志為榮,以出錯不報為恥。以局部變量為榮,以全局變量為恥。以單元測試為榮,以手工測試為恥。以代碼重用為榮,以復(fù)制粘貼為恥。以多態(tài)應(yīng)用為榮,以分支判斷為恥。以定義常量為榮,以魔法數(shù)字為恥。以總結(jié)思考為榮,以不求甚解為恥。
從大學開始到現(xiàn)在,學習編程已經(jīng)四年了,在過去的四年里學了不少的東西,總感覺自已還行吧。怎么著也能找個好的工作。加上在學校表現(xiàn)良好,大專一畢業(yè)就順利應(yīng)聘上一個政府機構(gòu)的工作。雖然工資不算多,但也穩(wěn)定。但總覺得自己有點屈才.一天,見到本市的一家知名軟件企業(yè)的招聘信息,就把自己從大學三年到現(xiàn)在寫過的一些東西簡單地寫了一份求職信過去(不是想跳槽,只是想測試一下我現(xiàn)在這份工作丟了,在社會上我能夠達到什么程度)。
沒想到,第二天,那家公司就叫我過去應(yīng)聘了。感覺很突然,總覺得一些軟件公司在人才網(wǎng)站上打一些招聘信息總是借此做大做廣告,并不是想招聘人,就是要招聘人,可能因為這種因素的機率都很小吧。(這是我一直以來對人才網(wǎng)站上某些軟件公司的招聘信息的看法),不過卻增加了幾分信心,于是我便興沖沖的去了。
到了公司,首先就讓我填寫一張表格,填寫完一張表格以后安排一個技術(shù)主管過來與我談,談的倒不是一些深入的技術(shù)問題,我基本上的都能應(yīng)上來。接著就是上機測試。測試的題目是寫一個人員信息的插入、修改、顯示。主考官說只需要寫一個功能就是,只是希望看看我的編程風格。于是我把數(shù)據(jù)操作寫了一個類,然后在按鈕的事件里得到輸入框值,組合一個SQL,傳到數(shù)據(jù)操作類里面去執(zhí)行,然后返回插入結(jié)果就可以了。完了,很快搞定。馬上叫主考官過來看吧。呵呵,小意思。
主考官過來了,首先就在姓名的地方輸入好長的一串字符串,接著一陣亂輸,完了,出問題。名字太長了,郵件沒有限制,身份證沒有限制,生日沒有限制,完了,完了,我想,這么點東西,就出問題了,我心里好一陣緊張。還好就是主考官的態(tài)度還不錯,說:“雖然你做了足夠的注釋,縮近也注意了,但是卻沒有對輸入的值進行判斷,我們這為合理的判斷也是好的編程風格,再者,你雖然把數(shù)據(jù)操作寫成了類,但也有很多的改進,一是。。二是。。”說完以后還鼓勵我接著寫剛才的代碼。當時真是很是感動,但感動歸感動,說老實話,這些判斷平時還真的沒有寫過多少,都是寫一個以后,COPY過去COPY過來的用,現(xiàn)在一時還覺得有些短路,不知道如何是好,然后,就是按鈕的事件中寫對數(shù)值的判斷。終于完成了,再看看表,時間距剛開始測試已經(jīng)快一個小時了。
主考官過來看了,覺得功能都實現(xiàn)了,就叫了公司的一個副經(jīng)理(后來才知道的)來繼續(xù)面試我。這個副總就到我到另外的一個會議室去,問了我一些技術(shù)概念的問題,結(jié)果我基本上都答不過來(我以前覺得我能夠用就夠了啥,沒有太大的必有對這寫概念的條款記得這么清楚啥),結(jié)果,那位副經(jīng)理訓斥了我一下,說:“你對這些概念都不清楚,怎么了解其間的性能呢,不了解性能如何開發(fā)高效率的程序呢?”(整個談話這句最讓我滿意,其他的都是“我們是專業(yè)的軟件公司,很注重軟件的性能,編程風格等等如事云云”),最后問了我的薪水要求和能不能適應(yīng)公司的開發(fā)等就叫我回家去等消息。
當然,由于后面沒有過關(guān)當然也沒有應(yīng)聘得上。更當然,我吸取了這次應(yīng)聘的經(jīng)驗,總結(jié)以下幾條來做為以后學習的信條,寫出來與大家共勉:
一,學習應(yīng)該從基礎(chǔ)抓起,注意學習的每個細節(jié),爭取學精,避免為了開發(fā)而開發(fā)。
二,在以一門語言為主功語言的同時,要學習一下與之相關(guān)的其它技術(shù)。
三,長常保持對新技術(shù)的關(guān)注,了解未來發(fā)展的方向,做到有的放矢。
四,多參與項目開發(fā),在項目中發(fā)現(xiàn)問題,解決問題,才能更好的了解學習中的細節(jié)問題。
五,加強交流,多寫文章,多發(fā)源碼,多收取意見,在交流學習并提高,才能更快了解自已的不足。
六, 永遠相信下一個作品是最好的....業(yè)余程序員最喜歡做的一件事就是對不同的語言進行比較。Java是否比C++好?C#是否會成為終極語言?凡此種種。從專業(yè)程序員的角度看來,這是最低級無趣的游戲。
其一,在項目諸元確定之后,通常并沒有選擇語言的余地;其二,語言的生存本身就是一個達爾文主義的問題:設(shè)若兩種語言有明確的可比較性,其中較劣的那一種必定早已被淘汰出局,又何來比較的必要?所以,有“C++之父”美稱的Bjarne Stroustrup博士常常聲明自己不會拿C++與其他語言比較——偏偏每次接受采訪時,必定有外行的記者或聽眾提出這一類最令他反感的問題,這是題外話,按下不表。
丟開實用主義的觀點,從美學(或者說,計算機科學)的角度來看,語言的比較似乎并不像它通常所表現(xiàn)的那么低級。畢竟,既然維特根斯坦反復(fù)強調(diào)“語言制訂游戲的規(guī)則”、“凡不可言說者必保持沉默”,可見語言并非僅僅是可通約的思想的映射,語言本身就決定思想的方式。使這個問題顯得那么低級而業(yè)余的,往往是業(yè)余程序員討論它的方式:僅僅憑著自己對幾種語言一知半解的認識、僅僅憑著使用一種語言的習慣、甚至僅僅憑著一種宗教狂熱來展開討論,這樣的討論自然是不值一哂的。
我是不是已經(jīng)提到了“宗教狂熱”這個詞?如果說對語言的喜愛(或者憎惡)可以成為一種宗教狂熱,就有那么一些人可以憑著宗教般的狂熱成為開發(fā)高手,Ian Joyner無疑屬于這種人。1992年,在Unisys用C++開發(fā)UNIXX.500時,Joyner感到C++讓他“不自在”,于是就寫了一篇題為《C++批判》的報告,張貼在Unisys的內(nèi)部新聞組上。到此為止,一切都沒有什么不同。但Joyner與其他宗教狂熱者的區(qū)別在于:他有著遠為深厚的理論基礎(chǔ),以及鍥而不舍的毅力。于是,《C++批判》有了第二版和在Internet上廣為流傳的第三版。到1998年,這篇典型的論壇文章終于變成了一本書,“批判”也徹底變成了語言之間的比較(參與比較的另外兩種語言是Java和Eiffel),這就是我手上的《對象揭秘:Java、Eiffel和C++》(Object Unencapsulated:Java,Eiffeland C++,人民郵電出版社2003年7月)。
盡管宣稱自己反對“宗教戰(zhàn)爭”,但顯然Ian Joyner是深諳宗教戰(zhàn)爭之道的。從批評的方式來說,他與其他人并無不同:首先立論(“Eiffel是最好的語言”),然后不斷變換角度批評對手——時而是數(shù)學理論的完備性、時而是使用的便利和可靠、時而是命名的清晰??論據(jù)的選取完全只是為論點服務(wù)。也正因為此,這本《對象揭秘》足以讓絕大多數(shù)的語言比較者感到羞赧,因為在同樣的批評套路上,Joyner探索的深度和廣度令他們望塵莫及。譬如說,任何一個負責的語言比較者都必然會提到“繼承和類型系統(tǒng)”這一話題,但Joyner卻把這個話題寫成了長達63頁的一章(第5章,“類型擴展:繼承與虛擬”),并在后面的章節(jié)(第9章,“類型轉(zhuǎn)換”)中繼續(xù)討論相關(guān)的問題。拋開篇幅不談,單是Joyner習以為常的文法解讀、Lamda演算法和簽名變化理論,就足以使不夠水準的批評者自慚形穢了。
因此,在我看來,這本《對象揭秘》完全有理由成為所有語言比較者的必讀書目——也許說“入門書目”會更準確一些?因為你能想到的任何一條批評,Ian Joyner很可能早已做了鞭辟入里的闡述。如果在細讀《對象揭秘》之前妄自作評,結(jié)果很可能是貽笑大方。另一方面,在批評的方法上,Joyner為后來者作出了表率:簡單的反對與謾罵毫無意義,用錢鐘書的話來說,“反其道以行也是一種模仿”;只有拿出充足的論據(jù),再拿出合理的解決方案,才稱得上一個高明的批評者。當然,這樣的“入門書目”也許讓門檻顯得太高了一點。但對于“Java和C++誰更好”這樣一個通常只會令人感到莫名煩躁的話題,門檻總是不厭其高的。
像我一樣的Java人常常會抱怨“Java的經(jīng)典書籍太少了”。C++的經(jīng)典好書總是層出不窮,實在令人艷羨——當然真正擁有這些書的人也同時擁有不少的煩惱,我就有最深切的體會。在這本《對象揭秘》中,IanJoyner順便也半開玩笑地揭開了這個秘密。也許,這句半開玩笑的話會成為Java人喜愛這本書的另一個理由:
“??學習C++要花那么長時間??,要比Eiffel和Java都長得多?;敲撮L時間還未必掌握編程或者面向?qū)ο笤O(shè)計技術(shù)。這也是為什么關(guān)于C++的書籍那么多而Eiffel和Java不需要那么多書的原因?!?/p>
我是初中時接觸編程的。那時父親廠里買了一臺微電腦,而我父親,當時正好可以接觸到這臺微機,于是,頗具戰(zhàn)略眼光的父親便開始幫我尋找各種書籍資料,讓我學起了計算機。
第一眼看到它,我就被吸引住了。那是在當時也很差的一種名叫“R1”的微機,可是顏色實在漂亮,典雅的奶黃色,配著深綠的按鍵,按下不同的鍵還有不同音調(diào)的悅耳的聲音。跟當時風行的大多數(shù)八位微電腦一樣,整個機身實際就是一個鍵盤,比現(xiàn)在PC機通常的鍵盤還要小,顯示器就用電視機。當我第一次把從書上抄下來的寥寥幾句的一個Basic程序從嘀嘀作響的鍵盤上敲入,最后再打進了“RUN”,而屏幕上忠實地顯示出了結(jié)果后,我就不可救藥地迷上了編程。父親的廠離家有五公里,每個星期天我都要自己一個人步行五公里,把一個星期里自己寫下的一大堆Basic程序拿來調(diào)試,當然一大半都被它冷酷的拒絕了,所以每次有一個程序通過了,我都會興奮的叫起來。那時我的體力不好,五公里走下來,相當累,還經(jīng)常小腿抽筋,可是一坐到電腦前,聽見打開時“嘀”的提示音,一切的痛和累都消失了。
漸漸地我的程序通過率越來越高了,程序的規(guī)模也在增長。但是,那臺外表可愛的電腦卻開始不堪重負了,運行速度本來就慢,又加上效率低下的解釋性Basic語言,讓我實在不可忍受。于是,父親又到新華書店為我訂下了一本《Z80匯編語言》的書。書一到,我就捧起這部大塊頭的書,開始用我初中的程度一點點地啃。邊啃邊實驗,終于掌握了Z80匯編語言,又在電腦不具備輸入?yún)R編語言能力的情況下,手工翻譯成機器語言,再通過Basic語言中的Poke語句把二進制代碼輸入內(nèi)存,然后用Basic程序調(diào)用。在不懈的努力下,終于成功地做出了一個匯編語言的動畫程序!在這次成功之后,我就開始相信,只要肯鉆研,沒有學不會的技術(shù),沒有克服不了的難題。
初中畢業(yè)后,我以全縣第一的成績進入了一所附近城市的省重點中學,從此我的眼界開始逐漸拓寬了,以后,我用到的電腦越來越高級,從高檔八位機蘋果電腦,到今天主頻以G計,內(nèi)存以M計的奔四電腦,當年那臺主頻內(nèi)存都只能以K計的八位機已是進了歷史博物館。但是這臺引領(lǐng)我進入編程領(lǐng)域,并且更驅(qū)使我深入鉆研匯編語言的電腦,將是我記憶中最珍貴的收藏之一。
在重點中學,學業(yè)的壓力是很重的,又是住校獨立生活,對于體力已較大程度下降、行動已呈現(xiàn)出不少不便的我,平添了幾許額外的困難。高中的第一年沒有計算機課,我只能在假期回家后才能有機會繼續(xù)學習編程,也以此來忘記一學期的壓力和苦累。高二時,終于盼到了計算機課,也見到了當時相對高檔的蘋果電腦。而我此時已有的基礎(chǔ)令老師吃驚,同學驚服。我加入了計算機興趣小組,開始在性能遠遠好于原來那臺電腦的蘋果機上快樂的編程了。在高二的暑假我和計算機老師一起給學校做個工資管理軟件。在學校里的一周時間內(nèi),由于宿舍已經(jīng)鎖掉不能住,我就睡在了辦公室里。位于郊區(qū)的校園,蚊子格外多,咬的我一直睡不著。到了后半夜,我索性爬起來,打開了電腦干活。就這樣,我?guī)椭蠋煂懗绦?、錄入?shù)據(jù),并且在即將交貨時找出了一個大BUG,又正確地判斷出問題根源在內(nèi)存不足,算是立下了一個小功勞。
由于高考發(fā)揮出色(尤其是物理的滿分),我進入了北京大學物理系。在大學里,計算機上機條件就更好了。當時蘋果的Macintosh剛剛推出,給我們系捐了好多臺組建了計算機室。這個計算機室從此就成了我大學四年最常去的地方。一年級的時候有兩門計算機課,一門是Fortran語言,一門是Pascal語言。而Pascal語言基本是我們自己學,每到晚上計算機室向我們開放。那是我第一次見識“窗口”形式的操作界面。第二年,計算機室的機器換成了386和Dos系統(tǒng)了,但是上機機時卻被限制住了。不能滿足的我到處找不喜歡計算機的同學借機時卡,好讓我有足夠的時間調(diào)試自己寫的程序。到了第三年,北大招生更多,系計算機室天天爆滿,所以上午只要沒課,我就會起個大早到機房門口等待開門。在一個寒冷的冬晨,還因此著涼發(fā)燒而暈倒在機房門口。就這樣,我熟練地掌握了Turbo Pascal和Turbo C++,也學習了好多相關(guān)的理論知識。
畢業(yè)后,我終于如愿以嘗當上了程序員。我被分配的任務(wù),起先是用Delphi做一些文字處理的工具,供編輯部和數(shù)據(jù)部使用。后來Internet開始興起,又委派我寫為網(wǎng)絡(luò)版期刊使用的一些CGI程序。工作一直都很順利,我的眼界與編程水平也在穩(wěn)步成長。兩年后,為了有更好的發(fā)展,我離開了我工作的第一家公司。這時,我把求職的陣地移到了網(wǎng)上。不久,就在某網(wǎng)站上看到了一家合資軟件企業(yè)的招聘啟事。盡管啟事上說明不接受來訪,我仍然勇敢地拿著簡歷于第二天趕到公司所在的翠宮飯店去求職了。幸運仍然在籠罩著我,這次我直接見到了經(jīng)理,向他表達了自己對于編程的熱愛。我說,我夢想著成為IT業(yè)的傳奇英雄。也許是這句話感動了他,我成功的通過了面試。在這家公司,我第一次作為一個龐大項目組的一員,感受到了現(xiàn)代化的軟件項目管理,接受了團隊精神的洗禮。
在北京做了五年的程序員,這時候,我聽到了來自深圳的召喚。早在99年,我就在網(wǎng)絡(luò)上找到了一個位于深圳的名為“中華殘疾人服務(wù)網(wǎng)”的殘疾人網(wǎng)站。一天,我在這個網(wǎng)站的留言本上看到了站長的一席因殘疾人網(wǎng)絡(luò)事業(yè)缺少技術(shù)支持而發(fā)的感慨,不由心有所感,便留言說,愿投入殘疾人網(wǎng)絡(luò)事業(yè),而不計待遇。從此,我的人生翻開了輝煌的一頁。那是2002年的10月6日。
起初以為,這個網(wǎng)站會類似于僅僅出于興趣的個人網(wǎng)站,走進去才真正發(fā)現(xiàn),這是個志存高遠的團隊。而我真正感覺到了團結(jié)一致共創(chuàng)大業(yè)的團隊精神。在同樣因病致殘的站長有力領(lǐng)導(dǎo)下,這里基本解決了殘疾人在生活會有的種種不便,克服了許多社會上普遍存在的障礙,從而可以讓我充分發(fā)揮聰明才智,全身心地去攀登IT技術(shù)的高峰。
加入網(wǎng)站之后,我完成的第一個任務(wù)是改進網(wǎng)站新聞系統(tǒng),增加圖片上傳和自動圖文排版功能。以前沒有做過ASP程序的我在原有的ASP程序的基礎(chǔ)上,通過學習和分析源代碼,完成了這個任務(wù),同時也掌握了基本的ASP編程技術(shù)。然后,我又獨立完成了一套社區(qū)論壇程序,這套程序受到了全國以至海外殘疾朋友的歡迎,成為了許多足不出戶的殘疾朋友與網(wǎng)友熱烈交流的園地。也讓我從中看到了自己的價值。后來,因為網(wǎng)站的網(wǎng)管不辭而別,我又接過了網(wǎng)管的重任,從此一面開發(fā)程序,一面又管理著我們自己的兩臺服務(wù)器。盡管壓力和工作量成倍地增加了,卻使我同時掌握了兩個領(lǐng)域的技術(shù),而這兩方面的技術(shù)又互相促進,使我的知識結(jié)構(gòu)更為全面。
由于我們沒有外來資金的支持,要維持中華殘疾人服務(wù)網(wǎng)這個福利公益網(wǎng)站的運轉(zhuǎn),必須走以網(wǎng)養(yǎng)網(wǎng)的道路,即為企業(yè)、政府提供信息化建設(shè)服務(wù),以獲得經(jīng)濟收入。所以,在給網(wǎng)站開發(fā)和升級程序之余,我又開始進行商業(yè)網(wǎng)站后臺程序的開發(fā)。僅網(wǎng)站新聞系統(tǒng),就在兩年內(nèi)從1.0版升級到了6.0版;還有大量為企業(yè)量身定做的功能程序。這些程序在網(wǎng)站原本就強大的前臺設(shè)計的包裝下,受到了市場的歡迎。網(wǎng)站也由此發(fā)展壯大。今天中華殘疾人服務(wù)網(wǎng)在全球排名中穩(wěn)步上揚,進入了三萬以內(nèi)的行列。
在承接網(wǎng)站建設(shè)工程的同時,一些客戶也開始找我們開發(fā)應(yīng)用軟件。第一個應(yīng)用軟件項目是一家與廣東移動通信有業(yè)務(wù)關(guān)系的公司,因為自身沒有軟件開發(fā)能力,便請我們合作為廣東移動通信做一個《“測試卡”管理系統(tǒng)》。根據(jù)要求,我設(shè)計了使用條形碼的輸入方案,又使用SQL數(shù)據(jù)庫作為局域網(wǎng)聯(lián)網(wǎng)的后臺數(shù)據(jù)庫解決方案。由于是第一次全程的開發(fā)與服務(wù),在進行以前沒有接觸過的安裝過程中出現(xiàn)了大量問題,又沒有充分做好應(yīng)對的準備,造成了一些被動局面。但是最終我仍然想出了臨時的解決方法,順利地完成了測試版的交付。遺憾的是由于中介的公司人事調(diào)動,這個項目最終沒有進行下去。
很快又一個重大考驗落在了以我為首的網(wǎng)站開發(fā)隊伍身上。這是一直從各方面扶持我們的深圳市信息化辦公室交給我們的任務(wù)。要求是我們收集深圳市所有的網(wǎng)站,以PDF電子書的形式印刷在光盤上。同時要有一個完善的分類搜索系統(tǒng)。時間緊、數(shù)據(jù)量大,而且不允許出現(xiàn)任何差錯。為了證明殘疾人團隊的開發(fā)能力,我和大伙都拼上了。而在送交初稿的前一天晚上,更是全民動員,站長第二天一大早要親自帶上光盤送去,但他也一起在熬夜。那個不眠之夜是我編程生涯中效率最高的一夜。不久后,這個項目終于完成,看著出自我們的頭腦和雙手的幾千張光盤,我知道自己的努力沒有白費,而自己的能力也提升到了一個新的境界。這個項目,在那些大公司看來也許是不值一提,可是對于一個核心成員僅五六人、而且全部是殘疾人組成的一個項目組,是非常了不起的成就!
2003年12月,世界殘疾人職業(yè)技能奧林匹克在印度新德里舉行,我有幸代表中國的殘疾人參加了其中編程項目的比賽。在中國,殘疾人的就業(yè)問題是一個大問題,因此,這種殘疾人的職業(yè)技能競賽尤其有意義。2002年12月,我以廣東省冠軍的身份取得了2003年在上海參加全國比賽的資格。2003年8月,我在上海憑著多年的編程經(jīng)驗和創(chuàng)新精神,又取得了參加中國殘疾人代表團出征印度的資格。遺憾的是,在賽場上,為了追求更好的界面效果,我耽誤了一些時間,以至在最后因時間過于緊張,出現(xiàn)了一個致命的失誤,將本來有希望得到的獎牌拱手相讓。唯一的安慰,就是我的程序界面受到了印度裁判的稱贊。
從國外回來,我又打開了.NET的大門,準備帶領(lǐng)網(wǎng)站的幾個做程序的殘疾朋友進入.NET的開發(fā)。對未來,我充滿了信心,而新的夢想,又開始浮現(xiàn)在我眼前!
現(xiàn)在我的身份,一半是軟件工程師,一半是高級程序員。隨著網(wǎng)站這個實體的發(fā)展,我也許會逐漸成長轉(zhuǎn)型為軟件架構(gòu)師,但是我仍然會夢想著掌握最高的編程技術(shù),仍然愿意承擔基礎(chǔ)性的編碼工作。我相信,保持開放的心態(tài),保持年輕的心態(tài),再老也能做程序。當今的數(shù)字化時代給殘疾人士尤其是肢殘人士帶來了新的機會和挑戰(zhàn)。現(xiàn)在,純粹腦力勞動的門檻,因為程序員門檻的大幅度降低而降低,給更多由于社會原因而教育程度相對偏低肢殘人士提供了經(jīng)過培訓進入初級程序員行列的機會。但是,這些機會要想轉(zhuǎn)化為現(xiàn)實,還需要更多更廣泛的“無障礙”環(huán)境的支持。我的第二個夢想,就是夢想中國能夠出現(xiàn)更多的“軟件工廠”,而這些“工廠”又是向殘疾人敞開大門的。
十年編程生涯,歷經(jīng)了風雨坎坷,而程序代碼給我插上的翅膀在風雨中更加硬朗。今天,我喜歡在程序代碼的世界中自由飛翔。讓病魔去禁錮我的身軀吧,我的靈魂仍然在廣闊的世界里翱翔??
“我不是程序員”,楊過在電話那頭淡淡的說。楊過是大學同學叫他的外號,因為他的氣質(zhì)和金庸造的楊過最像,連一些感情遭遇都像。
拒絕做程序員,雖然很火
楊過畢業(yè)那年軟件公司很火,據(jù)說在中關(guān)村隨便一個剛畢業(yè)的寫C程序的畢業(yè)生月薪一不小心會上萬。于是乎楊過不少的同學們畢業(yè)后紛紛改行編起了程序,跳進了大家現(xiàn)在也沒說清楚的IT行業(yè)。說改行是因為楊過學的不是計算機專業(yè),只是沾上邊。
楊過那時根本不屑于做編程,雖然那時班里就他最喜歡打軟件游戲。他覺得去編程不是什么“正經(jīng)事”,所以畢業(yè)后他去了大連一家生產(chǎn)糧油的集團企業(yè),楊過說是“一顆紅心投入四化建設(shè)”。
由于不想拍馬逢迎,楊過徹底打消了“磨豆油”的念頭。不過他沒有直接留在大連找工作,而是跑到偏遠的老家和他青梅竹馬的高中同學結(jié)婚去了。楊過的感情故事太有傳奇色彩,跟金庸那個楊過有一拼。因為新婚的妻子在大連不好找工作,當時他留在家里,找了一個小公司用電腦給人設(shè)計零件圖。
本來大多數(shù)人的工作就是混口飯吃,楊過也不嫌公司小,老老實實過日子吧??勺屗邮懿涣耸?,公司的老板經(jīng)常借口讓他熟悉工作為名把他當民工使,一氣之下楊過回了大連,幾個月也是白干,工資沒拿到一分錢,因為工資是三個月一發(fā)。楊過借口看病從老板那里借了幾百塊錢,老板也明白怎么回事,就給他了。直到現(xiàn)在,楊過還算是借著這個公司的幾百塊錢。
還得做程序員
楊過先自己回到大連,到人才市場一看,鋪天蓋地都是要程序員?!鞍?,不服氣不行,社會發(fā)展趨勢啊”。電話那頭的楊過一直在嘆氣。
畢竟楊過是重點大學畢業(yè)的和計算機相關(guān)專業(yè),那時還很吃香。他很快找到一家做尋呼臺業(yè)務(wù)的軟件公司。由于以前“沒睡決時還看看計算機書”,他上手還挺快。干了一年,他跳到現(xiàn)在的這家公司,工資漲了一大截,在大連還算可以,老婆也接過來了。
楊過老婆剛開始在影樓做過一段,后來生病就沒再做。楊過說現(xiàn)在工資也夠兩個人花的,也不逼她找了,也不好找。
我不是程序員,也不考慮明天
楊過現(xiàn)在的這家公司雖然也不算小,主要是做政府機構(gòu)的一些單子,但為了生存業(yè)務(wù)還是比較雜。楊過感覺自己“天天這編一點、那寫一點,從來沒有好好從頭做過一個正式的項目”?!拔也皇浅绦騿T,”他說,“可大家都這個樣子?!?/p>
公司里只有楊過一個人結(jié)婚了,其它都是小伙子。“以前沒睡覺還看看書,現(xiàn)在沒心思了”,楊過調(diào)侃。
由于換了幾個工作,楊過的國家基本保險也搞的亂七八糟?!拔易屑氀芯窟^國家的一些文件,自己掏錢交那些基本保險沒有什么用”,楊過現(xiàn)在和老婆都沒有基本保險,自己存錢保險。
楊過無奈的笑笑,“也存了一些錢,前一段老婆病了都交給醫(yī)院了?!?/p>
最近,看到論壇一貼子,主題是:我從校園出來的這幾年。里面可熱鬧了,回復(fù)次數(shù)竟然達1425次,我讀了幾個鐘都沒看完,最后只能大概瀏覽一下了,不過里面大多數(shù)都說自己是程序員,并且出來工作都不容易,可謂是一部“千人辛酸史”了,從中多少反映出了中國不少程序員的生活狀況,不知道打算做程序員或者現(xiàn)在正入門的程序員朋友看了作何感想?
說實在的,目前在中國的程序員大都過得不容易,而且普遍表現(xiàn)為“青春飯”狀態(tài),工作量大,導(dǎo)致對新知識的吸收能力隨著年齡增大而降低,到了一定年齡(30后)后因為跟不上時代發(fā)展面臨淘汰的厄運。雖然如此,但讓我覺得欣慰的是的不少程序員或打算做程序員的朋友都表示堅持在程序員的路上走下去,因為我也是一名程序員,而且我對未來充滿陽光,充滿希望。
我記住了這樣一個簡單的道理:過去并不代表未來!相信沒有人會不知道這個道理吧!大多程序員過去的辛酸大都可以歸結(jié)于中國軟件產(chǎn)業(yè)的發(fā)展的不成熟,而現(xiàn)在,中國政府制定政策大力扶持軟件產(chǎn)業(yè)的發(fā)展,而且不少國際軟件企業(yè)也看好中國的軟件產(chǎn)業(yè),紛紛把投資向中國傾斜,而且國內(nèi)也開始有了不少比較成熟的軟件企業(yè),當然與國外的一些軟件企業(yè)相比,還有一大段距離。但它表明中國的軟件產(chǎn)業(yè)開始向規(guī)?;?,規(guī)范化的方向發(fā)展了。
印度在軟件方面,在我們看來是成功,印度政府在1991年就制定相關(guān)扶持政策,到現(xiàn)在也有10多年了,才取得成功,另一個在軟件方面比較成功的亞洲國家——韓國,它也在1998年就制定了相關(guān)扶持政策,到現(xiàn)在也取得了一定的成功,用時不過4-5年,那么中國的軟件產(chǎn)業(yè)呢?要多久才能成熟起來呢?引金山總裁雷軍的話,3年左右有所成就,到全面成熟那就要比較長的時候了,但中國軟件產(chǎn)業(yè)的成熟和前述國家成熟概念不一致:印度是定位于軟件外包而取得成功,韓國定位于網(wǎng)絡(luò)游戲取得一定成就,而中國呢?定位于什么呢?中國的定位是組合式的,不是某一方面,而是全面的。
可以相信:在未來,中國的軟件產(chǎn)業(yè)無論在產(chǎn)業(yè)結(jié)構(gòu)上,還是人才結(jié)構(gòu)上都會具有優(yōu)勢。關(guān)于后者,你只要看看中國建立的50多所軟件學院就可見一斑了,而且還有很多像印度的NIIT,北大青鳥(中外合資)等著名的國外軟件開發(fā)教育機構(gòu)進入中國,把先進成熟的教育模式帶入了中國。
但是,以上的教育機構(gòu)培養(yǎng)目標都不是精英程序員,而是最近大家抄的很熱的“高級軟件藍領(lǐng)”,成熟模式中的軟件開發(fā)團隊中需要“金領(lǐng)”,“白領(lǐng)”,再到“藍領(lǐng)”,而中國軟件企業(yè)大多是小企業(yè),最需要的是能獨擋一面的“金領(lǐng)”,“白領(lǐng)”程序員,并不需要那么多只會Coding的“藍領(lǐng)”程序員,我想很多混的不那么好的程序員,大概你是屬于“藍領(lǐng)”程序員吧!
任何時代,任何時候,機遇總是垂青于有能耐的人的。但是,即使你現(xiàn)在不是“金領(lǐng)”,或者“白領(lǐng)”程序員,你還不是精英,而僅僅是“藍領(lǐng)”程序員或者還不是而想成為程序員的你聽到這句話,千萬不要泄氣,要相信你自己是將來的精英,雖然現(xiàn)在的生存環(huán)境不是那么好,但是,恰恰有更多機會讓培養(yǎng)自己獨擋一面的能力,隨著中國軟件產(chǎn)業(yè)的發(fā)展,將會需要大量有數(shù)年工作經(jīng)驗,有整體系統(tǒng)架構(gòu)能力的人才,而這些恰恰是任何學校都無法培養(yǎng)的人才,而現(xiàn)在的程序員,只要你們不放棄夢想,不放棄追求,繼續(xù)努力,你們將成為軟件產(chǎn)業(yè)的中堅力量!軟件人才的佼佼者。
最好,告訴大家一項調(diào)查,硅谷的程序員的平均年齡是35歲左右,而且微軟公司的核心開心者大都在35歲以上,可以遇見,程序員不在是“青春飯”,也會有“老來悄”的“老資格”了!
冬天來了,春天還會遠嗎?——謹飭送給所有的中國程序員。
如同一首民歌《三十里鋪》所言,路行三十要有個歇腳的地方,人行三十也要喘口氣。在IT,特別是程序員這個特殊的職業(yè),流傳一種說法:30歲是職場上的一道檻,事業(yè)上此時會發(fā)生了許多變化。30歲和程序員真有某種特殊的聯(lián)系嗎?程序員到底能不能做到30歲以上呢?
J曾是一名計算機老師,因為厭倦了學校平淡的生活,應(yīng)聘到一家開發(fā)嵌入式系統(tǒng)的公司做底層程序員。剛開始的一兩年,憑著一股熱情和鉆勁兒,投入到如火如荼的開發(fā)中,甚至購置了睡袋以備晚上加班。兩年中,他掌握了極其專門的硬件參數(shù)、規(guī)格、開發(fā)細節(jié)等知識,成為部門的骨干。
逼近30歲的那幾個月,他開始感到有些困惑。自己在公司雖然還算受重視,但是技術(shù)上翻來覆去就是那幾樣爛熟于心的東西,公司只需要自己慣性運作,實際不愿支付經(jīng)驗轉(zhuǎn)換的成本;而公司的原始積累還遠遠未完成,自己仍然要和剛畢業(yè)的大學生一起加班,通宵達旦的干。因為缺乏人際交往,家里一直催著的婚姻大事,至今還八字沒一撇。很多同時期來的人都打算往管理轉(zhuǎn)了,可是自己對管理缺乏興趣,還是樂于從事技術(shù)工作。下一步怎么辦?J想到了辭職,但還沒有什么方向。
相比J,M要幸運得多。作為清華計算機本科、中科院研究生畢業(yè)的高材生,M在做項目經(jīng)理時就能夠月收入2萬,先后換過3家公司,對所謂30歲的說法不以為然。M以前的項目都是用CMM做,項目管理很好,而核心的也就幾個人。手下帶過的人,當然是剛畢業(yè)的最差,因為要獲得30歲時的經(jīng)驗,顯然需要一個過程。M最開始做程序是用Debug單步跟蹤、分析、定位;后來開發(fā)圖形界面的上層程序,哪怕半年寫1萬行,也覺得不叫程序;只有到后來轉(zhuǎn)到做底層開發(fā)以后,雖然半年只寫到2000行,但是卻感到了寫程序的快樂。M認為30歲以后程序員的體力不是問題,好的程序員不經(jīng)常熬夜,有也是臨時的。M接觸過國外、比如印度的一些公司,技術(shù)人員們沒有固定辦公室,用互聯(lián)網(wǎng)聯(lián)系;很多人年齡都在35歲以上,技術(shù)很熟練,思想敏捷,讓人敬佩。
M的職業(yè)觀也很靈活。剛剛辭職在家,接點活干,非常忙。M有幾個同學在外企做程序,日子過得更舒服,但是幾年下來,個人、技術(shù)均無進展。究其原因,除了像微軟研究院、Intel等一些少數(shù)外企還做些研發(fā)外,其它外企都是挑國外剩下的做,反而是國外一些小公司倒是把最核心技術(shù)放在中國來開發(fā)。其它像金山這樣的一些本土企業(yè)應(yīng)該也不錯。做為程序員,機遇、環(huán)境、職業(yè)(項目)都很重要,它不但直接決定現(xiàn)在的收入水平,更決定未來不同的命運。而程序員這個行業(yè)又有極強的主導(dǎo)性,如何做好職業(yè)生涯的規(guī)劃,恰恰是決定乾坤的關(guān)鍵棋子。
程序員圈子里流傳過一套書叫做《編程之禪》和《編程之道》。創(chuàng)造力、邏輯、判斷、體力、智力、手段都是所謂道的一部分,書中有個比喻,程序員編程時,只有硬盤在響。創(chuàng)造本身是一項神圣的工作,但是創(chuàng)造者的果實卻是世俗的。換句話說,年齡的問題本是見仁見智的,但是“30歲的檻”卻是世俗的。國內(nèi)大部分公司還沒有好到為程序員做好一生的職業(yè)規(guī)劃的地步,因此路還得自己來走。不要讓過度的重復(fù)勞動損害了創(chuàng)造力,也不要太迷信技術(shù)的力量,而忽略了世俗世界的張力?!叭镤伿且粋€小村莊,小村莊是我們經(jīng)過的地方。經(jīng)過的地方向著遙遠的別處,遙遠的別處還是三十里鋪?!?/p>
做為一名大四的學生,我面試過不少的單位,有成功的也有失敗的,但是對我來說所有的失敗在某種意義上都是一種成功,特別是我下面寫的這些,寫這篇文章的時,我已經(jīng)簽了南京的一家軟件公司,但是想起今年2月21日我面試蘇州臺灣的IT公司的經(jīng)歷聯(lián)想到我們現(xiàn)在學習編程的一些情況我真的深有感觸,這次面試使我深深的體會到了失敗但也收獲了很多。
我要說的將分成三部分,1.是我面試的具體經(jīng)過 2.是由面試想到的 3.現(xiàn)今我應(yīng)該做的。
當然這些話很大程度上是我個人的意見,不可能完全得到大家的贊同,所以 在某些觀點上如果哪位朋友覺得跟我的有很大出入,請不要介意,也不要對我攻擊,就當我 沒有說過,歡迎和我聯(lián)系共同探討這些問題!我的EMAIL:wutao8@263.net
1.面試經(jīng)過
大約在年前我接到了臺灣瑞晟(Realtek)蘇州公司的面試通知,通知我2月21日到蘇州工業(yè)園區(qū)面試,接到面試后的幾天我把一些專業(yè)課溫習了一遍,特別是C++和數(shù)據(jù)結(jié)構(gòu),由于大學幾年里,我一直專研這些方面,加上通過了高級程序員的考試,對于一些常用的算法我差不多也 達到了爛熟于胸的地步,當時的感覺是如果問了我這些方面的問題我應(yīng)該是沒有問題的!
21日那天我被安排在4:30面試,由一位技術(shù)人員單獨給我面試,在問了一些簡單的問題之后 ,他給我出了一道編程題目,題目是這樣的:
(由于具體面試的題目比較煩瑣,我將其核心思想提取出來分解成??(亂碼)
1)寫一個函數(shù)計算當參數(shù)為n(n很大)時的值 1-2+3-4+5-6+7......+n 哼,我的心里冷笑一聲!沒想到這么簡單,我有點緊張的心情頓時放松起來!于是很快我給出我的解法:
long fn(long n){ long temp=0;int i,flag=1;if(n<=0){ printf(“error: n must > 0);exit(1);} for(i=1;i<=n;i++){ temp=temp+flag*i;flag=(-1)*flag;} return temp;}
搞定!當我用期待的目光看著面試官的時候,他微笑著跟我說,執(zhí)行結(jié)果肯定是沒有問題!但當n很大的時候我這個程序執(zhí)行效率很低,在嵌入式系統(tǒng)的開發(fā)中,程序的運行效率很重要,能讓CPU少執(zhí)行一條指令都是好的,他讓我看看這個程序還有什么可以修改的地方,把程序 優(yōu)化一下!聽了這些話,我的心情當時變的有點沉重,沒想到他的要求很嚴格,之后我對程序 進行了嚴格的分析,給出了改進了的方案!
long fn(long n){ long temp=0;int j=1,i=1,flag=1;if(n<=0){ printf(”error: n must > 0);exit(1);} while(j<=n){ temp=temp+i;i=-i;i>0?i++:i--;j++;} return temp;}
雖然我不敢保證我這個算法是最優(yōu)的,但是比起上一個程序,我將所有涉及到乘法指令的語 句改為執(zhí)行加法指令,既達到要題目的要求而且運算時間上縮短了很多!而代價僅僅是增加了 一個整型變量!但是我現(xiàn)在的信心已經(jīng)受了一點打擊,我將信將疑的看者面試官,他還是微笑 著跟我說:“不錯,這個程序確實在效率上有了很大的提高!”我心里一陣暗喜!但他接著說這個程序仍然不能達到他的要求,要我給出更優(yōu)的方案!天?。∵€有優(yōu)化!我當時真的有點崩 潰了,想了一會后,我請求他給出他的方案!然后他很爽快的給出了他的程序!
long fn(long n){ if(n<=0){ printf(“error: n must > 0);exit(1);} if(0==n%2)return(n/2)*(-1);else return(n/2)*(-1)+n;}
搞笑,當時我目瞪口呆,沒想到他是這個意思,這么簡單的代碼我真的不會寫嗎,但是我為 什么沒有往那方面上想呢!他說的沒有錯,在n很大很大的時候這三個程序運行時間的差別簡 直是天壤之別!當我剛想開口說點什么的時候,他卻先開口了:“不要認為CPU運算速度快就 把所有的問題都推給它去做,程序員應(yīng)該將代碼優(yōu)化再優(yōu)化,我們自己能做的決不要讓CPU做,因為CPU是為用戶服務(wù)的,不是為我們程序員服務(wù)的!”多么精辟的語言,我已經(jīng)不想再說 什么了!接著是第二個問題:
他要求我用一種技巧性的編程方法來用一個函數(shù)實現(xiàn)兩個函數(shù)的功能n為如:
fn1(n)=n/2!+n/3!+n/4!+n/5!+n/6!fn2(n)=n/5!+n/6!+n/7!+n/8!+n/9!
現(xiàn)在用一個函數(shù)fn(int n,int flag)實現(xiàn),當flag為0時,實現(xiàn)fn1功能,如果flag為1時實現(xiàn)fn2功能!他的要求還是效率,效率,效率!說實在話,如果我心情好的話我應(yīng)該能給出一種比較好的算法,但我那時真的沒有什么心思再想了,我在 紙上胡亂畫了一些諸如6!=6*5!的公式后直截了當?shù)母f要他給出他的答案!面試官也沒有 說什么,給出了他的思路:
定義一個二維數(shù)組 float t[2][5]存入[2!,3!,4!,5!,6!},{5!,6!,7!,8!,9!]然后給出一個循環(huán):
for(i=0;i<6;i++){ temp=temp+n/t[flag][i];}
最后得到計算值!呵呵,典型的空間換時間的算法!這些總共花了50分鐘的時間,還有十分鐘我就跟他很隨意的聊聊天,聊了一些編程以及生活 的問題,那時的我已經(jīng)很放松了,因為我知道這次面試結(jié)果只有一個:失敗。5:30的時候面試官要我等通知,于是我離開了他們公司。這就是面試的整個經(jīng)過!
2.由面試想到的
真的是很失敗??!我記得那天下好大的雨,氣溫也很低,我邊走邊想,從5:30一直走到7:30,全身都濕透了,又冷又餓,但是我只是一直走,腦子里面充滿了疑惑,我也想讓雨把自己淋 醒!看到這里有些朋友可能覺得那些面試題目不算什么如果讓自己做的話肯定能全部答對,我 肯定相信你,因為我從未懷疑過中國程序員的能力,我認為中國有世界上最好的程序員,我也 從未認為自己是高手,所以我做不出來不代表中國程序員比臺灣或者別的地方的程序員差,所 以我就從我的角度,我的所見所想來談一些感想:
不錯全世界都有優(yōu)秀的程序員,中國也不例外,但是我疑惑的是:到底中國和臺灣或者國外 的優(yōu)秀的程序員的比例到底是多少?臺灣我不知道,中國100個程序員里有幾個是優(yōu)秀的呢?我 根本算不上,從上面的表現(xiàn)就足以說明一切了!是1個?5個?10個?50個?這個數(shù)字我不敢亂 猜,恐遭網(wǎng)友一頓痛罵,那么我們國內(nèi)有多少人學習計算機呢?拿我們學校來說,計算機97級 4個班,98級5個班,99級10個班,2000級17個班,人多了,老師怎么辦?我們學校的做法是讓 研究生上課,然后呢?補考一抓一大把,大把大把的補考費落入了學校的口袋,還說現(xiàn)在的學
生素質(zhì)低!真是好笑,我都不知道學校這么做是為了什么,為國內(nèi)培養(yǎng)大量的程序員嗎?學生 們能真正學到計算機知識嗎?好了,我敢講,在我們學校學習編程學生和優(yōu)秀程序員(注意我 指的是優(yōu)秀,只會編幾個糟爛程序的人算不上)的比例應(yīng)該是100:0.1 在這種比例下雖然我們中國學習編程的人鋪天蓋地,但是想想有多少個人能真正為中國軟件 業(yè)發(fā)展作出貢獻,有多少人能真正寫出優(yōu)秀的程序名揚海外!
我從學習編程以來,不管是自學還是老師指導(dǎo),從來都是解決問題就好,編出程序來就行,我的疑惑是:我們有真正的強調(diào)過程序的效率,程序的質(zhì)量嗎?我們有仔細分析過我們寫的東 西,看看有沒有可以改進的地方,看看有沒有簡單的方法來達到同樣的目的呢?我問心自問,我發(fā)現(xiàn),我從來沒有對我寫出來的程序進行過優(yōu)化,最多就是進行詳細的測試,然后Debug,但是這就足夠了嗎?這些天我偶爾發(fā)現(xiàn)我曾經(jīng)寫過的一個游戲,那是一年做為 其中一員時候,感覺應(yīng)該拿點東西出來,然后花了一個星期的時間寫出來的!程序不算復(fù)雜,但是用到了不少數(shù)據(jù)結(jié)構(gòu)的東西,也用到了一些精彩的算法,加上windows的界面和游戲的可 玩性,寫完后受到了不少好評,我當時真的很佩服自己!但是現(xiàn)在看呢:沒有一句注釋,好多 丑陋的函數(shù)名比如:void chushihua(),好多沒有必要的變量,可以用簡單語句完成工作的我 使用華麗的算法,大量使用全局變量.....,說不好聽的話,六百多行的程序除了能運行之外就 是一陀屎!如果一年前我能聽到一些反面意見的話,大概我能早一點覺悟,但是自原代碼在 網(wǎng)站發(fā)布以來聽到的都是贊美之詞,沒有一個人向我提出程序改進的意見,這又說明了一個什 么問題呢?很值得思考??!
還有一個疑惑是:我們說的和做的真的一樣嗎?我在學校的時候曾經(jīng)受學院指派承辦過一個 計算機大賽,請了一個老師出決賽的題目,主要是一些算法題目,這個老師可能是我上大學以 來唯一敬佩的老師了,從程序調(diào)試到打分,對于每個程序都仔細分析其時間效率和空間效率,然后綜合打分,四十個人的卷子,老師從下午三點一直調(diào)試到晚上十點,在有些寫的精彩的語 句后還加上批注。我真是高興很遇到這樣的老師并且和他做深入的交流,但在事后,卻發(fā)生了 一件不愉快的事,在比賽中獲得第二名的學生找到我,說他程序全部調(diào)試成功應(yīng)該給他滿分,并且應(yīng)該得第一,我說不過他,最后調(diào)出了他的原程序和第一名的原程序?qū)Ρ龋e,兩個程 序都運行的很好,這時,那個同學開口了:“我的程序?qū)懙氖趾喗菝髁?,僅僅數(shù)行就完成了 題目要求,而他的卻寫了一大堆,為什么給他的分多過給我的分。”我當時很是氣憤,如果不 是老師負責的話,那么現(xiàn)在第一名和第二名的位置真的要互調(diào)了,拜托,不是程序的行數(shù)越少 程序的質(zhì)量就越高,我記得我跟他大談這方面的道理,最后說服他了!哈哈,但是我,只能說 說而已,我不知道還有多少人一樣,說起來頭頭是道,但心里卻壓根就從未重視過它!
3.我打算做的!
其實那天我想到的遠不止上面那么多,但是我不想再說了,因為我猜想看這篇文章的網(wǎng)友大 概都有一肚子的感想,一肚子的抱怨,借用這篇文章發(fā)泄可不是我想達到的目的,在上面我把 自己罵的一文不值也不是妄自菲薄,但是在某些方面我真的做錯了,或者說是偏離了正確方向,現(xiàn)在是矯正方向和重整旗鼓的時候了,就象我前面說過的,我相信中國有世界上最好的程序 員,我也相信我的水平不會一直保持現(xiàn)狀,我現(xiàn)在就收拾起牢騷真正的實干起來!真的很巧,就寫到這里的時候我在網(wǎng)上偶爾發(fā)現(xiàn)了這篇手冊,我不知道這預(yù)示著什么,但是 我想如果我照下面這個基本原則一直踏實做下去,我一定會實現(xiàn)我的理想---一名優(yōu)秀的軟件設(shè)計師!
(下面這些文字不是我的原創(chuàng),是我偶爾在網(wǎng)上發(fā)現(xiàn)的,我真的很幸運能看到這些,這篇文 章也隨著下面的文字而結(jié)束,我真心的希望您能從這篇文章中得到啟發(fā),這篇文章歡迎大家隨 意轉(zhuǎn)載?。?/p>
作者:金蝶中間件公司CTO袁紅崗
不知不覺做軟件已經(jīng)做了十年,有成功的喜悅,也有失敗的痛苦,但總不敢稱自己是高手,因為和我心目中真正的高手們比起來,還差的太遠。世界上并沒有成為高手的捷徑,但一些基 本原則是可以遵循的。
1.扎實的基礎(chǔ)。數(shù)據(jù)結(jié)構(gòu)、離散數(shù)學、編譯原理,這些是所有計算機科學的基礎(chǔ),如果 不掌握他們,很難寫出高水平的程序。據(jù)我的觀察,學計算機專業(yè)的人比學其他專業(yè)的人更能 寫出高質(zhì)量的軟件。程序人人都會寫,但當你發(fā)現(xiàn)寫到一定程度很難再提高的時候,就應(yīng)該想 想是不是要回過頭來學學這些最基本的理論。不要一開始就去學OOP,即使你再精通OOP,遇到 一些基本算法的時候可能也會束手無策。
2.豐富的想象力。不要拘泥于固定的思維方式,遇到問題的時候要多想幾種解決問題的 方案,試試別人從沒想過的方法。豐富的想象力是建立在豐富的知識的基礎(chǔ)上,除計算機以外,多涉獵其他的學科,比如天文、物理、數(shù)學等等。另外,多看科幻電影也是一個很好的途徑。
3.最簡單的是最好的。這也許是所有科學都遵循的一條準則,如此復(fù)雜的質(zhì)能互換原理 在愛因斯坦眼里不過是一個簡單得不能再簡單的公式:E=mc^2。簡單的方法更容易被人理解,更容易實現(xiàn),也更容易維護。遇到問題時要優(yōu)先考慮最簡單的方案,只有簡單方案不能滿足要 求時再考慮復(fù)雜的方案。
4.不鉆牛角尖。當你遇到障礙的時候,不妨暫時遠離電腦,看看窗外的風景,聽聽輕音 樂,和朋友聊聊天。當我遇到難題的時候會去玩游戲,而且是那種極暴力的打斗類游戲,當負 責游戲的那部分大腦細胞極度亢奮的時候,負責編程的那部分大腦細胞就得到了充分的休息。當重新開始工作的時候,我會發(fā)現(xiàn)那些難題現(xiàn)在竟然可以迎刃而解。
5.對答案的渴求。人類自然科學的發(fā)展史就是一個渴求得到答案的過程,即使只能知道 答案的一小部分也值得我們?nèi)ジ冻觥V灰銏远ㄐ拍?,一定要找到問題的答案,你才會付出精 力去探索,即使最后沒有得到答案,在過程中你也會學到很多東西。
6.多與別人交流。三人行必有我?guī)?,也許在一次和別人不經(jīng)意的談話中,就可以迸出靈 感的火花。多上上網(wǎng),看看別人對同一問題的看法,會給你很大的啟發(fā)。
7.良好的編程風格。注意養(yǎng)成良好的習慣,代碼的縮進編排,變量的命名規(guī)則要始終保 持一致。大家都知道如何排除代碼中錯誤,卻往往忽視了對注釋的排錯。注釋是程序的一個重 要組成部分,它可以使你的代碼更容易理解,而如果代碼已經(jīng)清楚地表達了你的思想,就不必 再加注釋了,如果注釋和代碼不一致,那就更加糟糕。
8.韌性和毅力。這也許是”高手"和一般程序員最大的區(qū)別。A good programming is 99 weat and 1ffee。高手們并不是天才,他們是在無數(shù)個日日夜夜中磨練出來的。成功能給 我們帶來無比的喜悅,但過程卻是無比的枯燥乏味。你不妨做個測試,找個10000以內(nèi)的素數(shù) 表,把它們?nèi)汲聛?,然后再檢查三遍,如果能夠不間斷地完成這一工作,你就可以滿足這 一條。
這些是我這幾年程序員生涯的一點體會,希望能夠給大家有所幫助。