工程师的产品观

我常常对我曾供职的两个公司感到遗憾,因为我觉得这两个公司发给我的工资完全就没有赚回来嘛。A公司,参与开发的一个项目不了了之;B公司,负责开发的项目上线三个月之后公司便停止维护。

如果产品决策失误,作为程序员,是不是就写了一套没有多大价值的代码。谁都不希望自己参与的项目夭折,虽然多少有些身不由己,但我还是希望自己仍然能够生产出更多的价值。

也许有人认为“拿钱干活”就好了,何必要关心产品层面的事物。从某种意义上来说,我认为程序员只是一个生产力工具,生产工具的价值在于其所生产的产品,好的生产工具也会为了产品而优化自身,所以我们程序员应该具有带着对产品的思考去思考代码,让自己成为更优秀的生产力工具。

提炼(Design)

  • 产品观:提炼需求
  • 程序员:模型与架构设计

一个软件应用替代的是现实中的服务的一个或多个环节,我们所参与构建的大多数应用是将现实中的服务转变为机器(屏幕)提供给人的服务。无论现实还是应用软件,都需要满足人们的具体需求。产品经理需要提炼现实中的需求,设计产品的功能和交互,从而能够满足相应的需求。

对于程序员来说,有两件事最头疼,一件事是起名字,另一件事则是设计模型。模型设计是程序的基础,每个模型应该包含哪些属性,各个模型之间有什么样的关联或关系。如果能设计合理,符合事物的本质,就能够具备良好的扩展性。相信不少程序员在开发的过程中都或多或少有过一些纠结:这个模型当初为什么要这么设计。

之前我参与过一个项目,需要配合食物库开发一套电商系统。与传统的电商系统有区别的是,食物库中只有一部分是会销售的。如果这个食物没有销售,那么它就仅仅只是一个食物,只有当它可以被销售的时候,这个食物才是商品。也就是说商品所具有的属性是由销售所产生的,比如价格、库存等。于是我们重新设计了一个商品的模型,这个模型不包含任何食物本身的信息,而是仅包含作为交易物品所具有的属性,然后围绕商品为中心,设计了供应商,交易等一系列模型。 当这个开发工作结束的时候,我惊奇的发现,这套电商系统很容易通过改造让现存的系统具备电商功能。这就是由良好模型设计让代码所具备的灵活扩展的能力。

通用(Common)

  • 产品观:用户体验的一致性
  • 程序员:代码复用

在应用程序的人机界面中,良好的用户交互需要具备一个重要原则:一致性。UI的一致性可以降低用户的学习成本,让用户觉得系统更容易上手和使用。比如统一的菜单样式,统一的视觉,统一的输入处理。这些需要保持一致的模块,体现在我们程序员的工作中,是一定可以将其作为一个可以通用的模块进行coding的。

大家都知道我们写代码有一个重要原则:DRY(Don’t Repeat Yourself),为了达到这个目标,我们需要知道那些功能是可以通用的,该通用性功能剥离出来的代码,就可以形成通用的模块。

我曾经供职的一个公司,产品线颇多,每个小项目由不同的产品经理负责,没有统一的UI,每个新项目都是独立的设计师完成设计,我们开发的时候就只能按着设计师提供的设计稿还原界面。

如果可以从品牌层面统一UI风格,统一交互形式,我们程序员也就可以更容易提炼出一套通用的代码。这些通用的设计和代码其实都是一个企业的积累,如果没有这些积累,不论这个企业做了多久,它做的每一个产品都仍然像是一个创业企业从零开始做的产品。最终我们为了能够写出更通用的代码,我们也促成了公司在产品层面的一致性设计,这也算是程序员推动企业产品进步的一个案例。

取舍(Better Choice)

  • 产品观:功能的取舍
  • 程序员:代码的取舍

取舍的问题,是成本与收益的问题。优秀的产品往往会聚焦到核心功能上,然后围绕核心功能展开设计,我们见过太多想做成大杂烩最终做成了四不像的失败产品,这些产品失败就败在取舍。将有限的资源应用到最值得投入的地方,才能产生最大的收益。

我们程序员的时间就是宝贵资源,对于我们来说,产品在功能上的侧重和取舍,也是我们在代码层面的取舍。有些临时的功能,非核心的功能就可以不必过分追求代码质量。同样的写测试,并没有必要100%测试覆盖,而是覆盖核心功能,经常被调用的方法,经常被使用的模块就需要最佳实践良好设计。

我们做项目,偶尔会遇到时间紧任务重的时候,客户对某个功能实现的期望比较急切。我现在所参与的项目,需要实现一个报表功能,与我们一起合作的有一个来自歌舞之乡印度的程序员,这位同仁为这个报表系统的前端开发引入了最新的JS框架React,因此这个报表做了大概一个月左右。当我接手的时候,还需要实现剩余6个报表功能的UI,我并没有贪恋新技术,而是采用成熟的方案去实现,仅用了不到2天时间去实现了所有剩下的UI功能,效果也一样。我觉得这种取舍是有必要的(当然不排除印度哥们是为了练技术)。

作为一名工程师,我们是帮客户实现一个应用产品,而不是去完成客户的指令。所以从产品层面去思考我们的工作,我觉得还蛮有意义的。

结语

从业几年来,经手的完整项目有了一些了,电商、社交、学习系统、医疗系统等都有所涉及。工作越久,就发现所参与开发的各套系统之间通用的部分越来越多。我最大的收获就是通过深入分析每一个功能,将其分离组合成一些通用的模块。模块化及复用代码是快速制造,保证质量,降低成本最有效的策略。我甚至有一个大胆的设想,在自己数年的工作之后,我会积累出足够数量的“积木项目”,当有新项目的时候,就从自己的“积木库”里挑出来组合一下。然后就去喝喝茶,坐等客户结账。