書摘:在軟件業獲得成功
敏捷的開發者,特別是極限編程人員將會發現,這本書提供了很多實用技巧,而這些技巧為極限編程的價值--也就是勇氣與溝通--提供了支持。那些懷有成為軟件工匠抱負的人,將獲得成為工匠群體中一員所需的洞察力。
這本書叫做《在軟件業獲得成功》,但它看起來可以叫做《在任何行業獲得成功》。你確實討論了為什么要在軟件世界里應用每個教訓。但你能用幾句話概括一下為什么這本書對軟件業的專業人士以及那些懷有相同抱負的人格外有用嗎?
確實如此,這本書中的很對想法對于所有行業都是有價值的。這里有些共性行為,它們會讓人成功。不管你是一名程序員、一名腦外科醫生還是一名會計師,這都沒有關系。如果你對每個人都很友善,對時間進行了很有效的管理,并且是一名優秀的公共演講者,那么將會在你的領域中更加成功。我寫的這本書《在軟件業獲得成功》中有三分之一是一般性的職業生涯建議,三分之一是軟件方面的具體建議,還有三分之一是帶有較多軟件特點的職業生涯訪談。它的三分之二關注于軟件,這使它特別對于極客們(因特網 "怪人", 對計算機或因特網上癮的人)產生了真真正正有價值的職業生涯指導,而不是一本單調乏味的自助書。很幸運,我們在非常有活力、成長中的行業中工作。我們在高科技領域都有巨大的機會。幾乎每一樣使用直流電的東西都要使用軟件。當今,有超過二十億人鏈接到了互聯網上。我們所有的技術都在逐漸地自動化、相互連接。那就是機會!對于那些想在軟件業取得成功并獲得機會的人來說,值得學習一下那些可以讓我們取得成功的技能,而這些技能是在學校都沒有教過。
你采訪過的人都很有趣,并且訪談都很啟發人。你是如何選擇被采訪者的?
訪談經過了非常、非常認真地篩選。我想包括研究員、變革者、業務領導者,年輕的、年長的,男人、女人。我也想采訪那些有深遠影響力的人。首先我研究了過去二十年計算機管理協會圖靈獎的獲獎名單。我也詢問了那些意見值得信任的卓越執行官,問他們認為誰是軟件業里過去三十年最具影響力的人。我設法確保包括了大部分語言和操作系統的革新者。我看過頂尖軟件公司的名單,并設法確保我已經囊括了這些領導者中的代表。之后,我手中有了大約三十人的人名列表,我逐漸消減,直到這份名單達到恰當的特性平衡點和人數。
對于不是簡單因為篇幅限制的原因而不得不被排除在本書之外的人,你進行過采訪嗎?
這是個危險的問題!有兩個人,他們答應接受采訪,但是并沒有堅持到底。盡管我不能提他們的名字,但那確實很令人沮喪。
有沒有你確實想采訪并寫進書里,但卻沒有做到的?(比方說,我有一點驚訝,在這份列表中竟然沒有看到Alan Kay。)
實際上我采訪過Alan Kay!由于篇幅限制,我很難囊括全部的訪談。貫穿現代計算機工作的關鍵時代,Alan有過一段使人們深深地得到啟示的創造和貢獻時期。對于面向對象、動態編譯語言,以及關于圖形界面的早期想法,Alan都是重要的推動者。他還花費了大量時間推廣在教學中使用計算機。對Alan的采訪中,自始至終帶給我的重要積極的感覺就是他對計算機科學藝術的酷愛。和彈奏爵士吉他(他的另外一個酷愛)有些類似,他真的視計算機科學為一門藝術。在第十八章關于“成名”的末尾,我加入了給予我靈感的引用,它來自于我與Alan關于“你的藝術愛好如何驅動真正的快樂和成就”的交流。讀者們請看,下面就是:“藝術家由理想的內心意識來驅動做事的人。他們非常易于集中精力并且容易上癮。各種類型的音樂已經是“可供選擇的藝術形式”,但我已經對它近乎于上癮了(像古典和爵士這種高度成熟的音樂形式需要大量的思考和磨練,至少對我來說是這樣的)。理想主義為許多這樣的名人,設立了相當多不可能達到的目標。 Butler Lampson喜歡引用Browning的一句話:“要不斷超越自我,否則還有什么樂趣可言呢?”,并且他的發展比我更均衡。我有一位精通吹玻璃的朋友,他告訴我如果可以的話,他將嘗試一下模鑄玻璃。我完全了解他的意思。這就是“藝術中的快樂”。”
看起來幾乎所有的被采訪者都是在初中或者高中時開始使用計算機。這意味著他們都投入了至少一萬小時的時間來實踐,這一點Gladwell在《局外人》中談論了很多。到底要早到什么程度,對于成功的職業生涯,特別是對個真正一流的職業生涯才會起到決定作用呢?
我寧愿相信早些開始不是決定性的,因為早些開始太痛苦了,以至于無法相信其他方式。相信你需要早些開始然后就不必擔心,這看起來不合理,甚至是殘酷的。然而,事實上,真正成功的軟件革新者,大多都是早早涉獵其中。很遺憾的是,盡管它不是必須的,但看起來卻非常有用。我曾經聽過關于一位音樂家的訪談,這位音樂家二十歲的時候開始學習彈吉它。幾十年后他說,“我還是用一個調彈吉它”。這位吉它演奏家是聰明的,但他的音樂就是趕不上那些從小就開始彈(吉它)的人。好像我們的大腦整合語言非常早。比方說語言、音樂、數學、編程--這些都是語言--年輕時開始構建起來的流暢度是之后所不能媲美的。它是人類條件的限制。盡管精通編碼獲益于早些開始,但商業領導力和商業革新就不是早些開始就能從中獲益那么簡單了。年輕的另外一個益處是沒有責任需要負擔。沒有按揭要付,沒有家庭要供養,沒有孩子需要照料。年輕時所允許的各式各樣的行為,當你歲數大了、安定了之后就不能那么容易做了。你更容易承擔商業風險(當你沒有什么可失去的時候,不會有太多的風險),你可以通宵工作。偉大的開端常常就是那樣顯露出來的。這是“兩個人在車庫里帶著一簍子可樂、薯條”的模式,并且真的是以年輕作為必要條件。四十歲之后,在嘗試(這樣的模式)之前,先去看看醫生吧。
如果我對這本書有誤讀的話請糾正我,但是它看起來成功需要的知識和技巧只有少數是“技術性的”,這個比例可能只有百分之三十到四十。好像大多數都是“軟性的”。有沒有什么途徑可以獲得這些軟技巧,而不是通過經驗去獲得?
總的來說,我認為真地(成功需要的“軟性的”和“技術性的”的知識和技巧)混合物(比例)接近于百分之五十對百分之五十,因為他們是相互依附的成功因素。你既不能僅僅靠魅力,也不能單獨靠計算機方面的專家(技術技巧)。對于我們來說,在我們職業生涯的初期,是向技術技巧傾斜的,然后,隨著時間的推移,軟技巧的重要性逐漸增加。高層職位關于技術性和管理性的追蹤需要更多的軟技巧。那是因為這樣類型的角色需要人際交往、有效的管理、經驗、謀取地位和說服力。
你在學校與工作之間進行了重要的對照,并且看起來找到了一些學術界的重大缺陷。我們的教育制度(小學至博士的分級)使人們為你談到的各種職業生涯的成功做好足夠的準備了嗎?
沒有,學校沒有使我們為真正的成功做準備,并且我不認為他們盡力這樣做了。這是我寫《在軟件業中成功》的原因所在。把學校確定為是專業準備的,可能更直截了當些?在我書中的第一句話說道:“你上大學去學習專業,他們卻拼命的給你一個教育”。我們的大學的學位課程源于歐洲的傳統,這個傳統基于教會人們如何思考,并且包含了大多數的理論想法。高見、深奧的問題和優秀的著作。他們總是關注于理論。甚至像非常實用的領域,如護理、工程和法律的學位課程,從根本上看仍然根植于和實際應用差不多多的高見之中。那些高見的方法是超級有價值的,我不應該丟棄它。但是真正的成功需要技術的和軟的技巧,而軟的技巧在學校并沒有被教授。所以如果你認為大學的學位課程是關于給人們以理論背景并教會人們如何思考的話,那么我認為他們做的很不錯。如果你認為大學應該是職業成功的訓練場地,那么他們有所不足。我最近在給美國一所頂級的計算機科學學校講授計算機科學課程。當我了解到學生們沒有學過程序設計語言時,我很吃驚。他們學習設計模式、理論,以及算法,但是對于實踐部分,也就是學習語法,學校卻認為學生會在這個學習的過程中順便學到。我覺得對于一個優秀機構有明確的方向并把他們的教育優先級放在什么地方,那是個不錯的例子。我們可以爭論是否這種方法是不切實際的,但至少我認為在他們在教育策略上是清晰的。
學位只不過是讓你通過人力資源的通行證嗎?你采訪過的大多數人都有研究生學位,似乎是說獲得學位的經歷是很有趣的并且教育經歷是頗有價值的,但是他們并不認為學歷本身對于他們自己或者別人的成功是一個前置必要條件。在這里,有沒有這方面的教訓可以幫助一名學生更好地在大學里使用他們的時間呢?
讓我們把學士學位和研究生學位(碩士和博士)分開來談。我認為學士學位非常有價值。它不僅僅是一紙文憑。已經通過頂級學士課程的人一般會比獲得大專文憑或者自學的人有更好的平均技能,當然也會有例外。記住我說的是“平均”。這里有很多非常明顯的例外,一些讓人印象非常深刻、聰明并取得了巨大成功的人,正是在沒有學歷的情況下就成就了事業。一些名人,如(蘋果的)Steve Jobs、(微軟的)Bill Gates、(Facebook的)Mark Zuckerberg、(甲骨文的)Larry Ellison就是如此。 你在本科學業中會學到很多非常重要而又實用的思想,像數據結構、算法、操作系統、復雜性分析等等,而那是很難從大專課程或者通過自學學到的。學士學位也是對你的技巧、思想焦點和職業道德的證明。確實,學位是申請者通過人力資源部門的通行證。盡管如此,學術成就和職業生涯成功之間的關聯是還不明確。有太多職業生涯成功需要的東西與學校教育無關。舉幾個例子:你對藝術的熱情,創新思維,對處理模糊問題形成有組織的計劃,領導和組織他人的能力,清晰溝通,了解如何在(大型)組織中獲得任務,必要的謙遜,以及同樣在需要時的少許傲慢等等。在獲得研究生學位(碩士和博士)的過程中,你學的內容的價值真的是更少了,而更多的價值在于他們要求學生掌握科技寫作、文獻評論以及獨立研究的技巧。并非所有的工作都需要那些技巧,但是研究生課程經歷的那些做過的事情,卻是很好的成長經歷。所以我同意一些我采訪過的人的觀點:研究生學位(碩士和博士),副作用的價值大于它的內容,并且在多數情況下,即便你沒有研究生學位,也能擁有光輝的職業生涯。
對于你的第二個問題,如何在大學中更好地利用時間,我將用書中的觀點來回答:“如果知道問題在哪兒,那么在生活中取得成就的可能性就會大大提高”。那是因為,如果你不知道你想去哪,你就不大可能到達那里。所以,當他們在學校時,他們能做的最好的事情就是想出他們愛好什么,并用現實情況衡量一下,以確定他們想去哪的愿景。對于我們大多數人來說,這個愿景通常是很實際的,像會計師,與一些更有趣的——像成為搖滾明星——之間的妥協。計算機科學的優勢在于,在那里你像會計師一樣從事著幸福而穩定的工作,并且穿著像一位搖滾明星。說正經的,如果你知道你想做什么,并且知道你想達到的目的地,那么就可以利用那個愿景,通過進修課程來擁有那些能讓你為那個目標做最好準備的經歷,進而“戲弄”這個制度,而不用去管它們是否正式列在課程上。
在我們大學或者研究生教育制度里,(如果可以的話)你將改變哪三到五件事呢?
在元級別,我認為我們應該介紹更多實用的非工程技能,包括軟技能技能和商業。我是強調理論認識與學習如何思考這一潮流的極力擁護者,但是我想看到專業技能融入其中。為了達到那種平衡,我需要做如下的改變:
- 業務技能。我們應該把業務開發和企業家精神教授給每一位計算機科學、工程學的研究生。優先這樣做的原因有二:
- 首先,因為這些學校將培養出社會的高科技商業領導核心。對于那些趕上了下一個重要科技理念的人們來說,那會讓他們可以推出Google或者Facebook,我們想讓他們知道如何帶著這個理念繼續向前。
- 其次,即使我們的研究生是公認的技工,他們熱衷于做極客一族,對業務上的問題絲毫不感興趣,當這些人開發技術時對市場壓力、業務需求、產品生命周期影響敏感時,我們的世界仍將變得更好。
- 要求他們能夠進行有效的溝通。技工的溝通能力差是出了名的,但是把如此多的創造偉大技術的技工聚集在一起,靠的就是有效溝通。這很大程度上依賴于口頭交流,但也可以通過郵件和演講,這樣我們就會成為技術共同體。不管當地語言是不是你的母語,你都必須讓和你一起工作的人清楚地理解你在說什么。
- 可用性和設計。我們這些科技工作者靠功能重于形式而茁壯成長,但是在少數領域也有例外,在這些領域中你可以假設操作者是一臺機器或者是一名需要幾年來培訓的人,在大多數情況下,優先級是顛倒的。“讓它工作,然后讓它簡單”的箴言正在毀了我們。我認為蘋果公司采用的“讓它簡單或者根本不要做”的方法,對他們很管用。優先級被顛倒的一部分原因是因為我們沒有訓練人們為了可用性而設計。我們訓練人們如何從軟件工程的遠景來設計程序,但是很少訓練如何為了人的使用來設計軟件。我們需要向我們的下一代灌輸這樣的理念并讓他們相信:人比我們教授給他們的能力更重要,也就是說,給工程師提供這樣一個為了人的體驗而提升他們工作的工具。
- 新興技術。學校傾向于教授學生基本法則。我希望大學生在他們畢業后通過體驗獲得尖端科技部分的知識,在研究生階段的學生,就可以在非常狹窄的領域關注尖端課題。我們喪失了所有從“異花傳粉”帶來的機會,在這些“異花傳粉”中兩個或者更多好的想法會被合并創造出真正新的、偉大的事物。
- 計算機是怎樣工作的。令人驚訝的是,很少有學計算機科學的學生真正了解整個系統的各個細節。而那對于程序員如何開發代碼是有連鎖反應的。了解計算機的人在他們程序設計時會對諸如你CPU利用的怎么樣、內存消耗的怎么樣,磁盤空間和網絡帶寬消耗的怎么樣更加敏感。
作為職業生涯成功的重要技能,你認為設計和設計思想的作用何在呢?除了程序設計或者計算機系統結構課程之外,幾乎任何一種計算機科學或者軟件工程編程設計都不會教授設計,甚至在專業領域中談論的也不多。
你的問題很有見地,并且在我之前的回答中我間接提到了一些。好的設計讓我們可以成功。如果你問人們關于技術什么使他們灰心喪氣,答案通常是兩件事情:軟件有太多bug,或者軟件太難以至于無法使用。可用性設計在后者提及了,并且它是把產品推向成功最重要的特質之一。事實上,我主張大多數優秀商業軟件的成功是由于設計而非功能。讓我們來看一些例子:蘋果電腦,它既不是功能最強大的個人電腦也不是最便宜的個人電腦。它的成功在于它使用起來足夠方便,以至于一個高中學生都能認真地開始程序設計。Facebook并沒有讓我們與以前電子郵件都不能到達的人一起合作,但是它創造了更加生動并且使用方便的體驗,因為我們都可以彼此找到對方并且可以在一個易用的圖形空間里分享信息。通過用更好的可用性提供以前就有的功能,幾乎來自于手持電腦或者復雜關系數據庫的一切都取得了成功。九十年代中期,James Hamilton是我的良師益友之一。他現在是卓越的工程師、亞馬遜云計算的副院長。James曾經告訴我說:“與成功爭辯是很困難的”。不管在運行方式上他們可能有多少次的失敗,用成就推動了科技成功或者生意成功的人將會得到信任。在設計方面的高雅是項目成功乃至職業生涯成功的真正秘密武器之一。
在大學中學習計算機科學或者軟件工程是為從事計算機事業做的最好準備嗎?當我還是一位全職IT經理時,好像我最好的人手中至少有一半大學時是非計算機專業的。
當然要看工作的情況而定。例如程序設計工作,計算機科學的本科學位是很好的訓練。許多IT工作,可能是大多數的IT工作,并不強調編程。對于IT管理人員、IT商業咨詢、web設計和許多其他的領域,你都可以做的非常好,沒有計算機科學學位可能做得更好,并且還有許多機會去做創造性的和智力上有挑戰的工作。
軟件是不是已經變得太大、太笨重、而無法使用了呢?創建軟件的組織已經變得有太多層次、過于方法/過程導向,以至于沒有效率了嗎?當我讀這本書的時候,我似乎感受到了一些肯定的答案,但是好像我表達的是自己的偏見。
這是一個令人著迷的問題,并且我認為真正的答案是:我們正處于計算機歷史上一個有趣的階段,這個階段的答案是在不斷發展變化中的。重要的軟件總是復雜的,并且最老的和最成熟的系統現在已經發展了幾十年了。這些系統的代碼和設計復雜性現在已經達到了事先深不可測的程度。當你擁有來自于存在多年組織的幾百萬行代碼,而這些代碼的作者是來來去去的成百上千個人時,你會期待什么呢?另一方面,雖然大多數組織難于應用敏捷,但是敏捷開發方法正在真正地顯現出:讓開發軟件的過程更靈活并降低風險。云計算正在簡化在開發團隊之后的大量的環境管理的痛苦。程序設計模式也正在變得更簡單。沒有一點經驗的人能夠做更多事情了,因為技術障礙正在減少。幾個月以前,我被邀請去給舊金山附近的一個用戶組織作演講。在我演講結束后的不長時間,另外一位應邀發言者炫耀了他的新iPhone應用程序,這個應用程序帶有一流的圖像繪制、一個產品選擇和定制結構,以及一個payPal的支付接口。一切都非常漂亮,現在茶和餅干在哪里?直到他坦承:在三周內,他開發了全部的應用,并且之前他從來就沒有編寫過程序!我差點從椅子上摔下來。他的妻子說:“我厭倦了我的工作,因此給我做一個iPhone的應用程序吧,這樣我就可以在家做生意了”,就這樣三個星期后,他就在這里了。人們正在開發豐富多彩的在線內容,并且這個工作本身正變得越來越容易。
因此,當代碼復雜并且這些代碼正變得越來越大的時候,就應該把它推到更高的抽象層,抽象會使事情更簡單并且更多的迭代和動態開發方法論會減少風險。我們的工作就會更有趣!。