軟體技術人員最愛卻也是尾大不掉的萬用 Database Manager 物件

** 本文同步發表於 軟體設計鮮思維FB社群 **

上星期我在教授 TDD.NET 測試驅動開發課程。其中有位學員分享他們公司會計系統的部分程式碼 (沒有機密性議題),想知道這該如何撰寫單元測試 (Unit Test Code)。

我先用 EA (Enterprise Architect) UML 工具掃描程式碼反轉為 類別 (Class) 圖,老天!數百個 Windows Form (每一個 Form 他們稱為 Report) 全連接到一顆共用的 DB Manager,封裝了基本的 CRUD 行為,再存取資料庫。剛掃進來時還真嚇了一跳跳,那個 Form 的連線,有如積體電路般密密麻麻的共同連接到如同就是 CPU 地位的 DB Manager!

2tier universal db manager

這肯定就是典型技術人員的傑作,用許多稀奇古怪的實作方式,讓所有的表單 UI 程式,傳進來 SQL 敘述,然後再去存取資料庫。看似方便簡單,但這顆萬用的 DB Manager 已經被約束了特定的實作技術與特定的資料庫,所以當然無法抽換,原來他們使用 ADO.NET 的連線,現在是不可能換成 Entity Framework;不僅如此,內部程式碼的擁腫肥大,當時的技術人員一離開,幾乎達到無法維護的地步。

閱讀全文 »

創意確是來得比程式碼品質有價值;但好的程式碼仍是有意義的

*** 本文同步發表於 FB 社團-軟體設計鮮思維 ***

前幾日在許多新聞電視台播放這則新聞:「牙醫預約APP 七年級生月營收20萬」。

的確很欽佩這位七年級生,剛出社會沒多久,就將自己的理想與創意實現,並因此而創造出公司的金流 (cash flow),立穩經營的腳步。

然後在看播放新聞的過程中發現到,喔,該 App 創辦人兼開發者,應是利用 GitHub 作版控 (version control)與維護程式碼的。這很正常更是值得鼓勵與借鏡,即使少數三兩個軟體人員,藉由雲端儲庫 (cloud repository)作版本管控,更能實行遠距協同開發與溝通,讓協同開發更形順暢。

然後又一瞥看到開發者撰寫的程式者,只是一小段而已,不過應該看得出在某一個方法 (method) 內撰寫了許多 if..then..else 的條件判斷陳述。

喔,這其實算是違背了「Clean Code」簡潔程式碼的原則。每一條判斷陳述可能是代表了單一的工作單元 (unit of work),當條件判斷陳述越多、變化越頻繁,越是難以維護。一般這最好是施以重構 (re-factoring),運用「萃取 (extract)」的技巧,分派單一工作至相對應的類別/方法 (class/method)內,讓程式碼回歸到簡潔易讀好維護的原點。

這讓我又再次思考一個問題:到底發揮創意並具體實現最重要,還是要求程式碼乃至工作的品質?

這幾年個人乃至於所屬的顧問團隊,可說都相當要求系統 (包括分析設計產出與程式碼)的開發至維護期間的品質,目的是為了讓開發更形直覺順暢,以及讓後續的維護更能應付變動,如此更能增進系統整體的價值。

但個人更是推崇 Maker 的文化,從發想到創意的實現,一切自造,需整合相關軟、硬體知識,並從過程中持續學習與修正不足之處。

創意的發揮來得比單一所擁有熟練的技能甚或品質更有價值!!

那回歸軟體領域,如此為了維繫軟體程式碼的意義何在? 這可真不容易回答!

閱讀全文 »

軟體開發工具越是易用強大所以不需要作設計?

** 本文同步發表於 FB 社團-軟體設計鮮思維 **

昨日與一位業界的前輩喝咖啡聊聊 (兼談合作事宜),他是國內頗負盛名的 CMMI 輔導認證的顧問。

雖是相當資深且擔任多家知名大企業的顧問,但仍孜孜不倦,時程總是排滿,利用空檔時間至許多技術課程單位當學生,藉此了解下業界採用所謂的方法論/新技術...等。

他分享了兩件軼事:

  • 他至台大上 C#.NET 語言入門課程,有約40來位的學員上課。
    講師竟然跟他們說,現在系統開發根本不需要設計,只要會操作工具、拉一拉畫面,簡單的下幾個指令,就可以很快速的產出應用程式。
  • 他上某單位現在最夯的 SCRUM 開發流程課程,講師拿它與其它方法論比較,甚至還嚴重的批判,而其中更是包括了 CMMI (顯然誤解,它並非是流程方法論)。

    這位前輩很感慨甚至有些不悅,尤其是批判到他的專業領域-CMMI,明明就只是一種制定達成目標的框架而已,怎麼會是拿來與 SCRUM/Agile 等相提並論呢?

他認為講師應該是擺在以該課程的主題為中心來傳授相關知識與技能的,但怎麼能對自身並不了解的領域妄下斷論/批判,進而傳達非常不正確的觀念,這豈不是誤人子弟呢?!

哈,其實軟體業沒啥新鮮事,這些見聞也都早已習以為常了。尤其是隨著系統開發廠商提供的工具/機制越完善,雖然可以大幅減低開發的時間,但卻也造就了軟體人員的墮落,過度地依賴這些工具的使用,卻少有思考軟性較具本質性「虛」的那一面向

我與那位前輩稍微解釋下,針對第一點,講師只要稍微修正下講法即可。不是不做設計,而應該是說抱著「簡單設計 (simple design)」的態度 ,事後再佐以「重構 (refactoring)」來逐漸修正調整,快速的 I&I (iterative & incremental)以構成設計/實作一體的開發循環。

設計是必然會做的,但該講師顯然誤解所謂的「設計」是那種以往 (其實現在也很多單位是這樣做)要做仔細規劃、產出一堆文件卻不適用實作的 Waterfall 方式。

至於 CMMI 與 SCRUM/Agile/RUP 等方法論之間的關係,我在9年前就曾發表過「利用 UML 類別圖表達 CMMI Content 與範例說明」。

其實簡單的說,因為 CMMI 只是制定各等級所謂成熟度的目標框架,但它並沒有提供要如何 (How-to)達成 (achieve)的作法;如何達成正是這些方法論可以提供的,所以其實把 CMMI 視為 Interface,上述方法論視為是實現 (realize)該 Interface 的具體性類別 (concrete class);兩者可以形成很好的互補,並非是拿來比較、相互衝突的。

軟體思維顧問

專職軟體輔導與教育訓練的獨立顧問。輔導企業資訊單位如何有效組織系統開發與維護;輔導開發人員達成有效的專業分工。傳授如何把軟體作軟 (Keeping Software Soft)的技能,得以提昇系統的彈性/延展,並進而創造系統的再利用價值。

Personal