「程式設計」的練習是一種從「寫得出」程式到「寫得好」持續迭代的優化過程,在 LeetCode 刷題的過程中我們掌握的是「解決問題的能力」,特別是指所謂的程式問題(或是演算法問題)。解決程式問題的能力主要是把原始的問題轉換成一個程式可以解決的問題,再進一步把大問題拆解成小的問題或是轉換成其他較容易解決的近似問題。不管怎麼說,我們在刷題過程在意的是 理解 → 拆解 → 實作 的步驟。刷題其實很類似國高中數學的應用問題,給你一個情境或是問題,理解之後轉換成對應的題型與章節,然後挑選正確的理論或是公式解題。在解決數學應用的過程不是死背公式,而是從大量的練習題當中掌握公式的用法;就如同寫程式一樣,刷題不是要你被題型或樣板,而是累積對於類似問題的解法與武器。
刷題是練習 解決問題的能力 的一種方法,而這裡的「問題」主要是指 演算法問題 。但在實務的工作場景當中,「演算法問題」只是程式工作的一小部分而已。我們除了在意「一個問題中的算法怎麼解之外」,我們更在意的「如何把這些算法實現成完整的應用」。因此除了刷題之外的事是如何用「工程化」的方式解決一個真實問題,除了刷題之外想寫好程式還有以下幾個技能需要掌握:
根據 維基百科 的定義:「軟體工程(software engineering),是軟體開發領域裡對工程方法的系統應用。電氣電子工程師學會(IEEE)給出了一個更加綜合的定義:『將系統化的、規範的、可度量的方法用於軟體的開發、執行和維護的過程,即將工程化應用於軟體開發中』」
軟體工程是一種系統性開發軟體的過程與規劃,而這個開發進程可以分成分析、設計、實作、測試與維護這四個階段,稱為是「軟體生命週期」。換句話說,軟體工程告訴我們要依循怎樣的規劃與協作才能夠讓軟體開體的過程更順利。
根據 維基百科 的定義:「在軟體工程中,設計模式是對軟體設計中普遍存在的各種問題,所提出的解決方案。設計模式並不直接用來完成程式碼的編寫,而是描述在各種不同情況下,要怎麼解決問題的一種方案。」
設計模式強調軟體或程式開發中的「設計」該如何設計,設計模式是一種如何開發「好的程式」專案的一套經驗,其涵蓋的範圍會包含整個程式的開發到維護。總結來說,演算法著重的程式片段、設計模式通常是一個或多個程式之間要如何協作,軟體工程更上層的從專案的角度來規劃,如何去管理與開發整個專案從零到一。
一個軟體從無到有開發過程我們稱為「生命週期」,大致上會包含「分析」、「設計」、「實作」與「測試」,有些人也會加上「部署」跟「維護」。常見的開發方法可以分為「瀑布模型(Waterfall Model)」或「敏捷開發(Agile Development)」,如 下圖 所示:
瀑布模型會依照不同的階段來規劃,前面一個階段完成後才會進入下一個階段(除非前一個階段完成,否則下一個階段就無法開始)。相對來說,每一個階段投入的時程與成本都會提高,但隨之而來的風險也會提升。敏捷開發是近年來很熱門的一種軟體開發方式,更強調的是「小規模」的開發與驗證。過去瀑布模型最大的問題在於龐大的規劃難以迅速地因應使用者或是市場需求的變化,缺乏面對不確定性時的彈性。而敏捷開發則是把整個開發流程拆成小階段的進行,相對來說比較輕量,每個回合著重在小功能的「分析」、「設計」、「實作」與「測試」,透過不同回合迭代出新的功能。
嗨,大家好!我是維元,一名擅長網站開發與資料科學的雙棲工程師,斜槓於程式社群【JSDC】核心成員及【資料科學家的工作日常】粉專經營。目前在 ALPHACamp 擔任資料工程師,同時也在中華電信、工研院與多所學校等單位持續開課。擁有多次大型技術會議講者與競賽獲獎經驗,持續在不同的平台發表對 #資料科學、 #網頁開發 或 #軟體職涯 相關的分享,邀請你加入 訂閱 接收最新資訊。