為神馬說寫程式是很艱難的
| 2014-09-12 14:03 收藏: 3 分享: 2
我曾經認為程式設計很容易, 但多年之後我慢慢意識到我錯了: 一份程式設計師的工作和我理解的"寫程式"是不同的。
起初我覺得程式設計無非就是命令計算機工作, 而這相對來說並不算難. 在工作了二十多年之後,我愈發覺得這實在是非常容易的事情。
定義1:程式是一種由輸入到輸出的變換。
程式設計師即是寫程式的人,程式設計即是寫程式的過程。
現在再讓我們為上面的定義加上一些限制條件。
定義2:程式是一種滿足以下條件的,由輸入到輸出的變換:
- 輸出要優雅(原文beautiful)。
- 輸入要優雅。
- 程式本身要優雅。
- 輸入文件詳盡準確。
- 程式本身的文件詳盡準確。
- 程式經歷過嚴格的測試,能夠保證正確的結果。
- 程式提供的解決方案的文件詳盡。
- 程式要解決的問題本身的文件詳盡。
當新增了這些限制之後,程式設計就變得非常困難了。對於一些特定的情況,我們可以適當放寬以上的限制條件。下面就來介紹幾種典型的情況:
不需要維護的程式
我們寫程式常常只是為了輸出。這種情況下,輸入和程式本身並不一定要考慮未來維護的問題,也不必一定要寫得那麼優雅並配備詳盡的文件。
我寫過的一本關於Erlang的書的排版程式就是這種情況。當這本書發表之後,再維護輸入和排版程式就顯得沒什麼必要了。只要輸出看起來不錯就可以了,雜亂的XML輸入檔案和測試程式不需要維護。
如果這本書再版,訂正只需要稍微更改一下輸入就可以了。即使輸入檔案沒有詳細的文件,這件事做起來也非常容易。
需要被維護的程式
需要被維護的程式剛好和上面的情況相反。輸入和程式本身要優雅,相關文件也要詳盡。
我前些天和一個寫網路應用的顧問聊天,他說只要程式的輸出了正確的結果(網站看起來沒什麼問題各種功能也能正常工作),使用者就認定這個專案已經完成了然後專案經理就把他加進下一個專案組裡。
他們不明白對於網站來講僅僅看起來OK是不夠的,也根本沒有預留時間給整理程式碼,編寫文件這些對未來網站維護有幫助的事情,下一個專案就開始了。
其他使程式設計變得困難的事
還有三件事會使程式設計變得困難:
- 處理本來不應當出現的問題。
- 沒有慢吞吞地學習新知識的時間。
- 苛刻的系統環境。
就讓我們來看看程式設計師的時間是怎樣被這些傢伙吃掉的吧。
處理本來不應當出現的問題
我經常要用一些別人編寫的軟體來解決問題,但我往往並不能夠很好地理解這些程式。
一款優秀的軟體有準確的文件告訴我如何使用它,但真實世界中的情況常常要糟糕得多:不是沒有文件就是文件寫得不準確。
文件這樣寫道:“依次執行XYZ命令,就會得到結果PQR。”而你執行XYZ之後得到的結果根本不是PQR!這種情況下你要怎麼辦?如果你足夠走運,寫這個程式的老兄就在附近,你大可以走上去掐死他;大多數人只能去Google一下試試運氣,或者試著讀一下原始碼看看能否找到答案。
利用Google搜尋一個bug的解決方案簡直像賭博一樣令人沮喪。我用Google搜尋了半天終於發現了一個倒黴蛋也遇到和我一模一樣的問題,哈哈哈哈哈。但是當我滿懷期盼地點開連結的時候。。。什麼都沒有,這個問題還沒有人解答。
為什麼這個補丁別人可以用我就不行,是因為我衰神附體了嗎?還是我所處的空間扭曲到正常人類世界的物理定律已經失效的地步?雖然這很令人沮喪,但不同的機器初始狀態會不一樣也很正常,因此能夠解決別人bug的補丁在我的機器上可能並不適用。
有時我會這樣想:要是我們都用Smalltalk程式設計,都從同樣的起始狀態開始執行就好了。Smalltalk程式設計師一定生活在一個根本不用擔心這種問題的美好的世界裡,但那也只是暫時的,當他們的程式和其他語言編寫的程式通訊的時候,他們終究會明白這個世界有多麼的殘酷。
排查程式的錯誤也是令人沮喪的,因為你並不清楚bug最後到底為什麼消失了,是因為你最後一次的改動嗎?還是因為你之前所有改動效果的總和?
問題的關鍵在於諸如此類的事情佔據了程式設計師60%到70%的時間。我曾經花了一週才讓一個出問題的LDAP伺服器重新工作了,因為老大不讓我自己寫這個伺服器。我在折騰了一週這個用C語言開發的,文件寫得很爛的破玩意之後,終於決定把老大的話拋在腦後,用中午吃飯的時間自己寫了一個Erlang的版本,問題才終於解決了。
我承認我寫的並不是一個完整的LDAP伺服器,但我也不需要一個完整的LDAP伺服器,只要其中的一些命令列可以工作就可以了,這解決起來非常容易。
現在我已經不會對實現那些古董級的協議感到興奮了,但一般說來和用別人的程式碼相比自己重新實現往往會節省更多的時間。
解決問題和學習是不同的
我是一個徹頭徹尾的懶鬼。當我想用Latex插入一個圖表的之前我不想先看完391頁文件。你當然可以指責我懶惰,我也明白照理來說我應當先把那篇熱情洋溢的文件讀完,但我只有十分鐘,根本沒法讀完那篇文件。
當我需要解決問題的時候,我需要的是快速的解決方案,這個時候過於冗長的說明文件對我我來說就是災難。
以排版程式為例,我曾經在這三款軟體面前搖擺不定:Tex/Latex,XSLT-FO,Erlguten。
差不多每三年我都會強烈地想使用postscript來寫文件,每當我有這種感覺的時候,我都會深吸一口氣,然後靜靜地等待這種感覺自己消失。
我猜詹巴蒂斯塔波多尼在1818年製作他的Manuale Tipografico (詹巴蒂斯塔波多尼的Manuale Tipografico被稱為最偉大的模式標本的書的印刷。發行追授於1818年在帕爾馬由波多尼的忠實遺孀瑪格麗特,兩卷本著作中包含的142羅馬字母琳琅滿目相應斜體,許多指令碼和異國情調的字型,以及鮮花和裝飾品驚人的集合)無人問津,可能排版一頁都要耗時一週,讓機器完成枯燥而危險的任務可以使我們解放出更多的時間
我問過我的老闆,他是否需要漂亮的幻燈片來演講。他說需要,但要我明天之前給他。這讓我沒有合適的時間來學習TeX (我猜可能需要一兩年),沒時間實現自己的排版語言(我猜需要5-10年),沒時間把它記載到附錄中,我權衡了需要時間去學習的幾個方案,最終選擇了 PowerPoint。
惡劣的程式設計環境
有些工作場所的設計使程式設計更加困難,無隔板開放式辦公室那嘈雜的環境,破壞了我們的注意力,行動電話的打擾,以及網際網路都會分散我們的注意力。
幸運的是我們還有可去的地方,那就是睡覺。很多程式設計問題是在睡覺過程中解決的。
有兩種方法:首先將考慮的問題記住,然後睡覺,第二天醒來一些問題就被解決了,So Easy;
另一種方法是睡覺前在一些論壇或者用 tweet 發個帖子,第二天已經有人將解決方法發給你了。
做一名優秀程式設計師需要很長的時間,你需要學習很多東西,當遇到問題的時候,你需要知道向誰請教。
驚人但是事實
當我完成本文檢查內容的拼寫時,但我使用emacs-ispell模式檢查拼寫,它罷工了,並顯示沒發現aspell。
我的emacs 拼寫檢查器在本地忠實的工作了好幾年。就在我抱怨生活一成不變時,它跌破我的眼鏡。
我不相信上帝有惡意,也不相信我房間裡左手沙發的物理定律和我右手的不同,但有間接證據表明正好相反。
我不明白我明明什麼都沒做,我的拼寫檢查器就出了問題。為了檢查上次文件的拼寫,我安裝一個Erlang新版本和Julia,並寫下了一些講義。
幸運的是,11分鐘如同在Google賭場工作。第二個建議性的工作:我不知道問什麼我的emacs不能找到aspell-生命太短,問題太莫名。
我猜有些事我們永遠不知道答案。
相關文章
- 深度神經網路為何很難訓練?神經網路
- 為什麼說Objective-C很難學?Object
- “機器學習還是很難用!機器學習
- mxgraph的艱難入門
- 學JAVA的艱難之路Java
- web前端入門很容易,全棧卻很難,為什麼每個程式設計師都那麼說?Web前端全棧程式設計師
- 為什麼Kubernetes的儲存如此艱難?
- 做一個很難的小程式是怎樣的體驗(一)
- 編寫開發環境很難嗎開發環境
- 阿里雲做雲端計算那麼艱難,為什麼後面其他公司很簡單就有了阿里
- 艱難前行的故事 (《夢斷程式碼》讀後感)薦
- 開源社群做點改變是很難的
- 《神經網路和深度學習》系列文章三十八:深度神經網路為何很難訓練?神經網路深度學習
- 分散式微服務為什麼很難?分散式微服務
- 內向的人很難成為群體程式設計師嗎?程式設計師
- 你的程式碼寫的很爛
- 我的 PHP 面試之路---特別艱難PHP面試
- ReactNative 到 Weex 的艱難一邁React
- 究極程式設計師跨過的艱難六步程式設計師
- “我說做小遊戲很難,那你就不做了嗎?”遊戲
- 想要成為真正優秀的程式設計師是不是真的很難?程式設計師
- 通過艱難的六步讓你成長為一名出色的程式設計師程式設計師
- 為什麼中國很難有自己的3A遊戲遊戲
- 為什麼遊戲主機的向下相容會變得如此艱難?遊戲
- 為什麼精益生產實現起來這麼難?這篇文章說的很通透
- 神馬是敏捷?(3)——敏捷在中國的水土不服敏捷
- 課時22:函式:遞迴是神馬函式遞迴
- 神馬是敏捷?(4)——敏捷不能當飯吃敏捷
- 為什麼說資料庫是Serverless最難攻堅的堡壘?資料庫Server
- 10個艱難的Java面試題與答案Java面試題
- 瞭解微服務艱難的一面微服務
- 處境艱難的 App 開發者們如何自救APP
- 這是DDD建模最難的部分(其實很簡單)
- 解析:為什麼企業很難招聘到好的Python程式設計師?Python程式設計師
- Java程式設計師須知:分散式微服務為什麼很難?Java程式設計師分散式微服務
- 為什麼許可權授權很難?- osohq
- 一個PHP開發者的艱難討薪歷程PHP
- 一次艱難的oracle資料遷移Oracle