<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Sebastien Noirot: Navigating Tech &amp; Soft Skills for Career Advancement]]></title><description><![CDATA[Sebastien Noirot's blog: A software engineer's insights on emerging tech trends and essential soft skills for career growth in the tech industry.]]></description><link>https://iwtyo.today</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 00:39:07 GMT</lastBuildDate><atom:link href="https://iwtyo.today/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Understanding CSS Specificity: A Concise Guide]]></title><description><![CDATA[Today at work, we encountered a common but often overlooked challenge in web development: CSS specificity. We had a global font-size definition that, to our surprise, wasn't being overridden by a more recent class style. Upon inspecting the CSS in th...]]></description><link>https://iwtyo.today/understanding-css-specificity-a-concise-guide</link><guid isPermaLink="true">https://iwtyo.today/understanding-css-specificity-a-concise-guide</guid><category><![CDATA[CSS]]></category><category><![CDATA[specificity]]></category><category><![CDATA[Basic of html and css]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Fri, 26 Jan 2024 15:28:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/6JVlSdgMacE/upload/947e17277b428df2101175c4dfdf4128.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today at work, we encountered a common but often overlooked challenge in web development: CSS specificity. We had a global <code>font-size</code> definition that, to our surprise, wasn't being overridden by a more recent class style. Upon inspecting the CSS in the developer tools, it became clear that the issue was rooted in CSS specificity - the new class style had a lower specificity score than the global style.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1706282610982/4e7424dc-785e-40f6-9356-8f0b919d74d2.png" alt class="image--center mx-auto" /></p>
<p>This real-world problem underscored the importance of understanding CSS specificity, not just in theory but in practical, day-to-day web development. In this article, I aim to demystify CSS specificity, drawing on this experience to show how a deeper understanding of this concept can save time and frustration in your web development journey.</p>
<p><strong>The Basics of CSS Specificity</strong></p>
<p>Specificity in CSS is like a game where different selectors earn different points. The selector with the highest points wins and its styles get applied. Here’s a quick rundown of the points system:</p>
<ul>
<li><p>Element selectors (e.g., <code>div</code>, <code>h1</code>): 1 point</p>
</li>
<li><p>Class selectors (e.g., <code>.container</code>, <code>.header</code>): 10 points</p>
</li>
<li><p>ID selectors (e.g., <code>#navbar</code>, <code>#footer</code>): 100 points</p>
</li>
<li><p>Inline styles (e.g., <code>style="font-size:12px"</code>): 1000 points</p>
</li>
</ul>
<p><strong>Example:</strong></p>
<pre><code class="lang-css"><span class="hljs-selector-tag">div</span> { <span class="hljs-comment">/* 1 point */</span> }
<span class="hljs-selector-class">.header</span> { <span class="hljs-comment">/* 10 points */</span> }
<span class="hljs-selector-id">#navbar</span> { <span class="hljs-comment">/* 100 points */</span> }
</code></pre>
<p><strong>Calculating Specificity</strong></p>
<p>When selectors are combined, their points add up. The one with the highest total wins.</p>
<p><strong>Example:</strong></p>
<pre><code class="lang-css"><span class="hljs-selector-id">#navbar</span> <span class="hljs-selector-class">.menu-item</span> { <span class="hljs-comment">/* 100 (ID) + 10 (Class) = 110 points */</span> }
<span class="hljs-selector-tag">body</span> <span class="hljs-selector-id">#content</span> <span class="hljs-selector-class">.article</span> <span class="hljs-selector-tag">h2</span> { <span class="hljs-comment">/* 1 (Element) + 100 (ID) + 10 (Class) + 1 (Element) = 112 points */</span> }
</code></pre>
<p>In the examples above, the second selector has higher specificity, so its styles will override those of the first selector if they target the same element.</p>
<p><strong>Practical Tips and Best Practices</strong></p>
<ul>
<li><p><strong>Avoid Overusing ID Selectors</strong>: IDs are great for JavaScript hooks or unique styling, but they can make your CSS hard to override due to their high specificity.</p>
</li>
<li><p><strong>Leverage Classes</strong>: Classes strike a good balance between specificity and reusability. They are your best friend for most styling tasks.</p>
</li>
<li><p><strong>Use</strong> <code>!important</code> Sparingly: This declaration overrides any other declarations, regardless of their specificity. Overuse can lead to maintenance nightmares. Use it only as a last resort.</p>
</li>
</ul>
<p>CSS specificity might seem complex at first, but once you understand the basics, it becomes a powerful tool in your web development arsenal. Experiment with different selectors, and you'll soon get a feel for how specificity shapes your stylesheets.</p>
<p><strong>Further Reading/Resources</strong></p>
<ul>
<li><p><a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity">MDN Web Docs on Specificity</a></p>
</li>
<li><p><a target="_blank" href="https://css-tricks.com/specifics-on-css-specificity/">CSS Tricks: Specifics on CSS Specificity</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Migrating from Javax to Jakarta]]></title><description><![CDATA[Introduction
Transitioning from javax to jakarta namespaces is pivotal in the Java EE ecosystem, especially when maintaining or lacking control over javax libraries. The transformer-maven-plugin facilitates this migration. In this article, we'll gene...]]></description><link>https://iwtyo.today/migrating-from-javax-to-jakarta</link><guid isPermaLink="true">https://iwtyo.today/migrating-from-javax-to-jakarta</guid><category><![CDATA[jakarta]]></category><category><![CDATA[maven]]></category><category><![CDATA[migration]]></category><category><![CDATA[plugins]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Wed, 04 Oct 2023 08:29:58 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/KgLtFCgfC28/upload/67a352501180a15765875cfa04a07e92.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-introduction">Introduction</h3>
<p>Transitioning from <code>javax</code> to <code>jakarta</code> namespaces is pivotal in the Java EE ecosystem, especially when maintaining or lacking control over <code>javax</code> libraries. The <code>transformer-maven-plugin</code> facilitates this migration. In this article, we'll generate a <code>javax</code> library from an XSD file, build a jar, and then create its <code>jakarta</code> version within a Maven project comprising two modules: one for <code>javax</code>, the other for <code>jakarta</code>.</p>
<h3 id="heading-prerequisites">Prerequisites</h3>
<p>In this article, we'll be utilizing Java and Apache Maven. It's assumed that you have basic familiarity with these technologies. Additionally, we will employ the <code>transformer-maven-plugin</code> to aid in the migration process. Now, with the basics covered, let's proceed to set up our Maven project for migrating a <code>javax</code> library to a <code>jakarta</code> one.</p>
<h3 id="heading-creating-the-maven-project-and-javax-module"><strong>Creating the Maven Project and Javax Module</strong></h3>
<ol>
<li><p><strong>Create a New Maven Project</strong></p>
<pre><code class="lang-bash"> mvn archetype:generate -DgroupId=com.example -DartifactId=javax-to-jakarta -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=<span class="hljs-literal">false</span>
</code></pre>
</li>
<li><p><strong>Convert to a Multi-module Project</strong></p>
<p> Edit the <code>pom.xml</code> in the <code>javax-to-jakarta</code> directory to include the <code>pom</code> packaging type and Java 8 source/target:</p>
<pre><code class="lang-xml"> <span class="hljs-tag">&lt;<span class="hljs-name">packaging</span>&gt;</span>pom<span class="hljs-tag">&lt;/<span class="hljs-name">packaging</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">properties</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">maven.compiler.source</span>&gt;</span>8<span class="hljs-tag">&lt;/<span class="hljs-name">maven.compiler.source</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">maven.compiler.target</span>&gt;</span>8<span class="hljs-tag">&lt;/<span class="hljs-name">maven.compiler.target</span>&gt;</span>
 <span class="hljs-tag">&lt;/<span class="hljs-name">properties</span>&gt;</span>
</code></pre>
</li>
<li><p><strong>Create a Module for Javax</strong></p>
<pre><code class="lang-bash"> mvn archetype:generate -DgroupId=com.example -DartifactId=javax-module -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=<span class="hljs-literal">false</span>
</code></pre>
</li>
<li><p><strong>Generate Javax Library from XSD</strong></p>
<p> Create a directory <code>src/main/xsd</code> within <code>javax-module</code>, and place the following <code>person.xsd</code> file in it:</p>
<pre><code class="lang-xml"> <span class="hljs-meta">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">xs:schema</span> <span class="hljs-attr">xmlns:xs</span>=<span class="hljs-string">"http://www.w3.org/2001/XMLSchema"</span>&gt;</span>
   <span class="hljs-tag">&lt;<span class="hljs-name">xs:element</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"Person"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"PersonType"</span>/&gt;</span>
   <span class="hljs-tag">&lt;<span class="hljs-name">xs:complexType</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"PersonType"</span>&gt;</span>
     <span class="hljs-tag">&lt;<span class="hljs-name">xs:sequence</span>&gt;</span>
       <span class="hljs-tag">&lt;<span class="hljs-name">xs:element</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"FirstName"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"xs:string"</span>/&gt;</span>
       <span class="hljs-tag">&lt;<span class="hljs-name">xs:element</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"LastName"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"xs:string"</span>/&gt;</span>
       <span class="hljs-tag">&lt;<span class="hljs-name">xs:element</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"Age"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"xs:integer"</span>/&gt;</span>
     <span class="hljs-tag">&lt;/<span class="hljs-name">xs:sequence</span>&gt;</span>
   <span class="hljs-tag">&lt;/<span class="hljs-name">xs:complexType</span>&gt;</span>
 <span class="hljs-tag">&lt;/<span class="hljs-name">xs:schema</span>&gt;</span>
</code></pre>
<p> Update <code>javax-module/pom.xml</code> to include the <code>jaxb2-maven-plugin</code> and <code>javax</code> dependencies:</p>
<pre><code class="lang-xml"> <span class="hljs-tag">&lt;<span class="hljs-name">dependencies</span>&gt;</span>
     <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
         <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>javax.xml.bind<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
         <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>jaxb-api<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
         <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>2.3.1<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
     <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
 <span class="hljs-tag">&lt;/<span class="hljs-name">dependencies</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">build</span>&gt;</span>
   <span class="hljs-tag">&lt;<span class="hljs-name">plugins</span>&gt;</span>
     <span class="hljs-tag">&lt;<span class="hljs-name">plugin</span>&gt;</span>
       <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.codehaus.mojo<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
       <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>jaxb2-maven-plugin<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
       <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>2.5.0<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
       <span class="hljs-tag">&lt;<span class="hljs-name">executions</span>&gt;</span>
         <span class="hljs-tag">&lt;<span class="hljs-name">execution</span>&gt;</span>
           <span class="hljs-tag">&lt;<span class="hljs-name">goals</span>&gt;</span>
             <span class="hljs-tag">&lt;<span class="hljs-name">goal</span>&gt;</span>xjc<span class="hljs-tag">&lt;/<span class="hljs-name">goal</span>&gt;</span>
           <span class="hljs-tag">&lt;/<span class="hljs-name">goals</span>&gt;</span>
         <span class="hljs-tag">&lt;/<span class="hljs-name">execution</span>&gt;</span>
       <span class="hljs-tag">&lt;/<span class="hljs-name">executions</span>&gt;</span>
     <span class="hljs-tag">&lt;/<span class="hljs-name">plugin</span>&gt;</span>
   <span class="hljs-tag">&lt;/<span class="hljs-name">plugins</span>&gt;</span>
 <span class="hljs-tag">&lt;/<span class="hljs-name">build</span>&gt;</span>
</code></pre>
</li>
<li><p><strong>Build and Package the Javax Library</strong></p>
<pre><code class="lang-bash"> mvn package
</code></pre>
</li>
</ol>
<h3 id="heading-setting-up-the-jakarta-module"><strong>Setting up the Jakarta Module</strong></h3>
<ol>
<li><p><strong>Create a Module for Jakarta</strong></p>
<pre><code class="lang-bash"> mvn archetype:generate -DgroupId=com.example -DartifactId=jakarta-module -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=<span class="hljs-literal">false</span>
</code></pre>
</li>
<li><p><strong>Update Parent POM</strong></p>
<p> Add <code>jakarta-module</code> to the parent <code>pom.xml</code>:</p>
<pre><code class="lang-xml"> <span class="hljs-tag">&lt;<span class="hljs-name">modules</span>&gt;</span>
     <span class="hljs-tag">&lt;<span class="hljs-name">module</span>&gt;</span>javax-module<span class="hljs-tag">&lt;/<span class="hljs-name">module</span>&gt;</span>
     <span class="hljs-tag">&lt;<span class="hljs-name">module</span>&gt;</span>jakarta-module<span class="hljs-tag">&lt;/<span class="hljs-name">module</span>&gt;</span>
 <span class="hljs-tag">&lt;/<span class="hljs-name">modules</span>&gt;</span>
</code></pre>
</li>
<li><p><strong>Configure Transformer-Maven-Plugin in Jakarta Module</strong></p>
<p> Navigate to the <code>jakarta-module</code> directory and edit its <code>pom.xml</code> to include the <code>transformer-maven-plugin</code> and specify the dependency on the <code>javax</code> module:</p>
<pre><code class="lang-xml"> <span class="hljs-tag">&lt;<span class="hljs-name">dependencies</span>&gt;</span>
     <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
         <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>jakarta.xml.bind<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
         <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>jakarta.xml.bind-api<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
         <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>3.0.1<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
     <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
 <span class="hljs-tag">&lt;/<span class="hljs-name">dependencies</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">build</span>&gt;</span>
         <span class="hljs-tag">&lt;<span class="hljs-name">plugins</span>&gt;</span>
             <span class="hljs-tag">&lt;<span class="hljs-name">plugin</span>&gt;</span>
                 <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.eclipse.transformer<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
                 <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>transformer-maven-plugin<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
                 <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>0.5.0<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
                 <span class="hljs-tag">&lt;<span class="hljs-name">extensions</span>&gt;</span>true<span class="hljs-tag">&lt;/<span class="hljs-name">extensions</span>&gt;</span>
                 <span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
                     <span class="hljs-tag">&lt;<span class="hljs-name">rules</span>&gt;</span>
                         <span class="hljs-tag">&lt;<span class="hljs-name">jakartaDefaults</span>&gt;</span>true<span class="hljs-tag">&lt;/<span class="hljs-name">jakartaDefaults</span>&gt;</span>
                     <span class="hljs-tag">&lt;/<span class="hljs-name">rules</span>&gt;</span>
                 <span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
                 <span class="hljs-tag">&lt;<span class="hljs-name">executions</span>&gt;</span>
                     <span class="hljs-tag">&lt;<span class="hljs-name">execution</span>&gt;</span>
                         <span class="hljs-tag">&lt;<span class="hljs-name">id</span>&gt;</span>default-jar<span class="hljs-tag">&lt;/<span class="hljs-name">id</span>&gt;</span>
                         <span class="hljs-tag">&lt;<span class="hljs-name">goals</span>&gt;</span>
                             <span class="hljs-tag">&lt;<span class="hljs-name">goal</span>&gt;</span>jar<span class="hljs-tag">&lt;/<span class="hljs-name">goal</span>&gt;</span>
                         <span class="hljs-tag">&lt;/<span class="hljs-name">goals</span>&gt;</span>
                         <span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
                             <span class="hljs-tag">&lt;<span class="hljs-name">artifact</span>&gt;</span>
                                 <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>com.example<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
                                 <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>javax-module<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
                                 <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>${project.version}<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
                             <span class="hljs-tag">&lt;/<span class="hljs-name">artifact</span>&gt;</span>
                         <span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
                     <span class="hljs-tag">&lt;/<span class="hljs-name">execution</span>&gt;</span>
                 <span class="hljs-tag">&lt;/<span class="hljs-name">executions</span>&gt;</span>
             <span class="hljs-tag">&lt;/<span class="hljs-name">plugin</span>&gt;</span>
         <span class="hljs-tag">&lt;/<span class="hljs-name">plugins</span>&gt;</span>
     <span class="hljs-tag">&lt;/<span class="hljs-name">build</span>&gt;</span>
</code></pre>
</li>
<li><p><strong>Execute the Migration</strong></p>
<p> From the root project directory (<code>javax-to-jakarta</code>), execute the following command to perform the migration:</p>
<pre><code class="lang-bash"> mvn clean package
</code></pre>
</li>
</ol>
<h3 id="heading-conclusion"><strong>Conclusion</strong></h3>
<p>In this article, we walked through a structured approach to migrate a <code>javax</code> library to a <code>jakarta</code> library using the <code>transformer-maven-plugin</code> within a Maven multi-module project. This methodology proves to be beneficial especially when there's a need to maintain a <code>javax</code> library or when control over the <code>javax</code> library is not available. Our setup delineated clear, easy-to-follow steps for migration, which is not only reproducible but also sets a foundation for testing and validation, ensuring the integrity of the libraries across the transition.</p>
<p>The <code>transformer-maven-plugin</code> offers a range of features beyond what was explored in this guide, making it a robust tool worth exploring for similar migration projects.</p>
<p>The complete code for the project discussed is available on <a target="_blank" href="https://github.com/seb-noirot/javax-to-jakarta">GitHub</a>, providing a practical reference to jump-start your migration endeavors from <code>javax</code> to <code>jakarta</code>.</p>
]]></content:encoded></item><item><title><![CDATA[JUnit5 and Parameterized Tests]]></title><description><![CDATA[Introduction
JUnit is an essential framework in the Java world for unit testing. You might already be familiar with writing test cases, assertions, and handling expected exceptions in JUnit. However, there is a powerful feature that you might be miss...]]></description><link>https://iwtyo.today/junit5-and-parameterized-tests</link><guid isPermaLink="true">https://iwtyo.today/junit5-and-parameterized-tests</guid><category><![CDATA[best practices]]></category><category><![CDATA[Java]]></category><category><![CDATA[Testing]]></category><category><![CDATA[junit 5]]></category><category><![CDATA[Parameterized Tests]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Mon, 26 Jun 2023 07:00:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/95YRwf6CNw8/upload/a3546dadd200a387c0f9e253cb13abfe.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction"><strong>Introduction</strong></h2>
<p>JUnit is an essential framework in the Java world for unit testing. You might already be familiar with writing test cases, assertions, and handling expected exceptions in JUnit. However, there is a powerful feature that you might be missing: Parameterized Tests. In this article, we will delve into how you can use Parameterized Tests in JUnit 5 to make your test cases more concise and maintainable.</p>
<h2 id="heading-what-are-parameterized-tests">What are Parameterized Tests?</h2>
<p>Parameterized tests are a feature that allows you to execute the same test case multiple times but with different input values. This can save you time and keep your codebase cleaner by reducing the number of explicitly written test cases. Instead of writing separate test methods for each set of input data, you can write a single test and provide multiple sets of inputs. This not only makes your test code more concise but also helps in easy maintenance as the code evolves.</p>
<h3 id="heading-benefits">Benefits</h3>
<ul>
<li><p><strong>Code Reusability</strong>: Avoid redundancy in test cases by reusing the same test method with different data sets.</p>
</li>
<li><p><strong>Scalability</strong>: Easily add more test cases by just adding new sets of data.</p>
</li>
<li><p><strong>Readability</strong>: Improves readability by structuring the input data neatly.</p>
</li>
<li><p><strong>Maintainability</strong>: Makes maintaining tests easier, especially when test logic is complex.</p>
</li>
</ul>
<h3 id="heading-how-it-works">How It Works</h3>
<p>In a parameterized test, you define the test method just once. However, instead of hardcoding the input values within the test method, you define them separately and annotate the test method to indicate that it should be run multiple times with different input values. JUnit 5 provides several annotations to define these input values.</p>
<h3 id="heading-example">Example</h3>
<p>Let’s say you have a utility method for calculating the area of a rectangle and you want to test this method. Instead of writing multiple test cases, you can use a parameterized test.</p>
<pre><code class="lang-java"><span class="hljs-keyword">import</span> <span class="hljs-keyword">static</span> org.junit.jupiter.api.Assertions.assertEquals;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.ParameterizedTest;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.MethodSource;
<span class="hljs-keyword">import</span> java.util.stream.Stream;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.Arguments;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">AreaCalculatorTest</span> </span>{

    <span class="hljs-meta">@ParameterizedTest</span>
    <span class="hljs-meta">@MethodSource("rectangleAreaProvider")</span>
    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testRectangleArea</span><span class="hljs-params">(<span class="hljs-keyword">int</span> length, <span class="hljs-keyword">int</span> width, <span class="hljs-keyword">int</span> expectedArea)</span> </span>{
        assertEquals(expectedArea, calculateRectangleArea(length, width));
    }

    <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Stream&lt;Arguments&gt; <span class="hljs-title">rectangleAreaProvider</span><span class="hljs-params">()</span> </span>{
        <span class="hljs-keyword">return</span> Stream.of(
            Arguments.of(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">2</span>),
            Arguments.of(<span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">12</span>),
            Arguments.of(<span class="hljs-number">5</span>, <span class="hljs-number">6</span>, <span class="hljs-number">30</span>)
        );
    }

    <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> <span class="hljs-title">calculateRectangleArea</span><span class="hljs-params">(<span class="hljs-keyword">int</span> length, <span class="hljs-keyword">int</span> width)</span> </span>{
        <span class="hljs-keyword">return</span> length * width;
    }
}
</code></pre>
<p>In this example, <code>testRectangleArea</code> is the test method that will be executed multiple times. The <code>@ParameterizedTest</code> annotation indicates that this is a parameterized test. The <code>@MethodSource</code> annotation points to the method <code>rectangleAreaProvider</code>, which provides different sets of input values. Each set of values (length, width, and expectedArea) is used as input to the <code>testRectangleArea</code> method in different executions.</p>
<p>Parameterized tests can be used for a wide range of scenarios, from simple input validation to complex algorithm testing. By utilizing them in your test suite, you can make your testing process more efficient and effective.</p>
<h2 id="heading-setting-up-junit-5">Setting Up JUnit 5</h2>
<p>To harness the power of Parameterized Tests in JUnit 5, you first need to ensure that your project is set up to use JUnit 5. Here is a detailed guide for setting up JUnit 5 in your Java project.</p>
<h3 id="heading-prerequisites">Prerequisites</h3>
<ul>
<li><p>JDK 8 or later</p>
</li>
<li><p>A build tool such as Maven or Gradle (optional, but recommended)</p>
</li>
</ul>
<h3 id="heading-adding-dependencies-with-maven">Adding Dependencies with Maven</h3>
<p>If you are using Maven as your build tool, add the following dependency to your <code>pom.xml</code> file. Note that JUnit 5 is part of the JUnit Jupiter project, and you should use the <code>junit-jupiter</code> artifact:</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.junit.jupiter<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>junit-jupiter<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>5.9.3<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">scope</span>&gt;</span>test<span class="hljs-tag">&lt;/<span class="hljs-name">scope</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
</code></pre>
<h3 id="heading-adding-dependencies-with-gradle">Adding Dependencies with Gradle</h3>
<p>If you are using Gradle, add the following dependency to your <code>build.gradle</code> file:</p>
<pre><code class="lang-plaintext">dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter:5.9.3'
}
</code></pre>
<h3 id="heading-configuring-maven-surefire-plugin">Configuring Maven Surefire Plugin</h3>
<p>If you are using Maven, it's important to ensure that you're using a version of the Surefire plugin that supports JUnit 5. Add the following plugin configuration to your <code>pom.xml</code> file:</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">build</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">plugins</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">plugin</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.apache.maven.plugins<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>maven-surefire-plugin<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>3.1.2<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">plugin</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">plugins</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">build</span>&gt;</span>
</code></pre>
<h3 id="heading-ide-support">IDE Support</h3>
<p>Modern IDEs like IntelliJ IDEA, Eclipse, and NetBeans have built-in support for JUnit 5. However, ensure that your IDE is up to date, as older versions may not support JUnit 5.</p>
<h3 id="heading-writing-a-basic-junit-5-test">Writing a Basic JUnit 5 Test</h3>
<p>Before diving into Parameterized Tests, let's write a basic JUnit 5 test to make sure everything is set up correctly. Create a class <code>CalculatorTest</code> with the following code:</p>
<pre><code class="lang-java"><span class="hljs-keyword">import</span> <span class="hljs-keyword">static</span> org.junit.jupiter.api.Assertions.assertEquals;

<span class="hljs-keyword">import</span> org.junit.jupiter.api.Test;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.ParameterizedTest;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.CsvSource;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CalculatorTest</span> </span>{

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> Calculator calculator = <span class="hljs-keyword">new</span> Calculator();

    <span class="hljs-meta">@Test</span>
    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testAddition</span><span class="hljs-params">()</span> </span>{
        Calculator calculator = <span class="hljs-keyword">new</span> Calculator();
        assertEquals(<span class="hljs-number">5</span>, calculator.add(<span class="hljs-number">2</span>, <span class="hljs-number">3</span>));
    }

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Calculator</span> </span>{
        <span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">add</span><span class="hljs-params">(<span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b)</span> </span>{
            <span class="hljs-keyword">return</span> a + b;
        }
    }
}
</code></pre>
<p>This is a simple test class with a single test case to check the addition method of a Calculator class.</p>
<h3 id="heading-running-the-test">Running the Test</h3>
<p>Run the test case through your IDE, or, if you are using Maven, run the following command in the terminal:</p>
<pre><code class="lang-sh">mvn <span class="hljs-built_in">test</span>
</code></pre>
<p>If you're using Gradle, you can run:</p>
<pre><code class="lang-sh">./gradlew <span class="hljs-built_in">test</span>
</code></pre>
<p>If everything is set up correctly, the test should execute successfully.</p>
<p>Now that your project is set up to use JUnit 5, you are ready to dive into writing Parameterized Tests as covered in the subsequent sections of this article.</p>
<h2 id="heading-writing-your-first-parameterized-test">Writing Your First Parameterized Test</h2>
<p>Now that you have JUnit 5 set up, let’s dive deeper into writing your first parameterized test. For this example, let's consider you have a simple utility class that provides functionality to calculate the sum of two numbers.</p>
<h3 id="heading-step-1-write-the-parameterized-test">Step 1: Write the parameterized test</h3>
<p>Create a new test class named <code>CalculatorTest</code>. Use the <code>@ParameterizedTest</code> annotation to indicate that this is a parameterized test. For this example, let's use the <code>@CsvSource</code> annotation to provide comma-separated values. Each line in <code>@CsvSource</code> represents a set of input parameters followed by the expected output.</p>
<pre><code class="lang-java"><span class="hljs-keyword">import</span> <span class="hljs-keyword">static</span> org.junit.jupiter.api.Assertions.assertEquals;

<span class="hljs-keyword">import</span> org.junit.jupiter.api.Test;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.ParameterizedTest;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.CsvSource;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CalculatorTest</span> </span>{

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> Calculator calculator = <span class="hljs-keyword">new</span> Calculator();

    <span class="hljs-meta">@Test</span>
    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testAddition</span><span class="hljs-params">()</span> </span>{
        Calculator calculator = <span class="hljs-keyword">new</span> Calculator();
        assertEquals(<span class="hljs-number">5</span>, calculator.add(<span class="hljs-number">2</span>, <span class="hljs-number">3</span>));
    }

    <span class="hljs-meta">@ParameterizedTest</span>
    <span class="hljs-meta">@CsvSource({
            "1, 1, 2",
            "2, 3, 5",
            "100, 200, 300"
    })</span>
    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testAddition</span><span class="hljs-params">(<span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b, <span class="hljs-keyword">int</span> expectedResult)</span> </span>{
        assertEquals(expectedResult, calculator.add(a, b));
    }

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Calculator</span> </span>{
        <span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">add</span><span class="hljs-params">(<span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b)</span> </span>{
            <span class="hljs-keyword">return</span> a + b;
        }
    }
}
</code></pre>
<p>In the above example, the <code>testAddition</code> method is annotated with <code>@ParameterizedTest</code> to signify it's a parameterized test. The <code>@CsvSource</code> annotation provides three sets of data. Each set contains two input numbers and the expected sum. The <code>testAddition</code> method is executed three times with different sets of data.</p>
<h3 id="heading-step-3-run-the-test">Step 3: Run the Test</h3>
<p>You can run this test in the same way you run regular JUnit tests. If you're using an IDE, you can usually right-click the test class and select 'Run'. If you're using Maven or Gradle, it will also recognize and run your parameterized test as part of the test phase.</p>
<h3 id="heading-step-4-understand-the-output">Step 4: Understand the Output</h3>
<p>When the test runs, JUnit will execute the <code>testAddition</code> method multiple times with different parameters. If the output matches the expected result, the test passes. If any of the executions fail (meaning the output didn't match the expected result), then the parameterized test fails.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1687757527802/9b20c7a2-e1eb-42b4-a5ab-0eb6ffb49680.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-5-analyze-and-refactor">Step 5: Analyze and Refactor</h3>
<p>After running the tests, if you encounter any failures, it’s essential to analyze the test and the code under test. Determine whether the failure is due to incorrect input data or an issue with the implementation. If needed, update the implementation or correct the test data and re-run the tests.</p>
<p>Parameterized tests are an invaluable tool for increasing coverage with various inputs without the need to write a new test case for each input scenario. This keeps your test suite concise and maintainable. As you get more comfortable with parameterized tests, you can explore more advanced features like custom argument sources and converters.</p>
<h2 id="heading-formatting-the-display-name-of-parameterized-tests">Formatting the Display Name of Parameterized Tests</h2>
<p>In JUnit 5, you can customize the display name of parameterized tests to include the parameters used in each invocation. This is particularly useful for better understanding which values are being tested, especially when looking at test reports. To achieve this, you use the <code>name</code> attribute of the <code>@ParameterizedTest</code> annotation.</p>
<p>The <code>name</code> attribute allows you to specify a pattern for the display name. You can use <code>{index}</code> as a placeholder for the current test invocation index (1-based), and <code>{arguments}</code> to include a list of the actual parameter values. Additionally, you can reference individual method parameter values using <code>{0}</code>, <code>{1}</code>, etc., based on their position.</p>
<p>Here's an example that demonstrates how to format the display name using the <code>name</code> attribute:</p>
<pre><code class="lang-java"><span class="hljs-keyword">import</span> <span class="hljs-keyword">static</span> org.junit.jupiter.api.Assertions.assertEquals;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.ParameterizedTest;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.CsvSource;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MathTest</span> </span>{

    <span class="hljs-meta">@ParameterizedTest(name = "Test #{index}: {0} + {1} = {2}")</span>
    <span class="hljs-meta">@CsvSource({"2, 3, 5", "4, 5, 9", "10, 20, 30"})</span>
    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testSum</span><span class="hljs-params">(<span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b, <span class="hljs-keyword">int</span> expectedSum)</span> </span>{
        assertEquals(expectedSum, a + b);
    }
}
</code></pre>
<p>In this example, the display name of each test invocation will be something like "Test #1: 2 + 3 = 5", "Test #2: 4 + 5 = 9", and so on. This makes it easier to understand what values are being used in each test case just by looking at the display name.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1687759860371/9c54202a-34f5-4e7d-b3ce-974a43cbc20a.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-different-sources-of-parameters">Different Sources of Parameters</h2>
<p>JUnit 5 offers a variety of sources for parameters that can be used in parameterized tests. In this section, we will look at each type of source and provide examples for each of them.</p>
<h3 id="heading-1-valuesource">1. ValueSource</h3>
<p><code>@ValueSource</code> allows you to specify a single set of literal values (e.g., integers, strings) that will be used as arguments for the parameterized test.</p>
<p><strong>Example</strong>:</p>
<pre><code class="lang-java"><span class="hljs-keyword">import</span> <span class="hljs-keyword">static</span> org.junit.jupiter.api.Assertions.assertTrue;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.ParameterizedTest;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.ValueSource;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NumberTest</span> </span>{

    <span class="hljs-meta">@ParameterizedTest</span>
    <span class="hljs-meta">@ValueSource(ints = {2, 4, 8, 16, 32})</span>
    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testNumberIsPowerOfTwo</span><span class="hljs-params">(<span class="hljs-keyword">int</span> number)</span> </span>{
        assertTrue(isPowerOfTwo(number));
    }

    <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isPowerOfTwo</span><span class="hljs-params">(<span class="hljs-keyword">int</span> number)</span> </span>{
        <span class="hljs-keyword">return</span> (number &amp; (number - <span class="hljs-number">1</span>)) == <span class="hljs-number">0</span>;
    }
}
</code></pre>
<h3 id="heading-2-enumsource"><strong>2. EnumSource</strong></h3>
<p><code>@EnumSource</code> allows you to use enum constants as the source of parameters. Additionally, it provides an attribute named <code>mode</code> that lets you control how the enum constants are used in the test. The <code>EnumSource.Mode</code> enum includes several options such as <code>INCLUDE</code>, <code>EXCLUDE</code>, <code>MATCH_ALL</code>, and <code>MATCH_ANY</code>.</p>
<p><strong>Example Enum Class</strong>:</p>
<pre><code class="lang-java"><span class="hljs-keyword">import</span> <span class="hljs-keyword">static</span> org.junit.jupiter.api.Assertions.assertNotNull;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.ParameterizedTest;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.EnumSource;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DaysTest</span> </span>{

    <span class="hljs-class"><span class="hljs-keyword">enum</span> <span class="hljs-title">Days</span> </span>{
        MONDAY,
        TUESDAY,
        WEDNESDAY,
        THURSDAY,
        FRIDAY,
        SATURDAY,
        SUNDAY
    }

    <span class="hljs-meta">@ParameterizedTest</span>
    <span class="hljs-meta">@EnumSource(Days.class)</span>
    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testDaysEnum</span><span class="hljs-params">(Days days)</span> </span>{
        assertNotNull(days);
    }
}
</code></pre>
<p><strong>Example with INCLUDE Mode</strong>:</p>
<pre><code class="lang-java">javaCopy codeimport <span class="hljs-keyword">static</span> org.junit.jupiter.api.Assertions.assertNotNull;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.ParameterizedTest;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.EnumSource;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DaysTest</span> </span>{

    <span class="hljs-meta">@ParameterizedTest</span>
    <span class="hljs-meta">@EnumSource(value = Days.class, mode = EnumSource.Mode.INCLUDE, names = {"MONDAY", "FRIDAY"})</span>
    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testIncludeMode</span><span class="hljs-params">(Days day)</span> </span>{
        assertNotNull(day);
    }
}
</code></pre>
<p><strong>Example with EXCLUDE Mode</strong>:</p>
<pre><code class="lang-java">javaCopy codeimport <span class="hljs-keyword">static</span> org.junit.jupiter.api.Assertions.assertNotNull;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.ParameterizedTest;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.EnumSource;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DaysTest</span> </span>{

    <span class="hljs-meta">@ParameterizedTest</span>
    <span class="hljs-meta">@EnumSource(value = Days.class, mode = EnumSource.Mode.EXCLUDE, names = {"SATURDAY", "SUNDAY"})</span>
    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testExcludeMode</span><span class="hljs-params">(Days day)</span> </span>{
        assertNotNull(day);
    }
}
</code></pre>
<p><strong>Example with MATCH_ALL Mode</strong>:</p>
<pre><code class="lang-java">javaCopy codeimport <span class="hljs-keyword">static</span> org.junit.jupiter.api.Assertions.assertNotNull;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.ParameterizedTest;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.EnumSource;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DaysTest</span> </span>{

    <span class="hljs-meta">@ParameterizedTest</span>
    <span class="hljs-meta">@EnumSource(value = Days.class, mode = EnumSource.Mode.MATCH_ALL, names = {"^.*DAY$", "^MON.*"})</span>
    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testMatchAllMode</span><span class="hljs-params">(Days day)</span> </span>{
        assertNotNull(day);
    }
}
</code></pre>
<p><strong>Example with MATCH_ANY Mode</strong>:</p>
<pre><code class="lang-java">javaCopy codeimport <span class="hljs-keyword">static</span> org.junit.jupiter.api.Assertions.assertNotNull;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.ParameterizedTest;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.EnumSource;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DaysTest</span> </span>{

    <span class="hljs-meta">@ParameterizedTest</span>
    <span class="hljs-meta">@EnumSource(value = Days.class, mode = EnumSource.Mode.MATCH_ANY, names = {"^TUES.*", "^FRI.*"})</span>
    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testMatchAnyMode</span><span class="hljs-params">(Days day)</span> </span>{
        assertNotNull(day);
    }
}
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1687758447379/a114ff39-99b5-45fb-bd3c-785b0426e80c.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-3-csvsource">3. CsvSource</h3>
<p>As we saw earlier, <code>@CsvSource</code> allows you to define sets of values as comma-separated strings. Each string represents the parameters for one invocation of the parameterized test.</p>
<p><strong>Example</strong>:</p>
<pre><code class="lang-java"><span class="hljs-keyword">import</span> <span class="hljs-keyword">static</span> org.junit.jupiter.api.Assertions.assertEquals;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.ParameterizedTest;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.CsvSource;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MathTest</span> </span>{

    <span class="hljs-meta">@ParameterizedTest</span>
    <span class="hljs-meta">@CsvSource({"2, 3, 5", "4, 5, 9", "10, 20, 30"})</span>
    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testSum</span><span class="hljs-params">(<span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b, <span class="hljs-keyword">int</span> expectedSum)</span> </span>{
        assertEquals(expectedSum, a + b);
    }
}
</code></pre>
<p>The <code>@CsvSource</code> annotation in JUnit 5 allows you to provide comma-separated values (CSV) as the source of parameters for a parameterized test. In addition to just specifying the values, <code>@CsvSource</code> offers a few more attributes that give you greater control over how the values are interpreted and passed to the test method. These attributes are:</p>
<ul>
<li><p><code>value</code>: This is where you provide the sets of values as an array of strings. Each string represents the parameters for one invocation of the parameterized test. The values within each string are comma-separated by default.</p>
</li>
<li><p><code>delimiter</code>: Allows you to specify a custom delimiter character that separates values within each string. The default delimiter is a comma (<code>,</code>).</p>
</li>
<li><p><code>delimiterString</code>: Similar to <code>delimiter</code>, but allows you to specify a delimiter as a string (it can be more than one character).</p>
</li>
<li><p><code>emptyValue</code>: Allows you to specify a custom string that represents an empty value (defaults to <code>""</code>).</p>
</li>
<li><p><code>nullValues</code>: Allows you to specify one or more strings that should be interpreted as <code>null</code>.</p>
</li>
<li><p><code>textBlock</code>: Allows attribute allows you to specify the CSV values as a text block, which is ideal for multiline content.</p>
</li>
</ul>
<p>Let's look at examples that demonstrate the use of these attributes.</p>
<h3 id="heading-using-a-custom-delimiter"><strong>Using a Custom Delimiter</strong></h3>
<pre><code class="lang-java"><span class="hljs-meta">@ParameterizedTest</span>
<span class="hljs-meta">@CsvSource(value = {"2 : 3 : 5", "4 : 5 : 9"}, delimiter = ':')</span>
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testSumWithCustomDelimiter</span><span class="hljs-params">(<span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b, <span class="hljs-keyword">int</span> expectedSum)</span> </span>{
    assertEquals(expectedSum, a + b);
}
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1687760084505/6b9f5ff1-6519-4f82-870e-069e5c697eb4.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-using-a-custom-delimiter-string"><strong>Using a Custom Delimiter String</strong></h3>
<pre><code class="lang-java"><span class="hljs-meta">@ParameterizedTest</span>
<span class="hljs-meta">@CsvSource(value = {"2 || 3 || 5", "4 || 5 || 9"}, delimiterString = "||")</span>
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testSumWithCustomDelimiterString</span><span class="hljs-params">(<span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b, <span class="hljs-keyword">int</span> expectedSum)</span> </span>{
    assertEquals(expectedSum, a + b);
}
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1687760108900/6436118d-c189-489f-bb1c-fd1678b3bce3.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-representing-empty-values"><strong>Representing Empty Values</strong></h3>
<pre><code class="lang-java"><span class="hljs-meta">@ParameterizedTest</span>
<span class="hljs-meta">@CsvSource(value = {"'', Smith"}, emptyValue = "Unknown")</span>
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testName</span><span class="hljs-params">(String firstName, String lastName)</span> </span>{
    Assertions.assertEquals(<span class="hljs-string">"Unknown"</span>, firstName);
}
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1687760043714/c33ecf45-b06c-4827-89e3-a227463cfad6.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-representing-null-values"><strong>Representing Null Values</strong></h3>
<pre><code class="lang-java"><span class="hljs-meta">@ParameterizedTest</span>
<span class="hljs-meta">@CsvSource(value = {"NULL, Smith"}, nullValues = "NULL")</span>
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testNameWithNulls</span><span class="hljs-params">(String firstName, String lastName)</span> </span>{
    Assertions.assertNull(firstName);
}
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1687760032863/fd188f50-1a53-4288-88af-52a5b1177aa0.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-using-textblock-attribute"><strong>Using textBlock Attribute</strong></h3>
<p>The <code>textBlock</code> attribute allows you to specify the CSV values as a text block, which is ideal for multiline content. This greatly enhances readability, especially when dealing with several sets of parameters. Text blocks in Java are delimited by triple double-quotes <code>"""</code>, and they preserve the line breaks and spacing within the block.</p>
<p>Here's an example using the <code>textBlock</code> attribute:</p>
<pre><code class="lang-java">javaCopy codeimport <span class="hljs-keyword">static</span> org.junit.jupiter.api.Assertions.assertEquals;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.ParameterizedTest;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.CsvSource;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MathTest</span> </span>{

    <span class="hljs-meta">@ParameterizedTest</span>
    <span class="hljs-meta">@CsvSource(textBlock = """
        2, 3, 5
        4, 5, 9
        10, 20, 30
    """)</span>
    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testSumTextBlock</span><span class="hljs-params">(<span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b, <span class="hljs-keyword">int</span> expectedSum)</span> </span>{
        assertEquals(expectedSum, a + b);
    }
}
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1687760006039/d949ec06-565f-4072-bfcf-d36ceea89edb.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-using-useheadersindisplayname-with-textblock"><strong>Using useHeadersInDisplayName with textBlock</strong></h3>
<p>JUnit 5.8 also introduced the <code>useHeadersInDisplayName</code> attribute, which, when set to <code>true</code>, uses the headers specified in the CSV content as placeholders in the display name of the parameterized test.</p>
<p>Here is an example that combines <code>textBlock</code> and <code>useHeadersInDisplayName</code>:</p>
<pre><code class="lang-java">javaCopy codeimport <span class="hljs-keyword">static</span> org.junit.jupiter.api.Assertions.assertEquals;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.ParameterizedTest;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.CsvSource;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MathTest</span> </span>{

    <span class="hljs-meta">@ParameterizedTest</span>
    <span class="hljs-meta">@CsvSource(textBlock = """
        a, b, sum
        2, 3, 5
        4, 5, 9
        10, 20, 30
    """, useHeadersInDisplayName = true)</span>
    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testSumTextBlockWithHeaders</span><span class="hljs-params">(<span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b, <span class="hljs-keyword">int</span> expectedSum)</span> </span>{
        assertEquals(expectedSum, a + b);
    }
}
</code></pre>
<p>In this example, the first line of the text block contains headers (<code>a</code>, <code>b</code>, <code>sum</code>), and the <code>useHeadersInDisplayName</code> attribute is set to <code>true</code>. This means that the display name of the test will use these headers as placeholders for the values.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1687759982066/19951550-6116-416a-b794-0968e2d47223.png" alt class="image--center mx-auto" /></p>
<p>Using these attributes, you can customize how the parameters are parsed and passed to your test methods with <code>@CsvSource</code>. This gives you the flexibility to accommodate different data formats and testing scenarios.</p>
<h3 id="heading-4-methodsource">4. MethodSource</h3>
<p><code>@MethodSource</code> allows you to refer to methods in the test class that provide the parameters. The method must return a <code>Stream</code>, <code>Iterable</code>, <code>Iterator</code>, or array of arguments.</p>
<p><strong>Example</strong>:</p>
<pre><code class="lang-java"><span class="hljs-keyword">import</span> java.util.stream.Stream;
<span class="hljs-keyword">import</span> <span class="hljs-keyword">static</span> org.junit.jupiter.api.Assertions.assertTrue;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.ParameterizedTest;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.MethodSource;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">OddNumberTest</span> </span>{

    <span class="hljs-meta">@ParameterizedTest</span>
    <span class="hljs-meta">@MethodSource("provideOdds")</span>
    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testIsOdd</span><span class="hljs-params">(<span class="hljs-keyword">int</span> number)</span> </span>{
        assertTrue(isOdd(number));
    }

    <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Stream&lt;Integer&gt; <span class="hljs-title">provideOdds</span><span class="hljs-params">()</span> </span>{
        <span class="hljs-keyword">return</span> Stream.of(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">5</span>, <span class="hljs-number">7</span>, <span class="hljs-number">9</span>, <span class="hljs-number">11</span>);
    }

    <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isOdd</span><span class="hljs-params">(<span class="hljs-keyword">int</span> number)</span> </span>{
        <span class="hljs-keyword">return</span> number % <span class="hljs-number">2</span> != <span class="hljs-number">0</span>;
    }
}
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1687760300361/afdf4228-c294-45c0-8703-3f604c8c89b4.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-5-argumentssource">5. ArgumentsSource</h3>
<p><code>@ArgumentsSource</code> allows you to create reusable and more complex parameter sources by defining a custom class that generates the arguments. This is especially useful when working with complex objects and scenarios.</p>
<p>To use <code>@ArgumentsSource</code>, you must create a class that implements the <code>ArgumentsProvider</code> interface. This interface mandates implementing the <code>provideArguments</code> method, which should return a <code>Stream&lt;? extends Arguments&gt;</code>.</p>
<p>Let's take an example where we have a <code>Person</code> class, and we want to test whether the full name of the person is being correctly constructed.</p>
<p>First, let's define the <code>Person</code> class:<br /><a target="_blank" href="http://Person.java"><strong>Person.java</strong></a></p>
<pre><code class="lang-java"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Person</span> </span>{
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> String firstName;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> String lastName;

    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Person</span><span class="hljs-params">(String firstName, String lastName)</span> </span>{
        <span class="hljs-keyword">this</span>.firstName = firstName;
        <span class="hljs-keyword">this</span>.lastName = lastName;
    }

    <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getFullName</span><span class="hljs-params">()</span> </span>{
        <span class="hljs-keyword">return</span> firstName + <span class="hljs-string">" "</span> + lastName;
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">toString</span><span class="hljs-params">()</span> </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-string">"Person{"</span> +
                <span class="hljs-string">"firstName='"</span> + firstName + <span class="hljs-string">'\''</span> +
                <span class="hljs-string">", lastName='"</span> + lastName + <span class="hljs-string">'\''</span> +
                <span class="hljs-string">'}'</span>;
    }
}
</code></pre>
<p>Now, let's create an <code>ArgumentsProvider</code> that provides different instances of the <code>Person</code> class along with their expected full names:</p>
<p><a target="_blank" href="http://PersonArgumentsProvider.java"><strong>PersonArgumentsProvider.java</strong></a></p>
<pre><code class="lang-java"><span class="hljs-keyword">import</span> java.util.stream.Stream;
<span class="hljs-keyword">import</span> org.junit.jupiter.api.extension.ExtensionContext;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.Arguments;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.ArgumentsProvider;

<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PersonArgumentsProvider</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">ArgumentsProvider</span> </span>{

    <span class="hljs-meta">@Override</span>
    <span class="hljs-keyword">public</span> Stream&lt;? extends Arguments&gt; provideArguments(ExtensionContext extensionContext) {
        <span class="hljs-keyword">return</span> Stream.of(
            Arguments.of(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"John"</span>, <span class="hljs-string">"Doe"</span>), <span class="hljs-string">"John Doe"</span>),
            Arguments.of(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Jane"</span>, <span class="hljs-string">"Doe"</span>), <span class="hljs-string">"Jane Doe"</span>),
            Arguments.of(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"James"</span>, <span class="hljs-string">"Bond"</span>), <span class="hljs-string">"James Bond"</span>)
        );
    }
}
</code></pre>
<p>Finally, let's write a parameterized test that uses the <code>@ArgumentsSource</code> annotation and specifies the <code>PersonArgumentsProvider</code> as the source of arguments:</p>
<p><a target="_blank" href="http://PersonTest.java"><strong>PersonTest.java</strong></a></p>
<pre><code class="lang-java">javaCopy codeimport <span class="hljs-keyword">static</span> org.junit.jupiter.api.Assertions.assertEquals;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.ParameterizedTest;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.ArgumentsSource;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PersonTest</span> </span>{

    <span class="hljs-meta">@ParameterizedTest</span>
    <span class="hljs-meta">@ArgumentsSource(PersonArgumentsProvider.class)</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">testFullName</span><span class="hljs-params">(Person person, String expectedFullName)</span> </span>{
        assertEquals(expectedFullName, person.getFullName());
    }
}
</code></pre>
<p>In this example, the <code>PersonArgumentsProvider</code> class implements <code>ArgumentsProvider</code> and supplies a stream of arguments where each argument consists of a <code>Person</code> object and the expected full name. The <code>testFullName</code> method in the <code>PersonTest</code> class is annotated with <code>@ArgumentsSource</code> and uses <code>PersonArgumentsProvider</code> as the source of arguments. This approach allows for very flexible and reusable parameter sources for your tests.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1687760858347/fb75addf-ee27-4c59-bc8a-ea024e4552ce.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-6-csvfilesource">6. CsvFileSource</h3>
<p><code>@CsvFileSource</code> allows you to read parameters from a CSV file. This is useful when you have a large set of parameters.</p>
<p><strong>Example</strong>:</p>
<p>First, create a file named <code>input.csv</code> in the <code>src/test/resources</code> folder with the following content:</p>
<pre><code class="lang-plaintext">2,3,5
4,5,9
10,20,30
</code></pre>
<p>Now, write the test class:</p>
<pre><code class="lang-java"><span class="hljs-keyword">import</span> <span class="hljs-keyword">static</span> org.junit.jupiter.api.Assertions.assertEquals;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.ParameterizedTest;
<span class="hljs-keyword">import</span> org.junit.jupiter.params.provider.CsvFileSource;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MathTest</span> </span>{

    <span class="hljs-meta">@ParameterizedTest</span>
    <span class="hljs-meta">@CsvFileSource(resources = "/input.csv")</span>
    <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testSumFromCsvFile</span><span class="hljs-params">(<span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b, <span class="hljs-keyword">int</span> expectedSum)</span> </span>{
        assertEquals(expectedSum, a + b);
    }
}
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1687760913437/5e2afd6b-5656-4fbe-9724-57ee514eddce.png" alt class="image--center mx-auto" /></p>
<p>Each of these sources for parameters has its use cases, and by using them effectively, you can make your test suite more powerful and maintainable. Choose the one that best fits the requirement of your parameterized test.</p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>Parameterized testing is a powerful feature in JUnit 5 that allows you to execute the same test multiple times with different sets of input values. Throughout this article, we delved into the essentials of parameterized tests and explored the various sources of parameters including <code>@ValueSource</code>, <code>@EnumSource</code>, <code>@CsvSource</code>, <code>@MethodSource</code>, and <code>@ArgumentsSource</code>. We also took a closer look at some advanced features like formatting display names, using text blocks for multiline CSV data, and creating custom argument providers with complex objects.</p>
<p>Embracing parameterized tests can significantly improve the quality of your test suite by ensuring that your code is validated against a wide range of input. It also helps in keeping your test cases DRY (Don't Repeat Yourself) and enhances readability.</p>
<p>As you continue to write tests for your Java applications, consider employing parameterized tests for scenarios where you need to validate the behavior of a method or functionality against various input combinations. This will not only bolster the robustness of your tests but also provide a more comprehensive assessment of your code's reliability.</p>
<p>For further reading and to dive deeper into other features, you can visit the <a target="_blank" href="https://junit.org/junit5/">official JUnit 5 documentation</a>.</p>
<p>As a final note, the complete code examples discussed in this article are available on GitHub. Feel free to clone the repository, experiment with the examples, and create your parameterized tests. You can also contribute by suggesting improvements or sharing your examples.</p>
<p><a target="_blank" href="https://github.com/seb-noirot/junit5-parameterized-examples.git">Access the GitHub Repository</a></p>
<p>Contributions and feedback are always welcome! This repository is intended to be a collaborative space for sharing knowledge and best practices for JUnit 5 and parameterized testing.</p>
<p>Remember that good tests are just as crucial as good code. By leveraging the capabilities of JUnit 5’s parameterized tests, you’re taking a significant stride in producing quality software.</p>
<p>Happy testing! 🚀</p>
]]></content:encoded></item><item><title><![CDATA[Post-Process Analysis in Skill Development]]></title><description><![CDATA[Introduction to Post-Process Analysis:
Conducting a post-process analysis is a critical and concluding aspect of your personal skill development journey. This phase requires reflecting on your journey, gathering feedback from your inner self, and mak...]]></description><link>https://iwtyo.today/post-process-analysis-in-skill-development</link><guid isPermaLink="true">https://iwtyo.today/post-process-analysis-in-skill-development</guid><category><![CDATA[Personal growth  ]]></category><category><![CDATA[skills]]></category><category><![CDATA[dunning-kruger-effect]]></category><category><![CDATA[impostor syndrome]]></category><category><![CDATA[reflection]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Fri, 23 Jun 2023 07:00:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/hpjSkU2UYSU/upload/92cd98d24de6b419ba484022730de419.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Introduction to Post-Process Analysis:</strong></p>
<p>Conducting a post-process analysis is a critical and concluding aspect of your personal skill development journey. This phase requires reflecting on your journey, gathering feedback from your inner self, and making note of the lessons learned. It helps in refining your approach and ensures that your future skill development endeavors are even more efficient and targeted.</p>
<p>The process is not merely about looking at what was achieved but delving into how each step of the process contributed to that achievement. Did you find some steps more useful than others? Were you able to effectively address the Dunning-Kruger effect and Impostor Syndrome? Let’s find out.</p>
<p><strong>Revisiting the Steps:</strong></p>
<p>As a reminder, here are the steps from the series:</p>
<ol>
<li><p>The Power of SMART Goals</p>
</li>
<li><p>Break Goals into Achievable Steps</p>
</li>
<li><p>Mastering Milestone Evaluations</p>
</li>
<li><p>Keep Progress on Track with Regular Check-Ins</p>
</li>
<li><p>Keeping Development Plans Agile and Effective</p>
</li>
<li><p>Reflection and Tackling Impostor Syndrome</p>
</li>
<li><p>The Power of Positivity: Building Your Feedback Repository</p>
</li>
<li><p>Assessing and Celebrating Success</p>
</li>
</ol>
<p>Reflect on each step in the skill development series. Were there steps you found particularly helpful? Did any steps feel redundant or not applicable to your journey? Did you find any steps challenging? This reflection helps to tailor the process to your unique learning style and goals.</p>
<p><strong>Personalizing and Adapting the Process:</strong></p>
<p>Remember that the steps provided in this series are a guide, and it’s crucial to adapt and tailor them to fit your journey. You might find that additional steps are necessary for your particular situation, or that some steps can be combined or skipped. The key is to make this process your own.</p>
<p>Don’t hesitate to refine or redefine the steps based on your experiences. You may want to add more detailed steps, or maybe integrate other methodologies that you find effective. Continuously iterate on the process as you learn more about what works for you and what doesn’t.</p>
<p>One of the strengths of this process is its flexibility. By personalizing it, you not only make it more effective for your development but also become more invested in and committed to your learning journey. Embrace the concept of growth and continuous improvement, not just in your skills but also in the process itself.</p>
<p><strong>Analyze Dunning-Kruger Effect and Impostor Syndrome:</strong></p>
<p>Evaluate how well the steps assisted you in addressing the Dunning-Kruger effect and Impostor Syndrome. Reflect on whether the insights and strategies shared in the series were effective in mitigating these psychological phenomena.</p>
<p><strong>Reflect on Your Achievements and Challenges:</strong></p>
<p>Take a moment to reflect on the milestones you achieved, the challenges you overcame, and the knowledge you gained throughout your journey. Were you able to achieve your SMART goals? Did you face any unexpected challenges?</p>
<p>Also, analyze how well you tackled the Dunning-Kruger effect and Impostor Syndrome. Did the process help you gain a better understanding of your skills and capabilities? How did you cope with any self-doubt or overconfidence that emerged along the way?</p>
<p><strong>Document Your Reflections and Insights:</strong></p>
<p>Documenting your reflections, insights, and feedback about the process is incredibly valuable. It serves as a repository of knowledge that you can refer back to, and can also guide you in improving your process for future skill development.</p>
<p>Create a personal journal, a digital document, or a video log – choose the medium that you are most comfortable with. This is also a great way to track your evolution and see how much progress you have made over time.</p>
<p><strong>Plan for Continuous Improvement:</strong></p>
<p>Based on your reflections and insights, create a plan for continuous improvement. Determine which aspects of the skill development process can be refined or which new strategies can be implemented.</p>
<p>Set a timeline for reassessing your progress and adjusting your skill development process. Remember that learning and personal development is a lifelong journey. Continuously striving for improvement ensures that you are always growing.</p>
<p><strong>Exercise: Compare Two Skill Development Journeys</strong></p>
<p>As a personal exercise, think about two skills you have tried to develop - one using the process outlined in this series and one without. Compare the two experiences in terms of ease, effectiveness, challenges faced, and success achieved.</p>
<p>For example, if you worked on improving your public speaking skills using the process and learned a new language without it, compare how the structured approach impacted your journey in each case.</p>
<p><strong>Conclusion:</strong></p>
<p>Having come this far in your skill development journey, it’s vital to recognize the importance of post-process analysis as a step toward ongoing growth. Your journey doesn’t end here; it’s a continuous path of learning and adaptation.</p>
<p>Consider the steps provided in this series as a foundation upon which you can build your personalized skill development process. Encourage yourself to remain committed, adaptable, and ever-evolving. Here’s to your success in all your future endeavors!</p>
]]></content:encoded></item><item><title><![CDATA[Assessing and Celebrating Success]]></title><description><![CDATA[Introduction to Final Assessment and Celebration
The final assessment and celebration aren't merely the end of the skill development cycle; they're a bridge to continuous learning and improvement. This crucial phase is a platform to recognize and app...]]></description><link>https://iwtyo.today/assessing-and-celebrating-success</link><guid isPermaLink="true">https://iwtyo.today/assessing-and-celebrating-success</guid><category><![CDATA[assessment]]></category><category><![CDATA[celebration]]></category><category><![CDATA[dunning-kruger-effect]]></category><category><![CDATA[impostor syndrome]]></category><category><![CDATA[Feedback]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Thu, 22 Jun 2023 07:00:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/gdTxVSAE5sk/upload/f974ea64c251b5f3cc815127f60acf2f.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-introduction-to-final-assessment-and-celebration"><strong>Introduction to Final Assessment and Celebration</strong></h3>
<p>The final assessment and celebration aren't merely the end of the skill development cycle; they're a bridge to continuous learning and improvement. This crucial phase is a platform to recognize and appreciate the growth individuals have made through their journey, providing much-needed reinforcement for continuous learning. When grappling with the Dunning-Kruger effect and Impostor Syndrome, individuals often overlook their progress. Having a final assessment and celebration helps to bring this progress into focus and serves as a powerful confidence booster.</p>
<p>Moreover, this process isn't just about the individual's growth. It also serves as an essential feedback mechanism for the trainers and mentors. It helps them understand what worked, what didn't, and how they can improve the learning process in future iterations.</p>
<h3 id="heading-conducting-a-final-assessment"><strong>Conducting a Final Assessment</strong></h3>
<p>The final assessment provides a holistic view of the individual's progress throughout the skill development cycle. This evaluation should cover whether the set goals were achieved, which milestones were completed, and the individual's progression on the Dunning-Kruger chart.</p>
<p>In cases where the individual has experienced Impostor Syndrome, it's essential to assess how they dealt with it and what strategies helped them overcome it. The objective is not just to measure growth but to understand the journey, the hurdles, and the strategies that led to that growth.</p>
<h4 id="heading-gathering-feedback"><strong>Gathering Feedback</strong></h4>
<p>Feedback isn't merely a tool for assessment; it's a key to growth. Gathering feedback from various sources - peers, mentors, and other stakeholders - provides a multi-dimensional view of the individual's progress. It uncovers blind spots that may have been missed in self-assessment and provides validation that aids in overcoming Impostor Syndrome.</p>
<p>Moreover, gathering feedback creates an environment of open communication and shared learning, where everyone involved in the process can learn from each other's insights and experiences.</p>
<h4 id="heading-reflecting-on-the-journey"><strong>Reflecting on the Journey</strong></h4>
<p>Reflection is a powerful tool for self-growth. It allows individuals to look back at their journey, acknowledging their struggles, understanding their victories, and recognizing their growth. Reflection should involve looking at the specific instances where they experienced the Dunning-Kruger effect or Impostor Syndrome.</p>
<p>Understanding these instances, the feelings associated with them, and how they navigated through them, builds resilience and equips them with tools to handle similar situations in the future.</p>
<h4 id="heading-celebrating-achievements"><strong>Celebrating Achievements</strong></h4>
<p>Celebration is not just about marking the completion of the skill development cycle. It's about recognizing the effort, dedication, and hard work that went into achieving the goals. This recognition is a vital source of motivation, particularly for individuals who might be grappling with Impostor Syndrome.</p>
<p>A celebration marks their genuine achievements, affirming their abilities, and boosting their confidence. Whether it's a simple congratulatory message, a small ceremony, or a team gathering, celebrating achievements uplifts the spirit and inspires continuous effort.</p>
<h4 id="heading-encouraging-sharing-of-experiences"><strong>Encouraging Sharing of Experiences</strong></h4>
<p>Sharing experiences provides a platform for mutual learning. As individuals share their journeys, the challenges they faced, the strategies they used, and how they handled the Dunning-Kruger effect or Impostor Syndrome, everyone in the team or community learns from these experiences.</p>
<p>Creating a safe, encouraging space for sharing experiences can enhance the learning culture within a team or organization, fostering collective growth.</p>
<h4 id="heading-providing-constructive-feedback-for-future-development"><strong>Providing Constructive Feedback for Future Development</strong></h4>
<p>While the focus is on celebrating achievements, it's equally important to identify areas for further development. Constructive feedback helps individuals understand their strengths and the areas they need to work on.</p>
<p>This feedback, when given thoughtfully and positively, is a springboard for continuous learning, ensuring that the end of one skill development cycle is the beginning of another.</p>
<h4 id="heading-documenting-the-final-assessment"><strong>Documenting the Final Assessment</strong></h4>
<p>Documentation is key to learning. Keeping a record of the final assessment, feedback, and reflections is not just a reference material; it's a repository of learning. This documentation can serve as a roadmap for future skill development cycles, guiding the setting of new goals and milestones.</p>
<p>Furthermore, documentation allows individuals to periodically review their progress, keeping their growth in focus, and serving as a source of motivation in times of self-doubt.</p>
<h4 id="heading-setting-new-goals-for-continuous-learning"><strong>Setting New Goals for Continuous Learning</strong></h4>
<p>As one chapter ends, another begins. Encouraging individuals to set new goals for their next development cycle emphasizes the importance of continuous learning. Setting new goals, particularly based on the feedback and reflections from the previous cycle, ensures that learning is ongoing, dynamic, and responsive to the individual's growth and needs.</p>
<p>For a personal task, reflect on a skill you have been working on recently. Create a document or presentation that will serve as your final assessment for this skill development cycle. Here’s a guide on what to include:</p>
<ol>
<li><p><strong>Goals and Milestones</strong>: Begin by listing the goals you had set at the start of your skill development cycle. Beside each goal, note whether or not you achieved it.</p>
</li>
<li><p><strong>Feedback</strong>: Write down feedback that you have received from peers, mentors, or other stakeholders. Reflect on how this feedback impacted your progress and what changes you implemented based on it.</p>
</li>
<li><p><strong>Challenges Faced</strong>: Enumerate the challenges you faced. Include any instances where you felt the Dunning-Kruger effect or Impostor Syndrome impacting your self-perception. Explain how you addressed these challenges.</p>
</li>
<li><p><strong>Achievements and Growth</strong>: Highlight your achievements and how you have grown through this cycle. Use specific examples or data to demonstrate this growth.</p>
</li>
<li><p><strong>Reflection</strong>: Take some time to reflect deeply on your journey. What were the turning points? What did you learn about yourself? How do you feel about your achievements?</p>
</li>
<li><p><strong>Setting New Goals</strong>: Lastly, based on your reflection and any feedback, set new goals for your next skill development cycle. Ensure these are SMART goals and align with your long-term objectives.</p>
</li>
</ol>
<p>Once your document or presentation is complete, consider sharing it with a mentor, friend, or family member and celebrate your achievements together. Use their feedback for additional insights and motivation for your next cycle.  </p>
<p><strong>Example</strong></p>
<p>Let's take the example of developing presentation skills over the last few months. Your final assessment document might look something like this:</p>
<ol>
<li><p><strong>Goals and Milestones</strong>: You aimed to deliver five presentations with confidence, receive positive feedback, and reduce reliance on notes during delivery. You achieved all these goals, delivering six presentations, receiving encouraging feedback from colleagues, and steadily decreasing your reliance on notes.</p>
</li>
<li><p><strong>Feedback</strong>: Your mentor provided feedback after your third presentation, suggesting you try to engage more with your audience. Based on this, you included questions and interactive elements in your next presentations, which were received positively.</p>
</li>
<li><p><strong>Challenges Faced</strong>: In your second presentation, you experienced a case of Impostor Syndrome, doubting your expertise on the topic. You addressed this by discussing your feelings with your mentor, reviewing your feedback repository, and realizing you had all the necessary knowledge.</p>
</li>
<li><p><strong>Achievements and Growth</strong>: You started with shaky first presentations, but by the sixth, you were confident, engaging, and note-free. You saw positive remarks in your feedback and felt more comfortable each time you presented.</p>
</li>
<li><p><strong>Reflection</strong>: You realized that your fear of public speaking was affecting your initial presentations. However, by pushing through and focusing on feedback, you improved significantly. You learned that your perceived lack of ability was more a reflection of your fear than your actual skills.</p>
</li>
<li><p><strong>Setting New Goals</strong>: For your next skill development cycle, you aim to hone your storytelling in presentations. You want to make your delivery more impactful by creating narratives that can hold your audience's attention and make complex ideas more digestible.</p>
</li>
</ol>
<h4 id="heading-tips"><strong>Tips</strong></h4>
<ul>
<li><p>Make the final assessment a safe space, free from judgment.</p>
</li>
<li><p>Use different feedback-gathering tools, such as surveys or face-to-face discussions.</p>
</li>
<li><p>Encourage honest reflection by sharing your own experiences as a mentor or trainer.</p>
</li>
<li><p>Tailor the form of celebration to what resonates most with the individual or team.</p>
</li>
<li><p>Use documentation tools that are easily accessible and retrievable.</p>
</li>
</ul>
<h4 id="heading-resources"><strong>Resources</strong></h4>
<ol>
<li><p><a target="_blank" href="https://www.amazon.com/Drive-Surprising-Truth-About-Motivates/dp/1594484805"><strong><em>Drive: The Surprising Truth About What Motivates Us</em></strong></a> by Daniel H. Pink.</p>
</li>
<li><p><em>Celebration and The Power of Acknowledgment</em> by Judith W. Umlas.</p>
</li>
<li><p><a target="_blank" href="https://www.amazon.com/Mindset-Psychology-Carol-S-Dweck/dp/0345472322"><strong><em>Mindset: The New Psychology of Success</em></strong></a> by Carol S. Dweck.</p>
</li>
</ol>
<h4 id="heading-conclusion"><strong>Conclusion</strong></h4>
<p>Concluding the skill development cycle with a final assessment and celebration is a pivotal juncture that solidifies the value of continuous learning and development. It's an amalgamation of recognition, reflection, and reinvention. It’s not just about celebrating what has been achieved but setting the stage for what can be achieved. As we embrace this culture of celebration and continuous learning, we foster not just individual growth but a community of learners, where experiences and insights are shared, and everyone grows together.</p>
<p>In the next article, we will delve into Post-Process Analysis, where we'll understand the importance of collecting feedback on the entire process and analyze what worked well and what can be improved for future iterations.</p>
]]></content:encoded></item><item><title><![CDATA[The Power of Positivity: Building Your Feedback Repository]]></title><description><![CDATA[Introduction to Feedback Repository:
A feedback repository is a personalized collection of positive feedback, achievements, and accolades. When Impostor Syndrome clouds one's judgment or self-doubt creeps in, this repository becomes a guiding light. ...]]></description><link>https://iwtyo.today/the-power-of-positivity-building-your-feedback-repository</link><guid isPermaLink="true">https://iwtyo.today/the-power-of-positivity-building-your-feedback-repository</guid><category><![CDATA[Feedback]]></category><category><![CDATA[impostor syndrome]]></category><category><![CDATA[Personal growth  ]]></category><category><![CDATA[achievements]]></category><category><![CDATA[self reflection]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Wed, 21 Jun 2023 07:00:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/AmhdN68wjPc/upload/e1e7cf8f284d04269db5110f4a97be92.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-introduction-to-feedback-repository">Introduction to Feedback Repository:</h3>
<p>A feedback repository is a personalized collection of positive feedback, achievements, and accolades. When Impostor Syndrome clouds one's judgment or self-doubt creeps in, this repository becomes a guiding light. In the face of Impostor Syndrome, where an individual doubts their achievements, this repository provides objective evidence of their competencies, thwarting the Dunning-Kruger effect which causes underestimation or overestimation of one's abilities.</p>
<p>In the modern professional landscape, personal development is continuous. A feedback repository helps in cataloging the milestones achieved, skills acquired, and positive feedback. This reservoir of achievements becomes particularly essential when facing career challenges, ensuring that your self-perception remains rooted in reality.</p>
<h3 id="heading-select-a-format-for-the-repository">Select a Format for the Repository:</h3>
<p>Selecting the right format ensures that the repository remains functional and inspiring. Whether you prefer a digital document, a mobile app, or an old-fashioned journal, ensure it reflects your personality. Digital tools like Evernote, Notion, and Trello offer added advantages such as tagging, easy search, and cloud storage.</p>
<h4 id="heading-tips">Tips:</h4>
<ul>
<li><p>Keep it simple and easy to update.</p>
</li>
<li><p>Dedicate a fixed time each week for updating.</p>
</li>
<li><p>Include visual elements such as images or awards.</p>
</li>
<li><p>Add a few lines reflecting on what each achievement meant to you.</p>
</li>
</ul>
<h3 id="heading-encourage-regular-updates">Encourage Regular Updates:</h3>
<p>Consistency is key. Regular updates turn your feedback repository into a living document that evolves with your professional growth. Documenting both small and large wins create a broader picture of your achievements over time. It's a reminder of how you rose to various challenges and succeeded.</p>
<h3 id="heading-include-evidence">Include Evidence:</h3>
<p>Including tangible evidence such as certificates, screenshots of positive messages, or images of completed projects, adds weight to your repository. This can be particularly compelling when battling Impostor Syndrome, as a tangible proof is difficult for the doubting mind to deny.</p>
<h3 id="heading-use-during-reflection-sessions">Use During Reflection Sessions:</h3>
<p>Reflection sessions with your feedback repository allow you to evaluate your growth trajectory and reassess your goals. The repository offers concrete evidence of how far you've come, which is invaluable for setting future targets.</p>
<h3 id="heading-consult-in-times-of-doubt">Consult in Times of Doubt:</h3>
<p>Your feedback repository should be your first line of defense against self-doubt and Impostor Syndrome. By objectively showcasing your achievements, it negates any internal narrative that undermines your self-worth.</p>
<h3 id="heading-share-with-mentors-or-peers-optional">Share with Mentors or Peers (Optional):</h3>
<p>Sharing your repository with a mentor or trusted peer allows for external validation and perspectives. This can be immensely empowering and also transform your repository into a shared source of inspiration.</p>
<h3 id="heading-reflect-on-growth">Reflect on Growth:</h3>
<p>Consider your feedback repository as a tapestry, where each thread is an achievement that contributes to your larger narrative. Reflect on this tapestry periodically to understand how each achievement, irrespective of its scale, contributes to your personal and professional evolution.</p>
<h3 id="heading-exercise">Exercise:</h3>
<p>Create a feedback repository today. As an example, if you're a software developer, jot down three programming challenges you overcame in the last six months. Attach screenshots of the solutions and write a brief reflection on each. Commit to updating this repository weekly.</p>
<h4 id="heading-what-to-expect"><strong>What to Expect:</strong></h4>
<p>By maintaining a feedback repository, expect to develop a greater sense of self-awareness and resilience against Impostor Syndrome. The repository will serve as an anchor, grounding your self-perception in reality, and providing you with the motivation to continuously strive for greatness.</p>
<h4 id="heading-example-if-applied"><strong>Example if Applied:</strong></h4>
<p>Consider a developer who kept a detailed feedback repository. Before a challenging project, he reviewed his repository and was reminded of his skills and past successes. This boosted his confidence, leading to exemplary performance.</p>
<h4 id="heading-example-if-not-applied"><strong>Example if Not Applied:</strong></h4>
<p>Another developer, without a feedback repository, faced similar challenges but lacked self-assurance and reference to past successes. He performed sub-optimally due to a lack of confidence.</p>
<h3 id="heading-tips-1"><strong>Tips:</strong></h3>
<ul>
<li><p>Set reminders to update your feedback repository regularly.</p>
</li>
<li><p>Use tags or categories to organize your entries.</p>
</li>
<li><p>Include photographs or screenshots as evidence of achievements.</p>
</li>
<li><p>Write a brief reflection on what each achievement means to you.</p>
</li>
</ul>
<h3 id="heading-resources">Resources:</h3>
<ol>
<li><p>“<a target="_blank" href="https://www.amazon.com/Braving-Wilderness-Quest-Belonging-Courage/dp/0812995848">Braving the Wilderness</a>” by Brené Brown - A book that discusses the importance of belonging and self-validation.</p>
</li>
<li><p>Evernote, Notion, or Trello apps for maintaining a digital repository.</p>
</li>
</ol>
<h3 id="heading-conclusion">Conclusion:</h3>
<p>A feedback repository is an empowering tool that can transform your professional journey. By actively cataloging your achievements and reflecting on them, you are reinforcing a positive self-image and combating the detrimental effects of Impostor Syndrome. This repository, rooted in objective evidence, serves as an invaluable resource for not only personal reflection but also for sharing and celebrating your growth with mentors and peers. It becomes the foundation upon which your confidence is built, ensuring that your perception of self is both balanced and grounded in reality.</p>
<p>As we conclude this enlightening exploration into building and utilizing a feedback repository, let us look forward to the next phase of this journey.</p>
<p>After dedicating time and effort to skill development and personal growth, it's essential to take stock of the progress made. In the next article, we will delve into the importance of conducting a final assessment and the significance of celebrating achievements. This step marks not just the culmination of a cycle, but the beginning of new possibilities, as you will be equipped with insights and the confidence to set forth on new ventures. Stay tuned as we explore how to effectively assess, celebrate, and share your learning experiences with others.</p>
]]></content:encoded></item><item><title><![CDATA[Reflection and Tackling Impostor Syndrome]]></title><description><![CDATA[Introduction to Reflection and Addressing Impostor Syndrome:
As individuals make strides on their learning paths, it is critical to pause periodically to reflect on the journey. Reflection is the mirror through which we can see our growth, strengths,...]]></description><link>https://iwtyo.today/reflection-and-tackling-impostor-syndrome</link><guid isPermaLink="true">https://iwtyo.today/reflection-and-tackling-impostor-syndrome</guid><category><![CDATA[personal development]]></category><category><![CDATA[impostor syndrome]]></category><category><![CDATA[reflection]]></category><category><![CDATA[achievements]]></category><category><![CDATA[coping strategies]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Tue, 20 Jun 2023 07:00:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/yUWKDfPLp6w/upload/f28cc4de10d89bd23f6f369f707859e0.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-introduction-to-reflection-and-addressing-impostor-syndrome"><strong>Introduction to Reflection and Addressing Impostor Syndrome:</strong></h3>
<p>As individuals make strides on their learning paths, it is critical to pause periodically to reflect on the journey. Reflection is the mirror through which we can see our growth, strengths, and areas for improvement. It is also the antidote to Impostor Syndrome, which manifests as doubting one’s achievements and harboring a persistent fear of being exposed as a “fraud”. The relevance of reflection is in calibrating self-perception, aligning actions with values, and gaining insight into personal patterns that can either support or hinder growth.</p>
<h3 id="heading-schedule-reflective-sessions"><strong>Schedule Reflective Sessions:</strong></h3>
<p>Reflective sessions are not just about looking back, but also about envisioning the future. Setting a schedule for reflection ensures that individuals carve out time amidst their busy schedules to evaluate their journey. Regular reflection is key as it fosters a habit of self-evaluation and self-awareness, which are critical for personal development and mental well-being. It serves as a checkpoint to assess alignment with personal values and goals.</p>
<h3 id="heading-guide-reflective-thinking"><strong>Guide Reflective Thinking:</strong></h3>
<p>Reflection is an art that requires cultivation. Here, individuals need guidance to engage deeply with their experiences. Reflective thinking involves asking oneself thought-provoking questions, analyzing actions and decisions, and evaluating their outcomes. It's essential to be open, honest, and critical without being harsh. Consider questions such as:</p>
<ul>
<li><p>What have I learned?</p>
</li>
<li><p>How have I contributed positively to the team or project?</p>
</li>
<li><p>Did my actions align with my values?</p>
</li>
<li><p>What could I have done differently?</p>
</li>
</ul>
<p>This kind of inquiry leads to insights that are crucial for personal and professional development.</p>
<h3 id="heading-document-reflections"><strong>Document Reflections:</strong></h3>
<p>Writing is a powerful reflection tool. When individuals document their thoughts, feelings, achievements, and challenges, they externalize their experience, making it easier to analyze and understand. A reflection journal or log can be a treasure trove of personal insights and a chronicle of growth over time. This record serves as tangible evidence against the distortions of Impostor Syndrome and a source of motivation during trying times.</p>
<h3 id="heading-discuss-impostor-syndrome"><strong>Discuss Impostor Syndrome:</strong></h3>
<p>Impostor Syndrome can be debilitating. However, through open discussion, individuals can understand that they are not alone in these feelings. Facilitating a culture where conversations about Impostor Syndrome are normalized can reduce its power. Discussions can be through workshops, group sessions, or one-on-one mentoring. People can explore the roots of their Impostor Syndrome, be it societal expectations, personal insecurities, or previous experiences, and learn strategies to mitigate it.</p>
<h3 id="heading-provide-positive-reinforcement"><strong>Provide Positive Reinforcement:</strong></h3>
<p>One of the ways to counter Impostor Syndrome is through positive reinforcement. This involves acknowledging the achievements and efforts of individuals. Positive reinforcement builds self-esteem, motivates, and is a critical component in cultivating a positive organizational culture. When individuals receive affirmation for specific actions or behaviors, it reinforces those actions and encourages their repetition.</p>
<h3 id="heading-focus-on-tangible-evidence"><strong>Focus on Tangible Evidence:</strong></h3>
<p>Impostor Syndrome thrives on discounting one's achievements. Therefore, focusing on tangible evidence of success is vital in combating it. This can include accolades, completed projects, positive feedback, or any other recognition. Tangible evidence serves as an anchor to reality, mitigating the distortions of Impostor Syndrome.</p>
<h3 id="heading-develop-coping-strategies"><strong>Develop Coping Strategies:</strong></h3>
<p>Teaching individuals how to manage Impostor Syndrome is key to fostering resilience. This includes strategies such as:</p>
<ul>
<li><p><strong>Positive self-talk</strong>: Remind oneself of skills, achievements, and contributions.</p>
</li>
<li><p><strong>Creating a support network</strong>: Share experiences with friends, family, or colleagues.</p>
</li>
<li><p><strong>Seeking professional help if necessary</strong>: A counselor or psychologist can be instrumental in some cases.</p>
</li>
<li><p><strong>Mindfulness and relaxation techniques</strong>: These can reduce anxiety and stress related to Impostor Syndrome.</p>
</li>
</ul>
<h3 id="heading-encourage-continuous-reflection"><strong>Encourage Continuous Reflection:</strong></h3>
<p>Reflection should not be a one-off; it needs to be woven into the fabric of an individual's life. Continuous reflection aids in calibrating self-perception, assessing alignment with values, and recognizing patterns. It fosters self-awareness, which is key to personal development.</p>
<h3 id="heading-exercise"><strong>Exercise:</strong></h3>
<p>Create an "Achievement Journal." Regularly document achievements, feedback, and challenges. Use this journal during reflection sessions, especially when grappling with Impostor Syndrome. It serves as a reality check and motivation booster.</p>
<p><strong>Example</strong></p>
<p><strong>Achievement Journal Entry:</strong></p>
<p><strong>Date</strong>: June 20, 2023</p>
<p><strong>Achievement</strong>: Successfully developed and deployed a new feature for the company's mobile app.</p>
<p><strong>Details</strong>: I was tasked with developing a new in-app messaging feature that allows users to communicate within the mobile app. This was a highly requested feature from our user base, and I was eager to take on the challenge. However, integrating this feature required diving into new technologies and libraries that I hadn't worked with before.</p>
<p><strong>Feedback Received</strong>: After the deployment, users quickly adopted the new feature. The product manager shared feedback from users, who expressed how this feature greatly improved their in-app experience. My team lead also praised my initiative and dedication, and my work was recognized during the team meeting.</p>
<p><strong>Challenges Overcome</strong>: Implementing real-time messaging was technically challenging. I invested time in learning new technologies, sought advice from senior developers, and iteratively tested the feature. After multiple revisions and addressing unexpected bugs, I managed to create a stable and efficient messaging system.</p>
<p><strong>Personal Reflection</strong>: This project was a huge learning experience and a testament to what I can accomplish when I commit to solving a complex problem. It has boosted my confidence in my problem-solving skills and my ability to learn new technologies. Although I felt anxious and doubtful at times, seeing the positive impact my work had on the product and receiving appreciation makes me realize the value I bring as a developer.</p>
<h4 id="heading-what-to-expect-from-this-exercise"><strong>What to expect from this exercise:</strong></h4>
<ul>
<li><p><strong>Skill Development Recognition</strong>: By documenting such achievements, developers can visually see how their skills and expertise have developed over time.</p>
</li>
<li><p><strong>Combat Impostor Syndrome</strong>: Developers often face Impostor Syndrome due to the constantly evolving nature of technology. This exercise serves as tangible evidence of their capabilities, which can be immensely helpful in counteracting feelings of inadequacy.</p>
</li>
<li><p><strong>Career Progression Insight</strong>: Regular entries can provide insights into career progression and highlight the types of projects or challenges that are particularly engaging or rewarding.</p>
</li>
<li><p><strong>Motivation and Goal Setting</strong>: Reviewing past achievements can serve as motivation and aid in setting new goals aligned with the developer’s aspirations and areas of interest.</p>
</li>
</ul>
<h3 id="heading-resources-for-further-reading"><strong>Resources for Further Reading:</strong></h3>
<ol>
<li><p>“<a target="_blank" href="https://www.amazon.com/Reflective-Practitioner-Professionals-Think-Action/dp/0465068782">The Reflective Practitioner: How Professionals Think in Action</a>” by Donald A. Schön</p>
</li>
<li><p>“<a target="_blank" href="https://www.amazon.com/Secret-Thoughts-Successful-Women-Impostor/dp/0307452719">The Secret Thoughts of Successful Women: Why Capable People Suffer from Impostor Syndrome and How to Thrive in Spite of It</a>” by Valerie Young</p>
</li>
<li><p>“<a target="_blank" href="https://www.amazon.com/Daring-Greatly-Courage-Vulnerable-Transforms/dp/1592408419">Daring Greatly: How the Courage to Be Vulnerable Transforms the Way We Live, Love, Parent, and Lead</a>” by Brené Brown</p>
</li>
</ol>
<h2 id="heading-conclusion"><strong>Conclusion:</strong></h2>
<p>Reflection and addressing Impostor Syndrome are integral to nurturing personal development and fostering a positive self-image. Through reflection, individuals gain insights into their actions, values, and growth, while actively engaging in discussions and exercises to tackle Impostor Syndrome bolsters self-confidence. The act of recording achievements, coupled with positive reinforcement and focusing on tangible evidence, is paramount to combating the internalized self-doubt that Impostor Syndrome perpetuates. As individuals embark on this continuous journey of self-discovery, they not only thrive personally but also contribute positively to the broader community.</p>
<p>Stay tuned for the next part in this series, where we will explore creating a system for individuals to record positive feedback and accomplishments, and how referring back to this repository can be an empowering tool during moments of doubt or under-confidence.</p>
]]></content:encoded></item><item><title><![CDATA[Keeping Development Plans Agile and Effective]]></title><description><![CDATA[Introduction to Dynamic Milestone Adjustment:
In the world of personal development, recognizing that learning and growth are not linear is essential. This is especially crucial when considering cognitive biases like the Dunning-Kruger effect and Impo...]]></description><link>https://iwtyo.today/keeping-development-plans-agile-and-effective</link><guid isPermaLink="true">https://iwtyo.today/keeping-development-plans-agile-and-effective</guid><category><![CDATA[impostor syndrome]]></category><category><![CDATA[dunning-kruger-effect]]></category><category><![CDATA[Development Milestone]]></category><category><![CDATA[cognitive bias]]></category><category><![CDATA[growth mindset,]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Mon, 19 Jun 2023 07:00:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/NjV34SrbM_g/upload/3b316a2ab776753d8e7a88cebd32ff7d.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-introduction-to-dynamic-milestone-adjustment"><strong>Introduction to Dynamic Milestone Adjustment:</strong></h3>
<p>In the world of personal development, recognizing that learning and growth are not linear is essential. This is especially crucial when considering cognitive biases like the Dunning-Kruger effect and Impostor Syndrome, which can distort self-perception. Being flexible and adaptable ensures that your milestones stay relevant and aligned with your evolving needs.</p>
<h3 id="heading-evaluate-the-need-for-adjustment"><strong>Evaluate the Need for Adjustment:</strong></h3>
<p>It's important to periodically assess whether the milestones you've set continue to serve your development goals. Evaluating them in light of feedback and self-assessment will give you a clearer picture. Ask yourself:</p>
<ul>
<li><p>Are the milestones still relevant to my goals?</p>
</li>
<li><p>Have I encountered unexpected challenges or opportunities that necessitate a change?</p>
</li>
<li><p>Am I progressing at a slower or faster pace than expected?</p>
</li>
</ul>
<p>For example, a person who set a milestone to learn a new programming language might find that the language is becoming obsolete. In such a scenario, sticking to the original milestone is counterproductive.</p>
<h3 id="heading-make-data-driven-adjustments"><strong>Make Data-Driven Adjustments:</strong></h3>
<p>Use feedback and evaluations to inform your decisions on adjusting milestones. If you find that you are breezing through your milestones, it might indicate that they are not challenging enough, and you might be overconfident due to the Dunning-Kruger effect. Conversely, if you’re struggling despite sincere efforts, Impostor Syndrome might be at play. Make adjustments accordingly:</p>
<ul>
<li><p>If progressing faster than expected, incorporate more challenging milestones.</p>
</li>
<li><p>If struggling to meet milestones, adjust them to be more realistic.</p>
</li>
</ul>
<h3 id="heading-address-cognitive-biases"><strong>Address Cognitive Biases:</strong></h3>
<p>While adjusting milestones, consider how the Dunning-Kruger effect and Impostor Syndrome might be affecting your self-perception. If you're consistently surpassing milestones with ease, it might be time to set more challenging objectives to combat overconfidence. Conversely, if you’re not achieving milestones despite sincere efforts, you might need to set more attainable goals to build confidence.</p>
<h3 id="heading-communicate-the-adjustments"><strong>Communicate the Adjustments:</strong></h3>
<p>When milestones are adjusted, it’s important to communicate the changes and the reasoning behind them with any mentors, peers, or stakeholders involved. This ensures transparency and helps in receiving constructive input.</p>
<h3 id="heading-document-the-adjustments"><strong>Document the Adjustments:</strong></h3>
<p>Maintaining a record of adjustments to milestones is crucial. It provides a way to review the evolution of your development plan and to understand the reasons behind each change.</p>
<h3 id="heading-foster-a-growth-mindset"><strong>Foster a Growth Mindset:</strong></h3>
<p>Encouraging a growth mindset is vital. By understanding that abilities can be developed through dedication and hard work, individuals are more likely to view adjusting milestones as a proactive step rather than a failure.</p>
<p><strong>Exercise:</strong> Milestone Adjustment Scenario Analysis</p>
<p><strong>Relevance:</strong> This exercise will help you apply the concept of dynamic milestone adjustment in real-life scenarios, and consider the influences of the Dunning-Kruger effect and Impostor Syndrome.</p>
<p><strong>What to Expect:</strong> By analyzing different scenarios, you will practice making data-driven milestone adjustments and understand how they can either mitigate or exacerbate cognitive biases.</p>
<p><strong>Procedure:</strong></p>
<ol>
<li><p>Create a table with columns for Scenario, Original Milestone, Adjustment Needed, and Rationale.</p>
</li>
<li><p>Fill the table with various personal development scenarios.</p>
</li>
<li><p>For each scenario, evaluate the original milestone, suggest an adjustment, and provide a rationale considering cognitive biases.</p>
</li>
</ol>
<table><tbody><tr><td><p><strong>Scenario</strong></p></td><td><p><strong>Original Milestone</strong></p></td><td><p><strong>Adjustment Needed</strong></p></td><td><p><strong>Rationale</strong></p></td></tr><tr><td><p>Rapid progress in learning to code</p></td><td><p>Learn Python in 6 months</p></td><td><p>Learn Python in 3 months</p></td><td><p>Avoid overconfidence (Dunning-Kruger), set challenging goals</p></td></tr><tr><td><p>Struggling with public speaking despite the effort</p></td><td><p>Give a talk to 100+ audience in 3 months</p></td><td><p>Start with smaller audiences and gradually increase</p></td><td><p>Build confidence, avoid demotivation (Impostor Syndrome)</p></td></tr></tbody></table>

<h3 id="heading-resources"><strong>Resources:</strong></h3>
<ol>
<li><p><a target="_blank" href="https://www.goodreads.com/book/show/40745.Mindset"><strong>"Mindset: The New Psychology of Success"</strong></a> by Carol S. Dweck. This book can help in understanding the growth mindset, which is crucial for adapting milestones.</p>
</li>
<li><p><a target="_blank" href="https://www.mindtools.com/pages/article/smart-goals.htm"><strong>SMART Goals: How to Make Your Goals Achievable</strong></a>. MindTools article on setting SMART goals, which should be adaptable.</p>
</li>
</ol>
<h3 id="heading-conclusion"><strong>Conclusion:</strong></h3>
<p>Dynamic milestone adjustment is the key to keeping a personal development plan responsive and effective. By evaluating, communicating, and documenting changes in milestones, we can ensure that we are on a path that truly aligns with our evolving needs and aspirations. Taking into account cognitive biases like the Dunning-Kruger effect and Impostor Syndrome is crucial in making these adjustments, as it helps in maintaining a balanced self-perception. Fostering a growth mindset, where we view changes not as setbacks but as opportunities for improvement, is essential. Next, we'll look into the importance of reflection and addressing Impostor Syndrome, which is an integral part of personal development and crucial in recognizing genuine growth and achievements. Stay tuned!</p>
]]></content:encoded></item><item><title><![CDATA[Keep Progress on Track with Regular Check-Ins]]></title><description><![CDATA[Introduction to Regular Check-Ins
Regular check-ins are essential for keeping individuals on track, providing ongoing support, and ensuring that the plan remains aligned with development needs. They can also mitigate the Dunning-Kruger effect and Imp...]]></description><link>https://iwtyo.today/keep-progress-on-track-with-regular-check-ins</link><guid isPermaLink="true">https://iwtyo.today/keep-progress-on-track-with-regular-check-ins</guid><category><![CDATA[checkin]]></category><category><![CDATA[Personal growth  ]]></category><category><![CDATA[personal development]]></category><category><![CDATA[dunning-kruger-effect]]></category><category><![CDATA[impostor syndrome]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Fri, 16 Jun 2023 05:47:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/L0xOtAnv94Y/upload/391a2ebc797f181af9017a5b497550ae.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-introduction-to-regular-check-ins"><strong>Introduction to Regular Check-Ins</strong></h3>
<p>Regular check-ins are essential for keeping individuals on track, providing ongoing support, and ensuring that the plan remains aligned with development needs. They can also mitigate the Dunning-Kruger effect and Impostor Syndrome by providing realistic assessments of one’s skills and progress.</p>
<h3 id="heading-set-a-schedule-for-check-ins"><strong>Set a Schedule for Check-Ins</strong></h3>
<p>Determine a schedule for regular check-ins. The frequency can vary depending on the goals and milestones. Having a set schedule creates structure and accountability.</p>
<p><strong>Example</strong>: A software engineer sets a weekly check-in with a mentor to discuss progress in learning a new programming language. Without regular check-ins, the engineer might overestimate their proficiency or underestimate it due to cognitive biases.</p>
<h3 id="heading-prepare-for-the-check-in"><strong>Prepare for the Check-In</strong></h3>
<p>Before each check-in, individuals should prepare by reviewing milestones, evaluating progress, and considering challenges. Preparation makes the check-in more focused and productive.</p>
<p><strong>Tips</strong>:</p>
<ul>
<li><p>List achievements since the last check-in.</p>
</li>
<li><p>Provide specific examples of challenges faced.</p>
</li>
<li><p>Consider what support might be needed.</p>
</li>
</ul>
<h3 id="heading-conduct-the-check-in"><strong>Conduct the Check-In</strong></h3>
<p>During the check-in, engage in an open conversation about progress and challenges.</p>
<ol>
<li><p>Review milestones and progress.</p>
</li>
<li><p>Discuss challenges, and brainstorm solutions.</p>
</li>
<li><p>Compare self-perception with evaluations.</p>
</li>
<li><p>Review feedback from evaluations.</p>
</li>
<li><p>Discuss additional support or resources.</p>
</li>
<li><p>Reflect on the overall journey and growth.</p>
</li>
</ol>
<h3 id="heading-adjust-the-plan-as-needed"><strong>Adjust the Plan as Needed</strong></h3>
<p>Based on discussions, adjust milestones, evaluation criteria, or other aspects of the plan.</p>
<p><strong>Concrete Actions</strong>:</p>
<ul>
<li><p>If a milestone is repeatedly missed, break it into smaller, more manageable steps.</p>
</li>
<li><p>If new challenges arise, incorporate them into the plan with strategies to overcome them.</p>
</li>
<li><p>If the feedback indicates skill improvement, consider raising the bar for subsequent milestones.</p>
</li>
</ul>
<h3 id="heading-set-goals-for-the-next-check-in"><strong>Set Goals for the Next Check-In</strong></h3>
<p>Before concluding the check-in, set specific objectives to be achieved by the next check-in. This keeps the momentum going and provides a clear focus for the coming period.</p>
<p><strong>Example</strong>: If during a check-in you realize that you have been consistently missing your milestones, it may indicate that your initial plan was too ambitious. Setting more realistic goals for the next check-in can help balance ambition with achievability.</p>
<h3 id="heading-document-the-check-in"><strong>Document the Check-In</strong></h3>
<p>Keep a record of what was discussed during the check-in, including any adjustments made to the plan, and the goals set for the next check-in. This documentation can help monitor progress over time and ensure accountability.</p>
<p><strong>Exercise:</strong> Self-Reflection Journal</p>
<p>Keep a journal to document your thoughts, achievements, and challenges between check-ins. Reflect on how close or far you are from achieving milestones, and what might be causing any discrepancies.</p>
<p><strong>Relevance</strong>: This exercise helps to maintain a continuous engagement with one’s progress, even between check-ins. It serves as a tool for self-awareness and can be particularly insightful in identifying instances of Dunning-Kruger or Impostor Syndrome.</p>
<h2 id="heading-resources"><strong>Resources</strong></h2>
<ul>
<li><p>"<a target="_blank" href="https://www.amazon.com/Making-Manager-What-Everyone-Looks/dp/0735219567">The Making of a Manager</a>" by Julie Zhuo: This book includes insights on how to conduct effective check-ins.</p>
</li>
<li><p>"<a target="_blank" href="https://www.amazon.com/Radical-Candor-Revised-Kick-Ass-Humanity/dp/1250235375">Radical Candor</a>" by Kim Scott: Offers guidance on how to have honest and helpful conversations.</p>
</li>
<li><p>Agile project management tools like Jira or Trello for tracking progress.</p>
</li>
</ul>
<h2 id="heading-conclusion"><strong>Conclusion</strong></h2>
<p>Regular check-ins are a pivotal element of any successful development plan. They not only provide the necessary structure for continuous progress but also facilitate a realistic understanding of one’s abilities and achievements. Especially in the context of cognitive biases such as the Dunning-Kruger effect and Impostor Syndrome, regular check-ins can function as an external reality check. This, in turn, helps individuals calibrate their self-assessment and progressively grow in alignment with their goals.</p>
<p>As an ongoing process, it’s crucial to remember that learning and development are dynamic. Staying adaptable and open to change is imperative for true growth. This leads us to the next vital step in this series, which is milestone adjustment. This step focuses on the significance of allowing milestones to be dynamically adjusted based on feedback and evaluations and encourages individuals to maintain flexibility in their learning paths.</p>
]]></content:encoded></item><item><title><![CDATA[Mastering Milestone Evaluations]]></title><description><![CDATA[In our previous article, we delved into creating milestones as part of your personal or professional development journey. Now, let’s explore how to effectively evaluate those milestones. Evaluation keeps you grounded, makes your progress measurable, ...]]></description><link>https://iwtyo.today/mastering-milestone-evaluations</link><guid isPermaLink="true">https://iwtyo.today/mastering-milestone-evaluations</guid><category><![CDATA[Development Milestone]]></category><category><![CDATA[dunning-kruger-effect]]></category><category><![CDATA[impostor syndrome]]></category><category><![CDATA[personal development]]></category><category><![CDATA[cognitive bias]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Thu, 15 Jun 2023 07:00:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/yjquohfp0Bs/upload/35e267f5f5e648d39c0a3693579d1561.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In our previous article, we delved into creating milestones as part of your personal or professional development journey. Now, let’s explore how to effectively evaluate those milestones. Evaluation keeps you grounded, makes your progress measurable, and critically, helps in navigating cognitive biases such as the Dunning-Kruger effect and Impostor Syndrome.</p>
<h2 id="heading-introduction-to-evaluation-criteria"><strong>Introduction to Evaluation Criteria</strong></h2>
<p>Evaluating your milestones is an indispensable aspect of your development journey. It ensures accountability, learning from experiences, and provides a reality check against cognitive biases. Without evaluation, you might either overestimate your capabilities, fall prey to the Dunning-Kruger effect or underestimate your achievements, which is a hallmark of Impostor Syndrome.</p>
<h2 id="heading-choose-evaluation-methods"><strong>Choose Evaluation Methods</strong></h2>
<p>For each milestone, opt for an evaluation method suiting its nature. Common evaluation methods include:</p>
<ul>
<li><p><strong>Peer Reviews</strong>: Here, your colleagues or peers evaluate your work. This can be particularly helpful in team settings or collaborative projects.</p>
</li>
<li><p><strong>Mentor Assessments</strong>: A mentor or supervisor gives feedback on your progress. This is crucial for professional development, as mentors often have insights and experiences you might not possess.</p>
</li>
<li><p><strong>Self-Assessments</strong>: This involves self-reflection and evaluating your progress against set criteria. This can be enlightening but remember that self-assessments can sometimes be skewed by cognitive biases.</p>
</li>
</ul>
<p>For example, if your milestone involves mastering a coding language, a peer review could involve code reviews by fellow programmers, while mentor assessments might focus on the efficiency and optimization of your code. A self-assessment might involve creating a project using the language.</p>
<h2 id="heading-define-specific-criteria-for-each-evaluation-method"><strong>Define Specific Criteria for Each Evaluation Method</strong></h2>
<p>For every evaluation method chosen, outline specific criteria that must be met for the milestone to be considered complete. These criteria should align with the objectives of the milestone and must be measurable.</p>
<p><em>For instance, if your milestone is to “learn the basics of Python programming,” evaluation criteria could include writing a simple Python script (self-assessment), getting feedback on your coding style (peer review), or demonstrating your understanding of Python syntax in a discussion with a mentor (mentor assessment).</em></p>
<h2 id="heading-establish-feedback-mechanisms"><strong>Establish Feedback Mechanisms</strong></h2>
<p>Constructive feedback is central to the evaluation process. It provides insights into whether you’ve achieved a milestone and what can be learned from the process. Here are tips and examples for each type of review:</p>
<h3 id="heading-for-peer-reviews"><strong>For Peer Reviews:</strong></h3>
<ul>
<li><p><strong>Foster a Constructive Culture</strong>: Encourage peers to offer feedback that is both positive and developmental. Promote an atmosphere of mutual growth.</p>
</li>
<li><p><strong>Be Specific in Your Requests</strong>: When seeking feedback, ask specific questions. For instance, if your milestone is to improve public speaking, you could ask, “How well did I maintain eye contact during my presentation?”</p>
</li>
<li><p><strong>Encourage Actionable Feedback</strong>: Request feedback that you can act upon. Ask peers to offer suggestions for improvement.</p>
</li>
<li><p><strong>Document the Feedback</strong>: Maintain a record of the feedback received. This will allow you to track your progress over time.</p>
</li>
</ul>
<p>Example: If you're working on project management skills, ask peers for feedback on how effectively you managed timelines and allocated resources. Ask for concrete examples of what you did well and areas where you can improve.</p>
<h3 id="heading-for-mentor-assessments"><strong>For Mentor Assessments:</strong></h3>
<ul>
<li><p><strong>Schedule Regular Check-Ins</strong>: Schedule regular meetings with your mentor to discuss your progress. Consistent communication is key.</p>
</li>
<li><p><strong>Prepare for Feedback</strong>: Before the meeting, consider what you would like feedback on. Be open to receiving feedback on both strengths and areas for improvement.</p>
</li>
<li><p><strong>Ask for Clarification and Examples</strong>: If feedback is vague, ask for specific examples. If a mentor says you need to be more assertive, ask for instances where being assertive would have been beneficial.</p>
</li>
<li><p><strong>Reflect and Take Notes</strong>: Take notes during feedback sessions and reflect on them afterward. Create an action plan based on the feedback.</p>
</li>
</ul>
<p>Example: If your milestone is to develop leadership skills, ask your mentor to assess your performance in recent team meetings. Discuss specific scenarios and ask for insights on how to handle similar situations in the future.</p>
<h3 id="heading-for-self-assessments"><strong>For Self-Assessments:</strong></h3>
<ul>
<li><p><strong>Be Honest with Yourself</strong>: Approach self-assessments with honesty. Acknowledge both your achievements and areas where you fell short.</p>
</li>
<li><p><strong>Use a Reflective Journal</strong>: Maintain a journal where you document your thoughts, challenges, and learnings. Reflect on how your actions contributed to your progress or setbacks.</p>
</li>
<li><p><strong>Compare Against Criteria</strong>: Refer to the criteria you set for milestone completion. Analyze where you stand about these criteria.</p>
</li>
<li><p><strong>Set Next Steps</strong>: After evaluating, set actions for moving forward. This might involve adjusting your approach, seeking additional resources, or revising your milestones.</p>
</li>
</ul>
<p>Example: If you’re working on improving your writing skills, review an article you’ve written. Assess it against the criteria you set, such as clarity, coherence, and grammar. Note areas where you met or fell short of these criteria and set actions for improvement.</p>
<p>By establishing feedback mechanisms and actively engaging in the evaluation process, you’re setting yourself up for continuous learning and development, while also guarding against cognitive biases.</p>
<h2 id="heading-calibration-against-cognitive-biases"><strong>Calibration Against Cognitive Biases</strong></h2>
<p>This is where evaluation becomes a powerful tool in managing cognitive biases. Utilize feedback and evaluation results to calibrate your self-perception. If you consistently exceed your milestones with minimal effort, your milestones might be too easy and may lead to overconfidence, a symptom of the Dunning-Kruger effect. If, however, you find that despite genuine effort you’re not meeting your milestones and this is causing you to doubt your abilities, this might be Impostor Syndrome taking root. Reevaluate and readjust your milestones accordingly.</p>
<h2 id="heading-document-the-evaluation-criteria-and-feedback-mechanisms"><strong>Document the Evaluation Criteria and Feedback Mechanisms</strong></h2>
<p>Maintain records of the evaluation criteria and feedback mechanisms for each milestone. This documentation can be included where you record your milestones and should be readily accessible.</p>
<h2 id="heading-exercise-feedback-matrix"><strong>Exercise: Feedback Matrix</strong></h2>
<p><strong>Relevance:</strong> It enables you to organize feedback from different sources systematically. Through this, you can gain insights into your actual performance relative to the milestones you've set. It offers a balanced perspective, which is critical in calibrating your self-assessment and negating the biases that may arise from Dunning-Kruger or Impostor Syndrome.</p>
<p><strong>What to Expect:</strong> By using the Feedback Matrix, you can expect to have a structured way of collecting and analyzing feedback. You might discover areas where you underestimated your skills (relevant to Impostor Syndrome) or overestimated them (relevant to Dunning-Kruger Effect). This exercise is expected to enhance self-awareness and guide you in making informed decisions about your learning journey.</p>
<p><strong>How to Do It:</strong> Create a matrix where the rows represent your milestones, and the columns represent different sources of feedback (self, peers, mentors). In each cell, jot down the feedback received for a particular milestone from a specific source. Analyze the matrix to understand trends, consistencies, or discrepancies in feedback.</p>
<p><strong>Example:</strong> Suppose you have set a milestone to "Develop and deliver an effective presentation to the team on Project X's progress."</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>Milestone</strong></td><td><strong>Self-Assessment</strong></td><td><strong>Peer Feedback</strong></td><td><strong>Mentor Assessment</strong></td></tr>
</thead>
<tbody>
<tr>
<td>Develop and deliver an effective presentation</td><td>- Structured content - Nervous and stuttered occasionally  </td></tr>
</tbody>
</table>
</div><p>- Used data effectively but could improve on visual elements | - Engaging and informative<br />- Pacing was too fast at times, making it hard to follow<br />- Slides were visually appealing but charts need clarification | - Content well-organized<br />- Improve on delivery by practicing more<br />- Data usage was good, but consider simplifying complex charts for easier understanding |</p>
<h3 id="heading-reflecting-on-the-matrix"><strong>Reflecting on the Matrix:</strong></h3>
<p>In this detailed example, you have more insights from each feedback source.</p>
<p>From your self-assessment, you recognized the structure and data usage as strengths but also noticed your nervousness. However, you might not have been aware that your nervousness affected the pacing until you received peer feedback.</p>
<p>The peer feedback added that your pacing was too fast at times, which might be a manifestation of the nervousness you felt. They also pointed out that while your slides were visually appealing, some charts needed clarification.</p>
<p>Your mentor’s feedback aligned with your self-assessment regarding content structure. They also encouraged practicing more to improve delivery, providing an actionable way to address the nervousness you identified. They further advised simplifying complex charts, which resonates with the peers’ feedback on chart clarity.</p>
<p>The detailed feedback matrix has enabled you to identify common threads (such as the need for clarity in visual elements), and areas where you might have been too critical (e.g., you were concerned about your use of visual elements, while others found them appealing, though needing clarification). This helps in calibrating your self-perception and formulating specific actions for improvement, thus mitigating the impact of the Dunning-Kruger Effect and Impostor Syndrome.</p>
<h1 id="heading-additional-resources"><strong>Additional Resources</strong></h1>
<ol>
<li><p><strong>Online Tool</strong>: <a target="_blank" href="https://asana.com/"><strong>Asana</strong></a></p>
<ul>
<li>Asana is a project management tool that can be useful for setting milestones and tracking progress toward goals, which is crucial for keeping cognitive biases in check.</li>
</ul>
</li>
<li><p><strong>Book</strong>: "<a target="_blank" href="https://www.amazon.com/Thanks-Feedback-Science-Receiving-Well/dp/0670014664">Thanks for the Feedback: The Science and Art of Receiving Feedback Well</a>" by Douglas Stone and Sheila Heen.</p>
<ul>
<li>This book can be particularly useful in understanding how to interpret and use feedback effectively, which is integral to the evaluation process.</li>
</ul>
</li>
</ol>
<h1 id="heading-conclusion"><strong>Conclusion</strong></h1>
<p>Defining evaluation criteria and establishing feedback mechanisms are critical components of personal and professional development. These practices not only help in tracking progress toward goals but also serve as a crucial tool in calibrating one’s self-perception, which is especially relevant in managing the Dunning-Kruger effect and Impostor Syndrome. Through this structured approach, individuals can create a more realistic view of their skills and capabilities, celebrate genuine achievements, and identify areas for improvement. Furthermore, the feedback process becomes a source of continuous learning and a catalyst for personal growth.</p>
<p>Stay tuned for the next article in this series, where we will delve into the importance of scheduling regular check-ins to discuss progress, tackle challenges, and make necessary adjustments to your development plan.</p>
]]></content:encoded></item><item><title><![CDATA[Break Goals into Achievable Steps]]></title><description><![CDATA[Welcome back to our Skill Development Series! In the previous article, we talked about the importance of initial self-assessment in understanding your current skill levels. Now, it's time to create milestones that will guide your path to achieving yo...]]></description><link>https://iwtyo.today/break-goals-into-achievable-steps</link><guid isPermaLink="true">https://iwtyo.today/break-goals-into-achievable-steps</guid><category><![CDATA[goals]]></category><category><![CDATA[dunning-kruger-effect]]></category><category><![CDATA[impostor syndrome]]></category><category><![CDATA[personal development]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Wed, 14 Jun 2023 07:00:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/ayWgRkCk2sQ/upload/710c426e62edaaadeba8db72bea754fb.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Welcome back to our Skill Development Series! In the previous article, we talked about the importance of initial self-assessment in understanding your current skill levels. Now, it's time to create milestones that will guide your path to achieving your goals. Structuring your skill development into manageable milestones can have significant positive impacts on your learning journey and help in keeping cognitive biases like the Dunning-Kruger effect and Impostor Syndrome in check.</p>
<h2 id="heading-what-are-milestones"><strong>What are Milestones?</strong></h2>
<p>Milestones are key steps that pave the way toward achieving your larger goals. They serve as markers of progress and can be highly motivating. Breaking a big goal into milestones makes the process more manageable and less overwhelming.</p>
<h2 id="heading-breaking-down-goals-into-milestones"><strong>Breaking Down Goals into Milestones</strong></h2>
<p>For each goal you've set, identify smaller, specific objectives that will contribute to the achievement of the goal. These smaller objectives will be your milestones.</p>
<h2 id="heading-define-criteria-for-completion"><strong>Define Criteria for Completion</strong></h2>
<p>For each milestone, define what 'completed' looks like. This can be in the form of a specific output, a demonstrated skill, or any measurable criteria that signify the milestone has been achieved.</p>
<h2 id="heading-assign-timeframes"><strong>Assign Timeframes</strong></h2>
<p>Allocate a reasonable and specific timeframe for the completion of each milestone. Be realistic about the time needed, and consider your other commitments and potential challenges.</p>
<h2 id="heading-align-milestones-with-descriptive-concepts-for-skill-levels"><strong>Align Milestones with Descriptive Concepts for Skill Levels</strong></h2>
<p>Consider aligning each milestone with the progression of skill levels defined in the descriptive concepts (Unconscious Incompetence, Conscious Incompetence, Conscious Competence, Proficiency, Mastery). Each milestone could be aimed at moving from one level to the next.</p>
<p><strong>Example:</strong> Without Milestones</p>
<p><strong>Goal</strong>: Become proficient in programming within 6 months.</p>
<p><strong>Impact</strong>: This goal is too broad and can be overwhelming, leading to a higher chance of the Dunning-Kruger effect, where you might overestimate your abilities at the beginning. Similarly, as you learn more, you might feel like an imposter amongst other proficient programmers because of Impostor Syndrome.</p>
<p><strong>Example:</strong> With Milestones Aligned to Skill Levels</p>
<p><strong>Goal</strong>: Become proficient in programming within 6 months.</p>
<p><strong>Milestones</strong>:</p>
<ol>
<li><p><strong>Moving from "Unconscious Incompetence" to "Conscious Incompetence"</strong> (1 month): Learn the basics of Python programming. <em>This milestone helps by establishing a foundation and awareness of what you don’t know.</em></p>
</li>
<li><p><strong>Moving from "Conscious Incompetence" to "Conscious Competence"</strong> (2 months): Build a small application using Python. <em>This milestone ensures you have practical skills and application, which affirms you have gained basic competence.</em></p>
</li>
<li><p><strong>Moving from "Conscious Competence" to "Proficiency"</strong> (2 months): Understand and implement data structures in Python and develop a complex application. <em>This deepens your understanding, allowing you to use the skills more efficiently.</em></p>
</li>
<li><p><strong>Moving from "Proficiency" to "Mastery"</strong> (1 month): Review, refactor code for efficiency, and make improvements based on feedback. <em>This involves refining and innovating, indicating mastery over the skill.</em></p>
</li>
</ol>
<p><strong>Impact</strong>: By breaking the goal into specific milestones aligned with skill levels, you have a clearer focus and a structured approach to achieving proficiency. This structure can reduce the Dunning-Kruger effect by having clear and measurable milestones, and reduce Impostor Syndrome by gaining genuine competencies step by step.</p>
<h2 id="heading-reflect-on-dunning-kruger-effect-and-impostor-syndrome"><strong>Reflect on Dunning-Kruger Effect and Impostor Syndrome</strong></h2>
<p>While creating milestones, it is critical to be mindful of the Dunning-Kruger effect and Impostor Syndrome, as they can heavily influence your self-perception and learning process.</p>
<h3 id="heading-dunning-kruger-effect"><strong>Dunning-Kruger Effect</strong></h3>
<p>The Dunning-Kruger effect is a cognitive bias where people with low ability at a task overestimate their ability, while those with high ability tend to underestimate their competence.</p>
<h4 id="heading-too-easy-milestones">Too Easy Milestones</h4>
<p>If the milestones you set are too easy or not challenging enough, this can inflate your confidence and lead to the Dunning-Kruger effect. You may quickly accomplish these milestones and start to overestimate your abilities. For instance, if you’re learning to code and set a milestone as merely installing a programming tool, this doesn’t really challenge your coding skills. Achieving this may make you feel more accomplished than you should, and you may mistakenly believe that you are well on your way to becoming an expert.</p>
<h4 id="heading-mitigating-dunning-kruger">Mitigating Dunning-Kruger</h4>
<p>To avoid this, ensure that your milestones are challenging enough to require real effort and learning. Regularly seek feedback from knowledgeable peers or mentors, and stay open to constructive criticism.</p>
<h3 id="heading-impostor-syndrome"><strong>Impostor Syndrome</strong></h3>
<p>Impostor Syndrome, on the other hand, is a psychological pattern in which individuals doubt their skills, talents, or accomplishments and have a persistent internalized fear of being exposed as a "fraud".</p>
<h4 id="heading-too-difficult-milestones">Too Difficult Milestones</h4>
<p>If your milestones are overly ambitious or too difficult, you might find yourself struggling to achieve them. This can exacerbate feelings of Impostor Syndrome because even though you are putting in the effort, the lack of progress can make you feel inadequate or like a fraud. For example, if you are new to public speaking and set a milestone to deliver a speech to an audience of 1000 people within a month, the sheer difficulty and potential struggles might lead you to doubt your abilities more than before.</p>
<h4 id="heading-mitigating-impostor-syndrome">Mitigating Impostor Syndrome</h4>
<p>To combat Impostor Syndrome, create milestones that are realistic and achievable. Celebrate the small victories, and recognize that learning is a process that takes time. Also, consider sharing your experiences with peers or mentors who can offer support and perspective.</p>
<p>In summary, setting well-calibrated milestones - not too easy, and not too difficult - is essential in mitigating both the Dunning-Kruger effect and Impostor Syndrome. They need to challenge you enough to foster growth, but also be achievable to maintain motivation and confidence.</p>
<h2 id="heading-regularly-review-update-milestones-and-prove-achievement"><strong>Regularly Review, Update Milestones and Prove Achievement</strong></h2>
<p>Set a schedule for regularly reviewing your milestones. During these reviews, assess your progress and make necessary adjustments to your milestones and timeframes based on your actual performance and any new information or changes that have occurred.</p>
<p>When you believe you’ve achieved a milestone, prove it through action. For instance, if a milestone was to code an application, then code one. This helps to verify that the milestone is genuinely achieved, and not just perceived as achieved.</p>
<h2 id="heading-seek-feedback-and-external-input-optional"><strong>Seek Feedback and External Input (Optional)</strong></h2>
<p>External feedback is invaluable for an unbiased assessment of your skills. It can keep you grounded if you’re experiencing the Dunning-Kruger effect and can be reassuring if you’re dealing with Impostor Syndrome.</p>
<p>For example, if you believe you have become good at public speaking, rather than just self-assessing, ask for feedback from a knowledgeable friend or mentor. They can provide insights that you might have missed and can help confirm or reassess the skill level you believe you are at.</p>
<h2 id="heading-document-milestones"><strong>Document Milestones</strong></h2>
<p>Record your milestones, criteria for completion, and timeframes in a format that is easy to reference and update. This could be in a journal, a digital document, or a project management tool.</p>
<h2 id="heading-exercises"><strong>Exercises</strong></h2>
<p><strong>Exercise 1</strong>: Take one of your goals and break it down into at least three milestones. Write down what completion looks like for each milestone and set a timeframe for achieving each one.</p>
<p><strong>Exercise 2</strong>: Reflect on your milestones and ask yourself if they are realistic and well-structured to mitigate cognitive biases. Adjust if necessary.</p>
<h2 id="heading-additional-materials"><strong>Additional Materials</strong></h2>
<ol>
<li><p><strong>Book</strong>: "<a target="_blank" href="https://www.amazon.com/S-M-R-T-Goals-Made-Simple/dp/1496154061">SMART Goals Made Simple</a>" by S.J. Scott - For understanding the principles behind setting effective goals and milestones.</p>
</li>
<li><p><strong>Tool</strong>: Trello or Asana - These are project management tools that can be very useful in tracking your milestones.</p>
</li>
</ol>
<h2 id="heading-conclusion"><strong>Conclusion</strong></h2>
<p>By creating milestones that are well-defined, challenging, and aligned with skill levels, you not only pave a clear path for achieving your goals but also keep cognitive biases like the Dunning-Kruger Effect and Impostor Syndrome in check. Remember to stay adaptable, seek feedback, and celebrate your achievements, big or small.</p>
<p>In our upcoming article, we’ll be moving to evaluation criteria, where we will discuss the importance of defining how each milestone will be evaluated through peer reviews, mentor assessments, or self-assessments. Additionally, we will talk about establishing feedback mechanisms for each evaluation method to ensure that you’re not just moving forward, but moving forward in the right direction. Stay tuned!</p>
]]></content:encoded></item><item><title><![CDATA[The Power of SMART Goals]]></title><description><![CDATA[Welcome back to our skill development series! In the previous article, we explored the Dunning-Kruger Effect and Impostor Syndrome, which are cognitive biases that can impact your perception of your abilities. Understanding these biases was the first...]]></description><link>https://iwtyo.today/the-power-of-smart-goals</link><guid isPermaLink="true">https://iwtyo.today/the-power-of-smart-goals</guid><category><![CDATA[dunning-kruger-effect]]></category><category><![CDATA[impostor syndrome]]></category><category><![CDATA[learning]]></category><category><![CDATA[Personal growth  ]]></category><category><![CDATA[smart goals]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Tue, 13 Jun 2023 07:00:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/LNzuOK1GxRU/upload/789aedb62c4b6b84762d06ddf57be036.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Welcome back to our skill development series! In the previous article, we explored the Dunning-Kruger Effect and Impostor Syndrome, which are cognitive biases that can impact your perception of your abilities. Understanding these biases was the first step in preparing for an effective skill development process. Now, it’s time to focus on setting SMART goals that can keep your learning focused and measurable.</p>
<h2 id="heading-why-are-goals-important-in-skill-development"><strong>Why are Goals Important in Skill Development?</strong></h2>
<p>Setting goals is an essential part of any learning or development journey. Goals give you direction, focus, and a sense of purpose. They enable you to measure progress and stay motivated through challenges. Without clear goals, your learning can be unfocused, making it easy to get sidetracked or lose motivation.</p>
<h2 id="heading-what-are-smart-goals"><strong>What are SMART Goals?</strong></h2>
<p>SMART is an acronym that stands for Specific, Measurable, Achievable, Relevant, and Time-bound. Each of these attributes is a criterion that helps in setting effective goals. Let’s break down each element:</p>
<ul>
<li><p><strong>Specific</strong>: Your goal should be clear and specific. Vague goals make it hard to focus your efforts and feel motivated.</p>
<p>  <strong>Example Without Specificity</strong>: "I want to get better at math."</p>
<p>  <strong>Example With Specificity</strong>: "I want to improve my ability to solve algebraic equations."</p>
</li>
<li><p><strong>Measurable</strong>: Create criteria that allow you to measure your progress toward the attainment of your goal.</p>
<p>  <strong>Example Without Measurability</strong>: "I want to be more skilled in graphic design."</p>
<p>  <strong>Example With Measurability</strong>: "I want to create a portfolio with 10 high-quality graphic design projects."</p>
</li>
<li><p><strong>Achievable</strong>: Your goal should be realistic and attainable. It should challenge you, but still be possible within your abilities and resources.</p>
<p>  <strong>Example Without Achievability</strong>: "I want to become a leading expert in artificial intelligence within a year."</p>
<p>  <strong>Example With Achievability</strong>: "I want to complete an online course in artificial intelligence and work on a small project within the next six months."</p>
</li>
<li><p><strong>Relevant</strong>: The goal should be relevant to your interests and needs. It should align with your long-term objectives.</p>
<p>  <strong>Example of Irrelevance</strong>: "I will learn advanced quantum mechanics." (when your career path is in marketing).</p>
<p>  <strong>Example of Relevance</strong>: "I will complete a course in digital marketing strategies to improve my marketing skills."</p>
</li>
<li><p><strong>Time-bound</strong>: Set a deadline for your goal. This creates a sense of urgency and can motivate you to allocate your time efficiently.</p>
<p>  <strong>Example Without Time-bound Criteria</strong>: "I want to learn how to play the guitar."</p>
<p>  <strong>Example With Time-bound Criteria</strong>: "I want to learn to play three full songs on the guitar within 6 months."</p>
</li>
</ul>
<h2 id="heading-impact-of-non-smart-goals"><strong>Impact of Non-SMART Goals</strong></h2>
<p>Setting non-SMART goals can lead to issues, especially in terms of the Dunning-Kruger effect and Impostor Syndrome.</p>
<h3 id="heading-the-dunning-kruger-effect-and-non-smart-goals"><strong>The Dunning-Kruger Effect and Non-SMART Goals</strong></h3>
<p>Vague or over-ambitious goals can inflate the Dunning-Kruger effect.</p>
<p><strong>Example</strong>: "I want to become an expert in software development."</p>
<p>This goal lacks SMART parameters and may lead to premature self-perception as an expert, halting further learning.</p>
<h3 id="heading-impostor-syndrome-and-non-smart-goals"><strong>Impostor Syndrome and Non-SMART Goals</strong></h3>
<p>On the flip side, non-SMART goals can amplify Impostor Syndrome.</p>
<p><strong>Example</strong>: “I want to keep improving my programming skills.”</p>
<p>Without measurable success or achievable targets, this goal could make one feel perpetually inadequate, fueling Impostor Syndrome.</p>
<h2 id="heading-crafting-your-smart-goals"><strong>Crafting Your SMART Goals</strong></h2>
<p><strong>Exercise 1</strong>: Define Your Skill Development Goals</p>
<p>Grab a notebook or open a document on your computer. Write down what skills you want to develop. For each skill, create a SMART goal.</p>
<p><strong>For example</strong>, if you want to learn a new language, a SMART goal could be: “I will learn to hold a 10-minute conversation in Spanish within the next three months.”</p>
<p><strong>Relevance</strong>: Setting SMART goals aligns your learning efforts with your objectives. It allows for clear focus, measurable progress, and timely completion.</p>
<p><strong>Resource</strong>: Read “<a target="_blank" href="https://www.amazon.com/Succeed-How-Can-Reach-Goals/dp/0452297710">Succeed: How We Can Reach Our Goals</a>” by Heidi Grant Halvorson for insights into goal setting and achievement.</p>
<h2 id="heading-monitor-and-adjust-your-goals"><strong>Monitor and Adjust Your Goals</strong></h2>
<p>Goals should not be static. As you progress, you might find that you need to make adjustments to your goals. Maybe something was easier than you thought, or maybe you overestimated what you could realistically achieve in the time frame you set. That’s okay! The key is to be adaptable.</p>
<p><strong>Exercise 2</strong>: Weekly Goal Review</p>
<p>Set aside time every week to review your goals. Reflect on the progress you’ve made, and consider if you need to make any adjustments to your goals. Make sure they continue to be Specific, Measurable, Achievable, Relevant, and Time-bound.</p>
<h2 id="heading-how-goals-impact-your-learning-journey"><strong>How Goals Impact Your Learning Journey</strong></h2>
<p>Setting SMART goals not only gives you a roadmap for your learning journey but also contributes to a sense of accomplishment. Each time you achieve a goal, even a small one, it boosts your motivation and confidence. This can create a positive cycle of learning and achievement.</p>
<h2 id="heading-wrapping-up"><strong>Wrapping Up</strong></h2>
<p>Remember, the journey of skill development is just as important as the destination. Setting SMART goals is a powerful way to ensure that your journey is focused, meaningful, and aligned with your aspirations. In the next article, we will delve into assessing your current level of skill and confidence, and encourage you to plot your perceived ability on a hypothetical Dunning-Kruger graph. Stay tuned!</p>
<h2 id="heading-further-readings"><strong>Further Readings:</strong></h2>
<ul>
<li><p>“<a target="_blank" href="https://www.amazon.com/Power-Full-Engagement-Managing-Performance/dp/0743226755">The Power of Full Engagement</a>” by Jim Loehr and Tony Schwartz</p>
</li>
<li><p>“<a target="_blank" href="https://www.amazon.com/Drive-Surprising-Truth-About-Motivates/dp/1594484805">Drive: The Surprising Truth About What Motivates Us</a>” by Daniel H. Pink</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Understanding Dunning-Kruger & Impostor Syndrome]]></title><description><![CDATA[Skill development is often influenced by the way we perceive our abilities. Cognitive biases like the Dunning-Kruger Effect and Impostor Syndrome can significantly affect this perception. In this article, which marks the beginning of our skill develo...]]></description><link>https://iwtyo.today/understanding-dunning-kruger-impostor-syndrome</link><guid isPermaLink="true">https://iwtyo.today/understanding-dunning-kruger-impostor-syndrome</guid><category><![CDATA[Education & Skill Development]]></category><category><![CDATA[dunning-kruger-effect]]></category><category><![CDATA[impostor syndrome]]></category><category><![CDATA[Personal growth  ]]></category><category><![CDATA[Self Improvement ]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Mon, 12 Jun 2023 11:11:58 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/svmGjTjaun8/upload/3396d451ac96493c22a20fdef09d6955.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Skill development is often influenced by the way we perceive our abilities. Cognitive biases like the Dunning-Kruger Effect and Impostor Syndrome can significantly affect this perception. In this article, which marks the beginning of our skill development series, we will delve into these biases and discuss how understanding them can contribute to a more effective learning process.</p>
<h2 id="heading-what-is-the-dunning-kruger-effect"><strong>What is the Dunning-Kruger Effect?</strong></h2>
<p>The Dunning-Kruger Effect is a cognitive bias where individuals with low ability at a task overestimate their ability, and those with high ability underestimate their competence. This effect was first identified by psychologists David Dunning and Justin Kruger in 1999. When individuals know very little about a topic, they may not recognize their inadequacy. Conversely, when they are highly skilled, they may assume that others find the task as easy as they do. This creates a mismatch between perceived ability and actual ability, affecting decision-making and learning.</p>
<p>The Dunning-Kruger effect has two main characteristics:</p>
<ol>
<li><p><strong>Low-Ability Overconfidence</strong>: People with a low level of competence in a particular area often fail to recognize their lack of skill, and as a result, they overestimate their abilities.</p>
</li>
<li><p><strong>High-Ability Underestimation</strong>: Conversely, highly competent individuals tend to underestimate their relative competence, often assuming that tasks that are easy for them are also easy for others.</p>
</li>
</ol>
<p>It's important to recognize that the Dunning-Kruger effect is a form of cognitive bias. A cognitive bias is a systematic error in thinking that affects the judgments and decisions people make. In the case of the Dunning-Kruger effect, the bias lies in the inability of individuals to accurately assess their skill levels.</p>
<p>The Dunning-Kruger effect can have a significant impact on decision-making and behavior. For instance, an individual who overestimates their abilities might take on tasks they are not equipped to handle, resulting in poor performance. On the other hand, someone who underestimates their skills might avoid opportunities for growth or leadership, believing they are not qualified enough.</p>
<p>In the context of skill development, being aware of the Dunning-Kruger effect is crucial. It helps individuals to recognize the importance of continuous learning and seeking feedback. By understanding that our self-assessment may be biased, we can open ourselves to a more accurate evaluation of our skills and abilities, leading to more informed decisions and actions.</p>
<p><strong>Exercise 1</strong>: Reflect on an experience where you were new to a skill and thought, “This seems easy.” Later, as you delved deeper, you might have realized there was a lot more complexity. Write this experience down.</p>
<p><strong>Relevance</strong>: Understanding the Dunning-Kruger Effect helps in realizing that initial overconfidence can be detrimental to genuine skill-building. Being aware helps in curbing the bias.</p>
<p><strong>Resource</strong>: Watch the TEDx talk - “<a target="_blank" href="https://www.ted.com/talks/david_dunning_why_incompetent_people_think_they_re_amazing?language=en">Why incompetent people think they’re amazing</a>” by David Dunning.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.ted.com/talks/david_dunning_why_incompetent_people_think_they_re_amazing?language=en">https://www.ted.com/talks/david_dunning_why_incompetent_people_think_they_re_amazing?language=en</a></div>
<p> </p>
<h2 id="heading-what-is-impostor-syndrome"><strong>What is Impostor Syndrome?</strong></h2>
<p>Impostor Syndrome involves a persistent doubt in one's abilities and achievements, accompanied by the fear of being exposed as a fraud. Despite external evidence of their competence, those experiencing Impostor Syndrome remain convinced that they are frauds and do not deserve the success they have achieved. Such doubts can hinder personal and professional development, as individuals may avoid pursuing new opportunities or challenges.</p>
<p>The term ‘Impostor Syndrome’ was first coined in the 1970s by clinical psychologists Dr. Pauline R. Clance and Dr. Suzanne A. Imes. They observed that despite having adequate external evidence of accomplishments, some individuals internalized a deep-seated feeling of not being good enough and considered themselves to be frauds.</p>
<p>In their seminal paper titled <em>'The Impostor Phenomenon in High Achieving Women: Dynamics and Therapeutic Intervention'</em>, Clance and Imes initially studied the phenomenon among high-achieving women. However, subsequent research has shown that Impostor Syndrome can affect anyone regardless of gender, occupation, or background.</p>
<p>Impostor Syndrome is characterized by:</p>
<ol>
<li><p><strong>Chronic self-doubt</strong>: An ongoing sense of doubt regarding one’s abilities and achievements.</p>
</li>
<li><p><strong>Fear of being ‘found out’ or exposed as a fraud</strong>: A persistent fear that others will realize that the individual is not as competent as they appear to be.</p>
</li>
<li><p><strong>Attribution of success to luck or external factors</strong>: Believing that successes are not due to one's abilities but to luck, timing, or having deceived others into thinking they are more competent than they believe themselves to be."</p>
</li>
</ol>
<p>Impostor Syndrome can have detrimental effects on an individual’s well-being and performance. It can lead to anxiety, stress, low self-esteem, and in some cases depression. Moreover, it may cause people to avoid taking on new challenges or opportunities for fear of not living up to expectations.</p>
<p>In the context of skill development, recognizing and addressing Impostor Syndrome is important. Individuals need to realize that feeling like an impostor does not equate to being one. Understanding that these feelings are common and not necessarily grounded in reality can help individuals to take steps to overcome these thoughts, and pursue personal and professional growth with more confidence.</p>
<p><strong>Exercise 2</strong>: Think of a time you achieved something significant but felt like you didn’t deserve it. Write down how you felt and why you think you felt this way.</p>
<p><strong>Relevance</strong>: Recognizing Impostor Syndrome is important because it can hinder your progress by preventing you from acknowledging your achievements.</p>
<p><strong>Resource</strong>: Read “<a target="_blank" href="https://www.amazon.com/Secret-Thoughts-Successful-Women-Impostor/dp/0307452719">The Secret Thoughts of Successful Women: Why Capable People Suffer from the Impostor Syndrome and How to Thrive in Spite of It</a>” by Dr. Valerie Young.</p>
<h2 id="heading-the-intersection-of-dunning-kruger-effect-and-impostor-syndrome"><strong>The Intersection of Dunning-Kruger Effect and Impostor Syndrome</strong></h2>
<p>Both Dunning-Kruger Effect and Impostor Syndrome can act as barriers to skill development. The former might cause individuals to prematurely conclude that they’ve learned enough, while the latter might make them feel like they’ll never learn enough. Both biases distort the perception of one’s abilities, and addressing them is critical for effective skill development.</p>
<p>Understanding the Dunning-Kruger effect and Impostor Syndrome is especially important when it comes to self-assessment and goal setting. When setting goals, individuals might overestimate or underestimate their abilities due to the Dunning-Kruger effect. Similarly, Impostor Syndrome may cause individuals to set overly conservative goals, fearing that they aren't competent enough. Being aware of these phenomena helps individuals to set more realistic and achievable goals.</p>
<p>By recognizing the Dunning-Kruger effect, individuals can remain open to feedback and continuous learning. This is crucial because one of the antidotes to the Dunning-Kruger effect is gaining more knowledge and expertise. Similarly, by acknowledging Impostor Syndrome, individuals can work towards building self-confidence, thereby engaging in opportunities for learning and growth without the hindrance of self-doubt.</p>
<p>When individuals can accurately assess their skills and manage self-doubt, they are more likely to perform effectively. Overcoming the barriers posed by the Dunning-Kruger effect and Impostor Syndrome can lead to increased focus, higher motivation, and ultimately improved performance and productivity.</p>
<p><strong>Exercise 3</strong>: Plot your experiences from Exercise 1 and Exercise 2 on a graph, with confidence on one axis and knowledge on the other. Notice any trends or patterns.</p>
<h2 id="heading-engage-in-discussions"><strong>Engage in Discussions</strong></h2>
<p>Let's move on to an activity that will help us reflect on our own experiences with the Dunning-Kruger effect and Impostor Syndrome. This reflective exercise is designed to encourage self-awareness and to identify how these phenomena may have influenced our thoughts, decisions, and actions in various situations.</p>
<ul>
<li><p>Describe a time when you felt highly confident about a skill or task, but later realized you overestimated your abilities. How did this affect your performance or outcome?</p>
</li>
<li><p>Recall an instance where you doubted your competence despite evidence of your achievements. How did this affect your decisions or actions?</p>
</li>
<li><p>What strategies can you use to combat the Dunning-Kruger effect and Impostor Syndrome in the future?</p>
</li>
<li><p>Consider how different situations may have been handled if you had been aware of the Dunning-Kruger effect or Impostor Syndrome at the time.</p>
</li>
</ul>
<p><strong>Exercise 4</strong>: Find a friend, family member, or colleague who is open to discussing these topics. Share your experiences and listen to theirs. Discuss how these biases might have affected your learning experiences.</p>
<p><strong>Tool</strong>: Use online forums or social media groups focused on personal development to find people to discuss with.</p>
<h2 id="heading-educate-yourself-further"><strong>Educate Yourself Further</strong></h2>
<p>Now that we have explored the concepts of the Dunning-Kruger effect and Impostor Syndrome, and engaged in reflective activities, we must have the tools and resources necessary for ongoing learning and management of these phenomena. We will go through a set of resources that you can use for deeper understanding and practical application.</p>
<p>Here are some books and articles that provide insights into the Dunning-Kruger effect and Impostor Syndrome:</p>
<ul>
<li><p><em>“You Are Not So Smart”</em> by David McRaney - A book about self-delusion and cognitive biases, including the Dunning-Kruger effect.</p>
</li>
<li><p><em>“The Secret Thoughts of Successful Women”</em> by Dr. Valerie Young - This book offers insights into why capable people suffer from Impostor Syndrome and how to thrive despite it.</p>
</li>
</ul>
<p>Participating in courses or workshops can also be very helpful. Here are a few recommendations:</p>
<ul>
<li><p><em>“Learning How to Learn”</em> on Coursera - This course covers the Dunning-Kruger effect and various learning techniques.</p>
</li>
<li><p><em>“Overcoming Impostor Syndrome”</em> on LinkedIn Learning - This course provides strategies for overcoming Impostor Syndrome.</p>
</li>
</ul>
<p>Utilizing tools for reflection and self-assessment can help you to continually evaluate your skills and combat the Dunning-Kruger effect and Impostor Syndrome. Some tools that might be helpful include:</p>
<ul>
<li><p><strong>Journaling</strong>: Keeping a daily or weekly journal where you reflect on your experiences, thoughts, and feelings can be beneficial.</p>
</li>
<li><p><strong>Feedback Tools</strong>: Utilize 360-degree feedback tools or ask for regular feedback from peers, supervisors, or mentors.</p>
</li>
</ul>
<p>Engage with your support network. This could be friends, family, or professional networks. Sharing experiences and gaining perspectives from others can be very valuable in managing the Dunning-Kruger effect and Impostor Syndrome</p>
<p><strong>Exercise 5</strong>: Watch the TED talk “<a target="_blank" href="https://www.youtube.com/watch?v=zeAEFEXvcBg">Thinking you’re good at something, when you’re not</a>” by Dr. Tomas Chamorro-Premuzic.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=zeAEFEXvcBg">https://www.youtube.com/watch?v=zeAEFEXvcBg</a></div>
<p> </p>
<p><strong>Exercise 6</strong>: Reflect on how this knowledge will shape your approach to setting goals for skill development.</p>
<h2 id="heading-wrapping-up"><strong>Wrapping Up</strong></h2>
<p>Being aware of the Dunning-Kruger Effect and Impostor Syndrome, engaging in personal reflections, and participating in discussions are your first steps in preparing for a more informed skill development process.</p>
<p>In the next article, you will learn how to set SMART goals that can keep your learning focused and measurable. Stay tuned!</p>
]]></content:encoded></item><item><title><![CDATA[Addressing the Dunning-Kruger Effect and Impostor Syndrome]]></title><description><![CDATA[Continuous skill development is vital for personal and professional growth in today's fast-paced world. However, the journey can sometimes be clouded by cognitive biases such as the Dunning-Kruger Effect and Impostor Syndrome, which affect how indivi...]]></description><link>https://iwtyo.today/addressing-the-dunning-kruger-effect-and-impostor-syndrome</link><guid isPermaLink="true">https://iwtyo.today/addressing-the-dunning-kruger-effect-and-impostor-syndrome</guid><category><![CDATA[skills]]></category><category><![CDATA[dunning-kruger-effect]]></category><category><![CDATA[impostor syndrome]]></category><category><![CDATA[cognitive bias]]></category><category><![CDATA[Self Improvement ]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Mon, 12 Jun 2023 10:27:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/zoCDWPuiRuA/upload/2984518276c5e9128f6b8efcdb88fee0.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Continuous skill development is vital for personal and professional growth in today's fast-paced world. However, the journey can sometimes be clouded by cognitive biases such as the Dunning-Kruger Effect and Impostor Syndrome, which affect how individuals perceive their abilities. This article introduces a structured process that aims to address these biases and support a more informed and self-aware approach to skill development. The process is comprised of 11 detailed steps, each concentrating on an essential aspect of skill development.</p>
<h2 id="heading-understanding-the-dunning-kruger-effect-and-impostor-syndrome"><strong>Understanding the Dunning-Kruger Effect and Impostor Syndrome</strong></h2>
<p>The Dunning-Kruger Effect is a cognitive bias where individuals with low ability at a task may overestimate their ability, while those who are highly skilled may underestimate their competence. As discovered by social psychologists David Dunning and Justin Kruger in 1999, this bias can lead to misconceptions about one’s abilities.</p>
<p>Impostor Syndrome, in contrast, is where an individual doubts their accomplishments and fears being seen as a “fraud.” This can cause even high-achieving individuals to underestimate their competencies.</p>
<p>Both the Dunning-Kruger Effect and Impostor Syndrome can create challenges in skill development by affecting self-perception.</p>
<h2 id="heading-a-brief-overview-of-the-skill-development-process"><strong>A Brief Overview of the Skill Development Process</strong></h2>
<p>This skill development process aims to address the Dunning-Kruger Effect and Impostor Syndrome while encouraging purposeful learning. Here’s a brief overview of the 11 steps:</p>
<ol>
<li><p><strong>Educational Kickoff</strong>: Introducing the Dunning-Kruger Effect and Impostor Syndrome.</p>
</li>
<li><p><strong>Setting SMART Goals</strong>: Developing Specific, Measurable, Achievable, Relevant, and Time-bound goals.</p>
</li>
<li><p><strong>Initial Self-Assessment</strong>: Assessing current skills and confidence levels.</p>
</li>
<li><p><strong>Create Milestones</strong>: Creating smaller, achievable milestones for goals.</p>
</li>
<li><p><strong>Define Evaluation Criteria</strong>: Establish how milestones will be evaluated.</p>
</li>
<li><p><strong>Regular Check-Ins</strong>: Monitoring progress through scheduled check-ins.</p>
</li>
<li><p><strong>Dynamic Milestone Adjustment</strong>: Adapting milestones based on feedback.</p>
</li>
<li><p><strong>Reflection and Addressing Impostor Syndrome</strong>: Reflecting on the learning journey.</p>
</li>
<li><p><strong>Feedback Repository</strong>: Recording positive feedback and accomplishments.</p>
</li>
<li><p><strong>Final Assessment and Celebration</strong>: Assessing achievements and celebrating.</p>
</li>
<li><p><strong>Post-Process Analysis</strong>: Collect feedback for future improvements.</p>
</li>
</ol>
<h2 id="heading-the-value-of-this-process"><strong>The Value of This Process</strong></h2>
<p>By addressing the Dunning-Kruger Effect and Impostor Syndrome, this process helps individuals gain a clearer understanding of their abilities, which is essential for learning and growth. It also emphasizes setting clear goals, regular monitoring, feedback, and reflection to support continuous development.</p>
<h2 id="heading-conclusion"><strong>Conclusion</strong></h2>
<p>Skill development is an ongoing process, and understanding psychological factors is critical. This process aims to support effective skill development by integrating psychological insights with practical strategies. Stay tuned as we explore each step in detail in the upcoming articles.</p>
]]></content:encoded></item><item><title><![CDATA[Code template: do not reinvent the wheel]]></title><description><![CDATA[When I am coding, there is always a bunch of lines that I have to search about, or that takes time to type even though I know them, or code that needs to be included but I don't remember what, or code that I just copy/paste from a project without loo...]]></description><link>https://iwtyo.today/code-template-do-not-reinvent-the-wheel</link><guid isPermaLink="true">https://iwtyo.today/code-template-do-not-reinvent-the-wheel</guid><category><![CDATA[intellij]]></category><category><![CDATA[templates]]></category><category><![CDATA[template]]></category><category><![CDATA[code]]></category><category><![CDATA[live template]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Mon, 13 Mar 2023 12:35:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/XJXWbfSo2f0/upload/a91bf1f14906d149b98f3f4f8a641698.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When I am coding, there is always a bunch of lines that I have to search about, or that takes time to type even though I know them, or code that needs to be included but I don't remember what, or code that I just copy/paste from a project without looking if it is still up to date.</p>
<p>Does it also happen to you? I think so!</p>
<h3 id="heading-what-to-do">What to do?</h3>
<p>Most of the time, those pieces of code are not the most interesting ones:</p>
<ul>
<li><p>Write in a file</p>
</li>
<li><p>Create a mock</p>
</li>
<li><p>Helm chart values!</p>
</li>
</ul>
<p>Even your idea helps you when you want to create a main, a constructor, getter and setters, toString, loops, if, switch, etc...</p>
<p>For example the main method: if you start tipping main you will see this popup:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678703580224/ab060309-0c46-4fa1-8298-769ce13e56c4.png" alt class="image--center mx-auto" /></p>
<p>And if you click (or press enter) then the code is injected:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678703602175/5a7f5023-73f4-4caa-b36f-6305e8aea0e1.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-how-to-create-a-template">How to create a template?</h3>
<p>In IntelliJ, we have the notion of live templates. Those snippets will be proposed when you start typing the correct abbreviation in the correct context.</p>
<p>To create a snippet, I will first write the code, try to improve it, and see if it works. When I am satisfied, then I select it, open the actions and select Save as Live template:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678705416090/0f5f0656-d328-4297-b69c-26d0fb0e2cfa.png" alt class="image--center mx-auto" /></p>
<p>A new page opens:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678705662636/1ffe934b-f9c6-4ad6-896d-88a1e17f3eb2.png" alt class="image--center mx-auto" /></p>
<p>Those are all the information you will see on this page:</p>
<ol>
<li><p>This is your new template. As you have not defined any abbreviation (shortcut) yet, the default value is "abbreviation"</p>
</li>
<li><p>The context in which your template will show up: you can restrict a template to a type of file. This will help to only display js template in js files, java ones in java files, and so on. Use user context to have your templates always available.</p>
</li>
<li><p>The abbreviation is the text that will trigger the suggestion and the insert of the template. Try to find something that you will remember! Not something like template1, template2,...</p>
</li>
<li><p>The description of the template. Be sure to describe what the template is pasting. For example, in the case of JUnit4 / JUnit 5 templates, it is important to specify it in the description.</p>
</li>
<li><p>The template. It is what will be written in your code.</p>
</li>
<li><p>You will be able to define variables to make your template dynamic!</p>
</li>
</ol>
<p>I will just create a basic template for now with abbreviation demo1</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678706001120/b36593a0-b8b4-4b07-86f9-514bd65c3ab1.png" alt class="image--center mx-auto" /></p>
<p>When I type demo1 in the code, I have the suggestion and when I select it, the code is written:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678706141762/80a557f5-4a98-4a6e-8fa6-4fadfbb6afb0.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678706176628/d7bf01f5-541b-4be3-a41d-3c1341cf5094.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-how-to-create-a-dynamic-template">How to create a dynamic template</h3>
<p>It is nice to have a template, but it is nicer to have dynamic ones! Let's duplicate demo1 into demo2 and try to make it dynamic.</p>
<p>We can define variables by using $VARIABLE_NAME$</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678706502215/b9c315f2-2db8-494e-af96-e14bc9373dd5.png" alt class="image--center mx-auto" /></p>
<p>When I start typing demo2 and use the template, I will see that my cursor is set to where I have defined $MESSAGE$ and it is asking me to type something.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678706597676/c9dc17a2-28d4-4f31-af01-f2d118d2028e.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678706611138/4e97803d-fe00-4006-abbe-c4057ad6baff.png" alt class="image--center mx-auto" /></p>
<p>Nice! So now we have a variable. But what can we do with it? The edit variable is now available as IntelliJ detects the presence of variables in the templates. I will add a new variable to replace helloThere with a camel case of the string and use this new variable in the println:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678706845596/c3fbf994-b7c2-4d81-83ac-c8b52a67f108.png" alt class="image--center mx-auto" /></p>
<p>Now I will edit the variables to insert $MESSAGE$ value first and make IntelliJ do the camel case for me. When I open the Edit Template Variables, I can see the order of the variables. IntelliJ will use the order used in the template. I can change that thanks to the 2 arrows.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678706896571/ddcf85a5-6893-4f9f-a099-d0cfe69f8ef4.png" alt class="image--center mx-auto" /></p>
<p>I will move MESSAGE up.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678706970766/2647d46c-5a0d-4e9f-8e48-f0af8c2018cc.png" alt class="image--center mx-auto" /></p>
<p>Then I will in VARIABLE Expression use one of the functions available and pass MESSAGE as a parameter</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678707012758/ec7a4045-570c-4994-9fc6-44acb55b4ea8.png" alt class="image--center mx-auto" /></p>
<p>And this is when I use it:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678707497842/c505033a-6da0-4202-8d5f-8f2c04e061f5.gif" alt class="image--center mx-auto" /></p>
<h3 id="heading-what-is-the-next-step">What is the next step?</h3>
<p>Having templates is great, sharing templates is better! Imagine that all the "approved code" could be done by templates. All the snippets from API have templates. If you could review templates, updates, and share so you are sure to always use the most up-to-date code.</p>
<p>Let's see how to export your templates. Just go to File &gt; Manage IDE Settings &gt; Export Settings</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678709149938/94db265b-46e5-44f9-af73-088e270858d4.png" alt class="image--center mx-auto" /></p>
<p>Then select Live templates and Live templates (schemes) and export the zip to the best place for you:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678710011219/5f364fb1-d0f2-4c31-ba1b-84258d1a60a2.png" alt class="image--center mx-auto" /></p>
<p>Now we can import settings! Same path but click import settings instead. Then pick your zip file:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678709567933/6d2904be-ed0b-48ac-ac4a-eabc05ca4905.png" alt class="image--center mx-auto" /></p>
<p>And select what you want to import from those settings:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678709607724/cbcf82c5-c02a-49bc-8fb9-3898f3142488.png" alt class="image--center mx-auto" /></p>
<p>And restart your IntelliJ to apply changes</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678709642713/cfc87281-55c9-4006-8824-3ca888c53871.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-looking-a-bit-into-this-export">Looking a bit into this export</h3>
<p>If we open the zip file, we can see the templates folder with all templates per context.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678710195030/c1ca2000-83ea-4960-b1f3-f5f309a91e40.png" alt class="image--center mx-auto" /></p>
<p>If we dive into the user.xml, I can see my templates demo1 and demo2!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678710273474/8e24b51c-1cab-4777-a277-8a45ff5d5a20.png" alt class="image--center mx-auto" /></p>
<p>Next step: find out a workflow to share those templates with a broader audience!</p>
<h3 id="heading-extra-tips">Extra tips</h3>
<p>When you go to a conference, and the presenter is doing a demo. And you see this kind of code :</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678707804025/229fc1af-3c93-4e45-9e4c-375b095ab884.png" alt class="image--center mx-auto" /></p>
<p>And when he types function1, then a huge part of code shows up and you think: Wooooow, where does that come from ??? <strong>TEMPLATE</strong></p>
<p>I am sure that he wrote the whole code, then extracted the part he wanted into templates, wrote down the abbreviation and when to play them and VOILA!</p>
<h3 id="heading-in-conclusion-use-templates">In conclusion, use templates!</h3>
<p>What is more to say, repetitive code is a source of error. If you start to copy/paste snippets, and the source starts to be old, and you apply it everywhere, and it spreads, what will it look like after some time?</p>
<p>By managing templates, reviewing them, and sharing them, those templates will live and that redundant, unsafe and boring piece of code will become attractive, useful and safe!</p>
]]></content:encoded></item><item><title><![CDATA[Interactive git rebase : how to create nice PR]]></title><description><![CDATA[Do you ever feel overwhelmed when looking at your list of commits before sending a pull request (PR)? Is it difficult for the reviewer to keep track of your different changes? Do you have chains of fixup commits in your PR? If so, Git has a great fea...]]></description><link>https://iwtyo.today/interactive-git-rebase-how-to-create-nice-pr</link><guid isPermaLink="true">https://iwtyo.today/interactive-git-rebase-how-to-create-nice-pr</guid><category><![CDATA[Git]]></category><category><![CDATA[git rebase]]></category><category><![CDATA[intellij]]></category><category><![CDATA[pr]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Mon, 13 Mar 2023 08:38:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/842ofHC6MaI/upload/b19b5cdc94e2450da9ebab9fdd583b2a.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Do you ever feel overwhelmed when looking at your list of commits before sending a pull request (PR)? Is it difficult for the reviewer to keep track of your different changes? Do you have chains of fixup commits in your PR? If so, Git has a great feature that can help you keep your commits in an orderly fashion. In this blog, I'll be demonstrating this feature and how it can help you maintain a clear and intelligible list of commits for easy review.</p>
<h3 id="heading-how-my-work-can-looks-like">How my work can looks like</h3>
<p>When I start working on a task, I create a new branch and push commits on this branch. I may push on Friday a commit to save my work in case something happens during the weekend (to me or my laptop). I can also push a commit to trigger a pipeline to see how it will react to my changes. I often push a commit based on Sonarqube review (or any other tools like WhiteSource,...)</p>
<p>In the end, my tree history can look like this:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678694077077/4595f9d8-b74a-46b5-af48-ac4a6503c1f8.png" alt class="image--center mx-auto" /></p>
<p>I feel sorry for the person doing the review... There is too much noise on the list of commits, hard to point out what was done, what might be reverted, etc, etc...</p>
<p>Even from my point of view. Let's say I have to stop working on it for few days (or weeks), when I go back on it, this won't help me!</p>
<h3 id="heading-rewrite-the-story">Rewrite the story</h3>
<p>When I end up in this situation, I try to rewrite the story: rewrite the git history. To do so, I use git rebase in the interactive mode. Thanks to it, I will be able to do <a target="_blank" href="https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History">several actions</a> on this list of commits:</p>
<pre><code class="lang-console"># Commands:
# p, pick &lt;commit&gt; = use commit
# r, reword &lt;commit&gt; = use commit, but edit the commit message
# e, edit &lt;commit&gt; = use commit, but stop for amending
# s, squash &lt;commit&gt; = use commit, but meld into previous commit
# f, fixup &lt;commit&gt; = like "squash", but discard this commit's log message
# x, exec &lt;command&gt; = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop &lt;commit&gt; = remove commit
# l, label &lt;label&gt; = label current HEAD with a name
# t, reset &lt;label&gt; = reset HEAD to a label
# m, merge [-C &lt;commit&gt; | -c &lt;commit&gt;] &lt;label&gt; [# &lt;oneline&gt;]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c &lt;commit&gt; to reword the commit message.
</code></pre>
<p>To clean my PR, I only use:</p>
<ul>
<li><p>pick to keep the commits that have a meaning</p>
</li>
<li><p>reword to fix typos, include more details, rephrase my commit message</p>
</li>
<li><p>squash to merge several commits and rewrite the message in one action. This can happen when 2 commits are on the same feature and the message should be changed</p>
</li>
<li><p>fixup to merge several commits and keep the message of the first commit. This happens for commits with code typos, commits with back-and-forth push / revert to try things on the pipeline, etc...</p>
</li>
</ul>
<h3 id="heading-how-i-do-it-technically">How I do it technically</h3>
<p>As for every git feature, you can use git-cli for that. You can find all the details <a target="_blank" href="https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History">here</a>.</p>
<p>I want to show you how to do it in IntelliJ (I am sure your favorite idea is also capable to do it).</p>
<p>IntelliJ has a git plugin. When you open it, you will see the git history of your project (local and remote)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678694898846/0292c941-e0b2-4646-80ba-f26da7cac775.png" alt class="image--center mx-auto" /></p>
<p>I have selected my branch GIT_REBASE and I will see the all the commits (from Create a feature to Update test)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678694953245/9aed4926-0760-4b04-ae9a-63d94726f4ae.png" alt class="image--center mx-auto" /></p>
<p>When I right click on the first commit (Create a feature), I see a menu with all the options:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678695079752/5df18d0f-7a59-4964-9c87-5a9d9b9c7e3c.png" alt class="image--center mx-auto" /></p>
<p>I click on Interactive Rebase from Here and IntelliJ opens the wizard to apply my rebase options</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678695175733/61d87109-416e-47b6-a106-3641dd09adc1.png" alt class="image--center mx-auto" /></p>
<p>On top, there is the list of options I can apply to the commits:</p>
<ul>
<li><p>Up / Down to change the commit orders</p>
</li>
<li><p>Reword to change the commit message</p>
</li>
<li><p>Squash / Fixup (only available if it is not the first commit of the tree)</p>
</li>
<li><p>Drop</p>
</li>
</ul>
<p>I will select the first Fixup commit:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678695319154/9336943a-8c1c-4c9f-8813-a9547924b6ca.png" alt class="image--center mx-auto" /></p>
<p>Now my tree looks like this.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678695349424/c5fdcda0-f512-42e3-9751-8a4623f864ce.png" alt class="image--center mx-auto" /></p>
<p>Let's keep going by doing all the fixup first. We can "stack" several fixup:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678695431163/7271f32d-5f4f-440c-8ecd-a26620afe659.png" alt class="image--center mx-auto" /></p>
<p>So all the fix commits have been marked as fixup. I still have 3 commits:</p>
<ul>
<li><p>Create a feature (the first commit that I want to keep like that)</p>
</li>
<li><p>Apply review: I want to keep it but I want to rewrite the message</p>
</li>
<li><p>Update feature 2: I want to keep it like that also.</p>
</li>
</ul>
<p>I select Apply review commit, click Reword and now I can see this input field</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678695517781/c73dd80a-2a9d-4d09-a7fd-1c0a07442211.png" alt class="image--center mx-auto" /></p>
<p>Better no?</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678695607975/664f524c-7032-4d2f-b430-e67ffd923337.png" alt class="image--center mx-auto" /></p>
<p>When all my changes are done, I just need to click Start Rebasing:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678695648105/7c0414d2-1d19-465a-a9d7-f433403b4092.png" alt class="image--center mx-auto" /></p>
<p>Now I have my nice tree and can create a PR with 3 commits with lots of value.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678696058584/1aca459b-3f8e-4f5f-9f27-f9b68f9873a3.png" alt class="image--center mx-auto" /></p>
<p><strong>If at any point, you are blocked, you can always cancel the rebase:</strong></p>
<pre><code class="lang-plaintext">git rebase --abort
</code></pre>
<p>So now only thing that you have to do is to push your PR. If you already pushed it, you will have to do a push force:</p>
<pre><code class="lang-plaintext">git push -f
</code></pre>
<h3 id="heading-conclusion">Conclusion</h3>
<p>Git is a powerful tool and can help us in our work. When we submit a PR, we have to consider that someone will look at it. They will look at the code, but the commit history can also be a great source of information.</p>
<p>So clean it before you submit it, you will look more professional, and it will make the process smother!</p>
]]></content:encoded></item><item><title><![CDATA[Sharing is growing, Keeping is stagnating]]></title><description><![CDATA[Making yourself indispensable in a company is a great way to ensure job security and career growth. But, if you’re not careful, you could end up going down the wrong path.
Manual tasks can be incredibly tedious, time-consuming and unrewarding. The en...]]></description><link>https://iwtyo.today/sharing-is-growing-keeping-is-stagnating</link><guid isPermaLink="true">https://iwtyo.today/sharing-is-growing-keeping-is-stagnating</guid><category><![CDATA[SharingKnoweldge]]></category><category><![CDATA[#growth]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Mon, 13 Feb 2023 10:06:22 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1676455021806/a94cae06-333d-48d9-82ae-ef9b260795c5.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Making yourself indispensable in a company is a great way to ensure job security and career growth. But, if you’re not careful, you could end up going down the wrong path.</p>
<p>Manual tasks can be incredibly tedious, time-consuming and unrewarding. The entire process can be incredibly complex and require a lot of interaction. It’s this very complexity that can sometimes stop people from attempting a task, or make someone tackling them a hero.</p>
<p>The tools I created allowed me to be seen as a problem solver and a situation saver. I could quickly and easily help people with their problems and get them out of a bind that they couldn't have gotten out of without my help. I was able to be the hero without anyone knowing what I was doing. It was like a superpower that only I knew about.</p>
<p>Creating tools and process that only you know how to use, what they do, and why they do it, may seem like a great way to bolster your position in the company. After all, you’re the only person who knows how to use them and you’re the only person who knows what they do and why they do it.</p>
<p>But, while this might make you feel secure, it’s not the best way to make yourself shine. If you’re the only one who can use the tools, then you become a blocker.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1676282327204/51037287-f952-4f71-b5df-1810f7f411b6.jpeg" alt class="image--center mx-auto" /></p>
<p>You become so focused on growing and protecting your secrets that you're locked into a cycle of keeping your secrets and hoping that new use cases will emerge.</p>
<p>You're also missing out on the potential benefits of collaboration. When you collaborate with others, you can learn from their experiences and create even more powerful solutions. This is especially true when it comes to problem-solving, as collaboration can help you brainstorm potential solutions more quickly and efficiently.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1676282612095/fc80be51-cc8b-41ad-bcf1-fc4aa54d2f2d.jpeg" alt class="image--center mx-auto" /></p>
<p>When you take that step to share what you have created, it allows for more engagement and input from your peers, thus validating your efforts. This kind of openness also allows more people to provide their critiques and suggestions, pushing you to further refine your solutions.</p>
<p>Then, you are no longer simply focused on your secret projects, but also on how to make your work more global in scope, both in terms of distribution and advertising. This is a tremendous opportunity for improvement and development, enabling you to put your skills and knowledge to even better use.</p>
<p>Moreover, with this kind of openness comes a sense of true recognition and appreciation. When others can see and experience the results of your hard work, rather than praising you through some sort of magical framework, it becomes that much more rewarding–and motivating. When people are exposed to and understand the fruits of your labor, they can more aptly appreciate it, and that elevates your necessary sense of validation.</p>
<p>All in all, the benefits that come from having increased transparency in your work are invaluable. By opening up your efforts to your colleagues, you are guaranteed to receive the kind of knowledge and feedback that will take your projects to the next level.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1676282076809/06eeb680-a547-4ef2-bca9-0331cc4b467a.jpeg" alt class="image--center mx-auto" /></p>
<p>Now that you’ve revealed your secrets and taken an honest look at yourself and your skills, you’re likely to find that you’re viewed more positively and you’re likely to receive the recognition and appreciation you deserve from your colleagues and company.</p>
<p>Gone are the days of relying on secret tools and old-fashioned methods to get work done, as people are instead recognizing your skills and your efforts as valuable assets to their team.</p>
<p>You have shown your colleagues and company that you are not merely a tool – you are a source of knowledge and a problem-solver. People will perceive you as someone who is valued for the skills they bring to the table, and not just a “secret tool”.</p>
<p>That kind of respect can only be earned, not given.</p>
<p>As someone who reveals their secrets and shares their knowledge freely, you will be identified as a team-oriented person, which is invaluable in the workplace. Your newfound power will offer you great opportunities!</p>
<p>You have not just shown others that you are capable and confident, but trustworthy and capable of much more. Trust is the foundation of any successful business, and revealing your business secrets is a great way to build that trust with colleagues and employers.</p>
<p>You have the power to create a positive work environment and contribute to the success of the company with your knowledge and problem-solving skills.</p>
]]></content:encoded></item><item><title><![CDATA[Cognitive Bias as a software developer]]></title><description><![CDATA[When we think of software development, the first thing that comes to mind is technical skill and expertise. But what you may not realize is that cognitive biases, such as Dunning-Kruger and imposter syndrome, can have a significant impact on the qual...]]></description><link>https://iwtyo.today/cognitive-bias-as-a-software-developer</link><guid isPermaLink="true">https://iwtyo.today/cognitive-bias-as-a-software-developer</guid><category><![CDATA[dunning-kruger-effect]]></category><category><![CDATA[impostor syndrome]]></category><category><![CDATA[cognitive bias]]></category><category><![CDATA[egoless programming]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Wed, 08 Feb 2023 12:34:19 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1676455121736/b5ce43d9-b8fd-4107-a283-2198693cf437.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When we think of software development, the first thing that comes to mind is technical skill and expertise. But what you may not realize is that cognitive biases, such as Dunning-Kruger and imposter syndrome, can have a significant impact on the quality of your work and your career satisfaction.</p>
<h3 id="heading-dunning-kruger-effect"><strong>Dunning-Kruger Effect</strong></h3>
<p>Ahhh, Dunning-Kruger Effect, is the most intriguing of all cognitive biases!</p>
<p>Have you ever wondered why sometimes people are overconfident in their knowledge, skills and abilities and why they don’t recognize their competence gaps?</p>
<p>The Dunning-Kruger effect is a psychological phenomenon that explains it all. Developed by social psychologists David Dunning and Justin Kruger in 1999, it describes the ‘cognitive bias that causes people to overestimate their knowledge and capabilities’.</p>
<p>To understand the Dunning-Kruger effect better, let’s break it down into four phases:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1675844722892/229a6916-4277-46d7-a6e7-34a48b07dee1.jpeg" alt class="image--center mx-auto" /></p>
<ol>
<li><p>Unskilled and Unaware (know nothing): This is the first phase of the Dunning-Kruger effect. People in this phase lack the knowledge and skills needed to accurately evaluate their abilities and thus, overestimate their abilities.</p>
</li>
<li><p>Moderate Skills and Unaware (peak of "Mt. Stupid"): This is the second phase of the Dunning-Kruger effect. In this stage, people are slightly more informed than in the first stage but are still unaware of their areas of improvement. As a result, they tend to overestimate their skills in comparison to their peers.</p>
</li>
<li><p>Highly Skilled and Unaware (Valley of despair): This is the third stage of the Dunning-Kruger effect. People in this stage are highly competent in certain areas, but they still haven’t yet realized the competency gap that lies between them and experts. Thus, they overestimate their abilities greatly.</p>
</li>
<li><p>Expert and Aware: This is the last (and the most optimal) stage of the Dunning-Kruger effect. People in this stage are aware of the limits of their knowledge and skills, and thus, don’t overestimate their abilities any longer.</p>
</li>
</ol>
<p><strong>What impact does it have on our life?</strong></p>
<p>The effect of Dunning-Kruger can be seen in many different aspects of our daily lives, including work, school, relationships, and even politics.</p>
<p>It can lead to people forming attitudes and beliefs that are inaccurate and oftentimes, unsafe. As a result, the inaccurate assumptions made by people in this stage can have very real consequences on the lives of others.</p>
<p><strong>How to Overcome Dunning-Kruger Effect?</strong></p>
<p>The best way to overcome the Dunning-Kruger Effect is to recognize that you may not know as much as you think you do. Make sure to stay humble and open-minded, and strive to become an expert in your chosen field.</p>
<p>Additionally, be aware of your skills and how you can improve them. Invest in yourself and take feedback constructively. Finally, be wary of those who appear to be highly skilled and knowledgeable but don’t want to admit their flaws or gaps in knowledge.</p>
<p>The Dunning-Kruger Effect is an interesting phenomenon that is worth taking notice of! Be sure to recognize it when you come across it and work to overcome it.</p>
<h2 id="heading-imposter-syndrom">Imposter syndrom</h2>
<p>Do you ever feel like you don't know quite enough to succeed like you're an impostor? If you do, you're not alone! Imposter Syndrome is a phenomenon where, despite their accomplishments and abilities, an individual doubts their skills, intelligence, and accomplishments, attributing any success to luck rather than actual merit.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1675848898801/27f01774-1fba-4578-9729-6d059393f00e.png" alt class="image--center mx-auto" /></p>
<p>Imposter Syndrome can have a major impact on your work. People suffering from it may:</p>
<ul>
<li><p>experience heightened levels of stress, anxiety and depression</p>
</li>
<li><p>irrationally second-guess their accomplishments</p>
</li>
<li><p>place unrealistically high expectations on themselves</p>
</li>
<li><p>procrastinate out of fear of failure</p>
</li>
<li><p>avoid taking on new challenges</p>
</li>
<li><p>find it difficult to receive and accept compliments</p>
</li>
<li><p>have difficulty delegating tasks to others</p>
</li>
</ul>
<p>Recognizing Imposter Syndrome can be difficult, as it often manifests as personal feelings of inadequacy or insecurity. Here are some of the tell-tale signs:</p>
<ul>
<li><p>Comparing oneself to others, feeling they are not as smart, talented, or qualified</p>
</li>
<li><p>Having an irrational fear of making mistakes</p>
</li>
<li><p>Avoiding taking credit for achievements and praise</p>
</li>
<li><p>Isolating oneself out of fear of being exposed as an impostor</p>
</li>
<li><p>Needing to be “perfect”</p>
</li>
</ul>
<p>Imposter Syndrome is closely related to the Dunning-Kruger effect, which suggests people with low expertise may overestimate their ability, while those with high expertise may underestimate it out of self-doubt. This can lead people with high levels of intelligence to suffer from Imposter Syndrome, as they are more aware of the complexities of a situation and feel their actual understanding is lacking.</p>
<p>A key way to combat Imposter Syndrome is to develop concise self-affirmations, focusing on what you have achieved and can do. It can also be beneficial to see a therapist who can help you address the underlying feelings of insecurity that lead to the Imposter Syndrome and learn more efficient ways of problem-solving.</p>
<p>If you think you may be suffering from Imposter Syndrome, don’t be embarrassed to seek help. Many excellent professionals can help guide you toward a solution.</p>
<h2 id="heading-egoless-programming">Egoless programming</h2>
<p>Egoless programming is all about de-coupling the developer from their code, acknowledging that even the best developer can produce code that requires improvement.</p>
<p>When it comes to the review process, a critic should be seen as someone who has a higher opinion of us and our capabilities. That’s why if a review comes back and says we can do better, it should be taken as a sign that the reviewer thinks we are capable of even more greatness.</p>
<p>No matter how talented we are, there will come days when our code isn’t as great as other times. This is completely normal and doesn’t take away from the developer’s talent, nor implies that they are not a great coder.</p>
<p>Egoless coding is all about embracing this cycle of highs and lows, dissociating ourselves from how well a particular piece of code works.</p>
<p>It may be tough at first: we all get attached to our hard work. But once we learn to accept and move on from our less-than-perfect code, it can be liberating and help boost our self-confidence.</p>
<p>So whether we are coding for the first time or an experienced coder, egoless coding is a great practice to cultivate. And who knows, it may just help make us better developers in the long run.</p>
<h2 id="heading-my-plan-for-the-future">My plan for the future</h2>
<h3 id="heading-know-you-are-more-than-one-skill">Know you are more than one skill</h3>
<p>We all have that one core skill that defines us: developer, manager, designer, researcher, etc. We use this as a label for ourselves to make it easier for us to focus on and get better at what we are doing.</p>
<p>However, this can quickly spiral into Imposter Syndrome. We tell ourselves that if we aren't perfect at this one skill, then we don't belong in our profession.</p>
<p>It's time to take a step back and reassess our definition of ourselves. Instead of seeing ourselves as one big skill, we need to break it down into its most basic components. For developers, this could mean taking a look at the individual programming languages and related technologies they know, as well as their software craftsmanship, testing, and debugging abilities.</p>
<p>Assessing our level of proficiency in each component of our core skill can help us more accurately gauge how skilled we are at our profession. It also allows us to more effectively focus on the areas where we need to do better, rather than putting all the onus on ourselves concerning the "one" skill.</p>
<p>In short, don't box yourself into one core quality – think of yourself in terms of all the individual components that make up your career. Assessing yourself on a more granular level can help to lift the sense of pressure and Imposter Syndrome we experience.</p>
<h3 id="heading-know-where-you-are">Know where you are</h3>
<p>So, how do we identify our skill level and locate ourselves on the Dunning-Kruger Path? A great place – and potentially the easiest – to start is by asking our colleagues for their honest opinion of our capability. This is by no means the only way, but by contrasting our point of view with theirs, it is much easier to identify our place on the path.</p>
<p>If you view yourself as highly capable in certain areas, yet your peers do not, you may be on the mountain of the Dunning-Kruger Path. If you view yourself as having very little ability in certain areas, but your colleagues think otherwise, you may well be in the valley.</p>
<p>The important thing to remember is that there is no harm in being on the mountain, as it means that you have room to progress and develop further.</p>
<p>Identifying your place on the Dunning-Kruger Path is a vital step in improving your sense of self-worth and developing the skills necessary to be the best at what you do. So, don’t be afraid to ask your colleagues for help – you must put your ego aside and recognize the role others can play in helping you improve.</p>
<h3 id="heading-know-what-you-need-to-know">Know what you need to know</h3>
<p>It can be daunting when you're suddenly asked to take on a new role like managing a team that is far more competent or experienced in certain fields than you. You might be feeling like a fraud and wondering why you are even there and if you can do the job justice.</p>
<p>But don't panic! Just remember that every position requires a different type of skill set and you don't necessarily have to be the best technically to lead the team. After all, no one expects a football coach to be able to play better than the team. They just have to have specific qualities and abilities to enable them to coach the team and help them reach their full potential.</p>
<p>It's about finding the relevant skills you have that make you an ideal candidate for the job. A good manager can lead the team by setting clear direction, delegating tasks and providing support when needed. Yes, there may be competencies and areas of expertise that the team holds that you lack. However, this doesn't necessarily mean that you can't be a great manager.</p>
<p>You don't simply have to replicate the same skills and knowledge as your team. Leaders should be willing to embrace new mindsets and develop serviceable skills. Building communication and relationships are also essential to being a successful manager.</p>
<p>Taking on any new role is never easy and having to manage a team made up of experienced experts can be nerve-racking. But by acknowledging the skills that you have and learning the ones that you don't, you can be more confident in your ability to make a positive impact in the new role.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Recognizing our own cognitive biases is essential to our lives and work. By being mindful of the possibility that our views may be clouded by preconceived notions, we can begin to make decisions more consciously. While we can never entirely remove the influence of bias from our decisions, by understanding the nature of our biases, we can learn to live with them and make the best decisions possible.</p>
]]></content:encoded></item><item><title><![CDATA[Javazone 2022]]></title><description><![CDATA[Finally back to Javazone!!! Biggest java event in Norway, 2 days (3 if you have workshop tickets), amazing speakers, crazy organisation, inspiring community!
I was there in 2019 for my first time and I was focusing on tech talks only. But this time, ...]]></description><link>https://iwtyo.today/javazone-2022</link><guid isPermaLink="true">https://iwtyo.today/javazone-2022</guid><category><![CDATA[conference]]></category><category><![CDATA[2022]]></category><category><![CDATA[javazone]]></category><category><![CDATA[Oslo]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Fri, 09 Sep 2022 12:11:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1662725819337/CrSvwMcHs.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Finally back to <a target="_blank" href="https://2022.javazone.no/#/">Javazone</a>!!! Biggest java event in Norway, 2 days (3 if you have workshop tickets), amazing speakers, crazy organisation, inspiring community!</p>
<p>I was there in 2019 for my first time and I was focusing on tech talks only. But this time, with current stressful context (COVID, war, Global warming, inflation), I also wanted to join some soft skill talks, to listen to people that share my interrogations, how they handle them, what are their conclusion on their action, etc.</p>
<h2 id="heading-soft-skill-talks">Soft skill talks</h2>
<h3 id="heading-my-career-pathhttps2022javazonenoprogramecada2e9-b0b1-466d-8f5d-5ceaf38e50d5"><a target="_blank" href="https://2022.javazone.no/#/program/ecada2e9-b0b1-466d-8f5d-5ceaf38e50d5">My career path</a></h3>
<p>During this talk, if I have to remember only one thing is that an engineer is not a junior manager!!!
Don't let them tell you that the only step after senior engineer is manager!
There are other way to stay in engineer world:</p>
<ul>
<li>staff engineer,</li>
<li>principal engineer,</li>
<li>distinguished engineer.</li>
</ul>
<p>I will try to also keep in mind that a career is not a straight line and it is ok and normal to take turns, to come back, to jump over, to take a break, to focus on where we are.</p>
<h3 id="heading-my-mental-healthhttps2022javazonenoprogram2ddbb85c-f8d5-4287-b3d9-902c2d30c5fb"><a target="_blank" href="https://2022.javazone.no/#/program/2ddbb85c-f8d5-4287-b3d9-902c2d30c5fb">My mental health</a></h3>
<p>This talk was mind blowing : I knew all, all was common sense, I apply nothing in my life!
We all see those position in LinkedIn:</p>
<blockquote>
<p>Search full stack senior engineer, DevOps, Java, Python, C#, React, Angular, Kubernetes, Docker, AWS, Azure, Google cloud, worked with high performance / distributed / critical systems, wrote 2 books, involved in community, amazing social skills, mentor, climb, sporty, speak 10 languages.</p>
</blockquote>
<p>When this is the norm in our profession, one tends to overwork to learn all those things, do all those things, in hope to reach this Graal position!!! Until burnout. </p>
<p>So now, I will try to apply few of his advices to release the pressure on my mind and enjoy who I am as an engineer, enjoy learning to grow as en engineer.</p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>Those 2 talks were the only one I followed. They either learned me new things, or make me realise I don't apply to myself what I would recommend other people to do. I think we are an industry focused on tech and evolutions and sometimes, to take a step back to focus on ourself is vital for our future.</p>
<p>There were more during the event and I will watch them also for sure when they are available on youtube.</p>
<h2 id="heading-pure-tech-talks">Pure tech talks</h2>
<p>I chose tech talks mostly based on the stack I am working on:</p>
<ul>
<li>Java (Quarkus / Spring) in backend</li>
<li>MySQL, Neo4J, Redis, S3 for the data</li>
<li>React in frontend</li>
<li>Event-driven (Kafka, RabbitMQ)</li>
<li>Rest, gRPC</li>
<li>TDD (JUnit 5), Acceptance tests (Cucumber), Performance (k6)</li>
<li>Docker, Kubernetes</li>
<li>Gitlab, Whitesource, Sonar</li>
<li>AWS</li>
</ul>
<p>The goals were:</p>
<ul>
<li>to (un)validate the way we use those techs</li>
<li>to learn how to fully use those techs</li>
<li>to learn about the future of those techs</li>
<li>to learn about alternatives to those techs</li>
</ul>
<h3 id="heading-event-decision-drivenhttps2022javazonenoprogramec02e188-684b-4892-83b6-4014b4b02272"><a target="_blank" href="https://2022.javazone.no/#/program/ec02e188-684b-4892-83b6-4014b4b02272"> Event / Decision driven</a></h3>
<p>During this talk, I learned that instead of event driven architecture, we should call it decision driven architecture. The reason behind that is that your process listen to event, but the decision you take based on the event is the logic of your process.</p>
<p>I also learned how to "recover" or "redo" a list of events. You can either replay all the events from a certain time but it can also be worth it to generate snapshots and fetch this snapshot and only replay the list of events from this snapshot.
In our stack, we are doing the snapshot manually while we could move this task to our Kafka for example.</p>
<p>To make it simple : our way of thinking is correct, our implementation could be improved.</p>
<h3 id="heading-k6-not-only-for-resthttps2022javazonenoprogram3ac1dbc9-d768-4a90-87e3-7e74dab70f6a"><a target="_blank" href="https://2022.javazone.no/#/program/3ac1dbc9-d768-4a90-87e3-7e74dab70f6a">K6 not only for REST</a></h3>
<p>In our stack, we have different type of exchange between each elements:</p>
<ul>
<li>REST</li>
<li>gRPC</li>
<li>Kafka</li>
<li>Database</li>
</ul>
<p>At the moment, we only run automatic performance tests on our REST layer. With k6, we can also do performance test on other layer of our application like gRPC (not for the stream), Kafka, DB.
We could easily implement tests on those layer to validate:</p>
<ul>
<li>our configuration like topic replication, partitioning, ...</li>
<li>our configuration in terms of setup : CPU, memory, network</li>
<li>calculate our burst limit for each component of our stack</li>
</ul>
<p>One final step would be to have those results pushed to Grafana, and of course, there is a plugin for that</p>
<h3 id="heading-grpc-vs-resthttps2022javazonenoprogram974685d0-fd4a-4466-8d09-7d0aea9820ad"><a target="_blank" href="https://2022.javazone.no/#/program/974685d0-fd4a-4466-8d09-7d0aea9820ad">gRPC vs REST</a></h3>
<p>This talk is great for someone doing REST api, and wondering what is gRPC about. I like the approach that gRPC is not there to replace REST everywhere but can solve performance issue in term of (de)serialisation created by json format, is recommended for backend to backend communication (who need a REST with JSON in backend to backend... ok I have a lot of those...)</p>
<p>So something we have to change in our stack, or start to apply in our future development. </p>
<h3 id="heading-release-note-changeloghttps2022javazonenoprogram94a7f915-16cb-444d-8d37-968ea2f4c0d7"><a target="_blank" href="https://2022.javazone.no/#/program/94a7f915-16cb-444d-8d37-968ea2f4c0d7">Release note / Changelog</a></h3>
<p>During this presentation, we have seen the whole process between :</p>
<ul>
<li>I have a new version</li>
<li>Consumers use this new version</li>
</ul>
<p>This process will contain several steps like creating the release version, make it available, create a release note / changelog, package the new version (homebrew, sdkman,...), notify users (slack, emails, ...) and all that with only a configuration file.</p>
<p>At my level, the release note / changelog is something that we have to implement for several reason:</p>
<ul>
<li>in an 2 week sprint tempo, with a microservices stack, it is difficult to know what is deployed.</li>
<li>in case of a rollback on a service is needed, we know to which state we go back and what are the feature not deployed (an thus the impact of the rollback on the rest of the stack)</li>
<li>easier communication with the rest of the team / consumer of the services.</li>
</ul>
<h3 id="heading-apocalypse-nowhttps2022javazonenoprogramddc4c425-9a4a-44d9-9d88-59a6b29bf87f"><a target="_blank" href="https://2022.javazone.no/#/program/ddc4c425-9a4a-44d9-9d88-59a6b29bf87f">Apocalypse Now</a></h3>
<p>This presentation rings a bell. Recently we had some strange behaviour on our system, and tech support didn't managed to solve it by themself:</p>
<ul>
<li>lack of documentation</li>
<li>lack of training</li>
</ul>
<p>Our documentation is written by us, developers, people who know about our system. It obviously contains shortcuts in the explanations, misses several why / who / how / when / what details, is tested by us only.</p>
<p>Where does it lead us to ? A disaster!!!! (or a Sunday morning call from tech support). A shame as we have the knowledge but failed to share it. The recommendation to prevent this is to do regular training by putting people in front line in a fire situation and see how well they perform with all the information / documentation they have or can find and take action from there!</p>
<p>We are a software company, with a passion for games, board games, video games. I would like to introduce to test our processes in a "fun and interesting" way : a Dungeon &amp; Dragons about our apocalypse!!!</p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>I went to other talks that did not trigger any alarm for me but the list above are talks that even a tiny part of them made me realise that I am missing something, that I could do something in a better way, that I could use some tools their limits. </p>
<h2 id="heading-conclusion-on-javazone">Conclusion on Javazone</h2>
<p>I learned a lot in both tech and soft skill and now I have the responsibility to share them with my team and see what we can take, what we can plan, and see if we can grow from it until next Javazone!!!!</p>
]]></content:encoded></item><item><title><![CDATA[Today I learned how to test Kafka integration in Quarkus app]]></title><description><![CDATA[When you start working with Quarkus, you discover the magic of dev services! 
If you have an application that use Kafka, a database, RabbitMQ, Redis, ... (full list  here ), then if you don't have some properties set for dev and test profile like bro...]]></description><link>https://iwtyo.today/today-i-learned-how-to-test-kafka-integration-in-quarkus-app</link><guid isPermaLink="true">https://iwtyo.today/today-i-learned-how-to-test-kafka-integration-in-quarkus-app</guid><category><![CDATA[Java]]></category><category><![CDATA[kafka]]></category><category><![CDATA[Docker]]></category><dc:creator><![CDATA[Sébastien NOIROT]]></dc:creator><pubDate>Tue, 30 Nov 2021 08:28:38 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1638261122244/kYJOXjMNx.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When you start working with Quarkus, you discover the magic of dev services! 
If you have an application that use Kafka, a database, RabbitMQ, Redis, ... (full list  <a target="_blank" href="https://quarkus.io/guides/dev-services">here</a> ), then if you don't have some properties set for dev and test profile like broker, url, ... Quarkus will start a dev service using  <a target="_blank" href="https://www.testcontainers.org/">Test Containers</a>.</p>
<p>You get crazy, code as much as integration test as you can, it is so easy and finally push to your favourite CI/CD pipeline.</p>
<p>And now everything is red in your test job!!! Whyyyyy??? Well, your sys admin removed the dind from the runners... Yes using dind can create a security breach in your pipeline...</p>
<p>Of course they tell you that you can start a service (gitlab services for example) and plug your tests on it but you want it to work locally so having to start (maintain) a container, inject the correct urls, be sure to clean / setup the content properly,... no thanks.</p>
<p><strong>We want to have something inside of the code. </strong></p>
<p>We will see how to setup your Kafka cluster inside of your integration tests.</p>
<h2 id="heading-create-a-quarkus-project">Create a Quarkus project</h2>
<p>Let's go to https://code.quarkus.io/, create a new project with those dependencies:</p>
<ul>
<li>SmallRye Reactive Messaging</li>
<li>SmallRye Reactive Messaging - Kafka Connector</li>
</ul>
<p>Now let's remove the classes generated (in main and test) and the META-INF</p>
<p>Create a new service KafkaService:</p>
<pre><code class="lang-java"><span class="hljs-keyword">import</span> io.smallrye.mutiny.Multi;
<span class="hljs-keyword">import</span> java.time.Duration;
<span class="hljs-keyword">import</span> javax.enterprise.context.ApplicationScoped;
<span class="hljs-keyword">import</span> org.eclipse.microprofile.reactive.messaging.Incoming;
<span class="hljs-keyword">import</span> org.eclipse.microprofile.reactive.messaging.Message;
<span class="hljs-keyword">import</span> org.eclipse.microprofile.reactive.messaging.Outgoing;
<span class="hljs-keyword">import</span> org.jboss.logging.Logger;

<span class="hljs-meta">@ApplicationScoped</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">KafkaService</span> </span>{

  <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Logger LOGGER = Logger.getLogger(KafkaService.class);

  <span class="hljs-meta">@Outgoing("demo-kafka-out")</span>
  <span class="hljs-keyword">public</span> Multi&lt;Message&lt;String&gt;&gt; produceData() {
    <span class="hljs-keyword">return</span> Multi.createFrom().ticks().every(Duration.ofSeconds(<span class="hljs-number">1</span>))
        .map(tick -&gt; Message.of(<span class="hljs-string">"SmallRye Hello "</span> + tick));
  }

  <span class="hljs-meta">@Incoming("demo-kafka-in")</span>
  <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">consumeData</span><span class="hljs-params">(String message)</span> </span>{
    LOGGER.infov(<span class="hljs-string">"Message received {0}"</span>, message);
  }
}
</code></pre>
<p>We have a simple example with one producer that will push every second a message and one consumer that will log this message.</p>
<p>We have to set the properties:</p>
<pre><code class="lang-properties">mp.messaging.outgoing.demo-kafka-out.connector=smallrye-kafka
mp.messaging.incoming.demo-kafka-in.connector=smallrye-kafka
mp.messaging.outgoing.demo-kafka-out.topic=demo-kafka
mp.messaging.incoming.demo-kafka-in.topic=demo-kafka
mp.messaging.outgoing.demo-kafka-out.value.serializer=org.apache.kafka.common.serialization.StringSerializer
mp.messaging.incoming.demo-kafka-in.value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
</code></pre>
<p>Create a new empty test from KafkaService:</p>
<pre><code class="lang-java"><span class="hljs-keyword">package</span> com.snoirot;

<span class="hljs-keyword">import</span> io.quarkus.test.junit.QuarkusTest;
<span class="hljs-keyword">import</span> org.junit.jupiter.api.Test;

<span class="hljs-meta">@QuarkusTest</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">KafkaServiceTest</span> </span>{

  <span class="hljs-meta">@Test</span>
  <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testKafkaService</span><span class="hljs-params">()</span> </span>{

  }
}
</code></pre>
<p>So if we run this test, our test will be green and we can see some docker logs:
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1638258755591/uHMrqXhcz.png" alt="Docker trace" /></p>
<h2 id="heading-test-without-dev-service">Test without dev service</h2>
<p>First thing, we have to tell Quarkus to not use dev services but only for test profile:</p>
<pre><code class="lang-properties">%test.quarkus.kafka.devservices.enabled=false
</code></pre>
<p>If I run the test again, there is no docker logs anymore and we have a message saying that the connection to broker could not be etablished.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1638258948558/CgVu9TO2p.png" alt="No docker trace" /></p>
<h2 id="heading-setup-quarkustestresourcelifecyclemanager">Setup QuarkusTestResourceLifecycleManager</h2>
<p>Now we have to start a Kafka at the beginning of our test.</p>
<p>To do that, we will use  <a target="_blank" href="https://quarkus.io/guides/getting-started-testing#quarkus-test-resource">QuarkusTestResourceLifecycleManager</a> </p>
<p>We will create a KafkaTestResource that will implement QuarkusTestResourceLifecycleManager and start a Kafka broker there.</p>
<p>We need two dependencies that will contains the Kafka broker:</p>
<pre><code class="lang-xml">    <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>com.salesforce.kafka.test<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>kafka-junit5<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>3.2.3<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">scope</span>&gt;</span>test<span class="hljs-tag">&lt;/<span class="hljs-name">scope</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.apache.kafka<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>kafka_2.12<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>2.8.0<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">scope</span>&gt;</span>test<span class="hljs-tag">&lt;/<span class="hljs-name">scope</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
</code></pre>
<p>Now we can create KafkaTestResource:</p>
<pre><code class="lang-java">
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">KafkaTestResource</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">QuarkusTestResourceLifecycleManager</span> </span>{

  <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Logger LOGGER = Logger.getLogger(KafkaTestResource.class);

  <span class="hljs-keyword">private</span> SharedKafkaTestResource sharedKafkaTestResource;

  <span class="hljs-meta">@Override</span>
  <span class="hljs-function"><span class="hljs-keyword">public</span> Map&lt;String, String&gt; <span class="hljs-title">start</span><span class="hljs-params">()</span> </span>{
    sharedKafkaTestResource = <span class="hljs-keyword">new</span> SharedKafkaTestResource().withBrokers(<span class="hljs-number">3</span>)
        .withBrokerProperty(<span class="hljs-string">"auto.create.topics.enable"</span>, <span class="hljs-string">"true"</span>);

    <span class="hljs-keyword">try</span> {
      sharedKafkaTestResource.beforeAll(<span class="hljs-keyword">null</span>);
    } <span class="hljs-keyword">catch</span> (Exception e) {
      LOGGER.error(<span class="hljs-string">"Error starting kafka broker"</span>, e);
    }
    <span class="hljs-keyword">return</span> Map.of( <span class="hljs-string">"kafka.bootstrap.servers"</span>, sharedKafkaTestResource.getKafkaConnectString());
  }

  <span class="hljs-meta">@Override</span>
  <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">stop</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">if</span> (sharedKafkaTestResource != <span class="hljs-keyword">null</span>) {
      sharedKafkaTestResource.afterAll(<span class="hljs-keyword">null</span>);
    }
  }
}
</code></pre>
<p>This SharedKafkaTestResource would normally be used as an extension in Unit Tests with JUnit 5:</p>
<pre><code class="lang-java"><span class="hljs-meta">@RegisterExtension</span>
    <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> SharedKafkaTestResource sharedKafkaTestResource = <span class="hljs-keyword">new</span> SharedKafkaTestResource()
        .withBrokers(<span class="hljs-number">1</span>)
        .withBrokerProperty(<span class="hljs-string">"auto.create.topics.enable"</span>, <span class="hljs-string">"true"</span>);
</code></pre>
<p>and it will call the beforeAll to start the cluster and afterAll to stop it.</p>
<p>As I want to have an Integration Test, I have to call those methods myself.</p>
<p>This KafkaTestResource will return a map that will override the config map:</p>
<pre><code class="lang-java"><span class="hljs-keyword">return</span> Map.of( <span class="hljs-string">"kafka.bootstrap.servers"</span>, sharedKafkaTestResource.getKafkaConnectString());
</code></pre>
<p>It is really useful as the port of the broker is not fixed.</p>
<p>Now i just have to call this resource from my test:</p>
<pre><code class="lang-java"><span class="hljs-meta">@QuarkusTest</span>
<span class="hljs-meta">@QuarkusTestResource(value = KafkaTestResource.class, restrictToAnnotatedClass = true)</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">KafkaServiceTest</span> </span>{
`
</code></pre>
<p>I recommend to use restrictToAnnotatedClass in case you have several Integration Tests.</p>
<p>Let's run the test. I see some exception about some module. I will just add this arguments to my test:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1638259890806/LEtSjBmJ6.png" alt="Module error stack" /></p>
<pre><code>--<span class="hljs-keyword">add</span>-opens java.<span class="hljs-keyword">base</span>/java.lang=ALL-UNNAMED
</code></pre><p>Let's run the test again and see that the Kafka is started.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1638260044431/QoDUnXCWD.png" alt="Start of kafka" /></p>
<h2 id="heading-create-a-test">Create a test</h2>
<p>To create a test, I will use Mockito and Awaitility:</p>
<pre><code class="lang-xml">     <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.awaitility<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>awaitility<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>4.1.1<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">scope</span>&gt;</span>test<span class="hljs-tag">&lt;/<span class="hljs-name">scope</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>io.quarkus<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>quarkus-junit5-mockito<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">scope</span>&gt;</span>test<span class="hljs-tag">&lt;/<span class="hljs-name">scope</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
</code></pre>
<p>NB : We can remove quarkus-junit5 dependency as it is included into quarkus-junit5-mockito</p>
<p>For my test, I will inject a Spy of my KafkaService and see if there is some call of consumeData which will mean my integration is working.</p>
<pre><code class="lang-java"><span class="hljs-keyword">import</span> <span class="hljs-keyword">static</span> org.awaitility.Awaitility.await;

<span class="hljs-keyword">import</span> io.quarkus.test.common.QuarkusTestResource;
<span class="hljs-keyword">import</span> io.quarkus.test.junit.QuarkusTest;
<span class="hljs-keyword">import</span> io.quarkus.test.junit.mockito.InjectSpy;
<span class="hljs-keyword">import</span> java.time.Duration;
<span class="hljs-keyword">import</span> org.junit.jupiter.api.Test;
<span class="hljs-keyword">import</span> org.mockito.Mockito;

<span class="hljs-meta">@QuarkusTest</span>
<span class="hljs-meta">@QuarkusTestResource(value = KafkaTestResource.class, restrictToAnnotatedClass = true)</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">KafkaServiceTest</span> </span>{

  <span class="hljs-meta">@InjectSpy</span>
  KafkaService kafkaService;

  <span class="hljs-meta">@Test</span>
  <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">testKafkaService</span><span class="hljs-params">()</span> </span>{

    <span class="hljs-keyword">var</span> startTime = System.currentTimeMillis();
    await().atMost(Duration.ofSeconds(<span class="hljs-number">10</span>)).until(() -&gt; System.currentTimeMillis() - startTime &gt; <span class="hljs-number">9000</span>);

    Mockito.verify(kafkaService, Mockito.atLeastOnce()).consumeData(Mockito.anyString());
  }
}
</code></pre>
<p>I use the await to wait 9 seconds as it can take time before the consumer get registered from the cluster.</p>
<p>I run the test, everything is green!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1638260585133/f9nCtw7Ys.png" alt="Test passing" /></p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>We have seen that we can start a Kafka cluster inside our Integration Tests using  <a target="_blank" href="https://github.com/salesforce/kafka-junit/tree/master/kafka-junit5">kafka-junit5</a> and a bit of imagination.</p>
<p>I recommend you to go read their github so you can create more complex Integration Tests in the future!</p>
]]></content:encoded></item></channel></rss>