當 ESP32 新手遇上閉環開發流程
儘管有 ESP32 這樣的 IoT 裝置開發經驗,但都是個人的私下娛樂休閒的小專案。在工作上以它的開發為主的經歷是沒有的。最近剛好又有個新的專案需要用到,在「這個年代」有了不同的開發方式了,特別是可以添一點 AI 味上去。
在前一陣子寫了一篇關於「閉環」流程的概念,它也很適合用在 ESP32 或 Arduino 相關的開發:

我們用 AI 助手管理整個開發流程,此圖以 claude code 作為案例,理論上你可以用你喜歡的那一個。隨著 esp-idf 發展越來越完整,它可以用指令模式完成所有的開發工作。
所以閉環的路徑會是:
- AI 助手啟動驗證流程,確定現在「狀態」是好的
- 開始依時做目標進行變更內容(可以是程式碼或變更參數的設定)
- 再次驗證「狀態」是好的
- 如果你有額外的 Review 程序可以接在這裡,如果有變更應該再一次驗證狀態
- 在穩定的狀態下 commit 之後回到第一步(繼續小步快跑)
該怎麼開始呢?
應用閉環的概念很容易,但你要確保給予 AI 助手足夠的情境資訊。例如我們的第一步是驗證狀態的流程。那他有幾個很簡單的檢查方法,特別是對於 ESP32 來說,我們可以分別在兩個關鍵點的前後做驗證:第一個關鍵點是「編譯期」,第二個關鍵點是執行期。
編譯期理解,他就如同大多數需要編譯的程式語言一樣可以透過編譯器去檢查多數的靜態問題。但是邊編譯期到執行期中間還多了一個可以驗證的步驟,那就是韌體的燒錄與上傳。不過這個步驟通常你的 AI 助手看到有問題就會主動去解決,舉例來說,編譯出來的韌體太大無法燒錄,那你就會看到 Error Message 出現。當然在這個時候我們已經不會自己去看他了,都是你的 AI 助手在看訊息。真正到了執行期之後,才是可以簡單地跑起來,並且沒有預期之外的 Error Message 那就是一個好的狀態。
以我們今天的 esp-idf 開發工具來說他就是這樣簡單的句子而已:
script -F log.txt idf.py -p /dev/cu.usbmodem1101 flash monitor
這是一連串的動作,但主要是燒錄後直接呼叫監看的指令讓你的 AI 助手直接接管 STDOUT / STDERR(其實他是直接看 Serial Port 的資料)。而最開頭的 script 除了讓人類有參與感可以偷看中間的過程之外,順便處理了 monitor 指令需要 TTY 的問題。
換句話說,你只要能夠把情境資訊塞回 AI 助手身上這個閉環大概就建立起來了。
建立檢查點

再完成的基本的閉環建立之後,剩下的問題就是檢查點的建立。它可以是被印出來的文字資訊,也可以是額外的獨立程式交互下的結果。舉例來說 esp-idf 裡面有一個 Wifi Provisioning 的範例,他提供使用者設定 Wifi 連線資訊的功能。我們可以把這個範例套在自己的專案裡面,但是你要把它搬出來需要花一點功夫,特別是他裡面有一些精巧的設計,並不是我們一般所熟悉的寫法。
儘管還不知道怎麼做,但我們肯定可以先建立出閉環。但是檢查點要怎麼弄呢?如果我選擇了使用低功耗藍牙進行認證資訊的傳送,那我就可以額外要求 AI 助手呼叫傳送認證資訊的程式,並且他也期待在 Log Message 裡面看到獲得認證資訊的細節,同時連上網路之後他也可以呼叫 API 並顯示結果,上述這些都是可以用的檢查點。
你可以想像成在一些妙不可言的專案內,我們沒辦法像過去熟悉的軟體開發那樣建立單元測試,那他就只能夠用實際資料來進行實測,所以每一次的測試都是來真的,透過各種的訊息內容,還有實際互動完成功能的驗證。
設定合理的目標
這裡推薦的合理目標是你如何向 AI 助手描述你的想法。閉環開發是很方便的利器,但是他往往會因為願望許得太大了失敗。就算我們沒辦法建立單元測試,還是會期望你試著小步快跑,累積許多的 small success。
像最近看了不同的開發者對於使用 AI 助手的心法,裡面有一招叫做 Peel and Wrap(剝皮接枝),算是我近期最喜歡的實作策略,因為在 esp-idf 裡面有豐富的範例。但是他的範例通常太過完整,為了展示他提供的 API 多出了許多與我自己專案無關的內容。這些內容都都是可以精簡的,所以我最常做的目標就是拿著別人實作好的專案,讓 AI 助手試著把它退階為 MVP 雛形,並且強調我們是去砍掉不必要的功能,不會修改改內部的實作也不會去進行重構,盡可能保持原汁原味的方式去還原他最精簡的版本。
有了這一個精簡的 MVP 就有許多應用的方式。可以這個版本為例,寫實作教學(當然是讓 AI 助手去整理,不會完全自己手寫就是了)。或是以這個精簡的版本,再一次的轉化成獨立的模組,它可以是簡單的分割到不同的檔案,或是真的整理成符合 esp-idf component 規範的模組。無論如何他都可以方便我們整合到自己的場域之內。