在一个阳光明媚的下午,我正瘫坐在椅子上改bug。忽然有人给我发微信:“我想做个app,多长时间,多少钱?”
从我从业iOS开发到现在,这个问题被问过无数次,比那句:“你是程序员,那你会修电脑吗?”还要令人烦。毕竟那只是句玩笑话,而这句在其他人(更多时候是你的boss,经理这些非程序员出身的IT内行人)看来是你的专业,是你必须要知道的,你能回答不知道吗?显得你太不专业了。但这句话最专业、最负责任的回答就是:“我不知道!”
问我问题的是朋友的朋友,一个在传统行业浸淫多年的人,立志要突破传统行业的束缚,做互联网浪潮中的弄潮儿。当时听他说这句话的时候我有点懵逼:互联网浪潮中的弄潮儿?指示十多年前马云、马化腾那一批吗?现在互联网都蔓延成海了,哪还有潮让你浪,能做一条杂鱼苟延残喘的活下去就不错了。
我真想回答“我不知道”,毕竟还有好多bug等着我改呢,没必要在这浪费时间。但又想到毕竟有过一面之缘,直接回答不知道,是不是显得有点不给面子?在这个问题上,很多时候就是这么栽进坑里的。
“什么类型的app?”这句话发出去,毫无疑问的掉坑里了。他给我发了个app截图,说:“跟这个差不多,不用那么复杂,简单点就行。”
我一看,好嘛,淘宝?!你还真是打算做弄潮儿啊!我说:“淘宝啊?得十多年吧。”加了一个呵呵的表情,一方面想表达我认为你是在开玩笑,我也是开玩笑的回复,另一方面是我想呵呵你一脸。其实我也不算敷衍,淘宝03年成立,做到现在也十多年了。
他明显没有get到我的意思,反而埋怨我没get到他的点。说:“我的意思是淘宝这个类型的app,肯定不用跟淘宝似的那么复杂。简单点,有个列表,可以卖东西就行,几天能弄出来?重要的是要快!”看这意思是:我已想到一个天才创意,就差一个能把创意转化成app的高效程序员了,一定要高效,几天就能做出来,上架使用,推广全国。
这时我能想到的最靠谱的建议是:花钱收购现有的,你觉得最符合你创意理念的那款app。当然这个看似调侃实则靠谱的回答是没办法说出口的。我语重心长的回答道:“电商类app,只保留必要功能:商品展示、登录注册、购物车、下单支付、订单记录,精简到最简单,只是iOS客户端的实现代码也不可能几天内写完。“
本以为我这么说对方会重新估量开发一款app的复杂度,没想到对方急了:”不用考虑那么复杂,先做出一个最简单的,其他的慢慢迭代。就告诉我最快多长时间能搞定,大概花多少钱就行。“
这就是耍流氓了,好话说了一火车,油盐不进。我要还妄想改变他的想法,我就是2B了。索性开门见山的说:三个月。在团队完备,不改需求的前提下。找个人兼职外包,按平均日薪结算。
对方没再回话,不知道是听从我的建议去紧张筹备项目小组了,还是觉得我是个菜狗,这么点小事竟然张口就说三个月,三个月吃屎都赶不上热乎的了。我估计是后者的概率大。喝了口水抖擞抖擞精神,继续改我的bug。遥想当年我也曾豪言壮语,但到最后都跌的遍体鳞伤……
此类情况遇到N多次了,像这种无关自己工作的外部人士咨询行情的还好,毕竟你只需要给出自己认为合理的建议即可。人家也不一定采纳,说不定只是做个对比筛选,事后成功与否都事不关己。但多数情况下是boss或部门经理会问你这个问题,那回答的时候就不是这样轻轻松松侃侃而谈了。毕竟,说出去的话是要兑现的,挖了坑自己填不上,是要栽进去的。
我认为:任何没有完整功能逻辑原型图就问开发时间的都是耍流氓,有原型图问开发时间事后改需求的都是耍无赖。这两者的共同点就是玩死人不偿命。
为什么开发不能像其他行业那样精准预估工期呢?因为开发工作的变数太大。以最常见的app登录功能举例,常见的登录方式有:账号+密码、手机号+验证码和第三方平台登录。手机+验证码需要找短信服务商,要考虑验证码的送达速度和费用问题。第三方登录需要注册账号,创建应用,以及认证开发者资质。腾讯开放平台创建应用需要填写appid,要想有appid需要在iTunes Connect里创建应用,在此之前必须有苹果的开发者账号,申请开发者账号是要公司级还是个人级的?公司级的需要提供邓白氏码。所有这一切都需要时间审核,部分资质认证、账号注册需要花钱。
以上是平台账号问题,下面说开发问题。有登录就得有注册,要保证用户的唯一性,需要有一个唯一标识。以手机号作为唯一标识的话,采用第三方登录的没有手机号,分配独立用户id作为唯一标示的话,先用手机号登录,再用微信登录,就会产生两个用户,如何实现绑定手机号合并用户呢?还有是否保留账号+密码注册呢?如果保留的话还需要有找回密码功能,找回密码是要邮箱验证还是手机验证码验证呢……
一款app并不是简简单单找个码农,噼里啪啦敲一顿键盘就能完成的。至少需要以下几种角色:产品经理,能拍板项目功能逻辑出原型图,把控整个项目进度和团队配合;设计师,根据原型图做高保真交互设计;服务端工程师,做后台数据处理,提供客户端所需接口;客户端工程师,实现app所有的功能逻辑,性能优化,上架应用市场;测试工程师,测试app功能逻辑的正确性和性能。这些只是角色标配,并非每个角色都对应一个人。比如客户端可能需要Android、iOS、WP多个开发工程师,开发往往会兼任测试工作,后台有时会代理产品经理工作。又或者你是精通设计的全栈工程师,对产品又有资深造诣,那便可以身兼所有角色。所以这里又牵扯到团队协作,再默契的团队都会存在沟通成本,只是成本高低的问题。全栈工程师单人开发,没有沟通成本的单兵作战,时间成本会大大增加。所以说:程序开发是一个充满无数不可预知变化的职业,不可能精准预估工期。
道理我们都懂,那开发一个app到底要多长时间呢?预估工期虽然令人讨厌,但确实是一个客户端程序员该具备的能力。当看到原型图预估时间的时候,往往只估算了敲app代码的时间,而且还是个理想化时间。认为自己胸怀万码,光标到处bug灰飞烟灭,功能实现如有神助,代码编译一次通过,简直是码生赢家啊。现实会毫不留情的给你狠狠地一巴掌。比如一个原型图上有10个界面,都是最简单的push跳转,用Storyboard一个小时就能画完,剩下七个小时写数据展示,so easy啊,然后洋洋得意的告诉boss一天就能搞定。然后Storyboard代码版本冲突了,解决冲突用了仨小时,接口响应方式没指明,参数格式写错了,调了仨小时。六个小时过去后,慌了……
之所以不可预估,是因为存在太多的不确定因素。一些不确定因素会因为经验积累而变为确定因素,另一些不确定因素却会一直存在。程序员拿到需求的时候,需要有一个心理预估,每个功能模块多久能完成,哪些逻辑是我以前写过的,哪些框架是需要谷歌才会用的,哪些页面目前还不能确定实现方法。对每个模块分配一个时间块,不求预估准确,但求时间精确,最后把这些时间块加起来,然后乘一个π值,得到的便是一个相对合理的开发工期预估。随着经验积累,慢慢地不需要乘π值了,乘2.5,乘2,乘1.5……能乘以1那就是大神了,乘以0.x就超神了。其实有经验的产品经理也会以这种方式来计算程序员的工期预估,毕竟有经验的产品经理都是被程序员不擅长工期预估而坑过无数次的。唉,相爱相杀,产品狗何苦为难程序猿,程序猿何苦坑害产品狗。
还有开发一个app要多少钱?这个问题其实不应该问程序员,毕竟程序员大多是写死程序、拿死工资的码农。即便是外包公司的程序员也不会接触到公司业务,除非是谈过外包项目,很有经验的产品负责人才能明白这里的行情。我没在外包公司待过,但私下里接过外包项目,大概了解过外包行情。
找个人接外包一般会有两种工资算法,一种是按日薪支付,一种是按预算均分。按日薪支付是指预估出该项目大概需要多长时间,并与甲方谈妥时间点,找产品做原型,找设计出图,找程序员开发,并按日支付项目参与者在职岗位的平均日薪,当然参与者需要在规定时间内完成工作。按预算均分是指该项目甲方一共能给多少预算,开发该项目的所有人员均分这笔预算。这种方式适合熟人团队开发小项目,例如之前接的一个小项目三万块,后台、iOS、Android一人一万,原型图和设计是甲方提供的,开发时间总计两周。其实有时间的话,还是蛮乐意接这种小外包的。