铲屎不能停——辣鸡粉碎神器 ast-grep

大家好,我是海老师。以前都是技术文章里讲段子,效果不好。 这次换个风格在段子里讲技术,希望各位看官能喜欢,给点个赞。


【第一幕】

在一座耸立的高科技公司大楼里,外面阳光灿烂,而楼内却弥漫着一股忙碌的气氛。

这家公司是一家创业明星,专心致志地研发人工智能和大数据应用。创始人是一位年轻的天才,曾在微软、谷歌、亚马逊等大公司摸爬滚打,积累了丰富经验和广泛人脉。公司志在打造颠覆性的产品,队伍中汇聚了一群充满激情的行业精英,而投资者则是一批有远见卓识的大佬。

一辆出租车缓缓停在大楼前,车门打开,走下一位穿着西装的年轻人,手捧文件夹,脸上洋溢着自信的笑容。他就是小王,刚刚毕业的应届生,今天迎来了他在这家公司的第一天。

小王内心激荡着:终于到了,这可是我梦寐以求的公司,得好好干,争取早日跻身高层,成为大佬们的得力助手。

小王走进大楼,向前台的美女报上名字,领取了工牌,随后便跟着一位HR小姐姐进入了电梯。

HR小姐姐微笑着说:"小王,欢迎你加入我们的大家庭。我是HR Lisa。你是我们的新星,对你的期望很高。"

小王(谦虚):"Lisa你好。谢谢夸奖,我会努力的,不辜负大家的期望。"

HR小姐姐继续笑道:"不客气,你可是我们从上千名应聘者中挑选出来的精英呢。简历上写得通透,面试表现也十分出色。你的技能和经验完全符合我们的要求,堪称理想人选。"

小王有些惊讶:"真的吗?我真的难以置信,我只是一个普通的应届生,没什么特殊技能和经验。只是按照网上教程学了些基础知识,做了些小项目。觉得自己还有很多不足,还需要学习的地方。"

HR Lisa微笑着摇头:"你太谦虚了,简历上可是写明你有五年工作经验,曾在微软、谷歌、亚马逊等大公司工作,并参与过众多重要项目。掌握了许多先进技术,能力水平都相当高,你可是我们的资深工程师,真是位互联网老兵!"

小王惊恐万分:"啊?!我有五年工作经验?我是互联网老兵?!这...这是不是搞错了?!"

HR小姐姐一脸疑惑:"怎么了?你不是小王吗?不是我们新来的员工吗?"一边检查简历和身份证。

Lisa心里暗想:"靠北!难道搞错了同名同姓的简历,竟然把应届生招成了资深工程师。不行不行不行,这事儿得圆过去......!!"

HR Lisa:"小王啊,你的面试特别优秀,我们特地破格录取了你。先跟我来办入职手续吧......"

此时电梯到了,门打开,里面站着一个穿着格子衬衫的中年人,手持Mac,脸上带着一丝严肃。他就是小组长,负责着一个历史悠久的项目的维护和优化,也是小王的直接上司。

小组长,向HR小姐姐打招呼:"Lisa,早上好。"说罢又注意到小王"这位是之前说过的王工,对吧?欢迎加入我们。"

小王摸不着头脑,迷迷糊糊地办完了入职手续,正式踏入了这个公司的大门。

【第二幕】

公司办公室里,电脑桌整齐排列,程序员们埋头苦干,代码在屏幕上跳动。

小王被分配到一个历史遗留项目组,任务是维护和优化一个已经上线多年的系统。这个系统是公司核心业务之一,但因历史原因,其代码质量堪忧,充斥着各种bug和冗余,让人头疼不已------简称:屎山。

坐在电脑前,小王打开了项目的代码库,眼前满是console.log,简直让人头晕目眩。

小王嘀咕:天哪,这是什么情况?这些console.log是什么意思,为了调试吗?那为什么不删除呢?性能和可读性不受影响吗?写代码的时候到底怎么想的?难道是不知道有更好的工具和方法吗?

小王想着删除这些console.log,但发现屎山巍然壮阔,几十上百万行代码,手动删除根本不可行。心情无奈、沮丧,让他感到绝望。

一天过去了,到了深夜,小王仍然坐在办公室里,陷入深思:这就是我梦寐以求的公司?这就是我要做的工作?我不是来创造价值、改变世界的吗?怎么就成铲屎官了?我不甘心!我不能这样,必须找到解决办法,改造项目,证明自己,让大佬们看到我的价值!!

小王开始在网上搜索,寻找能快速删除这些console.log的工具或方法。尝试了一些工具,如正则表达式,但发现它们不够智能,容易误删或漏删,问题更复杂。

小王心想:这些工具太笨了,只能按字符串匹配和替换,不懂代码语法和结构,不知道变量、函数、参数、返回值是什么,也不知道何时删除、何时保留。如何才能保证代码正确性、完整性,优化性能和可读性,让代码美观规范,符合业务需求和逻辑,易于维护和扩展呢?

小王感觉崩溃,需要更强大的工具,一个能理解代码、操作代码、改善代码的工具。在一个论坛上看到一个帖子,推荐了"ast-grep",一个基于抽象语法树(AST)的代码匹配和替换工具。

小王好奇地阅读帖子,了解了ast-grep的工作原理。感觉眼前一亮,仿佛找到了救星。立即下载安装,学习使用方法,开始了代码清理。

执行一行代码:

bash 复制代码
ast-grep --pattern 'console.$METHOD($$$ARGS)' --rewrite ''

咒语般的效果让小王惊叹不已,项目中的logging全部消失!ast-grep的神奇之处在于:

  • --pattern参数,用一种类似于源代码+通配符的格式指定想要匹配的代码
  • 模式中的console.$METHOD($$$ARGS),通配符METHOD可以匹配任何一个AST的标识符,$$ARGS可以匹配任意多个语法节点
  • --rewrite参数,用一种类似于模板字符串的语法指定想要替换的代码内容
  • 空字符串'',能将console.log全部替换为空,删除目标代码

在ast-grep的帮助下,小王高效清理了大量垃圾代码,使整个项目焕然一新,堪称辣鸡粉碎机!!

第二天早晨,小组长兴奋地发现这一变化,赞扬小王的努力和创新精神,决定将成果汇报给技术大组,让小王的价值为整个团队带来积极变化,果然是互联网老兵。

【第三幕】

技术大组的讨论会议室,氛围略显紧张,一群技术从业者聚集在讨论桌前,代码片段在屏幕上闪烁。

在技术大组内,小王的改动引起了一位资深前"慢脚"K5级别的大佬的关注,他对小王的工作提出了一些质疑。

前慢脚K5大佬质疑:小王,我看了你的改动。你为什么要删除这么多代码?这些改动的业务价值是什么?有没有顶层设计,底层逻辑是不是扎实?业务抓手在哪里?

小王感到有些失落:我本意是为了提升代码质量和可维护性,但或许我的解释不够充分。我所做的主要是为了方便团队未来的维护和开发。

慢脚K5大佬:不就是删代码吗?这个你来做和招十个实习生做有什么区别? 实习生都知道console.error在catch语句里不能删,你都删了。线上debug不好做了,妨碍业务发展了,你担得了责吗?

小王: .....

K5大佬: 啥也不是,散会!


会议结束后,小王独自留在办公室,手指敲击着桌子,神情颇为忧郁。

小王在意识到自己的解释未能完全说服大佬后,感到一阵沮丧。他开始怀疑自己的改动是否真的有效,是否能够获得团队的认可。然而,在查阅资料的过程中,他意外地发现ast-grep还有YAML规则功能,这让他的信心重新燃起。

小王(在电脑前):YAML规则,这个看起来很厉害,也许这是我需要的答案。 ast-grep的pattern只能匹配单个语句,无法涵盖更复杂的情形。

然而,YAML规则通过组合规则,生成了强大的AST节点选择器,就像CSS选择器一样强大又简单!

yaml 复制代码
rule:                            
  pattern: console.$METHOD($$$)
  not:
    pattern: console.error($$$)
    inside:
      kind: catch_clause
      stopBy: end
  • 这个规则的第一个pattern部分用于寻找所有console的方法调用,比如console.log, console.warn, console.error
    • $METHOD 是通配符
  • 这个规则的第二个not是一个否定条件,用于排除下面的模式
    • 第二个 pattern 会匹配 console.error的调用,并且还需要在catch的语句块中
    • inside: 是一个关系条件,表示匹配下面的模式只有当上面的模式在某个AST节点内部时才成立。
    • kind: catch_clause 是关系条件中指定的父节点类型,表示 try catch中的 catch 语句块。
    • stopBy: end 是关系条件中指定的终止条件,表示条件会一直向上攀爬抽象语法树直到找到catch语句或走到根节点。

这样就可以实现只检查所有console方法,但又不会匹配到在catch语句中调用console.error()方法了!

小王:通过六行YAML规则,我就能够精确地匹配和保留需要的代码了。ast-grep简直是屎山吸尘器!删得快还准。下次开会时,我可以更好地解释给大佬们听了。


第二轮技术大组会议,众人再度齐聚讨论室,电脑屏幕上闪烁着代码的投影。

小王心中激情澎湃,为即将到来的较量给予自己加油。

慢脚K5大佬仍保留一丝怀疑:小王,你的修改我依然不能百分之百认同,你能否再解释一下?

小王则信心满满:大佬,或许我之前表达得不够清楚,我运用了ast-grep的YAML规则处理。这使我能够准确捕捉和替换代码,保留了必要的部分,比如在catch语句里的console.error。这样我们就能够在确保代码品质的同时,不妨碍线上的debug。

慢脚K5大佬思索片刻:哦,这个YAML规则看起来确实相当灵活。你能不能现场演示一下使用方法?

小王在屏幕上呈现ast-grep的YAML规则,透过在线游乐场演示了如何巧妙地捕捉和保留代码。

他的解释煞有其道,演示过程一目了然,使大家对这项新技巧有了更深层次的理解。

慢脚K5大佬的表情渐渐缓和,逐渐接受了小王的解释,微微颔首示意。

K5大佬:(略带满意)好吧,看来你确实深入研究过,我会关注这项改动的后续效果。

【尾声】

时光飞逝,公司年会如约而至。在颁奖典礼的灯光闪烁中,鲜花簇拥的舞台上,员工们沸腾的掌声中,期待已久的颁奖环节拉开了帷幕。

小王挺立在舞台上,脸上洋溢着自信的微笑。主持人对他在技术领域的卓越表现进行了赞美,全场员工纷纷鼓掌。

主持人:有请,今年公司最杰出的十倍工程师,小王先生!

小王步上舞台,接过奖杯,他的目光扫视着台下的同事们,感受着那些由衷的掌声。

小王微笑着发表获奖感言:谢谢大家,这是我在公司一个不起眼的开始,感激所有支持我的人。

小王深知,他的成功背后既有团队的支持,也有一把神奇的工具------ast-grep。尽管他曾经取代了一位技术大佬的职位,但凭借对技术的热爱和不懈的努力,他超越了自我,也向所有人证明了自己的价值。

颁奖典礼结束后,小王与同事们聚在一起,相互祝贺。突然间,一个熟悉的声音响起。

HR Lisa:小王!还记得我吗?我是HR Lisa,对你的表现印象深刻。果然不错!我其实早就看好你了哦~~~

Lisa心想,尽管小王刚入职时搞错了一切,但没想到这小子真的厉害,成功地瞒天过海骗过了所有人。

小王成功地骗过了所有人,甚至骗过了自己。Fake it until Make it,他从一个新人蜕变为一个真正的十倍工程师。

相关推荐
光影少年23 分钟前
react和vue图片懒加载及实现原理
前端·vue.js·react.js
小仓桑28 分钟前
深入理解 JavaScript 中的 AbortController
前端·javascript
摸鱼也很难30 分钟前
解决 node.js 执行 npm下载 报无法执行脚本的错
前端·npm·node.js
换个名字不能让人发现我在摸鱼30 分钟前
裁剪保存的图片黑边问题
前端·javascript
PeterJXL33 分钟前
pnpm:包管理的新星,平替 npm 和 yarn
前端·npm·node.js·pnpm
小牛itbull33 分钟前
Mono Repository方案与ReactPress的PNPM实践
开发语言·前端·javascript·reactpress
黑色的糖果35 分钟前
vue2封装自定义插件并上传npm发布及使用
前端·npm·node.js
afabama37 分钟前
nvm 安装某个版本的node,缺少npm包
前端·npm·node.js
码喽哈哈哈1 小时前
day01
前端·javascript·html