这是一个“如有雷同纯属巧合”的故事,有些废话,请勿当真。开始吧……
我有些尴尬地端着水杯,对面坐着来访的王总,他在别处打拼,据说这几年赚了不少钱,眼看移动互联网风生水起,自然也想加入进来试试手气。王总的业务虽然跟IT有关,但接触技术的时间不长,有些东西不太熟悉,总要请教我这个在一线开发十几年的老程序员。经过十几年的发展,有好几种可能,但这不是重点,先不管这个细节。
我之所以尴尬,是因为我根本不知道该如何回应王先生的需要,仿佛陷入了某种习惯性的沉思之中。
王先生站起身,把手机递给我,说:“你看,只是一个APP而已。”他很不熟练地在屏幕上划了几下。我没怎么仔细看,因为我知道这个问题很难。这是所有开发者都会被问到的问题,也可能是被问得最多的问题:“开发这样一个APP需要多长时间?”我想说我不知道,这或许是最直接最准确的答案,但在王先生这个老朋友面前,这样回答未免有些失礼,所以此时,我除了大致想清楚他指的APP涉及到哪些方面之外,还要组织好自己的语言,很得体的告诉他,我无法预估这件事。“你看,就是这么简单的APP而已”,王先生继续在屏幕上摆弄了几下,然后有些期待地看着我。
我小心翼翼地说道:“说实话,我也不能肯定,我在这方面没有太多经验,虽然我以前开发过APP,但这和这个很不一样,我必须详细分析所有的逻辑,然后才能估算时间。”
王先生似乎不同意我的说法,他晃了晃手机,说:“我要求不高,其实比这个还简单。”他指着屏幕上的某些地方继续说:“这个这个这个都可以,我需要的就是像这样一个可以查看和修改详细信息的列表……”
我自然而然地认为这是典型的“想当然”的态度,而且我认为我必须让他认识到问题的复杂性,于是便反问道:“需要登录吗?”
王先生顿了顿,说:“当然了。”
“什么登录?用户名密码登录,手机登录,还是QQ、微博、微信等第三方登录?”
王先生似乎想了想,“作为移动互联网,我觉得手机登录肯定是必须的,QQ、微博,对,微信,微信也是必须的……哦,你之前提到了用户名和密码,这个应该也是必须的。”
我流利地继续问:“那肯定要注册啊,如果你打算用手机登录的话,得找个短信平台,微信登录,先做企业身份认证啊,哦对了,有登录名和密码的话,肯定也要有找回密码的功能。”
“确实。”
“登录方式有多种,你要想出一个合理的逻辑去‘整合’它们。最常见的当然是账号绑定,比如将账号和手机号绑定,这样就可以用手机号登录同一个账号。微信登录也是一样,但现在的移动互联网用户对注册流程比较反感,所以往往要求直接手机登录或者微信登录,才能自动完成注册流程。试想一下这种情况,如果用户先用微信登录,再用手机登录,不进行绑定,那么就会产生两个不同的账号,无法再次‘整合’。我们要想出一个更完善的解决方案……”
王先生似乎对我的话有些不耐烦:“没必要搞得这么复杂吧?你看这个应用,不就是有这些吗?”
“您尝试过我之前描述的问题吗?”
但王先生似乎并不关心这个问题,他只是想知道,做这样一个APP,需要多长时间。当然,需要花多少钱,这也是他关心的。他自信地说:“为什么会出现问题?有什么困难?我相信这些都能解决,但时间很重要,我们要快点,竞争对手不会等我们的。你想想,需要多长时间?”

看他那架势,就像是一个事业有成的成功人士。作为一个低微的程序员,我实在是难以在他面前开口。我本想继续跟他说细节的重要性,但他却打断了我:“不,不需要很精确。你只要预估一个范围就行,两周?还是两个月?”
我感觉已经没有必要再隐瞒什么了:“我真的不知道,也许一个好的团队可以在两周内做到(但我自己也不相信有这么伟大的团队),但我显然不是能创造这种奇迹的人。”我想,就算我说出“两周到两年”这种开玩笑的范围,也未必准确。
王先生对我的回答似乎有些失望。但他是一个执行力很强的人,想做什么就做什么,而且行动迅速,出成果。我非常佩服他雷厉风行的做事风格。不过,这个项目我实在帮不上他,不过我还是客气的说:“如果你有什么技术上的问题,还是可以问我的。”
======不那么华丽的分界线======
“制作一款APP需要多长时间?”这个问题恐怕比测量一个人能活多少天还要难。在条件如此不充分的情况下,如何回答这个问题?
一般来说,需求越明确,团队越成熟,估算的时间就越准确。但无论软件开发发展了多少年,提出了什么方法论,都不可能像传统制造业那样精确地计算“工时”。由于软件开发中逻辑关系复杂,软件工程永远无法大规模生产。
用户看到的只是一个APP,如果用iOS系统的话,可能根本就接触不到,可能不知道开发者除了iOS版还需要做一个版本(能不能有个版本?这无疑会增加工作量)或者网页版就能搞定一切?可能你实际做了之后就不会这么想了。再说了,微信小店的模式真的能适用于所有场合吗?而且,如果网络没有异常的话,普通用户是察觉不到服务器的存在,服务器总是在默默无闻中为用户全天候工作,它的开发难度恐怕不亚于APP本身。负责APP运维的人也需要一些人力,等它发展壮大起来,甚至可能需要组建一个专业的团队,他们需要一个“后台”随时查看、处理数据,如果需要随时随地查看、处理数据,恐怕得为后台做一个专门的APP了。
这就有点类似了:当我们看到一架战斗机在天空中出色地完成歼灭敌人的使命时,我们认为只有战斗机本身伟大,而往往忽略了与战斗机相关的配套设施。如果没有技术熟练的飞行员、作战指挥中心、地面雷达、预警机、补给、机场或航母、地勤人员等,那么战斗机就失去了战斗力。APP也是一样,不是只要能运行就能搞定的事情,配套设施和维护工作并不比APP本身简单。
除了这些大方面,细节方面也存在很多不确定因素,所以一个成熟的团队就显得尤为重要。一个有经验的开发人员至少会大致知道,在开发过程中会遇到什么问题,哪些问题比较简单,哪些问题可能会花费很多时间,这些都取决于经验。我有一句常说的话,就是:“如果你没做过,就不要轻易说某件事很简单。”“想当然地认为简单”的态度对项目是没有好处的。如果你不确定,那就请教有这方面经验的人。即使得不到具体的答案,但也会有一个大概的方向。沿着这些方向去研究,你就会知道你将面临的问题,当然,往往不是全部。
关于“低估难度”这件事,我之前的公司有一个经典的故事。当时有一个小项目,就是为一套已经在仪器上使用的纯英文程序添加多语言支持。程序不大,涉及的内容也不算太多。一开始,工程师们以为这只是一个简单的翻译工作,最多两周就能完成,但一旦开始做,就发现并不简单。首先翻译要找专业人士来做,自己做不了。我们都没有人精通欧洲国家的语言。然后是单位换算,有的国家用公制,有的国家用英制,这个都得考虑,包括日期显示格式,一下子不知道多了多少工作量。这些都做差不多了之后,我们发现德文单词太长了,我们仪器的屏幕显示不出来,超出范围,就调整字体,简化。我们开会讨论了N次。 最后我们发现经过这次改版之后程序体积变大了很多,有些仪器的内存放不下。大家都傻眼了,就优化、精简,程序开始变得有些乱。最后才勉强通过了质控部的检查,终于发布了,我们发现花了半年的时间。但现在想来,耗时这么久的一个重要原因是我的经验不足,对多语言、国际化不熟悉,走了不少弯路。所以之前也提到过,一个成熟的团队尤为重要。
我们在估算项目时间的时候,往往只算“写代码的时间”,而忽略了跟老板或者客户争论的时间,做需求分析、设计、测试、修复 Bug 的时间。这些时间加起来通常比写代码的时间要多很多。我个人不会为了讨好老板而轻易说完成时间很短。为什么——不可能,为什么要撒谎?如果一个新功能开发需要一周才能完成,我通常要把这个时间拿下来,这已经算是“不保守”了。
即使只算上写代码所花的时间,也常常被低估。你的老板或者客户可能对你开发出来的东西并不满意,也许你误解了他的功能需求,或者界面有点卡,或者图标的颜色不好看。你是一个开发者,不是美工,虽然你可以当美工,但你毕竟不是专业的。更重要的是,做UI设计,画图的东西,也需要花费很多时间。当你为“一个像素”而烦恼的时候,你真的希望团队里有一个设计师吗?这时候,你就要提醒你的老板:你必须在时间和功能之间做出一些取舍。老板当然很不高兴,但又不得不在功能上做出一些妥协。虽然这样可以让这个高难度的项目早点上线,但却给老板未来项目失败的一个很好的借口:我们的工程师太差劲了,没有按照我说的做。
除了抱怨自己的作品不够好看,你的老板或客户还会提到很多其他的事情:这个界面能不能改成多选,能不能加个通知功能,要不要有已读未读状态,界面能不能流畅点,昨晚程序为什么会“死机”……需求只提到了功能,却没说UI要多漂亮,也没说程序要多稳定,更没说要达到多少吞吐量。当然,可能更重要的——安全性也没提。你惊呆了:是啊,要是有黑客,不,懂点技术的恶意用户想炸掉我们的服务器,那太容易了,我还没做这些防护措施呢!幸好项目知名度不够,暂时不用考虑这个。(看来大部分APP都没活到需要考虑这个的地步)
所有这些,无论是功能、细节还是健壮性,都不是土壤里可以自动生长出来的东西,需要你花时间去思考、去实践,有些甚至是“系统工程”,如果治标不治本,系统就会充满“飞线”,无疑会给以后的维护留下很多隐患。作为攻城狮,你考虑过这些吗?更别提老板为了省成本而买的低性能电脑,让你整天抓狂。
======不那么华丽的分界线======
王先生跟我道别后,就赶紧注册了公司、域名、办公室,还叫了一群人匆匆忙忙地开始干活。如此发展势头和热情,我只能感叹自己不如他。内心深处,我真的很后悔没有跟着他一起创业,但那只是一瞬间的情绪。理智在接下来的几百毫秒里把我拉了回来:还是不去的好,我跟他没法交流。
王先生的项目后来发展迅速,如今已经是估值上亿的公司的CEO了。而我,却越来越像一个人坐在办公室里,手里还拿着那只水杯,心烦意乱——停!这样是不是更有戏剧性了?虽然我在开头就声明过“本故事如有雷同纯属巧合”,但我也不能胡乱瞎编。真正的结局是:确实很忙,忙了几个月,然后突然没了消息。我想给王先生打电话问问他怎么样了,但他却又变成了一个超级忙的人,再也没心思和我聊天了。好吧,结局还是差不多,我还是那个继续坐在办公室里的程序员。唉,别想了,干活去吧!