怎么高效的开发一款成功的产品?Working Backwards

news2024/11/18 5:49:49

过去的几天一直在回顾整个产品团队过去一年所做的工作,有的工作有亮点,有的工作可以说是乏善可陈。对于不好的,发现其中的一个核心原因就是没有坚持“以终为始”的原则。现将我2021年10月写的一篇公司内部博客再次分享给团队,也分享给所有关心TDengine发展的开发者和朋友们。

亚马逊的两位前高管Colin Bryar与Bill Carr离开亚马逊后,前不久出版了一本书:"Working Backwards: Insights, Stories, and Secrets from Inside Amazon", 让大家对亚马逊的工作原则之一”Working Backwards"有了更多了解。按照中国人的说法,亚马逊的这条工作原则其实就是“以终为始”。做任何事情,先想到结果和目标,然后倒推怎么达到这个目标,之后再启动执行。

Working Backwords是一提高工作效率的极为有效的方法,因为几点:

  • 做任何事情,我们一定要先清楚目的和目标;

  • 很多时候,我们对问题或任务只有一个模糊而不清晰的了解;

  • 如果对要解决的问题和任务有清晰的描述,其实问题已经解决了一半;

  • 不仅问题很清晰,而且解决的步骤、计划反复推演了,问题已经解决了大半;

  • 初期的投入时间多,都大大节省了后续的时间,而且让任务的完成时间可预期。

34825a6041850c2c8b4dadcaf3c3f15c.jpeg

细看涛思数据过去4年多的发展历史,如果仔细分析,我们所有高效完成的任务一定是有意或无意中执行了“Working Backwards"的原则。对于效率差的,一定是偏离了这条原则。大道理一听就明白,落实到我们具体工作上,特别是产品的研发上,我们要怎么做呢?对于任何一项新功能,大版本的开发,我们应该有一个什么样的工作流程呢?按照这条原则,我们做事的先后顺序是:

1:起草新功能、大版本的宣传稿

这个新闻稿不能太长,原则上不能超过一页。在这个简短的宣传稿里,我们需要给用户清晰的介绍:

  • 新的功能和特性;

  • 这些功能和特性能给用户解决什么问题;

  • 这些功能和特性能给用户带来的价值,列出三点而且至多三点;

  • 这些功能和特性与竞品相比,好在哪里,列出三点而且至多三点;

这个新闻稿,不仅自己看,还要给销售、BD同学看,给潜在的客户看,看是否能打动他们体验一下产品。如果没人动心,说明工作的价值不够,或者是亮点没有突显出来,让大家意识到它的价值。

2:起草好用户手册

用户怎么使用这个产品至关重要,具体而言,用户手册需要包含:

  • 用户有那些方式使用,SQL的支持, connector, API, 编程语言等;

  • 用户如何配置进行个性化设置;

  • 用户如何监测产品的运行;

  • 用户如何从老版本升级;

  • 用户如何从其他系统迁移;

  • 用户如何快速验证性能指标

只有起草好用户手册,我们才真正的将需求细化、落实,才能与需求方完全确认是否满足需求。也只有起草好用户手册,测试团队才能尽早介入。

3:模块划分,定义模块API

产品定义清晰了,就需要真正做设计了,进行模块划分。怎么划分模块,包括源文件的目录结构,有自己的规则。但无论如何划分,我们需要做到:

  • 模块对外服务的API有清晰的定义,输入参数、输出参数,是否线程安全等,都有清晰说明

  • 模块的性能预期,验证工具

  • 模块对外的依赖很清晰

划分了模块,而且定义了模块的API,实际上就是将模块的功能完全确定了,也就是对模块的需求完全确定了。更进一步,我们需要马上将所有模块集成,所有模块的API都可以是一个dummy的实现,而且马上将整个系统纳入到公司的CI/CD流程,要让它跑起来。这样做,有几个明显的好处:

  • 如果测试组人手宽裕,这个时候就可以介入模块的功能测试和性能测试了;

  • 任何人都不能随意修改API,而影响依赖它的模块;

  • 人手不够,可以将某个模块外包,或先用第三方软件代替;

  • 对于极为关键的模块,可以启用两个team并行开发;

4:模块本身的设计

定义好模块对外服务的API后,我们就可以着手模块本身的设计了。模块设计的原则在本博客不做讨论。

5:编码、测试,不断迭代

在模块设计定稿后,就可以开始编码,进行模块测试了。而且由于CI/CD已经跑通,随时可以跑整个系统的测试,每天都会看到有新的PR,有功能在实现。

以上五步,其先后顺序极其关键,必须按照顺序执行。表面上看,这个流程与我们倡导的敏捷流程有矛盾,但其实不是。敏捷流程强调的是一个一个Sprint完成工作,是小步快跑。上述流程是更大的产品开发流程。

在我们以前的产品研发过程中,我们都没有主观意愿按照这个顺序进行,必须纠正过来。

除产品研发工作之外,我们在销售、市场的工作也应该执行这个工作原则,而且这个工作原则与我倡导的《做事的四个原则》是完全一致的。可以说,"Working Backwards"这个原则在销售、市场工作的更具体的执行,是《做事的四个原则》。

陶建辉

2021年10月3日于北京望京


👇 点击“阅读原文”,体验 TDengine 3.0!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Simple Yet Effective Graph Contrastive Learning for Recommendation

1. 摘要 图神经网络(GNN)是一种强大的基于图的推荐系统学习方法。最近,结合对比学习的gnn在处理高度稀疏数据时,在数据增强方案的推荐方面表现出了优异的性能。尽管它们取得了成功,但大多数现有的图对比学习方法要么在用户-项目交互图上执行随…

JAVA零基础小白学习教程之day08_接口多态

day08-JAVAOOP 课程目标 1. 【理解】什么是接口 2. 【掌握】接口的定义格式 3. 【掌握】接口的使用 4. 【理解】接口的成员特点 5. 【理解】类和接口 抽象类和接口之间的关系 6. 【掌握】单继承多实现 7. 【理解】接口之间的多继承 8. 【掌握】接口的案例 9. 【理解】什么是…

一个程序员的新冠防护最佳实践

至今未阳,做了几次抗原检测都是阴性,所以把个人的防护经验给广大程序员朋友分享一下,尤其家里有小孩老人的可以参考一下。 我一天的防护操作 1、午餐 吃午饭时,走楼梯不去挤电梯,而且是在其他人吃完饭后&#xff0c…

Unreal Engine中调试常用方法

目录 常用调试方法 AddOnScreenDebugMessage UE_LOG:在控制台看调试信息 在蓝图中直接调用PrintString 自定义日志分类 声明 定义 简化日志输出的宏 日志格式化输出 常用调试方法 在虚幻引擎中常用的打印日志方法有三种,分别是:UE_…

C++运算符重载,匿名对象

目录 1、加号运算符重载 1.1 通过自己写成员函数,实现两个对象相加属性后返回新的对象 1.2通过成员函数实现加法运算符重载 1.3通过全局函数实现加法运算符重载,运算符重载也可以发生函数重载 1.4总结--对于内置的数据类型的表达式运算符是不可以改变…

Python+Requests实现接口自动化测试

一般对于自动化的理解,有两种方式的自动化。 第一,不需要写代码,完全由工具实现,这种方式的工具一般是公司自己研发的,方便黑盒测试人员使用。这种工具的特点是学习成本低,方便使用,但是通用性…

面向5G C-RAN组网的机房配置标准与模型

【摘 要】当前5G网络建设成本高,投资压力大,基站建设进度受铁塔公司制约;基站机房电费、租赁、服务费用逐年上升,运营维护压力大。面向未来5G建设,通过C-RAN组网,实现BBU集中化部署,可促进降本增效,实现低成本建网。首先分析了C-RAN区所处的网络位置,其次从BBU框多基…

java基于springboot的心理健康管理网站-计算机毕业设计

运行环境: 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 应用服务:Tomcat7/Tomcat8 使用框架springbootvue 项目介绍 心灵治愈交流平台的主要使用者分为管理员和用户、心理咨询师,实现功能包括管理员:首页、个人中心、系统公告管理、用户管理、心…

网上订餐项目(附源代码及数据库)

目录 一、项目概要 二、项目展示 三、数据库 四、项目源码 五、毕设专栏 首页 登录界面 注册页面 一、项目概要 系统主要功能模块有: (1)首页菜品:主要包括购买菜品、菜品加入购物车的功能 (2)我的…

django-rest-framework

文章目录 (1)Web应用模式及API接口 (2)Restful规范 (3)drf安装和简单使用 (4)源码分析 (5)序列化器-Serializer (6)局部和全局响应配…

STL篇之vector

一、介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它…

NR HARQ (四)dynamic codebook

微信同步更新欢迎关注同名modem协议笔记 上篇提到type-1 HARQ-ACK codebook,即semi-static codebook,UE要为每个PDSCH候选位置生成反馈,也会包含实际没有下行传输的PDSCH,再加上配置CBG的场景,HARQ-ACK 码本中包含的无…

SpringBoot系列之数据库初始化-datasource配置方式

在我们的日常业务开发过程中,如果有db的相关操作,通常我们是直接建立好对应的库表结构,并初始化对应的数据,即更常见的情况下是我们在已有表结构基础之下,进行开发; 但是当我们是以项目形式工作时&#xff…

java微信支付v3系列——3.订单创建准备操作

微信支付的下单操作分为了5种,分别是JSAPI、APP、H5以及Native支付及小程序支付,之所以将支付放在单独一个章节,而不是按照支付类型划分一个章节,是因为支付所传递的数据都是相似的,方便我们更好的封装。 本章节是支付…

20221222英语学习

托福词汇 sociology n.社会学 given adj.规定的,特定的;假定的 narrative n.叙述;记叙体,叙述技巧 deplore vt.悲叹,哀叹,公开谴责 despoil vt.夺取,掠夺;毁坏,破坏…

Kubernetes:环境搭建

文章目录1、k8s 概念1.1、基本概念1.2、基本术语2、k8s 架构2.1、k8s 节点2.2、k8s 组件2.2.1、master 组件2.2.2、node 组件3、k8s 集群安装配置3.1、docker3.2、主机环境调整3.3、安装 kube 工具3.4、Master 节点初始化3.5、node 节点初始化3.6、重置节点4、k8s 集群升级4.1、…

基于node.js网上蛋糕店系统的设计与实现(论文+项目源码)

随着互联网应用技术的突飞猛进。信息化广泛使用,已渗透到各行各业。作为代表的以网上购物商城为例。它极大地改变了人们的出行方式以及线上购物发生的转变。网上购物的需求也随着人们的个性化定制而变得相对复杂。用户量以及需求量在网上商城也带来了很多商家的考验…

c++primer第2章 变量和基本类型

文章目录第2章 变量和基本类型2.1 基本内置类型2.1.1 算术类型2.1.2 类型转换2.1.3 字面值常量2.2 变量2.2.1 变量定义2.2.2 变量声明与定义的关系2.2.3 标识符2.2.4 名字的作用域第Ⅰ部分 c基础 语法特征 类型 变量 语句 控制结构 函数补充:自定义数据类型(语言扩展…