我厂 OpenResty Inc. 是一家创业公司,也是一家全员远程的公司。我厂支持团队成员在全世界范围内,任意选择时间和地点进行工作。
像我们这样的公司并不多。不过就眼下这个情景,可能很多公司、很多同学,都要或主动或被动,或长或短地选择远程工作。那么作为一名在远程公司中将近两年半的程序员,我想跟大家分享一些远程工作的体会。
分享的内容会集中在我认为大家可能会忽视的点,一些显而易见的点,比如找到靠谱的人做靠谱的事、打字说不清楚就赶紧视频音频、决议要落实到邮件,这种放之天下皆准则的道理,就不再赘述。
本文中的“远程工作”
首先我们要给远程工作划定一个范围。本文中的“远程工作”,有几个标准:
- 软件开发公司,或者,软件开发是主业
- 要有自己的愿景和独立产品
- 这个公司或团队会采用科学可靠的流程管理方式开发产品
- 这个公司或团队本身专业可靠
至于接私单、做外包、搞咨询,我经验不多,就不在讨论范围之内了。
在这样的公司里远程工作,其实跟在普通公司上下班打卡,并没有很大的差别:
- 大家多半也要在特定时间里边,按照项目计划,做特定的工作
- 每项工作都有交付物规定、验收标准
- 工作强度不小,8x5 是最低标准
差异更多的表现在工作形式上,比如上下班时间、工作地点等。远程工作者有更大的选择余地。为了能够真正做到这一点,远程工作多半会采用结果考核,即只要求大家准时提交工作结果,而不强调让大家保证工作时间。
当然也存在更严格的形式,比如说要求大家工作期间必须打开摄像头,必须随时响应其他人的呼叫,等等。那些也不在今天的讨论范围之内。
远程工作与坐班之间的差异
划定范围之后,讨论就容易多了。接下来我们先看一看远程工作和传统的“坐班工作”之间,有什么区别。
很显然,即使你不曾参与过远程工作,也应该能看出来,差异主要有两点:
- 因为大家时间地点都不固定,沟通会面临很大挑战
- 基于同样的原因,监管也难以照常进行
接下来先说沟通。
让沟通更有效率
我们可以简单地把沟通分为有价值沟通和冗余沟通。顾名思义,有价值沟通就是日常工作当中用来解决工作需求的沟通。比如需求评审、安排工作、bug 反馈等;而冗余沟通则是跟工作无关的沟通,比如吃中饭时聊聊足球、明星八卦,议而不决的各种会,等等。一般来说,大家都很重视有价值沟通,但常常忽视冗余沟通。
其实两种沟通模式在工作当中都非常必要。
有价值沟通可以帮助我们解决工作当中遇到的问题,它是我们比较关注的一方面。很多同学向往远程工作,正是觉得坐班工作中,被开会、扯淡等无效沟通侵占了太多时间,设想如果可以只保留有价值沟通,那么工作效率一定会更高,工作也会更开心。
所以,参与远程工作之后,虽然处于不同的时间、不同的地点,保证有价值沟通也并不困难。(反过来说,如果连有价值沟通都保证不了,那么这个团队就不应该远程。)
一般来说,可以这样提升沟通效率:
- 统一词汇表。每个人都有自己的口语习惯、知识背景等。对同一个东西,甲称A,乙称a,这样沟通起来成本就高。统一用语可以有效提升效率。
- 公布自己的工作时间,尽量在固定时间工作,保证自己的通信设备和通信软件畅通。
- 提前评估“沟通”在自己未来一段时间的重要性。比如你负责的某个产品要上线,上线总会有意想不到问题,那你就不应该安排长时间的离线状态,比如坐十几个小时的飞机e。
总结一下:基本上只要有一定的工作经验,想把事情做好的团队,要达成这几点应该不难。
保证“冗余沟通”
很多时候,我们看不上冗余沟通,觉得那都是在浪费时间。厕所随便聊个八卦,上下班路上扯扯球赛,有什么价值么?
在从事远程工作之前,我也觉得这些沟通无关紧要。但是远程一年半之后,当我因为缺少冗余沟通难以理解同事老板、长时间倍感煎熬之后,才发现,原来冗余沟通,对于我们了结彼此、塑造彼此之间的关系非常重要。
没有冗余沟通,对于某位同事、领导,我们就不知道:
- 他是急性子还是慢性子
- 他是温和的还是冲动的
- 他是激进的还是保守的
于是,当某位同事敲出简短的语句,看起来仅仅在描述业务状态时,你不知道他有没有带着情绪;当他说出好中差的评价时,你不知道按照他的语言体系,究竟是好还是坏,有多好,或者有多坏。
团队考评也会受此影响:有些人标准比较宽松,总觉得自己干得挺好(比如我);有些人要求严格,对自己评价比较苛刻。于是,就要求无论是团队还是领导者,都要理解他人,才能给出公正的评价。
所以,如果长期缺乏冗余沟通,同事之间就很容易出现裂痕,并且随着共事日久,裂痕也会日益加深。
解决方案很简单:增加冗余沟通。坐班的公司里大家可以一起吃饭,一起上下班。那么对于我们远程公司,同城的同事可以定期找个咖啡厅或者共享空间一起办工,一周一次或者两周一次都是不错的频率;如果团队成员天各一方,实在距离太远,那么至少一个季度也要聚一次,哪怕人聚不齐,对于能到场的人来说,也是非常重要的交流机会。
如果不方便线下聚会,也可以在 IM 里开辟专门的聊天频道,并且鼓励大家聊闲天。相信我,大家有的是闲聊扯淡群,不会真的在公司闲聊群里聊得一发不可收拾。
总结一下:有价值沟通很重要,但是一般来说容易得到保证。忽视冗余沟通,长期来看,会大大提升团队的沟通成本。只有维持适当的冗余沟通,才能保证团队沟通效率,
以流程、工具,和主人翁意识,取代日常管理
下面来说监管。
对于远程工作来说,监管也是一个难题。因为不在一起,你根本不知道其他人在干嘛。如果是计件工作,那么完全结果考核就好;但是程序员是一项脑力工作,需要创造力和想象力,代码质量也不容易考察。
那么应该怎么办呢?我的建议如下。
首先,所谓“用人不疑,疑人不用”,对于远程团队,成员本身的敬业态度非常重要。套用 NBA 经理的话说:我可以教 ta 写代码,但我无法教 ta 好好工作。所以,必须先选择合适的人。如果团队成员依赖强硬的管理,那么就必须放弃前面预定的“结果考核、弹性时间”,转而要求大家必须在正常工作时间工作,准时签到,全员工作时间都要开启摄像头,等等。以坐班模式来执行远程工作。
接下来,要做到明确需求、明确验收标准,减少不必要的沟通需求。
以前在坐班的公司,大家对交付物的验收并不严格,毕竟都坐在一起,哪里不明白喊一嗓子,5 分钟就说清楚了。但是在远程工作时,因为每个人的工作时间、工作地点都不一样,甲发出一个问题,乙可能两三个小时之后才会看到并回复,那就太耽误时间了。
所以必须严格制定交付物的标准,并且严格执行。以我熟悉的技术开发为例,应该满足:
- 完整而具体的需求文档,并且当面沟通(通过视频、共享桌面等)
- 完整而具体的项目规划,方便其他人安排工作
- 完整的测试,包括单元测试、E2E 测试,并且通过 CI(持续集成系统),不能存在已知 bug
- 交叉代码 Review,保证代码质量
团队管理者要理解这一点,并坚决执行,还要给大家留出足够的空间去完成这些事情。一要相信流程,二要相信工具,减少人工管理。
最后,远程团队里的每个人最好都有很强的主人翁意识,能够主动发现问题、解决问题,主动理解流程、维护流程。我曾经写过一篇文章:远程工作需要的特质:愿意负责,也是这个意思。受限于沟通不畅、监管不能,如果不能每个人都发挥自己的主人翁意识,干等着别人来推动,那么团队的工作效率肯定高不起来。
总结一下:制定好制度,选择好工具,减少主动管理,大家一起遵守规则,主动推进工作,才是远程管理的要点。
工具篇
基本上,能够维持冗余沟通,让团队互相理解互相支持;然后制定好流程和规范;不要犯蠢。你们的远程工作基本上不会遇见大问题。
工具在远程工作中扮演的角色很重要,但想要做好并不困难。大部分流行的协同工具做得都不错,你只需要按照自己团队的规模、使用习惯、特性需求、付费能力,选择某个或某几个工具就好。
所以接下来也不算推荐,而只是列举我们在用并且觉得不错的工具。
代码管理:GitHub
我们的代码都托管在 GitHub 上,并且顺便拿它的 issues 做需求管理。文档管理一般都直接用 markdown 写在项目里,很少用 wiki 等组件。
GitHub 的 code review 功能非常好用,是保障代码质量的利器。
CI
我们用 Travis 和自建的 CI 系统跑测试。
IM:Slack
Slack 真的很棒,可以集成各种第三方应用,搜索功能也很好用。
我最喜欢的是收藏功能:我们是全球化的远程公司,有些同事(包括老板)跟我们不在一个时区(准确的说差 15 个时区),所以经常面临早上一开电脑各种群里 100+ 聊天记录的情况。使用收藏功能,可以在浏览聊天记录的同时方便的把需求标记下来,比起拿个小本抄写方便许多。还可以快速的跳到最新的内容,或者跳回去。目前还没发现别的 IM 有这个功能。
邮件:Gmail
其实我们用 Gsuite。这个应该也不用多做介绍,不过国内对 email 的依赖程度不高,基本上能用就行。
视频:Zoom
早先我们用 Skype,后来觉得效果不太理想,就切换到 Zoom 上。暂时没有特别的亮点,但是效果和稳定性都不错。
服务器
我们使用了各种云服务器,本身并没有内外网之别。从安全角度来说,全体提高安全意识,比内外网隔离更有保障(当然后者可以更好的防蠢)。
总结
远程工作对人的要求很高,并不是所有人都适合远程工作。另外我并不觉得远程就比坐班好,就值得追求。但是如果你和你的团队选择了远程工作,我希望上面分享的几个点有用。祝大家 2020 一切顺利。
本文参与了 SegmentFault 思否征文「远程办公」,欢迎正在阅读的你也加入。