作(zuò)者: 蔣國(guó)剛
網址: http://www.cnblogs.com/guogangj/p/4676836.html
這是一個“如有(yǒu)雷同,純屬巧合”的故事,外加一些廢話,大家請勿對号入座。開始了……
我有(yǒu)些尴尬地拿(ná)着水杯,正對面坐(zuò)着來訪的王總,他(tā)是在别處打拼的人,這幾年據說收獲頗豐,見移動互聯網如火如荼,自然也想着要進來幹一場,盡管王總從事的行當也算跟IT沾邊,但畢竟太長(cháng)時間不接觸技(jì )術,有(yǒu)些東西不太熟,總要咨詢下我這個在一線(xiàn)開發混了十幾年的老程序員,十幾年的開發,有(yǒu)好幾種可(kě)能(néng)性,不過這不是重點,所以暫時忽略掉這個細節吧。
我之所以尴尬,是對王總的需求有(yǒu)些不知如何回答(dá),仿佛陷入了某種習慣性的沉思中(zhōng)。
王總站了起來,把手機遞到我面前,說:“你看看,就這樣一個APP。”他(tā)不太熟練地在屏幕上劃了幾下,我并沒有(yǒu)很(hěn)認真地看,因為(wèi)我知道這個問題很(hěn)難,那就是所有(yǒu)的開發者都會被問,并且可(kě)能(néng)是被問得最頻的一個問題:“開發這麽一個APP需要多(duō)長(cháng)時間?”我很(hěn)想說不知道,這可(kě)能(néng)是最直截了當和準确的回答(dá),但面對王總這位老朋友,我要是這麽回答(dá)估計有(yǒu)些失禮,所以這個時候,我除了大緻思量了一下他(tā)所指的那個APP大緻涉及到哪些方面之外,還要組織下自己的語言,如何用(yòng)非常得體(tǐ)的話告訴他(tā),這個事情我估算不出。“你看,就這麽簡單的一個APP”,王總繼續在屏幕上撥弄了幾下,然後帶着幾分(fēn)期待的眼神看着我。
我謹慎地說:“坦白說,我說不準,我這方面經驗也不是很(hěn)足,盡管做過APP開發,但又(yòu)跟這個很(hěn)不一樣,得具(jù)體(tǐ)分(fēn)析好所有(yǒu)的邏輯,才能(néng)估算出時間。”
王總對我的說法似乎不以為(wèi)然,他(tā)晃了晃手機,說:“我要求不多(duō),其實比這個還簡單”,他(tā)指着屏幕上某些地方,繼續說:“這個,這個,這個都可(kě)以不要,隻需要這麽一個列表,裏面有(yǒu)詳情,可(kě)以查看修改……”
我心裏很(hěn)自然地想到這是很(hěn)典型的“想當然簡單”的态度,我想我得讓他(tā)認識到這個問題的複雜程度,我反問道:“需要登錄嗎?”
王總稍作(zuò)停頓後,說:“那當然。”
“什麽登錄?用(yòng)戶名(míng)密碼方式,還是手機登錄,抑或像QQ,微博,微信這種可(kě)以借用(yòng)的第三方登錄?”
王總這回似乎想了一下:“作(zuò)為(wèi)移動互聯網,我想手機登錄肯定是要的,QQ,微博,對了,微信,微信最好也要……哦,你前面說用(yòng)戶名(míng)密碼,這個應該也是要的吧。”
我很(hěn)流利地接着問:“那總得有(yǒu)注冊,如果你打算用(yòng)手機登錄,那得找個短信平台,還有(yǒu)微信登錄,你得先做好企業身份認證,對了,有(yǒu)登錄,有(yǒu)密碼,那密碼找回功能(néng)也得有(yǒu)吧。”
“這是肯定的。”
“同時有(yǒu)多(duō)種登錄途徑,你必須要想出一種合理(lǐ)的邏輯來将它們‘整合’,最常見的當然是賬号綁定,例如給你的賬号綁定手機号碼,這樣就能(néng)用(yòng)手機号來登錄同樣一個賬号,對微信登錄也同理(lǐ),但如今移動互聯網的用(yòng)戶們都挺厭惡注冊流程的,所以往往會要求直接手機登錄或者直接微信登錄,自動完成注冊過程,那考慮這種情況,如果用(yòng)戶先用(yòng)微信登錄,然後再用(yòng)手機登錄,而不是綁定,那麽就會産(chǎn)生兩個不同的賬号,而且無法将其再‘整合’起來,我們得想出一套比較完善的方案……”
王總對我所說的似乎有(yǒu)些缺乏耐心:“沒必要這麽複雜吧?你看看這個APP,這些不都有(yǒu)嗎?”
“有(yǒu)沒有(yǒu)我前面所描述的那個問題,你嘗試過了嗎?”
但王總似乎對問題并不關心,他(tā)隻想知道做這麽一個APP需要多(duō)長(cháng)時間,當然要多(duō)少錢,這也是他(tā)關心的問題,他(tā)拿(ná)出了信心滿滿的語氣:“有(yǒu)問題怕什麽?困難算什麽?這些我相信都能(néng)解決,但時間很(hěn)要緊,得快,我們的競争對手不會等我們,就這麽一個東西,你想想看,要多(duō)久?”
看他(tā)的架勢,像十足那種混得風生水起的成功人士,而我這種身份低微的程序員在他(tā)面前确實是有(yǒu)口難言,我本來還想繼續告訴他(tā)細節的重要性,卻被他(tā)打斷:“不,不需要有(yǒu)多(duō)精(jīng)确,你隻需要估算一個範圍,兩個星期?或是兩個月?”
我覺得我沒必要再隐瞞什麽了:“我真的不知道,也許一支優秀的團隊兩個星期就能(néng)做好(不過我自己可(kě)不相信有(yǒu)這麽牛逼的團隊),但我很(hěn)明顯不是那個能(néng)創造這種奇迹的人。”我心想其實就算說出了“兩個星期到兩年”這麽一個開玩笑式的範圍,也可(kě)能(néng)是錯的。
王總似乎對我這樣的回答(dá)很(hěn)失望。但他(tā)是個執行力很(hěn)強的人,想做一件事,就一定會行動,行動一定快,一定要有(yǒu)結果,這種雷厲風行的行事風格,确實,我挺欣賞,不過他(tā)的這個項目,我可(kě)真幫不上忙,但我還是出于禮貌,說道:“技(jì )術方面有(yǒu)什麽問題,還是可(kě)以來問我的。”
======== 不怎麽華麗的分(fēn)隔線(xiàn) ========
“做一個APP需要多(duō)長(cháng)時間?”這個問題估計比測一個人還能(néng)活幾天還難,一個條件如此不充分(fēn)的問題,如何回答(dá)呢(ne)?
總體(tǐ)來說,需求越是明确,團隊越是成熟,估算出來的時間就越是準确。而軟件開發這個事情,不管發展多(duō)少年,不管提出了怎樣的方法論,都沒辦(bàn)法像傳統制造業那樣把“工(gōng)時”算得那麽精(jīng)确,其内部錯綜複雜的邏輯關系使然,軟件工(gōng)程,絕無可(kě)能(néng)量産(chǎn)。
用(yòng)戶看到的隻是一個APP,如果他(tā)用(yòng)的是iOS系統,也許他(tā)根本就不會接觸Android,不知道開發者除了iOS版之外,還需要做一個Android版,(有(yǒu)沒可(kě)能(néng)還有(yǒu)Windows版?這樣工(gōng)作(zuò)量無疑更大)或者,網頁(yè)版搞定一切?也許你真正動手做過後就不會這麽認為(wèi),再說微信小(xiǎo)店(diàn)那種模式真能(néng)适用(yòng)于所有(yǒu)場合麽?而且,如果不是網絡出現異常的話,一般用(yòng)戶也不會注意到服務(wù)器的存在,服務(wù)器總是那麽默默無聞地為(wèi)用(yòng)戶全天候地工(gōng)作(zuò),它的開發難度恐怕也不亞于APP本身,而負責APP運維的還需一些人力,大了之後甚至需要組建一個專業團隊,他(tā)們需要一個“後台”,能(néng)随時查看和處理(lǐ)數據,如果需要随時随地都能(néng)查看和處理(lǐ)數據,恐怕還得給後台專門弄個APP。
這個道理(lǐ)就有(yǒu)點類似:我們看到了戰機在天上華麗地完成了殲敵任務(wù),以為(wèi)隻是戰機本身很(hěn)牛,往往忽視了戰機相關的那些配套,如果沒有(yǒu)娴熟的飛行員、作(zuò)戰指揮中(zhōng)心、地面雷達、預警機、補給、機場或航母、地勤人員等等,那麽戰機将失去戰鬥力。APP也一樣,它不是一個隻要能(néng)跑起來就完事的東西,支持它的配套設施和維護工(gōng)作(zuò)絲毫不比APP本身簡單。
除開這些大的方面,細節上也帶有(yǒu)許多(duō)的不确定性,所以一支成熟的團隊尤為(wèi)重要,一個經驗豐富的開發者會知道,至少大緻知道這個開發過程會遇到哪些問題,哪些問題比較簡單,哪些問題則可(kě)能(néng)需要耗費大量的時間,這得依賴經驗。我有(yǒu)一句話常常挂在嘴邊,那就是:“沒做過的東西别輕易說簡單。”“想當然簡單”的态度對項目沒有(yǒu)任何好處,如果自己不确定,那麽去咨詢一個有(yǒu)這方面經驗的人,就算得不到具(jù)體(tǐ)的答(dá)案也有(yǒu)大緻的方向,沿着這些方向研究一下,就能(néng)知道會面臨的那些問題,當然往往還不是全部。
關于“低估了難度”這事情,我過去的公(gōng)司有(yǒu)個經典故事,當時有(yǒu)個小(xiǎo)項目,就是準備把一套已經在儀器上使用(yòng)的隻支持英語的程序增加多(duō)語言支持,程序并不大,涉及内容也不算太多(duō),工(gōng)程師一開始認為(wèi)這隻是個簡單的翻譯工(gōng)作(zuò),頂多(duō)兩個星期就能(néng)完成,但一做下去就發現不簡單,首先翻譯得找專業人士來做,自己做不好,我們沒人精(jīng)通歐洲各國(guó)語言,接下來還有(yǒu)單位換算,有(yǒu)些國(guó)家用(yòng)公(gōng)制,有(yǒu)些用(yòng)英制,這個得考慮,包括日期顯示格式也得考慮,一下子不知道多(duō)了多(duō)少工(gōng)作(zuò),這些都差不多(duō)了之後又(yòu)發現了德(dé)語單詞過長(cháng),我們的儀器的屏幕顯示不下,超出範圍,于是再調字體(tǐ),做精(jīng)簡,前前後後開會讨論了N次,最後想Release的時候發現這麽一改,程序的Size變大了很(hěn)多(duō),有(yǒu)些儀器的存儲器裝(zhuāng)不下,這下大家可(kě)都傻了,優化呗,精(jīng)簡呗,程序開始有(yǒu)些淩亂不堪了,最後勉強通過質(zhì)控部檢驗,總算發布了,發覺足足搞了半年。不過如今想想之所以耗費了這麽多(duō)時間,一個很(hěn)重要的原因是經驗不足,對多(duō)語言,國(guó)際化這塊不熟,走了不少彎路,所以我前面也提到,成熟的團隊尤為(wèi)重要。
我們在估算項目時間的時候,往往隻算了“寫代碼的時間”,而把那些和老闆或客戶扯皮,做需求分(fēn)析,設計,測試,和修複bug的時間不考慮進去,而這些時間加起來通常比寫代碼的時間多(duō)出不少,我個人是不輕易為(wèi)了讨好老闆而把完成時間說得很(hěn)短的,為(wèi)啥?——根本做不到嘛,幹嘛要撒謊?如果一個需要一星期完成的新(xīn)功能(néng)開發,我通常得把這個時間double,這已經算比較“不保守”的了。
即便隻算寫代碼的時間,也往往會被低估,老闆或客戶對你開發的東西很(hěn)可(kě)能(néng)不滿意,或許你誤解了他(tā)的功能(néng)需求,或者界面有(yǒu)點卡頓,或者這個圖标顔色不好看,你是開發者,不是美工(gōng),雖然湊合可(kě)以當一下美工(gōng),但畢竟不專業,更重要的是做做UI設計,做做圖這種事情,也得耗費不少時間,當你為(wèi)“一個像素”焦頭爛額的時候,是不是很(hěn)渴望團隊中(zhōng)有(yǒu)一名(míng)設計師?這時候得提醒下老闆:你必須要在時間和功能(néng)之間,做點取舍。老闆當然很(hěn)不高興,但也不得不在功能(néng)上做出了一些妥協。雖然這樣做能(néng)讓難産(chǎn)的項目早點上線(xiàn),但卻為(wèi)來日項目的失敗,給老闆添加了一個很(hěn)好的借口:我們的工(gōng)程師太差了,沒按我說的去做。
老闆或客戶除了會抱怨你做出來的東西不夠好看之外,還會再提很(hěn)多(duō)東西:這個界面能(néng)不能(néng)改成多(duō)選,能(néng)否增加通知功能(néng),已讀未讀狀态要有(yǒu),界面能(néng)不能(néng)再流暢點,昨晚程序咋“閃退”了一次……需求隻管提功能(néng),但沒說具(jù)體(tǐ)這個UI要多(duō)美觀,也沒說程序穩定性要好,更沒涉及到要達到多(duō)大的吞吐量,當然,可(kě)能(néng)更重要的——安(ān)全性也沒提,你心一驚:是啊,如果有(yǒu)黑客,不,隻要稍微懂一點技(jì )術的惡意用(yòng)戶想刷爆我們的服務(wù)器,那簡直太簡單了,而這些防護措施我都沒做!所幸的是項目名(míng)氣太小(xiǎo),暫時無需考慮這個。(貌似大多(duō)數APP都活不到需要考慮這個的時候)
所有(yǒu)這些,你說功能(néng)也好,細節也好,穩健性也好,都不是能(néng)自動從土裏長(cháng)出來的東西,都得需要花(huā)時間去想,去做,有(yǒu)些甚至還是個“系統工(gōng)程”,如果頭痛醫(yī)頭腳痛醫(yī)腳去做的話,系統裏到處充滿“飛線(xiàn)”,無疑會給将來的維護留下了許多(duō)隐患。攻城獅的你,都考慮了嗎?更别說老闆為(wèi)了節省成本而給你購(gòu)置的低性能(néng)電(diàn)腦讓你整天抓狂這些“無關緊要”的事。
======== 不怎麽華麗的分(fēn)隔線(xiàn) ========
話說王總告别我之後就以迅雷不及掩耳之勢注冊了公(gōng)司,注冊了域名(míng),搞到了辦(bàn)公(gōng)室,還一下子叫來了一幫子人風風火火地搞了起來,這種發展勢頭,這種幹勁,我隻有(yǒu)自歎不如。心底裏真有(yǒu)些後悔怎麽沒跟他(tā)去幹事業,不過這隻是感性的一瞬間,理(lǐ)性又(yòu)在接下來的幾百毫秒(miǎo)裏将我拉了回來:還是别去好,跟他(tā)溝通不來的。
王總的項目後來以一飛沖天之勢迅猛發展,而他(tā)如今已經是一家估值幾億的公(gōng)司的CEO,我嘛,越來越覺得自己是個Loser,獨自坐(zuò)在辦(bàn)公(gōng)室裏,還是拿(ná)着那個水杯,懊惱不已——打住!這樣是不是比較有(yǒu)戲劇性?可(kě)雖然一開始我就聲明此故事“如有(yǒu)雷同,純屬巧合”,但也不能(néng)胡亂瞎編,真正的結局是:确實風風火火弄了幾個月,後來就突然杳無音訊了,本來想打電(diàn)話問問王總究竟怎樣,無奈他(tā)變成了另一個超級忙人,再無心思跟我聊家常了。嗯,結局還是差不多(duō),我還是那個繼續苦逼地坐(zuò)在辦(bàn)公(gōng)室裏的程序員,唉,别想了,開工(gōng)吧!