在过去的25年多时间里,我创建了软件组件和分布式框架,建立并领导了相关团队。近几年我致力于推动 Adobe 服务开发、部署和管理系统的开发人员生产力。

抽象陷阱

在云时代早期,Adobe 的每个团队都有自己的云账户、部署系统,其对应的成熟度也截然不同。很快我们就意识到需要对此进行标准化,这样成本控制、合规性、安全性和可靠性等关键问题就能够一次解决,且一劳永逸。

在2016年,Kubernetes 还处于早期阶段,尚未有能力大规模支持 Adobe 的云产品。当下最好的选择是 Mesos,当然我们清楚地了解我们正处在一个不断变化的环境中。因此我们没有将用户暴露给原始平台,而是创建了一个抽象——服务规范。这个服务规范描述了所有关于如何提供和部署服务的信息。然后,定制的内部软件在在部署时将服务规范转为必要的原语,平台就此起飞,迅速成长并为1000多个服务和开发人员提供支持。

但随着规模和需求的增长,我们在 Mesos 之上的本土解决方案开始陷入困境。这时 Kubernetes 已经成熟,是时候改变了。我们构建了一些自定义迁移工具,并且能够保证在不停机的情况下将所有正在运行的服务从 Mesos 集群迁移到 Kubernetes 集群,也就是我们的新后端是将服务规范转换为 Kubernetes 配置,尽管出现了一些小问题,但总体一切正常。就此 Mesos 集群被关闭,成本也得以节约。

之后的几年,情况变得不太乐观。我们的服务规范以一种非常简单的“黄金路径”,支持近4000个适用于服务 REST API 或 Workers 的基本应用程序。但随着越来越多的 Adobe 团队开始寻求平台成本节约以及安全性、合规性和可靠性的保障,要求也越来越多样化,渐渐超出抽象支持的模式。因此公司内部规模较大且技术较成熟的团队开始绕开抽象,在我们的托管集群上构建自定义方案,充分利用 Kubernetes 的自由和强大功能。当然,他们也必须对部署系统承担所有责任与风险,因此在安全性和可靠性方面增加了更多负担。

随着越来越多的团队要求更高的自主权和更大的灵活性,我们开始意识到原来我们被困在抽象陷阱里了。我们的抽象不支持团队部分使用,因此在定制解决方案时需要绕过抽象,也就是说我们提供了一个不可扩展的“全有或全无”解决方案

定制解决方案逐渐成为负担

随着时间的推移,我们的定制解决方案变得越来越复杂,为了添加新功能并跟上 Kubernetes 的发展消耗了团队越来越多的时间,我们几乎没有什么空间进行创新了,也开始落后于新技术了。更糟糕的是我们没有为可扩展性而构建。即使有好的想法,但如果我们无法确定优先级,让用户贡献他们需要的更改也变得不切实际。

平台的大规模采用与资源消耗

从 Mesos 到 Kubernetes,再到接下来我们要做的平台,在每个阶段我们都不得不与制度惰性和对变化的恐惧与抵触作斗争。如何让用户参与进来,让一个有效但果实的解决方案变为更好更先进的解决方案,同时又能够解决他们对生产服务发生变化的风险产生的担忧呢?

这便是需要了解企业内部,确定一些在当前系统中苦苦挣扎的关键参与者的时候了。也许这些参与者正在使用已有的系统和解决方案,但由于缺乏自由度,他们无法成长。明确受影响最多的团队,以及主要负责公司关键业务需求的团队是哪些,并与他们一起协作,以便更好地梳理痛点与需求。同时让负责构建新解决方案的工程师加入这些团队,综合专业知识为团队进行培训,同时将收集的反馈和教训回滚到产品中。当这些成功的经验在整个公司内传播开来,对采用新技术的担忧和抵触将能够有效减弱。

这是一个好的开始,但这个模式不可持续,因为只能小范围实施无法达到庞大的规模。由于企业内部的工程师数量有限,他们需要构建平台,而与业务团队协作并给予支持会消耗他们大量的时间和精力。因此自助服务成为平台的关键。例如包含故障排除链接的智能错误消息,可以搜索可用文档以回答问题的智能代理,为团队解决问题的认可和奖励机制,各个级别的自动化,等等。

培养“T型”开发人员

无论我们构建什么解决方案,都需要主题专家(Subject Matter Expert, SME)来进行创建和维护,由此带来的问题则是过度专业化。开发人员成为他们所负责组建的专家,无需担心其他任何事情。这样开发人员可以更专注于开发业务,但在平台环境中也带来了很多问题。这类开发人员通常在自己关注的领域表现出非常高的生产力,但他们同样有可能面临与不太了解熟悉的系统集成的问题。如果这些开发人员离开岗位,他们所专注的业务就可能成为企业的单点故障。

我们通过三种方式解决了这个问题。首先通过培训和日常使用我们自己的交付来确保团队的每个成员都是平台的专家用户,然后为每个成员分配一个支持轮换。最后我们鼓励团队内的流动,我们定期根据开发人员的个人意愿和企业的需要在组件之间轮转岗位。

当然开发人员需要集中精力完成工作,所以这些轮换不会进行得太频繁,组件的转移也不会时常发生。这样我们就能够培养“T型”人才,即开发人员在整个平台上具有广泛的知识,且在数个组件上的了解具备深度

完美≠进步

多年来我们一直在试图兼顾短期胜利和长期规划。尤其在开始一些新的、有风向的项目,随着时间的推移,企业的处理态度往往会转向谨慎,开始按流程展开项目,例如成立规划小组,确保规范详尽无遗,不断进行审查......

事实上没有什么完美又神奇的解决方案。但我们发现,如果我们能发现什么时候遇到问题停滞不前,并及时改变模式,就能取得很好的结果,不用过分追求规范上的详尽和完美。带几个开发人员组织一个小团队集中创新研发几周,消除干扰,然后与选定的关键核心用户密切合作来评估概念。如果顺利的话,将信息反馈给团队及其他成员,利用这些反馈和简洁的“规范单页”,确保研发的目标和愿景是清晰的,接下来进行迭代并交付平台用户所依赖的价值。

平台团队也可能成为瓶颈

平台团队的一个自然趋势就是随着时间的推移逐渐忽视用户。当我们对用户开始说“不”的时候,他们就会开始寻找其他的解决方案。而平台工程的关键特征,那些为公司带来的优势——成本节约、合规性、安全性和可靠性,也都没有意义了,平台团队将成为瓶颈,这也将是平台消亡的方式。

因此我们通过与高层领导和主要用户保持联系来避免这种情况,尤其是面对公司内新项目和关键业务时。我们确保平台是不断发展的,以满足关键用户的需求,保证平台足够通用,使开发人员的工作变得轻松和灵活,支持所有必需的用例。当然实现这点并不容易,我们需要不断地创新和改进。

下一步是什么

从一个好的想法开始,到大规模和持续的适应,这就是 Adobe 构建 IDP 的旅程。我们正处在一个转折点,由于抽象的限制性,而用户想要得更多,维护自定义解决方案正在消耗平台团队的大量精力和时间。总结构建 IDP 之旅中的经验与教训,我们认识到抽象是好的,但不灵活的抽象可能是一个陷阱。在内部构建解决方案允许完全自由,但这种自由是以持续维护来兜底的。我们依旧在寻找一个区别于固定的“黄金路径”解决方案和原始 Kubernetes 的新解决方案。

我们正在使用 Helm 图表的轻度抽象来替换服务规范的重度抽象,并将我们的定制组件套件换为 Argo,我们在努力解决可扩展性问题。我们让关键用户参与到开发过程中,结合开源和企业内部资源,再次构建自定义转换工具,将旧服务规范转换为 Helm 图表和 Argo 模板,让用户可以随意定义这些模板。

我们的下一个挑战是通过与云提供商、监控解决方案、可观察性、分布式跟踪等更紧密的集成,将开发人员的生产力提升到另一个水平。我们开始将 Adobe 所有不同的内部产品集成到 IDP 中。有了这一切,我们将以更低的成本提供更好的平台,为我们的用户提供更高的灵活性和更低的摩擦。

参考链接:

https://thenewstack.io/adobes-internal-developer-platform-journey-and-lessons/

Adobe 构建 IDP 之路的经验与教训的更多相关文章

  1. 【温故知新】——BABYLON.js学习之路·前辈经验(二)

    前言:在上一篇随笔BABYLON.js学习之路·前辈经验(一)中回顾了组内同事们长时间在Babylon开发实践中的总结出的学习之路和经验,这一篇主要对开发中常见的一些功能点做一个梳理,这里只作为温故知 ...

  2. [解读REST] 6.REST的应用经验以及教训

    衔接上文[解读REST] 5.Web的需求 & 推导REST,上文根据Web的需求推导出了REST架构风格,以及REST的详细描述和解释.自从1994年以来,REST架构风格被用于指导Web架 ...

  3. 阿里巴巴 Kubernetes 应用管理实践中的经验与教训

    作者 | 孙健波(阿里巴巴技术专家).赵钰莹 导读:云原生时代,Kubernetes 的重要性日益凸显.然而,大多数互联网公司在 Kubernetes 上的探索并非想象中顺利,Kubernetes 自 ...

  4. 【温故知新】——BABYLON.js学习之路·前辈经验(一)

    前言:公司用BABYLON作为主要的前端引擎,同事们在长时间的项目实践中摸索到有关BABYLON的学习路径和问题解决方法,这里只作为温故知新. 一.快速学习BABYLON 1. 阅读Babylon[基 ...

  5. 阿里巴巴的 Kubernetes 应用管理实践经验与教训

    作者 | 孙健波(天元)  阿里巴巴技术专家 导读:本文整理自孙健波在 ArchSummit 大会 2019 北京站演讲稿记录.首先介绍了阿里巴巴基于 Kubernetes 项目进行大规模应用实践过程 ...

  6. Theano FCN实现与训练经验与教训小结

    NaN 计算softmax loss时要用numeric robust 的计算方式. softmax与 loss可能要分开计算. 得到前者的计算方式可以是常规方法. 但计算后者时要注意无穷大和NaN的 ...

  7. 安装pytorch-gpu的经验与教训

    首先说明 本文并不是安装教程,网上有很多,这里只是自己遇到的一些问题 我是以前安装的tensorflow-gpu的,但是发现现在的学术论文大部分都是用pytorch复现的,因此才去安装的pytorch ...

  8. 为你揭秘知乎是如何搞AI的——窥大厂 | 数智方法论第1期

    文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 数智物语(公众号ID:decision_engine)出品 策划.编写:卷毛雅各布 「我们相信,在垃圾 ...

  9. 基于MVC4+EasyUI的Web开发框架经验总结(2)- 使用EasyUI的树控件构建Web界面

    最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开发框架保持一致,而在Web上,我主要采用EasyUI的前端界面处理技术,走MVC的技术路线,在重 ...

  10. (转)基于MVC4+EasyUI的Web开发框架经验总结(2)- 使用EasyUI的树控件构建Web界面

    http://www.cnblogs.com/wuhuacong/p/3669575.html 最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开 ...

随机推荐

  1. vue-i18n警告

    vue3引入vue-i18n警告: bundler build of vue-i18n. It is recommended to configure your bundler to explicit ...

  2. Android Banner - ViewPager 02

    Android Banner - ViewPager 02 现在来给viewpager实现的banenr加上自动轮播 自动轮播的原理,使用handler的延迟消息来实现. 自动轮播实现如下内容 开始轮 ...

  3. Centos8发布,下载链接

    就在昨天Centos8发布了,今天试着尝鲜,感受:真香. 瞧官网都没有介绍,真香就是了. Centos 8 下载地址:http://ftp.sjtu.edu.cn/centos/8.0.1905/is ...

  4. Algorithm参数记录

    一.vector<Point2f> vector是一个存储二维点坐标的容器,其中每个元素都是一个Point2f类型的对象.在OpenCV中,Point2f表示一个由两个单精度浮点数构成的二 ...

  5. Semantic Kernel 入门系列:🛸LLM降临的时代

    不论你是否关心,不可否认,AGI的时代即将到来了. 在这个突如其来的时代中,OpenAI的ChatGPT无疑处于浪潮之巅.而在ChatGPT背后,我们不能忽视的是LLM(Large Language ...

  6. C# System.lnvalidOperationException:"A second operation started on this context before a previousoperation completed. This is usually caused by different threads using the same instance ofDbContext...

    与上一篇问题一样,只是错误不一样,DbContext 不支持并发请求,每个数据库操作都使用await就可以了

  7. 10分钟极速入门dash应用开发

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/dash-master 大家好我是费老师,几天前我发布了由我开源维护的dash通用网页组件库fac的0 ...

  8. mongodb使用自带命令工具导出导入数据

    记录 mongo 数据库用原生自带的命令工具使用 json 文件方式进行导入.导出的操作! 在一次数据更新中,同事把老数据进行了清空操作,但是新的逻辑数据由于某种原因(好像是她的电脑中病毒了),一直无 ...

  9. windows下MinGW编译ffmpeg

    windows下MinGW编译ffmpeg 1.官网下载MinGW并安装       1)下载 ,下载网址: https://sourceforge.net/projects/mingw/files/ ...

  10. CefSharp自定义缓存实现

    大家好,我是沙漠尽头的狼. 上文介绍了<C#使用CefSharp内嵌网页-并给出C#与JS的交互示例>,本文介绍CefSharp的缓存实现,先来说说添加缓存的好处: 提高页面加载加速:Ce ...