<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dishit Devasia</title>
    <description>The latest articles on DEV Community by Dishit Devasia (@dishitdevasia).</description>
    <link>https://dev.to/dishitdevasia</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F949702%2F4cdc906f-0d96-4917-9beb-f610cd39904f.jpg</url>
      <title>DEV Community: Dishit Devasia</title>
      <link>https://dev.to/dishitdevasia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dishitdevasia"/>
    <language>en</language>
    <item>
      <title>The Real Reason You’re Getting Rejected in Tech Interviews (It’s Not Your Skills)</title>
      <dc:creator>Dishit Devasia</dc:creator>
      <pubDate>Fri, 16 May 2025 19:02:58 +0000</pubDate>
      <link>https://dev.to/dishitdevasia/the-real-reason-youre-getting-rejected-in-tech-interviews-its-not-your-skills-540j</link>
      <guid>https://dev.to/dishitdevasia/the-real-reason-youre-getting-rejected-in-tech-interviews-its-not-your-skills-540j</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6w24moe25f7jgtp2l2ph.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6w24moe25f7jgtp2l2ph.jpg" alt="Interview" width="800" height="534"&gt;&lt;/a&gt;&lt;br&gt;
You’ve spent years building your skills.&lt;/p&gt;

&lt;p&gt;You’ve put in the late nights, the weekends, the debugging marathons. You’ve solved real problems, learned new tech, and stayed ahead of the curve.&lt;/p&gt;

&lt;p&gt;But when it comes to interviews?&lt;/p&gt;

&lt;p&gt;You feel stuck.&lt;/p&gt;

&lt;p&gt;You give answers you know are technically sound. You talk about the work you’ve done. You try to be clear and confident.&lt;/p&gt;

&lt;p&gt;And yet, the rejections keep coming.&lt;/p&gt;

&lt;p&gt;Sometimes you get ghosted.&lt;/p&gt;

&lt;p&gt;Sometimes you get told someone else was a “better fit.”&lt;/p&gt;

&lt;p&gt;But deep down, you know the truth:&lt;/p&gt;

&lt;p&gt;It’s not because you’re not good enough.&lt;/p&gt;

&lt;p&gt;It’s because your answers did not resonate with the answers interviewers were expecting.&lt;/p&gt;

&lt;p&gt;And that’s the part no one teaches you.&lt;/p&gt;

&lt;p&gt;How to explain your thinking?&lt;/p&gt;

&lt;p&gt;How do you tell the story behind your code without missing technical details?&lt;/p&gt;

&lt;p&gt;How do you show value without sounding like you’re bragging or reciting from a textbook?&lt;/p&gt;

&lt;p&gt;The worst part?&lt;/p&gt;

&lt;p&gt;If you don’t fix this, you could stay stuck here.&lt;/p&gt;

&lt;p&gt;Interview after interview. Job after job.&lt;/p&gt;

&lt;p&gt;Watching less experienced people land roles you deserve.&lt;/p&gt;

&lt;p&gt;Not because they’re smarter. But because they know how to talk like someone who belongs.&lt;/p&gt;

&lt;p&gt;In this post, you’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.&lt;/p&gt;

&lt;h4&gt;
  
  
  Mistake 1: Not doing the right type of preparation
&lt;/h4&gt;

&lt;p&gt;Most people focus on learning the technical details they may not know or trying to brush up on some areas they might have forgotten.&lt;/p&gt;

&lt;p&gt;However, very few people focus on what they have put in their resumes. &lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Other common questions are likely to be asked, and it is better to prepare for them so that you can make a powerful impression.&lt;/p&gt;

&lt;p&gt;Some of them include:&lt;/p&gt;

&lt;p&gt;What are your strengths and weaknesses?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How do you overcome challenges at work?&lt;/li&gt;
&lt;li&gt;What problems have you encountered in your past/current organisation?&lt;/li&gt;
&lt;li&gt;What is one thing you do not like about your past/current organisation that you would like to improve?&lt;/li&gt;
&lt;li&gt;How do you stay updated with technology advances?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mistake 2: Treating the interview as a quiz instead of a conversation
&lt;/h3&gt;

&lt;p&gt;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’t even wait for the interviewer to finish the question.&lt;/p&gt;

&lt;p&gt;Now this has a few problems.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The interviewer will feel that you have not listened to their questions completely, making the interviewer feel not in sync with you. You might come across as a person not open to listening.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When you focus on answering quickly, you forget to provide any nuance that the answer might have. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake 3:  Not referencing your answers with experience
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;The interviewer is not looking for the technical answer, whether you know it or not. &lt;/p&gt;

&lt;p&gt;They are looking for your experience in solving the problem. &lt;/p&gt;

&lt;p&gt;For example, consider the question: In SpringBoot, what is the difference between the @Controller and  @RestController annotations? Now the answer is straightforward.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;@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.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But if you answer it with an example from your experience.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;@Controller is used to return a view and is typically used with something like Thymeleaf. I’ve used @RestController when building REST APIs. The nice thing is, I don’t need to add @ResponseBody to each method. It automatically converts the return value into JSON. So whenever I’m building a REST API, I just use @RestController.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This gives your interviewer a perspective that you have worked on it and have not repeated some answers that you memorised.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to avoid these mistakes?
&lt;/h2&gt;

&lt;p&gt;To avoid these pitfalls, you need to understand the different buckets of questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  3 Question Buckets
&lt;/h3&gt;

&lt;p&gt;Most candidates focus heavily on technical questions when preparing for software engineering interviews. &lt;/p&gt;

&lt;p&gt;However, interviewers evaluate you on more than just your coding ability. &lt;/p&gt;

&lt;p&gt;Based on my 15+ years of experience and being on both sides of the table, I find it helpful to divide interview questions into &lt;strong&gt;three main buckets&lt;/strong&gt;, each with its own subtypes and preparation strategies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8bfpbuzcp0735mwjb9cr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8bfpbuzcp0735mwjb9cr.png" alt="Interview Buckets" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Common Interview Questions
&lt;/h4&gt;

&lt;p&gt;These questions aren’t meant to test your technical depth. They’re designed to understand your motivation, personality, and communication skills. &lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h5&gt;
  
  
  Examples:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Tell me about yourself.&lt;/li&gt;
&lt;li&gt;What are your strengths and weaknesses?&lt;/li&gt;
&lt;li&gt;Why are you looking for a change?&lt;/li&gt;
&lt;li&gt;Where do you see yourself in 5 years?&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  How to prepare?
&lt;/h5&gt;

&lt;p&gt;Draft these answers and practice them before a camera. Tweak answers as you find the right words. &lt;/p&gt;

&lt;p&gt;Once you have mastered it, the words will come naturally from you. &lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h4&gt;
  
  
  Technical Interview Questions
&lt;/h4&gt;

&lt;p&gt;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 three subtypes, each requiring a different mindset to effectively approach them.&lt;/p&gt;

&lt;h5&gt;
  
  
  Fact-Based Questions - (Assessing Knowledge)
&lt;/h5&gt;

&lt;p&gt;These questions test your understanding of specific technologies, tools, or concepts. The answers are usually short and have a “correct” answer.&lt;/p&gt;

&lt;h6&gt;
  
  
  Examples:
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;What does @AutoConfiguration do in Spring Boot?&lt;/li&gt;
&lt;li&gt;What is a RESTful API?&lt;/li&gt;
&lt;li&gt;What’s the difference between HashMap and ConcurrentHashMap?&lt;/li&gt;
&lt;/ul&gt;

&lt;h6&gt;
  
  
  How to prepare?
&lt;/h6&gt;

&lt;p&gt;The trick here is to answer the question by adding scenarios you used in your experience. &lt;/p&gt;

&lt;p&gt;If you have used it before, highlight specific examples of how you have used it before and also talk about some of the challenges you have faced.&lt;/p&gt;

&lt;p&gt;If you don’t have experience, answer the question and tell them you have never used it. &lt;/p&gt;

&lt;p&gt;This prevents further questions about topics you might not know, and the interviewer will move towards a topic you are familiar with.&lt;/p&gt;

&lt;h4&gt;
  
  
  Opinion-Based Questions (Assessing Preferences and Thought Process)
&lt;/h4&gt;

&lt;p&gt;Here, interviewers are interested in how you form opinions, make trade-offs, and justify your choices. There may be no single “correct” answer, but they want to see if your thinking is grounded and experience-driven.&lt;/p&gt;

&lt;h5&gt;
  
  
  Examples:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Do you prefer SQL or Nosql databases? Why?&lt;/li&gt;
&lt;li&gt;Would you introduce a new language like Python in a Java-heavy codebase?&lt;/li&gt;
&lt;li&gt;What’s your take on using microservices vs. monoliths?&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  How to prepare?
&lt;/h5&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;You can also reference blogs if you don’t have enough proof of experience. &lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;This helps you get pointers if the interviewers have strong opinions about it and also showcases that you are open to feedback and learning.&lt;/p&gt;

&lt;h4&gt;
  
  
  Scenario-Based Questions (Assessing Application and Design Skills)
&lt;/h4&gt;

&lt;p&gt;These practical, open-ended questions test how you think through real-world problems, design systems, or debug tricky issues. They simulate the kind of challenges you’d face on the job.&lt;/p&gt;

&lt;h5&gt;
  
  
  Examples:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;You’re asked to build a REST API—what are the key things you’d consider?&lt;/li&gt;
&lt;li&gt;How would you debug a slow-performing endpoint?&lt;/li&gt;
&lt;li&gt;How would you handle consistency if multiple microservices need to share the cache?&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Behavioural Questions (The Culture Fit Test)
&lt;/h4&gt;

&lt;p&gt;Behavioural questions assess how you work with others, deal with conflict, handle pressure, and grow from challenges. These are crucial for determining whether you’d fit the team and company culture well.&lt;/p&gt;

&lt;h5&gt;
  
  
  Examples:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;How do you handle tight deadlines?&lt;/li&gt;
&lt;li&gt;What would you do if you’re blocked and not getting the needed information?&lt;/li&gt;
&lt;li&gt;Tell me about when you received difficult feedback and how you handled it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  How to prepare?
&lt;/h5&gt;

&lt;p&gt;Similar to common interview questions, the questions are limited. So you can prepare well for these.&lt;/p&gt;

&lt;p&gt;You need to use the STAR technique to answer these questions. &lt;/p&gt;

&lt;p&gt;If you can master this technique,  you can also answer your technical questions with this approach.&lt;/p&gt;

&lt;p&gt;The benefit is that this approach makes you tell a story. Now, the story might not be the best story in the world, but it will be enough to hook the interviewer's attention. &lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  The STAR framework provides structure:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Situation: What was the context?&lt;/li&gt;
&lt;li&gt;Task: What needed to be done?&lt;/li&gt;
&lt;li&gt;Action: What did you do?&lt;/li&gt;
&lt;li&gt;Result: What was the outcome?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts: Turn Preparation into Confidence
&lt;/h2&gt;

&lt;p&gt;If there’s one thing to take away from this, great interviews don’t begin in the interview room.&lt;/p&gt;

&lt;p&gt;They start with how you prepare.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prepare answers to common and behavioural questions ahead of time—not to memorise, but to internalise.&lt;/li&gt;
&lt;li&gt;Anchor your responses in your past experience. That’s where your strengths live.&lt;/li&gt;
&lt;li&gt;Use the STAR technique to draw out scenarios in advance. The more you practice these, the more naturally they’ll come to you when it matters.&lt;/li&gt;
&lt;li&gt;Don’t just say your answers. Practice them on a video call. Record. Rewatch. Adjust. This one step alone can drastically improve how you come across.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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’re ready for.&lt;/p&gt;

&lt;h3&gt;
  
  
  Want help putting this into action?
&lt;/h3&gt;

&lt;p&gt;Join me for the upcoming free live workshop:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.eventbrite.com/e/3-interview-mistakes-devs-and-qa-engineers-make-that-sabotage-interviews-tickets-1351039468419?aff=oddtdtcreator" rel="noopener noreferrer"&gt;3 Interview Mistakes Devs and QA Engineers Make That Sabotage Interviews (And How to Fix Them Fast)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’ll discuss real-world examples, live breakdowns, and simple techniques you can use immediately.&lt;/p&gt;

</description>
      <category>career</category>
      <category>careerdevelopment</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>A look at the real problems software architecture tried to solve, and why microservices might not be your first answer</title>
      <dc:creator>Dishit Devasia</dc:creator>
      <pubDate>Thu, 10 Apr 2025 20:05:40 +0000</pubDate>
      <link>https://dev.to/dishitdevasia/a-look-at-the-real-problems-software-architecture-tried-to-solve-and-why-microservices-might-not-1da0</link>
      <guid>https://dev.to/dishitdevasia/a-look-at-the-real-problems-software-architecture-tried-to-solve-and-why-microservices-might-not-1da0</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/dishitdevasia/the-ultimate-guide-to-the-evolution-of-microservices-48o3" class="crayons-story__hidden-navigation-link"&gt;The Ultimate Guide to the Evolution of Microservices&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/dishitdevasia" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F949702%2F4cdc906f-0d96-4917-9beb-f610cd39904f.jpg" alt="dishitdevasia profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/dishitdevasia" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Dishit Devasia
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Dishit Devasia
                
              
              &lt;div id="story-author-preview-content-2397922" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/dishitdevasia" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F949702%2F4cdc906f-0d96-4917-9beb-f610cd39904f.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Dishit Devasia&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/dishitdevasia/the-ultimate-guide-to-the-evolution-of-microservices-48o3" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 10 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/dishitdevasia/the-ultimate-guide-to-the-evolution-of-microservices-48o3" id="article-link-2397922"&gt;
          The Ultimate Guide to the Evolution of Microservices
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/microservices"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;microservices&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/softwareengineering"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;softwareengineering&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/eventdriven"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;eventdriven&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/architecture"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;architecture&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/dishitdevasia/the-ultimate-guide-to-the-evolution-of-microservices-48o3" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;6&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/dishitdevasia/the-ultimate-guide-to-the-evolution-of-microservices-48o3#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              1&lt;span class="hidden s:inline"&gt; comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            11 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>microservices</category>
      <category>softwareengineering</category>
      <category>eventdriven</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The Ultimate Guide to the Evolution of Microservices</title>
      <dc:creator>Dishit Devasia</dc:creator>
      <pubDate>Thu, 10 Apr 2025 19:56:41 +0000</pubDate>
      <link>https://dev.to/dishitdevasia/the-ultimate-guide-to-the-evolution-of-microservices-48o3</link>
      <guid>https://dev.to/dishitdevasia/the-ultimate-guide-to-the-evolution-of-microservices-48o3</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1jrg77myesf0xp7nnooo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1jrg77myesf0xp7nnooo.png" alt="Microservices AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When software engineers talk about microservices, most do not understand the context in which the architecture originated. This leads to “doing microservices” instead of solving business problems. The assumption is that microservices are the silver bullet for solving business problems. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://quiz.aidevdiary.com/microservices" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Think you have a solid grasp of microservices? Before you scroll further, take this 90-second Microservices Interview Readine...&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;But there are no silver bullets, as Frederick P. Brooks Jr. discussed in his famous 1986 paper, &lt;strong&gt;“NO SILVER BULLET — ESSENCE AND ACCIDENTS OF SOFTWARE ENGINEERING.”&lt;/strong&gt; When you move to doing microservices, you only increase the accidental complexity that Brooks mentions in his paper.  &lt;/p&gt;

&lt;p&gt;So, how can you know if you are not introducing accidental complexity when building a microservices architecture? To understand this, you need to go back to the evolution of software architecture.  &lt;/p&gt;




&lt;h2&gt;
  
  
  The Beginning
&lt;/h2&gt;

&lt;p&gt;In the beginning, there was the computer—a massive, room-filling machine with thousands of vacuum tubes and transistors requiring an entire team of engineers to keep it running. In the 1950s, these behemoths—like the UNIVAC I and IBM 701—were the pinnacle of computing, and businesses lined up to access their raw power.  &lt;/p&gt;

&lt;p&gt;If you needed to do some processing, you didn’t just log in — you walked into a computer room, handed your punch cards to an operator, and waited. Computing was centralized. Expensive. Slow.  &lt;/p&gt;

&lt;p&gt;As Moore’s law took effect, computers started getting smaller and faster, but remained expensive. Therefore, people needed to share their computing resources.  &lt;/p&gt;

&lt;p&gt;This led to the Client-Server architecture.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Client-Server Architecture
&lt;/h2&gt;

&lt;p&gt;This shift led to the client-server architecture, in which a central server handled business logic, and users accessed it through individual client machines. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6k2k51b8tyot447fkzi2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6k2k51b8tyot447fkzi2.png" alt="Client Server Architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Companies like IBM, Sun Microsystems, and Microsoft built ecosystems around this model, creating the foundation for modern business applications.  &lt;/p&gt;

&lt;p&gt;Now, in software engineering, we solve problems, only to find that the problems get bigger.  &lt;/p&gt;

&lt;p&gt;The client-server model worked well in the early days but had limitations.  &lt;/p&gt;

&lt;p&gt;You had desktop applications that connected to a server. The tight coupling meant that any change in business logic meant a change on the server, and all the clients needed to be upgraded.  &lt;/p&gt;

&lt;p&gt;Then the internet arrived.  &lt;/p&gt;




&lt;h2&gt;
  
  
  The Rise of 3-Tier Architecture (1990s–Early 2000s)
&lt;/h2&gt;

&lt;p&gt;Now, you only need a browser that connects to a server. Users do not need to have clients to access the server. The HTML browser was enough to get the work done.  &lt;/p&gt;

&lt;p&gt;What that meant was that the processing complexity increased on the server.  &lt;/p&gt;

&lt;p&gt;To cater to increased complexity on the server side, engineers developed the 3-tier architecture.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo5n1pwnekrk5p5oc11a0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo5n1pwnekrk5p5oc11a0.png" alt="3-tier architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The server side was decomposed into three tiers:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;User interface&lt;/strong&gt; — what users will be able to see
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business layer&lt;/strong&gt; — where all the business logic resides, like how to calculate an employee’s salary based on leaves, designation, role
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database layer&lt;/strong&gt; — where all the information was stored, such as name, designation, role
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This design sowed the seeds of monolithic architecture, which many junior engineers now consider an anti-pattern.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Monolithic Architecture
&lt;/h2&gt;

&lt;p&gt;A monolith is a system in which all components (UI, business logic, database) are tightly coupled and deployed as one unit. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: A flight booking website built as a monolith:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- A user interface to search for flights  
- A booking module to reserve seats  
- A payment module to process transactions  
- A notification system to send emails
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All these components exist in one codebase, database, and deployment unit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Easy to start with for small teams
&lt;/li&gt;
&lt;li&gt;One unit of deployment
&lt;/li&gt;
&lt;li&gt;Simpler deployment process
&lt;/li&gt;
&lt;li&gt;Straightforward transaction management
&lt;/li&gt;
&lt;li&gt;Lower operational overhead
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Challenges
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;As application size increases, the deployment time increases
&lt;/li&gt;
&lt;li&gt;To scale, you need to use vertical scaling even if only certain application parts might require more CPU/memory
&lt;/li&gt;
&lt;li&gt;A bug in any layer would need full deployment of the entire package
&lt;/li&gt;
&lt;li&gt;Things can get messy quickly, as each new business functionality means re-wiring the logic
&lt;/li&gt;
&lt;li&gt;Team coordination becomes more difficult as the organization grows
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Modular Monolith
&lt;/h2&gt;

&lt;p&gt;A modular monolith is a monolithic application structured into separate, well-defined modules with clear boundaries. However, it is still deployed as a single unit.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: Flight booking website modules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Flight Search Module  
- Booking Module  
- Payment Module  
- Notifications Module 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffdmovll7h0yjvws8uvxy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffdmovll7h0yjvws8uvxy.png" alt="Modular monolith"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits
&lt;/h3&gt;

&lt;p&gt;This architecture offsets some of the challenges of raw monolithic applications. Here we are moving towards creating modules based on business functions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The code is better organized and easier to maintain
&lt;/li&gt;
&lt;li&gt;Setting up mocks, stubs, or running multiple services is not required as the entire application is one unit
&lt;/li&gt;
&lt;li&gt;When a series of operations need to be performed as a single unit (i.e., a transaction), monoliths are easier to manage
&lt;/li&gt;
&lt;li&gt;Since operational complexity is low, the cost of running a monolith is often lower than running multiple services (for lower volumes)
&lt;/li&gt;
&lt;li&gt;Teams can work more independently within their module boundaries
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Challenges
&lt;/h3&gt;

&lt;p&gt;The challenges of scaling and deployment remained. But enterprises found a different problem.&lt;/p&gt;

&lt;p&gt;Enterprise organizations found that they have multiple modular monoliths, and the business requires them to talk to each other.&lt;/p&gt;

&lt;p&gt;You had multiple monoliths trying to talk to each other. These applications could be on different technologies. Any change in one application meant all the interfaces with which it interacted needed to be tested for regression impacts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynexks4higkif8ceycap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynexks4higkif8ceycap.png" alt="Modular monolith enterprise challenges"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  When to Use a Modular Monolith
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;When you want a structured codebase without the complexity of microservices
&lt;/li&gt;
&lt;li&gt;When the team is small but growing
&lt;/li&gt;
&lt;li&gt;For startups that know their key features and can work their way up from there
&lt;/li&gt;
&lt;li&gt;When your domain boundaries are still evolving
&lt;/li&gt;
&lt;li&gt;When operational simplicity is more valuable than fine-grained scaling
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Service Oriented Architecture (SOA)
&lt;/h2&gt;

&lt;p&gt;Service-Oriented Architecture (SOA) is an architectural style that supports service orientation. Service orientation is a way of thinking regarding services and service-based development and the outcomes of services. A service:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Is a logical representation of a repeatable business activity that has a specified outcome (e.g. check customer credit; provide weather data, consolidate drilling reports)
&lt;/li&gt;
&lt;li&gt;Is self-contained
&lt;/li&gt;
&lt;li&gt;May be composed of other services
&lt;/li&gt;
&lt;li&gt;Is a “black box” to consumers of the service
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The SOA architectural style has the following distinctive features:&lt;/p&gt;

&lt;p&gt;It is based on the design of the services, which mirror real-world business activities, including the enterprise (or inter-enterprise) business processes.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service representation utilizes business descriptions to provide context (i.e., business process, goal, rule, policy, service interface, and service component) and implements services using service orchestration.
It places unique requirements on the infrastructure. Implementations should use open standards to realize interoperability and location transparency.
&lt;/li&gt;
&lt;li&gt;Implementations are environment-specific — they are constrained or enabled by context and must be described within that context.
&lt;/li&gt;
&lt;li&gt;It requires strong governance of service representation and implementation. 
Definition from The Open Group&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq8kn715p47lqpxckjxca.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq8kn715p47lqpxckjxca.png" alt="Service Oriented Architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was the first attempt to move towards business functionality as services.&lt;/p&gt;

&lt;p&gt;The idea was to have coarse-grained services, such as an entire business process, handled by a service. Most SOA implementations deployed an Enterprise Service Bus (ESB), facilitating communication between services.&lt;/p&gt;

&lt;p&gt;When SOA was introduced, most organizations followed the waterfall methodology of software development, and deploying all applications as a single deployment was still the norm.&lt;/p&gt;

&lt;p&gt;The other aspect was that container technology was either non-existent or not mature enough for engineers to consider deploying smaller services.&lt;/p&gt;

&lt;p&gt;Services are coarse-grained and share a standard communication protocol (e.g., SOAP).&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Standardization: ESB simplifies governance and message routing
&lt;/li&gt;
&lt;li&gt;Reusability: Services can be reused across multiple applications
&lt;/li&gt;
&lt;li&gt;Technology agnostic: Services can be implemented in different technologies
&lt;/li&gt;
&lt;li&gt;Business-IT alignment: Services map to business capabilities
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages:**
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ESB can become a single point of failure
&lt;/li&gt;
&lt;li&gt;Although ESB was intended to simplify application interfaces, the challenge of deploying ESB with multiple interface changes remained
&lt;/li&gt;
&lt;li&gt;Heavy governance requirements
&lt;/li&gt;
&lt;li&gt;Often led to complex, heavyweight implementations
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Microservices
&lt;/h2&gt;

&lt;p&gt;Microservices architecture is an approach in which an application is broken down into small, independently deployable services that communicate via APIs.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The term “Microservice Architecture” has sprung up over the last few years to describe a particular way of designing software applications as suites of independently deployable services. While there is no precise definition of this architectural style, there are specific common characteristics around organization around business capability, automated deployment, intelligence in the endpoints, and decentralized control of languages and data. — Martin Fowler, 2014&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As the name suggests, microservices are more finely-grained services than services defined as part of SOA architecture.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhfvyou553di6kre5wrni.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhfvyou553di6kre5wrni.png" alt="Microservices"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Microservices-Based Flight Booking System&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each function runs as an independent microservice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search Service
&lt;/li&gt;
&lt;li&gt;Booking Service
&lt;/li&gt;
&lt;li&gt;Payment Service
&lt;/li&gt;
&lt;li&gt;Notification Service
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Independent Scaling:&lt;/strong&gt; Each service can be independently scaled depending on the volume requirements. For example, you have high search volume but low payment volume. If you only want to handle volumes related to search functionality, you can increase the containers handling just the search functionality.
&lt;strong&gt;Smaller Builds:&lt;/strong&gt; Build times are faster as the services are smaller, leading to higher developer productivity.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Independent Deployment:&lt;/strong&gt; Each service is independent of others so that services can be deployed separately. Feature toggles and different approaches ensure you can deploy without affecting existing functionality.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technology Flexibility:&lt;/strong&gt; Teams can choose the best technology stack for their specific service requirements.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team Autonomy:&lt;/strong&gt; Teams can own and operate their services independently.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fault Isolation:&lt;/strong&gt; A failure in one service doesn’t necessarily bring down the entire system.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart endpoint and dumb pipes:&lt;/strong&gt; The challenge with ESB was that the business logic started residing within ESB, and the owners of ESB had to be across all the business, which makes it a tough proposition. Microservices require inter-service communication on a light-weight protocol such as HTTP without context. The services are smart enough to process the requests and business knowledge remains within the service, making it easier to maintain.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Challenges
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Increased Operational Complexity:&lt;/strong&gt; Deploying each microservice means having different deployment pipelines. Each service is an infrastructure component, which increases the accidental complexity of maintaining services in production. This includes alerting, security, monitoring, and logging.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distributed System Challenges:&lt;/strong&gt; Microservices introduce all the complexities of distributed systems, including network latency, message serialization, and unreliable networks.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Management:&lt;/strong&gt; Maintaining data consistency across services is challenging.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing Complexity:&lt;/strong&gt; Integration and end-to-end testing become more complex.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service Discovery:&lt;/strong&gt; Services need to find and communicate with each other.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team Overhead:&lt;/strong&gt; This can be overwhelming for smaller teams, as most time might be spent on engineering work rather than building features.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As mentioned, microservices can get complicated fast. It is essential to understand the principles that guide service boundaries. One of the most influential approaches is Domain-Driven Design(DDD)  &lt;/p&gt;

&lt;h2&gt;
  
  
  Domain-Driven Design and Microservices
&lt;/h2&gt;

&lt;p&gt;Domain-Driven Design (DDD) provides crucial concepts for effective microservice architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bounded Contexts&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A bounded context is a specific responsibility with explicit boundaries that separate it from other system parts. In microservices, each service typically represents a bounded context.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ubiquitous Language&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Each bounded context has its ubiquitous language—terms and definitions specific to that context. This helps define clear service boundaries.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Aggregates&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Aggregates are clusters of domain objects that should be treated as a single unit. In microservices, aggregates often help define data ownership boundaries.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Implementing microservices without understanding DDD principles often leads to poorly defined service boundaries, resulting in tight coupling and distributed monoliths.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's explore how some real-world companies have approached microservices — successes and the challenges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Case Studies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Netflix: Successful Microservices Adoption
&lt;/h3&gt;

&lt;p&gt;Netflix began its journey to microservices in 2008, moving from a monolithic DVD rental application to a cloud-based streaming service composed of hundreds of microservices.&lt;/p&gt;

&lt;h4&gt;
  
  
  Key Factors in Success:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Gradual migration
&lt;/li&gt;
&lt;li&gt;Strong DevOps culture
&lt;/li&gt;
&lt;li&gt;Investment in tooling and infrastructure
&lt;/li&gt;
&lt;li&gt;Building for failure with techniques like Chaos Monkey
&lt;/li&gt;
&lt;li&gt;Team autonomy with centralized governance
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Results:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Ability to scale to millions of users globally
&lt;/li&gt;
&lt;li&gt;Faster feature development and deployment
&lt;/li&gt;
&lt;li&gt;Improved system resilience
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Segment: The Move Back from Microservices
&lt;/h3&gt;

&lt;p&gt;Segment initially embraced microservices enthusiastically but later consolidated back to a more monolithic approach for their data pipeline.&lt;/p&gt;

&lt;h4&gt;
  
  
  Challenges They Faced
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Operational complexity exceeded team capacity
&lt;/li&gt;
&lt;li&gt;Development velocity decreased due to cross-service dependencies
&lt;/li&gt;
&lt;li&gt;Testing and debugging became increasingly difficult
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaway:&lt;/strong&gt; Microservices are not always the right solution, even for companies with technical expertise. Business needs must justify the complexity trade-off.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Management in Microservices
&lt;/h2&gt;

&lt;p&gt;Data ownership and consistency become critical concerns in a distributed architecture. Let’s look at common challenges and patterns in managing data across microservices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Distributed Data Challenges
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data Ownership:&lt;/strong&gt; Each service should ideally own its data
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency:&lt;/strong&gt; Maintaining consistency across services requires careful design
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query Complexity:&lt;/strong&gt; Joining data across services is challenging
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Common Patterns
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Database per Service:&lt;/strong&gt; Each microservice has its own database
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event Sourcing:&lt;/strong&gt; Using events as the source of truth
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Saga Pattern:&lt;/strong&gt; Managing distributed transactions across services
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event-Driven Architecture:&lt;/strong&gt; Services rely on events to achieve eventual consistency
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Infrastructure Requirements for Microservices
&lt;/h2&gt;

&lt;p&gt;Successful microservices implementation requires significant infrastructure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Container Orchestration:&lt;/strong&gt; Kubernetes, Docker Swarm
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service Discovery:&lt;/strong&gt; Consul, Eureka
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Gateway:&lt;/strong&gt; Kong, AWS API Gateway
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring &amp;amp; Observability:&lt;/strong&gt; Prometheus, Grafana, Jaeger
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD Pipelines:&lt;/strong&gt; Jenkins, GitHub Actions, CircleCI
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuration Management:&lt;/strong&gt; Spring Cloud Config, Consul
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Organizations must be prepared to invest in these technologies and the expertise to use them effectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conway’s Law and Organizational Structure
&lt;/h2&gt;

&lt;p&gt;Architecture isn’t just a technical decision — it mirrors the organization behind it. This is where Conway’s Law becomes especially relevant.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Conway’s Law states: “Organizations design systems that mirror their communication structure.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For microservices to succeed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Teams should be organized around business capabilities
&lt;/li&gt;
&lt;li&gt;Each team should own one or more services end-to-end
&lt;/li&gt;
&lt;li&gt;Teams should be cross-functional (developers, QA, operations)
&lt;/li&gt;
&lt;li&gt;Organizations must support autonomous teams with a DevOps culture
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Migration Strategies: From Monolith to Microservices
&lt;/h2&gt;

&lt;p&gt;For organizations considering a migration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Strangler Pattern:&lt;/strong&gt; Gradually replace specific functions with microservices
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain-First Approach:&lt;/strong&gt; Identify bounded contexts before technical implementation
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start with New Features:&lt;/strong&gt; Implement new functionality as microservices while maintaining the monolith
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Considerations First:&lt;/strong&gt; Plan how to handle data before splitting services
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Decision Framework: Choosing Your Architecture
&lt;/h2&gt;

&lt;p&gt;Ask yourself these questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scale Requirements:&lt;/strong&gt; Do different parts of your application need independent scaling?
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team Size and Structure:&lt;/strong&gt; How large is your engineering organization?
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment Frequency:&lt;/strong&gt; How often do you need to deploy changes?
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain Complexity:&lt;/strong&gt; Is your business domain naturally divisible into bounded contexts?
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organizational Maturity:&lt;/strong&gt; Do you have experience with automated testing, CI/CD, and observability?
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Recommended Approach Based on Organization Size:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Startups/Small Teams (1–10 developers)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Start with a monolith or modular monolith
&lt;/li&gt;
&lt;li&gt;Focus on good separation of concerns
&lt;/li&gt;
&lt;li&gt;Consider microservices only for specific high-scale components
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Medium Organizations (10–50 developers)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Consider a modular monolith with well-defined boundaries
&lt;/li&gt;
&lt;li&gt;Implement microservices for components with distinct scaling needs
&lt;/li&gt;
&lt;li&gt;Invest in automation and DevOps practices
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Large Organizations (50+ developers)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Microservices can help manage team autonomy and scale
&lt;/li&gt;
&lt;li&gt;Ensure strong technical foundations first
&lt;/li&gt;
&lt;li&gt;Consider domain-driven design to identify service boundaries
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Monitoring and Observability
&lt;/h2&gt;

&lt;p&gt;Microservices require advanced monitoring approaches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Distributed Tracing:&lt;/strong&gt; Following requests across service boundaries
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Centralized Logging:&lt;/strong&gt; Aggregating logs from all services
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metrics and Dashboards:&lt;/strong&gt; Tracking system and business metrics
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Health Checks:&lt;/strong&gt; Verifying service availability
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alerting:&lt;/strong&gt; Notifying teams of issues
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Without these capabilities, debugging issues in a microservices environment becomes extremely difficult.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Choosing the Right Architecture: Beyond the Hype
&lt;/h2&gt;

&lt;p&gt;Microservices architecture didn’t emerge in a vacuum — it evolved as a response to specific business and technical challenges faced by organizations operating at scale. Before adopting microservices, organizations should honestly assess:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Team Size and Structure:&lt;/strong&gt; Do you have the engineering capacity to manage multiple services and their infrastructure requirements?
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business Complexity:&lt;/strong&gt; Is your domain complex enough to warrant separation into distinct bounded contexts?
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operational Maturity:&lt;/strong&gt; Has your organization mastered automated testing, continuous deployment, and observability practices?
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale Requirements:&lt;/strong&gt; Do different components of your application genuinely need independent scaling?
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Remember Frederick Brooks’ wisdom — software engineering has no silver bullets.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The best architecture solves your specific business problems with minimal accidental complexity.&lt;/p&gt;

&lt;p&gt;Starting with a well-designed modular monolith provides an excellent foundation for many organisations.&lt;/p&gt;

&lt;p&gt;This approach allows teams to discover natural service boundaries through experience rather than speculation, enabling a more organic evolution toward microservices only where necessary.&lt;/p&gt;

&lt;p&gt;The goal isn’t to “do microservices” but to build maintainable software delivering business value.&lt;/p&gt;

&lt;p&gt;Choose your architecture based on your constraints and objectives, not industry trends.&lt;/p&gt;




&lt;p&gt;If you’ve made it this far, you’re serious about mastering microservices.&lt;/p&gt;

&lt;p&gt;As a thank you, I’d love to offer you a &lt;a href="https://quiz.aidevdiary.com/microservices" rel="noopener noreferrer"&gt;&lt;strong&gt;free Microservices Interview Readiness Assessment&lt;/strong&gt; — a quick yet deep-dive quiz that helps you discover how prepared you are, across 8 key areas.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>softwareengineering</category>
      <category>eventdriven</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The Github Shortcut: How to Get Hired Without a "Perfect" Project?</title>
      <dc:creator>Dishit Devasia</dc:creator>
      <pubDate>Fri, 07 Mar 2025 22:06:15 +0000</pubDate>
      <link>https://dev.to/dishitdevasia/the-github-shortcut-how-to-get-hired-without-a-perfect-project-3jec</link>
      <guid>https://dev.to/dishitdevasia/the-github-shortcut-how-to-get-hired-without-a-perfect-project-3jec</guid>
      <description>&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  1. Create a README Like a Solution Engineer (13:48)
&lt;/h3&gt;

&lt;p&gt;﻿﻿Use your README to demonstrate your thought process by including solution diagrams, requirements, implemented features, and future enhancements. This showcases your problem-solving approach even before writing code.&lt;br&gt;
﻿﻿&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Showcase Projects at Any Stage of Completion (18:22)
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Focus on the "Why" Behind Technical Decisions (22:47)
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Here's the template link: &lt;a href="https://gitlab.com/dd.omniview/github-readme" rel="noopener noreferrer"&gt;https://gitlab.com/dd.omniview/github-readme&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.makeareadme.com/" rel="noopener noreferrer"&gt;https://www.makeareadme.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/matiassingers/awesome-readme" rel="noopener noreferrer"&gt;https://github.com/matiassingers/awesome-readme&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>github</category>
      <category>softwaredevelopment</category>
      <category>git</category>
    </item>
    <item>
      <title>7 Things LeetCode Doesn’t Teach You About Software Development</title>
      <dc:creator>Dishit Devasia</dc:creator>
      <pubDate>Fri, 07 Mar 2025 19:07:10 +0000</pubDate>
      <link>https://dev.to/dishitdevasia/7-things-leetcode-doesnt-teach-you-about-software-development-3d7m</link>
      <guid>https://dev.to/dishitdevasia/7-things-leetcode-doesnt-teach-you-about-software-development-3d7m</guid>
      <description>&lt;p&gt;Everyone says the key to landing a software job is grinding LeetCode. Solve hundreds of problems, and the offers will roll in.&lt;/p&gt;

&lt;p&gt;But here’s the harsh truth—LeetCode isn’t enough.&lt;/p&gt;

&lt;p&gt;You can memorize algorithms, ace coding challenges, and yet struggle in real-world software development.&lt;/p&gt;

&lt;p&gt;Because when you’re on the job, your biggest problems won’t be binary trees or dynamic programming.&lt;/p&gt;

&lt;p&gt;They’ll be messy codebases, unpredictable users, and working with people who don’t think like you do.&lt;/p&gt;

&lt;p&gt;Here's 7 reasons why solving Leetcode problems does not help you become a good software developer.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. AI can solve LeetCode problems - where does that leave you?
&lt;/h3&gt;

&lt;p&gt;All the LLMs can solve LeetCode problems in a matter of seconds. The accuracy will only improve as time goes on.&lt;br&gt;
﻿&lt;br&gt;
﻿So what's the value that you can bring to an organization?&lt;/p&gt;
&lt;h3&gt;
  
  
  ﻿2. Users are unpredictable﻿
&lt;/h3&gt;

&lt;p&gt;This is an old joke.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;﻿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.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Real-world users don’t follow predefined rules.&lt;/p&gt;

&lt;p&gt;They input unexpected values, break your UI, and find edge cases you never considered.&lt;/p&gt;

&lt;p&gt;In the video below, see what users are using the new Bounce Features for Mercedes.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1700606821914849469-14" src="https://platform.twitter.com/embed/Tweet.html?id=1700606821914849469"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1700606821914849469-14');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1700606821914849469&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Writing production code means anticipating failures and designing for resilience—something LeetCode won’t teach you.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Your code is not an island
&lt;/h3&gt;

&lt;p&gt;Most real-world applications interact with multiple external systems—APIs, databases, third-party services.&lt;/p&gt;

&lt;p&gt;These systems change, fail, and return unexpected data.&lt;/p&gt;

&lt;p&gt;Handling these changes with minimal disruption is a critical skill that LeetCode completely ignores.&lt;/p&gt;

&lt;p&gt;I remember an issue where the labels on parcels got all mixed up.&lt;/p&gt;

&lt;p&gt;How do you find what caused the issue?&lt;/p&gt;

&lt;p&gt;You never learn to troubleshoot issues across many systems using LeetCode.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Your code is only the technical specification part of the software. The bigger part is people.
&lt;/h3&gt;

&lt;p&gt;Software development is a team sport. You’ll collaborate with engineers, product managers, designers, and QA testers.&lt;/p&gt;

&lt;p&gt;You’ll encounter tough personalities and conflicting priorities.&lt;/p&gt;

&lt;p&gt;More importantly, you’ll get feedback.&lt;/p&gt;

&lt;p&gt;QA engineers will break your code, senior engineers will challenge your designs, and business stakeholders will change requirements.&lt;/p&gt;

&lt;p&gt;﻿Learning to handle this with maturity and professionalism is essential—LeetCode doesn’t prepare you for that.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Seeing the Bigger Picture Matters More Than Fixing Bugs
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Understanding the exact root cause of the bug and analyzing impact to the overall system is critical to doing good development work.&lt;/p&gt;

&lt;p&gt;Key questions you can ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are you 100% sure of the root cause? The best way to determine is if you can reproduce the bug.&lt;/li&gt;
&lt;li&gt;When this fix gets deployed, is there any concurrent feature that this will affect?&lt;/li&gt;
&lt;li&gt;Is this scenario one-off, or does it have the potential to repeat often?&lt;/li&gt;
&lt;li&gt;Is there a requirement that will get affected in the near future?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. There is a method to software development
&lt;/h3&gt;

&lt;p&gt;﻿Most often this method is Agile. ﻿&lt;/p&gt;

&lt;p&gt;Understanding sprints, stand-ups, code reviews, and release cycles is crucial for working effectively in a team.&lt;/p&gt;

&lt;p&gt;Without this, you’re just writing code in a vacuum. No company operates that way.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Writing Code Is Easy—Writing Simple Code Is Hard
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"A code is written once but read a thousand times." - Robert C. Martin&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Anyone can write code that works.&lt;/p&gt;

&lt;p&gt;Great developers write code that is clean, understandable, and maintainable.&lt;/p&gt;

&lt;p&gt;Future developers (including your future self) should be able to read and extend it without frustration.&lt;/p&gt;

&lt;p&gt;Good coding practices include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing clean, readable code&lt;/li&gt;
&lt;li&gt;Following design patterns (be careful with this one)&lt;/li&gt;
&lt;li&gt;Writing meaningful tests&lt;/li&gt;
&lt;li&gt;Documenting edge cases and limitations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;LeetCode is useful, but it’s not enough. Focusing solely on it creates massive blind spots.&lt;/p&gt;

&lt;p&gt;The best developers go beyond algorithms. They learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to write maintainable, well-structured code&lt;/li&gt;
&lt;li&gt;How to debug and troubleshoot real-world systems&lt;/li&gt;
&lt;li&gt;How software interacts with infrastructure and external services&lt;/li&gt;
&lt;li&gt;How to work effectively in teams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;One key action is that you can build a real-world project. Now there are caveats to that.&lt;/p&gt;

&lt;p&gt;I ﻿will add that in another post. But it helps with most of the problems discussed in the post.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reader’s challenge:
&lt;/h3&gt;

&lt;p&gt;Even if you skip LeetCode and work on a real-world project, which of these challenges do you think you’d still struggle to learn?&lt;/p&gt;

&lt;p&gt;Hit reply to let me know. Looking forward to your reply.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>javascript</category>
      <category>ai</category>
      <category>career</category>
    </item>
    <item>
      <title>End to End Testing No More</title>
      <dc:creator>Dishit Devasia</dc:creator>
      <pubDate>Fri, 27 Dec 2024 02:39:34 +0000</pubDate>
      <link>https://dev.to/dishitdevasia/end-to-end-testing-no-more-56md</link>
      <guid>https://dev.to/dishitdevasia/end-to-end-testing-no-more-56md</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy4tprixbc6jto1si6570.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy4tprixbc6jto1si6570.png" alt="E2E Tests Failure causes heartburn to both developers and QE" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s a typical Tuesday afternoon, and your team is gearing up for a routine release—a feature here, a bug fix there.&lt;/p&gt;

&lt;p&gt;Nothing groundbreaking, but it’s part of the rhythm that keeps your product evolving.&lt;/p&gt;

&lt;p&gt;Developers have wrapped up their work, testers have validated the changes, and the release is queued up for deployment.&lt;/p&gt;

&lt;p&gt;E2E tests are triggered to check for impacts on the overall system.&lt;/p&gt;

&lt;p&gt;Few test cases fail.&lt;/p&gt;

&lt;p&gt;Developers are called in to look into the issues.&lt;/p&gt;

&lt;p&gt;Delivery leads / engineering managers are notified of the issues and now everyone in the team is there.&lt;/p&gt;

&lt;p&gt;The team investigates for a couple of days.&lt;/p&gt;

&lt;p&gt;The result? 1 bug and 4 false positives.&lt;/p&gt;

&lt;p&gt;Sometimes couple of days might turn into a week and what that mean more people in to understand the consequence of the issue.&lt;/p&gt;

&lt;p&gt;Managers are left juggling timelines, explaining delays to stakeholders, and hoping the release goes out somehow.&lt;/p&gt;

&lt;p&gt;Developers and testers context-switch from building things to fighting fire.&lt;/p&gt;

&lt;p&gt;For teams operating in microservices architectures, this isn’t a one-off nightmare—it’s a recurring challenge.&lt;/p&gt;

&lt;p&gt;Weekly or fortnightly releases get bogged down, and instead of delivering value to customers, you’re spending precious time firefighting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does This Happen?
&lt;/h2&gt;

&lt;p&gt;The root of these challenges lies in the very thing that makes modern systems so powerful: &lt;strong&gt;microservices&lt;/strong&gt; architecture.&lt;/p&gt;

&lt;p&gt;In a microservices setup, your application is no longer a monolith; it’s a collection of smaller, independent services working together. &lt;/p&gt;

&lt;p&gt;While this brings scalability and flexibility, it also introduces complexity—each service depends on others, and any mismatch or downtime can cause cascading failures, especially during E2E tests. &lt;/p&gt;

&lt;p&gt;The main issues are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Interdependencies&lt;/strong&gt; - Microservices often rely on other services, databases, or external systems. If one of these isn’t available or has mismatched versions, tests fail.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test Fragility&lt;/strong&gt; - E2E tests need stable environments, but in dynamic systems, infrastructure, test data, or service availability can be inconsistent.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Troubleshooting Overhead&lt;/strong&gt; - Pinpointing the root cause of a failure in a web of services takes time and coordination, delaying releases further.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, how do you address this?&lt;/p&gt;

&lt;p&gt;Fixing E2E tests is the easy solution. But you have to consider the tests also increase or modified as more features are built in. So fixing E2E tests becomes a moving target as there will bound to be some flakiness when you are testing the whole stack.&lt;/p&gt;

&lt;p&gt;The idea here is to approach the problem from an extreme angle so that you reduce the dependency on E2E tests and thus reduce flakiness at the root.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contract Testing
&lt;/h2&gt;

&lt;p&gt;One way to reduce reliance on E2E tests is by adopting &lt;strong&gt;contract testing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gakk98uwl979w9v3jc9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gakk98uwl979w9v3jc9.png" alt="Establish contract between two systems" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Contract Testing?
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Here’s how it works:&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;consumer&lt;/strong&gt; defines a contract specifying the API calls it will make and the responses it expects.&lt;/p&gt;

&lt;p&gt;The provider validates this contract to ensure it meets the consumer’s expectations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits of Contract Testing
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Faster Feedback&lt;/strong&gt; - You can test interactions without spinning up the entire system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reduced Fragility&lt;/strong&gt; - Tests don’t rely on all services being up and running.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Clear Ownership&lt;/strong&gt; - Each team owns its contracts, making troubleshooting more focused.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalability&lt;/strong&gt; - Contract tests scale better than E2E tests in large systems with many services.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By implementing contract testing, you can ensure your services work well together, even if they’re deployed independently.&lt;/p&gt;




&lt;p&gt;But contract testing alone cannot solve logic changes in downstream systems.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Traceability Matrix
&lt;/h2&gt;

&lt;p&gt;To address logic changes and ensure comprehensive testing, you need a traceability matrix.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1m3pob2rn0rd5b5jstv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1m3pob2rn0rd5b5jstv.png" alt="Create functional traceabiltiy" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is a Traceability Matrix?
&lt;/h3&gt;

&lt;p&gt;A traceability matrix maps requirements, features, or changes to the tests that validate them. In the context of microservices:&lt;/p&gt;

&lt;p&gt;It links services and their dependencies to specific test cases.&lt;/p&gt;

&lt;p&gt;It identifies which tests to run when a particular service or feature changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;When a shared service updates, the traceability matrix identifies all dependent services and relevant integration tests.&lt;/p&gt;

&lt;p&gt;Instead of running the entire E2E suite, you execute only the impacted tests, saving time and effort.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits of a Traceability Matrix
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Targeted Testing&lt;/strong&gt; - Run only the tests that matter, reducing execution time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Simplified Debugging&lt;/strong&gt; - Developers and testers focus on the exact areas impacted by changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Faster Releases&lt;/strong&gt; - By avoiding full E2E runs, you streamline deployments.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As business logic grows and tests multiply, maintaining the traceability matrix becomes increasingly complex.&lt;/p&gt;

&lt;p&gt;Over time, there’s a real danger of maintainers adding everything into the matrix to cover all possible scenarios.&lt;/p&gt;

&lt;p&gt;This leads to the same problem you were trying to solve: running all E2E tests for every release, negating the benefits of targeted testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Leverage Domains
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fspx2pypibsmgx36jnhno.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fspx2pypibsmgx36jnhno.png" alt="Create domains such as orders, payments" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One way to keep the traceability matrix manageable is by organizing it around domains.&lt;/p&gt;

&lt;p&gt;A domain represents a logical grouping of services and their associated tests within your organization.&lt;/p&gt;

&lt;p&gt;For example, you might have domains like Payments, User Management, or Notifications, each with its own traceability matrix.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Domains Help
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Focused Ownership&lt;/strong&gt; - Each domain has clear owners—teams responsible for maintaining its traceability matrix and ensuring its accuracy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Simplified Maintenance&lt;/strong&gt; - By limiting the scope of each matrix to a domain, you reduce its complexity, making it easier to manage and update.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Better Visibility&lt;/strong&gt; - Domain-specific matrices provide a clear view of dependencies and test coverage within that domain, helping teams identify gaps or redundancies.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Challenges of Using Domains
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Boundary Definition&lt;/strong&gt; - Defining clear boundaries between domains can be tricky, especially in systems with overlapping responsibilities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cross-Domain Dependencies&lt;/strong&gt; - Interactions between domains may require additional coordination, especially when logic spans multiple areas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Initial Overhead&lt;/strong&gt; - Setting up domains and assigning ownership requires time and effort, particularly in large organizations with legacy systems.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Combined Power of Contract Testing, Traceability Matrix, and Domains
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftrv2hm3kanz1vkm149jg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftrv2hm3kanz1vkm149jg.png" alt="Use Domain as high-level, with traceability matrix as susbset and contract a smaller subset between services" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each solution—contract testing, traceability matrix, and domains—addresses a specific aspect of the E2E testing problem. However, their true strength lies in using them together.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Contract Testing&lt;/strong&gt; ensures service-to-service communication is reliable, reducing the need for full-system tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Traceability Matrix&lt;/strong&gt; targets logic changes, ensuring only the necessary tests run, saving time and effort.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Domains&lt;/strong&gt; keep the matrix manageable, preventing it from becoming a monolithic structure that’s hard to maintain.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By combining these approaches, you create a robust deployment strategy that balances speed and reliability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges and Open Questions
&lt;/h2&gt;

&lt;p&gt;While these solutions address many pain points, they aren’t without challenges:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tooling&lt;/strong&gt; - What tools can help automate and maintain traceability matrices across domains?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Training&lt;/strong&gt; - How do you ensure all teams understand and adopt these practices effectively?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Governance&lt;/strong&gt; - Who oversees cross-domain dependencies and ensures alignment?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalability&lt;/strong&gt; - How do these approaches scale as the organization and system grow further?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These open questions highlight the need for continuous refinement and adaptation of your deployment strategy.&lt;/p&gt;

&lt;p&gt;Conclusion&lt;br&gt;
End-to-end testing failures shouldn’t derail your releases.&lt;/p&gt;

&lt;p&gt;By adopting &lt;strong&gt;contract testing&lt;/strong&gt;, implementing a &lt;strong&gt;traceability matrix&lt;/strong&gt;, and leveraging &lt;strong&gt;domains&lt;/strong&gt;, you can address the root causes of these delays and deliver faster, more reliable releases.&lt;/p&gt;

&lt;p&gt;These approaches empower your teams to focus on delivering value to customers rather than firefighting test failures.&lt;/p&gt;

&lt;p&gt;While challenges remain, taking the first step towards modernizing your testing strategy is the key to staying agile in today’s fast-paced development environment.&lt;/p&gt;

&lt;p&gt;With this combination, you’re not just fixing a process—you’re laying the foundation for smoother, faster, and more confident releases.&lt;/p&gt;



&lt;p&gt;This was first published on my newsletter. &lt;br&gt;
Subscribe like other software developers and testers to receive frequent updates&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://weekendprogrammer.substack.com/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2Ff_auto%2Cq_auto%3Abest%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fweekendprogrammer.substack.com%252Ftwitter%252Fsubscribe-card.jpg%253Fv%253D898837105%2526version%253D9" height="417" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://weekendprogrammer.substack.com/" rel="noopener noreferrer" class="c-link"&gt;
          Weekend Developer | Dishit Devasia | Substack
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          A dose of motivation and resources to help you on your journey to becoming a professional software developer. Click to read Weekend Developer, by Dishit Devasia, a Substack publication. Launched 2 years ago.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2Ff_auto%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F41fede08-6552-4af9-a679-5d7ca18d4211%252Ffavicon.ico" width="64" height="64"&gt;
        weekendprogrammer.substack.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>programming</category>
      <category>testing</category>
      <category>contracttesitng</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Why Your Software Projects Aren’t Getting You Hired (And What to Do About It)</title>
      <dc:creator>Dishit Devasia</dc:creator>
      <pubDate>Sun, 10 Nov 2024 19:50:22 +0000</pubDate>
      <link>https://dev.to/dishitdevasia/why-your-software-projects-arent-getting-you-hired-and-what-to-do-about-it-22do</link>
      <guid>https://dev.to/dishitdevasia/why-your-software-projects-arent-getting-you-hired-and-what-to-do-about-it-22do</guid>
      <description>&lt;p&gt;Ever felt like the projects you’ve spent hours—maybe even months—working on just aren’t paying off?&lt;/p&gt;

&lt;p&gt;Maybe you’ve been told to “build more projects” if you want to stand out to employers.&lt;/p&gt;

&lt;p&gt;So you build and build, adding projects to your portfolio with the hope that quantity will somehow lead to quality.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;You also feel that your project is what everyone else is doing.&lt;/p&gt;

&lt;p&gt;Or you may feel that you are not confident about how you created the project.&lt;/p&gt;

&lt;p&gt;You’re not alone.&lt;/p&gt;

&lt;p&gt;Many developers and job seekers are facing the same issues—putting their time and energy into projects they think will make them job-ready, only to find they’ve missed the mark.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/sX64lF68wFU"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Problem Behind "Just Build More Projects"
&lt;/h2&gt;

&lt;p&gt;Building projects can be valuable, but only if you’re building the right projects for where you are in your career right now.&lt;/p&gt;

&lt;p&gt;Without a clear method to choose, it’s easy to end up working on projects that either &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;don’t make a real impact,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;become overwhelming, incomplete burdens that lead to burnout rather than career progress.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So how do you know if a project is right for you?&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;The result.&lt;/p&gt;

&lt;p&gt;PACE Framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  The PACE Framework: Plan, Analyze, Create, Execute
&lt;/h2&gt;

&lt;p&gt;PACE is a simple, four-step framework I developed to help job seekers and developers select projects that lead to results. Here’s how it works:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Plan
&lt;/h3&gt;

&lt;p&gt;Yeah, that doesn’t sound insightful. But doing the boring stuff works.&lt;/p&gt;

&lt;p&gt;Before you begin your project there are 3 essential steps you need to do:&lt;/p&gt;

&lt;h4&gt;
  
  
  Market Research
&lt;/h4&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h4&gt;
  
  
  Learning Intention
&lt;/h4&gt;

&lt;p&gt;Identify your learning goals based on your market research.&lt;/p&gt;

&lt;h4&gt;
  
  
  Project Selection
&lt;/h4&gt;

&lt;p&gt;Use the outputs from your previous two steps to select a project that aligns with the available opportunities and your learning goals.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Analyze
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Analyze requirements
&lt;/h4&gt;

&lt;p&gt;Create a list of requirements that will help you achieve your goals.&lt;/p&gt;

&lt;h4&gt;
  
  
  Align architecture
&lt;/h4&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Create
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Design Solution
&lt;/h4&gt;

&lt;p&gt;It is time to go deeper with your diagram. &lt;/p&gt;

&lt;p&gt;You will now develop on paper how these boxes interact with each other and in what sequence. &lt;/p&gt;

&lt;p&gt;This is where you get the bigger picture of how everything will look once you have built it.&lt;/p&gt;

&lt;h4&gt;
  
  
  Breakdown into tasks/stories
&lt;/h4&gt;

&lt;p&gt;This is when you break the gigantic piece of work into small bits of tasks that you can do and create goals around. &lt;/p&gt;

&lt;p&gt;You created the map of what you have to do by designing the solution.&lt;/p&gt;

&lt;p&gt;This step will help you create milestones within the map so that you know where you are and how far you need to go.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Execute
&lt;/h3&gt;

&lt;p&gt;The final step is to start writing code. You take each story and start building.&lt;/p&gt;




&lt;p&gt;Did you see how different it is compared to 90% of the people who begin writing code the first time they select the project?&lt;/p&gt;

&lt;p&gt;These steps can help you take the guesswork out of selecting the right projects and build your portfolio with intention.&lt;/p&gt;

&lt;p&gt;But there’s so much more that goes into this process.&lt;/p&gt;

&lt;p&gt;That’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.&lt;/p&gt;

&lt;p&gt;You’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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.eventbrite.com.au/e/pace-yourself-to-a-dream-dev-job-4-steps-to-standout-software-projects-tickets-1051966689687" rel="noopener noreferrer"&gt;Register for the workshop - PACE Yourself to a Dream Dev Job: 4 Steps to Standout Software Projects&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you’re ready to stop wasting time on projects that don’t pay off, this workshop is for you.&lt;/p&gt;

&lt;p&gt;Let’s make sure that every project you build is one that can help you move forward.&lt;/p&gt;

&lt;p&gt;Hope to see you there!&lt;/p&gt;

</description>
      <category>sideprojects</category>
      <category>softwaredevelopment</category>
      <category>softwareproject</category>
      <category>career</category>
    </item>
    <item>
      <title>The Top 5 Mistakes That Can Derail Your Development Projects</title>
      <dc:creator>Dishit Devasia</dc:creator>
      <pubDate>Sun, 08 Sep 2024 00:00:00 +0000</pubDate>
      <link>https://dev.to/dishitdevasia/the-top-5-mistakes-that-can-derail-your-development-projects-29lp</link>
      <guid>https://dev.to/dishitdevasia/the-top-5-mistakes-that-can-derail-your-development-projects-29lp</guid>
      <description>&lt;p&gt;Have you ever started a project, only to find yourself stuck midway and ultimately abandoning it?&lt;/p&gt;

&lt;p&gt;You're not alone.&lt;/p&gt;

&lt;p&gt;Many developers face feelings of overwhelm, frustration, and a lack of progress, leading to the abandonment of their projects.&lt;/p&gt;

&lt;p&gt;But did you know that the root cause of these issues often lies in mistakes made even before you start?&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Pitfalls to Avoid
&lt;/h2&gt;

&lt;p&gt;Here are five common mistakes that can lead to feelings of being overwhelmed and stuck:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Lack of Learning Goals
&lt;/h3&gt;

&lt;p&gt;One of the cardinal mistakes new developers make is not having clear learning goals. As Stephen Covey mentions in The 7 Habits of Highly Effective People, it’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:&lt;/p&gt;

&lt;p&gt;What do I want to learn from this project?&lt;/p&gt;

&lt;p&gt;What skills or knowledge will I gain?&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Jumping In Without Preparation
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Choosing a Complex Project
&lt;/h3&gt;

&lt;p&gt;It's easy to underestimate the complexity of a project, especially if you’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.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Using an Outdated or Cutting-Edge Technology Stack
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Lack of Mentorship
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Consequences of Abandonment
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Join Free Workshop!
&lt;/h2&gt;

&lt;p&gt;I've seen these challenges affect many developers, which is why I'm hosting a free workshop to teach a specific framework that can help you overcome these obstacles.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.eventbrite.com/e/pace-yourself-to-a-dream-dev-job-4-steps-to-standout-software-projects-tickets-1010133665987?aff=oddtdtcreator" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Register Workshop&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;And if you know someone else who might benefit from this workshop, feel free to share this post with them!&lt;/p&gt;

&lt;p&gt;Thank you for your time, and I look forward to helping you achieve your project goals!&lt;/p&gt;

</description>
      <category>developer</category>
      <category>careerdevelopment</category>
      <category>programming</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Why Following Traditional Advice Isn’t Enough to Switch from QA to Developer and What to Do Instead?</title>
      <dc:creator>Dishit Devasia</dc:creator>
      <pubDate>Fri, 06 Sep 2024 19:50:55 +0000</pubDate>
      <link>https://dev.to/dishitdevasia/why-following-traditional-advice-isnt-enough-to-switch-from-qa-to-developer-and-what-to-do-instead-3kji</link>
      <guid>https://dev.to/dishitdevasia/why-following-traditional-advice-isnt-enough-to-switch-from-qa-to-developer-and-what-to-do-instead-3kji</guid>
      <description>&lt;p&gt;You're a quality engineer.&lt;/p&gt;

&lt;p&gt;You know your way around software, you’ve caught the bugs, optimized the processes, and saved your team from countless headaches.&lt;/p&gt;

&lt;p&gt;But now, you’re eyeing that developer role—the one where you get to build, not just test.&lt;/p&gt;

&lt;p&gt;The one where your ideas turn into code that shapes products. You want to move from a gatekeeper to a value creator.&lt;/p&gt;

&lt;p&gt;Yet, every time you take a step forward, it feels like you’re lost in a maze of conflicting advice, never-ending roadmaps, and an overwhelming list of “must-know” technologies.&lt;/p&gt;

&lt;p&gt;You’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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Where do I even start? How long will this take? Am I learning the right things?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It feels like you’re trying to drink from a firehose, with no clear direction, no real sense of progress, and no idea when you’ll be ready to make the leap.&lt;/p&gt;

&lt;p&gt;It’s easy to get stuck in analysis paralysis, overwhelmed by the sheer volume of things to learn.&lt;/p&gt;

&lt;p&gt;You might even think about throwing your hands up and diving straight into a project, hoping you’ll figure it out as you go—only to hit roadblocks that send you spiralling back to square one.&lt;/p&gt;

&lt;p&gt;But what if I told you there’s a simpler path?&lt;/p&gt;

&lt;p&gt;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’ve been dreaming about.&lt;/p&gt;

&lt;p&gt;Not someday—sooner than you think.&lt;/p&gt;

&lt;p&gt;This guide will help you doing just that.&lt;/p&gt;

&lt;p&gt;It’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—all without getting lost in the endless sea of “shoulds” and “musts.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj020m2d9evpfi4bfwuk2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj020m2d9evpfi4bfwuk2.jpg" alt="Step By Step" width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps to Follow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Identify your starting point
&lt;/h3&gt;

&lt;p&gt;Assess your skills.&lt;/p&gt;

&lt;p&gt;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?&lt;/p&gt;

&lt;p&gt;You know what to do if you are learning the loops or just getting started. You only need to focus on the fundamentals.&lt;/p&gt;

&lt;p&gt;But what if you understand the language fairly well and only need to learn the skills that most mid-level engineers want to know?&lt;/p&gt;

&lt;p&gt;This is where you face the conflicting information challenge.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Try simple to medium complexity exercises on coding platforms such as Hackerrank, Codility, LeetCode.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transitioning to Building Projects
&lt;/h3&gt;

&lt;p&gt;After getting comfortable with solving coding problems, it’s time to start building real projects.&lt;/p&gt;

&lt;p&gt;You’ll know you’re ready for this step when you can mentally map out solutions or feel a sense of boredom with repetitive coding exercises.&lt;/p&gt;

&lt;p&gt;This indicates you’ve mastered the basics and are ready to apply your skills in a more meaningful way.&lt;/p&gt;

&lt;h4&gt;
  
  
  Start with Simple Projects
&lt;/h4&gt;

&lt;p&gt;Begin with a small, manageable project that aligns with your goals, like a basic to-do app or a simple API service.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Completing a project will build your confidence and give you a sense of accomplishment, which is crucial at this stage.&lt;/p&gt;

&lt;p&gt;For common pitfalls to avoid when starting projects, you can check out my video where I cover the biggest mistakes new developers make.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://www.youtube.com/watch?si=pp-ZX2-Ay6TBkaLT&amp;amp;v=PVJ03mF53Yk&amp;amp;feature=youtu.be" rel="noopener noreferrer"&gt;
      youtube.com
    &lt;/a&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  Keep Practicing Problem-Solving
&lt;/h4&gt;

&lt;p&gt;Even as you dive into projects, continue practising coding challenges at least once a week.&lt;/p&gt;

&lt;p&gt;This habit will help you maintain your problem-solving skills.&lt;/p&gt;

&lt;p&gt;It also keeps your coding speed sharp, which is vital for performing well in technical interviews.&lt;/p&gt;

&lt;h4&gt;
  
  
  Incorporate Libraries and Tools
&lt;/h4&gt;

&lt;p&gt;One of the hallmarks of a seasoned developer is knowing when to leverage existing libraries instead of writing everything from scratch.&lt;/p&gt;

&lt;p&gt;These libraries are used by thousands of developers and have been thoroughly tested in production environments, bringing robustness and efficiency to your projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Explore Useful Libraries
&lt;/h3&gt;

&lt;p&gt;Identify commonly used libraries in your chosen tech stack that can make your code more concise and efficient.&lt;/p&gt;

&lt;p&gt;For instance, in the Java ecosystem, Apache Commons offers a variety of utility functions that handle many of the repetitive tasks for you.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h4&gt;
  
  
  Identify and Address Skill Gaps
&lt;/h4&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;The key here is to be honest with yourself about where you need improvement.&lt;/p&gt;

&lt;h4&gt;
  
  
  Create a Learning Plan
&lt;/h4&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;For example, if you’re unfamiliar with certain libraries or need to brush up on data structures, make that a focus in your next project iteration.&lt;/p&gt;

&lt;h4&gt;
  
  
  Market Research and Applying for Jobs
&lt;/h4&gt;

&lt;p&gt;Begin applying for entry-level developer positions, even if you feel you're not yet perfect.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Conduct market research on job portals to keep up with the skills in demand for your desired tech stack.&lt;/p&gt;

&lt;h4&gt;
  
  
  Learn from Other Developer’s Code
&lt;/h4&gt;

&lt;p&gt;Reading other developers' code is one of the fastest ways to learn.&lt;/p&gt;

&lt;p&gt;It exposes you to different coding styles, best practices, and new tools.&lt;/p&gt;

&lt;p&gt;Additionally, resources like roadmap.sh can offer more ideas and pathways to expand your skill set.&lt;/p&gt;

&lt;h3&gt;
  
  
  Leverage Your Experience
&lt;/h3&gt;

&lt;p&gt;As you gain experience, it's time to capitalize on your hard work.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update your resume with your new skills and completed projects.&lt;/li&gt;
&lt;li&gt;Highlight the technologies you’ve used and the problems you’ve solved.&lt;/li&gt;
&lt;li&gt;Start applying for more roles&lt;/li&gt;
&lt;li&gt;Look to get interviewed to learn your skill-gaps.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Rinse and Repeat
&lt;/h3&gt;

&lt;p&gt;This journey is iterative.&lt;/p&gt;

&lt;p&gt;After completing a project and addressing your skill gaps, repeat the process to continuously build on the knowledge you’ve gained:&lt;/p&gt;

&lt;h4&gt;
  
  
  Identify New Skills
&lt;/h4&gt;

&lt;p&gt;Regularly reassess and pinpoint the next set of skills you need to learn.&lt;/p&gt;

&lt;p&gt;This process is continuous and should continue even after you get a job.&lt;/p&gt;

&lt;h4&gt;
  
  
  Expand or Start New Projects
&lt;/h4&gt;

&lt;p&gt;Either enhance your existing projects to incorporate new skills or start a new project that challenges you in different ways.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;At the job, you may not be able to play with the latest technologies all the time.&lt;/p&gt;

&lt;h4&gt;
  
  
  Incorporate New Tools and Libraries
&lt;/h4&gt;

&lt;p&gt;Continuously refine your code by incorporating libraries and tools you discover through research or by reading other developers’ work.&lt;/p&gt;

&lt;h4&gt;
  
  
  Refactor and Improve
&lt;/h4&gt;

&lt;p&gt;Refactor your code to improve readability and performance, demonstrating your growth and commitment to quality software development.&lt;/p&gt;

&lt;p&gt;By following these steps, you’ll create a solid foundation, gain practical experience, and confidently transition from quality assurance to full-time software development.&lt;/p&gt;




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

&lt;p&gt;You’ve made it this far, but this is just the beginning. &lt;/p&gt;

&lt;p&gt;The path from QA to full-time developer isn’t some distant dream—it’s within your reach. &lt;/p&gt;

&lt;p&gt;You’ve already got the foundation, the drive, and the grit to make this transition. Now it’s about taking action, making strategic moves, and never letting the overwhelm keep you stuck.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But let’s be real: You can’t do it all alone.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Trying to piece together bits of advice from a hundred different sources will only slow you down. &lt;/p&gt;

&lt;p&gt;You need a clear, focused plan that keeps you on track and shows you exactly what to do next. &lt;/p&gt;

&lt;p&gt;That’s why I’ve put together a free mind map outlining the entire process—a proven guide to take you from where you are now to where you want to be. &lt;/p&gt;

&lt;p&gt;And no, I’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.&lt;/p&gt;

&lt;p&gt;If you’re ready to be one of those people, click the link below to get your free mind map.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://maven.com/p/8ed99c/your-action-plan-transitioning-from-qa-to-developer" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Get Action Plan MindMap&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;And if you’re ready to supercharge your progress, don’t just stop at the mind map. &lt;/p&gt;

&lt;p&gt;I’m hosting a FREE workshop that will walk you through building your projects—projects that employers can’t ignore. &lt;/p&gt;

&lt;p&gt;It will provide you with a solid framework that you can use to build project after project. &lt;/p&gt;

&lt;p&gt;Even after you get a job, you can use this framework to deliver projects on time without bugs.&lt;/p&gt;

&lt;p&gt;Don’t wait—spaces are limited, and you don’t want to miss out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.eventbrite.com/e/pace-yourself-to-a-dream-dev-job-4-steps-to-standout-software-projects-tickets-1010133665987?aff=oddtdtcreator" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Register&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;This is your moment. &lt;/p&gt;

&lt;p&gt;Your opportunity to stop dreaming and start doing. &lt;/p&gt;

&lt;p&gt;Click the links, grab the resources, and let’s make your transition to software development a reality. &lt;/p&gt;

&lt;p&gt;You’ve got this.&lt;/p&gt;

</description>
      <category>career</category>
      <category>java</category>
      <category>softwaredevelopment</category>
      <category>beginners</category>
    </item>
    <item>
      <title>The Ultimate Guide to Create Custom Annotations in Spring Boot</title>
      <dc:creator>Dishit Devasia</dc:creator>
      <pubDate>Sat, 24 Aug 2024 20:06:44 +0000</pubDate>
      <link>https://dev.to/dishitdevasia/the-ultimate-guide-to-create-custom-annotations-in-spring-boot-fpa</link>
      <guid>https://dev.to/dishitdevasia/the-ultimate-guide-to-create-custom-annotations-in-spring-boot-fpa</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwdurck1xcnddwvh9zbaa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwdurck1xcnddwvh9zbaa.png" alt="Annotation Example"&gt;&lt;/a&gt;&lt;br&gt;
Such annotations fill the entire project in Spring Boot.&lt;/p&gt;

&lt;p&gt;But do you know what problems these annotations solve?&lt;/p&gt;

&lt;p&gt;Why were custom annotations introduced to begin with?&lt;/p&gt;

&lt;p&gt;How to create custom annotations?&lt;/p&gt;

&lt;p&gt;Today, I will cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why create custom annotations?&lt;/li&gt;
&lt;li&gt;What are the key benefits of using these annotations?&lt;/li&gt;
&lt;li&gt;How to create custom annotations?&lt;/li&gt;
&lt;li&gt;How does the annotated method get invoked?&lt;/li&gt;
&lt;li&gt;When to use custom annotations?&lt;/li&gt;
&lt;li&gt;When not to use custom annotations?&lt;/li&gt;
&lt;li&gt;What are the disadvantages of using custom annotations?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  🎯 Why Create Custom Annotations?
&lt;/h2&gt;

&lt;p&gt;In Spring Boot, annotations are more than just a way to add metadata. They&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simplify complex tasks&lt;/li&gt;
&lt;li&gt;Reduce boiler-plate code&lt;/li&gt;
&lt;li&gt;Enhance code-readability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before Spring introduced custom annotations, developers had to manage configurations like email validation using XML configuration files.&lt;/p&gt;

&lt;p&gt;The XML configuration would define beans, validators, and other necessary components to perform tasks such as validating email addresses.&lt;/p&gt;

&lt;p&gt;Here's an example of how email validation might have been configured using XML in a Spring application:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F939fudad8jg7lcjpklvu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F939fudad8jg7lcjpklvu.png" alt="Spring xml"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, this can easily become a nightmare where there are hundreds of classes with many of them relying on each other.&lt;/p&gt;

&lt;p&gt;It also meant a developer had to go look up this XML every time they had to add a new dependency.&lt;/p&gt;
&lt;h2&gt;
  
  
  Key Benefits of Custom Annotations
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Simplification of Configuration
&lt;/h3&gt;

&lt;p&gt;Spring introduced custom annotations to simplify configuration by allowing developers to use annotations directly in their code.&lt;/p&gt;

&lt;p&gt;This reduced the need for extensive XML configuration, making the codebase cleaner and easier to maintain.&lt;/p&gt;
&lt;h3&gt;
  
  
  Support for Declarative Programming
&lt;/h3&gt;

&lt;p&gt;Custom annotations in Spring enable a declarative approach.&lt;/p&gt;

&lt;p&gt;Developers can use annotations like &lt;code&gt;@Transactional&lt;/code&gt;, &lt;code&gt;@Cacheable&lt;/code&gt;, or &lt;code&gt;@Scheduled&lt;/code&gt; to declare desired behaviors without writing the underlying logic.&lt;/p&gt;

&lt;p&gt;This results in more readable and maintainable code.&lt;/p&gt;
&lt;h3&gt;
  
  
  Handling Cross-Cutting Concerns
&lt;/h3&gt;

&lt;p&gt;Spring's custom annotations, often used with Aspect-Oriented Programming (AOP), allow developers to handle cross-cutting concerns in a centralized manner.&lt;/p&gt;

&lt;p&gt;For example, the &lt;code&gt;@Transactional&lt;/code&gt; annotation manages transactions across multiple methods or classes without scattering transaction management logic throughout the code.&lt;/p&gt;
&lt;h3&gt;
  
  
  Reducing Boilerplate Code
&lt;/h3&gt;

&lt;p&gt;It reduces the need for boilerplate code by encapsulating common behaviours.&lt;/p&gt;

&lt;p&gt;For instance, the &lt;code&gt;@Autowired&lt;/code&gt; annotation simplifies dependency injection, allowing Spring to automatically inject dependencies, rather than requiring explicit constructor or setter methods&lt;/p&gt;

&lt;p&gt;It is a different discussion whether you should be using &lt;code&gt;@Autowired&lt;/code&gt; or not.&lt;/p&gt;
&lt;h3&gt;
  
  
  Improving Code Readability and Consistency
&lt;/h3&gt;

&lt;p&gt;By abstracting configuration and cross-cutting concerns into annotations, Spring improves the readability of the code.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;
&lt;h3&gt;
  
  
  Framework Flexibility and Extensibility
&lt;/h3&gt;

&lt;p&gt;Custom annotations allow developers to create their annotations tailored to specific needs, thus extending the framework's functionality in a standardized way.&lt;/p&gt;

&lt;p&gt;This flexibility has helped Spring remain relevant and powerful across multiple applications and architectures.&lt;/p&gt;
&lt;h2&gt;
  
  
  🚀 How to Create a Custom Annotation
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: Define the Annotation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create a new annotation by defining an interface.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;@interface&lt;/code&gt; to declare it.&lt;/li&gt;
&lt;li&gt;Add meta-annotations to specify how the annotation should behave.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;co.officegeek.tokenratelimiter&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.lang.annotation.ElementType&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.lang.annotation.Retention&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.lang.annotation.RetentionPolicy&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.lang.annotation.Target&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Retention&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;RetentionPolicy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;RUNTIME&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;// Annotation available at runtime&lt;/span&gt;
&lt;span class="nd"&gt;@Target&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ElementType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;METHOD&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;// Can be applied to methods&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nd"&gt;@interface&lt;/span&gt; &lt;span class="nc"&gt;LogExecutionTime&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@Target&lt;/code&gt;: Indicates where the annotation can be used (e.g., methods, classes).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@Retention&lt;/code&gt;: Indicates how long the annotation is retained (e.g., runtime, compile-time).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Step 2: Create an Aspect to Handle the Annotation
&lt;/h3&gt;

&lt;p&gt;You can create a custom logic to process the annotation using Spring's &lt;code&gt;BeanPostProcessor&lt;/code&gt;, &lt;code&gt;Aspect&lt;/code&gt;, or custom annotation processing logic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;co.officegeek.tokenratelimiter&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.aspectj.lang.ProceedingJoinPoint&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.aspectj.lang.annotation.Around&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.aspectj.lang.annotation.Aspect&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.stereotype.Component&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Aspect&lt;/span&gt;
&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LogExecutionTimeAspect&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Around&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"@annotation(LogExecutionTime)"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="nf"&gt;logExecutionTime&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ProceedingJoinPoint&lt;/span&gt; &lt;span class="n"&gt;joinPoint&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Throwable&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;proceed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;joinPoint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;proceed&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;executionTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;joinPoint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSignature&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" executed in "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;executionTime&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"ms"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;proceed&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Apply the Annotation
&lt;/h3&gt;

&lt;p&gt;Apply your custom annotation to methods, fields, or classes as defined.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;co.officegeek.tokenratelimiter&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.stereotype.Service&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@LogExecutionTime&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;serve&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;InterruptedException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Simulate some work&lt;/span&gt;
        &lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sleep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  How It Works:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;@LogExecutionTime&lt;/code&gt; annotation doesn't cause any method to be called directly.&lt;/li&gt;
&lt;li&gt;The Spring AOP framework detects that a method has the &lt;code&gt;@LogExecutionTime&lt;/code&gt; annotation using reflection.&lt;/li&gt;
&lt;li&gt;The LogExecutionTimeAspect aspect is configured to apply around advice when a method with the @LogExecutionTime annotation is called.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;logExecutionTime&lt;/code&gt; method in the aspect is executed before and after the annotated method (&lt;code&gt;serve&lt;/code&gt;), logging the execution time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgaudaxqqx11hbvcd3xz2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgaudaxqqx11hbvcd3xz2.png" alt="Purrfect Code"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How does the annotated method get invoked?
&lt;/h2&gt;

&lt;p&gt;When you apply a custom annotation to a method, class, or field, the annotation itself doesn't directly cause any method to be called.&lt;/p&gt;

&lt;p&gt;Instead, the logic associated with the annotation is typically implemented using reflection or aspect-oriented programming (AOP) in frameworks like Spring.&lt;/p&gt;

&lt;p&gt;Here's a breakdown of how the compiler and runtime environment know what method to call when an annotation is applied:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Compile-Time Processing (Annotation Processors)
&lt;/h3&gt;

&lt;p&gt;Some annotations are handled at compile time by annotation processors. &lt;/p&gt;

&lt;p&gt;Java's &lt;code&gt;javax.annotation.processing&lt;/code&gt; package allows developers to create custom annotation processors that generate code, validate annotations, or even modify the abstract syntax tree (AST) of the code being compiled.&lt;/p&gt;

&lt;p&gt;The annotation processor reads the annotations during compilation and executes code based on those annotations.&lt;/p&gt;

&lt;p&gt;This can include generating new classes or methods that the code will use later.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;@Override&lt;/code&gt; annotation is a compile-time annotation that doesn't invoke a method but instead tells the compiler to check if the method actually overrides a superclass method.&lt;/p&gt;

&lt;h4&gt;
  
  
  How It Works:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;You define a custom annotation processor by extending AbstractProcessor and overriding the process method.&lt;/li&gt;
&lt;li&gt;The processor will be invoked by the compiler when it encounters your annotation, allowing you to generate code or perform other tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Runtime Processing (Reflection)
&lt;/h3&gt;

&lt;p&gt;Custom annotations can be processed at runtime using reflection.&lt;/p&gt;

&lt;p&gt;The runtime system (e.g., a framework like Spring) uses reflection to detect the presence of annotations on methods, classes, or fields, and then applies the corresponding behavior.&lt;/p&gt;

&lt;p&gt;A custom annotation like &lt;code&gt;@LogExecutionTime&lt;/code&gt; doesn't directly trigger any method call.&lt;/p&gt;

&lt;p&gt;Instead, an aspect or some other reflective mechanism checks for the presence of the annotation at runtime and then wraps the method call with additional logic.&lt;/p&gt;

&lt;h4&gt;
  
  
  How It Works:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;At runtime, you use Java's reflection API to check if a method or class has a specific annotation using methods like &lt;code&gt;isAnnotationPresent&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Once detected, you can invoke methods or execute logic associated with that annotation. 
For example, if a method has a @LogExecutionTime annotation, you might measure the time before and after the method call.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Aspect-Oriented Programming (AOP)
&lt;/h3&gt;

&lt;p&gt;In frameworks like Spring, AOP is commonly used to handle custom annotations.&lt;/p&gt;

&lt;p&gt;AOP allows you to define "aspects" that can intercept method calls and perform additional processing before or after the method execution.&lt;/p&gt;

&lt;p&gt;When the AOP framework (e.g. Spring AOP) detects an annotation, it triggers the execution of an advice method associated with the aspect.&lt;/p&gt;

&lt;p&gt;This advice method contains the logic that the AOP framework executes when the annotated method is called.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;@Transactional&lt;/code&gt; annotation in Spring doesn't execute any logic by itself.&lt;/p&gt;

&lt;p&gt;Instead, the Spring framework's AOP infrastructure intercepts calls to methods annotated with @Transactional and wraps them with transaction management logic.&lt;/p&gt;

&lt;h4&gt;
  
  
  How It Works:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;You define an aspect class with advice methods that are associated with specific pointcuts (join points where you want to apply the advice).&lt;/li&gt;
&lt;li&gt;The aspect uses annotations like @Around or @Before to specify when the advice should be executed.&lt;/li&gt;
&lt;li&gt;The AOP framework ensures that when a method with a custom annotation is called, the corresponding advice is executed automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use Cases Where Custom Annotations Are a Good Approach
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cross-Cutting Concerns
&lt;/h3&gt;

&lt;p&gt;Custom annotations are ideal for handling cross-cutting concerns like logging, security, transaction management, and caching.&lt;/p&gt;

&lt;p&gt;These are concerns that affect multiple parts of an application but are not related to the core business logic.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;@LogExecutionTime&lt;/code&gt; annotation above is a good example as that can be used across all the methods and it does not have any business logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Declarative Programming
&lt;/h3&gt;

&lt;p&gt;When you want to specify what should happen rather than how it should happen, custom annotations provide a clean and expressive way to do this.&lt;/p&gt;

&lt;p&gt;Annotations like &lt;code&gt;@Cacheable&lt;/code&gt; or &lt;code&gt;@Retry&lt;/code&gt; allow developers to enable caching or retry logic declaratively, without writing the implementation code manually.&lt;/p&gt;

&lt;h3&gt;
  
  
  Framework or Library Integration
&lt;/h3&gt;

&lt;p&gt;Custom annotations can simplify the integration of frameworks or libraries by hiding the complexity behind an easy-to-use annotation.&lt;/p&gt;

&lt;p&gt;Annotations like &lt;code&gt;@Autowired&lt;/code&gt; in Spring help in injecting dependencies without having to manually instantiate them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Encapsulation of Complex Logic
&lt;/h3&gt;

&lt;p&gt;When complex logic needs to be encapsulated in a reusable way, custom annotations can provide a clean API for applying this logic.&lt;/p&gt;

&lt;p&gt;An annotation like &lt;code&gt;@RateLimit&lt;/code&gt; could encapsulate logic to limit the number of times a method can be called, without cluttering the method's body with this logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Cases Where Custom Annotations Should Not Be Used
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Simple or One-Off Logic
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logic That Requires Dynamic Behavior
&lt;/h3&gt;

&lt;p&gt;Annotations are statically defined at compile-time, making them unsuitable for scenarios where behaviour needs to be dynamically determined at runtime.&lt;/p&gt;

&lt;p&gt;If a method's behaviour should change based on user input or external configuration, handling this with custom annotations can lead to complex solutions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Business Logic
&lt;/h3&gt;

&lt;p&gt;Core business logic should not be abstracted into custom annotations, as this can make the logic less transparent and harder to maintain.&lt;/p&gt;

&lt;p&gt;Using an annotation to encapsulate a business process like &lt;code&gt;@ProcessOrder&lt;/code&gt; might hide important business rules, making the code harder to understand and maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Complex Interactions Between Annotations
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Combining multiple custom annotations that affect the same method (e.g., &lt;code&gt;@Retry&lt;/code&gt;, &lt;code&gt;@Cacheable&lt;/code&gt;, &lt;code&gt;@LogExecutionTime&lt;/code&gt;) can result in unpredictable behavior and is difficult to manage&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance-Critical Code
&lt;/h3&gt;

&lt;p&gt;Custom annotations often rely on reflection or proxy mechanisms, which can introduce performance overhead. &lt;/p&gt;

&lt;p&gt;They should not be used in performance-critical sections of code.&lt;/p&gt;

&lt;p&gt;Using a custom annotation to add logging to a method that is called millions of times in a tight loop could significantly degrade performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 Summary - When to Use Custom Annotations
&lt;/h2&gt;

&lt;p&gt;Custom annotations are perfect for handling cross-cutting concerns like logging, security, and transaction management.&lt;/p&gt;

&lt;p&gt;They're also great for scenarios where you need to apply the same behaviour across multiple parts of your application.&lt;/p&gt;

&lt;p&gt;However, for simple, one-off logic, or where fine-grained control and flexibility are required, custom annotations might not be the best approach.&lt;/p&gt;

&lt;p&gt;Consider the trade-offs before you decide to implement them.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌟 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Custom annotations are a powerful tool in your Spring Boot arsenal, but like any tool, they should be used judiciously.&lt;/p&gt;

&lt;p&gt;They offer a clean, reusable way to handle repetitive tasks and enforce consistency across your codebase.&lt;/p&gt;

&lt;p&gt;But be mindful of the potential downsides, especially for complexity and performance.&lt;/p&gt;




&lt;h2&gt;
  
  
  📣📣 Announcement
&lt;/h2&gt;

&lt;p&gt;I am launching a 10-day cohort-based course for software developers and aspiring microservices architects on designing and implementing rate-limiting service using Spring Boot and Bucket4j.&lt;/p&gt;

&lt;p&gt;You'll learn:&lt;/p&gt;

&lt;p&gt;✅ How to design and build a production-ready microservice&lt;/p&gt;

&lt;p&gt;✅ In-depth knowledge of rate-limiting algorithms and their implementation&lt;/p&gt;

&lt;p&gt;✅ Best practices in Spring Boot development, testing, and containerisation&lt;/p&gt;

&lt;p&gt;But it is also about&lt;/p&gt;

&lt;p&gt;✅ breaking down the project into specific tasks&lt;/p&gt;

&lt;p&gt;✅ Being accountable to yourself&lt;/p&gt;

&lt;p&gt;✅ Designing and Building the project right&lt;/p&gt;

&lt;p&gt;It is targeted at software developers who want to design and develop a microservice which is a use case relevant to most companies.&lt;/p&gt;

&lt;p&gt;It's ESPECIALLY for those earlier in their software developer career who might not have "project experience" but tons of passion and ambition.&lt;/p&gt;

&lt;p&gt;If this is something that you think will help you or even if you are just curious to know more:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://maven.com/forms/34856a" rel="noopener noreferrer"&gt;Register your interest and I will let you know the workshop details.&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://weekendprogrammer.substack.com/" rel="noopener noreferrer"&gt;This was first published on my Substack. Subscribe to my Substack - Weekend Developer to get updates first.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Are you a developer who needs feedback on the code you write?&lt;/p&gt;

&lt;p&gt;Or do you want someone to review your code so that you are doing the right things?&lt;/p&gt;

&lt;p&gt;I help people with free code review sessions so that they can get early feedback and write better code&lt;/p&gt;

&lt;p&gt;DM me on &lt;a href="https://x.com/DishitDevasia" rel="noopener noreferrer"&gt;Twitter (X)&lt;/a&gt; or on &lt;a href="https://www.linkedin.com/in/dishitdevasia/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and I will help you with your code.&lt;/p&gt;

</description>
      <category>java</category>
      <category>springboot</category>
      <category>programming</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Are You Making This 1 Developer Mistake to Get a Job as a Software Developer?</title>
      <dc:creator>Dishit Devasia</dc:creator>
      <pubDate>Sun, 04 Aug 2024 21:01:53 +0000</pubDate>
      <link>https://dev.to/dishitdevasia/are-you-making-this-1-developer-mistake-to-get-a-job-as-a-software-developer-5ahk</link>
      <guid>https://dev.to/dishitdevasia/are-you-making-this-1-developer-mistake-to-get-a-job-as-a-software-developer-5ahk</guid>
      <description>&lt;h2&gt;
  
  
  The Biggest Mistake
&lt;/h2&gt;

&lt;p&gt;Do you know what one of the biggest mistakes that most developers make when starting out is? &lt;/p&gt;

&lt;p&gt;It's focusing too much on solving LeetCode problems and understanding Data Structure and Algorithms (DSA). &lt;/p&gt;

&lt;p&gt;While these are important, they shouldn't be the sole focus of your learning journey. Here's why:&lt;/p&gt;

&lt;h3&gt;
  
  
  Practical Experience
&lt;/h3&gt;

&lt;p&gt;Spending all your time on LeetCode and DSA may cause you to miss out on practical experience, which is crucial for your career growth.&lt;/p&gt;

&lt;h3&gt;
  
  
  Job Requirements
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reading and Research
&lt;/h3&gt;

&lt;p&gt;In a professional setting, you'll spend a lot of time reading API specs, requirement documents, language documentation, and library documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Value of Projects
&lt;/h2&gt;

&lt;p&gt;Instead of solely focusing on LeetCode problems, consider building projects with specific learning objectives. Here's why projects are valuable:&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-life Experience
&lt;/h3&gt;

&lt;p&gt;Projects provide practical experiences that are more relevant to real-world job requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integration and System Knowledge
&lt;/h3&gt;

&lt;p&gt;Through projects, you'll learn to integrate systems, understand domains, and gain valuable domain-specific knowledge.&lt;/p&gt;

&lt;h3&gt;
  
  
  Interview Preparation
&lt;/h3&gt;

&lt;p&gt;Many companies prioritise practical skills and domain knowledge over advanced algorithms, making project experience more valuable in interviews.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workshop Announcement
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Let me know if you are interested.&lt;/p&gt;

&lt;p&gt;Thank you for reading and stay tuned for more valuable insights for developers!&lt;/p&gt;




&lt;h2&gt;
  
  
  Before you go!
&lt;/h2&gt;

&lt;p&gt;This was first published on my substack.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://weekendprogrammer.substack.com/" rel="noopener noreferrer"&gt;Join others in getting updates like this in your inbox directly by subscribing to it&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I also run free code review sessions where I go through your code and provide feedback.&lt;/p&gt;

&lt;p&gt;DM me on &lt;a href="https://www.linkedin.com/in/dishitdevasia/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or &lt;a href="https://x.com/DishitDevasia" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>career</category>
    </item>
    <item>
      <title>Case Study: Loosely Coupled Architecture</title>
      <dc:creator>Dishit Devasia</dc:creator>
      <pubDate>Tue, 23 Jul 2024 21:35:27 +0000</pubDate>
      <link>https://dev.to/dishitdevasia/case-study-loosely-coupled-architecture-1j58</link>
      <guid>https://dev.to/dishitdevasia/case-study-loosely-coupled-architecture-1j58</guid>
      <description>&lt;p&gt;If you've been in the world of software development, you've likely come across the concept of loosely coupled design. &lt;/p&gt;

&lt;p&gt;You may have a basic understanding of what it is, but have you seen how it's actually implemented in practice? &lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Urgent Issue
&lt;/h2&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;Typically, this kind of scenario would require running an entire suite of regression tests and involving quality engineers or software testers. &lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq2d6pe393gxawrb4mex5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq2d6pe393gxawrb4mex5.png" alt="Image description" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;This meant that the front end did not require extensive regression testing, showcasing the benefits of a loosely coupled architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Alternative
&lt;/h2&gt;

&lt;p&gt;I also want to illustrate the alternative scenario where the front end directly accesses details from the public API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcrl3dtc09ul7m3pf9aai.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcrl3dtc09ul7m3pf9aai.png" alt="Image description" width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of Loosely Coupled Architecture
&lt;/h2&gt;

&lt;p&gt;The contrast between the two scenarios highlights the benefits of a loosely coupled architecture:&lt;/p&gt;

&lt;h3&gt;
  
  
  Isolation of changes
&lt;/h3&gt;

&lt;p&gt;A change in one system does not affect the entire system&lt;/p&gt;

&lt;h3&gt;
  
  
  Reduced blast radius
&lt;/h3&gt;

&lt;p&gt;Changes are contained within specific components, minimizing the impact on the overall system&lt;/p&gt;

&lt;h3&gt;
  
  
  Abstraction of complexities
&lt;/h3&gt;

&lt;p&gt;Authentication, error handling, and retries are handled in the integration layer, abstracted away from the front end&lt;/p&gt;

&lt;p&gt;In conclusion, a loosely coupled architecture provides numerous advantages in software development, ensuring that changes are isolated and do not disrupt the entire system.&lt;/p&gt;

&lt;p&gt;Thank you for reading! If you found this information valuable, please like and share to help others benefit from it as well&lt;/p&gt;




&lt;h2&gt;
  
  
  Before you go!
&lt;/h2&gt;

&lt;p&gt;This was first published on my substack.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://weekendprogrammer.substack.com/subscribe" rel="noopener noreferrer"&gt;Join others in getting updates like this in your inbox directly by subscribing to it&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I also run free code review sessions where I go through your code and provide feedback. &lt;/p&gt;

&lt;p&gt;You can DM me on &lt;a href="https://www.linkedin.com/in/dishitdevasia/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or &lt;a href="https://x.com/DishitDevasia" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>architecture</category>
      <category>programming</category>
      <category>softwaredesign</category>
    </item>
  </channel>
</rss>
