<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Articles on The Culture of Code</title><link>https://kpavlov.me/blog/</link><description>Thoughts on Software Development</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Mon, 06 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://kpavlov.me/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Higher-Order Attacks on AI Code Agents</title><link>https://kpavlov.me/blog/agent-higher-order-attacks/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/agent-higher-order-attacks/</guid><description>Direct prompt injection is just the beginning. Higher-order attacks manipulate agents into producing malicious code, propagating intent across systems, and persisting vulnerabilities long-term.</description></item><item><title>When Your AI Code Agent Becomes an RCE Engine</title><link>https://kpavlov.me/blog/agent-prompt-injection-basics/</link><pubDate>Sun, 05 Apr 2026 21:00:00 +0300</pubDate><guid>https://kpavlov.me/blog/agent-prompt-injection-basics/</guid><description>If your AI code agent treats repository content as instructions, any contributor can execute commands. This article maps the direct injection attack surface and practical defenses.</description></item><item><title>Javable: generate Java-friendly wrappers for Kotlin with KSP</title><link>https://kpavlov.me/blog/javable/</link><pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/javable/</guid><description>Javable is a KSP2 processor that generates Java-friendly wrappers for Kotlin classes, turning suspend functions into CompletableFuture, Flow into Stream, and handling CoroutineScope lifecycle automatically.</description></item><item><title>kotlinx-schema: Three Ways to Generate JSON Schemas from Kotlin Code</title><link>https://kpavlov.me/blog/kotlinx-schema/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/kotlinx-schema/</guid><description>Every time you rename a Kotlin function parameter, the hand-written JSON schema your LLM reads is wrong — and it fails silently. kotlinx-schema derives the schema from your Kotlin types directly, via three strategies that cover runtime and compile-time generation across all Kotlin Multiplatform targets.</description></item><item><title>Mokksy: a mock server that actually streams — and why your AI app needs integration tests</title><link>https://kpavlov.me/blog/mokksy/</link><pubDate>Sat, 28 Feb 2026 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/mokksy/</guid><description>Why unit tests alone won&amp;rsquo;t save your LLM application in production, and how Mokksy — a Kotlin mock server with true SSE and streaming support — fills the gap that WireMock leaves wide open.</description></item><item><title>Open source deserves better than 'Move Fast'</title><link>https://kpavlov.me/blog/open-source-mindset/</link><pubDate>Mon, 09 Feb 2026 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/open-source-mindset/</guid><description>Open-source libraries may power critical systems where failures have severe consequences. AI tools now eliminate the excuse of insufficient testing time, but engineers must own the final quality decision.</description></item><item><title>Introducing Kotlinx-schema: generate JSON Schema from Kotlin types and functions</title><link>https://kpavlov.me/blog/kotlinx-schema/</link><pubDate>Fri, 30 Jan 2026 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/kotlinx-schema/</guid><description>Generate JSON Schema for Kotlin Multiplatform models and API functions, so your schema stays in sync with your code.</description></item><item><title>Weekend hack: Kotlin Symbol Processing Maven plugin</title><link>https://kpavlov.me/blog/ksp-maven-plugin/</link><pubDate>Sun, 16 Nov 2025 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/ksp-maven-plugin/</guid><description>KSP only works with Gradle, leaving Maven users out in the cold. I built ksp-maven-plugin to fix that - minimal setup, auto-discovers processors, integrates with Maven&amp;rsquo;s lifecycle. Now you can use KSP-powered libraries like Room, Moshi, and Dagger in your Maven projects.</description></item><item><title>The cookie story: when build failures became sweet accountability</title><link>https://kpavlov.me/blog/the-cookie-story/</link><pubDate>Sat, 19 Jul 2025 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/the-cookie-story/</guid><description>A deceptively simple rule transforms a chaotic development team: break the build, buy cookies. What starts as lighthearted motivation evolves into a psychological experiment in collective responsibility and technical excellence. Twelve developers, one trunk, zero tolerance for broken builds—watch as pair programming sessions intensify, commits shrink to surgical precision, and a team discovers that the path to engineering perfection is paved with chocolate chips and mutual accountability. Sometimes the most profound transformations begin with the smallest consequences.</description></item><item><title>LLM evaluation testing with promptfoo: a practical guide</title><link>https://kpavlov.me/blog/llm-evaluation-testing-with-promptfoo-a-practical-guide/</link><pubDate>Fri, 06 Jun 2025 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/llm-evaluation-testing-with-promptfoo-a-practical-guide/</guid><description>This article shows how to implement automated testing for LLM applications using &lt;em&gt;promptfoo&lt;/em&gt; with a real application server, addressing the challenge that traditional testing methods fail with non-deterministic AI responses. The guide demonstrates testing conversation memory, tool integration, content moderation, and performance using a financial chatbot built with Quarkus and LangChain4j.</description></item><item><title>Contract-first vs. code-first development: why API contracts matter from day one</title><link>https://kpavlov.me/blog/contract-first-vs-contract-last/</link><pubDate>Sat, 12 Apr 2025 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/contract-first-vs-contract-last/</guid><description>Discover why starting with API contracts first—not code—leads to clearer, more maintainable microservices. Learn the differences between contract-first and code-first approaches, common pitfalls to avoid, and why even small teams building alpha products benefit from clearly defined interfaces from day one. Get practical workflow tips and see how this approach can dramatically reduce integration headaches as your system grows.</description></item><item><title>From monoliths to AI proxies: real-world strategy for testing and evolving LLM integrations</title><link>https://kpavlov.me/blog/ai-proxy-pattern/</link><pubDate>Mon, 18 Nov 2024 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/ai-proxy-pattern/</guid><description>Integrating Large Language Models (LLMs) into production systems presents unique architectural, testing, and operational challenges. This article shares practical insights and solutions from real-world experience integrating LLMs into a customer interaction platform. It covers the evolution from a monolithic to a more modular AI Proxy architecture pattern, strategies for testing, deploying and monitoring LLMs, and the emerging Model Context Protocol (MCP) standard. Application developers and software architects will learn proven practices to build robust, reliable and responsible LLM-powered systems.</description></item><item><title>Kotlin extensions for LangChain4j</title><link>https://kpavlov.me/blog/kotlin-extensions-for-langchain4j/</link><pubDate>Sat, 09 Nov 2024 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/kotlin-extensions-for-langchain4j/</guid><description>Discover Kotlin extensions for LangChain4j designed to transform the synchronous LangChain4j API into a modern, non-blocking experience with Kotlin Coroutines. Learn about key features including coroutine support for ChatLanguageModels, Kotlin Flow for streaming responses, external customizable prompt templates, and non-blocking document processing. Enhance your Kotlin programming skills and improve application efficiency by leveraging these powerful new tools.</description></item><item><title>Keeping your software healthy: the critical role of dependency updates</title><link>https://kpavlov.me/blog/keeping-your-software-healthy-the-critical-role-of-dependency-updates/</link><pubDate>Sat, 13 Apr 2024 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/keeping-your-software-healthy-the-critical-role-of-dependency-updates/</guid><description>Discover best practices for effective dependency management in software development and learn strategies to keep your projects secure, efficient, and free of technical debt. This comprehensive guide covers the critical importance of regularly updating dependencies, utilizing automated tools and processes to streamline dependency management, fostering a culture of proactive updates through incentives and education, and implementing organization-wide dependency management strategies at scale. Whether you&amp;rsquo;re an application developer, software architect, or engineering manager, this article provides actionable insights to help you master dependency updates and ensure your software stays healthy and high-performing.</description></item><item><title>Spring Boot starters</title><link>https://kpavlov.me/blog/spring-boot-starters/</link><pubDate>Mon, 08 Apr 2024 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/spring-boot-starters/</guid><description>This post discusses Spring Boot Starters and their importance to developers, who want to make the setup and configuration of Spring Boot applications a whole lot easier. It keeps dependencies organized, increases development speed, and grants you numerous options for customization and extension. This basically makes them indispensable in building all manner of applications with Spring Boot - from simple web applications to data access and security services. I showcase, with a practical example, how to create a custom Spring Boot Starter that consolidates logging configurations and standard dependencies across microservices. This guide provides step-by-step instructions on how to create and use a custom starter.</description></item><item><title>Code review best practices</title><link>https://kpavlov.me/blog/code-review-best-practices/</link><pubDate>Tue, 21 Sep 2021 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/code-review-best-practices/</guid><description>&lt;p&gt;Code review is a crucial practice in software development.
One can design and write great software, but we are humans after all.
And all humans make mistakes, so another pair of eyes is always helpful.&lt;/p&gt;
&lt;p&gt;The review process might seem straightforward,
but there are useful tips to make it less painful is some cases.&lt;/p&gt;</description></item><item><title>Running Testcontainers on dynamic ports</title><link>https://kpavlov.me/blog/running-testcontainers-on-dynamic-ports/</link><pubDate>Mon, 13 Apr 2020 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/running-testcontainers-on-dynamic-ports/</guid><description>&lt;p&gt;Running integration tests locally with Docker can be challenging when fixed ports are unavailable due to conflicts. This issue is compounded in shared CI environments where multiple workers are in use. However, using &lt;a href="https://www.testcontainers.org/"&gt;testcontainers&lt;/a&gt; can help overcome these obstacles by enabling the startup of Docker containers that listen on random ports.&lt;/p&gt;</description></item><item><title>Kotlin Playground shortcode for Hugo</title><link>https://kpavlov.me/blog/kotlin-playground-shortcode-hugo/</link><pubDate>Sat, 11 Apr 2020 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/kotlin-playground-shortcode-hugo/</guid><description>Kotlin Playground is HTML component which creates Kotlin-aware editors capable of running
code from HTML block elements.
Here I explain how to embed runnable Kotlin code block in your Hugo-powered blog.</description></item><item><title>Spring Boot configuration best practices</title><link>https://kpavlov.me/blog/spring-boot-configuration-practices/</link><pubDate>Fri, 05 Jul 2019 13:59:34 +0000</pubDate><guid>https://kpavlov.me/blog/spring-boot-configuration-practices/</guid><description>Spring Boot comes with very neat configuration mechanism.
Default application configuration is defined
in one configuration file and environment specific setting in separate files.
But still, this mechanism is often not used properly resulting in verbose
and unmaintainable configurations.</description></item><item><title>What happens when you split systems into many microservices</title><link>https://kpavlov.me/blog/what-happens-when-you-split-systems-into-many-microservices/</link><pubDate>Fri, 15 Feb 2019 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/what-happens-when-you-split-systems-into-many-microservices/</guid><description>&lt;p&gt;Moving from monolithic applications into microservices is current trend in software design.
Let&amp;rsquo;s identify some pros and cons of both architectures and challenges one may face during the system transformation.&lt;/p&gt;</description></item><item><title>Building data pipeline with Kotlin coroutines actors</title><link>https://kpavlov.me/blog/building-kotlin-data-pipelines/</link><pubDate>Wed, 30 Jan 2019 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/building-kotlin-data-pipelines/</guid><description>This blog post demonstrates how to build a data processing pipeline using Kotlin coroutines and actors, showing both single-threaded and parallel implementations. It walks through creating a simple data pipeline using Kotlin&amp;rsquo;s channel and actor abstractions for clean concurrent programming. The post includes practical code examples of handling message passing between actors, managing thread pools, implementing back-pressure, and scaling from a basic sequential pipeline to a parallel version that processes data more efficiently. The explanation is backed by detailed logging output that illustrates how messages flow through the system and how parallel processing improves overall performance.</description></item><item><title>Applying courage in software development</title><link>https://kpavlov.me/blog/courage-in-software-development/</link><pubDate>Wed, 23 Jan 2019 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/courage-in-software-development/</guid><description>&lt;p&gt;Job is not a place for feats.
But sometimes you have to be brave to overcome and complete that others considered impossible.&lt;/p&gt;</description></item><item><title>How does new Oracle JVM licensing encourage agility</title><link>https://kpavlov.me/blog/new-oracle-jvm-licensing-to-encourage-agility/</link><pubDate>Tue, 23 Oct 2018 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/new-oracle-jvm-licensing-to-encourage-agility/</guid><description>Oracle&amp;rsquo;s revised JDK policy requires companies to update Java every 6 months to maintain free security patches, since only short-term OpenJDK builds remain free for production use. This pushes organizations to automate testing and embrace more frequent deployments, as manual testing of bi-annual updates would be too costly. The article suggests this change naturally leads companies toward shorter release cycles and faster market adaptation.</description></item><item><title>Common Java application anti-patterns and their solutions</title><link>https://kpavlov.me/blog/typical-mistake-in-webservice-design/</link><pubDate>Fri, 19 Oct 2018 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/typical-mistake-in-webservice-design/</guid><description>Software projects often run into trouble when developers mix different code layers together. The article explains how this leads to rigid, brittle code that&amp;rsquo;s hard to update and reuse. Software architecture problems are examined through biological cell analogies. A practical guide follows for improving existing systems without full rewrites, focusing on testing, API design, and gradual changes.</description></item><item><title>Customizing REST API Error Response in Spring Boot / Spring-Security-OAuth2</title><link>https://kpavlov.me/blog/customizing-rest-api-error-response-in-spring-boot-/-spring-security-oauth2/</link><pubDate>Thu, 28 Jun 2018 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/customizing-rest-api-error-response-in-spring-boot-/-spring-security-oauth2/</guid><description>&lt;p&gt;Defining error format is important part of REST API design.&lt;/p&gt;
&lt;p&gt;Spring-Boot and Spring Security provide pretty nice
error handling for RESTful APIs out of the box.
Although it has to be documented, especially
when contract-first approach to API design is used.&lt;/p&gt;
&lt;p&gt;It is good idea to follow some common format
for error responses. But OAuth2 specification and Spring Boot
format may not satisfy those requirements.&lt;/p&gt;</description></item><item><title>The Programmers Oath</title><link>https://kpavlov.me/blog/the-programmers-oath/</link><pubDate>Sat, 08 Jul 2017 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/the-programmers-oath/</guid><description>&lt;p&gt;A must-see speech by &lt;a href="https://twitter.com/unclebobmartin"&gt;Robert &amp;ldquo;Uncle Bob&amp;rdquo; Martin&lt;/a&gt; on programmers responsibilities in digital world and 9 principles every programmer should follow (&amp;ldquo;The Coders&amp;rsquo; Code&amp;rdquo;).&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/Tng6Fox8EfI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Logging policy</title><link>https://kpavlov.me/blog/logging-policy/</link><pubDate>Tue, 28 Mar 2017 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/logging-policy/</guid><description>&lt;p&gt;There are different points of view on how logging levels should be used in code. I will share mine.&lt;/p&gt;
&lt;p&gt;My assumption is: &lt;strong&gt;&amp;ldquo;There should be no errors in logs when everything is fine.&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Maximizing efficiency with UI-first development: a client-centric approach to project success</title><link>https://kpavlov.me/blog/ui-first-development/</link><pubDate>Tue, 07 Mar 2017 08:48:34 +0000</pubDate><guid>https://kpavlov.me/blog/ui-first-development/</guid><description>&lt;p&gt;One of the challenges for start-ups or any new project is to reduce the amount of work while still delivering a full-featured product. Agile methodologies address this challenge on the project management level. Let&amp;rsquo;s discuss another approach to address it on the architecture level: &lt;em&gt;&lt;strong&gt;UI-first development.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>How to Start Testing UI Before Backend is Ready</title><link>https://kpavlov.me/blog/how-to-start-testing-ui-before-backend-is-ready/</link><pubDate>Thu, 23 Feb 2017 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/how-to-start-testing-ui-before-backend-is-ready/</guid><description>Testing web UIs before the backend is ready: create UI mockups first using fake data, turn them into a functional prototype, test thoroughly, then build the backend to match the UI data contract. Integrate frontend and backend at the end. Works for single-page apps and multi-page sites.</description></item><item><title>Developing in "dirty trunk"</title><link>https://kpavlov.me/blog/developing-in-dirty-trunk/</link><pubDate>Fri, 04 Mar 2016 22:26:24 +0000</pubDate><guid>https://kpavlov.me/blog/developing-in-dirty-trunk/</guid><description>The &amp;ldquo;dirty trunk&amp;rdquo; branching strategy involves committing directly to the main branch, with CI builds triggered on each commit. While simple, it requires discipline and quick fixes to maintain build stability. The article discusses pros, cons, and best practices for this approach.</description></item><item><title>Secure Java coding best practices</title><link>https://kpavlov.me/blog/secure-java-coding-best-practices/</link><pubDate>Sat, 01 Aug 2015 00:00:00 +0000</pubDate><guid>https://kpavlov.me/blog/secure-java-coding-best-practices/</guid><description>&lt;p&gt;Making your web application flawless against security attacks is a challenge for every java developer.
In this article I will briefly describe common practical development techniques that can help you to achieve it.&lt;/p&gt;</description></item><item><title>Secure Java logging with Logback</title><link>https://kpavlov.me/blog/secure-java-logging-with-logback/</link><pubDate>Sun, 26 Jul 2015 14:01:33 +0000</pubDate><guid>https://kpavlov.me/blog/secure-java-logging-with-logback/</guid><description>&lt;p&gt;Deploying application into secure environment adds some restrictions on logging and log management.
OWASP community gives some useful recommendations.&lt;/p&gt;</description></item><item><title>Implementing Automatic Reconnection for Netty Client</title><link>https://kpavlov.me/blog/implementing-automatic-reconnection-for-netty-client/</link><pubDate>Wed, 08 Jul 2015 07:48:05 +0000</pubDate><guid>https://kpavlov.me/blog/implementing-automatic-reconnection-for-netty-client/</guid><description>&lt;p&gt;One of the first requirement of &lt;a href="https://github.com/kpavlov/jreactive-8583"&gt;Netty ISO8588 client connector&lt;/a&gt; is the support for automatic reconnect.&lt;/p&gt;
&lt;p&gt;One of the first receipts I came across was &lt;a href="http://tterm.blogspot.com/2014/03/netty-tcp-client-with-reconnect-handling.html"&gt;Thomas Termin&amp;rsquo;s one&lt;/a&gt;. He suggests adding a ChannelHandler which will schedule the calling of client&amp;rsquo;s &lt;code&gt;connect()&lt;/code&gt; method once a Channel becomes inactive. Plus adding ChannelFutureListener which will re-create a bootstrap and re-connect if initial connection was failed.&lt;/p&gt;
&lt;p&gt;Although this is a working solution, I had a feeling that something is not optimal. Namely, the new Bootstrap is being created on every connection attempt.&lt;/p&gt;
&lt;p&gt;So, I created a FutureListener which should be registered once a Channel is closed.&lt;/p&gt;</description></item></channel></rss>