天天看點

《軟體工藝師:專業、務實、自豪》一3.7.6 《軟體工藝宣言》及講解

本節書摘來華章計算機《軟體工藝師:專業、務實、自豪》一書中的第3章 ,第3.7.6節,[英]桑德羅·曼卡索(sandro mancuso)著 愛飛翔 譯, 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

我們是有理想的軟體工藝師,立志踐行軟體工藝并幫助他人學習軟體工藝,以提升軟體開發的專業水準。在此過程中,我們形成如下理念:

不僅要開發出可行的軟體,還要做工精良。

不僅要應對變化,還要持續提升軟體價值。

不僅要注重個體與互動,還要打造專業的社團。

不僅要注重客戶協作,還要培養高效的夥伴關系。

也就是說,在追求左側價值的同時,我們也認為右側那些價值是不容忽視的。

軟體工藝的實質就展現在宣言裡“提升專業水準”這一表述之中。有一群經驗豐富且才華卓越的開發者,他們根據自己提倡的價值、遇到的挫折,以及所持理念,總結出了這份宣言。他們不想再看到項目因管理不善或流程不合理而失敗,當然更不想看到項目因為品質低劣的代碼而垮掉。

開發者正在逐漸掌控程式設計工作,并試圖改變業界對軟體開發的看法。他們不僅提出新穎的流程,還向客戶展現自己對軟體開發工作的珍視。開發者願意與客戶一起工作,以開發出優秀而長效的軟體,并幫助客戶獲得真正符合其需求的産品。

不僅要開發出可行的軟體,還要做工精良

比方說有個運作了五年的程式。沒有人針對它寫過測試,也沒有人準确掌握它的工作原理,代碼裡全都是底層技術用語,沒有包含業務領域裡的概念,類和方法的代碼就算沒有上千行,也至少有幾百行。現在,你需要修改這個程式,但是編寫測試的工作量實在太大了。你當然會想着和團隊中的其他開發者結對程式設計,但是很抱歉,根本就沒有開發團隊,所謂的團隊隻有你一個人。寫這個程式的開發者都離職了,你是一位幾周前才入職的畢業生,現在隻有你一個人負責這個程式。

處理這種應用程式時,主要的問題就是恐懼。筆者并不是說你是膽小鬼。筆者隻是想說,作為一個負責任的開發者,你一定知道把這種代碼改錯了會帶來什麼後果。你不敢碰這份代碼,因為你根本不懂它的原理,你也沒法确定自己不會出錯。

這款應用程式确實是一款可以運作的軟體,但是它好嗎?所謂做工精良,就是說,無論應用程式有多舊,開發者都能輕易了解其原理;程式的副所用都在明确掌控之中;測試用例的覆寫度很高,測試代碼也寫得比較可靠,程式的設計清晰而簡潔,業務邏輯也都很好地表述在代碼之中。盡管現在的代碼量比項目剛開始的時候要大,但為這樣的程式添加新功能,或修改其現有功能,所花的時間不會比原來更長。

代碼必須可維護,其行為也必須可預知。開發者必須知道修改某部分代碼所産生的後果,這樣一來,他們就不用再擔心會把什麼地方改錯了。修改代碼所帶來的影響應該是小範圍的,不會牽動應用程式其他部分,也就是說,不會産生連鎖反應(ripple effect)。隻需按下按鈕,等待幾秒或幾分鐘時間,整個程式就可以測試完,并得知剛才修改的那部分代碼會不會令程式出錯。

為了完善程式,開發者必須敢于修改代碼。以測試驅動的方式來開發程式,令設計保持簡潔,并把業務語言表述在代碼之中,可以最好地保持代碼的整潔與精良。

不僅要應對變化,還要持續提升軟體價值

大家有沒有想過軟體項目的開銷到底有多大?首先得考慮參與項目的開發者,其次要考慮項目内的其他專業人員,比如測試者、産品服務員、操作員、業務分析師、産品所有者、項目經理等。此外還有銷售人員、市場人員、後勤人員等等。光這些人的工資就不是個小數目。接下來,加上購買電腦和裝置的花費、通信費、辦公室租金、市場費用、銷售費用、客戶服務費用、夥食費、保潔費和其他費用。沒錯,這些當然都要算進去。在這些費用的基礎上,還得考慮因分布式團隊和分布式辦公而引發的差旅費,以及由此而生的其他費用。

軟體項目的投資一般都比較大,而且與普通的投資項目一樣,公司也需要從中獲得回報。公司之是以會投資軟體項目,為的就是賺錢、省錢或保持營收。明白了這一點之後,開發者就該想方設法為公司達成這一目标。

所謂持續提升軟體價值,不僅是指添加新功能和修複bug。它也包括持續改善代碼結構,令代碼整潔、易于擴充、易于測試,并易于維護。

軟體工藝師應該保證:軟體做得越久、做得越大,公司從中獲得的收益就越多。在項目中添加新功能或修改現有功能的速度,應該和項目創設之初一樣迅捷。這樣一來,無論軟體有多老,公司都能夠快速應對市場變化。持續時間越長的軟體,應該越有價值才對,這種軟體不應該帶來麻煩,也不應該持續耗費公司的資金。

延長軟體的使用期,保持快速變更的能力——這就是軟體工藝師的主要任務。完成這項任務要有良好的軟體設計能力,要有編寫自動化測試的技能,同時也要成為熱情而有才華的開發者。

童子軍(boy scout)有條紀律:離開營地時,應該把它打掃得比來時更幹淨。bob大叔最先把這條紀律套用到軟體開發上面,那就是:修改完代碼時,應該把它整理得比修改前更幹淨。

要想編寫能夠持久運作的程式,必須首先關注軟體品質。大型程式在開發出來幾年之後,又重寫一遍,這是相當不劃算的。許多時候,決定重寫程式的原因在于,繼續維護下去的代價實在太高了。

反複做同一件事,卻盼着能有不同的結果,這是精神錯亂的表現。

——阿爾伯特·愛因斯坦

寫程式時也是這樣,如果還用原來那套糟糕的技術去寫新的程式,那寫出來的程式在幾個月或幾年之後又會變得和老程式一樣差。現在要打破這種惡性循環,用精良的代碼來建構應用程式。

不僅要注重個體與互動,還要打造專業的社團

分享并傳授知識是軟體工藝的核心理念之一。軟體工藝師總是飽含熱情,并力求上進。然而,軟體工藝師還有一項更重大的任務,那就是培養下一批軟體工藝師。

令業界持續進步的絕佳方式,就是在培養并鼓勵初級開發者的時候分享知識。這也和“學徒”“熟練工”及“師傅”等概念有關,一位軟體工藝師會督導學徒并幫助他們掌握軟體工藝理念。為了推動業界持續向前發展,軟體工藝師應該在社團裡分享知識和想法,并探讨自己所經曆的成功與失敗。

某些開發者和靈活教練說,軟體工藝社團應該是由一群頂尖開發者自我組織的小圈子,這讓我十分驚訝。如果某位開發者覺得軟體工藝隻是頂尖高手才能掌握的理念,如果某位開發者不夠謙虛,不善于學習他人的優點,或不願意與初級開發者分享知識并培養他們的技能,那麼這位開發者不是軟體工藝師。從筆者的個人經驗來看,軟體工藝社團應該是極為開放和友好的社團。從本質上來說,它是和語言無關的,而且應該接納所有開發者,無論其資曆與技術水準如何。

目前為止,互相學習是提升開發者水準的最佳方式。撰寫部落格文章、為開源項目做貢獻、公開釋出代碼、參與本地社團、與其他開發者結對程式設計——這些都是促進軟體行業發展的好辦法。

從2010年起,歐洲和美國出現了很多軟體工藝社團,它們每月都會組織一些自由開放的活動。此類活動歡迎各種技術背景、各種行業、各種水準的開發者參加。這些社團提倡建立一種開發者可以當面交流想法并且能夠坐下來一起寫代碼的氛圍。

宣言裡的這一條不僅針對外部社團,還包括平常的工作環境。優秀的開發者總是想和其他同樣優秀的人在一起工作,想在優秀的公司裡工作,想和能夠提升自己水準人一起工作,想和願意分享并學習他人優點的人一起工作。這些人不僅僅是同僚,還是朋友——彼此都是熱情而有理想的專業人員。

不僅要注重客戶協作,還要培養高效的夥伴關系

筆者首先要說的是,單純的雇主/雇員關系在此不宜提倡。合同上面會規定你是一位正式雇員或承包商,顧問或生産商,或是一位按天、按小時或按月領取薪水的員工,等等,但這些都是公式化的條款。這裡首先需要建立的是一種夥伴關系,是一種專業化的工作風格。如果你是一位正式雇員,那麼應該把雇主當成客戶對待,如果你是一位承包商或顧問,那麼也應該這樣對待雇主。而雇主這一方則要尊重自己的雇員,随時為他們提供良好的服務,對承包商或顧問也應該如此。專業的開發者不應該是那種每天隻顧按時上班、埋頭工作,并按指令辦事的人。

軟體工藝師不是工廠勞工。軟體工藝師想積極參與項目并幫助其成功,想對需求提出質疑、了解業務、提出改進方案,也想與客戶或雇主更有效率地合作。這與傳統的雇主/雇員模式是不同的,這種方法對雇主來說好處更多。積極性高的團隊更有可能順利完成項目。熱情而有才能的開發者總是渴望成功,而且總是能找到克服困難并繞開繁瑣規章制度的辦法。

軟體工藝師需要也想要以成功的項目來提升自己的名望,希望因自己的成就而自豪。傳遞高品質的軟體并令客戶滿意,這對軟體工藝師的職業生涯來說尤為重要。

把代碼寫好是特别關鍵的技能,然而它隻是項目得以成功的因素之一。此外,還要幫助客戶改進流程,為他們提供多種可行的方案,幫助他們删減毫無必要的規定,了解他們的業務領域,考慮他們所提出的需求是否真能提升軟體産品的價值,給他們提供準确的資訊和知識,幫助他們規劃各項任務,幫助他們設定各任務的優先級,并參與那些雖與編碼無關,但卻對項目很重要的事務。所謂“建立高效的夥伴關系”,意思就是要給客戶提供全方位的增值服務。

許多客戶的核心業務并不是做軟體,是以軟體工藝師應該幫他們盡量把軟體項目運作得好一些。這樣才對得起自己所領的這份薪酬。有些開發者認為,凡是與代碼無關的事就不用操心,這樣的開發者不是真正的軟體工藝師。

某些客戶尚未準備與開發者建立高效的夥伴關系

遺憾的是,某些公司還沒有準備好扮演這種角色。他們依然把軟體開發視為一道生産工序,并把它當成整個項目裡面無關輕重的一部分。對于某些公司來說,軟體開發者就和流水線勞工一樣,隻管服從聰明人的指揮就行。

在這一類公司之中,某些公司專門雇用一批薪水很低的開發者,并且總是找一些非技術出身的管理人員,對這些開發者進行事無巨細的監督。某些公司做業務決策時不歡迎開發者參與,或者不聽取開發者的建議。還有些公司會雇用一位開發技能早已過時的技術主管,或者請這樣一個人過來對開發者發号施令。

在這樣一種企業文化之下,軟體工藝師很難在公司裡發揮效用。軟體工藝師應該盡力改變這種情況,并向客戶證明:隻要有充分的發揮空間,開發者就能為公司做出更大貢獻。

然而,正如公司需要優秀的開發者一樣,軟體工藝師也想在優秀的公司上班,而不想把所有精力都消耗在那些不肯接受幫助的公司上。為了幫助客戶而付出的精力是有限度的。善于選擇客戶或雇主也是軟體工藝師的一項重要能力。如果客戶對軟體工藝師的技能不感興趣,或者覺得那些技能沒什麼價值,那麼為這樣的客戶工作就沒有意義了。

軟體工藝師要想提升自己的名望并在職業生涯中取得進步,就得謹慎選擇客戶。夥伴關系實際上是雙向的。對雙方都有益的夥伴關系才是良好的夥伴關系。如果你覺得與某位客戶合作對你沒有好處,那恐怕就該另尋客戶了。

《軟體工藝宣言》的問題

《軟體工藝宣言》遭到了相當多的批評。與《靈活軟體開發宣言》不同,其中一個主要問題是《軟體工藝宣言》中所提倡的理念幾乎不可能遭到反對。在《靈活軟體開發宣言》中,左邊那組價值與右邊那組價值形成了強烈反差,這清晰地指明了宣言所提倡的理念。非常重視編撰開發文檔的人,基本上很難完全接受“可行的軟體重于完備的文檔”這一說法。習慣了固定價格和詳盡合約的公司基本上也很難認同“客戶協作重于合約洽談”這一理念。而在《軟體工藝宣言》中,左邊那組價值與右邊那組價值之間卻沒有強烈反差。右邊那些價值隻不過是對左邊那些價值的推進。如果某人認為“可行的軟體重于完備的文檔”,那他肯定不會反對這款可行的軟體應該“做工精良”。已經接受“客戶協作重于合約洽談”這一理念的公司,也不會反對建立“高效的夥伴關系”。

這種意見很有道理。筆者也覺得贊同靈活軟體開發理念的人不太可能反對《軟體工藝宣言》中的話。然而,如果這些人都不反對《軟體工藝宣言》,那麼就有理由相信,贊同靈活開發的人,也同樣會贊同軟體工藝所提倡的理念。果真如此,那就應該反思一下平常的做法是不是真的符合宣言中的話。你真的做到自己所贊同的那些要求了嗎?

筆者認為,不應該隻把宣言看成一系列條文,而是應該深入并全面地了解它。

繼續閱讀