<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Blog of Vincent VAUBAN</title>
    <description>Vincent VAUBAN's blog: github | coding | freebies | book | video | mashup | angular | quote | self-promo | java | mooc | workplace | anglican | team</description>
    <link>https://blog.vvauban.com/</link>
    <atom:link href="https://blog.vvauban.com/blog/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>☕🤖 JAVA’S AGE is its AI SUPERPOWER</title>
      <pubDate>Sat, 26 Sep 2026 11:01:51 -0700</pubDate>
      <link>https://blog.vvauban.com/blog/java-s-age-is-its-ai-superpower</link>
      <guid>https://blog.vvauban.com/blog/java-s-age-is-its-ai-superpower</guid>
      <description>&lt;p&gt;🔸 TL;DR&lt;/p&gt;&lt;p class=" undefined"&gt;Java Champion Markus Eisele argues that Java’s history, strictness, specs, tooling and guardrails make it ideal for agentic enterprise development.&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;🔸 1️⃣0️⃣ MARKUS EISELE QUOTES&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ [“It is a very strict language, it is pretty type safe.”] / Clear constraints help agents read and generate code. / #Java&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ [“You know what, it's rock solid.”] / JVM stability becomes an advantage when AI touches production systems. / #JVM&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ [“Java itself is not the complication.”] / The hard part is legacy code, undocumented intent and old decisions. / #Legacy&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ [“So systematic change, almost surgically changing pieces that are guaranteed to work is a completely different requirement in my perspective compared to Vibe coding in loops.”] / Enterprise AI needs precision, not uncontrolled generation. / #AI&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ [“I have to admit, I lean towards precision engineering because it is just so much better to know what is actually changing, to be in Control.”] / Controlled change beats maximum generation. / #Engineering&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ [“Like, human in the loop to me means human in control.”] / Developers should stay inside the workflow, not only review the final diff. / #Control&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;a href="https://javafullstack2027.mystrikingly.com" data-type="undefined"...&lt;a href=https://blog.vvauban.com/blog/java-s-age-is-its-ai-superpower&gt;Read More&lt;/a&gt;</description>
    </item>
    <item>
      <title>☕➿ JAVA CERTIFICATION LOOP: can you find the OUTPUT in 20 seconds?</title>
      <pubDate>Sat, 26 Sep 2026 10:49:52 -0700</pubDate>
      <link>https://blog.vvauban.com/blog/java-certification-loop-can-you-find-the-output-in-20-seconds</link>
      <guid>https://blog.vvauban.com/blog/java-certification-loop-can-you-find-the-output-in-20-seconds</guid>
      <description>&lt;p&gt;🔸 TLDR&lt;/p&gt;&lt;p class=" undefined"&gt;You have 20 seconds. ⏱️&lt;/p&gt;&lt;p class=" undefined"&gt;What does this Java code print?&lt;/p&gt;&lt;p&gt;No IDE.&lt;/p&gt;&lt;p class=" undefined"&gt;No debugger.&lt;/p&gt;&lt;p class=" undefined"&gt;No running the code. 👀&lt;/p&gt;&lt;p class=" undefined"&gt;Just trace it like you would during a Java certification exam.&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;This tiny question combines:&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ i++ — use the value, then increment&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ ++i — increment first, then use the value&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ do-while — the body executes before the condition is checked&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ continue outer — jump directly to the loop condition&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;⏱️ Target time: 20 seconds&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;🔸 TAKEAWAYS&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ Never treat i++ and ++i as interchangeable.&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ With continue, check exactly where execution resumes.&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ In certification questions, trace variables statement by statement.&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ Tiny loops can test much more than loop syntax.&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;What does it print? 👇&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;#Java #JavaCertification #OCPJava #Java25 #JavaQuiz #JavaDeveloper #Programming #CodingChallenge #JavaProgramming&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;Go further with Java certification:&lt;/p&gt;&lt;p class=" undefined"&gt;Java👇&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;a href="https://bit.ly/javaOCP" data-type="undefined" target="_blank"&gt;https://bit.ly/javaOCP&lt;/a&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;Spring👇&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;a href="https://bit.ly/2v7222"...&lt;a href=https://blog.vvauban.com/blog/java-certification-loop-can-you-find-the-output-in-20-seconds&gt;Read More&lt;/a&gt;</description>
    </item>
    <item>
      <title>☕🔮 If you’re only learning what’s stable in Java TODAY, you may already be LATE.</title>
      <pubDate>Sat, 26 Sep 2026 10:46:29 -0700</pubDate>
      <link>https://blog.vvauban.com/blog/if-you-re-only-learning-what-s-stable-in-java-today-you-may-already-be-late</link>
      <guid>https://blog.vvauban.com/blog/if-you-re-only-learning-what-s-stable-in-java-today-you-may-already-be-late</guid>
      <description>&lt;p&gt;The next wave of Java is often visible before it becomes mainstream.&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;That’s exactly why my book is called Fullstack Dev 2027 for Java Tech.&lt;/p&gt;&lt;p class=" undefined"&gt;Java doesn’t evolve only through features that are already final.&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;There are also:&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ Preview features&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ Incubator projects&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ Upcoming JVM capabilities&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ Experimental APIs&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ New approaches emerging across Spring, AI and backend engineering&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;Some of them will become mainstream.&lt;/p&gt;&lt;p class=" undefined"&gt;Some will change.&lt;/p&gt;&lt;p class=" undefined"&gt;Some may disappear.&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;But understanding them before everybody else does gives you something valuable:&lt;/p&gt;&lt;p class=" undefined"&gt;👉 technical anticipation.&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;That’s why the book isn’t only about what Java development looks like today.&lt;/p&gt;&lt;p class=" undefined"&gt;It also explores technologies and ideas that can shape the next releases and the next years.&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;The goal?&lt;/p&gt;&lt;p class=" undefined"&gt;Not to predict the future perfectly.&lt;/p&gt;&lt;p class=" undefined"&gt;It’s to make sure that when the future becomes production-ready, you’ve already seen it coming. 🚀&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;And of course, the book also covers the practical stack you need NOW:&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ Java &amp; JVM&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ Spring Boot &amp; Spring...&lt;a href=https://blog.vvauban.com/blog/if-you-re-only-learning-what-s-stable-in-java-today-you-may-already-be-late&gt;Read More&lt;/a&gt;</description>
    </item>
    <item>
      <title>☕🐢 PERFORMANCE PITFALLS in JPA and Friends</title>
      <pubDate>Sat, 26 Sep 2026 10:41:56 -0700</pubDate>
      <link>https://blog.vvauban.com/blog/performance-pitfalls-in-jpa-and-friends</link>
      <guid>https://blog.vvauban.com/blog/performance-pitfalls-in-jpa-and-friends</guid>
      <description>&lt;p&gt;🔸 TLDR&lt;/p&gt;&lt;p class=" undefined"&gt;JPA abstracts a lot of database complexity.&lt;/p&gt;&lt;p class=" undefined"&gt;That convenience can also hide expensive connections, N+1 queries, eager fetching, unnecessary entity loading and transactions that live far longer than expected.&lt;/p&gt;&lt;p class=" undefined"&gt;Jos Roseboom's talk is packed with practical reminders.&lt;/p&gt;&lt;p class=" undefined"&gt;🎥 &lt;a href="https://www.youtube.com/watch?v=RjnXUFyXlno" data-type="undefined" target="_blank"&gt;https://www.youtube.com/watch?v=RjnXUFyXlno&lt;/a&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;7️⃣PERFORMANCE LESSONS FROM THE TALK👇&lt;/p&gt;&lt;p class=" undefined"&gt;1️⃣ ["it's like five five thousand times faster."]&lt;/p&gt;&lt;p class=" undefined"&gt;Connection pooling isn't a tiny optimization. Reusing connections can be orders of magnitude faster than repeatedly creating new database connections.&lt;/p&gt;&lt;p class=" undefined"&gt;#ConnectionPooling&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;2️⃣ ["the amount of connections is finite."]&lt;/p&gt;&lt;p class=" undefined"&gt;A pool is fast, but not infinite. Holding connections longer than necessary can make unrelated requests wait and eventually threaten the availability of the whole application.&lt;/p&gt;&lt;p class=" undefined"&gt;#HikariCP&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;3️⃣ ["by default it's fetched eager."]&lt;/p&gt;&lt;p class=" undefined"&gt;JPA's default for @ManyToOne and owning-side @OneToOne can surprise you. Associations you never explicitly use may still trigger additional SQL.&lt;/p&gt;&lt;p class=" undefined"&gt;#JPA&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;4️⃣ ["this is an N + 1 problem."]&lt;/p&gt;&lt;p class=" undefined"&gt;One query retrieves the main result set, then additional queries are executed as associated entities are accessed. It looks harmless with 10 rows and painful with 10,000.&lt;/p&gt;&lt;p class="...&lt;a href=https://blog.vvauban.com/blog/performance-pitfalls-in-jpa-and-friends&gt;Read More&lt;/a&gt;</description>
    </item>
    <item>
      <title>☕🧠 Does JAVA use TOO MUCH MEMORY?</title>
      <pubDate>Sat, 26 Sep 2026 10:39:21 -0700</pubDate>
      <link>https://blog.vvauban.com/blog/does-java-use-too-much-memory</link>
      <guid>https://blog.vvauban.com/blog/does-java-use-too-much-memory</guid>
      <description>&lt;p&gt;🔸 TLDR&lt;/p&gt;&lt;p class=" undefined"&gt;Ron Pressler's JavaOne 2026 argument flips the usual criticism of Java memory use:&lt;/p&gt;&lt;p class=" undefined"&gt;Java's moving, generational GCs deliberately trade more RAM for less CPU overhead.&lt;/p&gt;&lt;p class=" undefined"&gt;The real question is not “How little RAM does Java use?”&lt;/p&gt;&lt;p class=" undefined"&gt;It is “How efficiently does it use the CPU + RAM we already paid for?”&lt;/p&gt;&lt;p&gt;🎥 &lt;a href="https://www.youtube.com/watch?v=xr73mR7ii9M" data-type="undefined" target="_blank"&gt;https://www.youtube.com/watch?v=xr73mR7ii9M&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;🔸 1️⃣0️⃣ VERBATIMS&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ ["Together they form the spacetime of computation."]&lt;/p&gt;&lt;p class=" undefined"&gt;Memory and processing are two sides of the same performance equation. #Performance&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ ["The program's footprint is always equal to the live set."]&lt;/p&gt;&lt;p class=" undefined"&gt;Immediate reclamation minimizes footprint—but that can cost CPU. #Memory&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ ["Dynamic dispatch in Java is often faster than static dispatch in C++."]&lt;/p&gt;&lt;p class=" undefined"&gt;Abstraction cost cannot be compared naively across languages. #JVM&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ ["Most objects die young."]&lt;/p&gt;&lt;p class=" undefined"&gt;That empirical observation is the foundation of generational GC. #GarbageCollection&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ ["RAM chips become hardware accelerators."]&lt;/p&gt;&lt;p class=" undefined"&gt;Extra heap headroom can reduce GC CPU overhead. #Java&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ ["There's no prize for using only 1% of RAM and 100% of the CPU."]&lt;/p&gt;&lt;p class=" undefined"&gt;A tiny footprint is...&lt;a href=https://blog.vvauban.com/blog/does-java-use-too-much-memory&gt;Read More&lt;/a&gt;</description>
    </item>
    <item>
      <title>☕🍃 SEQUENTIAL MICROSERVICES can quietly KILL your AVAILABILITY</title>
      <pubDate>Sat, 26 Sep 2026 10:36:36 -0700</pubDate>
      <link>https://blog.vvauban.com/blog/sequential-microservices-can-quietly-kill-your-availability</link>
      <guid>https://blog.vvauban.com/blog/sequential-microservices-can-quietly-kill-your-availability</guid>
      <description>&lt;p&gt;🔸 TLDR&lt;/p&gt;&lt;p class=" undefined"&gt;If one request requires Inventory → Payment → Transport to ALL succeed, your availability is not 99.5%.&lt;/p&gt;&lt;p class=" undefined"&gt;It is the product of their availabilities.&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ Inventory: 99.5%&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ Payment: 99.5%&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ Transport: 99.5%&lt;/p&gt;&lt;p class=" undefined"&gt;0.995 × 0.995 × 0.995 = 0.985074875&lt;/p&gt;&lt;p class=" undefined"&gt;👉 Effective availability ≈ 98.51%&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;Under a simple independent-failure model, three “highly available” services just turned a 0.5% unavailability rate into ~1.49%.&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;Over a 30-day month:&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ One service at 99.5% ≈ 3h36 unavailable&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ The 3-service synchronous chain ≈ 10h45&lt;/p&gt;&lt;p class=" undefined"&gt;And correlated failures can make reality worse.&lt;/p&gt;&lt;p&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;🔸 WHY?&lt;/p&gt;&lt;p class=" undefined"&gt;Your endpoint succeeds only if EVERY mandatory dependency succeeds.&lt;/p&gt;&lt;p class=" undefined"&gt;❗One timeout.&lt;/p&gt;&lt;p class=" undefined"&gt;‼️One network issue.&lt;/p&gt;&lt;p class=" undefined"&gt;❗‼️One overloaded service.&lt;/p&gt;&lt;p class=" undefined"&gt;AND&lt;/p&gt;&lt;p class=" undefined"&gt;💥 The whole business operation fails.&lt;/p&gt;&lt;p class=" undefined"&gt;And simply calling the services in parallel does NOT fix availability if all 3 results are still mandatory.&lt;/p&gt;&lt;p class=" undefined"&gt;It mainly reduces latency.&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;🔸 HOW TO MITIGATE IT?&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ Short timeouts→ fail quickly instead of exhausting threads.&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ Retries→ useful for transient failures, but bounded + backoff.&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ Circuit breakers→ stop hammering an unhealthy dependency.&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ Bulkhead→...&lt;a href=https://blog.vvauban.com/blog/sequential-microservices-can-quietly-kill-your-availability&gt;Read More&lt;/a&gt;</description>
    </item>
    <item>
      <title>☕💰 The 1 MILLION question: what is that ~ SYMBOL in JAVA?</title>
      <pubDate>Sat, 26 Sep 2026 10:31:16 -0700</pubDate>
      <link>https://blog.vvauban.com/blog/the-1-million-question-what-is-that-symbol-in-java</link>
      <guid>https://blog.vvauban.com/blog/the-1-million-question-what-is-that-symbol-in-java</guid>
      <description>&lt;p&gt;🔸 TLDR&lt;/p&gt;&lt;p class=" undefined"&gt;~ is Java's bitwise complement operator.&lt;/p&gt;&lt;p class=" undefined"&gt;It flips every bit:&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ 0 becomes 1&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ 1 becomes 0&lt;/p&gt;&lt;p class=" undefined"&gt;And because Java represents signed integers using two's complement:&lt;/p&gt;&lt;p class=" undefined"&gt;~x == -x - 1&lt;/p&gt;&lt;p class=" undefined"&gt;So yes:&lt;/p&gt;&lt;p class=" undefined"&gt;int x = 2;  &lt;/p&gt;&lt;p class=" undefined"&gt;System.out.println(~x); // -3&lt;/p&gt;&lt;p class=" undefined"&gt;Why -3? 🤯&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;🔸 WHAT ACTUALLY HAPPENS?&lt;/p&gt;&lt;p class=" undefined"&gt;In 32-bit binary, 2 starts like this:&lt;/p&gt;&lt;p class=" undefined"&gt;00000000 00000000 00000000 00000010&lt;/p&gt;&lt;p class=" undefined"&gt;Apply ~:&lt;/p&gt;&lt;p class=" undefined"&gt;11111111 11111111 11111111 11111101&lt;/p&gt;&lt;p class=" undefined"&gt;That bit pattern represents:&lt;/p&gt;&lt;p class=" undefined"&gt;-3&lt;/p&gt;&lt;p class=" undefined"&gt;So:&lt;/p&gt;&lt;p class=" undefined"&gt;System.out.println(~2);   // -3 &lt;/p&gt;&lt;p class=" undefined"&gt;System.out.println(~0);   // -1 &lt;/p&gt;&lt;p class=" undefined"&gt;System.out.println(~1);   // -2 &lt;/p&gt;&lt;p class=" undefined"&gt;System.out.println(~-1);  // 0&lt;/p&gt;&lt;p class=" undefined"&gt; System.out.println(~-2);  // 1&lt;/p&gt;&lt;p class=" undefined"&gt;The shortcut is:&lt;/p&gt;&lt;p class=" undefined"&gt;~x = -(x + 1)&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;🔸 WHERE IS ~ ACTUALLY USEFUL?&lt;/p&gt;&lt;p class=" undefined"&gt;A classic use is clearing bits from a bit mask:&lt;/p&gt;&lt;p class=" undefined"&gt;int READ  = 0b001; &lt;/p&gt;&lt;p class=" undefined"&gt;int WRITE = 0b010;  &lt;/p&gt;&lt;p class=" undefined"&gt;int permissions = READ | WRITE;  &lt;/p&gt;&lt;p class=" undefined"&gt;// Remove WRITE &lt;/p&gt;&lt;p class=" undefined"&gt;permissions = permissions &amp; ~WRITE;&lt;/p&gt;&lt;p class=" undefined"&gt;~WRITE flips the mask, then &amp; clears precisely that bit.&lt;/p&gt;&lt;p class="...&lt;a href=https://blog.vvauban.com/blog/the-1-million-question-what-is-that-symbol-in-java&gt;Read More&lt;/a&gt;</description>
    </item>
    <item>
      <title>☕🤖 Trisha Gee on AI, SKILL ATROPHY &amp; the SOFTWARE JOB MARKET</title>
      <pubDate>Sat, 26 Sep 2026 10:03:57 -0700</pubDate>
      <link>https://blog.vvauban.com/blog/trisha-gee-on-ai-skill-atrophy-the-software-job-market</link>
      <guid>https://blog.vvauban.com/blog/trisha-gee-on-ai-skill-atrophy-the-software-job-market</guid>
      <description>&lt;p&gt;🔸 TLDR&lt;/p&gt;&lt;p class=" undefined"&gt;On Rock the JVM, Trisha Gee explores AI, Stack Overflow, burnout, mentoring, junior careers, and the skills we must keep alive.&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;🔸 🔟 VERBATIMS&lt;/p&gt;&lt;p class=" undefined"&gt;1️⃣ “Stack Overflow itself was part of a kind of revolution in how developers learned.”&lt;/p&gt;&lt;p class=" undefined"&gt;It democratized knowledge. LLMs may replace the interface, not the need for expertise. #StackOverflow&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;2️⃣“we still need good quality answers, content, knowledge, materials in order to feed the machines with something helpful.”&lt;/p&gt;&lt;p class=" undefined"&gt;AI still depends on strong human knowledge upstream. #AI&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;3️⃣ “you don't always have to understand the bits and bites in order to produce a product that is useful for customers, useful for the business.”&lt;/p&gt;&lt;p class=" undefined"&gt;Fundamentals matter—but business value matters too. #SoftwareEngineering&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;4️⃣ “a lot of the AI stories are all around writing code, which was never the bottleneck in the first place”&lt;/p&gt;&lt;p class=" undefined"&gt;Faster coding does not fix weak requirements, testing, delivery, or feedback loops. #Productivity&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;5️⃣ “I think we should not fall into the temptation of let's just do more stuff cuz we can do more stuff.”&lt;/p&gt;&lt;p class=" undefined"&gt;AI speed without outcome thinking can create more code, and more debt. #TechDebt&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;6️⃣ “slow down. It's just like if your engineers are burning out, it's not working.”&lt;/p&gt;&lt;p class=" undefined"&gt;More...&lt;a href=https://blog.vvauban.com/blog/trisha-gee-on-ai-skill-atrophy-the-software-job-market&gt;Read More&lt;/a&gt;</description>
    </item>
    <item>
      <title>🍃☕ SPRING MODULITH 2.2 M1: modular monoliths move to BOOT 4.2</title>
      <pubDate>Sat, 26 Sep 2026 09:47:28 -0700</pubDate>
      <link>https://blog.vvauban.com/blog/spring-modulith-2-2-m1-modular-monoliths-move-to-boot-4-2</link>
      <guid>https://blog.vvauban.com/blog/spring-modulith-2-2-m1-modular-monoliths-move-to-boot-4-2</guid>
      <description>&lt;p&gt;&lt;span style="color: #000000;"&gt;🔸 TLDR&lt;/span&gt;&lt;/p&gt;&lt;p class=" ember-view reader-text-block__paragraph" style="text-align: start; font-size: 16px;"&gt;&lt;span style="color: #000000;  "&gt;Spring Modulith helps turn a Spring Boot monolith into explicit, domain-driven modules whose boundaries can be verified, tested, observed and documented.&lt;/span&gt;&lt;/p&gt;&lt;p class=" ember-view reader-text-block__paragraph" style="text-align: start; font-size: 16px;"&gt;&lt;span style="color: #000000;  "&gt;2.2 M1 moves to Spring Boot 4.2 M1 + Spring Framework 7.1 M1, while improving events, testing and auto-configuration.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;🔸WHAT IS SPRING MODULITH?&lt;/p&gt;&lt;p class=" undefined"&gt;A modular monolith keeps one deployable application while organizing the code into business-oriented modules.&lt;/p&gt;&lt;p class=" undefined"&gt;Instead of hoping developers respect package boundaries, Spring Modulith can inspect and enforce them.&lt;/p&gt;&lt;p class=" undefined"&gt;Think:&lt;/p&gt;&lt;p class=" undefined"&gt;▪️ one application &lt;/p&gt;&lt;p class=" undefined"&gt;▪️ multiple domain modules &lt;/p&gt;&lt;p class=" undefined"&gt;▪️ explicit dependencies &lt;/p&gt;&lt;p class=" undefined"&gt;▪️ architecture tests &lt;/p&gt;&lt;p class=" undefined"&gt;▪️ module-focused integration tests&lt;/p&gt;&lt;p class=" undefined"&gt; ▪️ events between modules&lt;/p&gt;&lt;p class=" undefined"&gt;You keep the operational simplicity of a monolith without accepting a giant ball of mud. 🧱&lt;/p&gt;&lt;p&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;1️⃣ DECLARE MODULE DEPENDENCIES&lt;/p&gt;&lt;p&gt;The order module explicitly declares what it may depend on. This turns architectural intent into a rule the codebase can verify instead of leaving it buried in a diagram or README.&lt;/p&gt;&lt;p class=" style="&gt;#ModularArchitecture&lt;/p&gt;&lt;p class=" style="&gt;See: &lt;a href="https://github.com/vinny59200/spring-modulith-2.2-m1-demo/blob/main/src/main/java/com/example/modulith/order/package-info.java" data-type="undefined"...&lt;a href=https://blog.vvauban.com/blog/spring-modulith-2-2-m1-modular-monoliths-move-to-boot-4-2&gt;Read More&lt;/a&gt;</description>
    </item>
    <item>
      <title>🎬🔁 Git RERERE: escape CHAINED PR INCEPTION</title>
      <pubDate>Sat, 26 Sep 2026 09:38:52 -0700</pubDate>
      <link>https://blog.vvauban.com/blog/git-rerere-escape-chained-pr-inception</link>
      <guid>https://blog.vvauban.com/blog/git-rerere-escape-chained-pr-inception</guid>
      <description>&lt;p&gt;🔸 TLDR&lt;/p&gt;&lt;p class=" undefined"&gt;git rerere = reuse recorded resolution.&lt;/p&gt;&lt;p class=" undefined"&gt;Git remembers how you solved a conflict and can reuse it when the same conflict pattern appears again.&lt;/p&gt;&lt;p class=" undefined"&gt;Perfect when stacked PRs are repeatedly rebased.&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;1️⃣ WHAT IS RERERE?&lt;/p&gt;&lt;p class=" undefined"&gt;conflict → manual resolution → remembered&lt;/p&gt;&lt;p class=" undefined"&gt;same conflict → resolution reused&lt;/p&gt;&lt;p class=" undefined"&gt;It does NOT commit for you: review, then stage the result.&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;2️⃣ USE CASE&lt;/p&gt;&lt;p class=" undefined"&gt;Rerere shines when you repeatedly merge or rebase branches and keep seeing the same conflicts.&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;3️⃣ THE 20-PR INCEPTION 🌀&lt;/p&gt;&lt;p class=" undefined"&gt;Peter Lawrey summed it up:&lt;/p&gt;&lt;p class=" undefined"&gt;“When you have 20 chained PRs and go back and forth between them, the movie Inception keeps coming to mind.”&lt;/p&gt;&lt;p class=" undefined"&gt;Now PR2 changes:&lt;/p&gt;&lt;p class=" undefined"&gt;PR2' → rebase PR3 → PR4 → ... → PR20&lt;/p&gt;&lt;p class=" undefined"&gt;As you restack downward, old conflicts can return.&lt;/p&gt;&lt;p class=" undefined"&gt;Rerere lets Git say:&lt;/p&gt;&lt;p class=" undefined"&gt;“I’ve seen this conflict before.”&lt;/p&gt;&lt;p class=" undefined"&gt;and replay the previous resolution.&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;4️⃣ HOW TO&lt;/p&gt;&lt;p class=" undefined"&gt;Enable it once:&lt;/p&gt;&lt;p class=" undefined"&gt;git config --global rerere.enabled true&lt;/p&gt;&lt;p class=" undefined"&gt;Resolve the first conflict normally and git add it. Git records the resolution.&lt;/p&gt;&lt;p class=" undefined"&gt;When a matching conflict returns, rerere can apply it automatically.&lt;/p&gt;&lt;p class=" undefined"&gt;&lt;span style="display: inline-block"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=" undefined"&gt;5️⃣...&lt;a href=https://blog.vvauban.com/blog/git-rerere-escape-chained-pr-inception&gt;Read More&lt;/a&gt;</description>
    </item>
  </channel>
</rss>
