惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
D
DataBreaches.Net
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
V
Visual Studio Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
B
Blog RSS Feed
Recent Announcements
Recent Announcements
The Register - Security
The Register - Security
S
Secure Thoughts
Y
Y Combinator Blog
The Last Watchdog
The Last Watchdog
L
LINUX DO - 最新话题
V2EX - 技术
V2EX - 技术
腾讯CDC
GbyAI
GbyAI
G
Google Developers Blog
博客园 - 司徒正美
博客园 - 三生石上(FineUI控件)
T
The Exploit Database - CXSecurity.com
T
Threat Research - Cisco Blogs
P
Proofpoint News Feed
Schneier on Security
Schneier on Security
Microsoft Security Blog
Microsoft Security Blog
Jina AI
Jina AI
WordPress大学
WordPress大学
aimingoo的专栏
aimingoo的专栏
MyScale Blog
MyScale Blog
Help Net Security
Help Net Security
K
Kaspersky official blog
P
Privacy & Cybersecurity Law Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
AI
AI
MongoDB | Blog
MongoDB | Blog
Scott Helme
Scott Helme
J
Java Code Geeks
Engineering at Meta
Engineering at Meta
H
Heimdal Security Blog
H
Help Net Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
云风的 BLOG
云风的 BLOG
Microsoft Azure Blog
Microsoft Azure Blog
S
Security Affairs
TaoSecurity Blog
TaoSecurity Blog
The GitHub Blog
The GitHub Blog
Hacker News: Ask HN
Hacker News: Ask HN
Martin Fowler
Martin Fowler
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Project Zero
Project Zero
T
The Blog of Author Tim Ferriss
Last Week in AI
Last Week in AI

Nic Lin's Blog

謝明真 - 高效領導力的課後筆記 NFT 開發實戰!基礎智能合約入門 (3) NFT 開發實戰!基礎智能合約入門 (2) NFT 開發實戰!基礎智能合約入門 (1) 如何自我檢測 log4j CVE 漏洞 Rails 如何在資料寫入時記錄來源 IP 位置 如何經營工程師 Youtube 頻道 - Part 8 營收篇 如何經營工程師 Youtube 頻道 - Part 7 酸民文化篇 如何經營工程師 Youtube 頻道 - Part 5 設備器材篇 如何經營工程師 Youtube 頻道 - Part 4 後製剪輯篇 如何經營工程師 Youtube 頻道 - Part 3 文案企劃篇 如何經營工程師 Youtube 頻道 - Part 2 設備器材篇 如何經營工程師 Youtube 頻道 - Part 1 制訂頻道方向篇 如何經營工程師 Youtube 頻道 - Part 0 Rails 中避免 race condition 的最佳實踐(二) Rails 中避免 race condition 的最佳實踐(一) 10 分鐘整合 google sheet 做自動化開發功能週報 經營 Side Project 300 天所帶來的收穫及挑戰 我的 Youtube 影片製作流程 API 設計時必須注意的 HTTP header 底線問題 如何提升你的程式可讀性之實務技巧(三) 如何提升你的程式可讀性之實務技巧(二) Ruby 中使用 freeze 優化效能的時機 避免 React 中的 useEffect 無限 render 在 Rails 內輕量使用 Vue Component 的最佳實踐 如何在區域網路用 Docker 架設有 SSL 的 Gitlab 從被問到問人,那些我常問的面試問題 [Rails] 如何漂亮寫出可維護的 query (Maintainable Rails Query) 在已知長度情況下優化 slice 的性能 [ReactNative] 如何在 iOS APP 上主動要求用戶評分 Rails 的 scope 為什麼用 lambda? Proc 與 lambda 不同之處 淺談 Active Record 的 Lazy load 特性 Rails 專案搭配 Github Actions 進行 RSpec 自動化測試 JavaScript 中 require, import 的差別及效能 React 效能優化基本招 ES6 箭頭函式 (Arrow functions) 2 個月擁有 6000 用戶 Side project 這樣做(一) 如何讓自己成為失敗的軟體工程師 如何用 Rack::Attack 阻擋 DDOS / 惡意流量 用 OpenSSL 自簽開發用 HTTPS SSL 憑證 為機器加上登入訊息,在 ubuntu 設置登入歡迎詞 Ruby Memoization 性能優化之記憶化 淺談 SSH agent forwarding 和 proxy command 的安全風險與應用 [Rails] Service / Library / Concern 的差異 避免過度的 Defensive Programming 防禦性程式設計 1:1 攪亂器,如何用 Ruby 做可逆推序號 Rails 中的欄位及方法命名原則 [Rails] 用 puma-dev 作為本地開發伺服器 (支援 https 自簽憑證) 將 Rails 專案從手動部屬遷移使用 Capistrano 自動化部屬 工程師提昇自己的教學和簡報技術的方法 [筆記] Rails 3.2 升級 Rails 6.beta 經驗分享 Class method 氾濫帶來什麼問題 RDBMS 課程心得與筆記 常用的 Rails 開發規範 Rest-Client 如何做 Basic Authentication 驗證 [Rails] 何為 tld_lebgth? 遵循 Semantic Versioning 軟體開發語意化版本管理 請直接在 MySQL 裡面直接用 utf8mb4 取代 utf8 如何解決在 awesome print 中遇到 ActionController::Parameters unable to convert unpermitted 如何在 Mac 上升級 PostgreSQL 並遷移資料 如何解決 Mysql2::Error: Incorrect string value 讀書心得 - 「信任因子:信任如何影響大腦運作、激勵員工、達到組織目標」 我是如何寫部落格筆記的 讀書心得 - 「先問,為什麼?:顛覆慣性思考的黃金圈理論,啟動你的感召領導力」 [Rails] 解決 Reset Password 帶來的 token 洩漏問題 我的軟體工程師生涯:如何挑選適合你的公司 Rails 中的 delegate 用法 淺述 SSR SPA 優缺點 Rails 非同步工作請用 Global ID [React] Class Component 傳遞 props 的 2 種方式 好用的隱私權政策 URL 自動生成 Rails 5.1 之後的 tag helper Rails 5.2 Encrypted Credentials 最近面試被給的建議和書單 一般架構需要用到 K8S 嗎 透過 commit SHA 找 github Pull request 從零搭建,如何讓 Rails 跑在 Kubernetes(k8s)(二) 從零搭建,如何讓 Rails 跑在 Kubernetes(k8s)(一) React Stateless Functional Components 搞懂 React 中的 state 和 props 物件導向基本原則 SOLID (Ruby Sample) 在以太坊智能合約上是可以預測隨機數的 在台灣租屋必須注意的事 Rails 5 簡單雙向加解密 如何用 ABA 培養自律型員工 不要在 rake task 中定義 method, 請用 RAKE::DSL rails 非hash只想用array輸出page 如何處理陣列裡有重複的值 [Rails] 如何重設你的專案名稱 Ruby on Rails install on Mac 安裝步驟 使用 Friendly_id 與 Babosa 美化你的Rails 網址 Junior Rails 兩個月實戰心得 Devise使用Google實作登入 [iterm2] 如何新增alias 一個新鮮人找尋Rails工作的面試經驗 如何讓兩個資料表建立關聯 routing 的 namespace strong parameter user story 的格式 user story 是什麼?
如何提升你的程式可讀性之實務技巧(一)
Nic Lin · 2020-02-29 · via Nic Lin's Blog

有沒有遇過一種情況是,即使需求不是這麼急迫,團隊之中總有習慣了問題來隨手就解的隊友,那個神來一筆的 commit 也跟著埋下了考古的鑰匙。

直到要維護時,你才發現你就是這個考古學家,戴上帽子拿起放大鏡,要來探索這看似熟悉卻陌生的語言。

「咦,這些簡寫是什麼意思?」

「這個 function 命名跟行為怎麼不一樣?」

「status == 5 是指什麼啊?」

於是你帶著各種疑問繼續在迷宮打轉,此時多希望有翻譯蒟蒻。

也許,我們都應該多在乎一點別人,在每次 commit 後,檢討一下這次提交內容的可讀性,是否能夠輕易被理解?

這篇文章主要會和大家分享,在過去的開發歷程以來,和非常厲害/困擾的高手合作後,整理出這些對我或團隊來說能夠提升「可讀性」的方法,而這些技巧方法也直到現在都還在使用。

文章的篇幅主要會分成三個部分

  1. 提升可讀性能夠帶來的實際幫助 <- 本篇
  2. 以程式碼示範提升可讀性好用的技巧
  3. 以測試、開源等不同角度去提升可讀性的方法

在程式碼範例的部分,主要會以 Ruby / JavaScript 的語法作為示範,其寫法盡可能會寫的繁瑣一些,其目的是希望能夠讓其他語言的學習者也能夠理解。

  1. 提升可讀性能夠帶來的幫助
    • 這篇文章會寫什麼?
    • 你知道國語和國文的差別嗎?
    • 可讀性帶來什麼幫助
  2. 用實際開發案例說明提升可讀性好用的技巧
    • 觀念
    • 命名
    • 註解
    • 流程
  3. 以測試、開源等不同角度去提升可讀性的方法
    • 性能與可讀性
    • 約定優於配置
    • 社群規範 Ecosystem
    • 以測試角度提升你的可讀性
    • 總結

這篇文章會寫什麼?

我們都知道,網路上有很多文章分享程式碼如何改善可讀性,甚至會推薦你去看 Clean code / The Art of Readable Code / Implementation Patterns,等等一些文章筆記或書籍。

懶的人也可以在網路上找到別人消化過的筆記文章。

但看完這些文字後,對於實務上還是不清楚怎麼改善,也不曉得可讀性這種抽象的標準到底在哪裡,畢竟好不好理解,是相對主觀的。

以 Kent Beck 所寫的 Implementation Patterns 一書,其內容提到了 77 個實作的 patterns,這概念又與 Clean code 所提到的不完全相同,只能說對於軟體開發的設計模式,各自有不同的見解。

但能夠讓程式碼可以在開發時具有「溝通」的效果,卻是一致的目標,所以這篇文章主要會和你分享,在程式撰寫時,可讀性的重要及如何透過一些簡單的觀念來建立並提昇自己,加強自己在撰寫能力上的內功心法。

這些方法是我自己整理出來比較常見,可以快速調整方向或思維的作法。

有趣的是,我在過去一年裡,同時寫了 Ruby / Go / React Native 的專案,在以下的範例內容,我會盡可能以簡單的變數命名、變數命名、function 來作為表達,想和你分享的是,可讀性的基本功夫是可以貫穿程式語言的。

你知道國語和國文的差別嗎?

在程式開發中,良好的可讀性必然是系統健全體質的重要指標之一,這個指標能夠如何幫助我們提升開發效率及品質呢?

有多少次,我們聽見「之後在改」,但往往事實是將這段程式碼放置到遙遙無期封塵已久,直到回首時,才發現這個撰寫的時日已經是一年前了。

其實更常發生的情況是,常常覺得不可置信,卻也不可否認的情況,就是這個程式碼你只會寫這麼「一次」,一時貪快而未曾深思的你選擇了 work/hack around 的做法,雖然能夠解決當下的問題,但也同時為未來的自己或他人埋下迷宮的關卡。

或許你會說,現在很急著要上、老闆明天就要、公司我最資深啊,以及各種不可抗拒的理由,所以你被時程逼迫寫下可讀性可能不是太好的程式。

但我們換個角度仔細想想,如果有一場 50 分鐘的演講你即將上台,但主辦方臨時將時間更改成只有 10 分鐘,那麼你說話的方式、語句會從口齒清晰變成含糊不清嗎?

通常不會。

因為你已經習慣你的說話方式,或許這個改變讓時間變的有限,內容也被侷限,但你能說出的內容取決於你的內涵及所學,並不會差太多的,因為表達方式已經內化到你的大腦裡了,也就像是武俠小說所說的內功。

為什麼我們小時候在上課的過程中,國小學習的是「國語」,而到國中之後變成「國文」

因為這是兩個完全不同的領域

  • 國語: 讓你認識基本單字、字詞及基本用法
  • 國文: 讓你學習文字的運用,各種句子、形容來完整表達自己的想法。

所以當你學會了程式語言中的 if else / loop / API,那就像是學習「國語」,也就是所謂基礎用法,你明白程式可以透過參數傳遞、條件判斷,來達到不同的執行結果。

而將想法轉成程式碼時,如果沒有學好「國文」,自然容易寫出不具可讀性的程式碼,再加上我們的母語並不是英文,對很多人而言,只把程式語言的英文當做積木來拼湊,而不是把他當一個句子或文章來看待。

所以當把「國文」學好時,時間久而久之會內化成你的功力,我認為就算環境在嚴苛、時間再急迫,也可能因為這些情況有實作方法上的 trade off,但這時的你應當能隨手寫出「至少」能讀的程式碼了。

舉個例子,如果你習慣命名 latestPosts,不會因為時間很趕就變成 lps,因為根本不差這幾秒鐘啊

業餘跟職業的選手差別在於,職業選手透過長久的練習及內化,能夠不透過思考直接反射性的使出高階招式。

這對選手來說,是境界的不同,對工程師來說,何嘗又不是如此呢?

可讀性帶來什麼幫助

提升效率

在寫程式碼時,總是很難在第一時間就「完全正確」,所以或多或少會有除錯的時間,難以閱讀的程式碼就像是一座迷宮,不僅迷惑了自己還會讓協作者花更多時間去理解。

或許你有高超的記憶力,能夠很快的從迷宮逃脫,但通常一段時日過後回頭來修改維護時,會重新挑戰你的記憶力,不易讀懂得程式碼將會再度浪費你的開發時間。

所以,可讀性提升的是未來自己和他人的開發效率

減少犯錯

良好的可讀性也就意味著表達明確,而不是曖昧不清或隱諱的敘述。

當一段程式碼的命名敘述不同於執行內容時。

在現實生活中你會說這產品廣告不實、在機場海關這叫偷渡、在女生嘴裡叫口是心非,但在開發程式時卻叫他媽的誰放的地雷。

我們來看以下的例子

def increase_read_count(post)
  post.update(read_count: post.read_count + 1)
  SendEmail.perform(post)

  return post
end

我們以為 increase 會如同字面上的意思只是單純增加計數,但如果沒仔細去看實作細節,他竟然還會偷發一個不知道做什麼用的 Email,這就屬於一種隱諱的寫法,因為和主要敘述功能的名稱不完全符合,也難以聯想。

所以,明確的表達能夠減少犯錯

幫助他人學習

可讀性高的程式碼,能夠讓人更快進入狀況,瞭解其邏輯、設計架構,而減少時間在搞懂這迷宮到底怎麼蓋的,能夠展現其思緒及脈絡。

不論對於他人學習或團隊合作都有很好的幫助,以 clean code 的名言來說,也就是

當每個你看到的程式,執行結果都與你想得差不多,你會察覺到你正工作在 Clean Code 上

所以,可讀性能夠幫助他人和自己更快學習

小結

在接下來的章節,會以程式碼的實際案例來和你分享如何透過思路上的調整,去提升可讀性。

請繼續閱讀下一篇章。

本系列其他文章