《軟件工藝師:專業、務實、自豪》一3.7.6 《軟件工藝宣言》及講解
本節書摘來異步社區《軟件工藝師:專業、務實、自豪》一書中的第3章 ,第3.7.6節,[英]桑德羅·曼卡索(Sandro Mancuso)著 愛飛翔 譯, 更多章節內容可以訪問雲棲社區“異步社區”公眾號查看。
3.7.6 《軟件工藝宣言》及講解
我們是有理想的軟件工藝師,立誌踐行軟件工藝並幫助他人學習軟件工藝,以提升軟件開發的專業水準。在此過程中,我們形成如下理念:
不僅要開發出可行的軟件,還要做工精良。
不僅要應對變化,還要持續提升軟件價值。
不僅要注重個體與交互,還要打造專業的社團。
不僅要注重客戶協作,還要培養高效的夥伴關係。
也就是說,在追求左側價值的同時,我們也認為右側那些價值是不容忽視的。
軟件工藝的實質就體現在宣言裏“提升專業水準”這一表述之中。有一群經驗豐富且才華卓越的開發者,他們根據自己提倡的價值、遇到的挫折,以及所持理念,總結出了這份宣言。他們不想再看到項目因管理不善或流程不合理而失敗,當然更不想看到項目因為質量低劣的代碼而垮掉。
開發者正在逐漸掌控編程工作,並試圖改變業界對軟件開發的看法。他們不僅提出新穎的流程,還向客戶展現自己對軟件開發工作的珍視。開發者願意與客戶一起工作,以開發出優秀而長效的軟件,並幫助客戶獲得真正符合其需求的產品。
不僅要開發出可行的軟件,還要做工精良
比方說有個運行了五年的程序。沒有人針對它寫過測試,也沒有人準確掌握它的工作原理,代碼裏全都是底層技術用語,沒有包含業務領域裏的概念,類和方法的代碼就算沒有上千行,也至少有幾百行。現在,你需要修改這個程序,但是編寫測試的工作量實在太大了。你當然會想著和團隊中的其他開發者結對編程,但是很抱歉,根本就沒有開發團隊,所謂的團隊隻有你一個人。寫這個程序的開發者都離職了,你是一位幾周前才入職的畢業生,現在隻有你一個人負責這個程序。
處理這種應用程序時,主要的問題就是恐懼。筆者並不是說你是膽小鬼。筆者隻是想說,作為一個負責任的開發者,你一定知道把這種代碼改錯了會帶來什麼後果。你不敢碰這份代碼,因為你根本不懂它的原理,你也沒法確定自己不會出錯。
這款應用程序確實是一款可以運行的軟件,但是它好嗎?所謂做工精良,就是說,無論應用程序有多舊,開發者都能輕易理解其原理;程序的副所用都在明確掌控之中;測試用例的覆蓋度很高,測試代碼也寫得比較可靠,程序的設計清晰而簡潔,業務邏輯也都很好地表述在代碼之中。盡管現在的代碼量比項目剛開始的時候要大,但為這樣的程序添加新功能,或修改其現有功能,所花的時間不會比原來更長。
代碼必須可維護,其行為也必須可預知。開發者必須知道修改某部分代碼所產生的後果,這樣一來,他們就不用再擔心會把什麼地方改錯了。修改代碼所帶來的影響應該是小範圍的,不會牽動應用程序其他部分,也就是說,不會產生連鎖反應(ripple effect)。隻需按下按鈕,等待幾秒或幾分鍾時間,整個程序就可以測試完,並得知剛才修改的那部分代碼會不會令程序出錯。
為了完善程序,開發者必須敢於修改代碼。以測試驅動的方式來開發程序,令設計保持簡潔,並把業務語言表述在代碼之中,可以最好地保持代碼的整潔與精良。
不僅要應對變化,還要持續提升軟件價值
大家有沒有想過軟件項目的開銷到底有多大?首先得考慮參與項目的開發者,其次要考慮項目內的其他專業人員,比如測試者、產品服務員、操作員、業務分析師、產品所有者、項目經理等。此外還有銷售人員、市場人員、後勤人員等等。光這些人的工資就不是個小數目。接下來,加上購買電腦和設備的花費、通信費、辦公室租金、市場費用、銷售費用、客戶服務費用、夥食費、保潔費和其他費用。沒錯,這些當然都要算進去。在這些費用的基礎上,還得考慮因分布式團隊和分布式辦公而引發的差旅費,以及由此而生的其他費用。
軟件項目的投資一般都比較大,而且與普通的投資項目一樣,公司也需要從中獲得回報。公司之所以會投資軟件項目,為的就是賺錢、省錢或保持營收。明白了這一點之後,開發者就該想方設法為公司達成這一目標。
所謂持續提升軟件價值,不僅是指添加新功能和修複bug。它也包括持續改善代碼結構,令代碼整潔、易於擴展、易於測試,並易於維護。
軟件工藝師應該保證:軟件做得越久、做得越大,公司從中獲得的收益就越多。在項目中添加新功能或修改現有功能的速度,應該和項目創設之初一樣迅捷。這樣一來,無論軟件有多老,公司都能夠快速應對市場變化。持續時間越長的軟件,應該越有價值才對,這種軟件不應該帶來麻煩,也不應該持續耗費公司的資金。
延長軟件的使用期,保持快速變更的能力——這就是軟件工藝師的主要任務。完成這項任務要有良好的軟件設計能力,要有編寫自動化測試的技能,同時也要成為熱情而有才華的開發者。
童子軍(Boy Scout)有條紀律:離開營地時,應該把它打掃得比來時更幹淨。Bob大叔最先把這條紀律套用到軟件開發上麵,那就是:修改完代碼時,應該把它整理得比修改前更幹淨。
要想編寫能夠持久運行的程序,必須首先關注軟件質量。大型程序在開發出來幾年之後,又重寫一遍,這是相當不劃算的。許多時候,決定重寫程序的原因在於,繼續維護下去的代價實在太高了。
反複做同一件事,卻盼著能有不同的結果,這是精神錯亂的表現。
——阿爾伯特·愛因斯坦
寫程序時也是這樣,如果還用原來那套糟糕的技術去寫新的程序,那寫出來的程序在幾個月或幾年之後又會變得和老程序一樣差。現在要打破這種惡性循環,用精良的代碼來構建應用程序。
不僅要注重個體與交互,還要打造專業的社團
分享並傳授知識是軟件工藝的核心理念之一。軟件工藝師總是飽含熱情,並力求上進。然而,軟件工藝師還有一項更重大的任務,那就是培養下一批軟件工藝師。
令業界持續進步的絕佳方式,就是在培養並鼓勵初級開發者的時候分享知識。這也和“學徒”“熟練工”及“師傅”等概念有關,一位軟件工藝師會督導學徒並幫助他們掌握軟件工藝理念。為了推動業界持續向前發展,軟件工藝師應該在社團裏分享知識和想法,並探討自己所經曆的成功與失敗。
某些開發者和敏捷教練說,軟件工藝社團應該是由一群頂尖開發者自我組織的小圈子,這讓我十分驚訝。如果某位開發者覺得軟件工藝隻是頂尖高手才能掌握的理念,如果某位開發者不夠謙虛,不善於學習他人的優點,或不願意與初級開發者分享知識並培養他們的技能,那麼這位開發者不是軟件工藝師。從筆者的個人經驗來看,軟件工藝社團應該是極為開放和友好的社團。從本質上來說,它是和語言無關的,而且應該接納所有開發者,無論其資曆與技術水平如何。
目前為止,相互學習是提升開發者水平的最佳方式。撰寫博客文章、為開源項目做貢獻、公開發布代碼、參與本地社團、與其他開發者結對編程——這些都是促進軟件行業發展的好辦法。
從2010年起,歐洲和美國出現了很多軟件工藝社團,它們每月都會組織一些自由開放的活動。此類活動歡迎各種技術背景、各種行業、各種水平的開發者參加。這些社團提倡創建一種開發者可以當麵交流想法並且能夠坐下來一起寫代碼的氛圍。
宣言裏的這一條不僅針對外部社團,還包括平常的工作環境。優秀的開發者總是想和其他同樣優秀的人在一起工作,想在優秀的公司裏工作,想和能夠提升自己水平人一起工作,想和願意分享並學習他人優點的人一起工作。這些人不僅僅是同事,還是朋友——彼此都是熱情而有理想的專業人員。
不僅要注重客戶協作,還要培養高效的夥伴關係
筆者首先要說的是,單純的雇主/雇員關係在此不宜提倡。合同上麵會規定你是一位正式雇員或承包商,顧問或生產商,或是一位按天、按小時或按月領取薪水的員工,等等,但這些都是公式化的條款。這裏首先需要建立的是一種夥伴關係,是一種專業化的工作風格。如果你是一位正式雇員,那麼應該把雇主當成客戶對待,如果你是一位承包商或顧問,那麼也應該這樣對待雇主。而雇主這一方則要尊重自己的雇員,隨時為他們提供良好的服務,對承包商或顧問也應該如此。專業的開發者不應該是那種每天隻顧按時上班、埋頭工作,並按指令辦事的人。
軟件工藝師不是工廠工人。軟件工藝師想積極參與項目並幫助其成功,想對需求提出質疑、理解業務、提出改進方案,也想與客戶或雇主更有效率地合作。這與傳統的雇主/雇員模式是不同的,這種方法對雇主來說好處更多。積極性高的團隊更有可能順利完成項目。熱情而有才能的開發者總是渴望成功,而且總是能找到克服困難並繞開繁瑣規章製度的辦法。
軟件工藝師需要也想要以成功的項目來提升自己的名望,希望因自己的成就而自豪。交付高質量的軟件並令客戶滿意,這對軟件工藝師的職業生涯來說尤為重要。
把代碼寫好是特別關鍵的技能,然而它隻是項目得以成功的因素之一。此外,還要幫助客戶改進流程,為他們提供多種可行的方案,幫助他們刪減毫無必要的規定,理解他們的業務領域,考慮他們所提出的需求是否真能提升軟件產品的價值,給他們提供準確的信息和知識,幫助他們規劃各項任務,幫助他們設定各任務的優先級,並參與那些雖與編碼無關,但卻對項目很重要的事務。所謂“建立高效的夥伴關係”,意思就是要給客戶提供全方位的增值服務。
許多客戶的核心業務並不是做軟件,所以軟件工藝師應該幫他們盡量把軟件項目運作得好一些。這樣才對得起自己所領的這份薪酬。有些開發者認為,凡是與代碼無關的事就不用操心,這樣的開發者不是真正的軟件工藝師。
某些客戶尚未準備與開發者建立高效的夥伴關係
遺憾的是,某些公司還沒有準備好扮演這種角色。他們依然把軟件開發視為一道生產工序,並把它當成整個項目裏麵無關輕重的一部分。對於某些公司來說,軟件開發者就和流水線工人一樣,隻管服從聰明人的指揮就行。
在這一類公司之中,某些公司專門雇用一批薪水很低的開發者,並且總是找一些非技術出身的管理人員,對這些開發者進行事無巨細的監督。某些公司做業務決策時不歡迎開發者參與,或者不聽取開發者的建議。還有些公司會雇用一位開發技能早已過時的技術主管,或者請這樣一個人過來對開發者發號施令。
在這樣一種企業文化之下,軟件工藝師很難在公司裏發揮效用。軟件工藝師應該盡力改變這種情況,並向客戶證明:隻要有充分的發揮空間,開發者就能為公司做出更大貢獻。
然而,正如公司需要優秀的開發者一樣,軟件工藝師也想在優秀的公司上班,而不想把所有精力都消耗在那些不肯接受幫助的公司上。為了幫助客戶而付出的精力是有限度的。善於選擇客戶或雇主也是軟件工藝師的一項重要能力。如果客戶對軟件工藝師的技能不感興趣,或者覺得那些技能沒什麼價值,那麼為這樣的客戶工作就沒有意義了。
軟件工藝師要想提升自己的名望並在職業生涯中取得進步,就得謹慎選擇客戶。夥伴關係實際上是雙向的。對雙方都有益的夥伴關係才是良好的夥伴關係。如果你覺得與某位客戶合作對你沒有好處,那恐怕就該另尋客戶了。
《軟件工藝宣言》的問題
《軟件工藝宣言》遭到了相當多的批評。與《敏捷軟件開發宣言》不同,其中一個主要問題是《軟件工藝宣言》中所提倡的理念幾乎不可能遭到反對。在《敏捷軟件開發宣言》中,左邊那組價值與右邊那組價值形成了強烈反差,這清晰地指明了宣言所提倡的理念。非常重視編撰開發文檔的人,基本上很難完全接受“可行的軟件重於完備的文檔”這一說法。習慣了固定價格和詳盡合約的公司基本上也很難認同“客戶協作重於合約洽談”這一理念。而在《軟件工藝宣言》中,左邊那組價值與右邊那組價值之間卻沒有強烈反差。右邊那些價值隻不過是對左邊那些價值的推進。如果某人認為“可行的軟件重於完備的文檔”,那他肯定不會反對這款可行的軟件應該“做工精良”。已經接受“客戶協作重於合約洽談”這一理念的公司,也不會反對建立“高效的夥伴關係”。
這種意見很有道理。筆者也覺得讚同敏捷軟件開發理念的人不太可能反對《軟件工藝宣言》中的話。然而,如果這些人都不反對《軟件工藝宣言》,那麼就有理由相信,讚同敏捷開發的人,也同樣會讚同軟件工藝所提倡的理念。果真如此,那就應該反思一下平常的做法是不是真的符合宣言中的話。你真的做到自己所讚同的那些要求了嗎?
筆者認為,不應該隻把宣言看成一係列條文,而是應該深入並全麵地理解它。
最後更新:2017-06-22 14:32:23