Tychlog

远程居家工作心得

office

远程/居家工作已经成为了一种趋势,更多的人选择了这种工作方式。在远程工作中,如何保持高效的开发流程、便捷的沟通与协作、灵活的项目切换,以及不断提升自己的技能和能力是非常重要的。在本文中,我将以自身多年远程居家工作的经验为基础,介绍一些工具和技术,来帮助你更好地适应远程工作的环境。

高效的碎片化开发工作流

远程居家工作的特点会让工作无法“持续”,因为同事或客户可能并不能了解你的实时工作情况,所以经常会出现专注工作被打扰和中断的情况;家庭的环境也同样可能造成这种困扰。因此,碎片化开发工作流将是提高生产力和保持竞争力的关键。它允许你和团队将大型项目分解为更小、更易于管理的部分,从而提高协作效率、减少错误并加快交付速度。

拆分和列出任务

在开始工作前,你需要将任务拆分成更小的部分,这样可以更好地管理和控制工作进度。你可以使用Trello或Notion等工具,将任务拆分成更小的部分,然后按优先级和状态进行分组和排序。这样可以让你更清晰地了解自己的工作进度和任务步骤。

Trello是一款流行的项目管理工具,我通常也作为个人笔记来使用。它提供了丰富的拆分和分组功能,可以根据不同的需求和优先级,将任务拆分为不同的子任务,并按状态和优先级进行分组和排序。它还支持标签和注释功能,可以为任务添加标签和注释,方便查看和编辑任务。还有许多插件和扩展,可以根据不同的需求和场景,选择适合自己的插件和扩展,扩展Trello的功能和应用范围。我可以很轻松的拆分和列出当前任务或用户故事,让开发的节奏更灵活,粒度更小。

Notion是一款功能强大的协作工具,它基于笔记形式,提供了灵活的页面设计可以通过拖拽方式自由组合不同的块和页面元素,创建个性化的页面布局和风格。还有多种集成功能,包括文本块、待办事项、嵌入式网页、表格、媒体文件等,可以根据不同的需求和场景选择适合的页面块。以及多种集成功能,可以将其他应用程序和服务集成到Notion中,例如Google Drive、Slack、Trello等。不过对我来说,缺点就是太自由了,当我希望保持一种布局风格的时候,可能会多花一些时间,或者治好强迫症。

使用Git小步提交

使用Git可以随时保存你的工作状态,更重要的是可以培养出良好的思维习惯。在Git提交时,你需要考虑如何描述这些代码。如果你经常使用fix xxx issue这种概括而又没有内容的描述,或者是这样do xxxx and update xxxx and xxxx经常出现and连接了很多意图的描述,就需要警惕了。你可能已经在一次提交中包含了太多的逻辑和意图。在这种情况下,需要回滚部分功能,或者检查部分代码时就成了灾难。而且别人在理解你的代码时也会难以阅读和理解。这时就需要考虑以下几点:

  • 将笨重的模块,分解成小巧的功能;
  • 将复杂的需求,拆开成不同层面的逻辑;
  • 将模糊的用户故事,挖掘出细化的任务;

比如,需要添加一个API接口通过一系列算法得到结果后修改数据库。如果一次写好所有代码可能需要一个小时以上,这就使得工作跨度变得太长,你很难在无人打扰的专注状态下开发完成。试着添加一个API接口,不做任何事,只是正确的接受到参数并打印。这时就可以提交一次,然后冲杯咖啡看看窗外的美景休息一下。接着开发一系列算法,还可以继续拆分,先保证‘Happy path’,当输入数值是一个正常的数值时,得到了一个结果。只要没有破坏程序的运行,就可以提交一次,之后再添加一些单元测试,和处理边界值等问题,每个问题也都可以单独提交一次。最后的提交再存入数据库。这就是碎片化的提交,只要保证程序没有被破坏,你就可以提交一次。这样Git提交的描述也很容易编写,看起来会更加清晰。每次提交可能只需要几分钟几行代码,你可以随时停下来处理其他事务,不会再被暴躁的打断了。

提交时还可以使用-p参数,无论是add还是checkout等命令,都可以加上,这样就可以一段一段的代码选择是否要进行该操作。只将你需要的代码添加或回滚,杜绝console.log的误添加。

如果你的团队开发流程要求一次只能有一个提交,那么你可以git checkout -b feature/xxx为这次的任务创建一个分支,然后小步提交,等到合并时git checkout develop使用git merge --squash feature/xxx将之前的提交打碎合并成一个commit。

便捷沟通与协作

对于所有远程工作来说,沟通永远是一项艰巨的任务。并不仅仅是沟通的方式,还隐含着一些思维上的转变。因为你和同事不再是面对面了,你需要思考何时沟通,如何沟通,以及表达方式等等。这些都需要你花时间去思考和实践,但是这些都是值得的。

文字沟通

通常来说,文字沟通的成本最低,但可能也是最低效的。所以当你只是需要通知一下某些常规的事情或约定时,文字沟通才是最方便的。

  • Slack - 我们团队通常使用Slack进行常规的文字沟通,因为当你加入一个团队或公司时,你就可以联系所有成员了。无论是每天的工作日常更新,还是一些简单的问题,都可以通过Slack来解决。Slack的消息可以通过@来提醒某个人,也可以通过#来提醒某个频道。Slack还提供了一些集成功能,可以将其他应用程序和服务集成到Slack中,例如Google Drive、Trello等。这样就可以在Slack中直接查看和操作这些应用程序和服务中的内容。Slack还提供了一些插件,可以通过插件来增强Slack的功能,例如可以通过插件来实现一些自动化的功能,例如每天早上自动发送一条消息,提醒大家今天的工作计划等等。另外它也很有效的捕捉到了电脑的工作状态,可以轻易的告知别人自己的状态。
  • Skype - 有的客户会喜欢使用Skype。Skype不同于Slack是公司团队式的,而是个人式的。你可以添加你的客户为好友,然后通过Skype来沟通。另外它的性能也不太好,尤其是在视频时可能会阻碍文字沟通。
  • Team - 是由微软开发的一款协作软件,旨在提供一个集成了聊天、视频会议、文件共享、应用程序集成和团队工作流程的平台,以帮助团队进行协作和沟通。它和Slack一样,只要加入团队就可以联系所有成员。区别是它可以和微软其他产品更好的关联。因此如果你的团队使用了微软的其他产品,那么Team可能是一个不错的选择。

视频会议及屏幕分享

当你需要沟通一些复杂的问题时,文字沟通就会变得很麻烦。因为你需要花费更多的时间来表达你的想法,而且你的同事也需要花费更多的时间来理解你的想法。这时候就需要考虑其他的沟通方式了,比如视频会议。

而且基本上可以开启语音及视频会议的软件或插件都可以进行屏幕分享。有些软件或插件的屏幕分享功能更加强大,甚至可以共享某个应用程序的窗口。

  • Hunddle - 是Slack的一个插件,可以在Slack中直接发起一个视频会议,可以邀请多个人参加。这样就可以在Slack中直接进行视频会议,不需要额外的软件。它的性能很不错,也很方便,但是只能在Slack中使用。
  • Zoom - 是一款视频会议软件,可以在多个平台上使用,例如Windows、Mac、Linux、iOS和Android。虽然开启一个会议时对于一对一的视频聊天有点繁琐,但是可以通过一个链接邀请其他人加入会议。它的性能也很不错,但是需要额外的软件。
  • 腾讯会议 - 感觉和Zoom很类似。国内的客户基本上都喜欢用腾讯会议。
  • Google Meet - 有的客户会使用Google Meet,但不如Zoom直接发送连接方便,需要加好友。
  • Microsoft Teams - 和Meet类似,不过基本没有遇到过客户使用这个。可能是在团队内部使用比较方便。
  • TeamViewer - 是一款专注于远程桌面控制和协作的软件,提供了屏幕共享功能,可以方便地分享桌面和应用程序。如果有很复杂的共享和协作需求的话可以尝试一下。

云存储共享文档

当你需要共享一些文档时,你可以通过邮件或者其他的文件共享软件来共享文档。但是这样的方式有一个很大的问题,就是你需要不断的发送文件,而且你需要不断的接收文件。这样会浪费很多时间。所以最好的方式就是使用云存储来共享文档,而且还可以云协作,团队共同编辑同一个文档,省去了开启会议共享屏幕的时间。

  • Google Drive和Docs - 是Google提供的一款云存储和文档编辑服务。可以在线共享和编辑文档,也可以在各个平台安装客户端来使用。我们团队一般都会使用Google服务进行共享文档,比如编写一些技术手册和规格说明书等。
  • OneDrive和Word - 是微软提供的一款云存储和文档编辑服务。和Google Docs类似,可以在线共享和编辑文档,也可以在各个平台安装客户端来使用。一般只有在接受到严格需要Word格式的文档时才会使用。

任务列表或看板

一般来说,客户都会提供一个任务面板,用来管理项目的任务。每天完成客户指派给我的任务即可。但是有时候客户可能没有提供任务面板,这时候就需要自己选择一个任务面板来管理任务了。

  • Trello是我自己开启任务管理的首选,一些小项目的客户也会选择它。它的界面非常简洁,可以方便地创建任务列表和看板。它的免费版也足够使用了。
  • Asana是最近几年比较流行的任务管理服务。它的界面色彩分明,可以方便地创建任务列表和看板,但又比Trello更加强大一些,方便追踪进度和成员记录。
  • JIRA是最为强大和复杂的面向敏捷的项目管理服务。除了类似于其他服务的管理任务和追踪进度等功能,JIRA对于缺陷bug的管理和追踪也非常强大。但是它的界面比较复杂,对于新手来说可能会有一定的学习成本。

灵活切换项目

对于我来说,自由的工作选择和安排意味着更多的项目。有时候可能需要在一天之内推进好几个不同客户和项目的进度,所以灵活切换项目就成了一个必不可少的能力。

VS Code 多语言全栈开发的编辑器

如果你只使用一种语言,当然可以选择习惯或喜好的代码编辑器。但远程工作往往意味着灵活,你对于工作的灵活,同时项目、团队甚至公司和客户也是灵活的。因此,需要一个可以适用于各种语言和开发习惯的代码编辑器。

VS Code支持多种语言,并且为每种语言提供了基本的语法高亮和智能感知功能。你还可以根据需要安装扩展来增强对特定语言的支持,按Ctrl+Shift+P打开命令面板,输入install选择Install Extensions就可以查找和安装各种插件。例如,如果你使用Python,可以安装Python扩展来获得更好的代码补全、调试和代码检查功能。如果你使用JavaScript或TypeScript,可以安装相应的扩展来获得更好的代码补全和提示,以及重构功能。此外,你还可以根据需要配置VS Code的设置来优化特定语言的开发体验。例如,你可以配置缩进大小、行尾字符和文件编码等选项。总之,VS Code为不同语言提供了基本支持,然后你可以通过安装扩展和配置设置来进一步增强对特定语言的支持。庞大的插件社区可以满足各种开发语言需求。

还可以使用code命令在终端命令行中使用,让VSCode打开当前目录。如果没有该命令,可以在VSCode的命令面板中输入Shell Command: Install 'code' command in PATH,然后按照提示进行环境变量的添加。

综合数据库客户端 MySQL, SQL Server, PostgrasSQL, MariaSQL随时切换

  • DBeaver是一款免费开源的多平台数据库管理工具,支持多种数据库,如MySQL、Oracle、PostgreSQL、SQL Server等。DBeaver提供了直观的GUI界面,可以方便地进行SQL查询、数据导入导出、数据库管理等操作。支持MacOS,Windows,Linux三大平台。
  • Navicat是一款功能强大的综合数据库管理工具,支持多种数据库,如MySQL、Oracle、SQL Server等。Navicat提供了直观的GUI界面,可以方便地进行SQL查询、数据导入导出、数据库管理等操作,并且支持数据可视化。支持MacOS和Windows平台,Linux只有MySQL版本。
  • SQuirreL SQL是一款免费开源的Java平台数据库客户端,支持多种数据库,如MySQL、Oracle、PostgreSQL等。SQuirreL SQL提供了直观的GUI界面,可以方便地进行SQL查询、数据导入导出、数据库管理等操作,并且支持插件扩展。同样支持MacOS,Windows,Linux三大平台。
  • HeidiSQL是一款免费开源的MySQL数据库管理工具,提供了直观的GUI界面,可以方便地进行SQL查询、数据导入导出、数据库管理等操作。但仅支持Windows系统。
  • SQLyog是一款MySQL数据库管理工具,提供了直观的GUI界面,可以方便地进行SQL查询、数据导入导出、数据库管理等操作,并且支持SSH和HTTP隧道连接。支持MacOS和Windows平台。

我通常使用DBeaver,开源免费。支持目前我所遇到的所有数据库类型和版本细分,并且还可以SSH通道连接。虽然它的操作有点不太友好,我猜可能都是程序员做的,没有设计师参与这个开源项目,但功能确实强大,很多需求都能满足。

使用Docker构建快速切换的开发环境

通常可以使用Dockerfile,在项目中直接启动需要的开发环境。比如Python环境,Java环境,还有Node.js环境等。

FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000

然后构建:

docker build -t getting-started .

构建完成后,运行就可以了:

docker run -dp 3000:3000 getting-started

还有一些常用的服务,比如数据库和服务器等,也可以使用Dockerfile,或者Docker compose启动。例如,如果你需要使用MySQL数据库,可以使用官方镜像,利用Docker Compose,创建一个yaml配置文件stack.yml

# Use root/example as user/password credentials
version: '3.1'

services:

db:
image: mysql
# NOTE: use of "mysql_native_password" is not recommended: https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password
# (this is just an example, not intended to be a production configuration)
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example

adminer:
image: adminer
restart: always
ports:
- 8080:8080

然后运行:

docker stack deploy -c stack.yml mysql

或者:

docker-compose -f stack.yml up

这样,你就可以在项目中使用MySQL数据库了(访问http://swarm-ip:8080, http://localhost:8080, 或 http://host-ip:8080)。相应地,Redis,Elasticsearch,Nginx等也是类似的。

通过利用Docker Compose,我可以快速的启动和停止整套针对于某个项目的所有服务,而不需要在本地安装和配置这些服务,也不需要担心版本的问题。这样,我就可以在不同的项目中,快速的切换开发环境,而不需要担心它们相互之间有冲突等问题。

SSH地址和Key管理

在不同的项目中切换,还有一个问题需要考虑。服务器SSH所需要的地址和Key都是不一样的,而且可能还需要不同的账户。这样,就需要在不同的项目中,切换不同的SSH地址和Key。

使用SSH Config文件可以有效映射对应的地址和Key。方便管理你的SSH Key与域名地址的关联。在~/.ssh目录下编辑或创建config文件,然后添加基础默认配置:

Host *
ServerAliveInterval 30
ServerAliveCountMax 5
IdentitiesOnly yes
StrictHostKeyChecking no
PasswordAuthentication no

然后添加不同项目对应的SSH地址和Key:

Host tychio_host
HostName server.tychio.net
User root
IdentityFile ~/.ssh/tychio_alienware

这样我就可以直接使用ssh tychio_host命令SSH登录到服务器,而不需要使用ssh root@server.tychio.net -i ~/.ssh/keys/tychio_alienware这样冗长而难记的命令,甚至有时候服务器地址是IP地址,而不是域名,这样就更难记了。

另外,每个项目所使用的Git仓库和权限账户也都是不一样的,如果是不同的Git仓库提供商,比如Github, Gitlab, Bitbucket等,还可以区分。但很多项目都使用了GitHub,却是不同的账户。这样,就需要在不同的项目中,切换不同的SSH地址和Key。和刚才的SSH登录类似,只是使用不同的名字标记:

Host github.com-projecta
HostName github.com
User git
IdentityFile ~/.ssh/projecta
Host github.com-projectb
HostName github.com
User git
IdentityFile ~/.ssh/projectb

然后在项目目录下配置对应的Git仓库地址就行了:

git remote set-url origin git@github.com-projecta:tychio/projecta.git

这里原本的正确路径应该是git@github.com:tychio/projecta.git,由于我添加了SSH Config,所以可以使用git@github.com-projecta:tychio/projecta.git,这样就自动附带了相应的SSH Key用于权限认证。

多账户管理

每个项目都有相关的一些账户,包括AWS之类的云服务,共享文档,Invision等设计图,还有测试账户等等。所以多账户和密码的管理也是一项重要任务。

作为个人来说,Chrome的用户就足够了,因为可以将账户密码保存在Chrome中,然后利用Chrome的Profile用户对应项目或客户进行区分。好处是不需要额外安装什么服务,用起来很方便,打开页面就可以自动填写。缺点是账户无法分享,而且不够安全。

所以团队使用的话,1Password等密码管理和分享服务就十分重要了。可以将账户密码保存在1Password中,然后利用Chrome的1Password插件,打开页面就可以自动填写。好处是可以分享账户,甚至于还包含了URL地址,可以直接打开并填写;而且更加安全有保障。缺点是需要额外安装1Password服务,而且需要额外的费用。

除了1Password以外,还有很多类似的服务,都可以用于团队的账户管理,比如:

  • LastPass和Dashlane类似,他们都是流行的密码管理工具,支持多平台同步,可以自动填充密码、生成密码等功能,同时还支持密码共享、密码安全性评估等功能。不过没有加密保护等措施,而且安全漏洞监控需要手动输入信息。
  • Bitwarden是一个廉价的选项,它也支持多平台同步,可以自动填充密码、生成密码等功能,同时还支持密码共享、密码安全性评估等功能。同样没有加密保护等措施,而且安全漏洞监控需要手动输入信息。但它的价格只有前面几种的三分之一不到。
  • Roboform和Sticky Password对于安全方面的措施做的都不太好,而且价格也不便宜,所以不推荐使用。

总结

无论是沟通还是开发,远程自由工作的核心就是灵活和细节。没有什么是不变的常量,所有的东西都应该是像环境变量一样的东西,随着你当前工作的项目而改变。并且这些东西的粒度是越小越好,你要拥有“警觉性”,随时可以抽身出来,也随时可以投入工作。