軟件開發(fā)的硬約束
在超市結(jié)帳的時(shí)候,收銀員都會(huì)給我們打一張小票。有時(shí)候同樣的商品我們會(huì)買兩三件,打印在小票上面,有時(shí)候只有1行記錄,數(shù)量是3,但也有時(shí)候有3行記錄,數(shù)量都是1。這個(gè)現(xiàn)象很有意思,為什麼不統(tǒng)一呢?而且據(jù)我觀察,后一種情況明顯更多。分明是前一種做法更節(jié)省紙張,為什么更少采用呢?
我曾經(jīng)設(shè)想,是因?yàn)槭浙y的機(jī)器性能太差,內(nèi)存很少,只能維護(hù)簡(jiǎn)單的數(shù)組結(jié)構(gòu),不能維護(hù)集合,也不能每添加一樣商品就去重新掃描一次數(shù)組做修改。但是繼續(xù)觀察就會(huì)發(fā)現(xiàn),這個(gè)說(shuō)法站不住腳——現(xiàn)代的收銀機(jī)性能足夠很好了,甚至手機(jī)的性能都在突飛猛進(jìn)。那么這么做的原因到底在哪里呢?就在我百思不得其解之際,一個(gè)偶然的機(jī)會(huì)解開了我的疑惑。
當(dāng)時(shí),我們要開發(fā)一套收貨管理系統(tǒng)。為了節(jié)省紙張,也為了追求“程序的美”,我決定選擇了“單行多件記錄”的做法,也就是“1行記錄,數(shù)量為3”,因?yàn)橛布男阅苁蔷b綽有余的。程序開發(fā)完成之后,測(cè)試完全沒有問題,一切非常順利。但是實(shí)際應(yīng)用之后,倉(cāng)庫(kù)的同事卻對(duì)這點(diǎn)非常不滿意,強(qiáng)烈要求每一行只對(duì)應(yīng)一件貨物,多件同樣貨物就必須有多條記錄。好嘛,正好有機(jī)會(huì)看看原因何在了。
到實(shí)地一看,我瞬間就明白了,多件商品歸到一行記錄有什么問題。首先,大家已經(jīng)習(xí)慣了拿一件貨掃描一次,對(duì)應(yīng)的清單上就需要打印一行記錄,以確認(rèn)掃描完成。當(dāng)然我們可以說(shuō),用別的方式提示也可以,比如屏幕閃動(dòng),或者發(fā)出聲音。但是,掃描生成的清單,還會(huì)被下一道工序的員工使用。對(duì)著清單處理貨物時(shí),他當(dāng)然希望每點(diǎn)一件貨,就直接從清單上劃掉一行;如果這一行對(duì)應(yīng)著超過(guò)一件商品,他就只能在旁邊寫“正”字來(lái)計(jì)數(shù),效率自然大大降低(如果你仔細(xì)觀察飯店服務(wù)員的上菜過(guò)程,也會(huì)發(fā)現(xiàn)這點(diǎn),只是很少有人會(huì)把某個(gè)菜點(diǎn)兩份)。
這點(diǎn)發(fā)現(xiàn)對(duì)我的觸動(dòng)很大。大概因?yàn)槲议L(zhǎng)期以來(lái)做的都是“純”軟件產(chǎn)品,所以雖然也要考慮劃分邊界,區(qū)隔責(zé)任,設(shè)計(jì)架構(gòu),但這些都是“軟”的,沒有什么“硬”的約束:一項(xiàng)功能、一種責(zé)任放在這里還是那里,固然有架構(gòu)的考慮,但如果實(shí)在要修改,通常也不會(huì)有太大的問題,所以即便只從邏輯和美的角度來(lái)考慮也沒有什么問題。最典型的消息傳遞,既可以用“推”也可以用“拉”,一般場(chǎng)景下都不會(huì)有大的區(qū)別。但是,現(xiàn)實(shí)世界里的很多問題就不是這樣簡(jiǎn)單了。限于設(shè)備和場(chǎng)景,某些時(shí)候就只能“拉”不能“推”。比如某些移動(dòng)設(shè)備會(huì)受到功耗的限制,所以“推”當(dāng)然好于“拉”。如在這樣的“硬”限制面前,如果我們只把自己關(guān)在辦公室里閉門造車,即便程序?qū)懙迷俸?,架?gòu)再漂亮,都不算真正解決了問題。
不要以為只有軟件受到環(huán)境的“硬”約束的情況,有時(shí)候,環(huán)境也會(huì)受到軟件的“硬”約束。如果你留意過(guò)產(chǎn)品的說(shuō)明書,往往會(huì)發(fā)現(xiàn)很多產(chǎn)品提供的都是多語(yǔ)言說(shuō)明書,本來(lái)說(shuō)明的文字不需要太多篇幅,每種語(yǔ)言的版本都印上去,說(shuō)明書的成本就高了很多倍。而實(shí)際上,產(chǎn)品的目的市場(chǎng)(目的語(yǔ)言)幾乎是確定的,那為什么還需要浪費(fèi)成本去做多語(yǔ)言說(shuō)明書呢?
直到在工廠實(shí)地參觀了生產(chǎn)線,我才真正明白原因在哪:軟件是可以自由分隔和組合的,生產(chǎn)線卻做不到。依照現(xiàn)實(shí)情況,大多數(shù)加工廠的所用生產(chǎn)管理系統(tǒng)只能支持“單一原料表、單一工序,生產(chǎn)單一產(chǎn)品”。如果銷往不同目的市場(chǎng)的產(chǎn)品,本體相同,只有說(shuō)明書不同,生產(chǎn)管理系統(tǒng)并不能把“放入說(shuō)明書”的環(huán)節(jié)作為變量獨(dú)立出來(lái),塞到生產(chǎn)流程的“模板”中,實(shí)現(xiàn)“本體生產(chǎn)工藝相同,包裝所用說(shuō)明書不同”。即便生產(chǎn)系統(tǒng)能支持,生產(chǎn)流水線也無(wú)法這樣安排,因?yàn)檎麠l流水線的工位組合是固定的。沒錯(cuò),先進(jìn)的生產(chǎn)管理系統(tǒng)和生產(chǎn)線可以支持這種“模板+變量”的模式,但實(shí)現(xiàn)它的成本太高了。
所以,如果不用多語(yǔ)言說(shuō)明書,只能為不同的市場(chǎng)配備不同的生產(chǎn)流程(硬拷貝),這樣其中某個(gè)工藝需要變化,則所有的生產(chǎn)流程都需要變化,牽一發(fā)而動(dòng)全身,代價(jià)太高。所以只能退而求其次,干脆多花點(diǎn)成本,把***的變量——說(shuō)明書——印成多語(yǔ)言的,雖然看起來(lái)浪費(fèi),卻是最經(jīng)濟(jì)最省事的做法。
這類問題看來(lái)很簡(jiǎn)單,我仍然認(rèn)為值得花篇幅來(lái)談,是因?yàn)槲野l(fā)現(xiàn),隨著互聯(lián)網(wǎng)尤其是移動(dòng)互聯(lián)網(wǎng)的發(fā)展,軟件越來(lái)越多地參與到生活的方方面面,也越來(lái)越多地會(huì)受到現(xiàn)實(shí)的“硬”約束。在以前,軟件開發(fā)更像一門獨(dú)立的學(xué)問,所以大家都必須學(xué)習(xí)如何“使用軟件”,軟件開發(fā)人員則享有隨意“改來(lái)改去”的權(quán) 力。但如今,軟件既然是“軟”的,就應(yīng)當(dāng)像水那樣,沒有固定的形態(tài),卻可以滲入現(xiàn)實(shí)世界的各個(gè)角落——很多時(shí)候,決定軟件價(jià)值的不再是高深的技術(shù),復(fù)雜的架構(gòu),而是能不能融洽地與現(xiàn)實(shí)相處。身為軟件開發(fā)人員,我們需要反復(fù)問自己到底要解決什么問題,究竟會(huì)受到什么限制,然后提出直指問題核心的解決方案。在這方面,我也遇到過(guò)讓我印象深刻的例子。
在快遞包裹的收貨工位,收貨員需要做的是稱量包裹的重量,并掃描上面的條碼。電子秤和掃描槍都已經(jīng)連接到電腦,正常流程下光標(biāo)會(huì)自動(dòng)移動(dòng),不需要人工干預(yù)。但有時(shí)出現(xiàn)異常情況,還是需要取消、回退、確認(rèn)等操作。按照常見的解決思路,一個(gè)鍵盤或者至少小鍵盤是必須的。結(jié)果不但多配了一臺(tái)設(shè)備,操作員還需要轉(zhuǎn)移雙手操作多個(gè)設(shè)備。后來(lái)我所在團(tuán)隊(duì)的成員給了個(gè)很巧妙的解決方案:把常見的取消、回退、確認(rèn)等操作約定為一段操作碼,以條碼打印出來(lái)貼在操作臺(tái)上,操作員手不用離開掃描槍,就可以完成所有工作:掃這個(gè)條碼,是取消;掃那個(gè)條碼,是回退;掃另外一個(gè)條碼,就是確認(rèn)……
我必須承認(rèn),雖然我之前也做了很多年軟件開發(fā),解決過(guò)不少問題,但面對(duì)這個(gè)問題,我想到的方案都是“怎么簡(jiǎn)化鍵盤操作”。直到見到掃碼方案的那一刻,我才豁然開朗——原來(lái),軟件還可以這么做!
那么,軟件以后應(yīng)該都可以這么做了罷。
本文鏈接:http://www.cocoachina.com/programmer/20150228/11184.html





























