<?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" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[The Weekend Developer]]></title><description><![CDATA[A dose of motivation and resources to help you on your journey to becoming a professional software developer]]></description><link>https://weekendprogrammer.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!Uv-U!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b349647-4112-4a10-96ee-58e4fb923ce6_500x500.png</url><title>The Weekend Developer</title><link>https://weekendprogrammer.substack.com</link></image><generator>Substack</generator><lastBuildDate>Mon, 08 Jun 2026 22:12:08 GMT</lastBuildDate><atom:link href="https://weekendprogrammer.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Dishit Devasia]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[weekenddeveloper@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[weekenddeveloper@substack.com]]></itunes:email><itunes:name><![CDATA[Dishit Devasia]]></itunes:name></itunes:owner><itunes:author><![CDATA[Dishit Devasia]]></itunes:author><googleplay:owner><![CDATA[weekenddeveloper@substack.com]]></googleplay:owner><googleplay:email><![CDATA[weekenddeveloper@substack.com]]></googleplay:email><googleplay:author><![CDATA[Dishit Devasia]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The Real Reason You’re Getting Rejected in Tech Interviews (It’s Not Your Skills)]]></title><description><![CDATA[It&#8217;s not what you know, it&#8217;s how you explain it. Discover the missing link between your experience and your next job offer.]]></description><link>https://weekendprogrammer.substack.com/p/the-real-reason-youre-getting-rejected</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/the-real-reason-youre-getting-rejected</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Fri, 16 May 2025 20:24:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!6d23!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4361d5b-662d-4408-8797-1ce1d1415c8d_1910x1276.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128075;<em> Hi, this is <a href="https://www.linkedin.com/in/dishitdevasia/">Dishit</a> with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.</em></p><p><strong>&#128680; </strong><em><strong>Announcement</strong></em><strong> &#128680;<br></strong><em>Join me for the upcoming <strong>free live workshop</strong> where I will go deep into developing your interview skills.</em></p><p><strong><a href="https://www.eventbrite.com/e/3-interview-mistakes-devs-and-qa-engineers-make-that-sabotage-interviews-tickets-1351039468419?aff=oddtdtcreator">&#8220;3 Interview Mistakes Devs and QA Engineers Make That Sabotage Interviews (And How to Fix Them Fast)&#8221;</a></strong><a href="https://www.eventbrite.com/e/3-interview-mistakes-devs-and-qa-engineers-make-that-sabotage-interviews-tickets-1351039468419?aff=oddtdtcreator">.</a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.eventbrite.com/e/3-interview-mistakes-devs-and-qa-engineers-make-that-sabotage-interviews-tickets-1351039468419?aff=oddtdtcreator&quot;,&quot;text&quot;:&quot;Register Now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.eventbrite.com/e/3-interview-mistakes-devs-and-qa-engineers-make-that-sabotage-interviews-tickets-1351039468419?aff=oddtdtcreator"><span>Register Now</span></a></p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6d23!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4361d5b-662d-4408-8797-1ce1d1415c8d_1910x1276.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6d23!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4361d5b-662d-4408-8797-1ce1d1415c8d_1910x1276.jpeg 424w, https://substackcdn.com/image/fetch/$s_!6d23!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4361d5b-662d-4408-8797-1ce1d1415c8d_1910x1276.jpeg 848w, https://substackcdn.com/image/fetch/$s_!6d23!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4361d5b-662d-4408-8797-1ce1d1415c8d_1910x1276.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!6d23!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4361d5b-662d-4408-8797-1ce1d1415c8d_1910x1276.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6d23!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4361d5b-662d-4408-8797-1ce1d1415c8d_1910x1276.jpeg" width="1456" height="973" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d4361d5b-662d-4408-8797-1ce1d1415c8d_1910x1276.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:973,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:90736,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://weekendprogrammer.substack.com/i/163508729?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4361d5b-662d-4408-8797-1ce1d1415c8d_1910x1276.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6d23!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4361d5b-662d-4408-8797-1ce1d1415c8d_1910x1276.jpeg 424w, https://substackcdn.com/image/fetch/$s_!6d23!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4361d5b-662d-4408-8797-1ce1d1415c8d_1910x1276.jpeg 848w, https://substackcdn.com/image/fetch/$s_!6d23!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4361d5b-662d-4408-8797-1ce1d1415c8d_1910x1276.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!6d23!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4361d5b-662d-4408-8797-1ce1d1415c8d_1910x1276.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><p>You&#8217;ve spent years building your skills.</p><p>You&#8217;ve put in the late nights, the weekends, the debugging marathons. You&#8217;ve solved real problems, learned new tech, and stayed ahead of the curve.</p><p>But when it comes to interviews?</p><p>You feel stuck.</p><p>You give answers you <em>know</em> are technically sound. You talk about the work you&#8217;ve done. You try to be clear and confident.</p><p>And yet, the rejections keep coming.</p><p>Sometimes you get ghosted.</p><p>Sometimes you get told someone else was a &#8220;better fit.&#8221;</p><p>But deep down, you know the truth:</p><p>It&#8217;s not because you&#8217;re not good enough.</p><p>It&#8217;s because your answers did not resonate with the answers interviewers were expecting.</p><p>And that&#8217;s the part no one teaches you.</p><p>How to explain your thinking?</p><p>How do you tell the story behind your code without missing technical details?</p><p>How do you show value without sounding like you&#8217;re bragging or reciting from a textbook?</p><p>The worst part?</p><p>If you don&#8217;t fix this, you could stay stuck here.</p><p>Interview after interview. Job after job.</p><p>Watching less experienced people land roles you deserve.</p><p>Not because they&#8217;re smarter. But because they know how to talk like someone who belongs.</p><p>In this post, you&#8217;ll discover the three silent mistakes most developers and QA engineers make in interviews and how to fix them fast. Before they quietly kill your next opportunity, too.</p><h3>Mistake 1: Not doing the right type of preparation</h3><p>Most people focus on learning the technical details they may not know or trying to brush up on some areas they might have forgotten.</p><p>However, very few people focus on what they have put in their resumes. </p><p>One key question is, "Give me a brief overview of yourself." This is one of the first questions and is almost always given in most interviews.</p><p>Many people do not prepare for it. Some give a summary that tells nothing more than a CV, while others, still focused on remembering things they might get asked, ramble on without a beginning or ending.</p><p>Other common questions are likely to be asked, and it is better to prepare for them so that you can make a powerful impression.</p><p>Some of them include:</p><ul><li><p>What are your strengths and weaknesses?</p></li><li><p>How do you overcome challenges at work?</p></li><li><p>What problems have you encountered in your past/current organisation?</p></li><li><p>What is one thing you do not like about your past/current organisation that you would like to improve?</p></li><li><p>How do you stay updated with technology advances?</p></li></ul><h3>Mistake 2: Treating the interview as a quiz instead of a conversation</h3><p>As an engineer, you will always want to showcase your technical knowledge. So it makes us answer the question as fast as possible. Sometimes, we don&#8217;t even wait for the interviewer to finish the question.</p><p>Now this has a few problems.</p><ol><li><p>It comes across as if you have memorised the answers. Competent people do not need to memorise the answers. They can pull the answer out of experience rather than memory.</p></li><li><p>The interviewer will feel that you have not listened to their questions completely, making the interviewer feel out of sync with you. You might come across as a person not open to listening.</p></li><li><p>With the focus on answering fast, you forget to provide the nuance that the answer might have. <br><br>The interviewer might assume that you are not aware of the nuance (which will kill your chances) or might ask follow-up questions, and you may or may not get the nuance that the interviewer was looking for.</p></li></ol><h3>Mistake 3:  Not referencing your answers with experience</h3><p>Interviewers want to know about you and your experience. So when you answer a technical question without referencing your experience, you are giving away the opportunity to talk about your deep technical knowledge.</p><p>The interviewer is not looking for the technical answer, whether you know it or not. </p><p>They are looking for your experience in solving the problem. </p><p>For example, consider the question: In Spring Boot, what is the difference between the @Controller and  @RestController annotations?<em><br><br></em>Now the answer is straightforward.</p><blockquote><p><em>@Controller is used to define a web controller that returns views (like JSP or Thymeleaf), while @RestController is a convenience annotation that combines @Controller and @ResponseBody, making it return JSON or XML directly from all methods by default. Use @RestController for APIs, and @Controller for web pages.</em></p></blockquote><p>But if you answer it with an example from your experience.</p><blockquote><p><em>@Controller is used to return a view and is typically used with something like Thymeleaf. I&#8217;ve used @RestController when building REST APIs. The nice thing is, I don&#8217;t need to add @ResponseBody to each method. It automatically converts the return value into JSON. So whenever I&#8217;m building a REST API, I just use @RestController.</em></p></blockquote><p>This gives your interviewer a perspective that you have worked on it and have not repeated some answers that you memorised.</p><h2>How to avoid these mistakes?</h2><p>To avoid these pitfalls, you need to understand the different buckets of questions.</p><h3>3 Question Buckets</h3><p>Most candidates focus heavily on technical questions when preparing for software engineering interviews. </p><p>However, interviewers evaluate you on more than just your coding ability. </p><p>Based on my 15+ years of experience and being on both sides of the table, I find it helpful to divide interview questions into&nbsp;<strong>three main buckets</strong>, each with its own subtypes and preparation strategies.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rzx6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff78b0c88-9ab5-49b5-87bb-d29023f35155_931x451.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rzx6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff78b0c88-9ab5-49b5-87bb-d29023f35155_931x451.png 424w, https://substackcdn.com/image/fetch/$s_!rzx6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff78b0c88-9ab5-49b5-87bb-d29023f35155_931x451.png 848w, https://substackcdn.com/image/fetch/$s_!rzx6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff78b0c88-9ab5-49b5-87bb-d29023f35155_931x451.png 1272w, https://substackcdn.com/image/fetch/$s_!rzx6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff78b0c88-9ab5-49b5-87bb-d29023f35155_931x451.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rzx6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff78b0c88-9ab5-49b5-87bb-d29023f35155_931x451.png" width="931" height="451" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f78b0c88-9ab5-49b5-87bb-d29023f35155_931x451.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:451,&quot;width&quot;:931,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:96892,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://weekendprogrammer.substack.com/i/163508729?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff78b0c88-9ab5-49b5-87bb-d29023f35155_931x451.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rzx6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff78b0c88-9ab5-49b5-87bb-d29023f35155_931x451.png 424w, https://substackcdn.com/image/fetch/$s_!rzx6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff78b0c88-9ab5-49b5-87bb-d29023f35155_931x451.png 848w, https://substackcdn.com/image/fetch/$s_!rzx6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff78b0c88-9ab5-49b5-87bb-d29023f35155_931x451.png 1272w, https://substackcdn.com/image/fetch/$s_!rzx6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff78b0c88-9ab5-49b5-87bb-d29023f35155_931x451.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>Common Interview Questions</h4><p>These questions aren&#8217;t meant to test your technical depth. They&#8217;re designed to understand <strong>your motivation, personality, and communication skills</strong>. </p><p>Often asked at the beginning of an interview, these questions help set the tone and offer the interviewer a glimpse into how you see yourself.</p><p><strong>Examples:</strong></p><ul><li><p>Tell me about yourself.</p></li><li><p>What are your strengths and weaknesses?</p></li><li><p>Why are you looking for a change?</p></li><li><p>Where do you see yourself in 5 years?</p></li></ul><h5>How to prepare?</h5><p>Create a draft of these answers and practice them before a camera. <br><br>Tweak answers as you feel the right words that work for you. </p><p>Once you have mastered it, the words will come naturally from you. </p><p>Your answer will become to the point, and you will deliver it with confidence that will make a good impression, especially with the first question: tell me about yourself.</p><h4>Technical Interview Questions</h4><p>This is the meat of most interviews, especially for engineering roles. But not all technical questions are created equal. You can further break them into&nbsp;<strong>three subtypes</strong>, each requiring a different mindset to approach them effectively.</p><h5>Fact-Based Questions - (Assessing Knowledge)</h5><p>These questions test your understanding of specific technologies, tools, or concepts. The answers are usually short and have a &#8220;correct&#8221; answer.</p><h5>Examples<strong>:</strong></h5><ul><li><p>What does @AutoConfiguration do in Spring Boot?</p></li><li><p>What is a RESTful API?</p></li><li><p>What&#8217;s the difference between HashMap and ConcurrentHashMap?</p></li></ul><h5>How to prepare?</h5><p>The trick here is to answer the question by adding scenarios you used in your experience. </p><p>If you have used it before, highlight specific examples of how you have used it and also talk about some of the challenges you have faced.</p><p>If you don&#8217;t have experience, answer the question and tell them you have never used it. </p><p>This prevents further questions about topics you might not know, and the interviewer will move towards a topic you are familiar with.</p><h5>Opinion-Based Questions (Assessing Preferences and Thought Process)</h5><p>Here, interviewers are interested in how you <strong>form opinions, make trade-offs, and justify your choices.</strong> There may be no single &#8220;correct&#8221; answer, but they want to see if your thinking is grounded and experience-driven.</p><h5>Examples<strong>:</strong></h5><ul><li><p>Do you prefer SQL or NoSQL databases? Why?</p></li><li><p>Would you introduce a new language like Python in a Java-heavy codebase?</p></li><li><p>What&#8217;s your take on using microservices vs. monoliths?</p></li></ul><h5>How to prepare?</h5><p>These are tricky, as you might not know if the interviewer dislikes one part of it. The idea is to provide your opinions and give examples if you have them.</p><p>You can also reference blogs if you don&#8217;t have enough proof of experience. </p><p>In either case, the critical piece is the ending. You finish it by saying your experience or learning limits your thoughts, and you are open to ideas that will help you learn better.</p><p>This helps you get pointers if the interviewers have strong opinions about it and also showcases that you are open to feedback and learning.</p><h5>Scenario-Based Questions (Assessing Application and Design Skills)</h5><p>These practical, open-ended questions test how you <strong>think through real-world problems</strong>, design systems, or debug tricky issues. They simulate the kind of challenges you&#8217;d face on the job.</p><p><strong>Examples:</strong></p><ul><li><p>You&#8217;re asked to build a REST API&#8212;what are the key things you&#8217;d consider?</p></li><li><p>How would you debug a slow-performing endpoint?</p></li><li><p>How would you handle consistency if multiple microservices need to share the cache?</p></li></ul><h4>Behavioural Questions (The Culture Fit Test)</h4><p>Behavioural questions assess <strong>how you work with others, deal with conflict, handle pressure, and grow from challenges</strong>. These are crucial for determining whether you&#8217;d fit the team and company culture well.</p><p><strong>Examples:</strong></p><ul><li><p>How do you handle tight deadlines?</p></li><li><p>What would you do if you&#8217;re blocked and not getting the needed information?</p></li><li><p>Tell me about when you received difficult feedback and how you handled it.</p></li></ul><h5>How to prepare?</h5><p>Similar to common interview questions, the questions are limited. So you can prepare well for these.</p><p>You need to use the STAR technique to answer these questions. If you can master this technique,  you can also answer your technical questions with this approach.</p><p>The benefit is that this approach makes you tell a story. The story might not be the best in the world, but it will be enough to hook the interviewer's attention. </p><p>It also gives the interviewer opportunities to ask questions, and since you are basing it on your experience, you will always be on firmer ground than with other questions.</p><p>The STAR framework provides structure:</p><ul><li><p><strong>S</strong>ituation: What was the context?</p></li><li><p><strong>T</strong>ask: What needed to be done?</p></li><li><p><strong>A</strong>ction: What did <em>you</em> do?</p></li><li><p><strong>R</strong>esult: What was the outcome?</p></li></ul><h2>Final Thoughts: Turn Preparation into Confidence</h2><p>If there&#8217;s one thing to take away from this, <strong>great interviews don&#8217;t begin in the interview room.</strong></p><p>They start with how you <strong>prepare.</strong></p><ul><li><p>Prepare answers to common and behavioural questions ahead of time&#8212;not to memorise, but to&nbsp;<strong>internalise</strong>.</p></li></ul><ul><li><p>Anchor your responses in your <strong>experience</strong>. That&#8217;s where your strengths live.</p></li></ul><ul><li><p>Use the <strong>STAR technique</strong> to draw out scenarios in advance. The more you practice these, the more naturally they&#8217;ll come to you when it matters.</p></li></ul><ul><li><p>Don&#8217;t just say your answers. <strong>Practice them on a video call</strong>. Record. Rewatch. Adjust. This one step alone can drastically improve how you come across.</p></li></ul><p>When you combine clear structure with authentic storytelling and real-world examples, your interviews feel less like an interrogation and more like a conversation you&#8217;re ready for.</p><h3><strong>Want help putting this into action?</strong></h3><p>Join me for the upcoming <strong>free live workshop</strong>:</p><p><strong><a href="https://www.eventbrite.com/e/3-interview-mistakes-devs-and-qa-engineers-make-that-sabotage-interviews-tickets-1351039468419?aff=oddtdtcreator">&#8220;3 Interview Mistakes Devs and QA Engineers Make That Sabotage Interviews (And How to Fix Them Fast)&#8221;</a></strong><a href="https://www.eventbrite.com/e/3-interview-mistakes-devs-and-qa-engineers-make-that-sabotage-interviews-tickets-1351039468419?aff=oddtdtcreator">.</a></p><p>I&#8217;ll discuss real-world examples, live breakdowns, and simple techniques you can use immediately.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Weekend Developer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Github Shortcut: How to Get Hired Without a "Perfect" Project?]]></title><description><![CDATA[Key Takeaways]]></description><link>https://weekendprogrammer.substack.com/p/the-github-shortcut-how-to-get-hired</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/the-github-shortcut-how-to-get-hired</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Tue, 18 Mar 2025 23:37:04 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/159365748/8532a4b82ff0042732d0ff64af05a8f5.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<h2><strong>Key Takeaways</strong></h2><p><strong>&#65279;&#65279;#1: Create a README Like a Solution Engineer</strong> (13:48)<br>&#65279;&#65279;Use your README to demonstrate your thought process, including solution diagrams, requirements, implemented features, and future enhancements. This showcases your problem-solving approach even before writing code.</p><p><strong>&#65279;&#65279;#2: Showcase Projects at Any Stage of Completion</strong> (18:22)<br>Even unfinished projects can demonstrate your skills - document implemented features separately from planned enhancements to show interviewers what you've accomplished and your forward-thinking approach.<br><br><strong>#3: Focus on the "Why" Behind Technical Decisions</strong> (22:47)<br>Clearly explain your design decisions and technology choices. Being able to articulate why you chose specific approaches demonstrates technical competence and helps differentiate your work from AI-generated code.</p><p>Here's the template link: <strong><a href="https://gitlab.com/dd.omniview/github-readme">https://gitlab.com/dd.omniview/github-readme</a></strong></p><p>For your reference, you can find other aweseome README templates you can use in your projects if your goal is to have more open-source contributions</p><ul><li><p><a href="https://www.makeareadme.com/">https://www.makeareadme.com/</a></p></li><li><p><strong><a href="https://github.com/matiassingers/awesome-readme">https://github.com/matiassingers/awesome-readme</a></strong></p></li></ul><p>If you have more questions or need more clarity on being a better software engineer, reply to this email with your thoughts. </p><p>Love to read about them.</p>]]></content:encoded></item><item><title><![CDATA[7 Things LeetCode Doesn’t Teach You About Software Development]]></title><description><![CDATA[AI can solve coding challenges&#8212;your real advantage lies in the skills LeetCode doesn&#8217;t teach. Here&#8217;s what you actually need to succeed.]]></description><link>https://weekendprogrammer.substack.com/p/7-things-leetcode-doesnt-teach-you</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/7-things-leetcode-doesnt-teach-you</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Tue, 04 Mar 2025 20:54:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39c60bdd-1ecf-4cbb-8400-217a350df2f8_1748x1240.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Everyone says the key to landing a software job is grinding LeetCode. Solve hundreds of problems, and the offers will roll in. </p><p>But here&#8217;s the harsh truth&#8212;LeetCode isn&#8217;t enough.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Weekend Developer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>You can memorize algorithms, ace coding challenges, and yet struggle in real-world software development. </p><p>Because when you&#8217;re on the job, your biggest problems won&#8217;t be binary trees or dynamic programming. </p><p>They&#8217;ll be messy codebases, unpredictable users, and working with people who don&#8217;t think like you do.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ueAz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39c60bdd-1ecf-4cbb-8400-217a350df2f8_1748x1240.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ueAz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39c60bdd-1ecf-4cbb-8400-217a350df2f8_1748x1240.png 424w, https://substackcdn.com/image/fetch/$s_!ueAz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39c60bdd-1ecf-4cbb-8400-217a350df2f8_1748x1240.png 848w, https://substackcdn.com/image/fetch/$s_!ueAz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39c60bdd-1ecf-4cbb-8400-217a350df2f8_1748x1240.png 1272w, https://substackcdn.com/image/fetch/$s_!ueAz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39c60bdd-1ecf-4cbb-8400-217a350df2f8_1748x1240.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ueAz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39c60bdd-1ecf-4cbb-8400-217a350df2f8_1748x1240.png" width="1456" height="1033" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/39c60bdd-1ecf-4cbb-8400-217a350df2f8_1748x1240.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1033,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:672111,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://weekendprogrammer.substack.com/i/158394013?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39c60bdd-1ecf-4cbb-8400-217a350df2f8_1748x1240.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ueAz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39c60bdd-1ecf-4cbb-8400-217a350df2f8_1748x1240.png 424w, https://substackcdn.com/image/fetch/$s_!ueAz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39c60bdd-1ecf-4cbb-8400-217a350df2f8_1748x1240.png 848w, https://substackcdn.com/image/fetch/$s_!ueAz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39c60bdd-1ecf-4cbb-8400-217a350df2f8_1748x1240.png 1272w, https://substackcdn.com/image/fetch/$s_!ueAz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39c60bdd-1ecf-4cbb-8400-217a350df2f8_1748x1240.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Here's 7 reasons why solving Leetcode problems does not help you become a good software developer.</p><h4><strong>&#65279;1. AI can solve LeetCode problems - where does that leave you?</strong></h4><p>All the LLMs can solve LeetCode problems in a matter of seconds. The accuracy will only improve as time goes on.<br>&#65279;<br>&#65279;So what's the value that you can bring to an organization?</p><h4><strong>&#65279;2. Users are unpredictable</strong>&#65279;</h4><p>This is an old joke.</p><blockquote><p><em>&#65279;A QA walks into a bar. Orders a beer. Orders 999999999 beers. Orders a lizard. Orders -1 beers. Orders a string of random characters. First real user walks in and asks where the bathroom is. And the whole bar catches fire.</em></p></blockquote><p>Real-world users don&#8217;t follow predefined rules.</p><p>They input unexpected values, break your UI, and find edge cases you never considered.</p><p>In the video below, see what users are using the new Bounce Features for Mercedes.</p><p><a href="https://x.com/i/status/1700606821914849469">Mercedes Bounce</a></p><p>Writing production code means anticipating failures and designing for resilience&#8212;something LeetCode won&#8217;t teach you.</p><h4><strong>3. Your code is not an island</strong></h4><p>Most real-world applications interact with multiple external systems&#8212;APIs, databases, third-party services.</p><p>These systems change, fail, and return unexpected data.</p><p>Handling these changes with minimal disruption is a critical skill that LeetCode completely ignores.</p><p>I remember an issue where the labels on parcels got all mixed up.</p><p>How do you find what caused the issue?</p><p>You never learn to troubleshoot issues across many systems using LeetCode.</p><h4><strong>4. Your code is only the technical specification part of the software. The bigger part is people.</strong></h4><p>Software development is a team sport. You&#8217;ll collaborate with engineers, product managers, designers, and QA testers.</p><p>You&#8217;ll encounter tough personalities and conflicting priorities.</p><p>More importantly, you&#8217;ll get feedback.</p><p>QA engineers will break your code, senior engineers will challenge your designs, and business stakeholders will change requirements.</p><p>&#65279;Learning to handle this with maturity and professionalism is essential&#8212;LeetCode doesn&#8217;t prepare you for that.</p><h4><strong>5. Seeing the Bigger Picture Matters More Than Fixing Bugs</strong></h4><p>Sometimes, a bug might look an easy fix. But if you do not take time to understand the consequences of the fix on the system, it might result in a host of new bugs that you never thought of.</p><p>Understanding the exact root cause of the bug and analyzing impact to the overall system is critical to doing good development work.</p><p>Key questions you can ask:</p><ul><li><p>Are you 100% sure of the root cause? The best way to determine is if you can reproduce the bug.</p></li><li><p>When this fix gets deployed, is there any concurrent feature that this will affect?</p></li><li><p>Is this scenario one-off, or does it have the potential to repeat often?</p></li><li><p>Is there a requirement that will get affected in the near future?</p></li></ul><h4><strong>6. There is a method to software development</strong></h4><p>&#65279;Most often this method is Agile. &#65279;</p><p>Understanding sprints, stand-ups, code reviews, and release cycles is crucial for working effectively in a team.</p><p>Without this, you&#8217;re just writing code in a vacuum. No company operates that way.</p><h4><strong>7. Writing Code Is Easy&#8212;Writing Simple Code Is Hard</strong></h4><p><em>"A code is written once but read a thousand times." - Robert C. Martin</em></p><p>Anyone can write code that works.</p><p>Great developers write code that is clean, understandable, and maintainable.</p><p>Future developers (including your future self) should be able to read and extend it without frustration.</p><p>Good coding practices include:</p><ul><li><p>Writing clean, readable code</p></li><li><p>Following design patterns (be careful with this one)</p></li><li><p>Writing meaningful tests</p></li><li><p>Documenting edge cases and limitations</p></li></ul><h3>The Bottom Line</h3><p>LeetCode is useful, but it&#8217;s not enough. Focusing solely on it creates massive blind spots.</p><p>The best developers go beyond algorithms. They learn:</p><ul><li><p>How to write maintainable, well-structured code</p></li><li><p>How to debug and troubleshoot real-world systems</p></li><li><p>How software interacts with infrastructure and external services</p></li><li><p>How to work effectively in teams</p></li></ul><p>Now you might be wondering, when you are just starting out or switching to software development, what is one practical step that you can take.</p><p>One key action is that you can build a real-world project. Now there are caveats to that. </p><p>I &#65279;will add that in another post. But it helps with most of the problems discussed in the post.</p><p><strong>Reader&#8217;s challenge:<br></strong>Even if you skip LeetCode and work on a real-world project, which of these challenges do you think you&#8217;d still struggle to learn?</p><p>Hit reply to let me know. Looking forward to your reply.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Weekend Developer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[End to End Testing No More]]></title><description><![CDATA[How do we remove reliance on buggy end-to-end tests and deliver products faster?]]></description><link>https://weekendprogrammer.substack.com/p/end-to-end-testing-no-more</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/end-to-end-testing-no-more</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Wed, 25 Dec 2024 03:33:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vtOk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60c310ab-cb3a-4dda-9e05-53a2d4b2deb2_2285x1430.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vtOk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60c310ab-cb3a-4dda-9e05-53a2d4b2deb2_2285x1430.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vtOk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60c310ab-cb3a-4dda-9e05-53a2d4b2deb2_2285x1430.png 424w, https://substackcdn.com/image/fetch/$s_!vtOk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60c310ab-cb3a-4dda-9e05-53a2d4b2deb2_2285x1430.png 848w, https://substackcdn.com/image/fetch/$s_!vtOk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60c310ab-cb3a-4dda-9e05-53a2d4b2deb2_2285x1430.png 1272w, https://substackcdn.com/image/fetch/$s_!vtOk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60c310ab-cb3a-4dda-9e05-53a2d4b2deb2_2285x1430.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vtOk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60c310ab-cb3a-4dda-9e05-53a2d4b2deb2_2285x1430.png" width="1456" height="911" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/60c310ab-cb3a-4dda-9e05-53a2d4b2deb2_2285x1430.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:911,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:399693,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vtOk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60c310ab-cb3a-4dda-9e05-53a2d4b2deb2_2285x1430.png 424w, https://substackcdn.com/image/fetch/$s_!vtOk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60c310ab-cb3a-4dda-9e05-53a2d4b2deb2_2285x1430.png 848w, https://substackcdn.com/image/fetch/$s_!vtOk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60c310ab-cb3a-4dda-9e05-53a2d4b2deb2_2285x1430.png 1272w, https://substackcdn.com/image/fetch/$s_!vtOk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60c310ab-cb3a-4dda-9e05-53a2d4b2deb2_2285x1430.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It&#8217;s a typical Tuesday afternoon, and your team is gearing up for a routine release&#8212;a feature here, a bug fix there. </p><p>Nothing groundbreaking, but it&#8217;s part of the rhythm that keeps your product evolving. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Weekend Developer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Developers have wrapped up their work, testers have validated the changes, and the release is queued up for deployment.</p><p>E2E tests are triggered to check for impacts on the overall system.</p><p>Few test cases fail.</p><p>Developers are called in to look into the issues. </p><p>Delivery leads / engineering managers are notified of the issues and now everyone in the team is there.</p><p>The team investigates for a couple of days. </p><p>The result?  1 bug and 4 false positives.</p><p>Sometimes couple of days might turn into a week and what that mean more people in to understand the consequence of the issue.</p><p>Managers are left juggling timelines, explaining delays to stakeholders, and hoping the release doesn&#8217;t bleed into the weekend.</p><p>Developers and testers context-switch from building things to fight fire. </p><p>For teams operating in microservices architectures, this isn&#8217;t a one-off nightmare&#8212;it&#8217;s a recurring challenge. </p><p>Weekly or fortnightly releases get bogged down, and instead of delivering value to customers, you&#8217;re spending precious time firefighting.</p><h3><strong>Why Does This Happen?</strong></h3><p>The root of these challenges lies in the very thing that makes modern systems so powerful: <strong>microservices architecture</strong>.</p><p>In a microservices setup, your application is no longer a monolith; it&#8217;s a collection of smaller, independent services working together. While this brings scalability and flexibility, it also introduces complexity&#8212;each service depends on others, and any mismatch or downtime can cause cascading failures, especially during E2E tests.</p><p>Let&#8217;s break this down:</p><ol><li><p><strong>Interdependencies</strong> - Microservices often rely on other services, databases, or external systems. If one of these isn&#8217;t available or has mismatched versions, tests fail.</p></li><li><p><strong>Test Fragility</strong> - E2E tests need stable environments, but in dynamic systems, infrastructure, test data, or service availability can be inconsistent.</p></li><li><p><strong>Troubleshooting Overhead</strong> - Pinpointing the root cause of a failure in a web of services takes time and coordination, delaying releases further.</p></li></ol><p>So, how do you address this?</p><div><hr></div><h3>Contract Testing</h3><p>One way to reduce reliance on E2E tests is by adopting <strong>contract testing</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3_kQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d7eb9c0-cc5c-475b-a446-d41182410205_1372x624.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3_kQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d7eb9c0-cc5c-475b-a446-d41182410205_1372x624.png 424w, https://substackcdn.com/image/fetch/$s_!3_kQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d7eb9c0-cc5c-475b-a446-d41182410205_1372x624.png 848w, https://substackcdn.com/image/fetch/$s_!3_kQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d7eb9c0-cc5c-475b-a446-d41182410205_1372x624.png 1272w, https://substackcdn.com/image/fetch/$s_!3_kQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d7eb9c0-cc5c-475b-a446-d41182410205_1372x624.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3_kQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d7eb9c0-cc5c-475b-a446-d41182410205_1372x624.png" width="1372" height="624" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d7eb9c0-cc5c-475b-a446-d41182410205_1372x624.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:624,&quot;width&quot;:1372,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:159295,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3_kQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d7eb9c0-cc5c-475b-a446-d41182410205_1372x624.png 424w, https://substackcdn.com/image/fetch/$s_!3_kQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d7eb9c0-cc5c-475b-a446-d41182410205_1372x624.png 848w, https://substackcdn.com/image/fetch/$s_!3_kQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d7eb9c0-cc5c-475b-a446-d41182410205_1372x624.png 1272w, https://substackcdn.com/image/fetch/$s_!3_kQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d7eb9c0-cc5c-475b-a446-d41182410205_1372x624.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h4><strong>What is Contract Testing?</strong></h4><p>Contract testing focuses on verifying the interaction between two services. Instead of testing the entire system, it ensures that a service (the consumer) and its dependency (the provider) agree on how they will communicate.</p><p>Here&#8217;s how it works:</p><ul><li><p>The <strong>consumer</strong> defines a contract specifying the API calls it will make and the responses it expects.</p></li><li><p>The <strong>provider</strong> validates this contract to ensure it meets the consumer&#8217;s expectations.</p></li></ul><h4><strong>Benefits of Contract Testing</strong></h4><ul><li><p><strong>Faster Feedback</strong> - You can test interactions without spinning up the entire system.</p></li><li><p><strong>Reduced Fragility</strong> - Tests don&#8217;t rely on all services being up and running.</p></li><li><p><strong>Clear Ownership</strong> - Each team owns its contracts, making troubleshooting more focused.</p></li><li><p><strong>Scalability</strong>  - Contract tests scale better than E2E tests in large systems with many services.</p></li></ul><p>By implementing contract testing, you can ensure your services work well together, even if they&#8217;re deployed independently.</p><div><hr></div><p>But contract testing alone cannot solve logic changes in downstream systems.</p><p>For example, if a shared service like an authentication system updates its logic, it might still pass its contract tests but fail in actual integration scenarios.</p><h3>Traceability Matrix</h3><p>To address logic changes and ensure comprehensive testing, you need a <strong>traceability matrix</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lj7Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc9f0c4-2fd4-4e05-9445-f8f72e8fd472_2157x1152.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lj7Q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc9f0c4-2fd4-4e05-9445-f8f72e8fd472_2157x1152.png 424w, https://substackcdn.com/image/fetch/$s_!lj7Q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc9f0c4-2fd4-4e05-9445-f8f72e8fd472_2157x1152.png 848w, https://substackcdn.com/image/fetch/$s_!lj7Q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc9f0c4-2fd4-4e05-9445-f8f72e8fd472_2157x1152.png 1272w, https://substackcdn.com/image/fetch/$s_!lj7Q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc9f0c4-2fd4-4e05-9445-f8f72e8fd472_2157x1152.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lj7Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc9f0c4-2fd4-4e05-9445-f8f72e8fd472_2157x1152.png" width="1456" height="778" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fcc9f0c4-2fd4-4e05-9445-f8f72e8fd472_2157x1152.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:778,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:833939,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lj7Q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc9f0c4-2fd4-4e05-9445-f8f72e8fd472_2157x1152.png 424w, https://substackcdn.com/image/fetch/$s_!lj7Q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc9f0c4-2fd4-4e05-9445-f8f72e8fd472_2157x1152.png 848w, https://substackcdn.com/image/fetch/$s_!lj7Q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc9f0c4-2fd4-4e05-9445-f8f72e8fd472_2157x1152.png 1272w, https://substackcdn.com/image/fetch/$s_!lj7Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc9f0c4-2fd4-4e05-9445-f8f72e8fd472_2157x1152.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h4><strong>What is a Traceability Matrix?</strong></h4><p>A traceability matrix maps requirements, features, or changes to the tests that validate them. In the context of microservices:</p><ul><li><p>It links services and their dependencies to specific test cases.</p></li><li><p>It identifies which tests to run when a particular service or feature changes.</p></li></ul><h4><strong>How It Works</strong></h4><ul><li><p>When a shared service updates, the traceability matrix identifies all dependent services and relevant integration tests.</p></li><li><p>Instead of running the entire E2E suite, you execute only the impacted tests, saving time and effort.</p></li></ul><h4><strong>Benefits of a Traceability Matrix</strong></h4><ul><li><p>Targeted Testing - Run only the tests that matter, reducing execution time.</p></li><li><p>Simplified Debugging -  Developers and testers focus on the exact areas impacted by changes.</p></li><li><p>Faster Releases - By avoiding full E2E runs, you streamline deployments.</p></li></ul><div><hr></div><p>As business logic grows and tests multiply, maintaining the traceability matrix becomes increasingly complex. </p><p>Over time, there&#8217;s a real danger of maintainers adding everything into the matrix to cover all possible scenarios. </p><p>This leads to the same problem you were trying to solve: running all E2E tests for every release, negating the benefits of targeted testing.</p><h3>Leverage Domains</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!R7lr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20864b8a-b390-47be-a746-3ed3b6eccd1f_1578x474.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!R7lr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20864b8a-b390-47be-a746-3ed3b6eccd1f_1578x474.png 424w, https://substackcdn.com/image/fetch/$s_!R7lr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20864b8a-b390-47be-a746-3ed3b6eccd1f_1578x474.png 848w, https://substackcdn.com/image/fetch/$s_!R7lr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20864b8a-b390-47be-a746-3ed3b6eccd1f_1578x474.png 1272w, https://substackcdn.com/image/fetch/$s_!R7lr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20864b8a-b390-47be-a746-3ed3b6eccd1f_1578x474.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!R7lr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20864b8a-b390-47be-a746-3ed3b6eccd1f_1578x474.png" width="1456" height="437" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/20864b8a-b390-47be-a746-3ed3b6eccd1f_1578x474.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:437,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:124181,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!R7lr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20864b8a-b390-47be-a746-3ed3b6eccd1f_1578x474.png 424w, https://substackcdn.com/image/fetch/$s_!R7lr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20864b8a-b390-47be-a746-3ed3b6eccd1f_1578x474.png 848w, https://substackcdn.com/image/fetch/$s_!R7lr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20864b8a-b390-47be-a746-3ed3b6eccd1f_1578x474.png 1272w, https://substackcdn.com/image/fetch/$s_!R7lr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20864b8a-b390-47be-a746-3ed3b6eccd1f_1578x474.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>One way to keep the traceability matrix manageable is by organizing it around domains. </p><p>A domain represents a logical grouping of services and their associated tests within your organization. </p><p>For example, you might have domains like Payments, User Management, or Notifications, each with its own traceability matrix.</p><h4><strong>How Domains Help</strong></h4><ol><li><p><strong>Focused Ownership</strong> - Each domain has clear owners&#8212;teams responsible for maintaining its traceability matrix and ensuring its accuracy.</p></li><li><p><strong>Simplified Maintenance</strong> - By limiting the scope of each matrix to a domain, you reduce its complexity, making it easier to manage and update.</p></li><li><p><strong>Better Visibility</strong> - Domain-specific matrices provide a clear view of dependencies and test coverage within that domain, helping teams identify gaps or redundancies.</p></li></ol><h4><strong>Challenges of Using Domains</strong></h4><ol><li><p><strong>Boundary Definition</strong> - Defining clear boundaries between domains can be tricky, especially in systems with overlapping responsibilities.</p></li><li><p><strong>Cross-Domain Dependencies</strong> -  Interactions between domains may require additional coordination, especially when logic spans multiple areas.</p></li><li><p><strong>Initial Overhead</strong> - Setting up domains and assigning ownership requires time and effort, particularly in large organizations with legacy systems.</p></li></ol><h3>The Combined Power of Contract Testing, Traceability Matrix, and Domains</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!x6mh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8abe7e6-3007-4bbd-99a1-6e791d6aba0d_1443x702.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!x6mh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8abe7e6-3007-4bbd-99a1-6e791d6aba0d_1443x702.png 424w, https://substackcdn.com/image/fetch/$s_!x6mh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8abe7e6-3007-4bbd-99a1-6e791d6aba0d_1443x702.png 848w, https://substackcdn.com/image/fetch/$s_!x6mh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8abe7e6-3007-4bbd-99a1-6e791d6aba0d_1443x702.png 1272w, https://substackcdn.com/image/fetch/$s_!x6mh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8abe7e6-3007-4bbd-99a1-6e791d6aba0d_1443x702.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!x6mh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8abe7e6-3007-4bbd-99a1-6e791d6aba0d_1443x702.png" width="1443" height="702" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8abe7e6-3007-4bbd-99a1-6e791d6aba0d_1443x702.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:702,&quot;width&quot;:1443,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:297346,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!x6mh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8abe7e6-3007-4bbd-99a1-6e791d6aba0d_1443x702.png 424w, https://substackcdn.com/image/fetch/$s_!x6mh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8abe7e6-3007-4bbd-99a1-6e791d6aba0d_1443x702.png 848w, https://substackcdn.com/image/fetch/$s_!x6mh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8abe7e6-3007-4bbd-99a1-6e791d6aba0d_1443x702.png 1272w, https://substackcdn.com/image/fetch/$s_!x6mh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8abe7e6-3007-4bbd-99a1-6e791d6aba0d_1443x702.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Each solution&#8212;contract testing, traceability matrix, and domains&#8212;addresses a specific aspect of the E2E testing problem. However, their true strength lies in using them together.</p><ol><li><p><strong>Contract Testing</strong> ensures service-to-service communication is reliable, reducing the need for full-system tests.</p></li><li><p><strong>Traceability Matrix</strong> targets logic changes, ensuring only the necessary tests run, saving time and effort.</p></li><li><p><strong>Domains</strong> keep the matrix manageable, preventing it from becoming a monolithic structure that&#8217;s hard to maintain.</p></li></ol><p>By combining these approaches, you create a robust deployment strategy that balances speed and reliability.</p><h3>Challenges and Open Questions</h3><p>While these solutions address many pain points, they aren&#8217;t without challenges:</p><ol><li><p><strong>Tooling</strong> - What tools can help automate and maintain traceability matrices across domains?</p></li><li><p><strong>Training</strong> - How do you ensure all teams understand and adopt these practices effectively?</p></li><li><p><strong>Governance</strong> - Who oversees cross-domain dependencies and ensures alignment?</p></li><li><p><strong>Scalability</strong> - How do these approaches scale as the organization and system grow further?</p></li></ol><p>These open questions highlight the need for continuous refinement and adaptation of your deployment strategy.</p><h3>Conclusion</h3><p>End-to-end testing failures shouldn&#8217;t derail your releases. </p><p>By adopting <strong>contract testing</strong>, implementing a <strong>traceability matrix</strong>, and leveraging <strong>domains</strong>, you can address the root causes of these delays and deliver faster, more reliable releases.</p><p>These approaches empower your teams to focus on delivering value to customers rather than firefighting test failures. </p><p>While challenges remain, taking the first step towards modernizing your testing strategy is the key to staying agile in today&#8217;s fast-paced development environment.</p><p>With this combination, you&#8217;re not just fixing a process&#8212;you&#8217;re laying the foundation for smoother, faster, and more confident releases.</p><p></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Weekend Developer! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Reflections and Roadmap]]></title><description><![CDATA[There are still 2 weeks to go for the year end! Make the most of it.]]></description><link>https://weekendprogrammer.substack.com/p/reflections-and-roadmap</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/reflections-and-roadmap</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Fri, 13 Dec 2024 20:58:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xAmZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b161b35-31b6-467f-a899-7f8c0ddc37f9_480x480.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As the year ends, I thank you for supporting Weekend Programmer.  </p><p>The initial aspiration of this publication was that I would never monetize this. publication. </p><p>The good news is it is still the case despite Substack luring me into 100 different ways to do it. &#128522;</p><p>So I do ask you to support me by sharing the publication if you find this useful.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xAmZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b161b35-31b6-467f-a899-7f8c0ddc37f9_480x480.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xAmZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b161b35-31b6-467f-a899-7f8c0ddc37f9_480x480.webp 424w, https://substackcdn.com/image/fetch/$s_!xAmZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b161b35-31b6-467f-a899-7f8c0ddc37f9_480x480.webp 848w, https://substackcdn.com/image/fetch/$s_!xAmZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b161b35-31b6-467f-a899-7f8c0ddc37f9_480x480.webp 1272w, https://substackcdn.com/image/fetch/$s_!xAmZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b161b35-31b6-467f-a899-7f8c0ddc37f9_480x480.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xAmZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b161b35-31b6-467f-a899-7f8c0ddc37f9_480x480.webp" width="480" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b161b35-31b6-467f-a899-7f8c0ddc37f9_480x480.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:480,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:87204,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xAmZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b161b35-31b6-467f-a899-7f8c0ddc37f9_480x480.webp 424w, https://substackcdn.com/image/fetch/$s_!xAmZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b161b35-31b6-467f-a899-7f8c0ddc37f9_480x480.webp 848w, https://substackcdn.com/image/fetch/$s_!xAmZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b161b35-31b6-467f-a899-7f8c0ddc37f9_480x480.webp 1272w, https://substackcdn.com/image/fetch/$s_!xAmZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b161b35-31b6-467f-a899-7f8c0ddc37f9_480x480.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share Weekend Developer&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share Weekend Developer</span></a></p><p></p><p>It has been an eventful journey for me as I found both the joy of publishing and the challenge of coming up with topics to write on.</p><p>I want to use this edition to reflect on my journey so far.</p><h3>Reflections</h3><p>I started posting videos as I felt it was easier for me to explain than a long post. </p><p>I also found doing videos more enjoyable.  Hope you liked them as well. &#128521;</p><p>Initial posts were more about thinking (meta) about development. Recently, I have been more focused on how to do &lt;X&gt;. <br> <br>Let me know what kind of post you prefer.</p><p>I did drop the frequency of my publication towards the end of the year. </p><p>This was partly due to  launching a paid course on doing a software project and the day job taking its toll. <br><br>If you are interested in joining the course, you can join the waitlist here: <a href="https://maven.com/software-engineering-academy/spring-boot-project-accelerator-build-a-mircoservice-project-in-2-weeks?utm_campaign=NDA1NDM2&amp;utm_medium=clp_share_link&amp;utm_source=instructor">Spring Boot Project Accelerator: Build A Microservice Project in Just 2 Weeks</a></p><p>I need to improve the quality of some of the posts. I know it is not up there. So that&#8217;s on me to improve for the year ahead. </p><p>If you find something that needs to be improved, I am just an email away. &#128231;</p><h3>Future Roadmap</h3><p>Now this is the exciting bit. &#128640;</p><p>As a reader, I invite you to shape the future of this publication.  I want your feedback on what kind of posts you want to read, learn and enjoy.</p><p>Send me ideas, brickbats anything that you feel is required to make this publication better for you.</p><p>I have some ideas as well to change the model.</p><ul><li><p>Start numbering the editions.  &#128514; </p></li><li><p>Have posts based on specific themes every month so that you get a deep dive in 1 area</p></li><li><p>Doing office hours - planning to be online for 1 hour fortnightly once to have a chat. Planning to do it on Zoom. Let me know if you are interested.</p></li><li><p>Doing some posts like this more with reflections and more stories</p></li><li><p>The elephant in the room - AI. I have not talked about it but I guess I have done my research and it is time for sharing them.</p></li></ul><h5>Any thoughts, suggestions?</h5><div class="directMessage button" data-attrs="{&quot;userId&quot;:39746678,&quot;userName&quot;:&quot;Dishit Devasia&quot;,&quot;canDm&quot;:null,&quot;dmUpgradeOptions&quot;:null,&quot;isEditorNode&quot;:true}" data-component-name="DirectMessageToDOM"></div><p></p><h3>Top Post of the Year</h3><ol><li><p>I always thought this was something I needed it. I always had to look up. So this was a guide for myself as well.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;10946664-a11d-455e-8dfd-d360d80a3430&quot;,&quot;caption&quot;:&quot;&#128075; Hi, this is Dishit with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;The Ultimate Guide to Create Spring Boot Custom Annotations&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:39746678,&quot;name&quot;:&quot;Dishit Devasia&quot;,&quot;bio&quot;:&quot;I help people realize their career goals of transitioning into a desired role allowing them to spend time with their family and passions&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a1d4859-b351-44bc-bf45-196b0dcc6955_246x249.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-08-24T00:27:55.703Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b532d066-2cfa-4016-ac98-f0d8139d2b08_500x300.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://weekendprogrammer.substack.com/p/the-ultimate-guide-to-create-spring&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:148052761,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Weekend Developer&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b349647-4112-4a10-96ee-58e4fb923ce6_500x500.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div></li><li><p>Kafka - I love working on Kafka at work. I think more people need to know about this. There are pitfalls that you should be aware of. But that is for another post.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;81c8e5e6-40bf-414f-9df6-7e0ccb6b8977&quot;,&quot;caption&quot;:&quot;&#128075; Hi, this is Dishit with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;[Video] A Brief Introduction to Kafka (with analogy)&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:39746678,&quot;name&quot;:&quot;Dishit Devasia&quot;,&quot;bio&quot;:&quot;I help people realize their career goals of transitioning into a desired role allowing them to spend time with their family and passions&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a1d4859-b351-44bc-bf45-196b0dcc6955_246x249.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-07-06T22:30:24.911Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/45c66f2a-8116-4bcd-b1c6-c478f25d7ee4_3049x4573.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://weekendprogrammer.substack.com/p/video-a-brief-introduction-to-kafka&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:146349937,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Weekend Developer&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b349647-4112-4a10-96ee-58e4fb923ce6_500x500.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div></li><li><p>Design Patterns -  There is so much focus on learning design patterns. But like everything else in technology, you need to be wary about using it for everything. There are no silver bullets</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;b8808596-1ad5-4556-bcaa-2e8224021789&quot;,&quot;caption&quot;:&quot;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;The Hidden Secrets of Design Patterns: What No One Talks About&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:39746678,&quot;name&quot;:&quot;Dishit Devasia&quot;,&quot;bio&quot;:&quot;I help people realize their career goals of transitioning into a desired role allowing them to spend time with their family and passions&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a1d4859-b351-44bc-bf45-196b0dcc6955_246x249.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-06-22T20:39:23.122Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65aa0dd-0298-4a8f-be5d-e6a9d322fcd4_3024x4032.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://weekendprogrammer.substack.com/p/the-hidden-secrets-of-design-patterns&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:145879166,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Weekend Developer&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b349647-4112-4a10-96ee-58e4fb923ce6_500x500.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div></li><li><p>Tech Debt - In the hustle culture, we create tech debts. How do we balance tech debt with speed to market? It is the eternal question that we face as developers.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;e7807328-fa71-438f-9e3d-85beb39435ad&quot;,&quot;caption&quot;:&quot;&#128075; Hi, this is Dishit with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Technical Debt 101: A Short Quick Guide&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:39746678,&quot;name&quot;:&quot;Dishit Devasia&quot;,&quot;bio&quot;:&quot;I help people realize their career goals of transitioning into a desired role allowing them to spend time with their family and passions&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a1d4859-b351-44bc-bf45-196b0dcc6955_246x249.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-05-31T22:20:01.891Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ec09389-6623-41b3-873a-bd9120ddedce_1512x1122.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://weekendprogrammer.substack.com/p/technical-debt-101-a-short-quick&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:144980848,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Weekend Developer&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b349647-4112-4a10-96ee-58e4fb923ce6_500x500.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div></li><li><p>Github Case Study - Another one with Kafka.  It shows how Github moved towards a more scalable architecture using Kafka</p></li></ol><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;bb534837-23b9-4fbc-b2fd-f5064ce4ab35&quot;,&quot;caption&quot;:&quot;&#128075; Hi, this is Dishit with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;[Video] How GitHub Changed Their Approach to Processing 300 Million Pushes Every Day?&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:39746678,&quot;name&quot;:&quot;Dishit Devasia&quot;,&quot;bio&quot;:&quot;I help people realize their career goals of transitioning into a desired role allowing them to spend time with their family and passions&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a1d4859-b351-44bc-bf45-196b0dcc6955_246x249.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-07-01T21:08:55.200Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2467f81e-5dca-4090-bea1-f5a31bfbfddb_5472x3648.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://weekendprogrammer.substack.com/p/video-how-github-changed-their-approach&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:146179843,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Weekend Developer&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b349647-4112-4a10-96ee-58e4fb923ce6_500x500.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>If you enjoyed them, share them &#10084;&#65039;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share Weekend Developer&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share Weekend Developer</span></a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UfQ1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdec59461-2f53-4d6c-8f88-8287a0801999_480x270.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UfQ1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdec59461-2f53-4d6c-8f88-8287a0801999_480x270.webp 424w, https://substackcdn.com/image/fetch/$s_!UfQ1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdec59461-2f53-4d6c-8f88-8287a0801999_480x270.webp 848w, https://substackcdn.com/image/fetch/$s_!UfQ1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdec59461-2f53-4d6c-8f88-8287a0801999_480x270.webp 1272w, https://substackcdn.com/image/fetch/$s_!UfQ1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdec59461-2f53-4d6c-8f88-8287a0801999_480x270.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UfQ1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdec59461-2f53-4d6c-8f88-8287a0801999_480x270.webp" width="480" height="270" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dec59461-2f53-4d6c-8f88-8287a0801999_480x270.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:270,&quot;width&quot;:480,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:600296,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!UfQ1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdec59461-2f53-4d6c-8f88-8287a0801999_480x270.webp 424w, https://substackcdn.com/image/fetch/$s_!UfQ1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdec59461-2f53-4d6c-8f88-8287a0801999_480x270.webp 848w, https://substackcdn.com/image/fetch/$s_!UfQ1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdec59461-2f53-4d6c-8f88-8287a0801999_480x270.webp 1272w, https://substackcdn.com/image/fetch/$s_!UfQ1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdec59461-2f53-4d6c-8f88-8287a0801999_480x270.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[Why Your Software Projects Aren’t Getting You Hired (And What to Do About It)]]></title><description><![CDATA[Ever felt like the projects you&#8217;ve spent hours&#8212;maybe even months&#8212;working on just aren&#8217;t paying off?]]></description><link>https://weekendprogrammer.substack.com/p/why-your-software-projects-arent</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/why-your-software-projects-arent</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Sun, 10 Nov 2024 19:40:34 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/9f4fdca5-356a-4bf9-92c6-82519155385f_5824x3264.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ever felt like the projects you&#8217;ve spent hours&#8212;maybe even months&#8212;working on just aren&#8217;t paying off? </p><p>Maybe you&#8217;ve been told to &#8220;build more projects&#8221; if you want to stand out to employers. </p><p>So you build and build, adding projects to your portfolio with the hope that quantity will somehow lead to quality.</p><p>Along the way you find, you had to abandon few projects because you got stuck. Or you find that other people have done some cooler projects.</p><p>You also feel that your project is what everyone else is doing.</p><p>Or you may feel that you are not confident about how you created the project.</p><p>You&#8217;re not alone. </p><p>Many developers and job seekers are facing the same issues&#8212;putting their time and energy into projects they <em>think</em> will make them job-ready, only to find they&#8217;ve missed the mark.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;ae077ef4-0dcd-466a-bfa2-949d70b45bbe&quot;,&quot;duration&quot;:null}"></div><p></p><h3>The Real Problem Behind "Just Build More Projects"</h3><p>Building projects can be valuable, but only if you&#8217;re building the <em>right</em> projects for where you are in your career right now. </p><p>Without a clear method to choose, it&#8217;s easy to end up working on projects that either </p><ul><li><p>don&#8217;t make a real impact, </p></li><li><p>become overwhelming, incomplete burdens that lead to burnout rather than career progress.</p></li></ul><p>So how do you know if a project is right for you? </p><p>Well, I have been looking over all the mistakes that I made in my career when looking for a job and also some of the right things that I did. </p><p>I wanted to  create something that would provide a step-by-step approach so that you do not make the same mistakes that I made and achieve the results faster than I did.</p><p>The result.</p><p>PACE Framework. </p><h3>The PACE Framework: Plan, Analyze, Create, Execute</h3><p>PACE is a simple, four-step framework I developed to help job seekers and developers select projects that lead to results. Here&#8217;s how it works:</p><h4><strong>1. Plan</strong></h4><p>Yeah, that doesn&#8217;t sound insightful. But doing the boring stuff works.</p><p>Before you begin your project there are 3 essential steps you need to do:</p><ul><li><p><strong>Market Research<br></strong>Identify the available opportunities in the kind of role that you are looking for in the specific location you are looking for. Typically, you want it to be in the city you are living in unless you are looking for a remote job.</p></li><li><p><strong>Learning Intention<br></strong>Identify your learning goals based on your market research.</p></li><li><p><strong>Project Selection<br></strong>Use the outputs from your previous two steps to select a project that aligns with the available opportunities and your learning goals.</p></li></ul><h4>2. Analyze</h4><ul><li><p><strong>Analyze requirements<br></strong>Create a list of requirements that will help you achieve your goals.</p></li><li><p><strong>Align architecture<br></strong>This is where you will have the first brush with technology. Think about how the tech stack that you are looking to build in the project will fit with your requirements. You will draw boxes and think about how these boxes will interact with each other.</p></li></ul><h4>3. Create</h4><ul><li><p><strong>Design Solution<br></strong>It is time to go deeper with your diagram. You will now develop <strong>on paper </strong>how these boxes interact with each other and in what sequence. This is where you get the bigger picture of how everything will look once you have built it.</p></li><li><p><strong>Breakdown into tasks/stories<br></strong>This is when you break the gigantic piece of work into small bits of tasks that you can do and create goals around. You created the map of what you have to do by designing the solution. <br><br>This step will help you create milestones within the map so that you know where you are and how far you need to go.</p></li></ul><h4>4. Execute</h4><p>The final step is to start writing code. You take each story and start building. <br><br>Did you see how different it is compared to 90% of the people who begin with writing code the first time they select the project?</p><p>These steps can help you take the guesswork out of selecting the right projects and build your portfolio with intention. </p><p>But there&#8217;s so much more that goes into this process. </p><p>That&#8217;s why I have created a free workshop where I will go deep with each of these steps so that you learn all the nuances and be ready to get the framework implemented in your current project.</p><p>You&#8217;ll learn more about what to look for in your own goals, how to tailor projects to your job search, and how to stand out in a competitive job market.</p><p><strong>Workshop Title:</strong> <strong>PACE Yourself to a Dream Dev Job: 4 Steps to Standout Software Projects</strong><br><strong>Link to Register:</strong> <a href="https://www.eventbrite.com.au/e/pace-yourself-to-a-dream-dev-job-4-steps-to-standout-software-projects-tickets-1051966689687">Register here</a></p><p>If you&#8217;re ready to stop wasting time on projects that don&#8217;t pay off, this workshop is for you. </p><p>Let&#8217;s make sure that every project you build is one that can help you move forward.</p><p>Hope to see you there!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.eventbrite.com.au/e/pace-yourself-to-a-dream-dev-job-4-steps-to-standout-software-projects-tickets-1051966689687&quot;,&quot;text&quot;:&quot;Register for free&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.eventbrite.com.au/e/pace-yourself-to-a-dream-dev-job-4-steps-to-standout-software-projects-tickets-1051966689687"><span>Register for free</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Why Following Traditional Advice Isn’t Enough to Switch from QA to Developer and What to Do Instead?]]></title><description><![CDATA[Overcome the Common Pitfalls and Start Building Real Developer Experience]]></description><link>https://weekendprogrammer.substack.com/p/why-following-traditional-advice</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/why-following-traditional-advice</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Thu, 05 Sep 2024 23:56:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!LUkQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F925e2283-f21c-4db8-ba24-ee26dfc95bd5_960x1280.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128075;<em> Hi, this is&nbsp;<a href="https://www.linkedin.com/in/dishitdevasia/">Dishit</a>&nbsp;with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.</em></p><p><strong>&#128680; </strong><em><strong>Announcement</strong></em><strong> &#128680;<br></strong><em><strong>DM me to</strong></em><strong> </strong><em>get a FREE code review session.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>You're a quality engineer. </p><p>You know your way around software, you&#8217;ve caught the bugs, optimized the processes, and saved your team from countless headaches. </p><p>But now, you&#8217;re eyeing that developer role&#8212;the one where you get to build, not just test. </p><p>The one where your ideas turn into code that shapes products.  You want to move from a gatekeeper to a value creator.</p><p>Yet, every time you take a step forward, it feels like you&#8217;re lost in a maze of conflicting advice, never-ending roadmaps, and an overwhelming list of &#8220;must-know&#8221; technologies.</p><p>You&#8217;ve scoured the internet, read the blogs, watched the tutorials, and maybe even bookmarked roadmap.sh, only to be left feeling more confused than ever. </p><p><strong>"Where do I even start? How long will this take? Am I learning the right things?"</strong> </p><p>It feels like you&#8217;re trying to drink from a firehose, with no clear direction, no real sense of progress, and no idea when you&#8217;ll be ready to make the leap.</p><p>It&#8217;s easy to get stuck in analysis paralysis, overwhelmed by the sheer volume of things to learn. </p><p>You might even think about throwing your hands up and diving straight into a project, hoping you&#8217;ll figure it out as you go&#8212;only to hit roadblocks that send you spiralling back to square one.</p><p>But what if I told you there&#8217;s a simpler path? </p><p>A path that starts with understanding exactly where you are, and maps out clear, actionable steps to get you to that full-time development role you&#8217;ve been dreaming about. </p><p>Not someday&#8212;sooner than you think.</p><p>This guide will help you doing just that. </p><p>It&#8217;s about cutting through the noise, focusing on what truly matters, and giving you the confidence to start building, learning, and applying for that dream job&#8212;all without getting lost in the endless sea of &#8220;shoulds&#8221; and &#8220;musts.&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LUkQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F925e2283-f21c-4db8-ba24-ee26dfc95bd5_960x1280.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LUkQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F925e2283-f21c-4db8-ba24-ee26dfc95bd5_960x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!LUkQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F925e2283-f21c-4db8-ba24-ee26dfc95bd5_960x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!LUkQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F925e2283-f21c-4db8-ba24-ee26dfc95bd5_960x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!LUkQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F925e2283-f21c-4db8-ba24-ee26dfc95bd5_960x1280.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LUkQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F925e2283-f21c-4db8-ba24-ee26dfc95bd5_960x1280.jpeg" width="960" height="1280" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/925e2283-f21c-4db8-ba24-ee26dfc95bd5_960x1280.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1280,&quot;width&quot;:960,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:767594,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LUkQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F925e2283-f21c-4db8-ba24-ee26dfc95bd5_960x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!LUkQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F925e2283-f21c-4db8-ba24-ee26dfc95bd5_960x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!LUkQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F925e2283-f21c-4db8-ba24-ee26dfc95bd5_960x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!LUkQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F925e2283-f21c-4db8-ba24-ee26dfc95bd5_960x1280.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>Image by <a href="https://pixabay.com/users/geralt-9301/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=413093">Gerd Altmann</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=413093">Pixabay</a></em></p><h2>Steps to Follow</h2><h3>Identify your starting point</h3><p>Assess your skills. </p><p>Are you at the learning the loops stage? Or are you at a level where you can solve some problems in most of the key topics area of a language?</p><p>You know what to do if you are learning the loops or just getting started. You only need to focus on the fundamentals.</p><p>But what if you understand the language fairly well and only need to learn the skills that most mid-level engineers want to know?</p><p>This is where you face the conflicting information challenge. </p><p>What you can do here is build your programming muscle. You need to compete with other experienced developers who can write code without looking up the internet. So by solving simpler programming challenges, you can build the muscle to solve problems.</p><p>Try simple to medium complexity exercises on coding platforms such as Hackerrank, Codility, LeetCode.</p><h3><strong>Transitioning to Building Projects</strong></h3><p>After getting comfortable with solving coding problems, it&#8217;s time to start building real projects. </p><p>You&#8217;ll know you&#8217;re ready for this step when you can mentally map out solutions or feel a sense of boredom with repetitive coding exercises. </p><p>This indicates you&#8217;ve mastered the basics and are ready to apply your skills in a more meaningful way.</p><h4>Start with Simple Projects</h4><p>Begin with a small, manageable project that aligns with your goals, like a basic to-do app or a simple API service. </p><p>The key is to complete a project from start to finish rather than biting off more than you can chew with a complex, large-scale application. </p><p>Completing a project will build your confidence and give you a sense of accomplishment, which is crucial at this stage. </p><p>For common pitfalls to avoid when starting projects, you can check out my video where I cover the biggest mistakes new developers make.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;777c4b5e-be81-44a9-b3d3-d5bb80e43043&quot;,&quot;caption&quot;:&quot;&#128075; Hi, this is Dishit with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;The Top 5 Mistakes That Can Derail Your Development Projects&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:39746678,&quot;name&quot;:&quot;Dishit Devasia&quot;,&quot;bio&quot;:&quot;I help people realize their career goals of transitioning into a desired role allowing them to spend time with their family and passions&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a1d4859-b351-44bc-bf45-196b0dcc6955_246x249.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-08-11T10:53:09.530Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c27066e3-89a3-486d-a5aa-a2109f153c70_1920x1080.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://weekendprogrammer.substack.com/p/the-top-5-mistakes-that-can-derail&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:147567738,&quot;type&quot;:&quot;podcast&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Weekend Developer&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b349647-4112-4a10-96ee-58e4fb923ce6_500x500.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><h4>Keep Practicing Problem-Solving</h4><p>Even as you dive into projects, continue practising coding challenges at least once a week. </p><p>This habit will help you maintain your problem-solving skills. </p><p>It also keeps your coding speed sharp, which is vital for performing well in technical interviews.</p><h3><strong>Incorporate Libraries and Tools</strong></h3><p>One of the hallmarks of a seasoned developer is knowing when to leverage existing libraries instead of writing everything from scratch. </p><p>These libraries are used by thousands of developers and have been thoroughly tested in production environments, bringing robustness and efficiency to your projects.</p><h4><strong>Explore Useful Libraries</strong></h4><p>Identify commonly used libraries in your chosen tech stack that can make your code more concise and efficient. </p><p>For instance, in the Java ecosystem, Apache Commons offers a variety of utility functions that handle many of the repetitive tasks for you. </p><p>Integrating these libraries into your projects not only speeds up development but also teaches you how to rely on battle-tested code to solve common problems.</p><h3><strong>Identify and Address Skill Gaps</strong></h3><p>As you near the completion of your projects, take a step back and assess any gaps in your skill set. This might include missing technical skills, foundational concepts, or knowledge of software development processes.</p><p>The key here is to be honest with yourself about where you need improvement.</p><h4><strong>Create a Learning Plan</strong></h4><p>Address these gaps one at a time. You can extend your current project to practice these skills or start a new project specifically designed to target your weak areas. </p><p>For example, if you&#8217;re unfamiliar with certain libraries or need to brush up on data structures, make that a focus in your next project iteration.</p><h4><strong>Market Research and Applying for Jobs</strong></h4><p>Begin applying for entry-level developer positions, even if you feel you're not yet perfect. </p><p>The feedback you receive from job applications and interviews will provide invaluable insights into what employers are looking for and help you identify further gaps to address. </p><p>Conduct market research on job portals to keep up with the skills in demand for your desired tech stack.</p><h4><strong>Learn from Other Developer&#8217;s Code</strong></h4><p>Reading other developers' code is one of the fastest ways to learn. </p><p>It exposes you to different coding styles, best practices, and new tools. </p><p>Additionally, resources like roadmap.sh can offer more ideas and pathways to expand your skill set.</p><h3><strong>Leverage Your Experience</strong></h3><p>As you gain experience, it's time to capitalize on your hard work. </p><ul><li><p>Update your resume with your new skills and completed projects. </p></li><li><p>Highlight the technologies you&#8217;ve used and the problems you&#8217;ve solved. </p></li><li><p>Start applying for more roles</p></li><li><p>Look to get interviewed to learn your skill-gaps</p></li></ul><h3><strong>Rinse and Repeat</strong></h3><p>This journey is iterative. </p><p>After completing a project and addressing your skill gaps, repeat the process to continuously build on the knowledge you&#8217;ve gained:</p><h4><strong>Identify New Skills</strong></h4><p>Regularly reassess and pinpoint the next set of skills you need to learn.</p><p>This process is continuous and should continue even after you get a job.</p><h4><strong>Expand or Start New Projects</strong></h4><p>Either enhance your existing projects to incorporate new skills or start a new project that challenges you in different ways.</p><p>You should look to continue even after getting a job. Side projects keep you on your toes and you can experiment as much as you want.</p><p>At the job, you may not be able to play with the latest technologies all the time.</p><h4><strong>Incorporate New Tools and Libraries</strong></h4><p>Continuously refine your code by incorporating libraries and tools you discover through research or by reading other developers&#8217; work.</p><h4><strong>Refactor and Improve</strong></h4><p>Refactor your code to improve readability and performance, demonstrating your growth and commitment to quality software development.</p><p>By following these steps, you&#8217;ll create a solid foundation, gain practical experience, and confidently transition from quality assurance to full-time software development.</p><div><hr></div><h2>Conclusion</h2><p>You&#8217;ve made it this far, but this is just the beginning. </p><p>The path from QA to full-time developer isn&#8217;t some distant dream&#8212;it&#8217;s within your reach. </p><p>You&#8217;ve already got the foundation, the drive, and the grit to make this transition. Now it&#8217;s about taking action, making strategic moves, and never letting the overwhelm keep you stuck.</p><p><strong>But let&#8217;s be real: You can&#8217;t do it all alone.</strong> </p><p>Trying to piece together bits of advice from a hundred different sources will only slow you down. </p><p>You need a clear, focused plan that keeps you on track and shows you exactly what to do next. </p><p>That&#8217;s why I&#8217;ve put together a free mind map outlining the entire process&#8212;a proven guide to take you from where you are now to where you want to be. </p><p>And no, I&#8217;m not dumping it in this post because I want it in the hands of people who are committed to moving forward, people who are action-takers and who are serious about moving from QA to Developer.</p><p>If you&#8217;re ready to be one of those people, click the link below to get your free mind map.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/p/8ed99c/your-action-plan-transitioning-from-qa-to-developer&quot;,&quot;text&quot;:&quot;Get Action Plan&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/p/8ed99c/your-action-plan-transitioning-from-qa-to-developer"><span>Get Action Plan</span></a></p><p>And if you&#8217;re ready to supercharge your progress, don&#8217;t just stop at the mind map. </p><p>I&#8217;m hosting a <strong>FREE</strong> workshop that will walk you through building your projects&#8212;projects that employers can&#8217;t ignore. </p><p>It&#8217;s will provide you with a solid framework that you can use to build project after project. </p><p>Even after you get a job, you can use this framework to deliver projects on time without bugs.</p><p>Don&#8217;t wait&#8212;spaces are limited, and you don&#8217;t want to miss out.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.eventbrite.com/e/pace-yourself-to-a-dream-dev-job-4-steps-to-standout-software-projects-tickets-1010133665987?aff=oddtdtcreator&quot;,&quot;text&quot;:&quot;Register&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.eventbrite.com/e/pace-yourself-to-a-dream-dev-job-4-steps-to-standout-software-projects-tickets-1010133665987?aff=oddtdtcreator"><span>Register</span></a></p><p></p><p>This is your moment. </p><p>Your opportunity to stop dreaming and start doing. </p><p>Click the links, grab the resources, and let&#8217;s make your transition to software development a reality. </p><p>You&#8217;ve got this.</p>]]></content:encoded></item><item><title><![CDATA[The Ultimate Guide to Create Spring Boot Custom Annotations]]></title><description><![CDATA[Level Up Your Code with These Pro Tips and Tricks]]></description><link>https://weekendprogrammer.substack.com/p/the-ultimate-guide-to-create-spring</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/the-ultimate-guide-to-create-spring</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Sat, 24 Aug 2024 00:27:55 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b532d066-2cfa-4016-ac98-f0d8139d2b08_500x300.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128075;<em> Hi, this is&nbsp;<a href="https://www.linkedin.com/in/dishitdevasia/">Dishit</a>&nbsp;with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.</em></p><p><strong>&#128680; </strong><em><strong>Announcement</strong></em><strong> &#128680; <br></strong><em><strong>DM me to</strong></em><strong> </strong><em>get a FREE code review session.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fRsx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea1ebac-988e-4fa6-b78b-3c3d90c42f4e_558x153.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fRsx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea1ebac-988e-4fa6-b78b-3c3d90c42f4e_558x153.png 424w, https://substackcdn.com/image/fetch/$s_!fRsx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea1ebac-988e-4fa6-b78b-3c3d90c42f4e_558x153.png 848w, https://substackcdn.com/image/fetch/$s_!fRsx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea1ebac-988e-4fa6-b78b-3c3d90c42f4e_558x153.png 1272w, https://substackcdn.com/image/fetch/$s_!fRsx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea1ebac-988e-4fa6-b78b-3c3d90c42f4e_558x153.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fRsx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea1ebac-988e-4fa6-b78b-3c3d90c42f4e_558x153.png" width="558" height="153" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fea1ebac-988e-4fa6-b78b-3c3d90c42f4e_558x153.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:153,&quot;width&quot;:558,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:20526,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fRsx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea1ebac-988e-4fa6-b78b-3c3d90c42f4e_558x153.png 424w, https://substackcdn.com/image/fetch/$s_!fRsx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea1ebac-988e-4fa6-b78b-3c3d90c42f4e_558x153.png 848w, https://substackcdn.com/image/fetch/$s_!fRsx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea1ebac-988e-4fa6-b78b-3c3d90c42f4e_558x153.png 1272w, https://substackcdn.com/image/fetch/$s_!fRsx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea1ebac-988e-4fa6-b78b-3c3d90c42f4e_558x153.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>A project in Spring Boot is littered with such annotations across the whole project. </p><p>But do you know what problems these annotations solve?</p><p>Why were custom annotations introduced to begin with?</p><p>How to create spring boot custom annotations?</p><p>Today, I will cover:</p><ul><li><p>Why create custom annotations?</p></li><li><p>Key benefits of annotation</p></li><li><p>How to create custom annotations?</p></li><li><p>When to use custom annotations?</p></li><li><p>When not to use custom annotations?</p></li><li><p>What are the disadvantages of using custom annotations?</p></li></ul><h2>&#127919; <strong>Why Create Custom Annotations?</strong></h2><p>In Spring Boot, annotations are more than just a way to add metadata. They</p><ul><li><p>Simplify complex tasks</p></li><li><p>Reduce boiler-plate code</p></li><li><p>Enhance code-readability</p></li></ul><p>Before Spring introduced custom annotations, configurations like email validation were typically managed using XML configuration files. </p><p>The XML configuration would define beans, validators, and other necessary components to perform tasks such as validating email addresses. </p><p>Here's an example of how email validation might have been configured using XML in a Spring application:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9FKB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9d54515-d803-4eb9-978d-614363edafc7_651x604.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9FKB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9d54515-d803-4eb9-978d-614363edafc7_651x604.png 424w, https://substackcdn.com/image/fetch/$s_!9FKB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9d54515-d803-4eb9-978d-614363edafc7_651x604.png 848w, https://substackcdn.com/image/fetch/$s_!9FKB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9d54515-d803-4eb9-978d-614363edafc7_651x604.png 1272w, https://substackcdn.com/image/fetch/$s_!9FKB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9d54515-d803-4eb9-978d-614363edafc7_651x604.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9FKB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9d54515-d803-4eb9-978d-614363edafc7_651x604.png" width="651" height="604" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a9d54515-d803-4eb9-978d-614363edafc7_651x604.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:604,&quot;width&quot;:651,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:120208,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9FKB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9d54515-d803-4eb9-978d-614363edafc7_651x604.png 424w, https://substackcdn.com/image/fetch/$s_!9FKB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9d54515-d803-4eb9-978d-614363edafc7_651x604.png 848w, https://substackcdn.com/image/fetch/$s_!9FKB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9d54515-d803-4eb9-978d-614363edafc7_651x604.png 1272w, https://substackcdn.com/image/fetch/$s_!9FKB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9d54515-d803-4eb9-978d-614363edafc7_651x604.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As you can see, this can easily become a nightmare where there are hundreds of classes with many of them relying on each other.</p><p>It also meant a developer has to go look-up this XML every time they have to add a new dependency.</p><h3>Key Benefits of Custom Annotations</h3><h4><strong>Simplification of Configuration</strong></h4><p>Spring introduced custom annotations to simplify configuration by allowing developers to use annotations directly in their code. </p><p>This reduced the need for extensive XML configuration, making the codebase cleaner and easier to maintain.</p><h4><strong>Support for Declarative Programming</strong></h4><p>Custom annotations in Spring enable a declarative approach. </p><p>Developers can use annotations like <code>@Transactional</code>, <code>@Cacheable</code>, or <code>@Scheduled</code> to declare desired behaviors without writing the underlying logic. </p><p>This results in more readable and maintainable code.</p><h4>Handling Cross-Cutting Concerns</h4><p>Spring's custom annotations, often used in conjunction with Aspect-Oriented Programming (AOP), allow developers to handle cross-cutting concerns in a centralized manner.</p><p>For example, the <code>@Transactional</code> annotation can be used to manage transactions across multiple methods or classes without scattering transaction management logic throughout the code.</p><h4>Reducing Boilerplate Code</h4><p>It reduces the need for boilerplate code by encapsulating common behaviors. </p><p>For instance, the <code>@Autowired</code> annotation simplifies dependency injection, allowing Spring to automatically inject dependencies, rather than requiring explicit constructor or setter methods</p><h4>Improving Code Readability and Consistency</h4><p>By abstracting configuration and cross-cutting concerns into annotations, Spring improves the readability of the code. </p><p>You and your peer developers can quickly understand the purpose of a method or class by looking at its annotations, and annotations help enforce consistency across the codebase.</p><h4><strong>Framework Flexibility and Extensibility</strong></h4><p>Custom annotations allows developers to create their own annotations tailored to specific needs, thereby extending the framework's functionality in a standardized way. </p><p>This flexibility has helped Spring remain relevant and powerful across different types of applications and architectures.</p><h2>&#128640; <strong>How to Create a Custom Annotation</strong></h2><h4>Step 1: Define the Annotation</h4><ul><li><p>Create a new annotation by defining an interface.</p></li><li><p>Use <code>@interface</code> to declare it.</p></li><li><p>Add meta-annotations to specify how the annotation should behave.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xX0n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744321b4-b70c-4255-a079-4265cc4e3a87_697x283.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xX0n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744321b4-b70c-4255-a079-4265cc4e3a87_697x283.png 424w, https://substackcdn.com/image/fetch/$s_!xX0n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744321b4-b70c-4255-a079-4265cc4e3a87_697x283.png 848w, https://substackcdn.com/image/fetch/$s_!xX0n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744321b4-b70c-4255-a079-4265cc4e3a87_697x283.png 1272w, https://substackcdn.com/image/fetch/$s_!xX0n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744321b4-b70c-4255-a079-4265cc4e3a87_697x283.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xX0n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744321b4-b70c-4255-a079-4265cc4e3a87_697x283.png" width="697" height="283" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/744321b4-b70c-4255-a079-4265cc4e3a87_697x283.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:283,&quot;width&quot;:697,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:52867,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xX0n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744321b4-b70c-4255-a079-4265cc4e3a87_697x283.png 424w, https://substackcdn.com/image/fetch/$s_!xX0n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744321b4-b70c-4255-a079-4265cc4e3a87_697x283.png 848w, https://substackcdn.com/image/fetch/$s_!xX0n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744321b4-b70c-4255-a079-4265cc4e3a87_697x283.png 1272w, https://substackcdn.com/image/fetch/$s_!xX0n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744321b4-b70c-4255-a079-4265cc4e3a87_697x283.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p><code>@Target</code><strong>:</strong> Indicates where the annotation can be used (e.g., methods, classes).</p></li><li><p><code>@Retention</code><strong>:</strong> Indicates how long the annotation is retained (e.g., runtime, compile-time).</p></li></ul><h4>Step 2: Create an Aspect to Handle the Annotation</h4><p>You can create a custom logic to process the annotation using Spring&#8217;s <code>BeanPostProcessor</code>, <code>Aspect</code>, or custom annotation processing logic.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5Jpk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f0ffe6-967b-4f1e-a720-fddaf880b28a_834x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5Jpk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f0ffe6-967b-4f1e-a720-fddaf880b28a_834x500.png 424w, https://substackcdn.com/image/fetch/$s_!5Jpk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f0ffe6-967b-4f1e-a720-fddaf880b28a_834x500.png 848w, https://substackcdn.com/image/fetch/$s_!5Jpk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f0ffe6-967b-4f1e-a720-fddaf880b28a_834x500.png 1272w, https://substackcdn.com/image/fetch/$s_!5Jpk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f0ffe6-967b-4f1e-a720-fddaf880b28a_834x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5Jpk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f0ffe6-967b-4f1e-a720-fddaf880b28a_834x500.png" width="834" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/99f0ffe6-967b-4f1e-a720-fddaf880b28a_834x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:834,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:94838,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5Jpk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f0ffe6-967b-4f1e-a720-fddaf880b28a_834x500.png 424w, https://substackcdn.com/image/fetch/$s_!5Jpk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f0ffe6-967b-4f1e-a720-fddaf880b28a_834x500.png 848w, https://substackcdn.com/image/fetch/$s_!5Jpk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f0ffe6-967b-4f1e-a720-fddaf880b28a_834x500.png 1272w, https://substackcdn.com/image/fetch/$s_!5Jpk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99f0ffe6-967b-4f1e-a720-fddaf880b28a_834x500.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>Step 3: Apply the Annotation</h4><p>Apply your custom annotation to methods, fields, or classes as defined</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VC70!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60659fdf-62b1-44bc-ad5c-5337699757a4_505x320.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VC70!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60659fdf-62b1-44bc-ad5c-5337699757a4_505x320.png 424w, https://substackcdn.com/image/fetch/$s_!VC70!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60659fdf-62b1-44bc-ad5c-5337699757a4_505x320.png 848w, https://substackcdn.com/image/fetch/$s_!VC70!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60659fdf-62b1-44bc-ad5c-5337699757a4_505x320.png 1272w, https://substackcdn.com/image/fetch/$s_!VC70!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60659fdf-62b1-44bc-ad5c-5337699757a4_505x320.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VC70!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60659fdf-62b1-44bc-ad5c-5337699757a4_505x320.png" width="505" height="320" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/60659fdf-62b1-44bc-ad5c-5337699757a4_505x320.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:320,&quot;width&quot;:505,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:40268,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VC70!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60659fdf-62b1-44bc-ad5c-5337699757a4_505x320.png 424w, https://substackcdn.com/image/fetch/$s_!VC70!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60659fdf-62b1-44bc-ad5c-5337699757a4_505x320.png 848w, https://substackcdn.com/image/fetch/$s_!VC70!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60659fdf-62b1-44bc-ad5c-5337699757a4_505x320.png 1272w, https://substackcdn.com/image/fetch/$s_!VC70!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60659fdf-62b1-44bc-ad5c-5337699757a4_505x320.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong>Use Cases Where Custom Annotations Are a Good Approach</strong></h3><h4>Cross-Cutting Concerns</h4><p>Custom annotations are ideal for handling cross-cutting concerns like logging, security, transaction management, and caching. </p><p>These are concerns that affect multiple parts of an application but are not related to the core business logic.</p><p>The <strong>@LogExecutionTime</strong> annotation above is a good example as that can be used across all the methods and it does not have any business logic.</p><h4>Declarative Programming</h4><p>When you want to specify <em>what</em> should happen rather than <em>how</em> it should happen, custom annotations provide a clean and expressive way to do this.</p><p>Annotations like <code>@Cacheable</code> or <code>@Retry</code> allow developers to enable caching or retry logic declaratively, without writing the implementation code manually.</p><h4>Framework or Library Integration</h4><p>Custom annotations can simplify the integration of frameworks or libraries by hiding the complexity behind an easy-to-use annotation.</p><p>Annotations like <code>@Autowired</code> in Spring help in injecting dependencies without having to manually instantiate them.</p><h4>Encapsulation of Complex Logic</h4><p>When complex logic needs to be encapsulated in a reusable way, custom annotations can provide a clean API for applying this logic.</p><p>An annotation like <code>@RateLimit</code> could encapsulate logic to limit the number of times a method can be called, without cluttering the method's body with this logic.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UBUJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217744d6-6b43-4f94-9da6-cb360171ffaa_500x281.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UBUJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217744d6-6b43-4f94-9da6-cb360171ffaa_500x281.png 424w, https://substackcdn.com/image/fetch/$s_!UBUJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217744d6-6b43-4f94-9da6-cb360171ffaa_500x281.png 848w, https://substackcdn.com/image/fetch/$s_!UBUJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217744d6-6b43-4f94-9da6-cb360171ffaa_500x281.png 1272w, https://substackcdn.com/image/fetch/$s_!UBUJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217744d6-6b43-4f94-9da6-cb360171ffaa_500x281.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UBUJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217744d6-6b43-4f94-9da6-cb360171ffaa_500x281.png" width="500" height="281" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/217744d6-6b43-4f94-9da6-cb360171ffaa_500x281.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:281,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:146553,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!UBUJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217744d6-6b43-4f94-9da6-cb360171ffaa_500x281.png 424w, https://substackcdn.com/image/fetch/$s_!UBUJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217744d6-6b43-4f94-9da6-cb360171ffaa_500x281.png 848w, https://substackcdn.com/image/fetch/$s_!UBUJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217744d6-6b43-4f94-9da6-cb360171ffaa_500x281.png 1272w, https://substackcdn.com/image/fetch/$s_!UBUJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F217744d6-6b43-4f94-9da6-cb360171ffaa_500x281.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3>Use Cases Where Custom Annotations Should Not Be Used</h3><h4>Simple or One-Off Logic</h4><p>If the logic is simple or only needs to be applied in a single place, creating a custom annotation is overkill and can unnecessarily complicate the code.</p><h4>Logic That Requires Dynamic Behavior</h4><p>Annotations are statically defined at compile-time, making them unsuitable for scenarios where behavior needs to be dynamically determined at runtime.</p><p>If a method's behavior should change based on user input or external configuration, handling this with custom annotations can lead to overly complex solutions.</p><h4>Business Logic</h4><p>Core business logic should not be abstracted into custom annotations, as this can make the logic less transparent and harder to maintain.</p><p>Using an annotation to encapsulate a business process like <code>@ProcessOrder</code> might hide important business rules, making the code harder to understand and maintain.</p><h4>Complex Interactions Between Annotations</h4><p>If the behavior depends on complex interactions between multiple annotations, it can lead to unexpected results and make the code difficult to understand and debug.</p><p>Combining multiple custom annotations that affect the same method (e.g., <code>@Retry</code>, <code>@Cacheable</code>, <code>@LogExecutionTime</code>) can result in unpredictable behavior and is difficult to manage</p><h4>Performance-Critical Code</h4><p>Custom annotations often rely on reflection or proxy mechanisms, which can introduce performance overhead. They should not be used in performance-critical sections of code.</p><p>Using a custom annotation to add logging to a method that is called millions of times in a tight loop could significantly degrade performance.</p><h2>&#128161; TDLR - <strong>When to Use Custom Annotations</strong></h2><p>Custom annotations are perfect for handling cross-cutting concerns like logging, security, and transaction management. </p><p>They're also great for scenarios where you need to apply the same behavior across multiple parts of your application.</p><p>However, for simple, one-off logic, or where fine-grained control and flexibility are required, custom annotations might not be the best approach. </p><p>Consider the trade-offs before you decide to implement them.</p><h2>&#127775; <strong>Final Thoughts</strong></h2><p>Custom annotations are a powerful tool in your Spring Boot arsenal, but like any tool, they should be used judiciously. </p><p>They offer a clean, reusable way to handle repetitive tasks and enforce consistency across your codebase. </p><p>But be mindful of the potential downsides, especially when it comes to complexity and performance.</p><div><hr></div><h2>&#128227;&#128227; Announcement</h2><p>10-day cohort-based course for software developers and aspiring microservices architects on designing and implementing rate-limiting service using Spring Boot and Bucket4j.</p><p>You'll learn:</p><p>&#9989; How to design and build a production-ready microservice</p><p>&#9989; In-depth knowledge of rate-limiting algorithms and their implementation</p><p>&#9989; Best practices in Spring Boot development, testing, and containerisation</p><p>But it is also about</p><p>&#9989; breaking down the project into specific tasks</p><p>&#9989; Being accountable to yourself</p><p>&#9989; Designing and Building the project right</p><p>It is targeted at software developers who want to design and develop a microservice which is a use case relevant to most companies.</p><p>It's ESPECIALLY for those earlier in their software developer career who might not have "project experience" but tons of passion and ambition.</p><p>If this is something that you think will help you or even if you are just curious to know more:</p><p>Register your interest and I will let you know the workshop details.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/forms/34856a&quot;,&quot;text&quot;:&quot;Register&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/forms/34856a"><span>Register</span></a></p><div><hr></div><h2>Before You Go</h2><p>Thanks for your continued support and I look forward to provide valuable content through this newsletter!</p><p>Remember, this newsletter is always going to be free as going paid was never the plan.</p><p>But there are people who might need additional support through a guided workshop. So that is why, I am reaching out today for help from my readers &#128578;</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/p/the-ultimate-guide-to-create-spring?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Share this post so that others will also benefit from it</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/p/the-ultimate-guide-to-create-spring?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/p/the-ultimate-guide-to-create-spring?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Will you help me? ]]></title><description><![CDATA[In my last newsletter, I mentioned about the mistakes people do w it comes to building projects to get jobs.]]></description><link>https://weekendprogrammer.substack.com/p/will-you-help-me</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/will-you-help-me</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Mon, 19 Aug 2024 11:59:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Uv-U!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b349647-4112-4a10-96ee-58e4fb923ce6_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In my last newsletter, I mentioned about the mistakes people do w it comes to building projects to get jobs. </p><p>Because I saw lot of interest and queries that came up on the back of the post, I decided to create a guided workshop. </p><p>I'm thinking about building a live, 10-day cohort-based course for software developers and aspiring microservices architects on designing and implementing rate-limiting service using Spring Boot and Bucket4j. </p><p>You'll learn:</p><p> &#9989; How to design and build a production-ready microservice</p><p>&#9989; In-depth knowledge of rate-limiting algorithms and their implementation</p><p>&#9989; Best practices in Spring Boot development, testing, and containerisation</p><p>But it is also about</p><p>&#9989; breaking down the project into specific tasks </p><p>&#9989; Being accountable to yourself</p><p>&#9989; Designing and Building the project right</p><p>It is targeted at software developers who want to design and develop a microservice which is a use case relevant to most companies.</p><p>It's ESPECIALLY for those earlier in their software developer career who might not have "project experience" but tons of passion and ambition.</p><p>If this is something that you think will help you or even if you are just curious to know more:</p><p>Register your interest  and I will let you know the workshop details. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/forms/34856a&quot;,&quot;text&quot;:&quot;Register&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/forms/34856a"><span>Register</span></a></p><p>PS: Now I know, you might be a person with decades of experience and may not need the workshop. </p><p>But if you have any feedback that will help me, please provide the feedback using the below button. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/forms/34856a&quot;,&quot;text&quot;:&quot;Provide Feedback&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/forms/34856a"><span>Provide Feedback</span></a></p><p></p><p>P.PS: If you know someone who will be benefit from this course, please share the link. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/forms/34856a&quot;,&quot;text&quot;:&quot;Share Link&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/forms/34856a"><span>Share Link</span></a></p><p>Thanks for your continued support and I look forward to provide valuable content through this newsletter! </p><p>Remember, this newsletter is always going to be free as going paid was never the plan. </p><p>But there are people who might need additional support through a guided workshop. So that is why, I am reaching out today for help from my readers &#128578;</p><p></p><p></p><p></p><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[The Top 5 Mistakes That Can Derail Your Development Projects]]></title><description><![CDATA[Watch now | &#128075; Hi, this is Dishit with this week&#8217;s newsletter.]]></description><link>https://weekendprogrammer.substack.com/p/the-top-5-mistakes-that-can-derail</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/the-top-5-mistakes-that-can-derail</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Sun, 11 Aug 2024 10:53:09 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/147567738/6f88061eb58d4ee3f1556d0e3ceb09b1.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>&#128075;<em> Hi, this is&nbsp;<a href="https://www.linkedin.com/in/dishitdevasia/">Dishit</a>&nbsp;with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.</em></p><p><em>Today, I will do something special.</em></p><p><em>If you subscribe to this newsletter, you will get a FREE code review session.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>Have you ever started a project, only to find yourself stuck midway and ultimately abandoning it? </p><p>You're not alone. </p><p>Many developers face feelings of overwhelm, frustration, and a lack of progress, leading to the abandonment of their projects. </p><p>But did you know that the root cause of these issues often lies in mistakes made even before you start?</p><h2><strong>Common Pitfalls to Avoid</strong></h2><p>Here are <strong>five common mistakes</strong> that can lead to feelings of being overwhelmed and stuck:</p><h3><strong>1. Lack of Learning Goals</strong></h3><p>One of the cardinal mistakes new developers make is not having clear learning goals. As Stephen Covey mentions in <em>The 7 Habits of Highly Effective People</em>, it&#8217;s crucial to "begin with the end in mind." Without defined learning objectives, you may lose sight of the purpose behind your project. Ask yourself:</p><ul><li><p>What do I want to learn from this project?</p></li><li><p>What skills or knowledge will I gain?</p></li></ul><h3><strong>2. Jumping In Without Preparation</strong></h3><p>Many developers skip essential background work and dive straight into coding after reading a blog or watching a video. Instead, break down your project into smaller, manageable chunks. This approach, often used in corporate environments, allows you to track progress and visualize your achievements, making it easier to identify when you're stuck.</p><h3><strong>3. Choosing a Complex Project</strong></h3><p>It's easy to underestimate the complexity of a project, especially if you&#8217;ve seen it executed by an expert. Remember, only an experienced developer can accurately assess a project's difficulty. If you take on something too complex, you may find yourself overwhelmed and unsure of how to proceed.</p><h3><strong>4. Using an Outdated or Cutting-Edge Technology Stack</strong></h3><p>Selecting the right technology stack is crucial. Using outdated technology may not be taken seriously by employers, while cutting-edge technologies can leave you feeling lost. If you're learning new technologies that few others have experience with, you might encounter unique challenges that are difficult to solve.</p><h3><strong>5. Lack of Mentorship</strong></h3><p>Working without a mentor can be detrimental. A mentor can provide guidance on whether your project is too complex, help you navigate challenges, and keep you on the right path. Without this support, you may struggle in isolation, missing out on valuable learning experiences.</p><h2><strong>The Consequences of Abandonment</strong></h2><p>Abandoning a project not only means losing the opportunity to learn but can also impact your resume and future job prospects. Some developers, feeling discouraged, default to easier problems that offer minimal growth, missing out on the significant achievements they could have gained from tackling more challenging projects.</p><h2><strong>Join Free Workshop!</strong></h2><p>I've seen these challenges affect many developers, which is why I'm hosting a <strong>free workshop</strong> to teach a specific framework that can help you overcome these obstacles. </p><p>If you're interested, email me to get the details..</p><p>And if you know someone else who might benefit from this workshop, feel free to share this message with them!</p><p>Thank you for your time, and I look forward to helping you achieve your project goals!</p><div><hr></div><h2>Before you go!</h2><p>If you know someone who is looking to have their code reviewed for technical debts, code smell - look no further.</p><p>Help is here.</p><p>Just subscribe to this newsletter or reply to this email with word &#8220;REVIEW&#8221; and I will review your code</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Are You Making This 1 Developer Mistake to Get a Job as a Software Developer?]]></title><description><![CDATA[Watch now | Learn the best approach to get a backend developer job fast]]></description><link>https://weekendprogrammer.substack.com/p/are-you-making-this-1-developer-mistake</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/are-you-making-this-1-developer-mistake</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Sun, 04 Aug 2024 20:13:25 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/147327124/329d59102c43777f166ab16108b97d3d.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>&#128075;<em> Hi, this is&nbsp;<a href="https://www.linkedin.com/in/dishitdevasia/">Dishit</a>&nbsp;with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.</em></p><p><em>Today, I will do something special.</em></p><p><em>If you subscribe to this newsletter, you will get a FREE code review session.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h3><strong>The Biggest Mistake</strong></h3><p>Do you know what one of the biggest mistakes that most developers make when starting out is? </p><p>It's focusing too much on solving LeetCode problems and understanding Data Structure and Algorithms (DSA). </p><p>While these are important, they shouldn't be the sole focus of your learning journey. Here's why:</p><ul><li><p><strong>Practical Experience</strong><br>Spending all your time on LeetCode and DSA may cause you to miss out on practical experience, which is crucial for your career growth.</p></li><li><p><strong>Job Requirements</strong><br>On the job, you'll be working on problems that span multiple systems. This requires a different set of skills that solving LeetCode does not provide.</p></li><li><p><strong>Reading and Research</strong><br>In a professional setting, you'll spend a lot of time reading API specs, requirement documents, language documentation, and library documentation.</p></li></ul><h3><strong>The Value of Projects</strong></h3><p>Instead of solely focusing on LeetCode problems, consider building projects with specific learning objectives. Here's why projects are valuable:</p><ul><li><p><strong>Real-life Experience</strong><br>Projects provide practical experiences that are more relevant to real-world job requirements.</p></li><li><p><strong>Integration and System Knowledge</strong><br>Through projects, you'll learn to integrate systems, understand domains, and gain valuable domain-specific knowledge.</p></li><li><p><strong>Interview Preparation</strong><br>Many companies prioritise practical skills and domain knowledge over advanced algorithms, making project experience more valuable in interviews.</p></li></ul><h3><strong>Workshop Announcement</strong></h3><p>Now, if you are looking to build project I am in the process of creating a workshop that will help you in your journey to create relevant project.</p><p>Let me know if you are interested.</p><p>Thank you for reading and stay tuned for more valuable insights for developers!</p><div><hr></div><h2>Before you go!</h2><p>If you know someone who is looking to have their code reviewed for technical debts, code smell - look no further.</p><p>Help is here.</p><p>Just subscribe to this newsletter or reply to this email with word &#8220;REVIEW&#8221; and I will review your code.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[[Video] Case Study: Loosely Coupled Architecture]]></title><description><![CDATA[Realise the benefits of loosely coupled architecture through a real-world example]]></description><link>https://weekendprogrammer.substack.com/p/video-case-study-loosely-coupled</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/video-case-study-loosely-coupled</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Tue, 23 Jul 2024 21:15:07 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/146933290/41db52fdc4a79a83dc4d2ff214d08679.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>&#128075;<em> Hi, this is&nbsp;<a href="https://www.linkedin.com/in/dishitdevasia/">Dishit</a>&nbsp;with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.</em></p><p><em>Today, I will do something special.</em></p><p><em>If you subscribe to this newsletter, you will get a FREE code review session.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>If you've been in software development, you've likely come across the concept of loosely coupled design. </p><p>You may understand what it is, but have you seen how it's implemented in practice? </p><p>In this post, I'm going to show you a real-world example of how loosely coupled architecture can make a significant impact in a production environment.</p><h2>The Urgent Issue</h2><p>The other day at work, I was tasked with fixing an urgent issue due to a change in a vendor system that we integrate with. </p><p>Typically, this kind of scenario would require running an entire suite of regression tests and involving quality engineers or software testers. </p><p>However, because of our loosely coupled architecture, the change was minimal and only required a small unit testing, avoiding the need for extensive regression testing.</p><h2>The Architecture</h2><p>Our architecture consists of a vendor application with an internal database exposed via a public API, which is accessed through an integration API by the front end. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_cKs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b22149a-154d-4506-8698-76a8cea1afbf_909x398.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_cKs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b22149a-154d-4506-8698-76a8cea1afbf_909x398.png 424w, https://substackcdn.com/image/fetch/$s_!_cKs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b22149a-154d-4506-8698-76a8cea1afbf_909x398.png 848w, https://substackcdn.com/image/fetch/$s_!_cKs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b22149a-154d-4506-8698-76a8cea1afbf_909x398.png 1272w, https://substackcdn.com/image/fetch/$s_!_cKs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b22149a-154d-4506-8698-76a8cea1afbf_909x398.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_cKs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b22149a-154d-4506-8698-76a8cea1afbf_909x398.png" width="909" height="398" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b22149a-154d-4506-8698-76a8cea1afbf_909x398.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:398,&quot;width&quot;:909,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:93153,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_cKs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b22149a-154d-4506-8698-76a8cea1afbf_909x398.png 424w, https://substackcdn.com/image/fetch/$s_!_cKs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b22149a-154d-4506-8698-76a8cea1afbf_909x398.png 848w, https://substackcdn.com/image/fetch/$s_!_cKs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b22149a-154d-4506-8698-76a8cea1afbf_909x398.png 1272w, https://substackcdn.com/image/fetch/$s_!_cKs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b22149a-154d-4506-8698-76a8cea1afbf_909x398.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When the vendor system made a change, we only needed to update the mapping in the integration API without altering the contract between the front end and the integration API. </p><p>This meant that the front end did not require extensive regression testing, showcasing the benefits of a loosely coupled architecture.</p><h2>The Alternative</h2><p>I also want to illustrate the alternative scenario where the front end directly accesses details from the public API. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WKkA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6117d5-b1d9-4d21-a273-d5f134e1d6a2_801x317.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WKkA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6117d5-b1d9-4d21-a273-d5f134e1d6a2_801x317.png 424w, https://substackcdn.com/image/fetch/$s_!WKkA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6117d5-b1d9-4d21-a273-d5f134e1d6a2_801x317.png 848w, https://substackcdn.com/image/fetch/$s_!WKkA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6117d5-b1d9-4d21-a273-d5f134e1d6a2_801x317.png 1272w, https://substackcdn.com/image/fetch/$s_!WKkA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6117d5-b1d9-4d21-a273-d5f134e1d6a2_801x317.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WKkA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6117d5-b1d9-4d21-a273-d5f134e1d6a2_801x317.png" width="801" height="317" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dd6117d5-b1d9-4d21-a273-d5f134e1d6a2_801x317.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:317,&quot;width&quot;:801,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:71618,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WKkA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6117d5-b1d9-4d21-a273-d5f134e1d6a2_801x317.png 424w, https://substackcdn.com/image/fetch/$s_!WKkA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6117d5-b1d9-4d21-a273-d5f134e1d6a2_801x317.png 848w, https://substackcdn.com/image/fetch/$s_!WKkA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6117d5-b1d9-4d21-a273-d5f134e1d6a2_801x317.png 1272w, https://substackcdn.com/image/fetch/$s_!WKkA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6117d5-b1d9-4d21-a273-d5f134e1d6a2_801x317.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>In this tightly coupled system, any change in the public API would require the front end to change, leading to the need for extensive regression testing and the front end taking on additional responsibilities such as authentication, error handling, and retries.</p><h2>Benefits of Loosely Coupled Architecture</h2><p>The contrast between the two scenarios highlights the benefits of a loosely coupled architecture:</p><h3>Isolation of changes</h3><p>A change in one system does not affect the entire system</p><h3>Reduced blast radius</h3><p>Changes are contained within specific components, minimizing the impact on the overall system</p><h3>Abstraction of complexities</h3><p>Authentication, error handling, and retries are handled in the integration layer, abstracted away from the front end</p><p>In conclusion, a loosely coupled architecture provides numerous advantages in software development, ensuring that changes are isolated and do not disrupt the entire system.</p><p>Thank you for reading! If you found this information valuable, please like and share to help others benefit from it as well</p><div><hr></div><h2>Before you go!</h2><p>If you know someone who is looking to have their code reviewed for technical debts, code smell - look no further.</p><p>Help is here.</p><p>Just subscribe to this newsletter or reply to this email with word &#8220;REVIEW&#8221; and I will review your code.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Tech Outage Explained: CrowdStrike Bug & Azure Cloud Chaos!]]></title><description><![CDATA[How can we recover fast from these outages as well as reduce the blast impact of these outages?]]></description><link>https://weekendprogrammer.substack.com/p/tech-outage-explained-crowdstrike</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/tech-outage-explained-crowdstrike</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Sun, 21 Jul 2024 02:36:48 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/146832824/f3d27ca5009ff530db5c75ef7621e416.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>&#128075;<em> Hi, this is&nbsp;<a href="https://www.linkedin.com/in/dishitdevasia/">Dishit</a>&nbsp;with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.</em></p><p><em>Today, I will do something special.</em></p><p><em>If you subscribe to this newsletter, you will get a FREE code review session.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p><p>Two major IT outages occurred on Friday, throwing airports, aeroplanes and people staring at the blue restart screen.</p><p>The details of the issues are here:</p><p><strong>The CrowdStrike Cybersecurity Software Issue</strong></p><ul><li><p>An update sent out by CrowdStrike caused a bug that prevented Windows systems from starting up, leading to an endless loop of blue screens.</p></li><li><p>The issue primarily affected Windows systems, while Mac and Linux users remained unaffected.</p></li><li><p>The incident highlights the potential impact of software bugs on system functionality and productivity.</p></li></ul><p><strong>The Microsoft Azure Cloud Outage</strong></p><ul><li><p>The Azure Cloud outage was more widespread, impacting systems accessing the centralized cloud services.</p></li><li><p>The issue involved a blockage or disabled access between computer and storage resources, leading to system downtime.</p></li><li><p>While the impact was limited to the US data centre, the incident raises concerns about the reliability of cloud services for businesses and organizations.</p></li></ul><p><strong>Preventing Future Outages</strong></p><ul><li><p>Manual Intervention: Implementing manual recovery options, such as safe mode access and file deletion, can help address software-related issues.</p></li><li><p>Alternate Backup Systems: Having standby options, such as utilizing multiple cloud providers, can mitigate the impact of cloud service outages.</p></li><li><p>AI Automation: Leveraging AI for automated testing and recovery processes can provide efficient solutions, but it also poses long-term risks and dependencies.</p></li></ul><p><strong>The Dangers of Overreliance on AI</strong></p><ul><li><p>While AI automation offers efficiency, there are concerns about potential knowledge gaps and dependencies on AI systems for critical operations.</p></li><li><p>Overreliance on AI may lead to a lack of understanding and control over system issues, posing risks for future troubleshooting and recovery efforts.</p></li></ul><p><strong>Seeking Feedback and Solutions</strong></p><p>Apart from adding processes to prevent manual slip-ups, what else do you think should get implemented to recover or prevent such incidents?</p><p></p><p>In conclusion, the recent IT outages serve as a reminder of the importance of proactive measures and contingency plans to prevent disruptions in critical systems. </p><p>By considering manual interventions, backup systems, and the potential risks of overreliance on AI, organizations can work towards minimizing the impact of IT outages and ensuring the resilience of their IT infrastructure.</p><p>What are your thoughts on preventing IT outages? Share your insights and suggestions in the comments below.</p><p>Thank you for reading and stay tuned for more discussions on IT resilience and recovery strategies.</p><div><hr></div><h2>Before you go!</h2><p>If you know someone who is looking to have their code reviewed for technical debts, code smell - look no further.</p><p>Help is here.</p><p>Just subscribe to this newsletter or reply to this email with word &#8220;REVIEW&#8221; and I will review your code.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[[Video] Software Developers: 7 Proven Steps to Navigate Complex Software]]></title><description><![CDATA[Listen now | How to Learn a Complex Software Quickly?]]></description><link>https://weekendprogrammer.substack.com/p/video-software-developers-7-proven</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/video-software-developers-7-proven</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Tue, 16 Jul 2024 22:45:32 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/146691676/76ec2eb90da761e52e6d58865f3607cb.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>&#128075;<em> Hi, this is&nbsp;<a href="https://www.linkedin.com/in/dishitdevasia/">Dishit</a>&nbsp;with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.</em></p><p><em>Remember, all subscribers can get their code reviewed. This newsletter will always be free. So go ahead and click on the Subscribe button.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p></p><p>Are you a passionate developer looking to learn complex software in a short amount of time? </p><p>This can happen if you have to transition to a new team or a new organisation.</p><p>The challenge is there would be a lot of information lying around and you have to make sense in a short time.</p><p>If you have not done this before, it feels daunting.</p><p>The other problem is that as you do not have all the context, some of the answers you get might be conflicting or confusing.</p><p>In this blog post, we'll discuss the steps you can take to navigate this challenge and come up to speed with a new technology stack.</p><h2><strong>Talking to People</strong></h2><p>The first step in learning complex software quickly is to start talking to people. By engaging in conversations with your colleagues, you can gain valuable insights into the processes and lingo used in the new technology stack. This can often uncover important information that may not be documented elsewhere.</p><h2><strong>Reading Documentation</strong></h2><p>While reading documentation is important, it's essential to complement this with conversations with your peers. By doing so, you can link the information you gather from documentation with real-world scenarios, helping you retain and solidify your understanding of the software.</p><h2><strong>Asking "Dumb" Questions</strong></h2><p>Don't be afraid to ask questions, even if they seem basic or "dumb." Asking questions can clarify concepts and uncover hidden assumptions, ultimately leading to a better understanding of the software.</p><h2><strong>Reading Pull Requests and Code</strong></h2><p>For developers, reading pull requests and code can provide valuable insights into how people collaborate and adhere to quality standards. This can also help you learn about new technologies and gain a deeper understanding of the software.</p><h2><strong>Pairing Up</strong></h2><p>If possible, try to pair up with a colleague who can guide you through the initial learning process. This can provide you with valuable insights and help build your confidence in working with the new technology stack.</p><h2><strong>Playing Around</strong></h2><p>Having access to a test environment can allow you to play around with the software, enabling you to learn through trial and error. This hands-on approach can deepen your understanding of the system architecture.</p><h2><strong>Understanding Data and Request Flow</strong></h2><p>To comprehend a complex software architecture, it's crucial to understand the data and request flow. By grasping how data moves through different processes and systems, you can gain a better understanding of the software's complexity and integration.</p><h2><strong>Maintaining an Engineering Log</strong></h2><p>Consider maintaining a log of your learning journey, documenting the concepts and insights you gather each day. This can serve as a personal knowledge repository, allowing you to refer back to previous learnings and track your progress.</p><p>By following these steps, you can effectively learn a complex software quickly and come up to speed with a new technology stack. Remember, learning by doing and seeking guidance from your peers can significantly accelerate your learning process.</p><p>Don't forget to like and share this blog post if you found it helpful. Sharing this information can benefit others who may be facing similar challenges. </p><p>Thank you for reading!</p><h2>Before you go!</h2><p>If you know someone who is looking to have their code reviewed for technical debts, code smell - look no further.</p><p>Help is here.</p><p>Just subscribe to this newsletter or reply to this email with word &#8220;REVIEW&#8221; and I will review your code.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[[Video] A Brief Introduction to Kafka (with analogy)]]></title><description><![CDATA[Discover the reasons behind the initial development of Kafka and how it facilitates the implementation of microservices architecture.]]></description><link>https://weekendprogrammer.substack.com/p/video-a-brief-introduction-to-kafka</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/video-a-brief-introduction-to-kafka</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Sat, 06 Jul 2024 22:30:24 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/45c66f2a-8116-4bcd-b1c6-c478f25d7ee4_3049x4573.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128075;<em> Hi, this is&nbsp;<a href="https://www.linkedin.com/in/dishitdevasia/">Dishit</a>&nbsp;with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.</em></p><p><em>Remember, all subscribers can get their code reviewed. This newsletter will always be free. So go ahead and click on the Subscribe button.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;7e50c2d2-723d-44ff-8554-729e92f0aa82&quot;,&quot;duration&quot;:null}"></div><p></p><p>In a previous video, we discussed how GitHub improved its performance and reliability by incorporating Kafka into their architecture. If you haven't watched the video yet, you can find the link in the description.</p><h3>What is Kafka?</h3><p>To understand the role of Kafka in the microservices world, let's start with an analogy. Think back to the days of scheduled TV broadcasts, where missing a show meant you might never get to watch it again. </p><p>This is in stark contrast to today's streaming services like Netflix, where you can watch shows at any time with the click of a button. </p><p>itsKafka operates similarly in the microservices world, ensuring that systems remain consistent and robust even when individual services experience downtime.</p><h3>How Kafka Works in Microservices</h3><p>Consider a scenario with three services: order service, payment service, and stock service, each with its own specific function. In a normal operation, these services interact seamlessly. However, if the stock service were to go down, it could create a discrepancy in the system. This is where Kafka comes into play, ensuring that events are recorded and processed consistently, even when services experience downtime.</p><p>Using Kafka, the order service simply announces when an event occurs, such as a new order being placed. </p><p>The payment and stock services listen for these events and perform their respective functions accordingly. If the stock service were to go down, the payment service would generate an event indicating that the payment has been verified. </p><p>When the stock service comes back online, it can retrieve and process all missed events, ensuring system consistency.</p><h3>Benefits of Kafka in Microservices</h3><p>Kafka offers several benefits in a microservices architecture, including:</p><ul><li><p>Event-driven architecture: Kafka enables a decoupled, event-driven approach to microservices communication, ensuring that services can operate independently.</p></li><li><p>Fault tolerance: With Kafka, services can recover and process missed events, maintaining system consistency even in the event of downtime.</p></li><li><p>Scalability: As the number of services in a microservices architecture grows, Kafka provides a scalable solution for managing event processing.</p></li></ul><h3>Conclusion</h3><p>Kafka plays a crucial role in ensuring the reliability and consistency of microservices architecture. </p><p>By providing a robust event-driven communication platform, Kafka enables seamless interaction between services, even in the face of downtime. </p><p>If you're interested in learning more about Kafka and its complexities, feel free to reach out to me. </p><p>If you found this content helpful, let me know in the comments or by liking the post. </p><div><hr></div><h2>Before you go!</h2><p>If you know someone who is looking to have their code reviewed for technical debts, code smell - look no further.</p><p>Help is here.</p><p>Just subscribe to this newsletter or reply to this email with word &#8220;REVIEW&#8221; and I will review your code.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[[Video] How GitHub Changed Their Approach to Processing 300 Million Pushes Every Day?]]></title><description><![CDATA[Get the key lessons that you can apply from GitHub's story]]></description><link>https://weekendprogrammer.substack.com/p/video-how-github-changed-their-approach</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/video-how-github-changed-their-approach</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Mon, 01 Jul 2024 21:08:55 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2467f81e-5dca-4090-bea1-f5a31bfbfddb_5472x3648.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128075;<em> Hi, this is&nbsp;<a href="https://www.linkedin.com/in/dishitdevasia/">Dishit</a>&nbsp;with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.</em></p><p><em>Remember, all subscribers can get their code reviewed. This newsletter will always be free. So go ahead and click on the Subscribe button.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>If you have been following GitHub Engineering Blog, you would have seen how they changed their approach to processing 300 million daily pushes.&nbsp;</p><p>If not, help is here.</p><p>300 million pushes per day is significant, and it&#8217;s fascinating to see how they tackled the challenges associated with such a large volume of operations.</p><p>In this video, I&#8217;ll be going through the key points from the blog and discussing how you can apply the learnings to your day-to-day work.&nbsp;</p><p>It&#8217;s one thing to read about a company&#8217;s experience, but it&#8217;s another to understand how you can implement similar strategies in your own projects.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;fcf47864-3810-40be-afe0-e751da6822f4&quot;,&quot;duration&quot;:null}"></div><p>The blog highlighted the issues GitHub faced with their previous approach, where a monolithic process triggered by each push resulted in a sequence of 50+ tasks being executed.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g0uF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a806a44-65d2-4226-96e7-ca8214fac5c9_1236x266.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g0uF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a806a44-65d2-4226-96e7-ca8214fac5c9_1236x266.png 424w, https://substackcdn.com/image/fetch/$s_!g0uF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a806a44-65d2-4226-96e7-ca8214fac5c9_1236x266.png 848w, https://substackcdn.com/image/fetch/$s_!g0uF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a806a44-65d2-4226-96e7-ca8214fac5c9_1236x266.png 1272w, https://substackcdn.com/image/fetch/$s_!g0uF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a806a44-65d2-4226-96e7-ca8214fac5c9_1236x266.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g0uF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a806a44-65d2-4226-96e7-ca8214fac5c9_1236x266.png" width="1236" height="266" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a806a44-65d2-4226-96e7-ca8214fac5c9_1236x266.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:266,&quot;width&quot;:1236,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:29007,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!g0uF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a806a44-65d2-4226-96e7-ca8214fac5c9_1236x266.png 424w, https://substackcdn.com/image/fetch/$s_!g0uF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a806a44-65d2-4226-96e7-ca8214fac5c9_1236x266.png 848w, https://substackcdn.com/image/fetch/$s_!g0uF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a806a44-65d2-4226-96e7-ca8214fac5c9_1236x266.png 1272w, https://substackcdn.com/image/fetch/$s_!g0uF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a806a44-65d2-4226-96e7-ca8214fac5c9_1236x266.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>This sequential process led to increased latency, a higher risk of system failure, and difficulties in troubleshooting and testing.</p><p>To address these challenges, GitHub introduced Kafka to create a job queue bridge.&nbsp;</p><p>It split the monolithic job into multiple independent tasks that could be run in parallel.&nbsp;</p><p>This approach led to several advantages, including improved performance, easier troubleshooting, and the ability to scale specific tasks as needed.</p><p><strong>So, how can you apply these lessons to your own work?&nbsp;</strong></p><p>Even if you&#8217;re not dealing with the scale of GitHub, you may encounter similar issues with tightly coupled systems, complex classes, and difficult testing processes.&nbsp;</p><p>Here are some key takeaways:</p><ul><li><p>Break down complex classes into smaller, more manageable pieces to make testing easier</p></li><li><p>Consider making tightly coupled systems asynchronous to improve performance and reduce waiting times</p></li><li><p>Break down large processes into modular components to simplify testing and maintenance</p></li><li><p>Implement retry mechanisms for integrations with multiple systems, but be mindful of the potential impact on system load and performance</p></li></ul><p>It&#8217;s important to learn from the experiences of companies like GitHub and adapt their strategies to your own projects.&nbsp;</p><p>By addressing issues related to system complexity, testing, and performance, you can improve the overall reliability and efficiency of your own systems.</p><p>Have you faced similar challenges in your own work? How did you overcome them?&nbsp;</p><p>&nbsp;I&#8217;d love to hear about your experiences in the comments below.</p><p>And don&#8217;t forget to check out the<a href="https://github.blog/2024-06-11-how-we-improved-push-processing-on-github/?utm_source=blog.quastor.org&amp;utm_medium=referral&amp;utm_campaign=how-github-rebuilt-their-push-processing-system"> original blog</a> on the GitHub Engineering Blog for more in-depth information on their approach to processing 300 million pushes every day.</p><div><hr></div><h2>Before you go!</h2><p>If you know someone who is looking to have their code reviewed for technical debts, code smell - look no further.</p><p>Help is here.</p><p>Just subscribe to this newsletter or reply to this email with word &#8220;REVIEW&#8221; and I will review your code.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Before you scale, earn customer trust. It's the foundation of growth.]]></title><description><![CDATA[Should you be reading engineering blogs when starting out?]]></description><link>https://weekendprogrammer.substack.com/p/before-you-scale-earn-customer-trust</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/before-you-scale-earn-customer-trust</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Fri, 28 Jun 2024 20:54:55 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/146060787/630df1feea9711240834e8ba68cc247f.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<div><hr></div><p>&#128075;<em> Hi, this is&nbsp;<a href="https://www.linkedin.com/in/dishitdevasia/">Dishit</a>&nbsp;with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.</em></p><p><em>I am trying something new here. So let me know how this video podcast feels.</em></p><div><hr></div><p>As an upcoming developer, you would have read posts about scaling to millions of users. The engineering approaches that big companies like LinkedIn, Facebook or Google took to scale to millions.</p><p>But you may be working for a company that is serving 100 customers a day. Maybe a 1000, 100,000 or even a million.</p><p>So you cannot apply those strategies for your code as it will become costly.</p><p>You do not want to drive a Ferrari to the grocery store.</p><p>The other problem is your organization wants to deliver fast. Your wife needs milk and eggs now. She doesn&#8217;t want to wait until you have enough money to buy a Ferrari.</p><p>So what can you do in your situation?</p><p>Well, the first thing should be how can you do the right thing for your small set of customers.</p><p>How will they feel when they use your product?</p><p>What will their journey look like?</p><p>Can a small car help you get the milk and eggs in time?</p><p>The second piece would be how your peers will look at the product you build. Is it easy to understand? Or will your code have them pulling their hairs out?</p><p>If you are not there, will your car be easy enough to drive for your wife?</p><p>The last bit is how it will help your organisation.</p><p>Are you making pragmatic choices that do not sacrifice speed to quality?<br>Are you building a robust product so that there are minimal issues when it goes to production?<br>Can your car be used for grocery shopping a thousand times without breaking down?<br>An engineer needs to walk the tightrope of balancing quality, speed and customer satisfaction. </p><p>All the big companies Facebook, Google, Netflix went through these phases and earned the customer's trust which gave them the problem to scale. And they scaled.<br></p><p>But for you, focus should be the foundation.&nbsp;<br></p><p>Foundation includes understanding what makes the software maintainable, stable, performant, resilient and secure.</p><p>So going back to the initial question - Should you be reading about scaling?</p><p>Yes, and you also need to focus on the foundation so that you make your existing customers and organisation happy.</p><p>Drop a Y in the comments if having a strong foundation is important before scaling.</p>]]></content:encoded></item><item><title><![CDATA[The Hidden Secrets of Design Patterns: What No One Talks About]]></title><description><![CDATA[Implementation Pitfalls: Common Mistakes and How to Avoid Them]]></description><link>https://weekendprogrammer.substack.com/p/the-hidden-secrets-of-design-patterns</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/the-hidden-secrets-of-design-patterns</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Sat, 22 Jun 2024 20:39:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!APNE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65aa0dd-0298-4a8f-be5d-e6a9d322fcd4_3024x4032.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><p>&#128075;<em> Hi, this is&nbsp;<a href="https://www.linkedin.com/in/dishitdevasia/">Dishit</a>&nbsp;with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.</em></p><p><em>Remember, all subscribers can get their code reviewed. So go ahead and click on the Subscribe button.</em></p><div><hr></div><p>Design patterns are powerful tools for building robust, maintainable software, but they have challenges.</p><p>It is all good to implement design patterns in the sample project. But it becomes a different beast when it comes to real-world projects.</p><p>Understanding these challenges can help you use design patterns more effectively.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!APNE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65aa0dd-0298-4a8f-be5d-e6a9d322fcd4_3024x4032.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!APNE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65aa0dd-0298-4a8f-be5d-e6a9d322fcd4_3024x4032.jpeg 424w, https://substackcdn.com/image/fetch/$s_!APNE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65aa0dd-0298-4a8f-be5d-e6a9d322fcd4_3024x4032.jpeg 848w, https://substackcdn.com/image/fetch/$s_!APNE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65aa0dd-0298-4a8f-be5d-e6a9d322fcd4_3024x4032.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!APNE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65aa0dd-0298-4a8f-be5d-e6a9d322fcd4_3024x4032.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!APNE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65aa0dd-0298-4a8f-be5d-e6a9d322fcd4_3024x4032.jpeg" width="704" height="938.5054945054945" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b65aa0dd-0298-4a8f-be5d-e6a9d322fcd4_3024x4032.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:704,&quot;bytes&quot;:579800,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!APNE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65aa0dd-0298-4a8f-be5d-e6a9d322fcd4_3024x4032.jpeg 424w, https://substackcdn.com/image/fetch/$s_!APNE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65aa0dd-0298-4a8f-be5d-e6a9d322fcd4_3024x4032.jpeg 848w, https://substackcdn.com/image/fetch/$s_!APNE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65aa0dd-0298-4a8f-be5d-e6a9d322fcd4_3024x4032.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!APNE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb65aa0dd-0298-4a8f-be5d-e6a9d322fcd4_3024x4032.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://www.pexels.com/photo/empty-gray-and-white-concrete-spiral-stairs-3023211/">Mithul Varshan</a></figcaption></figure></div><p></p><h2><strong>A Quick Intro to Design Patterns</strong></h2><p>In software development, design patterns are crucial because they provide time-tested solutions to common problems.  </p><p>As software projects grow in complexity, the need for a structured approach becomes evident. </p><p>Design patterns offer a shared vocabulary and understanding that can enhance collaboration among developers.</p><ul><li><p><strong>Efficiency:</strong> Design patterns streamline the development process by providing standard solutions, reducing the need for reinventing the wheel.</p></li><li><p><strong>Maintenance:</strong> Well-implemented patterns lead to code that is easier to understand and modify.</p></li><li><p><strong>Scalability:</strong> Design patterns help build systems that can grow and adapt to changing requirements.</p></li></ul><p>There are three main categories of design patterns:</p><ol><li><p><strong>Creational Patterns:</strong> Deal with object creation mechanisms, trying to create objects in a manner suitable to the situation.</p><ul><li><p>Examples: Singleton, Factory, Builder, Prototype</p></li></ul></li><li><p><strong>Structural Patterns:</strong> Deal with object composition, forming larger structures from individual parts.</p><ul><li><p>Examples: Adapter, Composite, Decorator, Proxy, Facade</p></li></ul></li><li><p><strong>Behavioral Patterns:</strong> Deal with communication between objects, defining how they interact and distribute responsibilities.</p><ul><li><p>Examples: Observer, Strategy, Command, Chain of Responsibility</p></li></ul></li></ol><h2>Design Pattern Challenges</h2><p>While design patterns offer numerous benefits, they can also introduce complexities, especially for those new to the concept. </p><p>Recognizing these challenges can help in better navigating their implementation.</p><ul><li><p><strong>Learning Curve:</strong> Understanding and correctly applying design patterns requires a solid grasp of object-oriented principles and experience.</p></li><li><p><strong>Overuse:</strong> Misapplying patterns or using them unnecessarily can lead to overly complex code.</p></li><li><p><strong>Contextual Fit:</strong> Not every pattern is suitable for every problem; choosing the right one is critical.</p></li><li><p><strong>Communication:</strong> Misunderstandings among team members about how or why a pattern is used can lead to inconsistencies.</p></li></ul><h2>Key Issues with Design Patterns</h2><h3><strong>Overengineering</strong></h3><p>This is one of the biggest issues with design patterns. </p><p>Developers may implement design patterns where simpler solutions would suffice, leading to overcomplicated code.</p><p>Most often, it is the simple code that will get the job done. </p><h3><strong>Incorrect Pattern Selection</strong></h3><p>You can make the code complicated and inefficient by choosing the wrong design pattern for a specific problem. </p><p>A better approach would be to write simple code first and then let it marinate in production for a while.</p><p>As requirements become clearer, it becomes easier to select the pattern as now you can see the pattern forming.</p><h3><strong>Rigid Designs</strong></h3><p>The problem with implementing patterns earlier than required leads to the problem of rigid design. </p><p>Other developers tend to follow the existing design.</p><p>This creates hacks or workaround to get the requirement to fit the design. </p><p>It takes a brave developer to question and rewrite the code. </p><p>But that means more overhead in testing and loss of productivity.</p><h2>Strategies for Effective Use of Design Patterns</h2><ul><li><p>Invest time in thoroughly understanding each design pattern, its use cases, and its benefits. <br>It takes a while to get a complete understanding of the patterns. </p></li><li><p>Assess whether a design pattern is necessary or if a simpler solution will suffice. It is better to err on the side of simplicity as in the beginning there are lot of unknowns.</p></li><li><p>Regularly review and refactor code to keep the code healthy.<br>As requirements change, you will find some of the code can use design patterns. Similarly, you will find some patterns no longer fit the requirements and will need a change.</p></li><li><p>Use common knowledge-sharing sessions to get other develoeper&#8217;s eyes on existing patterns or even before implementing a pattern</p></li><li><p>Documenting the reason for a pattern can help future developers assess if the pattern still helps in meeting the requirements.<br></p></li></ul><p>Design patterns are indispensable tools in the software developer's toolkit, providing proven solutions to common problems and fostering code that is robust, reusable, and maintainable. </p><p>However, like any powerful tool, they come with their own set of challenges. </p><div class="pullquote"><p>With great power comes great responsibility</p></div><p>Understanding these challenges and learning how to navigate them is crucial for leveraging the full potential of design patterns.</p><p><strong>Take Action Today:</strong></p><ol><li><p><strong>Deepen Your Knowledge:</strong> Dedicate time to study and understand various design patterns and their applications.</p></li><li><p><strong>Practice Wisely:</strong> Implement patterns in your projects, starting with simple use cases and gradually tackling more complex scenarios.</p></li><li><p><strong>Seek Feedback:</strong> Engage in code reviews and discussions with your team to refine your understanding and application of design patterns.</p></li><li><p><strong>Reflect and Refactor:</strong> Regularly review your codebase to identify opportunities for improvement and refactoring using appropriate patterns.</p><div><hr></div></li></ol><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to gain exclusive insights on design patterns, best practices, and the latest trends in software development. Elevate your coding skills and stay ahead of the curve.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><strong>Subscribe now and start building better, smarter software today!</strong> &#128640;.</p><p></p><div><hr></div><h2>Before you go!</h2><p>If you know someone who is looking to have their code reviewed for technical debts, code smell - look no further.</p><p>Help is here.</p><p>Just subscribe to this newsletter or reply to this email with word &#8220;REVIEW&#8221; and I will review your code.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share Weekend Developer&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share Weekend Developer</span></a></p><p></p><h3></h3><h2></h2>]]></content:encoded></item><item><title><![CDATA[Technical Debt 101: A Short Quick Guide]]></title><description><![CDATA[Learn the origins, causes and tips to reduce technical debt in your project]]></description><link>https://weekendprogrammer.substack.com/p/technical-debt-101-a-short-quick</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/technical-debt-101-a-short-quick</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Fri, 31 May 2024 22:20:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!k4o8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ec09389-6623-41b3-873a-bd9120ddedce_1512x1122.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128075;<em> Hi, this is&nbsp;<a href="https://www.linkedin.com/in/dishitdevasia/">Dishit</a>&nbsp;with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity.</em></p><p><em>Remember, all subscribers can get their code reviewed. So go ahead and click on the Subscribe button.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>Have you wondered when people talk about technical debts?</p><p>How can so many senior developers still write code that has technical debts?</p><p>You are proud of your work. But are you unsure of what constitutes technical debt?</p><p>Here is what all you need to know about &#8220;Technical Debt&#8221;</p><h2>Origins</h2><p>The term "technical debt" was coined by Ward Cunningham, an American computer programmer who developed the first <a href="https://en.wikipedia.org/wiki/Wiki">wiki</a> and was a co-author of the <em><a href="https://en.wikipedia.org/wiki/Agile_software_development#The_Agile_Manifesto">Manifesto for Agile Software Developmen</a>t</em></p><p>In the early 1990s, Cunningham was working on the WyCash portfolio management system. </p><p>The project required rapid development and deployment to meet business demands.</p><p>Cunningham needed a way to explain to non-technical stakeholders, the long-term implications of making quick and dirty fixes or taking shortcuts in the codebase.</p><p>Cunningham drew an analogy between financial debt and the quick solutions often implemented in software development. <br><br>He compared the shortcuts (such as writing suboptimal code to meet a deadline) to borrowing money. <br><br>Just as borrowing can accelerate financial growth temporarily but requires repayment with interest, quick coding solutions can speed up development but incur future costs in terms of increased maintenance and refactoring efforts.</p><h3><strong>The Famous Explanation</strong></h3><p>Cunningham famously explained the concept as follows:</p><blockquote><p><strong>"Shipping first-time code is like going into debt. A little debt speeds development so long as it is paid back promptly with a rewrite... The danger occurs when the debt is not repaid. Every minute spent on not-quite-right code counts as interest on that debt."</strong></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!k4o8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ec09389-6623-41b3-873a-bd9120ddedce_1512x1122.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!k4o8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ec09389-6623-41b3-873a-bd9120ddedce_1512x1122.png 424w, https://substackcdn.com/image/fetch/$s_!k4o8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ec09389-6623-41b3-873a-bd9120ddedce_1512x1122.png 848w, https://substackcdn.com/image/fetch/$s_!k4o8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ec09389-6623-41b3-873a-bd9120ddedce_1512x1122.png 1272w, https://substackcdn.com/image/fetch/$s_!k4o8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ec09389-6623-41b3-873a-bd9120ddedce_1512x1122.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!k4o8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ec09389-6623-41b3-873a-bd9120ddedce_1512x1122.png" width="1456" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4ec09389-6623-41b3-873a-bd9120ddedce_1512x1122.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:293371,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!k4o8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ec09389-6623-41b3-873a-bd9120ddedce_1512x1122.png 424w, https://substackcdn.com/image/fetch/$s_!k4o8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ec09389-6623-41b3-873a-bd9120ddedce_1512x1122.png 848w, https://substackcdn.com/image/fetch/$s_!k4o8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ec09389-6623-41b3-873a-bd9120ddedce_1512x1122.png 1272w, https://substackcdn.com/image/fetch/$s_!k4o8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ec09389-6623-41b3-873a-bd9120ddedce_1512x1122.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong>How Is Technical Debt Created in Projects?</strong></h3><p>Despite best intentions, there will always be technical debts in software projects. It is like the battery which has its internal resistance. So the output a battery delivers is always minus its internal resistance.</p><p>Technical debt can sneak into your projects in several ways:</p><ol><li><p><strong>Rushed Development:</strong> When deadlines are tight, you might prioritise shipping features over writing clean, maintainable code.</p><ul><li><p><em>Example:</em> You copy-paste code instead of refactoring it into a reusable function.</p></li><li><p><em>Example: </em>You take an informed decision as there could be a scenario where a dependent system might not be ready and you need to get a tactical fix done.</p></li></ul></li><li><p><strong>Lack of Documentation:</strong> Skipping documentation can speed things up, but it makes it harder for others (or future you) to understand the code.</p><ul><li><p><em>Example:</em> You skip writing comments and documentation thinking you&#8217;ll &#8220;remember it later.&#8221;</p></li></ul></li><li><p><strong>Poor Testing:</strong> Insufficient testing can lead to hidden bugs that need to be fixed later, adding to the debt.</p><ul><li><p><em>Example:</em> Tests are written towards the end of writing a feature. So some key tests might be missed in the excitement of coding the next feature.</p></li></ul></li><li><p><strong>Ignoring Refactoring:</strong> As new features are added, failing to refactor the codebase to accommodate them cleanly can create a tangled mess.</p><ul><li><p><em>Example:</em> You keep adding if-else conditions to handle new cases instead of redesigning the logic properly.</p></li><li><p><em>Example: </em>Boiler-plate code is duplicated where a particular functionality is required. Using inheritance or other techniques this can be removed. But until then it adds technical debt.</p></li></ul></li><li><p><strong>Avoiding version upgrades:</strong> Versions of libraries or the used frameworks need to be kept updated. Each version upgrade also leads to the deprecation of some of the features. </p><ul><li><p><em>Example:</em> Certain methods and classes get deprecated whenever Java releases new versions. These need to be updated to ensure your codebase is robust as this could have security implications. </p></li></ul></li><li><p><strong>Lack of Developer Toolings: </strong>There are developer tools like sonar and spotbugs that can detect potential code smells and technical debt. <br><br>Integrating them into the deployment pipeline can help you mitigate many of the issues, as these tools can raise flags for common issues.</p></li></ol><div><hr></div><h3><strong>What If There Is Too Much Technical Debt?</strong></h3><p>Just like financial debt, too much technical debt can become overwhelming. Here&#8217;s what can happen:</p><ul><li><p><strong>Decreased Productivity:</strong> Developers spend more time fixing bugs and understanding convoluted code rather than building new features.</p></li><li><p><strong>Increased Bugs:</strong> A messy codebase is more prone to errors, leading to a more unstable product.</p></li><li><p><strong>Higher Costs:</strong> The longer you wait to address technical debt, the more expensive and time-consuming it becomes to fix.</p></li><li><p><strong>Team Morale:</strong> Working with bad code is frustrating and can lead to burnout among developers.</p></li><li><p><strong>Security Risk: </strong>Lack of upgrading to newer versions of libraries and frameworks can lead to security risks that can expose you or your organization to external threats.</p></li></ul><div><hr></div><h3><strong>Managing Technical Debt</strong></h3><p>So, how do you manage technical debt? Here are some practical tips:</p><ol><li><p><strong>Prioritize Refactoring:</strong> Set aside regular time for refactoring and code cleanup. Treat it as an essential part of your development process. Better still, add code clean-up time as a factor in project estimations.</p><ul><li><p><em>Example:</em> Allocate a day each sprint for code improvement tasks.</p></li></ul></li><li><p><strong>Write Tests:</strong> Invest time in writing unit tests and integration tests to catch issues early.</p><ul><li><p><em>Example:</em> Aim for a certain percentage of code coverage and stick to it. Block builds that does not meet the defined criteria.</p></li></ul></li><li><p><strong>Document as You Go:</strong> Maintain clear and concise documentation to make future maintenance easier.</p><ul><li><p><em>Example:</em> Use tools like Javadoc in Java to generate documentation from comments in your code.</p></li></ul></li><li><p><strong>Review Code:</strong> Conduct code reviews to ensure quality and catch potential issues before they merge into the main codebase.</p><ul><li><p><em>Example:</em> Implement a peer review system where every piece of code is reviewed by at least one other developer.</p></li></ul></li><li><p><strong>Communicate with Stakeholders:</strong> Make sure everyone understands the impact of technical debt and the importance of addressing it.</p><ul><li><p><em>Example:</em> Include technical debt discussions in your project meetings and reports.</p></li></ul></li></ol><div><hr></div><p>In conclusion, technical debt is a natural part of the development process, but it&#8217;s crucial to manage it effectively. </p><p>By understanding why it happens and taking proactive steps to address it, you can keep your codebase healthy and your projects on track.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe for weekly articles on adopting practices to write like a seasoned programmer!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>Before you go!</h2><p>If you know someone who is looking to have their code reviewed for technical debts, code smell - look no further. </p><p>Help is here. </p><p>Just subscribe to this newsletter or reply to this email with word &#8220;REVIEW&#8221; and I will review your code.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share Weekend Developer&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share Weekend Developer</span></a></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[7 Common Unit Testing Mistakes (And How to Avoid Them)]]></title><description><![CDATA[Make your code bug-free and become a confident developer]]></description><link>https://weekendprogrammer.substack.com/p/7-common-unit-testing-mistakes-and</link><guid isPermaLink="false">https://weekendprogrammer.substack.com/p/7-common-unit-testing-mistakes-and</guid><dc:creator><![CDATA[Dishit Devasia]]></dc:creator><pubDate>Fri, 17 May 2024 23:16:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!y8gQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aee9e21-728e-4168-bd57-23eb1c1980e1_6000x4000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><p>&#128075;<em> Hi, this is&nbsp;<a href="https://www.linkedin.com/in/dishitdevasia/">Dishit</a>&nbsp;with this week&#8217;s newsletter. I write about software engineering, clean code and developer productivity. </em></p><p><em>Today, I will do something special. </em></p><p><em>If you subscribe to this newsletter, you will get a FREE code review session.</em></p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><p><em><br>Thank you for your readership </em>&#128591;<em> </em>&#127881;</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y8gQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aee9e21-728e-4168-bd57-23eb1c1980e1_6000x4000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y8gQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aee9e21-728e-4168-bd57-23eb1c1980e1_6000x4000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!y8gQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aee9e21-728e-4168-bd57-23eb1c1980e1_6000x4000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!y8gQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aee9e21-728e-4168-bd57-23eb1c1980e1_6000x4000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!y8gQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aee9e21-728e-4168-bd57-23eb1c1980e1_6000x4000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y8gQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aee9e21-728e-4168-bd57-23eb1c1980e1_6000x4000.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7aee9e21-728e-4168-bd57-23eb1c1980e1_6000x4000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1299725,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!y8gQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aee9e21-728e-4168-bd57-23eb1c1980e1_6000x4000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!y8gQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aee9e21-728e-4168-bd57-23eb1c1980e1_6000x4000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!y8gQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aee9e21-728e-4168-bd57-23eb1c1980e1_6000x4000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!y8gQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aee9e21-728e-4168-bd57-23eb1c1980e1_6000x4000.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://www.pexels.com/photo/1-1-3-text-on-black-chalkboard-374918/">Photo by George Becker</a></figcaption></figure></div><p></p><p>Are you afraid to make any changes to the code because it might cause production incidents?</p><p>Are you suffering from burnout with constant firefighting with the production code?</p><p>Do you find that software test engineers find the most bugs in your code?</p><p>The problem could be that you are not writing unit tests right.</p><p>It is a common problem in the industry as writing unit tests are treated as a chore in most organisations.</p><p>Teams want fast delivery and writing unit tests slows down the delivery.</p><div class="pullquote"><p>Tests are like the break in your car. It gives you the freedom to go fast.</p></div><p>The problem does not start there. The problem begins with the way programming is taught in most places. </p><p>Writing unit tests is one of the later chapters that you learn when learning programming. </p><p>As a developer, you do not value writing tests when you could already smash out code that works out of the box. </p><p>I understand that as I felt the same way. I also did not understand why you have to prove that your code works when you already know it works.`</p><p>So you tend to avoid it.</p><p>But once you start writing code in a job, you discover you need to write those unit tests along with the code. </p><p>But the problem is you have never learned it right. </p><p>You also do not have time to invest in learning to write tests. </p><p>So here are the 10 common mistakes most developers make:</p><h3><strong>1. Not Isolating Tests</strong></h3><p>Unit tests should test a single unit of code in isolation. Dependencies should be mocked or stubbed. Testing multiple units together turns it into an integration test.</p><h4>Mistake</h4><pre><code><code>@Test
public void testServiceMethod() {
    Service service = new Service();
    Database database = new Database(); // Real database, not a mock
    
    service.setDatabase(database); // Injecting a real dependency
    
    assertEquals("ExpectedResult", service.methodUnderTest());
}</code></code></pre><h4>Fix</h4><pre><code><code>@Test
public void testServiceMethod() {
    Service service = new Service();
    Database mockDatabase = Mockito.mock(Database.class);
    
    Mockito.when(mockDatabase.getData()).thenReturn("MockData");
    service.setDatabase(mockDatabase); // Injecting a mock dependency
    
    assertEquals("ExpectedResult", service.methodUnderTest());
}</code></code></pre><p>This could also lead to flaky tests.</p><h4>Mistake</h4><pre><code>@Test
public void testDatabaseQuery() {
    Database database = new Database(); // Real database connection
    database.connect();
    
    List&lt;User&gt; users = database.query("SELECT * FROM users");
    assertEquals(10, users.size());
}</code></pre><p>The problem in the above code is that if the values in the database change then the test fails. e.g. If someone adds a row without your knowledge above test will return 11 and the assertion will fail.</p><h4>Fix</h4><pre><code>@Test
public void testDatabaseQuery() {
    Database mockDatabase = Mockito.mock(Database.class);
    List&lt;User&gt; mockUsers = Arrays.asList(new User("user1"), new User("user2"));
    
    Mockito.when(mockDatabase.query("SELECT * FROM users")).thenReturn(mockUsers);
    
    List&lt;User&gt; users = mockDatabase.query("SELECT * FROM users");
    assertEquals(2, users.size());
}</code></pre><h3>2. Ignoring Edge Cases</h3><p>Ignoring edge cases can lead to missing bugs that occur under special conditions.</p><h4>Mistake</h4><pre><code>@Test
public void testPositiveNumbers() {
    assertEquals(2, MathUtil.add(1, 1));
}</code></pre><h4>Fix</h4><pre><code>@Test
public void testAdd() {
    assertEquals(2, MathUtil.add(1, 1));
    assertEquals(0, MathUtil.add(-1, 1));
    assertEquals(-2, MathUtil.add(-1, -1));
    assertEquals(Integer.MAX_VALUE, MathUtil.add(Integer.MAX_VALUE, 0));
}</code></pre><h3><strong>3. Not Using Assertions Properly</strong></h3><p>Failing to use proper assertions can lead to tests that pass even when the code is incorrect.</p><h4>Mistake</h4><pre><code>@Test
public void testStringConcat() {
    String result = StringUtil.concat("Hello", "World");
    if (!result.equals("HelloWorld")) {
        throw new RuntimeException("Test failed");
    }
}</code></pre><h4>Fix</h4><pre><code>@Test
public void testStringConcat() {
    String result = StringUtil.concat("Hello", "World");
    assertEquals("HelloWorld", result);
}</code></pre><h3><strong>4. Testing Implementation Details Instead of Behavior</strong></h3><p>Tests should focus on the behavior of the code rather than its implementation details. This ensures that tests remain valid even if the internal implementation changes, as long as the behavior remains the same.</p><h4>Mistake</h4><pre><code>@Test
public void testSortingImplementation() {
    List&lt;Integer&gt; list = Arrays.asList(3, 2, 1);
    list.sort(Integer::compareTo);
    
    assertTrue(list.get(0) &lt; list.get(1) &amp;&amp; list.get(1) &lt; list.get(2));
}</code></pre><h4>Fix</h4><pre><code>@Test
public void testSortingBehavior() {
    List&lt;Integer&gt; list = Arrays.asList(3, 2, 1);
    List&lt;Integer&gt; sortedList = SortUtil.sort(list);
    
    assertEquals(Arrays.asList(1, 2, 3), sortedList);
}</code></pre><h3>5. <strong>Ignoring Maintainability</strong></h3><p>Tests should be easy to read, understand, and maintain. Complex and convoluted test cases make it difficult to diagnose issues.</p><p><s>Each test should have 1 assert.</s></p><p>Each test should test one concept or 1 behaviour. If it tests multiple concepts, the test will be complex and hard to maintain.</p><p>You want your tests to be dumb.</p><h4>Mistake</h4><pre><code>@Test
public void testComplexScenario() {
    Service service = new Service();
    service.setConfig("config1", "value1");
    service.setConfig("config2", "value2");
    service.initialize();
    
    assertTrue(service.isInitialized());
    service.performAction("action1");
    assertEquals("result1", service.getResult());
    service.performAction("action2");
    assertEquals("result2", service.getResult());
}</code></pre><h4>Fix</h4><pre><code>@Test
public void testInitialization() {
    Service service = new Service();
    service.setConfig("config1", "value1");
    service.setConfig("config2", "value2");
    service.initialize();
    
    assertTrue(service.isInitialized());
}

@Test
public void testPerformAction1() {
    Service service = new Service();
    service.initialize();
    service.performAction("action1");
    
    assertEquals("result1", service.getResult());
}

@Test
public void testPerformAction2() {
    Service service = new Service();
    service.initialize();
    service.performAction("action2");
    
    assertEquals("result2", service.getResult());
}</code></pre><h3>6. Not Testing for Exceptions</h3><p>Failing to test for expected exceptions can result in unhandled edge cases and bugs.</p><p>Test exception is hard. So simplify by minimising exceptions.  If possible, only let the top-level service handle the exception.  This depends on the context.</p><p>But not testing an exception can cause real pain so beware.</p><h4>Mistake</h4><pre><code>@Test
public void testInvalidInput() {
    Service service = new Service();
    service.processInput("validInput");
    // No test for invalid input
}</code></pre><h4>Fix</h4><pre><code>@Test(expected = IllegalArgumentException.class)
public void testInvalidInput() {
    Service service = new Service();
    service.processInput("invalidInput");
}</code></pre><h3>7. <strong>Not Cleaning Up After Tests</strong></h3><p>Tests should clean up any resources they use to avoid side effects on other tests.</p><p>If cleaning up is not done, it will make your tests flaky. </p><p>The problem with flaky tests is they make your tests unreliable. </p><p>It is as good as if there are no tests.</p><h4>Mistake</h4><pre><code>@Test
public void testFileCreation() throws IOException {
    File file = new File("testFile.txt");
    FileWriter writer = new FileWriter(file);
    writer.write("Test data");
    writer.close();
    
    assertTrue(file.exists());
}</code></pre><h4>Fix</h4><pre><code>@Test
public void testFileCreation() throws IOException {
    File file = new File("testFile.txt");
    try (FileWriter writer = new FileWriter(file)) {
        writer.write("Test data");
    }
    
    assertTrue(file.exists());
    
    if (file.exists()) {
        file.delete();
    }
}</code></pre><p>Now these are some of the common problem that can be solved. </p><p>But this list is not complete as there might be some scenarios that will be unique to your situation.</p><p>So I am giving Free code review sessions if you subscribe to the newsletter.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/subscribe?"><span>Subscribe now</span></a></p><h4>Existing Subscribers </h4><p>Being an existing subscriber, you also get a FREE code review session. Reply to this email with &#8220;REVIEW&#8221; and I will send your the booking details.</p><p>Meanwhile, please recommend this newsletter if you liked the article.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://weekendprogrammer.substack.com/?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share Weekend Developer&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://weekendprogrammer.substack.com/?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share Weekend Developer</span></a></p><p></p><p></p>]]></content:encoded></item></channel></rss>