當我剛開始使用終端機時,當然,它是有用的。我可以在資料夾之間切換、安裝套件、啟動開發伺服器、處理一些 Git 操作。但其中大多數事情,點幾下按鈕也能做到。

而且對我來說,點按鈕看起來完全合理。

我其實不太確定自己是否想成為那種「只因為我可以,就把所有事情都從終端機完成」的人。

但隨著我越來越投入開發,尤其是花越來越多時間使用 Linux,我發現自己越來越常用它。

有時是因為它比較快。有時是因為我想做的事情根本沒有方便的圖形介面。也有時是因為我照著指示操作,但其實完全不知道有一半指令到底在做什麼。

最後,我開始對最後這一點感到好奇。

那個指令到底在做什麼?它為什麼有效?為什麼會失敗?而且我一開始到底為什麼要執行它?

在這過程中,我慢慢意識到,我學到的不只是怎麼使用命令列。

我開始理解那些我早已習慣的漂亮介面底下,事情是怎麼運作的。

而這件事,比學會快速輸入指令有用得多。

我開始更注意檔案系統

我一直都懂檔案和資料夾。我想大多數人都已經在檔案管理器裡搬東西很多年,卻從沒太在意過。

但使用終端機讓我開始注意到平常不會留意的事情。

例如:

pwd
ls -la
cd ..

沒什麼特別的,對吧?

但在終端機裡工作時,知道自己目前所在的位置其實很重要。

我已經數不清有多少次,我以為自己在某個目錄裡,結果執行指令時才發現根本不在那裡。

或者我不明白為什麼設定檔沒出現,後來才想起來它是隱藏檔。

又或者我用了相對路徑,卻沒先想清楚它是「相對於哪裡」。

這些都是很基本的事情,但如果只是一路點著資料夾走,我完全可以不用去思考它們。

我開始更注意隱藏檔、符號連結、絕對路徑與相對路徑,以及應用程式把設定檔存在哪裡。

然後,許多以前讓我困惑的小地方,突然就變得更合理了。

不是因為終端機神奇地讓我變聰明了,而是因為我必須真的理解自己在做什麼,而不是依賴介面幫我處理一切。

我終於開始理解程序

這對我來說是一個很大的轉折。

當你正常開啟一個應用程式時,你點一下圖示,它就打開了。用完之後,把它關掉。

很簡單。

但背後其實有很多事在發生,而我以前不一定會去想。

從終端機執行程式,讓「程序」這件事變得具體得多。

尤其是在開發 Web 應用程式時。

如果你有用過 Vite 開發,八成遇過那個令人頭痛的「連接埠已被使用」問題。

你嘗試啟動開發伺服器,但你想用的連接埠上已經有東西在佔著了。

有時候那是你忘記還在跑的另一個應用程式實例。你問我怎麼知道的。

與其亂關一堆終端機視窗然後祈禱,我開始學著去看目前到底跑了什麼。

ps aux
pgrep -af node
ss -ltnp

如果我特別想知道 5173 連接埠上是誰在聆聽:

ss -ltnp | grep ':5173'

這些指令可以讓我調查系統上的程序與監聽中的 socket。視權限而定,我可能沒辦法看到每個與 socket 相關的程序,但這是個很好的起點。

這看起來是很小的一件事,但理解「正在執行的應用程式」、「程序」以及「它使用的連接埠」之間的關係,幫助我把很多其他概念串起來。

以前,我知道開發伺服器正在運作,因為瀏覽器有顯示我的應用程式。

現在,我對「正在執行」真正代表什麼,有了更清楚的概念。

權限變得清楚多了

Linux 權限也是那種我在理論上大致懂,但實際上常常卡住的東西。

讀、寫、執行。懂了。

只是顯然我其實沒完全懂,因為我還是常常遇到無法修改檔案、無法執行腳本的情況,然後一頭霧水。

終端機讓我更容易直接看清楚到底發生了什麼。

ls -l script.sh
stat script.sh

與其只看到「權限被拒」的訊息然後覺得很煩,我可以檢查檔案的擁有者,以及它具備哪些權限。

我開始理解,為什麼一個檔案可讀卻不可寫;或者為什麼一個腳本明明就在那裡,卻不能執行。

我也學到,目錄上的執行權限和檔案上的執行權限意義並不完全一樣。對目錄來說,它是關於能不能穿越進去。

這是那種看起來很奇怪,但一旦理解之後就覺得很合理的 Linux 細節。

然後還有 sudo。

我覺得,學 Linux 的時候很容易看到權限錯誤就想:「好吧,那我前面加個 sudo 就行了。」

問題解決!

但也未必。

你或許能讓指令跑起來,但你還是不知道它為什麼需要提升權限。而且視你在做的事情而定,你可能會不小心建立一些屬於 root 的檔案,而那其實不應該是這樣。

我學到一件事:讓某件事能運作,和理解它原本為什麼不能運作,是兩回事。

老實說,這個教訓在開發裡出現過很多次。

網路變得沒那麼神祕了

網路是那種我早就懂大方向,但直到真正要排錯時,還是不太有把握的主題。

我知道什麼是 DNS。我知道什麼是連接埠。我知道應用程式是透過網路在溝通。

很好。

但當連不上時,這些知識不一定能告訴我該從哪裡開始查。

是主機名稱解析有問題?還是伺服器其實根本沒有回應?還是我的應用程式根本沒在我以為的連接埠上聆聽?

又或者,我是不是不小心搞壞了完全不相關的東西?

終端機提供了我一個可以逐步縮小範圍的方法。

dig example.com
curl -I https://example.com
ss -ltn

這些指令各自查看拼圖的不同部分。

dig 可以讓我檢查 DNS 解析。

curl 可以讓我送出 HTTP 請求並查看回應。

而 ss 可以讓我查看自己系統上哪些 TCP 連接埠正在聆聽。

當然,這些指令不會神奇地解釋所有網路問題。但它們至少給了我一個起點。

而我覺得,這才是差別最大的地方。

我不再把每次連線失敗都當成一大坨神祕問題,而是開始試著找出到底是哪一部分壞了。

因為「我的應用程式連不上」其實可能代表很多不同的事情。

而知道自己遇到的是哪一種,排錯就容易多了。

我變得比較會讀錯誤訊息了

這聽起來可能有點好笑,但我覺得我從終端機工作中學到最有用的一件事,就是學會真的去讀工具傳達給我的訊息。

不是只掃一眼錯誤,判斷它壞掉了,然後立刻亂試各種方法直到它碰巧能動。

我的意思是,真的去讀它。

在終端機裡工作時,你會看到很多輸出。

編譯錯誤、相依性警告、堆疊追蹤、伺服器日誌,有時候還會因為一點小錯誤而冒出一大片誇張得離譜的文字。

一開始,這些輸出會很讓人不知所措。

有時候現在還是會。

但隨著我接觸得越多,我開始能辨認哪些資訊值得注意。

缺少環境變數,和網路請求失敗,根本不是同一件事。

相依性衝突,不是語法錯誤。

而一個立即當掉的應用程式,和一個明明跑得好好的、卻沒有如預期回應的應用程式,也完全是不同的問題。

我還是常常會盯著錯誤訊息發呆,想知道它到底在說什麼。

但現在我比較常先去研究真正的錯誤,而不是立刻丟出另一個可能的解法。

而且當我真的需要查資料時,我通常也更清楚自己到底該查什麼。

這帶來了很大的差別。

真正的收穫,是學會怎麼調查問題

我想,這是我一開始更常使用終端機時,最沒有預料到的部分。

我原本以為自己會學到一些有用的指令,也許能讓幾個工作流程更快一點。

但我沒想到的是,它會如此改變我面對問題的方式。

現在,當某件事不能運作時,我更有可能先開始問問題。

這個指令實際上是在哪裡執行的?

是哪個程序在使用那個連接埠?

這個檔案的擁有者是誰?

伺服器到底有沒有回應?

錯誤訊息實際上寫了什麼?

我並不是說我總是知道怎麼找出答案。

完全不是。

有一半的時間,我還是在查指令、讀文件,或發現我以為自己懂的東西,其實和我想的不太一樣。

但這正是重點。

我不覺得,能自在使用終端機代表你得背下幾百個指令,或是能憑記憶打出某個誇張的單行指令。

它代表的是:你知道背後大概有辦法去調查發生了什麼,而且你願意去弄清楚。

有時候,這意味著使用我已經知道的指令。

有時候,這意味著花二十分鐘讀文件,搞懂為什麼那個指令沒有照我預期運作。

兩者都很有用。

幾個值得試試看的練習

如果你剛開始接觸終端機,或者你大多只把它拿來安裝套件和啟動開發伺服器,這裡有幾個值得嘗試的小練習。

這些範例主要是針對 Linux,因為那是我使用的環境。在 macOS 或 Windows 上,部分指令會不同。

重點不是背下來,而是觀察它們顯示了什麼,並試著理解為什麼那些資訊重要。

1. 更仔細地看一個專案目錄

在你的某個專案裡開啟終端機,試試看:

pwd
ls -la
find . -maxdepth 2 -type f

看看你現在在哪裡、有哪些檔案是隱藏的,以及整體結構是怎麼安排的。

試著在不同目錄下執行這些指令,看看有什麼變化。

特別注意相對路徑。它們看起來很簡單,直到它們成為問題的原因。

2. 找出你的開發伺服器

照你平常的方式啟動開發伺服器。

接著打開另一個終端機並執行:

pgrep -af node
ss -ltnp

如果你用的是基於 Node.js 的開發伺服器,而且是在 Linux 上,試著找出它的程序和它正在聆聽的連接埠。

如果你看不到預期中的程序資訊,查查看為什麼。可能是權限問題,也可能是你的伺服器是透過不同的可執行檔在執行。

這個「調查」本身就是練習。

3. 看看檔案權限

在你的專案裡挑一個檔案,執行:

ls -l package.json
stat package.json

那些權限位元全部代表什麼?

誰是這個檔案的擁有者?

擁有者能做哪些一般使用者不一定能做的事?

你不需要為了練習就真的去修改權限。事實上,我會建議你先理解自己看到的是什麼,再考慮這麼做。

4. 看看一次 HTTP 請求會發生什麼

試試看:

curl -v https://example.com

這個輸出裡有不少資訊。

看看連線細節、TLS 協商、請求標頭,以及回應標頭。

你不需要一開始就理解每一行。

挑一個你不熟悉的內容,去查它。

我學這些東西,很多都是這樣學來的。

5. 練習使用管線

這是一個很小的例子:

printf 'apple\nbanana\napricot\n' | grep '^a'

你應該會看到:

apple
apricot

那個小小的 |,會把一個指令的輸出送到另一個指令。

這想法非常簡單,但也是讓類 Unix 命令列環境如此好用的原因之一。

你不需要一個什麼都包辦的超大型工具,而是可以把小工具串在一起。

一旦這個概念打通,很多終端機工作流程就會更容易理解。

而且不只這個小例子,還很值得繼續多試試看。

你不一定要把所有事情都放在終端機裡做

這點我可能得提一下,因為我知道這類話題常常會聊成什麼樣子。

我並不是說每個人都應該丟掉圖形化應用程式,然後用餘生一直盯著終端機視窗。

我自己也常常使用圖形化應用程式。

很多事情我還是比較想用好用的介面來做,我也不會為了證明自己能從命令列完成某件事,就故意把生活搞得更複雜。

我也不覺得使用終端機就自動代表一個人是更好的開發者。

你可以整天複製貼上指令,卻完全不理解它們在做什麼。就像你可以在圖形介面裡點來點去,卻完全不知道背後發生了什麼。

對我來說,差別在於好奇心。

當我開始注意指令到底做了什麼、為什麼有效、以及為什麼有時候會大爆炸時,我學到的東西就變多了。

終端機的特點是,它很容易讓你看到一些圖形介面通常會替你處理掉的事情。

重點其實不是打字比較快

我開始使用終端機,是因為它有用。

而且的確,我在某些事情上變快了。很多工作,只要打開終端機輸入一個指令,就比在一堆選單裡點來點去容易得多。

但那不是最有價值的部分。

真正改變的是我看待自己正在使用的軟體的方式。

一個應用程式不再只是我點一下圖示就會打開的東西而已。背後有程序在運作、檔案被存取、權限被檢查、網路連線被建立,還有各種更小的事情在幕後發生。

而當某件事出問題時,我更知道該從哪裡開始找。

我還有一大堆東西要學。我一直在查資料、嘗試那些我還不完全懂的東西,偶爾也會因為太有自信而把東西弄壞。

但我確實越來越會把問題查清楚了。

而這,就是終端機真正幫助我的地方。

不是成為什麼命令列專家。

只是成為一個更會調查問題的人。

而隨著我對開發理解得越多,我也越來越覺得,這其實是一項非常重要的能力。


原文出處:https://dev.to/sizzlebop/the-terminal-made-me-a-better-developer-and-not-for-the-reasons-i-expected-nn6


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
251
🥈
mike
1
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登