編寫軟件是一種藝術
英文原文:Writing Software is an Art
本文是我的《技術招聘和團隊建設》系列中的其中一篇,你可以在這里找到下一篇。
「計算機科學并不只是關于計算機,就像天文學并不只是關于望遠鏡一樣。」 ——Edsger Dijkstra https://zh.wikipedia.org/wiki/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6 '" kesrc="http://www.labazhou.net/2015/10/writing-software-is-an-art/#easy-footnote-bottom-1">注1
如果你靠編寫軟件謀生(或為了好玩),就問自己一個問題:你最后一次為了手頭編寫的軟件而計算大O符號注2(對 于外行而言,「大O符號」用來測量一種算法效率最差的情況)是在什么時候?現在不考慮你做過它的所有事實,而一些求職者能夠向你炫耀一個事實,他知道他的 團隊成員的復雜度是 O (n log n)。為了興趣和職業,我編寫軟件有 20 年了,我能夠對你說,對我而言,這個數字用一只手的五個手指頭就能數出來。
人們經常將計算機科學和編寫軟件等同視之,二者是相關的,但又相差甚遠。編寫軟件不只是計算機科學的實際用途,正如譜寫交響樂不只是聲學的實際用途一樣。
聲學講述聲音的物理規律,計算機科學講述算法的數學,它解釋了冒泡排序怎樣、以及為什么沒有堆排序注3效率高。這不代表軟件工程師就不需要理解計算機科學基礎,他們肯定需要理解才行。設想一下,一名作曲家不了解他的樂器會發出什么聲音,又會怎樣。他們能夠創作出音樂嗎?可能吧。他們能夠成為優秀的音樂家嗎?可能成不了。
把軟件比作交響樂
一名作曲家有一套固定的樂器,只能發出固定范圍的聲音。他們選擇哪種樂器進來,哪種樂器退出,哪種樂器成為焦點,哪種樂器漸入背景。只有這樣做,他們才能把噪音變成優雅的音樂,在情感上引起共鳴。
對于軟件的編寫,如果操作得當,也有同樣的特點。我們的樂器就是算法。我們把它們放在磁盤上、放在網絡和屏幕上。它們經過工程師的手,重新組 合、排列,使得能夠專注在原始速度、大小或時間約束、或創造出視覺上讓人愉悅的結果。即使你不是工程師,最終結果同樣是優雅的,從而在感情上引起共鳴。
檢查清單不會使你優秀
背景是黑色,確認。天空中有星星,確認。天空下有城市,確認。很多藝術都會檢查這些條條框框。但是,很多都不是《星夜》https://zh.wikipedia.org/wiki/%E6%98%9F%E5%A4%9C '" kesrc="http://www.labazhou.net/2015/10/writing-software-is-an-art/#easy-footnote-bottom-4">注4。 檢查這些條目,或許可以保證你的代碼不會做可怕的事情,但是它從來不會讓你的代碼做出偉大的事情。因為,那需要經驗和才能。你具有的才能越多(假定你保持 一定程度的謙虛,并樂于向別人學習),獲取的經驗就越多,這會讓你更優秀。僅僅具有才能,還不夠。才能像是一顆橡子,它具有長成一顆高大橡樹的潛力。經驗 是沃土、水、陽光和時間。
計算機科學是一門科學,軟件是一種藝術
如果你還沒有明白這個結論,那么這里有個黑白分明的結論。我的目的是什么呢?有兩點。首先,提醒我們這些編寫軟件的人,因為我們對開發優秀作品 充滿激情,但是或許只是為了支付賬單,仍然需要創造更多的藝術。其次,為我接下來的一些博文做準備工作,我打算寫到我的《技術招聘和團隊建設》系列中。編 寫軟件需要很多經驗和才能,意識到這一點是很重要的,就像橡子之于橡樹,你投入的越多,你得到的回報就越多。
有激情的工作(厚臉皮做廣告嘍)
我的公司「June」,正在招募激情爆棚的 IT 專家。我們讓招聘人員付費和 IT 專家溝通,在此過程中,你或許可以找到一份新工作。如果你有興趣,可以在 joinjune.com 申請。你還能在這篇博文找到更多詳情(比如,為什么招聘人員要抓住機會,和你有償溝通)。
關于我
我是 Amir Yasin,June 的 CTO 和聯合創始人。和最好的 IT 招聘人員,有償溝通。
做為開發者,我掌握了數門語言,關注高性能、可擴展性、軟件架構、以及通常的處理疑難雜癥。你可以在 Medium 上關注我,我在這里寫關于軟件工程方面的博客;我偶爾在 推ter 上說一些有趣的東西,你也可關注我;或者,瀏覽我在 GitHub 上對 FOSS 社區的貢獻。
如果你喜歡本文,請點擊推薦,我萬分感激。
注釋
- 著名計算機科學家 Edsger Dijkstra 曾經指出:“計算機科學并不只是關于計算機,就像天文學并不只是關于望遠鏡一樣。”(”Computer science is no more about computers than astronomy is about telescopes.”)設計、部署計算機和計算機系統通常被認為是非計算機科學學科的領域。例如,研究計算機硬件被看作是計算機工程的一部分,而對于 商業計算機系統的研究和部署被稱為信息技術或者信息系統。然而,現如今也越來越多地融合了各類計算機相關學科的思想。計算機科學研究也經常與其它學科交 叉,比如心理學,認知科學,語言學,數學,物理學,統計學和經濟學。https://zh.wikipedia.org/wiki/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6
- 大O符號(英語:Big O notation)是用于描述函數漸近行為的數學符號。更確切地說,它是用另一個(通常更簡單的)函數來描述一個函數數量級的漸近上界。在數學中,它一般 用來刻畫被截斷的無窮級數尤其是漸近級數的剩余項;在計算機科學中,它在分析算法復雜性的方面非常有用。 https://zh.wikipedia.org/wiki/%E5%A4%A7O%E7%AC%A6%E5%8F%B7
- 堆排序(Heapsort)是指利用堆這種數據結構所設計的一種排序算法。堆積是一個近似完全二叉樹的結構,并同時滿足堆積的性質:即子結點的鍵 值或索引總是小于(或者大于)它的父節點。https://zh.wikipedia.org/wiki/%E5%A0%86%E6%8E%92%E5 %BA%8F
- 《星夜》(荷蘭語:De sterrennacht)是荷蘭后印象派畫家文森特·梵高于 1889 年在法國圣雷米的一家精神病院里創作的一幅著名油畫,是畫家的代表作之一,現藏紐約現代藝術博物館。https://zh.wikipedia.org/wiki/%E6%98%9F%E5%A4%9C