Andrey Minogin

JVM & PostgreSQL performance

  • Immutability vs concurrency: making a fast graph writable

    An in-memory graph is fast until you need to write to it. Making the whole structure immutable is too expensive, locking every read kills the point — here’s the middle path: optimistic reads over StampedLock plus immutable nested lists.

    Immutability vs concurrency: making a fast graph writable
  • When Postgres is the wrong place to traverse the graph

    Recursive CTEs hit an O(b^D) wall, and no amount of indexing or tuning moves it. Why deep graph traversal doesn’t belong in the database at all, and what it looks like once you move it into the JVM.

    When Postgres is the wrong place to traverse the graph
  • Behavioral drift: silent bugs in LLM workflows

    One line went missing from a system prompt and the classifier started returning markdown instead of an enum. The bug passed every schema check. Why validation can’t catch this class of failure, and what to do instead.

    Behavioral drift: silent bugs in LLM workflows
  • Hexagonal architecture

    Ports and adapters is usually sold as a way to separate business logic from technical details. The more useful part: naming a port forces you to decide what is actually essential to your domain and what is just an implementation you happened to pick.

    Hexagonal architecture
  • Robust and convenient Kotlin primitives

    Hundreds of indistinguishable val id: Int properties, and one swapped argument is a security breach. Kotlin value classes give every id its own type at near-zero runtime cost — including in jOOQ.

    Robust and convenient Kotlin primitives
  • Kotlin IR: Transforming DSL at Compile-Time

    Type-safe DSL syntax and runtime flexibility usually pull in opposite directions. A compiler plugin resolves both: the user writes code that satisfies the type checker, and an IR transformer swaps the call for a real matcher object before bytecode.

    Kotlin IR: Transforming DSL at Compile-Time
  • Kotlin IR: Unlocking Incredible Possibilities for Code Manipulation

    Runtime bytecode manipulation can’t turn an int into an Int, and Kotlin’s null-safety metadata is gone by then anyway. Why hijacking the compiler through IR turned out to be the workable route.

    Kotlin IR: Unlocking Incredible Possibilities for Code Manipulation
  • Reducing memory usage 10 times with High-Performance Primitive Collections

    A HashSet with 100 million entries takes 5 GB. The same data in an HPPC IntHashSet takes 518 MB. Where the difference comes from and when it’s worth reaching for primitive collections.