編程是門藝術(shù)柱锹,這個說法由來已久哪自。最近在朱赟的公眾號(滴答滴答)讀到一篇文章《設(shè)計是門邏輯學(xué),然后才是美學(xué)》禁熏,文中作者漂洋過海追尋藝術(shù)壤巷,老師卻說:“設(shè)計不是藝術(shù)!”瞧毙。如果設(shè)計都不是藝術(shù)胧华,那么編程還能是藝術(shù)么寄症?
藝術(shù)
那么藝術(shù)到底是什么?我一下懵了矩动,發(fā)現(xiàn)從來沒有想過這個問題有巧,只好求助于 Google。Wikipedia 上的定義是:「藝術(shù)是具有智能思考能力的動物(目前其實(shí)只有人類吧)悲没,借由各種形式及工具借以表達(dá)其情感與意識形態(tài)篮迎,所產(chǎn)生的形態(tài)泛稱之為藝術(shù).
而上面那篇文章中老師的觀點(diǎn)是:
設(shè)計是實(shí)現(xiàn)別人的需要,藝術(shù)是自我表達(dá)的需要示姿。
和 Wikipedia 的說法相近甜橱,核心都在于表達(dá)。而目前公認(rèn)的藝術(shù)分類栈戳,包括八大藝術(shù)種類:文學(xué)岂傲,繪畫,音樂子檀,舞蹈镊掖,雕塑,建筑褂痰,戲劇亩进,電影。
它們的共性是這些都是人類自古以來的創(chuàng)造脐恩,其中最年輕的藝術(shù)門類當(dāng)屬「電影」了镐侯,其作品承載了作者的情感和意識形態(tài)。而所有被公認(rèn)的藝術(shù)門類驶冒,顯然它們最終作品呈現(xiàn)出的藝術(shù)表達(dá)形態(tài)更容易被普通人直接的感受到苟翻,直接作用于人們的視覺、聽覺和觸覺感官骗污。
關(guān)于編程是一門藝術(shù)這個概念崇猫,到底什么時候鉆入程序員的頭腦中的呢?也許來自我們在學(xué)習(xí)編程的路上需忿,很多講述編程的書籍都冠以藝術(shù)之名诅炉,比如:《UNIX編程藝術(shù)》,這是一本講述
Unix 專家們在創(chuàng)造 Unix
過程中形成的理念和文化屋厘,那么技術(shù)文化是藝術(shù)么涕烧?還有另一本程序員中的圣經(jīng)《計算機(jī)程序設(shè)計藝術(shù)》,我們都知道汗洒,卻幾乎沒讀過议纯。這是一套講述算法,并基于數(shù)學(xué)來推導(dǎo)和論證算法的基礎(chǔ)書籍溢谤,那么算法是藝術(shù)么瞻凤?
編程的直接產(chǎn)物是代碼憨攒,代碼是面向程序員的,而非普羅大眾阀参。編程的間接產(chǎn)物是信息產(chǎn)品肝集,在當(dāng)下這個信息時代,信息產(chǎn)品的形態(tài)很多樣化蛛壳,可以是你手機(jī)上的
App杏瞻,也可以是你每晚打開的電視。很可能一切和電子相關(guān)的東西炕吸,在當(dāng)下或多或少都和編程有關(guān)伐憾,但我們發(fā)現(xiàn)即使是在這些間接產(chǎn)物中勉痴,也找不出一樣可以讓我們很嚴(yán)肅的把它歸為藝術(shù)赫模。即使是神化的喬布斯時代,我們給予的最大贊譽(yù)也只是蘋果的每件產(chǎn)品都像藝術(shù)品一般蒸矛。僅僅是像瀑罗,像可以無限逼近,但畢竟還不是雏掠。
所以相對而言斩祭,編程也如設(shè)計是實(shí)現(xiàn)別人的需要,像我在這寫作倒更多是自我表達(dá)的需要了乡话。編程受限于程序語言的表達(dá)能力摧玫,是不可能達(dá)到像自然語言的表達(dá)能力的,因此編程的藝術(shù)性绑青,它的受眾也只可能是程序員們诬像。雖然面向大眾的藝術(shù),很多大眾也表示看不懂闸婴,但至少能感受坏挠,而編程藝術(shù)則是只有程序員本身才可能感受得到了。
技術(shù)
程序員的日常編程工作就是編寫代碼邪乍,完成功能降狠,實(shí)現(xiàn)別人的需要。在這個過程中不小心就還會制造一些 bug庇楞,程序員也不知道這些 bug
是怎么變出來的榜配,就像你天天在家做飯,不知道怎么廚房里就多了那么多小強(qiáng)吕晌。美食也不屬于公認(rèn)的藝術(shù)門類蛋褥,但時不時我們會聽到美食藝術(shù)的說法,這一點(diǎn)倒是和編程藝術(shù)很像聂使。但若是你在創(chuàng)造美食的過程壁拉,時不時冒出些小強(qiáng)谬俄,哪里還有去感受藝術(shù)的心思。程序員大部分時候就是在不斷的解決源源不絕弃理,生生不息的
bug溃论,這個過程與藝術(shù)無關(guān),只與技術(shù)有關(guān)痘昌,技術(shù)越練越好钥勋,bug 也就越來越少。bug 少到我們能騰出精力和心思辆苔,才能去感受編程的藝術(shù)性算灸。
編程的藝術(shù)源于技術(shù),沒有技術(shù)則藝術(shù)成了無源之水驻啤,無根之木菲驴。所以那些冠以「藝術(shù)」之名的程序書籍其實(shí)都是講的技術(shù)或者技術(shù)原則與文化。而關(guān)于編程最基礎(chǔ)的技術(shù)當(dāng)然是寫好代碼骑冗,而如何寫好代碼這件事以前看過王垠寫過的一篇長文《編程的智慧》赊瞬,其中觀點(diǎn)我都認(rèn)同,包括下面一些方面:
反復(fù)推敲代碼
寫優(yōu)雅的代碼
寫模塊化的代碼
寫可讀的代碼
寫簡單的代碼
寫直觀的代碼
寫無懈可擊的代碼
正確處理錯誤
正確處理null指針
防止過度工程
文章很長贼涩,但花點(diǎn)時間細(xì)細(xì)讀來巧涧,必有收獲,其中關(guān)于推敲代碼這點(diǎn)于我感觸最深遥倦。
看一個作家的水平谤绳,不是看他發(fā)表了多少文字,而要看他的廢紙簍里扔掉了多少袒哥。
我覺得同樣的理論適用于編程缩筛。好的程序員,他們刪掉的代碼统诺,比留下來的還要多很多歪脏。
我曾經(jīng)自己維護(hù)了一個項目,包括一些樣板代碼粮呢,稱手的小工具等等婿失。每一年我都會抽業(yè)余時間對這個工程做一次重構(gòu),一些代碼隨著技術(shù)發(fā)展而過時了啄寡,一些則被重新實(shí)現(xiàn)變得更簡潔豪硅。每年的一次回顧,對過去自己的審視挺物,對代碼的推敲都帶來新的成長懒浮,這個過程持續(xù)了大約七年。
在技術(shù)成長到了一定階段,有些程序員就會開始不滿足于僅僅實(shí)現(xiàn)別人的需要砚著,也會在代碼里嘗試自我表達(dá)次伶。最基礎(chǔ)且最明顯的表達(dá)是為代碼簽名,打上自己的標(biāo)簽稽穆,要是雷軍二十年前沒有為那段匯編代碼簽名冠王,我們今天哪里知道這會是雷軍寫的,并在這里評頭論足舌镶。但依然有很多程序員不會為自己的代碼簽名柱彻,連機(jī)器生成的代碼都會簽名說這是自動生成的,而一份沒有簽名的代碼是缺乏藝術(shù)最基本的要素「自我」的餐胀,永遠(yuǎn)停留在藝術(shù)的門檻之外哟楷。
技藝
單獨(dú)說編程藝術(shù)是不完整的,編程是從技術(shù)走向藝術(shù)否灾。編程藝術(shù)是開在枝頭的鮮花卖擅,而技術(shù)是支撐花朵的枝與根。
而在技術(shù)和藝術(shù)之間實(shí)際存在一道很高的門檻坟冲,藝術(shù)是一種自我表達(dá)磨镶,但自我表達(dá)卻未必是藝術(shù)溃蔫。關(guān)于這一點(diǎn)我們說個大家耳熟能詳?shù)娜?/p>