% 許多年前，冼鏡光先生在「微電腦時代」的專欄譯過由 Geoffrey James 所著的「The Tao of Programming」。在偶然的機會下，我發現了原文中，各章皆應該有四小節，而網路上找到的中文版，在第二章少了一個小節，經過比對後，我編輯了一份依原文調整順序的版本。後來 En-ran Zhou 在中央大學圖書館找到了該期的雜誌，經過校對，發現冼先生的譯文的確沒有第二章的第四節。基於對冼鏡光先生的景仰，於是我又重製了一次，這份版本是以當時微電腦時代所刊出之文章為對照，經過人工校對每一個字和標點符號，希望能夠達到百分之百的相同，但時間匆促，出錯在所難免，還請多多包涵指教。

% Xeon Chen (xeonchen (a) gmail.com) 甲申年冬
% 本檔案可由 http://xeonchen.org/tao/ 下載，有 .tex 和 .pdf 格式。

\documentclass[12pt]{article}
\linespread{1.0}

\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt

\usepackage{fontspec}
\setmainfont{DFPKaiShuW5-UN}

\newcommand{\cjk}[1]{#1}

\DeclareRobustCommand{\un}{\cjk{靜寂虛無篇}}
\DeclareRobustCommand{\deux}{\cjk{古之大師篇}}
\DeclareRobustCommand{\trois}{\cjk{設計篇}}
\DeclareRobustCommand{\quatre}{\cjk{寫作篇}}
\DeclareRobustCommand{\cinq}{\cjk{維護篇}}
\DeclareRobustCommand{\six}{\cjk{管理篇}}
\DeclareRobustCommand{\sept}{\cjk{公司智慧篇}}
\DeclareRobustCommand{\huit}{\cjk{硬體與軟體篇}}
\DeclareRobustCommand{\neuf}{\cjk{尾聲}}

\DeclareRobustCommand{\micro}{\cjk{微電腦時代 96/97 「Micro 隨筆」}}

\title{\cjk{程式設計之道} \footnote{\micro}}
\author{\cjk{冼鏡光}}
\date{}

\begin{document}
\maketitle

%在一個很偶然的機會中看到一本有趣的小書，它的有趣倒不是因為書名，也不是寫作的方式，而是一些可能會讓您會心一笑的語錄。這本書叫做 The Tao of Programming，作者是 Geoffrey James，他自己為這本書冠上了中文書名「程序設計之道」，也是看了這個書名才出錢買了它。這位 James 先生一直想用中國古籍上的抽象概念，把程式設計的形而上部份說出來，不過有些地方也許因為我英文修養還不夠，或者是對程式設計背後的內涵不甚了了，所以不一定能夠知道他的真意；然而，有許多部份卻是很淺顯的。正因為如此，我想透過這個專欄介紹給大家也許是件美事，所以就這樣把它譯了出來，相信對很多資深的程式員會深有同感，而入門者或許也可以透過這些語錄與寓言略窺堂奧；當然您未必會同意，如果不同意，笑笑就是了。閒話少說，言歸正傳，先看前半部：

\section{\un}
\cjk{程式員大師（以下簡稱大師）如是說：「學會從程式抓蟲子之後，就可以畢業了。」}

\subsection{}
\cjk{
\begin{itemize}
\item 寂靜虛無中有奧秘，不靜不動，乃程式之源，吾無以名之，故稱之為程式設計之道。
\item 若道至大，則作業系統至大；若作業系統至大，編譯程式亦然；若編譯程式至大，應用程式亦復如是。是故使用人大悅，世有和諧存焉。
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 程式設計之道無遠弗屆，隨晨曦微風而返。
\item 道生機器語言，機器語言生組譯程式。
\item 組譯程式生編譯程式，於是萬餘語言存焉。
\item 各語言有其目的，均表達軟體之陰陽；其在道中亦各得其所。
\item 但若能避免，就不要用 cobol 寫程式。
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 太初有道，道生時空，故時空乃程式設計之陰陽。
\item 程式員不悟道則時空永不敷使用，悟道者恆有充份時空完成目標。
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 上智程式員聞道而行之，中智程式員聞道而求之，下愚程式員聞道而笑之；
\item 若無笑聲則無道矣。
\item 至高之聲難以聽聞；
\item 前進就是後退之路；大智總是晚成；每一個完美的程式仍有 bug 。
\item 道在所有知識之外。
\end{itemize}
}

\section{\deux}
\cjk{大師如是說：「三日不寫程式則生命無趣。」}

\subsection{}
\cjk{
\begin{itemize}
\item 古程式員神秘而深奧，無以度量其思維，僅能描述其表象。
\item 像狐狸涉水般地小心； \\
像戰場老兵般地警覺；\\
像未經琢磨的木頭般地璞拙；\\
像洞中深潭地不透明。
\item 誰能指出他們心靈中的秘密？
\item 答案全在道中。
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 大師 Turing 曾經夢到他是一部電腦，醒後道：
\item 「不知是我 Turing 作夢變成機器，還是一部機器作夢變成我 Turing 。」
\item 一家大電腦公司的程式員參加軟體會議後，向他的經理報告說：「你知道其他電腦公司有些什麼程式員嗎？他們不修邊幅，頭髮長而邋遢，衣服既舊且皺，他們破壞了氣氛，而且在我簡報時老是製造噪音。」
\item 經理說：「我根本就不應該派你參加會議，這些程式員超然物外，他們把生命看成無稽、意外的結合。他們往來而無藩籬，為他們的程式而活，為什們他們一定要受社會積習的約束？
\item 他們生活在道中。」
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 生手問大師：「有一個程式員從不設計、測試程式、寫作文獻，但了解他的人都認為他是世間最好的程式員。為什麼？」
\item 大師曰：「這個程式員已充份悟道，他超越了設計的需要；系統垮了不會生氣，而無條件接受這個世界。他超越了文獻的需要，他不再計較是否有人看他的程式。他也超越了測試的需要，他的每一個程式都圓滿無缺、清澈、優雅、目的自明。
\item 真的，他已經悟道，登堂入室。」
\end{itemize}
}

\section{\trois}
\cjk{大師如是說：「到測試程式時再回頭修改設計就太遲了。」}

\subsection{}
\cjk{
\begin{itemize}
\item 曾經有人在參觀電腦展每天進門時都向警衛說：「我是個妙賊，偷東西的技巧已臻化境，先告訴你，我絕不會放過這次展覽。」
\item 這段話刺激到警衛，因為展覽場有好幾百萬元價值的儀器，所以老是盯這他，不過卻只看到這個人一個攤位接一個攤位看，哼著小曲而已。
\item 這個人出門的時侯，警衛把他帶到一邊搜身，但卻找不到什麼。
\item 第二天這個人又來了，而且教訓警衛說：「昨天我收獲不錯，不過今天會更佳。」所以警衛又更加注意他了，但是仍然沒有結果。
\item 最後一天警衛終於忍不住好奇心，問那個人：「賊大師，我給您弄得寢食難安，您是否以教我，究竟偷了些什麼？」
\item 這個人笑笑，說：「我偷的是概念。」
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 從前有一位大師專寫沒有結構化的程式，一個生手模仿他，也開始寫沒有結構化的程式。當這位生手要求大師評量進展時，大師卻批評他寫作沒有結構化的程式。大師說：「對大師適用的不一定適合生手，在能超越結構化之前，必須先悟道。」
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 某長官問程式員：「設計會計系統與作業系統，那一個比較簡單？」
\item 程式員說：「作業系統。」
\item 長官發出不相信的驚呼：「很顯然地，會計系統不如作業系統複雜」，他說。
\item 「不！」程式員回答，「在設計會計系統時，程式員是各種有不同主意的人之間的橋樑，這些主意不外乎：系統要如何作業？報表型式如何？要如何迎合稅法？……等等。反過來，作業系統卻不受外界表象的限制；在設計作業系統時，程式員尋求人與機器間最純的和諧，這就是為什麼作業系統容易設計。」
\item 長官點頭微笑稱是：「但是哪一個容易偵錯？」
\item 程式員沒有回答。
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 經理去見大師（程式員），並且告訴他一套新應用程式文件的需求規格，問道：「如果我給你五個程式員，要多久才能設計好這個系統？」
\item 大師很快回答：「一年。」
\item 「但是我們需要馬上用這個系統！如果我給你十個程式員，那要多久？」經理說。
\item 大師皺眉說：「這要兩年。」
\item 「如果我給你一百個程式員呢？」
\item 大師聳聳肩：「這個系統根本作不出來了。」
\end{itemize}
}

\section{\quatre}
\cjk{大師如是說：「寫作良好的程式本身自成天堂，寫得差的程式自身就是地獄。」}

\subsection{}
\cjk{
\begin{itemize}
\item 程式要輕靈，副程式像一串珍珠。程式的精神與意圖應始終如一，不多不少；沒有多餘的迴圈，也沒有額外的變數，既不缺少結構，也不過份笨重。
\item 程式應該追隨「最低驚訝定律」，這是什麼？
\item 簡單得很，使用人對程式的反應是驚訝的機會要愈低愈好。
\item 程式不管再複雜，應該以一個整體來作用；他應該用內部邏輯，而不是外在的表象來指導作業。
\item 如果程式不滿足這些要求，就會雜亂而易生混淆，唯一的補救就是重新寫過。
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 生手問大師：「我有一個程式，有時侯作得很好，有時侯卻不行；我一直遵行程式設計的規律，但是卻把我弄得很困擾，其理安在？」
\item 大師答曰：「因為不悟道才會如此，只有笨蛋才會期望他的同儕有合理的行為，而你卻對人類生產的機器有所期望！？計算機只模擬了決定論，只有道才十全十美。
\item 程式設計的準則還是暫時性的，只有道才會進入永恆。所以，你在開竅前必須思索道。」
\item 「但我要如何才能知道已經開竅了呢？」生手問。
\item 大師回答：「從此以後，你的程式都能夠正確執行。」
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 大師對弟子說：「不論軟體之為大為小，道在所有軟體中。」
\item 「桌上型計算機有道嗎？」弟子問。
\item 「有！」大師答。
\item 「電動玩具程式中有道嗎？」弟子繼續問。
\item 「也有！」大師說。
\item 「那個人電腦的 DOS 中有道嗎？」
\item 大師咳一下，輕輕挪動了位置，「下課」，他說。
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 皇太子的程式員正在寫作軟體，指尖在鍵盤上飛舞，程式順暢無誤地編譯完成，執行起來像陣微風輕拂而完美地結束。
\item 「了不起！」，太子嘆曰：「你的技巧無懈可擊。」
\item 「技巧？」程式員從終端機上轉過頭說：「我所信從的是道，道超越任何技巧！我開始學寫程式時，在我眼前所見是混成一片的程式；三年後，不再見到這一大片程式了，我學會使用副程式；現在，眼前一片空靈，什麼都沒有了，所有東西都進入無型式的一片靜寂，所有感覺都不必作用。
\item 我的精神可以依直覺而不必依任何計劃行事，換言之，我的程式自己寫作自己。
當然，有時會有困難的問題；我看著他們到來，我降低自已的速度，靜靜地看，改一列程式之後困難就會煙消雲散；我再重新靜靜坐著欣賞工作的歡樂。我閉上雙眼一會兒，然後關機。」
\item 皇太子說：「我的所有程式員都那麼聰明睿智嗎？」
\end{itemize}
}

%上個月我譯了上半部，這個月把它續完。下半部包含了維護、管理、公司智慧、硬體與軟體四項，內容與上個月相似，語中頗富禪味。就讓我們開始吧！

\section{\cinq}
\cjk{大師如是說：「雖然程式只有三列，但總有一天需要維護。」}

\subsection{}
\cjk{
\begin{itemize}
\item 常用的門不必上油。
\item 急流不會淤塞。
\item 聲音與思想不能在真空中傳遞。
\item 不用的軟體會生鏽。
\item 這就是至大的奧秘。
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 經理問程式員究竟要多久才能把手上的程式寫完。「明天」，程式員很快地回答。
\item 經理說：「我想你不太踏實；真的要多久？」
\item 程式員想了一會兒：「我希望在程式中加上一些東西，這至少要兩週。」程式員終於說。
\item 「時間還是長了一些」，經理堅持說：「如果你能簡單地告訴我什麼時後能寫完我才會滿意。」
\item 程式員同意這一點。
\item 幾年後經理退休了，在歡送餐會上發現那個程式員伏在終端機上睡著了，因為他寫程式寫了整夜。
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 一個生手被分派去寫一個單純的財務軟體。
\item 這個生手狂熱地做了幾天，但是當大師看他的成品時，卻發現這個程式中包含一個螢光幕編修程式，一組一般性的繪圖程式，一個人工智慧界面，但卻沒有什麼與財務方面有關。
\item 大師就問他，這個生手卻變得很激動：「不要那麼沒耐心」，他說，「我最終會把財務部份加上去。」
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 好農夫會忽視他種的穀子嗎？
\item 好老師會忽略他最差的學生嗎？
\item 好父親會容許他的孩子挨餓嗎？
\item 好程式員會拒絕維護自己的程式嗎？
\end{itemize}
}

\section{\six}
\cjk{大師如是說：「程式員要多，經理要少，生產力就會增加。」}

\subsection{}
\cjk{
\begin{itemize}
\item 經理有開不完的會的話，程式員就會寫電玩；主計部門想到利潤，發展經費就會被刪減；高級科學家談到藍藍青天，那麼青天一定會有浮雲飛過。
\item 當然，這不是程式設計之道。
\item 當經理許下承諾，程式員就不理會電玩；當主計部門有長程規劃，就會回復和諧與秩序；當高級科學家處理手上的問題，問題很快就會解決。
\item 這才是程式設計之道。
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 為什麼程式員沒有生產力？ \\
因為他們的時間都花在開會上頭。
\item 為什麼程式員難以駕御？ \\
因為管理階層干預太多。
\item 為什麼程式員一個接一個辭職？ \\
因為他們精力耗光了。
\item 在不良管理下工作，程式員不會覺得他的工作有價值。
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 某個經理快被炒魷魚了，但是他底下的一個程式員寫了一個叫好又叫座的程式；當然，這位經理因而保住了飯碗。
\item 經理打算給這位程式員一點獎勵，但他拒絕接受，並且說：「因為我覺得這是個有趣的概念，才會寫這個程式，所以我不希望有獎勵。」
\item 經理聽了之後說：「這個程式員雖然職位不高，但卻充份了解做為一個職員的責任，讓我們把他升成崇高的管理顧問吧！」
\item 在告訴程式員時，他再度拒絕，說：「我之所以存在是因為可以寫程式，如果升了我，那除了浪費每一個人的時間外而成不了事。我可以走了嗎？我還得寫程式。」
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 經理告訴程式員們說：「下面是你們的工作時間：早上九點來上班，下午五點鐘下班」。所有程式員都很生氣，有幾個馬上辭職。
\item 於是經理說：「好吧！這樣好了，只要能夠如期完工，工作時間由你們自定」。程式員現在滿意了，每天中午開始工作，直到第二天早上。
\end{itemize}
}

\section{\sept}
\cjk{大師如是說：「你可以對主管示範一個程式，但無法讓他通曉電腦。」}

\subsection{}
\cjk{
\begin{itemize}
\item 生手問大師：「遙遠東方有一個叫〝公司總部〞的偉大樹狀結構，上面滿滿地標上了些副總裁，會計長等等的圖案。它發出大量的備忘錄，每張上面都寫了『收文！』、『發文！』，沒有人知道這是什麼意義。每年都會把新的名字加到新的分枝上，但似乎全都徒勞無功。為什麼這樣一個不自然的組織還能繼續存在？」

\item 大師回答說：「你已經體認到這個龐大的結構，而被它不合理的目的困擾。不過你能不從它無休止的迴旋而得到樂趣嗎？能夠不欣賞深藏在枝葉底端毫無困難的程式設計嗎？為什麼要被他的無用而困擾呢。」
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 東方海上有大魚曰鯤，鯤能變成雙翼遮天的大鵬。當大鵬飛越陸地時帶來一道公司總部的訊息，這道訊息正好掉在一群程式員中央，然後大鵬折起雙翼乘風而歸。

\item 生手程式員瞪眼望著大鵬，因為他們不認得；中智程式員憂慮大鵬的來臨，因為他們害怕它帶來的訊息；只有大師才能繼續坐在終端機前工作，因為他不知大鵬的來去。
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 象牙塔的魔術師帶著他的最新發明去見大師，他推了一個大黑盒子走進大師的辦公室，大師正在靜靜的等著。
\item 「這是一套整合性、分散式、一般用途的工作站」，魔術師如是說，「還有一套專屬的作業系統，第六代語言，多項最先進的使用人界面，再加上人體工學的設計；這花了我的助手們好幾百人年才造出來的，不是很了不起嗎？」
\item 大師抬了下眼珠子，「的確了不起。」大師說。
\item 魔術師繼續說：「公司總部已經下令每個人都要用這台工作站做發展新軟體的基石，
您同意嗎？」
\item 「當然」，大師答，「我馬上會把它放到資訊中心去。」。於是魔術師高高興興的回到象牙塔。
\item 幾天後，一個生手在大師的辦公室裡團團轉，說：「我找不到新程式的報表，您知道會在那兒嗎？」
\item 「當然」，大師答道，「報表就堆在資訊中心裡頭的基石上！」
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 大師可以毫無憂慮的從這個程式轉入另一個程式，管理上的改變傷不到他；縱使計劃中止了，也不會被炒魷魚。為什麼？因為他充滿了道。
\end{itemize}
}

\section{\huit}
\cjk{大師如是說：「沒有風，草不會動，沒有軟體，硬體就是廢物。」}

\subsection{}
\cjk{
\begin{itemize}
\item 生手問大師：「我知道一家電腦公司比其他的大得多，高高在上就像巨人之比侏儒；它的任一部門都可以單獨成為一個企業。為什麼會這樣？」
\item 大師回答：「你為什麼問這個笨問題？這家公司就是因為它大才會這麼大。如果它只製造硬體，沒有人會買它；如果只生產軟體，沒有人會用它；如果只維護系統，人家會把它看成修理員；但是因為他把所有的合在一起，人們就把它當神一樣看待了。它根本無需競爭，因為贏來不費吹灰之力。」
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 大師有一天經過一個生手旁邊，發現生手迷上一台手掌型的電玩，「對不起」，大師說，「我可以看看它嗎？」
\item 生手停下來，並且把這台機器交給大師。大師說：「我看到這台機器玩起來有三個層次：初級、中級、高級；不過這種機器通常都有另一個層次的說法，使機器贏不了人類，而人類也勝不了機器。」
\item 「啊！大師」，生手說：「這個奇妙的開關在那裡？」
\item 大師把機器摔到地上，用腳把它踏爛。
\item 突然地，生手開竅了。
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item 從前有一位微電腦的程式員對一位來拜訪他的大型電腦程式員說：「你看，在這兒有多好！我有我自己的作業系統與檔案儲存設備，我不必與任何人共用任何電腦資源；軟體本身自給自足，而且容易使用。為什麼你不辭掉目前的工作來加入我們？」
\item 於是大型電腦的程式員就對他的朋友解釋：「大型電腦就像古之聖哲般地穩穩座落在資訊中心中央，磁碟一個接一個蔚為奇觀，軟體像鑽石般地有多種面目，像古森林般地濃密茂盛。各個程式像一片急流般地湧入系統，而這就是我在那兒工作的樂趣。」
\item 聽了這段話之後，微電腦程式員靜默無聲；但是這兩個人卻結為好友，至死不渝。
\end{itemize}
}

\subsection{}
\cjk{
\begin{itemize}
\item Hardware 與 Software 走在路上， Software 說：「你是陰我是陽，如果我們能一條心，一定會成大名賺大錢。」所以，他們就聯合在一起而想征服世界。
\item 走了一段路之後，碰到 Firmware ，穿得破破爛爛，拿著根柺杖，並且對他們說：「道在陰陽之外，靜寂不動如古井之不生波瀾；道不求名，故無人知曉其存在；道不逐利，因它圓滿無缺。道超乎時空之外。」
\item Hardware 和 Software 聽了之後倍感慚愧而打道回家。
\end{itemize}
}

\section{\neuf}
\cjk{大師如是說：「這是下課的時候了！」}

\end{document}

