Kotlin
2026-08-21 09:00
The JVM already had Java.
And Groovy, Scala, Clojure, JRuby, Jython.
So why another one?
No new computational model.
No abandoning your libraries.
No abandoning your existing code.
statically typed · concise · safe · interoperable
Each on its own is unremarkable.
All four at once is the whole argument.
Nearly every design decision traces back to interoperability.
Kotlin could have been safer, more concise, more purely functional —
if it were willing to break from Java. It is not.
The oldest is: Person(name=Bob, age=29)
Several dozen lines.
Most of it mechanical.
equals, hashCode, toString generatedage defaults to nullList<Person> never written down?: supplies a fallback$oldest in the stringEnforced by the compiler.
The single feature Kotlin is best known for.
Its purpose is to make later units read as explanations
rather than a list of features arriving from nowhere.
No boilerplate. No getters, no constructor body, no equals.
The query describes the result, rather than a procedure for getting it.
Like Java. Unlike Groovy or JRuby.
The compiler verifies that what you call actually exists.
Every one is as strongly typed as a declaration with the type spelled out.
The same thing, said twice, and neither half optional.
Kotlin does not remove a guarantee to gain convenience.
It keeps the guarantee and removes the ceremony.
Watch for it in nullability, smart casts, data classes, delegated properties.
Classes, interfaces, inheritance — all still there.
Plus a full functional capability.
You choose per problem, not per language.
Conciseness — a function-as-value replaces a block of code.
Safe multithreading — immutable data cannot be corrupted by concurrent access.
Easier testing — no setup, no mocks. Call it, check the result.
Not “helps you manage synchronisation bugs”.
Eliminates the category. There is nothing to corrupt.
Web applications, backends, microservices.
Not because Kotlin is better at HTTP.
Because it uses every Java framework unchanged, one file at a time.
Where the benefits concentrate.
Many small screens → boilerplate matters.
A NullPointerException → a crash the user sees.
Both look like new syntax.
Neither is.
Ordinary Kotlin — functions, lambdas, operator conventions.
A for loop inside markup.
Type-checked. Completed by the IDE.
No template engine can offer that.
Pragmatic · Concise · Safe · Interoperable
Between them they explain nearly every design decision.
A practical language for real problems.
Not a research vehicle. Features mostly proven elsewhere.
And no imposed architecture.
Reading takes longer than writing.
So remove the ceremony, and the reader sees intent.
But not cryptic operators. Short is not the goal; clear is.
The most common runtime failure on the JVM —
converted into a compile error.
Java requires the check and the cast. The same fact, twice.
Same principle as type inference, applied to control flow.
Kotlin calls Java. Java calls Kotlin.
Kotlin’s collections are Java collections.
Which is the only way a language ever gets adopted at all.
Bills that come due later in the module:
Both compromises. Both more instructive than the clean design.
kotlinc hello.kt -include-runtime -d hello.jar
java -jar hello.jar
In practice: Gradle, Maven, or the IDE.
Plus the Kotlin runtime library — small, shipped with the application.
Kotlin produces the same artefacts Java does. Therefore:
.kt file compiles alongside a Java projectThe interoperability commitment
falls out of the compilation model.
A short program and what makes it short.
The traits, the philosophy, the toolchain.
Nothing explained fully. Everything returns.
String and String? are different types.Kotlin Basics stops surveying and starts teaching.
Functions and variables, classes and properties, when, smart casts, loops, exceptions.
By the end you write small programs instead of only reading them.
Kotlin · Kotlin: What and Why