文档章节

吃自己的狗食——eat your own dog food

国栋
 国栋
发布于 2017/07/17 00:45
字数 1767
阅读 862
收藏 5
点赞 1
评论 2

吃自己的狗食eat your own dog food)是一种比喻的说法。对于软件开发公司而言,意思就是自己要尽量多用自己开发的软件。

唯有这样,才能知道它是不是存在问题;而唯有重度的使用,我们才知道它到底方不方便使用。

现实情况

而令人遗憾的是,软件开发人员常常不是自己开发软件的用户。有很多情况下,可能就是上司交给我们一个任务,需求往往也是客户拟好的。作为一名开发人员,我们只是把开发当作一项任务,一项“工作”而已。

经常的情况是我们对软件的使用场景不熟悉,也不知道软件为什么设计成这样,我们常常只是机械地完成客户交给我们的任务。

如果某个特性客户提到了,那它才会出现在最终的产品中;如果很不幸的客户没有提到,又或者我们与客户之间存在沟通不良(这种情况太普遍),那么这个特性就在我们的产品中消失了!而这个对最终的用户来说可能是很重要的,而我们之所以对这样一个特性的遗漏毫无感觉,一个很重要的原因就是我们并不吃自己的狗食!

一个坏的事例

我曾经用过 XX 词典,它有个单词本,能让你加入在阅读过程中加入的新词,然后它会安排你复习,但是它总是按照你加入这些单词的顺序来呈现它们

那么这会有什么问题呢?我相信很多经常使用背单词功能的人是不难注意到这样一个事实,那就是一个固定的顺序会强化你的记忆,使你很容易在这种顺序的呈现过程中回忆起某个单词的意思,然后你会觉得自己记住了这个单词,但实际上并没有!

但一旦脱离这种顺序呈现的环境,比如你在另一篇文章中再次看到这个单词,你很可能想不起来它是什么意思。

所以,复习过程中的好的做法应该是打乱顺序,每次都使用随机的顺序。

另外一个问题是,你只能加入单词,却不能自行添加一个与之相关的例句,它会在它的例句库中找一个句子与其配对。很多情况下,我在阅读中,碰到一个句子有一个生词我不能理解,查了这个生词后,对我而言,其实最好的例句也许就是这个句子本身,但它却不能让我加入这个例句。

而一个单词常常有很多意思,它配的句子往往不是我原来看到的意思。我经常看一些技术的文章,我也许只关心某个单词在技术领域的狭隘意思,对于它的其它意思我可能并不关心。

所以有些时候,当我复习时,我都想不起来我为啥要加入这样一个奇怪意思的单词,它配的例句与我原来看的差别很大。但我在另一篇技术文章中看到这个单词时,我可能还是想不起来它在技术领域的意思,尽管我可能对它复习了很多次!

事实上,就这个两个问题,我还给软件的开发方发过 email 去反映,因为很多的软件总是说欢迎你给它们提意见,所以我就去提了。

然后我就收到一个热情洋溢的回信(当然也很可能是机器自动回复的),说:“非常感谢你的来信,我们会积极考虑你的提议”之类云云。

其实我给蛮多的软件提过建议,都会收到类似的回信,是不是真的采纳了我就不知道了。

过了一段时间以后,我再去看它们的新版本,没有发现任何改进;再后来,我也没有去关注了,而且我也很少用到它了,因为的确感到不好用。

当然了,我估计他们还是看了我的建议,但是并没有引起他们的共鸣,或许在他们的眼中这些建议是无足轻重的,那么原因是什么呢?我想到的最大可能的原因就是:团队本身很可能就不怎么重度使用这个产品,他们并不吃自己的狗食。

当然,也可能是我以小人之心度君子之腹,又或者我的需求确实比较奇葩,没有代表性。

在他们眼中,或许产品已经是足够好了,不需要再改进了。而如果他们真的是积极地使用自身的产品呢?我想或许都不需要我去提什么建议,这些特性也许就已经在产品中有了。

一个好的事例

必须说,很多时候很多软件都不那么令人称心如意。如果有那么些软件让人用上去感觉很惊喜,作为一名程序员来说,那 IDE(集成开发环境) 可以算一个。

而原因自然也不难明白,因为这程序员开发给自己用的工具!

事实上,很多新的 IDE 版本就是在老版本的 IDE 中开发的,然后这个过程不断迭代。所以这其实或许是一个吃自己狗食的最好例子。

没有比程序员本身更明白自己对 IDE 需求的人了。他们不断在使用这个产品,也最清楚自己还需要什么、产品还有什么不足,而且他们也有这个能力去改进它!

尽管由于复杂性的原因,使用过程还是可能遇到 bug 或不稳定等现象,但必须承认,在 IDE 运行良好的时候,它的确是一个很贴心的工具!

启示

那么,从以上一些事例中我们能得到什么启示呢?

假如你要开发一个比如说炒股的软件吧,你想招聘一个人来负责。有一个人技术很牛逼,基本明白股票的业务,但本身对炒股不太感冒;而另一个人技术也还可以,而同时是一个资深股民,使用过很多类似的软件,甚至能说出许多它们的痛点来。

而你作为负责人,你会招聘谁呢?如果你选择那位技术牛逼的,很大可能你会得到一款很稳定但与此同时也很平庸的产品!

© 著作权归作者所有

共有 人打赏支持
国栋

国栋

粉丝 362
博文 78
码字总数 154046
作品 0
东莞
程序员
加载中

评论(2)

罗格林
罗格林
我觉得这个话题对于开源软件的作者来讲更加敏感。特别是对于大多数为开发服务的开源软件,包括各种框架,各种工具库等等,如果不能自己先吃狗粮(甚至是在相关领域只吃自己的狗粮),基本上这样的项目不会活太久
yinbro
yinbro
很有道理的文章,但是这不是技术人员能改变的现状,与公司管理与激励制度有关
Block作为属性、方法参数、返回值

简介: 首先来概述一下,Block对象提供了一个 特别的(ad hoc)函数,这个函数是使用C和C派生语言(如Objective-C和C++)来创建的一个表达式,Block对象在其他语言和环境中有时候可以理解为一...

吃粑粑的毕教授 ⋅ 2017/10/07 ⋅ 0

"早餐佳"步伐太快扯到蛋了?

我们做研发的,经常说Eat Your Own Dog Food —— 试用一下自己的产品,在用户体验之前自己先把问题找出来解决掉。建议早餐佳的管理团队,至少每天能有一个人吃吃自己的产品吧,再不吃就真变...

肖文峰 ⋅ 2015/08/01 ⋅ 0

python父类继承

源码如下.class Animal: def init(self): self.hungry=True def eat(self): print 'Animal is eating food' class Dog(Animal): def init(self): #Animal.init(self) super(Dog, self).init(......

左手键盘右手鼠标 ⋅ 2014/03/13 ⋅ 4

设计模式-抽象工厂模式

抽象工厂模式 抽象工厂模式优点: 抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族...

wjk_snail ⋅ 2016/03/17 ⋅ 0

java 基础之继承详解实例

编码实现动物世界的继承关系: a) 动物(Animal)具有行为:吃(eat)、睡觉(sleep) b) 受保护得物件(接口)具有得行为:beProtected(); c) 有价值得物件(接口)具有得行为:getMoney(...

lzw_me ⋅ 2014/07/25 ⋅ 0

Eatsa 没有店员的健康速食餐厅

Eatsa 是一家希望全部自动化没有人员参与的健康速食餐厅。创始于2015年,位于旧金山 121 Spear Street。食物以Quinoa(藜麦)为主食,辅以各种健康的食材,保证一顿饭的热量在400~600大卡左右...

陈然 ⋅ 2015/09/16 ⋅ 0

python property内建函数的介绍

函数property的基本功能就是把类中的方法当作属性来访问,下面以一个有意思的例子介绍一下: 假如有一只猫,它忘了它喜欢吃什么,下面看看我们如何治好它吧 原代码: #运行环境 python2.7.10...

happyliferao ⋅ 2015/11/04 ⋅ 0

POJ 3281 Dining (网络流最大流 拆点建图 Edmonds-Karp算法)

Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others. Farmer John has cooked fabulous meals for his cows, but he ......

dsaghjkye ⋅ 2017/11/27 ⋅ 0

我们需要专职的 QA 吗?

这个文章必然是有争议的,我在我的微博上讨论过很多次了,每次都是很有争议的。有不同的观点,有争论总是一件好事,这样可以引发大家的思考。所以,对于我的这篇博文,如果你赞同我的观点,我...

虫虫 ⋅ 2012/04/11 ⋅ 19

OC 对象的补充

之前我们简单的介绍过对象的创建及相应方法和属性的调用,现在我们进行一些补充,在这里跟大家分享下。 ①一个类的方法调用另一个类的属性 先创建两个类,在这里我创建了一个人类和一个食物类...

JoshSone ⋅ 2016/08/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Hive函数

1.函数explode (一转多) create table hive_wc(sentence string); load data local inpath '/home/hadoop/data/hive-wc.txt' into table hive_wc; 结果: hive > select * from hive_wc; ......

GordonNemo ⋅ 13分钟前 ⋅ 0

PE格式第三讲扩展,VA,RVA,FA的概念

作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶VA概念 VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址 这边...

simpower ⋅ 30分钟前 ⋅ 0

使用Java connector消费ABAP系统的函数

Java Connector(JCO)环境的搭建:Step by step to download and configure JCO in your laptop 我的ABAP系统有个函数名叫ZDIS_GET_UPSELL_MATERIALS,输入一个customer ID和product ID,会输......

JerryWang_SAP ⋅ 36分钟前 ⋅ 0

IDEA提示编码速度

焦点移动 将焦点冲代码编辑窗口移动到菜单栏:Alt+菜单栏带下划线字母 将焦点从工具窗口移动到代码编辑窗口 Esc或Shift+Esc 将焦点从代码编辑移动到最近使用的工具窗口 F12 模板提示 Ctrl+J...

bithup ⋅ 48分钟前 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 今天 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 今天 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

python3.6 安装pyhook_3

我的是在win下的,忙了半天老是安装不了, pip install 也不行。 那么可以看出自己的版本是32bit 一脸懵逼 没办法 只好下载32版本的来安装 我一直以为 是 对应32 位的 。 下面是 小例子 http...

之渊 ⋅ 今天 ⋅ 0

004、location正则表达式

1、location的作用 location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。 2、location的语法 = 开头表示精确匹配 ^~...

北岩 ⋅ 今天 ⋅ 0

CentOS7 静默安装 Oracle 12c

环境 CentOS7.5 最小安装 数据库软件 linuxx64_12201_database.zip 操作系统配置 关闭 SELinux sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config 关闭防火墙 systemctl disable ......

Colben ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部