原文出處:蔣國(guó)綱
這是一個(gè)“如有雷同,純屬巧合”的故事回季。
我有些尷尬的端著水杯家制,正對(duì)面坐著來(lái)訪的王總,他是在別處打拼的人泡一,這里年頗有收獲颤殴,見到移動(dòng)互聯(lián)網(wǎng)如此火熱,也想著進(jìn)來(lái)干一場(chǎng)鼻忠,盡管王總從事的行業(yè)也算跟IT沾邊涵但,但是接觸的時(shí)間不長(zhǎng),很多東西都不帖蔓。所以前來(lái)咨詢我這個(gè)專業(yè)的移動(dòng)互聯(lián)網(wǎng)技術(shù)人員了矮瘟。
我之所以尷尬,是對(duì)王總的需求有些不知如何回答塑娇。這個(gè)情況可能很多人都遇到過(guò)芥永,后面我會(huì)告訴大家到底是什么問題讓我如此尷尬。
王總站起來(lái)钝吮,把手機(jī)遞到我面前說(shuō):"你看,這樣的一個(gè)app。"他不太熟練的打開了一個(gè)手機(jī)APP劃了幾下奇瘦,我并沒有很認(rèn)真地看棘催,因?yàn)槲抑肋@個(gè)問題很難,那就是所有的開發(fā)者都會(huì)被問耳标,并且可能是被問得最頻的一個(gè)問題:“開發(fā)這么一個(gè)APP需要多長(zhǎng)時(shí)間醇坝?”我很想說(shuō)不知道,這可能是最直截了當(dāng)和準(zhǔn)確的回答次坡,但面對(duì)王總呼猪,我要是這么回答估計(jì)有些失禮,所以這個(gè)時(shí)候砸琅,我除了大致思量了一下他所指的那個(gè)APP大致涉及到哪些方面之外宋距,還要組織下自己的語(yǔ)言,如何用非常得體的話告訴他症脂,這個(gè)事情我估算不出谚赎。“你看诱篷,就這么簡(jiǎn)單的一個(gè)APP”壶唤,王總繼續(xù)在屏幕上撥弄了幾下,然后帶著幾分期待的眼神看著我棕所。
我謹(jǐn)慎地說(shuō):“坦白說(shuō)闸盔,我說(shuō)不準(zhǔn),我這方面經(jīng)驗(yàn)也不是很足琳省,盡管做過(guò)APP開發(fā)迎吵,但又跟這個(gè)很不一樣,得具體分析好所有的邏輯岛啸,才能估算出時(shí)間钓觉。”
王總對(duì)我的說(shuō)法似乎不以為然坚踩,他晃了晃手機(jī)荡灾,說(shuō):“我要求不多,其實(shí)比這個(gè)還簡(jiǎn)單”瞬铸,他指著屏幕上某些地方批幌,繼續(xù)說(shuō):“這個(gè),這個(gè)嗓节,這個(gè)都可以不要荧缘,只需要這么一個(gè)列表,里面有詳情拦宣,可以查看修改……”
我心里很自然地想到這是很典型的“想當(dāng)然簡(jiǎn)單”的態(tài)度截粗,我想我得讓他認(rèn)識(shí)到這個(gè)問題的復(fù)雜程度信姓,我反問道:“需要登錄嗎?”
王總稍作停頓后绸罗,說(shuō):“那當(dāng)然意推。”
“什么登錄珊蟀?用戶名密碼方式菊值,還是手機(jī)登錄,郵箱登陸育灸,抑或像QQ腻窒,微博,微信這種可以借用的第三方登錄磅崭?”
王總這回似乎想了一下:“作為移動(dòng)互聯(lián)網(wǎng)儿子,我想手機(jī)登錄肯定是要的,QQ绽诚,微博典徊,對(duì)了,微信恩够,微信最好也要……哦卒落,你前面說(shuō)用戶名密碼,這個(gè)應(yīng)該也是要的吧蜂桶±鼙希”
我很流利地接著問:“那總得有注冊(cè),如果你打算用手機(jī)登錄扑媚,那得找個(gè)短信平臺(tái)腰湾,還有微信登錄,你得先做好企業(yè)身份認(rèn)證疆股,對(duì)了费坊,有登錄,有密碼旬痹,那密碼找回功能也得有吧附井。”
“這是肯定的两残∮酪悖”
“同時(shí)有多種登錄途徑,你必須要想出一種合理的邏輯來(lái)將它們‘整合’人弓,最常見的當(dāng)然是賬號(hào)綁定沼死,例如給你的賬號(hào)綁定手機(jī)號(hào)碼,這樣就能用手機(jī)號(hào)來(lái)登錄同樣一個(gè)賬號(hào)崔赌,對(duì)微信登錄也同理意蛀,但如今移動(dòng)互聯(lián)網(wǎng)的用戶們都挺厭惡注冊(cè)流程的耸别,所以往往會(huì)要求直接手機(jī)登錄或者直接微信登錄,自動(dòng)完成注冊(cè)過(guò)程浸间,那考慮這種情況太雨,如果用戶先用微信登錄,然后再用手機(jī)登錄魁蒜,而不是綁定,那么就會(huì)產(chǎn)生兩個(gè)不同的賬號(hào)吩翻,而且無(wú)法將其再‘整合’起來(lái)兜看,我們得想出一套比較完善的方案……”
王總對(duì)我所說(shuō)的似乎有些缺乏耐心:“沒必要這么復(fù)雜吧?你看看這個(gè)APP狭瞎,這些不都有嗎细移?”
“有沒有我前面所描述的那個(gè)問題,你嘗試過(guò)了嗎熊锭?”
但王總似乎對(duì)問題并不關(guān)心弧轧,他只想知道做這么一個(gè)APP需要多長(zhǎng)時(shí)間,當(dāng)然要多少錢碗殷,這也是他關(guān)心的問題精绎,他拿出了信心滿滿的語(yǔ)氣:“有問題怕什么?困難算什么锌妻?這些我相信都能解決代乃,但時(shí)間很要緊,得快仿粹,我們的競(jìng)爭(zhēng)對(duì)手不會(huì)等我們搁吓,就這么一個(gè)東西,你想想看吭历,要多久堕仔?”
看他的架勢(shì),像十足那種混得風(fēng)生水起的成功人士晌区,而我這種身份低微的程序員在他面前確實(shí)是有口難言摩骨,我本來(lái)還想繼續(xù)告訴他細(xì)節(jié)的重要性,卻被他打斷:“不契讲,不需要有多精確仿吞,你只需要估算一個(gè)范圍,兩個(gè)星期捡偏?或是兩個(gè)月唤冈?”
我覺得我沒必要再隱瞞什么了:“我真的不知道,也許一支優(yōu)秀的團(tuán)隊(duì)兩個(gè)星期就能做好(不過(guò)我自己可不相信有這么牛逼的團(tuán)隊(duì))银伟,但我很明顯不是那個(gè)能創(chuàng)造這種奇跡的人你虹』娓悖”我心想其實(shí)就算說(shuō)出了“兩個(gè)星期到兩年”這么一個(gè)開玩笑式的范圍,也可能是錯(cuò)的傅物。
王總似乎對(duì)我這樣的回答很失望夯辖。但他是個(gè)執(zhí)行力很強(qiáng)的人,想做一件事董饰,就一定會(huì)行動(dòng)蒿褂,行動(dòng)一定快,一定要有結(jié)果卒暂,這種雷厲風(fēng)行的行事風(fēng)格啄栓,確實(shí),我挺欣賞也祠,不過(guò)他的這個(gè)項(xiàng)目昙楚,我可真幫不上忙,但我還是出于禮貌诈嘿,說(shuō)道:“技術(shù)方面有什么問題堪旧,還是可以來(lái)問我的〗毖牵”
====================== 不怎么華麗的分隔線======================
“做一個(gè)APP需要多長(zhǎng)時(shí)間淳梦?”這個(gè)問題估計(jì)比測(cè)一個(gè)人還能活幾天還難,一個(gè)條件如此不充分的問題遂蛀,如何回答呢谭跨?
總體來(lái)說(shuō),需求越是明確李滴,團(tuán)隊(duì)越是成熟螃宙,估算出來(lái)的時(shí)間就越是準(zhǔn)確。而軟件開發(fā)這個(gè)事情所坯,不管發(fā)展多少年谆扎,不管提出了怎樣的方法論,都沒辦法像傳統(tǒng)制造業(yè)那樣把“工時(shí)”算得那么精確芹助,其內(nèi)部錯(cuò)綜復(fù)雜的邏輯關(guān)系使然堂湖,軟件工程,絕無(wú)可能量產(chǎn)状土。
用戶看到的只是一個(gè)APP无蜂,如果他用的是iOS系統(tǒng),也許他根本就不會(huì)接觸Android蒙谓,不知道開發(fā)者除了iOS版之外斥季,還需要做一個(gè)Android版,(有沒可能還有Windows版?這樣工作量無(wú)疑更大)或者酣倾,網(wǎng)頁(yè)版搞定一切舵揭?也許你真正動(dòng)手做過(guò)后就不會(huì)這么認(rèn)為,再說(shuō)微信小店那種模式真能適用于所有場(chǎng)合么躁锡?而且午绳,如果不是網(wǎng)絡(luò)出現(xiàn)異常的話,一般用戶也不會(huì)注意到服務(wù)器的存在映之,服務(wù)器總是那么默默無(wú)聞地為用戶全天候地工作拦焚,它的開發(fā)難度恐怕也不亞于APP本身,而負(fù)責(zé)APP運(yùn)維的還需一些人力杠输,大了之后甚至需要組建一個(gè)專業(yè)團(tuán)隊(duì)耕漱,他們需要一個(gè)“后臺(tái)”,能隨時(shí)查看和處理數(shù)據(jù)抬伺,如果需要隨時(shí)隨地都能查看和處理數(shù)據(jù),恐怕還得給后臺(tái)專門弄個(gè)APP灾梦。
這個(gè)道理就有點(diǎn)類似:我們看到了戰(zhàn)機(jī)在天上華麗地完成了殲敵任務(wù)峡钓,以為只是戰(zhàn)機(jī)本身很牛,往往忽視了戰(zhàn)機(jī)相關(guān)的那些配套若河,如果沒有嫻熟的飛行員能岩、作戰(zhàn)指揮中心、地面雷達(dá)萧福、預(yù)警機(jī)拉鹃、補(bǔ)給、機(jī)場(chǎng)或航母鲫忍、地勤人員等等膏燕,那么戰(zhàn)機(jī)將失去戰(zhàn)斗力。APP也一樣悟民,它不是一個(gè)只要能跑起來(lái)就完事的東西坝辫,支持它的配套設(shè)施和維護(hù)工作絲毫不比APP本身簡(jiǎn)單。
除開這些大的方面射亏,細(xì)節(jié)上也帶有許多的不確定性近忙,所以一支成熟的團(tuán)隊(duì)尤為重要,一個(gè)經(jīng)驗(yàn)豐富的開發(fā)者會(huì)知道智润,至少大致知道這個(gè)開發(fā)過(guò)程會(huì)遇到哪些問題及舍,哪些問題比較簡(jiǎn)單,哪些問題則可能需要耗費(fèi)大量的時(shí)間窟绷,這得依賴經(jīng)驗(yàn)锯玛。我有一句話常常掛在嘴邊,那就是:“沒做過(guò)的東西別輕易說(shuō)簡(jiǎn)單钾麸。”“想當(dāng)然簡(jiǎn)單”的態(tài)度對(duì)項(xiàng)目沒有任何好處更振,如果自己不確定炕桨,那么去咨詢一個(gè)有這方面經(jīng)驗(yàn)的人,就算得不到具體的答案也有大致的方向肯腕,沿著這些方向研究一下献宫,就能知道會(huì)面臨的那些問題,當(dāng)然往往還不是全部实撒。
關(guān)于“低估了難度”這事情姊途,我過(guò)去的公司有個(gè)經(jīng)典故事,當(dāng)時(shí)有個(gè)小項(xiàng)目知态,就是準(zhǔn)備把一套已經(jīng)在儀器上使用的只支持英語(yǔ)的程序增加多語(yǔ)言支持捷兰,程序并不大,涉及內(nèi)容也不算太多负敏,工程師一開始認(rèn)為這只是個(gè)簡(jiǎn)單的翻譯工作贡茅,頂多兩個(gè)星期就能完成,但一做下去就發(fā)現(xiàn)不簡(jiǎn)單其做,首先翻譯得找專業(yè)人士來(lái)做顶考,自己做不好,我們沒人精通歐洲各國(guó)語(yǔ)言妖泄,接下來(lái)還有單位換算驹沿,有些國(guó)家用公制喷橙,有些用英制牲平,這個(gè)得考慮,包括日期顯示格式也得考慮测垛,一下子不知道多了多少工作罚渐,這些都差不多了之后又發(fā)現(xiàn)了德語(yǔ)單詞過(guò)長(zhǎng)却汉,我們的儀器的屏幕顯示不下,超出范圍搅轿,于是再調(diào)字體病涨,做精簡(jiǎn),前前后后開會(huì)討論了N次璧坟,最后想Release的時(shí)候發(fā)現(xiàn)這么一改既穆,程序的Size變大了很多,有些儀器的存儲(chǔ)器裝不下雀鹃,這下大家可都傻了幻工,優(yōu)化唄,精簡(jiǎn)唄黎茎,程序開始有些凌亂不堪了囊颅,最后勉強(qiáng)通過(guò)質(zhì)控部檢驗(yàn),總算發(fā)布了,發(fā)覺足足搞了半年踢代。不過(guò)如今想想之所以耗費(fèi)了這么多時(shí)間盲憎,一個(gè)很重要的原因是經(jīng)驗(yàn)不足,對(duì)多語(yǔ)言胳挎,國(guó)際化這塊不熟饼疙,走了不少?gòu)澛罚晕仪懊嬉蔡岬侥脚溃墒斓膱F(tuán)隊(duì)尤為重要窑眯。
我們?cè)诠浪沩?xiàng)目時(shí)間的時(shí)候,往往只算了“寫代碼的時(shí)間”医窿,而把那些和老板或客戶扯皮磅甩,做需求分析,設(shè)計(jì)姥卢,測(cè)試卷要,和修復(fù)bug的時(shí)間不考慮進(jìn)去,而這些時(shí)間加起來(lái)通常比寫代碼的時(shí)間多出不少独榴,我個(gè)人是不輕易為了討好老板而把完成時(shí)間說(shuō)得很短的却妨,為啥?——根本做不到嘛括眠,干嘛要撒謊?如果一個(gè)需要一星期完成的新功能開發(fā)倍权,我通常得把這個(gè)時(shí)間double掷豺,這已經(jīng)算比較“不保守”的了。
即便只算寫代碼的時(shí)間薄声,也往往會(huì)被低估当船,老板或客戶對(duì)你開發(fā)的東西很可能不滿意,或許你誤解了他的功能需求默辨,或者界面有點(diǎn)卡頓德频,或者這個(gè)圖標(biāo)顏色不好看,你是開發(fā)者缩幸,不是美工壹置,雖然湊合可以當(dāng)一下美工,但畢竟不專業(yè)表谊,更重要的是做做UI設(shè)計(jì)钞护,做做圖這種事情,也得耗費(fèi)不少時(shí)間爆办,當(dāng)你為“一個(gè)像素”焦頭爛額的時(shí)候难咕,是不是很渴望團(tuán)隊(duì)中有一名設(shè)計(jì)師?這時(shí)候得提醒下老板:你必須要在時(shí)間和功能之間,做點(diǎn)取舍余佃。老板當(dāng)然很不高興暮刃,但也不得不在功能上做出了一些妥協(xié)。雖然這樣做能讓難產(chǎn)的項(xiàng)目早點(diǎn)上線爆土,但卻為來(lái)日項(xiàng)目的失敗椭懊,給老板添加了一個(gè)很好的借口:我們的工程師太差了,沒按我說(shuō)的去做雾消。
老板或客戶除了會(huì)抱怨你做出來(lái)的東西不夠好看之外灾搏,還會(huì)再提很多東西:這個(gè)界面能不能改成多選,能否增加通知功能立润,已讀未讀狀態(tài)要有狂窑,界面能不能再流暢點(diǎn),昨晚程序咋“閃退”了一次……需求只管提功能桑腮,但沒說(shuō)具體這個(gè)UI要多美觀泉哈,也沒說(shuō)程序穩(wěn)定性要好,更沒涉及到要達(dá)到多大的吞吐量破讨,當(dāng)然丛晦,可能更重要的——安全性也沒提,你心一驚:是啊提陶,如果有黑客烫沙,不,只要稍微懂一點(diǎn)技術(shù)的惡意用戶想刷爆我們的服務(wù)器隙笆,那簡(jiǎn)直太簡(jiǎn)單了锌蓄,而這些防護(hù)措施我都沒做!所幸的是項(xiàng)目名氣太小撑柔,暫時(shí)無(wú)需考慮這個(gè)瘸爽。(貌似大多數(shù)APP都活不到需要考慮這個(gè)的時(shí)候)
所有這些,你說(shuō)功能也好铅忿,細(xì)節(jié)也好剪决,穩(wěn)健性也好,都不是能自動(dòng)從土里長(zhǎng)出來(lái)的東西檀训,都得需要花時(shí)間去想柑潦,去做,有些甚至還是個(gè)“系統(tǒng)工程”峻凫,如果頭痛醫(yī)頭腳痛醫(yī)腳去做的話妒茬,系統(tǒng)里到處充滿“飛線”,無(wú)疑會(huì)給將來(lái)的維護(hù)留下了許多隱患蔚晨。攻城獅的你乍钻,都考慮了嗎肛循?更別說(shuō)老板為了節(jié)省成本而給你購(gòu)置的低性能電腦讓你整天抓狂這些“無(wú)關(guān)緊要”的事。
====================== 不怎么華麗的分隔線======================
話說(shuō)王總告別我之后就以迅雷不及掩耳之勢(shì)注冊(cè)了公司银择,注冊(cè)了域名多糠,搞到了辦公室,還一下子叫來(lái)了一幫子人風(fēng)風(fēng)火火地搞了起來(lái)浩考,這種發(fā)展勢(shì)頭夹孔,這種干勁,我只有自嘆不如析孽。心底里真有些后悔怎么沒跟他去干事業(yè)搭伤,不過(guò)這只是感性的一瞬間,理性又在接下來(lái)的幾百毫秒里將我拉了回來(lái):還是別去好袜瞬,跟他溝通不來(lái)的怜俐。
王總的項(xiàng)目后來(lái)以一飛沖天之勢(shì)迅猛發(fā)展,而他如今已經(jīng)是一家估值幾億的公司的CEO邓尤,我嘛拍鲤,越來(lái)越覺得自己是個(gè)Loser,獨(dú)自坐在辦公室里汞扎,還是拿著那個(gè)水杯季稳,懊惱不已——打住澈魄!這樣是不是比較有戲劇性景鼠?可雖然一開始我就聲明此故事“如有雷同,純屬巧合”痹扇,但也不能胡亂瞎編莲蜘,真正的結(jié)局是:確實(shí)風(fēng)風(fēng)火火弄了幾個(gè)月,后來(lái)就突然杳無(wú)音訊了帘营,本來(lái)想打電話問問王總究竟怎樣,無(wú)奈他變成了另一個(gè)超級(jí)忙人逐哈,再無(wú)心思跟我聊家常了芬迄。嗯,結(jié)局還是差不多昂秃,我還是那個(gè)繼續(xù)苦逼地坐在辦公室里的程序員禀梳,唉,別想了肠骆,開工吧算途!
接下來(lái)我會(huì)為大家介紹“從產(chǎn)品經(jīng)理的角度算一算,做一款A(yù)PP需要多少錢蚀腿?”
歡迎大家向我咨詢有關(guān)APP相關(guān)方面問題嘴瓤。