The Pragmatic Engineer

The programming language after Kotlin – with the creator of Kotlin

104 min
Feb 12, 20262 months ago
Listen to Episode
Summary

Andrei Breslav, creator of Kotlin, discusses the journey from designing Kotlin at JetBrains to its massive adoption after Google's Android announcement, and his current work on CodeSpeak, a new programming language built on English for the AI era. The conversation covers language design principles, the challenges of Java interoperability, and how AI is transforming software development.

Insights
  • Programming language success often depends on platform adoption - Kotlin's breakthrough came when Google made it official for Android development
  • Building language interoperability is exponentially more complex than it appears, requiring years of engineering effort and careful compatibility management
  • AI coding agents create a communication paradox: developers express intent in human language to machines but communicate with teammates through generated code
  • Future programming languages need to preserve human intent and decision-making rather than automating everything away
  • The most successful language features often come from pragmatically borrowing proven ideas from other languages rather than inventing new concepts
Trends
AI-powered programming languages that use natural language as primary interfaceShift from code review to test verification as primary quality assurance methodIntegration of developer tools with AI agents becoming standard practicePreservation of human intent layer in AI-generated code becoming criticalProgramming languages designed specifically for human-AI collaborationAutomated testing becoming more important than manual code reviewDeveloper productivity tools focusing on AI-native workflowsEssential vs accidental complexity distinction becoming more important in software design
Companies
JetBrains
Company where Kotlin was created and developed, known for IntelliJ IDEA and other developer tools
Google
Made Kotlin official language for Android development at Google I/O 2017, dramatically increasing adoption
Oracle
Acquired Sun Microsystems and sued Google over Java usage, creating Android development constraints
Borland
Andrei's first job working on developer tools before the company went under
Microsoft Research
Where Andrei did an internship in Redmond while deciding whether to pursue Kotlin development
Twitter
Major early adopter of Scala programming language for large-scale backend systems
LinkedIn
Another major company that adopted Scala for backend development at scale
OpenAI
Uses WorkOS for enterprise authentication and security infrastructure
Cursor
AI-powered code editor mentioned as example of integrated AI development environment
Sonar
Sponsor providing code quality and security verification tools for AI-generated code
People
Andrei Breslav
Creator of Kotlin programming language, now working on CodeSpeak natural language programming
Max Shafirov
JetBrains colleague who worked closely with Andrei on early Kotlin design and whiteboarding
Roman Elizarov
Suggested null safety feature for Kotlin and later became project lead for the language
Dmitry Zhemyov
Engineer who refactored Kotlin compiler infrastructure and suggested the Kotlin island name
Martin Odersky
Creator of Scala programming language, praised as great language designer who influenced Kotlin
Tony Hoare
Computer scientist who called null references the 'billion dollar mistake' in programming
Ross Tate
Type theory expert from Cornell who helped design Kotlin's Java interoperability type system
Chris Lattner
Referenced as someone the host previously interviewed about programming language design
Quotes
"We didn't do it because it was easy, we did it because we thought it was easy."
Andrei BreslavEarly development
"If someone offers you a job to create a system that interoperates transparently with another huge system you don't control, ask for a lot of money."
Andrei BreslavJava interoperability
"Nothing limits the imagination of a programmer like a compiler."
Andrei BreslavDynamic vs static languages
"You're talking to a machine in human language, but the way you communicate with your team is the machine language - that's kind of backwards."
Andrei BreslavAI coding agents
"In the future, humans will be as smart or as dumb as they are today. If we have incredibly smart models, what we will be doing is constrained by how humans are."
Andrei BreslavFuture of programming
Full Transcript
4 Speakers
Speaker A

Why would anyone create a new programming language today if AI can already write most of your code? Andrew Bresla has an interesting answer. Andre is the creator of Kotlin, a language that runs on billions of Android devices and is one of the fastest growing languages in the world today. We cover how Andrew designed Kotlin by deliberately borrowing ideas from Scala, C and Groovy, and why he considers leaving out the ternary operator one of his biggest regrets. Why making Kotlin interoperate seamlessly with Java was a gigantic undertaking and what it.

0:00

Speaker B

Took to get it done.

0:28

Speaker A

How Kotlin adoption went through the roof after after Google announced it making it the official language for Android, in a move that even took Andrea and the Kotlin team by surprise. Andrew's new project, CodeSpeak, a new programming language built on English, designed for an era where AI writes most of the code. If you're interested in the future of programming languages from someone who built one of the most loved languages of today, then this episode is for you. This episode is presented by statsig, the unified platform for flags, analytics, experiments and more. Check out the show notes to learn more about them and our other seasoned sponsors, Sonar and Workos. Andrei, welcome to the podcast.

0:29

Speaker C

Hello. Thank you for having me.

1:04

Speaker B

It is not often that I meet someone who designed such an influential language across mobile, across backend.

1:07

Speaker A

So let's start with how did it all start?

1:16

Speaker D

Okay, so that was a little messy because I went to school back in St. Petersburg, studied computer science and I didn't really know exactly what kind of programmer I wanted to become.

1:19

Speaker C

I knew I wanted to, to be a programmer. And then, you know, at some point.

1:32

Speaker D

While I was still in the university, I started teaching programming at school and you know, it was a big passion hobby of mine. And then at some point I got a job with Borland and worked in some developer tools. You know, that was awesome. Like Borland was a very big name and you know, they, they went under pretty soon after I joined and I hope it's not because of me. Yeah, but, but I worked on the.

1:36

Speaker C

It was at the tail end of the UML era, so we were doing.

2:00

Speaker D

Some developer tools in the UML space.

2:04

Speaker C

That was very interesting.

2:07

Speaker D

I learned a lot. But then Borland went under and I.

2:08

Speaker C

Went back to teaching full time and.

2:12

Speaker D

Then I started PhD school and you know, all that was kind of not really planned out. And in my PhD I was working on domain specific languages and generally I was interested in languages.

2:13

Speaker C

It was something I was curious about. And specifically typed languages were interesting.

2:26

Speaker D

I Was always curious about how these.

2:31

Speaker C

Things worked, but never really serious.

2:34

Speaker D

When I started looking into DSLs, it was slightly more serious, although my PhD was a mess and I never defended because of that.

2:37

Speaker C

But at some point someone reached out. It was actually a person who was in charge of the Orleans office in St. Petersburg.

2:45

Speaker D

And by that time he was already.

2:53

Speaker C

At Jetbrains and he reached out to.

2:54

Speaker D

Me while I was in Tartu in Estonia. I was there for a year as a visiting PhD student. It was a lovely time. So he reached out and invited me to. When I next visited St. Petersburg to visit the Jetbrains office there and talk about something about languages, what I thought.

2:57

Speaker C

Was that it was about this project.

3:16

Speaker D

Called MPS Metaprogramming system that Jetbrains had.

3:19

Speaker C

I knew about it, it's about DSLs.

3:22

Speaker D

I worked on DSLs. You know, it was generally something like plausible that they would be interested in talking about something like that.

3:24

Speaker C

But it turned out I was completely wrong and what they wanted was to.

3:32

Speaker D

Start a new programming link. And I was completely unprepared for that. Like I, you know, I never thought about doing something like this.

3:37

Speaker C

And my first reaction was you don't.

3:48

Speaker D

Do a new language, like you don't need it. And the basic pitch was that the.

3:50

Speaker C

Java ecosystem needs a new language.

3:56

Speaker D

Java is outdated, so on, so forth. We can talk a little more about this.

3:58

Speaker C

It was 2010, I think.

4:01

Speaker D

Yeah, 2010, yeah.

4:03

Speaker C

And I was like, but there are.

4:07

Speaker D

Other languages, like everybody's doing fine, why do you need to do that?

4:09

Speaker C

And then this conversation was actually a.

4:12

Speaker D

Very insightful one because the guys at.

4:14

Speaker C

Jetbrains, they simply explained to me how the things actually were. And it was a big problem by that time. So Java didn't really evolve and hadn't.

4:17

Speaker D

Been for a long time.

4:31

Speaker B

What was the reason behind it? Can you take us back for those of us who are not in the ins and outs?

4:32

Speaker C

Yeah. So the last major version of Java by 2010 was Java 5 that was released in 2004.

4:37

Speaker B

Ooh, six year old language.

4:47

Speaker D

Yeah. And since then there were updates. There was Java 6 that made no.

4:49

Speaker C

Changes to the language at all. And then there was Java 7 that made minor changes in parallel.

4:54

Speaker D

There were things that were happening in other languages. Especially C was progressing very well and by 2010 C had all the nice things.

4:59

Speaker C

There already were lambdas like HARO functions.

5:09

Speaker D

And all that nice stuff. There were getters and setters and many other things that made the language much nicer. And Java felt like it was standing still and there was a project to work on Lambdas for Java. But that was in the works and had been in the works for a long time and only came out in 2014.

5:13

Speaker C

So that was the situation and you.

5:35

Speaker D

Know, the ecosystem didn't stand still in the sense that other people were building languages. And there was Scala, there was Groovy.

5:37

Speaker C

And of course people at Jetbrains knew.

5:45

Speaker D

Both Scala and Groovy. They built tools for them.

5:47

Speaker C

It's traditional to build your tools in.

5:49

Speaker D

The language you're building the tools for. So the Scala plugin was built in Scala and there was a lot of.

5:52

Speaker C

Groovy use at Jetbrains as well. So they knew what the issues were with the language.

5:57

Speaker D

And both languages are very interesting and very good in their own ways, but.

6:02

Speaker C

They saw an opportunity in the market because basically Groovy was too dynamic and too far from hardcore mainstream large scale.

6:07

Speaker D

Production, because dynamic languages are not for that.

6:16

Speaker B

Basically what are dynamic languages for? What are their strengths and best use cases?

6:20

Speaker C

So the trade off, I guess if.

6:26

Speaker D

You look at a statically typed language like Java and Kotlin and Scala for example, versus dynamic languages like Python and Ruby and JavaScript and groovy in dynamic.

6:28

Speaker C

Languages, it's very easy to start and build something working very quickly because basically.

6:41

Speaker D

The language is not in your way as much.

6:46

Speaker C

There's this saying that nothing limits the.

6:49

Speaker D

Imagination of a programmer like a compiler. This may be changing nowadays a little bit.

6:51

Speaker C

And this is in the part what.

7:00

Speaker D

I'm working on now, but back in.

7:02

Speaker C

The day was completely true. You know, the whole art of making good language was to restrict the user.

7:05

Speaker D

In a good way.

7:13

Speaker C

Yeah, but in any case, the situation with dynamic languages is that they are.

7:15

Speaker D

Much more user friendly in the beginning.

7:20

Speaker C

But then when the project scales, you have trouble making large refactorings, you have trouble making sure that everything works together.

7:23

Speaker D

You need to do a lot more testing and rely on other things like.

7:31

Speaker C

That, as opposed to static languages where.

7:35

Speaker D

You have precise refactoring tools and other.

7:37

Speaker C

Things that can make sure that at.

7:40

Speaker D

Least a certain class of problems just doesn't happen. And this is why, at least in our mind back then, it was absolutely.

7:42

Speaker C

Clear that if we're building a language.

7:51

Speaker D

For large projects, big teams, so and so forth, it has to be a static link.

7:53

Speaker B

Static one. Yes.

7:58

Speaker C

Yeah. So with Groovy, that was a big.

8:00

Speaker D

Issue performance as well, because Groovy was building a dynamic language on top of a very static runtime. So there was quite a bit of tension there.

8:02

Speaker C

So that was on the groovy side.

8:12

Speaker D

And the Scala side, Scala is a wonderful static language and incredibly powerful and with tons and tons of good ideas.

8:13

Speaker C

But it had its own problems. It relied very heavily on implicits, for.

8:22

Speaker D

Example, and I have a history of debugging one line of Scala for an hour to try and figure out what it does, just because it was pretty complicated.

8:25

Speaker C

And also the compiler was very slow.

8:35

Speaker D

And there were issues of stability and many, many things were just not accessible.

8:37

Speaker C

Enough for a lot of engineers. So from the experience of using Scala Jetbrains, my colleagues basically understood that it's not what's going to change the industry.

8:42

Speaker D

Although Scala got a lot of adoption and again, like, Martin Endersky is a great language designer, you know, and I.

8:53

Speaker B

Think one of the biggest use cases was old Twitter. A lot of it was built on Scala and they scaled to, however, you know, massive scale, et cetera, and I.

9:01

Speaker D

Think LinkedIn as well. Yeah.

9:10

Speaker C

So in any case, these were, you.

9:12

Speaker D

Know, it's always very nice when other.

9:14

Speaker C

Languages kind of pioneer things and then you can build on top of their successes and failures.

9:16

Speaker D

And we were in that position, basically.

9:24

Speaker C

So the argument that people at JetBrains were making was basically that there is a window of opportunity, people need this language. We, Jetbrains are the company who can actually put out a language and make.

9:26

Speaker D

It successful because we have access to.

9:41

Speaker C

The users, we have their trust, we can make good tools. And it was another issue with Scala.

9:43

Speaker D

For example, very difficult to build tools for Scala back then. Now Scala 3 is more tooling friendly, but back then it was a nightmare. Like I said that if you have a static language, you can't have precise refactorings if the language is not too complex. And some languages are particularly challenging. So Scala back then and C were incredibly challenging to make precise tools for.

9:48

Speaker C

And that was the basic bitch. And I quickly understood that, yeah, they were right.

10:12

Speaker D

And this was something that was worth.

10:19

Speaker C

A shot in the sense that it.

10:22

Speaker D

Was not completely hopeless, not completely dead in the water. I had no idea if we could pull it off.

10:24

Speaker C

It was then when we actually sketched.

10:30

Speaker D

Some initial features on the whiteboard. Just because Jetbrains is generally run by engineers.

10:33

Speaker A

Hold that thought from Androy on how Jetbrains is genuinely run by engineers. This is because I happen to know another company also run by engineers. Sonar, our season sponsor. If there's a time when we need true engineers, it's now. As AI coding assistants change how we build software, code is generated faster than before. But engineering basics remain important. We still need to verify all this new AI generated code for quality, security, reliability and maintainability. A question that is tricky to answer. How do we get the speed of AI without inheriting a mountain of risk? Sonar, the makers of sonarqube has a really clear way of framing this Vibe. Then Verify. The Vibe part is about giving your teams the freedom to use these AI tools to innovate and build quickly. The Verify part is the essential automated guardrail. It's the independent verification that checks all code, human and AI generated against your quality and security standards. Helping developers and organizational leaders get the most out of AI while still keeping quality, security and maintainably high is one of the main themes of the upcoming Sonar Summit. It's not just a user conference, it's where devs, platform engineers and engineering leaders are coming together to share practical strategies for this new era. I'm excited to share that I'll be speaking there as well. If you're trying to figure out how to adopt AI without sacrificing code quality, join us at the Sonar Summit to see the agenda and register for the event on March 3rd. Head to sonarsource.compragmatic sonarsummit so everybody I.

10:39

Speaker C

Talked with were deeply in the weeds with IDs and everything and new programming.

12:06

Speaker D

Languages very well, and we had a very technical discussion.

12:11

Speaker C

So I don't remember exactly all of the features we're talking about, but the current syntax for extensions in Kotlin was.

12:15

Speaker D

Already there and I don't remember why exactly we focused on extensions, but it was there.

12:24

Speaker C

So you know, from day one we're.

12:31

Speaker D

Basically building on top of ideas from other languages. Like extensions obviously came from C. Yeah.

12:33

Speaker C

So it was a very exciting conversation, but I didn't make a decision then.

12:38

Speaker D

Because I was in Tartu and I needed to finish there and it took me a few months to finish. And then I came to St. Petersburg for one month because after that I had an internship scheduled with Microsoft Research in Redmond. So I was going to Seattle to stay there for like three and a.

12:44

Speaker C

Half months and I was like, okay.

13:01

Speaker D

Guys, so I have this month I can work in the office and we can try to sketch things, but then I'm going to Microsoft and then I will decide whether I commit or not.

13:03

Speaker C

Which in hindsight I mean, well, I.

13:11

Speaker D

Made the right decision in the end. I had a great time for this month or so. I worked with the guys in the office. It was mostly Max Shafiroff we were working with, and it was incredible. We had such great discussions and I actually saw Max this morning and it was like it was great time.

13:16

Speaker C

So then I went to Seattle, did something completely different there.

13:39

Speaker D

Microsoft researchers saw really great researchers working there. Actually was exposed to like the top notch level of academia for the first time. Was very insightful.

13:42

Speaker C

But after that I kind of realized.

13:56

Speaker D

What the question was whether I want.

13:58

Speaker C

To serve, try to pursue an academic career, which I didn't feel like I was really built for that and was not sure whether I can be a.

14:00

Speaker D

Good researcher on my own or I'll have to follow in somebody else's footsteps versus do a crazy thing and build my own language here I'm like, okay, I'm doing the crazy thing.

14:11

Speaker B

So for those of us engineers, which will be the majority who have not built a language from scratch, how do you start with it? We know, speaking for myself, I know how to write code, I know how to open editor, I know how to write hello World and a more complex app and even more complex one. How does a language start?

14:25

Speaker C

In our case, we basically talked a.

14:42

Speaker D

Lot for a few months. So I think not everyone is like that, but I think the best when I'm talking to people. And this was the ideal environment because we were basically discussing things with Max constantly for many months. And there were a few presentations internal that I made at Jetbrains and some of the slides survived. So I can see, including my spelling mistakes in the slides, my English wasn't as good then and you can see some of the evolution through those slides. And I think there's a recording of one of those presentations. So we were basically doing whiteboard design for some time. And the great thing about doing this at Jetbrains was that there were a.

14:46

Speaker C

Lot of people with opinions about not so much how to make a language.

15:32

Speaker D

But what problems do programmers face and what they like and don't like in other languages.

15:37

Speaker C

So I had tons and tons of.

15:43

Speaker D

Input from other people and very good people.

15:45

Speaker C

So that helped. And I really, I don't think I.

15:49

Speaker D

Realized how special that environment was back then. I was 26, to be clear, and I had no idea how things were done in general. But somehow these people just trusted me. I'm not sure it was very rational on their part. It worked out, but I'm not sure I would recommend anyone to do this.

15:52

Speaker B

And so in the first few months, do I understand that you kind of whiteboarded and you kind of wrote down how you want this language to evolve. You kind of wrote out like we're going to have these features or how can we imagine?

16:15

Speaker C

I guess the easiest way to explain this would be like this, we basically went off what the pains were with Java, and there were quite a few.

16:26

Speaker D

And there was a lot of experience of using Java across the community and inside Jetbrains.

16:35

Speaker C

And we kept making lists of things we wanted to fix.

16:41

Speaker D

And I came up with some ideas and some other people suggested other ideas about how things can be fixed and what is an actual problem and what we don't care about, and so on and so forth.

16:44

Speaker C

And for some time I was just pieces of the puzzle basically laid out on a table without fitting together.

16:54

Speaker D

And then at some point we started.

17:00

Speaker C

Fitting them together and I was just doing a lot of that in my head, which is not the best way.

17:01

Speaker D

But this is how I knew how to do it. There were also some crazy ideas that we thought were important back then. For example, I wanted to implement multiple inheritance, fully fledged multiple inheritance, which was a dumb idea.

17:08

Speaker B

Multiple inherits, meaning that a class can inherit from like several multiple classes.

17:22

Speaker D

Multiple class, yeah.

17:26

Speaker B

And you have to take care of like conflict resolution and all sorts of edge cases, right?

17:27

Speaker D

Yeah.

17:31

Speaker C

So the actual challenge is not so.

17:32

Speaker D

Much conflict resolution in terms of methods, but initialization of state constructors are really hard. And it was actually someone outside the jibbrands who explained to me that was a very bad idea. And I'm very grateful to them.

17:34

Speaker C

Yeah.

17:47

Speaker D

So, you know, there were crazy ideas.

17:47

Speaker C

As well, and some of them just.

17:49

Speaker D

Fall off over time as we were discussing or prototyping.

17:52

Speaker C

And I think I started writing code.

17:56

Speaker D

Maybe six months in or something like that, maybe a little earlier than that.

17:59

Speaker C

And I started with a parser, and it was actually, it was also a very unique way to start a language, because the idea was to start not with a compiler, but with an IDE plugin.

18:03

Speaker D

I have it in the editor first.

18:15

Speaker C

Which is, you know, an IDE plugin.

18:18

Speaker D

Shares a lot with the front end of the compiler.

18:20

Speaker C

So it's not absolutely crazy.

18:22

Speaker D

But I was just relying a lot on the infrastructure that was available in IntelliJ IDEA, so all the parsing infrastructure, and it was awesome. Like parsing infrastructure, IntelliJ idea is better than anything else in the world because it's the heart of the ide. It has to be incredibly fast and very robust and so on. But then later, someone who knew the infrastructure a lot better than I do had to factor that bit out to make the Kotlin compiler autonomous. And it was Dmitry Zhemyov who did that. And he's an awesome engineer. He's probably one of the best people to refactor a large code base and then take this one bit out of something that was already 10 plus years old back then.

18:25

Speaker C

So we started with this IDE plugin.

19:05

Speaker D

I think Max wrote the scaffolds and I actually plugged in the parser and everything.

19:07

Speaker C

And that was an interesting story because it was very interactive so I could show off the language as if it existed because it had some tooling.

19:12

Speaker D

But I couldn't compile anything in the very beginning.

19:22

Speaker C

And that was actually a very good.

19:25

Speaker D

Way to experiment with the syntax. But then soon after I started working on a fully fledged front end and on some translation and Dmitry and Alex Kachman were working on the backend. Everybody was part time.

19:27

Speaker B

When you say you work on front end, they work on backend in a language context. What does that mean?

19:40

Speaker D

It's slightly different in different languages, but basically the front end is what deals.

19:44

Speaker C

With the syntax and with the checking.

19:49

Speaker D

And understanding what the program means. And the backend is what translates to the executable code. In our case, the front end is like reading the text and parsing and doing types and all that. And the backend generates Java bytecode. And Kotlin has multiple backends for different target languages. Like we have Java backend, we have a native Backend for our iOS and other native platforms and JavaScript backend WASM backend.

19:52

Speaker C

At that time nobody was full time.

20:20

Speaker D

Working on this project. Even I was part time PhD student and part time Kotlin developer. And it was like the very early days. And then at some point I gave up my PhD and focused 100% which.

20:22

Speaker C

Was also like, isn't it a weird.

20:34

Speaker D

Decision to start a new language part time?

20:37

Speaker C

Yeah. Looking back, I was young and stupid. Yeah.

20:40

Speaker B

There's a saying that we didn't do it because it was easy, we did it because we thought it was easy.

20:44

Speaker C

Absolutely.

20:48

Speaker D

That I didn't realize how hard the problem was. I also had an unreasonable amount of hubris. I just thought I knew how to do everything. I didn't. But it worked out in the end.

20:48

Speaker B

So when the language started, what did you call it internally? There's always internal code names, right?

21:03

Speaker D

Right. Yeah.

21:08

Speaker C

So I don't think there was a.

21:09

Speaker D

Discussion of this first name at all. It was generally understood that the language will be named Jet and it was logical. So we had all the code base was using the name Jet or we had a Jet parser and Jet editor or whatever, Jet highlighter, something like that. And then someone realized that the name was trademarked by someone else and it.

21:10

Speaker C

Was actually people we know.

21:36

Speaker D

There in Novosibirsk in Russia, doing something. It's not a language, but it's a compiler and we couldn't use it. And this is when we started looking for another name.

21:38

Speaker C

It was very painful, like looking for names. Guys, this is so bad.

21:49

Speaker D

It's one of the worst things because you never know what name will work unless you want to do like an extensive study. And then all the good names are taken, of course.

21:55

Speaker C

And then some of the names that.

22:05

Speaker D

Are not taken are not taken because they're not really Googleable. And, you know, some people are just very brave people who named their language Go. This is why people now call it Go Laying, because otherwise you can't identify it. It's a verb in English in a very common way. Yeah. So we had weird options and in one of my old presentations, I found a list of early names and we had Robusta there as a flavor of coffee. And we had up, for example, or G or something else like that. And those weren't great. By that time, other languages were popping up. And one of the alternative languages was called Ceylon. And the logic was that Java was the island of coffee and Ceylon was an island of tea. And Dmitry Zhemirov basically looked out of the window and said, okay, we have an island here in St. Petersburg in the Gulf of Finland. There's a big island called Kotlin. And it's a good name in the sense that it's very Googleable. Nobody uses it for anything.

22:06

Speaker C

It's very recognizable. It's not super smooth for many languages.

23:11

Speaker D

But it's kind of okay. Nobody was in love with that name.

23:15

Speaker C

And we were kind of hesitant. And, you know, Kot means a bad thing in German. And also there is like some. Some negative connotation in Mandarin, I was told, or something like that. And, you know, it's always some language.

23:20

Speaker D

Has some nasty association with any word. And we basically were super hesitant. So when we announced and we had this deadline, so we were basically putting this off.

23:32

Speaker C

When we announced, we were still not sure. So we decided it would be a codename.

23:42

Speaker D

We called it Project Kotlin to have a wiggle room to later replace the name. But it stuck. The first thing we did, we put out basically a Confluence page with a description of a language. It was just a bunch of wiki pages. And there was no compiler available, no nothing. And there, you know, the word Kotlin appeared many, many times. And I was like, my God, this thing doesn't. Like, I can't do search and replace and then change the Name everywhere. So the workaround that I came up with was create an empty page called Kotlin. And so it has a name and then everywhere else you mention it as a page. And when you rename a page, it gets renamed everywhere. So this is why there was an empty page called Kotlin in that documentation. But yeah, the name stuck and it turns out to be not a bad name.

23:48

Speaker B

So when it started, what were the main differences with Kotlin compared to Java? Because Java was the big one. How did you explain to developers who initially started to onboard or wanted to give it a go?

24:36

Speaker C

Yeah, I guess there were a few major selling points and then there were.

24:48

Speaker D

Other things on top of that.

24:53

Speaker C

When we started, like in the very.

24:55

Speaker D

Beginning, we didn't have null safety in mind. Null safety came a little later after one of the internal presentations. It was Max Shafirov who invited Roman Yelazarov, who later was the project lead for Kotlin. And Roman came and listened to the presentation, gave some feedback and said, guys, if you want to do something really big for enterprise developers, figure out null safety. And we did. And it took a while.

24:57

Speaker C

So in the very beginning, it was.

25:24

Speaker D

The general idea of what makes Java feel so outdated. And there were a bunch of things, lambdas were very big.

25:26

Speaker C

The general, like the general feeling from.

25:37

Speaker D

Java back then was it was very verbose. It was called the Ceremony language. You know, a lot of people were grumpy about too many keywords like public, static, void, main is something everybody was really grumpy about. But also, you know, there were getters.

25:40

Speaker C

And setters for every property.

25:54

Speaker D

There were constructors and overloads and all that stuff that looks like boilerplate. Because it is.

25:56

Speaker B

Yeah, it's super annoying to type out.

26:03

Speaker D

Yeah.

26:06

Speaker C

And, you know, the problem with boilerplate.

26:06

Speaker D

Is on the one hand, it's annoying to type out, but tools can generate it for you, unfold it, and so on, so forth. But the bigger problem is always readability.

26:08

Speaker C

So reading is more important.

26:18

Speaker D

Reading code is more important than writing code.

26:20

Speaker C

We do a lot more of that. And with boilerplate, it's terrible because if some tiny thing is different in the.

26:22

Speaker D

Middle of completely standard boilerplate code, you'll miss it.

26:31

Speaker C

You become blind to it, and you.

26:34

Speaker D

Can debug for days not seeing that.

26:36

Speaker C

So, you know, that was the point.

26:39

Speaker D

Of sort of modernizing Java, making Java programs be more about what they do and less about the ceremony of making the compiler happy, basically.

26:41

Speaker C

And, you know, type inference was also.

26:54

Speaker D

A big thing because Java was repeating types a lot and Many other things like that were like semicolons. You know, the modern languages of the time already got rid of semicolons.

26:55

Speaker B

And so in Kotlin you also got rid of it.

27:07

Speaker D

Yeah, so we got rid, basically in terms of syntax, we got rid of semicolons and duplicated types. And that was a lot of noise across the code.

27:09

Speaker B

What does it mean that Java had duplicated types?

27:20

Speaker C

Yeah, so in that version of Java.

27:23

Speaker D

When you declare, say, a local variable.

27:26

Speaker C

You say it's a list of string called strings equals new arraylist.

27:29

Speaker B

Oh yes, I remember this one. Yes, yes. You need to type it out twice and if you get one of them wrong, compile error, etc.

27:33

Speaker D

Right, so.

27:39

Speaker C

And at best you could omit the.

27:40

Speaker D

Second mention of string by using a diamond operator. But that only came later. Basically it was very verbose, especially if your types are long. If it's just a list of string, it's sort of not so bad. But if it's a map from something to a list of string, for example, that's already really long and you don't want to read that.

27:42

Speaker C

And a bunch of things like that.

28:03

Speaker D

Were really annoying to a lot of people, especially compared to C or Scala.

28:04

Speaker C

So we did all of that. And then on top of that, there.

28:10

Speaker D

Were other value add features and null safety was a big thing that we spent multiple years actually on implementing.

28:15

Speaker C

And I think it's one of the.

28:24

Speaker D

Main differentiating factors now for Kotlin, alongside with extensions and other things. But null safety is one of the core features.

28:25

Speaker B

And can we just spell out why null safety is so big? I mean, just today I came across a bug on the I couldn't send a package because in JavaScript in the Dutch post website, there's a null issue happening in production, but before Kotlin and a lot of languages. Why is it such a big problem?

28:33

Speaker A

It is, yeah.

28:54

Speaker D

So dealing with null references is a big hassle in most languages. And I think it was Tony Hoare who called it the billion dollar mistake at some point, because like introducing. I think it was about introducing null pointers to C or something.

28:56

Speaker C

So basically when we look at all.

29:17

Speaker D

The runtime errors that we have in Java code, I think null pointer exceptions will be at the top.

29:19

Speaker C

You know, the type system of the.

29:25

Speaker D

Language is supposed to protect you from those unexpected errors. So there are errors you're designed for and maybe errors that are not even your fault, like file system error or something like that, but there are also errors that should be prevented by the compiler. So, for example, classcast exception or missing method error, for example, are things that the compiler is trying to protect you for. It's trying to make sure that this never happens in your program unless you switch off the check by making an influence or something.

29:27

Speaker C

Yeah, and with nulls, it's not a.

29:59

Speaker D

Thing in Java, like anything can be null, and if it's null, it will just fail.

30:01

Speaker B

Yeah, it throws an exception and program dies.

30:05

Speaker D

It's a very common thing.

30:08

Speaker C

So a lot of people are kind.

30:09

Speaker D

Of used to it and there are different ways of being disciplined about it, and so on and so forth. But basically this is a plague across any code base.

30:11

Speaker C

There are different approaches to this, and in Kotlin we took the approach of.

30:22

Speaker D

A enforcing it in the type system, but also making it free at runtime.

30:26

Speaker B

What does that mean? That you made it free?

30:32

Speaker C

So one very common way of dealing.

30:34

Speaker D

With nulls is to use something like an option type, where you have a.

30:37

Speaker C

Box which might be empty or might.

30:41

Speaker D

Have an object in it, and that box is not free. Like you have to allocate it, you have to carry it around everywhere.

30:44

Speaker C

And you know, this easily creates a.

30:51

Speaker D

Lot of objects in the old generation.

30:54

Speaker C

For the garbage collector, so can be challenging. And what we did was just have.

30:56

Speaker D

A direct reference at runtime. Our nullable or not null reference is the same as Java's reference.

31:01

Speaker C

All we do is compile time checking.

31:08

Speaker D

And some runtime checking when we cross the boundary. But that's a lot cheaper than allocating objects, although, you know, the runtime is getting better and they kind of can optimize some of those objects away. But still, it's an overhead.

31:10

Speaker B

What are features that you took in from Kotlin that were inspired by other languages that you admired?

31:24

Speaker D

A lot of them. I have an entire talk about this. It's called shoulders of Giants, and we really learned from lots and lots of languages, and it was always the point.

31:30

Speaker A

Andrej just mentioned how Kotlin was built on top of the shoulders of giants, taking good ideas that existed, not reinventing them. This was one of the reasons Kotlin succeeded as much as it did. But jumping forward from 2010 to 2026, one thing that is totally different today is the speed of things. AI is allowing nimble teams to build faster than ever before. Companies that used to take years to move into the enterprise are doing it in months. This speed creates a new problem. Enterprise requirements Authentication, security access controls show up almost immediately. This is where Work OS, our seasoned sponsor, comes in. WorkOS is the infrastructure layer that helps AI companies handle that complexity without slowing down. SSO for enterprise buyers, MCP AUTH for agentic workflows, even protection against free trial abuse with radar teams like OpenAI, Cursor, Perplexity and Vercel rely on Workerwas to power identity and security as they scale. If you're building AI software and want to move fast and meet enterprise expectations, check out workerwas.com with this. Let's get back to Andrej and how Kotlin was standing on the shoulders of giants.

31:41

Speaker D

So the slogan for Kotlin was Programmatic language for industry.

32:44

Speaker C

And the pragmatic bit, which is a.

32:48

Speaker D

Nice, sort of nice rhyme with your podcast.

32:50

Speaker C

The pragmatic bit was kind of coming from the experience with Scala being called.

32:54

Speaker D

An academic language and a lot of people having trouble getting their heads around a lot of the very smart tricks in the design.

32:59

Speaker C

And so our idea was we are.

33:07

Speaker D

Not doing academic research here. We're not trying to invent anything.

33:09

Speaker C

If we don't get to invent anything.

33:12

Speaker D

It'S a good thing, not a bad thing.

33:14

Speaker C

And I think from the engineering perspective, it's generally a good idea to do this.

33:15

Speaker D

Usually you end up making something new, but most of what you're doing shouldn't be very new because you want familiarity, you want people to easily grasp what you're doing. And this has to be familiar from other languages. And also if you're taking, you know, building on top of the ideas of other languages, you have the benefit of them having tried it and you can look at their designs and their community's reactions, all that and the implications all over the place, and that gives you a huge benefit.

33:20

Speaker C

So we did a lot of that. And I think the language that influenced.

33:52

Speaker D

Kotlin the most is of course, Java, because the entire runtime of Kotlin is the jvm and we depend on that. But apart from that, Scala had a huge influence. And we used so many ideas from Scala, from primary constructors and data classes and valves and vars and all these things, and to some interesting tricks about how generics work. For example, variance declarations at variance is a great idea of Martians, and it's a huge pity that it didn't make it into Java design. It was flipped at the very end of the design process to what Java has now. And it's definitely the Martin's idea was much better.

33:55

Speaker C

We had to sort of on the.

34:41

Speaker D

Boundary modeling Java boundary. We had to fix the problem of Java having it different and figured that out. There were like many, many ideas we took from Scala and that was very Helpful.

34:42

Speaker C

And we usually. We transformed those ideas a little bit.

34:54

Speaker D

To adapt to our setting and to build on the knowledge of how it actually works in practice. And we left some things out, we simplified some things. For example, Scala had traits, and traits.

34:58

Speaker C

Are a very powerful construct where it's like an interface. And you can have method implementations in traits, but also in Scala traits you could have fields as well.

35:11

Speaker D

Properties that.

35:24

Speaker C

What you couldn't have was constructor arguments. Like you always have a default constructor.

35:26

Speaker D

And can initialize all your fields. And it's not as bad as multiple inheritance. And so.

35:33

Speaker C

But it's still a little complicated when it comes to.

35:38

Speaker D

In what order you're calling the constructors that we decided we don't want to deal with that.

35:42

Speaker C

It's a complex algorithm.

35:47

Speaker D

It's hard to explain. Let's just get rid of the state and interfaces and only have method bodies. I think it was a good compromise, especially given that Java ended up in the same place. It was easier to integrate. Yeah. So Scala was a big influence.

35:48

Speaker C

C was a very big influence.

36:03

Speaker D

Extensions, of course. And we learned quite a lot from how C compilers do things there.

36:05

Speaker C

There was also one particular trick that.

36:13

Speaker D

Makes Kotlin syntax a lot nicer. Nicer than Java's and nicer than Scala's that we learned from C. It was actually my colleague who worked on the C IDE who told me about this, which is basically a super pragmatic thing they do in C.

36:16

Speaker C

When you call generic functions, you use angle brackets inside an expression. But the thing is that there is.

36:32

Speaker D

No such thing as angle brackets. There is less and greater.

36:41

Speaker C

And the parser can easily get confused and think that this expression, since we're.

36:46

Speaker D

Not in a type context, it's an expression context. This expression is a comparison, it's not an inequality, it's not a call.

36:51

Speaker C

And this is mathematically unresolvable. It's an ambiguous grammar.

36:59

Speaker D

Yeah. Look, you can do anything about it.

37:03

Speaker C

And the way other languages handle this is Java. For example, when you're passing type arguments to a call, it has to be after dot, so you say collections. Dot, angle, bracket.

37:06

Speaker B

Yeah, the function name. Really awkward. Yeah.

37:18

Speaker C

And the way Scala deals with that.

37:22

Speaker D

They use square brackets for types, and.

37:25

Speaker C

Then arrays can't use square brackets, so.

37:28

Speaker D

They use round brackets, which is unfamiliar, like it's not the end of the world. Scala's doing fine, but still.

37:31

Speaker C

And C uses angle brackets because there's a hack in the parser that basically disambiguates ad hoc. And we did the same or Something.

37:39

Speaker D

Very similar, and it just works. And the syntax is very familiar and very intuitive, and we're very happy about that.

37:49

Speaker B

When you read it as a person, I never get confused, like, this is not a smaller sign. Like, I know it's a genesis. Yeah.

37:55

Speaker D

Most of the time it's not a practical problem. Yeah. And there is a way to disambiguate, if you like. So C was a big influence. Groovy was a big influence as well. Jetbrains used Groovy for build scripts, and there were incredibly useful patterns in the Groovy syntax that they call builders, which is not about building programs, but building objects. And this is what inspired something fairly novel that we did in Kotlin, which was Types Builders, where we had the same syntactic flexibility or almost the same syntactic flexibility as Groovy, but it was all typed and we could make sure that all the arguments matched and so on and so forth. So all that side basically was inspired by how Groovy people did this and reworked into a typed setting. And this is why we have, for example, extension function types, and this is why we have dangling lambdas and other things that are actually very nice syntactic constructs.

38:02

Speaker C

So, yeah, many things came from different languages. A less known language called Gosu, I think it was what inspired us to do SmartCasts.

39:01

Speaker B

What are SmartCasts?

39:11

Speaker D

Oh, yeah.

39:12

Speaker C

So I think SmartCasts are one of the nicest things a compiler can do.

39:13

Speaker D

To a developer, because it's a very.

39:20

Speaker C

Common situation when you say if X.

39:22

Speaker D

Is string, so you do an instance of check basically, then do something with X.

39:26

Speaker C

The annoying thing is that in a.

39:32

Speaker D

Lot of languages you have to cast X to string again.

39:35

Speaker B

Like, you've done the check, you've done the. If you know it's a string, but then you need to write it out again.

39:38

Speaker D

Yeah. So you've just done the check, but.

39:44

Speaker C

You have to say string again to.

39:46

Speaker D

Make the compiler happy. So smart casts basically get rid of that so that cast gets figured out automatically.

39:48

Speaker B

So insert that to string and then inside the bracket, you can now use it because it's a string.

39:55

Speaker D

Yeah, you can use it as a string. And isn't it an easy thing?

40:00

Speaker C

Right?

40:03

Speaker B

So nice.

40:04

Speaker D

Yeah, it's a very nice thing. Yeah, it's a pretty complicated algorithm because, you know, variables can change values and that check that you've just made can go stale. You know, there's a bunch of algorithmic trickery around this and you can't do a SmartCast on any expression. Has to Be a certain type of expression that can be stable enough and so on and so forth. But, you know, it's a very nice thing.

40:05

Speaker C

And you can get rid of so.

40:27

Speaker D

Much noise in the code because all the code in the world is riddled with this. InstanceOfCast. InstanceOfCast. We wanted to get rid of that and it worked. And it was fun to implement.

40:29

Speaker B

What were things that you looked at other languages, you considered maybe we should bring it in. But after a debate, you're like, no, let's just leave this out. Like, not all of them, obviously, but some of the big ones that kind of came close.

40:41

Speaker D

We had a design for pattern match in Kotlin that was inspired by functional languages like Scala and Haskell and others.

40:54

Speaker C

But at some point, it was early.

41:03

Speaker D

On when I was still working on.

41:05

Speaker C

The parser, I just realized that this is a huge feature.

41:07

Speaker D

When I was sketching it out on a piece of paper, it looked like.

41:12

Speaker C

A very useful thing and just another.

41:17

Speaker D

Feature in the language. But then when I started working on the parser, I realized it's an entire language in size. You have to create a parallel universe in syntax for pattern matching.

41:19

Speaker C

I was like, okay, this will be a lot of work, let's postpone it. And then later on, when we were.

41:31

Speaker D

Doing review for 1.0, or maybe a.

41:37

Speaker C

Little earlier than that, I just realized that smartcasts plus we have something called destructuring together. They give us like 80% of all.

41:39

Speaker D

The good things pattern matching can do to normal developers.

41:49

Speaker C

And then there is another group of developers that can be very vocal, which are mostly compiler developers and people super into functional programming. And they have a point, but that point is only relevant to them when.

41:53

Speaker D

There are not very many. That we decided to not have pattern matching back then. And maybe there comes a day that pattern matching gets added to Kotlin and pattern matching.

42:07

Speaker B

Is it in the case?

42:19

Speaker D

Yeah, it's.

42:21

Speaker B

You can have like a lot nicer case statements, a lot more expressive ones, right?

42:23

Speaker D

Yeah.

42:27

Speaker C

So generally. So Kotlin has this compromise where you.

42:27

Speaker D

Have our version of Switch case, which is called Win, and you can have smart costs there.

42:31

Speaker C

So you can say, like, when my expression is a string and then use.

42:37

Speaker D

It as a string, or it is a pair and then you can use it as a pair.

42:42

Speaker C

So that kind of gives you a lot of the niceties of pattern matching.

42:47

Speaker D

But some things you can't express like that.

42:50

Speaker C

And, you know, that was. I think it was a good compromise because it's a really big feature. It's hard to design well, that will.

42:52

Speaker D

Would be a lot of work on the tooling side. So, you know, but maybe it gets in the roadmap one day. I'm not sure. Java is trying to get towards pattern matching, so we'll see. Maybe they kind of make it more mainstream.

42:57

Speaker B

Why did you omit the infamous ternary operator, which is when you write out something, a question mark and a dot and it confuses new developers every single time? If you've not seen it before.

43:12

Speaker D

Yeah.

43:22

Speaker A

Was it for readable reasons?

43:22

Speaker C

This is the saddest story, I think, in the design of Kotlin. I didn't realize how much people liked it. And yeah, so the reason was. So Kotlin used this principle from functional.

43:25

Speaker D

Languages that everything we can make an expression is an expression.

43:38

Speaker C

So if is not a statement and Kotlin is an expression, and the ternary operator is the sort of a patch.

43:42

Speaker D

On the design on C and other.

43:51

Speaker C

C like languages that makes an if expression, basically. And the logic was, okay, we have if as an expression already. Can we just get rid of this extra syntax construct? Especially given that it's using very precious.

43:53

Speaker D

Characters like there is a question mark.

44:08

Speaker C

And a colon and we might find some other use for that. So we decided to not have it. We used question marks for nullable things.

44:10

Speaker D

And columns for types and so on and forth.

44:18

Speaker C

But it turned out that if as an expression is pretty verbose. People don't like it. And I resisted for some time and then by the time I agreed, it was too late because you can't retrofit.

44:21

Speaker D

The ternary operator and the current syntax in Kotlin because it just doesn't agree with how other operators are done.

44:35

Speaker B

So you're actually sad about it not being there a little bit.

44:40

Speaker C

I think in retrospect it was a.

44:44

Speaker D

Mistake because pragmatically it's more use than harm to have it, but we just can't retrofit it.

44:45

Speaker B

What are some other interesting features that you like about the language that you added that we could just explain for those who are not familiar?

44:54

Speaker D

Okay, so the good ones, there's quite a lot of them. So one feature that you know is not a traditional kind of language feature is Java interoperability.

45:02

Speaker C

That's probably the single thing we spent.

45:14

Speaker D

The most time on.

45:18

Speaker C

And I always say that, you know, if someone offers you a job to create a system that interoperates transparently with another huge system you don't control, ask.

45:20

Speaker D

For a lot of money, it's a very tricky deal to figure this out.

45:32

Speaker B

Interoperability means that From Kotlin you can invoke Java and from Java you can invoke Kotlin. And I mean, you do a bunch of work there, but it just works in the end. As a developer, you don't need to think about it.

45:36

Speaker D

Yeah.

45:46

Speaker C

So the end idea is whenever you.

45:47

Speaker D

Have a Java library somewhere in the world, you can always use it from Kotlin. And it was a big selling point because, you know, if you start as just a language in a vacuum and you don't have any libraries, that's not.

45:50

Speaker C

A good start in this direction.

46:03

Speaker D

Definitely it was an absolute requirement for.

46:05

Speaker C

Kotlin, but also we had the requirement to go the other direction. In an existing project you could just rewrite parts of your code from Java.

46:08

Speaker D

To Kotlin and everything keeps working. And some libraries actually did that. And many projects started using Kotlin bit by bit. You know, a lot of people started with just writing tests, but then, you know, you start adding things in Kotlin, some new things, for example, and all the Java code around that has to transparently use the Kotlin code.

46:20

Speaker C

So we put a lot of effort into that and that was fun.

46:40

Speaker B

Can you explain to us as engineers, like, you know, sounds like it was a frigging big project, what is the work? Right?

46:45

Speaker A

Because from the outside, again, I'm just.

46:52

Speaker B

Being your average developer. We're like, all right, I'm invoking, okay, I'm invoking a Java class and things I can think of like, well, maybe Kotlin or Java doesn't support things in a certain way. Or maybe.

46:54

Speaker A

But I mean, is it really that hard?

47:07

Speaker B

What is hard? Tell me, tell me, I'm dying to know.

47:09

Speaker C

So one thing to note here is that we don't control the Java compiler, so we somehow need to make it work so that in your Java code you make a call into something that.

47:12

Speaker D

Only exists in the Kotlin source and.

47:27

Speaker C

The Java compiler somehow agrees to call.

47:29

Speaker D

It to begin with. It's not a Java file, it doesn't know it exists. So the way it actually works is when we build a mixed project, what.

47:31

Speaker C

We do is we first compile all the Kotlin code and that can depend.

47:40

Speaker D

On the Java sources in the project. So we have a Java front end baked into the Kotlin compiler so we can resolve everything in the Java code.

47:46

Speaker C

And then we produce class files, so.

47:56

Speaker D

Binaries for the JVM that the Java compiler can read.

47:58

Speaker C

So when Java compiles, it takes Kotlin.

48:03

Speaker D

Sources as binaries and this is how it works. So we would have to implement a Java compiler otherwise. Fortunately, Java has separate compilation, so this works.

48:06

Speaker C

So this trick means that whenever you.

48:18

Speaker D

Have in your tooling, like in your id, for example, when you navigate from Java sources to Kotlin sources, has to be a special trick.

48:21

Speaker C

So someone needs to go and teach the Java world to know about Kotlin.

48:29

Speaker D

Well, of course the IDE doesn't do the compilation to navigate, but in the compilation time you don't control the compiler. So we did our own IDE so we could do something about the Java tooling, but we couldn't do anything about the Java compiler.

48:33

Speaker C

So that's trick number one. And then when it comes to incremental.

48:47

Speaker D

Compilation, it becomes even funnier because Java incremental compilation is a complex algorithm on its own. And now we are incrementally compiling two languages at once. And that's fun.

48:50

Speaker C

And you know, incremental compilation algorithms are generally a very messy, very complicated heuristic that you have.

49:00

Speaker D

So there are tons of corner cases and stuff.

49:08

Speaker C

So that's like one example. But then you start making interesting new things in Kotlin. You need to expose them to Java. You need to make sure that whatever fancy thing you have, Java can actually interoperate with that. And one example there will be Kotlin. We figured out how to make Java.

49:11

Speaker D

Collections nicer in Kotlin without rewriting the collections using the same library.

49:31

Speaker C

So Java collections are what's called invariant.

49:37

Speaker D

Because they're all read write.

49:41

Speaker C

So if you have a list, it.

49:42

Speaker D

Always has a set method.

49:44

Speaker B

Yep.

49:45

Speaker C

And that's a little bit of a problem because whenever you have a list.

49:46

Speaker D

Of object, you cannot assign a list of string to that.

49:49

Speaker C

And that's a little annoying because you.

49:53

Speaker D

Know, you want to be able to represent a list of anything and you need to play with question marks, wildcards and stuff like that.

49:55

Speaker C

It would be very nice if we had a read only list interface that.

50:03

Speaker D

Doesn'T have a set method.

50:07

Speaker C

And then there is no problem in.

50:09

Speaker D

Assigning a list of subclasses to a list of superclasses. But this interface doesn't exist at runtime. Right. We can't just invent it.

50:11

Speaker C

Or can we? So we actually can.

50:20

Speaker B

No.

50:22

Speaker C

And so in the Kotlin compiler we have this layer of trickery specifically for Java collections, where Kotlin always sees Java collections, like if they come from the.

50:23

Speaker D

Java world, they are read write mutable.

50:35

Speaker C

Collections we call them, but mutable, right?

50:38

Speaker D

Yeah, yeah.

50:40

Speaker C

So the Java collections are always mutable or platform mutable.

50:41

Speaker D

I'll talk about that later.

50:45

Speaker C

But when you do it in Kotlin, you can actually distinguish between read only mutable collections.

50:47

Speaker D

And it's all very nice on the Kotlin side.

50:53

Speaker C

But then when Java sees the Kotlin.

50:55

Speaker D

Collections, they are normal again.

50:57

Speaker C

Like when we expose them through binaries, the Java world always sees them as normal collections.

50:59

Speaker D

They're immutable for Java and it's all right.

51:05

Speaker B

Okay, I'm starting to see why it's. You said like you needed a lot of money for this because this is just one of many things, but this itself sounds like. I don't know how you solve that.

51:07

Speaker D

Yeah.

51:17

Speaker C

So just to add a little bit of detail to this. So the nice thing about those read.

51:18

Speaker D

Only collections is that you can pass a list of string for a list of objects. Right. Wouldn't it be nice if Kotlin method that takes a list of any could.

51:24

Speaker C

Accept a list of string in Java. But aren't we erasing all the Kotlin nice stuff? We are, but we know that this list is actually what's called covariant. So we can expose it to Java as a list of question mark extends and not just list of object. So, you know, it becomes covariant for.

51:36

Speaker D

The Java world as well.

51:57

Speaker C

And that's like one hack that makes it a little more transparent and there's.

51:59

Speaker D

A bunch of that.

52:05

Speaker C

So you know, so that's another thing.

52:06

Speaker D

That we had to play with. But the biggest thing is of course nullable types.

52:08

Speaker C

And actually we handle nullable types and.

52:13

Speaker D

These things with collections kind of similarly, which makes the whole typing layer of the interop quite interesting.

52:15

Speaker C

But basically.

52:24

Speaker D

So Java doesn't know anything about nulls, right?

52:25

Speaker B

Well, it knows about nulls but not about nullable types. It does not exist.

52:29

Speaker C

Yeah, Java doesn't know about nulls at compile time.

52:32

Speaker B

Yes.

52:36

Speaker D

So in terms of types, it's just not represented.

52:36

Speaker C

So technically every Java type is a nullable type. And this is where we started, we said, okay, so Kotlin types can be.

52:39

Speaker D

Not null and it's very convenient. And when you have a not null type, you can just call a method on it normally. Right. But if something is nullable, you can't just dereference it. You have to first check for null and then use it. Or there is a safecall operator just propagate null if null is on the left hand side.

52:46

Speaker C

So we started with saying, okay, all Java types are nullable, which is a.

53:04

Speaker D

Conservative like very mathematical way of treating this is correct.

53:09

Speaker C

Right?

53:12

Speaker B

Yeah, you're not going wrong with that.

53:13

Speaker D

Yeah.

53:15

Speaker C

And we implemented that and we started.

53:15

Speaker D

Using it inside Jetbrains and the feedback was horrible.

53:18

Speaker C

Like, your code is plagued with those null checks and you know that they.

53:21

Speaker D

Shouldn'T be there because you can't express anything on the Java side the right way. And there were like, we had some.

53:25

Speaker C

Annotations for the Java site.

53:31

Speaker D

It was also brittle and not always worked because, you know, there can be long chains and stuff and some libraries just don't have the annotations. And we struggled with that for a long time.

53:33

Speaker C

And basically we realized that this assumption.

53:42

Speaker D

That everything in Java has to be treated as nullable just doesn't work. This was a turning point where we sat down and reimagined the whole thing. And we worked with great type theory, type practice, I would say guy from. I think it was back then, he was in Cornell Ross state.

53:45

Speaker C

So Ross helped me figure out the sort of mathematical side of how you.

54:05

Speaker D

Can represent those types that come from Java and should be like, we should be aware of that. They are from Java and can possibly be nullable, but we shouldn't treat them as nullable because it's very inconvenient.

54:11

Speaker C

And Ross put together a very nice.

54:24

Speaker D

Sort of calculus about those. And when we started implementing it, all the nice things are gone.

54:27

Speaker C

The mathematical beauty is completely gone from all that. And I think we took the general.

54:37

Speaker D

Idea of sort of splitting a type in two and everything else is just very messy, industrial kind of thing. That's not sound, but it works well.

54:43

Speaker B

Okay. Interoperably. Sounds like it was a journey, but a necessary one. How long did it take? Can you give me just a sense of how many people working on it? How much? Because I think in traditional project we can get a sense, but I have no idea with the language, how does.

54:53

Speaker A

This work and how long did you.

55:07

Speaker B

Think it would take versus how much it took?

55:08

Speaker C

Yeah, so let's start with that. So every time I was asked when.

55:11

Speaker D

We were going to release Kotlin, I would say, one year from now.

55:14

Speaker B

Yep.

55:18

Speaker C

And you know, this is.

55:18

Speaker D

This is not a plan. I had no idea.

55:20

Speaker C

Had no idea. I also had the illusion that the initial version I was building was a.

55:24

Speaker D

Prototype and we would rewrite everything. And I'm sure a lot of people out there have been there.

55:29

Speaker C

I think that prototype has been rewritten more or less completely now. But it took six years, something like that.

55:34

Speaker D

Yeah. So maybe longer, actually. Yeah.

55:43

Speaker C

So I had no idea.

55:48

Speaker D

And I always said, like, okay, a.

55:49

Speaker C

Year from now, BLS far enough, we'll.

55:51

Speaker D

Probably be done by then in practice. We started in 2010. Yeah, autumn of 2010, basically. And we released in 2016, February 2016. So it was a long time, 5ish years.

55:53

Speaker C

And that, you know, in part it.

56:10

Speaker D

Was just because I didn't know how to manage projects.

56:14

Speaker C

And my initial team, the people who.

56:16

Speaker D

Worked full time on the project, I looked up on GitHub to verify that.

56:20

Speaker C

Everybody who, almost everybody who joined JetBrains to work on Kotlin was a fresh graduate because I used to teach and I had some good students and I.

56:26

Speaker D

Knew how to work with students.

56:38

Speaker C

And so basically everybody on the team was a student, apart from a few.

56:40

Speaker D

Veterans from JetBrains who were helping, not all of them even full time. So we started getting experienced engineers on the team a bit later.

56:45

Speaker C

And, you know, to be fair, a lot of those people, you know, people.

56:55

Speaker D

Who are following Kotlin know those names.

57:00

Speaker C

People who are core contributors whom built out, like, absolutely foundational parts of Kotlin joined as fresh graduates and they became great engineers.

57:02

Speaker D

But I think I overdid it a little bit.

57:12

Speaker C

So it's great to have younger people, have no fear, and that's wonderful.

57:15

Speaker D

But the balance was not right.

57:23

Speaker B

And how big was the team initially and then towards the release.

57:25

Speaker D

So we started out basically with 40 for people part time. And yeah, we went like that for maybe a year or something. So the initial prototype was built like that and then people started joining in. By the time we released, I think it was around 25 people or something.

57:28

Speaker C

And the team grew quite a bit. So by the time I left in.

57:47

Speaker D

2020, it was about 100 people on the team, 70 of them engineers. So it became a pretty big undertaking.

57:50

Speaker B

Can you tell us about the development process inside language? I think a lot of us are used to building, you know, like services, backend services or products or mobile apps, etc. They typically have a release process. How does this work inside a language? Like, what is your release process and what is the, I guess, best practices? Like, do you even do code reviews or, you know, like, how can we imagine? Because again, it feels such a rare project. There are people building languages, but not many of them.

57:58

Speaker D

Yeah, so one peculiar thing about building languages is what's called bootstrapping. When you write your compiler in your language.

58:27

Speaker B

Oh, nice.

58:36

Speaker C

Which means that, you know, to compile your code, you need a previous version of your compiler and you better agree with your colleagues which version it is. It can be really tricky, especially when you do things about the binary format. And there is like quite a Lot.

58:37

Speaker D

Of bootstrapping magic going on.

58:52

Speaker C

And I don't think it can reproduce.

58:54

Speaker D

The Kotlin builds from scratch because, you know, if you just take a snapshot.

58:58

Speaker C

Of the Kotlin repo, you can only.

59:03

Speaker D

Build that with the Kotlin compiler.

59:05

Speaker C

And I don't think we kept all the bootstrapped versions. So it might not be really possible.

59:07

Speaker D

Without a lot of manual intervention to.

59:14

Speaker C

Rebuild all the sources from the very.

59:16

Speaker D

Beginning and reproduce all the versions, because.

59:18

Speaker C

Sometimes we had to commit a hack.

59:21

Speaker D

Into a branch and use that branch as a bootstrap compiler for the next build and then throw the branch away. So that was like a one off compiler used to facilitate some change in the binary format or syntax or something. So that's a separate kind of fun. But generally, I mean many, many practices are very similar. Like had code reviews pretty early on. It's my personal quirk again that I like to talk to people. So in code reviews I often just sat together with someone and either they reviewed my code or I reviewed theirs. But this is, you know, I can't argue that it's much better or worse. It's just how I prefer it because I like talking to people.

59:25

Speaker C

So code reviews, yes.

1:00:05

Speaker D

And of course we hadn't an issue tracker like everybody else. Ours was always open so everybody can submit bugs to the Kotlin bug tracker.

1:00:06

Speaker C

Which was very helpful.

1:00:15

Speaker D

It's hard to manage because there will be like, with usage there will be a lot of bugs and a lot of like feature requests and all kinds of stuff, but it's worth it. You have a communication channel release cadence is a very difficult thing to figure out for such projects because one big consideration you have for languages is backwards compatibility.

1:00:18

Speaker C

In part, this is what delayed 1.0 because we wanted to be reasonably sure.

1:00:39

Speaker D

We can maintain compatibility as soon as we call it 1.0, in part because it was the expectation especially Java is incredibly stable and very good with that until Java 9 came about.

1:00:46

Speaker C

And also Scala had a lot of.

1:00:58

Speaker D

Trouble because they were breaking compatibility a lot of. And the community was struggling really, so we really didn't want to repeat that. But you know, there turns out you can even break compatibility Python 2 to Python 3 and survive. So, you know, barely, barely survive. They're doing very well now.

1:01:01

Speaker B

They're doing well, yes.

1:01:21

Speaker D

Yeah, so we were really serious about that.

1:01:22

Speaker C

But basically what it means is you start doing interesting things like deprecation cycles. And so we actually invented an entire.

1:01:25

Speaker D

Tool set for compatibility management.

1:01:35

Speaker C

So before 1.0 we tried to help.

1:01:39

Speaker D

People migrate so we had those milestone builds, embarrassingly, we had 13 of those.

1:01:41

Speaker C

And, you know, when we broke the.

1:01:48

Speaker D

Language in major ways, we tried to provide tools for automatic migration.

1:01:50

Speaker B

That's nice of you.

1:01:55

Speaker C

Which was.

1:01:56

Speaker D

I don't think it was a standard practice in the industry back then. Now people are doing it more. So I'm like, very happy to have sort of popularized this idea.

1:01:57

Speaker C

And then when we were preparing for.

1:02:04

Speaker D

1.0, we did a major review of everything and took a year to sort.

1:02:07

Speaker C

Of view all the design. And what we're doing is basically trying to anticipate what changes we might want.

1:02:12

Speaker D

To make or what new features will.

1:02:19

Speaker C

Require and to basically prohibit things that might block that. So we tried to make sure that the changes that we were planning were guarded well by compiler errors, to make sure that users don't accidentally write anything.

1:02:20

Speaker D

That looks like a new feature.

1:02:37

Speaker C

And that was fun.

1:02:39

Speaker D

Like, we had design meetings, I think, every day at some point, basically working.

1:02:40

Speaker C

On that, like, okay, let's outlaw this, let's prohibit that.

1:02:45

Speaker D

And we prohibited a lot of stuff correctly and some stuff incorrectly, but it generally worked out. So this compatibility thing was a big deal.

1:02:49

Speaker C

There's also a lot of stuff that.

1:02:59

Speaker D

We didn't anticipate, so we had to figure out ways to manage this. And there is something in the Kotlin compiler called Message from the Future, which.

1:03:02

Speaker C

Is basically when in a newer version of a compiler, you introduce something that.

1:03:14

Speaker D

The old compiler doesn't understand, you have different options. And one option a lot of languages go for is the new kind of binary is completely unreadable for the old compiler, so the version is higher. I don't read it. That's it. I bail.

1:03:20

Speaker C

But it's a little hard for people then to manage their versions, because new.

1:03:34

Speaker D

Libraries, new versions of libraries come with the new compiler expectations, and you have to migrate your entire project to this, that it's a little annoying.

1:03:39

Speaker C

And if what you're adding is like.

1:03:46

Speaker D

One method that basically invalidates the whole library for an old compiler, that's not great.

1:03:48

Speaker C

So what we're doing, a newer compiler can write something into the binary that tells the old compiler, okay, this method.

1:03:56

Speaker D

Is what you can't understand, but everything else is fine.

1:04:03

Speaker B

Wow, that's smart.

1:04:06

Speaker D

Yeah.

1:04:07

Speaker C

So we call this a message from.

1:04:07

Speaker D

The future, and it can provide some details.

1:04:08

Speaker C

So there's that.

1:04:11

Speaker D

And there's also the discipline of experimental features, which is incredibly helpful, and I am very happy to see other languages doing it now. And even Java does experimental features now, which is wonderful.

1:04:12

Speaker A

Andrei just talked about experimental features in programming languages and how that used to be rare back in the 2010s. What this reminded me is that running experiments in production used to also be rare. Not because teams did not want to do it, but because doing it meant building a lot of internal tooling around it. Assignment rollouts, measurements, dashboard, debugging, the whole thing. For a long time, only a handful of companies really pulled this off at scale. Companies like Meta and Uber. Which brings me to statsig. Statsig is our presenting partner for the season. Statsig gives engineering teams the tooling for experimentation and feature flagging that used to require years of internal work to build. Here's what it looks in practice, you ship a change behind a feature gate and roll it out gradually, say to 1% or 10% of users. first, you watch what happens. Not just did it crash, but what did it do to the metrics you care about. Conversion, retention, error rates, latency. If something looks off, you turn it off quickly. If it's trending the right way, you keep rolling it forward. And the key is that the measurement is part of the workflow. You're not switching between three different tools and trying to match up segments and dashboards after the fact. Feature flags, experiments and analytics are in one place using the same underlying user assignments and data. This is why teams and companies like Notion, Brexit and Atlassian use static. Static has a generous free tier to get started, and pro pricing for teams starts at $150 per month. To learn more and get a 30 day enterprise trial, go to statsig.compragmatic and with this, let's get back to Andre and experimental features in Kotlin.

1:04:24

Speaker C

So we did quite a lot of work.

1:05:53

Speaker D

You know, when you're doing something experimental.

1:05:56

Speaker C

This is something that's supposed to break and you want to emphasize this to make sure that the user is aware that, you know, this is something we are not promising to keep compatible.

1:05:58

Speaker D

This is something we are going to break. And you know, we used to put the word experimental in package names for people to understand that this is gonna be renamed.

1:06:11

Speaker C

And you know, warnings when you use.

1:06:20

Speaker D

Language features and we require like compiler keys to enable language features and stuff like that, it kind of helps.

1:06:22

Speaker C

So we did quite a lot of that. So all this is an extra layer. Unlike a SaaS system, for example, a.

1:06:30

Speaker D

Compiler leaves behind not behind, but creates.

1:06:36

Speaker C

A lot of artifacts that pin down.

1:06:39

Speaker D

Its history in the world. There is source out there and there.

1:06:42

Speaker C

Are binaries out there and you're guaranteed to encounter them every Time anyone hopes that this is an obscure case, nobody will ever hit that with enough users. You hit every freaking case. And this is so surprising. And I discovered this fairly early on.

1:06:45

Speaker D

I think before 1.0, when we had.

1:07:06

Speaker C

A few thousand users, I realized that if something's possible, some person out there.

1:07:08

Speaker D

Will actually do it.

1:07:14

Speaker B

Now you got 1.0 out. Can you tell me how Kotlin grew in popularity when you released it? What was your target audience? And then how did Android happen?

1:07:16

Speaker D

Okay, so that's complicated story. Let's try to not get off track because this has a lot of sidetracks to it.

1:07:28

Speaker C

So when we started Kotlin, we were.

1:07:36

Speaker D

Not really very aware of Android. And I mean, we knew that there was a thing called Android.

1:07:37

Speaker B

Kind of ironic. Yeah, from now. Message from the future, right?

1:07:43

Speaker C

Yeah. So basically in 2010, we were focused.

1:07:49

Speaker D

On the majority of Java developers. That was all about the server side.

1:07:52

Speaker A

Yep. I can clear.

1:07:58

Speaker C

Yeah.

1:08:00

Speaker D

So the most money intellij was making was on Spring users. And, you know, everybody knew that this was what the Java platform was about by then.

1:08:00

Speaker C

So we were targeting server side developers basically, and also desktop developers, because Jetbrains.

1:08:11

Speaker D

Had probably the last desktop application written in Java, or at least in swing.

1:08:19

Speaker C

So that was the target.

1:08:26

Speaker D

It was initially not even a plan to do Android.

1:08:27

Speaker C

And Kotlin got some usage for the.

1:08:32

Speaker D

Server side and it's still there and it's growing there. Not as fast as on Android, but still has quite some representation on the server side.

1:08:35

Speaker C

But then a few years in, some person on the Internet asked us whether.

1:08:45

Speaker D

Kotlin works in Android. And I was like, I heard Android uses Java. The Kotlin should work.

1:08:51

Speaker C

We never tried go and try. And I think it was either the.

1:08:59

Speaker D

Same user or a different user came.

1:09:04

Speaker C

Back and said, like, the toolchain crashes. And it wasn't even the Kotlin toolchain.

1:09:06

Speaker D

It was the Android toolchain that crashed.

1:09:10

Speaker C

And, you know, we looked into it.

1:09:13

Speaker D

And it turns out that it's some.

1:09:15

Speaker C

Tool in the Android tool chain that's.

1:09:19

Speaker D

Written in C that just fails with the core dump. And it's not very clear what's going on. And we later figured it out and.

1:09:21

Speaker C

It turned out that now the Android developers and the people who built the.

1:09:30

Speaker D

Android platform, they actually read the spec.

1:09:36

Speaker C

Of the jvm, unlike the people who implemented the Hotspot vm, because the Hotspot vm, I suspect, came before the spec. So it was the reference implementation, but.

1:09:39

Speaker D

Was actually specified after it was built.

1:09:50

Speaker C

So the hotspot VM was super lenient to weird things. Like there would be like if we put a flag on a class file that was not allowed for classes, Hotspot wouldn't care.

1:09:54

Speaker D

And we ran everything on hotspot and so we thought everything was fine.

1:10:06

Speaker C

But then the Android side, those were the people who actually read the spec.

1:10:12

Speaker B

And they actually implemented it.

1:10:16

Speaker C

Yeah, they would complain about everything. And this is why we used Android toolchain as a testing environment, basically because this is how we could get rid.

1:10:17

Speaker D

Of stupid things in our bytecode. And they helped us a lot with validating everything.

1:10:29

Speaker C

But there were some gotchas there and some legacy stuff nobody cares about in mainstream Java just were faithfully implemented on the Android platform. That was fun. So, you know, and at some point, pretty early on, I think I had this realization that Android was a growing platform, which to me then, I don't.

1:10:36

Speaker D

Think I had much of understanding of dynamics of markets then, but to me.

1:11:01

Speaker C

It meant that there will be a.

1:11:07

Speaker D

Lot of new applications and it's much easier to start completely new with a new language.

1:11:08

Speaker C

So I made sure at some point that we worked well on Android. It was already after the lawsuit.

1:11:16

Speaker D

So, you know, the big context to all this was that when Oracle acquired Sun Microsystems, they sued Google for billions of dollars for using Java. And I think that is settled.

1:11:22

Speaker B

It was settled in some way. Yeah. And then everyone could go on their own way.

1:11:34

Speaker D

Right. But it took years and years to settle. So back then it was very much a thing. And you know, so that dispute was somewhere in the background.

1:11:39

Speaker C

But yeah, so basically we saw that a lot of people on Android really liked Kotlin.

1:11:50

Speaker B

They loved it.

1:11:55

Speaker C

Yeah.

1:11:56

Speaker B

As soon as it was stable, pretty much. I mean, I think for all the things that you mentioned, right, like it was just so much nicer than Java, easier to write, easier to read, lots of nice features. So you use Android as a way to actually make sure that Kotlin compiled correctly. And then why did it take off on Android?

1:11:57

Speaker C

Yeah, so the situation in Android was.

1:12:15

Speaker D

Pretty interesting because unlike Java server side, that, you know, is kind of under control of the teams that develop on it, in the case of Android, there are devices in the pockets of people, right. And when you have billions of those.

1:12:17

Speaker C

Devices and those devices don't always update the virtual machine, so people in Android.

1:12:34

Speaker D

Were basically stuck with old Java.

1:12:41

Speaker C

And even when Java started progressing, and.

1:12:44

Speaker D

For example Java 8 came out in.

1:12:49

Speaker C

2014, it was very difficult to roll.

1:12:51

Speaker D

Out this new version of Java across the entire Android ecosystem because it required.

1:12:54

Speaker C

Updates to the virtual machine. And there were workarounds and Retro Lambda.

1:12:59

Speaker D

Really helped and so on and so forth.

1:13:04

Speaker C

But there was still a lot of.

1:13:07

Speaker D

People stuck with really old Java. So Java wasn't on par with Kotlin or C in 2014, but it still was much better and solved the major problem.

1:13:09

Speaker C

But it was not available to the Android people. So there was a lot more frustration.

1:13:24

Speaker D

With Java in the Android community. And also there was swift on iOS.

1:13:29

Speaker B

Oh yep.

1:13:35

Speaker C

Where, you know, it was a real example of a big ecosystem transitioning from.

1:13:36

Speaker D

A really dated language to Swift Objective C. Really nice.

1:13:42

Speaker B

Yep.

1:13:47

Speaker C

And I think compounding these two things.

1:13:47

Speaker D

Were like the major factors.

1:13:51

Speaker C

And also, I mean, we made sure.

1:13:54

Speaker D

That Kotlin worked well on Android. Also, very fortunately, at some point Google switched the developer tooling from the Eclipse platform to the IntelliJ platform. When IntelliJ was open sourced back in, I don't remember, 2014, 2013, I think, or something like that. So, you know, we had a nice plugin because everything worked on the Intellij platform and the same plugin worked for Android.

1:13:56

Speaker C

And many other things like, were just very smooth.

1:14:21

Speaker D

Well, very smooth. There were a lot of bugs, but reasonably smooth.

1:14:24

Speaker C

So it felt like a very good.

1:14:30

Speaker D

Match and a lot of people appreciated that.

1:14:32

Speaker C

And we really wanted to somehow draw the attention of the team at Google.

1:14:35

Speaker D

To maybe talk about it or something and it just didn't happen.

1:14:40

Speaker C

So we released in 2016 and we.

1:14:44

Speaker D

Had some communication with Google in general, but there was a, like no interest in that side. They're like, okay, I guess we'll just keep going as we do. And some people were already building Android applications and well, some people were building production applications in Kotlin before we released 1.0.

1:14:48

Speaker C

And you know, kudos to the brave.

1:15:05

Speaker D

People because they gave us invaluable feedback, but you guys are too brave. Yeah.

1:15:08

Speaker C

So, you know, it just grew organically. And when we started in the very beginning, I set this internal goal to.

1:15:13

Speaker D

Myself that if we get to a hundred thousand users, it's a success. Like I've done well enough if it gets to a hundred thousand. And of course it's hard to tell how many users a language has, but you know, you can kind of estimate that.

1:15:23

Speaker C

And I think we were on track.

1:15:40

Speaker D

To get to a hundred thousand users during 2016 because it was growing, was in the tens of thousands.

1:15:42

Speaker C

You know, it looked good, but then some people from Google reached out and.

1:15:50

Speaker D

Said they wanted to chat and it.

1:15:55

Speaker C

Turned out they wanted to chat about announcing official support for Kotlin. At Google I O 2017, that would be in like three months from the.

1:15:57

Speaker D

Time of that conversation, they were like, yeah, sure, let's do it. What do we need to do?

1:16:10

Speaker C

And it turned out we had to.

1:16:16

Speaker D

Figure out quite a few things, but we managed and I think it was the heroic effort on the side of the Google team. They did amazing things, impossible things there and I have good friends among them now. And it was really, really close. Like we could have missed the deadline, but we figured it out. And yeah, on our side also, we had to make many things work and figure out how we now interoperate with Android Studio better and how do we set up processes and everything. But there was like a big legal thing around it. This is when the Kotlin foundation was invented and we had to design the protocols for decision making in the Kotlin Foundation. And you know, Google owned the trademark for Kotlin for one year because of legal things. It was basically a guarantee from the JetBrains side until the foundation gets set up so you can look up the public record. Google was in possession of the Kotlin trademark for a year, but then the foundation was set up and was transferred to the foundation.

1:16:18

Speaker C

So it was fun. It was pretty crazy time.

1:17:28

Speaker D

But it was amazing to see how happy people were at Google I O when the announcement happened.

1:17:32

Speaker B

And then usage must have skyrocketed. You probably blew past 100,000 pretty quickly.

1:17:39

Speaker D

Yes, yes, I think we went. Yeah, we probably got into millions that year. This is what was basically the moment happening.

1:17:44

Speaker C

And you know, I knew many years before that, I knew that the easiest.

1:17:53

Speaker D

Way for a language to succeed is.

1:17:58

Speaker C

To be part of a platform.

1:18:00

Speaker D

And like C was part of Unix basically, or like C was part of Windows or JavaScript was part of the web platform. And I knew that Kotlin had no platform. So it was supposed to be much tougher time for Kotlin than for some other languages.

1:18:01

Speaker C

But yeah, the platform came along somehow.

1:18:17

Speaker B

Jumping forward to a lot more closer. Today you have. You left Kotlin in 2020, later you left Jetbrains. What are you doing right now?

1:18:19

Speaker C

Yeah, so I'm also working on a.

1:18:29

Speaker D

Language right now, but it's sort of a different kind of language because the.

1:18:31

Speaker C

Times have changed and you can look at it from a similar perspective. Like in Kotlin we wanted to get rid of boilerplate. We wanted to make programs more to the point and less of a ceremony. And I think this is where we today we have a great opportunity to.

1:18:34

Speaker D

Do the same thing at a different level.

1:18:56

Speaker B

Because of AI, Right, because of AI. It's all because of AI.

1:18:58

Speaker C

Yes, AI is great because many things.

1:19:01

Speaker D

That are obvious to humans are obvious to LLMs as well, which closes this.

1:19:06

Speaker C

Gap between what the machine can understand.

1:19:11

Speaker D

And what a human can understand quite a lot.

1:19:13

Speaker C

Which means we might not need to write dumb code anymore.

1:19:16

Speaker D

That would be very nice.

1:19:20

Speaker C

So on the one hand, you know, the entire history of programming languages is.

1:19:22

Speaker D

Going from lower to higher levels of abstraction. We started with machine code, then assembly was a step up.

1:19:29

Speaker C

Actually assembly language is a higher level language.

1:19:35

Speaker B

And then machine code. Okay, yeah, yeah.

1:19:38

Speaker C

And then C was a high level.

1:19:41

Speaker D

Language back in the day. And then of course, managed languages like Java were a great step up and made programming a lot more accessible and teams could grow and you didn't have to be a super competent programmer to build working software. And then things like Kotlin built on top of that success and we raised the level of production some more, but now we can do even better in the dap.

1:19:43

Speaker C

So you can imagine like a normal.

1:20:10

Speaker D

Program, some application code.

1:20:13

Speaker C

A lot of the things in this code are obvious to you and to me. So if you ask me to write this code, you don't spell everything out. You explain what the program needs to.

1:20:15

Speaker D

Do and I can implement it and.

1:20:25

Speaker C

It will work the way you want. There are, you know, it depends on how detailed the specification is, but you can tell me a lot less than.

1:20:27

Speaker D

You would have to tell a compiler.

1:20:35

Speaker B

Yeah, yeah.

1:20:37

Speaker C

And so this is the point. With CodeSpeak, we want to basically shrink the amount of information a programmer needs to tell the computer to make the program work. And from my current anecdotal experience, you can shrink a lot of the code about 10x, which means that, you know.

1:20:38

Speaker D

A lot of projects out there can.

1:21:00

Speaker C

Be a lot smaller and it will.

1:21:03

Speaker D

Be a lot easier for humans to deal with that and a lot easier to read. And reading is the most important bit.

1:21:06

Speaker C

And a lot easier to navigate. And it becomes, you know, the essence of software engineering. When you are not like dealing with.

1:21:11

Speaker D

A stupid compiler, you're not restricted by that anymore.

1:21:21

Speaker C

What you're expressing is what only you know about what needs to happen, because everything else the machine knows as well.

1:21:24

Speaker B

So can you tell me a bit more on what codespeak is or what this language is? Is it designing an actual kind of formal language, just simpler? Is it using. Of course we know that AI and LLMs and agents can do all the funky stuff. Where is this? What is this?

1:21:32

Speaker D

Okay, yeah, yeah, so I'll try to explain this.

1:21:46

Speaker C

So I think the best way of.

1:21:49

Speaker D

Thinking about codespeak is it's a programming.

1:21:52

Speaker C

Language that, based on English. It's not a formal language, or not.

1:21:55

Speaker D

An entirely formal language, but it's a programming language.

1:22:00

Speaker C

It's a language that's supposed to be used by engineers, but it uses LLMs heavily. And this is like the way new.

1:22:03

Speaker D

Languages will be because, you know, you.

1:22:13

Speaker C

Can think about the ultimate language of today as a normal programming language that uses an LLM as a library. You know, there was a time where.

1:22:15

Speaker D

NPM was wonderful because, you know, it's a huge repository of all kinds of.

1:22:27

Speaker B

JavaScript libraries, the node packet manager, one of the biggest package in the world.

1:22:33

Speaker D

Right, Right. Yeah.

1:22:36

Speaker C

So you have a huge library out there that you can all use, but now you have an even better npm.

1:22:37

Speaker D

The LLM that has seen all the.

1:22:44

Speaker C

Code in the world and if you're inventive enough, you can fish this code.

1:22:47

Speaker D

Out of the LLM.

1:22:54

Speaker B

Yeah, you need to hana to have to prompt, right?

1:22:55

Speaker C

And the trick is like, it would.

1:22:58

Speaker D

Be really nice to have a programming.

1:22:59

Speaker C

Language that has the entire LLM as.

1:23:01

Speaker D

A library or as a bag of libraries.

1:23:03

Speaker C

Right. The trick is to take anything out.

1:23:06

Speaker D

Of an LLM, you have to use natural language.

1:23:10

Speaker C

So the query language to this incredible.

1:23:13

Speaker D

Database of all the knowledge is informal.

1:23:16

Speaker C

And there is no way at least.

1:23:20

Speaker D

Known today that you can make it formal.

1:23:22

Speaker C

So inherently this ultimate language of today has to be at least in part informal. And this is what we're working on. So it's still in the air, like how formal can we make it? And it's not the goal to make it super restricted, but the goal is to leverage all the power and support the user.

1:23:24

Speaker D

We need to rule out stupid mistakes and things like that.

1:23:46

Speaker C

We're still working on that. But the basic idea is if you instead of spelling out every line of.

1:23:49

Speaker D

Code and every bit of your algorithm.

1:23:57

Speaker C

You can basically communicate intent the same.

1:23:59

Speaker D

Way I can communicate it to you. You will just get there much faster.

1:24:02

Speaker B

So one question that I asked Chris Lapner was, which I'm going to ask you as well, you're talking about designing a language for software engineers to build software more efficiently, maybe more concise and in a new way. And it sounds super exciting. But going to the other side, we have LLMs. Do you think there is a need to design a new type of programming language for LLMs to use more efficiently?

1:24:07

Speaker C

That's a very interesting question and I had a few discussions about this. My position is it's probably misguided because of a number of things. So, one, to get an LLM to understand some language well, you need a huge training set.

1:24:31

Speaker D

And with the new language, that training set is not there. You can try to synthesize it and so on and so forth, but it's not gonna be as good as other languages.

1:24:50

Speaker C

Like, for example, right now the newer.

1:24:56

Speaker D

Languages are just harder for LLMs than the more established ones. Like, any LLM writes Python better than it writes Rust or even kotlin. Even the LLMs that write Java very well won't write Kotlin as well because it's not as present in the training set because it's younger and, you know, there are ways around it. And I think the later models, like added some more Kotlin into the RL sets and it's getting better, but still, like, it's pretty hard. And so that's challenge number one, which.

1:24:59

Speaker C

Also challenge number two. I don't think there necessarily have to exist a language that makes it better. Because LLMs are trained on human language. Their knowledge of programming languages is part of that. Their power is in having been exposed.

1:25:29

Speaker D

To all the code in the world and its existing code and inventing a.

1:25:45

Speaker C

New language for that.

1:25:49

Speaker D

I don't know how promising that can be.

1:25:50

Speaker C

You can do another thing, which is.

1:25:53

Speaker D

An interesting research project.

1:25:57

Speaker C

You can sort of extract a language.

1:25:59

Speaker D

From an LLM because, you know, internally it has some intermediate representations of what's going on during inference. And maybe you can sort of extract the optimal prompting language.

1:26:01

Speaker C

It's not guaranteed to be intelligible to humans.

1:26:15

Speaker D

And there are some experiments that show that, you know, you can create completely unintelligible prompts that give the same results as normal human prompts, but they will be shorter.

1:26:18

Speaker C

Maybe you can do something like this.

1:26:31

Speaker D

I don't know if it will help.

1:26:33

Speaker C

A lot, but what we're doing in codespeak as part of working in this.

1:26:34

Speaker D

Language, we need to really nail down this query language capacity.

1:26:40

Speaker C

And what we're doing now is we are looking at existing code and we're trying to find the shortest English descriptions for this code that can generate equivalent implementations.

1:26:44

Speaker D

Not necessarily character to character, but they have to work the same way.

1:26:58

Speaker C

And that's an interesting exercise because you need to figure out how to represent the ideas in the code in a way that a, you can generate the.

1:27:02

Speaker D

Same kind of code, but the ideas you represented were a lot more compact.

1:27:11

Speaker C

But also this code you represent, it.

1:27:16

Speaker D

Evolves over time, right? So you have a commit history on.

1:27:20

Speaker C

Top of this version and so going forward in time, you need to be able to represent all the changes in your codespeak version. And you know, you need to make sure that when it's a small change in the original code, the change in.

1:27:23

Speaker D

The spec is smaller.

1:27:38

Speaker C

That's an interesting challenge. So in this way we're sort of.

1:27:39

Speaker D

Discovering codespeak as a language, or at least parts of it, and not really designing that bit of it.

1:27:43

Speaker C

It's a very new world in the sense that nowadays if you work with.

1:27:51

Speaker D

AI, everything is a machine learning problem.

1:27:55

Speaker C

And that means back in the day, if you had a very smart algorithm on paper, you could just implement it.

1:27:57

Speaker D

And make sure it works.

1:28:05

Speaker C

Nowadays, whatever algorithms you have in mind, you need a data set. First of all, if you don't know how to collect a data set, don't even start.

1:28:06

Speaker D

And yeah, this is what we're doing.

1:28:17

Speaker B

So just taking a look at, you are using these tools day in, day out. I mean, you're building with them. How do you think programming as a whole, or I'll say software engineering is being changed by AI and how do you think the future is starting to look, especially thinking about software engineers? You're a software engineer yourself. You've written so much code in your life and are you still writing code?

1:28:19

Speaker D

Yeah, I'm writing some code, yeah.

1:28:42

Speaker B

And sorry, typing or prompting?

1:28:44

Speaker C

I'm doing both.

1:28:47

Speaker D

Sometimes I'm just typing, More often I'm.

1:28:49

Speaker C

Typing with cursor tab completion, I'm doing.

1:28:52

Speaker D

Quite a lot of prompting as well. And you know, that's a combination of all this. But cursor's completion is really a step up from traditional IDs, and I think the Intellij side has something similar now.

1:28:55

Speaker C

So it's like a lot of coding.

1:29:08

Speaker D

But in a very different kind of mindset and a different toolset.

1:29:11

Speaker C

Yeah. So in terms of what's happening to programming, I think we are in the.

1:29:16

Speaker D

Early days of the new era.

1:29:20

Speaker C

So, you know, it's only last year that we figured out that coding agents.

1:29:22

Speaker D

Are good Claude code and cursor agent and so on and so forth.

1:29:26

Speaker C

And I think this is a very early step. Right now we are in this phase.

1:29:31

Speaker D

Where a lot of people are in love with agents and they can be very useful and I use them every day.

1:29:36

Speaker C

But I think there are inherent problems with the model, with how you interact.

1:29:41

Speaker D

With a coding agent because it's a.

1:29:48

Speaker C

One on one chat and as a human, I talk to the agent in human language.

1:29:50

Speaker D

So I'm communicating my intent on a high level.

1:29:55

Speaker C

And that Intent gets translated into code, and it's the code that I commit.

1:29:59

Speaker D

To the repo and it's the code.

1:30:04

Speaker C

That my teammates will see.

1:30:06

Speaker D

So my chat history is lost.

1:30:08

Speaker B

Big problem.

1:30:09

Speaker D

Yeah.

1:30:10

Speaker C

So it turns out I'm talking to a machine in a human language, but.

1:30:11

Speaker D

The way I communicate with my team is the machine language that's kind of backwards. So, yeah. So what we're trying to do in codespeak is to elevate everything to the human language level.

1:30:15

Speaker C

So this is where we start. We say, okay, we have this incredible tool. We can prompt agents to implement code for us and we are just picking it up. So I think a lot of teams haven't yet realized how difficult it is to review all the code. And I've talked to people who are like, maybe we can just not review this code.

1:30:26

Speaker D

I'm like, yeah, I mean, you can for a couple of days and then it just collapses.

1:30:48

Speaker C

And I think another big theme of.

1:30:55

Speaker D

Today is that we'll be doing a.

1:30:59

Speaker C

Lot of testing and you may not need to review the code.

1:31:02

Speaker D

If your tests are really good, you.

1:31:06

Speaker B

Need to verify it. Right. That's what you're saying is verifying might not mean reviewing.

1:31:08

Speaker D

Right.

1:31:13

Speaker B

Or it could not mean.

1:31:14

Speaker C

Yeah, depending on the domain, you might get by without reviewing the code as much.

1:31:15

Speaker D

But being sure, somehow, either reviewing the test or somehow else making sure that your tests are good, that's a trend.

1:31:21

Speaker C

And we are putting a lot of.

1:31:27

Speaker D

Effort at codespeak into automated testing and making sure the tests actually check the right things and that they check all the code and all that stuff. It's very interesting computer science.

1:31:29

Speaker C

And also it's now a question of.

1:31:41

Speaker D

Especially in the case of codespeak, and I think for other agents as well.

1:31:44

Speaker C

Like, yeah, reviewing code can be too much. But can we present the tests we.

1:31:48

Speaker D

Generated to the user in a way that actually verifies that we did what was to be done?

1:31:54

Speaker C

It's tricky.

1:32:00

Speaker D

Some tests will be just very long.

1:32:01

Speaker C

And tedious to read.

1:32:03

Speaker D

And, you know, we are working on that and that's where we are.

1:32:04

Speaker C

And I think we'll see a lot.

1:32:09

Speaker D

Of development in terms of power of.

1:32:11

Speaker C

The models and we'll get some quote, unquote, obvious things implemented in agents. For example, the agents are just starting to use language servers and basically all.

1:32:13

Speaker D

The stuff that we've always had for.

1:32:25

Speaker C

Code is not very utilized. And if you compare ID integrated agents.

1:32:28

Speaker D

Like Cursor or Juni Jetbrains, you have.

1:32:37

Speaker C

A lot of code navigation capability and databases of code is indexed and you can navigate it very quickly.

1:32:41

Speaker D

You can find things very quickly.

1:32:49

Speaker C

When you run Claude code, for example.

1:32:50

Speaker D

It might not have that and use.

1:32:53

Speaker C

Grep and it will be as successful.

1:32:54

Speaker D

But take a lot longer and burn a lot more tokens.

1:32:56

Speaker C

So, you know, I'm sure this year.

1:32:59

Speaker D

All these tools come to most agents and will have a lot more sophisticated scaffolding around the models.

1:33:02

Speaker C

So that's one thing. But then my question is always, what's.

1:33:09

Speaker D

Going to happen in the end game or in the further future? And it's very hard to predict.

1:33:14

Speaker C

And we can assume that models will become much smarter. An important thing is that humans will not. So one thing I know about the.

1:33:20

Speaker D

Future, and it's hard to know the future, but this thing I do know.

1:33:29

Speaker C

About the future, humans will be as.

1:33:32

Speaker D

Smart or as dumb as they are today.

1:33:34

Speaker C

And if we have incredibly smart models, what we will be doing is constrained by how humans are. And this is one of the reasons why I'm working on codespeak, because codespeak is a tool for humans, not for models and humans, I know I can build a tool for them.

1:33:36

Speaker D

I guess an important footnote is that.

1:33:54

Speaker C

Many people will say things like, if.

1:33:58

Speaker D

We have smart enough models, they can review the code themselves and they can test the code themselves.

1:34:01

Speaker C

But then my question would be like, who's making the decisions here? If all the software engineering work is done by models, it means humans don't.

1:34:07

Speaker D

Have any say in that. And this has a name, it's called technological singularity. When humans are not making decisions, it means we're not in charge. So this is not the future I'm building codespeak for. Nobody should build any projects for that future. In that future, we're gone. Your projects don't matter. So my assumption when I'm talking about the future is that the technological singularity is not happening. And so the basic assumption is humans are in charge.

1:34:17

Speaker C

And if humans are in charge, it's.

1:34:45

Speaker D

Their job to communicate intent.

1:34:47

Speaker C

So we have to say what kind.

1:34:49

Speaker D

Of software we need to build. And when we're talking about serious software, it's always complex.

1:34:51

Speaker C

There's no way.

1:34:58

Speaker D

There's some very simple thing, always has been, that will make a difference.

1:34:59

Speaker C

And when we talk about this complexity, this is what our jobs will be like, dealing, managing this complexity, figuring out what we actually need to do. And this is absolutely engineering. There is no way someone can tackle huge amounts of complexity without an engineer mindset. It can be called software engineering, it can be called something else, but you will have to do it you will have to navigate this complexity, organize this complexity, figure it out. And I'm not talking about the complexity of many, many layers of implementation. Maybe not. Maybe that is what's called accidental complexity.

1:35:03

Speaker D

Something that happens or arises from how we implement systems.

1:35:40

Speaker C

But there is also essential complexity. How we want it to behave is complex enough that we need to figure it out. And this is why I believe there will be teams of engineers working on systems like today.

1:35:45

Speaker D

Maybe they will be a lot more powerful teams, maybe fewer people can deliver a lot more software. Yes.

1:35:58

Speaker C

But still teams of people working on organizing complexity.

1:36:05

Speaker D

And this is what codespeak is for.

1:36:09

Speaker B

Going back to where we are today, with what the models can do today, what do you see with developer tools? It feels a little bit of a wild, wild west right now, very much so. I mean, there's a lot of, you know, obviously with cloud code, with cursor, with others. But what are areas that you think we will see? We will have to see new, different, better tools to actually just catch up with how we can generate and what parts feel the most messy and the most interesting. Especially because at Kotlin you have, and the team has built so many tools for developers.

1:36:11

Speaker D

Right. So I think, as I already mentioned, this year will be the year of making developer tools available to agents. And there are some technical challenges, but you can figure it out. The people will be doing that.

1:36:43

Speaker C

There's also a surprising advantage to using.

1:36:56

Speaker D

A good UI for your agent.

1:37:01

Speaker C

It's very nice to have everything in your terminal in one sense, but then.

1:37:02

Speaker D

You can have a lot better user experience if it's a dedicated environment. And the terminal tools, especially cloud code, are amazing. And it's a complete breakthrough of what you can do in a terminal, but generally you can do better in a specialized environment.

1:37:08

Speaker C

So I think we'll see more of.

1:37:25

Speaker D

This integration into development environments or just new development environments built from the ground up to work with agents primarily.

1:37:27

Speaker C

So that is an important thing. Since we are putting a lot more emphasis on review, there should be new tools for review.

1:37:37

Speaker D

And I think we can do better than what we're doing now in many respects.

1:37:44

Speaker C

I don't expect many breakthroughs in testing this year because it's hard.

1:37:49

Speaker D

I'm doing it right now. It's hard. It's not going to happen this year, but maybe some advances will arrive this year.

1:37:54

Speaker C

But generally, I think the big lesson of the last couple of years is that all the things that were, quote, unquote, obviously needed and, you know, the idea of connecting agents to developer tools was Absolutely the trivial thing to think.

1:38:01

Speaker D

Of two years ago, but they take.

1:38:20

Speaker C

A long time to happen because it's hard.

1:38:23

Speaker D

And, you know, nobody in this industry is lazy. Like everybody's working their asses, but it just takes time.

1:38:26

Speaker C

You need to figure out the basics.

1:38:34

Speaker D

Before you can do advanced things.

1:38:35

Speaker C

So all the straightforward ideas will get.

1:38:36

Speaker D

Implemented at some point.

1:38:40

Speaker B

I think there's been this massive jump with AI, especially over the winter break, where the coding agents, the clis, have become a lot more capable. And I know so many developers who are actually just prompting most of their code, if not all of it. It's just a massive, massive jump. I don't think we've seen anything this fast. I see a lot of engineers scared because it can shake you to the bone. You know, it took 10 years to get really good at coding and the writing the code part feels that it's kind of going out, you know, the trash can. You yourself have been coded for a longer time. What would your advice be for developers who are feeling like this? That they're feeling, you know, it is scary. I think we, and I talk with some folks. A lot of people message me as well. How are you thinking about this specifically? These last few months, it's really hard to give advice.

1:38:42

Speaker D

There are a few ideas I can share. So one thing is there's a lot.

1:39:29

Speaker C

Of hype and a lot of it.

1:39:34

Speaker D

Gets to the management and a lot of people make suboptimal decisions, but that will go away.

1:39:36

Speaker C

So there's more and more news about.

1:39:43

Speaker D

People not hiring junior developers, for example. This is dumb.

1:39:47

Speaker B

It's stupid.

1:39:51

Speaker C

This is dumb.

1:39:52

Speaker D

This is not gonna stay for long. I mean, it's hard to tell how long this can go on, but people will figure out that they need new people in the industry. And a lot of other things can.

1:39:53

Speaker C

Be really stressful in the moment, but some of them will be rolled back.

1:40:05

Speaker D

So that's one thing.

1:40:09

Speaker C

Another thing, it's absolutely worth it to.

1:40:11

Speaker D

Invest your time into learning these tools and getting good at it. There's a lot of skepticism around in the developer community about how useful it actually is. And I tried it on my project and it's no good.

1:40:15

Speaker C

There is quite a bit of skill to using these tools. Unfortunately, it's not super formalizable, at least so far.

1:40:30

Speaker D

Nobody figured out a really good, clear way of communicating how to do it well.

1:40:37

Speaker C

But there are people who can do it much better than others.

1:40:43

Speaker D

They not always can articulate why their prompts work better, but, you know, you.

1:40:46

Speaker C

Can learn it, you can get A.

1:40:51

Speaker D

Lot better at it.

1:40:53

Speaker C

And, you know, not necessarily believing everyone on Twitter. You know, some people claim crazy things.

1:40:54

Speaker D

But you can be very productive with these things when you use them well. And it's absolutely worth investing into that.

1:40:59

Speaker C

And yeah, so as I mentioned before, in the future, it will still be engineers building complex systems. So keep that in mind. It's not like we all go to nothing.

1:41:07

Speaker B

And for new grads, people coming out of university, what would your advice be for them who are determined? Like, all right, I actually want to be a standout engineer. Maybe with these tools, I can do it faster. What would you advise them to focus on either skills or experiences to get?

1:41:19

Speaker D

I guess it's a matter of what your inclinations are. If you can just become incredibly productive and put out a lot of working.

1:41:34

Speaker C

Code that is, like, really robust and you can evolve it for a long time, get good at that.

1:41:42

Speaker D

And, like, there is a lot to be done there.

1:41:49

Speaker C

If you can or like to do, like, harder things, go into the most hardcore things you can and get good at that, because it will be your rare expertise. It will be marketable. Even if that very thing goes away.

1:41:52

Speaker D

You will just become a lot smarter.

1:42:08

Speaker C

So, you know, generally, like, if you have any inclination in looking under the hood and figuring out how things work, go as deep as you can as.

1:42:11

Speaker D

A younger person, you have a lot.

1:42:20

Speaker C

Of mental capacity for that, and this helps a lot.

1:42:21

Speaker D

You become a very good expert in very wide fields just through drilling down on many things.

1:42:24

Speaker B

That's closing. I just wanted to do some rapid questions. I just ask and you shoot. What comes next? What is a favorite tool that you have? It can be digital. It doesn't have to be digital.

1:42:32

Speaker C

Well, I love my AirPods. They're incredibly convenient. They fit under my earmuffs. Well, another tool would be earmuffs.

1:42:43

Speaker D

Earmuffs.

1:42:51

Speaker C

Incredibly good.

1:42:51

Speaker B

Yeah, I saw you wearing it. I'll take that one. Earmuff. And what's a book recommendation that you would recommend and why?

1:42:53

Speaker D

There is this classic that's been recommended across the tech community for many years. It's called Zen and the Art of Motorcycle Maintenance.

1:42:59

Speaker B

I heard that. Recommended.

1:43:07

Speaker C

Yeah, it's a very good book. I mean, there is a part of.

1:43:09

Speaker D

It that's about technology and how to deal with the real systems and others. But it's also a very good novel. I really like it.

1:43:13

Speaker B

Male. Andrey, thank you so much. This was very interesting and I think inspiring as well.

1:43:20

Speaker C

Thank you very much. It was great to chat.

1:43:27

Speaker B

It was great.

1:43:29

Speaker A

Thank you.

1:43:30

Speaker B

The thing that struck me most from.

1:43:31

Speaker A

This conversation with Andrey was his observation about how we work with AI coding agents.

1:43:32

Speaker B

Today you talk to an agent in.

1:43:38

Speaker A

Plain English, it generates code, you commit the code. But that conversation, your actual intent, it disappears.

1:43:39

Speaker B

You communicate with the machine machine in.

1:43:46

Speaker A

Human language, but worked your teammates in code in machine language. Whether or not codespeak becomes the answer, what is sure that we're missing an intent layer and someone is going to figure out how to preserve it. If you enjoyed this episode, please do share with a colleague who's been thinking about where programming is headed and if you're not subscribed yet, now's a good time we have more conversations like this one coming. Thank you and see you in the next one.

1:43:48