編程的藝術門檻

編程是門藝術,這個說法由來已久。最近在朱贇的公衆號(嘀嗒嘀嗒)讀到一篇文章《設計是門邏輯學,而後纔是美學》,文中做者漂洋過海追尋藝術,老師卻說:「設計不是藝術!」。若是設計都不是藝術,那麼編程還能是藝術麼?程序員

藝術

那麼藝術究竟是什麼?我一下懵了,發現歷來沒有想過這個問題,只好求助於 Google。Wikipedia 上的定義是:「藝術是具備智能思考能力的動物(目前其實只有人類吧),藉由各類形式及工具藉以表達其情感與意識形態,所產生的形態泛稱之爲藝術。」算法

而上面那篇文章中老師的觀點是:編程

設計是實現別人的須要,藝術是自我表達的須要。設計模式

和 Wikipedia 的說法相近,核心都在於表達。而目前公認的藝術分類,包括八大藝術種類:微信

  1. 文學
  2. 繪畫
  3. 音樂
  4. 舞蹈
  5. 雕塑
  6. 建築
  7. 戲劇
  8. 電影

它們的共性是這些都是人類自古以來的創造,其中最年輕的藝術門類當屬「電影」了,其做品承載了做者的情感和意識形態。而全部被公認的藝術門類,顯然它們最終做品呈現出的藝術表達形態更容易被普通人直接的感覺到,直接做用於人們的視覺、聽覺和觸覺感官。架構

關於編程是一門藝術這個概念,到底何時鑽入程序員的頭腦中的呢?也許來自咱們在學習編程的路上,不少講述編程的書籍都冠以藝術之名,好比:《UNIX編程藝術》,這是一本講述 Unix 專家們在創造 Unix 過程當中造成的理念和文化,那麼技術文化是藝術麼?還有另外一本程序員中的聖經《計算機程序設計藝術》,咱們都知道,卻幾乎沒讀過。這是一套講述算法,並基於數學來推導和論證算法的基礎書籍,那麼算法是藝術麼?編程語言

編程的直接產物是代碼,代碼是面向程序員的,而非普羅大衆。編程的間接產物是信息產品,在當下這個信息時代,信息產品的形態不少樣化,能夠是你手機上的 App,也能夠是你每晚打開的電視。極可能一切和電子相關的東西,在當下或多或少都和編程有關,但咱們發現即便是在這些間接產物中,也找不出同樣可讓咱們很嚴肅的把它歸爲藝術。即便是神化的喬布斯時代,咱們給予的最大讚譽也只是蘋果的每件產品都像藝術品通常。僅僅是像,像能夠無限逼近,但畢竟還不是。模塊化

因此相對而言,編程也如設計是實現別人的須要,像我在這寫做倒更可能是自我表達的須要了。編程受限於程序語言的表達能力,是不可能達到像天然語言的表達能力的,所以編程的藝術性,它的受衆也只多是程序員們。雖然面向大衆的藝術,不少大衆也表示看不懂,但至少能感覺,而編程藝術則是隻有程序員自己纔可能感覺獲得了。工具

技術

程序員的平常編程工做就是編寫代碼,完成功能,實現別人的須要。在這個過程當中不當心就還會製造一些 bug,程序員也不知道這些 bug 是怎麼變出來的,就像你每天在家作飯,不知道怎麼廚房裏就多了那麼多小強。美食也不屬於公認的藝術門類,但時不時咱們會聽到美食藝術的說法,這一點卻是和編程藝術很像。但如果你在創造美食的過程,時不時冒出些小強,哪裏還有去感覺藝術的心思。程序員大部分時候就是在不斷的解決綿綿不斷,生生不息的 bug,這個過程與藝術無關,只與技術有關,技術越練越好,bug 也就愈來愈少。bug 少到咱們能騰出精力和心思,才能去感覺編程的藝術性。單元測試

編程的藝術源於技術,沒有技術則藝術成了無源之水,無根之木。因此那些冠以「藝術」之名的程序書籍其實都是講的技術或者技術原則與文化。而關於編程最基礎的技術固然是寫好代碼,而如何寫好代碼這件事之前看過王垠寫過的一篇長文《編程的智慧》,其中觀點我都認同,包括下面一些方面:

  • 反覆推敲代碼
  • 寫優雅的代碼
  • 寫模塊化的代碼
  • 寫可讀的代碼
  • 寫簡單的代碼
  • 寫直觀的代碼
  • 寫無懈可擊的代碼
  • 正確處理錯誤
  • 正確處理null指針
  • 防止過分工程

文章很長,但花點時間細細讀來,必有收穫,其中關於推敲代碼這點於我感觸最深。

看一個做家的水平,不是看他發表了多少文字,而要看他的廢紙簍裏扔掉了多少。我以爲一樣的理論適用於編程。好的程序員,他們刪掉的代碼,比留下來的還要多不少。

我曾經本身維護了一個項目,包括一些樣板代碼,稱手的小工具等等。每年我都會抽業餘時間對這個工程作一次重構,一些代碼隨着技術發展而過期了,一些則被從新實現變得更簡潔。每一年的一次回顧,對過去本身的審視,對代碼的推敲都帶來新的成長,這個過程持續了大約七年。

在技術成長到了必定階段,有些程序員就會開始不知足於僅僅實現別人的須要,也會在代碼裏嘗試自我表達。最基礎且最明顯的表達是爲代碼簽名,打上本身的標籤,要是雷軍二十年前沒有爲那段彙編代碼簽名,咱們今天哪裏知道這會是雷軍寫的,並在這裏評頭論足。但依然有不少程序員不會爲本身的代碼簽名,連機器生成的代碼都會簽名說這是自動生成的,而一份沒有簽名的代碼是缺少藝術最基本的要素「自我」的,永遠停留在藝術的門檻以外。

另外一些程序員則不止於此,好比 Redis 的做者 @Antirez,你會在 Redis 啓動控制後臺看到下面的啓動畫面,這個程序字符精心打印出來的 Logo 無關乎任何功能和別人的須要,只是做者的自我表達而已。

而另一段代碼中,單元測試經過後的輸出中每一個 case 會有一個笑臉,在調試代碼的寂寥中增長點點暖意。 

進一步迴歸到源代碼自己,代碼同時是主觀的和非主觀的。編碼非主觀的方面就包括一些建立好代碼必須遵循的「硬」規範:設計模式,項目結構,公共庫的使用等等。 雖然這些概念奠基了高質量、可維護代碼的基礎,但正是程序員間不一樣的技術與工具的細微差異,微妙的風格選擇——對齊方式、命名、空格使用、語境利用、語法高亮和IDE的選擇——真正使代碼清晰、可維護和容易理解,同時也使得代碼更好的表達了其意圖、功能和用法。

任何人均可以遵循設計模式或其餘一些「硬」規範來編寫代碼,但有藝術追求的程序員會以本身的方式來填充代碼的細節,使代碼變得清晰、簡潔、易懂。 這很重要,正如每一個人均可以從一件藝術品中體會到獨一無二的意義,無論代碼的架構和設計怎樣,每一個開發者或代碼閱讀者可能也會從代碼的命名和其餘約定習俗中推斷出不一樣的含義。

就像上面一段對得整整齊齊的代碼聲明塊,沒有語法或硬性的風格要求程序員要這樣寫。我只是以爲這樣更符合視覺感覺,更容易清晰分辨。而這一點 Poul-Henning Kamp 曾在 ACM Queue 發表文章提出了一個迷人的觀點:

不少編程語言的風格源自於 ASCII 字符集和基於打字機的終端。編程語言沒有利用現代設備的圖形屬性和選項。雖然代碼是按照清晰的英語語法格式編寫的,但它並非英文句子。事實上,它更像數學和表格。

而有時還會有些看起來明顯不符合「好」代碼規範的代碼編寫方式。

上面的代碼中, if 語句後面把多句代碼寫在了一行,但從總體上看這樣一個短小的方法,其表現形式一下就能讓閱讀者捕捉到,方法內部有四個分支,每行代碼一個分支狀況,兩種正常分支,兩種異常分支。

上面這些隨手拈來的例子,都是做者有意爲之的選擇,正是在這些微妙的我的風格選擇中,體現了做者自個人表達。

技藝

單獨說編程藝術是不完整的,編程是從技術走向藝術。編程藝術是開在枝頭的鮮花,而技術是支撐花朵的枝與根。

而在技術和藝術之間實際存在一道很高的門檻,藝術是一種自我表達,但自我表達卻未必是藝術。關於這一點咱們說個你們耳熟能詳的人——畢加索,他說:

我十多歲就能畫的像拉斐爾那麼好了。

畢加索到底有沒有說過這句話,我沒去考證,但他的做品至少說明了一些事實。拉斐爾是文藝復興時期的寫實派畫家,他的素描和油畫像是下面這樣的(圖片來自「顧爺」公衆號,一個常常談藝術頗有趣的公號)。

而畢加索十多歲時候的素描和油畫是下面這樣的。

寫實是畢加索的繪畫基礎技術,而其後期的抽象主義纔是他的藝術自我表達,二者相輔相成。

雖然,我也不太看得懂畢加索後期的抽象做品,畢加索相對於大衆的距離依然比編程相對於大衆的距離更近。編程的藝術之花也許就像花中的「滿天星」,永遠只是配角,只有追尋藝術的程序員方能感覺到滿天星所營造的那份夢境吧。

編程是完成功能,編程是解決 bug,編程是打磨技能,編程是修煉心性,最後編程才成了藝術。

寫點程序世間的文字,畫點生活瞬間的畫兒。  微信公衆號「瞬息之間」,碰見了不妨就關注看看。 

相關文章
相關標籤/搜索