<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alessandro Aiezza</title>
    <description>The latest articles on DEV Community by Alessandro Aiezza (@aaiezza).</description>
    <link>https://dev.to/aaiezza</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F140251%2F959f7c09-dd7b-4dc5-893a-53f9c741c553.jpeg</url>
      <title>DEV Community: Alessandro Aiezza</title>
      <link>https://dev.to/aaiezza</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aaiezza"/>
    <language>en</language>
    <item>
      <title>Favorite Git Things</title>
      <dc:creator>Alessandro Aiezza</dc:creator>
      <pubDate>Thu, 16 Oct 2025 19:40:18 +0000</pubDate>
      <link>https://dev.to/aaiezza/favorite-git-things-36n2</link>
      <guid>https://dev.to/aaiezza/favorite-git-things-36n2</guid>
      <description>&lt;h1&gt;
  
  
  My Favorite Git Tools and Tutorials
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Eclipse Git Plugin&lt;/strong&gt; – &lt;a href="https://projects.eclipse.org/projects/technology.egit" rel="noopener noreferrer"&gt;https://projects.eclipse.org/projects/technology.egit&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I know&lt;/em&gt;, it's &lt;a href="https://www.eclipse.org/forums/index.php/t/1107357/" rel="noopener noreferrer"&gt;Eclipse&lt;/a&gt;… Please don't judge me. But as far as feature‑rich git GUI goes (&lt;em&gt;say that ten times fast&lt;/em&gt;), this one just wins IMHO.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Infamous "Git Cheatsheet"&lt;/strong&gt; – &lt;a href="https://ndpsoftware.com/git-cheatsheet.html" rel="noopener noreferrer"&gt;https://ndpsoftware.com/git-cheatsheet.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tutorials
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge is Power: Getting out of trouble by understanding Git by Steve Smith&lt;/strong&gt; – &lt;a href="https://youtu.be/sevc6668cQ0?si=h4zXfaFIejBE-9l_" rel="noopener noreferrer"&gt;https://youtu.be/sevc6668cQ0?si=h4zXfaFIejBE-9l_&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Git Tutorial&lt;/strong&gt; – &lt;a href="https://youtu.be/0SJCYPsef54?si=-V9kCLP68scDjncj" rel="noopener noreferrer"&gt;https://youtu.be/0SJCYPsef54?si=-V9kCLP68scDjncj&lt;/a&gt; (&lt;em&gt;very&lt;/em&gt; low level, but highly informative)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
    </item>
    <item>
      <title>But why care about SOLID?</title>
      <dc:creator>Alessandro Aiezza</dc:creator>
      <pubDate>Fri, 09 May 2025 16:52:09 +0000</pubDate>
      <link>https://dev.to/aaiezza/but-why-care-about-solid-24i1</link>
      <guid>https://dev.to/aaiezza/but-why-care-about-solid-24i1</guid>
      <description>&lt;p&gt;Or: Why care about &lt;em&gt;any&lt;/em&gt; Software Engineering principles?&lt;/p&gt;




&lt;p&gt;Embracing principles makes you a more adaptable engineer. You’re no longer tied to a specific framework, language, or tech stack. Instead, you can work effectively with the tools at hand and make them &lt;strong&gt;work for you&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example, I appreciate the SOLID principles. When I have the freedom to choose, and it fits the project, I often reach for Kotlin. It makes &lt;strong&gt;applying core principles&lt;/strong&gt; straightforward in most cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  SOLID Principles in Kotlin
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Single Responsibility Principle&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ReportGenerator&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ReportPrinter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;report&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ReportGenerator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Open/Closed Principle&lt;/span&gt;
&lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Shape&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;area&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nc"&gt;Double&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Circle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Double&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Shape&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PI&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Liskov Substitution Principle&lt;/span&gt;
&lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Bird&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;open&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;fly&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Flying"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Sparrow&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Bird&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Ostrich&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Bird&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;fly&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nc"&gt;UnsupportedOperationException&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Interface Segregation Principle&lt;/span&gt;
&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Printer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Scanner&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;scan&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MultiFunctionPrinter&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Printer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Scanner&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Dependency Inversion Principle&lt;/span&gt;
&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Engine&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But what if I need to use something else, like Go? The specific language isn’t the most important thing. As long as the problem is &lt;em&gt;solvable&lt;/em&gt; with the available tools, what matters is that they support the principles that guide your work.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I care about the mission and delivering value, not unnecessary complexity or academic perfection. My goal is to leave codebases better than I found them—clear, maintainable, and kind to those who come after me. That’s our responsibility as software engineers.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Software engineering principles and design patterns popularized by leaders in our industry exist for a reason. They’ve done the hard work and generously shared their insights. Why not stand on the shoulders of giants?&lt;/p&gt;

&lt;h4&gt;
  
  
  Some giants to thank:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Design_Patterns" rel="noopener noreferrer"&gt;Gang of Four&lt;/a&gt; (Design Patterns book)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://martinfowler.com/" rel="noopener noreferrer"&gt;Martin Fowler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Domain-driven_design" rel="noopener noreferrer"&gt;Eric Evans&lt;/a&gt; (Domain-Driven Design)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Robert_C._Martin" rel="noopener noreferrer"&gt;Robert C. Martin (Uncle Bob)&lt;/a&gt; (SOLID)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Here are those same SOLID principles, but in Go—this time, using functional types where it makes sense:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Single Responsibility Principle&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;ReportGenerator&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;ReportPrinter&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;report&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;generateReport&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"report"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;printReport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;report&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Open/Closed Principle&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Shape&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Radius&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pi&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Radius&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Radius&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Liskov Substitution Principle&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Bird&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Fly&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Sparrow&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;Sparrow&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Fly&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Flying"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Ostrich&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;Ostrich&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Fly&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"can't fly"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Interface Segregation Principle&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Printer&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Scanner&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Scan&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;MultiFunctionPrinter&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;MultiFunctionPrinter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;MultiFunctionPrinter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Scan&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Dependency Inversion Principle&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Engine&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="n"&gt;Engine&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Drive&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first glance, the code looks different. Naturally—it’s a different language with its own syntax and idioms. But the underlying principles remain the same, unlocking the same benefits in your codebase. That’s why it’s always worthwhile to learn the features of the language you’re working in.&lt;/p&gt;




&lt;h3&gt;
  
  
  My guiding steps:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Make it work&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make it right&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make it better&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I encourage you: Find ideals and principles that you and your team can support. Then, be open to what that might mean for your code. It may involve using language features that are unfamiliar at first.&lt;/p&gt;

&lt;p&gt;But if it leaves your codebase easier to maintain, more readable, better tested, more modular, or more aligned with the &lt;a href="https://en.wikipedia.org/wiki/Domain-driven_design#Ubiquitous_language" rel="noopener noreferrer"&gt;ubiquitous language&lt;/a&gt; of your domain—embrace it! You’ll be improving yourself, your team, and your product.&lt;/p&gt;

&lt;p&gt;And if you care about the people for whom you're building, &lt;em&gt;that&lt;/em&gt; should be motivation enough.&lt;/p&gt;




&lt;p&gt;Thanks for reading! ✌️&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>solid</category>
      <category>kotlin</category>
      <category>go</category>
    </item>
    <item>
      <title>The Uncoding: Elevating the Craft of Software Engineering</title>
      <dc:creator>Alessandro Aiezza</dc:creator>
      <pubDate>Sat, 23 Nov 2024 18:36:23 +0000</pubDate>
      <link>https://dev.to/aaiezza/the-uncoding-elevating-the-craft-of-software-engineering-4l8n</link>
      <guid>https://dev.to/aaiezza/the-uncoding-elevating-the-craft-of-software-engineering-4l8n</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;At one point in my career, I had the privilege of working with a brilliant colleague who introduced me to a concept he called “uncoding.” The name immediately grabbed my attention, as I’m sure it might for anyone who has wrestled with unclear or overly complex code. The presentation he gave was fascinating, and it began with the provocative observation that the word “code” itself suggests something obfuscated.  &lt;/p&gt;

&lt;p&gt;The very term we use to describe our work as software engineers implies secrecy, complexity, and difficulty—qualities fundamentally at odds with our purpose: to solve problems and communicate solutions effectively. With this in mind, the concept of "uncoding" invites us to rethink how we write, structure, and even talk about our work.  &lt;/p&gt;




&lt;h2&gt;
  
  
  How Did We Get Here?
&lt;/h2&gt;

&lt;p&gt;The origins of obfuscated code may have innocent beginnings. Historically, the first computers were enigmatic machines accessible only to a small group of highly educated pioneers. Figures like Ada Lovelace, Alan Turing, Grace Hopper, and John von Neumann laid the groundwork for what we now call computing. These trailblazers and the like, worked at the intersection of mathematics, engineering, and philosophy, often crafting code directly in binary, assembly, or even &lt;a href="https://en.wikipedia.org/wiki/Punched_card" rel="noopener noreferrer"&gt;punch cards&lt;/a&gt;—a far cry from today’s expressive high-level programming languages.&lt;/p&gt;

&lt;p&gt;To program a machine in those early days required not only mastery of the software but also an intimate understanding of the hardware it controlled. Each instruction was carefully crafted to manipulate physical components like transistors and vacuum tubes. Contrast this with today: modern engineers can build complex systems without a deep understanding of hardware, thanks to abstractions like operating systems, libraries, and APIs.&lt;/p&gt;

&lt;p&gt;While this abstraction has undoubtedly accelerated innovation, it has also dulled our reverence for the underlying marvels of technology. Few pause to consider that their sleek devices rely on microscopic transistors, spaced nanometers apart, functioning at such precision that a single particle of dust could destroy their operation. Software engineers now wield unprecedented power to create, yet many of us remain shackled by antiquated habits of obfuscation.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Shameless plug for one of &lt;a href="https://www.amazon.com/Knowledge-Rebuild-Civilization-Aftermath-Cataclysm/dp/0143127047" rel="noopener noreferrer"&gt;my favorite books&lt;/a&gt; that inspired my awe for our modern day technologies&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Is Code Still Hard to Read?
&lt;/h2&gt;

&lt;p&gt;If technology has advanced so far, why do we continue to produce codebases that are difficult to decipher?  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Legacy Practices&lt;/strong&gt;: Early programming languages like Assembly and C required succinct, dense expressions due to hardware constraints. While modern languages afford us the luxury of readability, many still cling to practices born of necessity in an earlier era.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pride and Job Security&lt;/strong&gt;: Some engineers write complex, unintuitive code to showcase their cleverness or to secure their roles. The thinking goes: "If only &lt;em&gt;I&lt;/em&gt; can understand this, they’ll always need me."
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apathy and Time Pressure&lt;/strong&gt;: Deadlines often push us to prioritize functionality over clarity. Writing readable code takes time—time that managers may perceive as wasted when the code "already works."
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inexperience&lt;/strong&gt;: Junior developers may simply lack the knowledge or guidance to write clean, maintainable code.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While these reasons are understandable, they ultimately harm both the engineers maintaining the code and the businesses relying on it. Poorly written code is like a debt that compounds over time, leading to inefficiencies, bugs, and burnout.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Philosophy of Uncoding
&lt;/h2&gt;

&lt;p&gt;"The Uncoding" is about shifting our perspective on what it means to be a software engineer. It’s not just about making something work; it’s about making it work well, making it maintainable, and making it enjoyable for others to build upon.&lt;/p&gt;

&lt;p&gt;This principle aligns with a simple mantra I hold dear:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make it work.&lt;/li&gt;
&lt;li&gt;Make it right.&lt;/li&gt;
&lt;li&gt;Make it better.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What Does "Right" Look Like?
&lt;/h2&gt;

&lt;p&gt;To embrace "uncoding," we must understand what clear, maintainable, and effective code looks like. Here are some key traits:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Readability&lt;/strong&gt;: Code should be easy for another engineer to understand at a glance. This includes intuitive naming conventions, clean formatting, and clear comments where needed.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability&lt;/strong&gt;: Code should be structured in a way that allows it to be updated, extended, or refactored with minimal effort.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplicity&lt;/strong&gt;: Avoid unnecessary complexity. The simplest solution that works is often the best.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testability&lt;/strong&gt;: Code should be easy to test, both manually and automatically, to ensure reliability and reduce the risk of future bugs.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alignment with Domain Concepts&lt;/strong&gt;: Code should model the domain it serves, using terminology and abstractions that align with the real-world problems it addresses.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These principles may seem obvious, but in the fast-paced world of software development, they are often sacrificed. "Uncoding" is about making these traits a priority, no matter the circumstances.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Putting "Uncoding" into Practice
&lt;/h2&gt;

&lt;p&gt;If you’ve made it this far, you’re likely convinced that "uncoding" is worth considering. But turning this concept into part of your daily work is the real challenge.  &lt;/p&gt;

&lt;p&gt;"Uncoding" isn’t about perfection; it’s about consistent improvement. It’s about treating code as a way to communicate clearly and build solutions that stand the test of time. Small, intentional steps can make a big difference over time.  &lt;/p&gt;

&lt;h4&gt;
  
  
  Where to Begin
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start Where You Are&lt;/strong&gt;: Identify one part of your codebase that could be clearer. Whether it’s renaming variables, adding comments, or simplifying a function, take the first step today.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get Your Team Involved&lt;/strong&gt;: Share this article or discuss the concept with your peers. The more aligned your team is, the easier it becomes to adopt these principles.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commit to Iteration&lt;/strong&gt;: Change doesn’t require sweeping refactors. Instead, focus on improving clarity with each new feature or bug fix, and let progress build gradually.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Tangible Benefits of "Uncoding"
&lt;/h2&gt;

&lt;p&gt;For tech leaders, the principles of "uncoding" aren’t just about improving the codebase—they’re about delivering measurable value to your organization. While some might see clean, readable code as a "nice-to-have," its benefits are far-reaching:  &lt;/p&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;Cost Savings&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Clear code reduces time spent deciphering complex logic, debugging, or rewriting poorly understood sections. Over time, this means fewer hours lost to inefficiency and fewer costly mistakes caused by misunderstanding how a system works.  &lt;/p&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;Risk Reduction&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;A well-documented, readable codebase minimizes the risks associated with employee turnover. When knowledge isn’t tied to a single person, teams can adapt more easily when members leave or change roles.  &lt;/p&gt;

&lt;h4&gt;
  
  
  3. &lt;strong&gt;Faster Onboarding&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;New engineers can contribute more quickly when the codebase "speaks for itself." Instead of relying solely on tribal knowledge, clear naming, comments, and modular design help new hires hit the ground running.  &lt;/p&gt;

&lt;h4&gt;
  
  
  4. &lt;strong&gt;Improved Employee Retention&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Engineers who work in a well-structured codebase are less likely to feel frustrated or burned out. "Uncoding" principles foster an environment where developers can focus on solving interesting problems instead of untangling confusing legacy systems.  &lt;/p&gt;

&lt;h4&gt;
  
  
  5. &lt;strong&gt;Long-Term Scalability&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;As your product evolves, a clean and well-organized codebase makes it easier to add new features without introducing significant technical debt. This scalability supports sustainable growth for your business.&lt;/p&gt;

&lt;p&gt;Armed with the right language and metrics, we can demonstrate that "uncoding" is not a luxury but a necessity for any team serious about quality and longevity. &lt;/p&gt;




&lt;h2&gt;
  
  
  Inspiring Your Team to "Uncode"
&lt;/h2&gt;

&lt;p&gt;If you're a tech leader or team lead, you hold the key to fostering a culture of "uncoding" within your team. Encouraging engineers to embrace clarity and intentionality in their work doesn’t just benefit the codebase—it boosts morale, collaboration, and overall productivity.  &lt;/p&gt;

&lt;h4&gt;
  
  
  Strategies for Leaders
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lead by Example&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Model the behavior you want to see. In your code reviews and contributions, prioritize readability and maintainability. Show your team that clarity isn’t optional—it’s a core value.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Make It a Team Priority&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Integrate "uncoding" principles into team workflows. Set guidelines for naming conventions, documentation, and clear architecture. Incorporate these into your onboarding processes so new hires understand their importance from day one.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Provide Time and Space&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Encourage your team to refactor when needed, and allocate time for knowledge-sharing sessions on these principles. Ensure they feel supported, not rushed, when balancing deadlines with quality.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Highlight Wins&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Celebrate when team members produce work that embodies "uncoding." Share examples of how clearer code saved time, avoided bugs, or improved onboarding for new engineers.  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The Future of Uncoding
&lt;/h2&gt;

&lt;p&gt;The industry is already moving toward tools and techniques that align with the philosophy of uncoding. Domain-Driven Design (DDD), automated documentation, and AI-assisted coding tools like GitHub Copilot and ChatGPT exemplify this trend. In fact, with natural language processing and machine learning, we’re inching closer to a future where we describe problems in plain English and receive functional, optimized code in return, but at enterprise scale!&lt;br&gt;
But until that day arrives, we have a responsibility to hone our craft. We may never write code as elegant as a novel by C.S. Lewis, but we can strive for clarity, intention, and artistry in what we produce.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Let us leave a legacy of clarity, craftsmanship, and respect for those who follow in our footsteps. Let our code be a joy to read, a tool for collaboration, and a foundation for innovation.&lt;br&gt;
In the following articles, I’ll delve deeper into practical techniques for uncoding, from leveraging language features to applying design principles like SOLID and DRY. Together, we can build a future where our "code" is not just functional but inspirational—where our craft as software engineers transcends the technical to become a true art form.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;May we uncode our work, one instruction at a time.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>uncoding</category>
      <category>practices</category>
    </item>
    <item>
      <title>Idempotent</title>
      <dc:creator>Alessandro Aiezza</dc:creator>
      <pubDate>Wed, 22 Feb 2023 19:09:44 +0000</pubDate>
      <link>https://dev.to/aaiezza/idempotent-56pa</link>
      <guid>https://dev.to/aaiezza/idempotent-56pa</guid>
      <description>&lt;p&gt;&lt;a href="https://youtu.be/csInNn6pfT4?t=812" rel="noopener noreferrer"&gt;idempotent&lt;/a&gt;&lt;br&gt;
 &lt;br&gt;
 &lt;br&gt;
 &lt;br&gt;
 &lt;br&gt;
 &lt;br&gt;
 &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fopdxe3y93bvmffkpl1m3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fopdxe3y93bvmffkpl1m3.png" alt="Image description" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>idempotent</category>
    </item>
    <item>
      <title>Of all the places to FINALLY understand OAuth</title>
      <dc:creator>Alessandro Aiezza</dc:creator>
      <pubDate>Wed, 22 Feb 2023 17:29:59 +0000</pubDate>
      <link>https://dev.to/aaiezza/of-all-the-places-to-finally-understand-oauth-58im</link>
      <guid>https://dev.to/aaiezza/of-all-the-places-to-finally-understand-oauth-58im</guid>
      <description>&lt;p&gt;Kroger has developer guides, and I read their documentation on OAuth2, and it is honestly some of the best documentation I've read on the subject.&lt;/p&gt;

&lt;p&gt;Go check it out: &lt;a href="https://developer.kroger.com/documentation/public/security/guides-oauth" rel="noopener noreferrer"&gt;https://developer.kroger.com/documentation/public/security/guides-oauth&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✌️&lt;/p&gt;

</description>
      <category>oauth2</category>
      <category>learning</category>
      <category>kroger</category>
    </item>
    <item>
      <title>The Coding Language you Write Affects your Personality</title>
      <dc:creator>Alessandro Aiezza</dc:creator>
      <pubDate>Fri, 11 Nov 2022 16:10:03 +0000</pubDate>
      <link>https://dev.to/aaiezza/the-coding-language-you-write-affects-your-personality-3bp9</link>
      <guid>https://dev.to/aaiezza/the-coding-language-you-write-affects-your-personality-3bp9</guid>
      <description>&lt;p&gt;I just found out about &lt;del&gt;my personality disorder&lt;/del&gt; a personality–related phenomenon.&lt;/p&gt;

&lt;p&gt;On the road to learning Italian, it has always fascinated me that my personality &lt;em&gt;does&lt;/em&gt; appear to change slightly when I'm speaking it. The change is subtle, but enough that I've started to notice the difference when talking with native speakers.&lt;br&gt;
Here is an article to back up the credibility of this phenomenon: &lt;a href="https://www.psychologytoday.com/intl/blog/life-bilingual/201111/change-language-change-personality" rel="noopener noreferrer"&gt;https://www.psychologytoday.com/intl/blog/life-bilingual/201111/change-language-change-personality&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As I have been learning Swift for iOS and Kotlin for Android and backend services, I am starting to notice the same type of shift in the way I code. My "engineering personality" and my behaviors seem to change.&lt;/p&gt;

&lt;p&gt;One example is I think I prioritize more of a "get'r'done" personality in Swift than I used to in Java. In Java, I tend to think much more about Test Driven Development.&lt;br&gt;
Maybe because unit testing in Swift did not come as easily to me as it did in the JVM.&lt;/p&gt;

&lt;p&gt;Another example is when I'm in Kotlin I am much more interested in wrapping even the simplest of my domain objects in a data class. No primitive data types are left unwrapped. An Integer has a purpose and a name, and I create a data class for it. In Java, I would do this too, but it was much more daunting and sometimes I would not take the time.&lt;br&gt;
I wonder if that's because data classes are so much easier to write in Kotlin.&lt;/p&gt;

&lt;p&gt;🇮🇹 In Italian, I feel so much more chill and well spoken. There are no phrasal verbs and there are no trailing prepositions allowed, so much speech feels so much more stable.&lt;br&gt;&lt;br&gt;
🇺🇸 In English, because it is my native language, I throw words around like a madman, sometimes trying to seem impressive and hoping that my sentence will end correctly.&lt;br&gt;&lt;br&gt;
🇮🇹 In Italian I need to think ahead of time and sometimes put my pronouns at the front of my sentence as opposed to at the end.&lt;/p&gt;

&lt;p&gt;I'm wondering if any software &lt;a href="https://www.merriam-webster.com/dictionary/polyglot" rel="noopener noreferrer"&gt;polyglots&lt;/a&gt; have encountered this same phenomenon.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>My Italian Journey - Italian learning resources</title>
      <dc:creator>Alessandro Aiezza</dc:creator>
      <pubDate>Wed, 14 Sep 2022 15:12:38 +0000</pubDate>
      <link>https://dev.to/aaiezza/my-italian-journey-italian-learning-resources-2llb</link>
      <guid>https://dev.to/aaiezza/my-italian-journey-italian-learning-resources-2llb</guid>
      <description>&lt;p&gt;This is probably not the place for it, but it &lt;em&gt;is&lt;/em&gt; a convenient place to put it.&lt;/p&gt;

&lt;p&gt;I have been learning Italian since April 2018 and the following resources have been extremely helpful. Enjoy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quali risorse usi per imparare l'italiano?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Youtube
&lt;/h3&gt;

&lt;p&gt;My favorites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/c/lucreziaoddone" rel="noopener noreferrer"&gt;Learn Italian with Lucrezia Oddone&lt;/a&gt;
An Italian who is fluent in English but teaches Italian in Italian (&lt;a href="https://en.wikipedia.org/wiki/Language_immersion" rel="noopener noreferrer"&gt;Immersive learning&lt;/a&gt;). She also provides the Italian captions for her videos! (Watch the &lt;a href="https://www.youtube.com/watch?v=J_EQDtpYSNM" rel="noopener noreferrer"&gt;comprehensible input video&lt;/a&gt; to learn why that is important).
This has been a great channel for me to play in the car at 0.75 playback speed and use a technique called &lt;a href="https://www.lingualift.com/blog/shadowing-learn-language-efficiently/" rel="noopener noreferrer"&gt;"shadowing"&lt;/a&gt;; I just repeat everything she says, as she says it.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/c/italymadeeasy" rel="noopener noreferrer"&gt;Italy Made Easy (with Manu)&lt;/a&gt;
An Italian‑born who teaches in English&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/user/qvcitalia" rel="noopener noreferrer"&gt;QVC Italia&lt;/a&gt;
This one sounds funny to people when I recommend it. It was actually recommended to me by Manu! Passive listening is an integral part of language learning. It keeps your mind familiar with the sounds and feel and cadence of your target language. The best part about QVC Italia is that they are &lt;em&gt;always&lt;/em&gt; streaming live, so the content is fresh and I can keep it on in the background while I'm working. Another great part of the content on this channel, is that they are always talking about a product, something tangible. So complex and abstract ideas is not normally discussed on the channel. It makes it easy to learn new nouns and the adjectives often used to describe them. (You may even find a cool Italian product you want to buy 😆)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/c/EasyItalian" rel="noopener noreferrer"&gt;Easy Italian&lt;/a&gt;
This channel essentially nails it when it comes to subtitles. they are easy to read and in both English and Italian! Studies show that comprehension of your target language of video content goes &lt;strong&gt;down&lt;/strong&gt; when you simply read subtitles in English, and it goes &lt;strong&gt;up&lt;/strong&gt; when the subtitles are in Italian, and it goes &lt;strong&gt;way up&lt;/strong&gt; when &lt;em&gt;both&lt;/em&gt; languages are present in the subtitles. Also, great content! They interview real people in Italy all the time. Very fun.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/channel/UC7n7aK2skFjJF9BfaH9Qx4A" rel="noopener noreferrer"&gt;Tom Txxytu&lt;/a&gt;
An American who teaches in English and Italian&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/c/rocknlearn" rel="noopener noreferrer"&gt;Rock 'N Learn&lt;/a&gt; If it sounds corny, that is because it is. This channel is meant for children, &lt;strong&gt;but&lt;/strong&gt; when you are a &lt;em&gt;child&lt;/em&gt; yourself in the language you are learning, what better way to learn the basics than how children learn best.

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=2tOUkJR_EyE&amp;amp;ab_channel=Rock%27NLearn" rel="noopener noreferrer"&gt;Numbers, Colors, &amp;amp; More&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=C5-MM082zVw&amp;amp;t=2s&amp;amp;ab_channel=Rock%27NLearn" rel="noopener noreferrer"&gt;Food, Activities, &amp;amp; Animals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=MN0P2R7L8Hs&amp;amp;t=811s&amp;amp;ab_channel=Rock%27NLearn" rel="noopener noreferrer"&gt;Body Parts, Family, &amp;amp; Feelings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;More channels: &lt;a href="https://www.mosalingua.com/en/youtube-channels-to-learn-italian/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.mosalingua.com/en/youtube-channels-to-learn-italian/" rel="noopener noreferrer"&gt;https://www.mosalingua.com/en/youtube-channels-to-learn-italian/&lt;/a&gt;, &lt;a href="https://www.alllanguageresources.com/italian-youtube-channels/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.alllanguageresources.com/italian-youtube-channels/" rel="noopener noreferrer"&gt;https://www.alllanguageresources.com/italian-youtube-channels/&lt;/a&gt;
&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Apps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://apps.apple.com/us/app/google-translate/id414706506" rel="noopener noreferrer"&gt;Google Translate&lt;/a&gt;
This one is a must! For the most part, it is spot‑on in translating for you.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apps.apple.com/us/app/reverso-translate-and-learn/id919979642" rel="noopener noreferrer"&gt;Reverso Translate and Learn (aka Reverso Context)&lt;/a&gt;
Where Google Translate fails (particularly around idioms) this app cleans up! It references real articles and other literature written and translated by native speakers so you know it is more accurate. Still be careful about the context you use what you learn here.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.hellotalk.com" rel="noopener noreferrer"&gt;HelloTalk&lt;/a&gt;
This would be a great one for all of us to join since there is an excellent correction mechanism in the app! By now, I have made lifelong friends through this app.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.duolingo.com" rel="noopener noreferrer"&gt;Duolingo&lt;/a&gt;
DuoLingo has helped me expand my vocabulary a lot! And there is a streak mechanism that keeps me focused.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.memrise.com/" rel="noopener noreferrer"&gt;Memrise&lt;/a&gt;
Not my favorite app to be honest, but they leverage many of the same psychological hacks that Rosetta Stone does by including 2‑second videos of real Italians speaking the language.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.lingualoops.com/italian.php" rel="noopener noreferrer"&gt;LinguaLoops&lt;/a&gt;
Short‑term memory commits to long‑term memory with 1) repetition 2) sleep and 3) high emotional contrast accompanying the new information. LinguaLoops focuses on repetition in the form of cute, catchy‑tunes for the verb tenses.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Podcasts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://podcasts.apple.com/us/podcast/radio-24-podcast/id309168570" rel="noopener noreferrer"&gt;Radio 24&lt;/a&gt;
My favorite is Effetto Giorno, an Italian radio news show. Just keep in mind, this is a real Italian radio show for Italians. It is fast, idiomatic, and uses very unique language since they discuss economics, politics, geography, and other social topics.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://podcasts.apple.com/us/podcast/lets-speak-italian/id155864176" rel="noopener noreferrer"&gt;Let's Speak Italian&lt;/a&gt;
I think this one is excellent for the beginner. A perfect car ride podcast for expanding your vocabulary.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://podcasts.apple.com/us/podcast/sbs-italian-sbs-in-italiano/id161305549" rel="noopener noreferrer"&gt;SBS Italiano&lt;/a&gt;
Another advanced one, but they include news from Australia which is cool as well as interviews and random community stories. There are news stories, but they are more interesting ones.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Netflix
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Tips
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;When using Netflix for language learning, this &lt;a href="https://chrome.google.com/webstore/detail/language-learning-with-ne/hoombieeljmmljlkjmnheibnpciblicm?hl=en" rel="noopener noreferrer"&gt;Chrome Plugin is a MUST&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;Change your Netflix localization to Italian! (&lt;a href="https://help.netflix.com/en/node/13245" rel="noopener noreferrer"&gt;https://help.netflix.com/en/node/13245&lt;/a&gt;)
What's nice about this one, is that it only affects your profile, not the whole account! So you can even make yourself an extra account in Netflix for your Italian shows, and keep your regular one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Shows
&lt;/h4&gt;

&lt;p&gt;I'll list some of the kid shows here, but some of the other Italian shows that I do enjoy, can also be really graphic. So I'll let you just search for "Italian" and discern what is appropriate for you or not 🙂&lt;br&gt;
 The ones I list here though are clean and I can vouch for!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.netflix.com/title/70288470" rel="noopener noreferrer"&gt;Pocoyo&lt;/a&gt;
It is just cute&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.netflix.com/title/80063705" rel="noopener noreferrer"&gt;Parole In Festa&lt;/a&gt;
My kids and I watch this all the time! The songs are super catchy and give you good Italian baby language to use around kids!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.netflix.com/title/80081537" rel="noopener noreferrer"&gt;La Suburra&lt;/a&gt;
&lt;strong&gt;Not kid friendly&lt;/strong&gt;, but I seriously love the acting, the characters, and the story.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Books
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/ragazza-nella-nebbia-Italian-ebook/dp/B0179U033C" rel="noopener noreferrer"&gt;La Ragazza nella Nebbia&lt;/a&gt; by &lt;a href="https://www.amazon.com/Donato-Carrisi/e/B004MWOF9Y/ref=dp_byline_cont_ebooks_1" rel="noopener noreferrer"&gt;Donato Carrisi&lt;/a&gt; [&lt;em&gt;Fiction&lt;/em&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Quei-giorni-oltre-vita-Italian-ebook/dp/B089B2VKJS" rel="noopener noreferrer"&gt;Quei 10 giorni oltre la vita&lt;/a&gt; by &lt;a href="https://en.wikipedia.org/wiki/Mauro_Prosperi" rel="noopener noreferrer"&gt;Mauro Prosperi&lt;/a&gt; [&lt;em&gt;Nonfiction&lt;/em&gt;]
I purchased my physical copy &lt;a href="https://www.ibs.it/quei-10-giorni-oltre-vita-libro-mauro-prosperi-cinzia-pagliara/e/9788831229135" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;More books recommended by Lucrezia: &lt;a href="https://www.youtube.com/watch?v=E-1T09Y2s0U&amp;amp;ab_channel=LearnItalianwithLucrezia" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=E-1T09Y2s0U&amp;amp;ab_channel=LearnItalianwithLucrezia&lt;/a&gt;, &lt;a href="https://www.youtube.com/watch?v=rVSy2TomGFg&amp;amp;ab_channel=LearnItalianwithLucrezia" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=rVSy2TomGFg&amp;amp;ab_channel=LearnItalianwithLucrezia&lt;/a&gt;, &lt;a href="https://www.youtube.com/watch?v=vBYYj-9Qhzs&amp;amp;ab_channel=LearnItalianwithLucrezia" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=vBYYj-9Qhzs&amp;amp;ab_channel=LearnItalianwithLucrezia&lt;/a&gt;, &lt;a href="https://www.youtube.com/watch?v=9LDI0j_p5HM&amp;amp;ab_channel=LearnItalianwithLucrezia" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=9LDI0j_p5HM&amp;amp;ab_channel=LearnItalianwithLucrezia&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Children's Books
&lt;/h4&gt;

&lt;p&gt;These are all a big favorite with my kids.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A series of Bilingual books by Shelley Admont
&lt;a href="https://www.amazon.com/stores/author/B00CZJ2UTI/search?terms=Italian" rel="noopener noreferrer"&gt;https://www.amazon.com/stores/author/B00CZJ2UTI/search?terms=Italian&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Several titles by &lt;a href="https://www.amazon.com/stores/author/B004MSVB04/allbooks" rel="noopener noreferrer"&gt;Gabriele Clima&lt;/a&gt; with one of my all time favorites being &lt;a href="https://www.amazon.com/LA-POPO-COME-FO/dp/8855062395" rel="noopener noreferrer"&gt;La Popò, come la fo?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.theitalianexperiment.com/" rel="noopener noreferrer"&gt;The Italian Experiment&lt;/a&gt; offers a unique variety of stories &lt;strong&gt;for free&lt;/strong&gt; that can be read online along side the English translation! Some of the stories are even animated and available on YouTube.

&lt;ul&gt;
&lt;li&gt;The favorite among my kids at the moment is &lt;a href="https://www.theitalianexperiment.com/stories/chicken-little" rel="noopener noreferrer"&gt;Il Polletto Carlleto&lt;/a&gt;. The YouTube video is available &lt;a href="https://www.youtube.com/watch?v=pbXh43FWxio&amp;amp;ab_channel=TheFableCottage" rel="noopener noreferrer"&gt;here&lt;/a&gt; hosted by the Fable Cottage.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Other Content
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;I like this video because it breaks down "comprehensible input" The ULTIMATE language learning hack ever! - &lt;a href="https://www.youtube.com/watch?v=J_EQDtpYSNM" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=J_EQDtpYSNM&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Great Spotify Playlist by Lucrezia Oddone - &lt;a href="https://open.spotify.com/playlist/6gHVsQ8qLA4vWEaqasMVKN" rel="noopener noreferrer"&gt;https://open.spotify.com/playlist/6gHVsQ8qLA4vWEaqasMVKN&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Find movies and shows by searching online to discover if maybe you can get it in Italian! Like Disney movies for instance.
&lt;em&gt;I think the Chrome Plugin I mentioned above actually works for Disney+ now&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Videogame&lt;/strong&gt; called &lt;a href="https://store.steampowered.com/app/274980/Influent" rel="noopener noreferrer"&gt;Influent&lt;/a&gt;. I have spent many hours playing this game with my kids. They really enjoy it and love repeating after the in-game voice.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Other Ideas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Change your Netflix localization to Italian! (&lt;a href="https://help.netflix.com/en/node/13245" rel="noopener noreferrer"&gt;https://help.netflix.com/en/node/13245&lt;/a&gt;)
What's nice about this one, is that it only affects your profile, not the whole account! So you can even make yourself an extra account in Netflix for your Italian shows, and keep your regular one.&lt;/li&gt;
&lt;li&gt;If you feel &lt;em&gt;really&lt;/em&gt; daring, you can do this to your phone too!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope this helps someone. Happy Italian learning!&lt;/p&gt;

</description>
      <category>italian</category>
      <category>language</category>
    </item>
    <item>
      <title>Somebody has been coding in MY repo!</title>
      <dc:creator>Alessandro Aiezza</dc:creator>
      <pubDate>Fri, 05 Nov 2021 21:04:48 +0000</pubDate>
      <link>https://dev.to/aaiezza/somebody-has-been-coding-in-my-repo-5133</link>
      <guid>https://dev.to/aaiezza/somebody-has-been-coding-in-my-repo-5133</guid>
      <description>&lt;h1&gt;
  
  
  You want me to approve &lt;em&gt;what&lt;/em&gt;?!
&lt;/h1&gt;

&lt;p&gt;You are improving as a Software Engineer. If that is true, then you're at your pinnacle of knowledge &lt;strong&gt;right at this moment&lt;/strong&gt;. Everything you've done in your career and life have led up to this &lt;em&gt;exact second&lt;/em&gt;. All that experience, all the mistakes you have learned from, all the successful applications you stood up! And they're still in production to this day, gosh darn it!&lt;/p&gt;

&lt;p&gt;So why in the world would &lt;strong&gt;anyone&lt;/strong&gt; want to do a thing like go into &lt;em&gt;your&lt;/em&gt; code base and submit a Pull Request for a new feature in a completely different way than you would have ever done? No newline characters at the end of source code files, its filled with &lt;a href="https://medium.com/@andy.tarpley/software-engineering-pineapples-6a53c8e813ea" rel="noopener noreferrer"&gt;pineapples&lt;/a&gt;, using &lt;em&gt;tabs&lt;/em&gt; instead of spaces?!&lt;/p&gt;

&lt;p&gt;I mean, it's obviously wrong. Right?&lt;/p&gt;

&lt;h1&gt;
  
  
  Those poor bears
&lt;/h1&gt;

&lt;p&gt;The story of &lt;a href="https://en.wikipedia.org/wiki/Goldilocks_and_the_Three_Bears" rel="noopener noreferrer"&gt;Goldilocks and the three bears&lt;/a&gt;.&lt;br&gt;
If you are not familiar, I suppose it is a rather entertaining read. A young, innocent, blond-haired lass strolls into the empty cottage belonging to a family of three bears. Said bears are out on a stroll of their own; You see, they have made &lt;a href="https://en.wikipedia.org/wiki/Porridge" rel="noopener noreferrer"&gt;porridge&lt;/a&gt; for themselves, and want to give it time to cool off.&lt;br&gt;
Well Goldilocks, rather selfishly, takes it upon herself to contaminate food she dislikes, devour that which she does like, ruin furniture, and pass TF out in one of the beds of these three, wonderful bears.&lt;br&gt;
They return home to the mess, discover the unintending thief, and frighten her into fleeing for her life.&lt;/p&gt;

&lt;p&gt;The moral of this children's tale is the need to respect the privacy and property of others and how your actions hurt others.&lt;/p&gt;

&lt;h1&gt;
  
  
  That's exactly what's happening to me!
&lt;/h1&gt;

&lt;p&gt;You, the diligent, experienced programmer have been asked to "take a stroll in the woods". That is, your skills have been requested on another project in the company.&lt;br&gt;
The code you have written is a lean, mean, revenue generating machine; But like most code, it will need maintenance, perhaps even additional features. And who better to do that than another developer with practically no experience in the domain space or practice in the design patterns you have so elegantly employed in said project.&lt;/p&gt;

&lt;p&gt;The dreaded, yet well-meaning, Goldilocks has been granted authorship to &lt;em&gt;your&lt;/em&gt; code.&lt;/p&gt;

&lt;p&gt;And now, there is a pull request. Of course you have alerting set up for such a thing. So you see it immediately. Unlike the three bears, you are not going to simply walk away from your shelter without a home security system only to allow silly children to ruin what you have worked tirelessly to build.&lt;/p&gt;

&lt;p&gt;But perhaps you also don't want to be seen as an angry, ferocious bear either… After all, this is an adorable, innocent child. You are upset, but can't &lt;em&gt;destroy&lt;/em&gt; the pull request author, but you also need to show them who's boss over this code!&lt;/p&gt;

&lt;p&gt;So you start with small comments about what's wrong. Perhaps this turns into a heated debate over PR comments and you start duking it out. Or perhaps the other party "didn't know better!" and immediately crumples to your demands, changing every bit of code you despise for "not being best practice". Maybe even merging that branch you created off of &lt;em&gt;their&lt;/em&gt; branch that "corrects" the terrible practice and nonsense they almost introduced into your code.&lt;/p&gt;

&lt;p&gt;If the developer puts up a fight though, the code may never get merged because it needs your blessing and approval. And now that person is dealing with questions from their leader of "why is this work taking so long?". Now the finger is pointed at you!&lt;/p&gt;

&lt;p&gt;But you were only protecting your house! Look at the mess Goldilocks almost made!&lt;/p&gt;

&lt;p&gt;You decide your talents are best appreciated elsewhere, and say goodbye. After all, you're a senior engineer. Recruiters be slidin' into your LinkedIn DMs constantly!&lt;/p&gt;

&lt;p&gt;✌️&lt;/p&gt;

&lt;h1&gt;
  
  
  Goldilocks Syndrome
&lt;/h1&gt;

&lt;p&gt;If you have been blindly agreeing with everything I've said so far, you had better &lt;strong&gt;not&lt;/strong&gt; be a senior engineer at your company.&lt;br&gt;
And this is for you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🚩&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is setting the stage for a pretty toxic work environment; That of the ferocious over-&lt;strong&gt;bear&lt;/strong&gt;ing developer controlling every move being made on &lt;em&gt;his/her&lt;/em&gt; codebase.&lt;/p&gt;

&lt;p&gt;This is Goldilocks Syndrome. And it occurs in very specific scenarios in an engineer's career. Avoiding this syndrome though, is a hallmark of a great engineer, and should eventually become an expected trait of any engineer; Especially a senior engineer.&lt;br&gt;
To be presented with this predicament in the first place &lt;em&gt;is&lt;/em&gt; an indicator that you are probably, objectively a good developer. Now at this stage, you can prove that you are also a good teammate.&lt;/p&gt;

&lt;p&gt;What you do next in this situation, will either be remembered as a beautiful milestone in your career, or an awful trauma for the other party combined with a stab to your own personal brand.&lt;/p&gt;

&lt;p&gt;When the opportunity arises that an "external" is requesting her own changes be merged into your codebase, what should you really do?&lt;/p&gt;

&lt;h1&gt;
  
  
  Going from "the bear", to "the balanced mentor"
&lt;/h1&gt;

&lt;p&gt;OK, the metaphor does not work perfectly here. Goldilocks &lt;em&gt;was&lt;/em&gt; genuinely in the wrong in that story, and needed to learn a lesson. In her case, I can only imagine it was traumatic, but she messed up their house and ate their dinner!&lt;/p&gt;

&lt;p&gt;However, the lesson &lt;em&gt;you&lt;/em&gt; have the opportunity to facilitate here, does not need to be so painful.&lt;/p&gt;

&lt;p&gt;Also, don't assume &lt;em&gt;you&lt;/em&gt; got it perfect in the first place! We all have room to improve and teach others along the way.&lt;/p&gt;

&lt;p&gt;In this case, it's more likely you will end up teaching someone that's dealing with &lt;a href="https://www.healthline.com/health/mental-health/imposter-syndrome" rel="noopener noreferrer"&gt;"imposter syndrome"&lt;/a&gt;, not someone who is actively seeking to dramatically deviate from the codebase standards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-life example
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: New PR submitted to your code base by a developer that has taken ownership of it, as you have moved on to another project. Not &lt;em&gt;much&lt;/em&gt; needs to change, just the occasional new feature, new button, new endpoint, you name it. The new dev simply needs to maintain it! You did a great job (&lt;em&gt;hopefully&lt;/em&gt;), but you're needed elsewhere.&lt;br&gt;
The dev needs to make a change, and wants your input knowing you as the domain expert, or at least needs your approval in order to merge the code.&lt;/p&gt;

&lt;p&gt;We have already outlined a poor response to this situation.&lt;br&gt;
Yet, another terrible response to this is to simply approve the request!&lt;br&gt;
You might be tempted to do such a thing though, and with all the best intention, if you don't want to hold up their work. And you also have your &lt;em&gt;own&lt;/em&gt; work to do, so you can't spend forever on this one measly pull request.&lt;br&gt;
How can you give this developer &lt;em&gt;just&lt;/em&gt; enough to set them on the right path?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Goal&lt;/strong&gt;: The new feature makes it in with as little, to no new tech debt as possible.&lt;/p&gt;

&lt;p&gt;Much easier said than done, so let me leave you with a few tips that I have learned, that can help set up you &lt;em&gt;and&lt;/em&gt; the other team for success.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips for finding that balance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🟢 &lt;strong&gt;Be curious, not accusatory&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Asking "why would you do it this way when we do it this way over in this other function?" is aggressive. It will never have the outcome you want. It will lead to the other person feeling the need to be defensive, or worse, will crush their spirit into doing it exactly the way you tell them.&lt;/p&gt;

&lt;p&gt;This developer will not grow in that environment. And believe it or not, you actually &lt;em&gt;should&lt;/em&gt; want them to. If they do grow, and even better, if you get to see that growth occur, you develop trust with them. Maybe even getting them to a point, that they shouldn't even &lt;em&gt;need&lt;/em&gt; your input anymore! They can be trusted by all to simply - own the code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Exchange "why" with "what"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead, you could say, "This is an interesting approach. What made you do it this way?". This is far less abrasive to the other party. You are engaging in a dialogue now, not an accusation. Internally, you know you would not have coded it that way. And your questions demonstrate your open-mindedness to the new technique instead of shutting it down. You are curious, and interested in learning about their approach.&lt;/p&gt;

&lt;p&gt;More often than not, what I find these types of questions tend to do is bring up more conversation around &lt;strong&gt;the heart&lt;/strong&gt; of what is trying to be accomplished.&lt;/p&gt;

&lt;p&gt;Which brings us to the next tip.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🟢 &lt;strong&gt;Ask what they are trying to do&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This one might seem obvious, but it is far from human instinct in my experience. What is trying to be done may also be really well-defined if the changes are rather straightforward, or the developer is really good at documenting. &lt;strong&gt;Still&lt;/strong&gt;, attempt to simply reiterate what is trying to be done in your own words to the developer, and allow her to respond. What you're looking for here is: "That's right".&lt;/p&gt;

&lt;p&gt;This grows the mutual "pool of understanding". One of the worst things you could do is delve deeply into a rabbit hole of conversation about a specific line of code, but you have yet to be on the same page as to what the overall goal that the whole pull request hopes to accomplish.&lt;/p&gt;

&lt;p&gt;If you do not get the "That's right" response. This next tip will help.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🟢 &lt;strong&gt;Listen&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stop waiting for other people to be finished talking, so that you can say what you want. I am &lt;em&gt;super&lt;/em&gt; guilty of this, and I still need to stop.&lt;/p&gt;

&lt;p&gt;Really listen to the other person. She will probably explain what she is trying to do; Or what she was hoping to accomplish through some specific piece of code that was written.&lt;/p&gt;

&lt;p&gt;Only after you listen well, and not simply have "the answer" ready in your cannon, can you start to balance what you allow &lt;strong&gt;in&lt;/strong&gt; to the codebase, and what you wish to keep &lt;strong&gt;out&lt;/strong&gt; at all costs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🟢 &lt;strong&gt;Choose your battles wisely (Look for the reddest of red flags 🚩)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A quote by C. JoyBell C. (&lt;em&gt;according to the internet&lt;/em&gt;). But it couldn't be more important advice.&lt;/p&gt;

&lt;p&gt;Especially after you have cultivated a decent level of trust with the other developer, you &lt;em&gt;can&lt;/em&gt; and &lt;em&gt;should&lt;/em&gt; enter into healthy conflict over something in the pull request where you deem it necessary.&lt;/p&gt;

&lt;p&gt;Look for those spots of code that &lt;em&gt;really&lt;/em&gt; violate best practices, or violate the standards of the specific language in which the project is coded. And believe me, if you're as good as you should be for having been an owner of this codebase in the first place, you will know it when you see it.&lt;/p&gt;

&lt;p&gt;Then, kindly explain something you are seeing, and again, ask what made them code it this way. After &lt;strong&gt;listening&lt;/strong&gt;, if you still think it's a bad call, suggest the alternative.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:

&lt;ul&gt;
&lt;li&gt;8 nested for-loops&lt;/li&gt;
&lt;li&gt;Side Effects in functions&lt;/li&gt;
&lt;li&gt;one letter variables&lt;/li&gt;
&lt;li&gt;stuff that is intrusively and selfishly inconsistent with how the codebase is already doing it: introducing spaces when tabs are what are used for whitespace. &lt;code&gt;When in Rome, code as the Romans&lt;/code&gt; (This one is the equivalent of "wiping your feet" before entering a stranger's home who has invited you in)&lt;/li&gt;
&lt;li&gt;deserializing JSON in a unit test to set up an object instead of calling &lt;code&gt;new&lt;/code&gt; to construct the thing 😊&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🟢 &lt;strong&gt;Choose to let in the code that will "work" but isn't &lt;em&gt;perfect&lt;/em&gt; (by your definition)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a tough one. It is the last, and most important tip.&lt;/p&gt;

&lt;p&gt;When you say, "Yes" to a piece of code, that &lt;strong&gt;(A)&lt;/strong&gt; you &lt;strong&gt;don't&lt;/strong&gt; agree with but &lt;strong&gt;(B)&lt;/strong&gt; you know will work, you have made a big step towards becoming a better human being, let alone a better engineer.&lt;/p&gt;

&lt;p&gt;This, less-severe, piece of tech debt, that may even fall off of your secret, internal list of things you &lt;em&gt;have to&lt;/em&gt; fix someday, and that's OK, is setting up for a great win in the future.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The code &lt;em&gt;works&lt;/em&gt;, and you didn't need to correct anything. Congrats! You just shipped code and improved your product which is great for your users! And it all happened &lt;em&gt;that&lt;/em&gt; much faster because we didn't need to spend time talking about this one thing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;By doing this, you allow the learning to take place down the road for that developer. Let &lt;em&gt;them&lt;/em&gt; realize it was a mistake, if it was a mistake. Then, they only get valuable experience in refactoring practices and &lt;strong&gt;you&lt;/strong&gt; don't get all the credit for finding it sooner, only making your fat head even bigger than it already is 😉.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A good teacher is like a candle – it consumes itself to light the way for others&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At last, the most interesting side effect to this act, a piece of what was shipped, may actually have been a really great freaking idea! A new design pattern maybe. One that you never even would have thought of… Woah!&lt;br&gt;
Correct me if I'm wrong, but I'm pretty sure companies enjoy bragging about all the "innovation" they be doing. Congrats. You now just allowed it to happen.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Finally, its over
&lt;/h1&gt;

&lt;p&gt;I hope this was helpful to someone. This list may not be perfect, or complete, but these practices continue to help me in my career, and even other areas of my life!&lt;/p&gt;

&lt;p&gt;I don't do any of this perfectly yet, maybe I never will. But day by day, these traits have started to come more naturally to me, and frankly, they feel much better to operate in. It's surprising almost the amount of anxiety and frustration these tips have the power to alleviate.&lt;/p&gt;

&lt;p&gt;A growth mindset and flexible thinking is about &lt;strong&gt;trying&lt;/strong&gt; and &lt;strong&gt;learning from feedback&lt;/strong&gt;. Know your values and don't compromise them. At the same time, be accommodating to different ways that meet those values and get it done.&lt;/p&gt;

&lt;p&gt;If you end up working with me someday, and find I am treating you like Goldilocks, please call animal control.&lt;/p&gt;

&lt;p&gt;I would rather care about my teammates, more than "my" codebases (&lt;em&gt;Which are, in most cases, not even my codebases to begin with. The company you work for owns everything you produce while on-the-clock.&lt;/em&gt; 😆).&lt;/p&gt;

&lt;p&gt;If you made it this far, thanks for reading all this.&lt;/p&gt;

&lt;p&gt;Here's a cheers to becoming better 🍻&lt;/p&gt;

</description>
      <category>mentorship</category>
      <category>bestpractices</category>
      <category>engineering</category>
    </item>
    <item>
      <title>Are you seriously not using Java 15 yet?</title>
      <dc:creator>Alessandro Aiezza</dc:creator>
      <pubDate>Wed, 10 Feb 2021 18:08:20 +0000</pubDate>
      <link>https://dev.to/aaiezza/are-you-seriously-not-using-java-15-yet-5c86</link>
      <guid>https://dev.to/aaiezza/are-you-seriously-not-using-java-15-yet-5c86</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What I want to accomplish&lt;/strong&gt;: I want to move to &lt;a href="https://docs.aws.amazon.com/corretto/latest/corretto-15-ug/what-is-corretto-15.html" rel="noopener noreferrer"&gt;Amazon Corretto 15&lt;/a&gt; so I can use the new features in my work projects. These features feel long awaited; So much so, &lt;a href="https://snyk.io/blog/kotlin-overtakes-scala-and-clojure-to-become-the-2nd-most-popular-language-on-the-jvm/#:~:text=Particularly%20Kotlin%2C%20a%20language%20developed,%2C%20to%20an%20impressive%205.5%25." rel="noopener noreferrer"&gt;Kotlin&lt;/a&gt; and &lt;a href="https://www.toptal.com/java/write-fat-free-java-code-project-lombok" rel="noopener noreferrer"&gt;Lombok&lt;/a&gt; continue to gain popularity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How&lt;/strong&gt;: I plan to convert an existing Java project from amazon‑corretto‑11 to amazon‑corretto‑15, &lt;em&gt;and&lt;/em&gt; add code to the project which will leverage the new features just to see how our infrastructure handles them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Caveats&lt;/em&gt;&lt;/strong&gt;: This particular service is dockerized. So we would also need to update our docker image to use Java 15. I plan to run the project outside of docker just using &lt;code&gt;mvn&lt;/code&gt; from a local shell.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conversion process
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Change the Maven compiler plugin version.
&lt;/h2&gt;

&lt;p&gt;In the build section of the &lt;code&gt;pom.xml&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;    &lt;span class="nt"&gt;&amp;lt;build&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;
            . . .
            &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-compiler-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.8.1&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;release&amp;gt;&lt;/span&gt;15&lt;span class="nt"&gt;&amp;lt;/release&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;compilerArgs&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;arg&amp;gt;&lt;/span&gt;--enable-preview&lt;span class="nt"&gt;&amp;lt;/arg&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/compilerArgs&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
            . . .
            &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-surefire-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;forkCount&amp;gt;&lt;/span&gt;0&lt;span class="nt"&gt;&amp;lt;/forkCount&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;argLine&amp;gt;&lt;/span&gt;--enable-preview&lt;span class="nt"&gt;&amp;lt;/argLine&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
            . . .
            &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-failsafe-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;argLine&amp;gt;&lt;/span&gt;--enable-preview&lt;span class="nt"&gt;&amp;lt;/argLine&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;build&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;a href="https://stackoverflow.com/questions/55303837/problem-running-tests-with-enabled-preview-features-in-surefire-and-failsafe/55311987#55311987" rel="noopener noreferrer"&gt;I needed &lt;code&gt;forkCount&lt;/code&gt; in the &lt;code&gt;surefire&lt;/code&gt; plugin configuration&lt;/a&gt; because the parent pom declares something higher than &lt;code&gt;0&lt;/code&gt;, &lt;a href="https://issues.apache.org/jira/projects/SUREFIRE/issues/SUREFIRE-1528?filter=allopenissues" rel="noopener noreferrer"&gt;SUREFIRE-1528&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is a great reminder that some of the features in 15 are technically experimental still and require preview.&lt;br&gt;
While I would be hesitant to use preview features in a production system, Amazon has &lt;a href="https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/patches.html" rel="noopener noreferrer"&gt;faithfully iterated on corretto-11&lt;/a&gt; through patches. Thus, as issues arise, there is iteration to fix those problems, and I believe that would also extend to preview features.&lt;br&gt;
And I think it's safe to assume that &lt;a href="https://docs.aws.amazon.com/corretto/latest/corretto-15-ug/patches.html" rel="noopener noreferrer"&gt;corretto-15 will also have patches issued&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Installing Amazon Corretto 15
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/corretto/latest/corretto-15-ug/downloads-list.html" rel="noopener noreferrer"&gt;Download &lt;code&gt;amazon-corretto-15&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or for the Linux users, you couldn't ask for a sweeter time: &lt;a href="https://docs.aws.amazon.com/corretto/latest/corretto-15-ug/generic-linux-install.html" rel="noopener noreferrer"&gt;Linux package managed installation instructions&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Updating my IDE
&lt;/h2&gt;
&lt;h3&gt;
  
  
  IntelliJ
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.jetbrains.com/idea/download" rel="noopener noreferrer"&gt;Download the latest IntelliJ&lt;/a&gt; and you will have been all set to use &lt;a href="https://blog.jetbrains.com/idea/2020/09/java-15-and-intellij-idea/" rel="noopener noreferrer"&gt;Java 15 since version 2020.2&lt;/a&gt;!&lt;/p&gt;
&lt;h3&gt;
  
  
  Eclipse
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.eclipse.org/downloads/" rel="noopener noreferrer"&gt;Download the latest Eclipse&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Using the JDK
&lt;/h3&gt;

&lt;p&gt;Just make sure when you're setting up your IDE, that you point to the correct&lt;span&gt;&lt;em&gt;to&lt;/em&gt;&lt;/span&gt; JDK installation!&lt;/p&gt;
&lt;h1&gt;
  
  
  Let's try out these Java 15 features
&lt;/h1&gt;
&lt;h2&gt;
  
  
  No more need for lombok here | Records
&lt;/h2&gt;

&lt;p&gt;Here is a simple class in the existing project. Users in this domain are given a "baby step" between &lt;code&gt;0&lt;/code&gt; and &lt;code&gt;7&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;With Lombok:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@lombok&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Data&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserBabyStep&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;UserBabyStep&lt;/span&gt; &lt;span class="no"&gt;NO_BABY_STEP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UserBabyStep&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;DEFAULT_BABY_STEP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;MAX_BABY_STEP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UserBabyStep&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;DEFAULT_BABY_STEP&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UserBabyStep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;MAX_BABY_STEP&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
          &lt;span class="s"&gt;"The Baby Step of a user must be between 0 and 7 inclusively."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hello &lt;code&gt;records&lt;/code&gt;!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;UserBabyStep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;UserBabyStep&lt;/span&gt; &lt;span class="no"&gt;NO_BABY_STEP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UserBabyStep&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;DEFAULT_BABY_STEP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;MAX_BABY_STEP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UserBabyStep&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;DEFAULT_BABY_STEP&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UserBabyStep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;MAX_BABY_STEP&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
          &lt;span class="s"&gt;"The Baby Step of a user must be between 0 and 7 inclusively."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Notes for &lt;code&gt;record&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Lombok will generate a more Java‑canonical getter method for fields: &lt;code&gt;getValue()&lt;/code&gt;. The getter method produced by the &lt;code&gt;record&lt;/code&gt; feature is: &lt;code&gt;value()&lt;/code&gt;.&lt;br&gt;
This is more similar to how the &lt;a href="https://immutables.github.io/" rel="noopener noreferrer"&gt;Immutables library&lt;/a&gt; operates, and &lt;em&gt;is&lt;/em&gt; a fancy way to get around when you may, or may not want &lt;code&gt;isFlag&lt;/code&gt; for &lt;code&gt;boolean&lt;/code&gt; getters. Especially if you are like me, and prefer leveraging the type system for wrapping primitives in a more domain‑driven class.&lt;/p&gt;

&lt;p&gt;Another note is that &lt;code&gt;record&lt;/code&gt;‑declared classes &lt;strong&gt;cannot&lt;/strong&gt; extend another class! Only implement interfaces.&lt;/p&gt;
&lt;h4&gt;
  
  
  Necessary usage of the canonical constructor
&lt;/h4&gt;

&lt;p&gt;Finally, when using records, all constructors &lt;strong&gt;must&lt;/strong&gt; call the canonical constructor. That is, the constructor with the same types, order, and number of arguments that are declared on the record itself.&lt;/p&gt;
&lt;h2&gt;
  
  
  Who's up for Checkers?
&lt;/h2&gt;

&lt;p&gt;Instead of just looking for more things to change around in this existing project, I'm going to add irrelevant code simply for the sake of flexing the new features. And then, I want to see how it compiles and how the project plugins handle it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Also&lt;/strong&gt;, I isolated the &lt;a href="https://github.com/aaiezza/checkers" rel="noopener noreferrer"&gt;checkers code&lt;/a&gt; if you'd like to take a closer look.&lt;/p&gt;
&lt;h3&gt;
  
  
  Sealed Interfaces
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;I'm going to mess around with this here, however, see the note at the end of the article concerning sealed interfaces.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A checker board tends to have two alternating colors tiling a 8 x 8 board.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcT0Dlvfi2C_DcaNEtIYRaEEAGD-YVgJHRarbNM9m96QZBVb9nvcUBXm7RBu-mReO0T-Ba6fhFU%26usqp%3DCAc" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcT0Dlvfi2C_DcaNEtIYRaEEAGD-YVgJHRarbNM9m96QZBVb9nvcUBXm7RBu-mReO0T-Ba6fhFU%26usqp%3DCAc" alt="checkerboard" width="215" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each &lt;code&gt;space&lt;/code&gt;/tile can have &lt;code&gt;contents&lt;/code&gt;; a red or black token.&lt;/p&gt;

&lt;p&gt;To demonstrate the difference between individual tiles, there is a sealed interface called &lt;code&gt;Space&lt;/code&gt; which &lt;code&gt;permits&lt;/code&gt; a &lt;code&gt;BlackSpace&lt;/code&gt; and a &lt;code&gt;RedSpace&lt;/code&gt;. Each subclass then also implements the &lt;code&gt;wither&lt;/code&gt; method that allows a space to take new contents.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;enum&lt;/span&gt; &lt;span class="nc"&gt;Contents&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="no"&gt;EMPTY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;BLACK&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;RED&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;sealed&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Space&lt;/span&gt; &lt;span class="n"&gt;permits&lt;/span&gt; &lt;span class="nc"&gt;BlackSpace&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;RedSpace&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Contents&lt;/span&gt; &lt;span class="nf"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;x&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;y&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Space&lt;/span&gt; &lt;span class="nf"&gt;withContents&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Contents&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;Contents&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EMPTY&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Contents&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;BlackSpace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Contents&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Space&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;BlackSpace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Contents&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EMPTY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Space&lt;/span&gt; &lt;span class="nf"&gt;withContents&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Contents&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;BlackSpace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;RedSpace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Contents&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Space&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;RedSpace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Contents&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EMPTY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Space&lt;/span&gt; &lt;span class="nf"&gt;withContents&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Contents&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RedSpace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now our &lt;code&gt;CheckerBoard&lt;/code&gt; can look a little something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@SuppressWarnings&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"preview"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CheckerBoard&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="no"&gt;MAX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Space&lt;/span&gt;&lt;span class="o"&gt;[][]&lt;/span&gt; &lt;span class="n"&gt;spaces&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;CheckerBoard&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;spaces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Space&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="no"&gt;MAX&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="no"&gt;MAX&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;forEachSpace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;spaces&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
          &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BlackSpace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RedSpace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: that, if you are anything like me, you aren't a fan of warnings. So here's a way to &lt;a href="https://stackoverflow.com/questions/59019993/how-can-i-suppress-javac-warning-about-preview-features" rel="noopener noreferrer"&gt;suppress them&lt;/a&gt; for the preview features we'll be using.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-line Strings
&lt;/h3&gt;

&lt;p&gt;Java eliminates all leading whitespace between newlines!&lt;br&gt;
Luckily, I already had a scenario where I would not need leading spaces in my string anyways:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CheckerBoardTest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@Test&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;shouldPrintBoardAsExpected&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;CheckerBoard&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CheckerBoard&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;freshBoardWithTokens&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="n"&gt;assertThat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEqualTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"""
            Ω · Ω · Ω · Ω ·
            · Ω · Ω · Ω · Ω
            Ω · Ω · Ω · Ω ·
            · • · • · • · •
            • · • · • · • ·
            · ☺ · ☺ · ☺ · ☺
            ☺ · ☺ · ☺ · ☺ ·
            · ☺ · ☺ · ☺ · ☺
            """&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;The google format spec basically has no idea what to do with this…&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern Matching in &lt;code&gt;instanceof&lt;/code&gt; (&lt;code&gt;instanceof&lt;/code&gt; casting)
&lt;/h3&gt;

&lt;p&gt;This is a really handy trick that I wish was introduced much earlier.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is also reminiscent of &lt;a href="https://assertj.github.io/doc/#assertj-core-3.13.0-asInstanceOf" rel="noopener noreferrer"&gt;a feature of the AssertJ testing library&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The key use of this feature is to prevent a manual class cast of a variable after you are &lt;em&gt;only&lt;/em&gt; in a block of code based on the type of a variable.&lt;/p&gt;

&lt;p&gt;So instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;method&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Animal&lt;/span&gt; &lt;span class="n"&gt;animal&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;animal&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;Cat&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nc"&gt;Cat&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;animal&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;meow&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;method&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Animal&lt;/span&gt; &lt;span class="n"&gt;animal&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;animal&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;Cat&lt;/span&gt; &lt;span class="n"&gt;cat&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;cat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;meow&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This method will set up a new checkboard and place the players' tokens in their starting positions. Since pieces should only be allowed to be played to the black spaces on the board, I can place pieces using the a &lt;code&gt;wither&lt;/code&gt; to keep each &lt;code&gt;space&lt;/code&gt; instance of my board immutable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;CheckerBoard&lt;/span&gt; &lt;span class="nf"&gt;freshBoardWithTokens&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;CheckerBoard&lt;/span&gt; &lt;span class="n"&gt;board&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CheckerBoard&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

  &lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forTopThreeRowsOfSpaces&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;space&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;space&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;BlackSpace&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;spaces&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="o"&gt;()][&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="o"&gt;()]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withContents&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;BLACK&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;});&lt;/span&gt;

  &lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forBottomThreeRowsOfSpaces&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;space&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;space&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;BlackSpace&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;spaces&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="o"&gt;()][&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="o"&gt;()]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withContents&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;RED&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;To be fair, the cast here is not necessary. So if you can come up with a better use case, I'd be happy to hear about it in the comments!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Switch Expression
&lt;/h3&gt;

&lt;p&gt;Our &lt;code&gt;CheckerBoard&lt;/code&gt; class has a convenient &lt;code&gt;toString&lt;/code&gt; method for a user friendly visual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;streamSpaces&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;space&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;strSpace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;space&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nl"&gt;EMPTY:&lt;/span&gt;
          &lt;span class="n"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;space&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;RedSpace&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"·"&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"•"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nl"&gt;BLACK:&lt;/span&gt;
          &lt;span class="n"&gt;yield&lt;/span&gt; &lt;span class="s"&gt;"Ω"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nl"&gt;RED:&lt;/span&gt;
          &lt;span class="n"&gt;yield&lt;/span&gt; &lt;span class="s"&gt;"☺"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
      &lt;span class="o"&gt;});&lt;/span&gt;

      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
          &lt;span class="s"&gt;"%s%s"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
          &lt;span class="n"&gt;strSpace&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
          &lt;span class="n"&gt;space&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isRightEdge&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"\n"&lt;/span&gt;
            &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;})&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reduce&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StringBuilder&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="nl"&gt;StringBuilder:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That new &lt;code&gt;yield&lt;/code&gt; keyword at work! I can essentially iterate over each &lt;code&gt;space&lt;/code&gt; to yield a character.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;More examples can be found here at this &lt;a href="https://www.baeldung.com/java-switch-pattern-matching" rel="noopener noreferrer"&gt;Baeldung article&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Issues
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;google code formatter breaks. It looks like it breaks on records, multi-line strings, and the &lt;code&gt;yield&lt;/code&gt; keyword that occurs in the switch expressions

&lt;ul&gt;
&lt;li&gt;To solve this, I think some motivated person could just start collaborating on Google GitHub repos for this. &lt;a href="https://dev.to/"&gt;The spec repo&lt;/a&gt; &lt;a href="https://dev.to/"&gt;The configuration repo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;the maven compiler (actually, the JVM) requires the &lt;code&gt;--enable-preview&lt;/code&gt; flag to unlock the features. This is an obvious red flag for usage in production code. It is hard to assess the risk of using these features as well. In the past, many features of the JDK that shipped as previews in earlier versions of Java have actually functioned perfectly. Will that continue to be the case?&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  Wrap-up
&lt;/h1&gt;

&lt;p&gt;One cannot simply assume that &lt;code&gt;preview&lt;/code&gt; Java feature will become integrated into the JDK long‑term.&lt;br&gt;
The &lt;a href="https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/Record.html" rel="noopener noreferrer"&gt;JavaDoc for the &lt;code&gt;Record&lt;/code&gt; class&lt;/a&gt; even contains a disclaimer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This class is associated with &lt;em&gt;records&lt;/em&gt;, a preview feature of the Java language. Programs can only use this class when preview features are enabled. Preview features may be removed in a future release, or upgraded to permanent features of the Java language.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the case of &lt;code&gt;records&lt;/code&gt;, however, you can breathe easy, as it is &lt;a href="https://openjdk.java.net/jeps/395" rel="noopener noreferrer"&gt;officially integrated into Java 16&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As for the other features described in this article:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Java version introduced&lt;/th&gt;
&lt;th&gt;Java version finalized&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://openjdk.java.net/jeps/394" rel="noopener noreferrer"&gt;Pattern Matching in &lt;code&gt;instanceof&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://openjdk.java.net/jeps/395" rel="noopener noreferrer"&gt;Records&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://openjdk.java.net/jeps/378" rel="noopener noreferrer"&gt;Multi-line Strings&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://openjdk.java.net/jeps/361" rel="noopener noreferrer"&gt;Switch Expressions&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://openjdk.java.net/jeps/397" rel="noopener noreferrer"&gt;Sealed interfaces&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sealed interfaces are still not officially being integrated. Even if they stick around, their syntax is subject to change. So that isn't a feature we were able to use here yet.&lt;/p&gt;

&lt;p&gt;The other features that I listed as being integrated for version 16, have not changed syntactically since 15, (as far as I could tell). So with those, you're in the clear&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;If you don't care about using the Google code formatter plugin for a while, and don't care about using sealed interfaces yet, you and your team can make the upgrade!&lt;/p&gt;

&lt;p&gt;If for some reason you are still tempted to use the sealed interfaces anyways, I would strongly suggest not using them! It is not an officially integrated feature and could change or even go away.&lt;br&gt;
A good example of this was the "Switch Expressions" feature. It was introduced in version 12 and overloaded the &lt;code&gt;break&lt;/code&gt; keyword. This was changed to &lt;code&gt;yield&lt;/code&gt; in version 13 to make more clear the intended behavior. Since it changed, it naturally needed to stay in preview in version 13, then finally was accepted in version 14. There's no telling what kind of iteration the sealed interfaces could still undergo.&lt;/p&gt;




&lt;h1&gt;
  
  
  Complete side-note | Speaking of features coming and going or staying
&lt;/h1&gt;

&lt;p&gt;Sometimes, it is nice to declare a &lt;code&gt;Function&lt;/code&gt; in a Java Lambda, but you plan to return a specific object regardless of the input. In the past, I have used an underscore &lt;code&gt;_&lt;/code&gt; to define the variable of non-interest. &lt;a href="https://docs.oracle.com/en/java/javase/14/language/small-language-changes.html" rel="noopener noreferrer"&gt;Java 9 had discontinued&lt;/a&gt; this from being allowed.&lt;br&gt;
Which I found interesting, considering that the introduction of &lt;code&gt;_&lt;/code&gt; as a variable name, had the apparent intention of being used in &lt;a href="https://openjdk.java.net/jeps/302" rel="noopener noreferrer"&gt;lambdas for unused arguments&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;While in our code bases, we have now switched to using double underscores &lt;code&gt;__&lt;/code&gt; for this, we also use Vavr. So a nice alternative might be to use &lt;a href="https://javadoc.io/doc/io.vavr/vavr/0.10.3/io/vavr/Function1.html#constant-R-" rel="noopener noreferrer"&gt;&lt;code&gt;Function1.constant&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>java</category>
      <category>java15</category>
      <category>amazoncorretto</category>
      <category>maven</category>
    </item>
  </channel>
</rss>
