最近假日都在玩 Arduino/ESP,重拾小時候的電子夢

開發工具換成 VSCode + PlatformIO,更貼近日常慣用的專業開發環境,理論上要更順手,但寫來卻很有很重的阻礙感,不時陷入這樣寫怪怪旳,那樣寫好像不太好的左右為難。對 C++ 語言不熟當然是原因,但以前用 Arduino IDE 一樣寫 C 也沒這麼卡啊?何以工具變強,開發速度卻變慢了。

經過一番思索,我找到原因:

這是跨界開發老鳥的魔咒 - 想很多,能力卻沒跟上

初學程式的年代,照著範例抄抄改改,程式會動就開心到從椅子上跳起來。

資料安全?執行效能?是不是方便擴充維護?如何重複利用?初學者腦袋裡沒這些東西。

以前用 Arduino IDE 寫程式,接觸到的範例都是從頭到尾一個 .ino,把全部的程式碼塞進去就對了,所有變數宣告成全域變數,硬體會動就算成功。Arduino IDE 背後也是 C++,但它把專案參照、編譯細節等複雜性封裝得很好,深怕嚇壞只想玩玩 Arduino 的開發素人。而它做得頗成功,我照著教學下載安裝程式庫,#include 某個神祕的 .h,複製範例貼上改一改,東西就做出來了,渾然不知背後 C++ 的種種細節。

PlatformIO 不一樣,它把你當成專業開發者,專案結構完全攤開來,參照了哪些程式庫,標頭檔、原始碼在哪裡一清二楚。因為好奇或為了排除問題(像是踩到雷,買到有問題的開發板),我開始查看及修改程式庫原始碼,這才慢慢搞懂 .h、.cpp 是怎麼運作的,從高手寫的程式庫裡學到用 #define #if 跨開發板的技巧,見識如何用類別、Namespace 避免全域變數大鍋炒,讓程式碼更貼近良好設計實務。

以前不懂這些也不知可以這麼做,所有程式碼一股腦兒往 .ino 塞。在知道其實它也可以像 .NET 專案實現物件化、模組化概念後,我開始思考該怎麼把液晶顯示器、OLED 螢幕、LED 矩陣顯示器等常用元件的常用程式拆分成一個個 .h + .cpp,引用時寫最少的程式碼達成目的,不想再回到「連接週邊 = 複製幾百行程式再改一改」的開發模式。若要如此,該用 Namespace 嗎?要不要包成類別?有必要做成從 Github 下載的程式庫嗎?

這些都是我平日寫專案會設想的,起步階段花點功夫做好,後期才能倒吃甘蔗,用最省力的方式開發維護。

於是乎,像我這種開發老鳥,在跨進新領域時(也不限於 Arduino,接觸任何新語言新平台都會),開發技能明明還在死菜鳥等級,才寫完 Hello World,腦中卻開始浮出大小進階議題,質疑現在的規劃不完善,將來會有問題;想提升又卡在缺少知識或經驗,只知問題卻不知如何改善。

遇到這種狀況,當然就是四處爬文找資料,但進階議題文章需一定基礎才能消化吸收。要解決這道障礙的正統途徑是停下進度,回頭蹲馬步練基本功。但這得等兩個月?半年?拎杯好想現在看到東西動起來啊~ 程式先隨便寫,先能跑在說?不行啊,平日總追求程式簡潔、即插即用、易懂好維護,此刻要我 Copy & Paste、攪義大利麵,將標準下修到程式能跑就好?不行,這太沒節操了我辦不到。

而在寫網路功能時我還有一關心魔過不了 - 我看到幾乎所有 Arduino 範例都把 WiFi 基地台的 SSID 跟密碼寫死在程式裡。每看一次我都要呼喊一次:花惹發?把安全相關設定用明碼寫進程式?這樣安全嗎?不怕不小心上傳到 Github?每次改密碼要改程式重 Build 不累嗎? (雖然 WiFi 基地台有地理限制密碼外流風險較低,但在我心中用明碼寫死密碼就違背信仰啊!)

以前不擔心是因為無知,問題一直都在。一旦知道了,它們便縈繞心頭甩也甩不開,硬要假裝不存在得眛著良心。

於是,為了好玩寫點小程式,我卻滿滿的內心戲,陷入無止境天人交戰,搞到心很累。

我把這種現象定義成開發老鳥跨界時的專屬魔咒 - 想很多,能力卻跟不上;不願意用自己鄙視的寫法,卻又生不出讓自己滿意的架構,怎麼看怎麼不順眼,怎麼想怎麼不安心,卡在原地躊躇不前。這是杞人憂天?不,每條考量都有道理,且在原本熟悉的開發領域早已驗證,已是牢不可破的信條,但在新領域受限於技能知識短缺,只知這樣是錯的,卻不知如何把事情做對,留下滿滿的無力感。像是老靈魂被裝進小孩子的身體,化身憂國憂民的小學生,滿心悲憤又一籌莫展,連自己都覺得好笑。

愈想愈覺得這是個哲學問題,解答可能介於"面對它、接受它、放下它"、"心急吃不了熱稀飯,基本功就是得練"之間。

此刻我也還沒答案,但應該會以"就算寫自己不熟的程式,有些底線還是要守"為原則吧! 像是:把密碼寫死在程式裡、Copy & Paste 數百行「重用程式碼」,都是我無法容忍的天條,只能逼著自己別急著做出東西,適時停下來,把基本功練紮實些再繼續。

換個角度想想,Side-Project 是做好玩的,何來時程壓力?有什麼不能等,既然不允許自己寫爛程式,那就好好打基礎,琢磨到自己能接受的水準,別老心急想馬上看到結果,也是種修身養性啦,呵。

Some thoughts about the curse when senior developers getting into new language or platform.


Comments

# by 路人

只能 respect 了

# by 小熊子

有時間寫side project是種幸福

# by dennismusk

完全寫出我的心聲.......多謝

Post a comment