10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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:004316
用户头像

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

关注

评论

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

AI加持|博睿数据公众号正式升级运维智能体!

博睿数据

医学+AI系列第一场|聚焦北京中医药大学的产-教-研融合、以赛促学、创新驱动的人才培养实践

ModelWhale

以赛促学 北京中医药大学

爱测智能体测试平台·全新升级邀您体验

测试人

人工智能 软件测试

2025年面试通过率低?来看看一位Android大牛的BAT面试心得与经验总结

程序员每日分享

程序员 面试 移动开发 Android开发 互联网大厂

面临秋招!卷S人的Java中高级核心知识全面解析面试手册,涨薪跳槽拿高薪靠它了!

程序员高级码农

Java 程序员‘

新能源车企需要用到堡垒机情形简单分析

行云管家

网络安全 数据安全 堡垒机

从电脑到座舱:英特尔携AI科技杀入智能汽车主战场

科技热闻

基于Casbin的ABAC授权模型设计与开发踩坑实录

天翼云开发者社区

安全 权限管理 访问控制

DeepSeek-R1源码解读

AI布道Mr.Jin

2025年含泪狂刷Android基础面试118题,offer拿到手软

程序员每日分享

程序员 面试 移动开发 Android开发 互联网大厂

YMatrix 技术内幕:详解 10w+ TPS 背后的技术矩阵

YMatrix 超融合数据库

OLTP HTAP OLTP 场景实践 YMatrix HTAP数据库

编程助手怎么选?我都要!左手通义灵码,右手 Cursor,组合来用超级爽

阿里云云效

阿里云 通义灵码

Java 集合框架底层数据结构实现深度解析

电子尖叫食人鱼

Java 数据结构

开源鸿蒙亮相HDC 2025 共建千行万业的数字底座

最新动态

AppGallery Connect(AGC)账号与权限管理体系

小赵学鸿蒙

商务 AppGallery Connect 鸿蒙开发工具

原点安全入选Gartner®“数据安全平台”中国市场指南代表厂商

原点安全

Java线程池详解:高效并发编程的核心利器

不在线第一只蜗牛

Java

flstudio找不到中文设置,没有语言选项怎么办?FL Studio设置中文教程,FL Studio中文版免费下载

阿拉灯神丁

编曲软件 FL Studio 水果FL Studio FL水果 音乐创作

编程助手怎么选?我都要!左手通义灵码,右手 Cursor,组合来用超级爽

阿里巴巴云原生

阿里云 通义灵码

能源行业数智化运维实战指南 | 博睿数据能源行业精选案例集重磅发布!

博睿数据

用DeepSeek+ Python 自动生成测试用例 狂省5小时,漏测率暴降83%!

测试人

人工智能

PAI推理重磅发布模型权重服务,大幅降低冷启动与扩容时长

阿里云大数据AI技术

开源 扩容 冷启动 模型训练/测试 大型语言模型LLM

向量删除的3种方式

DashVector

人工智能 数据库 大模型

AWS X 易点天下解码Agentic AI驱动下的营销新变革

新消费日报

等保测评费用谁出?收费依据是什么?

行云管家

等保 堡垒机 等保测评

微信读书十周年,后台架构的技术演进和实践总结

JackJiang

网络编程 即时通讯 IM

JVM内存结构33连问

量贩潮汐·WholesaleTide

JVM

图纸太杂乱?1秒关闭CAD图层,清爽看图!

在路上

cad cad看图 cad图纸

HDC 2025|在AppGallery发现精品应用

最新动态

商场商圈潜客挖掘模型

天翼云开发者社区

数据挖掘 大数据

更强模型效果!豆包大模型 1.6 系列上线边缘大模型网关,最高申领1000万免费 Tokens

火山引擎边缘云

AI+ 端侧AI 大模型 侧端大模型

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