程序員的口頭禪:技術(shù)上無法實(shí)現(xiàn)
「技術(shù)上無法實(shí)現(xiàn)」這句口頭禪,我在過去多年的程序員職業(yè)生涯中經(jīng)常聽見,甚至我自己就曾說過很多次。最近當(dāng)我再次聽到有人說出這句話時(shí),就不禁思考起來,為什么程序員愛說這句話呢?為什么曾經(jīng)我也時(shí)不時(shí)說這句話呢?
不知
當(dāng)我剛開始工作的***年,我在一家銀行客戶現(xiàn)場(chǎng)工作。當(dāng)時(shí)要給銀行的出納管理部做一個(gè)系統(tǒng),這個(gè)系統(tǒng)有個(gè)功能就是上傳各個(gè)國家的高清真假幣鑒別對(duì)比圖片,然后銀行的出納和柜員就可以在系統(tǒng)上學(xué)習(xí)各國家紙幣的鑒別方式了。
針對(duì)這些高清紙幣圖片,客戶為了怕別人盜取亂用,就要求必須對(duì)對(duì)圖片做加背景水印的功能。當(dāng)我們?cè)谡匍_需求討論會(huì)時(shí),我聽到這個(gè)需求就懵了,因?yàn)橥耆恢酪趺醋觥.吘巩?dāng)時(shí)我才剛剛開始學(xué)習(xí)如何做 Web 化的管理系統(tǒng),從來沒有用程序處理過圖片。
彼時(shí),當(dāng)我想起程序化的圖片處理時(shí),我就只能想起像 PhotoShop 這樣的高度專業(yè)化的圖片處理工具軟件,覺得這肯定是一個(gè)很復(fù)雜的事情。所以,當(dāng)我們討論起加背景水印的功能時(shí),我自然脫口而出:“這在技術(shù)上無法實(shí)現(xiàn)。”
然后我們進(jìn)一步說起,當(dāng)前他們是怎么做的,確實(shí)是找了專門的外包設(shè)計(jì)公司用 PhotoShop 來給圖片一張張手工加的水印。這聽起來是一個(gè)比較繁瑣的過程,所以,當(dāng)我回答在技術(shù)上無法實(shí)現(xiàn)時(shí),客戶都是業(yè)務(wù)人員,也不太懂程序技術(shù)上的事,聽到我的回答就略顯失望。
好吧,如今回想起來,當(dāng)時(shí)我說技術(shù)上無法實(shí)現(xiàn)時(shí),僅僅是我當(dāng)時(shí)并不知道如何去實(shí)現(xiàn)。而且想當(dāng)然的感覺要進(jìn)行圖片處理,必須要具備像 PhotoShop 一樣的專業(yè)背景知識(shí),而這在當(dāng)時(shí)的我而言是完全不能想象的。
因此,當(dāng)時(shí)我說出的那句:技術(shù)上無法實(shí)現(xiàn),僅僅是因?yàn)椴恢筒唤舛膽盐窇帧?/p>
不愿
有一年,我出差在客戶現(xiàn)場(chǎng)趕項(xiàng)目,連續(xù)加班了四個(gè)周末,也就是大概一個(gè)月在連續(xù)上班。終于我們的項(xiàng)目快要如期上線了,每個(gè)通宵的早晨,看著東方慢慢變得紅潤透亮的天空,感覺已經(jīng)快要看到了勝利的曙光。
就在這樣一個(gè)曙光照耀的早晨,項(xiàng)目經(jīng)理跑來對(duì)我們說:“原有的一塊業(yè)務(wù)邏輯今天在和客戶聊起時(shí),他們說也只是試試這個(gè)流程,可能要改變。但我們的實(shí)現(xiàn)方式太僵硬,都是硬編碼趕出來的。要不我們改成更靈活的可以通過配置的方式,一旦上線后再改起來就更麻煩了,我可以先去和客戶再溝通下,再給我們爭取點(diǎn)時(shí)間。”
一下子,我們都被打擊的不行,改成配置怎么改?邏輯那么復(fù)雜,又不是那種簡單的開關(guān)式配置。當(dāng)然,項(xiàng)目經(jīng)理早已脫離技術(shù)一線時(shí)間頗久,也一時(shí)半會(huì)兒沒啥方案。在沉默的思考了一陣后,我又說出了那句話:“邏輯太復(fù)雜,變動(dòng)太大,這在技術(shù)上無法實(shí)現(xiàn)。”
老實(shí)說,當(dāng)時(shí)我只是想趕快離開這沉默的討論會(huì),去美美的睡上一覺。其實(shí),那時(shí)我心里是有一個(gè)方案的,如今看來不是什么優(yōu)秀的方案,只是當(dāng)時(shí)我唯一知道且可行的方案。就是通過動(dòng)態(tài)類加載機(jī)制,把業(yè)務(wù)邏輯外移,流程內(nèi)置的方式去可以動(dòng)態(tài)熱加載新的業(yè)務(wù)邏輯類。但這意味著可能面臨一次重大的重構(gòu),又是兩周的持續(xù)加班,而我當(dāng)時(shí)只想睡上一覺。
后來,這個(gè)故事在我睡醒后依然以我妥協(xié)結(jié)束。我建議了這個(gè)方案,***當(dāng)然也是我去實(shí)施了這個(gè)方案,沒有加上兩周班,只用了一周,然后項(xiàng)目上線了。再之后的后續(xù)維護(hù)中,我又學(xué)習(xí)了新的東西,流程引擎,動(dòng)態(tài)腳本,然后下一版本的重構(gòu),我們做了一個(gè)更好更通用的產(chǎn)品。
當(dāng)時(shí)我說出的那句:技術(shù)上無法實(shí)現(xiàn),只是因?yàn)橛X得很麻煩,不愿意而已。后來睡醒后,回了一些血,有了能量,覺得應(yīng)該接受這個(gè)挑戰(zhàn)。因?yàn)榭蛻舻男枨笞兓褪且粋€(gè)客觀事實(shí),也不會(huì)因?yàn)槲业闹饔^意愿而改變。
應(yīng)對(duì)
再之后,隨著工作經(jīng)驗(yàn)的增多,技能的積累,我便越來越少說這句話了。事實(shí)上,我發(fā)現(xiàn)大部分的用戶需求,技術(shù)上總是可以實(shí)現(xiàn)的。這些需求的真正限制,要么是時(shí)間、要么是資源。
所以,面對(duì)一個(gè)緊迫的,不合理的客戶需求,甚至訴求時(shí),不應(yīng)該再以如此蒼白的一句話去應(yīng)對(duì)了。這個(gè)需求背后涉及的技術(shù)實(shí)現(xiàn),要么可能你現(xiàn)在未知,要么你至少知道一個(gè)方案,只是覺得過于復(fù)雜,而且會(huì)帶來很多副作用,所以不愿意這樣去做。
但總之,你需要一個(gè)辦法去應(yīng)對(duì)一個(gè)讓你覺得「技術(shù)上無法實(shí)現(xiàn)」的需求。我建議不要立刻像我當(dāng)年一樣做出簡單的判斷,不如我們把這樣的問題放在下面這樣的框架中去思考下。
全局背景
在這一步的目的不是要找到并確定實(shí)現(xiàn)方案,只是對(duì)這一問題涉及的主題的相關(guān)內(nèi)容有一個(gè)全局性的了解。近年我都在做 IM,就以此舉個(gè)例子吧。
不時(shí)會(huì)有用戶反饋在安卓客戶端應(yīng)用切到后臺(tái)就會(huì)收不到消息,這里用戶只是提供了一個(gè)說法,甚至都不算現(xiàn)象。但這是一個(gè)問題,而且是一個(gè)我覺得在技術(shù)上無法***根除的問題,換言之就是你可能想不出一個(gè)方案能讓你的所有用戶都再也不會(huì)碰到類似的問題。用戶碰到這樣的問題可能的原因有:
- 移動(dòng)弱網(wǎng)絡(luò),消息投遞失敗率高
- 應(yīng)用切后臺(tái)就被系統(tǒng)殺掉,所以收不到
- 第三方推送渠道,比如:一類用戶完全沒有這種渠道可達(dá)
- 應(yīng)用本身的問題,比如:bug,版本碎片導(dǎo)致的兼容性問題
以上簡單的問題分類,背后都隱藏著一個(gè)解決或優(yōu)化問題所需的巨大且復(fù)雜的實(shí)現(xiàn)方案。針對(duì)每一類問題的方案,你先去大概有個(gè)了解,但這里還不需要很深入。
聚焦范圍
上面列出的全局背景問題分析分類后,發(fā)現(xiàn)沒有一個(gè)是輕松容易就能解決的。而且這時(shí)你必然面臨資源和時(shí)間的問題,在特定的資源和時(shí)間下,我應(yīng)該優(yōu)先解決哪類?所以,這一步的本質(zhì)就是從上面的全局分類中,聚焦一個(gè)范圍,然后集中深入調(diào)研評(píng)估。
定義標(biāo)準(zhǔn)
前面說了用戶僅僅反饋了一個(gè)說法,站在用戶的角度,他們總是希望沒有任何問題的。但站在我的角度,我知道我只聚焦了一部分問題,所以我需要清晰定義這部分問題的解決的成功標(biāo)準(zhǔn)。比如,針對(duì)應(yīng)用切后臺(tái)就被系統(tǒng)殺掉,對(duì)用戶無感知,所以認(rèn)為收不到消息有問題。
針對(duì)這個(gè)問題的聚焦范圍,我可以提供第三方推送渠道在十分鐘內(nèi)的推送通知補(bǔ)償,重新喚醒用戶重回應(yīng)用,避免遺漏消息。通過估算每日活躍用戶和可能投遞給第三方渠道消息通知量和第三方渠道自己標(biāo)榜的投遞成功率和業(yè)界一些經(jīng)驗(yàn)數(shù)據(jù),就能估算出具體的通知喚醒到底能補(bǔ)償多少用戶的標(biāo)準(zhǔn)。
深度評(píng)估
有了范圍和標(biāo)準(zhǔn),剩下的就是深度評(píng)估方案路徑問題。大體上任何一個(gè)方案,其中有些是你已經(jīng)輕車熟路的實(shí)現(xiàn)路徑,另一些則是你可能從未走過的陌生之路。
輕車熟路的部分可能更容易評(píng)估,但很多程序員還是容易高估自己,即使是在輕車熟路的部分。而從未走過的陌生之路,就經(jīng)常評(píng)估的更離譜了。關(guān)于評(píng)估,我以前寫過好多了,做好日常的時(shí)間記錄,那么熟悉的部分就不會(huì)差太遠(yuǎn),而陌生的部分呢,只能盡可能的保守點(diǎn)了?,F(xiàn)實(shí)總是比理想的路徑曲折一些的。
而那些來自產(chǎn)品 MM 的各種軟語相求或激將捧殺,讓你不自覺得的頭腦一熱當(dāng)場(chǎng)拍時(shí)間的決策,日后都會(huì)成為你沒完沒了加班的根源。
【本文是51CTO專欄作者胡峰的原創(chuàng)文章,轉(zhuǎn)載請(qǐng)聯(lián)系作者本人獲取授權(quán)】