文章摘要
这是对Java社区领军人物VenkatSubramaniam的深度访谈。他倡导“AI第二”工作法,认为应先思考再借助AI工具。他指出AI有能力边界,虽在某些特定任务出色,但使用者需有专业技能。开发者要打牢基本功、培养批判性思维。Java在演进中展现敏捷,虚拟线程将重构成本降至最低,他还期待值类型泛型特性到来。

当全行业都在狂热追捧"AI优先"的口号时,有一位软件工程领域的资深专家始终坚持一个完全相反的理念:先给自己留出15分钟的纯粹思考时间,再借助AI工具解决问题,这就是他倡导的"AI第二"工作法。

作为拥有40年编程经验的技术老兵,Venkat Subramaniam是全球软件工程界的标志性人物:他是Java社区的领军人物,三次斩获JavaOne RockStar奖项,拿下过软件行业最高荣誉Jolt大奖,出版过十余本技术畅销书。他从不使用PPT,总能在空白屏幕上实时手写代码完成演讲,在全球技术圈拥有极高的号召力。

这场深度访谈源自JetBrains资深开发者布道师Marco Behler主持的技术播客《The Marco Show》。在慕尼黑的录音棚中,两位技术专家深入剖析了AI的真实能力边界,解答了为什么AI在生产实践中表现平平,却在代码审查方面格外出色,以及为何说"起重机越强大,操作失误造成的破坏就越难以估量"。

核心观点速览

  • 外行与专家的反差:当让AI处理我完全陌生的领域时,它的表现令人惊叹;但当用它完成我精通的工作时,产出的内容往往不堪一击。
  • 技能门槛变迁:手工清淤是低技能劳动,但操作重型起重机的人员一旦失误就会造成严重后果。AI时代,我们需要的专业技能不是变少了,而是更多了。
  • "威胁驱动开发"与Token狂热:用失业焦虑逼迫大家使用AI,这不是测试驱动开发,而是威胁驱动开发。至于疯狂比拼Token消耗量的行为,终究会回归理性,毕竟愚蠢的行为无法持续。
  • 应试与探索:我童年几乎没有及格的功课,直到多年后才明白,我痛恨的是被动应试,而真正热爱的是主动探索。应试会束缚心智,真正的探索才能解放思想。
  • 虚拟线程的工程美学:Java没有跟风强制所有函数使用async/await,而是将重构成本降至最低。Java的创新从不追求炫技语法,而是以优雅的方式将架构决策权留给最终负责任的时刻。

AI编程如同操作重型起重机

我们正处在技术变革的关键节点,AI工具的效率提升有目共睹,但我们也需要清醒认识它的真实能力边界。在此之前,开发者接触的大多数技术工具都具备确定性,而AI的非确定性特点让它的产出质量和可靠性充满变数。

当前行业的一大挑战是:对AI最狂热的人往往最不了解软件工程的底层逻辑。这场演讲的初衷就是既要展示AI的强大能力,也要揭示盲目使用背后的风险。

AI在某些特定任务上表现出色,最让我着迷的是它发现问题、排查Bug和进行风险分析的能力。打个比方,我自己写代码的能力不算顶尖,但特别擅长审视和挑剔代码,AI也是如此——它自身写代码的能力不算顶尖,但在找漏洞方面格外出色。

我们需要明确AI能做什么、不能做什么,这样才能更好地利用它,消除不必要的恐慌。

当让AI处理我完全陌生的领域时,它的表现令人惊叹;但当用它完成我精通的工作时,产出的内容往往不堪一击。这是一个非常真实的反差。

如果一个对软件构建毫无经验的人,认为只要有AI就能直接生成代码,这其实非常危险。但如果使用者是架构师或资深开发人员,情况就完全不同。AI可以帮我们剥离软件开发中最枯燥的体力劳动。

我享受的是解决问题、设计思维、批判性审视和架构演进的过程,而最不喜欢的就是纯体力的敲代码工作。

举个真实案例:上周有人向我提出一个功能构想,我第一直觉认为这个方案行不通。过去要证明我的判断需要花费大量时间开发原型,但现在有了AI,我几分钟就能快速生成原型展示给对方,让他们直观看到方案的问题所在,从而快速达成共识放弃这个糟糕的想法。

关键不在于AI本身的能力有多大,而在于使用AI的人具备怎样的能力。如果使用者拥有将系统推向生产环境并长期维护的实战经验,他就能更好地驾驭AI。当下,验证和评估方案的能力,远比单纯写出代码的能力重要得多。

开发者该如何成长为专家?

现在的学生越来越多地用AI完成作业和项目,这带来了一个隐患:大家开始用AI走捷径,跳过了我们当年那种在排查分号错误、踩坑排错中痛苦摸索的成长历程。

这个问题的本质和学习规律其实几十年前就存在。在没有IDE的年代,我们必须用Vi或Emacs纯手工编辑代码,后来现代IDE大幅提升了生产力。但我经常告诫年轻开发者:不要过度依赖IDE,要抽出时间尝试在命令行下编译和运行程序,这样才能真正理解底层各部件的组装运转方式。

今天面对AI,情况如出一辙。使用AI很好,但千万不要忘记打牢基本功,必须钻研底层原理。

我曾在一家大型保险公司讲课,一位开发了几年Java的工程师竟然不知道如何排查Classpath问题。但同时我也见过很多熟练使用IDE,同时能徒手拆解排查底层机制的优秀开发者。

因此,今天比以往任何时候都更重要的能力是批判性思维。工具的便利决不能让我们产生"不再需要深度思考"的错觉。

如果年轻开发者愿意花时间理解底层原理,我们就完全不用担心未来;但如果他们一味走捷径,只关心输出结果而不关心过程,这部分人必将陷入困境。

平衡交付节奏与深度思考

整个软件行业普遍面临巨大的交付压力,往往只看重结果产出,没有足够时间深挖底层运行机制,这种现实逼着许多人不得不走捷径。

这种压力确实存在,这恰恰体现了团队的成熟度。我很幸运,职业生涯中遇到的大多数上级都极具大局观,他们明白"欲速则不达",懂得什么是可持续的交付节奏。

走向任何一个极端都很糟糕:要么陷入分析瘫痪,整天钻研细节却从不交付结果;要么永远盲目冲刺,不顾代码质量和长期维护,只求尽快交差。这两种极端都不可取。

我非常喜欢时间盒的概念:既不要草率赶工,也不要无限期拖延。我常问自己:"我愿意为这个具体任务分配多少时间?"时间一到,就必须拿出实质性进展。

这也是我教学时对学生的要求:不要在第一秒就直接给出答案,也不要让你无休止卡在那里。我希望你们学会设定时间盒:给自己一个小时,穷尽一切办法探索解决方案,一个小时后告诉我你们尝试了什么。如果依然卡住,我再来告诉你解决之道。

这样才能真正建立内在的思维力量。如果一味索取即时答案,我们自身的思考能力就会日渐退化,最终彻底丧失评估方案优劣和验证结果真伪的能力。

我曾在开车时接到一个业务报价电话,仅凭直觉就发现数字对不上。这种敏锐直觉来自常年保持的清醒思考。如果我们放弃思考,奉行"垃圾进、垃圾出",那些保持清醒的人就会迅速超越我们。

AI第二:先思考再求助工具

我注意到一个现象:现在有些人不再和同事头脑风暴,而是把AI当作主要交流对象,把所有想法第一时间抛给AI碰撞。我认为这是非常糟糕的做法。

这也是我倡导"AI第二"口号的原因。如果一个人一拿到问题就立刻扔给AI,他会丧失两个至关重要的东西:第一,他没有让问题在自己的大脑里真正沉淀与发酵。

举个例子,出版社请我审阅技术书稿,我坚持要单独审阅,不看其他审稿人的评论,因为我需要的是独立思考的结果。我需要先通读内容,甚至离开屏幕,静静思考几分钟。

我的做法是先给自己15分钟,纯粹靠自己的大脑深入剖析问题,想清楚之后再和同事交流,带着自己的见解倾听他们的看法,之后才会引入AI补充视角。遵循这样的顺序,收获的思想成果会比一开始就直接丢给AI丰富得多。

几天前我主持了一场工作坊,我们挑选了一个业务难题,先让开发者独立分析,再把同样的问题输入AI,结果发现两者有部分重叠,但人类开发者识别出了AI完全遗漏的关键业务点,同时AI也指出了开发者未曾考虑到的盲区。将两者结合,得到的解决方案比单独依靠任何一方都更全面深刻。

软件工程的目标绝不仅仅是"让程序跑起来",而是要构建可靠、易维护、高质量、符合用户体验预期且能创造实际业务价值的系统。既然AI降低了某些环节的机械成本,我们应该把节省下来的时间投入到架构质量和工程细节上,而不是用AI压缩工程标准。

我不在乎程序员写得多快,我只在乎业务敏捷

网上那些鼓励员工疯狂"刷Token"、按Token消耗量排行榜的公司,很快就会撞墙回归理性。愚蠢的行为无法持续,这是必然的结果。

技术的发展从来不是线性的,人类总是在试错中前进。只要能吸取教训,犯点傻并不可怕,有时看似愚蠢的尝试反而会碰撞出绝妙成果。但关键是要能在某个节点标记死路,果断转向合乎逻辑的正轨。

我想起在印度和美国休斯敦看到的清淤场景对比:印度有50个人在水里手递手传递淤泥,而休斯敦只有两个人操作重型起重机。前者是低技能劳动,后者需要极高的专业技能,一旦按错按钮就会造成严重破坏。

这说明AI时代,我们需要的专业技能不是变少了,而是更多了。开发者的角色不会因为AI的出现而消亡,相反,优秀开发者的专业技能会被打磨得更加锋利。我们或许不再需要庞大的劳动密集型初级编码队伍,这其实是好事。

我个人完全不在乎所谓的"程序员纯编码生产力",真正关心的是业务敏捷性。我的目标是交付更出色的业务成果,而不是单纯让程序员敲代码更快。

企业该如何落地AI应用?

如果我是一家大型保险公司的CTO,管着十几个研发团队,我的第一步行动是找出组织内部那些正在以理智、有效的方式运用这些工具的优秀工程师。

切记不要盲目设定量化指标,正如古德哈特定律所言:当一个指标变成目标时,它就不再是一个好指标。

多年前我在波士顿拜访一家公司,他们的奖金和修复的Bug数量挂钩,结果团队在这个版本埋下Bug,下个版本修好拿奖金,这就是指标扭曲的恶果。

不要设立"必须花掉多少AI额度"、"Prompt提交量必须达标"之类的考核指标。首要任务是在组织内部寻找真正的"技术灯塔",看哪些开发者正在脚踏实地利用AI创造实际价值,他们交付了怎样的成果。

找到这些人之后,要打破组织内部的信息孤岛。很多企业里,同一栋大楼的这一端有人在用惊艳的方式提升交付质量,而几米之外的另一组人却一无所知,依然在忍受低效折磨。

CTO应该搭建跨团队交流机制,让先行者分享经过验证的实践经验,带动整个组织学会正确高效使用工具。

如果管理层直接下达死命令:"这是你们的AI额度,必须花完,不用的人就卷铺盖走人",这本质上就是威胁驱动开发。在这种环境下,大多数普通开发者只能选择沉默和应付。

优秀的管理者会主动走到骨干员工面前说:"我最近有了引入AI的想法,你来帮我把把关,告诉我为什么我们不应该推进它?"

真正的顿悟都在远离键盘时

关于个人技术进阶,我认为学习的核心是探寻自己的未知盲区。最大的挑战往往在于"我甚至不知道自己不知道什么",如果你连盲区的存在都不清楚,又何谈有效利用工具?

知识的价值在于应用,无法落地的知识毫无意义。我至今依然热衷于参加各地线下用户组、技术大会,和一线工程师交流,因为别人的一句话往往会瞬间激发我的灵感,让我意识到知识图谱中的盲区,或带来全新思考维度。

我后裤兜里永远揣着折叠便签纸,上衣口袋永远别着笔。午餐时和同行的闲聊都可能带来灵感,我会立刻记录下来:"这个技术点值得深入阅读"、"那个工具的设计思路很有意思,我得琢磨一下"。

当我向AI提问时,思维是结构化和收敛的,因为我带着预设问题检索答案;但在用户组、技术社交、偶遇交谈中,各种意外的思想火花会以非线性方式涌现,指引我读一本从未听过的好书,探索一个全新领域。

我写的第一批技术书之一,灵感就来源于一次技术峰会。听另一位讲师分享时,他随口的一句话引发了我的连锁思考,我立刻记下核心提纲,几个月后那本书就正式出版了。

我大多数技术演讲的构思都是在远离键盘、离开办公桌的时候。上周清晨5:30慢跑时,我突然想到一个绝妙的演讲叙事架构,立刻放慢脚步记录下来,生怕它转瞬即逝。

在徒步、慢跑、和朋友畅谈时,我收获了源源不断的灵感。因此,AI固然出色,但对我而言,真正的学习不是工具驱动的,而是对话驱动、批判性思维驱动的。

"我讨厌应试做题,但我热爱求知探索"

从漫步、徒步中捕捉思想火花,到从博物馆展品中汲取灵感,驱动我的是对未知事物天生的兴奋感。

我小时候在学校经历过极其灰暗的时光,曾是不折不扣的全科挂科生。多年后我才明白,我痛恨的是应试做题,而极度热爱求知探索。应试会束缚你、禁锢你,而真正的求知学习却能解放你的心智。

我的童年充斥着被逼应试的压抑,我对此深恶痛绝;但当我走过那个阶段,进入探索式自主学习后,求知成了无与伦比的享受。

是什么让我永葆热情?正是探索未知时的敬畏与欣喜。当我意识到自己对某个知识点一无所知时,内心会感到极其谦卑,同时又陷入由衷的兴奋。

举个例子,当我第一次看到Kotlin中带接收者的函数字面值特性时,我整个人都惊呆了:"这怎么可能?在严格的静态类型编译语言里,他们是怎么做到的?"

我没有直接扔给AI要答案,而是渴望探究背后的底层设计哲学。我突然想到JavaScript中可以轻松绑定函数到任意对象,于是打开Kotlin REPL,用JavaScript的底层思维写了一段特殊语法绑定Lambda,结果竟然真的完美运行了!

那一瞬间,我彻底看清了Kotlin这一现代特性的底层脉络如何从早期脚本语言的动态思想中蜕变演化而来,大脑里仿佛瞬间亮起了一盏璀璨的灯泡。

这种时刻让我痴迷。一旦参透底层来龙去脉,我就有了向他人分享的故事。我能带给社区的,正是自己在探索之路上的心路历程、顿悟时刻与纯粹喜悦。

Java教科书级的敏捷,以及虚拟线程的工程美学

回顾过去十年Java的剧烈演进,我认为Java正处在一个关键的历史位置。坦白说,2009到2010年前后,我是最激进的Java批评者之一,曾公开炮轰Java语法冗长、设计死板,劝大家不要使用。

真正的破局转折点是Java 8。Java 8正式发布三四年前,我刚出差回来,心里还嘀咕"Java加Lambda有什么大不了的,其他语言早就有了"。但回家下载预览版试玩后,我猛地站起来惊呼:"Java从此彻底不同了!"

当我看到Stream API的惰性求值,看到底层对Lambda表达式的优雅实现机制通过invokedynamic指令而非简陋的语法糖,我意识到Java正在驶向一个完全不同的全新维度。

今天掌舵Java演进的核心团队早已不是当年设计Java 1.0的元老,新一代架构师对Java的未来拥有截然不同的现代格局。

Java早期的意识形态是纯面向对象至上论——一切皆对象。正是在这种桎梏下,Java 1.1引入了极其别扭的匿名内部类,为了传递一个行为逻辑,不得不定义只有一个抽象方法的SAM接口,再用冗长丑陋的匿名内部类包装成对象传递,仅仅因为"语言规定参数必须是对象"。

平心而论,当年这么做有历史局限性,但从后世视角看,这种设计让Java在函数式编程道路上白白耽误了十几年。如果Java 1.1当年直接推出原生Lambda表达式,整个软件工程历史的走向都会彻底重写。

当Java 8打破旧有教条,正式拥抱Lambda和函数式范式时,我彻底爱上了这门语言。自那之后,我以前所未有的热情在全球布道现代Java。

而Java展现出的最绝妙工程智慧,莫过于将底层研发节奏与版本发布周期彻底解耦。

全世界所有张口闭口大谈敏捷开发的人,都应该看看Java核心团队的操作,这才是教科书级别的真正敏捷。

敏捷从来不是流于形式的两周一个Scrum冲刺或固定月度发版。Java团队将发版周期固定为每6个月一次,但特性的实际研发周期完全脱离6个月的限制。

这赋予了语言架构师们极其从容的研发空间:他们可以花上三五年潜心论证一个特性是否适合Java,不必被发版死线赶鸭子上架,也不会被外界嘈杂的声音裹挟。

他们极其成熟克制,首先聚焦于"Java应该成为一门怎样的语言",花充分时间打磨验证方案可行性,然后以预览特性的形式推向社区。

什么是真正的敏捷?敏捷就是反馈驱动开发。通过6个月一期的预览通道,全球成千上万一线开发者可以在真实项目中试用并向官方反馈,Java架构团队收集所有实战反馈后,再从容决定是继续演进、推倒重构,还是果断废弃。

这种沉稳而高效的演进机制,让我对Java的未来充满信心。

虚拟线程的工程美学

近几年Java有很多优秀特性,但如果只挑一个,我绝对把票投给虚拟线程。

回过头看,JavaScript在20多年前做对了一件事——押注异步非阻塞模型而非高成本多线程并发。25年后的今天,在微服务与高并发系统大行其道的时代,异步架构对吞吐量的提升有目共睹,I/O密集型领域异步化才是王道。

但Java团队引入异步的方式极其惊艳,他们没有盲目跟风其他语言的async/await。作为架构师,我始终追求极简解决方案,极度推崇"延后到最后负责任时刻"的决策原则——在充分掌握系统性能瓶颈之前,不要过早引入复杂架构。

但在JavaScript、C#或Kotlin里,作为架构师,每天都被逼着提前做决定:"这个函数未来需要做成异步的吗?"为什么必须今天就做决定?因为一旦未来改成异步,重构成本将极其高昂,也就是著名的"彩色函数"问题。

Java团队说:我们需要异步的高吞吐,但我们绝不破坏原有函数的调用语法与结构!在虚拟线程下,代码依然按照最自然、最易读的同步阻塞方式编写,底层运行时会在I/O阻塞时自动卸载和挂起虚拟线程,将底层操作系统载体线程释放给其他任务使用。

有人会反驳:"在C#或Kotlin里,我一眼就能看出哪个方法是异步的;而在现代Java里,光看代码签名分不清同步还是异步。"但对我这样的架构师来说,Java将重构成本抹平为零!今天可以安心写出最直观的同步逻辑,明天系统遭遇流量洪峰需要扩容时,只需在最外层把线程池替换为虚拟线程调度器,业务代码一行都不用改,就能以近乎零成本获得海量并发吞吐!

这就是将决策延后到"最后负责任时刻"的极致工程美学。Java的创新从来不是发明别人从未见过的炫技语法,而是以优雅的方式将强大能力融入现有体系之中。

期待值类型泛型的到来

未来3到5年,Java最让我翘首以盼的新特性是支持值类型的泛型,也就是Project Valhalla项目。

多年前我为客户开发过一个涉及海量实时计算的企业级系统,项目中重度使用Java 8 Lambda,但当数据集达到几十亿规模时,系统性能急剧恶化。排查后发现CPU绝大部分时间都耗费在垃圾回收上。

原因在于我们使用了大量List<Double>泛型集合,Java泛型的类型擦除机制,导致系统在计算过程中将每个基础类型double自动装箱成堆内存中的Double对象,制造了天文数字级别的临时短命对象,瞬间挤爆内存并引发频繁GC停顿。

那次调优我们不得不把优雅的泛型代码全部推倒重写,硬编码改回最原始的基础类型原生数组double[],通过彻底消除装箱与拆箱的内存开销,才最终跑赢性能指标。

如果能够让泛型直接持有扁平化、无对象头开销的基础值类型,无需任何装箱惩罚,Java的性能将迎来又一次质的飞跃。我常开玩笑说:"我只希望在退休前,能亲手在Java生产环境里跑一次带有值类型的泛型代码。"

以上内容不代表本平台立场,仅供读者参考