2017/06/02

[文章分享] - Brian’s 10 Rules for how to write cross-platform code


跨平台 (cross platform) 有時候好像是一種程式設計師的浪漫
大家都同意要開發跨平台的程式一定會需要額外的工夫
但是到底會需要多少呢?

http://blog.backblaze.com/2008/12/15/10-rules-for-how-to-write-cross-platform-code/
這是一篇有趣的文章,發表於 2008/12/15
文章作者是一個線上備份服務 (BackBlaze) 的 CTO
他說他有 20 年 C/C++ 跨平台軟體開發的經驗
他列出了十條開發跨平台軟體的守則
他們開發了 Windows/Macintosh 的桌面程式,跑服務的 data center 則是 Linux

他開門見山說他評估後,為了跨三種平台的開發,大約需要多花 5% 的開發時間
接著,在各平台上使用最常用的編譯器或 IDE 是開發跨平台程式很重要的一點
(Windows: MS Visual Studio,Mac: Xcode,Linux: GCC)

為什麼要跨平台?
作者提到他們選擇的原因是因為「錢」的考量
伺服器使用 Linux 就不用作業系統的授權成本
90% 以上的桌上型是跑 Windows,其他的則是 Mac
(這是 2008 年的文章,不過現在好像也是如此 [參考])

理由之二,實作跨平台程式會提升整體的 code quality

WHY?
作者說,不同平台上的編譯器會有不同的警告訊息
這些訊息往往代表這段在 A 平台沒問題的程式碼
在 B 平台上可能會導致錯誤
找 bug 的時候也有幫助
有時在 Windows 上不易找到的問題,會很容易地在 Mac 上出現它的 root cause
不同平台也有不同工具可以使用
這邊舉的例子是尋找效能瓶頸時
Linux 可以透過簡單的開啟 compiler flag,就使用 gprof 來幫忙分析
但 Windows 與 Mac 上就沒有類似功能

這點很有趣,我從來沒有嘗試從這個角度去想
不過我也沒有真正開發過像樣的跨平台程式
所以一時間很難完全相信這是真的

[圖片來源 : www.backblaze.com]


接著我簡單摘錄十項守則的重點

Rule #1: Simultaneously develop – don’t “port” it later, and DO NOT OUTSOURCE the effort!

不要想說我先在某平台開發,完成之後我再 port 到其他平台就好
這裡指的同時 (Simultaneously) 開發,是說從設計開始就要考慮所有平台
實作時,開發者可以選一個自己熟悉或喜歡的平台開始
作完後測試完成後,馬上再到其他平台 check out、build、test

有很多理由不能「一年後再 port」
最重要的一點是如果一開始不考慮所有平台
程式設計師可能會忽略一些其他平台沒有的事情
e.g. 使用 Windows registry 來達成的功能

RD 解 bug 或是 QA 的測試,若是一年後再到另個平台上重作一遍
將真的會花跟原本一模一樣的時程
跨平台開發則會在當下,在 RD 最熟悉該功能重點的當下,就處理完那些 bug 或是設計缺失

Rule #2: Factor out the GUI into non-reusable code – then develop a cross-platform library for the underlying logic

這點是說 GUI 程式在犧牲 user experience 與 reuse 之間
寧願放棄 reuse 也不要犧牲了 user experience
意思就是說你的 GUI 不一定要一模一樣,要考慮的是不同平台使用者的習慣
e.g. Windows 的 menu bar 設計放在視窗的 title bar下,Mac 卻是統一放在桌面最上方 ([參考])

BUT!底層與 GUI 無關的邏輯部分一定是要跨平台的!

Rule #3: Use standard ‘C’ types, not platform specific types

因為要跨平台麻,所以不要用平台相依的型別 (e.g. DWORD,建議直接使用 unsigned long)

Rule #4: Use only built in #ifdef compiler flags, do not invent your own

這點是說,一定會有 code 要用 #ifdef 去區分不同平台的 code
用 build-in 的 pre-processor 就好,不要自己發明

為什麼?因為這樣你在不同平台 build code 時就不用在那邊下自己的 compiler flag 了
code 會自己 build 成該平台應該有的樣子

Rule #5: Develop a simple set of re-useable, cross-platform “base” libraries to hide per-platform code

建立這些 libraries 會花你一些些時間,但是作者說,「相信我,你之後會發現這是值得的。」

Rule #6: Use Unicode (specifically UTF-8) for all APIs

Unicode is a must. 我想就不多說了
這裡提到的重點是,你應該選用 UTF-8
所以在 Windows 上怎麼辦?寫個 utility function ConvertUtf8toUtf16() 去轉就對了

Rule #7: Don’t use 3rd party “Application Frameworks” or “Runtime Environments”

這邊是說如果你用一個 library 並不是因為它的功能
而是因為可以跨平台
作者的建議是不要用這樣的 framework or library

Rule #8: Build the raw source directly on all platforms -> Do not use a “Script” to transmogrify it to compile

應該要可以直接在各平台 build source code,而不是需要透過一些 script 的轉換才能在其他平台 build code
OpenSSL 中槍 XD

Rule #9: Require all programmers to compile on all platforms

所有的程式設計師都要會在所有平台 compile codes
作者說只要花十分鐘就可以教會 entry-level programmer 如何在各平台上 checkout 與 build
重點是要先建立好不錯的 build code SOP

Rule #10: Fire the lazy, incompetent, or bad-attitude programmers who can’t follow these rules

每個程式設計師應該都有責任而且有必要讓版控系統上的 code 是永遠跨平台的
偶爾的疏忽大家都能接受,但是日復一日的一直弄壞程式碼
而且總是同樣的問題。It's time to fire that programmer.
當組織宣達說我們的目標是要跨平台時,無視上述規則並犯錯的人就是不專業人士

沒有留言:

張貼留言