上一篇寫了開發的成本,這篇來寫維護的成本

維護指的是當程式完成並釋出給使用者一次後,接下來什麼事都不做,還是會必需付出的成本。下面列出幾個跟 RD 會直接遇到的項目。

修正臭蟲

當開發新功能時沒有想清楚或沒有足夠的測試去覆蓋新加的程式碼,Bug 就非常可能在 RD 認為已經開發完畢並送交給測試人員後才被找出來。如果沒有被找出來,怎會在更後期被使用者找出來。這些 Bug 會在 RD 不預期的時間點被發現、回報且可能需要立即被修正。(中斷!!)

另一種 bug 就是在遺留程式碼內的 bug (遺留 bug?),可能是已知但一直沒有時間修,或是前人寫的最近才被發現,讓你覺得有點難過。這類型的 bug 也會在不預期的時間點被提起,或是反覆的被提起讓 RD 需要去回憶一下,但總是無力修正。

解決方法:當有新功能 …

當產品功能增加的時後,產品的複雜度就會增加。而複雜度增加就會增加維護成本,當每人均攤的成本 (複雜度 / 開發者數量) 過高時,就會遇到人類的腦袋 stack 不足的問題,進而導致開發速度下降或是容易出錯。

Stack 不足指的是超過記憶力或理解力的上限,例如忘記或沒看過負責的某個 function、不知道他功能或是介面約束。

也因為這樣,一般來說當產品變得複雜時,開發人員也會跟著增加來維持均攤成本來確保開發速度跟品質。但如果不這麼做,其他方案就需要考慮進行,例如:

  • 減少產品功能。當新的功能加入時,適時淘汰舊功能
  • 調整架構提升抽象化。將實作轉為概念,降低理解難度
  • 完善的測試覆蓋。stack 依然會爆炸,但爆炸後會被發現
  • 提升人員能力。增加腦內 stack 容量
  • 讓產品進入維運模式。不要動他比較安全

其他的方案持續探索中。

BTW…當執行上面的方案後,省下來的成本就可以再抽走開發人員去做別的事情了,這就是效率的極致。

今天因為 VM 裡面行為怪怪的決定來升級一下 ESXi host。

升級指令通常滿簡單的,打開防火牆,撈一下有哪些可以升級

esxcli network firewall ruleset set -e true -r httpClient
esxcli software sources profile list -d https://hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xml | grep -i ESXi-6.7

ESXi-6.7.0–20190401001s-standard VMware, Inc. PartnerSupported 2019–11–25T11:42:42 2019–11–25T11:42:42
ESXi-6.7.0–20190801001s-standard VMware, Inc. PartnerSupported 2019–11–25T11:42:42 2019–11–25T11:42:42
ESXi-6.7.0–20181004001-no-tools VMware, Inc. PartnerSupported 2019–11–25T11:42:42 2019–11–25T11:42:42
ESXi-6.7.0–20181002001-standard VMware, Inc. PartnerSupported 2019–11–25T11:42:42 2019–11–25T11:42:42
....

選好後下指令開始升級

esxcli software profile update -p ESXi-6.7.0–20191204001-standard -d https://hostupdate.vmware.com/software/VUM/PRODUCT
ION/main/vmw-depot-index.xml

不過這次先遇到很奇怪的錯誤.. 但硬碟看起來都還有空間

[InstallationError]
[Errno 28] No space left on device
vibs = VMware_bootbank_esx-base_6.7.0–3.89.15160138
Please refer to the log file for more details.

接著想說先把這個暫存檔刪掉

rm /tmp/vibdownload/VMware_bootbank_esx-base_6.7.0–3.89.15160138.vib

換安裝另一個版本看看

esxcli software profile update -p ESXi-6.7.0–8169922-standard -d https:
//hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xml

結果遇到另外一個錯誤 XD

[InstallationError]
Failed to create ramdisk vibdownload

最後發現.. 把虛擬機都關掉就可以正常運作啦。

esxcli software profile update -p ESXi-6.7.0–8169922-standard -d https:
//hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xml

Update Result
Message: The update completed successfully, but the system needs to be rebooted for the changes to be effective.
Reboot Required: true
VIBs Installed: VMW_bootbank_ata-libata-92_3.00.9.2–16vmw.670.0.0.8169922, VMW_bootbank_ata-pata-amd_0.3.10–3vmw.670.0.0.8169922, VMW_bootbank_ata-pata-atiixp_0.4.6–4vmw.670.0.0.8169922, VMW_bootbank_ata-pata-cmd64x_0.2.5–3vmw.670.0.0.8169922, VMW_bootbank_ata-pata-hpt3x2n_0.3.4–….

有遇到的人可以嘗試一下看看。

鼠年行大運!

記錄一個在工作上遇到的問題。

在 Windows 的 MinGW 裡面編譯 Sqlite3 的時候遇到了以下錯誤:

shell.c:2685:1: error: operator ‘||’ has no right operand

跑去看 code 發現是 define 原本不該斷行卻被斷行了 (下圖是模擬的,因為之後已經修好了 XDrz)

Image for post
Image for post

糾結了很久很久,最後發現是 CRLF 換行的問題。原來 Sqlite3 從官網下載的 source code 是使用 LF 換行,但因為我們把 code 放在 git 上面,在 checkout 的時候被自動轉換成 Windows style 的換行,也就是 CRLF,導致 Sqlite3 的 build script (autoconf) 不預期的轉出錯誤的檔案。

知道問題來源後,解決有問題的人就比較簡單了 (?),git 可以設定 commit/checkout 的時候是否要自動轉換 LF、CRLF ,下以下指令就可以囉。

git config --global core.autocrlf false

若想要對這個設定的行為更了解,請參考 git manual 或後面的 reference 文章囉。

Reference

這是一本在中山地下街的誠品展示區看到的新書。封面上斗大的「孤獨力」三個字,下面寫著「學會一個人的孤獨,才能看懂世界的熱鬧」,恩,好像很有趣。

原來,這是一本承億文呂集團前品牌長,現任北京奧運倫達集團經營管理處總監 (好長) 張力中先生自己寫的職崖自傳吧。從跳級上研究所到進入職場,走過業務、行銷、公關、品牌等不同職位,遇過不同老闆,最後被挖腳到北京工作的數十年經驗。

至於孤獨力嘛,我覺得是種態度和生活方式。對作者來說孤獨力代表著

  • 不從眾,獨立思考
  • 職場不是依存關係,而是並肩,一邊公司成長、一邊自己成長
  • 不是所有公司或管理者都能照顧好員工和理解長才,沒被理解也不要在意,反而要替他們著想
  • 在職場上的尊嚴,只是自縛的枷鎖,適時的降低一點標準,更能從本質面理解事務
  • 職場中的大小事,遇到了就面對他,跳過恐懼和害怕, …

最近想要研究一下 DRBD (Distributed Replicated Block Device) 所以買了本書來看,沒想到踩到雷了.. 就是這本 "最新 DRBD 權威指南 — Base on Corosync+Heartbeat 技術建構 RAID"

出書年份是 2017 年,邊看邊覺得它的環境怎麼這麼舊,原來是本從簡中翻過來的翻譯書,原書出書時間是 2013 年... 內容細節也少了些,可惜可惜。

抱怨完還是留點知識點

  • DRBD (Distributed Replicated Block Device),一個 Linux 上可以將對 block device 做的操作,透過網路同步或非同步的抄寫到另外一台機器上的 block device。基本上也跟書名一樣,就是可以做出跨網路的 RAI …

寫 C/C++多執行緒程式的血與淚: 四個要避免的錯誤

良久沒有血文章了 XD… 趁著週末來記錄一下這年用 C/C++ 寫 multi-thread 時該注意、避免的事情。

前人已經寫過一些比較常見的了,可以參考 Top 20 C++ multithreading mistakes and how to avoid them,這邊就寫刁鑽一點的囉。

  • 錯誤1: 在 multi-thread 環境下 fork 做事情
  • 錯誤2: 使用 pthread_canncel 去停止 thread
  • 錯誤3: 使用 detach 讓 thread 自生自滅
  • 錯誤4: 多個 thread 同時操作同一個 shared_ptr

錯誤1: 在 multi-thread 環境下 fork 做事情

在 Linux 的世界裡 fork() 用來產生新的 process,可以用於產生 daemon …

發現大家比較喜歡看疑難雜症嗎..

我們用 Gitlab 的 pipeline 來串 CI,在每次發 MR 或 push 新 commit 上去的時候都會觸發 test build 來檢查新的修正是否正確。不過一直有個困擾的問題是,我們的自動進版 commit,也會觸發 test build,造成時間上的浪費。

搜尋一下後發現原來 Gitlab runner 的說明裡就有寫啦 ,只需要在 commit message 中帶上 [ci skip] 或 [skip ci],這個 commit 就不會觸發 pipeline。

Skipping jobs

If your commit message contains [ci skip] or [skip ci], using any capitaliza …

;TLDR 最近忙碌到快要死掉啦,趁著連假修 bug 來記錄個小知識吧

Makefile 的變數一向相當讓人難以捉摸,常常搞不清楚他的值是多少。其實大家可以直接看 manual,寫的還滿詳細的 XD

Recursive variables

假設 makefile 這樣寫,最後的輸出會是 Goodbye! 。原因是使用等號建立的變數叫做 recursive variables,是在被解析的時候才真的去取值,所以在 MYVAR 被使用時,因為 ABC 的值已經被改過了,他也就取到了新的值。

ABC = Hello!
MYVAR = $(ABC)
all:
@echo $(MYVAR)

ABC = Goodbye!

Simple Variables

這次就不一樣了,最後輸出結果是 Hello!。原因是使用 ":=" 建立的變數稱做 simple variables, …

今年超級無敵忙好久沒有寫文章了,今天來科普個小知識。

Linux 上有兩個指令可以用來看硬碟容量剩下多少空間,分別叫 df 和 du。

  • df : 從檔案系統 (file system) 獲取目前的空間分配資訊,可以完整的顯示目前檔案系統上還可以使用的檔案空間。
  • du: 透過掃描目錄結構,並透過 stat 逐一累加檔案大小。

在不嚴謹的考慮下,這兩個的輸出基本上會是一樣的,但由於 du 指令的掃描特性,可能會漏算以下檔案大小。

  • 檔案的 metadata 所佔的空間
  • 維護檔案系統本身結構所佔的空間
  • 某個子路徑被 mount 上另一個檔案系統
  • 被刪除掉但仍有程式開著 fd 的檔案空間

第三種狀況會是比較多人遇到的狀況,IT 人員想要找到到底是什麼檔案佔據硬碟空間,卻無法透過 du 順利找到。解決的方法即是透過 ls …

About

Jack Yu

販賣理想世界的夢想

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store