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