張逸:程式碼最大的敵人就是體格
Steve Yegge 在他特立獨行的作品《程式設計師的吶喊》中寫道:“我堅信程式碼最大的敵人就是體格”。不過他過於自大了,以為這只是像他那樣牛逼的程式設計師才擁有的少數派觀點; 又或者說他過於悲觀,以為程式設計師的世界還在拼程式碼的肌肉男臆想中。殊不知只要是曾經掙扎在龐大程式碼庫泥潭中的程式設計師,就不會盲目崇拜程式碼的大塊頭。
圖片選自俄羅斯畫家、美術理論家瓦西里·康定斯基作品。
可惜,“知行合一”非聖人不可以做到,夢想的光芒常常難以照進現實的陰影。要縮小程式碼的體格,似乎比減肥還要艱難。軟體系統像一條貪吃蛇,吃掉一切 功能,最後越變越長,在侷限的空間裡再也無法做到從容的轉折騰挪,最後活活困死。偏偏還有人以能掌控千萬級程式碼的軟體系統為榮。——“兄弟不才,做過一系 統,程式碼達到了兩千萬行,真是一場噩夢啊!”,程式君一邊搖頭作痛苦狀,噓聲嘆氣,但察其眼角眉間,藏不住的卻是得意和炫耀。
因而,我們一邊在憤慨程式碼日益膨脹的體格,一邊又在做著堆程式碼的增肥工作。軟體從來都不是一個人寫完的,需求也從來不會穩定不變,於是乎出現了超過數個螢幕的分支語句,出現了大量註釋過的程式碼殘骸,於是乎有了拷貝貼上,程式設計師漸漸開始降低壞程式碼的容忍度,開始得過且過。
面對日益膨脹的程式碼體格,Steve 的吶喊是換語言,因為他是 Ruby 粉和 Python 粉的緣故,恨不得把所有系統都換成 Ruby 或者 Python,要麼就是 Lisp。作為 Scala 粉的我,當然也恨不得所有 Java 專案都換成 Scala。讓我再寫囉嗦的 Java 程式碼,真是痛不欲生,生不如死啊。支援了 lambda 的 Java 8 也許還能挽救我,但我還是鍾情 Scala。
太天真了!首先是換不了,其次是換了也沒用。你真以為換語言如換刀,寶刀在手,就能割去那些臃腫的程式碼,還程式碼一個苗條身材?——你以為是抽脂 啊!Ruby 也可以寫出爛程式碼,Java 也能寫出漂亮的程式,關鍵不在於語言。正如武林高手比武並不在於刀劍的利鈍,要分出武功高低,根本還是功力和招式。只有同等高手之間的廝殺,手握一柄利器 才能成為制勝法寶。
程式碼的臃腫關鍵還在於分解與去重。Unix 大嗎?大,而且必須大。但它又很小,因為它以核心形式確立了系統的邊界,同時遵循 KISS 原則,將大功能分解為小程式,每個小程式只能完成一個功能,任何複雜的操作都必須分解成一些基本步驟,由這些小程式逐一完成,再組合起來得到最終結果。分 解的一個難題是如何定邊界,換言之就是如何做到“高內聚、鬆耦合”。另一個難題在於組合,即該如何把這些分解的細小功能再糅合起來,形成一個整體。這也是 為何 Micro Service 被鼓吹了多少遍,仍然有人保持觀望態度的原因。
若說掌握分解這門技藝的高手中高手,還得數庖丁這哥們,“彼節者有閒,而刀刃者無厚,以無厚入有閒,恢恢乎其於遊刃必有餘地矣,是以十九年而刀刃若 新發於硎。”眼睛都修煉成了X光,能夠透過牛皮看清骨肉經絡,以至於能夠無厚入有閒,像舞蹈一般變屠牛為行為藝術,舉手投足間,瀟瀟灑灑地把牛給宰了,還 揮揮衣袖,不帶走一點血。對軟體系統的分解,我們能做到像庖丁那般識破依賴,判斷“有閒”之節者,進而做到合理解耦嗎?
去重的根本其實還是分解,粒度可以是函式、類、模組、子系統。程式設計師需要有潔癖,重複就是最大的 dirty,可惜打掃衛生需要付出。寫程式碼是件勞心勞力的事兒,總會有人偷懶的。Deadline 又是一把懸在程式設計師頭上的達摩克利斯之劍,在急迫的催促聲中,程式設計師尋找到了心裡安慰,因為時間是允許降低質量的最完美藉口。——當然,時間也是最殘忍 的。程式設計師乾的是刀口舔血的生活,出來混,遲早是要還的。程式世界,就是佛家所謂的“因果世界”啊。
去重的關鍵並不在於技巧(程式設計師都不是傻子,只要願意學,什麼技巧不能學會?),而在於勇氣和決心。重複是敵人,而且是大塊頭的敵人,它就這般隨意 地站著,勾起小指頭,傲慢地挑釁著你。而你,卻未必有戰風車的勇氣。是明知必敗嗎?還是不可戰勝?未戰先怯,這場戰爭你已經敗了。我見到的諸多遺留系統, 重複程式碼都是這樣開始蔓延的。——時間,見鬼的時間,其實大多數時候它都是你舉白旗時找來貼臉的遮羞布。
我常常說程式設計師要懶,例如要把重複的過程變成自動化,例如不要重複製造輪子,例如竭力少寫程式碼完成更多的事。可惜,我們多數時候把這種懶,用錯了地方。懶於打掃,懶於行動,卻又不計後果的吃,程式碼的體格怎麼能夠減得下來?就看著程式碼的體格一天天膨脹下去,然後嗚呼哀哉吧。
原文出處:agiledon.github.io
相關文章
- 敵人——建立敵人Rioter
- “DDoS攻擊”,線上遊戲的最大敵人之一遊戲
- 古川俊太郎講述常伴任天堂的危機感:最大的敵人源自人們的「厭倦」
- 雙十一最大的收穫,就是提前準備實在RPA機器人機器人
- JavaScript手寫程式碼無敵祕籍JavaScript
- 外掛,永無止息的敵人
- 世界上最大的程式碼庫
- 幽默:好的程式碼本身就是最好的文件 - CodeWisdom
- Steam,你的敵人是亞馬遜亞馬遜
- 就是單純的討論一下程式碼
- 無程式碼和低程式碼最大的區別是什麼?
- 《對馬島之魂》的敵人,其實是韓國人?
- 網格人為干擾度計算方法的matlab程式碼實現Matlab
- 副作用是程式設計頭號敵人!如何剝離它?- spin程式設計
- 人臉活體檢測人臉識別:眨眼+張口
- C 語言程式碼風格之 Linux 核心程式碼風格Linux
- 理解這幾張圖,你就是js小牛了JS
- Pygame - Python 遊戲程式設計入門 class3-創造出敵人GAMPython遊戲程式設計S3
- 「中高階前端面試」JavaScript手寫程式碼無敵祕籍前端面試JavaScript
- 十年老友記 | @張京:我程式設計了三十年,程式設計就是我的符號程式設計符號
- PEP 8 程式程式碼的編寫風格指南
- 2023年遊戲人最大的體驗:“做遊戲好難”遊戲
- 51ssl.com FreelSSL就是騙人的
- 張馳課堂:職場人必學技能六西格瑪管理
- 用 Pinbox 輕鬆收藏程式碼,這就是我要的收藏工具
- 程式碼如人
- 史上最大規模機器人“面相”調查:157張臉背後的人類感受機器人
- 062 網紅企業|你就是你公司最大的“吉祥物”
- .editorconfig 程式碼風格配置
- 一勞永逸,使用 PicGo + GitHub 搭建個人圖床工具PicGoGithub圖床
- 掌握這四步,月收入1萬+的自媒體人可能就是你
- 強化戰鬥體驗?當動作遊戲中的敵人設計搭載了AI遊戲AI
- 我對 coding 最大的期待,就是簡單(最近的吐槽和筆記)筆記
- SVG九宮格密碼效果程式碼SVG密碼
- 二分圖的最大匹配(匈牙利演算法)程式碼演算法
- 修改linux最大檔案控制程式碼數Linux
- 「白嫖」開源的後果就是供應鏈攻擊麼?| 編碼人聲
- Google JavaScript 程式碼風格指南GoJavaScript
- Vue 前端程式碼風格指南Vue前端