自动化枯燥的工作:我是如何构建代码生成器来节省大量重复工作的🧑💻
在本文中,我将解释每次提出新需求时,我如何因为需要编写冗余代码来扩展服务而感到沮丧,以及我如何通过代码生成实现自动化。
您可以跳至以下任一章节:
0)背景故事/设定时间🧙
1)重复劳动🥱
2)编写代码生成器🧑💻
3)成果⚡
背景故事/剧情时间🧙
一位新客户登录了Middleware,他们的数据量是之前客户的 100 倍,导致我们的数据管道崩溃。我们必须尽快发布紧急修复程序。
经过缓解措施后,我们发现他们的大部分数据都是无关的机器人生成内容,我们可以在数据同步过程中将其过滤掉。我们实施了一个紧急修复方案,在数据摄取阶段进行过滤,效果良好。
接下来,我的任务是添加一个新设置,用于过滤机器人生成的数据,而无需手动编写代码。虽然这让我们能够更好地控制同步的内容,但这却是一项枯燥乏味、重复性的工作,需要了解设置服务的上下文。
冗余的工作🥱
我们的代码库中有一个设置服务,用于处理产品中的所有设置。代码结构清晰,易于理解,并且能够处理产品所需的任何类型的设置。
添加新设置的整个过程要求开发人员查看之前有人添加了新设置的 PR,重新了解上下文,对多个文件(从适配器到验证器)进行代码更改,所有这些都依赖于新设置的架构,并确保 API 正常工作。
代码改动本身并不复杂;只是感觉需要大量手动操作,收益却不大,而且严重依赖于新设置类型的类架构。对任何开发人员来说,这都至少需要半天的工作量。
当我接到添加设置的任务时,我心想:🤔💡 如果有些工作感觉是多余的,并且会根据既定的结构进行更改,那么我应该尝试将其自动化。
编写代码生成器🧑💻
我之前完全不知道如何根据一些规则自动生成代码。我经常听到在大公司工作的朋友们说,他们有专门的服务可以根据特定的模式自动构建 API 和布局,所以我知道这是可以实现的。
研究📖
我上网搜索过是否已有解决方案。有人开发过类似的产品,但没有一个符合我的需求。
我尝试使用 ChatGPT 生成一个简单的解决方案,但都失败了。我的下一个想法是使用脚本将所有文件发送到 GPT 并获取更新后的文件,但这有两个问题:
1)LLM在代码生成方面不够可靠。2
)分享专有代码会让我丢掉工作💀。
问题分解🛠️
下一步是验证我们的用例是否可行,所以我做了以下操作:
1) 掌握了向代码库添加新设置所需的所有上下文信息。2
) 追踪了所有需要进行更改的文件、特定类和函数。3
) 将每个文件中所需的更改与新的设置方案进行了映射。
到目前为止,函数/变量/类的命名与设置类型名称一致,适配器和验证器的逻辑可以根据我的新设置类型模式中使用的原始数据类型进行编码和自动化。
如果我在要添加新代码的地方添加占位符注释,并且我的脚本能够识别要用哪段代码替换哪个注释,同时将注释向下移动以便下次可以再次使用,那么就能解决这个问题。
解决方案 ⭐
首要挑战是创建能够根据新的设置名称和模式生成代码的纯函数。生成新的枚举、类和字典很简单,但创建处理程序、适配器和验证器则更加复杂且耗时。我使用 GPT 和 Claude 来帮助开发一个通用的解决方案。
接下来的挑战是如何在各个文件中查找占位符注释,并将生成的代码插入其中,同时还要处理 Python 的缩进问题。这尤其棘手,因为我对正则表达式几乎一窍不通,只能边做边学。
以下是我处理代码填充部分的方法,并用一个例子来解释,因为这对我来说是新的,对你来说可能也是如此:
enum_pattern = r"(?P<indent>\s*)# ADD NEW SETTING TYPE ENUM HERE\n"
match = re.search(enum_pattern, content)
if match:
indent = match.group('indent')
new_enum_entry = f'{indent}{setting_type.upper()} = "{setting_type.upper()}"\n'
content = re.sub(enum_pattern, new_enum_entry + match.group(0), content)
enum_pattern用于查找占位符注释的正则表达式模式。re.search在文件内容中搜索模式。match.group('indent'):获取缩进级别。re.sub:将占位符替换为新的枚举条目,并保留缩进。
所有的努力都得到了回报✨
结果⚡
经过数小时的努力,代码生成器脚本终于编写成功了🚀
我编写了一个脚本,可以提示用户输入新的设置名称、必填字段及其类型,并自动修改相关文件。开发人员只需要添加导入语句(因为之前的导入语句太繁杂,难以处理),并处理任何复杂的数据类型(这部分比较简单,因为90%的代码都是自动生成的)。
这是将脚本添加到我们中间件开源代码库的拉取请求。如果您希望为您的用例实现类似的解决方案,我建议您仔细阅读代码:https://github.com/middlewarehq/middleware/pull/433
这使得添加设置的开发时间从几个小时缩短到不到 10 分钟,最重要的是,它帮助我和其他开发人员摆脱了枯燥的工作 😎!
感谢你坚持看到最后🤝
如果您喜欢这篇文章,请花点时间给我们维护的开源仓库点个星标:
⭐ https://github.com/middlewarehq/middleware
⭐ https://github.com/RocketChat/Apps.Github22
你可以在社交媒体上关注我:
GitHub/samad-yar-khan
LinkedIn/samad-yar-khan
X/samadnotyouryar