發表文章

目前顯示的是 7月, 2023的文章

軟體架構設計:有『題』- API 設計原則以『線上售票系統為例』

圖片
軟體架構設計:有『題』- API 設計原則以『線上售票系統為例』 前言 先前,我有篇文章是以讀過【Get Your Hands Dirty on Clean Archiecture】後的心得感想,這本書的中文名稱是:【Clean Architecture 實作篇:在整潔架構上弄髒你的手】,讀完這本書大約是去年 2022/10 月左右,也是我當時在開發 API 新版框架大爆發的時候,書中給我不少的啟發,在配合實際的專案開發的實作經驗 + 框架設計所需要的框架設計便引入六角架構的設計方式,藉以改良原有的舊版的框架,而這篇『 軟體架構設計:無題 ( http://gelis-dotnet.blogspot.com/2022/08/blog-post.html )』中便是以完整的〔六角架構 (Hexagonal Architecture)〕並加以解釋如何在六角架構中落實單元測試 Unit Test,這些都是我讀完書後,實際落實在專案上的實際做法 + 分享。 當時的六角架構 + Unit Test 的範例程式在這: https://github.com/wugelis/AdapterInOutLayerSapmle 上次是無題,今天,我以一個X宏線上售票系統為例子,我們從頭到尾地的,Step By Step 的來介紹,這個 API 售票系統的建置過程,而這裡,我也會搭配 『API 設計原則』一書裡的一些做法,也就是說,這裡開發的 API 會使用 API First 的設計樣式,因為這裡的 API 設計的出發點為該企業、在這個商業模式上所能夠提供之『商業能力』回出發點考量,而不是過往傳統的單一客戶(UI)思維的客製化模式考量,所謂的 API First 是轉向為產品化思惟的導向模式,如此也才能發揮 API 在市場上的價值,這也才是 API First 的思維模式。 需求來源 圖(一)、線上售票系統需求 今天的需求來源,是一個線上售票系統,先前我曾在專案中製作過一個售票系統的雛形,這裡我就拿這個範例來以 DDD 來進行戰略建模,並搭配使用我在新竹顧問時所開發的新版 API Framework 來實作並支撐這個售票系統 API 的 Infrastructure Layer,沒錯,所以言下之意,我們以 DDD 來驅動這個售票系統 API 的開發,所以這裡的 Core

為什麼開發人員總是會產生過度設計的程式碼?

圖片
為什麼開發人員總是會產生過度設計的程式碼? 問題的來源 什麼是過度設計?開發人員為什麼會過度設計?過度設計與預先設計有什麼關係?過度設計是最終導致的結果,而預先設計無非是想讓軟體的程式碼撰寫落在刀口上,減少時間的支出來產生可交付的程式碼。但是這件事情好像沒這麼簡單?即便談需求的是我,我還是會有過度設計的程式碼產生,為什麼回如此呢?但這樣真的完全不好嗎? 會產生過度設計可能有以下幾個原因。 分析時間過久 以前筆者曾提過傳統的瀑布式容易造成分析時間過長,最終就導致過度的設計而不自知,撰寫程式碼時因為關起門來寫,一些就是 3 個月或半年,脫節的需求產出的程式碼可能大部分不是客戶要的,這也是種過度設計,只是大部分設計出不正確的程式碼。 這會產生比較嚴重的反效果,一個是因為需求的脫節,即便抓回方向,但錯誤的設計已經使系統長歪,要修復往往非常的耗時耗力,甚至打掉重練比較快的情況也可能發生。 搞不清楚客戶說什麼 所謂隔行如隔山,軟體公司常只接針對特定領域的專案,或熟悉的領域進行客製化,好比筆者10幾年前曾待過專接流通業的 SI 公司,突然接金融電信領域的專案通常前 1-2 個失敗機率極高,為什麼,因為不熟悉這個產業的通用語言。然而這樣的接案就是極高的風險,筆者甚至分享以前遭遇到的經驗,曾經有同行求救於我們公司,他們因為不熟悉該領域硬是接下後無法收尾,而求助於我們公司熟悉金融領域的部門,當然,最後我們也沒有答應協助收這個爛攤子。 所以,Gelis 認為,搞清楚客戶說什麼常重要,在三地確認客戶腦袋的想法也很種要。 需求不明確 有可能需求訪談客戶主事者不在,或者具備決定權剛好不在、又或者客戶因為處於新員交接、正在熟悉此業務,所提需求自然諸多漏洞 + 沒想清楚。這筆者就曾遇過客戶端兩位經理在訪談會議時爭吵需求執行內容,讓在場的廠商非常傻眼,很想請他們去廁所打一架看誰贏了,我就做哪一個需求。 或者純粹是使用者想太多,想變更需求。或者自己搞不懂自己想要什麼,這比較常見。 也有可能開發團隊最後自己腦補,產生了一些設計,結果最後又不同於客戶確認的規格內容,這也是種過度設計,因為你設計了一堆不需要的架構內容。 如此一來,程式碼修修改改,不產生技術債都難。 保留設計 這接續前面的需求不明確,就因為需求不明確,所以開發人員就做了許多『預先設計』的保留,