编者按:本文来自微信大众号“HyperAI超神经”(ID:HyperAI),作者:神经小刀,36氪经授权发布。
场景描绘:开发人员必需求面临的一个问题,便是要处理在不断完善中堆集的过期代码,近来 Uber 开源了一个主动删去旧代码的东西,它能够寻觅代码库中抛弃的功用标志模块,在合作开发者的情况下,进行代码删去或许重构操作。
要害词:Uber代码收拾开源东西
收拾代码是一件艺术,关于一些过期的陈腐代码,怎么高雅又快速地删去,是一件让无数人伤神的作业,但在最近, Uber 给出了一种处理的方案。
近来,Uber 推出了一款能够扫描源代码并删去过期代码的东西,形象地命名为 了 Piranha(食人鱼)。
Uber 官方推文介绍Piranha
Piranha 能够在 Uber 的 Android 和 iOS 代码库中运转,现在支撑 Objective-C、Swift 和 Java 三种编程言语。
项目地址:
https://github.com/uber/piranha
功用标志引发的陈腐代码之痛
Piranha删去过期代码,究竟是怎么完成的呢?这还要从 Uber 代码的一个规范说起。
为了便利体系的更新的开发,Uber 选用了功用标志(Feature Flag),也称为功用切换,这是一种答应操控线上功用敞开或封闭的办法,在互联网大厂中被广泛选用。
功用标志的长处举例
运用这个办法具有许多长处,它能够将新功用测验完善之后,再将其发布为全面可用,还能够针对不同用户定制差异化服务(A/B 测验),当呈现 Bug 时支撑回滚,工程师还能够长途禁用运用程序的毛病部分。
据介绍,在 Uber 一切的程序代码库中,就有超越 6000 个功用标志。
但功用标志的增多,也会导致代码库的复杂性增加,一旦该标志过期,则需求将其删去,否则会带来技能层面的担负。
过期的标志会形成编程担负
但这个看似简略的整理进程,往往会被许多开发者疏忽,进而在代码容量、测验周期等多个维度上影响软件的开发。
为了处理这样的一个问题,Uber 规划并推出了代码优化东西 Piranha。它能够剖析并找出过期的代码标志,将可删去的部分反馈给原作者,合作其他的东西做处理或删去。
用Piranha主动检测并删去
详细来说,Piranha需求主动检测出过期标志,并删去其相关代码,这样的一个进程的难点在于,要确认标志是否被人运用,以及该标志的一切者,而且要了解代码的详细细节。
考虑到 Piranha 的运用布景,Uber 选用了运用静态剖析,即经过代码检查,来查找因过期标志遗留下来的废旧代码。
运用 Piranha 能够删去或重构代码
其间可整理的三个要害维度分别是:
删去紧邻功用标志 API 的代码。
删去因为履行上一步而无法访问的代码,称为深度清洁。
删去与功用标志有关的测验代码。
其间的要害在于,依据在代码库中调查到的编码形式,挑选了迭代规划技能的有用办法,以调查和确认三种标志 API:
回来布尔值的布尔型 API ,用于确认履行所选用的操控途径。
更新 API ,用于更新正在运转的体系中的功用标志值。
回来非布尔值原始值(整数、双精度等)的参数 API 。
经过重构技能解析输入源代码的 AST(笼统语法树),以检测运用功用标志 API 的存在。
假如符号注释与输入处理行为匹配,只需删去测验的注释,假如不匹配,则要丢掉整个测验以处理符号注释测验。
运用 Piranha精简代码示例
经过这套方案的施行,能够从代码中找出过期的功用标志,并进行删去或许重构。
已删去2000 多过期的标志
这个办法在 Uber 的代码库中被证明是广泛有用的,现已用来删去了 2000 多个功用标志及相关的代码。
Piranha 现已在 Objective-C、Swift 和 Java 程序中运转杰出,但为了让其作业更高效,以完成 Piranha 主动进行标志铲除,还需求建立一个更完善的体系。
所以 Uber 建立了作业流 pipeline,该 pipeline 可定时生成差异和使命,以铲除陈腐的功用标志。
Pipeline 的结构示意图
Piranha pipeline 在标志办理体系中,主动查询陈腐标志列表,并对每个标志,经过输入陈腐标志的称号、其一切人以及预期的输出行为(处理或操控),以发动Piranha。
经过算法剖析和处理之后,Piranha 生成一个 diff (即拉取恳求),并将其放入代码审理体系中,该标志的原始作者为默许审理者。
作者能够承受 diff ,或许依据需求对其进行修正,也能够回绝修正并将该标志符号为未过期。pipeline 还在使命办理体系中生成了一个整理使命,以盯梢每个生成 diff 的状况。
此外,体系该装备了提示机器人PiranhaTidy,可定时增加翻开 Piranha 相关使命的提示。现在运用 Piranha 主动生成 diff 的时刻不超越 3 分钟。
经过这一系列的操作,即可轻松完成对代码的审理和处理,将过期的代码一扫而光。
Piranha 的特性和长处总结
删去旧代码,就用食人鱼吧
当然,在上述的介绍中可知,要运用 Piranha,代码需满意以下条件:
广泛运用功用标志;
具有特定的 API 以操控功用标志的行为;
代码用 Java、Swift 或 Objective-C 完成;
此外,Piranha 还有一些方案正在进行中,比方改善 Piranha 发生的重构代码,扩大 Piranha 以援助 Kotlin 和 Go 等其他言语。
现在项目现已开源,可在以下地址获取,你想要试试吗?
https://github.com/uber/piranha