放进时光蛋里。

远程工作流

2021.04.16

因为疫情,从 2020 年开始,Work by Home 这个概念就被发扬光大了。记得我最初了解到这个概念的时候是高中时期读到的关于 Facebook 员工制度的类鸡汤文章,我没想到这样的概念会这么快的被普及、影响千万大众,也没想到我也会有这样远程工作的时期。

在我留学的城市虽然疫情整体情况良好,但是不可忽视它仍然存在,个别时期依然会在校园内出现一些病例。在校内没有病例的时候,我可以自由前往实验室进行工作,大家也像往常一样,但是一旦校内出现病例,我们可能要面临三到五天的 Work by Home,最严峻的一次是仅仅 20 米开外的隔壁实验楼同期出现了两个病例,我们在家工作了一周。

所以我的情况实际上相比纯粹的 Work by Home 还要更复杂一些,需要在正常出勤实验室和远程工作之间反复横跳。为了保证实验进度,我按照自己的需求搭建了一个远程工作的工作流,并且把它记录下来,这是我特有的一段工作时期和工作状态,同时这样的工作流思考或许也可以给其他人带来启发。

硬件

在我的实验室有两个主要的设备,一台 iMac,一个服务器。

iMac 是我主要的操作设备,考虑到 macOS 优秀的 Interface 设计、众多的生产力软件和省心的系统管理,iMac 在抛开算力问题之外,可以很好地承担绝大部分的工作,本身工作已经很麻烦了,我不希望再花费很多的时间精力在系统上。除此之外另一个重要的原因是这一块 5k 原彩屏,我偶尔会做一些设计的工作,但是就算抛开工作,这样一块屏幕足够让我工作的时候心旷神怡。除此之外还有一块 1080 的副屏,双屏已经是开发的最低配了,如果不是桌面空间不够我更愿意配三屏。

服务器主要承担算力工作,我的研究 Graph Neural Network 需要消耗大量的算力,每次连接学校的 GPU 实在太浪费时间并且很麻烦,所以我专门配了一个计算服务器,学校也有渠道可以搞到 3090 的显卡,除非段时间急缺算力,一般就可以不去申请使用学校的 GPU 了。这个服务器不接显示器和外设,初次配置结束之后就全部通过 SSH 连接。有物理网线连接校园网,我给它申请了一个静态 IP。

在我家里有两台笔记本,一个 ThinkPad Carbon,一个 Lenovo Idea pad. 各外接一个显示器和一套外设。ThinkPad 主要是用来做开发,待机时间久,硬件配置稳定。Lenovo 主要用于做非开发的内容。这两个笔记本本身性能都十分有限,不过在工作流中我们并不在这两个设备上面做太多的计算内容。同时,分别使用两个笔记本是为了更好的组织工作,原因会在之后的思路里面提到。

软件

首先是几个设备的操作系统,iMac 自不必说,服务器我选择了 PopOS,一个基于 Ubuntu 的更为优化、稳定和高效的系统,如果你喜欢 Ubuntu,那么我强烈推荐去尝试一下。ThinkPad 我选择了官方版本的 Ubuntu,匹配服务器服务器而且方便开发。最后 Idea pad 勉为其难地使用了 Windows,毕竟游戏和一些软件还是在 Windows 上比较方便或者可行,有了这个就不需要在我的 iMac 上面安装 Windows 虚拟机等不符合 Linux 精神的东西了。

之后是主要的开发软件,我一直使用 Visual Studio Code ,早期 VSCode 还没有 Remote 这个插件,那时候的远程同步流和 JetBrains 的 PyCharm 类似,都是要使用 FTP 工具手动提交同步等等。之后出现了 Remote 插件之后 VSCode 就是目前唯一的 Remote 工具之神。除此之外 Git, FTP, Terminal 之类的都不能缺。

对于过程中笔记之类的内容,本身杂、量大而且经常需要同步管理,干脆直接使用 Notion,即开即用即同步,非常方便。移动端的 Notion 可能还不够完善就先用 Apple 原生的备忘录配合 iCloud 同步。

项目

日常管理

日常管理讲究一个同步和随手可阅,同时还要方便提醒,所以 Apple 原生的 Calendar 和 Reminder 就非常好用了。在 Calender 上面设置好各种作业的 DDL 还有会议之类的事务,iMac 和 iPhone 上面都可以很好的同步并且自动设置提醒。我还有一块 Apple Watch,可以放心地把手机放一边不会漏过提醒。

对于长期的开发安排或者讨论方案,我使用 GitHub Project 来公开管理进度,方便一同工作的小伙伴了解开发进度。同时使用 StackEdit 来撰写更详细的开发文档。这些都是基于浏览器的,即开即用还能方便分享,所以 Work by Home 并不影响。

科研开发

如果是在实验室开发,就会使用 VSCode 通过 Remote 连接到服务器,所有开发、编辑、运算都会在服务器上面进行,每次使用都不得不感叹 Remote 的强大已用,每次通过 SSH 连接上服务器之后,所有编辑、保存、运行和调试都流畅到几乎和本地一样,这样一来 iMac 更多是担任一个终端编辑和参考。

包括所有的开发文件、代码、数据库都会在服务器上面,重要的代码会通过 Git 上传到 GitHub 云端私人仓库作为备份。所有文件在一个服务器上面的好处是,不论我使用任何设备进行开发,都不需要任何的文件拷贝,每个开发设备不过是一个终端。

因此,在家开发和在实验室开发一摸一样,同样只需要启动 VSCode 然后连接到实验室的服务器,我为其申请了公网静态 IP 所以设置后每次启动自动连接,全程无感。因为文件全部都在服务器上,所以没有同步过程,可以直接接着实验室的进度开发。这个工作流和华为内部的一样,每个人有自己的账户,每个人的主机都只是一个连接的终端,通过内网连接到主服务器上面,所有内容都是云端进行,本质就是一直在使用远程桌面。

至此,不管是在实验室还是在家里,都可以解决算力、同步的问题了。除开 VSCode,其实还有其他工具可以实现,但是都没有这样优雅,比如 PyCharm 必须每次手动 Ftp 同步下载和上传,整个过程需要配置的内容比较多,没有 VSCode 这样无感。采用 Windows 配合 Remote Screen 也是一种方法,但是同样不够优雅,网速和连接质量都受到限制,更像是紧急状况下不得已的选择。

游戏开发

游戏开发相比于科研最大的问题是其开发资料库大小会非常大,而且我必须基于 Unity Engine 来开发,Unity 目前尚未提供像 VSCode Remote 这样的远程连接解决方案,所以就需要使用更加原始的方法了。

我主要使用实验室 iMac 和家里的 Idea pad 开发游戏。为了达到同步工程进度的目的,我在服务器上面搭建了本地 Git 系统,每次在一端开发结束之后通过 Git 上传至服务器,然后下次开发的时候从服务器先同步一下进度。使用本地 Git 系统而不是 GitHub 的原因还是因为资源太大,GitHub 不支持大量大空间文件的上传。

虽然这样的流程繁琐了很多,但是考虑到 Unity 开发并没有很高的并发性,而且频率不是很高,每次开发都是专门在假期中间腾出半天的时间专门坐在电脑前推进一下进度,所以这样的频率下每次上传和下载的繁琐还算可以接受。

其他

剩下的内容要么就是频率达不到需要专门搭建远程工作流的程度,要么就是无法搭建或者搭建后的工作流甚至比简单的拷贝粘贴还要更复杂。比如摄影、剪辑,本身频率就很低,没有急事不如等几天去实验室搞,毕竟 5K 屏幕可没有家里的替代品。

现在的工作日日常就是上午去实验室,在 iMac 上处理一下杂事,交交作业看看通知之类的,吃过午饭之后打开 VSCode 开始集中精力推进项目,到了傍晚和晚上提交一下代码到 GitHub,写写日记,总结总结今天的事情之后收拾回家。如果进度没有完成或者模型还没有训练结束就可以先回家,之后打开 ThinkPad 重新连到服务器上面查看结果和进一步的测试,过程中的体验和本地进行一样。

除此之外,我想提一提我对 Work by Home 的看法。我个人很讨厌 Work by Home,我认为工作就是要在工作的地方,也就是实验室,回到家就一定是放松的时间,看剧、读书、玩游戏都没问题。在实验室可能会摸鱼,就算摸也大致是工作内容上的,或者中间必要的放松。但是在家我一点都不希望我还要想着工作的内容,因此最开始搭建远程工作流的时候我是很抵触的,最后无可奈何妥协之后,我依然尽我所能保留了我的想法。

我把家里分成两个部分,工作的部分和玩耍的部分,工作的部分指的就是 ThinkPad 这台电脑,我把它安装成 Ubuntu,并且不在上面安装任何娱乐性质的软件,不进行任何娱乐相关的活动,到工作的时候就是用它工作。同时另一个 Idea pad 就是纯粹进行娱乐或者科研不相关内容的活动,安装了 Steam 和一些游戏,可以看剧,也可以在上面做游戏之类的,完全不想工作的事情。

其实我觉得更加理想的状态就是通过设备进一步把事物都能分开,比如 Switch 就是玩游戏的,Idea pad 就是用来看剧写日记写文章的,iPad 就是用来看漫画、画画的,Kindle 就是用来读书的。这样我们在使用一个设备的时候可以全神贯注在一件事情上,即使是相关的事情也不会分散我们的注意力或者打断我们的进程。这就像是 Unix 的哲学,一个程序只做一件事。

注意力和精力确实是非常稀有的东西,希望我们都能找到自己的方法去好好的管理和使用他们。

发表评论