顯示具有 consultant 標籤的文章。 顯示所有文章
顯示具有 consultant 標籤的文章。 顯示所有文章

5/06/2016

80/20法則之軟體專案的三個運用重點




軟體專案的Scrum的一次sprint之後,照例的檢討會議(retrospective)中,張經理收集了成員的意見,經過投票整理與排序,發現"不夠專注在重點上"是成員們最希望改善的地方。於是,張經理發表他的見解:「看起來大家可能是覺得瑣碎的事情太多,沒辦法專注於工作,這次新的sprint開始,大家試著把心思專注在重要的事情上」,接下來,張經理開始順道交代其他事情:「呃,上次要給法務部門的3rd party版權清單,老馮你準備一下;明天我們要定個下午茶,小陳你有空的時候幫個忙...」。....於是乎,最希望改善的地方就從未改善過。


Pareto Principle,又稱為80/20法則,指的是80%的結果來自20%的原因。這個法則是取名字義大利的經濟學家帕雷托。他觀察到1906年義大利的80%總資產屬於20%的人口。而此一情況被學者們,在其他領域也觀察到重複類似情形,因此被簡約成此法則。

80/20法則中的數字,有時候,會和實際領域不同而有所改變。例如,絕大部份的軟體,其90%的執行期間,執行的是其中10%的程式碼(參見這裡)。


在軟體專案管理中,能掌握80/20法則,等於是掌握80%的成功。

以程式撰寫為例:最重要的10%程式碼,關係到軟體運作的90%時間,掌握最重要的10%的效率與品質,就掌握系統的本身。當然,80%的bug來自於20%的程式碼。(參考這裡

以測試為例:1000個測試案例(test case)如果能有效掌握哪20%的測試案例可以測出80%的潛在問題(bug),就可以有效縮小測試。

以人員管理為例:在有一定人數的情況下,30%的程式設計師完成70%的主要功能。而有追蹤問題(bug)的來源時,80%的問題來自20%的模組撰寫者。


因此,掌握並改善20%重點,是任何專案的成功關鍵因素。

不過,這件事情知易行難。以反面來看,作為專案管理人,如果整個專案過程的每天都忙得焦頭爛額,隨時都有不同的人來進行不同的會議,螢幕旁邊有數十張待辦的便利貼。這很明顯的表示你一定沒有掌握到20%的重點,而你雖然很努力的想要完成任務,但並沒有朝向正確的努力方向。更慘的是,假如你認為這種忙碌可以顯示自己在組織的價值與貢獻,這種想法做為專案的領導者只會害死大家。


每個專案都是獨一無二,因此每個專案的重點20%都有所不同。然而,掌握關鍵的「20%」倒是有三個共同切入點。


1. 目的 - 真正目的


軟體專案的真正目的各有不同:有些是新產品開發,有些是既有產品增加新功能,有些是客製化專案。大部份的情況下,其目的通常不是「技術目標」,而是「達成效果」。

例如,網路商店需要開發mobile app,其目的鐵定不是為了要有一個Android APP或是iOS APP,而可能是要讓客戶在智慧型手機上也能購物。但也有有可能目的是要讓客戶在智慧型手機上容易查詢訂單。當然也有可能兩者兼具。但無論如何,技術目標:也就是有Android/iOS APP,與達成效果通常有相關,但專案管理者必須清楚兩者的不同:

達成效果是勢在必行不可或缺,但技術目標永遠都有其他選項

網路商店不見得需要有APP才能讓使用者在智慧型手機上購物,可以使用符合智慧型手機規格的網站(所謂的響應式設計),讓使用者利用手機瀏覽器進行購物,也可以透過簡訊或者撥打電話的方式購物,開發APP只是其中一個選項而已。

掌握真正目標之後,列出這個目標中的所有使用情境(user story)中最重要的20~40%的功能,而軟體開發的重點就放在這20~40%重要功能。集中力量完成最重要的20%,才不會「先」耗費力氣在無謂的事情上,「最後」才做真正重要的事情。



2. 時間 - 不倒退的沈默成本


時間是不會倒退的(參考這裡)。軟體專案裡的時間成本一旦投入,都屬於不會退還的沈默成本。也因為時間無法退回,一旦投入就是投入。因此,必須要確定「先」運用時間在重要的事情上。

80/20法則的重點在於:計劃運用「未來的時間」,在有效果的事情上以達到80%的產出。

舉例來說,一個程式設計師,在早上抵達辦公室,打開電腦的第一件事情,應該試圖確認「今天什麼事情對我最重要」,而一個開發團隊,每天第一件事情應該是「今天團隊完成什麼事情最重要」。因此,典型的scrum都會在一早展開standup meeting(快速會議),以15分鐘的簡單開場讓專案團隊確保先投入在最需要進行的事情。

這也是一個聽起來簡單,執行起來並不容易的概念。有很多情況,團隊成員並未「徹底」實踐快速會議時的精神。

例如:某甲陳述:今天會開始開發模組A,預計今天會完成,而這也是他今天最重要的事情。然而某甲可能無意識地忽略掉昨天他的功能B的程式碼尚未簽入版本控制系統,因此實際上會議結束,其實他花了一早上在簽入程式碼,並且執行合併/建構系統。某甲並非不應該完成昨天尚未完成的事情,而是他對於「未來即將使用的時間」沒有腳踏實地的認知。

80/20法則運用在專案的時間管理上,最重要的精神在於「腳踏實地」,並且「確實展現事實」-- 缺乏這兩者,會讓80/20法則淪為壓榨程式設計師的幫兇。



3. 激勵因素與保健因素


激勵保健理論(參考這裡),將影響人工作時心裡的滿意度因素分為兩類:激勵因素與保健因素。簡單的說,保健因素是「沒有會死,但是有也不會很高興的因素」,激勵因素是指「沒有的話不會怎樣,但有的話會很高興」。

激勵與保健理論,乃是在軟體專案管理中,80/20法則運用的最容易忽略的一環。特別是在兩個面向上:(a)軟體團隊經營
(b) 技術決策


(a)軟體團隊經營:

保健因素(薪水,電腦設備,工作環境):無論加碼到什麼程度,對程式設計師的績效成長極端有限,然而一旦失去基本下限 - 例如減薪,則其他的激勵方式會突然失效。軟體專案負責人,應該在一開始,就先確保:保健因素是成員可以接受的。爾後專案執行過程,不要特別關注它即可。

激勵因素(個人成長,價值觀,成就感):激勵因素才是大部份軟體開發專案成員「願意保持工作熱誠」的真正原因。負責人或者領導者,應該將團隊經營的80%重點時間放在保持激勵因素。然而每個人的激勵因素皆有不同,因此了解團隊成員個別的「真正需求」,才是需要花時間的地方。

舉例來說,有些團隊成員可能會抱怨沒有雙螢幕,雙螢幕對於撰寫程式的確很重要,專案經理想辦法弄給他雙螢幕之後,千萬不要以為這樣就會讓他心甘情願賣命。雙螢幕只是保健因素,是必要取得,但不是重點。專案領導者在團隊經營上,應該花20%的時間快速搞定保健因素,而後,花80%的時間確保激勵因素的存在。

缺乏激勵因素的團隊成員,並不代表一定會離職,也不一定代表任務不能完成。一個能力很強的人,可能因為暫時沒有其他選項而在現在的位子上滿足最低限度貢獻。這樣成員,反而成為一個潛在的問題,他隨時有可能因為任何短暫膚淺的因素而離開,更糟的是不離開而成為團隊困擾。而這種情況並非是該團隊成員的問題,而是團隊領導者,沒有辦法找到並維持適合的激勵因素。



(b)技術決策:


既然是軟體開發專案,必然會歷經各種技術決策。80/20法則一定是技術決策的主要運用重點。

以功能而言,如果有A功能與B功能在短時間之內,只能選擇完成一個。則技術決策應該從幾個方向考量:

方向一:中大型軟體專案一定有20%的重要功能,會滿足80%的使用者需求。哪一個功能屬於這類。

方向二:如果A與B都滿足方向一,則考慮哪一個功能會直接滿足「專案目的」。

方向三:如果A與B都滿足方向一與二,則考慮兩者哪一個對於此專案是屬於保健功能(沒有會死的功能),哪一個屬於激勵功能(有的話會很高興的功能)。並且考慮專案目的,是屬於維護且保守的專案,還是開創性的新專案。開創性的專案自然優先考慮激勵功能;而維護型或保守的專案,當然要先考慮保健功能。



80/20法則的有效運用是判斷一個優秀的專案領導人的條件。以反面例子而言:有很多15年以上專案管理經驗的所謂專案經理,他所有的經驗可能都在於無謂的忙碌與焦頭爛額中度過,這樣的15年和1年沒有什麼不同。如果你是這樣的專案經理,為了團隊好,或許應該考慮轉換適合的工作跑道。












4/27/2016

軟體專案品質控制的三要點



老馮是軟體專案經理,在專案進行的某一天,被高層找去開會。高層:「最近雲端計算很火紅,你的專案既然是跟Cloud有關,看能不能早點完成」。老馮就問:「那可不可以auto-scaling的功能不做?」。高層:「沒有auto-scaling哪能算雲端計算平台,當然要做啦」。老馮就又不死心地說:「怎麼可能功能不減少又要早點完成?我們都已經是早9晚9在加班」而老馮心裡沒說的是,加班也絕對不是解決的方法。高層:「那就看你們的能力啦,不然我在多加3個人給你好了?」。老馮:「...」




專案管理過程中,品質是最容易忽略的項目。在狀況複雜的專案,品質常常是自動被犧牲的事情。在沒有良好控制的專案,品質是最容易被省略的事情。


品質Quality的定義其實有點複雜(參考這裡)。基本上,在軟體上,一個可接受的品質通常是指:功能如預期的正常運作,並且沒有不預期發生的壞事。

例如,一個手機購物程式,在你執行登入,往下捲動查看最近的商品目錄,點選商品,下單,這幾件事情都如預期的運作,就表示功能沒問題。從看到商品到購買,整個過程沒有讓你覺得很慢,那就算是沒有不預期發生的壞事。

又例如:當你點選商品之後,看到商品大的照片,接下來你就橫向擺放手機,照片因而旋轉之後,再轉回原來的正向,結果手機程式就當機直接跳出,這就表示功能有問題。當你點選商品到購買,整個過程讓你等得很心煩易燥,每個動作都要5秒鐘的等候,那就算是不預期發生的壞事。



軟體專業經理人,應該都知道一條鐵律:品質,範圍,成本,三者不可能兼具。

軟體專案的成本指的是:時間,人力,金錢或其他投入的資源。

軟體專案的範圍指的是:軟體的功能,規模,支援的硬體範圍等等,範圍修改自然就是功能增多或減少。


三者不可兼具,指的是要顧全某一項或者某兩項要素,就一定會犧牲另一項。例如:某APP可以支援google+ 以及facebook 帳號登入,後來因為時間(減少成本)考量,最後決定僅支援facebook登入。又例如,某APP原本可支援google+ 以及facebook帳號登入,後來又希望可以額外支援維博登入,這時候就決定花錢(增加成本)找外包廠商實作此功能。

軟體專案中,另一條鐵律是:試圖三者兼具者,會自動犧牲品質。例如:某APP可以支援google+以及facebook帳號登入,而後又想要支援維博帳號登入。專案經理想要在不增加成本,又不減少其他功能的情況下,又不增加實作時間。硬是要額外增加此功能的結果,必定是品質會自動犧牲。

不知道品質會自動犧牲的專案經理,必定不適合做軟體的專案管理者。

軟體專案品質控制有三個要點:

要點一:來源


品質的來源是整個開發過程,從一開始的計畫以及團隊組成,就已經決定了品質的一半。

一個簡單合理有效的計畫,可以控制改變,掌握進度事實。開發方法是不是採用Scrum並非最關鍵。重要的是,計劃中的開發方法是否簡單並合理的被團隊認知。

舉例來說,傳統SI常會有RFC,也就是需求變更的管理計畫。在開發過程中,如果有需求變更,基本應該是1.先填一份表格,2.在專案會議中與客戶討論,3.互相同意修改之後進行變更。換言之,有需求變更(RFC)管理的情況下,必定是前期的架構,設計細節,規格等等都先完成了,才會開始進行開發,因此,就不可能使用Scrum的開發方式。


假如團隊的組成是可以選擇的,那這件事情也是掌握品質的關鍵因素。



要點二:架構


在實作上,架構是另一個品質的主要關鍵因素。一個優良而且簡單的架構,比較有可能在多人而且複雜的開發情況下,獲取最容易達到的品質。

精煉的軟體架構設計表面上容易,實際上困難。架構的設計要素,眾所皆知:內聚力高,耦合力低,不同模組之間首重介面溝通。

然而,任何有3至5年工作經驗的程式設計師,都可以規劃出極為複雜的架構,普通並且沒有實務經驗專案經理,會容易「讚嘆」這種複雜的架構。這會在不久的未來讓品質很快降低。

實務上,只要沒特別的控制以及重構,正在運行的軟體的熵(entropy)值通常會隨著時間越來越高。同時也讓軟體品質越來越低,或要花很大的成本達到高品質。



要點三:創意


在品質控管中,創意是最被人所忽略。特別是在傳統的開發環境裡,負責品質的相關專業人員通常傾向於「找到問題」,事實上,這的確是QT或者QC的主要責任,但軟體專案中,作為QA(Quality Assurance)扮演的任務就不僅如此,而是在整個開發過程中確保品質符合規格(註一)。

而有創意的QA是第三個重要的品質來源。

普通的QA會執行QT/QC的任務,在開發過程中參與設計討論,並且撰寫測試案例(test case)。在功能完成之後,會認真執行測試案例,或者撰寫測試程式碼以便自動化測試,而在過程中找到並且記錄問題,並督促程式設計師修正錯誤。以上這些都很好,而且也沒什麼不對。

但是!當時系統複雜,時間壓力大,程式設計師能力參差不齊等等困難情況發生時,普通的QA流程並不會對「範圍」以及「成本」有所幫助,因此很容易被壓縮或者犧牲。

有創意的QA會根據專案的情況,找出最好的解決之道。而非死命地抱著舊有的測試流程,在確定有問題的情況下還不進行改善。

創意的可能行動有很多,但總之就是要有「行動」。空想的創意是沒有意義的。有創意的QA行動,可分為技術類型和非技術類型:


技術類型


例如:透過pair-programming主動參與開發;除了自動化測試之外,撰寫當介面改變時的監視程式;對於程式設計師的commit做自動化分析...這些都是透過QA的技術能力,提早發現可能的問題並提早解決。


非技術類型


例如:著重架構的精煉與簡化;改善測試流程;利用其他資源(例如業務人員)進行測試;改善code review的方式;簡化bug記錄以及追蹤方式...等等,這些都是透過QA的協調作業能力,縮短或減小品質差距。


簡而言之,絕大部份的軟體專案品質控制,其實是需要有創意的QA,才能突破既有限制,創造更多價值。而QA要有創意也並不困難,只要願意嘗試,通常都有很好的效果。


參考:沒有QA?如何確保軟體開發品質

註一:ISO對於QA的定義:"part of quality management focused on providing confidence that quality requirements will be fulfilled"





4/12/2016

你真的知道專案進度嗎?



只要是從事程設式設計相關工作的人,必然曾經參與某專案(Project)。專案的大小不一而足,有些只有幾天或幾週,有些橫跨數年。

如果有幸負責專案管理,則無論規模大小,掌握進度是除了管理利害關係人期望之外的第二重要的事情!!而實際上,要管理利害關係人期望的最好方式就是能有效掌握真實進度。

「掌握進度」之後,才能調整應變可能發生的意外,降低風險。


只要看軟體專案進度的「掌握方式」,就大致可以判斷一個專案經理的「本職學能」到什麼程度。

一個好的專案經理,可以單靠自己,就能足以掌握專案進度。

一個普通的專案經理,可以利用流程,規範,加上開發成員的協助在一個合理的時間範圍內,掌握專案進度。

一個很爛的專案經理,會利用各種會議,各種形式文件的填寫(WBS之類),直接或者間接的資訊,花很多時間,仍然不能掌握專案真實的進度。


很遺憾的是,好的專案經理很少,好的軟體專案經理,更是極端的少。因為他同時需要具備技術能力,透悉問題的能力,以及有效的專案管理能力。



要點一:以時間為單位


非軟體專案管理上,掌握進度的單位有很多種,例如「以執行預算」或者「實獲值」來掌握進度。(請參見PMP相關網站)

以軟體專案而言,「時間」才是真正掌握進度的單位。

當詢問負責的程式設計師:「A功能進度如何?」,而他回答「只剩下UI整合,加上DB欄位定義調整,就快好了」。這樣的回答,對於掌握進度幾乎完全沒有意義。因為,該程式設計師可能在A功能花了1天,然而UI整合與DB欄位定義調整,可能還需要另外花上3天,換言之「就快好了」根本不是真的,基本上只完成了25%。但該程式設計師並不是故意要說謊,因為或許最難的就是那25%。


程式設計師若以困難度為考量,進度就像下圖,功能完成之後,就「快要好了」。





但如果以實際時間進度為考量,則如下圖,功能完成之後,只完成了25%。離「快要好了」有很大的距離。




大部份的軟體工程師,著重於困難度。這並非不正確,只是專案管理在掌握進度時,實質進度必然是以時間為考量單位。即便「這件事情很簡單」,也必須要考慮「簡單的事情還是要有人去做」。



要點二:產出的事實


直覺上,大部份的產出當然是程式碼。實務上,非程式碼的產出許多時候會超過想像中的多 -  特別對於比較沒有專案管理經驗的人而言。


基本情況


最基本情境是,根據規格要完成功能A。一開始,程式設計師寫好了程式碼,並且自己編譯(compile)並簡單測試之後,簽入(commit)到版本控制系統中,並且和其他相關程式碼合併(merge)之後,整合成新的版本,並且新的版本經過QA測試後也沒問題。這個功能A就算完成。

在這個情境中,寫程式(coding)可能佔了70%的時間,另外merge以及測試可能佔了另外30%的時間。

專案經理要掌握的「事實點」在於:整合成新版本並經過QA測試後也沒問題,至此,功能A才算完成。


進階情況


在一個稍微複雜的專案裡面,根據規格要完成的某任務,實務上可分為「功能A」與「功能B」。一開始,幾個程式設計師分頭完成自己負責的功能,並分別自己compile並簡單測試之後,功能A與功能B就commit到版本控制系統的不同版本線(code line)。此時,QA分別進行測試,沒問題之後,協調某人「分別」合併功能A與功能B到主線(main line)並且整合成新版本。在整合過程,或多或少有需要修改的程式碼,也許在合併工能A的時候沒問題,但是在合併功能B的時候有出現問題,並也修正完畢。最後新的版本經過測試也沒問題。至此該任務才算完成。

專案經理要掌握的「事實點」在於,最後新版本經過測試也沒問題。至此,某任務才算完成。

但是,這和基本情況不同的是,整個過程很長,從數天到數週都有可能。coding本身可能僅佔50%。而合併,測試,在合併,修改等等可能佔了另外50%的時間。

與前述要點一相同,專案管理者要能掌握實際上的進展,跟「未來還需要花的時間」。在複雜的情況中要掌握,除了最後的產出事實之外,中間的進度掌握,需要靠專案管理人員對專案本身實務的了解。

專案進度的掌控,大部份是由專案經理個人獨立可以完成。其中,技術上的要素就是能否「判斷產出的事實」

而以軟體專案為例,專案管理者如要能判斷產出的事實,必須要能做「自己獨立」做下列幾件簡單的事:

1. 在版本控制系統中(git, p4, cvs等),找出過去一段時間的所有commit過的程式碼變更,誰去變更,為什麼變更。

2. 在最近的新版本測試中,看到哪些新功能確實增加

3. 自行檢查目前bug的清單,並且找出幾個關鍵的bug



假如你是專案管理人員,而你不認為上述事情是自己應該獨立進行,或者你認為上述事情會花太多時間,


請參見下節:除去迷霧。


要點三:除去迷霧


許多「非技術背景」的專案管理人員,常常用各式各樣的大大小小的會議,來獲取專案進度的掌握:每天早上例行會議,每隔兩天來執行bug review,每個禮拜來討論整合進度...開會的本身並不會「加速」專案進行,過多的會議,肯定會「拖累」專案進度。

如果你是一位主管或專案經理,而你迫使專案成員每天花超過10%的時間(也就是40分鐘左右)在正式的會議上,並且只是為了呈報「目前進度」。那麼,你實在是個很糟糕的主管,要麻,你就盡快辭職,要麻,盡快提升自己的專案管理能力,否則你的存在只是浪費大家時間

了解目前專案的進度,等於是除去迷霧,看清事實。除去迷霧的方式,必須要是「貼近事實」與「清晰的技術檢視」。


貼近事實


事實有時候很容易了解。例如:app要可利用facebook帳號登入。此功能容易判斷有完成,或者沒完成。

但有些時候事實很複雜。例如:某程式設計師宣稱,app要可以利用facebook帳號登入,他需要花12個工作天完成。12個工作天到底是長還是短?如果覺得太長,是因為寫程式的人能力不足?還是既有的app過於複雜,所以要加任何新功能都很難?


按部就班的貼近事實是讓該程式設計師先行「分解」這12個工作天。讓專案管理人員了解,他打算如何利用這12個工作天。

如果該程式設計師說「我這個是大概估計,12天就拿來做這一個功能阿,你還要我花時間去分哪天做什麼喔!我哪來這個時間」。這表示事實是,12天根本只是沒有基礎的猜測,他可能22天才完成,也可能2天完成。

絕大部分軟體專案,程式設計師的某行動完成都應該至少可以以「天」為最小單位,(也可是以「小時」為單位,不過太細的單位也會造成不必要的麻煩)。

超過2天估計,就應該可以分成「兩個以上的事情」,超過12天的估計,應該是建立在至少6個以上的某行動完成。


不能分解行動,表示沒有計畫,也對此任務沒有任何基本了解。

假設該程式設計師將app如何利用facebook帳號登入分解為以下工作:

(1) 修改UI: 3天
(2) 登入的程式碼: 7天

(3) 測試: 2天


專案經理應該要能看出,這樣的WBS其實完全是在應付專案經理,對貼近事實沒有幫助。他等同是一樣沒有了解任務。

如果無法將此任務交給別人,專案經理應該參與「計畫」與「分解」的過程。和程式設計師一起坐在某台電腦前面,將android studio打開,了解登入在哪邊加icon,如何到facebook取得App ID,facebook sdk如何使用。

對於有技術領導背景的專案經理,頂多花上一小時,就應該至少可以分解此任務如下:

(1) 到facebook developer網站了解sdk:1天
(2) 申請App ID以及了解相關規定:0.5 天
(3) 登入Icon要和美工討論實作方式:0.5天
(4) 執行登入,取得session:1天
(5) facebook帳號與其他帳號在db處理的不同:2天
(6) 與QA討論測試方式:1天
(7) QA測試:1.5天
(8) 其餘模糊規格的討論,例如是否可登出:0.5天

加總起來可能僅需要8天。但重點不再於天數減少,重點在於此計畫已經破除進度迷霧。當這個計畫開始執行,到了第三天,如果該程式設計師已經開始撰寫登入程式,那麼表示進度和預測相同,但如果他還在申請App ID,表示進度落後,專案經理需要調整進度,或找人幫忙。但無論如何,絕對在計畫開始執行的前期就已經知道如何處理問題,而不是到12天之後,突然發現根本無法完成。


(Android如何利用facebook帳號登入,請參考這裡)


清晰的技術檢視



前述的app利用facebook登入,專案經理之所以能和程式設計師一起坐下來定好比較清晰的時間,其首要條件在於具備清晰的技術檢視能力。

簡要的說,能區分技術難度,區分使用該技術對於專案的影響,以及,使用技術可能產生的風險。清晰的技術檢視能力,會有效提高對整個產品或者專案的洞察力。雖然,洞察力可以經過訓練磨練取得相關經驗,但實質培養卻需要有意識地進行。

技術檢視需要對技術的深度與廣度,每個專案經理所需要的技術能力各有不同,以下有個簡單的軟體專案經理自我問題清單,回答「是」就得1分。

低於5分表示是沒有技術檢視能力的專案經理。
高於8表示是罕見的擁有技術檢視能力的專案經理。

* [Yes/No] 你可以自己從版本控制系統中了解專案目前大致規模:(行數, 檔案數, 平均每工作日增加的程式碼數量),無須依靠其他專案成員嗎?

* [Yes/No] 你可以自己找出哪些程式設計師的程式碼常常會出現bug,無須依靠其他專案成員嗎?

* [Yes/No] 你每一週會隨意抽出幾個程式碼簽入(check-in)看看有沒有明顯的問題,無須依靠其他專案成員嗎?

* [Yes/No] 你會手動編譯專案,無須依靠其他專案成員嗎?

* [Yes/No] 你隨時知道目前技術文件(程式碼註解, api 手冊, 使用手冊)撰寫的實際情況?

* [Yes/No] 你知道專案成員實際花在專案的時間

* [Yes/No] 當某個進度完成時,你可以自己檢查該進度是否真的完成,無須依靠其他專案成員。

* [Yes/No] 你會用專案開發的主要程式語言撰寫工具用程式(例如查閱系統log之類),無須依靠其他專案成員?

* [Yes/No] 你能自己估計團隊能力和團隊完成某模組的大概時程,無須依靠其他專案成員?

* [Yes/No] 你能單靠記憶,繪出目前專案個模組之間大概關係,無須依靠其他專案成員?








3/25/2016

資深與中高階人才選用:三個要點





在資訊科技領域裡,資深或中高階人才選用遠比找到剛畢業很有潛力的人來的困難重重。

詭異的是,幾乎所有已經在資訊科技領域工作7年以上的資深專家,通常多少都會遇到獵人頭(hunter)的引誘。事實上,中高階的職缺其實很少,由組織內部升遷的機會很大。然而,如果真的從組織外部尋找,雖然看似符合條件者眾多,但能有效媒合卻是難上加難。




要點一:情境實例面談


絕大部份的中高階人才之所以是「人才」,乃是根據其真實的過去事蹟。而非未來想像。

在書面篩選階段,通常是根據過去工作經歷,決定要不要請來進一步面談。

而在面試階段,卻常落在討論未來的理想和展望。的確,未來的理想跟展望,的確很重要。不過,在面試階段,要判斷此人能否實現理想和展望,應該是根據其過去的「理想與展望的實際產出」。

一般外商HR的實務操作方式為:面談時著重於情境「實例」。(SAR: Situation Action Result) 

例如,有個軟體研發部門RD主管的履歷表中,表示有帶領軟體開發團隊開發軟體。此時開放性問題無法真正展現該主管的經歷,應該採用情境實例問題,了解過去的「真實例子」。


-- 爛問題範例 --


未來取向的開放性問題:「未來你如何帶領開發團隊?」「你覺得RD團隊應該如何與業務團隊溝通?」....這種問題的回答必定是十分鐘不著邊際的長篇大論。



-- 好問題範例 -- 

初級情境實例問題:「目前你的團隊共多少人,其中有直接report給你?」「此專案你本人有參與寫程式嗎?」「此專案你本人有執行code review嗎?」「這個專案一共大約產生多少行程式碼?」

......初級問題著重能取得簡單而無可偏頗的答案,答案可能為「是或否」,可能是「數字」。回答應該是在10秒內。




中級情境實例問題:「在帶領N個人的團隊裡,你個人做過哪一件事情對團隊合作最有幫助?你怎麼做的?結果是什麼?」「在之前的工作裡,你做過最糟糕的決定是什麼?為什麼此決定是最糟糕?」

......中級問題著重於過去的某單一事實,必須引導回答針對這個人的實際作為,以及產生的結果。如果詢問的問題是負面資訊,例如犯下的錯誤。必須確定是問到犯下「最大的錯誤」。在面談過程,如果一個中高階主管,在過去7年的職業生涯沒犯任何錯誤(或者拿一些小小的失誤當作談話材料),很可能是隱藏事實,但更糟糕的是,他不覺得自己有任何錯誤的地方。


高級情境實例問題會和另外兩個要點:「本職學能」以及「獨立執行單位有關」請參考以下兩節。


簡而言之,SAR的基本概念很簡單:找出事實,而非空想;討論實際,而非理想;了解過去,而非未來。這部不代表理想與未來不重要,而是要判斷中高階人才的理想與未來,應該是看他「過去實踐過多少」,而非不是他「打算未來實踐多少」。


參考資料:(Careerly, SAR)





要點二:本職學能


已經位於組織中高階,很有可能早已不具備,或者喪失本職學能。因此,正確判斷是否具有合適的本職學能極端重要。

然而,中高階位階的人,其本職學能比較抽象,需要有方法加以判斷。

資訊科技領域的判斷方式有:(1) 基礎經歷 (2) T型延伸 (3)培育人才


(1) 基礎經歷:

以職業籃球為例,目前NBA的總教練,必然曾經在他人生的某個時期是「頂尖球員」,也許只是在NBA眾多明星中的候補球員,但也至少是NCAA某個第一級學校的球星。縱使不是,至少也是在高中時期,某一個州的的MVP等級球員。總而之之,他必然曾經當過明星球員,因此在當總教練的時候,能夠了解一整隊明星球員的思維,球員在比賽時的「真正作為」

同樣的,假設在軟體開發,找尋中高階的帶人主管,他本人必須「曾經是軟體開發人員」,最最最起碼也需要有3年以上實務寫程式的經驗。一個的SA或PM,也許工作的經歷還不錯,但如果沒有務實的寫程式經驗就來帶領開發團隊,就好像一個資深的球隊經理,看過很多比賽,卻沒有實際上打過球,就來當總教練一樣的危險。

或許有人會說,有些人屬於「將將之才」,他當將軍比當士兵還適合,不應該以過去的基礎經歷來斷定。在其他領域,或許是,但在資訊科技領域,「沒寫過程式」就是「沒寫過程式」。


其他的基礎經歷,必須有「清楚的事實」的佐證。例如,在履歷表上有AWS的使用經驗,就必須要清楚地知道何謂使用經驗?是用過EC2/S3/Route53,還是用過那數十個服務的哪些服務?是自己親自使用還是「指揮」別人使用?使用的規模有多大?等等


(2)  T型延伸

T型延伸的基礎是先有「基礎」,因知識與職責擴展的關係,延伸到其他相關領域。例如,在已經有智慧型手機應用程式開發的「基礎之上」,延伸到線上行銷,社群開發等等。

誠如前一節所述,沒有基礎,延伸不具意義。

關於T型人才,請參考這裏這裏

(3) 培育人才 

並不是每個人都會是好老師,不過如果中高階人才承擔的任務與管理有相關時,能否「培育人才」將會是團隊成功的關鍵。在SAR的方式裡要找到培育人才的方式很簡單。初級問題像是「你個人過去六個月以內,做了哪一件事情最能幫助團隊培育人才?」。中級問題像是「」




要點三:獨立執行單位


資深的工程師和初入社會的新鮮人最大的差別之一,應該是能夠自我成為一個執行單位。判斷是否已經成為獨立執行單位,是選才關鍵要點。


判斷的基礎方式有:(1)自我培養,(2) 計劃未知,(3) 人才培育。



(1) 自我培養

可以在組織裡,自行培養自己,發起並參與適當的事件。在中高階人才中,不存在「組織要協助培養能力」的情況。

這並不代表不用學習,只是不應該透過組織來建構自己的職業生涯和學習計畫。資深與中高階人才,應該要能自己規劃學習計畫,主動學習,並且「主動」將自我成長與組織成長「整併」。

僅專注在自我成長,對組織沒任何好處。努力使組織成長,放棄自己的成長,對組織也沒有好處。雙贏才是長久之計。



(2) 計劃未知

沒有人能預測未來。但資深中高階人才,應該能透過本身的技術能力,工作經驗,長久累積的直覺,有效看出至少數個月後的可能發展,並能有效制定計劃。

計劃(plan)本身並不重要,重要的是做計畫(planning)。中高階人才應該能在有限的已知情況中,盡可能計劃未來,建構真正的目標,評估控制風險。

而這計劃並不是為了展示,也不是文書作業,也不一定需要900頁巨作。關於計畫,請參考這裏


(3)人才培育:

請參閱前一節的培育人才。






3/13/2016

如何組成團隊:三個步驟





分工合作,是人類社會進步的主要原因之一,也是幾乎所有人類活動的基礎(參見國富論:第一篇第一章論分工)

新創公司,資訊產業也不例外,建立一個好的團隊,是擴展未來的主要關鍵。雖然好的團隊沒辦法保證生意蒸蒸日上,一切順心如意。但是一個糟糕的團隊,卻是可以保證企業和組織的失敗指日可待。


市面上團隊合作的企管叢書,方法論,激勵理論,顧問大師...很多。但就和所有的事情一樣,越是很多人在談論的事情,越是困難。成功的團隊真實例子極為罕見。

萬事起頭難,「組織並成立團隊」是達到成功團隊的第一要務。許多人常依賴運氣,或者隨遇而安的隨意組成團隊,但其實組織團隊是一種可以學習的艱深技術能力。

資訊相關工作的人,如果有機會能扮演組成團隊的角色,並有意識的學習其中,將會是個人成長的重要關鍵。(無論未來是朝純技術領導方向前進,抑或管理方向前進)


有很多原因,會讓一個人扮演組織團隊的角色。也許是一個新的專案,讓你來領導專案,而恰巧專案開始的時候沒有既定的人。也許你是新創企業的創始人,你打算聚集一些人來開發創新事業。也許你是資訊相關科系的學生,因為課程需要必須組織團隊完成專案。

不管如何,如果你有「從頭開始找人選人,組織團隊,完成某件事情的機會」,請衷心的痛哭流涕的感謝上帝,這樣的經驗,在資訊科技領域裡是十分難得。

通常,由於各種背景壓力,組成團隊的方式通常就是先根據需要N個人,然後「儘速」透過各種管道,找到可能的人選,經過正式面試,或者非正式的聊天,就逐一邀入加入此團隊。這種方式沒有不妥,只是這樣的方式(如果算是一種方式的話)有很大的成分依賴運氣。如果不想依賴運氣,其實需要考慮的實務步驟也不多。


以資訊相關工作為例,組成團隊必須要有以下三個步驟:


步驟一:定義目標

--- Your goal shouldn't be to buy players, your goal should be to buy wins. And in order to buy wins, you need to buy runs.   (MoneyBall)

定義目標,必須要在團隊開始組成之前,就先找到並且定義完成...最起碼是團隊差不多組成的時候就應該決定。

定義目標並不容易。

例如,以類似的資訊系統外包案而言,有些明顯的目標是「在成本內完成專案並驗收通過」或者「在期限內通過驗收」。但是,倘若一開始的合約是低價得標,而且還是業務亂搶合約,那麼一開始就已經知道不可能在時間成本內驗收通過。則團隊目標必須要轉換,例如「完成專案過程可順便完成重複利用的元件讓未來標案能大幅降低成本」。

大部分的資訊團隊真正的目標並非「技術達成」。例如,「完成iOS APP線上購物」這通常不是真正目標,真正目標通常是「在某移動通訊市場上,讓使用者可以線上購物」。

在營利企業裡,大部分的真正目標通常關聯到增加收入或者降低成本。而在非營利企業(例如研究單位)團隊的目標有可能非常模糊。例如,一個碩士班的實驗室團隊,他的目標可能是「培養人才」,也可能是「讓主持的教授獲得升遷的點數」。

定義目標雖然不容易,但掌握以下三點可以除去大部分的誤差:

(1) 定義目標後,審視檢查這個目標背後是否還有目標。例如,籃球比賽目標,某球員目標是得30分。但其背後還有個目標就是球隊要贏球。在球隊沒贏球的情況下得30分可能沒有意義。

(2) 定義目標後,檢視此目標是否只是某個大目標的一小部分。例如,某些NBA的球隊,會談論是進入季後賽的目標,然而背後的大目標其實應該是拿到總冠軍 - 無論有多艱難。

(3) 定義目標後,檢視此目標是否因為其他條件未達成就失去意義?這時候所謂「其他條件」或許可能是目標。例如,一個團隊負責營運線上購物網站,其目標是「網站每分鐘必須可以提供10萬個使用者同時進行交易,7x24服務不中斷不當機」。然而,若此線上交易網站平均上線交易人數每分鐘才1人,即便營運團隊達到技術目標,商業目標肯定無法達成,則此團隊目標也沒有太大意義。不如改成「與業務團隊合作線上行銷活動,讓每分鐘平均交易人數成長XX%」



步驟二:組合優勢


--- The greatest improvement in the productive powers of labour, and the greater part of the skill, dexterity, and judgment with which it is any where directed, or applied, seem to have been the effects of the division of labour. - (Adam Smith)

無論用什麼方式找到團隊成員,資訊相關的團隊必然有分工,而分工必須要能讓成員發揮相對優勢。而每個相對優勢,都可以達到步驟一的目標之一。

構成團隊過程可能很多,但無非是找到某人,詢問意見,在某時間此人加入。然而,「加入之後做什麼」著重於考慮組合優勢。

台灣經濟學的入門書通常會用蓋木屋與磚屋的例子(參見這裡)簡單的說,組織團隊時,把成員的時間投入在相對優勢的工作上,可以達到1+1>2的效果。

實務上,分工時請考慮一下三點:

(1) 根據相對優勢來分工:盡量只考慮優勢,而不是先考慮缺點。

(2) 分工的結果,還是必須朝「真正目標」前進

(3) 整個團隊需要了解分工與分派任務的原因 



步驟三:產生運轉動能

--- All things are difficult before they are easy.


團隊組織完成,要開始運作,不會像籃球比賽一樣,十個人在場上,裁判吹哨跳球就開始。

團隊前進需要累積動能。就像騎腳踏車一樣,從靜止到穩定前進,會花比較多力氣,然而一旦穩定前進,就很輕鬆。

產生動能指的是團隊成員已經彼此合作,彼此鏈結工作,發生問題也可以彼此協調解決。

以資訊科技為例:

最常見也是最糟糕的產生動能方法是由專案經理透過一連串的方式 - 通常就是開會 - 持續讓事情前進。團隊成員花在正式會議上的時間比例只要超過10%(也就是每週超過4小時)就屬於這種類型。


最佳,但是最罕見的產生動能的方式是由每個團隊成員,透過自身的判斷,做會讓事情前進的動作。類似足球或者美式足球的比賽。在資訊科技團隊中,這種組合需要時間磨合成員,而且也須一點點運氣,讓團隊的成員大部分的能力都可以足以某種程度的獨當一面。

如果你剛好是資訊科技/軟體開發的團隊領導者,至少要先避免最差方式,並且透過你的領導能力,讓團隊慢慢的朝向最佳的方式前進。

實務上有三個重點方式:

(1) 資訊透明:讓所有進行的事情透明的讓所有人取得。要注意,資訊透明指的是針對確定的事實透明。非確定的事實就是所謂謠言,要緊記:謠言止於智者,起於智障!

(2) Scrum中的豬雞原則:請參考這裡。在組織產生動能過程,豬負責的事情就由豬來決定,雞只是提供參考意見。

(3) 檢討 retrospective:需要團隊自我檢討任何不正確或可以強化的地方,檢討並非開批鬥大會,目的在於讓團隊能更有效率的,以及確保團隊真的朝向目標前進。




1/05/2016

成長的最好方式 - 反省





曾子曰:「吾日三省吾身:為人謀而不忠乎?與朋友交而不信乎?傳而不習乎?」


反省是進步的最好方式。然而,檢討專案,檢討工作內容,或者檢討自己做對了,或做錯了什麼,卻是需要有結構性的方式來進行。光在腦袋裡想像是很難有具體效果。


普通人大概沒辦法跟曾子一樣每天反省自己,不過,新的一年通常是反思的最好時機。


檢討反省有三個要點:



重點一:目標導向


檢討需要有目標,就算是很隱私的個人檢討也是。反省的目標不同,就會有截然不同的結果。

以帶家人出去玩為例:

如果「全家開心出去玩」是「目標」。則旅途中的延誤,改變行程,物品遺失的檢討目標就應該是如何在意外發生的時候,讓家人仍然很高興的享受意外,享受旅程。

然而,如果心理設定的目標雖然是 :全家開心出去玩,但檢討的目標卻是怎樣更有效率的旅行,那最後很可能導致全家旅行越來越有效率,但大家心情越來越不好。



以專案管理為例:

在專案完成,或者一個sprint的結束,在回顧檢討(retrospective) 會議的做法,通常是讓大家以「實例」,說明哪些事情做得好,哪些事情做得不好。接下來將這些實例分類,並且用投票的方式,選出最最最需要改善的幾點,指派專人在下一階段負責改善。


同樣的,負責人是以最終目標為檢討改善的目的。假設某手機APP的開發,最終目標是「能在耶誕節前有百萬使用者」,則列出最需要改善的幾點,都必須要朝最終目標前進才對。因此:「與客戶協調上架遞延到12/24日以便確保品質」就是一個不很合理的目標。




要點二:用事實去除人類偏誤


正常人都是以自己的主觀來看這個世界,因此每個人都有對事情的偏誤(human bias)。

檢討與改善的重點在於:盡可能認知人類認知偏誤的存在,讓偏誤在不造成致命影響。不過,要完全沒有影響幾乎不可能。

人類偏誤有很多,舉一些例子如下:


歸因謬誤:對於自己的行為,容易歸類為外在因素,對於他人的行為,容易歸類為內在因素。例如,自己遲到,容易認為是塞車,或者昨天太晚睡;別人遲到,容易認為是他的紀律問題。

負面偏見:人對於不好的記憶印象比好的記憶深刻。這可能和演化有很大的關係,人必須要先規避毒蛇猛獸之類的天然風險。


稟賦效應(Endowment Effect):同樣的東西,如果已經在手上,則會難以放棄;但如果不在手上,卻認為比較容易取得。例如,自己的車子想賣,總是會想要賣比較高的價格,並且自己也會對這個高價格找出自認為合理的原因。這也是大部分物價易漲難跌的因素,因為銷售物品的人,如果已經用100元能賣出某物品:即便成本降低,即便知道降低售價可能增加業績,但在心理上很難主動降價。






誠如前述,要去除自己「所有的偏誤」是絕對不可能:沒有人是聖人,永遠不會犯錯。但是,去除不必要的偏誤讓自己朝正確的方向前進,卻是不難達到。去除自己的偏誤最好的方式就是根據事實。

因此,在檢討事情的時候僅就「事實」加以檢討。


例如:

事實是「專案每日會議,5個人有3人一定會遲到30分鐘」,根據事實檢討如何讓這3人不會遲到,不需去研究3人遲到的個別因素。也因此,根據事實,將會議時間往後延30分鐘是合理選項。

但是,如果有人試圖追尋某個老是遲到的人的「個人紀律」,「團隊精神」這並非不是事實,只是這類型的事實,沒辦法客觀認定,也不可能客觀評量某一個人的「個人紀律」比另一個人來的好。因此,這些主觀的「事實」,因太容易有主觀偏誤,不應該作為檢討的項目。


再舉另一個例子:

事實是「目前手機APP是使用者付費9美金才能下載,目前每個月約有1個新使用者」

檢討的目的如果是要增加收益,則在現在的事實基礎上,資訊是遠遠不足。因此,這個事實的討論結果勢必是「沒有足夠的事實」可以檢討。

當然要找到所有的事實也是不可能。所以,在這個例子中,起碼找到「新使用者為什麼會買」,「其他類似APP是否收費」,「其他類似的APP在不收費的情況有多少使用者」等等資訊,以便作為檢討的基礎。




方向三:行動優先


反省檢討的目的,不僅只為了知道「我錯了」,重點在於「如何才不會再錯一次」,或者「怎樣讓事情變得更美好」。

誠如前述,人非聖賢,要變成完美的人是不切實際的期望。然而,改變自己的一小部分想法跟行為,讓自己的未來變得更好,卻是可以腳踏實地的達到。


行動必須要和反省與檢討一致,至少邏輯上一致。行動的本身不見得一定要有所「行動」,有時候不做任何事情也是一個選擇,但如同這裡所描述,要確定「不行動」這個選項是和其他選項一起考慮過。

例如:「目前手機APP每個月有1個新的使用者,想推廣給更多使用者」,經過檢討之後,覺得「利用社群網站」:這裏的行動就是利用社群網站推廣。可能是利用facebook的廣告,也可以利用團隊成員每個人都到facebook上貼文,也可以建立粉絲頁。

無論如何,既然要檢討,就應該有行動。沒有行動的檢討,不具任何意義。






沈思:你大概多久會檢討自己一次?