軟體開發到底是工程還是藝術,還是科學?

做了8年開發、三年Scrum Master,對於軟體開發越發不理解了。
比如說,拿到一份需求,有人說,軟體是藝術,不能複製,需要通過經驗性的過程了解的更深入,因此給不了實際的評估。
再比如說,拿到一個項目,有人通過工程的方式,進行建模、設計,但又有人認為客戶只了解自己想要的20%的功能。
各位,請賜教


前不久看過@馮欣偉 的一篇博客程序員的四種類型,作者將程序員分為4類:

  1. 科學家,與其說他們是程序員,不如說他們是數學家;
  2. 碼農,這個辭彙來自網路上程序員的自嘲;
  3. 專家,他們在軟體行業中摸爬滾打多年,見多識廣且精於一個或多個領域;
  4. 工匠,他們是很特殊的程序員,與其他程序員關心技術本身相比,他們更關注實現的結果,他們是把科學家論文商業化的實踐者;

idem,軟體開發也可以分為4類:

  1. 科學;
  2. 搬磚;
  3. 工程;
  4. 藝術;

附上原文:

程序員的四種類型

不是每一個寫代碼的都是程序員。這裡,我把程序員定義為以編程為生的人。我認為世界上存在四類程序員:科學家、碼農、專家和工匠。下面我一一介紹自己的觀點。

科學家,與其說他們是程序員,不如說他們是數學家。他們發明了各種理論、演算法和術語,教科書上那冗長的證明和計算也出自他們之手,其他的程序員都或多或少受益於他們的成果。有時,他們的一篇論文能改變整個業界的思維方式,但他們通常不會也不喜歡把那驚世駭俗的理論商業化。相比之下,他們更喜歡沉浸在科學的象牙塔里,自得其樂,好不快活。他們是程序員中最不經常寫程序的人,甚至有一些大師一輩子都沒寫過程序,你也許認為這違反了我們開頭對程序員的定義,可誰說編程非要用鍵盤呢?

碼農,這個辭彙來自網路上程序員的自嘲。但在這裡,我把他定義為軟體的主體實現者。正如農民工兄弟一樣,他們是軟體大廈的實際締造者,他們通常熟悉或精通一到兩門語言,在現有的架構下進行開發。他們是程序員中的藍領,干著某種程度上的體力活,但這並不是什麼壞事,事情總要有人做,並且編程的自由行賦予了碼農很大的創造和學習空間。如果承認自己是個碼農並樂於所從事的工作,那也是件極其美好的事,可問題在於很多人並不是自己願意做碼農,而是被迫成為了碼農,他們本應是音樂家、運動員或者是商人,可因為種種原因成為了碼農,干著他們認為枯燥且重複的體力活,所以他們不開心,這種狀態下工作身心俱疲,也就是他們最容易發出程序員吃青春飯,三十歲以後還寫程序沒出息,應該轉管理之類的蠢話。可當他們真的成為了管理者,通常情況下,只有極少部分人找到了自己喜歡做的事,其他大部分碼農仍將繼續他們的抱怨。綜上,碼農是程序員中佔比最大的群體,他們的可塑性最高,有剛學習編程的中學生,有剛參加工作的畢業生,也有工作多年仍樂於戰鬥在第一線的資深工程師;作為碼農,首先要承認自己的身份,然後找到自己的興趣與方向,或者樂於做一輩子碼農,或者準備向其他三類程序員轉換,再或者換個行業,追尋自己最初的夢想。

專家,他們在軟體行業中摸爬滾打多年,見多識廣且精於一個或多個領域。他們在公司里通常被稱之為高級程序員,架構師或是CTO,他們通常設計軟體大廈的結構,然後安排碼農去實現,或者自己寫一些核心代碼。他們經驗豐富,具有技術前瞻性,能夠未雨綢繆,提前做出反應以應對軟體大廈腐朽的趨勢和業界的技術變化。他們性格單純,喜歡自己的工作,且薪水不菲,通過閱讀科學家的論文來保持與時代共同進步。軟體行業很特殊,對於製造業,傑出者與平庸者帶來的結果差距通常只有一到兩倍,可在軟體行業恐怕用千萬倍形容都不為過。所以專家是公司的寶貝,任何一家公司都要不懈餘力去爭取或培養專家;同時,成為專家通常也是很多碼農的終極夢想。因此,如果你是一位專家,請接受我致以的崇高敬意。

工匠,他們是很特殊的程序員,與其他程序員關心技術本身相比,他們更關注實現的結果,他們是把科學家論文商業化的實踐者。對他們而言,重要的不是技術本身,而是利用技術創造偉大的產品。因此,你很難用前端、後台、DBA、安全工程師定義他們,為了創造偉大的產品,他們願意學習任何技術,有些淺嘗而止,有些因為需要或興趣而精通無比。他們通常具有叛逆精神,本能地抵制權威,喜歡挑戰某個領域的領導者,具有傳統意義的黑客精神。他們對自己和別人都極其嚴格,具有很強的控制欲,喜歡插手編程之外與產品有關的事物,如設計、UI、市場等等;因為他們不希望因為某個環節的失誤而降低了產品的影響力,雖然他們並不總是對的。他們喜歡編程,但編程通常並不佔據生活的全部,他們一定會有一些與大眾眼中程序員氣質不符的愛好,如吹笛子,打劍道,玩音樂,繪畫,種地,旅行等等。他們特立獨行,性格倔強,工作瘋狂,只願和優秀的人合作。因為如此種種,在一般的企業中,工匠很難共事,他們總會覺得自己的才華受到了限制,周圍的人跟不上他的節奏;他們在某種意義上是公司的不穩定因素,要麼是天使,要麼是魔鬼;絕大部分的企業不需要工匠,但對偉大或立志偉大的企業而言,工匠比專家還重要,專家可以把現有的產品做到行業領先,但工匠可以創造新的產品從而改變遊戲規則。因為適合工匠的企業如此至少,他們中的有些人選擇自己創辦一個。

以上是我個人對程序員的分類,科學家、碼農、專家、工匠;每一個程序員依據技術能力,性格習慣一定會找到自己的類型,但通常或多或少都會具有其他類型的氣質,有工匠氣質的科學家,喜歡與碼農並將作戰的專家等等。對於每一位程序員,重要的不是你現在屬於哪種類型的程序員,而是找到你希望成為的那種程序員,並為之努力。每一位程序員,都會有自己的精彩。


計算機歷史上最經典的著作是什麼? The Art of Computer Programming - Donald Knuth,計算機程序設計藝術

計算機編程屬於工程和科學,不會有人反對。這個問題簡化為:計算機編程是不是一門藝術?

答案是:在當前階段,計算機編程屬於一門藝術。為什麼它是藝術,那就不得不說藝術和科學之間的歷史因緣?

有很長一段時間,science 和 art 平起平坐,他倆都表達一個意思「skill」。比如,中世紀時的 Seven Liberal Arts 也被稱作 Seven Liberal Science。 在13世紀,Duns Scotus 把 logic 稱為 「The science of sciences, the art of arts」。

到了18和19世紀,science 和 art 的關係被很多學者討論過,也致使 art 的意思發生的較大改變。如1784年 Kirwan Elem. Min. Pref.:
Previous to the year 1780, mineralogy, though tolerably understood by many as an Art, could scarce be deemed a Science.

1834年 Southey Doctor cxx. 294:
The medical profession.. was an art, in the worst sense of the word, before it became a science, and long after it pretended to be a science was little better than a craft.

John Stuart Mill 在1843年給出了被認為最好的定義(?):
Art in general consists of the truths of Science, arranged in the most convenient order for practice, instead of the order which is the most convenient for thought. Science groups and arranges its truths so as to enable us to take in at one view as much as possible of the general order of the universe.

發現什麼沒有?這時候 Art 已經被降級了,同時 Science 升級了。Science被定義為邏輯分析整理後的知識,是對知識更高層的抽象。而 Art 則是「The application of knowledge」,是因實際生活的需要而存在。這跟現代我們對 science 和 engineering的定義很接近。

Knuth也曾說「科學是我們已經能較好理解的知識。對於我們還沒能完全理解的事物,那是一門藝術所需要解決的」。

從這個角度講,人類正努力把每一門藝術都發展成一門科學。而計算機編程還在處於藝術和科學之間,類似於之前1834年對Medicine 的描述:曾經是一門藝術,在偽稱是一門科學後及真正成為一門科學前,只不過比匠藝好一點。

19世紀,人們(科學家?)普遍認為 Science 優於 Craft,而 Craft 優於 Art。不過這些年,Art 和 Craft 在人們(工程師?)心中的地位有提高,意義也隨之產生了一些變化。(儘管每一門 art 最終可能都會發展成 science,但我不認為 Science, Craft, Art 有孰優孰劣,只是思考和做事的不同方式。)

The science without the art is likely to be ineffective; the art without the science is certain to be inaccurate.
沒有藝術的科學是不起作用的;沒有科學的藝術是不準確的。

科學方法是邏輯,系統,理性,無人情味的;而藝術途徑是美學,創造力,博愛,感性的。二個看似截然不同的文化,對於計算機編程和行業發展都會有很大價值。沒有必要非得爭個歸屬,如何利用好兩個不同的文化,創造出有價值的程序和軟體才是應當去思考的。

Computer programming is an art, because it applies accumulated knowledge to the world, because it requires skill and ingenuity, and especially because it produces objects of beauty. A programmer who subconsciously views himself as an artist will enjoy what he does and will do it better。
計算機編程是一門藝術,因為它將積累的知識運用於世界,因為它需要技巧和靈性,更是因為它能製造美好的東西。一個潛意識裡把自己視為藝術家的程序員,會更喜愛他的所做,也必將做的更好。

Computer Programming as an Art
How Art Can Be Good
Zen and the Art of Motorcycle Maintenance
Great Hackers
The Two Cultures


--
Peng


藝術真是越來越寬泛了,寬泛到幾乎任何行業門類都可以把自己的行為稱為藝術創作。
鄙人對這件事情本來還有些想吐槽的心態,但轉念一想,既然你們說的「藝術」這個詞已經不是專業意義上的「藝術」了,那還有什麼好爭辯的呢?
其實這也不是什麼新鮮事情了,演講的藝術,料理的藝術,足球的藝術等等,藝術作為一個對高超技藝的形容詞,這我也是可以接受的。
但需要注意的是所有的這些技藝都不會被寫入藝術史。
無法準確的回答你的問題,但我盡量幫你排除掉「藝術」這個選項。


同英語、數學、圖畫、音樂等類似,程序語言也是是一種描述事物的「符號系統」。英語、數學、圖畫、音樂這些「符號系統」側重於表達「what is」,而程序語言側重於表達「how to」。

更重要的是,程序語言是人和機器溝通的語言,通過程序語言,人的想法生成一份「copy」,這個「copy」在計算機上運行,就將人的心智賦予了計算機,而計算機能自動運行,把人從一些心智勞動中解放出來。

至於用這個「人和機器共享」的「符號系統」來做藝術工作、工程項目、科學研究,都是可以的。所以其實CS專業是藝術、工程、還是科學,是具體工作內容決定的。

想有更具體的了解,可以去讀一讀SICP。


對大部分人來說,是種手藝。


竊以為,本質上是工程,藝術是附加品,科學是理論基礎。


題目很大,水平有限,只能說說個人感受。

說是科學顯然是過譽了,因為科學尋求的是新,是變,是不同,至於有無實用價值那是後話。

做軟體更多是成熟的技術,通用的平台,可控的流程,可預期的結果,從這個意思來說完全是工程的標準模板。

但是,哈哈,聰明的碼農怎麼甘心只當搬磚的苦力呢?為什麼資深碼農更是以一當十,老當益壯呢?是什麼讓他們玩的這麼爽呢?

他們在追尋一種隱知識,一種工匠契約,這種經驗的積累來自於日復一日不斷地讀改寫思考討論教授領悟,一次次的debug, code review, prototype design等等都在潛移默化地提升著最底層的思維能力!

平衡,優先順序,迭代,限制因素,異常情況,用戶體驗,系統性能,工具,自動化,需求控制。。。

他們把這個混搭的遊戲玩出了藝術范。。。


怒答。
《禪與摩托車維修藝術》


哪來那麼多藝術?教科書的名字就起的妥妥的叫《軟體工程》。


對有的人來說是藝術,對有的人來說是精密的系統化的工程,對有的人來說只是份工作。


有科學的部分也有工程的部分,科學的部分少爭議,因為有證明有結論,容易讓對方閉嘴,類似基於比較的排序應該怎麼做最好。各種數據結構的用法也少有爭議,因為好衡量。
不好衡量的部分屬於工程,類似泥瓦匠彈琴作詩畫畫之類,能達到的方法各種,流派更是千差萬別,光音樂就有古典民謠搖滾流行等等,不同工匠不同做法,為此會無止境的爭吵。如果哪一天出了一種好衡量的辦法也就成了科學。
因為屬於工程,又跟文藝工作者乾的事類似,所以這個領域容易出神棍,也容易有爭議,很多時候像藝術。


機器不懂美,但是操作機器的人知道什麼叫美。不能反客為主。


應該說是工程,但並不排斥藝術和科學


軟體開發過程更像一個人類進化過程,我們從遠古走來,向人類的方向發展,為了適應各種環境,我們發展出各種分支,但是都被我們拋棄,消失在歷史長河中。最後只有人類一種生物發展到我們當前的狀態。
軟體開發也一樣,我們只知道一個模糊的目標,為了一個目標進行各種嘗試,包括設計人員和開發人員還有測試人員,中間的各種小迭代,小改進,就是我們丟棄的分支。最後我們發布了一版。
但是之前拋棄的部分有價值嗎?當然有。這就好比你吃了三個包子飽了,前兩個有意義嗎?
所以嚴格來說,軟體開發和建築業肯定不能對比。我更傾向於將它比喻成一個修錶行業。你可以說是藝術,也可以說不是。我只知道這個行業聚集了大量身懷理想的人。


http://paulgraham.com/articles.html


貝爾實驗室發明C語言那群人是科學家。
至於用C語言敲代碼的,就是碼農而已。

甚至現在都不是C語言。在更先進的語言里,層層的框架、類庫來回拖拽而已。涉及到數學和底層的部分都有高級碼農幫你做了。你只要會調用就行了。
智商未必比得上那些保潔的阿姨。只是人家以為編寫網站、app是多麼高科技,,不知道現在編程這麼容易而已。

這麼分類吧:
發明C語言的,發明C#、JAVA的,是科學家。
編寫各種框架,類庫,函數的,是工程師。
調用那些框架,編寫網站、軟體、app的,是碼農。


推薦閱讀:

怎麼看待許多信息技術學科方面的大神一身戾氣的現象?
CPU 只能進行數值運算,那麼計算機是怎麼顯示出字元的?
PHP程序員:你用的是什麼代碼編輯器?為什麼?
為什麼我時不時會看到「珍惜生命,遠離 C++」?
我學編程為什麼難?是思維方式不對還是學習方式不對?

TAG:藝術 | 軟體開發 | 編程 | 科學 |