編程是門藝術,這個說法由來已久。最近在朱贇的公衆號(滴答滴答)讀到一篇文章《設計是門邏輯學,而後纔是美學》,文中做者漂洋過海追尋藝術,老師卻說:「設計不是藝術!」。若是設計都不是藝術,那麼編程還能是藝術麼?程序員
那麼藝術究竟是什麼?我一下懵了,發現歷來沒有想過這個問題,只好求助於 Google。Wikipedia 上的定義是:「藝術是具備智能思考能力的動物(目前其實只有人類吧),藉由各類形式及工具藉以表達其情感與意識形態,所產生的形態泛稱之爲藝術.算法
而上面那篇文章中老師的觀點是:編程
設計是實現別人的須要,藝術是自我表達的須要。模塊化
和 Wikipedia 的說法相近,核心都在於表達。而目前公認的藝術分類,包括八大藝術種類:文學,繪畫,音樂,舞蹈,雕塑,建築,戲劇,電影。工具
它們的共性是這些都是人類自古以來的創造,其中最年輕的藝術門類當屬「電影」了,其做品承載了做者的情感和意識形態。而全部被公認的藝術門類,顯然它們最終做品呈現出的藝術表達形態更容易被普通人直接的感覺到,直接做用於人們的視覺、聽覺和觸覺感官。學習
關於編程是一門藝術這個概念,到底何時鑽入程序員的頭腦中的呢?也許來自咱們在學習編程的路上,不少講述編程的書籍都冠以藝術之名,好比:《UNIX編程藝術》,這是一本講述 Unix 專家們在創造 Unix 過程當中造成的理念和文化,那麼技術文化是藝術麼?還有另外一本程序員中的聖經《計算機程序設計藝術》,咱們都知道,卻幾乎沒讀過。這是一套講述算法,並基於數學來推導和論證算法的基礎書籍,那麼算法是藝術麼?spa
編程的直接產物是代碼,代碼是面向程序員的,而非普羅大衆。編程的間接產物是信息產品,在當下這個信息時代,信息產品的形態不少樣化,能夠是你手機上的 App,也能夠是你每晚打開的電視。極可能一切和電子相關的東西,在當下或多或少都和編程有關,但咱們發現即便是在這些間接產物中,也找不出同樣可讓咱們很嚴肅的把它歸爲藝術。即便是神化的喬布斯時代,咱們給予的最大讚譽也只是蘋果的每件產品都像藝術品通常。僅僅是像,像能夠無限逼近,但畢竟還不是。設計
因此相對而言,編程也如設計是實現別人的須要,像我在這寫做倒更可能是自我表達的須要了。編程受限於程序語言的表達能力,是不可能達到像天然語言的表達能力的,所以編程的藝術性,它的受衆也只多是程序員們。雖然面向大衆的藝術,不少大衆也表示看不懂,但至少能感覺,而編程藝術則是隻有程序員自己纔可能感覺獲得了。指針
程序員的平常編程工做就是編寫代碼,完成功能,實現別人的須要。在這個過程當中不當心就還會製造一些 bug,程序員也不知道這些 bug 是怎麼變出來的,就像你每天在家作飯,不知道怎麼廚房裏就多了那麼多小強。美食也不屬於公認的藝術門類,但時不時咱們會聽到美食藝術的說法,這一點卻是和編程藝術很像。但如果你在創造美食的過程,時不時冒出些小強,哪裏還有去感覺藝術的心思。程序員大部分時候就是在不斷的解決綿綿不斷,生生不息的 bug,這個過程與藝術無關,只與技術有關,技術越練越好,bug 也就愈來愈少。bug 少到咱們能騰出精力和心思,才能去感覺編程的藝術性。ip
編程的藝術源於技術,沒有技術則藝術成了無源之水,無根之木。因此那些冠以「藝術」之名的程序書籍其實都是講的技術或者技術原則與文化。而關於編程最基礎的技術固然是寫好代碼,而如何寫好代碼這件事之前看過王垠寫過的一篇長文《編程的智慧》,其中觀點我都認同,包括下面一些方面:
反覆推敲代碼
寫優雅的代碼
寫模塊化的代碼
寫可讀的代碼
寫簡單的代碼
寫直觀的代碼
寫無懈可擊的代碼
正確處理錯誤
正確處理null指針
防止過分工程
文章很長,但花點時間細細讀來,必有收穫,其中關於推敲代碼這點於我感觸最深。
看一個做家的水平,不是看他發表了多少文字,而要看他的廢紙簍裏扔掉了多少。
我以爲一樣的理論適用於編程。好的程序員,他們刪掉的代碼,比留下來的還要多不少。
我曾經本身維護了一個項目,包括一些樣板代碼,稱手的小工具等等。每年我都會抽業餘時間對這個工程作一次重構,一些代碼隨着技術發展而過期了,一些則被從新實現變得更簡潔。每一年的一次回顧,對過去本身的審視,對代碼的推敲都帶來新的成長,這個過程持續了大約七年。
在技術成長到了必定階段,有些程序員就會開始不知足於僅僅實現別人的須要,也會在代碼裏嘗試自我表達。最基礎且最明顯的表達是爲代碼簽名,打上本身的標籤,要是雷軍二十年前沒有爲那段彙編代碼簽名,咱們今天哪裏知道這會是雷軍寫的,並在這裏評頭論足。但依然有不少程序員不會爲本身的代碼簽名,連機器生成的代碼都會簽名說這是自動生成的,而一份沒有簽名的代碼是缺少藝術最基本的要素「自我」的,永遠停留在藝術的門檻以外。
單獨說編程藝術是不完整的,編程是從技術走向藝術。編程藝術是開在枝頭的鮮花,而技術是支撐花朵的枝與根。
而在技術和藝術之間實際存在一道很高的門檻,藝術是一種自我表達,但自我表達卻未必是藝術。關於這一點咱們說個你們耳熟能詳的人