IanChenAboutPosts

使用 NUC 做為我的開發後端

avatar奕安Apr 23, 2023

十年之約

前些日子換換病發作,把過去使用的 Intel Macbook 升級成蘋果推出的新世代 Apple Silicon Macbook。 兩年內更換掉一台五萬起跳的筆電,在女友羿伶的眼中單純是消費慾望在背後作祟,她顯然是無法接受, 為了證明我是真的認為這台電腦是我的歸屬,同時也是要激勵我珍惜自己的東西,於是我們就下了個為期十年的賭約: 這台筆電 (MacBook M1 pro 14') 會是我這十年內出外休閒,在家使用,唯一能使用的筆記型電腦。 因為我是靠電腦吃飯的,所以工作上配發的筆電與桌機不算在內。至於賭注,就是全家人從台北來回澳洲出遊的機票錢。

根據這電腦的續航力跟使用效率,日常使用十年肯定不成問題。 只不過,問題就出在我的業餘開發需求。一定要找個方式,讓我不會在十年之內把我的筆電操爆。

如何珍惜我的筆電

讓這台電腦長壽的秘訣很簡單,就是不要用他,只要不要使用,就絕對可以安詳度過這十年,然後爽賺一波賭約。 但對於我來說,十年都不使用也是個困擾,因為身為一個職業開發者,業餘的時間要是不用電腦開發或學習,十年還沒到我可能就先被世界淘汰了。 所以方法可以稍微修改一下,盡量不要在筆電上做一些可能會加速耗損壽命的操作,但又要同時滿足我的開發需求, 簡單來說,這台電腦對於我而言,主要有兩個比較在乎的點:

首先是大量的硬碟寫入可能加速損耗,因為這代的 Macbook 有一個焊死在主機板上的固態硬碟,一旦寫入次數達到上限就要享受尊絕不凡的維修費用。 這讓我每每敲鍵盤時都會瑟瑟發抖,不敢把程式碼寫的太暴力,生怕一個手殘就會讓硬碟壽命少個半年。 其次則是這台筆電採用 Arm 架構在推出的當下,並非主流開發架構,當下的軟體工具環境主要還是圍繞著 x86 生長,這讓我在筆電上進行一些開發容易綁手綁腳一些。

適合進行開發的配置

解決這樣的問題,最好的方式就是再找一台便宜的 x86 架構電腦當作我的開發後端。 開發後端是個自己發明的詞彙,並不太確定有沒有人這樣使用, 主要目的是跟開發前端這個詞一起用來描述開發的情境。

簡單來說,可以將使用電腦進行開發的情境中,拆分成表面上看起來面對螢幕敲鍵盤的動作,以及在表面下透過算力進行編譯,執行,測試的過程。所謂的開發前端就是一個用來提供單純介面互動的電腦,而開發後端則是實際在過程中,提供算力進行操作的電腦。在大部分情況下,開發的前後端會是同一台電腦,而在比較需要高階算力,或是基於資訊安全需求的情況下,開發後端的任務可能會交由遠端的另外一台電腦來進行,這時候就可能會出現開發前後端屬於不同電腦的情況。

在我的情況下,使用另外一台獨立的 x86 架構電腦當作開發後端有很多好處, 首先是因為程式運行中實際上的硬碟讀寫是發生在開發後端上,所以做為開發前端的 Macbook 就不會再有硬碟的寫入壓力。再來也是因為筆電本身不存在負載,所以也能降低筆電本身電池的損耗 (Macbook 原廠換電池 4000 台幣起跳)。最後則是不需要思考架構轉換的問題,可以一直順順的使用 x86 架構的環境進行開發。

開發後端的選擇

對於 2023 年的我們來說,多虧於遠端工作浪潮興起,現在的開發後端選項發展的非常蓬勃。

比較先進的方法是使用純瀏覽器進行開發,如 Github Codespaces、Gitpod 跟 AWS Cloud9。你可以直接在瀏覽器中打開 IDE 進行編輯跟執行程式碼,並且所有的運算都會在遠端伺服器中完成。我稍稍付費嘗試這些服務的感想是:真的很神奇!對於不需要處碰到電腦硬體的需求來說,這類服務確實能夠滿足大不份人的需求。 尤其是時間上斷斷續續的業餘開發,相對於買新電腦來說,除了使用一年花的實際上可以是幾千塊解決,家裡更不需要挪出位置放電腦,甚至過幾年之後也不需要煩惱更換舊電腦的問題。

但純瀏覽器開發也不是沒有缺點,網路延遲是最顯而易見的一項,而這部分也剛好是台灣用戶特別需要顧慮的點,因為亞洲內的機房可能不包含台灣,連線到香港、日本、新加坡等地會因為經過海底纜線導致一定的延遲感產生。除了網路延遲外,這類服務能開發的內容,因為技術限制所以實際上也有所侷限,只能開發基於網路的應用,如果想做硬體控制,或牽涉到一些作業系統的底層服務就只能另尋他法。

在我的情況下,捨棄雲端服務,改而購入電腦硬體會是比較好的選擇。 但同時,考慮到已經擁有 高端。大氣。上檔次 的 Macbook,在新硬體的選擇就必須上一些限制:

  1. 價格親民,因為 Macbook 已經花光大部份預算。
  2. 必須超沒存在感,因為如果太顯眼會影響到 Macbook 的尊容感。

主要是為了開發需求,所以會需要一定的效能,而且也要至少能更換硬碟跟記憶體。在預算兩萬的情況下,大概選擇方向就是迷你主機或是准系統,而幾乎各系統廠都有參與這個產品線的競爭,稍微陳列一下,AsRock DeskMini, Asus Vivo, Msi Cubi, Intel NUC, Gigabyte Brix 都是市場上活躍的選手。

在眾多的選項中,我選擇了 Intel 已經推出幾年的第 11 代 NUC,主要原因是因為在快推出 13 代新機種的當下,可以在各個經銷商中找到便宜出清的電腦, 而且實際上面對業餘的開發需求,電腦算力的重要性遠低於記憶體跟硬碟空間,在預算有限的情況把比較便宜的記憶體跟硬碟選配到一定的規格會是比較好的選項。 以這次的交易來說,Intel i5 搭配 32G RAM 以及 1TB SSD 最後只花了一萬六千塊台幣。這個配備能讓我負擔的使用虛擬機進行開發,甚至進行一些比較複雜的編譯操作。

以 NUC 為基礎的開發場景

電腦買了,但要如何擁有絲滑的開發體驗,並且在表面上優雅使用 Macbook 實際上卻是在 NUC 上面進行開發呢? 我認為對於自己架設的電腦來說,端對端連線的體驗會是非常重要的。 所謂的端對端連線,指的是在使用開發前端時,實際上要如何在網路上找到另外一台開發後端的 IP 位址,並且依此建立連線。

端對端連線問題

我們可以透過各種方式讓開發前端找的到開發後端,最簡單的方案是向自己的網路服務供應商 (如中華電信) 申請一個固定的 IP 位址,並將這個接口接上開發後端,這樣開發前端就能直接根據供應商給的位址進行連線。這樣種方式做起來簡單,但最主要的疑慮是因為是公開位址,所以開發後端是很容易被駭客找上並攻擊,所以需要資訊安全概念才能安全使用。 第二種方式是將兩台電腦接上帶有 Router 功能的無線基地台,讓兩台電腦共存在同一個區域網路 (Local Area Network, LAN) 之下,在這個情境中可以透過 Router 的設定來得知兩台電腦的位址,這種方式可以避免外界隨意存取到開發後端(除非他們的電腦成功接上了你的基地台),但問題是如果今天我們人在外面的咖啡店,就可能需要再自行架設 VPN Server,透過跳板來連上開發後端。

最後一種方式,就是我自己使用的方法,透過 ZeroTier 這類以 P2P 架構為基礎的穿隧 (Tunneling) 服務,簡單來說就是可以透過軟體設定的方式直接讓兩台電腦對連。 唯一的限制是,會需要兩台電腦在開始之前先連上 ZeroTier 的伺服器,實際上的設定步驟算是簡單,只要安裝 Zerotier 軟體並在官方網站申請帳號,根據官方網站的提供的教學就可以將兩台電腦加入到 自己的虛擬內網中。

實際使用情況

有關實際上的使用情況,這邊分享一下我自己的正常開發流程,以及實際上使用的體驗。

我使用了 vscode 做為我的主要編輯器,並透過安裝微軟維護的 Remote Development Extension 套件,讓我們能夠直接存取遠端電腦的資源。

搭配上 ZeroTier 後,基本上我的開發步驟大概會是:

  1. (只需執行一次) 在 NUC 上安裝 ZeroTier,並在官網上把 NUC 加入我自己的虛擬內網
  2. 在 Macbook 中開啟 vscode
  3. 在 vscode 的 Command palette 中選擇 Remote-SSH: Connect to Host... 連上 NUC。
  4. (Optional) 如果有設定 dev-container 的話,在 vscode 的 Command palette 中選擇 Dev Containers: Reopen in Container
  5. 開始開發。

撇除第一次使用的基礎設定,基本上就是三個步驟能夠完成的動作,每次的開發都只需要幾秒鐘就能設定完成。

而在這個設定中最有可能影響體驗的就是網路延遲,這主要是根據你的連線方式而有所差異:

以我為例,當 NUC 跟 Macbook 都是透過 wifi 來連上家中網路的話,網路的延遲大概會是 200 ms,會是感覺的到,但對打打字的體驗不會有明顯影響的情況。 但如果 NUC 是透過實體線路連上家中的基地台時,延遲就會降到完全無法感受出來的 5 ms 以內。 這兩種方法都有各自的優缺點,主要是根據自己的需求為定,對於兩者都是透過 wifi 連結的情況來說,這主要的好處是可以把 NUC 放在家中任何一個不起眼的角落當作開發後端,免除掉處理網路線走線的問題,讓整個房間的擺放配置可以乾淨不少。

結語

使用到現在來說,我對將 NUC 當作開發後端這件事情,感到非常滿意。 能夠在 Macbook 上享用到原生的 x86 Linux 系統,能說是身為一個開發者的面子跟裏子都照顧到了。 如果你也想要嘗試,我會十分推薦這樣的配置。