Redian新闻
>
代码共享的陨落:为什么说内部库是反模式?

代码共享的陨落:为什么说内部库是反模式?

公众号新闻

作者 | Ben Morris
译者 | 马可薇
策划 | 丁晓昀
鉴于多数的开发工作都要借助外部框架和库,工程类组织总是会试图构建自己的共享库,希望能借此实现一定规模的经济效益。人们期望这类库能节约时间并提高解决方案的质量,避免团队重新发明轮子。

问题在于,多数的提议都是建立在“共享代码能提高开发效率”这一谬论上的。考虑到共享的代码或资源常常会被视为系统设计中的瓶颈,为什么人们还是如此热衷于代码共享呢?

共享的库会造成团队间的耦合,影响工程设计的效率。应用程序可能会被间接地绑定到特定版本的依赖项中,从而导致各种令人头大的兼容性问题。不认真仔细地进行管理,破坏性改动或回归都可能会带来严重的后果。

代码的复用与耦合之间需要权衡,手动复制粘贴代码或许是一种解耦机制,如此一来应用程序得以按不同的速度发展,代码的稳定性也能有提高,因为应用程序不用再吸收共享依赖关系中的更新。

库带来价值的情况

代码共享不总是件坏事,有些情况下内部共享库是能够带来价值的。举例来说,前端开发人员常常用共享库实现系统设计,在不同应用程序之间实现统一的观感。

很多共享库的目的并不总会非常明确,尤其是项目名称中的“common”、“utility”,或者“helper”关键词。这些通用库的职责总是模糊不清的,很难长期保持清晰的界限。再加上“通用”这些术语的主观意义,工程师们往往会把这些库当作是任何可能在未来复用的功能的垃圾堆放场。

通用库往往会重新实现语言功能或是解决已解决的问题,比如身份验证、序列化、数据的访问和加密。通用库不仅会带来不必要的维护负担,还会在代码中引入陌生的函数调用,增加新使用者的学习难度。

其他内部库也不过是第三方依赖关系的无用包装。这些库存在的理由往往是更易于修改底层依赖关系,但这在实践中并不会真的发生。多数的封装最终都会掩盖接口、限制底层功能,却不会增加任何有价值的功能。

另一类常见的内部库是以“最佳实践”的形式出现。通常是一组工程师试图用自己的观点限制其他工程团队的代码实施,其中隐含的信任缺乏正是不健康的工程文化标志。

一个库的干涉性和意见性越强,其实用性就越低。定义了“最佳”模式的库会束缚住工程师的手脚,造成代码实现之间不健康的耦合。多数情况下,我们可以通过示例来鼓励“最佳实践”,而不是试图将这些抽象到一个库里。

此外,还有一些库则是实现了服务之间的共享领域数据和业务逻辑。这些库模糊了应用程序的边界,并通过共享的模式产生了耦合。对共享的领域库修改,最终会对依赖它们的各类应用程序产生不可预测的影响。一般来说,最好的办法是复制粘贴共享的领域数据,将其作为单独的服务实现,或者是重新考虑服务的边界线。

共享库的生命周期

共享库的最大问题在于它们不仅编写困难,维护起来也是不简单。共享库往往缺乏实质性的需求,这也更是增加了设计和测试的难度。

为代码复用而开发是需要特定的技能,并具备设计模式相关的知识,这些在工程团队中并不常见。只有经验丰富的人才能正确地把握抽象的成都,避免组件过于具体无法通用,或过于笼统而无法增加任何实际的价值。

与其他代码库一样,共享库会随着时间的推移而产生熵值增加,也是需要花功夫进行维护。多数组织的代码库中都会潜藏着一些不受欢迎的共享库,光是维护依赖关系的更新就已经足够挑战,更不用说还要根据不断变化的系统环境发展新功能了。

为共享库的维护腾出足够的工程资源并不简单,尤其是在工程团队围绕系统或商业垂直领域构建的情况下。这就导致了共享库被忘在脑后,最初的激情消退后,共享库就再没人去维护了。

常年没人维护的库往往会变成“孤儿库”,就算没有,它们也会依赖于一小部分热衷开发工作的工程师,而这些工程师们则可能会将开发工作倾向于非常狭隘的利益。

内部源码的方式可以帮助建立以社区为驱动的代码共享方式。不过这也只在大批拥有开源社区工作经验的熟练工程师共同工作的情况下才有可能成功。即使如此,最终你还是躲不过分配资源到共享库的设计、构建和维护中。

什么才是“好”的共享库?

无论开发的工作是如何安排的,共享库都需要有明确且一致的领导。你需要有人能来确保共享库的重点维持在主要的目标上,代码在一定程度上保持健康的状态。

或许你还需要一定的管理,协助确立什么才应该被“共享”。这方面的形式有很多,但合作总是比“自上而下”的管理和强制库有更高的吸引力。衡量共享库成功与否的指标之一就是工程团队自发采用共享库的程度,换句话说,共享的库是否真的能让开发人员的生活更轻松。

成功的共享库往往都具备某些特征。它们的规模往往不大,关注的范围很窄,也更容易保持关注重点并长期维持边界。它们会有管理良好的代码基础架构,其中包含测试组件,便于避免回归或意外出现的破坏性变动。它们也会有高效的构建和发布自动化,支持新增代码的轻松集成。此外,成功的共享库还应该具有清晰一致的文档,让库更易于采用。

最重要的是,组织内部要能够承诺有足够的时间用于持续开发,如果不能做到这一带你,那么内部的代码库就很难创造任何真正的价值。

原文链接:

The shared code fallacy: Why internal libraries can be an anti-pattern(https://www.ben-morris.com/the-shared-code-fallacy-why-internal-libraries-are-an-anti-pattern/?accessToken)

声明:本文为 InfoQ 翻译,未经许可禁止转载。

今日好文推荐
OpenAI 刚刚又杀死了一批初创公司
疯狂马斯克的“极限”计划居然成功了?!“下云”后成本降低 60%,部分功能代码精简 90%,30 天急速迁移服务器
程序员篡改 ETC 余额,一年私吞 260 余万元;语雀公布故障原因及赔偿方案;各家财报发布,创始人们:就很难受|Q资讯
可部署手机、适配国产芯……全新升级后的 ChatGLM3 真的有点东西:智谱 AI 选择继续开源!

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
AutoGPT 宣布不再使用向量数据库!向量数据库是小题大作的方案?为什么听了医生的话,盆腔炎还是反反复复?[第五届书房Show活动]——by yjp 和衣帽间共享的书房问渠人物 | #兔主席:为什么说“地产拉动经济”的观念需要改变了?澳洲地下恐存在巨大陨石坑!规模或为全球之最,比导致恐龙灭绝的陨石坑大3倍6000人死亡,10000人失踪!沙漠特大洪灾来袭!地球自毁模式?谣传易鲸捷的数据库是套牌的Oracle。。。一家明星公司的陨落中规院&滴滴青桔:2023年度中国主要城市共享单车和共享电单车骑行报告美国移民:为什么说你需要一张绿卡斯微生物:一家明星mRNA公司的陨落巴西的陨落教训天才预备役的“丘成桐少年班”,能否重新定义“拔尖”人才的培养模式?中规智库:2023年度中国主要城市共享单车和共享电单车骑行报告一家明星mRNA公司的陨落徐高:为什么说,“成功的商人不懂宏观经济学”鸢尾花,静静观赏罗振宇:为什么说“躺平”是一个伪命题?江淮汽车公开挂牌转让资产,蔚来将告别江淮代工模式?老海归和她的洋老公“面试HR问能不能接受日不落模式??” 哈哈哈哈哈哈别太荒谬了!!“向后看”和“回不去”“孩子最喜欢的乐高”合集来啦!一起来看群友分享的不同年龄段适合的乐高玩具~很多种业余参与都可以点赞,唯独这个不行 !神仙教育模式?这个国家的孩子每天只上学5小时,不用考试、写作业,成绩还很棒!?离谱了!多伦多市中心一个床位每月$750!共享床友又没完全共享!三联内部坦白局:为什么你总是记不住、写不好?为什么要使用工厂设计模式?“背水一战”,小鹏重回经销模式?最佳亲密关系模式:肉体得以分享的精神友谊中国女婿大山消失真相:为什么说着爱中国,却把老婆孩子送国外?真人老师讲课!加拿大公立教育局分享的K-12年级免费线上辅导课:孩子不学,你得学!火星乐园第三部《灰界》第五十章 彩虹之心共享经济的本质,不是共享,而是租赁民营经济是民有民享的“人民经济”,是党的重要执政基础
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。