A. 作為一個好的程序員,都需要具備哪些基本的素質和能力
我上班第一天我的老闆讓我做的第一件事
看兩篇文章:
程序員隨想
雷軍
我不是天生的程序員,也並非天生就喜歡電腦,上高中時也沒有想過將來會當程序員,接觸電腦純屬偶然--小時候的一個好朋友上大學時選擇了電腦專業,為了和這個朋友有更多的「共同語言」我便選擇了計算機系。在大學,我略窺電腦世界,開始為之「發燒」;畢業後,開始了一個程序員的職業生涯。
從開始寫程序到現在快十年了,寫過的程序不少。從這些年的風風雨雨中走過來,不能不有些體會。說到體會,最大的體會就是這條路太漫長。
一、一輩子有你 苦一點也願意
我沒有奢望大家把寫程序和文學創作相提並論,但其中的苦楚卻不是一個普通用戶能夠體味的。為了寫好一個程序,我們度過太多不眠之夜。有個朋友如此評價道,「寫程序簡直是在自殺,巨費精力巨費腦子巨累」。但還是有許多人不畏其苦,前仆後繼。
我剛接觸到電腦就發現電腦的妙處:電腦遠沒有人那麼復雜,如果你的程序寫得好,你就可以和電腦有著非常融洽的關系,就可以指揮電腦干你想乾的事,這個時候,你是十足的主宰。每每坐在電腦面前,你就如同在一個王國里巡行。
電腦里的世界很大,程序員是活在自己想像的王國里。你可以細微到電腦里的每一個位元組、每一個比特的東西。
這樣的日子簡直就是天堂般的日子,很多人都愛上了這樣的日子。
不少人認為程序員最多干到三十五歲就可以收山,腦子也差不多該歇歇了,並認為寫程序是年輕人的事情,到了一定年齡,估計沒什麼人再當程序員。
我剛畢業時,意氣風發,也想先吃點苦,到了三十歲就不幹了。年長一點後就發現了自己的無知。一個人大學畢業就二十一二歲,技術成熟一點後可能二十五,接著就是票子、妻子和房子等等諸多忙不完的事情。一切搞掂的時候,也許就是三十五歲。如果三十五歲就放棄的話,我們就不用選擇程序員的道路。
電腦進入我國時間不短,但真正大規模開始用,還是八五年PC登陸我國時候的事。因此國內真正寫電腦程序的人最長也就寫了十幾年(不知道是否還有這樣的人)。由於電腦應用在國內時間比較短,國內程序開發的主力以三十五歲以下的年輕人為主,但這並不表示程序員如同紅粉佳人般的容易衰老。美國和台灣地區的開發者以三四十歲的人為主。開始寫程序的時候,我們覺得沒有什麼不能做的(現在還能聽到這樣的豪言壯語),而且更要命的是,好象我們特別聰明,特別適合開發軟體,比老外強得多。當我們真正接觸那些傑出的國外開發人員的時候,發現他們太厲害了,都有十多年的開發經驗,絕對多數的產品出自這些有豐富開發經驗的程序員之手。
畢業後,編程不僅僅是愛好,而且成了一輩子的工作,可以肯定會干一輩子,雖然我沒有打算一生只干這一件事。用一生來編程是一件既容易又困難的事。如果碌碌無為,為交差寫點程序,這樣寫兩輩子的人都有。但如果想全身心地寫程序,寫十年都不是一件容易的事。現在我的不少朋友都洗手了,有時我也有這種想法,但一旦面對電腦,立刻頓悟:電腦還是自己最擅長乾的事,也是最順手的事。
二、我的未來不是夢
有的人刻苦學習編程技術,努力提高編程水平,並把高級程序員作為追求的目標,甚至是終身的奮斗目標。後來參與了真正的商品化軟體開發後,感到非常困惑和茫然。
當我上大學的時候,高級程序員也曾是我的目標。當時,我通過等級考試獲得了高級程序員證書,並在自己的名片上印上「高級程序員」的字樣。後來,我的水平提高了,似乎也成了大家認可的好程序員了。這個時候我卻開始茫然。我希望我的技術能得到別人的承認,當得到別人的承認後,我又能如何呢?後來我發現,無論成為多麼高級的程序員都沒用,關鍵是是否能夠出想法、出產品,你的勞動是否能被社會承認,是否能為社會創造財富。
我的未來是明確的,開發出高質量的適用社會的產品,為社會創造財富。
三、每一個程序都是藝術品
有人認為程序員沒有什麼了不起,不過是一種熟練工種而已;也有人把編程說成是藝術創作,捧上天。這兩種意見爭論比較激烈,甚至可以說針鋒相對。
我們換個工種來看,石匠應該是熟練工種,跟藝術似乎沾不上邊。;但正是這些石匠,給我們留下了數不勝數的文物古跡,如樂山大佛、莫高窟等等。應該說這此石匠給我們留下了無窮的文化財富。我認為編程的工作和石匠比較相似,是技術,也是藝術。
現代軟體工業已具相當規模,很多軟體的完成需要的是大兵團作戰。一名精通程序員接受編寫某一塊的任務後,往往只是寫代碼,發揮的餘地很小。在大項目中,很多程序員只能了解到和自己所編模塊相關的很局部的細節,另外還受到開發環境的限制,真的很難體會到自己在從事「藝術」創造,更多的時候是感到自己在從事重體力勞動。有的時候還擔心自己苦苦參與的這個項目究竟有沒有意義,是不是在同類產品中有競爭力,會不會開發出來以後就因為硬體的發展、操作系統的換代而過時......
編程是技術活,才有可能大規模進行,才會有軟體工程的理論。也正是編程具備藝術創作的特點,我們的生活才會有如此多的好軟體產品。寫一個程序需要付出腦力和體力,當我—我們—某個群體完成一個程序之後,在我們的眼裡,每一個程序就都是藝術品。
程序員應具備的素質
前言
程序員是一種技術工作,在IT的發展中有相當重要的地位,從底層硬體通訊協議的建立, 到數據傳輸層的處理,到操作系統的建設,到資料庫平台的建設,一直到應用層上各種數 據營銷平台的搭建,程序員在裡面都扮演著舉足輕重的角色並為IT事業的發展做出了巨大 的貢獻。
中國有很多精於編碼的人,但是中國軟體行業,尤其是網路應用開發方面誤區很大,很難形成有規模的軟體開發力量和產品能力,不但比美國差距甚遠,和印度相比也是頗有不 如。這些問題不是在於中國程序員的智商和工作努力狀況,也不是在於國家和民間對開發 的投入程度,而是很大程度上,有一些對技術,對程序開發,對項目設計方面的思想誤 區,這些誤區,導致了軟體行業的產品化能力不足,缺乏規模化和大型復用系統研發能 力,可以說,改變認識誤區,是解決軟體行業小作坊模式和個體英雄模式所帶來的局限性 的重要工作。
中國有很多小朋友,他們18,9歲或21,2歲,通過自學也寫了不少代碼,他們有的代碼寫的很漂亮,一些技術細節相當出眾,也很有鑽研精神,但是他們被一些錯誤的認識和觀點左右,缺乏對系統,對程序的整體理解能力,這些人,一個網上的朋友說得很好,他們實際 上只是一些Coding fans,壓根沒有資格稱為程序員,但是據我所知,不少小網路公司的 CTO就是這樣的coding fans,拿著嚇人的工資,做著嚇人的項目,項目的結局通常也很嚇人。
一、程序員基本素質
作一個真正合格的程序員,或者說就是可以真正合格完成一些代碼工作的程序員,應該具有的素質。
1:團隊精神和協作能力
把它作為基本素質,並不是不重要,恰恰相反,這是程序員應該具備的最基本的,也是最 重要的安身立命之本。把高水平程序員說成獨行俠的都是在囈語,任何個人的力量都是有 限的,即便如linus這樣的天才,也需要通過組成強大的團隊來創造奇跡,那些遍布全球 的為linux寫核心的高手們,沒有協作精神是不可想像的。獨行俠可以作一些賺錢的小軟 件發點小財,但是一旦進入一些大系統的研發團隊,進入商業化和產品化的開發任務,缺 乏這種素質的人就完全不合格了。
2:文檔習慣
說高水平程序員從來不寫文檔的肯定是乳臭未乾的毛孩子,良好的文檔是正規研發流程中 非常重要的環節,作為代碼程序員,30%的工作時間寫技術文檔是很正常的,而作為高級 程序員和系統分析員,這個比例還要高很多。
缺乏文檔,一個軟體系統就缺乏生命力,在未來的查錯,升級以及模塊的復用時就都會遇 到極大的麻煩。
3:規范化,標准化的代碼編寫習慣
作為一些外國知名軟體公司的規矩,代碼的變數命名,代碼內注釋格式,甚至嵌套中行縮 進的長度和函數間的空行數字都有明確規定,良好的編寫習慣,不但有助於代碼的移植和 糾錯,也有助於不同技術人員之間的協作。
有些coding fans叫囂高水平程序員寫的代碼旁人從來看不懂,這種叫囂只能證明他們自 己壓根不配自稱程序員。代碼具有良好的可讀性,是程序員基本的素質需求。
再看看整個linux的搭建,沒有規范化和標准化的代碼習慣,全球的研發協作是絕對不可 想像的。
4:需求理解能力
程序員需要理解一個模塊的需求,很多小朋友寫程序往往只關注一個功能需求,他們把性 能指標全部歸結到硬體,操作系統和開發環境上,而忽視了本身代碼的性能考慮,有人曾 經放言說寫一個廣告交換程序很簡單,這種人從來不知道在百萬甚至千萬數量級的訪問情 況下的性能指標是如何實現的,對於這樣的程序員,你給他深藍那套系統,他也做不出太 極鏈的並訪能力。性能需求指標中,穩定性,並訪支撐能力以及安全性都很重要,作為程 序員需要評估該模塊在系統運營中所處的環境,將要受到的負荷壓力以及各種潛在的危險 和惡意攻擊的可能性。就這一點,一個成熟的程序員至少需要2到3年的項目研發和跟蹤經 驗才有可能有心得。
5:復用性,模塊化思維能力
經常可以聽到一些程序員有這樣的抱怨,寫了幾年程序,變成了熟練工,每天都是重復寫 一些沒有任何新意的代碼,這其實是中國軟體人才最大浪費的地方,一些重復性工作變成 了熟練程序員的主要工作,而這些,其實是完全可以避免的。
復用性設計,模塊化思維就是要程序員在完成任何一個功能模塊或函數的時候,要多想一 些,不要局限在完成當前任務的簡單思路上,想想看該模塊是否可以脫離這個系統存在, 是否可以通過簡單的修改參數的方式在其他系統和應用環境下直接引用,這樣就能極大避 免重復性的開發工作,如果一個軟體研發單位和工作組能夠在每一次研發過程中都考慮到 這些問題,那麼程序員就不會在重復性的工作中耽誤太多時間,就會有更多時間和精力投 入到創新的代碼工作中去。
一些好的程序模塊代碼,即便是70年代寫成的,拿到現在放到一些系統裡面作為功能模塊 都能適合的很好,而現在我看到的是,很多小公司軟體一升級或改進就動輒全部代碼重 寫,大部分重復性工作無謂的浪費了時間和精力。
6:測試習慣
作為一些商業化正規化的開發而言,專職的測試工程師是不可少的,但是並不是說有了專 職的測試工程師程序員就可以不進行自測;軟體研發作為一項工程而言,一個很重要的特 點就是問題發現的越早,解決的代價就越低,程序員在每段代碼,每個子模塊完成後進行 認真的測試,就可以盡量將一些潛在的問題最早的發現和解決,這樣對整體系統建設的效 率和可靠性就有了最大的保證。
測試工作實際上需要考慮兩方面,一方面是正常調用的測試,也就是看程序是否能在正常 調用下完成基本功能,這是最基本的測試職責,可惜在很多公司這成了唯一的測試任務, 實際上還差的遠那;第二方面就是異常調用的測試,比如高壓力負荷下的穩定性測試,用 戶潛在的異常輸入情況下的測試,整體系統局部故障情況下該模塊受影響狀況的測試,頻 發的異常請求阻塞資源時的模塊穩定測試等等。當然並不是程序員要對自己的每段代碼都 需要進行這種完整測試,但是程序員必須清醒認識自己的代碼任務在整體項目中的地位和 各種性能需求,有針對性的進行相關測試並盡早發現和解決問題,當然這需要上面提到的 需求理解能力。
7:學習和總結的能力
程序員是人才很容易被淘汰,很容易落伍的職業,因為一種技術可能僅僅在三兩年內具有 領先性,程序員如果想安身立命,就必須不斷跟進新的技術,學習新的技能。
善於學習,對於任何職業而言,都是前進所必需的動力,對於程序員,這種要求就更加高 了。
但是學習也要找對目標,一些小coding fans們,他們也津津樂道於他們的學習能力,一 會學會了asp,一會兒學會了php,一會兒學會了jsp,他們把這個作為炫耀的資本,盲目 的追逐一些膚淺的,表面的東西和名詞,做網路程序不懂通訊傳輸協議,做應用程序不懂 中斷向量處理,這樣的技術人員,不管掌握了多少所謂的新語言,永遠不會有質的提 高。
善於總結,也是學習能力的一種體現,每次完成一個研發任務,完成一段代碼,都應當有 目的的跟蹤該程序的應用狀況和用戶反饋,隨時總結,找到自己的不足,這樣逐步提高, 一個程序員才可能成長起來。
一個不具備成長性的程序員,即便眼前看是個高手,建議也不要選用,因為他落伍的時候 馬上就到了。
具備以上全部素質的人,應當說是夠格的程序員了,請注意以上的各種素質都不是由IQ決 定的,也不是大學某些課本里可以學習到的,需要的僅僅是程序員對自己工作的認識,是一種意識上的問題。
二、高級程序員/項目設計者還需具備的素質
那麼作為高級程序員,以至於系統分析員,也就是對於一個程序項目的設計者而言,除了應該具備上述全部素質之外,還需要具備以下素質:
第一,需求分析能力
對於程序員而言,理解需求就可以完成合格的代碼,但是對於研發項目的組織和管理者, 他們不但要理解客戶需求,更多時候還要自行制定一些需求,為什麼這么說呢?
一般而言,進行研發任務,也許是客戶提出需求,也許是市場和營銷部門提出的需求,這 時候對於研發部門,他們看到的不是一個完整的需求,通常而言,該需求僅僅是一些功能 上的要求,或者更正規些,可能獲得一個完整的用戶視圖;但是這都不夠,因為客戶由於 非技術因素多一些,他們可能很難提出完整和清晰,或者說專業性的性能需求,但是對於 項目組織者和規劃者,他必須能夠清醒認識到這些需求的存在並在完成需求分析報告的時 候適當的提出,同時要完整和清晰的體現在設計說明書裡面,以便於程序員編碼時不會失 去這些准則。
程序設計者必須正確理解用戶需求所處的環境,並針對性做出需求的分析,舉例而言,同 樣一個軟體通過ASP租用方式發布和通過License方式發布,性能需求可能就是有區別的, 前者強調的是更好的支撐能力和穩定性,而後者則可能更強調在各種平台下的普適性和安 裝使用的簡捷性。
第二,項目設計方法和流程處理能力
程序設計者必須能夠掌握不少於兩到三種的項目設計方法(比如自頂至下的設計方法,比如快速原型法等等),並能夠根據項目需求和資源搭配來選擇合適的設計方法進行項目的 整體設計。
設計方法上選擇不當,就會耽誤研發周期,浪費研發資源,甚至影響研發效果。
一個程序設計者還需要把很多功夫用在流程圖的設計和處理上,他需要做數據流圖以確立 數據詞典;他需要加工邏輯流圖以形成整體的系統處理流程。
一個流程有問題的系統,就算代碼多漂亮,每個模塊多精緻,也不會成為一個好的系統。 當然,做好流程分析並選擇好項目設計方法,都需要在需求分析能力上具有足夠的把 握。
第三,復用設計和模塊化分解能力
這個似乎又是老調重談,前面基本素質上不是已經說明了這個問題嗎?
作為一個從事模塊任務的程序員,他需要對他所面對的特定功能模塊的復用性進行考慮, 而作為一個系統分析人員,他要面對的問題復雜的多,需要對整體系統按照一種模塊化的 分析能力分解為很多可復用的功能模塊和函數,並針對每一模塊形成一個獨立的設計需 求。舉個例子,好比是汽車生產,最早每輛汽車都是獨立安裝的,每個部件都是量身定做 的,但是後來不一樣了,機器化大生產了,一個汽車廠開始通過流水線來生產汽車,獨立 部件開始具有一定的復用性,在後來標准化成為大趨勢,不同型號,品牌甚至不同廠商的 汽車部件也可以進行方便的換裝和升級,這時候,汽車生產的效率達到最大化。軟體工程 也是同樣的道理,一個成熟的軟體行業,在一些相關項目和系統中,不同的部件是可以隨 意換裝的,比如微軟的許多桌面軟體,在很多操作模塊(如打開文件,保存文件等等)都 是復用的同一套功能模塊,而這些介面又通過一些類庫提供給了桌面應用程序開發者方便 掛接,這就是復用化的模塊設計明顯的一個佐證。
將一個大型的,錯綜復雜的應用系統分解成一些相對獨立的,具有高度復用性的,並能僅 僅依靠幾個參數完成數據聯系的模塊組合,是作為高級程序員和系統分析員一項最重要的 工作,合適的項目設計方法,清晰的流程圖,是實現這一目標的重要保證。
第四,整體項目評估能力
作為系統設計人員,必須能夠從全局出發,對項目又整體的清醒認識,比如公司的資源配 置是否合理和到位,比如工程進度安排是否能最大化體現效率又不至於無法按期完成。評 估項目整體和各個模塊的工作量,評估項目所需的資源,評估項目可能遇到的困難,都需 要大量的經驗積累,換言之,這是一種不斷總結的累計才能達到的境界。在西方一些軟體 系統設計的帶頭人都是很年長的,比如4,50歲,甚至更老,他們在編碼方面已經遠遠不 如年輕人那樣活絡,但是就項目評估而言,他們幾十年的經驗積累就是最重要和寶貴的財 富。中國缺這么一代程序員,主要還不是缺那種年紀的程序員,而是那種年紀的程序員基 本上都是研究單位作出來的,都不是從專業的產品化軟體研發作出來的,他們沒有能積累 那種產品化研發的經驗,這也是沒有辦法的事情。
第五,團隊組織管理能力
完成一個項目工程,需要團隊的齊心協力,作為項目設計者或研發的主管人,就應當有能 力最大化發揮團隊的整體力量,技術管理由於其專業性質,不大同於一般的人事管理,因為這裡面設計了一些技術性的指標和因素。
首先是工作的量化,沒有量化就很難做到合適的績效考核,而程序量化又不是簡單的代碼 行數可以計算的,因此要求技術管理人員需要能真正評估一個模塊的復雜性和工作量。
其次是對團隊協作模式的調整,一般而言,程序開發的協作通常分為小組進行,小組有主 程序員方式的,也有民主方式的,根據程序員之間的能力水平差距,以及根據項目研發的 需求,選擇合適的組隊方式,並能將責權和成員的工作任務緊密結合,這樣才能最大發揮 組隊的效率。
一個代碼水平高的人,未必能成為一個合格的項目研發主管,這方面的能力欠缺往往是容 易被忽視的。
綜上可以看到,作為一個主管研發的負責人,一個項目設計者,所需要具備的素質和能力 並不是程序代碼編寫的能力,當然一般情況下,一個程序員通過不斷的總結提高達到了這種素質的時候,他所具有的代碼編寫能力也已經相當不簡單了,但是請注意這裡面的因果 關系,一個高水平的項目設計者通常已經是代碼編寫相當優秀的人了,但是並不是一個代 碼相當優秀的程序員就可以勝任項目設計的工作,這裡面存在的也不是智商和課本的問 題,還是在於一個程序員在積累經驗,逐步提升的時候沒有意識到應當思考哪方面的東 西,沒有有意識的就項目的組織和復用設計進行揣摩,沒有經常性的文檔習慣和總結習 慣,不改變這些,我們的合格的項目設計者還是非常欠缺。
另外,為防止有無聊的人和我較真,補充一點,本文針對目標是作商業化的軟體項目和工程,那些科研機構的編程高手,比如演算法高手,比如圖象處理高手,他們的工作是研究課題而非直接完成商業軟體(當然最終間接成為商業產品,比如微軟研究院在作的研究課 題),因此他們強調的素質可能是另外的東西,這些人(專家),並不能說是程序員,不能用程序員的標准去衡量。
三、軟體項目研發的設計流程
最後補充一點東西,一個軟體項目研發的設計流程是怎樣的呢?以通常標準的設計方法為例,(不過筆者喜歡快速原型法)。
第一個步驟是市場調研
技術和市場要結合才能體現最大價值。
第二個步驟是需求分析
這個階段需要出三樣東西,用戶視圖,數據詞典和用戶操作手冊。
用戶視圖是該軟體用戶(包括終端用戶和管理用戶)所能看到的頁面樣式,這裡麵包含了 很多操作方面的流程和條件。
數據詞典是指明數據邏輯關系並加以整理的東東,完成了數據詞典,資料庫的設計就完成 了一半多。
用戶操作手冊是指明了操作流程的說明書。
請注意,用戶操作流程和用戶視圖是由需求決定的,因此應該在軟體設計之前完成,完成 這些,就為程序研發提供了約束和准繩,很遺憾太多公司都不是這樣做的,因果顛倒,順 序不分,開發工作和實際需求往往因此產生隔閡脫節的現象。
需求分析,除了以上工作,筆者以為作為項目設計者應當完整的做出項目的性能需求說明 書,因為往往性能需求只有懂技術的人才可能理解,這就需要技術專家和需求方(客戶或 公司市場部門)能夠有真正的溝通和了解。
第三個步驟是概要設計
將系統功能模塊初步劃分,並給出合理的研發流程和資源要求。 作為快速原型設計方法,完成概要設計就可以進入編碼階段了,通常採用這種方法是因為 涉及的研發任務屬於新領域,技術主管人員一上來無法給出明確的詳細設計說明書,但是 並不是說詳細設計說明書不重要,事實上快速原型法在完成原型代碼後,根據評測結果和 經驗教訓的總結,還要重新進行詳細設計的步驟。
第四個步驟是詳細設計
這是考驗技術專家設計思維的重要關卡,詳細設計說明書應當把 具體的模塊以最』干凈』的方式(黑箱結構)提供給編碼者,使得系統整體模塊化達到最 大;一份好的詳細設計說明書,可以使編碼的復雜性減低到最低,實際上,嚴格的講詳細 設計說明書應當把每個函數的每個參數的定義都精精細細的提供出來,從需求分析到概要 設計到完成詳細設計說明書,一個軟體項目就應當說完成了一半了。換言之,一個大型軟 件系統在完成了一半的時候,其實還沒有開始一行代碼工作。
那些把作軟體的程序員簡單理解為寫代碼的,就從根子上犯了錯誤了。
第五個步驟是編碼
在規范化的研發流程中,編碼工作在整個項目流程里最多不會超過1/ 2,通常在1/3的時間,所謂磨刀不誤砍柴功,設計過程完成的好,編碼效率就會極大提 高,編碼時不同模塊之間的進度協調和協作是最需要小心的,也許一個小模塊的問題就可 能影響了整體進度,讓很多程序員因此被迫停下工作等待,這種問題在很多研發過程中都 出現過。編碼時的相互溝通和應急的解決手段都是相當重要的,對於程序員而言,bug永 遠存在,你必須永遠面對這個問題,大名鼎鼎的微軟,可曾有連續三個月不發補丁的時候 嗎?從來沒有!
第六個步驟是測試
測試有很多種:
按照測試執行方,可以分為內部測試和外部測試
按照測試范圍,可以分為模塊測試和整體聯調
按照測試條件,可以分為正常操作情況測試和異常情況測試
按照測試的輸入范圍,可以分為全覆蓋測試和抽樣測試
以上都很好理解,不再解釋。
總之,測試同樣是項目研發中一個相當重要的步驟,對於一個大型軟體,3個月到1年的外 部測試都是正常的,因為永遠都會又不可預料的問題存在。
完成測試後,完成驗收並完成最後的一些幫助文檔,整體項目才算告一段落,當然日後少 不了升級,修補等等工作,只要不是想通過一錘子買賣騙錢,就要不停的跟蹤軟體的運營 狀況並持續修補升級,知道這個軟體被徹底淘汰為止。
寫這些步驟算不上賣弄什麼,因為實話講我手邊是一本《軟體工程》,在大學里這是計算 機專業的必修課程,但是我知道很多程序員似乎從來都只是熱衷於什麼《30天精通VC》之 類的,他們有些和我一樣游擊隊出身,沒有正規學過這個專業,還有一些則早就在混夠學 分後就把這些真正有用的東西還給了老師。
網上現在也很浮躁,一些coding fans亂嚷嚷,混淆視聽,實際上真正的技術專家很少在 網上亂發帖子的,如筆者這樣不知天高地厚的,其實實在是算不上什麼高手,只不過看不 慣這種對技術,對程序員的誤解和胡說,只好挺身而出,做撥亂反正之言,也希望那些還 沉迷於一些錯誤人士的coding fans們能認真想想,走到正途上,畢竟那些聰明的頭腦還 遠遠沒有發揮應有的價值。
B. 程序員羊皮卷的前言——自由與規則
是不是困惑自己投的簡歷石沉大海,找到好工作的總是另有他人?
是不是痛苦自己每天工作悶悶不樂,像所有的人都在和自己作對?
是不是不解自己努力工作似黃牛,別人卻加薪升職有另有高就?
是不是苦惱自己工作重復又單調,只見曲折的現在不見有前途?
如果上述問題的答案都是「否」,請您把這本書直接放回書架,否則,請您把它帶回家。擁有它,讀懂它,快樂的工作,快樂的生活!
年輕人走入社會的時候都會發現一件事——世界掌握在年紀比自己大的人手中。這些人制定並實施著規則。君不見大學生求職的時候也收起驕傲,開始照藝術照、按公司要求填寫簡歷、穿職業裝去面試;君不見進入職場之後,年輕人越來越循規蹈矩,學會了拍馬、學會了逢迎、學會了沉默;君不見職業人士所謂的白領其實不過是些按規則辦事的傀儡,沒有自己的思想,有的甚至失去了靈魂。這樣工作不快樂,生活也難有幸福感。我們應該怎麼辦?
您手中的這本書會給個答案。
書中涵蓋了從如何讀大學、怎樣求職、應對職場政治直至技術人員創業的每個方面。以程序員的成長為主線,講述其中遇到的困難和問題以及相應的解決方法。本書第四部分羊皮卷的實踐里,還提供了「9大職業規劃工具箱」來幫助大家看清前路、飛越迷霧。
過去12年裡,我本人經歷了外企、國企、民企之後,把自己能看明白、想清楚的職場法則都寫進了本書,希望讓大家在職業路上少走彎路、少摔跤、盡快成長與自我完善。所以,本書其實是本講解職場規則的書。
想改變規則嗎?那麼第一步是全面在此了解它,然後把規則運用的比制定他的人還要好,之後我們才有資格來改寫、重寫。百尺竿頭站腳,千層浪里翻身。只有如此,我們才能打贏職場里沒有硝煙的戰爭,為自己贏得一席之地;只有如此,我們才有資格去追求自我實現和上升空間;有隻如此,我們才有機會快樂的工作,快樂的生活!
能快樂的生活、工作,我們會離會自由更近。
您看這本書的時候,我正在第三次創業的路上,希望這次能成功。鉛化洗盡之後,33歲我的職業是——自由。
在這里我還想感謝08年12月最早跟我約書稿的原清華出版社陳禹成編輯,因為種種原因我們沒有就本書合作成功,但是卻成了很好的朋友。他推薦我到北京博文公司,我與北京博文愉快的合作之後,出版了您手中拿到的《程序員羊皮卷》。
最後,特別感謝在本書出版過程中給予我很大幫助的孫學瑛老師和顧慧芳老師。
C. C語言經典編程282例的前言
學會站在巨人的肩膀上!
軟體開發的終極目標是完成滿足用戶需求的軟體。一個軟體往往包含復雜的功能,作為一名程序員,需要在有限的時間內實現它們,這對於新手而言並不容易。為什麼富有開發經驗的程序員編程效率非常高呢?答案就是他們做過類似的程序,適當修改以前的代碼,就可以滿足現在的要求。因此,如何快速積累編程經驗就成了新手的當務之急。顯然,單單依靠項目來積累編程經驗是非常慢的。
本書圖文並茂、難易並舉,匯集了282個日常開發中應用廣泛的實例,內容涵蓋了C語言編程的方方面面。每個實例分為實例說明、實現過程和技術要點3部分進行講解。通過對本書的學習,不僅能快速掌握相關知識點,還可以逐步提升編程能力。
本書內容
本書以C語言的基礎知識結構為框架,給出了每部分知識中可能遇到的疑難問題或開發技巧。本書共分17章,主要包括初識C語言、簡單的C程序、演算法入門、常用數據類型、運算符與表達式、數據輸入與輸出函數、選擇和分支結構程序設計、循環結構、數組、函數編程基礎、指針、常用數據結構、位運算操作符、存儲管理、預處理和函數類型、文件讀寫、圖形圖像處理。
為了更清晰地闡述問題和給出問題的解決方案,本書設置了以下欄目。
* 實例說明:詳細描述本實例的用途,並給出實例的運行結果圖。
* 實現過程:逐步講解如何解決本實例的問題,並給出關鍵代碼、注意事項等。
* 技術要點:對本實例使用的關鍵技術進行總結,方便日後使用。
本書特色
* 貼近應用。本書精選的實例都真正來自開發一線。以實例形式進行講解,使其更容易被讀者接受。
* 橫向鏈接。本書知識框架與《C語言開發入門及項目實戰》一書相對應,可以在學習完《C語言開發入門及項目實戰》一書的基礎上使用本書,以提高自己的技能。
* 解析透徹。本書對每個問題的相關知識進行細致地講解,並進行知識拓展,使讀者不僅知其然而且知其所以然。
* 授人以漁。本書在講解技術的同時,還注重對讀者能力的培養,使讀者掌握分析問題與解決問題的能力。
本書配套資源
本書提供了內容豐富的配套資源,包括源程序、素材,以及模塊庫、案例庫、題庫、素材庫等多項輔助內容,讀者朋友可以通過如下方式獲取。
第1種方式:
(1)登錄清華大學出版社的網站,在網頁右上角的搜索文本框中輸入本書書名(注意區分大小寫和留出空格),或者輸入本書關鍵字,或者輸入本書ISBN號(注意去掉ISBN號間隔線「-」),單擊「搜索」按鈕。
(2)找到本書後單擊超鏈接,在該書的網頁下側單擊「網路資源」超鏈接,即可下載。
第2種方式:
訪問本書的新浪微博C語言圖書,找到配套資源的鏈接地址進行下載。
讀者人群
本書非常適合以下人員閱讀:
? C語言編程行業的開發人員
? 有一定語言基礎,想進一步提高技能的人員
? 大中專院校的老師和學生
? 即將走向工作崗位的大學畢業生
? 相關培訓機構的老師和學員
? C語言編程愛好者
D. java程序員面試指南的前言
從企業面試的角度來梳理Java程序員的技術功底
以技術經理的眼光來審視對Java編程知識的掌握
隨著Java框架的逐漸成熟,其功能越來越強大,使用越來越簡便,其使用范圍越來越廣,使用人數也越來越多。Java在帶來方便的同時,無形中也帶了不便,作為軟體開發的王牌語言,各企業對Java程序員的要求也不斷的提升,所以,求職面試成了Java程序員們最頭疼又不得不面對的現實。為了給廣大Java程序員面試提供最貼心的指導,作者搜集整理了大量Java程序員面試的資料,並結合自己主持面試的經歷,寫作了本書,希望能對廣大Java程序員的面試具有一定的指導意義。
求職者在面試中的常見問題
同樣作為軟體開發出身的我,身邊有朋友,也有同事。在和他們交談的過程中,我發現如今的面試難度要比以往難得多,自以為准備得很充分,胸有成竹地認為可以順利通過,但事實並非如同他們預想的那樣,面試常見的問題如下:
(1)面試過程中不是題目頗深就是難度頗大,不經過縝密細致的思考是不會得出正確答案的。例如:,String s = new String(xyz);創建了幾個String Object呢?這個問題還真得好好想想,不要輕易地下結論。
(2)陷阱是又多又狠,隱藏得很深,沒有一雙慧眼還真難辨虛實。例如:,if(-0.0 == 0.0)是相等還是不等?
(3)面試的花樣也越來越多,在比較傳統的筆試→面試的基礎上,又增加了相當折磨人的「魔鬼測試」→「壓力測試」,而且這種測試相當火,很多招聘企業都在使用。例如:,「你都將自身排到最終一名了,你還會被錄用嗎?」如果你是面試者該怎樣回答呢?
(4)增加了綜合測試及外語能力測試。如今商品都實行了面向全球化,自然IT領域也有面向全球的發展驅趨勢,同時,隨著越來越多的外藉籍人員的加入,很多企業不得不對外語提高重視力度。面對這樣那樣的問題,有些經驗豐富的高級程序員都應接不暇,更何況是剛走出校園的白面小生。例如:,考官會讓面試者用英文進行自我介紹,這是外語能力測試最基礎的測試內容。
本書的特點
針對上面的種種情況,筆者憑借在IT界多年的工作經驗和多個大型實際項目開發的優勢,由原來的一個普通職員晉升為一個去考別人的主考官,主要負責公司技術人員的面試工作,通過一年多的面試經驗和與公司內資歷比較深厚的HR經理的多次交流,總結了一些面試中常見的問題,對考官提出的災難性問題給出了巧妙的應答。從面試題目內容的角度總結和歸納出知識點,幫助讀者快速准備Java程序員的面試,提高晉級的機會。
需要聲明的是,本書不是一本教程,不會細致到每一個操作步驟的說明、每一個細節的詳細講解、每一個開發工具的安裝過程。本書主要是為有了一定Java基礎卻無法應對面試的人而服務的。通過一些建議和方法幫助他們盡快就職。
建議讀者在熟練掌握相關技術內容後再閱讀本書,也不要認為「寶典」是一本萬能書,一個合格的程序員,不是混過面試就能萬事大吉的,具備扎扎實實的編程技術才是最重要的。本書具有如下特點:
· 針對性強,用來幫助讀者應對Java程序員面試。主要包括職業規劃的設定、中英文簡歷的製作、簡歷投遞的注意事項、如何加大簡歷的瀏覽數量、面試的相關流程和應對突發事件的技巧等。
· 考前回顧,在進入每章的試題分析之前,都會有相應的知識點回顧,可以幫助讀者理解該章的考試重點。
· 選取各大公司的經典試題,每個試題都會有詳細的試題分析,可以幫助讀者加深理解。
· 層次分明,會對重點內容進行細致的講解和描述,對次要的內容講解篇幅略短,有的甚至會一帶而過,可以幫助讀者分清主次,了解應該在哪些地方多下功夫下工夫,不會出現盲目不知所措的局面。
· 涉及內容廣泛,涉及技術新,例如在其他相關面試書籍中從未出現過的EJB3.0規范等內容。
· 操作性強,本書含有大量經典的、出現頻率頗高的上機測試題,可以幫助讀者加深理解。
E. 請問大學生職業規劃書的摘要要寫什麼,大概多少個字
主要是要把職業生涯規劃寫清楚就可以了,字數一般是由自己定,大概的形式如下:一、前言
在就業壓力日趨激烈的今天,一個良好的職業規劃無疑增加了一份自信.而如今,身為大學生的我們,在一天天消磨時光的日子裡,不如多學習點知識來充實自己.未來掌握在自己手中,趁現在還年輕,趕緊為自己的未來之路定好一個方向,一個好的規劃就像燈塔一樣為我們指明了方向,我們可以按照這個方向前進!
二、自我剖析
1)興趣愛好:看書,聽音樂,下棋,Photoshop等
2)特長:資料庫維護管理,熟練掌握OFFICE 系列等。
3)人格描述:
· 依靠理智的思考來做決定,總是採取客觀、合乎邏輯的步驟。
· 謹慎而傳統,重視穩定性、合理性。
· 喜歡先充分收集各種信息。
· 是一個認真而嚴謹的人,勤奮而負有責任感。
· 看問題有很強的批判性,通常持懷疑態度,需要時常的換位思考,更廣泛的收集信息,並理智的評估自己的行為帶來的可能後果。
4)在工作和學習中的優勢
1. 辦事精確,希望第一次就能把工作做好
2. 樂意遵循確定的日常安排和傳統的方針政策,是組織忠誠的維護者、支持者
3. 每次都能十分專注地把注意力集中在一個項目或任務上
4. 特別能夠專心細致地工作,可以不需要別人的合作獨立工作
5. 靈敏的組織能力
6. 一絲不苟、認真專注地對待具體問題、事實和細節
7. 相信傳統模式的可取之處,並且能夠遵循傳統模式
8. 非常強的責任意識;別人可以信任你實現自己的諾言
9. 通情達理、視角現實 10. 有穩定平和的心態
5.)在工作和學習中的不足
1. 不願意嘗試、接受新的和未經考驗的觀點和想法
2. 對變化感到不安,可能會有些僵硬、死板;排斥革新
3. 對需要很長時間才能完成的任務缺乏耐心
4. 有時會由於近期目標而忽略長遠需要
5. 不願意促成必要的改變,不願意支持有風險的行為
6. 見到實際應用後的結果才肯接受新觀點
7. 不能理解與他們自己的要求不同的要求
8. 對自己及自己對組織的貢獻估計過低
9. 缺乏挑戰精神,對失敗和挫折的承受力差
10.缺乏相應的工作經驗
6)相應措施
針對我的缺點與不足,我應該採取一定的措施來彌補我的缺陷:
1. 避免墨守陳規,需要嘗試新的東西
2. 考慮問題要更全面周到,需要考慮人的因素 ,不單單只考慮自己的利益和感受
3. 對那些與我觀點不同的人保持足夠的耐心和虛心
4. 適合的時候,主動承擔一些工作
5. 正確看待失敗,碰到困難不隨意放棄
6. 增強做事的靈活性,學會變通的看待和接受新事物
三、職業傾向分析
適合的崗位性質:
· 工作環境穩定,不需要太多的冒險和變動,最好依照經驗和規律解決事情
· 有較多的獨立工作時間,可以專心的完成整個項目或任務
· 較多使用事實、細節和運用實際經驗的技術性工作,能夠充分發揮自己精細、准確、邏輯性強的才能
· 工作對象是具體的產品或服務,工作成果要有形並且可以衡量
· 要有明確的工作目標和清晰的組織結構層次
· 工作有足夠的准備和實施時間,在交付成果之前能夠進行自我成就評估
四、職業目標選擇
根據我的個人興趣和適合我的崗位性質,我初步定下適合我的職業有這些:
1、DBA:目前我已經考過OCA、OCP 證書,專業是資料庫管理專業,英語大學四級水平,能夠做一個資料庫管理員(DBA)
2、C#軟體工程師:比較資料庫管理而言我更喜愛編程,在大學期間學習幾種語言,但對C#情有獨鍾,並且用C#作了一些項目參加學院創新杯獲得二等獎,最重要的是我太愛編程啦
3、 程序員:熟悉各種程序語言,有很好的邏輯 IQ:121,喜歡編程。
4、網站設計師:我個人愛好網頁設計,Photoshop
5、Php、.NET 開發工程師:如今技術能夠獨立運用php以及asp.net完成一個小型的網站
6、宣傳部文員:自幼愛好文學,且在班級以及甲骨文俱樂部做宣傳這一塊的工作,對宣傳有一定的經驗
7、軟體測試員:學過軟體測試,對資料庫以及編程都很熟悉或者說是精通,然而不是太有耐心,對這個行業不是太感興趣。
五、未來十年職業規劃
2009-2010 學好專業知識,認真看高數、英語、馬克思理論、數據結構、計算機組成與原理為考深大做准備
2010-2012年從深圳職業技術學院畢業考入深圳大學計算機科學與技術專業本科插班生學習兩年
2012年7月開始工作的職位是資料庫設計人員,積累經驗。
2014年成為中級技術工程師
2016年後成為高級技術工程師
2018年後朝管理方向發展
六、總結
任何目標,只說不做到頭來都會是一場空。然而,現實是未知多變的,定出的目標計劃隨時都可能遭遇問題,要求有清醒的頭腦。一個人,若要獲得成功,必須拿出勇氣,付出努力、拼搏、奮斗。成功,不相信眼淚;未來,要靠自己去打拚!實現目標的歷程需要付出艱辛的汗水和不懈的追求,不要因為挫折而畏縮不前,不要因為失敗而一蹶不振;要有屢敗屢戰的精神,要有越挫越勇的氣魄;成功最終會屬於你的,每天要對自己說:「我一定能成功,我一定按照目標的規劃行動,堅持直到勝利的那一天。」既然選擇了認准了是正確的,就要一直走下去。在這里,這份職業生涯規劃也差不多落入尾聲了,然而,我的真正行動才僅僅開始。現在我要做的是,邁出艱難的一步,朝著這個規劃的目標前進,要以滿腔的熱情去獲取最後的勝利。
F. Shell腳本快速學習指南的前言
剛開始使用UNIX(注1)的用戶與程序員突然面對各式各樣的程序時,都會有很多疑問,例如「它們的功能是什麼」,還有「我怎麼使用它們」。
本書可以回答你這些問題。告訴你如何結合UNIX工具,將其與標準的Shell相結合完成工作。Shell腳本的編寫是門藝術,需要的不只是Shell語言的相關知識,還要你對各個獨立的UNIX程序有基本認識:為什麼會有這些工具,要怎麼單純地使用它們,怎麼將它們與其他程序結合應用。
為什麼需要學習如何編寫Shell命令?因為大部分情況下,中型到大型的問題都能拆成較小的部分,這些小部分也多半都能找到現成的UNIX工具處理。用心編寫的好用Shell腳本常常能夠比C或C++語言編寫的程序更快地解決相同的問題。也可以讓Shell腳本提供可移植性,也就是說,可以跨越UNIX與POSIX兼容的系統,有時僅需略作修改,甚至不必修改,即可使用。.
談到UNIX程序時,我們使用工具(tool)這個字。以UNIX工具箱(toolbox)的做法解決問題,長久以來以「軟體工具(Software Tools)」哲學(注2)為人所熟知。
瑞士軍刀是很多人口袋裡的好幫手。它有刀刃、螺絲起子、開罐器、牙簽等工具。功能更齊備的,還有其他像拔塞鑽、放大鏡等工具。瑞士軍刀能派上用場的時候很多,雖然用它來修削和進行簡單雕刻很不錯,但你絕不會拿它來蓋狗屋或製作鳥類餵食器。相反,做這類工作時你會尋求更專門的工具,例如鐵槌、鋸子、夾鉗或刨刀等。同理,當你在解決程序化問題時,使用專門的軟體工具會比較好。
這是給誰看的書
這本書是寫給那些在UNIX環境下發現必須寫些Shell腳本,以利於工作進行的計算機用戶與軟體開發人員。例如,你可能是正在念計算科學的學生,手上有學校給你的第一個UNIX系統賬號,你想知道在UNIX下更多的東西,例如你的Windows個人計算機無法處理的那些工作(這種情況下,你通常得寫幾個腳本來定製個人環境)。或者,你可能是個系統管理新手,需要為公司或學校寫幾個專用程序(可能是處理事件日誌文件,賬號、賬單管理之類的事情)。你也可能是Mac OS的開發老手,但轉到嶄新的Mac OS X的世界,它的安裝程序是以Shell腳本寫成。不管你來自哪裡,如果你想學Shell腳本,這本書就是寫給你的。在這本書里你能學到:
軟體工具設計概念與原則
一些好的軟體工具設計與實例上的實踐規則。我們會解釋這些原則,還會在這本書里貫徹執行。
UNIX工具是什麼
UNIX的核心工具組會在我們編寫Shell腳本時不斷地重復使用。我們會介紹Shell與正則表達式的基本概念,並在解決特定問題時展現各種核心工具的用法。除了介紹工具能做什麼之外,我們還會告訴你,為什麼要使這個工具,為什麼它有這些特殊選項。
《Learning UNIX》這本書是在介紹UNIX系統,讓你從對UNIX毫無經驗成長為會基本操作的用戶。《UNIX in a Nutshell》這本書則是廣泛地介紹UNIX工具包,對於使用時機與特定工具用法的介紹很少。我們的目的就在彌補這兩本書之間的鴻溝:如何靈活運用這些UNIX提供的工具包,讓工作更順暢,更有效率,也更從容(我們的期望)。
何結合所有工具,完成工作
編寫Shell腳本時,其實會是「整體的功能比各部分加起來的總和還強大」。Shell的使用就像整合個別工具的黏著劑,讓你只要花點心思,就能得到驚人的效果。
標准工具幾個常見的擴展
如果你已經是GNU/Linux或BSD系統的用戶,很可能你的工具還有其他額外的、好用的功能或選項。這部分我們也會介紹。
不可或缺的非標准工具
有些程序,在大部分傳統的UNIX系統里並非「標準的」,但我們又不能沒有它。我們會在適當的地方介紹它們,也會提供使用時機的相關信息。
對長期使用UNIX的開發人員與管理者來說,軟體工具的設計原則一直沒有什麼改變。因此,推廣的書籍雖然還算堪用,但已經20年未更新了,甚空更久!UNIX系統在這些書寫成之後,有了許多變動。因此,我們覺得是更新這些想法的時候了,我們利用這些工具的現行版本、在現行系統下展示範例。下面是我們將要強調的部分:
所有的呈現是以POSIX為基礎。POSIX為一系列描述可移植操作系統環境的標准正式名稱的縮寫。POSIX標準是開發人員的挑戰,他們必須兼顧程序與Shell腳本在不同廠商所提供的各種平台上的可移植性。我們將在最新的POSIX標准下展現Shell語言、各個工具程序及其選項
G. 一個好的程序員至少應該具備哪些條件
樓上的幾位顯然誤會我的意思了,我並不是說不應當寫文檔加註釋注重團隊精神,看看下面的一篇文章,那位三天就寫出UNIX的他需要寫文檔注釋和團隊精神嗎,他用不著。哪個高手沒有一點傲氣和自信,他之所以敢對用戶說:拿到你想要的,然後滾蛋,你已經很幸運了!是因為他有這個資本。天才本就不循規蹈矩,那樣他就不叫天才了。
MIT BBS上說微軟電話面試的一道題就是「Who do you think is the best coder,
and why?」。我覺得挺有意思的,也來湊個熱鬧。排名不分先後。
Bill Joy, 前任Sun的首席科學家,當年在Berkeley時主持開發了最早版本的BSD。他還
是vi和csh的作者。當然,Csh Programming Considered Harmful 是另一個話題樂。據
說他想看看自己能不能寫個操作系統,就在三天里寫了個自己的Unix, 也就是BSD的前
身。當然是傳說了,但足見他的功力。另一個傳說是,1980年初的時候,DARPA讓BBN在
Berkley Unix里加上BBN開發的TCP/IP代碼。但當時還是研究生的B伯伯怒了,拒絕把BBN
TCP/IP加入BSD,因為他覺得BBN的TCP/IP寫得不好。於是B伯伯出手了,端的是一箭封
喉,很快就寫出了高性能的伯克利版TCP/IP。當時 BBN和DARPA簽了巨額合同開發TCP/IP
Stack,誰知他們的代碼還不如一個研究生的好。於是他們開會。只見當時B伯伯穿
個T-shirt出現在會議室(當時穿T-shirt不象現在,還是相當散漫的哈)。只見BBN問:你
怎麼寫出來的?而B伯伯答:簡單,你讀協議,然後編程就行了。最令偶暈倒的是,B伯
伯碩士畢業後決定到工業界發展,於是就到了當時只有一間辦公室的Sun, 然後他就把
Sparc設計出來樂。。。象這種軟硬通吃的牛人,想不佩服都不行的說。據Bill Joy的同
事說,一般開會的時候B伯伯總是拿一堆雜志漫不經心地讀。但往往在關鍵之處,B伯伯
發言,直切要害,提出漂亮的構想,讓同事們徹底崩潰。對了,他還是Java Spec和JINI
的主要作者之一。
John Carmack,ID Software的founder和Lead Programmer。上個月和一個搞圖形的師兄
聊天,他竟然不知道John Carmack, 也讓偶大大地暈了一把。不過也許搞研究的和搞實
戰的多少有些隔吧。想必喜歡第一人稱射擊游戲的都知道J哥哥。90年代初只要能在PC
上搞個小動畫都能讓人驚嘆一番的時候,J哥哥就推出了石破天驚的Castle Wolfstein,
然後再接再勵,doom, doomII, Quake...每次都把3-D技術推到極限。J哥哥的簡歷上說
自己的專長是"Exhaust 3-D technology",真是牛人之言不我欺的說。做J哥哥這樣的人
是很幸福的,因為各大圖形卡廠家一有了新產品就要向他「進貢"
,不然如果他的游戲不支持哪種卡,哪種卡基本就會夭折樂。當初MS的Direct3D也得聽
取他的意見,修改了不少API。當然,J哥哥在結婚前十數年如一日地每天編程14小時以
上,也是偶們凡人望塵莫及的。對了,J哥哥高中肆業(?),可以說是自學成才。不過
呢,誰要用這個例子來為自己學習不好辯護,就大錯特錯了。那 Leonardo Da Vinci還
是自學成才呢(人是私生子,不能上學)。普通人和天才還是有區別的。對了,其實偶們
叫「達分奇」是相當不對的,因為Vinci是地名,而Da Vinci就是從Vinci來的人的意
思。換句話說,Leonardo Da Vinci就是「從Vinci來的Leonardo」的意思。叫別
人「Da Vinci」就不知所謂樂。嗯,扯遠了,打住。
David Cutler,VMS和Windows NT的首席設計師,去微軟前號稱矽谷最牛的kernel開發
員。當初他和他的手下在微軟一周內把一個具備基本功能的bootable kernel寫出來,然
後說:「who can't write an OS in a week?",也是牛氣沖天的說。順便說一句,D爺
爺到NT3.5時,管理1500名開發員,自己還兼做設計和編程,不改coder本色啊。
D爺爺天生脾氣火爆,和人爭論時喜歡雙手猛擊桌子以壯聲勢。 日常交談fuck不離口。
他面試秘書時必問:"what do you think of the word 'fuck'?" ,讓無數美女剎羽而
歸。終於有一天,一個同樣火爆的女面對這個問題脫口而出:"That's my favorite
word"。於是她被錄取樂,為D爺爺工作到NT3.5發布。
Don Knuth。高爺爺其實用不著偶多說。學編程的不知道他就好像學物理的不知道牛頓,
學數學的不知道歐拉,學音樂的不知道莫扎特,學Delphi的不知到 Anders Hejlsberg,
或者學Linux不知道Linus Torvalds一樣,不可原諒啊。為了讓文章完整,就再羅唆幾句
吧。高爺爺本科時就開始給行行色色的公司寫各種稀奇古怪的編譯器掙外快了。他賣給別
人時收一兩千美元,那些公司拿了code,加工一下賣出去就是上萬上十萬。不過也沒見高
爺爺不爽過,學者本色的說。想想那可是60年代初啊,高爺爺寫編譯器寫多了,順帶就搞
出了個 Attribute Grammar和LR(k),大大地造福後人啊。至於高爺爺在CalTech的編程比
賽(有Alan Kay得眾多高高手參加)總是第一,寫的Tex到86年就code freeze,還附帶2^n
美分獎勵等等都是耳熟能詳的,偶就不饒舌樂。
順便說一下,高老大爺是無可爭議的寫作高手。他給Concrete Mathematics 寫的前言可
謂字字鏗鏘,堪為前言的典範。他的技術文章也是一絕,文風細致,解釋精當,而且沒
有學究氣,不失輕快跳脫。記得幾年前讀Concrete Mathemathics,時不時開懷大笑,讓
老媽極其郁悶,覺得我nerdy到家,不可救葯。其實呢,子非魚,安知魚之樂,更不知那
完全是高爺爺的功勞。說到寫作高手,不能不提Stephen A. Cook。他的文章當年就被我
們的寫作老師極力推薦,號稱典雅文風的樣本。庫爺爺一頭銀發,身材頎長,總是面帶
謙和的微笑,頗有仙風道骨,正好和他的仙文相配的說。
高爺爺其實還是開源運動的先驅。雖然他沒有象Richard Stallman那樣八方奔走,但他
捐獻了好多作品,都可以在網上看到,比如著名的Mathematical Writing,MMIXWare,
The Tex Book等,更不用說足以讓他流芳百世的Tex樂。
Ken Thompson,C語言前身B語言的作者,Unix的發明人之一(另一個是Dennis M. Riche
老大,被尊為DMR),Belle(一個厲害的國際象棋程序)的作者之一, 操作系統Plan 9的主
要作者(另一個是大牛人Rob Pike,
前不久被google挖走了)。Ken爺爺也算是計算機歷史上開天闢地的人物了。1969年還是
計算機史前時代,普通人都認為只有大型機才能運行通用的操作系統,小型機只有高山
仰止的份兒。至於用高級語言來寫操作系統,更是笑談。Ken爺爺自然不是池中物,於是
他和DMR怒了,在1969年到1970間用匯編在PDP-7上寫出了UNIX的第一個版本。他們並不
知道,一場轟轟烈烈的UNIX傳奇由此拉開了序幕。Ken爺爺在1971年又把Unix用C重寫,
於是C在隨後20年成就了不知多少豪傑的夢想和光榮。
Ken爺爺還有段佳話: 裝了UNIX的PDP-11最早被安裝在Bell Lab里供大家日常使用。很
快大家就發現Ken爺爺總能進入他們的帳戶,獲得最高許可權。Bell
Lab里的科學家都心比天高,當然被搞得郁悶無比。於是有高手怒了,跳出來分析了UNIX
代碼,找到後門,修改代碼,然後重新編譯了整個UNIX。就在大家都以為「這個世界清
凈了」的時候,他們發現Ken爺爺還是輕而易舉地拿到他們的帳戶許可權,百思不解後,只
好繼續郁悶。誰知道這一郁悶,就郁悶了14年,直到Ken爺爺道出個中緣由。原來,代碼
里的確有後門,但後門不在Unix代碼里,而在編譯Unix代碼的C編譯器里。每次C編譯器
編譯UNIX的代碼,就自動生成後門代碼。而整個Bell Lab的人,都是用Ken爺爺的C編譯
器。
(6)Rob Pike, AT&T Bell Lab前Member of Technical Staff ,現在google研究操作系
統 。羅伯伯是Unix的先驅,是貝爾實驗室最早和Ken Thompson以及Dennis M. Ritche開
發 Unix的猛人,UTF-8的設計人。他還在美國名嘴David
Letterman的晚間節目上露了一小臉,一臉憨厚地幫一胖子吹牛搞怪。讓偶佩服不已的
是,羅伯伯還是1980年奧運會射箭的銀牌得主。他還是個頗為厲害的業余天文學家,設
計的珈瑪射線望遠鏡差點被NASA用在太空梭上。他還是兩本經典,The Unix
Programming Environment 和 The Practice of Programming 的作者之一。如果初學者
想在編程方面精益求精,實在該好好讀讀這兩本書。它們都有中文版的說。羅伯伯還寫
出了Unix下第一個基於點陣圖的窗口系統,並且是著名的blit終端的作者。當然了,羅伯
伯還是號稱銳意革新的操作系統,Plan9,的主要作者。可惜的是,Plan9並沒有引起多
少人的注意。羅伯伯一怒之下,寫出了振聾發聵的雄文 Systems Software Research is
Irrelevant,痛斥當下系統開發的不思進取,固步自封的弊病。雖然這篇文章是羅伯伯
含忿出手,頗有偏激之詞,但確實道出了系統開發的無奈:開發周期越來越長,代價越
來越大,用戶被統一到少數幾個系統上,結果越來越多的活動是測量和修補,而真正的
革新越來越少。
就在羅伯伯郁悶之極的時候,google登門求賢來樂。如果說現在還有一家大眾公司在不
遺餘力地把系統開發推向極致的話,也就是google樂。隨便看看google的成果就知道
了。具有超強容錯和負載平衡能力的分布式文件系統GFS
(現在能夠用100,000台廉價PC搭起一個巨型分布系統,並且高效便宜地進行管理的系統
也不多哈),大規模機器學習系統(拼寫檢查,廣告匹配,拼音搜尋。。。哪個都很牛的
說),更不用說處理海量並行計算的各式google服務了。Rob在System Software
Research is Irrelevant里蕭瑟地說現在沒有人再關心系統研究的前沿成果了。想不到
他錯了,應為google關心。google網路了大批功成總是試圖吸取系統研究的最新成果。
想必Rob Pike在google很幸福。願他做出更棒的系統。
Dennis M. Ritchie, 既然Ken Thompson是我的偶像,新聞組上人稱DMR的Dennis M.
Ritchie自然也是,畢竟兩人共同締造了UNIX,而Dennis幾乎獨力把C搞大(當然,C的前
身是B,而B是Ken Thompson一手做出來的)。兩人1983年分享圖靈獎,是有史以來少數幾
個因工程項目得獎的工程師(本來是唯一的一對兒,但Alan Kay才因為SmallTalk得獎,
所以就成了唯二的樂) 一個人一生能做出一個卓越的系統已經不易,DMR的C和UNIX長盛
不衰近30年,至今生機勃勃,DMR此生可以無憾的說。
D爺爺也算有家學淵源:他老爸在AT&T貝爾實驗室工作了一輩子,並在電路設計方面卓有
成就,還出了本頗有影響的書The Design of Switching Circuits,據說在交換理論和
邏輯設計方面有獨到的論述。當然,D爺爺和他老爸是不同時代的人:他老爸的研究成
形於晶體管發明之前,而D爺爺的工作離了晶體管就玩兒不轉樂。:-D
不要看D爺爺搞出了C,其實他最愛的編程語言是Alef,在Plan9上運行,支持並行編程。
Alef的語法和C相似,但數據類型和執行方式都和C大大不同。說到語言,D爺爺對後來
人有非常中肯的建議:抱著學習的目的來開發你自己的語言,不要冀望於它被眾人接
受。這個建議不光對語言開發有用,也適用於其它大型系統的開發。別的不說,DMR後來
領導自己的團隊在1995年和1996分別推出了Plan9和Inferno操作系統,又用多少人知道
呢?其實,D爺爺當初也沒想過C會風行世界。他開發C的初衷和Eric S. Raymond
在Cathedral and Bazaar里闡述的一樣,就是要消除自己對現有工具的不爽之處。誰
知D爺爺無心插柳,C竟然受到眾多程序員的狂熱擁戴,連D爺爺自己都大惑不解。在一次
采訪中D爺爺說大概那是因為C的抽象程度碰巧既滿足了程序員的要求, 又容易實現。當
然C一度是Unix上的通用語言也是原因。但不管怎麼說,D爺爺對編程語言出色的審美意
識奠定了C廣為流傳的基礎。
最後八卦一下。D爺爺的業余愛好和NBA大牛Karl Malone一樣:開卡車。不過D爺爺更喜
歡開NASCAR,而KM獨愛巨無霸。J D爺爺自稱心中不供偶像,如果一定要說一個,那就
是Ken Thompson了。現在Ken爺爺退休當飛機教練去了,而D爺爺當了貝爾實驗室系統開
發部的頭,整日忙於開支票。他倆合作20年,屢屢創造歷史。這段令人神往的佳話,也
就長留你我心中樂。
P.S., 很多人都以為Brian W. Kernighan是C的作者。其實BWK只是寫了那本經典K&R C。
據D爺爺說,他,Ken, 和Kernighan三人中,Kernighan最能寫文章,他次之,而Ken寫
得最少;但說到編程,Ken爺爺才是當之無愧的老大。
Edsger Wybe Dijkstra, 對,就是E.W. Dijkstra. 一提到EWD,很多人就會想起找最短
路徑的Dijkstra Algorithm,就好像一提到Sir. Tony Hoare,就想起Quick Sort一樣。
其實這些個演算法不過是兩個牛人在他們職業生涯中最瑣碎的貢獻。比如Dijkstra演算法,
無非是戴爺爺在1956年為了展示新計算機
ARMAC的計算能力,初試身手的成果,屬於他的演算法處女作。據戴爺爺自述,他搞出最
短路徑演算法的時候連紙筆都沒用。當時他和他老婆在阿姆斯特丹一家咖啡廳的陽台上曬
太陽喝咖啡,突然就把這個演算法想出來樂。而且當時的演算法研究還比較原始,牛人們忙
著用計算機搞數值計算,對離散演算法不屑一顧。那時連一個象樣的專注於離散演算法的專
業期刊都沒有。戴爺爺於是推遲發表這個演算法。直到1959年,他才把這個演算法發表
在Numerische Mathematik的創刊號上,權為捧場。:-)
EWD在多個領域牛氣沖天,端的是理論和編程兩手硬的高手。只不過他的很多工作比較
深刻,學校的老先生們覺得本科生接受不了,不給本科生講而已。
戴爺爺大概因為最短路徑演算法一戰成名,於是有人請他參加另一台計算機X1的設計工
作,並且把設計實時中斷系統的任務派給了他。現在看來實時中斷也許不算什麼,但要
知到,X1前根本就沒有實時中斷的概念。實現它簡直就是一場豪賭。戴爺爺起初還不情
願,但經不住項目負責人Bram和Carel的輪番 「吹捧」:我們知道實時中斷讓您工作變
得非常困難,但象您這樣的牛人肯定能做出來的說。結果戴爺爺被糖衣炮彈徹底擊穿,
接下了這個燙手山芋。兩三年後,他不僅搞出了實時中斷,還圍繞這個寫出了自己的博
士論文,順利戴上博士帽。
讓戴爺爺真正成名立萬的還是在X1上開發的Algo60,最早的高級語言之一。戴爺爺沒日
沒夜地工作了8個月,就搞出了Algo60,也因此獲得了 1972年的圖靈獎。因為Algo60,
戴爺爺發表了一篇石破天驚的文章:Recursive
Programming,於是人們才知道,原來高級語言也可以高效地實現遞歸,原來從此以後,
所有程序員都不可避免地和戴爺爺發明的一個詞(應該說是概念)打交道:堆棧。
而且Algo60還讓戴爺爺深入地思考多道程序設計的問題,最終發明了每個系統程序員
都繞不開的概念:semaphore。當然,戴爺爺總是把他發明的概念嚴格形式化,極具科
學家本色的說。和這些成就想比,他提出的吃飯的哲學家問題,也就沒什麼好說的了。
說來好笑,當時的大學(忘了哪所了)還是覺得戴爺爺沒有受過正統的數學訓練,也不是
專門搞數值分析的,所以最後不太情願地給了他一個教職。這種小挫折並不能妨礙象戴
爺爺這樣的牛人創造歷史。他一邊教數值分析(:-D) ,一邊開始開發一個新的操作系
統,並培養計算機科學家。幾年後,THE Multiprogramming
System橫空出世。THE是第一個支持鬆散耦合,顯式同步的進程並由此使得嚴格證明系統
沒有死鎖變得容易的操作系統。可惜戴爺爺任職的系不識貨,還強行解散了他的研究小
組(1972年戴爺爺給他的系主任說他得了圖靈獎,系主任的第一反應是你們搞計算機就
喜歡亂發獎)。這讓戴爺爺相當郁悶,得了抑鬱症。在極度郁悶之中,戴爺爺決定用寫作
來治療自己的抑鬱症。於是經典就誕生樂:Notes on Structured Programming。戴爺爺
從此被尊為結構化編程的奠基人,而且他的抑鬱症也被治好樂。
EWD太牛,結果他的故事也太多。先到這里吧。1973起,他的故事就在美國發生了。
Anders Hejlsberg,微軟.NET的首席架構師,編程語言設計和實現的頂尖高手。他一手
做出了 Turbo Pascal, 也是Delphi, J++(尤其是WFC),C#, 和.NET的主要作者。這些作
品的名字足以為他立傳。作為一個程序員,我在這樣的大師面前實在無語。生子當
如Anders的說。李維的<>里已詳細講述了Anders的傳奇故事,我就不用費舌了:
http: //java.mblogger.cn/iexploiter/posts/1505.aspx
Artima上有Anders談C#的系列訪談。MSDN上有一段Anders導游的錄像 。有興趣可以去看
看牛人的豐采。
H. Visual C++典型模塊與項目實戰大全的前言
為什麼要寫這本書?
在各種軟體行業,Visual C++(簡稱VC++)的核心技術得到了廣泛應用。目前市場上關於VC++的圖書不少,但大多都是一些講解基礎知識的入門圖書,真正從實戰出發,通過模塊開發和項目開發講解的書卻很少。
為了讓讀者能夠深入、透徹地理解核心技術及其廣泛應用,本書在具體編寫時以VC++開發時經常會遇到的典型模塊和項目開發為主線,同時還穿插了各種核心技術和解決方案的詳細講解。通過本書中的13個模塊和3個完整的項目案例,可以使初學者快速地掌握VC++應用程序開發,並對VC++應用程序的主流開發工具及相關技術有一個全面、直觀和系統的認識,掌握各種解決方案的精髓。本書中的大量功能模塊通用性強,可以用在完整的軟體項目開發中。
本書有何特色?
1.附帶多媒體語音教學視頻,提高學習效率
為了便於讀者理解本書內容,提高學習效率,作者專門為本書每一章內容都錄制了大量的多媒體語音教學視頻。這些視頻和本書涉及的源代碼一起收錄於配書光碟中。
2.涵蓋VC++的各種熱門開發技術
本書結合典型模塊和項目案例開發,詳細介紹了圖形圖像、線程、消息、FTP技術、串口通信、網路通信、資料庫、GDI、GDI+、DirectShow、動態鏈接庫、OpenCV、鉤子等技術。這些都是VC++中非常熱門的開發技術。
4.模塊驅動,應用性強
本書提供了13個VC++開發的典型模塊。這些模塊都是VC++開發中經常要用到的模塊,有很強的實用性。這些模塊相互獨立,但也是逐漸增加難度,開發人員可以根據需要查閱和參考。
5.項目案例典型,實戰性強
本書以經典模塊和完整系統的項目為背景,書中最後一篇提供了3個項目實戰案例。這些案例以現實職場中所開發的實際項目為背景,具有較強的實用性,而且這些案例分別使用不同的技術實現,便於讀者融會貫通地理解書中所介紹的技術。
6.提供完善的技術支持和售後服務
本書提供了專門的技術支持郵箱:。讀者在閱讀本書的過程中有任何疑問,都可以通過該郵箱獲得幫助。
本書內容及知識體系
第1篇 Visual C++項目開發基礎(第1、2章)
本篇主要對VC++集成開發環境進行簡單的介紹,並對C++語言基礎進行概略的講解。主要內容包括VC++ 6.0程序設計簡介、C++編程基礎。這些內容都是VC++項目開發的必要基礎。
第2篇 典型模塊開發(第3~15章)
本篇主要介紹VC++開發中經常要用到的13個典型模塊。主要內容包括桌面時鍾、電子郵件收發管理器、系統資源管理器、系統任務管理工具、FTP客戶端程序、音樂播放器、視頻播放器、區域網聊天工具、截屏工具、掃雷游戲、串口調試器、列印工具和監控模塊等。這13個典型模塊注重編程思想與實際開發相結合,每個模塊都可以用於實際的開發中。
第3篇 項目案例實戰(第16~18章)
.本篇主要介紹3個實際開發的項目案例,包括人事管理系統(ODBC+SQL Server+多線程)、電子相冊(雙緩繪圖+GDI+GDI+)及超市管理系統(ADO+SQL+Access)。這3個系統分別用不同的技術組合實現,講解時對需求分析、資料庫設計、持久層設計、業務層設計和表示層設計,都給出了完整的思路和實現過程。
配書光碟內容介紹
為了方便讀者閱讀本書,本書附帶1張DVD光碟。內容如下:
* 書中涉及的所有模塊與項目案例的源代碼;
* 本書每章內容的多媒體語音教學視頻;
* 免費贈送的Visual C++開發教學視頻及相關電子書。
適合閱讀本書的讀者
* 需要全面學習Visual C++開發技術的人員;
* 廣大VC++開發程序員;
* C++/C程序員;
* C++高級工程師;
* 希望提高項目開發水平的人員;
* 專業培訓機構的學員;
* 軟體開發項目經理;
* 需要一本案頭必備查詢手冊的人員。
閱讀本書的建議
* 沒有VC++集成開發環境基礎的讀者,建議從第1章順次閱讀並演練每一個實例。
* 有一定VC++集成開發基礎的讀者,可以根據實際情況有重點地選擇閱讀各個模塊和完整系統。
* 對於每一個模塊和完整系統,讀者先自己思考一下實現的思路然後再閱讀,這樣學習效果更好。
* 如果對模塊或完整系統的內容閱讀一遍後仍然不理解,可以結合光碟中的多媒體視頻講解動手實現一次,這樣理解就會更加深刻。
本書作者及編委會成員
本書由戴晟暉、楊國祥、陳國建主筆編寫。其他參與編寫的人員有王征、王石、姜海英、邵毅、張路平、李臻、武勇、徐寧、劉玉珊、麻雪、吝曉寧、范永龍、趙盟、傅靖、李佳、劉丹、肖冰、王行恆、馮浩楠、紀超、段桂東、黃寶生、張珍珍、石淑珍、陳超、牛曉輝、劉聰、任瀟、張雙、於志華、李秀勁、李勝美、蔡文仙、杜陽陽、吳興亮、陳水望、黃任楨、梅婷婷、皇波、白雪蛟。在此一並表示感謝!
本書編委會成員有歐振旭、陳傑、陳冠軍、頊宇峰、張帆、陳剛、程彩紅、毛紅娟、聶慶亮、王志娟、武文娟、顏盟盟、姚志娟、尹繼平、張昆、張薛。
編著者
I. 程序員具有什麼普遍愛好
emmmmm 說到程序員(俗稱程序猿),大夥兒最先想到的是什麼?
咱家程序猿比較多,隨便問了幾個,回答有「宅」、「開黑打游戲」、「科幻」、「健身」、「天文」、「女裝」(美其名「二流碼農寫功能 一流碼農寫演算法 頂級碼農穿女裝」,不知道是不是認真的,有可能自己在家真有cosplay。。。。)
據觀察,這幫大神擁有無與倫比的耐力(坐如鍾。。。),工作勤勞(加班最晚。。。)