作者 | 王启隆
责编 | 唐小引
出品丨AI 科技大本营(ID:rgznai100)
已过花甲之年的 Cay Horstmann 是 Java 经典著作《Java 核心技术》和《Java 核心技术:速学版》的作者,帮助了无数 Java 开发者启蒙进阶。截止到今天,Cay 在软件领域已经工作了 40 多年,但他本人与 Java 的结缘方式却不比寻常,始于 Java 萌芽时。
1995 年,Cay 的朋友 Gary Cornell 给他打了个电话:“我们要写一本关于 Java 的书。”
那时,Java 还未正式发布。所以 Cay 回答他:“除了媒体上的报道,我对 Java 一无所知。” 他知道 Gary 的情况也一样,“而且,你对 Java 也一无所知。”
Gary 却说:“但我已经拿到了一份出版合同。”
原来,James Gosling(Java 之父)不愿通过 Sun Microsystems Press 这家出版社发行书籍,双方陷入了扯皮。Gary 得知此消息后,便告知出版社的编辑,他恰好知道合适的人选来执笔此书。
于是,Cay 和 Gary 在那个圣诞节期间疯狂地学习 Java,他们有了三个月的时间来完成这部著作。幸运的是,Cay 当时还没从教授岗位下来,能依据研究许可获取到 Java 的源代码 —— 这件事远早于开源时代,当时的 Java 源码仅向研究者开放。正因为他们能接触到原始源码,清楚 Java 的实际功能,才发现最初版本的 Java 并不完全符合官方文档所述,甚至存在许多漏洞。
他们出版了首部真实揭示 JDK 运作机制的书籍:《Java 核心技术》(Core Java),随即大获成功。随着 Java 突飞猛进地发展,两人不断更新内容,一直出到了现在的第 13 版。针对已经有基础的程序员,Cay 还单独开设了《Java 核心技术:速学版》(Core Java for the Impatient)系列,让有其他编程语言经验的开发者可以迅速上手 Java 应用开发,中文版本的《速学版》在 2024 年刚刚出版,更新至 Java 17。
Cay 的职业生涯并不是一直都在写书。他曾在圣何塞州立大学教授计算机科学将近三十年,前段时间他教完了最后一堂课,并决定离开学校,将生活的重心转移到写书上。
其间,又发生了一个与 Java 相关的插曲:出版社为了节省成本,将 Cay 编写的书籍出版工作外包给了海外的一个团队,但对方未能胜任。结果,他不得不自学排版技术,用 Java 和 Scala 编写了一些辅助排版工作的程序来自动化这一过程。他说,自己未来的目标便是将更多的互动元素融入到现在已经完全电子化的书籍中。
正如他在社交媒体上的签名:在我大量的业余时间里,我写书并为初学者和专业程序员开发在线课程。
Cay 对时代的变化适应得很快,但他对 AI 的态度非常冷静。作为一名 30 年的 Java 开发者、一位 2005 年的 “Java Champion”,他甚至觉得 AI 会让自己开发的速度变慢。
他支持并使用这些所谓帮助开发者工作的“效率工具”,比如 Copliot;但他不相信 AGI(通用人工智能),至少不相信现在的人工智能可以发展成 AGI。他也不认为通用人工智能会像人们设想的那样,普及到众多应用场景中,并断言:
AI 热会在几年内逐渐降温。
比如,未来的编译器内不会集成 AI,且任何需要精确计算最优解的任务(这事实上是很常见的需求)也不会采用 AI 技术。
Cay 不认为有人会愿意乘坐由 AI 操控的飞机,因为它不够安全可靠,且这种关乎人命的事情,我们至少希望了解人工智能决策背后的逻辑,而当前的 AI 系统“黑盒”尚无法提供这种透明度。
AI 擅长生成供人类后续审查的内容,但在直接操作和运行方面并不突出。
尽管有人试图让我们相信并非如此,但现有的技术距离实现通用智能还相去甚远。
我认为 AI 虽有其趣味所在,但它并未带来根本性的范式转变。
Cay 的早晨通常从编程开始,他完全不介意早起投入到项目工作中,编写代码,学习新知识。学习是他生活中的一大组成部分。《新程序员》和 Cay 相约在德国时间的九点进行采访,于是他起床后先是打开电脑敲代码。到点之后,妻子打开房门提醒:“你不是早上九点和人有约吗?” 他这才停下了手中的活儿,进入到线上对话当中。
在我们这个领域,有一点颇为独特,那就是你必须每周抽出时间来学习新东西。否则,你很快就会落伍。因此,我手头有几个小项目,我通过它们来促使自己学习最新的技术。
除了学习,Cay 还热爱旅行、徒步和骑自行车,享受与家人的共处时光,同时他也是一位阅读爱好者。他的旅行爱好常能与职业相结合,因为他频繁受到各地邀请进行演讲。上周,他刚从保加利亚回到德国,那是他从未去过的地方。他借此机会访问新地方、结识新朋友,增添生活的乐趣与色彩。
Cay 对于计算机的热爱源于青少年时期。那是德国一个宁静小镇的高中里,学校本身并无特别之处,唯独有一位特立独行的物理老师。这位老师虽然不热衷于日常授课,却对发掘并培养学生的创新思维充满激情。在二战结束后的某个时刻(远早于 Cay 入校之前),老师便发起了一项别开生面的课外活动:利用战争遗留的军用物资,让学生们动手将之变废为宝,制作成那个年代颇受欢迎的收音机、电唱机等电子设备。
待到 Cay 入学之后,这项课外活动早已成为了历史悠久的课堂传统,当时的世界也正值数字革命的起步阶段。Cay 在课堂上亲眼见证一个比他大两岁的孩子用剩余的继电器造了一台电脑。
就像二战时德国人造的继电器电脑一样,那家伙把大约一千个继电器串联在一起,真是令人惊叹……每当执行任务的时候,它就会发出咔哒声,你光是听就能分辨出它当前是在解码指令还是执行指令,一切都让人感到无比激动。
那时,孩子们可以购买到诸如“与门”、“或门”、“非门”等基本逻辑门芯片并进行组合。Cay 跟着班上的学长们,学习集成电路的原理,捣鼓发明。他后来还完成了科学项目,那是一个逻辑系统 —— 一个没有采用布尔逻辑,而是包含 0、1、2 三种状态的逻辑系统 —— 他构建了类似的装置,并凭借该项目在全国科学展览会上荣获佳绩。
Cay 伴随着这些技术成长,他的班级甚至还用 80 系列的微处理器自制了一台计算机,虽然操作系统是从别处获取,但计算机上的所有软件都是他们自行开发的。
高中毕业之后,他的首份工作便是编写汇编语言程序。高中的这段经历事实上没有让 Cay 爱上电子工程,因为在大多数同学都是电子工程师的环境中,只有他对焊接总是很不在行,常常会烧坏电路。
那时候我明白了一件事:
对我来说,偏向理论思考的部分才是更适合的。
在安阿伯密歇根大学,Cay 获得了数学博士学位。大学毕业后,Cay 成为了一名“连续创业者”(Serial Entrepreneur),这个词被专门用于描述那些多次创立并经营企业,具有多次创业经历的人。他们通常在完成一个创业项目后,不论成功或失败,都会继续投身于新的创业活动中。
1997 年,互联网泡沫的第三年。Cay 前脚刚离开一家公司,便有一个朋友找到他:“我想筹集资金办一家公司,你想来当技术副总裁吗?”
Cay 此时面临两个选择:回学校当教授,或是面临互联网泡沫继续创业。他这么说服自己:“如果以后我的孙子们问我,「你在互联网革命期间都做了什么?」,那我当然想告诉他们,我参与其中。”
最后,Cay 只问了问公司的职责是什么,而朋友回答他:“数字版权管理。”
这家公司叫 Preview Systems,最开始只有四个人。Cay 入职期间,还成功招聘过不少非常优秀的中国程序员,其中一位只靠一封电子邮件中的一句话说服了 Cay 招聘他:“我对 Windows PE 文件格式的每一个字节都了如指掌。” 这个程序员迅速成为了公司技术进步的催化剂,而 Cay 又接连吸纳了此人的几位同僚加入,团队不断壮大。
2001 年左右,互联网泡沫全速消退,公司在这一年被收购,这段历史也随着 Preview Systems 这个名字一起消失,但创业的经验被 Cay 视为珍宝。
联想到当今正在进行的“AI 泡沫”,各界人士为了不错过所谓的“下一个大事件”,纷纷涌入 AI 领域,推高了初创企业的估值,Cay 也为所有踌躇不定的创业者给出了建议:
我能完全理解年轻人现在的感受:如果你们也有同样的机会在初创公司或某个企业中从事 AI 相关的工作,那我会建议你放手去搏。这是激动人心的时刻,身处其中总是充满乐趣。
但要现实一点 —— 互联网泡沫并非对每个人都有好结局,很多人损失惨重。
我在互联网泡沫期间并没有致富,但我学到了很多。所以要明白,每一项新技术发展都有其积极面和被过度炒作的一面。但我认为,能亲身参与其中并近距离观察,总比袖手旁观要好。
我一直喜欢硅谷的一点是,即使你参与的项目最终没有成功,也没关系。没有人会因你的创业失败而放弃雇佣你。相反,很多人会认为这是件好事,因为他们现在有机会雇用一个经历过失败的人,且那次失败是由别人买单的。
Java 不会是那个最需要创新的语言
我不认为通用智能会像人们普遍设想的那样普及到众多场景中。
《新程序员》:你对 Copilot 的第一印象是什么?使用后的第一感受怎么样?
Cay Horstmann:说实话,我还没有到每天都用它的地步。我只在涉及一些我不太熟悉的领域时会去用 Copilot。
我已经做了 30 年的 Java 编程,所以 Copilot 反而会让我的速度慢下来;但当我用 Python 做一些事情时,例如一些我不太熟悉的 Python 库,我才会接受建议并考虑它。
我认为 Copilot 最终会像今天的自动补全功能一样,成为开发者的日常工具之一,它们能够辅助工作而不取代人类。所以,它至少还算是一个伟大的工具。
另外我也会用 Copilot 写提案或是类似的文档,很多开发者都头疼这些任务。虽然我是一个作家,我知道如何写作,但我仍然觉得动笔很困难。AI 能提供一个初步的框架或思路启发,尽管初稿质量可能不高,但它能打破僵局让我继续写下去。
总之,我完全支持这些 AI 工具,只是人们现在过于倾向高估它们的能力。作为工程师,我们很清楚如何开发和评估这样的东西。你们可以去尝试、练习、了解这些 AI 工具的能力,但不要过度兴奋,认为世界明天会发生翻天覆地的变化。
《新程序员》:AI 时代的程序员要做出什么改变吗?
Cay Horstmann:如今大家的注意力都被人工智能所吸引,所以资源事实上被稀释了。我的观点是,未来几年内人工智能的热潮将会逐渐降温。因此,我并不建议完全只专注于人工智能。这是一个有趣的领域,但我认为未来并不像某些人想象的那样完全取决于人工智能,传统的编程软件开发、软件架构将继续保持其重要性。
《新程序员》:很多人都担心自己会被 AI 淘汰。
Cay Horstmann:很多人都问过我这个问题。我认为答案显然是“不”,因为 AI 工具独立生成的内容建议很多都是没法直接采用的。它们顶多是参考建议罢了。
退一步讲,以一种或许带点美国视角的方式来说,大约二十年前我们见证了外包业务的兴起。彼时,众人担忧美国程序员是否会因外包而被淘汰,结果显而易见,编程在美国仍是一份极佳的职业。而且,外包团队展现出的能力事实上远超当前人工智能所能达到的水平。他们通常聪慧、有才且充满动力,能实际编写出高效代码,这是任何 AI 助手难以企及的。因此,我们不能仅凭 AI 助手的存在就断言程序员将被淘汰,毕竟之前这波智慧而充满动力的人群浪潮也未曾让程序员这一职业消失。
人工智能并不意味着人类失业了,反倒是以往需要死记硬背或迅速查找的信息(比如基础算法)现在可以依赖自动补全功能了。这是件完全的好事,提升了工作效率的同时释放思维,让我们去学习迄今为止我们没有时间学习的其他事物。
《新程序员》:Kent Beck 曾在不情愿地尝试了 Copilot 之后惊奇地发现:AI 虽然将他 90% 的编程技能全部取代,但也把剩下的 10% 技能放大了一百乃至一千倍。你同意他的看法吗?
Cay Horstmann:一千倍可能有点夸张,但确实是对的。这种情况在过去的许多年里随着技术的发展一直存在。我刚开始工作时,是用打字机写东西。后来出现了文字处理软件,我甚至自己编写了一个文字处理软件并成功出售获利。
技术的进步让我们能够专注于如何增加更多价值的事务上。这一点在人工智能上无疑是正确的。所以我认为这个观点基本上是完全正确的。
《新程序员》:你经历过最大的技术变迁或范式转换是什么?是当前的人工智能革命吗?
Cay Horstmann:事实上,最重要的转变 —— 这一转变在今天看来或许并不引人注目 —— 是 Java 中的垃圾回收技术。
在此之前的情况非常糟糕,因为当你使用 C++ 时,大量开发时间都会耗费在追踪和修正指针错误上。而转投 Java 后,这一问题就彻底消失了。仅凭一门语言解决了一个既繁琐又不愉快的问题,就极大提升了生产力。如今,这一切甚至已经变得理所当然。
除此之外,内存管理也曾是个大难题,现在已基本消失。我上次处理内存问题时,还是在用 Objective C 进行某个项目,那同样令人头疼。这是一个重要的技术转型。
还有一个我能想到的重大变革是云计算。如今,如果我需要数据库,就可以直接在云端获取,虽然需要支付一定费用,但我无需聘请数据库开发人员,也无需配备数据库管理员等。所以,我认为云计算的影响是巨大的。
至于 AI 将如何影响开发者,我尚不确定。AI 确实在某些领域表现出色,但也有很多领域与 AI 无关。因此,我不认为通用智能会像人们普遍设想的那样普及到众多场景中。例如,你的编译器不太可能内置 AI 功能;任何需要精确计算最优解的任务,都不会简单地依赖 AI 来完成 —— 这是非常普遍的需求,却不是 AI 所擅长的。我也不认为你会愿意让飞机依靠 AI 来驾驶,这不仅是安全性问题,而是涉及人身安全的情况下,我们总希望理解它的答案是如何得出的。
AI 擅长生成供人类后续审查的内容,但在自主运行方面并不特别出色。以目前的 AI 发展水平来看,我难以预见其在这方面能有多少突破。我不是说永远不可能,但至少现在我们目前拥有的东西距离通用智能还很遥远。因此,我认为 AI 虽然很有趣,但它所带来的东西并不构成一种根本性的范式转变。
《新程序员》:Java 该如何适应人工智能并支持技术进步?未来或许还会出现为下一代环境而设计的编程语言,以 Java 的性质,有可能会与之竞争吗?
Cay Horstmann:我们可以观察一下当前程序员的编程方式。他们会频繁使用如 GitHub Copilot 之类的辅助工具,所以未来语言的设计需要适应这种趋势。这是一个引人深思的问题,目前我觉得尚无定论,因为人工智能还在新兴阶段。但显然,这种语言设计思路具有明显优势。
如果我们回顾较为早期的发展,人们过去常常使用像 vi 或 Emacs 这样的文本编辑器。而现在,一切都通过集成开发环境(IDE)来完成。IDE 不仅通过自动补全等功能简化了编码过程,还使库的探索与应用更为高效,以至于我们难以想象重返缺乏这些辅助功能的纯文本编辑时代。事实上,我认为未来每个 IDE 都将内置某种编码辅助功能。在今天,自动补全早已成为现代 IDE 不可或缺的一部分,VS Code 与 IntelliJ IDEA 上的用户几乎无法想象缺少这项功能的 IDE。所以在未来,基础的代码辅助也会一样演变为标配,甚至更新越来越好。我还不清楚这将如何具体实现,但 IDE 是一个非常适合实现这一功能的地方,因为 IDE 本来就是一直在演化的,它们会伴随新特性的叠加,变得愈发复杂,直至催生出追求简约的新一代 IDE。VS Code 的兴起便是对此前过度复杂的 IDE 的一次反拨。我认为这种创造性的破坏和工具的迭代将会持续发生。
这无疑是一个精彩的问题,尽管我无法确切告诉你答案,但可以预见,未来确实会像你说的一样,新型语言涌现并充分利用人工智能技术。至于 Java,这是一种高度保持向后兼容性的语言,它甚至可以在未经修改的情况下运行我在 29 年前编写的程序。所以 Java 可能不是那个需要创新的语言,因为它的强项就是向后兼容性。这也意味着,如果我想构建一些十年后仍能工作而不需要我改变所有东西的语言,那么我会随时选择 Java。
精通一门语言并快速学习其他语言
这是开发者顺应时代变化的基本技巧
30 年后,Java 仍然是我最喜欢的编程语言。
《新程序员》:为什么会在写完《Java 核心技术》之后还推出“速学版”?
Cay Horstmann:《Java 核心技术》这本书是 30 年前设计的经典之作,原版超过了 2000 页,是一本很长的书。那时并非所有人都熟悉面向对象设计,它也是针对那些可能对数据结构或并发编程不太了解的初学者编写的。并发编程在当时是一个非常新颖的概念。
随时间推移,我逐渐意识到,许多读者已具备其他编程语言的深厚功底,比如现在有很多学生是从 Python 开始学编程的,他们也就无需重复学习基础内容。此外,《Java 核心技术》力求面面俱到,详尽介绍大多数人可能感兴趣的API知识,而并非所有读者对这种内容都有需求。
所以,如果有些开发者性子比较急(Impatient),或是已经有了一些编程的基础知识,并且不需要深入一些更专业的主题,我想应该有一种更好的方式来满足他们。这就是《Java 核心技术:速学版》(Java for the Impatient)以及整个“速学版”(~ for the Impatient)系列书籍的由来。
我之前还写过一本名为《快学 Scala》(Scala for the Impatient)的书,创作动机就非常类似,针对的是那些不想了解所有背景,特别是函数式编程背景,只想立即使用Scala的人。我写那本书是为了自己,因为我急于实践 Scala。我厌倦了那些试图强加某种编程教条的论调,只求一本能让我直接上手的指南。
我还推出了《写给大忙人的现代 JavaScript》(JavaScript for the Impatient)遵循同一理念 —— 也就是说,它也是为我自己而写的。当时我发现为学习者创建的所有交互式体验都是用 JavaScript 做的,所以急着进行学习。于是,我参考了 David Flanagan 的那本“犀牛书”(《JavaScript 权威指南》),也是 JavaScript 的经典著作。
《新程序员》:以后还会有其他编程语言的“速学版”书籍吗?
Cay Horstmann:可能会有。我一直在努力寻找一种全新的、令人兴奋的编程语言,像 Python 现在已经变得非常流行,它有一些很好的特性,但 Python 的资料已经够多了,所以我并不打算深入。
说实话,我对 Python 了解不多。我懂基础,能写脚本,但从未真正涉足高级应用,也没有这方面的需求。Java 对我来说已经足够好。你知道现在中国最热门的编程语言是什么吗?
《新程序员》:根据 CSDN 最新的开发者调查报告,是 Java(笑)。
《新程序员》:你刚刚说你对 Python 了解不多,但我知道你出过一本书,叫《Python for Everyone》。
Cay Horstmann:对,这些书的内容其实和《Java 核心技术》大相径庭。它们是面向初学者的计算机科学入门书籍,我一共出了三本,分别是《Big Java》,《Big C++》,还有一本《Python for Everyone》,它们实际上都没畅销过。我原本计划也将其打造成一本大型 Python 书籍,但未能实现。
这些书实际上并不是为了教授对应的编程语言,而是为了教授计算机科学的基础。语言只是一种工具,所以你如果同时阅读这三本书,会发现有很多重复的基础知识。而《Java 核心技术》显然是为了教你关于 Java 语言及其平台的所有知识。
《新程序员》:你这么多年的工作内容其实都和教育有关。你认为现代教育最大的变化在哪?
Cay Horstmann:三十年前我们传播知识的手段还是书籍,但现在人们获取知识的渠道已经极为丰富。我最近在研究怎么让算法和数据结构相关的教学不那么晦涩,因为教学书上的算法通常只有几张图表辅助说明,理解起来并不直观。这意味着,读者如果要想真正掌握,还需要亲自动手实践,比如在纸上演算、做练习题、尝试自证算法正确性、亲自编码实现,这个过程往往缺乏老师明确的指引。而且读书自学 Java 的人有不少在现实很忙,没法投入足够的时间。
作为作者,我以往对此束手无策,但这个时代却有能力做得更多。我可以随着读者阅读进程,穿插提问,引导他们动手操作。我能够在书里设计互动环节,提出更有意义的问题:以二叉树章节为例,我定义了叶节点的概念后,随即展示一个随机生成的树,要求读者点击所有叶节点。这一过程仅需几秒,但完成之后,作为作者的我便能确认,读者已掌握了这一概念;同时,读者自身也会意识到这一点,从而获得更大的学习动力,更有信心地继续探索。学习编程,最好的方法就是动手实战。
我以前还在大学教授过一门大型课程,每班数百名学生,基本全都是初学者。当时的课程结构安排为每学期四次大作业,但对刚接触编程的学生而言,他们实际上很难独立完成如此规模的作业。因此,他们经常求助于同学,共同完成作业 —— 其实就是抄作业。所以,学习效果不是很好,聪明的学生承担了大部分工作,其他人因为抄袭答案导致收获甚微。到了下学期,我发现很多学生经过一学期的计算机科学学习,竟然连简单的循环都不会编写。
后来,我彻底改革了教学模式,不再布置大型作业,转而采用大量小型任务。改良后的课程中共包含了一百多个练习,当学生们亲自编写过一百次循环后,第一百零一次便来得轻而易举。这种持续的实践练习比假设学生自己会去学习要有效得多。
二十年前,这种做法难以在书中实现,但如今却成为了可能。我现在可以在书中嵌入示例代码,要求读者修改循环、解释循环功能,或是编写类似循环。因此,我设想的教育方式比过去更加动态,而不是静态地在页面上展示材料并希望读者会有所行动。现在真的可以让读者积极参与进来,让读者感受到进步。当读者在阅读后能自信地说:“我了解如何应用这个知识点了,因为我刚刚实践过”,这样的学习才有动力,这才是更为沉浸式、更富成效的学习方式。
因此,我强烈建议大家,如果有此类互动学习材料 —— 虽然这是一项较新的发展 —— 一定要积极寻找利用。反之,如果你没有这样的资源,不要只是机械地观看视频,而是应该主动思考,结合所学内容,动手做一些实践性的工作。毕竟,犯错是学习的一部分,我自己也是通过实践中的失败,不断尝试直至成功。
我最近还和出版社沟通过,询问他们为什么不能在《Java 核心技术》内部也实现这样的互动学习。遗憾的是,出版社当前尚不具备这样的技术支持。这听起来有些匪夷所思:他们为什么能提供基于网络的 EPUB 格式书籍,却不能在其中融入练习环节呢?但出版社总是告诉我,他们正在研发中,预计还需一至三年。
尤其考虑到《Java 核心技术》的中文版目前仍以纸质形式出版,让我更加期待变革的到来,并在后续版本实现更强的互动性。请对此保持期待。我们会为此建立专门的网站,让用户登录后即可阅读、完成练习 —— 这其实并非难事,只是出版商尚未深入思考罢了。
《新程序员》:除了广泛的教育改革,你在 Java 的教学方法上具体有过哪些调整吗?现在的软件开发非常多元化,是不是要在教学的时候让学生为其他编程语言也做好准备?
Cay Horstmann:其实很简单,虽然 Java 语言一直在持续演进,但这种进化是循序渐进的,所以我们能预见到即将发生的变化,将其融入教材并非难事。我始终坚持一个原则:假设所有的读者都希望通过书籍学习当下最实用、最先进的知识。因此,我会剔除过时的内容,用最新的技术和最佳实践取而代之,以满足读者的学习需求。毕竟,这是读者对书籍的基本期待。
我不倾向于在书里追溯 Java 历史沿革,详述从前是怎样的,之后又如何变迁,因为现代读者往往不太关注这些背景,他们更关心当前的最佳实践是什么。我可能会在注释中这么写:“某些旧技术可能在某些老旧资料中仍可见,但建议忽略这些,采用更新的方法”,然后再写行字解释我这么做的理由。
现在的另一个不同之处在于,读者只想学习他们需要的内容。因此,我正在努力调整书籍的结构,让在线阅读的读者不必从头读起,可以随时从感兴趣的部分开始阅读。这意味着我会减少章节间的相互依赖,并为未阅读前面内容的读者提供必要的回顾链接。毕竟,这也是我自己在需要学习新知识时的常用做法 —— 通过搜索引擎寻找信息,或是访问如 O'Reilly 这样的网站,浏览多家出版社的书籍资源,迅速切入主题,快速理解我想要的知识。
早先的几本书中,我曾设计了一条贯穿多章节的长案例,但现在我已经不再采用这种方法了。我认为,对于那些希望从任意章节开始阅读的读者来说,这是一种不便。再说,未来的教学趋势在于交互性。技术日新月异,可能突然间就需要转向移动开发,或面临全新的编程语言和技术栈。所以从教学角度看,借用我在大学教授的经验,大学的责任并非教授你多种语言,而是教会你如何学习,因为作为开发者,终身学习将成为常态。因此,我的目标是最高效地培养这种能力。实现这一目标的方法是,确保你能精通至少一种语言。
过去,Java 常作为通用的教学语言,而现在 Python 或许会取而代之。不论何种语言,我认为,经过四年的大学教育,学生应当至少深入掌握一种语言,对这门语言的语法、构建系统、工具链了如指掌,并通过这一过程快速掌握其他语言。
我常在大学课程(如软件工程课)中设置一种课题,就是让学生将做到一半的项目采用另一种语言完成。这不仅是项目的一部分,也是适应新语言、新工具的一个过程。我会明确这一学习路径:如何从已知过渡到未知,这也是大学应当传授的技能之一 —— 学习如何学习。因此,我还特意引入了一些极具挑战性的语言教学,如 Scheme、Haskell,这些语言具有思维拓展性,不同于学生熟悉的常规语言。我甚至会使用 Scala,但仅限于其函数式编程部分,禁止变量的修改,这种方式能让学生们学会适应完全不同的编程范式。在我看来,教育体系的职责正在于此:精深掌握一项技能,同时掌握快速学习其他技能的诀窍。
《新程序员》:时代一直在变化,但也有很多恋旧的人。我记得 James Gosling 曾经还特别呼吁过希望大家弃用 JDK 8。
Cay Horstmann:我看过最新的数据,JDK 8 已经是过往的历史了。
曾经,从 JDK 8 过渡的难点在于模块系统和 JDK 9 的引入。然而,一旦用户从 8 跨越至 9 之后的任意版本,无论是 11 还是 17,继续升级到最新 JDK 就显得轻松许多。因此,任何从 8 升级到 11 的用户,实质上已经踏上了一条平滑的升级路径,他们现在可以直接过渡到 17 或 21 版,且一切将顺畅运行。
这与以往情形相似:更换 JDK 版本或许需要花些时间处理细小问题,随后即可顺利运行。8 升至 9 之所以引起过争议,是因为当时引入了模块化,它导致了许多兼容性问题,使得人们质疑升级的必要性。然而,时至今日,这些难题早就被克服了。促使开发者升级 JDK 的明确理由有两个:
1. 安全性,运行如此陈旧且含有大量已知安全漏洞的软件不是一件很理智的行为,更不必提那些潜在未知的风险;
2. 许可成本考量,若想沿用 JDK 8,必须承担高昂费用,因为合法的途径是采用 Oracle JDK,且年费逐年攀升。因此,若你仍在使用 JDK 8,不妨仔细计算一下成本。实际上,短期内从 8 直接升级到 17 是完全可行的,我甚至建议开发者总是跟进最新的长期支持版本。比方说目前而言,你应该切换到 21 版。我预计 JDK 8 的遗留问题不会持续太久,坚守旧版实在没什么必要。
《新程序员》:有些开发者是因为公司的需求导致必须留在 Java 8,但无论如何,“新版任你发,我用 Java 8” 已经成为一个梗了,你怎么看待这种现象?
Cay Horstmann:坦白讲,我无法理解有人能理直气壮地声称 Java 8 在某些方面优于新版本。我曾经维护过一个基于 8 版的代码库,每当涉及文件操作时都令我非常头疼,因为自 8 版之后,Java 在文件处理方面已经有了许多微小却重要的改进。
从程序员的角度出发,新版本也总是更加优越。Java 本身并未退步,它只是不断增添了可选的新特性,而与此同时,bug 数量也在不断减少。因此,我看不到坚守旧版本的任何益处。每个新版本总有某些方面表现更佳,比如字符处理随着 Unicode 标准的进步也在演进。如果使用的是支持旧 Unicode 版本,就会遇到局限。
所以你提的这个问题我也曾思考过:是否应该编写一本指南,帮助用户直接从 8 版无缝过渡到最新版?因为有些人可能只是单纯对升级感到不安或缺乏信心。也有可能是《Java 核心技术》这类书籍默认读者对 Java 并不熟悉,因此缺乏直接针对从 8 到最新版快速过渡的指导资料。又或许是需要一个新的官方项目,专门引导用户从 8 版迁移,并提供具体步骤。
总之,对于那些仍停留在 8 版的开发者,我强烈建议阅读在线的《Java 核心技术》内容,我在里面介绍了所有的 Java 最新特性,里面有一些很不错的小更新。比如模式匹配(Pattern matching),我现在觉得它极为实用。起初我还觉得它有些复杂,但这个功能如今变得日益成熟了。我还接触了不少全新的正则表达式特性,正在被广泛应用。
《新程序员》:随着谷歌(Google)宣布 Kotlin 成为 Android 开发的首选语言之后,Java 在移动应用开发领域的统治地位有何影响?你对 Java 开发者转向 Kotlin 有何看法?
Cay Horstmann:这个问题问得非常好。曾经有一段时间,Java 的发展确实很缓慢,然后 Scala、Kotlin、Clojure 等语言出现了,它们都是基于 JVM(Java 虚拟机)开发的。JVM 是个出色的技术,但这些后起之秀发展的更快,其中 Scala 尤为如此。如今 Java 拥有了许多让 Scala 作为日常编程语言更友好的特性,例如引入了 lambda 表达式和流处理。因此,转向新语言的需求没有那么迫切了。但是,Scala 在类型系统上的探索确实激动人心,这是我在 Java 或 Kotlin 中永远无法体验到的。
至于 Kotlin,通常情况下转向 Kotlin 的理由并不那么充分,尽管它更加人性化、更加一致,但也带来了足够的差异性。比如在虚拟线程的处理上,Kotlin 为了保持竞争力,在未来可能需要反向而行;相比之下,Java 则采取了更为长远的策略,现今似乎找到了更佳的解决方案,坚守 Java 的开发者也因此得到了回馈。Brian Goetz(Oracle 架构师)就曾经说过,Java 享有“后发制人”的优势,能够借鉴并优化已被验证有效的实践。
但你说得对 —— 移动开发领域的情况确实不太一样了。虽然使用 Java 进行移动开发仍是可行之选,但新兴资料和教程几乎都以 Kotlin 为主。如此看来,如果有人想投身 Android 开发,Kotlin 几乎是必经之路,就像 iOS 开发绕不开 Swift 一样。
个人而言,我对层出不穷的专用编程语言持保留态度,它们相较于通用语言仅实现了细微改进。现实便是如此。我认为,精通一门语言,并在必要时能快速掌握并运用一门新语言,是一种必要的能力。即便我个人不涉足 Android 开发,但如果需要,我也会选择 Kotlin 来完成任务。对于一位优秀的 Java 开发者来说,学习 Kotlin 并非难事。
《新程序员》:假设现在有个学生站在你的面前,问你 “我学习 Java 的理由是什么?”,你会怎么回答他?
Cay Horstmann:我的第一个建议是,你应该跟从你的社区。
如果问我这个问题的人在大学里,而大学使用 C++,那就学习 C++,因为那是周围其他人都在学习的语言。而且他们很可能已经根据这一点优化了整个课程结构。
但如果提问者是自学者,那我实际上会向他推荐 Java。这样做的原因有三点:一、关于 Java 的优秀资料很多;二、Java 是一种非常好的语言;三、Java 是编译时类型检查的,而对于学习者来说,我认为能够尽早看到自己所犯的错误是非常有用的。
当然,Python 的优势在于,关于它的优质学习资源也非常丰富,如果提问者想接触数据科学或人工智能这类酷炫领域,Python 相比 Java 会稍微容易一些。但 Python 的缺点是,你在编码过程中一旦出错,往往是在程序崩溃时才发现那个错误,然后你将面临一段痛苦的调试时光。而在 Java 中,“一次编译、随处运行”(Write once, compile anywhere)。
《新程序员》:现在也有不少人是通过开源社区的项目学习的,许多开发者可以在同一个开源项目里共同进步,积累经验。
Cay Horstmann:没错,说得很好。我认为参与某些开源项目是拓宽视野和展示自己能力的绝佳方式。很多时候,你其实没法在申请新工作的时候真正展示你在旧工作中编写的代码,但你可以展示你在开源项目中的贡献。
我的建议是,如果开发者对某个项目感兴趣,那就直接参与进去,弄清楚项目运营者的需求是什么 —— 这通常相当明显,因为这些讨论往往已经是公开的。然后,就可以考虑自己能贡献什么。一般可以从简单的 Debug 开始,以便赢得社区的信任。
开源这种美妙的事情在 40 年前是不存在的,它极大地改变了编程的方式,让每个人都有参与的机会。如今全世界有那么多项目迫切需要额外的帮助,甚至 Java 也发生了翻天覆地的变化。Java 刚起步的时候还没有开源,现在一切都公开了,鼓励大家参与讨论和开发。可能在实现层面不会期望新手为 Java 这样极其复杂的项目做出贡献,但它确实非常开放,我认为这对人们参与其中至关重要。
除了参与开源项目,还有人可能想启动自己的开源项目,接下来就需要一步步构建社区、寻找贡献者。事实上,如果真的有人正在看这篇采访,并且想做点开源项目 —— 可以直接来找我的开源项目。我最近在做一个匿名且对作者友好的自动阅卷系统,特别适合用于简单编程作业的自动评判。
Cay 的 GitHub 主页:https://github.com/cayhorstmann
《新程序员》:听起来很可靠。你参与了这么多年的项目,有经历过哪些刻骨铭心的失败吗?
Cay Horstmann:我经历过的最大挫败在很多年以前,我的公司在尝试将业务从 DOS 系统迁移至 Windows 系统时遭遇失败。这听起来挺荒谬的。根本原因在于,我们努力实现的功能无法借助 Windows 的公共 API 完成。
我们当时本应该与其他面临类似困境的企业携手合作,因为成功转型的那些公司都是对 Windows 进行了逆向工程。但问题实质上出在内部的沟通不畅,以及我们或许过于自信,认为既然以往能成功应对其他挑战,这次也必然不在话下。
有时我们确实会遇到这样的状况:项目设定的目标超出了现有工具的能力范围。
除此之外,我还想到了另一件事。我们曾在一个项目中急于成为 Java EE(Java 平台企业版)的先行使用者,而实际上,我们的项目根本不需要Java EE旨在解决的那些问题。结果,我们不仅面对着一个尚不成熟的项目,还采用了一项并不完全适配项目需求的技术。我后来还目睹过一些数据量并不庞大的团队犯了和我一样的错误,他们选用 MongoDB 而非更符合需求、更为现代化的 SQL 数据库。
所以,选择错误的技术路径并因此陷入困难,其实是很常见的一件事。关键在于事后要自省:什么才是最合适的技术?我们该如何恰当地运用它?
优秀程序员的标准过了 50 年也没改变过
我见证过的技术兴衰比许多人学过的技术还要多。
《新程序员》:你的第一门编程语言是什么?
Cay Horstmann:我的第一门编程语言比 Java 早了大约 20 年。那个年代我们自己组装电脑,所以别无选择,只能用汇编语言编程。
我的第一门高级语言要么是 ALGOL,要么是 Fortran,我也记不清了。上大学后,我们从 Pascal 开始学起。Fortran 并不有趣,但 ALGOL 和 Pascal 都是结构严谨的语言,我认为它们很适合编程初学者。
《新程序员》:我记得那个年代有很多 COBOL 程序员。
Cay Horstmann:对,在我很年轻的时候,COBOL 一直是个不错的职业方向,但我从未对其产生兴趣,所以也没去学。
《新程序员》:学习一门新编程语言时应该保持什么样的心态?
Cay Horstmann:让我举个例子 - 如果我要学习 Rust,我会先自问 “Rust 的独特之处在哪里?为什么人们要创造这门新语言?” 毕竟,引入数百种语言是一种很大的成本,所以一定有发明新语言的原因。我会深入探索新语言的特性和不同之处,找出它们独特的理由。
当然,我们不能简单地说“更好”,比如 Rust 并不是“更好”的语言,而是它试图优化某些方面,比如内存管理 —— 编译器会严格监控内存使用情况,使得编程高效而不必依赖垃圾回收。因此,我会集中精力学习这一点。
此外,我还会通过构想一个项目来学习,这个项目必须凸显这种特性的重要性,而放在 Rust 这个例子上那就是一个需要大量内存分配的项目。在学习过程中,我会尝试构建一个小应用,从而明确自己哪些地方不懂,然后逐一攻克。关键在于,我将专注于那些使其与众不同的特性。
当我初次接触 Scala 时,就是采取了这种方法。我当时并不关心它与其他语言的相似之处,因为那并不吸引人。我好奇的是 Scala 的独特之处,比如类型系统。我会努力理解那些在 Java 中难以实现,但在 Scala 中得以施展的功能,并集中精力研究。
《新程序员》:该怎么判断自己是否精通了一门编程语言?
Cay Horstmann:问题在于,我们真的需要对精通每一门语言吗?掌握一门非常熟悉的语言是好事,它能为你提供一个基准。但如今,我们不得不面对多种编程语言。因此,我不确定是否有必要把每门语言都学得极其透彻。
我追求的是在这些语言上的熟练运用,了解每种语言中的常用习惯用法。同时,我也想了解每门语言的独特之处。即便一开始不能掌握所有细节也没关系,随着实践的深入,自然会逐步掌握。事实是,如果不实践,就很难达到 100% 的掌握程度。因此,我建议先快速提高生产力,同时学习相关的工具,不要在特定生态环境下的工具使用上感到困扰。
我建议,首先允许自己表现得“笨拙”,但至少能动手做事,意识到自己渴望提升,然后逐步达到熟练。最终随着时间的积累,你会成为专家。
《新程序员》:你为什么会读数学博士,而不是计算机科学?
Cay Horstmann:我曾以为计算机科学只会是我的业余爱好。我大学主修数学,同时一直坚持学习计算机科学,因为我担心在数学领域最终会找不到工作 —— 我最后也确实没能在数学领域找到工作,所以计算机科学作为我的备选发挥了作用。
但是,我在大学期间一直都有计算机科学的兼职工作。我做过各种各样的编程项目。在研究生院时,我拥有着一家软件公司,销售我为数学排版而编写的软件。那实际上相当成功。后来我获得了数学博士学位,但就业市场并不理想,于是我得到了一份教授计算机科学的工作机会。
《新程序员》:学习数学对成为一名程序员是必要的吗?
Cay Horstmann:至少不会有坏处。
有些人会说,“成为程序员必须精通各类数学理论”。我对此的看法是,虽然了解离散数学是有益的,但是在 2024 年掌握微积分知识并不是成为一名优秀程序员的核心要求。
所以,我建议如果有人想学习数学,绝对应该学习离散数学,尤其是要学会证明方法。能够进行证明就如同能够编写程序一样重要,但遗憾的是,市面上缺乏高效指导如何正确进行证明的资源。相比之下,你可以在很多在线平台学习编程,所以年轻人很容易学会编程,却没法通过同样简单的方式自学掌握数学精髓。
现在也有可汗学院这样的平台,他们能教会你运用公式,但这仅能触及到数学的皮毛。所以我觉得,如果能填补这一块儿的空白,无疑是一大进步。另一方面,如果一个人想学习编程,也没必要因为不会数学而感到自责。你可以先学习基础编程来培养一些直觉,然后再深入学习离散数学的时候就会来得更容易,因为你清楚你想用它来做什么。
《新程序员》:如果让你现在站在 CEO 的角度思考,你今年会招聘什么样的程序员?现代程序员应该具备哪些品质?
Cay Horstmann:这真是一个很好的问题。
在大型机时代,有一本编程书籍叫《人月神话》,里面提出的几乎所有建议在今天依然具有指导意义,比如“向项目增派人力往往会导致延期”或是“第二个系统是程序员所实践的最危险的系统”。所以我觉得,优秀程序员的标准其实一直没改变过。
当然,优秀的程序员还需要理解编程的基础知识。我认为,尽可能多地吸收关于数据结构和算法知识,并使自己能够巧妙地理解、修改和发明新算法,仍然是非常有价值的。事实上,有很多网站可以让你进行这样的学习。例如,去年为了好玩,我参加了一个名为 Advent of Code 的网站,每天都可以练习一些算法。
此外,优秀的程序员还需要了解一些软件工程的知识,而实践是最好的学习方式。如果能够早期参与团队合作(尤其是那些注重质量的团队),体验开发流程,那将是非常宝贵的经验。但遗憾的是,我们经常看到一些团队只是想快速推出产品,然后各自散去,没有人对自己的决策负责。这可能不是学习成为一名优秀的软件工程师的最佳环境。如果有机会加入一个深思熟虑的团队,构建出能够持续 10 年、20 年仍然存在的产品,那将会好得多。
《新程序员》:新时代的程序员还需要培养哪些非编程技能?
Cay Horstmann:掌握一些商业技能总是更好的。我在开公司的时候,非常希望自己的开发人员对业务有一些了解。我会让 CFO 每月开一次会议,我们会共同查看公司的财务状况。我的意思就是,无论你在一家多小的公司,最好也要了解你公司的财务状况。如此一来,你会成为一个更有用的员工,同时可以弄清楚是什么让公司盈利并支付你的工资。
我总是会带一些工程师去参加销售会议。因为工程师们如果独自工作,不太了解销售人员面临的情况,更不知道客户需要什么。很多时候,客户在销售会议中提出的需求非常简单,可能只需我们几天就能完成。从工程角度看,工程师们对此常常感到失望,他们会说:“这确实很简单。” 然而,当我们在短时间内精准满足客户需求时,销售人员自然十分高兴。此外,有些敏捷开发的公司试图通过始终让客户在现场来实现这一点,这也很有效。
我十分鼓励每一位工程师尝试去了解他们正在开发的产品的经济价值,以及客户实际想要什么(而不是他们自认为客户想要什么)。很多客户事实上也不知道自己的需求,所以你必须保持持续的沟通。
我们必须确保没人在做纯理论的工作,而是都做点实事。为了做到这点,我觉得可以考虑去参加一些大学的基础商业课程。但如果你已经在一家小公司里了,那向你的财务学习就行。
《新程序员》:开发者社区其实有一种说法:“程序员到了 35 岁,要么转管理,要么退休。”
Cay Horstmann:工程师转型为管理层的现象确实十分普遍。这种转变可能顺利也可能不顺利,因为这实际上取决于新管理者是否有兴趣和背景。因此,我认为人们需要认真对待这种转变,并问问自己,“我是否喜欢管理?” 我就当过几年的经理,但后面我发现自己实在不喜欢这份工作,所以又回归到了开发领域。
事实上,成为一名优秀的管理者完全不简单,你需要投入大量时间和精力去实践并保持高度的积极性。但现在曾经单一的职业发展路径已逐渐被打破,许多大型企业意识到并非所有人都适合这一模式,于是开辟了成为资深工程师的发展道路。有人热衷于走向管理层,也有人偏好资深工程师的角色。我觉得让每个人都能依据个人喜好和专长选择最适合自己的发展道路,才是最重要的。
如果真的想要成为优秀的管理者,那我觉得有一个好的锻炼途径是参与小型企业的运营,小公司的管理会承担多重角色,有机会尝试各种不同的事务。
《新程序员》:我听说,很多开发者不论级别如何,都会与“冒名顶替者综合征”(Impostor syndrome)斗争。他们相信自己的成功是运气因素导致,而 AI 代码生成的出现很可能加剧这种现象。
Cay Horstmann:每个人都或多或少会有自我怀疑的时候,不是吗?我们如今面对的技术错综复杂,以至于没有人能理解一切。有时候我们只是依靠点滴积累的理解前行,并在遇见那些更深见解的人后不禁感叹:“天哪,我恐怕永远达不到他们的境界。”
我也不喜欢一直感觉到自己很渺小,但这是我们必须要习惯的。大家都在试图表现出自己比实际知道的多一点点,这是生活的常态 —— 如果现在我告诉你所有我不知道的事情,人们就不会再买我的书了,(大笑)所以我不能这么做。
我可以举一个实际的例子。我最近为一个叫 Project Valhalla 的 OpenJDK 项目做了个演讲,我本想浅析几行字节码,展示值类型带来的优化效果,却意外发现自己对近二十年间汇编代码的演变竟如此陌生。我当时心想,“我需要在接下来三个月的时间来学习现代汇编到底是什么样子。” 但事实上我现在还没去学,所以我在某种程度上就是一位「冒名顶替者」,对吧?
世界上有太多知识等待我们去掌握了,而我见证过的技术兴衰比许多人学过的还要多。面对最新的技术,我通常需要有所判断:“这项技术是否值得深入?” 有时答案是肯定的,有时则是否定,必须有所取舍。明确自己的兴趣所在之后,才能判断哪一种答案有益于职业发展。没人能知道所有的事情,所以我们其实都是「冒名顶替者」。
开发者正在迎接新一轮的技术浪潮变革。由 CSDN 和高端 IT 咨询和教育平台 Boolan 联合主办的 2024 年度「全球软件研发技术大会」秉承干货实料(案例)的内容原则,将于 7 月 4 日-5 日在北京正式举办。大会共设置了 12 个大会主题:大模型智能应用开发、软件开发智能化、AI 与 ML 智能运维、云原生架构……详情👉:http://sdcon.com.cn/
还没有评论,来说两句吧...