讓工程成為我的方言

我有一個夢,是讓工程語言成為我的方言。

最近聽了Jeremy 學習深度學習的分享,他說他當時天天熱切地打開深度學習的教科書,學到做夢也會夢到梯度下降法(Gradient descent)。我聽到的時候,心想,怎麼會這麼不公平,為什麼他的腦袋可以夢到梯度下降法,我的腦袋閒暇時間只會自動生成炮仔聲這種肥皂劇呢?為什麼它不會無聊時告訴我,我們來複習一下泰勒級數的公式(Taylor Series)吧!

於是我開始遐想,如何讓工程不單單只是知識或是技術,而成為我的一部份。因此,我就在閒暇時間問我的腦袋,我們來想想剛剛學到了什麼工程知識吧!沒想到腦袋想了兩秒,就說「太累了!」,然後自動進入睡眠模式。在觀察之後,我發現兩件事:

  1. 我的腦袋只有在問題解不開的時候才願意思考,通常是有 bug 的時候。
  2. 我的腦袋是懶惰的,只想做簡單的事情。因為編故事容易、思考難,所以閒暇時間當然只編故事。

那我有沒有可能擴展我對工程的既定印象,讓他不只是演算法與技術問題,融合更多的故事和想像力呢?

舉個例子來說,當我在學 CORS 的時候,這是一個網路的解釋版本:

Cross-Origin Resource Sharing (CORS) is an HTTP-header based mechanism that allows a server to indicate any origins (domain, scheme, or port) other than its own from which a browser should permit loading resources. CORS also relies on a mechanism by which browsers make a “preflight” request to the server hosting the cross-origin resource, in order to check that the server will permit the actual request. In that preflight, the browser sends headers that indicate the HTTP method and headers that will be used in the actual request.

Cross-Origin Resource Sharing、server、mechanism 是公殺毀,難怪我的腦袋閒暇的時候不願意想這件事情。那讓我把這個概念編成一個故事給你聽。

你想像 CORS 是一個許可通行證。想像你和小明住在兩個不同的房子,然後你想去找小明聊天。如果你到他家的時候,就直接打開他家的家門,那也太沒有禮貌了吧!你總是得先知道小明有沒有空,想不想和你說話。於是,你該做的事情有兩件:

  1. 敲敲小明的家門,看看人家現在能不能和你說話
  2. 如果小明說好,那再把你心中的話告訴他

以工程語言的角度來看,你和小明都是網站。如果你想和小明要一些資料,你就開先有禮貌地敲敲他家的家門,這就叫做 CORS 中的 preflight request。

通常,他們家還會有個看門的,叫做 OPTIONS,告訴你你是不是允許和小明說話(看看你有沒有符合訪客規定!)如果你有拿到許可,你就可以和小明要你想要的資訊,或是把你心中的話告訴他。

如果以更詳細的方式解釋,看門的還可以決定小明的訪客規範。

  • 訪客需要先登記嗎?Access-Control-Allow-Origin: Specifies which origin(s) are allowed.
  • 什麼要的談話方式是被允許的?你只能聽小明說還是你也可以傳話給小明?
  • Access-Control-Allow-Methods: Lists the HTTP methods that are allowed.
  • 怎麼樣的談話資訊格式是核可的?Access-Control-Allow-Headers: Indicates which headers can be used in the actual request. (JSON, plain text …)

雖然如果單純只看這些程式句法,確實陌生又可怕,但若仔細深究,就會發現他們的命名是有道理的。Access-Control-Allow-Origin 代表允許的資訊來源,Access-Control-Allow-Methods 代表交流的方式,而 Access-Control-Allow-Headers (較不直覺)表示可以傳送的額外資訊。

當然,要我的腦袋想和小明聊天的故事,比想 CORS 等技術名詞容易多了!

在學會學習工程不應該只想程式函數與寫作句法,應該更廣泛的學習一門科技的設計理念和問題背景後,我開始重新想像工程的學習,不應該只侷限於演算法、邏輯、與問題解決的方式,更應該廣闊的接納它蜘蛛網絲般環環相扣的故事與人類設計的精巧手藝,它可是一個老祖宗精心設計的思考方式和語言呢!

譬如說,我們被迫接納電腦的運作方式就是 0 和 1 ,這不是很奇怪嗎?誰會這麼想呢?但如果你閱讀 The Dream Machine,了解資訊理論的創始人 Shannon 的創作背景,就會不禁啞然失笑。他當時是個沒沒無問得研究生,只是發現電流的開開關關,好像邏輯系統裡的 0 和 1,覺得好玩,於是就用他寫了一篇論文 A Symbolic Analysis of Relay and Switching Circuits,大家剛看到這篇論文時,也沒想太多,覺得他真有創意,當他當時拿這電路板進辦公室玩的時候,同事們都覺得他在玩玩具!但這個想法卻拓展人類的想像,成為電腦運作方式的開端。

我注意到身邊有些工程師因為他們擁有的知識而有特別的優越感。有人告訴我:「我哪來的美國時間和新人花三十分鐘解釋 OLTP 和 OLAP 的差別!」這些技術名詞聽來可怕,但如果願意稍微花點時間研究一下,就會發現他談的只是資料庫隨著時代需求的演進罷了,和其他知識沒有太大的差別,就也是一門學問。我想,我們社會給工程很多既定印象,像是「工程是個神秘的,聰明人才能學的領域」或者是「工程師都有社交障礙」等,都是有礙學習的,畢竟這些印象,也只是社會訴說的一個故事,我們可以自主地去決定要不要相信它。

對於哪個要用軟體的激辯,應該要像是辯論哪間麵包店出爐的可頌更好吃,學習工程的想像也不應該侷限於一個穿著帽 T ,把自己鎖在陰暗的地下室前面,盯著一堆電腦螢幕的黑客,對於工程學習的想像,應該要是個創作的過程、藝術的想像、和日常生活的細碎變化。

有時,我會在工程裡會遇見沒看過的新單字,聽不懂那些外國人到底在饒舌些什麼;

有時,學工程是寫一首七言絕句,我得鑽研如何寫出平仄相對的格律;

有時,學工程像是練習投籃,要不斷複習怎麼從不同角度都可以進洞;

有時,學工程像是拼拼圖,我得找到下一個最符合色調的方塊;

有時,學工程像是看一個犯罪現場,我是個辦案的偵探;

有時,學工程像是聽一則上古時代的傳說,我聆聽先人的缺失與智慧;

我始終相信,唯有我們能夠屏棄社會不斷告訴我們的故事,我們才能以重新創造我們對工程的想像與理解,讓工程成為我們的方言,成為我們呼吸心跳的一部分。

原文:Engineering as a language of mine

--

--