BSU 工作回憶錄

  • 314
  • 0

這是一段從 2011 至 2018 工作的內容。
其中充滿了苦與樂,十分值得我再三回憶,因此趁還記得時先寫下來。

2011 年

七月我進入 BSU 這家公司。那時高雄辦公室才剛開始沒多久,我是第二個正職員工,那時甚至連公司都尚未成立。這家公司希望打造物流行業中的必要系統,從「倉庫管理系統」 (WMS) 開始建置。

一開始的編制為:經理一位,核心員工二位,兼職人員兩位。第一份工作就是將已採購的電腦灌上 DB Server / Web Server / 版控 Server ,並帶著另一位核心員工一起做,同時也教該同事建置開發環境。

其它同事這時間都尚未正式到職,有當兵 / 唸研究所的。這段時間,由於在前公司和學長討論過 Http Data Center 的概念,試著用「 ASP.NET WebForm 泛型處理常式」拿來打造資料存取中介,並撰寫幾個 Server / Client 端的函式庫。猶記得這段過程,「映射」將我整得半死,無論是 JS / C# 的都是,但總算順利將其建立完成。最後的成品挺令人滿意。

底層建立完成後,公司導入了 DNN 這套內容管理系統,以它為底層來建立 WMS 模組,同時建立好隔離層,避免和它過度相依。選擇 DNN 的原因有二,一是我已熟悉、另一是它已是功能成熟、可調效的完整系統。

DNN 導入完成,其它同事們也幾乎都到職了,這段時間是一邊教學一邊打造東西。同事們到職後,發現彼此對網頁開發前後端的技能成熟度不一致,為彌平這個差距,被指派一個任務:「打造一個公司使用的套件系列,用它取代現有 Web Control ,得使用標準 JS 」,當時採用 jQueryUI 為底,整合了許多套件,並為其加入自己的套件物件 / 事件 / API 。這一系列套件包含有 GRID / EDITOR / 各式 PICKER ,但最後所有成員只使用 GRID ,也因此發展到後期自然成為最完整的套件。值得一提的是 jQueryUI Module Factory 是個良好底層工具,遵照規範就可以用物件導向觀念寫 Plugin ,包含事件及 API 等,也採用命令模式,是很棒的前端底層。

此間又用了一個多月,同事們已經把 Server 端熟悉了,和同事溝通完 MVC / ORM 概念後,我們開始正式寫 WMS 的主檔維護模組,包含有「公司主檔、產品主檔、倉庫主檔」等,一方面帶大家熟悉工具,一方面接收意見立刻改善。那時候我們採用自己談好的 MVC 標準,而不是 ASP.NET MVC ,架構是 Manager / Controller / View(WebAPI) / View(HTML UI) 。

商業模組開發得很順利,一下子就完成了,畢竟 ORM 很強,但所有人對 LINQ 以及所有欄位都得寫過濾 / 排序條件感到厭煩。又動手做一個 Server 端函式庫,幫助同事輕鬆取得任一欄位過濾 / 排序條件,也可以將條件輕鬆帶到 DB 。完成後,我們迎來第一個尾牙。

2012 年

開發任務由底層建設漸轉為商業邏輯開發,這是個平淡的一年,但對我個人反而困難。我對商業邏輯學習能力似乎較他人慢,所幸後來克服了。後來 WMS 的商業邏輯共用函式也開始由我打造。

這一年除了主檔維護功能,也將 WMS 流程功能做出來了,包含有出貨模組、庫存管理模組、收貨模組、盤點模組,此處無法將其一一列出,僅能提供模組概念名稱。

2013 年

本年開始做系統導入,兩則導入案中,一則失敗一則成功。而當時的 WMS 仍有許多錯誤和不成熟,導致上線後瘋狂加班修改,完全將說好的上版規則丟在一旁。現在想想,如果那時候有良好的測試經驗或許就不會如此了。

該年度我們也開始和「倉庫控制系統」 (WCS) 做整合,由 WMS 發出的命令交給 WCS 解析並控制 PLC 完成,再回報給 WMS 。這是標準的工業控制環境架構,但為了 WCS 大量改造我們的系統則不划算,因為當初 WMS 就希望可以支援人工倉庫版本及自動倉庫版本,如果為其大量改造會使系統失去彈性。

幾經討論,我們在介面上加入了依設定隱藏 / 顯示部份欄位的功能,並將任務發送和接收寫到另一個稱呼為「Message Center」(MC) 的專案中,一旦佈署時配置為手動版本,將不會發送任何任務給 WCS 。在艱苦環境下產生的產品,往往是個災難,尤其對背景知識不熟悉時, MC 後來問題重重,多次修改後才將其穩定下來。幾年後,它成為我們系統中的外部系統交換中心。

為了和 WCS 做資料交換,我們公司吃下 TCPIP 這個難啃的玩意,接受了硬體商所提供的 TCPIP 規格,也因如此我瞭解怎麼撰寫 TCPIP 及資料交換規格,當然這也是後話了。

同年前期,公司大量重構了 WMS ,主要是將四處使用的程式抽成共用函式庫,並訂下派工 / 儲位 / 機械運作規則。同年後期,公司也考慮做自己的 WCS ,並指派一位同事去試。

2014 年

我被指派去穩定 WCS 和 PLC 之間的通訊,由於原本的通訊每一個任務都發通訊,檢查完成也發通訊,導致網路通訊過度頻繁,甚至由命令編號發現後令壓前令的狀況發生。為穩定之,我嘗試在架構中增加「設備命令通訊池」,只要發命令給 PLC 都只允許丟到池子中,由該池子的通訊機制發送命令給 PLC 。有趣的事情是,我沒有足夠的 PLC ,所以為了測試,又寫了 PLC 模擬器來搞定它。記得當時雙十連假,我就被吃光假期了,哈哈。

首次到倉庫現場看也發生在本年度,我飛到四川成都瞭解倉庫狀況。當時接受了顧客抱怨,也做簡易教育訓練,當然在事前不曉得要做什麼事的情況下,我做的遠超過這些。印象中最驚訝的是現場竟然不守工安到這程度,機械運作時如果沒有將程式規則寫好,一定會發生人命。

此時負責維護的同事也準備離職了,我接手系統維護 (燒肝) ,我們的現場是二十四小時不停機作業的,我也跟著二十四小時工作,只要 SKYPE 叫我就得醒。這真的很痛苦,又要改程式又要兼應急處理又得系統更版。這時間維持了一年半,之後我身體崩掉一次。

2015 年

WMS 被要求和 SAP 做 EDI,將一些單據資料從 SAP 匯出至 WMS 系統中以執行,對方要求使用 SAP PI 這個服務。此間經過一些跨部會討論才總算將格式定下,個人覺得最痛苦的不是寫程式,而是對方公司遲遲無法定義每項欄位以及一再變動,但總算渡過了。

本年度我在公司開始宣傳嚴格測試的觀念,避免維護人員 (也就是我) 半夜被連續叫醒。最後在 2016 年我做了一份很驚人的測試路徑表,它細到執行很痛苦,也幾乎無法修改。這個測試法也在 2017 年被廢棄,只針對特定關鍵情況做測試就好了。

本年也將 WCS 做大量重構,以及將每個獨立命令套用命令鏈模式,改為步進式的細小命令。最重要的是加入人機協作觀念,將人也化為系統一部份。

2016 年

我接手了一個完整的孤兒系統,因為當初上線後,它就被開分支了。和現有版本由於落差過大難以整併,花了不少時間才整回來,其中包含 WMS / MC / WCS 都是,所幸差異最多的只有 WMS 。

該年我飛到浙江導入系統,該客戶是藥業,本以為要求很多,結果根本是好客戶。除了不抱怨,還願意接受修改的緩慢,至今十分感謝客戶的體諒。這個案子中除了導入 / 安裝 / 教育訓練外,我做了件不太軟體人員的事「到現場調整設備網路爛掉的問題」,記得除了無線網路訊號,還查了分享器橋接設定、實體線路、電壓。那時候整天爬梯子到高處調整,再回到平地測試,一再重覆後,和對方網管一同花了一週多才搞定。

為了浙江的客戶,嘗試將 WCS / MC 的系統資訊整合 WMS 呈現,讓操作人員可以在相同畫面就操作系統,使其更具連貫性。採取的方式是我在 WCS / MC 加入 HTTP 服務能力,並透過 iFrame 將資料嵌到 WMS 上。

2017 年

我們幾個工程師在討論後,決定導入自動測試 / 自動整合,我負責導入自動測試,當時研習了一些工具 PostMAN / SOAPUI / JMeter / Mocha / PhotomJS ,最後選取 PostMAN ,並將技術轉移給其它同事。

整合測試找了 PostMAN ,後來我也嘗試找單元測試,未有結果就被職務調動,全職改當 RA / SA / SD 了。

系統分析師就如同大家所知道的,從確認需求、設計資料庫、設計系統等。我固定會產出的文件包含功能描述 / 商業邏輯描述 / 功能架構 / ERD / SCHEMA / 流程圖 / 類別圖 / 循序圖。這工作進行到 2018 年,我完全崩掉為止。這次設計工作中,學到了不少事情,而且許多和專業無關。

這也是充滿了挫敗的一年,設計工作的難度遠高於我直接把系統做出來,中間我和成員吵過不少次架,每次文件龐大到我覺得做不出來時,大家就會感受到我的焦慮,最後彼此都很難好好溝通。

2018 年

設計工作到一段落後,短暫地回到開發工作。然後我就飛去加拿大和美國玩了十八天。然後回國後過沒幾天就開始寫這份了。  QQ