把程式碼全部丟給 AI,但自己對內部一無所知的日子令人不安
你是否也有這樣的感受?
針對這些情況,我想藉由我在現場的經驗和一些失敗談,分享幾個抓住技術「本質」而非「表面」,從而加速成長的提示。
剛成為工程師時,我拼命想做到「把任務做完」。雖然會查怎麼寫程式碼,但對更底層到底發生了什麼,一點概念都沒有。
有一次我寫了一個要一次處理大量資料的程式。在本地環境可以運作,部署到正式環境後系統卻陷入沉寂。前輩問我「有考慮記憶體的配置嗎?」我當場當機。
電腦主要由下列五種角色的裝置構成(概念上可分為):
這些透過作業系統(Operating System, OS)這個基本軟體,來仲介硬體與應用程式。那時候我完全沒有意識到,程式會消耗「記憶體(有限資源)」這件事。
「了解電腦的運作原理」,等同於擁有一張能推測故障原因的地圖——這點讓我印象深刻。
成為工程師後才發現,寫程式的時間只是整個開發流程的一小部分。系統開發有一套標準流程,稱為生命週期(ライフサイクル)。
現代的開發方法:敏捷與 DevOps
近年來,以短週期反覆開發與釋出、快速應對變化的敏捷開發(Agile)為主流;同時開發(Development)與營運(Operations)緊密連結、快速交付價值的 DevOps 觀念也被重視。
剛開始沒經驗的我,只關心在「實作(程式撰寫)」階段讓眼前的程式能運作。但程式不是寫完就結束的。
在開發中的程式碼審查(Code Review)需要向夥伴傳達程式的意圖,釋出後的維護則會由未來的自己或其他維護者來修改,程式碼是「永遠有人會讀」的前提下撰寫的。
把可讀性擱置一旁的程式碼會為周遭的人帶來麻煩。來看例子。
這種寫法是「暫時能跑就好」,對審查者或未來維護者等缺乏考量。
javascript
// 直接用 1 或 2,乍看無法知道代表什麼
// 在審查時會引發問題,之後修改也容易造成錯誤
function getPrice(p, t) {
if (t === 1) {
return p * 0.8;
} else if (t === 2) {
return p * 0.5;
} else {
return p;
}
}
讓審查者一讀就懂,且在維護階段也能安全修改的寫法。
javascript
/**
* 根據使用者等級計算折扣後價格
* @param {number} basePrice - 原價
* @param {string} userRank - 使用者等級(REGULAR, VIP, GOLD)
*/
const USER_RANK = {
REGULAR: "REGULAR",
VIP: "VIP",
GOLD: "GOLD"
};
// 將折扣率定義在一處,未來變更只要修改這裡
const DISCOUNT_RATES = {
[USER_RANK.REGULAR]: 1.0,
[USER_RANK.VIP]: 0.8,
[USER_RANK.GOLD]: 0.5
};
function calculateDiscountedPrice(basePrice, userRank) {
// 若找不到對應等級,回傳原價
const rate = DISCOUNT_RATES[userRank] ?? DISCOUNT_RATES.REGULAR;
return basePrice * rate;
}
當你能從整個生命週期俯瞰時,就會站在「將來接棒的審查者或維護者」的角度,思考現在該如何表達程式碼。
當你成為一名會寫程式的工程師後,就會發現除了語言語法外,網路與資料庫的知識同等重要。若把系統比作人,網路像是傳遞電訊號的「神經」,資料庫則像是負責記憶的「大腦」,它們是系統正常運作的生命線。
多數應用透過網際網路與其他電腦溝通。學習網路知識的理由之一,是為了「找出通訊在哪裡停擺」。
使用者的 ID、發文內容等各種重要資訊,都需要安全地保存到資料庫中。對於產品開發而言,資料庫可說是系統的一部分「大腦」。幾乎所有 Web 服務都是從資料庫取出資料來運作的。
剛起步的工程師常常只追逐最新技術。但累積現場經驗後,我發現支撐技術的「基礎心態」更為重要。
IT 業界日新月異,昨天的常識隔天可能就過時。因此比起純粹的知識量,更重要的是以下三種心態:
為了在技術之上創造價值
這些心態需要透過日常學習與實務不斷磨練。把技術當成手段來運用,成為能持續為社會創造價值的工程師吧。
對於沒有經驗的人來說,現在或許像是在黑暗中摸索,但不用擔心。帶著上面介紹的指引,真誠面對眼前的課題,你的職涯一定會有所成長。一步步往前走吧!
PRUM 的工程師有超過 95% 是從無經驗起用。如果有興趣也歡迎來公司網站看看。