AIsaAIsaStudio English 打开 AIsa Studio

GitHub 官方访谈三位 Java Champion 如何用 GitHub Copilot 提升生产力

原标题:How 3 Java Champions are using GitHub Copilot for increased productivity

GitHub Blog 访谈 Vlad Mihalcea、Patrick Baumgartner 和 Frank Delporte 三位 Java Champion,分享在生产与开源项目中使用 GitHub Copilot 的实践经验。Mihalcea 用 Copilot 把原本需数周的 Optimizer 事件历史应用缩短到两天开发完成,并自建技能让生成文本匹配自己的写作风格。Baumgartner 用 Copilot 在 8 到 10 小时内完成约 900 页幻灯片从 Reveal.js 到 Marp 的迁移,通过截图对比和 PDF 校验提供证据,还曾在四小时火车途中用手机指挥编码 agent 完成一个 Maven 插件加 CI 流水线。Delporte 则把 Pi4J 第五个 GPIO 按钮失效的问题交给 Copilot coding agent,约半小时后得到 PR,定位出虚拟线…

为什么值得看

三位资深 Java 开发者分享了各自使用 GitHub Copilot 的一手案例与验证、技能沉淀等实践,方法可直接迁移到日常 AI 辅助开发。

阅读原文 ↗10月21日 AI 日报

本页的摘要、推荐理由与解读出自 AIsa Studio 的 AI 风向智能体,原文版权归原作者所有。

深度解读

发生了什么

GitHub 官方博客发布访谈,对话了三位 Java Champion,请他们分享在生产环境和开源项目中使用 GitHub Copilot 的具体做法与经验。三人是 Vlad Mihalcea、Patrick Baumgartner 和 Frank Delporte,均有超过十年的 Java 使用经验。访谈的共同前提是:AI 编码工具可以快速生成代码,但「速度本身并不能解决最难的软件工程问题」,开发者仍需提供上下文、验证结果、保护可维护性,并对交付的软件负责。

关键细节

  • Vlad Mihalcea 用 Copilot 在 IntelliJ IDEA 中分析、设计和实现 Hypersistence Utils 与 Hypersistence Optimizer 的功能。一个原本要花数周的应用,用 Copilot 只花了两天实现。他还创建了自己的 skill,从 65 篇已发表文章中学习他的写作风格,用于生成项目文档,并遵循「最小惊讶原则」让 AI 模仿现有代码实践。他会按任务类型切换模型:深度思考用 100 万上下文窗口的 Opus 加 Extra High 或 Max 推理,简单任务用更轻、更省 token 的模型。
  • Patrick Baumgartner 举了三个例子:一是约 900 页、15 份演示文稿从 Reveal.js 迁移到 Marp,手动预计一周以上,用 Copilot 只花八到十小时,关键在于通过截图对比、并排运行动画、PDF 对比等方式建立验证,让代理「有证据」而非只是宣称完成;二是用 Copilot 把用户反馈变成可复现的 UI 测试,定位并修复了 Tamboui 中第五个输入按钮无响应的问题,修复被合并进上游;三是与 Copilot 研讨学习科学方法,开发了一个面向瑞士课程的小学数学学习应用,数据完全留在设备上,托管在 GitHub Pages。他在去 JavaLand 的约四小时车程中通过手机操控编码代理,到达时已有一个可用的 Maven 插件、CI 流水线和性能测试报告。
  • Frank Delporte 分享了 Pi4J 库的一个案例:V4 发布后,用户报告第五个输入按钮完全无响应。他把该 issue 指派给 Copilot 编码代理并给出两个文件路径,约半小时后收到一个 pull request——虚拟线程在原生 poll() 调用中阻塞时无法从载体线程卸载,而树莓派 4 只有四个核心、四个载体线程,四个 watcher 占满后第五个永远不会被调度。他还给出了多条实践建议。
  • Patrick Baumgartner 总结了四条原则:停止一次性提示,先让代理「采访」自己以暴露隐含假设;为任务定义验证门(verification gates),「完成」不应由模型说了算;把经验沉淀为可复用的 Agent Skills,如他维护的 maintainer-audit;用 Checkstyle、PMD 等确定性工程工具包裹概率性模型,形成「修改 → 执行检查 → 读结果 → 修复 → 再执行」的迭代。

为什么重要

这篇访谈的价值在于展示了资深开发者如何把 AI 从「补全工具」转变为协作对象:Patrick 已不再使用经典的 Copilot 自动补全,工作几乎完全转向 agentic 工作流;他把代理视为「陪练伙伴」而非「初级开发者」,强调「上下文为王」和「委托执行,不委托责任」。Frank 的 Pi4J 案例尤其说明 AI 能把人类难以快速定位的原生调用与虚拟线程调度问题诊断清楚,而最终的解释、评审与合并仍由人把关。这些经验指向一个共同的判断:AI 正在把「工程」重新放回软件工程,核心能力从写代码转向理解问题、验证结果和维护可维护性。

对谁有影响

对使用 AI 编码工具的 Java 及后端开发者,这篇访谈提供了可直接借鉴的实践:按任务切换模型、编写自定义 skill、定义任务级验证门、要求单元测试作为修复的一部分、给代理指明排查路径。对维护开源项目的维护者,Pi4J 的「代理调查、人类负责」模式与 maintainer-audit skill 展示了如何让 AI 参与评审与仓库治理。对团队教练和技术管理者,Patrick 关于增量推进、避免大型通用规格的提醒,以及对软件工程学生的建议——成为强问题解决者而非代码生产机器——提供了关于 AI 时代工作方式的参考。

全文翻译

以下翻译只覆盖原文的前一部分,其余内容请看下方原文。

三位 Java 冠军分享了他们如何使用 GitHub Copilot 解决问题、加速开发,并确保人类对最终结果负责。

2026年10月20日

|

17 分钟

  • 分享:

AI 编码工具可以快速生成代码,但仅靠速度并不能解决最困难的软件工程问题。开发人员仍然需要提供上下文、验证结果、保护可维护性,并对交付的内容承担责任。

为了了解经验丰富的开发者如何把握这种平衡,我们采访了三位 Java 冠军,他们在 Java 使用方面均拥有超过十年的经验。他们分享了在生产和开源环境中使用 GitHub Copilot 的具体案例,以及他们将 AI 生成的输出转化为可靠软件所采用的实践方法。

以下是他们与我们分享的技巧。

Vlad Mihalcea

GitHub 个人资料:@vladmihalcea

GitHub Copilot 最近如何帮助你?

我一直在用它来分析、设计和实现 Hypersistence Utils 和 Hypersistence Optimizer 中的各种功能。

例如,我一直想开发一个 Web 应用程序,提供 Optimizer 的事件历史记录,以便我们可以看到性能改进工作如何在应用性能中体现出来。在 AI 出现之前,我不断推迟这项任务,因为开发它需要花费数周时间。但使用 Copilot 就像拥有一位新团队成员,所以我用它创建了一个将在下一个版本的 Hypersistence Optimizer 中发布的应用程序。原本需要几周的任务,现在只用了两天就实现了。

你通常如何使用?你是将 GitHub Copilot 用作 IDE 插件还是 GitHub Copilot 应用程序?

我在 IntelliJ IDEA 中使用 GitHub Copilot,因为在审查源代码或调试会话期间运行它非常方便。

它作为代码助手非常有用,帮助我加快了调查速度和为需要验证的功能构建原型的速度。

我仍然会审查计划和 AI 生成的代码,因为它们的目标是提高我的生产力,而不是完全取代我。虽然 AI 在许多情况下能提供正确的答案,但仍有时响应不尽如人意,需要我的干预。

你能分享一些技巧和最佳实践吗?例如,你使用了哪些技能(Skills)?

我创建了自己的技能(skills),以便 Copilot 生成的任何文本看起来都像我自己手写的。

这些技能从我的 65 篇已发表文章中捕捉了我的风格,因此草稿返回时听起来像我的博客,而不是语言模型的风格。这在为此项目生成文档时非常有用,因为它让 LLM 从 12 年的博客写作中学习,并提供遵循相同原则的示例,如表达力、可测试性和简洁性。

在我作为软件工程师的职业生涯中,我学到我们花在代码维护上的时间远多于创建代码的时间。因此,由于维护和稳定性对于现有产品至关重要,我开发了帮助 AI 模仿现有代码实践的技能,以符合最小惊讶原则(principle of least astonishment)。

一个技巧是根据操作类型更改模型类型。对于需要深入思考的任务,我使用具有 100 万上下文窗口的 Opus 模型,并选择 Extra High 或 Max 推理模式。然而,对于更简单的任务,如生成报告、发行说明或验证文档,我使用消耗更少 token 的轻量级模型。

Patrick Baumgartner

GitHub 个人资料:@patbaumgartner

你的工作涉及团队辅导。你的方法是什么?

我的许多工作都是在正常业务仍需继续运行的同时进行的。你不能停止所有事情六个月来“转型”。我们通常从共同解决眼前的问题开始,了解团队目前的状况,定义我们要去哪里以及如何知道我们在进步,然后一步步地到达那里。

根据情况的不同,这可能意味着采用软件工艺实践,如 TDD、重构、持续交付和 XP;使用 Spring Boot、Spring Modulith 进行架构和模块化;Spring Security;优化 Java 和 Spring Boot 应用程序以适应容器;或者越来越多地,采用智能体工程(agentic engineering)。

对我来说重要的是,我与团队一起工作。我们共同做出决定。我不希望团队对我产生依赖。理想情况下,经过一段时间后,他们不再需要我,也许只是作为一个陪练伙伴。

这也可能解释了为什么我觉得这一代新的 AI 工具如此有趣:我喜欢与人合作、学习、实验和解决问题。AI 为我们提供了另一个非常强大的工具来做 exactly 那件事。

你能分享一个关于 GitHub Copilot 最近如何帮助你的好故事吗?

实际上有三个截然不同的例子改变了我对与 GitHub Copilot 工作方式的想法。

让我们从第一个开始。

其中一个是将大约 900 张教学幻灯片从 Reveal.js 迁移到 Marp,分布在 15 个演示文稿中。这些不是简单的幻灯片。许多包含代码、动画,甚至交互式示例,我在教学时可以实时更改 JavaScript。更重要的是,这些演示文稿已经经过学生的实战考验。流程是有效的。丢失一小部分可能会破坏我在课堂上使用的故事线。

手动完成这种迁移可能需要我一周或更长时间——而且 realistically(现实地说),我可能根本就会避免做这件事,因为它是如此繁琐的工作。

有了 Copilot,我以不同的方式处理它。我们首先分析了现有材料,定义了目标,创建了迁移计划,建立了约束,提供了示例,并定义了必须保持不变的部分。然后我们从大的结构变化开始,逐步深入到细节。

真正重要的部分是验证。

我们生成了 Reveal.js 和 Marp 版本的截图,并从视觉和算法上进行了比较。我们构建了一个小型应用程序,我可以并排运行两个幻灯片集以手动验证动画。我们甚至比较了生成的 PDF 文件。

这意味着代理不仅仅说“迁移完成”。我们有证据。

整个迁移过程大约花了我八到十个小时。我仍然拥有内容、教学意图和每一个有意义的变更。Copilot 可以自动修复拼写错误,但如果内容、版本、日期或含义发生变化,那是我们需要讨论的事情。

对我来说,这次经历强化了一个重要原则:委派执行,而非责任。 我对结果负责。

你能分享第二个例子吗?

第二个例子来自与 Tamboui 一起构建终端 UI 应用程序。它在 WSL 下的 Linux 上最初运行完美,我完全忘记了有人可能会直接在 Windows CMD 或 PowerShell 中运行它。

然后,一位真实用户确实这样做了。

他们发现 Enter 键在某些表单中被简单地忽略了。这是另一个我非常坚信的原则:尽早发布软件,因为你可以从人们实际如何使用它中学到东西。

我们使用 Copilot 将这些反馈转化为可重现的 UI 测试。在 Linux 上,Copilot 使用 tmux 导航应用程序。通过与它的合作,我了解了 psmux,并可以在 PowerShell 中执行类似的流程。我们重现了问题,创建了本地修复,追踪了 Tamboui 中的真正问题,并提交了对上游的修复,该修复已被合并。

在这项工作中,测试描述本身变得太大,超出了可用的上下文限制。所以我请 Copilot 帮我重新设计测试表示的方式。它没有提议包含标识符、名称和重复描述的冗长表格,而是提出了一种更紧凑的箭头符号:步骤 → 步骤 → 输入,仅在关键处附加额外信息。

这让我感到惊讶。我们不仅仅是使用 AI 来执行信息;我们是在共同工作,探讨信息应该如何表示才能用于执行。它不必对人类最友好。它必须在保持语义的同时对代理高效。

第三个例子呢?

第三个例子又完全不同。

我身边的人需要练习数学,我想:为什么我们不构建一个小型学习应用程序呢?

它涵盖了一到四年级的加法、减法、乘法、除法和带余数的除法。但我不想再构建一个简单的测验应用程序。与 Copilot 一起,我研究了间隔重复、即时反馈、自适应难度、动机、合作学习和无黑暗模式的游戏化等学习方法。

有趣的是,在那项研究期间,Copilot 挑战了我的一个原始假设。我最初希望该应用程序对所有地方的儿童都是通用的。研究引导我们转向查看实际的学校课程。我意识到,主题引入的顺序、运算和数字范围差异足够大,使得立即使其“通用”是不必要的。

所以我们首先专注于瑞士,并相应地对齐了进度。由于瑞士是多语言的,该应用程序提供德语、法语、意大利语和英语版本。

它还具有合作和竞争的两人模式,当某人答错时,应用程序会解释一种解决方法,并通过间隔重复带回类似的问题。

我故意选择了一种没有后端的架构。我没有理由在服务器上收集儿童的个人信息,所以数据保留在设备上,应用程序可以直接托管在 GitHub Pages 上。

这原本是一个小实验,现在正在朋友之间使用和分享。它意外地变成了一个小小的产品。

这次经历向我展示了 Copilot 的另一面:不要只用它来实现你的解决方案。把它当作陪练伙伴,在开始构建之前扩展和挑战解决方案空间。

你通常如何使用 Copilot?

我实际上不再使用经典的 Copilot 自动补全体验了。

我的工作几乎完全转向了智能体工作流(agentic workflows)。

当我需要一个紧密的视觉反馈循环时——当我想要仔细查看文档、代码、演示文稿或中间结果并随着进程调整时——我会使用 VS Code。

对于较大的执行导向型任务,我经常使用终端中的编码代理(coding agent)。在那里,我更习惯于委派一部分工作,让它执行,然后检查完整的结果。我选择的接口主要取决于我需要的反馈循环。

在前往 JavaLand 的旅途中,我还有一次通过 GitHub 使用编码代理工作流的迷人经历。我开始探索一个 Maven 插件的想法,用于优化加载哪些 Spring Boot 自动配置。在大约四小时的旅程中,我从手机上指导代理:给它一个任务,回顾它做了什么,思考下一步,并发送下一个指令。

当我到达时,我已经有了一个工作的 Maven 插件、一个 CI 管道、针对示例应用程序的性能测试,以及能够证明优化是否有效的报告。

这是我第一次工作

查看原文

Three Java Champions share how they use GitHub Copilot to solve problems, accelerate development, and keep humans responsible for the results.

October 20, 2026

|

17 minutes

  • Share:

AI coding tools can generate code quickly, but speed alone does not solve the hardest software engineering problems. Developers still need to provide context, validate results, protect maintainability, and remain accountable for what ships.

To learn how experienced developers strike that balance, we spoke with three Java Champions, all with over a decade of experience in using Java. They shared concrete examples of using GitHub Copilot in production and open source, along with the practices they use to turn AI-generated output into reliable software.

Here are the tips they shared with us.

Vlad Mihalcea

GitHub profile: @vladmihalcea

How has GitHub Copilot helped you recently?

I’ve been using it to analyze, design, and implement various features in both Hypersistence Utils and Hypersistence Optimizer.

For example, I’ve been wanting for a long time to develop a web application that provides Optimizer event history so we can see how performance improvement efforts are materializing in application performance. Before AI, I kept postponing this task because it would have taken me weeks to develop. But using Copilot is like having a new team member, so I used it to create an app that will ship in the next version of Hypersistence Optimizer. Instead of weeks, this task took just two days to implement.

What’s your typical usage? Are you using GitHub Copilot as an IDE plugin or the GitHub Copilot app?

I use GitHub Copilot in IntelliJ IDEA because it’s convenient to run while reviewing source code or during a debug session.

It’s very useful as a code assistant, and it helps me speed up both investigations and building prototypes for features that need validation.

I still review the plans and the code that is generated by AI since their goal is to improve my productivity, not replace me entirely. While AI provides the right answer in many situations, there are still times when the response is not satisfactory and requires my intervention.

Can you share some tips and best practices? For example, which skills are you using?

I created my own skills so that whatever text Copilot generates looks like something I wrote by hand.

This skill captures my voice from 65 of my published articles, so a draft comes back sounding like my blog instead of like a language model. This is really useful when generating documentation for this project, since it lets the LLM learn from 12 years of blogging and provide examples that follow the same principles, such as expressiveness, testability, and simplicity.

Throughout my career as a software engineer, I’ve learned that we spend far more time on code maintenance than on creating it. Therefore, because maintenance and stability are critical for existing products, I developed skills that help AI mimic existing code practices in accordance with the principle of least astonishment.

One tip is to change the model type based on the type of operation. For thorough thinking, I use Opus with the 1 million context window and Extra High or Max reasoning. However, for simpler tasks, such as generating reports, release notes, or verifying documentation, I use lighter models that consume fewer tokens.

Patrick Baumgartner

GitHub profile: @patbaumgartner

Your work involves coaching teams. What is your approach?

A lot of my work happens while the normal business still has to keep running. You cannot stop everything for six months to “transform.” We usually start by solving immediate problems together, understand where the team currently stands, define where we want to go and how we will know that we are improving, and then move there step by step.

Depending on the situation, that can mean Software Craft practices such as TDD, refactoring, continuous delivery and XP; architecture and modularisation with Spring Boot, Spring Modulith; Spring Security; optimising Java and Spring Boot applications for containers; or increasingly, agentic engineering.

The important part for me is that I work with the team. We make decisions together. I don’t want a team to become dependent on me. Ideally, after some time they no longer need me except perhaps as a sparring partner.

And maybe that explains why I find this new generation of AI tools so interesting: I like working with people, learning, experimenting, and solving problems. AI gives us another very powerful tool for doing exactly that.

Can you share a good story about how GitHub Copilot has helped you recently?

There are actually three very different examples that changed how I think about working with GitHub Copilot.

Let’s start with the first one.

One was a migration of around 900 teaching slides across 15 presentations from Reveal.js to Marp. These were not simple slides. Many contain code, animations, and even interactive examples where I can change JavaScript live while teaching. More importantly, the presentations had already been battle-tested with students. The flow worked. Losing one small piece could break the story I use in the classroom.

Doing that migration manually would probably have taken me a week or more—and realistically, I might simply have avoided doing it because it was such tedious work.

With Copilot, I approached it differently. We first analysed the existing material, defined the target, created a migration plan, established constraints, provided examples, and defined what had to remain intact. Then we worked from the big structural changes down into the details.

The really important part was verification.

We generated screenshots of the Reveal.js and Marp versions and compared them visually and algorithmically. We built a small application where I could run both slide decks next to each other to verify animations manually. We even compared the generated PDFs.

That meant the agent did not just say, “Migration complete.” We had evidence.

The entire migration took me roughly eight to ten hours. I still owned the content, the teaching intent, and every meaningful change. Copilot could fix a typo automatically, but if content, versions, dates or meaning changed, that was something we discussed.

For me, that experience reinforced an important principle: delegate execution, not responsibility. I own the result.

Can you share the second example?

A second example came from building a terminal UI application with Tamboui. It initially worked perfectly in Linux under WSL, and I had completely forgotten that somebody might run it directly in Windows CMD or PowerShell.

And then a real user did.

They discovered that the Enter key was simply ignored in some forms. That is another principle I strongly believe in: ship software early, because you learn from how people actually use it.

We used Copilot to turn that feedback into reproducible UI tests. On Linux, Copilot was navigating the application with tmux. Through working with it, I learned about psmux and could execute similar flows in PowerShell. We reproduced the problem, created a local fix, traced the real problem into Tamboui, and I submitted the upstream fix, which was merged.

During this work, the test descriptions themselves became too large for the available context. So I asked Copilot to help me redesign the way the tests were represented. Instead of verbose tables containing identifiers, names and repeated descriptions, it proposed a much more compact arrow notation: step → step → input, with additional information only where it was critical.

That surprised me. We were not just using AI to execute information; we were working together on how information should be represented for execution. It did not have to be maximally human-friendly. It had to preserve the semantics while being efficient for the agent.

How about the third example?

The third example is completely different again.

Someone close to me needed to practise mathematics, and I thought: why don’t we build a small learning app?

It covers addition, subtraction, multiplication, division and division with remainder for grades one through four. But I did not want to build another simple quiz application. Together with Copilot, I researched learning approaches such as spaced repetition, immediate feedback, adaptive difficulty, motivation, cooperative learning and gamification without dark patterns.

Interestingly, during that research Copilot challenged one of my original assumptions. I initially wanted the application to be generic for children everywhere. The research led us toward looking at the actual school curriculum instead. I realised that the order in which topics are introduced, the operations and number ranges differ enough that making it “universal” immediately was unnecessary.

So we focused on Switzerland first and aligned the progression accordingly. Because Switzerland is multilingual, the application is available in German, French, Italian and English.

It also has cooperative and competitive two-player modes, and when someone gets an answer wrong, the application explains one way to solve it and brings similar questions back through spaced repetition.

I deliberately chose an architecture without a backend. There is no reason for me to collect children’s personal data on a server, so the data stays on the device and the application can simply be hosted on GitHub Pages.

What started as a small experiment is now being used and shared among friends. It accidentally became a little product.

That experience showed me another side of Copilot: don’t only use it to implement your solution. Use it as a sparring partner to expand and challenge the solution space before you start building.

How do you typically use Copilot?

I actually don’t use the classic Copilot autocomplete experience anymore.

My work has moved almost completely toward agentic workflows.

I use VS Code when I need a tight visual feedback loop—when I want to look closely at documents, code, presentations or intermediate results and adapt the process as I go.

For larger execution-oriented tasks, I often work with the coding agent from the terminal. There I am more comfortable delegating a piece of work, letting it execute, and then inspecting the complete result. The interface I choose depends mostly on the feedback loop I need.

I also had a fascinating experience using the coding-agent workflow through GitHub while travelling to JavaLand. I had started exploring an idea for a Maven plugin that optimises which Spring Boot auto-configurations are loaded. During roughly a four-hour journey, I was steering the agent from my phone: giving it a task, reviewing what it had done, thinking about the next step, and sending the next instruction.

By the time I arrived, I had a working Maven plugin, a CI pipeline, performance tests against a sample application, and reports that could demonstrate whether the optimisation actually worked.

That was the first time I had worked that way, and I was amazed that it actually worked. I wasn’t trying to write Java on my phone. I was reviewing, deciding and steering while the agent executed.

I also use MCP servers when they give me useful capabilities or context. For example, I have used Context7 for documentation, integrations with my Logseq knowledge base, and I have experimented with an MCP integration for Adobe Premiere Pro.

But I don’t use MCP just because I can. If a good CLI exists, I often prefer the CLI because it feels more direct and faster to me.

The agent is also not a “junior developer” in my mental model. I think of it much more as a sparring partner. But just like anyone joining a project, it first needs to be brought up to speed.

Context is king.

Can you share some tips and best practices?

The biggest thing I would recommend is: stop one-shot prompting.

For anything non-trivial, I want to understand the problem before execution starts. Quite often I explicitly ask the agent to interview me first. The purpose of that interview is to uncover assumptions and expectations that are still implicit.

A good agent can execute the wrong idea incredibly quickly. That does not make the detour cheaper.

I experienced this myself while working on my Spring Boot auto-configuration optimiser. Initially I wanted to support both Spring Boot 3.5 and 4.x. There were architectural differences, so we implemented both approaches. Later I realised I no longer needed the 3.5 path and removing it was painful.

The lesson was simple: detours are expensive. Get the requirements right before you accelerate.

Once the intent is clear, I want a plan. When I review that plan, four things matter especially to me: are assumptions visible, are verification gates defined, does the approach fit the architecture, and does it avoid unnecessary work?

The second principle is to define task-specific verification gates.

“Done” should not mean that the model says it is done.

For a refactoring, the gates might include passing tests, proving that all intended files were handled, updating documentation and leaving no TODOs behind. For the slide migration, the gates included screenshots, visual diffs, animations, PDF output and content completeness.

The gates depend on the task. The principle does not: the agent should be able to provide evidence that the work satisfies the definition of done.

I recently came across a skill called unlazy that follows a similar idea: create explicit gates, work through them deliberately, and prove that they have been completed rather than taking shortcuts.

The third principle is to turn your lessons into reusable skills.

I have started writing and maintaining my own Agent Skills. When I learn something from an execution—perhaps the agent misunderstood a convention, a useful check was missing, or I found a better way to approach a task—I update the skill.

The next time I perform that task, the lesson is already there.

One example is a skill I call maintainer-audit, inspired by work in the open agent skills community. I use it across my own repositories. It checks and, where appropriate, fixes the things I expect a maintained project to have: repository documentation, CI pipelines, Dependabot configuration, CodeQL, consistent cleanup and other project standards.

The goal is not to generate another audit report for me to read. It brings the repository back toward the baseline I want automatically. That makes my projects more consistent and easier to maintain.

I think of these skills as living engineering knowledge rather than static prompts.

The fourth principle is to put deterministic engineering tools around the probabilistic model.

I have my own quality harness that wraps tools such as Checkstyle, PMD and Spring Modulith architecture checks and produces a consolidated report that the agent can consume. I can run that from hooks and let the agent iterate:

change → execute checks → read findings → fix → execute again.

It continues until there are no findings left.

That does not mean I stop looking at the software. I still run the application, interact with it and decide whether it behaves and looks the way I expect. Sometimes I deliberately implement feature by feature because the feedback loop is much tighter.

I learned that asking for everything at once because “the AI can do it” is usually a bad idea. Large, generic specifications create large, generic implementations—and cleaning them up afterwards can be harder than building smaller increments correctly.

More broadly, I think we developers need to talk much more about how we use these tools. Share the experiments that worked. Share the ones that didn’t. Borrow ideas from each other and adapt them to your own context instead of looking for one universal AI development process.

That is also why I like the idea of AI as a sparring partner. On a Friday night, when I want to experiment with something and no human pair is available, I suddenly have somebody—or something—I can challenge an idea with, review an approach with, or use as a very sophisticated rubber duck.

But I still take those ideas back to real people. Human feedback, product understanding and real-world context remain essential.

How do you think AI is changing our profession?

I don’t think software engineering students should primarily aspire to become code-producing machines. They need to become strong problem solvers. They need to understand users and stakeholders, discover the real problem behind a requirement, challenge assumptions, understand products and markets, make architectural trade-offs, think critically, work in a structured way and transfer useful solutions from one context into another.

The model is extraordinarily good at generating possibilities and executing things. But as a human, I usually know much more of the actual context—including the things nobody ever documented.

So I want to remain in charge of shaping the solution and let the agent take over more of the execution.

In that sense, I think AI is putting the engineering back into software engineering.

And I like that.

Frank Delporte

GitHub profile: @FDelporte

How did you get started in tech?

I’ve been fascinated by computers since I got a Commodore 64 when I was 11. Took some side steps into video production and television work after school but turned back into coding as that video needed to be put on DVD and the very first websites… Yes, I’m that old ;-).

How has GitHub Copilot helped you recently?

It’s a perfect companion to evaluate pull requests and investigate bug reports.

One remarkable story is about the Pi4J library that lets you build Java applications to interact with electronic components on the Raspberry Pi. In February 2026, we released V4 which has a new plugin using the Foreign Function & Memory API. We tested it thoroughly before releasing, but still, shortly after the release someone reported that using 5 input buttons doesn’t work as expected. Pushing one of the first four configured buttons triggers a code execution as expected, while nothing happens with the fifth button.

This is the kind of report you don’t want to get. Nothing was visibly broken. No exception, no warning in the logs, the fifth button was simply silent. And it got worse: with the older gpiod plugin, the exact same hardware and the exact same application, worked fine. So the problem was in our new FFM code, which sits on top of the Linux kernel’s GPIO character device and talks to it through native calls. That is not the part of the codebase where you expect to find a quick answer.

So I assigned the issue to the Copilot coding agent and gave it two file paths as a starting point, the provider class and FFMDigitalInput. About half an hour later there was a pull request, with an explanation I really did not expect.

Each input runs an event watcher that blocks in a native poll() call, waiting for the kernel to report a change on its GPIO line. Those watchers ran in virtual threads. And a virtual thread that blocks inside a native call cannot be unmounted from its carrier thread. It stays pinned there for the whole duration of the call. A Raspberry Pi 4 has four cores, so the virtual thread scheduler has four carrier threads. Register four inputs, and all four carriers are parked in poll() forever. The fifth watcher is created, but is never scheduled. That is exactly the bug that was reported. Not “events are flaky”, but “the fifth one does nothing.”

What I liked most was not the diff, it was the conversation that followed in the review. I left a comment asking Copilot to explain this in more detail:

I thought the goal of virtual threads was exactly to step away from the platform thread limit? So how is this a problem that four virtual threads block the four threads on a four-core processor like the Raspberry Pi?

Check the pull request for the full conversation. Copilot was able to link the use of the Raspberry Pi which has four CPU cores with the reported problem. It was able to propose a simple fix for the problem, plus some extra improvements it found during its investigation.

Can you share some tips and best practices?

  • Tell it where to look: For the Pi4J issue #622, I added two file paths. That is a tiny bit of effort that removes a huge amount of searching in a large codebase. You usually have a hunch about the neighbourhood even when you have no idea about the bug. Give it to the tool so it doesn’t need to investigate the complete code.
  • Ask for proof and tests: “Add a unit test to validate the change” is something I ask a lot these days. Well, asked, because it has now become a rule in my instructions file. It also prevents cases where the diagnosis was wrong, because the test won’t fail on the old code.
  • Ask why: If you don’t understand a fix, say so and ask. The explanation is a deliverable too and should be added into your project documentation or inside the ticket or pull request. It teaches everyone who reads the info later. For example, this also triggered more questions within the Pi4J team about virtual thread pinning on native calls.
  • Stay in control: All of these pull requests in Pi4J were reviewed and approved by maintainers before they went in. That’s the model that works best in this project: the agent does the investigation, the humans stay responsible for what ships. But also for my other projects I always do a review of the code that was generated by the tool. I always want to keep code readable and maintainable. Too often, a tool creates duplicate methods or recreates something which is already available in another place and should be combined. That’s your responsibility. You can go very fast these days with AI-assisted coding, which also means you can very fast create a mess. Don’t do that, keep your code manageable, your colleagues and future-self will thank you if they have to investigate bugs or make improvements later.

Written by

Julien Dubois

Principal Cloud Advocate

Related posts

We do newsletters, too

Discover tips, technical guides, and best practices in our biweekly newsletter just for devs.

Your email address

原文版权归 GitHub Blog · AI & ML 及原作者所有,本站转载仅供阅读。如需删除,请联系 support@aisa.one。