<?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: Vikash Kumar</title>
    <description>The latest articles on DEV Community by Vikash Kumar (@codemason_vikash).</description>
    <link>https://dev.to/codemason_vikash</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4126415%2Fe39ebd0e-2d85-40db-9ec7-8b0dc5d67906.jpg</url>
      <title>DEV Community: Vikash Kumar</title>
      <link>https://dev.to/codemason_vikash</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codemason_vikash"/>
    <language>en</language>
    <item>
      <title>How Does a Chatbot Remember? The Engineering Behind Context and Memory</title>
      <dc:creator>Vikash Kumar</dc:creator>
      <pubDate>Tue, 27 Oct 2026 03:46:33 +0000</pubDate>
      <link>https://dev.to/codemason_vikash/how-does-a-chatbot-remember-the-engineering-behind-context-and-memory-2f7e</link>
      <guid>https://dev.to/codemason_vikash/how-does-a-chatbot-remember-the-engineering-behind-context-and-memory-2f7e</guid>
      <description>&lt;p&gt;One of the interesting things about using a chatbot is how naturally a conversation can continue.&lt;/p&gt;

&lt;p&gt;I can ask a question, provide additional information, refer to something mentioned earlier, and expect the assistant to understand what I mean.&lt;/p&gt;

&lt;p&gt;But while studying how chatbots work, I learned an important distinction:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A continuous conversation is something the application must create. It is not automatically provided by every individual LLM call.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when I send a follow-up message?
&lt;/h2&gt;

&lt;p&gt;Imagine this conversation:&lt;/p&gt;

&lt;p&gt;User: My food hasn't arrived.&lt;/p&gt;

&lt;p&gt;Assistant: Would you like to wait or request a refund?&lt;/p&gt;

&lt;p&gt;User: I want a refund.&lt;/p&gt;

&lt;p&gt;The last message makes sense because of the earlier exchange.&lt;/p&gt;

&lt;p&gt;But what happens if the application sends only “I want a refund” to the model?&lt;/p&gt;

&lt;p&gt;The model may not have the information needed to understand the situation. The application needs to preserve the relevant conversation history and include it in the next request.&lt;/p&gt;

&lt;p&gt;This was my first important takeaway: the application is responsible for maintaining the conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory is not necessarily inside the model
&lt;/h2&gt;

&lt;p&gt;Suppose I tell a chatbot that my preferred programming language is Java.&lt;/p&gt;

&lt;p&gt;Later, I ask which language I prefer.&lt;/p&gt;

&lt;p&gt;It might seem that the model has permanently learned something about me.&lt;/p&gt;

&lt;p&gt;However, the application could have stored that preference, retrieved it when needed, and supplied it as context for the new request.&lt;/p&gt;

&lt;p&gt;The process could look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Information
       ↓
Application Memory
       ↓
Retrieve Relevant Information
       ↓
Add to Current Context
       ↓
LLM Generates Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is different from training the model and updating its learned parameters.&lt;/p&gt;

&lt;p&gt;That distinction changed how I think about chatbot memory. The user experience may look like persistent memory even when the application is retrieving stored information and passing it to the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  More context is not always better
&lt;/h2&gt;

&lt;p&gt;Another concept that stood out to me was the context window.&lt;/p&gt;

&lt;p&gt;A model can process only a limited amount of information in a given interaction.&lt;/p&gt;

&lt;p&gt;An application might store hundreds or thousands of messages, but it does not necessarily need to send every message with every request.&lt;/p&gt;

&lt;p&gt;It can select recent messages, summarize older exchanges, or retrieve only information relevant to the current question.&lt;/p&gt;

&lt;p&gt;Why does this matter?&lt;/p&gt;

&lt;p&gt;Because repeatedly including a growing conversation can increase input token usage, which can affect cost and latency. It also consumes some of the model's available context capacity.&lt;/p&gt;

&lt;p&gt;The important design question is not simply:&lt;/p&gt;

&lt;p&gt;“How much context can I send?”&lt;/p&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Which information does the model actually need to answer this request well?”&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Streaming is a user-experience decision
&lt;/h2&gt;

&lt;p&gt;The lecture also connected next-token generation to streaming.&lt;/p&gt;

&lt;p&gt;Instead of waiting for an entire answer before showing anything, an application can display generated content progressively as it arrives.&lt;/p&gt;

&lt;p&gt;This can make an application feel more responsive, although it does not necessarily make the underlying model generate the complete response faster.&lt;/p&gt;

&lt;p&gt;It is another reminder that the experience users see depends on application design, not just model capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  And then there is hallucination
&lt;/h2&gt;

&lt;p&gt;A model can generate an answer that sounds convincing without the answer being factually correct.&lt;/p&gt;

&lt;p&gt;Fluent language and verified information are two different things.&lt;/p&gt;

&lt;p&gt;For a real application, this matters enormously.&lt;/p&gt;

&lt;p&gt;Imagine a support chatbot answering questions about an order. It should retrieve the actual order status rather than inventing one. If an action requires authorization, the application must enforce that authorization instead of trusting a prompt alone.&lt;/p&gt;

&lt;p&gt;Depending on the use case, retrieval, external APIs, tool calling, validation, guardrails, and evaluation can improve reliability.&lt;/p&gt;

&lt;p&gt;They reduce certain risks, but they do not guarantee that every answer will be correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm taking away as a software engineer
&lt;/h2&gt;

&lt;p&gt;I'm beginning to see chatbot engineering as more than sending prompts to a model.&lt;/p&gt;

&lt;p&gt;The application needs to manage conversation history, select context, retrieve relevant information, control access to tools, and handle responses appropriately.&lt;/p&gt;

&lt;p&gt;These are familiar software engineering concerns applied to a new kind of capability.&lt;/p&gt;

&lt;p&gt;My biggest takeaway from this lecture is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A good chatbot does not merely generate responses. Its application must provide the right context and manage those responses responsibly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As I continue studying Forward Deployed Engineering and Generative AI, I want to understand not only how models work, but also how to build reliable applications around them.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>An LLM Is Not an Application: What I’m Learning About Building GenAI with Backend Engineering</title>
      <dc:creator>Vikash Kumar</dc:creator>
      <pubDate>Fri, 23 Oct 2026 11:55:38 +0000</pubDate>
      <link>https://dev.to/codemason_vikash/an-llm-is-not-an-application-what-im-learning-about-building-genai-with-backend-engineering-mbo</link>
      <guid>https://dev.to/codemason_vikash/an-llm-is-not-an-application-what-im-learning-about-building-genai-with-backend-engineering-mbo</guid>
      <description>&lt;p&gt;As I continue learning Forward Deployed Engineering and Generative AI, I am beginning to look at AI from a software engineer's perspective.&lt;/p&gt;

&lt;p&gt;My third lecture focused on a distinction that seems simple at first:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An LLM is not the same thing as a GenAI application.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An LLM provides language capabilities. But a real application needs software around the model to make those capabilities useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The model is only one part of the system
&lt;/h2&gt;

&lt;p&gt;Imagine a customer support team wants to summarize incoming support tickets.&lt;/p&gt;

&lt;p&gt;The LLM can generate a summary. But someone still needs to build the system that receives the ticket, sends the right information to the model, handles the response, and makes that result available to the support team.&lt;/p&gt;

&lt;p&gt;The overall workflow might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Support Ticket
      ↓
Backend Application
      ↓
LLM Provider API
      ↓
Generated Summary
      ↓
Backend Application
      ↓
Support Team
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model is important, but it is only one component in the workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What if the model needs information it doesn't have?
&lt;/h2&gt;

&lt;p&gt;Consider a user asking:&lt;/p&gt;

&lt;p&gt;“Where is my order right now?”&lt;/p&gt;

&lt;p&gt;A model cannot automatically know the user's latest order status. The application needs to retrieve that information from the relevant business system.&lt;/p&gt;

&lt;p&gt;The application may need to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify the requested information.&lt;/li&gt;
&lt;li&gt;Retrieve the appropriate order data.&lt;/li&gt;
&lt;li&gt;Provide the relevant context to the model.&lt;/li&gt;
&lt;li&gt;Generate a clear response.&lt;/li&gt;
&lt;li&gt;Return the result to the user.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This changes how I think about building AI features.&lt;/p&gt;

&lt;p&gt;Instead of asking only, “Which model should I use?”, I also need to ask, “What information does this workflow require, and how will my application obtain it?”&lt;/p&gt;

&lt;h2&gt;
  
  
  Connecting GenAI to backend engineering
&lt;/h2&gt;

&lt;p&gt;As a Java backend developer, I already understand APIs, services, controllers, external integrations, and data flow.&lt;/p&gt;

&lt;p&gt;Those concepts still matter when integrating an LLM.&lt;/p&gt;

&lt;p&gt;For example, a Spring Boot application can expose a REST endpoint, accept a support ticket, pass it to a service, and use Spring AI's &lt;code&gt;ChatClient&lt;/code&gt; to communicate with a supported model provider.&lt;/p&gt;

&lt;p&gt;The model interaction becomes part of an ordinary application workflow.&lt;/p&gt;

&lt;p&gt;That does not mean the integration is automatically production-ready. Engineers still need to consider validation, errors, credentials, latency, token usage, and observability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why abstractions matter
&lt;/h2&gt;

&lt;p&gt;It is possible to call an LLM provider directly through HTTP. A framework such as Spring AI provides another way to organize those interactions.&lt;/p&gt;

&lt;p&gt;As requirements grow to include streaming, structured outputs, tool calling, retrieval, or multiple providers, an abstraction may help reduce provider-specific code in application logic.&lt;/p&gt;

&lt;p&gt;The right choice depends on the application. Adding a framework without a real need can create unnecessary complexity, just as it can in other areas of software engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  One more design question
&lt;/h2&gt;

&lt;p&gt;My lecture also raised an interesting question: should application instructions and user-provided data be treated as the same thing?&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instruction: “Summarize this support ticket in two sentences.”&lt;/li&gt;
&lt;li&gt;Data: “Payment was deducted, but my order is still processing.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These serve different purposes. Keeping them conceptually separate is a useful starting point when designing model interactions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm taking away
&lt;/h2&gt;

&lt;p&gt;My understanding of GenAI is moving from the model itself toward the system built around it.&lt;/p&gt;

&lt;p&gt;The model generates language. The application supplies context, connects external capabilities, handles the result, and integrates the model into a real workflow.&lt;/p&gt;

&lt;p&gt;This is where my backend engineering experience becomes relevant to the AI systems I want to build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An LLM can be powerful, but engineering the surrounding application is what turns that capability into a useful feature.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm continuing to explore the connection between backend engineering, system design, and production AI applications as part of my Forward Deployed Engineering learning journey.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>backend</category>
      <category>llm</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>I Finally Have a Better Mental Model of How an LLM Generates Text</title>
      <dc:creator>Vikash Kumar</dc:creator>
      <pubDate>Wed, 21 Oct 2026 16:07:26 +0000</pubDate>
      <link>https://dev.to/codemason_vikash/i-finally-have-a-better-mental-model-of-how-an-llm-generates-text-2a3e</link>
      <guid>https://dev.to/codemason_vikash/i-finally-have-a-better-mental-model-of-how-an-llm-generates-text-2a3e</guid>
      <description>&lt;p&gt;I'm continuing my Forward Deployed Engineering and Generative AI learning journey.&lt;/p&gt;

&lt;p&gt;In my previous lecture, I learned an important engineering lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don't start with the technology. Start with the problem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This lecture moved one level deeper.&lt;/p&gt;

&lt;p&gt;I wanted to understand what actually happens inside an LLM when I type a prompt and it starts generating a response.&lt;/p&gt;

&lt;p&gt;Before studying this, it was easy to think about an LLM like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Prompt
   ↓
LLM
   ↓
Answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's useful at the application level, but it hides almost everything happening inside the model.&lt;/p&gt;

&lt;p&gt;The mental model I have now is very different.&lt;/p&gt;




&lt;h2&gt;
  
  
  It starts with a surprisingly simple idea
&lt;/h2&gt;

&lt;p&gt;At the generation level, an autoregressive LLM repeatedly predicts the next token.&lt;/p&gt;

&lt;p&gt;Suppose we provide:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The capital of India is
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model doesn't need to magically generate the complete sentence in one step.&lt;/p&gt;

&lt;p&gt;Instead, it estimates which token should come next.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The capital of India is
        ↓
      Delhi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the new sequence becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The capital of India is Delhi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model predicts again.&lt;/p&gt;

&lt;p&gt;And again.&lt;/p&gt;

&lt;p&gt;And again.&lt;/p&gt;

&lt;p&gt;So the basic generation loop is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Context
  ↓
Predict next token
  ↓
Select token
  ↓
Append token
  ↓
Predict again
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That simple idea helped me understand many of the other concepts in the lecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  But what exactly is a token?
&lt;/h2&gt;

&lt;p&gt;This was another important correction to my mental model.&lt;/p&gt;

&lt;p&gt;A token isn't necessarily a complete word.&lt;/p&gt;

&lt;p&gt;Depending on the tokenizer, a token can represent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A complete word&lt;/li&gt;
&lt;li&gt;Part of a word&lt;/li&gt;
&lt;li&gt;Punctuation&lt;/li&gt;
&lt;li&gt;A symbol&lt;/li&gt;
&lt;li&gt;Another frequently occurring text fragment&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Token ≠ Word
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This matters because LLMs operate on tokens rather than directly operating on human concepts like "sentences" or "paragraphs."&lt;/p&gt;




&lt;h2&gt;
  
  
  Text has to become numbers
&lt;/h2&gt;

&lt;p&gt;Neural networks operate mathematically.&lt;/p&gt;

&lt;p&gt;So the text needs to be converted into numerical representations.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Text
 ↓
Tokens
 ↓
Token IDs
 ↓
Embeddings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Token IDs identify tokens.&lt;/p&gt;

&lt;p&gt;But an ID by itself doesn't represent meaning.&lt;/p&gt;

&lt;p&gt;The model therefore uses embeddings: learned numerical vectors that can be processed by the neural network.&lt;/p&gt;

&lt;p&gt;This distinction was useful:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Token ID
→ Which token is this?

Embedding
→ Numerical representation used for processing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Then I ran into a problem: order matters
&lt;/h2&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dog bites man.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Man bites dog.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Almost the same words.&lt;/p&gt;

&lt;p&gt;Completely different meaning.&lt;/p&gt;

&lt;p&gt;So the model needs information about position.&lt;/p&gt;

&lt;p&gt;It needs to understand not only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What token is this?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;but also:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where does this token occur?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That gives us the idea of position information.&lt;/p&gt;




&lt;h2&gt;
  
  
  Then context makes everything more interesting
&lt;/h2&gt;

&lt;p&gt;Consider the word:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bank
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I deposited money at the bank.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;it has one meaning.&lt;/p&gt;

&lt;p&gt;In:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;We sat on the bank of the river.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;it has another.&lt;/p&gt;

&lt;p&gt;The token itself hasn't changed.&lt;/p&gt;

&lt;p&gt;The context has.&lt;/p&gt;

&lt;p&gt;This leads to an important idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A token shouldn't always be interpreted independently of the other tokens around it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And this is where attention becomes important.&lt;/p&gt;




&lt;h2&gt;
  
  
  Attention: which other tokens matter?
&lt;/h2&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The animal didn't cross the street because it was too tired.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To interpret &lt;code&gt;it&lt;/code&gt;, other tokens in the sentence matter.&lt;/p&gt;

&lt;p&gt;Attention provides a mechanism for determining which other tokens should influence the current token's representation.&lt;/p&gt;

&lt;p&gt;At a high level, I think of it as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Current token
      ↓
Which other tokens are relevant?
      ↓
Gather useful information
      ↓
Update representation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The lecture introduces Query, Key and Value as the three learned representations used in this mechanism.&lt;/p&gt;

&lt;p&gt;The search analogy helped me:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Query
→ What am I looking for?

Key
→ What kind of information do I contain?

Value
→ What information can I provide?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They aren't literally English questions inside the model. They are mathematical vectors.&lt;/p&gt;

&lt;p&gt;But the analogy helped me understand their roles.&lt;/p&gt;




&lt;h2&gt;
  
  
  Attention isn't the Transformer
&lt;/h2&gt;

&lt;p&gt;Another misconception I had to correct:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Transformer = Attention
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not quite.&lt;/p&gt;

&lt;p&gt;Attention is an important component of a Transformer.&lt;/p&gt;

&lt;p&gt;A Transformer contains repeated processing blocks.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input
 ↓
Transformer Block
 ↓
Transformer Block
 ↓
Transformer Block
 ↓
...
 ↓
Final Representation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each layer can progressively refine the representations.&lt;/p&gt;

&lt;p&gt;So instead of imagining the model as one giant operation, I can think about it as repeated transformations of the information.&lt;/p&gt;




&lt;h2&gt;
  
  
  Finally: how does the model choose the next token?
&lt;/h2&gt;

&lt;p&gt;After the Transformer processes the context, the model produces scores for possible next tokens.&lt;/p&gt;

&lt;p&gt;These are called &lt;strong&gt;logits&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Then Softmax converts those scores into probabilities.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Context
 ↓
Transformer
 ↓
Logits
 ↓
Softmax
 ↓
Probability distribution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Delhi      92%
Kolkata     2%
Punjab      2%
Mumbai      1%
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we have another question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which token should actually be selected?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's where decoding comes in.&lt;/p&gt;




&lt;h2&gt;
  
  
  The model and the decoder are different things
&lt;/h2&gt;

&lt;p&gt;This distinction was particularly useful to me.&lt;/p&gt;

&lt;p&gt;The model produces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Probability distribution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The decoding strategy decides:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Which token gets selected?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, greedy decoding chooses the highest-probability token.&lt;/p&gt;

&lt;p&gt;Sampling can choose among possible tokens according to their probabilities.&lt;/p&gt;

&lt;p&gt;Temperature changes how sharp or flat the distribution becomes before sampling.&lt;/p&gt;

&lt;p&gt;So the pipeline becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MODEL
 ↓
Probability Distribution
 ↓
DECODING STRATEGY
 ↓
Selected Token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  And then the whole process starts again
&lt;/h2&gt;

&lt;p&gt;This is probably the most important mental model I took from the lecture.&lt;/p&gt;

&lt;p&gt;The model selects one token.&lt;/p&gt;

&lt;p&gt;That token is appended to the sequence.&lt;/p&gt;

&lt;p&gt;The updated sequence becomes the context for the next prediction.&lt;/p&gt;

&lt;p&gt;Then the process repeats.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Prompt
 ↓
Predict
 ↓
Select
 ↓
Append
 ↓
Predict
 ↓
Select
 ↓
Append
 ↓
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is autoregressive generation.&lt;/p&gt;

&lt;p&gt;And suddenly, streaming text from an LLM makes more sense too.&lt;/p&gt;

&lt;p&gt;The application can expose generated tokens or chunks as they become available instead of waiting for the entire response to be generated.&lt;/p&gt;




&lt;h2&gt;
  
  
  My mental model now
&lt;/h2&gt;

&lt;p&gt;Before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Prompt → LLM → Answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After this lecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Text
 ↓
Tokens
 ↓
Token IDs
 ↓
Embeddings + Position
 ↓
Transformer + Attention
 ↓
Contextual Representations
 ↓
Logits
 ↓
Probabilities
 ↓
Decoding
 ↓
Next Token
 ↓
Append
 ↓
Repeat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a much more useful mental model for me as an engineer.&lt;/p&gt;

&lt;p&gt;It also gives me a better foundation for understanding the AI systems I'll eventually build around these models.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm taking forward
&lt;/h2&gt;

&lt;p&gt;The biggest lesson from this lecture isn't that I memorized definitions for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tokens&lt;/li&gt;
&lt;li&gt;Embeddings&lt;/li&gt;
&lt;li&gt;Attention&lt;/li&gt;
&lt;li&gt;Transformers&lt;/li&gt;
&lt;li&gt;Logits&lt;/li&gt;
&lt;li&gt;Softmax&lt;/li&gt;
&lt;li&gt;Temperature&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's that these concepts fit together into one generation process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An LLM repeatedly uses context to predict what token should come next.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everything else helps make that process possible and useful.&lt;/p&gt;

&lt;p&gt;I'm continuing to study Forward Deployed Engineering and Generative AI alongside System Design.&lt;/p&gt;

&lt;p&gt;The next step is to keep moving from:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;understanding the model → understanding AI applications → understanding production AI systems.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>learning</category>
      <category>llm</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>I Started Learning Forward Deployed Engineering — And My First Lesson Was to Question the Requirement</title>
      <dc:creator>Vikash Kumar</dc:creator>
      <pubDate>Tue, 20 Oct 2026 08:30:44 +0000</pubDate>
      <link>https://dev.to/codemason_vikash/i-started-learning-forward-deployed-engineering-and-my-first-lesson-was-to-question-the-2p65</link>
      <guid>https://dev.to/codemason_vikash/i-started-learning-forward-deployed-engineering-and-my-first-lesson-was-to-question-the-2p65</guid>
      <description>&lt;p&gt;I recently started learning Forward Deployed Engineering alongside my System Design studies.&lt;/p&gt;

&lt;p&gt;I expected the first lessons to be mostly about Generative AI, LLMs, tools and application architecture.&lt;/p&gt;

&lt;p&gt;Instead, one of the first lessons was much more fundamental:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before building the requested solution, understand the problem behind the request.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That sounds obvious.&lt;/p&gt;

&lt;p&gt;But it changes how I think about engineering.&lt;br&gt;
&lt;strong&gt;"We need an AI chatbot."&lt;/strong&gt;&lt;br&gt;
Imagine an e-commerce company tells an engineer:&lt;br&gt;
"We need an AI chatbot."&lt;/p&gt;

&lt;p&gt;The obvious reaction is to start thinking about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which LLM should we use?&lt;/li&gt;
&lt;li&gt;Which framework?&lt;/li&gt;
&lt;li&gt;How should we design the API?&lt;/li&gt;
&lt;li&gt;Should we use RAG?&lt;/li&gt;
&lt;li&gt;How should we write the prompts?
But the request itself may not describe the actual problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The company might actually be experiencing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Long customer-support resolution times&lt;/li&gt;
&lt;li&gt;Repetitive work for support executives&lt;/li&gt;
&lt;li&gt;Inconsistent answers&lt;/li&gt;
&lt;li&gt;Increasing support costs&lt;/li&gt;
&lt;li&gt;Too many routine requests&lt;/li&gt;
&lt;li&gt;Lack of support outside business hours
So the real requirement could be something closer to:
Reduce the time required to resolve customer problems without reducing accuracy or customer trust.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the engineering problem looks different.&lt;/p&gt;

&lt;p&gt;The chatbot is no longer the requirement.&lt;/p&gt;

&lt;p&gt;It is one possible implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request vs requirement&lt;/strong&gt;&lt;br&gt;
This distinction was one of my biggest takeaways from the first FDE lesson.&lt;/p&gt;

&lt;p&gt;A useful engineering flow is:&lt;br&gt;
Customer Request&lt;br&gt;
         ↓&lt;br&gt;
Understand Business Problem&lt;br&gt;
         ↓&lt;br&gt;
Understand Existing Workflow&lt;br&gt;
         ↓&lt;br&gt;
Identify Constraints&lt;br&gt;
         ↓&lt;br&gt;
Design Technical Solution&lt;br&gt;
         ↓&lt;br&gt;
Integrate With Existing Systems&lt;br&gt;
         ↓&lt;br&gt;
Test &amp;amp; Evaluate&lt;br&gt;
         ↓&lt;br&gt;
Production&lt;br&gt;
This is different from simply receiving a feature request and immediately implementing it.&lt;/p&gt;

&lt;p&gt;The engineer has to discover what the system actually needs to accomplish.&lt;br&gt;
&lt;strong&gt;Then comes another problem: the LLM cannot do everything&lt;/strong&gt;&lt;br&gt;
Suppose a customer says:&lt;br&gt;
"Cancel my order and refund my payment."&lt;/p&gt;

&lt;p&gt;An LLM can generate a convincing sentence:&lt;br&gt;
"Your order has been cancelled."&lt;/p&gt;

&lt;p&gt;But the sentence itself doesn't cancel an order.&lt;/p&gt;

&lt;p&gt;A production system needs something more like:&lt;br&gt;
Customer Request&lt;br&gt;
        ↓&lt;br&gt;
LLM understands intent&lt;br&gt;
        ↓&lt;br&gt;
Application validates request&lt;br&gt;
        ↓&lt;br&gt;
Cancellation API&lt;br&gt;
        ↓&lt;br&gt;
Order / Database System&lt;br&gt;
        ↓&lt;br&gt;
Confirmed Result&lt;br&gt;
        ↓&lt;br&gt;
Customer Response&lt;br&gt;
Now we have engineering questions.&lt;/p&gt;

&lt;p&gt;Is the customer authorized?&lt;/p&gt;

&lt;p&gt;Has the order already shipped?&lt;/p&gt;

&lt;p&gt;Is the order actually cancellable?&lt;/p&gt;

&lt;p&gt;What happens if the API fails?&lt;/p&gt;

&lt;p&gt;What if the model identifies the wrong order?&lt;/p&gt;

&lt;p&gt;Should a large refund require human approval?&lt;/p&gt;

&lt;p&gt;How do we audit the operation?&lt;/p&gt;

&lt;p&gt;How do we test it?&lt;/p&gt;

&lt;p&gt;How much latency is acceptable?&lt;/p&gt;

&lt;p&gt;How much does each interaction cost?&lt;/p&gt;

&lt;p&gt;The LLM is only one component of the system.&lt;br&gt;
&lt;strong&gt;An LLM doesn't automatically know the company&lt;/strong&gt;&lt;br&gt;
A general-purpose LLM may understand concepts like refunds, payments and deliveries.&lt;/p&gt;

&lt;p&gt;But it doesn't automatically know the company's current:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refund policy&lt;/li&gt;
&lt;li&gt;Customer order history&lt;/li&gt;
&lt;li&gt;Delivery status&lt;/li&gt;
&lt;li&gt;Payment records&lt;/li&gt;
&lt;li&gt;Inventory&lt;/li&gt;
&lt;li&gt;Internal procedures&lt;/li&gt;
&lt;li&gt;Customer permissions
The application therefore has to provide relevant information and connect the model with the systems that contain it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
Customer Question&lt;br&gt;
       +&lt;br&gt;
Company Policy&lt;br&gt;
       +&lt;br&gt;
Customer Data&lt;br&gt;
       +&lt;br&gt;
Previous Conversation&lt;br&gt;
       ↓&lt;br&gt;
      LLM&lt;br&gt;
       ↓&lt;br&gt;
Grounded Response / Action&lt;br&gt;
This is where AI application engineering becomes much more interesting to me.&lt;/p&gt;

&lt;p&gt;The challenge isn't simply "use an LLM."&lt;/p&gt;

&lt;p&gt;The challenge is building everything around the LLM so that the overall system behaves reliably.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What FDE adds to this&lt;/strong&gt;&lt;br&gt;
From my first lesson, I understand Forward Deployed Engineering as being close to the environment where the real problem exists.&lt;/p&gt;

&lt;p&gt;An FDE works with customers, business teams, operations and engineering teams to understand the workflow, identify the actual problem, build a solution and help take it into production.&lt;/p&gt;

&lt;p&gt;That means the role sits at an interesting boundary:&lt;br&gt;
Real Customer Problem&lt;br&gt;
        ↕&lt;br&gt;
Forward Deployed Engineer&lt;br&gt;
        ↕&lt;br&gt;
Product + Data + APIs + Engineering&lt;br&gt;
The technical solution is only part of the work.&lt;/p&gt;

&lt;p&gt;Understanding the problem is also engineering work.&lt;br&gt;
&lt;strong&gt;A lesson I want to carry forward&lt;/strong&gt;&lt;br&gt;
One sentence from this learning session stayed with me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't start with the technology. Start with the problem.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is easy to become excited about LLMs, agents, RAG, tools and frameworks.&lt;/p&gt;

&lt;p&gt;But a production system still needs to solve a real problem.&lt;/p&gt;

&lt;p&gt;And that means understanding:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem → Workflow → Constraints → System → Integration → Evaluation → Production&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm going to continue this FDE + Generative AI journey alongside my System Design learning.&lt;/p&gt;

&lt;p&gt;The goal isn't simply to learn how to call an LLM API.&lt;/p&gt;

&lt;p&gt;The goal is to learn how to turn a real-world problem into a reliable engineering system.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>I'm Exploring Low Level Design , and SOLID Is Changing How I Look At Code</title>
      <dc:creator>Vikash Kumar</dc:creator>
      <pubDate>Tue, 15 Sep 2026 14:17:27 +0000</pubDate>
      <link>https://dev.to/codemason_vikash/im-exploring-low-level-design-and-solid-is-changing-how-i-look-at-code-3a72</link>
      <guid>https://dev.to/codemason_vikash/im-exploring-low-level-design-and-solid-is-changing-how-i-look-at-code-3a72</guid>
      <description>&lt;p&gt;I've started going deeper into Low-Level Design as part of my journey toward becoming a stronger software engineer.&lt;/p&gt;

&lt;p&gt;My initial understanding of LLD was mostly around classes, objects, relationships, and design patterns.&lt;/p&gt;

&lt;p&gt;But one thing became clear very quickly:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Good LLD isn't about writing more classes or using more design patterns.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's about making code easier to change without creating unnecessary complexity.&lt;/p&gt;

&lt;p&gt;That's where SOLID started making more sense to me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;SOLID isn't five rules to memorize&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The five principles are:&lt;/p&gt;

&lt;p&gt;Single Responsibility Principle&lt;br&gt;
Open/Closed Principle&lt;br&gt;
Liskov Substitution Principle&lt;br&gt;
Interface Segregation Principle&lt;br&gt;
Dependency Inversion Principle&lt;/p&gt;

&lt;p&gt;But instead of memorizing their definitions, I'm trying to understand the problems they're trying to prevent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. SRP — How many reasons can make this class change?_&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine an Invoice class responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;calculating the invoice&lt;/li&gt;
&lt;li&gt;printing the invoice&lt;/li&gt;
&lt;li&gt;saving it to the database&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It may work perfectly today.&lt;/p&gt;

&lt;p&gt;But these responsibilities can change independently.&lt;/p&gt;

&lt;p&gt;A change in calculation logic shouldn't necessarily require touching printing logic.&lt;/p&gt;

&lt;p&gt;A database change shouldn't necessarily affect invoice calculation.&lt;/p&gt;

&lt;p&gt;That made the idea of SRP much clearer to me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The important question isn't simply "How many things does this class do?&lt;/em&gt;"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;It's "How many independent reasons can make this class change?&lt;/em&gt;"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. OCP — What happens when a new requirement arrives?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Suppose an invoice can currently be saved to a database.&lt;/p&gt;

&lt;p&gt;Tomorrow the requirement becomes:&lt;/p&gt;

&lt;p&gt;"We also need to save invoices to files."&lt;/p&gt;

&lt;p&gt;One approach is to keep adding methods to the existing class.&lt;/p&gt;

&lt;p&gt;But as requirements continue to grow, the class becomes a collection of unrelated variations.&lt;/p&gt;

&lt;p&gt;Using an abstraction allows different implementations to provide different behaviors.&lt;/p&gt;

&lt;p&gt;This made OCP feel less like:&lt;/p&gt;

&lt;p&gt;"Never modify existing code."&lt;/p&gt;

&lt;p&gt;and more like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;"Design stable parts so that new behavior can be added without constantly changing them."&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. LSP — Inheritance is more than code reuse&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Liskov Substitution Principle was particularly interesting to me.&lt;/p&gt;

&lt;p&gt;Imagine a Vehicle abstraction that assumes every vehicle has an engine.&lt;/p&gt;

&lt;p&gt;A car fits.&lt;/p&gt;

&lt;p&gt;A motorcycle fits.&lt;/p&gt;

&lt;p&gt;But a bicycle doesn't.&lt;/p&gt;

&lt;p&gt;If client code expects every Vehicle to provide engine-related behavior, substituting a bicycle can break the program's assumptions.&lt;/p&gt;

&lt;p&gt;The problem isn't simply that the child class has a different implementation.&lt;/p&gt;

&lt;p&gt;The problem is that the parent abstraction made a promise that the child cannot satisfy.&lt;/p&gt;

&lt;p&gt;That gave me a better way to think about inheritance:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;A subtype should preserve the behavioral expectations of its parent.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. ISP — Don't make clients implement what they don't need&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine one RestaurantEmployee interface containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;washDishes()&lt;/li&gt;
&lt;li&gt;serveCustomers()&lt;/li&gt;
&lt;li&gt;cookFood()&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A waiter shouldn't need to implement cooking and dishwashing just because those methods happen to exist on a large interface.&lt;/p&gt;

&lt;p&gt;Breaking the interface into smaller, focused interfaces makes the dependency more meaningful.&lt;/p&gt;

&lt;p&gt;The lesson:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;An abstraction should be focused enough that its clients actually need what it exposes.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. DIP — Depend on capability, not implementation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I'm taking away&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The biggest change in my thinking isn't that I now know what SOLID stands for.&lt;/p&gt;

&lt;p&gt;It's that I'm starting to look at code by asking:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;How easily can this code change?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When I see a class, I want to ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What can cause it to change?&lt;/li&gt;
&lt;li&gt;Is it taking too many responsibilities?&lt;/li&gt;
&lt;li&gt;What happens when a new behavior is introduced?&lt;/li&gt;
&lt;li&gt;Can its subclasses really substitute for it?&lt;/li&gt;
&lt;li&gt;Are clients depending on things they don't need?&lt;/li&gt;
&lt;li&gt;Am I coupling the design to implementation details?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I still have a lot to learn.&lt;/p&gt;

&lt;p&gt;Next, I'm going deeper into design patterns and LLD problems to understand how these principles translate into actual designs and code.&lt;/p&gt;

&lt;p&gt;I'm documenting that journey as I go.&lt;/p&gt;

&lt;p&gt;Consider a MacBook that directly creates:&lt;/p&gt;

&lt;p&gt;WiredKeyboard&lt;br&gt;
WiredMouse&lt;/p&gt;

&lt;p&gt;The class now knows too much about concrete implementations.&lt;/p&gt;

&lt;p&gt;If we instead make it depend on:&lt;/p&gt;

&lt;p&gt;Keyboard&lt;br&gt;
Mouse&lt;/p&gt;

&lt;p&gt;we can provide different implementations without changing the MacBook itself.&lt;/p&gt;

&lt;p&gt;This is where dependency inversion starts becoming practical:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;High-level logic shouldn't be tightly coupled to low-level implementation details.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>learning</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
    </item>
  </channel>
</rss>
