转眼间 2023 年又将结束了。我从 2007 年硕士毕业参加工作至今,已经以软件开发工程师
的身份,在现在这家公司,工作整整 17 年了。
回顾自己这些年的 IT 从业经历,我觉得有三次的技术发展浪潮,给我留下了深刻的印象。
第一次是我还在计算机专业本科就读时,我们寝室兄弟们用的都还是 Windows 操作系统。一位兄弟从图书馆借了一本 Linux 操作系统的书,坐在电脑前,书放在膝盖上,一边看着书,一边在键盘上敲命令,想在自己电脑上安装一个 Linux 系统。后来隔壁寝室一位同学过来,看到后指点说,你如果只是想学习 Liunux 系统,其实不用这么麻烦,你在你的 Windows 操作系统里下载一个 Vmware,安装个 Linux 虚拟机就可以了。我当时一听,哇,直接在 Windows 系统里运行一个完整的 Linux 系统?太神奇了!第一次与虚拟化技术的亲密接触,给我留下了深刻印象。
第二次我深深感受到计算机技术魅力的时候,是我 2017 年与 Docker 和 Kubernetes 虚拟化技术的初次接触。当时云原生开发的理念已经大行其道,我所在的 SAP 公司也在云转型的道路上迈开大步往前走,公司内部也举办了很多轮的 Docker & Kubernetes 等技术培训。我当时已经从服务器端编程的 ABAP 技术栈转到了 Java 和 Node.js,搭建本地开发环境一度成为了我的噩梦。Docker 提供了应用与环境的隔离,简化了应用的部署和扩展,使得应用能在不同的环境中以一致性的方式运行。其轻量级特性使得它相比传统虚拟机技术,在资源利用和启动速度上都有明显优势。
然而今年年初开始以 ChatGPT 为代表的 AIGC 火爆出圈,给我带来的巨大的震撼,远远超过了我当初第一次接触虚拟机和 Docker & Kubernetes 时的感受。
尽管技术圈内有一些悲观的看法,比如 AIGC 将在 3 年内终结编程
,程序员成了自己的掘墓人
之类的言论,但对我而言,我更愿意去积极挖掘 AI 工具们能给程序员的日常工作带来哪些便利,特别是对于我这种年过四旬的老程序员。
和我 2007 年一起毕业,参加工作的同学们,如今仍然和我在一线编程岗位上的,已经不多了。他们中的绝大多数,已经转岗成为了 Manager,架构师,产品经理,质量工程师等等。而我这些年来在公司,每年被分配担任一些刚毕业参加工作的年轻同事的导师,看着他们年轻充满活力,朝气蓬勃的工作劲头,我时不时会问自己:我这个老程序员,和这些年轻的程序员相比,我的核心竞争力究竟在哪里?
在我刚刚成为一名年轻的程序员时,我曾经误以为,一个程序员会使用的编程语言、编程工具越多,运用的技术越流行,掌握的技术栈越熟练,这个程序员就越优秀。在这种想法的驱动下,我尽可能多地去尝试新的编程技术和工具,不管这些东西在自己工作中是否能应用得上。每天泡各种技术论坛,一看到介绍新鲜技术和工具的帖子,马上在自己本机上尝试。坚持了一段时间之后我发觉,即便这样做,也没有成为自己心目中优秀的程序员
的样子。反而因为很多新技术只是浅尝辄止,在工作中没有运用上,成了屠龙之技,所以一段时间过后就遗忘得差不多了。
后来我结了婚,有了小孩,父母的年龄也越来越大了,我感觉自己能分配到潜心专研技术的业余时间越来越少。既然属于自己能够分配的时间的绝对数量没有办法增加,那我只有提高单位时间的产出,尽可能提高学习效率。
所以我决定在 ChatGPT 等 AI 工具干掉我之前,我先尽可能利用它们提高自己的工作效率,尽可能延长自己的编程寿命。
今年我开始用 ChatGPT 来辅助自己完成那些技术含量低的,机械的重复工作。
比如让 ChatGPT 帮我写单元测试代码。
使用的 ChatGPT prompt:为下面这个<语言>实现的代码,编写对应的单元测试代码
,然后将要生成单元测试的代码喂给 ChatGPT:
ChatGPT 会自动生成单元测试代码,我们可以在这些基础上,进行人工审查然后修改。
我现在是一个 Angular 开发人员,几乎每天都要和其标准库里的 HttpClient 工具库打交道。
工作中我对其 request 方法感兴趣,想阅读其源代码,但是对于里面个别语句不甚理解:
那么我首先让 ChatGPT 给我介绍整个 request 方法大致完成一件什么事情,使用 prompt:逐行介绍一下下面这个方法的用途
。这个方法来自 Angular common 开发包的 HttpClient 实现 http.mjs.
ChatGPT 给出的答复,我一目十行,很快就了解了这个方法的大致目的。
然后再给 ChatGPT 发出指令,提醒它要逐行介绍:我让你逐行介绍,你的介绍太简略了
。
于是得到了我期望的解答。
代码重构和性能优化
下面是一段存在性能问题的 ABAP 代码。这段代码首先从数据库表 tadir 里读取 200 条 Class 定义,然后循环这 200 条记录,在循环体内再次根据定义里的 Class 名称字段,到另一张数据库表 seoclasstx 里读取 Class 的描述信息。
REPORT z. DATA: lt_dev TYPE TABLE OF tadir, ls_dev TYPE tadir, lv_text TYPE seoclasstx-descript. SELECT * INTO TABLE lt_dev FROM tadir UP TO 200 ROWS WHERE object = 'CLAS' AND author = sy-uname. LOOP AT lt_dev INTO ls_dev. SELECT SINGLE descript FROM seoclasstx INTO lv_text WHERE clsname = ls_dev-obj_name AND langu = sy-langu. WRITE:/ 'class name: ', ls_dev-obj_name, ' text:', lv_text. ENDLOOP.
这样应用服务器总共会对数据库服务器造成 1 + 200 = 201 次读取操作。
我询问 ChatGPT 以上代码是否存在可以优化的地方,ChatGPT 的回复一语中的,排在第一点的建议就非常切中要害:将第二个 SELECT 语句放在循环体之外:
我再对 ChatGPT 发出了指令:请给我一份性能优化,重构后的代码
。
ChatGPT 也完美的完成了任务:
将第二个 SELECT 语句提至循环体外,现在数据库服务器总共的读取次数从 201 次降低到了 2 次。
作为一个年过四旬的程序员,我的记忆力尤其是王二小过年——一年不如一样了。正则表达式的语法,我总是今天用了明天就忘,每次要用都得去网上查。
有了 ChatGPT 之后,正则表达式的编写和理解,我都交给 ChatGPT 了。
下列这两段正则表达式是我负责的 SAP 电商云前台登录页面里,用户名和 password 两个字段验证值合法性的正则表达式:
export const EMAIL_PATTERN = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; // eslint-disable-line export const PASSWORD_PATTERN = /^(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[!@#$%^*()_\-+{};:.,]).{6,}$/;
我直接让它告诉我这些正则表达式的设计思路:
程序员是一门需要活到老,学到老的职业。当一个老程序员工作的部门,需要切换到一个新的技术栈时,老程序员对他的上级说,我年龄太大了,学不动这些新技术了。这可能吗?有条件要上,没条件创造条件也要上。
比如我使用 Angular 开发已经有一段时间了,现在我想学习 React,因此向 ChatGPT 咨询,让它给我建议一些 React 的学习要点:
作为一个已经有 Angular 基础的前端开发人员,我最感兴趣的是 Angular 和 React 二者最大的区别是什么?从 ChatGPT 那里我得到了一些解答。
虽然我明白 ChatGPT 的回答只能作为参考,但至少它能够给我很多启发和灵感,作为我进一步到 React 官网开始精读和深入学习的指引。
尽管 Google 搜索也能某种程度上满足我的需求,但是 Google 搜索需要我精心选择关键字,然后从搜索结果列表里手动筛选出需要继续阅读的网页。并且上面几个例子里正则表达式的解读,单元测试代码的自动生成,代码重构和性能优化的建议,现阶段 Google 还无法像 ChatGPT 这样能够以交互式的方式完成我发出的指令。
当然除了 ChatGPT 之外,我今年也用了其他的 AI 工具,比如 Microsoft New Bing,来辅助我的工作。
比如我提问:SAP ABAP 里有几种生成 PDF 的技术?
回答如下:
在 SAP ABAP 中,有这几种生成 PDF 文件的技术。SAP 提供了 PDF1 设备类型(也称为"PDF 转换器"),您可以使用它将 OTF 或列表文档转换为 PDF 格式。当您打印 SAPscript 或 Smart Form 时,您可以选择获取 OTF 格式的生成文档,然后以编程方式将 OTF 转换为 PDF 二进制。此外,从 NetWeaver 2004(版本 6.40)开始,SAP 提供了一种名为"SAP Interactive Forms by Adobe"的技术(通常称为 Interactive Forms, Adobe Forms 或 PDF Forms) ,它允许您在不使用任何中间媒介的情况下本地生成 PDF。
大家注意上图绿色高亮区域的注解"1", 指明了答案关键点的出处,即来自索引 1 指向的网页。而索引 1 即是 SAP 社区 wiki,点击上图黄色区域即可打开。
我们可以将 New Bing 的回答同 ChatGPT 的回答做一些比较:
(1) 有朋友抱怨 ChatGPT 的回复是"一本正经的胡说八道",比如问它如何用 ABAP 给 PDF 生成水印,看似回答得头头是道,实际上给出代码里包含的那些 ABAP 类,在系统根本不存在。而 New Bing 的回答,关键点都提供了出处,点击超链接即可阅读原始网页,这种有理有据的回答方式,比起 ChatGPT 更令人信服。
(2) 上图序号为 2,3,4 的其他网页,New Bing 认为同用户提的问题的答案非常相关,故也罗列在结果里供提问者参考。
上图蓝色区域是 New Bing 认为同 SAP ABAP 里有几种生成 PDF 的技术 这一问题和答案相关的其他提问,点击之后即可向 Bing 发起新的提问。
我们打开 New Bing 给出的答案的出处 1,即 SAP 社区 wiki. 简单浏览后,发现 New Bing 给的答案确实质量非常高。这个 wiki 页面是 SAP ABAP PDF 专题页面,里面干货很多。
再看排在 New Bing 回答结果出处第二顺位的这个网页,从网址看是一个知乎专栏链接:
打开一看,这不是笔者本人的知乎专栏吗?我的知乎专栏能出现在 New Bing 搜索结果排名这么靠前的位置,感谢 Bing 对我文章的认可。
排在出处第三位和第四位的,分别是两篇 CSDN 博客,介绍了如何将 Smartform 生成 PDF 并通过邮件发送的实现。两篇文章一上来就直入主题,提供了 ABAP 生成 PDF 的实现代码,没有废话。
至少在今年,AI 工具并没有抢走我的饭碗。即便 AI 将来某一天终究会干掉程序员,但是在这一天到来之前,我仍然会始终保持积极的心态,利用 AI 不断提高自己的开发效率,尽量延长自己的编程寿命。
与各位同行共勉。