IntelliJ IDEA Conf 2022

看完了的 IntelliJ IDEA Conf 2022 (day 1)IntelliJ IDEA Conf 2022 (day 2)
写一下印象比较深的和观后感

day1

Surviving Open Source, by Donald Raab

介绍了这位老哥参与开源项目的心路历程

Let’s Set Sail With Fleet!, by Vitaly Bragilevsky

(用了英文单引号,但是会自动变成了中文的,可能和配置有关)

这位老哥非常风趣幽默

在演示分布式计算器应用的加法功能时,2 + 3 = -15 + 6 = -1,评论区炸了锅,纷纷提出自己的解决方案

1
2
3
4
5
6
7
8
9
​Add is disabled
...
​addition uses subtract microservice
...
​you're subtracting
...
​Looks like '+' is mapped to '-' button
...
​you have minus in your java implementation

但其实是故意装作翻车的样子,节目效果罢了,实则是为了展示 Fleet 的远程协助功能(类似 IDEA 的 Code With Me)

1
give them both an Oscar already

最后 QA 环节,当问到 Fleet 是不是为了替换 IDEA 而弄出来的时候,主持人挑了挑眉,然后老哥吞了下口水,也比较搞笑,感觉有点像送命题

以下是他的原话(自动生成的字幕有部分错误,这里做了调整和删了部分 uh 语气词)

1
2
3
4
5
6
7
8
9
10
11
I think Fleet is not designed to replace IntelliJ IDEA.

So what I've showed you here is an IDE for working with polyglot projects with stuff like that, but I don't think that when you have a project in Java or in Kotlin or in one language that Fleet will be enough for your experience.

So I believe from my point of view, it's not official statement from JetBrains by the way by no means.

So what I feel, for me like when I have this dedicated project in one language, it's great to use IDEA or maybe CLI with all that stuff and that very powerful IDE, but if you want to do something quickly, to edit something, to check something, then Fleet is great.

So it's not a replacement as I see, it's a very nice addition.

So that's what I think.

总的来说,Fleet 不是为了替换 IDEA 而弄出来的(求生欲拉满),只是作为一个补充,或者辅助工具

但是支持多语种,轻量级的特性,明眼人都看出来是对标 VSCode。。。

Should I Upgrade to Java 17?, by Nikhil Nanivadekar

主要是做了一些 Benchmark,JDK 8,JDK 11,JDK 17,JDK 17 的数据总体来说比低版本的好看,性能更强,内存占用更低

然后介绍了 JDK8 以后的新特性

比如 var 类型推断,switch 支持枚举和表达式,空指针异常打印(一个对象比如 a.b().c().d() 报 NPE,之前很难看出是 a 还是 b() 还是 c() 返回 null,这里会直接打印出来出现 null 的地方,方便 debug),文本块,Instanceof 增强,Record,密封类

但我感觉他的 PPT 里提到的 JDK 版本是错的。。。

总的来说,JDK 17 已经 GA 一年多了,JDK19 也 GA 了,明年 JDK 21 LTS 也会 GA,还没升级的赶快升级

话是这么说,陈年老码谁升谁知道,只要 Spring Boot 不出个 log4j 级别的漏洞,那大环境下 JDK 8 还会存在很久,这个是我感觉的,如果有不同的想法或意见,以你的为准

新项目是可以用的,如果没用 JDK 11,也可以直接上 JDK 17

Spring 6,Spring Boot 3,也要 JDK 17 起步

说句题外话,如果你用过 Kotlin,会发现这些所谓新特性,在 Kotlin 刚出道的时候,基本上是自带的,Java 现在已经慢慢变成 Kotlin 的模样 🐶

此外,用来对标 Go 协程的 Java 虚拟线程,其实人家 Kotlin 也早就有协程和 Channel 的实现了,在 Docker、云原生等的 buff 加持下,Java 逐渐失去了跨平台的优势,所以搞了个 Spring Native

感觉作为 20 多年的老大哥,Java 起了个大早,赶了个晚集,在面对后辈异军突起的时候,危机感也挺强的,还是个人观点,有不同的以你的为准

Event Streaming and Processing Using Apache Pulsar, by Mary Grygleski

没怎么了解过这个产品,没有对应的知识储备,讲得很清楚,听起来不是很明白,后面用到了再回头重看一遍

口音非常熟悉和亲切,不开字幕可以练下听力

Kubernetes Native Java, by Josh Long

语速一如既往地快,不开字幕好多时候都跟不上

为什么要升级 JDK 17,他提供了一个很好的比喻(修复 bug 和去掉一些语气词)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
You know, for Spring Framework 6 as we mentioned, you can't use Java 8 and Java 11 now, this is for good reason, they are terrible versions to use in production today, there is no situation which using Java 8 or 11, even ironically, is appropriate.

Java 17 is technically superior to Java 8 in every conceivable way, it's faster, more memory efficient, more observable, more secure, more robust, more syntax switch, more performant, more operations, friendly etc.

It's just a better piece of software in every conceivable way.

It's also morally superior to Java 8 in every conceivable way.

You won't like the look of despair and chagrin in your children's faces when they find out that you're using Java 8 in production.

Don't do it, be the change you want to see in the world, do the right thing.

Java 17 is the right thing to do in 2022.

My friends, I don't think I need to go on about why Java 17 is an appropriate choice, or Java 17 or later is an appropriate choice, but just, if nothing else, just judging by the version number alone, I think it's fair to say that Java 17 is more than twice as good as Java 8.

重点在最后一句话,好像没毛病

接着讲了自定义 banner 的改动,Spring Boot 3 不支持图片格式的自动转换了,但是纯文字不影响,主要是用的人少,也出于性能考虑

后面主要是 Spring Native 相关,如何通过自定义 actuator 接口让 K8s 的 Liveness 和 Readiness 感知,从而使应用保持健康状态

Spring Native 我也尝试过,build 的时候 CPU 和内存全部跑满,花费一分多钟打包 Docker 镜像,仅仅是一个 Hello World,但是启动确实很快,内存占用也很低(和 Spring Boot Jar 相比),但是要在云原生这块打得过 Go,还要再下点功夫,Go WEB 应用的内存占用 + 静态编译 + Docker 打包一套组合拳确实很舒服,有不同意见以你的为准

最后介绍了下 Graphql,这个很早就听过但其实没实际用过,心血来潮时再来研究一番,只是第一感觉就是数据的权限粒度问题,别的用户会不会访问到不应该看到的数据,后面用到再详细学习


day 2

Idiomatic Kotlin, by Anton Arhipov

主要是介绍了一些常见的用错的 Kotlin 写法,也不能说错,只是要怎样写才会更地道显得专业,好比英语母语者说东西喜欢中间加个 you know 或者 I mean,非母语者一般不会这样说,但是可能在口语中加上就会显得地道

作为有过多门编程经验的开发者,有时确实会先入为主,把之前用过的语言的写法用到新学语言上,能跑,但是就是显得不专业

好多编程语言要解决的问题一样,只是实现的过程不同,或者有自己的专有名词,比如做 WEB 开发,Spring 里的 AOP,在 Python 里面叫装饰器,在 Go 里叫中间件,不能说完全一致,只能说大部分要实现的功能都是相同的

做 Go 开发的时候,很容易将 Java 的面向对象的思维去做,遇到问题,什么都不说先创建一个类,但是 Go 不是完全面向对象,虽然可以实现面向对象,所以有时候开发前有必要好好过一遍官方文档,要怎么写才能更加 "Gopher"

Stories of Building a Remote Development IDE, by Matt Ellis

主要介绍了远程开发和实现这个功能的心路历程

这个远程开发是代码、系统资源等等全在云端,演示里是用 AWS,国外企业用 AWS 较多,目前我也还没尝试过,国内一兆小水管能干啥?

远程开发会带来一个问题,调试的时候如何访问 localhost?解决方法是在服务器上进行端口转发,通过访问服务器的相关端口

还有介绍 Code With Me 的功能

这个实现远程开发的功能的架构,有点像 MMORPG

Evolving JUnit 5, by Marc Philipp

老实说,对 JUnit 的研究不多,所以对于视频的东西好多都是非常陌生,留下的印象也不深(是我个人问题,视频演示很好)

Project Loom: Revolution in Concurrency or Obscure Implementation Detail?, by Tomasz Nurkiewicz

其实很多概念都和其他语言的协程相似,Java 里叫虚拟线程,是一个开发中的功能,需要加参数才能尝试,JDK 19

1
java --enable-preview

从用户线程讲到内核线程,在 Java 的早期版本中,JVM 自己实现了一套调度器,那时计算机还不是非常普及,一般是单核 CPU,但 Java 也能实现多线程的效果,这种是多对一的模型,也叫绿色线程,绿色线程并不依赖底层的操作系统,线程的调度都发生在用户空间

在多核的环境下,这种多对一的模型就不能发挥优势了,从实现的效果来说,绿色线程实现的是并发不是并行,因此出现第二种模型

多对多模型,一堆用户线程对应一堆内核线程,也是由 JVM 进行调度,用得不多

随着 JVM 和操作系统的日渐成熟以及计算机的发展,最后出现的是一对一模型,一个用户线程对应一个内核线程,而在一般情况下,Linux 系统会将线程看作进程(其他系统不是),所以线程的创建是比较耗费系统资源的(默认 1M)

Java 里的虚拟线程,主要由三部分组成:

  • Virtual thread:非常轻量的用户线程(相当于其他语言的协程、或者 Task)
  • Carrier thread:JDK 19 前的 Java 线程,对应着一条内核线程,虚拟线程 pin 在这里进行处理
  • Continuation:一堆可以被暂停的代码,当在方法中暂停,再执行,不会从头执行方法,而是在暂停处接着执行(PPT 原文:A piece of code that can be paused, at almost no cost)

有种 IO 多路复用的感觉

虚拟线程和普通线程的用法基本一样,但是线程池可以免了,因为可以创建非常多的虚拟线程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Thread t = Thread.startVirtualThread(() -> {
System.out.println("Hello World");
})

Thread t = Thread
.ofVirtual()
.name("MyThread")
.unstarted(() -> task());

ExecutorService es = Executors.newVirtualThreadPerTaskExecutor();

ThreadFactory factory = Thread
.ofVirtual()
.factory();

JavaFX for Mobile Development, by Gail Anderson

主要介绍 JavaFX 和 Gluon,但是已经偏了 WEB 这条路了,所以没有太认真听

刚学 Java 时倒是做过一些 GUI 应用,也写过 Android,最后还是回到了 WEB

找机会重新看一遍


最后附上原视频(科学):

day 1

Agenda:

0:00 – Countdown
0:53 – Introduction
4:35 – Keynote: Surviving Open Source, by Donald Raab
1:01:27 – Let’s Set Sail With Fleet!, by Vitaly Bragilevsky
1:59:46 – Should I Upgrade to Java 17?, by Nikhil Nanivadekar
3:01:06 – Event Streaming and Processing Using Apache Pulsar, by Mary Grygleski
4:00:19 – Kubernetes Native Java, by Josh Long

day 2

Agenda:

0:00 – Countdown
0:53 – Introduction
5:49 – Idiomatic Kotlin, by Anton Arhipov
1:03:12 – Wish You Were Here: Stories of Building a Remote Development IDE, by Matt Ellis
2:01:22 – Evolving JUnit 5, by Marc Philipp
3:01:18 – Project Loom: Revolution in Concurrency or Obscure Implementation Detail?, by Tomasz Nurkiewicz
4:02:37 – JavaFX for Mobile Development, by Gail Anderson