作者从2020年疫情爆发前就开始从事后端开发工作,2020年由于工作原因,加入了某公司的开发团队SAP中代号为Spartacus的开源项目。这个项目是一个基于Angular的电子商务Storefront框架,代码贡献者来自世界各地。事实上,这个项目的开发由六个敏捷开发团队组成,作者是唯一来自亚太地区APJ的开发人员。从此,我开始了长达两年多,一直持续到现在的远程办公生涯。本文通过以下几个方面与大家分享作者的开发团队、在远程办公领域的经验以及团队日常远程办公使用的一些工具。目录如下:代码托管及项目管理:Github即时通讯(文字版):Slack即时通讯(语音版、视频版、会议):MicrosoftTeams知识管理:AtlassianConfluence代码托管及项目管理:Github的代码我们的项目托管在这个Github仓库上:https://github.com/SAP/spartacus每当有新的功能开发时,我们都会创建一个名为epic/XXX的代码分支,开发完成后合并到develop分支和测试完成。现有功能的错误修复使用分支fix/XXX完成。对于新版本,使用release/XXX分支。通过定义这些分支的命名约定,不同类型的开发任务的同事可以在不同的分支上工作,而不会相互影响。GithubPullRequest的CodeReviewweb界面完美封装呈现了代码修改前后的状态、提出代码审查意见的Reviewer、提出代码审查的申请者需要进行的下一步修改,让他们不在同一办公室的开发人员可以在这些Web界面中高效地进行代码审查工作。下图是同事在某处代码审查后提出的修改建议。修改建议包括修改后的源代码和以文字表达的建议背后的考虑。Github的缺陷(Issue)管理也是它的亮点之一。来自世界各地的Spartacus用户和代码贡献者可以根据准备好的模板为我们的代码仓库创建Issues。这些问题可以是现有的功能错误或新的功能请求。每个Issue都可以分配一个或多个标签(Label),用于标识Issue的特征和需要解决的领域问题。目前,我们的代码仓库中有7804个已关闭问题和702个未解决问题。这8,000多个问题由总共534种不同类型的标签描述。每个Issue都可以分配给一个项目(Project),这是Github提供的项目进度管理模块中的模型之一。在GithubProjectDashboard中,我们可以清楚的看到分配给同一个项目的所有Issues的列表,如下图所示:合并后的列。每次敏捷开发SprintPlanningMeeting结束后,开发团队在当前Sprint中需要做的任务会以Issue的形式出现在上图中Project最左边的ToDo栏下。每天在团队的Dailymeeting上,大家通过MicrosoftTeams软件拨入会议远程参与。ScrumMaster使用自己电脑上的共享桌面项目GithubProjectDashboard,其他团队成员从ToDo列表中选择。在问题上。在某个Issue被某人拾取后,它将从ToDo列移动到InProgress列。开发者完成Issue要求的功能开发或bug修复,并完成本地测试后,Issue从InProgress进入CodeReview&LocalQA状态,等待群内其他开发者拿来进行codereview和交叉-测试。当另一个开发人员完成代码审查和交叉测试后,Issue从ServerAfterMerge状态进入QA,团队的质量控制工程师(QualityEngineer)可以开始更高级别的集成测试。通过Issue关联的Milestone面板,我们可以很方便的监控一个Project的完成进度:上面描述了一个典型的通过Github管理的Issue生命周期,我们团队就是通过这种方式来实现项目任务管理的。虽然另一款付费软件Jira也提供了更专业的项目和事务跟踪管理功能,在任务工作量记录、项目整体进度控制和任务执行细节展示等方面更胜一筹,但GithubProject也有它的亮点,那就是深度整合GithubIssue和PullRequest,后者是我们的全球开发团队非常重视的一个功能,该团队拥有来自世界各地和多个时区的开发人员。即时通讯(文字版):Slack程序员除了编写代码、提交代码、审查代码外,不可避免地会与其他开发者进行各种互动,比如讨论技术问题、发布群公告、向其他成员寻求帮助等。如果是比较简单的可以通过文字交流解决的问题,我们团队的成员在Slack中更倾向于文字交流。在我看来,与大家日常生活中使用的微信相比,Slack在软件开发领域的远程团队成员交流方面有以下显着优势:1.所有聊天记录(包括文本和文件)都保存在服务器上一面,查询方便很多使用微信群工作和交流的朋友都抱怨微信群的聊天记录只存储在本地,很容易丢失。在Slack中不存在这个问题,因为消息(无论是纯文本还是包含文件)一旦发送就会保存到服务器,而且Slack支持强大的查询功能。下面是Slack的查询窗口。我们可以看到Slack支持以下几种查询方式:GoogleLike查询,即在下图中放大镜图标后,直接输入查询关键词在指定的SlackChannel中进行查询,比如下图中的Find在ec-spartacus中,表示只在名为ec-spartacus的Channel中搜索,只搜索指定类型的交互记录,如Messages(文本交互信息)、Files(文件)、Channels(搜索名称中包含输入的Channelskeyword)和People(搜索名字中包含input关键字的Slack用户)以作者为例。2020年8月加入现在的开发团队,使用Slack搜索,作者可以轻松定位到2020年8月之前发生的任何交互记录:只需要在Range中指定搜索的开始和结束日期:即可快速找到交互包含我需要查找的某个关键字的记录:2.Slack文本消息支持类似于Markdown的语法,方便程序员与Slack交流文本支持多种格式选项,例如粗体、斜体、删除线、引用,和代码插入。与纯文本相比,这些格式化效果提高了开发者阅读文本信息的效率。此外,Slack的文本编辑器支持丰富多样的Emoji表情,可以为程序员每天单调的生活增添一抹色彩:3.SlackThread高效组织文本讨论话题,使用微信群进行讨论工作问题朋友们有这样的苦恼:微信群里的信息流没有等级概念,所有的信息流都在一个层级,很容易在同一时间有几个不同话题的讨论同一组。,群组用户很难通过阅读这些文字记录来获取不同主题的每次讨论的上下文。Slack引入了Thread的概念,以有效地管理频道内不同主题的并行讨论文本流。一个线程代表一个主题,可以包含一条或多条文本消息。一个Thread除第一条原文信息外的其他文本信息称为Reply。当用户回复Thread的第一条短信时,这些回复信息称为Reply,自动与Thread的第一条短信相同。消息是关联的。下图就是一个例子。屏幕左侧区域显示两个线程,分别包含4个和7个回复。单击每个线程并选择“查看线程”菜单项以在屏幕右侧的详细信息页面区域中查看线程。线程所有回复。通过引入具有类似父子关系的Thread和Reply的概念,SlackChannel可以有效地管理不同主题的文本讨论。4.Slack有许多开箱即用的应用程序和强大的扩展在Slack应用程序市场https://slack.com/apps中,您可以查看许多开箱即用的Slack应用程序,这些应用程序可以显着提高远程工作效率:我们可以将这些现成的应用添加到SlackChannel:你也可以开发新的满足团队实际工作需求的应用。比如我们团队目前正在使用的一款自研的SlackApp,如下图所示。每当开发者提交导致持续集成服务器CentralBuild失败的新代码时,App会向SlackChannel推送消息,消息包含三个链接,分别指向失败的构建和导致构建失败的代码提交失败,并建立历史信息。借助SlackApp等即时通知,开发人员可以避免手动检查构建状态并更快地响应失败的构建。即时通讯(语音版、视频版、会议):对于在MicrosoftTeams中远程工作的敏捷开发团队,DailyScrum、PlanningMeeting、ReviewMeeting等会议都需要在线召开。此外,当开发者遇到难以通过纯文本信息讨论解决的复杂问题时,还需要通过语音、共享屏幕等方式进行沟通。虽然Slack本身提供语音通信,但对于在线会议,我们团队最终选择了MicrosoftTeams。除了在不稳定的网络连接环境下Teams的性能优于Slack之外,我们还可以使用Teams的录音功能来录制重要的会议并导出为MP4格式。这些会议的记录对于刚加入团队的同事和因各种原因错过会议的同事来说非常有用。知识管理:AtlassianConfluenceSlack中的文本信息流虽然搜索起来很方便,但比较零散,不适合篇幅较大、图文丰富的知识文章进行系统维护。因此,我们选择了AtlassianConfluence来搭建团队Wiki,实现团队知识共享。AtlassianConfluence可以支持多人编写文档,可以在软件开发过程中方便高效地创建需求文档、产品架构设计文档、项目管理文档、技术分享等文档。其丰富的页面控件、开箱即用的各类模板、基于富文本和文档源代码级别的编辑方式,让开发人员和非技术人员也能编写出专业的文档。其版本管理和差异比较功能,即使多个用户分别编写同一个文档,也可以根据需要轻松追溯每次修改的详细信息:我所在的全球软件开发团队在远程办公领域使用过一些工具和经验.虽然由于疫情和团队成员所处的地理位置,开发团队成员无法在同一办公室面对面工作,但得益于日新月异的现代IT技术,通过本文介绍的工具,即使我们远程工作,也可以提高我们的开发效率。也没有太大影响。希望疫情早日结束,所有开发者都能回到疫情前的正常开发工作。
