作者| Anthony Shaw
译者| 刘天栋 (Ted Liu)
1 缘起
出于许多原因,我相信 ASF 的使命,但我进入开源软件领域的首要原因是 -- 免费和开放的知识获取。
我从12 岁(1998 年)开始学习 dBase 4 编程。对于当时还是靠送报赚取一周 5 美金的孩子来说,dBase 4 和编译器 Clipper 都不便宜。我从当地的一家公司拿到了他们舍弃不用的 dBase 4 盒装软件和使用手册。然而那个时候我们家里都没有互联网,我只能依赖手册,以及各种从二手商店和办公清仓拍卖找到的资源。在接下来的十年里,我藉由我所能找到,借用和四处猎食的一切来学习编程,直到 2002 年,我得到一个 Linux 的拷贝, 并利用我从村里的电脑商店里不需要的零件, 组装了几套 Linux 服务器。
这是我发现自由和开源软件的缘起,并且真正开始打磨我的编程技能。
我的目标是学习并分享我所学到的, 如此其他人可以更快地到达他们需要去的地方。开源帮助我发展了在欧洲很吃香的软件技能,也因此启动了我的 IT 职业生涯。
在我学会编程的 20 年后,我离开了软件工程领域,进入 Dimension Data 公司的学习和发展部门。该公司是一个有 2.9 万人的技术公司,在全球 49 个国家运营。我目前的工作涉及大约每年 3 个月的旅行 (通常是 15 个国家),管理一个分布在 4 个国家和 4 个时区的 30 多人的部门,并交付具有高变化度和短期限的大型而复杂的项目。
在 2016 年, 我做了一个选择:在晋升到我目前的角色之后,我将为我已经投入了多年的开源项目继续贡献。我为自己定下了 3 条规则:
1. 我不会牺牲我和家人相处的时间
2. 我不会破坏我对工作的承诺
3. 我会照顾我自己的健康
2 我的开源贡献
在过去的 4 年里,我每年大约做 1000 到 2000 次贡献。这些包括对大约 50 个项目做出错误修复、提交等。
我所做过的最大贡献是 Apache Libcloud, 这是一个用 Python 编写的跨多个云的抽象库。起初,这是由一个与我们设计的云 API 进行集成的工作承诺推动的,但我很快就意识到了这个库的潜力。回到我最初的自由和开放获取知识的目标, 我在计算机领域中看到了惊人的趋势。专有的 API 正在推动行业中所谓的 "粘性", 或者坦率地说“锁定”。
云计算的锁定意味着, 任何人如果无法获取可靠的网络、资金或愿意签署这些专有软件的合同, 就会被排除到技术进步之外,尤其是学生,在澳大利亚乡村,亚洲和非洲等偏远地区的开发者,以及没什么钱的开发者。
Apache Libclouds 的设计意味着你可以设计能部署到如 Apache CloudStack 和 OpenStack 的开源软件平台的应用程序。
我花费了大约 100 个小时为 Apache Libcloud 开发完成了一个容器抽象层的驱动程序,这意味着往后开发人员就可以使用相同的 API 为诸如 Kubernetes 这样的开源软件平台, 或是公共云提供商的平台来编写自动化流程。
3 三条建议
在贡献开源的同时,我也管理着与家人相处的时间,对工作的承诺和个人的身体健康。
以下是我在高压作业中持续贡献的 3 条建议:
01 选择你关心的项目
这是最重要的,有东西能激发你的兴趣一定很有意思,但长期下来,兴趣往往逐步下降。 我过去曾多次被“闪闪发光的东西”所累,但是随着事业的发展,我不得不约束自己,停止编写自己的脚本语言或者不再从头开始构建自动洒水系统。我停下来,提醒自己:这一秒或许我有时间,但是下一周呢?下个月呢?停下来吧,设定事件优先级。
对你有意义的项目设定高优先顺序
我投入最多的 2 个开源软件项目是 Apache Libcloud 和 SaltStack。我相信 Apache Libclouds 开放访问云平台的使命。我对 SaltStack 的贡献集中在云抽象、网络 API 抽象以及其他修补程序和实用程序上,让开发人员和最终用户更容易使用。
挑选一些闪亮的东西和你相信的东西之间的区别在于, 长期来说如果你做出更多的承诺, 你会发现你会更容易地跳进去帮助。但是你如何找到时间呢?
02 明智地选择你的任务并创造时间
我一直被问到这个问题, "你是如何找到时间的"。当我试图说服人们为开源软件做贡献时,人们的反应总是与时间有关。
摆脱那些没有附加价值的东西
如果负担得起,就花钱找帮手,以让你空出更多的时间。开源不仅有助于你的技能和知识的提升,也会增加你对于潜在雇主的价值。雇个人帮你清扫庭院的落叶或者一周做一次家务,并不需要花费多少钱,但如果你能算出从这些空出来的时间里能得回多少价值,那这就很有意义了。
另一件我很严格控制的事情是无节制地看电视剧和玩游戏。玩 100 小时的最新游戏可能会很有趣, 但我发现从中长期来说,开发软件会更有回报。找到不用消耗太多时间的放松之法, 比如冥想、锻炼或阅读。
但是,如果你确实需要翘个脚,看几个小时电视,别感到内疚。
聪明而非努力的工作
当我坐下来贡献一些东西的时候, 我会仔细地计划和思考我将要做什么, 我将要测试什么,以及我将如何构造它。我用远见和目标快速完成任务。一旦我完成了这一个模块并通过测试, 我就会提交贡献。不要尝试在周末重构整个项目,保持简单。
但我们都知道,有时最好的计划也可能夭折。如果你发现自己正在走向一个无底洞, 你的程序无法编译, 或者你不能消除那些我们开发人员最爱的僵尸bug,那么
暂停一下
你可以很容易地干到清晨三点,同时用头撞墙,试图弄明白问题症结。根据我过去管理开发团队时的经验,如果你被卡住了, 休息一下,寻求帮助。如果还是行不通,那就开始处理其他的事。
有时如果我不能解决某个任务,我会暂停工作一小时、一周、甚至一整年。当你有一个顿悟或灵感的时候,再回去完成这项工作。
上述技巧可以节省时间,交付更好的软件。它是开发人员应该具备的好技能。
找出时间
贡献归结于三件事:
1. 一个想法
2. 一种领悟
3. 一项"更改",比如修复、功能、测试、代码审阅、文档等。
这些想法是我通过阅读、倾听用户或查看 bug 时得到的。当我有空余时间时 (如午休时, 或等人等事的时候), 我会寻求灵感或想法。
我通过听播客和在会议上与人交谈的时间来理解学习。我每周在车上呆几个小时,花时间做一些家务活。在那段时间里, 我总是戴上耳机收听最新的 Python 播客或开源软件更新。
在飞机上 (我写这篇博客的地方),就是我坐下来写东西、编码或测试的时间。去年我在空中飞行了足以环游世界八次的里程,大部分时间我都花在编码、放松或睡眠上。除此之外, 在机场休息室、火车上或等人时,我会将笔记本电脑拿出来。任何有 Wi-Fi 的飞机,我都可以推送代码修改;而着陆的那一刻,我的笔记本电脑总会打开并运行着 git 代码推送。
周末-是不务正业的非工作时间,除非我正在旅行或独处中。这是我定下的规则的第一条: 不要牺牲与家人相处的时间。
03 管理工作量, 避免倦怠
这有二个组成部分,管理您的工作承诺和管理您的贡献。你必须两样都做才能成功。
停下来休息一下吧。无论何时总是有一个合并拉请求,一个 bug 待检查,一封最终用户的电子邮件。如果你需要休息一段时间,那么就坦诚地和团队聊聊寻求帮助。我们全都在同一条船上,而贡献与休息都是个可选项。
很多时候,我看到人们的贡献,就感觉他们像是在完成一项义务,一定要在凌晨 2 点测试和修复 bug,然后早晨 8 点去上班。这通常是因为他们关心项目,关心质量,关心自己的声誉。但有时,你需要退后一步。
一个强大的项目社区会站出来提供帮助。如果你知道在接下来的几个月里工作将会很艰难,告诉团队,并给自己设定一个极限。调整心态,直到事情平静下来。
由于经常会有财务后果 (或至少在一般人的观念里),管理好工作承诺是艰难的。
连续工作七小时后,你其实不会再增加任何价值。我以前在办公桌旁边有一张躺椅,现在我在家工作时放了张吊床。经过几个小时的扎实地集中精神工作后,我会停止工作一个小时, 愉快地坐下来无所事事。你的大脑需要休息一下,当然你会从一个路人那里得到奇怪的 "努力工作" 的讽刺评语,但我要工作起来更聪明而不是一味地更努力。一旦我恢复精力后,我能以 30-40% 的加速度,以更好的质量和更佳的洞察力完成下一个任务。而在我连续做了 12-14 小时的工作后,大脑就会宕机以节省能量。而批判性思维会是第一个被关掉,然后是逻辑思维,这就是你将犯错误的地方,从而交付低于预期质量的工作成果。
我住得离海滩很近,所以我会去海边游泳或花点时间和家人在一起。作为一名经理,我有责任向员工明确表示,鼓励他们退后一步,重新充电。我会在公司聊天频道里告诉别人,因为下午要去海滩,我会离线几个小时。我不觉得内疚,希望他们也能效仿。
学会如何说不,并且不为此感到内疚。当我教导员工时, 我会问: "谁让你这么做的?是否可以选择说不?做这个有什么价值?不做的后果是什么?还有谁能做?”
每个人都希望能帮助别人和成为不可缺少的一份子,但是你的可靠性和你的名声以及你所交付的东西的质量同样重要。
4 结论
照顾你的健康,聪明地利用你的时间和找出你贡献的理由。
Anthony Shaw 是 Dimension Data 和 NTT 公司的创新和人才发展的集团总监。Anthony 是开源的倡导者,Apache 软件基金会和 Python 软件基金会的会员。他也是 20 多个开源项目的积极贡献者,包括 Apache Libcloud 和 SaltStack。在 Dimension Data,Anthony 正在为其全球 50 个国家的客户和 3 万名员工推动数字转型 - 关键的举措是软件技能、自动化、DevOps 和云计算。Anthony 生活在澳大利亚·悉尼,他同时也为 17 万博客读者撰写关于技能,软件和自动化的文章。