NEO.K / PLDST程式語言設計師風格譜系
編號PLDST-024
版本v1.0
日期2026-07-30
作者Neo.K
狀態公開版/第四部跨設計師正式比較研究

下載 PDF ↓回到論文索引 ↗

Guido、Matz 與 Larry Wall:可讀性、幸福與多義性之間的三種人本語言設計

摘要

Guido van Rossum、Yukihiro “Matz” Matsumoto 與 Larry Wall 都曾把程式語言設計從「機器能否執行」推向「人如何使用、閱讀、感受與表達」。Python、Ruby 與 Perl 也經常被共同歸入動態語言、腳本語言、膠水語言或高生產力語言。然而,只用「三者都重視人」概括其設計,會掩蓋三套幾乎相反的人本模型。

Guido 的首要保護對象是程式的下一位讀者以及需要共同維護程式的團隊。Python 透過可見結構、相對稀疏的表面、明示慣例與「最好有一個明顯做法」壓縮等價表達空間,使不同作者的程式較容易進入共同閱讀協定。PEP 20 同時保留實用主義,但將可讀性、明示性、拒絕猜測與可解釋實作置於核心。[R1][R2][R3][R4]

Matz 的首要保護對象是正在編程的人及其持續性的認知流動。Ruby 不追求形式最小,而追求自然、和諧、可表達與「使用時感覺良好」。Matz 明確區分語言「能做什麼」與人「使用它時感覺如何」,並承認自己首先設計的是一門符合自身長期品味的語言,而不是對所有人都完美的語言。[R7][R8][R9][R10]

Wall 的首要保護對象則是背景、任務與表達習慣彼此不同的問題解決者。Perl 將自然語言的 Context、省略、冗餘、多種慣用法與高頻短形式帶入程式語言,拒絕假設所有真實問題只有一個最佳表示。其人本主義不是收斂,而是容納;不是消除方言,而是以文件、文化、工具與社群規範治理方言。[R12][R13][R14][R15][R16]

本文提出三種人本語言設計原型:

Guido:Reader-Centered Convergent HumanismMatz:Programmer-Centered Experiential HumanismWall:Pluralist Expressive Humanism\boxed{ \begin{aligned} Guido &: \text{Reader-Centered Convergent Humanism}\\ Matz &: \text{Programmer-Centered Experiential Humanism}\\ Wall &: \text{Pluralist Expressive Humanism} \end{aligned} }

三者對「自由」的理解也不同:

Python:減少不必要選擇,使共同理解更自由Ruby:移除表達摩擦,使程式設計過程更自由Perl:保留多種慣用法,使異質問題求解更自由\boxed{ \begin{aligned} Python &: \text{減少不必要選擇,使共同理解更自由}\\ Ruby &: \text{移除表達摩擦,使程式設計過程更自由}\\ Perl &: \text{保留多種慣用法,使異質問題求解更自由} \end{aligned} }

本文以十二個共同軸比較三人:

  1. 人本對象;
  2. 可讀性定義;
  3. 表達變異;
  4. 明示與隱式;
  5. 語法密度;
  6. 常見路徑;
  7. 物件與抽象;
  8. 錯誤與安全;
  9. 工具與慣例;
  10. 生態擴張;
  11. 治理;
  12. 長期複雜度配置。

核心結論是:

「以人為中心」不是一項單一價值,而是一場關於究竟保護作者、讀者、團隊、初學者、專家、領域社群或異質問題解決者的責任分配。

Python、Ruby 與 Perl 不是同一條人本語言路線上的優劣排序,而是三種不同的人類模型、三種不同的表達政治,以及三種不同的複雜度搬運方式。

關鍵詞: Guido van Rossum、Yukihiro Matsumoto、Matz、Larry Wall、Python、Ruby、Perl、人本語言設計、可讀性、程式設計者幸福、多義性、TIMTOWTDI、PLDST


第一部分 比較方法:人本並不是單一方向

一、人本語言的最低定義

本文將人本語言設計定義為:

語言設計者不只評估機器可執行性與理論表達力,也把人的學習、閱讀、撰寫、記憶、協作、感受、創造與文化差異列為一級設計成本。

這一定義不表示:

人本設計仍須回答:

Who benefits?Who pays?When is the cost paid?Who\ benefits? \qquad Who\ pays? \qquad When\ is\ the\ cost\ paid?

二、不能只問「是否友善」

「友善」至少包含不同方向:

一項設計可能同時提高其中兩項,卻降低另外三項。


三、人本對象向量

定義:

H(L)=(Hnovice,Hauthor,Hreader,Hteam,Hexpert,Hdomain,Hcommunity)\mathcal{H}(L)= ( H_{\text{novice}}, H_{\text{author}}, H_{\text{reader}}, H_{\text{team}}, H_{\text{expert}}, H_{\text{domain}}, H_{\text{community}} )

其中每一項不是主觀滿意度,而是語言對該類使用者降低或增加的實際成本。


四、人本價值向量

再定義:

VH(L)=(R,F,E,C,P,L,T)\mathcal{V}_{H}(L)= ( R, F, E, C, P, L, T )

其中:

Guido、Matz 與 Wall 都重視這些量,但排序與定義不同。


五、複雜度責任向量

語言降低使用者表面成本時,複雜度通常被搬到其他位置。

B(L)=(Bauthor,Breader,Bruntime,Bparser,Btool,Blibrary,Bgovernance)\mathcal{B}(L)= ( B_{\text{author}}, B_{\text{reader}}, B_{\text{runtime}}, B_{\text{parser}}, B_{\text{tool}}, B_{\text{library}}, B_{\text{governance}} )

因此:

HumanFriendlySurface⇏TotalComplexityHumanFriendlySurface \not\Rightarrow TotalComplexity\downarrow

更常見的是:

HumanFriendlySurfaceComplexityRelocationHumanFriendlySurface \Rightarrow ComplexityRelocation

六、本文所稱「設計者」

本文比較的是三位設計者在可直接歸因材料中反覆展現的決策風格,不把現代 Python、Ruby、Perl 的所有結果歸於個人。

需要區分:

創始設計者的原始問題
創始設計者的長期品味
核心實作者的工程選擇
社群形成的慣例
生態套件形成的事實語言
現代治理制度

PLDST 比較的是前兩者如何與後四者互動。


第二部分 共同基底:三者為何容易被放在一起

七、都不是純理論語言起步

三者的原始動機都包含真實工作:

因此三者都不是先建立封閉公理,再尋找應用。


八、都接受動態性

三者都使用動態機制降低前期宣告成本,但目的不同:

「動態語言」只是執行與型別機制分類,不能代替風格分類。


九、都接受實用性超過純度

Guido 的 Python 格言明確保留「實用性勝過純度」;Matz 拒絕為形式完美犧牲使用感;Wall 則公開反對單一理論大敘事。[R3][R9][R13]

但三者不是同一種實用主義:

Guido:Practicality under readable conventionMatz:Practicality under experiential harmonyWall:Practicality under expressive plurality\begin{aligned} Guido &: Practicality\ under\ readable\ convention\\ Matz &: Practicality\ under\ experiential\ harmony\\ Wall &: Practicality\ under\ expressive\ plurality \end{aligned}

十、都由強創始品味啟動

三者早期都不是匿名委員會設計:

這使語言具有可辨識氣質,也產生權力集中問題。


十一、都超出創始者

三種語言都形成:

因此現代語言結果不能反向全部歸因於創始者。


十二、比較的真正問題

本文不問:

Python、Ruby、Perl 哪一門最好?

而問:

當三位設計者都說自己在為人設計時,他們心中的「人」究竟是誰?


第三部分 Guido:以共同閱讀收斂表達空間

十三、首要人本對象:下一位讀者

Python 的核心不是單純「容易寫」,而是程式在離開作者之後仍容易被辨認。

PEP 8 將 Guido 的一項核心洞見概括為:

程式被閱讀的次數遠多於被撰寫的次數。[R4]

因此 Python 的人本單位不是孤立作者,而是跨時間的作者—讀者鏈。


十四、可讀性不是漂亮排版

Python 的可讀性包含:

縮排只是其中最可見的一項。


十五、明示性

PEP 20 的重要對偶為:

Explicit>ImplicitExplicit > Implicit

這不是禁止所有隱式行為。Python 仍有:

真正限制的是:

不要讓讀者必須依靠過多隱藏狀態,才能知道局部程式正在做什麼。


十六、一個明顯做法

Python 的「最好只有一個明顯做法」主要是慣例收斂原則,而非數學唯一性。

可形式化為:

Widiomatic(T)Wpossible(T)|W_{\text{idiomatic}}(T)| \ll |W_{\text{possible}}(T)|

其中:

Python 不是移除所有自由,而是縮小「正統常見路徑」集合。


十七、稀疏表面

PEP 20 偏好 Sparse 而非 Dense。

這種稀疏性讓:

代價是某些熟練作者覺得冗長或缺乏壓縮力。


十八、縮排作為共同協定

Python 以縮排表示 Block,使:

VisualStructure=ParserStructureVisualStructure = ParserStructure

這減少花括號風格分裂,卻也把空白從排版偏好提升為語法責任。[R5]

這是一種典型 Guido 風格:

讓原本由團隊 Style guide 管理的問題,進入語言本身。


十九、常見路徑塑形

Guido 的人本設計常不是禁止替代方案,而是讓一條路:

因此:

HumanismGuido=ChoiceArchitectureHumanism_{\text{Guido}} = ChoiceArchitecture

二十、逃生口仍存在

Python 仍允許:

這說明 Python 不是封閉最小語言。

Guido 的典型策略是:

常見能力保持清楚
高階能力放入可辨識的特殊區域

二十一、複雜度去向

Python 降低表面變異後,複雜度移至:

因此 Python 的「簡單」是經過制度支撐的簡單。


二十二、團隊作為設計尺度

Python 特別適合將個人程式轉成團隊程式,因為:

這不是所有領域都最佳,但它明確保護協作。


二十三、Guido 原型

本文將 Guido 的人本原型判定為:

Reader-Centered Convergent Humanist\boxed{ \text{Reader-Centered Convergent Humanist} }

其核心命題為:

使用者最大的自由,不一定來自最多語法選項,也可能來自能迅速理解別人程式的共同語言。


第四部分 Matz:以程式設計者感受調音語言

二十四、首要人本對象:正在編程的人

Matz 明確區分:

  1. 語言能做什麼;
  2. 人使用語言時感覺如何。[R9]

Ruby 的差異主要不在可計算性,而在:


二十五、自然而非簡單

Ruby 官方資料引用 Matz:

natural, not simple

並指出 Ruby 可表面簡單、內部複雜,如同人體。[R7]

這表示 Ruby 接受:

SurfaceNaturalnessInternalComplexitySurfaceNaturalness\uparrow \Rightarrow InternalComplexity\uparrow

只要內部複雜度能持續換取人類表達流暢。


二十六、幸福成本函數

可將 Matz 的設計目標寫成:

Hprogrammer=Flow+Expressiveness+Feedback+AestheticCoherenceBoilerplateMechanicalFrictionContextSwitchH_{\text{programmer}} = Flow + Expressiveness + Feedback + AestheticCoherence - Boilerplate - MechanicalFriction - ContextSwitch

「幸福」不是娛樂化,而是讓人把注意力留給問題、創造與抽象。


二十七、和諧高於完全正交

Matz 警告形式正交性可能要求使用者在腦中組合太多機制。[R9]

完全正交的設計假設:

Featurei×FeaturejFeature_i \times Feature_j

都應自由組合。

Ruby 更偏好:

Harmony(Featurei,Featurej)Harmony(Feature_i,Feature_j)

也就是功能在實際語言感中相處自然,即使不是最一般、最對稱的形式。


二十八、一切皆物件的感受價值

Ruby 的一致物件觀不只是一項範式標籤。

它讓使用者可以用相近方式理解:

這降低概念切換,增強「語言是一個可對話世界」的感受。


二十九、Block 與 Iterator

Ruby 常把:

對集合做什麼

寫成由集合接收方法,再將行為以 Block 傳入。

這使操作接近:

讓這個物件,以這段行為處理自身元素。

它不一定比所有形式更短,卻符合 Ruby 的物件—訊息—Block 節奏。


三十、適量隱式性

Ruby 接受:

這些設計提高自然性,也增加讀者必須掌握的語境。


三十一、Metaprogramming 的定位

Matz 指出動態新增方法等能力主要服務適應環境的 Library 與 Metaprogramming,而非鼓勵所有程式任意改寫自己。[R10]

因此 Ruby 的自由是:

語言提供強能力
社群以品味區分日常使用與高階使用

三十二、自由與引導

Matz 並不是取消規則,而是相信:

這是一種「調音式治理」。


三十三、複雜度去向

Ruby 的人本表面把複雜度移至:

Ruby 的自然感由大量不可見機制支撐。


三十四、設計者作為語言調音師

Guido 常像共同慣例的裁決者;Matz 更像語言感的長期調音者。

他不是只問:

此功能是否一致?

而是問:

此功能加入後,整門 Ruby 是否仍像 Ruby?

這種判斷難以完全形式化,也難由純投票取代。


三十五、Matz 原型

本文將 Matz 的人本原型判定為:

Programmer-Centered Experiential Humanist\boxed{ \text{Programmer-Centered Experiential Humanist} }

其核心命題為:

語言不只是一套正確規則,也是一種長時間停留其中的認知環境;設計者必須為人在其中的感受負責。


第五部分 Wall:以多義性容納異質問題解決者

三十六、首要人本對象:不同背景的人

Wall 不假設所有人都具有同一種自然思考方式。

Perl 面向:

其人本主義從差異開始。


三十七、問題先於語言純度

Perl 最初整合:

Wall 的起點是:

真實任務已經跨越多個工具,語言應把工作流帶回一個可操作空間。


三十八、自然語言不是仿英文

Wall 的自然語言類比主要涉及:

Perl 並不是要讓程式像普通英文,而是把人類語言的表達彈性帶入人工語言。


三十九、Context 作為語義資源

Perl 的 Scalar、List、Boolean、Void 等 Context 使同一構造能依周圍需求產生不同結果。[R15]

這降低作者重複,卻提高讀者對周圍語境的依賴。

LocalExpressionMeaning=Expression+ContextLocalExpressionMeaning = Expression + Context

四十、高頻操作壓縮

Wall 的表面常近似 Huffman coding:

SyntaxLength(operation)1Frequency(operation)SyntaxLength(operation) \propto \frac{1}{Frequency(operation)}

高頻文字處理、Regex、預設主題和管線操作可以很短。

這保護熟練作者的速度,但擴大新讀者的符號詞彙。


四十一、TIMTOWTDI

“There’s more than one way to do it” 不表示任何寫法同樣好。

其較精確形式為:

Wlegitimate(T)>1|W_{\text{legitimate}}(T)| > 1

因為:


四十二、作者自由與讀者成本

Perl 最清楚展示:

AuthorChoiceReaderVocabularyAuthorChoice\uparrow \Rightarrow ReaderVocabulary\uparrow

多種寫法讓作者更容易貼近問題,卻要求讀者辨認更多方言。

這不是意外副作用,而是多元人本主義的結構性代價。


四十三、Sigil、Regex 與預設主題

Perl 透過:

建立高密度表達。

這些機制對熟練者可形成清晰壓縮,對陌生者則可能像另一套文字系統。


四十四、文化是語言第二層

Perl 依靠:

治理語言自由。

官方 perlstyle 甚至明確提醒:既然語言提供多種方法,就應選擇最可讀的一種。[R16]


四十五、CPAN 與表達分權

CPAN 讓領域社群自行建立:

這使語言核心不必預先理解所有人類需求。

但它也可能產生:


四十六、平行重寫

當 Perl 5 歷史負擔過大時,Wall 沒有只要求永久相容,也發起 Perl 6 的社群式重設。

State of the Onion 2000 將 Perl 5 比作較由單一作曲者完成的作品,而 Perl 6 則改採社群即興與 RFC 式提案,同時保留 Wall 的藝術控制。[R17]

這顯示 Wall 的多元主義也會在更高層級重新組織。


四十七、Wall 原型

本文將 Wall 的人本原型判定為:

Pluralist Expressive Humanist\boxed{ \text{Pluralist Expressive Humanist} }

其核心命題為:

真實世界與人類背景本來就不整齊;語言若為了形式純度消除差異,可能只是把複雜度退回使用者。


第六部分 第一比較軸:他們保護的是哪一種人

四十八、Guido 保護讀者

Guido 的核心人本問題是:

一段程式離開原作者後,另一個人能否快速辨認其結構與意圖?

其保護對象偏向:


四十九、Matz 保護作者的持續感

Matz 的核心人本問題是:

人在編程時,是否被不必要的機械摩擦打斷?

其保護對象偏向:


五十、Wall 保護異質求解者

Wall 的核心人本問題是:

語言是否強迫背景不同的人,先放棄自己的問題慣用法,才能開始工作?

其保護對象偏向:


五十一、三種人類模型

Guido:Human as reader and collaboratorMatz:Human as experiencing creatorWall:Human as culturally diverse problem solver\boxed{ \begin{aligned} Guido &: Human\ as\ reader\ and\ collaborator\\ Matz &: Human\ as\ experiencing\ creator\\ Wall &: Human\ as\ culturally\ diverse\ problem\ solver \end{aligned} }

這是三者最根本差異。


第七部分 第二比較軸:可讀性究竟是什麼

五十二、Python:跨作者可預測性

Python 的可讀性主要是:

ReadabilityPython=StructuralVisibility+ConventionConvergence+LowSymbolDensity+ExplicitIntentReadability_{\text{Python}} = StructuralVisibility + ConventionConvergence + LowSymbolDensity + ExplicitIntent

它偏向公共可讀性。


五十三、Ruby:語意接近作者意圖

Ruby 的可讀性主要是:

ReadabilityRuby=NaturalFlow+ObjectMessageRhythm+ExpressiveCloseness+AestheticCoherenceReadability_{\text{Ruby}} = NaturalFlow + ObjectMessageRhythm + ExpressiveCloseness + AestheticCoherence

它偏向意圖與表面的接近。


五十四、Perl:熟練語境中的資訊壓縮

Perl 的可讀性主要可能是:

ReadabilityPerl=DomainFit+ContextualCompression+VisibleDataRole+IdiomRecognitionReadability_{\text{Perl}} = DomainFit + ContextualCompression + VisibleDataRole + IdiomRecognition

它高度依賴共享語境與專業詞彙。


五十五、可讀性不是單一標尺

一段 Perl One-liner 對熟練文字處理者可能比展開的 Python 程式更直接。

一段 Python 程式對跨背景團隊可能比高度 DSL 化 Ruby 更容易接手。

一段 Ruby DSL 對領域使用者可能比一般函式呼叫更接近問題語言。

因此:

Readability=f(Reader,Task,Context,Time)Readability = f(Reader,Task,Context,Time)

第八部分 第三比較軸:表達變異

五十六、Python:收斂

Python 傾向:

VariationSharedRecognitionVariation\downarrow \Rightarrow SharedRecognition\uparrow

它以語言、PEP、Style guide、Formatter 與社群慣例共同壓縮變異。


五十七、Ruby:受品味約束的多樣性

Ruby 容許:

但 Matz 的長期品味與 Ruby 社群慣例會排除「不像 Ruby」的設計。

因此:

VariationRuby=FreedomHarmonyVariation_{\text{Ruby}} = Freedom \cap Harmony

五十八、Perl:合法多義性

Perl 對多種寫法更寬容,並讓領域社群形成方言。

VariationPerl=ProblemDiversity+UserDiversity+HistoricalLayeringVariation_{\text{Perl}} = ProblemDiversity + UserDiversity + HistoricalLayering

其治理主要依靠 Style、文件、工具與社群,而非全部由語法消除。


五十九、三種自由

Python:從不必要差異中解放讀者
Ruby:從機械摩擦中解放作者
Perl:從單一表達模型中解放異質使用者

第九部分 第四比較軸:明示與隱式

六十、Python 的明示

Python 偏好:

但以 Protocol 保留高階動態性。


六十一、Ruby 的自然省略

Ruby 允許省略:

其判準不是「越隱式越好」,而是:

省略是否符合整體語言感,並讓意圖更直接?


六十二、Perl 的 Context 省略

Perl 更積極使用:

這使熟練者可高度壓縮,也最依賴語境。


六十三、隱式性的成本公式

Benefitimplicit=RepetitionRemoved+FlowPreserved+CommonCaseCompressedBenefit_{\text{implicit}} = RepetitionRemoved + FlowPreserved + CommonCaseCompressed Costimplicit=HiddenDependency+ReaderInference+ToolAmbiguity+DebuggingDistanceCost_{\text{implicit}} = HiddenDependency + ReaderInference + ToolAmbiguity + DebuggingDistance

三者的差異是對兩式權重不同。


第十部分 第五比較軸:語法密度與常見路徑

六十四、Python 的稀疏

Python 通常願意多寫幾個可辨識單詞,以換取:


六十五、Ruby 的節奏

Ruby 的密度介於 Python 與 Perl 的典型風格之間。

它可以:

密度服務的是流動感,而不是單純最短。


六十六、Perl 的壓縮

Perl 願意用:

壓縮高頻操作。

其表面更像專業速記系統。


六十七、最短不等於最人本

人本設計應區分:

KeystrokeCostCognitiveCostMaintenanceCostKeystrokeCost \neq CognitiveCost \neq MaintenanceCost

Python 常增加第一項以降低第三項。

Ruby 常降低第二項的摩擦感。

Perl 常降低熟練作者在高頻任務中的第一項與第二項。


第十一部分 第六比較軸:物件、抽象與 Metaprogramming

六十八、Python 的 Protocol 人本主義

Python 不要求所有抽象都由繼承完成,而以:

建立可組合行為。

但特殊能力通常以明顯命名區隔。


六十九、Ruby 的物件世界

Ruby 將物件模型提升為語言感核心:

Everything respondsProgramming as message compositionEverything\ responds \quad\Rightarrow\quad Programming\ as\ message\ composition

Block、Mixin、Open class 與 Metaprogramming 使語言可塑,但也提高 Runtime 與工具負擔。


七十、Perl 的多模型整合

Perl 不要求所有問題進入單一物件模型。

它可同時使用:

這符合 Wall 對多種局部真理的接受。


七十一、抽象的三種人本判準

Python:抽象是否容易被共同辨認?Ruby:抽象是否自然地承載意圖?Perl:抽象是否適合此問題與此社群?\begin{aligned} Python &: \text{抽象是否容易被共同辨認?}\\ Ruby &: \text{抽象是否自然地承載意圖?}\\ Perl &: \text{抽象是否適合此問題與此社群?} \end{aligned}

第十二部分 第七比較軸:錯誤、安全與責任

七十二、Python:拒絕猜測

PEP 20 強調:

Python 仍是動態語言,但錯誤哲學偏向:

當系統不能合理確定意圖時,應讓問題顯現。


七十三、Ruby:快速成形後測試

Matz 在訪談中將 Ruby 的動態性與快速測試連結,並指出 Interpreter 應保持穩健,而應用可靠性仍需測試與工程實踐。[R10]

其配置偏向:

PrototypeFast+RunEarly+TestBehaviorPrototypeFast + RunEarly + TestBehavior

而不是在語言表面強迫所有正確性證明。


七十四、Perl:自由加警告文化

Perl 提供強大能力,也以:

補充自由。

其安全責任較多由作者、團隊與文化承擔。


七十五、人本不等於無約束

三者都證明:

HumanFreedom+NoFeedback=DeferredFailureHumanFreedom + NoFeedback = DeferredFailure

真正差異在於回饋放在哪一層:


第十三部分 第八比較軸:工具、文件與生態

七十六、Python:工具放大收斂

Python 的 Style、Formatter、Linter、Type checker、Test framework 與 Packaging 共同形成:

Language+Convention+Tool=PracticalPythonLanguage + Convention + Tool = PracticalPython

工具不是外加裝飾,而是可讀性制度的一部分。


七十七、Ruby:工具補足動態可塑性

Ruby 的 Formatter、Linter、Test、RBS/Type tools、Profiler、JIT 與 Framework 慣例,負責處理語言自由造成的部分成本。

Ruby 的實際人本體驗高度依賴成熟 Library 與 Framework。


七十八、Perl:文件與 CPAN 作為第二核心

Perl 的實際語言由:

共同構成。

對 Perl 而言,文件與文化不是補充,而是多義性得以運作的必要條件。


七十九、生態不是設計者個人作品

Python 的科學計算、Ruby 的 Rails、Perl 的 CPAN 都不能全部歸於創始者。

較精確的因果鏈是:

FounderStyleAffordanceCommunitySelectionEcosystemAmplificationFounderStyle \rightarrow Affordance \rightarrow CommunitySelection \rightarrow EcosystemAmplification

創始者提供可能空間,社群決定哪些可能成為歷史現實。


第十四部分 第九比較軸:治理與創始者權力

八十、Guido:品味制度化後退出

Python 從 BDFL 逐步建立 PEP,再在 Guido 退任後轉為五人 Steering Council。PEP 13 賦予 Council 廣泛權力,同時要求盡量少直接使用,優先建立正常程序與共識。[R6]

這表示:

FounderTasteRecordedProcessElectiveGovernanceFounderTaste \rightarrow RecordedProcess \rightarrow ElectiveGovernance

八十一、Matz:長期調音中心

Ruby 的核心方向長期仍以 Matz 的語言感作重要最終參照,但:

已是多團隊成果。

PLDST 將其判定為:

創始者品味中心
+
多團隊工程實作
+
社群信任治理

而不是「Matz 單人控制全部 Ruby」。


八十二、Wall:文化權威、社群重寫與後創始制度

Perl 早期由 Wall 強烈塑形;Perl 6/Raku 開放 RFC 與多人實作;現代 Perl 又建立 Core Team 與 Steering Council 的正式治理。[R17][R18]

因此:

WallCulturalAuthorityCurrentFormalAuthorityWallCulturalAuthority \neq CurrentFormalAuthority

八十三、治理風格與語言風格一致

三人的治理史與語言哲學具有同構性:

這不是完全因果,但具有高度風格連續性。


第十五部分 複雜度配置比較

八十四、總體守恆

定義總人本成本:

CH=Cwrite+Cread+Clearn+Cdebug+Ccoordinate+Ctool+CevolveC_H = C_{\text{write}} + C_{\text{read}} + C_{\text{learn}} + C_{\text{debug}} + C_{\text{coordinate}} + C_{\text{tool}} + C_{\text{evolve}}

沒有三者中的任何一門語言把 CHC_H 降為零。


八十五、Python 的配置

Python 傾向:

CwriteslightlyCreadCcoordinateC_{\text{write}}\uparrow_{\text{slightly}} \qquad C_{\text{read}}\downarrow \qquad C_{\text{coordinate}}\downarrow

同時:

Ctool+Cgovernance+ClibraryC_{\text{tool}} + C_{\text{governance}} + C_{\text{library}} \uparrow

以維持公共一致性。


八十六、Ruby 的配置

Ruby 傾向:

Cwrite-frictionCexpressionC_{\text{write-friction}}\downarrow \qquad C_{\text{expression}}\downarrow

但:

Cruntime+Ctool+Cmetaprogram-understanding+CperformanceC_{\text{runtime}} + C_{\text{tool}} + C_{\text{metaprogram-understanding}} + C_{\text{performance}} \uparrow

八十七、Perl 的配置

Perl 傾向:

Ccommon-task-authoringCdomain-fitC_{\text{common-task-authoring}}\downarrow \qquad C_{\text{domain-fit}}\downarrow

但:

Creader-vocabulary+Ccontext-inference+Cstyle-coordination+Chistorical-layeringC_{\text{reader-vocabulary}} + C_{\text{context-inference}} + C_{\text{style-coordination}} + C_{\text{historical-layering}} \uparrow

八十八、作者—讀者不對稱

三者可放在一條作者—讀者負擔軸上,但不能簡化成單線排名。

Python:較主動限制作者表達變異,以降低陌生讀者成本
Ruby:讓作者意圖自然流出,以社群品味控制讀者成本
Perl:讓作者依任務選擇方言,以文化與專業共享承擔讀者成本

八十九、專業化梯度

人本設計還需考慮專業化。

CnoviceCexpertC_{\text{novice}} \neq C_{\text{expert}}

Perl 的高密度可能對新手昂貴,對熟練文字處理者便宜。

Ruby 的 DSL 可能對 Framework 作者複雜,對領域使用者自然。

Python 的一致表面可能對團隊便宜,對追求極端語言可塑性的專家形成限制。


九十、規模效應

nn 為:

則:

CH=CH(n)C_H = C_H(n)

某設計在小腳本中非常人本,在大型長期系統中可能需要額外制度。


第十六部分 具體語法對照的正確用途

九十一、迭代範例

Python:

for item in items:
    process(item)

Ruby:

items.each do |item|
  process(item)
end

Perl:

for my $item (@items) {
    process($item);
}

三者都清楚,不能由此簡單判定誰更人本。

真正差異在更大語境:


九十二、隱式主題範例

Perl 可使用預設主題壓縮:

while (<>) {
    chomp;
    print if /error/;
}

這對熟悉者接近文字管線,對陌生者則必須補出:

這正是作者壓縮與讀者推理的交換。


九十三、Ruby DSL 範例

Ruby 可利用省略括號、Block 與方法呼叫建立:

route "/users" do
  authorize :admin
  render :index
end

這可能對領域使用者非常自然,但其可讀性依賴:


九十四、Python 慣例範例

Python 常把 Framework 能力約束為較明示的物件、Decorator、Context manager 或函式呼叫。

這通常增加可見結構,但不代表內部沒有 Reflection 或 Dynamic dispatch。


九十五、範例不能取代歷史

幾行程式只能顯示表面。

PLDST 必須同時追蹤:


第十七部分 反例與去神話

九十六、Python 並非真的只有一種做法

Python 仍有:

因此「一個明顯做法」是核心慣例理想,不是生態事實的絕對描述。


九十七、Ruby 並非只憑主觀感覺

Matz 的品味長期受到:

約束。

「感覺」是設計證據的一類,不是唯一證據。


九十八、Perl 並非以不可讀為目標

Perl 官方 Style guide 明確重視:

TIMTOWTDI 不等於所有寫法同樣好。


九十九、人本不等於心理人格診斷

本文不主張:

PLDST 分析的是公開決策中的穩定模式,不推斷私人心理本質。


一百、語言成功不能直接證明哲學正確

Python 的廣泛採用、Ruby 的 Framework 生產力、Perl 的歷史影響,都由多種因素共同造成:

成功是證據之一,不是唯一因果證明。


一百零一、三者都有時間相位

Guido、Matz 與 Wall 的風格不是靜止標籤。

比較必須標記時間。


第十八部分 PLDST 評估矩陣

一百零二、十二軸矩陣

Guido/Python Matz/Ruby Wall/Perl
首要人本對象 讀者、團隊、未來維護者 正在編程的人、創作者 異質問題解決者、領域社群
核心價值 可讀、明示、慣例收斂 幸福、自然、和諧 實用、多義、表達自由
變異態度 壓縮正統做法集合 容許多樣,但需像 Ruby 接受多種合法慣用法
明示/隱式 偏明示 自然省略 Contextual implicitness
表面密度 稀疏 節奏化、中度壓縮 高頻短碼、可高度密集
抽象模型 Protocol 與共享慣例 物件、Block、Metaprogramming 多模型與工具整合
常見路徑 一個明顯慣用路徑 一組和諧自然路徑 多個任務適配路徑
錯誤責任 顯性錯誤、拒絕猜測 快速執行、測試、Runtime strict、Warning、文化
複雜度去向 Interpreter、Library、工具、治理 Runtime、物件模型、工具、效能 Parser、Context、讀者詞彙、文化
治理原型 BDFL→PEP→Council 創始品味+多團隊 創始文化→RFC/分流→Council
主要優勢 公共可讀與團隊協作 表達流與 DSL 創造力 異質任務整合與熟練壓縮
主要風險 慣例僵化、隱藏複雜度 Magic、工具與追蹤成本 方言、非局部理解、歷史負擔

一百零三、三種風格公式

Guido:

JG=αRreader+βCconvention+γPpracticalλVsurfaceμIhiddenJ_G = \alpha R_{\text{reader}} + \beta C_{\text{convention}} + \gamma P_{\text{practical}} - \lambda V_{\text{surface}} - \mu I_{\text{hidden}}

Matz:

JM=αFprogrammer+βNnatural+γEexpressionλFrictionμDisharmonyJ_M = \alpha F_{\text{programmer}} + \beta N_{\text{natural}} + \gamma E_{\text{expression}} - \lambda Friction - \mu Disharmony

Wall:

JW=αFittask+βPplurality+γCcontextλImpositionsingle-modelJ_W = \alpha Fit_{\text{task}} + \beta P_{\text{plurality}} + \gamma C_{\text{context}} - \lambda Imposition_{\text{single-model}}

這些是本文分析模型,不是三位設計者提出的量化公式。


一百零四、風格距離

可定義:

D(i,j)=kwkvi,kvj,kD(i,j) = \sum_k w_k \left| v_{i,k}-v_{j,k} \right|

但實際比較必須附上:

數值不能替代歷史證據。


第十九部分 對新語言設計的實際啟示

一百零五、先定義「人」

任何宣稱 Human-centered 的新語言,都應先回答:

主要保護誰?
作者還是讀者?
個人還是團隊?
初學者還是專家?
一般程式設計者還是領域使用者?
短期原型還是二十年維護?

一百零六、不要同時宣稱所有自由

新語言不能無代價地同時保證:

必須公開優先序。


一百零七、建立表達變異預算

定義:

Budgetvariation=CoreAlternatives+SyntaxAliases+ImplicitContexts+MetaprogrammingEscape+LibraryDSLBudget_{\text{variation}} = CoreAlternatives + SyntaxAliases + ImplicitContexts + MetaprogrammingEscape + LibraryDSL

若變異預算過高,需增加:


一百零八、建立人本負擔表

每項功能應記錄:

主要受益者:
主要受損者:
降低的撰寫成本:
增加的閱讀成本:
新增的 Runtime 負擔:
Tooling 是否可恢復資訊:
團隊是否需要額外慣例:
長期相容成本:

一百零九、設計共同路徑與逃生口

三人的共同教訓是:

人本語言既需要日常路徑,也需要高階逃生口。

差異在於:

新語言應明示自己的選擇。


一百一十、工具不能事後補救一切

若語言允許高隱式性、動態改寫與多種方言,Tooling 必須在設計早期介入。

否則:

LanguageFreedomToolRecovery=MaintenanceDebtLanguageFreedom - ToolRecovery = MaintenanceDebt

一百一十一、治理也是人本介面

使用者不只與語法互動,也與以下制度互動:

治理決定誰能改變語言,因此也是人本設計的一部分。


第二十部分 統一結論

一百一十二、三者不是同一條線

Guido、Matz 與 Wall 不能排列為:

最可讀 → 次可讀 → 最混亂

也不能排列為:

最理性 → 最感性 → 最自由

這些線性排序忽略了人本對象差異。


一百一十三、三種人本憲法

Guido 的憲法:

語言應限制不必要的表達分歧,使程式成為可跨作者流通的公共文本。

Matz 的憲法:

語言應承擔足夠內部複雜度,讓程式設計者保持自然、創造與持續流動。

Wall 的憲法:

語言應承認問題與人類背景的異質性,提供多種可用慣用法,再以文化、文件與工具治理自由。


一百一十四、三種複雜度政治

Guido:把選擇複雜度移出日常表面Matz:把表達摩擦移入 Runtime 與語言內部Wall:把異質性保留在語言與文化之中\boxed{ \begin{aligned} Guido &: \text{把選擇複雜度移出日常表面}\\ Matz &: \text{把表達摩擦移入 Runtime 與語言內部}\\ Wall &: \text{把異質性保留在語言與文化之中} \end{aligned} }

一百一十五、三種自由的不可合併性

Python 式自由:

Freedomshared understandingFreedom_{\text{shared understanding}}

Ruby 式自由:

Freedomcreative flowFreedom_{\text{creative flow}}

Perl 式自由:

Freedomplural expressionFreedom_{\text{plural expression}}

三者可以混合,但混合時必須支付交互成本。


一百一十六、最終 PLDST 判定

Guido van Rossum:Reader-Centered Convergent HumanistYukihiro Matsumoto:Programmer-Centered Experiential HumanistLarry Wall:Pluralist Expressive Humanist\boxed{ \begin{aligned} Guido\ van\ Rossum &: \text{Reader-Centered Convergent Humanist}\\ Yukihiro\ Matsumoto &: \text{Programmer-Centered Experiential Humanist}\\ Larry\ Wall &: \text{Pluralist Expressive Humanist} \end{aligned} }

一百一十七、本文最後命題

程式語言的「人本性」不在於是否讓人感到容易,而在於它是否誠實說明:它正在替哪一種人降低哪一種成本,又把代價交給誰。

Guido、Matz 與 Wall 的重要性,不只是創造 Python、Ruby 與 Perl。

他們共同證明:

HumanCenteredLanguageDesign=HumanModel+BurdenAllocation+ExpressionPolitics+Governance\boxed{ HumanCenteredLanguageDesign = HumanModel + BurdenAllocation + ExpressionPolitics + Governance }

只有把這四項同時展開,PLDST 才能超越人物傳記與語言功能比較,進入可重複使用的設計方法。


附錄 A PLDST 比較卡

比較組:Guido van Rossum/Yukihiro Matsumoto/Larry Wall
主要語言:Python/Ruby/Perl
共同類型:動態、高階、腳本/一般用途、開源社群語言

共同命題:
把人類使用成本提升為語言設計的一級問題

Guido:
主要人本對象=讀者與團隊
主要策略=明示、稀疏、慣例收斂、共同路徑
複雜度去向=Interpreter、Library、Tooling、PEP
主要風險=慣例僵化、表面簡單掩蓋底層複雜

Matz:
主要人本對象=正在編程的人
主要策略=自然、和諧、Block、物件、Metaprogramming
複雜度去向=Runtime、Object model、Tooling、效能工程
主要風險=Magic、追蹤困難、團隊 Style 分裂

Wall:
主要人本對象=異質問題解決者
主要策略=Context、TIMTOWTDI、Regex、Sigil、文化
複雜度去向=Parser、Reader vocabulary、文件、社群
主要風險=方言、非局部理解、歷史層累積

核心比較:
Python=收斂型人本
Ruby=體驗型人本
Perl=多元型人本

歸因信心:高

附錄 B 設計決策語料

人物 問題 決策 主要受益者 複雜度去向 PLDST 標記
Guido 視覺與語法 Block 可能不一致 縮排成為語法 讀者、團隊 Parser、格式責任 G-R
Guido 等價做法過多 明顯慣用路徑 維護者、初學者 Style、治理 G-C
Guido 動態語言仍需系統接入 C Extension/Protocol 應用作者 Interpreter、邊界 G-P
Matz 語言能做事但使用感差 幸福與自然性優先 作者 Runtime M-H
Matz 完全正交增加腦內組合 和諧高於正交 一般使用者 設計者裁決 M-A
Matz 樣板打斷意圖 Block、省略、DSL 作者、領域使用者 Tooling、追蹤 M-F
Wall Unix 工具碎片化 Perl 整合工作流 系統與文字工作者 Interpreter W-U
Wall 不同問題需要不同慣用法 TIMTOWTDI 異質使用者 Reader、Style W-M
Wall 常見文字操作過長 Regex、Context、預設主題 熟練作者 Parser、讀者詞彙 W-C
Wall 歷史負擔難以局部修補 Perl 6/Raku 平行重設 未來社群 多實作、分流 W-R

附錄 C 來源與參考文獻

[R1] Guido van Rossum, “Foreword for Programming Python,” Python.org, 1996.
— Python 起源、ABC 後繼、Unix/C 使用者、創始哲學。

[R2] Guido van Rossum, “Comparing Python to Other Languages,” Python.org, 1997.
— Python 可讀/可維護表面、與 Perl、Smalltalk、C++ 等比較;官方標記為歷史材料。

[R3] Tim Peters, “PEP 20 – The Zen of Python,” Python Enhancement Proposals.
— 明示、簡單、稀疏、可讀、實用、拒絕猜測與明顯做法。

[R4] Guido van Rossum, Barry Warsaw, Alyssa Coghlan, “PEP 8 – Style Guide for Python Code.”
— 程式閱讀高於撰寫、跨 Python 程式的一致可讀性。

[R5] Python Documentation, “Design and History FAQ.”
— 縮排、self、方法/函式等設計理由。

[R6] Python Enhancement Proposals, “PEP 13 – Python Language Governance.”
— Steering Council、權力、共識、選舉及後 BDFL 治理。

[R7] Ruby-lang.org, “About Ruby.”
— 語言來源、Careful balance、Natural not simple、表面簡單而內部複雜。

[R8] Ruby-lang.org, “Official Ruby FAQ.”
— 1993 年起源、物件導向腳本目標、Perl/Python 背景及多作者文件。

[R9] Bill Venners, “The Philosophy of Ruby: A Conversation with Yukihiro Matsumoto, Part I,” Artima, 2003.
— 使用感、無完美語言、正交性風險、自由與引導、人本優先。

[R10] Bill Venners, “Dynamic Productivity with Ruby: A Conversation with Yukihiro Matsumoto, Part II,” Artima, 2003.
— Metaprogramming、Mixin、動態生產力、Runtime 與測試責任。

[R11] Ruby-lang.org, “Ruby From Other Languages,” including Python/Perl transition guides.
— Ruby、Python、Perl 的表面與物件慣例對照。

[R12] Perl official documentation, perlhist.
— Perl 發布歷史、多作者維護與長期共同體演化。

[R13] Larry Wall, “Perl, the First Postmodern Computer Language,” Perl.com, 1999.
— 多來源重組、使用者創造力、反單一理論與後現代實用主義。

[R14] Larry Wall, “The Culture of Perl,” Perl Conference keynote, 1997.
— Perl 文化、矛盾價值、創始者比喻與共同體。

[R15] Perl official documentation, perldata, perlsyn, perlop.
— Scalar/List context、自由格式、資料角色與實際語義。

[R16] Perl official documentation, perlstyle.
— 多種做法下的可讀、可理解、可維護、strictwarnings

[R17] Larry Wall, “State of the Onion 2000,” Perl.com.
— Perl 6 社群設計、RFC、創始者藝術控制與實作分工。

[R18] Perl official documentation, perlgov and perlpolicy.
— Core Team、Steering Council、治理邊界及正式權力配置。

[R19] PLDST-017, Guido van Rossum:可讀性、實用主義與 BDFL 裁決.
— 本系列前置個案研究。

[R20] PLDST-018, Yukihiro Matsumoto:程式設計者幸福、語言自然性與社群信任.
— 本系列前置個案研究。

[R21] PLDST-019, Larry Wall:語言多義性、後現代實用主義與社群文化.
— 本系列前置個案研究。

資料查核日期: 2026-07-30。


附錄 D PLDST 比較標記

[G-R] Guido: reader-centered readability
[G-C] Guido: convention convergence
[G-E] Guido: explicitness
[G-P] Guido: pragmatic escape hatch
[G-G] Guido: governance institutionalization

[M-H] Matz: programmer happiness
[M-N] Matz: naturalness
[M-A] Matz: harmony over orthogonality
[M-F] Matz: flow-preserving expression
[M-T] Matz: taste-centered governance

[W-U] Wall: Unix problem integration
[W-C] Wall: context-sensitive expression
[W-M] Wall: multiple legitimate idioms
[W-P] Wall: postmodern pragmatism
[W-K] Wall: culture as governance
[W-R] Wall: parallel rewrite

[C-H] comparative human model
[C-B] burden allocation
[C-V] variation politics
[C-R] reader-author asymmetry
[C-G] governance continuity

附錄 E 第二輪史實、概念與比較校對紀錄

E.1 PEP 20 的作者歸因

PEP 20 作者是 Tim Peters,文件表示其內容濃縮 BDFL 的 Python 設計原則。

因此本文採用:

格言文本作者:Tim Peters
被濃縮的設計風格:Guido/Python 傳統

不把 PEP 20 誤寫為 Guido 親自起草。


E.2 Python 的「一種做法」不是絕對唯一

第二輪核對 PEP 20、PEP 8 與 Python 實際語言能力後,本文將其限定為:


E.3 Matz 的「最小驚訝」邊界

Matz 在第一手訪談中指出,不同人具有不同驚訝來源,Ruby 無法滿足所有背景的既有直覺。

因此本文不把 Ruby 寫成:

符合每個人的直覺

而寫成:

在理解 Ruby 整體品味後,局部設計應維持自然與和諧

E.4 Ruby 的內部複雜不是缺陷承認

Ruby 官方「表面簡單、內部複雜」不是說內部品質可以混亂,而是承認:

可承擔較多機制,以降低程式設計者表面摩擦。


E.5 Wall 的多義性不是無確定語義

Perl 可以有:

但每一段可執行程式仍需由 Parser 與 Runtime 決定精確行為。

因此:

LinguisticPolysemyUndefinedSemanticsLinguisticPolysemy \neq UndefinedSemantics

E.6 TIMTOWTDI 與 Perl Style

第二輪核對 perlstyle

所以本文沒有把 TIMTOWTDI 解釋成反對 Coding standard。


E.7 Perl 6 的社群設計仍有 Wall 裁決

State of the Onion 2000 同時包含:

因此 Perl 6 既不是 Wall 單人設計,也不是所有 RFC 直接民主加入。


E.8 現代治理分離

截至查核日:

本文已分開:

FounderInfluenceSoleCurrentControlFounderInfluence \neq SoleCurrentControl

E.9 「人本」不是道德優越排序

本文的三種 Humanism 是分析原型,不表示:

每種風格只在特定人類模型與條件下成立。


E.10 PLDST 推論邊界

下列名稱是本文提出的比較原型,不是三位設計者自稱的正式學派:

Reader-Centered Convergent Humanist
Programmer-Centered Experiential Humanist
Pluralist Expressive Humanist

其用途是建立可重複比較的設計風格索引。


附錄 F 與下一篇的銜接

PLDST-024 比較的是三種人本語言設計:

讀者收斂
程式設計者體驗
異質表達多元

PLDST-025 將轉向另一組更基礎的問題:

當設計者把計算理解為函數、符號操作、資料轉換或極簡值模型時,語言的「簡單性」究竟指什麼?

下一篇預定為:

PLDST-025:Backus、McCarthy 與 Hickey——函數、符號與簡單性的不同道路。