編程的樂趣與苦惱

本文是摘錄了《人月神話THE MYTHICAL MAN-MONTH》第一篇“焦油坑The Tar Pit”中的內容。【】中的內容是自己的一些想法,不好勿噴。

職業的樂趣


編程爲什麼有趣?作爲回報,它的從業者期望得到什麼樣的快樂?

  首先是一種創建事物的純粹快樂。如同小孩在玩泥巴時感到愉快一樣,成年人喜歡創建事物,特別是自己進行設計。我想這種快樂是上帝創造世界的折射,一種呈現在每片獨特、嶄新的樹葉和雪花上的喜悅。【創造絕對是生物的天性,從古至今,從自然界到人類,初期是爲了生存,之後是爲了生活乃至高質量的生活,再之後就是爲了快樂。】

  其次,快樂來自於開發對其他人有用的東西。內心深處,我們期望其他人使用我們的勞動成果,並能對他們有所幫助。從這個方面,這同小孩用粘土爲“爸爸辦公室”捏製鉛筆盒沒有本質的區別。【從我自身的角度,工作中我很喜歡寫工具類,當別人沒有選擇自己實現某個功能,而是使用我的工具類的時候,滿足感油然而生,這是不是虛榮心我不知道,但卻是聽開心的。】

  第三是整個過程體現出魔術般的力量——將相互齧合的零部件組裝在一起,看到它們精妙地運行,得到預先所希望的結果。比起彈珠遊戲或點唱機所具有的迷人魅力,程序化的計算機毫不遜色。【好幾個同事問我敲代碼有什麼意思,我都很奇怪的反問:沒意思嗎?當你把一些亂七八糟的東西組合成一個有靈魂的系統,難道不覺得自己創造了世界嗎?不神奇嗎?】

  第四是學習的樂趣,來自於這項工作的非重複特性。人們所面臨的問題,在某個或其它方面總有些不同。因而解決問題的人可以從中學習新的事物:有時是實踐上的,有時是理論上的,或者兼而有之。【這一條應該算是一種挑戰,軟件行業日新月異,總有新的技術代替舊的技術,不想再這條路上被淘汰,只能不斷的學習。可能有人(我也是)把這條當做苦惱,應該還是道行太淺。】

  最後,樂趣還來自於工作在如此易於駕馭的介質上。程序員,就像詩人一樣,幾乎僅僅工作在單純的思考中。程序員憑空地運用自己的想象,來建造自己的“城堡”。很少有這樣的介質——創造的方式如此得靈活,如此得易於精煉和重建,如此得容易實現概念上的設想。(不過我們將會看到,容易駕馭的特性也有它自己的問題。)【我一直深信,程序員是一羣很純粹的人,每天面對的是不會欺騙的電腦程序,沒有什麼勾心鬥角、爾虞我詐,團隊中講究的是精誠合作,沒有利益衝突。久而久之,自然而然就變得單純,有人說是“傻”,但我更喜歡“憨”這個字。就像郭靖,敲代碼的技術就是降龍十八掌,一招飛龍在天,一招潛龍勿用,再來一招亢龍有悔。。。】

  然而程序畢竟同詩歌不同,它是實實在在的東西;可以移動和運行,能獨立產生可見的輸出;能打印結果,繪製圖形,發出聲音,移動支架。神話和傳說中的魔術在我們的時代已變成了現實。在鍵盤上鍵入正確的咒語,屏幕會活動、變幻,顯示出前所未有的或是已經存在的事物。

  編程非常有趣,在於它不僅滿足了我們內心深處進行創造的渴望,而且還愉悅了每個人內在的情感。

職業的苦惱


然而這個過程並不全都是喜悅。我們只有事先了解一些編程固有的煩惱,這樣,當它們真的出現時,才能更加坦然地面對。

  首先,必須追求完美。因爲計算機也是以這樣的方式來變戲法:如果咒語中的一個字符、一個停頓,沒有與正確的形式一致,魔術就不會出現。(現實中,很少的人類活動要求完美,所以人類對它本來就不習慣。)實際上,我認爲學習編程的最困難部分,是將做事的方式往追求完美的方向調整。【工作中寫代碼,看到別人不良好的代碼,總是感覺不舒服,有點強迫症了,看到這條,我瞬間感覺在20年之前就有大神說出了很多程序員的行爲傾向。我們只是在追求完美,代碼的結構、效率、可讀性,每一點都做得很好,這纔是我們想要的。】

  其次,是由他人來設定目標,供給資源,提供信息。編程人員很少能控制工作環境和工作目標。用管理的術語來說,個人的權威和他所承擔的責任是不相配的。不過,似乎在所有的領域中,對要完成的工作,很少能提供與責任相一致的正式權威。而現實情況中,實際(相對於正式)的權威來自於每次任務的完成。

  對於系統編程人員而言,對其他人的依賴是一件非常痛苦的事情。他依靠其他人的程序,而往往這些程序設計得並不合理,實現拙劣,發佈不完整(沒有源代碼或測試用例),或者文檔記錄得很糟。所以,系統編程人員不得不花費時間去研究和修改,而它們在理想情況下本應該是可靠完整的。【大家都懂得,滿滿的都是心酸。。。】

  下一個煩惱——概念性設計是有趣的,但尋找瑣碎的bug卻只是一項重複性的活動。伴隨着創造性活動的,往往是枯燥沉悶的時間和艱苦的勞動。程序編制工作也不例外。另外,人們發現調試和查錯往往是線性收斂的,或者更糟糕的是,具有二次方的複雜度。結果,測試一拖再拖,尋找最後一個錯誤比第一個錯誤將花費更多的時間。【有人說程序就是改不完的bug,自己實現的功能的bug,糟糕架構引起的bug,需求的變更及其引起的bug。有時候,一個開始很好的項目,在修改bug的過程中,變成了一堆很糟糕的補丁加補丁,不得不推倒重來,就像我們組現在推倒重來的這個項目。】

  最後一個苦惱,有時也是一種無奈——當投入了大量辛苦的勞動,產品在即將完成或者終於完成的時候,卻已顯得陳舊過時。可能是同事和競爭對手已在追逐新的、更好的構思;也許替代方案不僅僅是在構思,而且已經在安排了。

  現實情況比上面所說的通常要好一些。當產品開發完成時,更優秀的新產品通常還不能投入使用,而僅僅是爲大家談論而已。另外,它同樣需要數月的開發時間。事實上,只有實際需要時,纔會用到最新的設想,因爲所實現的系統已經能滿足要求,體現了回報。

  誠然,產品開發所基於的技術在不斷地進步。一旦設計被凍結,在概念上就已經開始陳舊了。不過,實際產品需要一步一步按階段實現。實現落後與否的判斷應根據其它已有的系統,而不是未實現的概念。因此,我們所面臨的挑戰和任務是在現有的時間和有效的資源範圍內,尋找解決實際問題的切實可行方案。【其實對於這一點並沒有那麼苦惱的,一門新技術的出現到投入真正的實際生產中,中間需要很長一段時間的檢測及衆多小白鼠(我很喜歡當小白鼠)的參與,一味的追求最新技術,可能被淘汰得更快。】


  這,就是編程。一個許多人痛苦掙扎的泥沼以及一種樂趣和苦惱共存的創造性活動。對於許多人而言,其中的樂趣遠大於苦惱。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章