上个月有腾讯前同事介绍了一个外包活给我,是他做外贸的朋友想做一个管理系统。我接受了他的邀请,与他朋友开始对需求进行沟通,大约耗费两周理清了各种细枝末节。我出了一份 13 页的详尽的需求文档给对方,并仔细估出了约两个半月的工作量,给了一份报价。但可能我的报价超过对方预期太多,对方的态度变了,不再像前面一样积极沟通,而是给出了「这个价格做不了啊」后,开始冷处理。最终我也没有再去谈判,猜想对方是拿了我梳理好的需求文档,找其他人做了。

由于是我第一次尝试接外包,我是有意愿做好的。在沟通功能的过程中,我花了很多精力理解他的业务逻辑,理解其中七种不同角色各自负责的功能,并想出很多可能的异常情况,希望做出灵活应对各种可能的系统。最终没接成,我倒没觉得太郁闷,但也必须说对方的处理方式并不道德。

接单过程中也有一些思考和收获,分享给大家。

与客户沟通

与在 IT 公司工作非常不同的一点是,接单中服务的客户往往是 没有技术背景的,也不一定有很强的逻辑性。

这就意味着,沟通过程中不应该使用技术术语,而应讲得尽量通俗易懂。比如客户说:“我希望当订单中有某个产品时,在系统上无法删除此产品”。那你回应他说:“好的,我给数据库加个外键约束”,这种讲法就是没意义的。客户无法也没必要理解外键约束是什么。

这类管理系统中,最重要的往往是数据库的设计。多亏有 Excel 的存在,让客户理解什么是数据库表并不难,但是他们往往不太理解表与表之间是怎样关联的。必要的时候可以画简单的 ER 图帮助客户理解。

另外有一点是,客户在交互上的经验可能很少。因为行业不同,客户往往不会接触到很多交互上做得好的应用,所以他们无法设计出实用的交互方式。这时候你应该替客户去思考,引导他说出他实际想要的效果是怎样,而由你来考虑如何把想法变成实际的操作界面。比如客户提到,某个表格中字段太多,导致他需要左右挪动滚动条,操作非常不便:

带很多列的表格

他希望可以加一个功能,点击后把表格中的一些字段隐藏起来。但是交互上是有多种更简单的方法可以解决的,并不需要做得这么复杂。比如把不重要的信息,用一个 tooltip 来展示:

带 Tooltip 的单元格

或者折叠起来,有需要再展开:

可展开的行

这样就可以兼顾了美观和便利。

做图的经验

为了便于沟通,我在写需求时顺便画了一些图,比如:

图

对于做图,我遇到的问题是:

  • 如何让图相对美观?
  • 如何更好地呈现想表达的内容?

对于美观,大多数图表工具给我的感觉是,预设的图形非常简陋,比如都会有一个简单的黑框矩形、单薄的线条等等,用起来非常丑。但我玩了一阵子后,发现一些简单的方法,能快速提高图的美观程度:

  • 换相对鲜艳、符合内容风格的颜色
  • 用一致的、好看的字体
  • 矩形上圆角
  • 在一些内容块上加阴影
    阴影是最容易提升质感的手段。加了阴影后的矩形就像一张卡片放在画布上一样。但注意不是全部地方都应该加,比如一些单独存在的解释性文字,可能不加更好
  • 适当的地方可以加渐变
    感觉设计圈在 Instagram 的带动下广泛地使用起了渐变。渐变可以提升美感。但像我这个需求文档的场景,最好是不要加渐变,渐变会减少文档本身的严谨感

对于内容呈现的方式,我这个图是参考了 Jen Yip 在她 博文 中的作画:

我日常会留心这类图片,将它们保存到 Eagle 库中作为灵感来源。

工具上我用的是 Lucidchart。但它的免费版对图形数量有很大限制。Creately 也是不错的选择。

对比独立开发者与外包公司

这个客户之所以找我,是因为之前为他服务的外包公司的印度小哥,折腾了大半年还是只做了这个系统的一部分,并且做出来的系统不好用,因此客户想在国内找更好的服务。我也思考了下自己对比外包公司的优劣各是什么。由于没有实际在外包公司工作过,一些想法可能过于主观。

我认为外包公司主要的问题在于:

  • 成本高
    外包公司需要雇人、租办公室、买设备,也可能需要花钱找单子做
  • 人员能力相对差
    对于中国互联网环境,能力较强的人大多会选择大公司,外包公司很难找到很强的人。而且如果想盈利,外包公司也不能招太好的人,毕竟开发过程中最大的成本是人员薪资

因此,作为一个自认为技术还可以的人,我认为我的优势在于:

  • 代码质量高
    意味着给客户提供的软件系统运行更顺畅、少出问题
  • 系统更好用
    外包公司给我印象中,会相对按部就班地完成功能,更多地按自己熟练的方式去做,而不会太考虑客户用起来爽不爽。他们可能不会在交互上动太多心思去设计
  • 沟通成本低
    我一个人干活,不需要多个人一起与客户沟通,也不需要有多个开发一起配合,少了沟通成本

但外包公司也有它的优势:

  • 如果客户需求是相对通用的,而且他们也做过类似需求,那可以快速使用已有的代码来实现
  • 作为公司,在后续维护上会被认为比个人更可靠、稳定。客户可能会觉得,找个人做系统,万一后面这人跑了不维护了怎么办

但经过这次经历后,我认为接单还是要考虑成立一个公司,并包装或者实际组一个团队。因为在报价时,个人是比较吃亏的。对于外包市场,请个人干活时会使用的时薪模型,即是我雇你来干活,双方协商好时薪,然后你估算工作量,最终按工作时间乘以时薪来算钱。但是请公司干活就不用这样算,而是按整个项目来协商一个价格,毕竟客户不知道你投多少人,也无法知道你背后的运营成本,所以这个价格往往可以报得更高。

我认为时薪模型并不好。因为客户可以按时薪来对比你跟公司员工的工资(比如大公司),从而来判定你是不是报价过高。但是为公司工作和自己找单接,在投入程度、技能要求上可能差异很大。公司中工作时可能只需要运用一小块技能,也不一定每天都很投入,但自己接单时的技能要求往往会更广,而且你会想更快完成它。另外,软件开发也不是流水线工人,不是投入多少时间就有多少产出。固定的时薪只是方便双方沟通,更合理的定位方式应该是看完成的质量和速度。

工作量评估

我设想的研发流程很大程度参考了 wemake.services 的流程。我的 wiki 也有一份 总结

由于这次并没有实际开发,我只是估了工作量并设置了几个里程碑。里程碑表示项目的某个重要时刻,在每个里程碑时会将已有的半成品交与客户体验,并收集反馈。

我使用了 GitLab 的 issue board 来拆分任务并评估时间:

并将任务分进了几个里程碑中:

感受

最后来谈谈外包开发的感受。

我觉得,对于外包开发,如果接的单能抽象成一个通用的系统,并且服务很多不同的客户,那最终它可以做成你的产品,这是挺好的。但假如不能,即使你作为个体不再服务于一个公司,接单也只是一份工作而已。但外包开发也有他的优点,就是你可以多了解外面的世界,看看别人在做什么,他的商业模式是怎样的,可能对整天埋头在技术中的人会有一些帮助。

评论系统被墙,可以发邮件到 onlyice0328@gmail.com 与我交流。