Blog

軟體技術人員最愛卻也是尾大不掉的萬用 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;不僅如此,內部程式碼的擁腫肥大,當時的技術人員一離開,幾乎達到無法維護的地步。

閱讀全文 »

[簡單開箱] 2018 年終購入的 MSI AERO GTX-1060 6G 顯卡

前兩個月把使用了一年多的 GTX-970 顯卡給二手 3千多元售出,原因是我的 PSU 電供瓦數不足,沒幾天就必然當機,不勝其擾。

賣掉後先暫用老舊的 AMD 6850 替代,當然就無法玩一些吃畫面的電玩大作,如 GTA V、Skyrim SE、巫師3等。不過我還是用這片老卡把 Hollow Knight 給全破關,這可是我這幾年玩過最充實的類惡魔城的上乘遊戲之作,操控非常吃技巧的。 :)

還有,我都會用 Go Review Partner 使用 Leela Zero AI 圍棋引擎覆盤,中階以上的顯卡肯定是必要的,否則運算 (會使用顯卡的 GPU) 可會耗上大量時間的。

當然用老舊顯卡還是不行,一堆遊戲都無法玩 (雖然現在玩遊戲時間少多了,但...)。又因為我現在這組電腦已經超過五年了,PSU 等實在不想再換,所以也只能買較低功耗的顯卡。GTX-1060 6G 的顯卡,對我這台老電腦還蠻搭,不過我也不想買全新,現在價格仍頗高 (大概落在八千多元)。

前幾天就在 PTT Hardware 版上看到有人賣二手 MSI AERO GTX-1060 6G 顯卡,今年二月購入、有電子發票、完整盒裝、未註冊、四年保。雖然賣價 NT$5,000,約比同級顯卡貴 500元,但其它要件都很棒,所以還是聯絡賣家請之店到店寄來 (還不錯,至少減掉運費)。

昨天收到,盒子還非常新。
MSI Aero 1060 6G 顯卡

AERO 系列是短卡,正符合我的需求,因為電腦主機板的插槽保護插銷全斷掉,太長的顯卡可能會接觸不良。顯卡風扇沒有灰塵,看來賣家真的很少使用。
MSI Aero 1060 6G 顯卡

閱讀全文 »

C# 實作共用變數 by Singleton – 以交易系統登入連線為例

問題

股票期貨交易系統的登入驗證連線,必須隨時保持連線狀態 (connection state),也就是必須設計為 Stateful (有狀態),並於盤中需隨時得知連線情形,若斷線則系統應該要能通知用戶做重新登入的動作。

如果有多個表單 (View) /多個類別需在執行期間 (run-time)可以察知共享登入的連線狀態,該如何實現?

解決方案

共用變數類別

最簡單直覺的方法,設計一個共用變數 (global variables)類別,並保存需要在多個應用程式/類別之間共享的狀態/值。

可以參考此篇的作法:Global variables class

閱讀全文 »

[美食推薦] 吃了會讓人感動的台北溫州街家常菜小店-生囍食堂

前兩個月我與蓁妮常到位於師大附近的「欒樹下書房」上網做事待一整個白天 (那裡真是個舒適悠閒的好地方)。有時中午過去想在附近用餐,但我那挑嘴的女兒曾經我陪她走了快半個小時全沒找到她滿意的餐館,讓我有夠氣噗噗的。

不過有次從泰順街轉位於「殷海光故居」的巷口時看到這好小一間「生囍食堂」,好奇之餘入內一看,黑板上的菜單竟讓我家蓁妮可以接受,所以就來嘗看味道如何。
20180906_132548

菜單很簡單,就是只有「豬、雞、魚」三種套餐,然後會隨她們早上到市場採購的食材來決定當天的主餐菜色,相當特別。
20180906_132530

20180906_125747

也有不含主餐的菜飯,老實說,胃口不大的光點這菜飯就足夠了,三菜一湯超級豐富,況且白飯或十穀飯可以吃到飽,真是佛心來著。
20181026_123351

第一次我與蓁妮各點了一份豬滷肉與黃魚套餐,天哪~餐點送過來時我嚇了一跳,這也太過豐盛了吧,竟然連湯都是附上香菇雞湯 (每次的湯會不一樣,但肯定都有主食在其內)。
20180906_125703

這樣一份如此豐盛的套餐,豬與雞一律是 NT$220,魚大約是 NT$290,實在也太過超值超值了。
20181012_130451

這次我家蓁妮超乎平時的挑嘴說,邊吃邊直說好吃好吃。飯後她說,以後她肯定要一週至少來一次的,這樣的餐館一定要支持不能讓它關閉的。 :)

蓁妮還特別到粉絲團留言讚道:
「很簡單,也很不簡單的家常料理,上次造訪時點了豬和魚套餐,配菜豐富(香菇雞湯、茄子夾地瓜、杏苞姑、炒地瓜葉),還有一碗十穀紫米飯搭上清爽的綠茶。第一次親身感受到食物真的有治癒人心的力量。」

20181026_122219

我已經太多年沒有在外面的餐館可以吃到如此讓人感動莫名豐盛的家常菜了,確實會讓人頓時充滿了幸福感與感恩的心情。
20180906_125810

不過這店的空間實在太小,裡面才幾張餐桌,所以過去前務必要先電話訂位才可。
20181026_122223

飯後我與蓁妮就會走到斜對面的「殷海光故居」散散步消化下,院宅內可真是鬧中取靜,又可以了解翻閱下「殷海光」的生平故蹟,引懷思念。
20180906_132741

20180906_132732

「軟體需求分析與塑模」- 跨多個作業流程的塑模

本文收錄於 我的電子書「軟體需求分析與塑模 – 第二章、企業流程的分析與塑模」。

每一個作業流程,有各自不同特定的企業目的 (specific business goal)。例如:

  • 訂貨流程的特的目的為讓交易有效率且安全可靠。
  • 出貨流程的特的目的為及早可將貨品交付到客戶手中。
  • 採購流程的特的目的為從供應商取得低成本、高品質的商品。

企業經營者/高階管理者、系統相關的利益關係人 (stakeholder)、乃至於系統開發團隊,希能透過這些作業流程看到較巨觀 (macro view)、更具整體的全貌 (Whole View),如此可得以有效地作整體性的架構規劃與設計。

跨多個作業流程,就是流程範圍更為廣泛,參與的人更多,所涵蓋的時間更長。而且往往因為現實上基於功能執掌,還是不同部門或不同地點就有不同的作業規範與範疇,但彼此這些作業之間仍需要連串在一起。

由Erickson以及Penker所提出的一個活動圖的擴充型態(stereotype),稱之為「Erikson-Penker 企業擴充模型」(Erikson-Penker Business Extension)。(《Business Modeling with UML: Business Patterns at Work》, Manus Penker & Hans-Erik Erikson, 2000, p.57),該設計圖形最適切用來描述跨多個作業流程之間的關聯與各自的企業目的。

這個圖形中,主要是將與作業流程相關的重要人、事、物以及這個流程所要達成的目標做一個連結;不過有關企業流程的內部細節,通常在這張圖中不會有過多的介紹,以免失焦 (內部的活動細節會由 uml 活動圖表達)。

Erikson-Penker企業擴充模型簡介

下圖即對 Erikson-Penker (底下簡稱火箭圖) 的企業擴充模型的重要元素作說明。

圖、Erikson-Penker 企業擴充模型的主要圖形元素

 

閱讀全文 »

[備註] Visual Studio 2017 跑 x64 單元測試的設定

最近申請到「群益報價/下單 API」,也下載了 C#.NET 的範本,但卻是用 Visual Studio 2010 編譯的專案,花了一個多小時手動編輯 .csproj,總算可以在 Visual Studio 2017 開啟執行

不過範本寫得非常之亂,典型的全把所有邏輯寫在 Windows Form 類別。實在看不下去,準備把一些主要呼叫的 API (Login,下單,報價) 重整下,從 Windows Form 全抽離出來,並撰寫單元測試 (unit test) 方便測試。

群益API 是採以 COM 相對底層機制所撰寫的,使用前要先註冊該元件 (SKCOMLib)。我直接採用 x64 64位元的處理器架構,完全不考慮 32位元,還好群益都有提供。

程式撰寫挺簡單,但執行單元測試卻出了問題,只要將「目標平台 (target platform)」改為「x64」就會出現一些很怪的錯誤訊息。原來以為是呼叫 COM 出了問題,甚至打電話問了群益的資訊部人員,但他們竟然說沒聽過單元測試,程式沒有從 Form 開始就看不懂。挖哩,不過他們確信 COM 元件沒有問題,看來還是出在環境設定上。

查找解決文與 Try-Error 大半個下午,總算,就是只要在 Visual Studio 2017 選單「測試」→「測試設定」→「預設處理器架構」改為「X64」就 OK 啦!

Visual Studio 2017 跑 x64 單元測試的設定
軟體思維顧問

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

Personal