2011年8月21日 星期日

《約耳趣談軟體:來自專案管理的現場實錄》筆記

一.約耳測試:邁向高品質程式碼的12個步驟:

1.你有使用原始碼控制系統嗎?

如果你沒有原始碼控制系統(source control packages),一旦需要與程式設計人員合作就會相當麻煩了。因為程式設計人員無法知道其他人做了什麼,也無法輕易回復成出錯前的狀態。而且原始碼控制系統還有另個優點,就是原始碼會被簽出(check out)到每位程式設計人員的硬碟裡。


2.你能用一個步驟建出所有結果嗎?

從最新的原始碼快照開始,要花多少步驟才能建立出貨用的軟體?好的團隊會有單一腳本檔,只要執行這個腳本,就會從頭簽出所有檔案、編譯每一行程式、建立執行檔等。若這個程式不是只有一個步驟,就會容易出錯。另外,當出貨時程緊迫時,修正「最後一個」問題、製作最終執行檔等過程必須要快速完成。


3.你有進行每日編譯嗎?

要確保能立即修正編譯失敗的最佳方法,就是每天下午(如用餐時間)重新編譯。大家通常會在午餐前盡可能的提交檔案。導致編譯失敗的人,必須從此負責重新編譯的動作當作處罰,直到有其他人出錯為止。這能讓大家盡量避免造成編譯失敗。


4.你有問題資料庫嗎?

一個最簡單有用的問題資料庫必須包含每個問題的下列資料:

  • 重現問題的完整步驟
  • 應該看到的行為
  • 實際看到的(有問題的)行為
  • 被指派的負責人
  • 是否已修正


5.你會先把問題都修好之後,才寫新的程式碼嗎?

應盡可能地追求「零錯誤」:無論何時都要先修正錯誤才能編寫新的程式碼。


6.你有一份最新的時程表嗎?

如此才能強迫自己決定要製作哪些功能,並剔除最不重要的功能,以避免功能過度膨脹。


7.你有寫規格嗎?

透過撰寫詳細的規格文件,可以節省溝通時間、做到最佳的設計,此外,你才能訂出時程。規格才是一切的根本。


8.程式設計人員有沒有安靜的工作環境?


9.你有沒有用市面上最好的工具?


10.你有沒有測試人員?


11.是否在面試時要求面試的對象試寫程式?


12.是否進行過走廊使用性(Hallway usability)測試?

是指在走廊攔住下一位經過的人,逼他試用你剛寫好的程式。若能攔下五個人並且試用完成,就可以發現程式中95%應注意的使用性問題。




二.無痛功能規格

1.功能規格(Functional Specifications):純粹由使用者的角度來描述產品如何運作。它不管東西是如何做出來的。功能規格會述及功能,還會詳述畫面、功能表、對話框等。


2.技術規格(Technical Specifications):描述程式內部的實作。它會說明資料結構、關聯式資料庫模型、程式語言及工具的選用、演算法等。


3.當你從頭開始設計一個產品時,最重要的就是確定使用者的體驗。要顯示什麼樣的畫面,運作的邏輯為何,要達成何種功能。再來,才是考慮該如何達成。

4.規格應加入的項目:

(1)一段聲明:如「據我所知,這份規格已經夠完整了,若還有遺漏之處,請告訴我」。

(2)一位作者:規格應由一個人負責撰寫,而非整個團隊。當產品規模很大時,就切割成幾區,讓不同人寫各區的規格。

(3)情境:當你在設計產品時,一定要想出某些實際存在的狀況以及人們使用的方法。替你的產品選好客戶族群,針對每種客戶想像一個完全虛構、又完全典型的使用者,並且用很典型的方式使用產品。

(4)非目標:當你想要刪除功能時,就得利用「非目標」的章節,列出你們不打算做的東西。

(5)概要:如同規格書的目錄。它可以是張簡單的流程圖,也可以是段廣泛的架構討論。

(6)細節。

(7)未定義項目:必須在程式設計人員實作程式前,將所有未定義的項目都處理乾淨。

(8)旁註:寫規格時要記住你會有各種不同的讀者,應多添寫註解。

(9)規格必須是活的:只要產品還在開發又有出現新的決策,就要持續進行更新。當重新發行規格後,應加上修訂標記,以方便所有人找出變更所在。


5.產品經理是在蒐集需求、定義程式應有的作用並且撰寫規格。此外,他們也必須負責協調行銷、文件撰寫、測試、地區化、外交手腕、對市場的敏銳度、撰寫良好的UI設計等。


6.雇用產品經理應避免的三件事:

(1)不要把程式設計人員升為產品經理:優秀產品經理所需的技能,幾乎都不是優秀程式設計人員所必備的。

(2)別讓行銷人員擔任產品經理:好的行銷人員很少能完整掌握產品設計的技術性問題。

(3)別讓程式設計人員對產品經理報告。


7.騙人讀規格的五個簡易規則:

(1)要有趣:範例是個表達趣味的好地方。在不需要的地方詳述細節,也能很容易讓你的文章變得更有趣。

(2)讓人能看得懂:規格不光是正確就好,同時還必須是可理解的。你必須先提供整體概念才能填補細節。如果能先講個故事,描繪出鮮明的印象,就能理解得更清楚了。

(3)越簡單越好:如果你沒辦法把某個句子寫得很清楚,那麼試著把要講的東西拆成短句。此外,應避免整面的文字牆,你可以採用有編號或標上符號的列表、圖片、圖表以及大量的留白。

(4)審閱多次並重讀幾遍。

(5)不要使用樣板:有了樣板,很容易就會針對各自認為重要的功能在樣板上加上一大堆章節。




三.無痛軟體時程

1.訂出確實無誤的軟體時程方法:

(1)使用Excel。

(2)簡單就好:一開始只要七個欄位即可。若開發人員不只一個,你可以讓每個人各自擁有一個表,也可以加上欄位標出負責各項工作的人員。

(3)每個功能應該包含多項任務。

(4)只有實際要寫該程式的程式設計人員,才能排出該項目的時程:只有實際執行工作的程式設計人員,才能找出完成功能所需的步驟,也只有他才能估計每個步驟所需的時間。

(5)要把任務分得很細:分配好的任務應該是以「小時」計,而非以「天」或「週」計。當你必須訂出細項工作時,就必須強迫自己找出確實要進行的步驟。每項任務耗時應在2~16小時之間。若時程上有項任務需要40小時(一週),表示細分的還不夠。

(6)記錄最初和目前的估計:當你把某件任務第一次排進時程時,先估計所需時數並填入原始估計(Orig Est)以及目前估計(Curr Est)欄位中。當計畫進行時,就可以依需要來更新目前估計欄位。

(7)每天更新耗時欄:同時還需更新各任務的目前估計欄。

(8)加上國定假日、休假等項目:如此就可以把剩餘的時間加總起來,再除以40(就是考慮一切之後的所需工作週數),以計算出貨的日期。

(9)把除錯時間排入時程。

(10)把整合時間排入時程。

(11)在時程中加上緩衝時間:你需要考慮預防工作耗時超過的緩衝,與針對未預期但必要工作的緩衝。

(12)絕對不讓經理叫程式設計人員縮減預估時間:讓程式設計人員自行估計時間。

(13)時程就像積木:維護時程能逼自己刪除功能,因為你只能拿掉積木(刪除功能)或找個大箱子(延後出貨時間)。


2.必須知道的Excel二三事:

(1)共用活頁簿:利用共用活頁簿命令,可以讓大家同時開啟並編輯檔案。尤其是整個團隊會持續更新時程。

(2)自動篩選:你可以只檢視所有指派給你的功能,再加上自動排序功能,就能依優先順序檢視所有指派給你的功能,實際上這就是你的工作清單。

(3)樞紐分析表:檢視摘要及多重彙總表格的好方法。

(4)WORKDAY函數:讓你在無痛時程中計算日曆天數的好方法。




四.每日編譯是你的好朋友

1.每日編譯腳本必須包含負責建立所有的編譯結果。由取得原始碼開始,到把結果放到網站上適當位置供人下載(開發過程中,理應有一個測試伺服器),所有過程全都包含在內。


2.只有從頭開始取出完整的程式碼,再經由每日編譯腳本製作出的程式才可以發行。


3.把你的編譯器的警告等級開到最高,即使遇到最小的警告都要停止編譯。


4.若每日編譯失敗,就要冒險停止整個團體的作業。全部動作都停下來重新編譯,直到問題修正為止。


5.每日編譯腳本應該在遇到錯誤時,使用電子郵件把失敗狀況回報給整個開發團隊。腳本也要能把狀態報告附加到對團隊成員公開的HTML網頁上,如此才能讓大家快速得知哪個編譯結果是成功的。


6.破壞編譯的人必須開始負責照顧每日編譯,直到有其他成員破壞才換手。


7.午餐時間會是個進行編譯的好時間。如此一來,大家都在午餐前把最新的程式提交進版本管理系統,用餐時就進行編譯。用餐完畢後,若有編譯失敗,大家就會一同解決問題。只要編譯正常,就能取出最新的版本繼續作業。




五.絕不妥協的抓蟲行動

1.確定知道問題的狀況:

(1)把所有出現的問題全部抓下來,盡可能記錄最多的資訊,然後再把全部資料以電子郵件寄給開發團隊。

(2)把每通技術支援電話都視為某個問題的跡象。當我們接到電話時,試著思考能做些什麼來避免。


2.確定你會得到經濟上的回饋。


3.找出哪些問題值得全部修好。




六.紙上原型製作

1.只用鉛筆在紙上畫出使用者介面的原型,越潦草越好。畫好後拿給幾個人看,詢問他們會如何完成某件事情。當他們說出動作時,就能立即把東西搬來搬去。




七.面試人員教戰守則

1.放棄錯誤過多的履歷。


2.找些有識別作用的內容,如這個人曾經歷了某些很困難的選擇過程,並且也通過了。


3.電話面試時,談談某個特別的程式問題。


4.現場面試時,至少要經過六位面試官(其中至少五位是應徵者即將一起工作的同事),若其中有兩位否決,則不錄取。開始前不要預告會有多少場面試。此外,應參考資深人員的否決意見,而非資淺人員的意見。


5.不要同時面試很多人,每次面試應只有一位面試官和一位應徵者,而且在一間有白板且可以關門的房間內進行。


6.只要閃過一絲左右為難的念頭,就表示不錄用。否決一個好人選比接受一個壞人選的結果好的多。


7.檢驗應徵者是否聰明:不必一遍又一遍地重複解釋事情。通常應徵者會說出某些事,話中顯露出真正的洞察力、智力或敏銳度。因此,面試有個重要的過程,就是要創造出某種情境,讓對方能夠展示出他的見解。


8.聰明不是指「知道瑣碎問題的答案」。公司希望雇用有資質,而非具備特定技能的人。任何工作上應用的技能在數年後一定會被淘汰,所以最好雇用能學習任何新技術的人。


9.面試計畫:

(1)簡介:主要是讓應徵者放鬆,再用30秒左右的自我介紹,並說明面試進行的方式。此外,應向他們表示,你感興趣的是他們的解決方式,而非答案本身。

(2)關於應徵者最近工作專案的問題:若面試的是大學生時,則問他們的學士論文,或是曾在課程中參與過、又很喜歡的長期專案,也可以問「你所修過的課程中裡最喜歡哪一門?」等,重點是要問開放性的問題,從中尋找以下三點:

<1>尋找熱情:只有會激動地談論該主題的、有肢體動作的人,才是真正有熱情的。

<2>好的人選會仔細地把事情由各個層面解釋清楚:好的人選不會使用術語讓人無法理解,他們知道該如何才能讓其他人了解自身的想法。

<3>如果專案是多個人一齊負責,尋找擔任領導角色的跡象:唯一能知道某人可以把事情做好的方法,就是看他過去是否有把事情做好的傾向。你甚至可以直接要求他們舉出例子,談論最近曾擔任領導角色把事情做好的案例。

(3)不可能的問題:聰明的人知道你不是在考他們的知識,而是考驗他們是否會熱情地試圖找出一些不那麼正式的答案。

(4)程式問題:如就地(不用額外記憶體)把字串反向、把鏈結串列反向、計算一個位元組裡所有為1的位元、二分法搜尋、找到一個字串中最長的連續相同字元、把字串轉成數字、把數字轉成字串。

(5)你滿意嗎?問完程式問題後,問他們對這段程式滿意嗎,而非問哪裡有錯。

(6)你有什麼問題嗎?


10.面試前別聽召募人員的話,也不要詢問該人選的事,而且在做好決定前,不要與其它面試官討論,才不會有先入為主的觀念。


11.不應提違法的問題,以及腦筋急轉彎。




八.人的工作切換有害無益

1.絕對不要讓人同時做一件以上的事情。




九.揭露冰山的秘密

1.客戶不會知道他們要什麼,別再期望客戶知道他們要什麼。


2.你必須自己弄出一些東西並假設客戶也喜歡你做的東西,而且他們最多只是會有點驚訝而已。你得自己研究,找出一個設計能皆大歡喜地解決客戶的問題。


3.把使用者介面的畫面展示給非程式人員看時,若介面不好看,對方會認為你整個程式也是不好的。


4.客戶想要玩設計的話,就讓他們去碰一些無害的東西,如改變某些元件的擺設方式、改變外觀和字型、移動標誌位置等。


5.你在會議室裡用投影機所做的任何展示,都只是像素而已。如果可以,應該把未完成的使用者介面畫得就像是未完成。例如,在完成功能之前,對應的工具欄圖示就只用草圖即可。要是你在一開始就把畫面做得太過完美,等到之後真正做內部的功能時,他們反而認為這段期間內你什麼都沒做,因為他們看不到。


6.要確定你控制了大家對時程的想法。提供一份Excel格式的詳細時程,每週寄出談論本週進度的電子郵件 。不要讓專案是否正常進行的想法影響到真正的事實。


7.不要重寫程式碼,維護一份舊的程式碼比之後替新的程式抓蟲要好的多。




十.小員工也能做大事

1.去做就是了:有很多改善專案的事,只靠一個人就可以做到了,就算其他人不做,也可以靠你自己。


2.利用病毒性行銷的威力:一直向他們洗腦。


3.建立一個卓越圈:想辦法讓聰明的人支持你。


4.讓笨蛋無害:當有人設計出有問題的程式,不需要幫他們從頭改寫過,只要一直報告那個程式的問題即可,他們就不會在其他的地方造成傷害了。


5.遠離干擾環境。


6.提昇自己的價值:塑造在團隊中良好的印象,再慢慢改善流程。




十一.為非我發明症辯護

1.如果是核心的事業功能,不管是什麼都要自己來做,絕對不可外包。




十二.策略書

1.如果你要進入一個有網路效應和鎖定特性的產業,最好是新科技,一開始沒有競爭者,而且網路效應和客戶鎖定都很強的產業。


2.除非擁有好的軟體,否則不會有人買你的平台,然而你的平台要有很多用戶,才會有人替你寫軟體。要克服這種雞生蛋蛋生雞的問題,就是要提供一個向後相容模式。


3.別對潛在客戶施壓。如果某人還不是你的客戶,試圖鎖定他們並不是個好主意。


4.當商品價格下降時,互補物品的需求就會增加。通常公司的策略利益是讓互補商品的價格越低越好。理論上能維持住最低價格是「普及價格(commodity price)」,也就是會有很多競爭者提供相同商品時的價格。因此,聰明的公司會試圖讓產品的互補物普及化(commoditize)。


5.傾聽你的客戶,而非你的競爭對手。

沒有留言:

張貼留言