“嗨,阿米戈!”
“嗨,比拉博!”
“今天我要給大家講講程序通常是怎麼開發的。”
“在 20 世紀,當現代 IT 還處於起步階段時,每個人似乎都認為編程就像建築或製造。”
“事情通常是這樣的:”
“客戶會解釋他需要的程序類型——它應該做什麼以及應該如何做。”
“業務分析師會聽取他的意見,並根據他所說的內容製作一份完整的計劃要求清單。”
“然後項目經理會將這些需求分解成任務,並且還會確定哪個程序員將執行什麼任務以及以什麼順序執行。”
“然後程序員就會開始工作。有時他們會工作幾年(!)。”
“當他們完成後,程序就交給了測試人員。”
“測試人員將檢查每個程序的要求,以驗證它們是否得到實施以及該程序是否按預期運行。”
“如果出現問題,測試人員會記錄錯誤並將其發送給程序員。”
“然後程序員會修復錯誤並將修復的程序發回給測試人員。然後循環會重複。”
“當主要錯誤被修復後,程序就交給了客戶。”
“事情真的是這樣?”
“嗯,當然,我已經簡化了很多,但這與事情的完成方式非常接近。”
“一個項目真的需要一年半到兩年才能完成嗎?”
“有時,如果一個項目的開發時間真的很長,他們會將其分成單獨的版本。每隔 3-6 個月,開發人員必須創建程序功能的特定部分,對其進行測試,修復所有錯誤,然後將其展示給顧客。”
“首先,他可以分享他的印象。其次,更重要的是,他可以繼續為該項目的開發付費。”
“繼續付錢?”
“那時候,開發的時間往往比計劃的時間長 2-3 倍。而且由於程序員通常按小時支付報酬,所以程序的成本就高了 2-3 倍。而且,收益也減少了。畢竟,今天客戶想要什麼3 年內可能不需要 100,000 美元——尤其是三倍的價格。”
“客戶經常拒絕付款嗎?”
“是的,後來他們開始在合同中增加懲罰,但這並沒有改善這種情況。軟件開發一直拖延,即使他們想做也沒有人能做。”
“但為什麼?”
“嗯,第一,在規劃階段知道的太少了。很多時候,一開始,沒有人能預測到程序員會面臨的問題。”
“但有經驗的程序員應該能預見一切吧?”
“你能看出編程是一個獨特的職業嗎。”
“一個普通的工人經常一遍又一遍地做同樣的工作。製表師製作手錶,廚師做飯,老師教書,醫生治療等等。”
“這些專業人士中的每一位基本上日復一日地做著同樣的事情。因此,他們開始越來越擅長自己的工作。”
“在編程中,方法是不同的。只要程序員每天面對相同的任務,他就會編寫一個函數、模塊或程序來執行它,並且再也不會回來處理它。”
“每個程序員通常在他或她的一生中完成一次任務。”
“就像發明東西的科學家或設計工程師。”
“啊。那麼,在一個項目中最重要的角色是什麼?”
“嗯,怎麼回答呢。說哪個最重要容易,最不重要就難了。”
"測試人員(質量保證 ,QA)的主要工作是監控程序的狀態並及時報告錯誤。 測試人員發現錯誤的次數越多、越早,修復的錯誤就越多。 一個好的測試人員對產品質量的影響超過一個好的程序員會。”
“為什麼程序員不能測試他們自己的程序。畢竟,難道他們不比測試人員更清楚什麼有效什麼無效嗎?”
“一個優秀的程序員根本無法成為一名優秀的測試人員。程序員知道該程序如何真正運行良好,因此他或她總是以某種方式使用它。這與普通用戶相反,他們隨心所欲地使用該程序。 “
“此外,測試人員不會測試還不能運行的東西。測試人員測試程序員所說的已經幾乎完美運行的功能或部分程序。”
“當測試人員在該功能中發現大量錯誤,並且程序員修復它們時,產品實際上就更接近完美了。”
”程序員(S oftware D eveloper Engineer , Developer , SDE)的主要任務是實現新功能。或者,更簡單地說,執行分配給他或她的任務。當程序員被分配具有新功能的任務時,他們執行它們。當他們被分配錯誤時,他們會修復錯誤。”
“但有時會有更具挑戰性的任務,例如,為程序或其中的一部分提出架構。提出的架構越好,將來完成事情就越容易。”
“問題是架構需要在一開始就選擇好,但是到了開發到一半的時候才清楚是否選擇了正確的架構。”
“此外,如果架構成功並且程序運行良好,那麼客戶可能希望將其用作新版本程序的基礎。”
“這就是我的意思。”
“無論你選擇什麼架構,總會有一堆架構沒有考慮到的變化、添加和新功能。”
“這是一個很好的例子。”
“一位客戶要求你建造一座 5 層樓的建築,所以你設計了一個建築並建造了房子。”
“然後客戶要求添加另一個故事,然後再添加一個,依此類推。”
“但是一樓的牆壁不是為那麼大的重量設計的,地基也不是。所以一切都必須重做。”
“但是5層樓建好後,如果客戶馬上決定要50層樓怎麼辦?”
“拆除現有結構並從頭開始重建一切會更容易……”
“但我有一條關於建築的建議給你。”
“應用程序的架構首先必須是靈活的,這意味著如果您決定重做應用程序的一半,您將不必從頭開始。這種類型的架構通常稱為靈活和模塊化。 ”
“項目經理的主要工作是做決定。項目經理是看到大局並根據大局做出決策的人。”
“假設在開發過程中,某項任務顯然無法按計劃完成。項目經理可以:”
" a) 嘗試與客戶協商修改任務"
“ b) 為任務分配更多時間”
“ c) 從其他項目中引進更有經驗的程序員。”
“還有很多其他的可能性。”
“每個選項都需要你做出一些犧牲,而 經理的工作就是將這些犧牲造成的總損失降到最低。 ”
“例如,假設競爭對手以兩倍的價格搶走了首席程序員。”
“項目經理可以:”
" a) 什麼都不做。程序員會離開,項目很可能會落後並招致處罰。"
” b) 給他的工資加倍。然後團隊裡的其他人也會想要加薪。如果你給他們都加錢,那麼這個項目的成本就會增加,可能會變得無利可圖。”
“ c) 你想出的其他一些選擇。”
“我懂了。”
“一個糟糕的項目經理,一個好的團隊通常會延長一個項目,但並非總是如此。”
“一個擁有普通程序員團隊的好經理幾乎總是比一個擁有優秀程序員團隊的糟糕經理更快地完成項目。”
“我懂了。”
“好吧,我們休息一下,然後我們繼續。”
GO TO FULL VERSION