<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Articles — Alex Usharovski</title>
  <subtitle>Articles by Alex Usharovski on Java, Spring, Hibernate, HTTP, parsing, guitar chord software and building apps with AI coding agents.</subtitle>
  <link href="https://usharik.dev/articles/"/>
  <link rel="self" href="https://usharik.dev/articles/feed.xml"/>
  <id>https://usharik.dev/articles/</id>
  <updated>2026-10-07T00:00:00Z</updated>
  <author><name>Alex Usharovski</name><uri>https://usharik.dev/</uri></author>
  <entry>
    <title>A one-person studio with an AI team</title>
    <link href="https://usharik.dev/articles/small-ai-team/"/>
    <id>https://usharik.dev/articles/small-ai-team/</id>
    <published>2026-10-07T00:00:00Z</published>
    <updated>2026-10-07T00:00:00Z</updated>
    <summary>How I build and ship four Android apps and two web apps with AI coding agents: who does what, the rules file that grows from every mistake, checks that agents cannot talk their way around, reviews by a second model, and where people still have to look.</summary>
  </entry>
  <entry>
    <title>How a computer finds guitar chord fingerings</title>
    <link href="https://usharik.dev/articles/chord-fingerings-engine/"/>
    <id>https://usharik.dev/articles/chord-fingerings-engine/</id>
    <published>2026-10-07T00:00:00Z</published>
    <updated>2026-10-07T00:00:00Z</updated>
    <summary>What happens between typing &quot;Am7&quot; and seeing a ranked list of fingerings: parsing the chord name, generating the playable shapes on twelve frets, fitting a hand to each shape, ranking them the way chord books do, naming a chord from a shape, and posing a 3D hand on the neck.</summary>
  </entry>
  <entry>
    <title>Liquibase in a Spring Boot 4 application</title>
    <link href="https://usharik.dev/articles/liquibase-spring-boot/"/>
    <id>https://usharik.dev/articles/liquibase-spring-boot/</id>
    <published>2026-10-07T00:00:00Z</published>
    <updated>2026-10-07T00:00:00Z</updated>
    <summary>Versioning a database schema with Liquibase 5 in Spring Boot 4: changelogs in YAML, ddl-auto=validate, generating a changeset by diffing the database against JPA entities with liquibase-hibernate7, and rollback, including the changelog path trap that makes a rollback silently do nothing.</summary>
  </entry>
  <entry>
    <title>Unidirectional and bidirectional relations in Hibernate 7</title>
    <link href="https://usharik.dev/articles/hibernate-relations/"/>
    <id>https://usharik.dev/articles/hibernate-relations/</id>
    <published>2026-10-07T00:00:00Z</published>
    <updated>2026-10-07T00:00:00Z</updated>
    <summary>Why a @OneToMany suddenly creates a join table, why @ManyToMany on both sides gives two of them, what mappedBy really does, and why setting only the inverse side saves a null foreign key. Every DDL and SQL statement here was printed by Hibernate 7.4.</summary>
  </entry>
  <entry>
    <title>Learning HTTP by writing a tiny web server in Java</title>
    <link href="https://usharik.dev/articles/java-http-server/"/>
    <id>https://usharik.dev/articles/java-http-server/</id>
    <published>2026-10-07T00:00:00Z</published>
    <updated>2026-10-07T00:00:00Z</updated>
    <summary>A web server on a bare socket in about a hundred lines of Java 21: the request line, headers, Content-Length, a request body, status codes and virtual threads, then the same with the JDK&#x27;s built-in HttpServer. What my 2019 version got wrong.</summary>
  </entry>
  <entry>
    <title>Recursive descent parsing, revisited in Java 21</title>
    <link href="https://usharik.dev/articles/recursive-descent-parser/"/>
    <id>https://usharik.dev/articles/recursive-descent-parser/</id>
    <published>2026-10-07T00:00:00Z</published>
    <updated>2026-10-07T00:00:00Z</updated>
    <summary>How to parse arithmetic expressions by recursive descent: a grammar, operator precedence and associativity, unary minus, powers and functions, with a small Java 21 parser built on records and sealed interfaces.</summary>
  </entry>
</feed>
