0%

使用在线表格airtable进行软件开发管理

2019年的冬天爆发新冠病毒疫情,而我正处于这次疫情的中心武汉,除夕我带着大儿女回到武汉郊区的农村老家,而老婆带着刚满一岁的小儿女留在武汉城区,那个时候已经公布人传人,武汉也刚封城,我虽然意识到严重,但还没有惊慌,执意回了老家。直到后来确诊人数暴增,大量疑似病人无法入院治疗,网络上各种无助的求救,才开始担心起来。现在回想起来决定回老家非常冒险,万一感染亲人将不堪设想。

春节过后,因为疫情,工作中多了一些相关的统计工作,例如统计在家远程办公时长、统计复工情况、统计外地返汉信息等等,经常需要把团队的反馈合并到一起,非常的繁琐。于是我开始寻找一款能够协同编辑的在线表格,让我找到了Airtable,瞬间解决了困扰我的问题,真是如获至宝。

随着复工时间一再推迟,在家远程办公将成为一种常态,怎么做好远程办公是需要好好琢磨的一个事情。怎么样让大家分散各地,但是能够行动一致、高效的工作,是非常有挑战的。这周经过一番折腾,利用Airtable把团队的任务管理起来,我觉得是一个很好的尝试,也让我更加喜欢上Airtable。

Airtable解决了一个很重要的问题,就是度量和可视化。所谓没有度量就没有改进,管理中需要量化各种数据,这些数据会成为一把戒尺,有意无意中规范影响大家的行为。选择什么的度量指标,是因时因事而异的。再好的项目管理软件也不可能面面俱到,满足各种需求。而Airtable的纯粹,就是为了处理数据、显示数据,可随心所欲定制,成为了它的过人之处。

下面我就详细说说,我是怎么几小时内就用Airtable打造一个软件开发任务管理系统,我对它非常满意,而如果要开发一个类似的项目管理系统绝不是一时半会能办到的。

Airtable简介

Airtable是一个国外的在线服务,注册后即可使用,分免费和付费版本。Airtable中按照workspace-base-table三级来组织数据,一个workspace中可以有多个base,一个base下有多个table。base下的table之间可以关联,但是跨base的表是不能关联的。

Airtable免费版本不限制base数目,只限制每个base最多1200条记录,2G附件空间,具备团队协作功能,这就完全可以满足一个小团队的使用,大不了数据满了再开一个base,非常厚道。收费版本是按照每workspace以及workspace中的用户数来计算费用,记录数和空间更大,具备高级功能,首次注册可试用15天pro版。

与excel区别

Airtable和excel虽然有相似功能,但设计理念完全不同于excel。Airtable的base和数据库很像,其中每个table,每一列有固定类型和含义,而excel就是二维的单元格,可随心所欲编辑。正因为如此,Airtable和excel在公式的使用上存在很大不同,例如:

  • Airtable的公式是定义在列上的,也就是应用在列的所有单元格,而excel的每个单元格可以定义不同的公式;
  • Airtable的公式不能跨table,需要借助关联表实现跨table,并且公式总是访问本行数据,而excel的公式可以访问其他sheet数据,也可以访问本sheet任意单元格数据。

实际上Airtable不是一个在线excel,它更像一个开发平台,凡是基于关系数据的信息处理系统,都可以用它实现。

主要功能

视图

用于展现和操作表的界面,有Grid、Form、Calendar、Gallerv、Kanban几种,Grid是最常用的,新建table时默认建立一个Grid视图。一个table可以建多个视图。Grid视图中有过滤、分组、排序、着色等功能。过滤不像excel那样在列上操作,感觉没有excel方便,每个视图可以设置不同的过滤条件。

表建模和数据操作

就像设计关系数据库一样,使用Airtable提供的字段类型,将表及关联设计出来。字段类型大概有这么几类:

  • 输入字段,例如文本、数字、选择、checkbox等;
  • 公式字段,是基于其他字段计算出来的;
  • 表和表之间的关联是通过特殊的字段类型Link to another record建立,基于关联字段可以做一些查找和聚合计算,包括rollup、lookup和count几个字段类型,可以实现丰富的报表统计;
  • 另外还有自增、创建时间、最后更新时间等有用的字段类型。

blocks

可以理解成基于上述表的小应用。主要有可视化、数据操作、报表等应用。感觉下一步会做成开放平台,第三方也可以开发blocks,拭目以待。

协作

Owner可以邀请其他人一起协同工作,可基于workspace级别或base级别,不能基于表级别。协同者有Creator、Editor、Commenter、Read only几种角色,权限由高到低。协同编辑时可以实时看到其他人编辑过程,很酷的体验。

模板

也就是预定义好的表模型,创建base时选择,开箱即用。

理解表的关联

表的关联是实现复杂的报表统计的关键。

主键

每个表的第一列总是主键,不能移动或删除。主键倒不是说内容必须唯一,而是在关联表字段选择时呈现的就是主键的内容,最好能够区分不同的行,但不是强制的。实际上Airtable内部有每一行的唯一标识,可以通过公式RECORD_ID()获取。

建立A表到B表的关联,是在A表中建立一个Link to another record类型字段,并选择B表。那么在编辑此字段会弹出选择界面列出B表的所有记录。此字段可以设置是否允许多选,如果否,则只能选择一条记录,那么A和B就是多对一的关系。如果允许多选,那么A和B就是多对对的关系。A中建立关联字段后,B表中也会自动建立一个关联字段和A关联,这个字段默认是允许多选的。两边是联动的,都可以进行编辑,一般我们会将一边隐藏掉,总是从另一边进行编辑。

rollup、lookup、count字段类型

这几个字段类型必须先建立Link to another record字段,通过Link to another record字段的内容进行查询或计算。

  • lookup和rollup是针对关联的表中相关记录的某个字段,选择Link to another record字段字段后还需要选择关联表的某个字段,区别是rollup还可以择应用一些聚合函数,例如SUM、MAX等;
  • lookup和rollup只能对关联表的一个字段进行统计,如果希望作用于多个字段,可以在关联表中建立一个公式字段先把多个字段组合在一起;
  • count只需选择哪个Link to another record字段,统计选择的个数,其实用rollup也可以实现,相对于是对rollup的特化。

值类型

上述字段的值类型,在官方文档中没有找到明确说明,通过测试验证结果如下:

  • Link to another record
    • 公式字段访问时为字符串,如果是多选,则是", "分隔的字符串。如果要统计其个数,一种方法是建立count字段,另一个方法是通过公式LEN({field})-LEN(SUBSTITUTE({field给},",",""))+1
    • rollup字段聚合函数访问时为数组
  • lookup:同上
  • rollup:同聚合函数的返回类型,其中有几个特别注意是返回的数组类型,包括ARRAYCOMPACT、ARRAYFLATTEN、ARRAYUNIQUE,它们的返回值可以应用COUNTA公式得到数组长度,如果需要当成字符串使用则要使用ARRAYJOIN或CONCATENATE先转成字符串。针对数组类型,我遇到一个需求,想把两个数组连接起来,并去掉重复值,Airtable提供了去除数组重复值的公式,但是没有提供连接数组的公式,没有办法实现这个需求,有所遗憾。
  • count:数字

实现目标

我的出发点很简单,希望大家有一个统一的视图,都可以看到有哪些任务,任务的进展状态。同时能够量化显示完成率,完成得分等数据并进行排序,形成彼此之间的对比,从而让大家清楚做什么并努力达成目标。

组织结构

我管理的团队共26人,我希望划分成若干个小组,通过小组长帮助我管理好任务。小组长要负责任务的计划、跟踪和状态更新。

管人方面

  1. 我希望看到每个人的工作量及排序,以此确定任务安排是否饱满和均衡;

  2. 我希望看到每个人的任务完成情况得分及排序,这个得分体现了是否按时完成,完成质量如何,以此牵引大家按时保质完成任务;

  3. 我希望团队组长每周汇报团队相关任务的进展,以便我及时发现问题,做出调整;

管事方面

  1. 任务有两种,一是开发任务,一种是Bug处理任务,这两种是存在区别的,我希望需要区别对待;
  2. 我希望任务是分级的,类似scrum的Epic-Theme-User Story,我只关注顶层的任务,团队组长关注下级任务,我觉得2级就够了,至于下级任务按什么方式定,是按scrum的固定周期迭代,还是长任务,不是我关心的;
  3. 我希望从顶层任务的视角能够看到完成率及排序,从而清楚总体的任务完成情况如何;
  4. 我希望从顶层任务的视角能够看到工作量及排序,从而清楚工作投入的分布;
  5. 我希望具体任务视图能够有一些明显提示任务快到期或已经超时。

创建表

这里,进入我分享的base,详细查看字段类型和公式,还可以实际体验一下。

根据以上需求,首先建立表结构,如下图所示。

image-20200226084700156

(1)上述聚合关系表示关联表,n:1是单选,m:n是多选;

(2)团队和成员表定义了团队分组;

(3)Backlog是一级任务,任务和Bug是二级任务;工作量和完成信息定义在二级任务里面;

(4)Backlog通过任务分类表进行一个分类;

(5)Bug级别表中定义了一些参数,用于计算Bug工作量;

(6)任务可能由多个人承担,例如前端和后端都需要开发的功能,所以可以分派给多个人;Bug只能分派给1个人;

(7)任务和Bug中的负责人,用于提示此人负责任务的创建、跟踪更新及评价,完成表格的所有编辑工作,编辑工作不能开放给所有成员。任务分派给多人正好跨团队时,责任人等于创建人,否则等于团队负责人。Bug的负责人就是分派给的团队负责人;

(8)周报的粒度是一级任务,每条一级任务每周汇报一次。

总结几点使用技巧:

(1)下拉选择的字段,可以创建一个table,然后与其关联。这样一来可能增加可定制性,有变化时不用修改表定义,只需修改表数据,二来可以基于选择内容进行统计;

(2)隐藏字段用处大,就像变量一样。有时必须借助隐藏字段才能实现功能,例如统计完成率,下面会有介绍;有时可以简化公式,还能增加复用性;还例如过滤功能不能进行复杂的逻辑组合,只能要么全部与,要么全部或,这时可以通过增加隐藏的公式字段来实现复杂逻辑。

指标设计

工作量统计

对于任务:由团队负责人给出任务估计工作量,如果任务由多人承担,则每个取平均值,然后在成员表和Backlog表中建立rollup字段,对任务表工作量进行sum,得到任务总工作量。

对于Bug:采用简化处理,工作量直接和Bug级别相关,等于{Bug级别权重}*{Bug工作量基数},这两个参数定义在Bug级别表中,同样在成员表和Backlog表中建立rollup字段,对bug表工作量进行sum,得到Bug总工作量。

再分别建立公式字段,将上述两个字段相加得到总工作量。

这样从成员表和Backlog表都可以看到汇总的工作量情况。

负荷率统计

主要针对任务,衡量某个人的任务安排是否饱满合理,体现了团队负责人任务计划的能力。合理的负荷率应该是比100%稍高,如果负荷过高通常是估计工作量过高或计划完成时间不合理,也有可能没有考虑一个人分派多个任务的叠加情况。如果负荷过低只有一种可能,就是安排任务过少。

在任务表中建立公式字段计算任务周期,也就是任务从开始到结束持续的时长,这里将创建时间当成任务开始时间。

1
IF({计划完成时间},(DATETIME_DIFF({计划完成时间},{创建时间},"seconds")/(60*60*24)),0)

然后建立公式字段,计算平均日工作量,单位小时。

1
IF({任务周期(天)}<=0,0,IF(IS_AFTER(NOW(),{计划完成时间}),0,{平均工作量(天)}*8/{任务周期(天)}))

然后在成员表中建立rollup字段,对任务表的平均日工作量sum,得到这个人的任务平均日工作量,最后建立公式字段,得到平均任务负荷率。

1
{任务平均日工作量(小时)}/8

完成率统计

rollup的count聚合函数没有条件过滤特性,所以没法一步到位,需要借助中间字段。

首先在任务表和Bug表中建立公式字段,根据状态计算是否完成,完成则填入值,为完成为空。

然后在成员表和Backlog表中建立rollup字段,通过counta聚合函数计算完成数,同时建立count字段计算总数,最后建立公式字段,完成数除以总数,得到完成率。

评分系统

设计评分规则如下:

得分={评分}(只有任务有,Bug无,按时完成才能得到)+{工作量(天)}(完成才能得到)+{提前(天)}(负数表示超期,完成或超期时开始计入)

评分体现完成质量,前提是按时完成才能得到,超期不能得到,团队负责人要对任务进行验收,验收通过才能视为完成;工作量体现工作付出,必须完成才能得到,也就说要负责到底;提前体现了鼓励大家增量付出。评分规则的牵引方向是按时完成任务,鼓励提前,提前有加分,超期有扣分。

  • 对于任务

提前:

1
IF({计划完成时间},IF({Completed},DATETIME_DIFF({计划完成时间},{状态最后更新时间},"s"),DATETIME_DIFF({计划完成时间},NOW(),"s")),0)

得分:

1
IF(AND({提前(秒)}>=0,{Completed}),{评分},0)+IF({Completed},{工作量(天)},0)+IF(OR({Completed},{提前(秒)}<0),{提前(秒)}/(60*60*24),0)
  • 对于Bug

提前:

1
IF({计划解决时间},IF({Resolved},DATETIME_DIFF({计划解决时间}, {状态最后更新时间},"s"),DATETIME_DIFF({计划解决时间},NOW(),"s")),0)

得分:

1
IF({Resolved},{工作量(天)},0)+IF(OR({Resolved},{提前(秒)}<0),{提前(秒)}/(60*60*24),0)

然后在成员表和Backlog表中通过rollup字段对得分进行求和汇总就得到总得分。

总结

image-20200226111736448

你是否也喜欢上Airtable,短短数小时之内,你就完全可以打造一款为你量身定做的表格系统。Airtable中已经包含许多适用于特性用途的模板,可以直接拿来使用,非常方便。

Airtable的统计功能主要是基于关联表和rollup类型字段,其设计非常简洁,甚至简陋,聚合函数功能并不算丰富,只能基于一列聚合,但是其设计又恰到好处,通过变通技巧还是可以实现复杂功能。另外Airtable提供了curl和JavaScript接口,可以集成第三方工具实现更加复杂的功能,例如和IFTTT或Zapier集成。

image-20200226120235382

当然Airtable也不是万能的,它并不能取代项目管理系统,它还是一个表格系统,缺乏很多项目管理必要的特性,例如工作流管理等等。我主要是在管理团队中使用Airtable,其他人只读查看,因为编辑权限是base粒度的,不能放开给所有人。但是我的需要也不是一个完整的项目管理系统,我只需要能够灵活定制并呈现度量指标,Airtable完全可以胜任。此前我使用过JIRA、Redmine这类项目管理系统,它们也可以自定义字段,但是没有公式和聚合统计这种特性,通常需要通过插件实现,所以定制性受到很大限制,期待有一天它们能够吸收Airtable的特长,让鱼与熊掌可以兼得。

-------------本文结束感谢您的阅读-------------