Docker 工程师
在 Docker,我们所做的一切都与开发者息息相关。工程是我们最大的部门,我们有幸为像我们一样的软件开发者编写软件。每天,数百万开发者使用我们的产品构建自己的软件,我们始终被评为最受喜爱的开发者工具。我们很荣幸能产生如此巨大的影响,并获得社区的喜爱,我们将继续努力,让开发者的生活变得更加美好。
我们在 Docker 如何开展工程工作
作为 Docker 的工程师,您将被分配到我们一个跨职能的工程团队。我们的团队通常包含大约五名工程师、一名工程经理、一名产品经理和一名产品设计师。大多数人对我们产品经理和产品设计师的高比例感到惊讶。但这一点对我们来说至关重要,因为它使我们的团队真正自治,并真正了解和关注用户的需求。

几乎所有我们的团队成员,或者至少所有工程师,都在一个大陆(欧洲或北美)。尽管我们知道在必要时如何异步工作,但都在类似的时区确实有助于协作。
以下是我们当前实践的快照。我们知道我们并不完美,并且有一些事情只是随着时间的推移而发展,我们知道我们可以做得更好。此外,我们是一家快速发展的公司,即使今天行之有效的实践,随着我们规模翻倍或翻三倍,也不会继续有效。我们相信精益求精——持续改进:我们已经尝试了各种变化,并将继续尝试更多变化。
“Docker 的工程团队很棒,我有机会与非常聪明的工程师合作。这里独特的一点是,每个人都在开发他们每天都在使用的产品,这带来了真实/引人入胜的讨论和创新想法。人们在这里对技术充满热情。”
我们的工程团队
我们的每个团队负责一个领域,例如 Compose 或 Desktop Platform。我们试图让他们专注于业务领域,而不是组件或技术,因为我们过去发现这往往会导致复杂的跨团队协调才能完成一项功能。
团队负责根据他们自己对领域的理解、客户以及优先级,提出每个季度的目标。
我们的团队设计基于 Manuel Pais 和 Matthew Skelton 的著作《团队拓扑学》。您可以在他们的网站teamtopologies.com上找到有关我们遵循的模型的更多信息。
工程团队
账户
账户团队确保在 Docker 和 Docker Hub 上实现无缝且安全的用户和组织管理。
内容消费者
内容消费者团队致力于帮助开发者查找和使用 Docker 镜像,并保持其更新。该团队构建 Docker Hub 服务,并为 Docker Desktop 贡献功能。他们的技术栈是 Go 以及 React(Typescript),他们使用 Terraform 和 Helm 部署到 AWS(EKS、Lambda)。
客户成功
客户成功团队帮助客户、开发者及其组织成功有效地上手 Docker 的工具、产品和最新功能。
Docker Desktop 平台
Docker Desktop 平台团队主要服务于编写 Docker Desktop 的团队,负责管理和改进内部工具,包括构建和 CI 集群。它还管理 Docker Desktop 内的安装和更新过程。因此,它既有内部客户(来自其他团队为 Docker Desktop 做贡献的开发者),也有外部客户(所有在安装或更新产品的 Docker Desktop 用户)。该团队的工程师主要使用 Go 编程,也使用一些 C# 和 Swift,并在 Windows、Mac 和 Linux 上工作。
基础设施
基础设施团队提供为 Docker Inc. 跨功能提供计算层的平台,包括 Docker Hub,全球最大的容器镜像库。我们利用原始云资源,将其塑造成高度可用、自助服务的容器基础设施,供我们的应用程序团队使用。我们使用 Docker 产品、众多开源工具、云服务以及我们构建的自动化工具将它们绑定在一起。
计费
计费团队确保 Docker 产品中轻松购买、可靠的计费、正确的用户授权和强大的支付报告。
业务赋能
业务赋能团队为业务用户提供可观察性和控制力,让他们对开发者使用 Docker 订阅的情况感到安全和知情。
内容发布者
内容发布者团队致力于帮助 Docker 镜像的发布者创建开发者易于使用并保持更新的内容。他们运营 Docker 验证发布者和 Docker 赞助的开源计划。他们主要构建和运行 Docker Hub 服务。他们的技术栈是 Go 以及 React(Typescript),他们部署到 AWS(EKS、ECS、Lambda)。
Docker Desktop
Docker Desktop 是我们平台的核心部分之一。它为开发者提供了一个构建、共享和运行容器的环境,无论他们使用的是 Windows、Mac 还是 Linux,都与操作系统无缝集成,捆绑了所有必要的容器工具,并包含 CLI 和 UI。Docker Desktop 团队还开发了 docker compose,我们的多容器应用程序运行工具。他们主要使用 Go 和 React 编写代码,也使用一些 C# 和 Swift,并在所有三个操作系统上工作。
扩展
扩展团队构建 SDK 和 API,以帮助人们扩展 Docker Desktop,以及将来扩展 Docker Hub。他们与 Docker 内部团队、合作伙伴和社区紧密合作,帮助他们成功使用他们构建的工具。该团队还使用他们创建的工具为 Docker 构建扩展。该团队的技术栈主要是 Go 和 React(Typescript)。
注册表
注册表团队负责存储和处理 Docker Hub 上可用的容器镜像和其他内容的请求。这包括确保服务以高性能的方式提供给数百万用户,因为我们每秒会收到高达 5000 个请求。在存储方面,该团队管理着构成 Docker Hub 上内容的 PB 级二进制数据以及相关的元数据。他们为开源项目的 Distribution 做出贡献。他们的技术栈是 Go,他们使用 Terraform 和 Helm 图表部署到 AWS(EKS 和 Lambda)。
流程和会议
我们的团队有权设计自己的流程,因此尽管有很多相似之处,但不同团队之间也存在差异。
我们都遵循类似 Scrum 的流程,每天进行站会,每两周进行一次冲刺评审、回顾和计划。
在许多公司,团队会在团队内部演示他们冲刺的成果:相反,我们将其展示给整个公司。鼓励每个人展示他们的工作进展,而不仅仅是已完成的工作。
一些团队有额外的定期会议,用于梳理他们的待办事项,或讨论架构和技术债务。我们还有一些跨团队的社区,例如前端论坛。
经过多年的发展,我们积累了一些技术债务,但我们认识到控制技术债务的重要性。因此,我们的目标是将 20% 的时间用于偿还技术债务。技术债务的优先级由工程师确定,重点关注哪些因素对他们造成了最大的阻碍。
我们每季度举办一次黑客马拉松,我们会设定一个主题,然后工程团队中的每个人,以及公司中任何想参与的人,都会花一天时间对该主题进行创新原型设计。(多年来,我们尝试过各种其他方法,包括年度黑客周和 10% 时间,但这种方法似乎获得了最高的参与度)。当然,我们也欢迎工程师在其他时间提出想法:我们非常重视能力和不分等级,好的想法可以来自任何人,并且确实会融入产品中。
“Docker 是我参与过的最好的团队。没有自负,有挑战性的问题,开放的协作,以及一个拥有你无法在其他地方找到的热情和开发者痴迷的团队。这里的管理层非常关心我的个人成长,我的团队每天都挑战我成为一个更好的人和工程师。”
Josh Newman,首席软件工程师
我们使用的工具
我们的一些代码是开源的,一些是闭源的,但对于源代码控制,每个人都使用 GitHub。所有代码在提交前都至少由另一位工程师(在某些存储库中,由两位工程师)进行审查。
对于问题跟踪和冲刺计划,我们混合使用 Jira 和 GitHub。甚至有一个团队将他们的冲刺看板放在 Notion 上。大体上,开源存储库使用 GitHub,闭源存储库使用 Jira,但也有一些例外。
CI 使用 Jenkins 和 GitHub Actions 的混合方案。我们的 SaaS 服务基于 AWS。
值班
毫不夸张地说,我们运营着全球 IT 基础设施的关键组件,因此我们需要 24×365 全天候的支持。这在欧洲和美洲的工程师之间分配,以便人们每隔几周轮流值守一个完整周的 12 小时日班。从事 SaaS 服务的工程师必须参与轮换,其他工程师也鼓励参与。值班会获得额外的补偿,无论是否有事件发生。
工作与生活平衡
我们的理念是,人们应该能够将工作融入他们的生活。我们在家工作,我们希望人们能够在组织时间和优先事项方面获得这种工作方式的好处。我们有些人喜欢早起,晚睡,或者在一天中休息一下。许多员工将育儿、家庭责任、爱好或锻炼融入到他们的一天中。
我们有慷慨的假期津贴,我们希望人们能够使用它们。我们希望你休假,回来后精力充沛,准备工作!
“当我停止工作时,没有人要求我做更多的事情。当我的家人需要我更多地支持时,我可以做到。当生活让我沮丧时,Docker 会支持我,而不是把我推向不健康的工作习惯。从我的同事、经理到高管,我都能感受到 Docker 爱我和我的整个家庭。”
Alex Hokanson,高级软件工程师
Docker 工程师在行动
我们的 Docker YouTube 频道和 Docker 博客有大量来自我们工程师的内容。我们的工程师积极参与开发者社区,发表关于 Docker 最佳实践的演讲,讨论新产品等等。
在 DockerCon2021 上,高级软件工程师 Mark Higson 发表了题为“超越 UI:使用 Docker 新的 HTTP API 进行动手编码”的演讲。演讲的重点是,网站、桌面应用程序和 CLI 无法涵盖所有用例。当开发者需要做一些特殊的事情时,他们会转向 API。Mark 讨论了 Docker 的新的 API First 策略如何推动内部开发,并提供了一个实用、真实的编码练习,将它们付诸实践。
一些 Docker 的工程师在 2021 年的 Devoxx France 上发表了演讲。这是法国最大的开发者大会,Docker 工程师在那里代表我们的公司。Guillaume Lours,高级软件工程师,谈到了 Dockerfile 的最佳实践,而 Yves Brissaud 则介绍了如何使用 Porter 构建和使用云原生应用程序包 (CNAB)。
您可以通过访问我们的 Docker 博客 了解更多信息并观看这些演讲(法语)。
加入我们的工程团队
当您准备好迈出职业生涯的下一步并成为一名 Docker 工程师时,请浏览我们的 当前职位空缺,找到适合您的职位。点击“申请此职位”,我们将引导您完成申请流程。无论职位如何,我们对工程师的访谈都遵循相同的基本格式。
我们的工程师面试流程
- 与我们的一位招聘人员进行 15 到 30 分钟的谈话,他们会询问您的工作经历、工作资格和薪资期望。这之后可能会立即进行一次与我们的一位工程师进行的 15 分钟的技术筛选。
- 与该职位的招聘经理进行 60 分钟的访谈。经理会更详细地询问您的工作经历和您正在寻找什么,并向您解释我们正在寻找什么。他们也可能会要求您解决一个简短的编程问题。
- 与团队中的工程师进行两次 60 到 90 分钟的访谈。这些访谈将集中于编码和其他技术问题。您需要在这些访谈中进行屏幕共享。
- 与招聘经理的经理进行 30 分钟的访谈。这将涵盖与经理访谈相同的信息,但不涉及编码。
- 某些职位会有最后一次与我们的工程副总裁进行的 30 分钟的访谈。这将是对话式的,不需要编码。
与我们面试时需要注意的一些事项
- 对于涉及编程的面试,我们确实希望看到您编写代码。您可以在自己的计算机上使用屏幕共享进行操作,以便您可以在自己习惯的开发环境中感到舒适。除了准备好开发环境外,不需要进行任何特别的准备。
- 我们理解有些人可能在被观看时编码会感到紧张,但请把它当作与同事一起编码一样看待。我们不会问刁钻的问题,欢迎您使用 Google 或您日常工作中常用的任何其他在线资源,以及讨论您正在做的事情。我们希望您在尽可能接近日常工作环境的访谈中做到最好,以便我们了解您的思考方式以及您在日常工作中的编码方式。
- 最后一点:我们相信面试应该是一个双向的过程。我们正在寻找合适的同事,但您也在寻找适合自己的工作。因此,请随时提出任何您需要的问题,以帮助您做出是否加入 Docker 的决定。
“我非常喜欢 Docker 如何鼓励多元化和协作来构建新的创新。从工程到营销,每个人的想法都有助于为开发者社区创造更好的体验。你会觉得你的声音真的很有分量。”
Paco Valverde,高级数据工程师