編者按:很多人表示看不懂程序員的世界,當程序員告訴他們一個需求做不瞭的時候,很多人會覺得是在故意針對:" 這麼簡單的需求,哪有做不瞭的道理?" 但其實,外行就是外行,看上去簡單的需求,實現起來可能非常難。本文編譯自問答社區 quora 問題 "As a non-programmer, how can I tell whether time estimates and comments like, "we can't do that" are true/accurate?" 下的回答,作者 Stan Hanks。
普通人很難理解軟件開發的復雜程度。" 你隻是告訴計算機該做什麼,對吧?那能有多難 "?
雖然這看起來不是很難,但是 …… 電腦完全缺乏人們所描述的知識框架。拿個簡單的事情舉例," 給我一個火腿三明治 "。你可以很快地聯想到,我實際上是指 " 去廚房,做一個火腿三明治,把它帶到我面前 ",或者 " 沿著街道去熟食店,買一個火腿三明治,然後帶回來給我 ",根據我們所處的現實環境和過往經驗,你不難做出如此判斷。
場景切換到廚房,你會進一步地思考:打開冰箱,找到火腿,特定的奶酪,特定的醬料,幾片面包,接著你整理所有的東西,並把剩餘的材料放回原處。再然後,你需要找到盤子,把組合好的三明治放在盤子裡。如果你是個細致入微的人,你會發現我跳過瞭一大堆細節步驟,比如:要放多少醬,放多少片火腿,別忘瞭取下奶酪片的塑料包裝 …… 甚至更深刻的問題,怎樣才算做好一個三明治,火腿又該是什麼樣的才行 ……
作為人類,我們可以在繁復的背景和細微的生活中做出判斷,而在編寫計算機程序時,如果你跳過那些微小的步驟,計算機要麼是做錯事,要麼就是根本做不出來。
不瞭解編程的普羅大眾會向程序員發出請求:" 您可以讓這個窗口變大些嗎?"," 您能使備忘錄的文件按照字母順序排列嗎 "?直觀感受使你覺得這些事輕而易舉,那麼問題究竟是什麼呢?
問題是,負責這個任務的程序員有多重復雜性需要面對。當然,他們不會親自編寫所有的代碼,他們會使用一個數據庫(網羅其他人編寫的各種代碼,用來解決常見問題,通常是免費的)。通常情況下,這可能涉及多個庫的使用問題,因為他們之間存在著各種相關、不相關的依賴關系。
所以當你說發出請求的時候,程序員可能會想到:" 嗯,這很容易,應該存在合適的庫,而數據庫中會有需要的數據 "。他們會相當樂觀地估計出所需要的時間。
然而,隻有當他們真正開始解決問題時,一個或多個錯誤的假設便浮現出來瞭。可能是數據庫中並沒有合適的代碼,可能是他們認為可以使用的數據已經被棄用,也可能是好不容易找到的方案無法匹配當前的版本 …… 而如果核心假設都被證實是錯誤的,那麼顯然這將會困難更多。正式開始前,這些假設看起來都是有理有據,隻有當你真正著手操作,問題才開始接踵而至。
我接觸過的最優秀的程序員會在一開始就對問題進行全面的評估,經驗告訴他們,看起來再簡單的事情,平靜的海底下依然可能暗潮湧動。
而缺乏經驗的程序員往往對自己的能力充滿信心,很容易就做出肯定的答復或承諾," 是的,這個問題一周就可以解決 "。可有的時候,他們既沒有充足的預算也沒有足夠的時間。但不用太沮喪,也不用太得意,如果能有無限的時間和金錢,可能真沒有什麼是軟件開發做不出的。
編譯組出品。編輯:郝鵬程