如何估計編程時間

預估建立軟體所需時間的精細藝術 我真的很想告訴大家我如何估計建立軟體專案所需的時間。 在過去的十年中,我已經被問了數百次這個問題。 “我們需要實現這個功能。你需要多長時間?” “請給我一個詳細的概述,這個專案需要多長時間。一個月?兩個月?” “我希望你發布這個。50小時的計費時間夠嗎?” 對於這些問題的答案,通常最多只是一個 賭注。或者只能是 一次躍進的信任,我知道,如果我承諾一個數字,無論實際所需時間短長,這可能都會是我的薪水。 有時候對於長期客戶,我能夠用相超出估計的專案來彌補我所期望完成工作的早期專案,讓客戶知曉。 最終,我只能說 " 我無法估計"。 所以,對於 “我真的很想告訴大家我如何估計建立軟體專案所需的時間” 的答案是:我不行。 但我可以估計,沒有人真正能夠估計 建立軟體所需時間,因為這個領域內部的複雜性會對你產生影響。 “真正的工程師” 會發現這很難承認,但我從來不是你典型的真正工程師類型。 當你作為開發者工作時,估計可能是最困難的事情。 以下是一張很棒的參考表格,當你需要估計一個任務時可以使用。 任務 你的估計 你忘記的 實際所需時間 一個小的錯誤修復 2分鐘 我們需要找到在原始碼中有錯誤的函數,進行git pull,檢查我們是否破壞了其他函數,我們需要添加一些測試,執行測試,修復我們破壞的測試,部署,更新錯誤追踪器 2小時 一個小的功能 2小時 你需要修復代碼中待處理的TODO,並查看為什麼有一個 //don't touch this 註解。你需要仔細進行手動測試,加上瀏覽器測試,並檢查為什麼在Edge上的預期結果未達到預期。哦,我們還需要在文檔中更新所有截圖 10小時 改善端點的性能 10小時 你需要準確的基準測試,用於證明你的新實現方法正確運作,並添加以前不存在的10多個測試,否則你會有破壞數以萬計客戶使用的生產代碼的風險 5天 重寫整個前端代碼 3週 你開始使用你正在實驗的新的 更具可擴展性 框架,而不觸及UI,但你遇到了一整套完全新的問題,這次沒有StackOverflow或Google可以幫助,因為這個框架太新了。你遇到了獨特的問題,你需要雇用該庫的維護者來與你合作,但他已經轉向下一個偉大的事物。同時,UI團隊決定完全重寫界面,2次。在中途時間,產品經理希望將產品微調到稍微不同的產品 12個月 這可能是我們缺乏估計的很好估計,但事實上事情也可能相反:你估計需要5天的事情實際上可能只需1天,因為你發現一切都已經就緒,只需要添加它,所需時間比預期的少得多。 有些人可能會高估,預計他們可能會遇到困難,增加他們認為需要的30%。 團隊專案的估計甚至更困難,我甚至不會嘗試。 那麼該怎麼辦呢? 與其詳細估計,我建議與委托你工作的客戶、老闆或其他人進行持續溝通,每周檢查專案進度。而不是預先設定結束時間。 因為終究這個過程永遠不會結束。

如何管理軟體專案

專案管理是一門藝術。這門藝術有很多不同的詮釋方式,你可以花很多時間學習它。 在亞馬遜可以找到很多關於這個主題的書籍,在網上也有很多不同的觀點。 對於什麼構成了一個好的專案管理策略,沒有明確的答案,但在這篇文章中,我想和你分享我對如何管理軟體專案的看法。 快速開始的方式。 當你開始一個專案時,第一件事就是進行計劃,而不是馬上開始寫程式。 寫程式可能在你開始計劃後的一週或更長的時間內才會開始。 你首先進行需求分析階段,就像我在這個課程的第三個模組中解釋的那樣,在第一週中進行。 我建議你使用一個專案管理工具,有很多這樣的工具。 我會使用像 Notion 或是 MindNode 這樣的思維導圖工具。 在團隊環境中,計劃階段是一個協作的過程,建議使用可以協作的工具,像是 Basecamp 這樣的工具。 開會和互相交流,定義你將要建立的東西和制定一個初始的路線圖。 初始的路線圖不可能是最終的路線圖。 這是因為一開始你忽略了太多事情。 你正在盡力創造一個具有很多不確定性的東西。 你所提出的任何計劃都只是猜測。 這就是為什麼敏捷開發運動如此迅速發展的原因。你可以閱讀像《敏捷開發的藝術》、《精益运营》、《精益創業》等等書籍,找到很多有趣的信息。 另一本很棒的書籍,尤其是針對軟體的,是《真實世界開發》,你可以在 basecamp.com/gettingreal 免費閱讀這本書。 我的建議是先確定一個MVP,一個最小可行產品。這是定義中最小的產品,它能解決你所面臨的問題。 有很多關於如何確定正確的問題和建立正確的產品的事情需要討論,但我假設你正在為一個委託你的客戶開發一個產品。 明確設定界限,堅持那些構成應用核心的基本功能。對於第一個MVP的迭代應該要快速,以便能快速得到與客戶的反饋。 盡快把第一個版本推出去,因為那時真正的學習才開始。 從那個時候開始,你將不斷迭代,直到把產品做得正確為止。 團隊越大,問題越複雜,專案經理需要更有經驗,這就是為什麼專案管理不是你的第一份工作,可能只有在作為開發人員工作多年之後,你才有責任去做這件事情。 在某個時候,你會超越開發,不再只是"寫程式",並且承擔更多的責任,那時你可能會轉向專案管理。 這是常見的進步路徑,雖然並不是你被迫成長的路徑,但通常也會帶來身份和經濟上的好處。

我是如何決定創建一個新的專案管理應用程式的

在過去的幾年中,我建立了許多應用程式。其中大部分是為iOS開發的,一些是為Mac,還有一些是為Web開發的。回顧過去,其中大部分都只有一些小型的目標,但有些很有前途,比我想像的還要大。但它們最終都未能成就。隨著時間的推移,我把所有這些項目都放棄了。 其中有一些應用程式可能只是能夠“存活”,但軟體最終會像水果一樣過期。如果你不不斷更新以符合作業系統的使用者介面並持續維護它,軟體就會消亡。 在過去的幾年裡,我專注於教導開發者創建Web應用程式,這是我找到巨大個人滿足感的地方。 這也是我未來計劃將所有注意力放在的地方:成為一位計算機編程教師,並每年組織我的JavaScript全棧訓練營。無論是在不久的將來還是長遠的未來,我都計劃如此。 但最近我又開始了一個新的應用程式開發。 有人說“不要從一個想法開始,而要從一個問題開始”。 事情是這樣的:我當時同時在進行許多不同的專案,而我希望有一種很好的方式來管理它們。 我接下來要在我的電子元件探索之旅中做什麼?我上一次做了什麼? 為什麼我停止了那個木桌專案?哦對了,我需要開車1小時去商店。 我要買什麼東西來完成車上新電池升級的計畫?哦對了,我已經放在亞馬遜購物車裡了。 我正在對JavaScript訓練營的課程進行重構,進展如何? 我找不到一個好的專案管理應用程式來幫助我,所以我使用了一堆不同的工具,如白板、紙張、電腦上的筆記、Things、WorkFlowy和MindNode。 這些應用程式都很不錯,但它們並不能完全解決我的問題。我可以用它們來解決我的問題,但是…不行。 於是,我開始研究人們通常用於專案管理的工具。噢,對了,我指的是專案們的管理。同時管理我所有的專案。 我在網絡上到處搜尋,但我找到的要麼都是待辦事項應用程式,要麼是團隊專案管理。是的,我也可以自己用這些工具,但這些工具都假設你與團隊一起工作。 為什麼呢?為什麼我不能有一個一流的使用體驗,而不需要那些專為團隊使用的功能,這些功能只會增加我的認知負荷? 我也在Twitter上詢問了,但沒有什麼結果。之後我又放棄了這個概念幾週。 然後幾天前的一個晚上,我重新開始思考這個問題,因為我意識到自己又在同時進行太多的專案了。我總是如此。我不能一個項目從頭到尾完工,我總是同時推進多個項目。這就是我的方式。 一個晚上的晚上11點,我開始在紙上畫一些東西。我畫畫很差,所以我不會向你展示結果。 然後幾天後,傍晚時分(我最有創造力的時間),我打開了Balsamiq Wireframes,開始畫一些畫面。 這個應用程式非常棒,因為它讓你能夠在不被細節困擾的情況下工作在概念上。我喜歡它。 過了一段時間,我準備好了兩個畫面。專案列表和專案詳情頁面。 沒什麼花哨的,沒有突破性的東西。 沒有商業計劃。沒有商業模式畫布。 說到這個,我必須說自己是一個獨立開發者,我喜歡閱讀工作在應用程式上取得成功的故事,不管是在使用者、產品市場適應或者獲利方面都成功了。 其中一些故事很令人驚奇,我尤其欣賞那些一個人獨立開發出了一些有意義的東西,這些東西現在為他們提供全職收入。 我很幸運,因為我通過我的線上編程培訓課程賺取了全職收入,所以我對這個應用程式沒有任何金錢上的期望。 我過去創建應用程式的所有嘗試都是嘗試創建一個可以成為我的全職收入的業務。 我認為這是一個關鍵的區別。金錢創造了某種期望,而99%的應用程式無法滿足這些期望。 去除了金錢因素之後,還剩下什麼? 那就是手藝。 我想創建這個應用程式不是為了出售它,也不是為了從中致富,而是要創建一個有用的軟體。一個美麗的軟體。 首先,我會每天使用它。 然後也許我也可以將這個應用程式發佈給公眾,看看是否有人喜歡它,但主要目標是為了自己建立它。 這就是我將基於的所有需求。我不在乎其他人是否需要額外的功能,因為我只想建立一個根據我對應用程式應有特性的概念而打造的應用程式。 如果這使應用程式足夠吸引人,讓其他人也找到它有用,那就太好了。 但首先,它必須成為我夢寐以求的應用程式。 我建立和維護的每一個應用程式都必須是我每天都在使用的應用程式。 對我來說,這是唯一的方法。我無法想像,基於我過去的經歷,我會去開發一個對我來說沒有用處的應用程式。不只是有用,而是必不可少。 我認為這種應用程式是必不可少的,就像對我來說,思維導圖、簡單的待辦事項清單和日曆一樣必不可少。 我想要使用Notes來記錄快速筆記,MindNode和WorkFlowy來整理思緒,但是當要管理一個專案時,我希望使用我的工具。 我會每天使用它,以俯瞰整個專案,看看我正在主動工作的專案,我暫停的專案,我完成或取消的專案。 我會用它來決定我當天要工作在哪個專案上。除非有一些期限緊迫,我可以自由決定該做什麼工作。 我會用它來查看專案的當前狀態,它的下一個里程碑和到目前為止的時間軸,還有其他詳細信息。 我會用它來回顧我的進展,當我問自己“過去幾週我完成了什麼?”時。這對我來說很有說服力,因為我記性不好,往往會忘記我完成的工作。 看,我會用它做很多事情。 這使得它值得探索,儘管這樣: 我真的想要這麼做,這不是幾天之後就消失的一時興趣 我真的願意為它的創建和維護付出多年的時間 讓我們看看。 更新 2023:放棄的專案 😄