轉帖|行業資訊|編輯:龔雪|2016-05-10 09:52:15.000|閱讀 564 次
概述:朗朗上口的“說法”是很容易理解也很容易記憶的,不幸,“說法”也是很容易被誤解的。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
存在的就是合理的,這句話多么熟悉,有那么多人振振有辭地引用它來證明事物的正當性,甚至硬生生造出既成事實,再用它來辯護。但是,黑格爾的本意是:“存在”(也就是“事物的本原”)必然是符合絕對精神(歷史的推動力)的。或者通俗點說,事物的本原,是有來龍去脈的因果鏈支撐的。
權力導致腐敗,絕對權力導致絕對腐敗,這也是耳熟能詳的說法。無數引用的人甚至沒有想想,“絕對腐敗”到底是什么意思。其實阿克頓勛爵從來沒說過“絕對腐敗”,原文里的 “absolutely”分明是修飾動詞的副詞,而不是修飾名詞的形容詞。他的本意是:權力天然有腐化的傾向,不受制約的權力必然會腐化。
當然,今天我想講的并不是“存在的就是合理的”或者“絕對權力導致絕對腐敗”,而是用得更常見的一個說法:我賣的是菜刀,有人拿菜刀去殺人,難道要怪我嗎?
根據生活經驗來看,這個說法相當有力,菜刀一旦賣出去就不受賣家控制,買家隨便拿它來干什么,賣家都管不著。盡管大家原本認為這把刀是把菜刀,只應該用來切菜,但這種共識并沒有硬性約束。
不過在軟件的世界里,這個說法未必行得通。軟件與機械實物不同,軟件有智能,還可以不斷升級自己的智能。依靠軟件的這種特性,軟件在開發時的約定,是可以在后續的使用中被嚴格遵守的。或者換句話說,優秀軟件工程師的作品,除了提供客戶需要的功能之外,還必須保證“客戶只能按照預先約定的方式來使用這些功能”。
不幸的是,軟件的這個特性并不為很多工程師所理解,所重視。這或許是因為現成的編程語言和工具都太強大了,超越了普通人的意識,使用的時候被巨大的快感所蒙蔽,而放棄了認真的思考。
我們經常在代碼里看到這樣的例子:接收一個參數作為角度,那么就用 int 吧;接收一段文字作為姓氏,那么就用 string 吧…… 其實 int 也好,string 也好,都只是中立的、不與任何業務場景相關聯、也不遵守任何業務約束的基本數據類型而已。
但是在具體的使用場景中,在用戶的共同認知里,“角度”和“姓氏”是有對應的顯式或隱式的契約所約束的:角度只能是 0 到 360 之間的數字,“姓氏”通常應該由1-2 個中文字符構成。
如果我們直接用 int 來承載角度,用 string 來承載姓氏,就破壞了那些顯式或隱式的契約,很可能違背用戶的共同認知,進而破壞使用場景。最簡單的,如果顯示出來的角度計只有 0 到 360 的刻度,如果用來顯示姓氏的空欄只有 4 個字符的長度,那么這個范圍之外的角度,超長的姓氏,就會造成顯示的混亂。
解決的辦法就是根據具體的應用場景,把這些顯式或隱式的契約以合適的粒度容納到軟件的世界里——角度仍然用 int 來承載,但設定時只能取值在 0 到 360 之間;姓氏仍然用 string 來承載,但設定時最長只有 2 個字符,而且這些字符必須是中文。
以上舉的是最簡單的例子,這些知識學校里一般不教,一般團隊也不會強調,因此沒有經驗的工程師常常覺得這是多此一舉,只有有經驗的工程師能夠理解其中的道理:軟件一旦開發完放出去,就不知道會在什么場景下,以什么方式來使用。為了保證預期的功能正常運行,避免出現意想不到的情況,軟件就需要盡自己所能對使用者和使用方式做出約束,保證自己所處的小環境是可控的,是符合預期的,然后才能正確運轉,否則很難預料會發生什么,也未必擔得起這個責任。再重復一遍之前的話:優秀軟件工程師的作品,除了提供客戶需要的功能之外,還必須保證“客戶只能按照預先約定的方式來使用這些功能”。
回到標題,如果你賣的是實物菜刀,或許沒辦法約束買家拿去殺人。菜刀磨得越快,殺人越容易,這個矛盾是無解的。但如果你是開發軟件的工程師,是在軟件世界里賣菜刀,只考慮把刀磨得更快是不夠的,你還得保證“菜刀”的名副其實——它真的只能“切菜”,絕不可能執行“殺人”的調用。
這篇文章的靈感來自近日和軟件工程師談類庫設計的經歷,與某著名搜索引擎的自辯詞沒有直接關系。但是,并不約束大家展開各種聯想。
本文來源:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn