首页 分类 关于我
ruby
Nginx 配置示例 工程师的产品观 理理File/Dir/Pathname(一) TracePoint介绍 ruby中的return 如何动态改变某个class的祖先链 ObjectSpace介绍 Rails日志实现探索(3) Rails日志实现探索(2) Rails日志实现探索(1) Rails中的request rescue exception in ruby 设计模式之观察者模式 require 的故事 ruby中的编码 研究ruby的一些小技巧 Rails中间件 ruby对象的序列化 ActiveSupport宝藏之MessageVerifier 如何写rakefile Ruby on Rails 环境及准备 基于Rack的项目初始化
git
如何移除某次提交之前的版本历史 Git 不常用的好用的命令 Git高级技巧之忽略文件
database
Mysql数据库编码 从mongodb向mysql迁移数据
工具
搭建ipsec服务
linux
Linux 常用查看命令

工程师的产品观

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

当然,这么说多少有些调侃,并非真的有多惭愧,我只是在想:如果产品决策失误,作为程序员,是不是就写了一套没有多大价值的代码。谁都不希望自己参与的项目夭折,虽然多少有些身不由己,但我还是希望自己仍然能够生产出更多的价值。

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

  1. 提炼(Design) 产品观:提炼需求 程序员:模型与架构设计

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

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

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

  1. 通用(Common) 产品观:用户体验的一致性 程序员:代码复用

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

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

我曾经供职的一个公司,产品线颇多,每个小项目由不同的产品经理负责,没有统一的UI,每个新项目都是独立的设计师完成设计,我们开发的时候就只能按着设计师提供的设计稿还原界面。 如果可以从品牌层面统一UI风格,统一交互形式,我们程序员也就可以更容易提炼出一套通用的代码。这些通用的设计和代码其实都是一个企业的积累,如果没有这些积累,不论这个企业做了多久,它做的每一个产品都仍然像是一个创业企业从零开始做的产品。最终我们为了能够写出更通用的代码,我们也促成了公司在产品层面的一致性设计,这也算是程序员推动企业产品进步的一个案例。

  1. 取舍(Better Choice)

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

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

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

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

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

© 2018 www.xinshengyin.com All rights reserved.

版权所有