在某些人的印象裡,程式設計是一個揮灑創意、激盪腦力的工作,從很多面向來看,的確如此。也因此,許多人不會把這個工作和「紀律」聯想在一起。事實上,程式設計卻是一個十分需要紀律的工作。怎麼說呢?

所謂的「紀律」,有些人也可能會想到,過去我們時常比喻軟體開發就像是行軍作戰,既然是行軍作戰就必須治軍嚴謹,每個前線作戰的士兵都需要百分百服從軍令,才能充份的發揮戰力,而軟體開發的紀律就像是作戰時的軍令一樣。沒有紀律的軍隊,就像一盤散沙一樣,不僅沒有戰力,而且一擊即潰。

紀律一詞的背後,意謂著有一組規範,而且人人需要遵守這組規範。我們會規範程式設計者的工作時間、我們會為程式撰寫時的命名、原始碼的排版慣例制定規範。我們也會制定開發的流程、需要產出的文件及其格式。當然,當中也會規範團隊中不同的角色間該如何互動合作。

這些都是軟體開發時常見的種種「規範」,而通常所謂的紀律,也都是反映在程式設計者是否能遵守這些規範。

軟體開發現場有各種影響生產力的狀況,因此需要紀律規範

最常被視為是「沒紀律」的情況是那一種呢?

有人或許會認為是工作時間的問題,尤其是從人事部門的觀點。程式設計者的工作時間問題,在之前已經討論過好幾次了,不能準時的在規範的時間內上班,經常會被認為是沒有紀律的象徵。這樣的問題背後當然有其原因,由此片面的論斷程式設計者的表現優劣,有時候有太過武斷。不過,在施行責任制的團隊裡,也的確會有人濫用彈性工作時間的制度,這是不可否認的。但是,無論如何,工作時間的問題,還不是缺乏紀律的問題裡最嚴重的。

最嚴重的紀律問題應該是什麼?應該是影響到工作產出品質,以及團隊合作的紀律問題。

首當其衝的,便是程式碼撰寫時所需的種種規範及慣例。

一個時常不遵守團隊所制定的命名規範、排版原則的程式設計者,是一個沒有紀律的程式設計者;一個不遵守版本控制系統管理原則的程式設計者,也是沒有紀律的程式設計者;而像有些團隊採用特定開發方法論,像測試驅動開發(TDD),或是像極限編程(XP)、等,都有一些要求程式設計者遵守的工作方式,像是先寫測試案例再寫程式,或是雙人搭檔編程(Pair Programming)、重構、持續整合、……等等,不遵守開發方法及流程的程式設計者,也是沒有紀律的程式設計者。

這些缺乏紀律的情況,比起工作時間有問題的情況,不僅嚴重許多,而且其實更為常見。

不遵守程式碼編寫的規範,不是造成其他人必須花費時間重新修正,就是製造出編寫規範不一致的情況進而引發問題。而團隊採用某個特定的開發方法,都有它預期得到的效益。當有人不遵守這個開發方法時,就會使得預期的效益無法取得或是大打折扣,也會影響到其他一同參與開發人員的生產力。

提出對策、採取行動,改善不守紀律的種種問題

對團隊來說,這些沒有紀律的情況,比工作時間的紀律問題更值得關注。但是,我們即使都知道這些不遵守規範的情況會造成什麼樣的問題,卻不常討論如何讓團隊中的程式設計者改善。

通常,針對紀律的缺乏,可以透過外部的獎懲力量來修正。例如,當有人不遵守程式碼編寫規範時,予以處罰,像是罰款。不過,在我們現實的開發生活中,似乎真的沒見過那個團隊會因為成員未遵守程式碼編寫規範,而給予此類的處罰。

選擇放縱的情況很常見,也就是說,規範制定了,但是即使成員不遵守,也無可奈何,只是期待他有朝一日能想通,之後遵守規範。也有團隊或許有施行程式碼審閱的制度,因此退回寫過修改。無論是上述的那一種,都會造成一定的負面效果。

有些團隊的領導者沒有真正的權力,足以改變成員缺乏紀律的問題,所謂的權力,即被授權能夠給予對方獎勵及懲罰,也因此使得他們難以矯正此種情況。不過,即使是有權力足以管理獎勵及懲罰,也只是一種外部的約束力量,它必須過不斷監看及矯正的過程,才能持續維持紀律。

培養內部人員的約束力,以自律來對治

團隊的領導者除了運用外部的約束力量來維持紀律之外,更應該試圖建立起每個成員內部的約束力量,讓他們自然而然的去建立紀律,也就是「自律」。

從紀律的觀點來看,上等的程式設計者是自然而然自律,他們知道遵守紀律所帶來的好處,也樂於去遵守,甚至不能說是「遵守」了,因為那是他們心中比較好的工作模式。而中等的程式設計者,透過養成及外部力量的協助下,也能逐漸進到自律的情況。

在團隊中經由不斷教育及文化的感染,讓他們明白這些規範背後的意義、所能帶來的利益,而他們也能在理解、感受之後,逐漸融入在這個紀律的步調中,最後即使沒有外部力量的約束,他們也能持續自我維持紀律。而下等的程式設計者,則是需要不斷的仰賴外部力量的控制,才能在紀律的常軌上工作。一旦少了外部力量的約束,就又離開了紀律的軌道。

不論是上等或是中等的程式設計者,都能做到「自律」,而這是我們所希望要有的。

畢竟,我們不能期待總是倚靠外部的獎懲力量來矯正團隊中的成員,因為一旦少了此類的力量,成員缺乏紀律的情況又會故態復萌。這麼一來,會花費太多的管理成本在這上頭。與其如此,還不如將他請出團隊,因為這樣的人根本是不正確的人。

軟體開發應該是找正確的人用制度去輔助他們,而不是找不對的人進來,為了管理他們,卻用制度去絆住那些正確的人。這無疑是本末倒置。

傳達紀律之所以實踐的真正意義

所謂的紀律並不是形式主義,例如訂一些不切實際的文件表單要求程式設計者填寫。要讓每個程式設計者都進到自律的狀態,不能全靠外部的獎懲力量。重要是,這些規範背後都有它真正的實質意義及作用。而團隊應該讓每個成員都明白這些規範真正的意義及作用,以及當它們落實在真正的開發生活裡所產生的正面效益。

一個原始碼的版本控制規範是很重要的,例如,可能會有以下的規定:必須可以正確編譯並且通過所有測試案例才能送入版本控制系統中。它可以就只是一條規範,要求每個人都必須做。但它也可以是在被解釋之後,使得每個人都明白如果不這麼的話,會為一同開發的其他人產生多大的麻煩。甚至是在真正的開發生活中體驗到切膚之痛之後,就會理解為何有此規範了。

如此一來,規範背後的意義及價值就浮現出來,而這能大大的幫助紀律內化成為自律。大多數的人都能了解規範的意義及價值,也都能認同,就會成為團隊文化中的一部份,也進而感染其他人或新進的人員。

軟體開發就跟行軍作戰一樣,紀律是為了保護每個在戰場上的人,它真正的意義不是為了限制,而是「協助」,也就是協助每個人盡量不受傷害,並且達到目標。

專欄作者

熱門新聞

Advertisement