写点什么

GitHub 推出 Scientist,帮助开发者重构关键路径代码

  • 2016-02-15
  • 本文字数:1671 字

    阅读完需:约 5 分钟

GitHub 最近正式发布了 Scientist 1.0,这是一个能够帮助开发者更有信心地重构或重写代码的 Ruby 库,作者是GitHub 的工程师Jesse Toth。在过去几年中,Scientist 已经为GitHub 上的大量项目所用。

按照Toth 的看法,Scientist 对于关键代码的重构尤为实用,在进行这种重构时,开发者对于新的实现的正确性要具备很强的信心。在此之前,一种常见的重构方法是采取 BranchByAbstraction 架构模式,这种模式本身虽然非常实用,但它只是保证了新的组件能够取代旧组件所出现的每一个场合而已。而 Scientist 的目标是提供更好的正确性保障。此外,Scientist 还将尝试绕开测试过程的限制,因为测试过程往往无法做到涵盖所有可能的情况或输入数据的组合。

Scientist 的基本思想是建立一种受控试验(experiment),在其中同时运行旧的代码路径与新的代码路径,随后对两者的输出进行比较,并对任何不匹配或异常进行记录。旧的代码路径将保证整个系统在重构的实验阶段仍能够正确地运行,而新的代码路径的正确性也同时得到了验证。

一个 experiment 是一种轻量级的抽象,它包含了两种行为。use 行为表示执行旧的代码路径,而 try 行为则表示执行新的代码路径。

复制代码
experiment = Scientist::Default.new "my-experiment"
experiment.use { <call the old code here, the control> }
experiment.try { <call the new code here, the candidate> }
experiment.run
#...
def publish(result)
#...

run 方法将始终返回与 use 代码块相同的返回结果,而 publish 方法将在 experiment 的末尾进行调用,以发布所收集到的数据。除了对 try 与 use 代码块的结果进行比较之外,Scientist 还会随机地调整他们的执行顺序,以回避两者之间可能产生的相互关联,它还将评估两种方法的执行时间、管理异常、并发布所收集到结果。

Scientist 提供了大量的方法对它的默认行为进行自定义,举例来说,用户可以定义一个特定的比较方法,以覆盖默认的 == 操作符,这一方法将用于输出的对照比较。此外,用户还可以提供一个上下文对象,可在发布数据时使用。用户还可以控制启动任务、启动或关闭 experiment 的执行等等。Scientist 还提供了一些更高级的控制选项,以允许用户忽略结果、运行多个 try 代码块、或只运行 try 代码块,以涵盖某些特殊的用例。

InfoQ 与 GitHub 的首席工程师 Jesse Toth 进行了一次对话。

能否请你描述一下 Scientist 的诞生过程?

Scientist 的诞生过程是这样的。当时我有一位前同事 Rick Bradley 正在尝试重构一个非常复杂的 API 终结点,该 API 将返回一个长长的 repository 列表。他不确信所改动的代码是否已经得到了足够的测试覆盖,并希望通过某种方式对真实的数据集进行测试。于是他快速地修改了一部分代码以调用重构后的方法,并且每当重构后的方法与原始方法产生不一致行为的时候,就在我们的指标栈中将数据记录下来。这种方法相当有效,于是我们为它编写了一个库,让任何人都可以利用它进行相同的实验。

为了让现有的代码能够通过 Scientist 进行一系列实验,所改动的代码会产生多大的开销?你在 GitHub 中又是怎样在使用 Scientist 时调整它的投入与产出比的呢?

这取决于你希望进行实验的那部分代码有多大开销,以及这部分代码的调用频率。如果候选的重构代码与对照的原始代码具有完全相同的效率,那么运行一个 experiment 就是 2 倍的开销。如果候选代码极大地提升了性能,那么开销就会大大地降低。

如果我们认为运行 Scientist experiment 的代价很高,那么我们就会缓慢地提高运行 experiment 的请求的比例。如果 experiment 的执行能够涵盖 1% 或 5% 的访问量,这就已足够为我们收集大量的性能与不匹配方面的数据了。

你是否希望在 Scientist 中引入更多的特性?

Scientist 已经具备了我们目前所需的所有特性,当然,如果有用户发现了某种使用 Scientist 的其他方式,并希望为支持这一方式而添加相应的特性,我们将非常乐于看到这方面的贡献。

Scientist 所需的运行环境是已安装了 Ruby 1.9 的 Unix 系统,可以从对应的 gem 中进行安装。

查看英文原文 GitHub’s Scientist Aims to Help Refactoring Critical Paths

2016-02-15 18:004456
用户头像

发布了 428 篇内容, 共 200.9 次阅读, 收获喜欢 39 次。

关注

评论

发布
暂无评论
发现更多内容

企业知识管理革命:AI驱动的新一代知识库如何重塑组织竞争力

百川云开发者

开源知识库

🚀 SightAI 已集成 Google Gemini 3

SightAI

Google 大模型 Gemini API

中国电建北京院 ×NineData:构筑能源基建数据管理新范式,为 "数字基建" 夯实数据根基

NineData

数据库 数据管理 数据管理平台 NineData 中国电建

点量场馆预约小程序解决方案,开启智慧预约新体验!

点量实时云渲染

小程序 微信小程序 App 预约小程序 客户预约管理系统

Comate Figma2Code智能体升级,畅享Figma2Code不受限

Comate编码助手

figma 文心快码 编程智能体 Comate AI IDE AI编程助手

Dapp区块链商城开发时间费用以及功能、和传统商城有什么区别

西安链酷科技

2025国内主流低代码平台排行,11月最新盘点,头部厂商全解析

优秀

低代码

大数据-157 Apache Kylin 全面指南:MOLAP 架构、Hive/Kafka 实战与实时 OLAP 落地

武子康

Java 大数据 kylin 分布式 Apache Kylin

AI 英语陪练 App的开发

北京木奇移动技术有限公司

AI教育 软件外包公司 AI英语

破解行业绿电直供痛点:西格电力直连架构适配关键技术解析

西格电力

绿色能源转型 绿电直连 能源低碳 低碳经济 绿色能源与可持续发展

见证中国开源生态成长力量:开源鸿蒙五年跨越与未来展望

最新动态

伊克罗德信息连获三重国际认证,以标准化服务体系护航客户数智化转型

伊克罗德信息科技

工业4.0:AI质检的关键应用和价值

万界星空科技

QMS 产品质量管理 AI质检 AI工业质检 万界星空科技QMS

AI 英语作文 App 的开发

北京木奇移动技术有限公司

AI教育 软件外包公司 AI英语

海外社交媒体分析平台测评指南:2025年主流平台深度横评

沃观Wovision

社交媒体 社媒监测 海外社交媒体监控 社媒分析

面向复杂生产场景的 Token 双流:百度百舸开源贡献至 SGLang 社区

Baidu AICLOUD

双流 Qwen DeepSeek 推理加速

海外社交媒体分析服务如何助力品牌发现海外增长机会?

沃观Wovision

社交媒体 社媒监测 海外社交媒体监控 社交媒体监测 社媒分析

京东外卖App独立上线,超级App如何集成海量小程序?

FinClip

Apache SeaTunnel 如何将 CDC 数据流转换为 Append-Only 模式?

白鲸开源

大数据 开源 CDC Apache SeaTunnel Append-Only

双点击账户接管漏洞深度分析

qife122

网络安全 移动安全

国外社交媒体分析服务如何助力海外品牌预判国外市场趋势

沃观Wovision

社交媒体 社媒监测 海外社交媒体监控 社媒分析

2025数据资产管理平台权威排行榜:智能合规引领行业新生态

科技经济

AI 客服系统:用智能对话让服务“接得快、答得准、体验好”

上海拔俗

结项报告完整版 | 为 Apache DolphinScheduler 添加 gRPC 插件

白鲸开源

大数据 开源 Apache DolphinScheduler 开源之夏

AI赋能:新一代海外社交媒体分析软件的智能功能对比

沃观Wovision

社交媒体 社媒监测 海外社交媒体监控 社媒分析

大厂严选 | 数据堂2025年度版权数据集热销榜单重磅发布!

数据堂

人工智能 人脸识别 数据集 语音识别 大模型

虚拟电厂VS传统电厂VS微电网的差异:3大维度拆解,避免概念混淆

西格电力

绿色能源 绿色能源转型 虚拟电厂 低碳经济 虚拟电厂系统

区块链 Web3 项目开发方法论

北京木奇移动技术有限公司

区块链开发 软件外包公司 web3开发

libcurl FTP路径规范化漏洞解析:编码%2e%2e导致目录穿越

qife122

网络安全 路径遍历

10大海外社媒分析系统对比:谁才是2025年的性价比之王?

沃观Wovision

社交媒体 社媒监测 海外社交媒体监控 社媒分析

Gemini3 强势来袭,这次前端真的死了。。。

苍何

GitHub推出Scientist,帮助开发者重构关键路径代码_Ruby_Sergio De Simone_InfoQ精选文章