<?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: Jose Maria Iriarte</title>
    <description>The latest articles on DEV Community by Jose Maria Iriarte (@josemariairiarte).</description>
    <link>https://dev.to/josemariairiarte</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%2F945235%2F4679d937-31f4-4f3e-8586-28a21b5e8898.jpg</url>
      <title>DEV Community: Jose Maria Iriarte</title>
      <link>https://dev.to/josemariairiarte</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/josemariairiarte"/>
    <language>en</language>
    <item>
      <title>Performance Engineering: What Is the System Waiting For?</title>
      <dc:creator>Jose Maria Iriarte</dc:creator>
      <pubDate>Fri, 28 Aug 2026 17:09:38 +0000</pubDate>
      <link>https://dev.to/josemariairiarte/performance-engineering-what-is-the-system-waiting-for-483i</link>
      <guid>https://dev.to/josemariairiarte/performance-engineering-what-is-the-system-waiting-for-483i</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;When a request takes five seconds, the obvious question is what to make faster. The more useful question is what, precisely, the system spent those five seconds doing, or waiting to do. The answer may lie in unnecessary database work, excessive data movement, an execution plan, contention, or the costs of concurrency - and different causes require fundamentally different interventions. Performance engineering begins not with optimization, but with establishing causality: understanding what the system is doing before deciding what it should do differently.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;A request takes five seconds to completed. The database query looks suspicious. The endpoint contains an &lt;code&gt;Include()&lt;/code&gt;. The response contains considerably more data than the client appears to need. Somewhere in the service layer there is a loop that makes repeated calls. The application is running asynchronously, but under sufficient concurrency the server begins to queue requests and occasionally time out.&lt;/p&gt;

&lt;p&gt;There is no shortage of things that could be optimized.&lt;/p&gt;

&lt;p&gt;That is precisely the problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance engineering becomes difficult not when a system has no apparent inefficiencies, but when it has too many.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;A slow request can be the visible consequence of several independent mechanisms: inefficient data access, excessive data movement, contention, blocking, serialization, network latency, or resource exhaustion. &lt;/p&gt;

&lt;p&gt;Improving one of them may have little effect on the request - or may simply expose another bottleneck further down the chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The first task, therefore, is not optimization. It is diagnosis.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Latency Alone Says Very Little
&lt;/h2&gt;

&lt;p&gt;Suppose an API endpoint takes 4.8 seconds.&lt;/p&gt;

&lt;p&gt;That number is useful, but only as a starting point.&lt;/p&gt;

&lt;p&gt;It does not tell us whether the database consumed 4.7 seconds or 40 milliseconds. It does not tell us whether the application was computing, waiting for a lock, waiting for another service, or waiting for an available thread. It does not tell us whether the database processed millions of rows to return a handful of records&lt;/p&gt;

&lt;p&gt;Two requests can have identical latency while having completely different causes.&lt;/p&gt;

&lt;p&gt;Consider two simplified cases.&lt;/p&gt;

&lt;p&gt;In the first, &lt;em&gt;SQL Server spends several seconds performing a large scan, executing expensive joins, and retrieving rows that the application subsequently discards.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In the second, &lt;em&gt;SQL Server executes the same query in a few milliseconds, but the request spends several seconds waiting for a lock held by another transaction.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;From the perspective of the API consumer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The endpoint is slow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From the perspective of the engineer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;These are entirely different problems.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first calls for investigation of query shape, indexes, filtering, projections, and execution plans.&lt;/p&gt;

&lt;p&gt;The second may require understanding transactions, locking behavior, concurrent workload, and the session responsible for blocking.&lt;/p&gt;

&lt;p&gt;Optimizing the query in the second scenario could accomplish almost nothing.&lt;/p&gt;

&lt;p&gt;This distinction is one of the reasons &lt;strong&gt;performance engineering cannot be reduced to a collection of ORM tricks or database tuning recipes.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Begin with the Shape of the Work
&lt;/h2&gt;

&lt;p&gt;A useful way to approach performance problems is to ask a deceptively simple question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What work is the system actually doing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Consider a seemingly innocent EF Core operation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;projects&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Projects&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The query itself may be perfectly valid. The problem is what happens afterward.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Perhaps the application filters the projects in memory.&lt;/li&gt;
&lt;li&gt;Perhaps it maps every entity into a large DTO.&lt;/li&gt;
&lt;li&gt;Perhaps it accesses related entities and triggers additional queries.&lt;/li&gt;
&lt;li&gt;Perhaps it serializes fields that the client never requested.&lt;/li&gt;
&lt;li&gt;Perhaps the endpoint eventually returns hundreds of thousands of rows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The database may not be the fundamental problem. The system may simply be doing far more work than the request requires.&lt;/p&gt;

&lt;p&gt;This is why projection, filtering, and pagination are not merely code-style preferences. They are mechanisms for controlling the quantity of work performed by the system.&lt;/p&gt;

&lt;p&gt;The earlier unnecessary work can be eliminated, the less work every subsequent stage needs to perform.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A row that is never selected does not need to be materialized.&lt;/li&gt;
&lt;li&gt;An entity that is never modified does not necessarily need to be tracked.&lt;/li&gt;
&lt;li&gt;A column that is never returned does not need to be transferred.&lt;/li&gt;
&lt;li&gt;A related collection that is never displayed does not need to be loaded.&lt;/li&gt;
&lt;li&gt;And data that has already been computed and remains sufficiently stable may not need to be computed again at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Performance optimization is often less about making operations faster than about preventing unnecessary operations from occurring in the first place.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The ORM can Conceal the Database
&lt;/h2&gt;

&lt;p&gt;This becomes particularly important when working with an ORM.&lt;br&gt;
LINQ is expressive enough that relatively small pieces of application code can represent surprisingly complicated SQL.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"nplus1-nested"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ActionResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetProjectsWithProposals_NestedNPlus1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;projects&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Projects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;projects&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Query per project&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;proposals&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Proposals&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ProjectId&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;proposalDtos&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;proposal&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;proposals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Query per proposal - multiplying the problem&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;freelancer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefaultAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;proposal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FreelancerUserId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="n"&gt;proposalDtos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;ProposalId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;proposal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;Bid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;proposal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;FreelancerName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;freelancer&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;KnownAs&lt;/span&gt;
            &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;ProjectId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Proposals&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;proposalDtos&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The endpoint above is deliberately simple. It retrieves the projects, then retrieves the proposals for each project, then retrieves the freelancer for each proposal.&lt;/p&gt;

&lt;p&gt;Imagine a dataset containing 500 projects and 10 proposals per project. Under the assumptions of this example, the endpoint would perform approximately:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 + 500 + 5,000 = 5,501 queries.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The code may remain readable and the application may even appear perfectly responsive with ten records. But the problem emerges as the cardinality increases.&lt;/p&gt;

&lt;p&gt;This is one of the recurring patterns in performance engineering: an implementation can be locally reasonable and globally pathological.&lt;/p&gt;

&lt;p&gt;In this particular example, the solution is not necessarily to make each of those queries faster. It is to change the shape of the operation.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"projects-with-proposals"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ActionResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetProjectsWithProposals&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Projects&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Proposals&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Proposals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pr&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;pr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;pr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;FreelancerName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Freelancer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KnownAs&lt;/span&gt;
            &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Here the relationships are expressed as part of a single projection. &lt;/p&gt;

&lt;p&gt;Rather than loading complete entities and navigating between them procedurally, the query describes the data the endpoint actually needs.&lt;/p&gt;

&lt;p&gt;The remedy in cases like this is often projection, appropriate joins or grouping, or carefully chosen batched loading. But even here, the first apparent solution can introduce another problem.&lt;/p&gt;

&lt;p&gt;Eliminating thousands of round trips is a substantial improvement. But it leaves us with another question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much data are we asking that single query to retrieve?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bad:&lt;br&gt;
&lt;code&gt;1 Project Query → 500 Proposal Queries → 5,000 Freelancer Queries&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Better:&lt;br&gt;
&lt;code&gt;1 Projection Query → Project + Proposals + Freelancer Name&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The objective is therefore not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make the number of SQL queries as small as possible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The objective is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make the overall data access strategy appropriate for the workload.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;One query can still be too much. Eliminating thousands of round trips is a significant improvement. But reducing the number of queries does not, by itself, make a data access strategy efficient.&lt;/p&gt;

&lt;p&gt;We can replace thousands of small operations with a single operation that retrieves far more information than the request actually requires.&lt;/p&gt;

&lt;p&gt;To make the downstream cost visible in a small test dataset, the example below deliberately amplifies several fields and collections. The amplification is artificial; the underlying pattern is not.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"over-fetching"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IActionResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;OverFetching&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Projects&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Freelancer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Conversations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsNoTracking&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Client&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KnownAs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FirstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LastName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Website&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LinkedIn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GitHub&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="c1"&gt;// Deliberately amplified to make the payload cost visible&lt;/span&gt;
            &lt;span class="n"&gt;BioCopies&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Enumerable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;Freelancer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Freelancer&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Freelancer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Freelancer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KnownAs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Freelancer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;BioCopies&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Enumerable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Freelancer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;Proposals&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Enumerable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SelectMany&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Proposals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;Conversations&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Conversations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Messages&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Enumerable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SelectMany&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Messages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Content&lt;/span&gt;
                &lt;span class="p"&gt;})&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The repeated biographies, proposals, and messages are there to make the cost visible in a small dataset. The underlying pattern, however, is quite ordinary.&lt;/p&gt;

&lt;p&gt;The endpoint loads complete related entities and entire collections before constructing its response. Only afterward does it decide what information to expose.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data does not become free simply because it arrived in a single query.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every unnecessary piece of data has consequences beyond the database. It may become an object that EF Core has to materialize, memory that the application has to retain, work that the serializer has to perform, bytes that have to cross the network, and data that the client has to process.&lt;br&gt;
A database optimization that reduces query count while dramatically increasing the amount of data transferred can therefore move the cost rather than eliminate it.&lt;/p&gt;

&lt;p&gt;The more fundamental solution is to establish the required data shape before materialization. Filter what is unnecessary, project only the required fields, and paginate collections that do not need to be loaded in their entirety.&lt;/p&gt;

&lt;p&gt;In other words, &lt;strong&gt;don't ask the database for an object graph and then decide what you need&lt;/strong&gt;. Whenever practical, &lt;strong&gt;ask the database only for what you need, first.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Read the Execution Plan, not Just the LINQ
&lt;/h2&gt;

&lt;p&gt;At this point, we have encountered two very different forms of inefficiency. One produced thousands of database round trips. The other produced a single operation carrying an excessive amount of data. Neither problem can be diagnosed reliably by looking only at how elegant the LINQ appears.&lt;/p&gt;

&lt;p&gt;When database work is genuinely contributing to latency, we need to see what the database is actually doing. The database's execution strategy is what matters. &lt;/p&gt;

&lt;p&gt;An actual execution plan can reveal behavior invisible at the application layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;index seeks versus scans&lt;/li&gt;
&lt;li&gt;expensive key lookups&lt;/li&gt;
&lt;li&gt;inefficient join strategies&lt;/li&gt;
&lt;li&gt;filters being applied later than expected&lt;/li&gt;
&lt;li&gt;large quantities of data being read to produce a small result&lt;/li&gt;
&lt;li&gt;operators responsible for disproportionate execution cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A query can therefore look perfectly reasonable in C# and still ask SQL Server to do an unreasonable amount of work.&lt;/p&gt;

&lt;p&gt;This is why generated SQL and execution plans are indispensable when investigating database performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ORM tells us what we asked the database to do.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;The execution plan tells us how the database chose to do it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Those are not the same thing.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;But execution plans have limits&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An execution plan is an excellent description of how a query executes. It is not necessarily a description of why a request is slow. &lt;/p&gt;

&lt;p&gt;A query can be efficient and still spend most of its lifetime waiting.&lt;br&gt;
Suppose the execution plan looks healthy. &lt;/p&gt;

&lt;p&gt;The query uses an appropriate index, returns a small number of rows, and consumes very little CPU.&lt;/p&gt;

&lt;p&gt;Yet the endpoint still occasionally takes several seconds.&lt;/p&gt;

&lt;p&gt;At this point, continuing to optimize the query may be a category error.&lt;br&gt;
The missing information may exist outside the query itself.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQL Server could be waiting on a lock.&lt;/li&gt;
&lt;li&gt;Another session could be holding a transaction open.&lt;/li&gt;
&lt;li&gt;The same query could be executing thousands of times across concurrent requests.&lt;/li&gt;
&lt;li&gt;A parameter-sensitive workload could be causing different parameter values to experience radically different execution behavior.&lt;/li&gt;
&lt;li&gt;Or the database could be perfectly healthy while the application is exhausting its available resources elsewhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where workload-level instrumentation becomes important.&lt;br&gt;
From the query to the workload&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools such as SQL Server Extended Events allow us to observe database activity over time rather than examining a single query in isolation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That temporal dimension changes the investigation.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why did this query take five seconds?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What was happening in the database during those five seconds?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Duration&lt;/strong&gt; becomes one signal among several.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logical reads&lt;/strong&gt; tell us how much data was processed, &lt;strong&gt;CPU time&lt;/strong&gt; helps distinguish computation from waiting, &lt;strong&gt;row counts&lt;/strong&gt; provide clues about over-fetching and inefficient access, &lt;strong&gt;session identifiers&lt;/strong&gt; can help establish relationships between activity, &lt;strong&gt;query hashes&lt;/strong&gt; can reveal repeated execution patterns, &lt;strong&gt;wait behavior&lt;/strong&gt; can indicate contention rather than computational expense.&lt;/p&gt;

&lt;p&gt;Consider a particularly revealing combination:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;high duration + low CPU + relatively modest reads.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That should make us suspicious: The query may not be expensive at all. It may simply be waiting.&lt;/p&gt;

&lt;p&gt;And a query that is waiting for another transaction cannot be made meaningfully faster by shaving a few milliseconds from its execution plan.&lt;/p&gt;

&lt;p&gt;The bottleneck exists somewhere else in the system.&lt;/p&gt;

&lt;p&gt;The same principle applies above the database&lt;/p&gt;

&lt;p&gt;The database is only one stage in the request pipeline.&lt;/p&gt;

&lt;p&gt;Imagine that a query is optimized from 800 ms to 80 ms. But the endpoint retrieves a large object graph, maps thousands of entities, serializes an oversized JSON response, and transfers it across a relatively high-latency connection.&lt;/p&gt;

&lt;p&gt;The database optimization may be real while the user-visible improvement remains disappointing.&lt;/p&gt;

&lt;p&gt;The system has simply moved its center of gravity.&lt;/p&gt;

&lt;p&gt;This is why &lt;strong&gt;performance investigation needs to follow the request across boundaries&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database work&lt;/li&gt;
&lt;li&gt;Application computation&lt;/li&gt;
&lt;li&gt;Object mapping&lt;/li&gt;
&lt;li&gt;Serialization&lt;/li&gt;
&lt;li&gt;Network transfer&lt;/li&gt;
&lt;li&gt;Client-side processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Each stage can amplify the cost of the previous one.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An unnecessarily large result set is not merely a database problem. It creates more objects. More objects create more allocations. More allocations create more garbage collection pressure. More data requires more serialization. More serialization consumes CPU. More serialized bytes require more network bandwidth. More bytes require more client-side processing.&lt;/p&gt;

&lt;p&gt;A seemingly small decision at the database layer can therefore propagate through the entire request pipeline.&lt;/p&gt;

&lt;p&gt;Reducing data is often more powerful than optimizing its processing&lt;/p&gt;

&lt;p&gt;The preceding examples point toward a broader principle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance problems often become easier to solve when we reduce the quantity of work rather than attempting to accelerate the work itself.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Projection reduces columns.&lt;br&gt;
Filtering reduces rows.&lt;br&gt;
Pagination reduces result sets.&lt;br&gt;
DTO shaping reduces object graphs.&lt;br&gt;
Caching eliminates repeated work.&lt;br&gt;
Aggregation reduces network round trips.&lt;br&gt;
Batching reduces repetitive database interaction.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These techniques look unrelated when presented as isolated recommendations. Conceptually, however, they are variations of the same strategy: &lt;em&gt;Reduce unnecessary work and unnecessary movement.&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  When Parallelism is the Right Tool
&lt;/h2&gt;

&lt;p&gt;Parallel execution is not inherently a performance problem. In the right circumstances, it is one of the most effective ways to reduce elapsed time.&lt;/p&gt;

&lt;p&gt;The strongest candidates are workloads in which the operations are genuinely independent, contain enough useful work to amortize the cost of parallelization, and have sufficient computational or I/O capacity available to execute concurrently.&lt;/p&gt;

&lt;p&gt;For example, imagine an application that needs to process a large collection of independent documents, perform CPU-intensive transformations on each one, and combine the results afterward. There is little value in forcing one document to wait for another when the operations have no dependency between them.&lt;/p&gt;

&lt;p&gt;The same principle applies to independent I/O operations. If several remote requests can proceed concurrently, waiting for each one sequentially can unnecessarily extend the critical path.&lt;/p&gt;

&lt;p&gt;This is where constructs such as &lt;code&gt;Task.WhenAll&lt;/code&gt; can be valuable:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WhenAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;GetCustomerAsync&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="nf"&gt;GetPortfolioAsync&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="nf"&gt;GetMarketDataAsync&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The operations can make progress concurrently rather than forcing the second operation to wait for the first, and the third to wait for the second.&lt;/p&gt;

&lt;p&gt;But concurrency is not free.&lt;/p&gt;

&lt;p&gt;The fact that operations can execute concurrently does not mean that they should execute without limit. &lt;strong&gt;The useful question is not simply whether work can be parallelized, but whether the system has enough available resources, and enough useful work, to make parallel execution worthwhile.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That distinction becomes clearer in a small benchmark.&lt;/p&gt;


&lt;h2&gt;
  
  
  When Parallelism Makes Things Worse
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A system can sometimes do more work in parallel and become slower rather than faster.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Parallelism has a cost. Work must be partitioned, scheduled, synchronized, and eventually recombined. If the amount of useful work is not sufficient to offset those costs, introducing parallel execution can make the operation slower rather than faster.&lt;/p&gt;

&lt;p&gt;I built a deliberately simple BenchmarkDotNet experiment to make that tradeoff visible.&lt;/p&gt;

&lt;p&gt;Both implementations retrieve the same 5,000 projects asynchronously from SQL Server. They then perform the same CPU-bound operation on every project. The only difference is how that processing is performed: sequentially in one case, and through &lt;code&gt;Parallel.ForEach&lt;/code&gt; in the other.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Benchmark&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;SequentialProcessing&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;projects&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Projects&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsNoTracking&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;projects&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;SimulateWork&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Title&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Benchmark&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;ParallelProcessing&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;projects&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Projects&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsNoTracking&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToListAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Parallel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ForEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;projects&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Interlocked&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nf"&gt;SimulateWork&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Title&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The result was not what a simplistic notion of parallelism might suggest.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;| Method               |     Mean | Allocated |
| -------------------- | -------: | --------: |
| SequentialProcessing | 206.5 μs |  31.12 KB |
| ParallelProcessing   | 217.0 μs |  33.96 KB |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;On this workload, the parallel implementation was approximately 5% slower than the sequential implementation, while also allocating somewhat more memory.&lt;/p&gt;

&lt;p&gt;The important observation is not that &lt;code&gt;Parallel.ForEach&lt;/code&gt; is "slow." Nor is the lesson that sequential execution is preferable.&lt;/p&gt;

&lt;p&gt;The lesson is that parallelism has economics.&lt;/p&gt;

&lt;p&gt;There is a cost associated with introducing concurrency, and that cost has to be amortized by the work being parallelized. Partitioning work, scheduling execution, coordinating workers, and synchronizing shared state all introduce overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If that overhead is greater than the time saved through concurrent execution, parallelism has made the operation less efficient.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is why performance engineering resists rules such as &lt;em&gt;"parallel is faster."&lt;/em&gt; The answer depends on the workload, the cost of the individual operation, the available hardware, and the resources competing for that hardware.&lt;/p&gt;

&lt;p&gt;The same principle becomes even more important at the application level.&lt;/p&gt;

&lt;p&gt;Increasing concurrency can improve throughput when independent work can genuinely proceed simultaneously. But unbounded concurrency can also exhaust database connection pools, increase contention, overwhelm downstream services, or simply move the bottleneck somewhere else.&lt;br&gt;
More parallelism does not necessarily mean more throughput.&lt;br&gt;
Sometimes it simply means that the bottleneck is reached faster.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Optimization Hierarchy
&lt;/h2&gt;

&lt;p&gt;After working through these patterns, I find it useful to think about performance investigations as a progression rather than a checklist.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First: Where is the time going?&lt;/li&gt;
&lt;li&gt;Then: What work is being performed?&lt;/li&gt;
&lt;li&gt;Then: Which of that work is actually necessary?&lt;/li&gt;
&lt;li&gt;Then: Is the remaining work being performed efficiently?&lt;/li&gt;
&lt;li&gt;And finally: What happens when many requests perform this work concurrently?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sequence matters.&lt;/p&gt;

&lt;p&gt;It is tempting to begin with familiar optimizations: &lt;code&gt;AsNoTracking()&lt;/code&gt;, caching, an additional index, &lt;code&gt;Task.WhenAll()&lt;/code&gt;, response compression, a larger connection pool, more threads.&lt;/p&gt;

&lt;p&gt;Sometimes these are exactly the right interventions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But applying them before establishing the bottleneck turns optimization into speculation. And speculation is expensive.&lt;/strong&gt; It consumes engineering time, increases system complexity, and can produce changes that improve a benchmark while making the production system less predictable.&lt;/p&gt;

&lt;p&gt;Across the examples in this article, the specific mechanisms are different, but the underlying question is the same.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the first case, the application performed the same category of database work thousands of times.&lt;/li&gt;
&lt;li&gt;In the second, it moved and materialized substantially more data than necessary.&lt;/li&gt;
&lt;li&gt;In the third, it introduced parallel execution whose overhead could exceed its benefit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In each case, the important question was not simply "Can this operation be made faster?"&lt;/p&gt;

&lt;p&gt;It was &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What work is the system doing, and is that work justified by the result?"&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Performance Engineering is an Exercise in Causality
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The deeper lesson is that performance work is fundamentally an exercise in establishing causality.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We observe a symptom, formulate a hypothesis, collect evidence, identify the mechanism producing the symptom, change the mechanism. Then we measure again.&lt;/p&gt;

&lt;p&gt;That sounds obvious, but it is surprisingly easy to skip.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A slow endpoint invites a fix.&lt;br&gt;
A high CPU graph invites more CPU.&lt;br&gt;
A slow query invites an index.&lt;br&gt;
A large response invites compression.&lt;br&gt;
A concurrency problem invites more parallelism.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes the intuition is correct.&lt;/p&gt;

&lt;p&gt;But the engineering discipline lies in refusing to confuse correlation with cause.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A performance engineer should be able to look at a five-second request and resist the urge to immediately make something faster.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The more important question is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What, precisely, is responsible for those five seconds?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Until that question has a defensible answer, optimization has not really begun. It is only intervention.  And intervention without diagnosis is often just another form of guesswork.&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;The code examples in this article were adapted from an original .NET freelancer marketplace application I built from scratch and subsequently simplified to demonstrate the performance issues discussed herein. The original project is available on GitHub, and the original performance optimization code is available in the copilot-sanbox branch:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/tigerbluejay" rel="noopener noreferrer"&gt;
        tigerbluejay
      &lt;/a&gt; / &lt;a href="https://github.com/tigerbluejay/Angular-.Net-Integration-Freelancer-Marketplace-App" rel="noopener noreferrer"&gt;
        Angular-.Net-Integration-Freelancer-Marketplace-App
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      .NET 8 API with Angular 17/18 Client - An application for freelancers and their clients to work together
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;💼 Freelancer Marketplace&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;A full-stack freelancer marketplace web application built with ASP.NET 8 Web API and Angular 18. Users can register, login, and participate with three distinct roles: Administrator, Client, and Freelancer. Freelancers can create profiles, manage portfolios, browse and apply for projects, and chat with clients in real-time. Clients can post projects, manage proposals, and collaborate with freelancers. Admins can manage users and enforce platform rules.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Features&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;✅ User Registration &amp;amp; Login&lt;/h3&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Secure authentication using JWT tokens&lt;/li&gt;
&lt;li&gt;Role-based authorization (Admin / Client / Freelancer)&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;✅ Freelancer Features&lt;/h3&gt;

&lt;/div&gt;


&lt;ul&gt;

&lt;li&gt;Profile management with editable details&lt;/li&gt;

&lt;li&gt;Create, edit, delete portfolio items (title, description, photo) with pagination&lt;/li&gt;

&lt;li&gt;Browse projects and filter by required skills (5 distinct skills available)&lt;/li&gt;

&lt;li&gt;Submit proposals for projects&lt;/li&gt;

&lt;li&gt;View submitted proposals (filter by Approved / Rejected / Pending)&lt;/li&gt;

&lt;li&gt;Approved proposals automatically generate active projects and enable real-time chat with clients&lt;/li&gt;

&lt;li&gt;Messaging system with unread counters, last message preview, timestamps…&lt;/li&gt;

&lt;/ul&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/tigerbluejay/Angular-.Net-Integration-Freelancer-Marketplace-App" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
&lt;/blockquote&gt;

</description>
      <category>performance</category>
      <category>dotnet</category>
      <category>sql</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Building Portfolio Insights: Lessons from an Event‑Driven .NET Microservices Dashboard</title>
      <dc:creator>Jose Maria Iriarte</dc:creator>
      <pubDate>Tue, 16 Dec 2025 15:59:02 +0000</pubDate>
      <link>https://dev.to/josemariairiarte/building-portfolio-insights-lessons-from-an-event-driven-net-microservices-dashboard-4m53</link>
      <guid>https://dev.to/josemariairiarte/building-portfolio-insights-lessons-from-an-event-driven-net-microservices-dashboard-4m53</guid>
      <description>&lt;p&gt;Over the past weeks, I’ve been working on Portfolio Insights, a personal finance dashboard built on a microservices architecture using .NET 8, RabbitMQ, gRPC, and Docker. The project is a continuation of my exploration into distributed systems, following an earlier e‑commerce microservices application, but applied to a more analytics‑driven, number‑centric domain.&lt;/p&gt;

&lt;p&gt;The goal was not to build a production‑ready finance app, but to design and implement a cohesive, end‑to‑end system that demonstrates how independent services can collaborate through synchronous and asynchronous communication, while still supporting a clean and understandable client experience.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/tigerbluejay" rel="noopener noreferrer"&gt;
        tigerbluejay
      &lt;/a&gt; / &lt;a href="https://github.com/tigerbluejay/Microservices-Infrastructure-Personal-Finance-Dashboard" rel="noopener noreferrer"&gt;
        Microservices-Infrastructure-Personal-Finance-Dashboard
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      .NET 8 Application implementing Containerized Microservices Infrastructure and Architecture. The Solution consists of four Microservices (Market Data, Portfolio, Analytics and Notifications) a Message Broker, an API Gateway and a .NET Razor Pages Web Client
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;📊 Portfolio Insights – Personal Finance Dashboard&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;This project is a demonstration of a .NET 8 microservices-based personal finance and analytics platform. It builds on the architectural patterns and infrastructure explored in my earlier E-Commerce Microservices project, applying them to a number‑driven, analytics‑focused domain.&lt;/p&gt;
&lt;p&gt;The application allows users to manage investment portfolios, retrieve simulated market prices, compute analytics asynchronously, and receive notifications based on computed results. All services are containerized and orchestrated via Docker Compose, showcasing a realistic, end‑to‑end distributed system.&lt;/p&gt;
&lt;p&gt;Building this application helped solidify my understanding of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Event‑driven microservices&lt;/li&gt;
&lt;li&gt;gRPC and HTTP communication&lt;/li&gt;
&lt;li&gt;CQRS and layered architectures&lt;/li&gt;
&lt;li&gt;Message‑based analytics pipelines&lt;/li&gt;
&lt;li&gt;Vertical Slice and Clean Architectures&lt;/li&gt;
&lt;li&gt;Containerized orchestration with Docker&lt;/li&gt;
&lt;li&gt;Implementation of Cross-cutting concerns such as validations, logging, health checks and custom exception handling&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🧩 Solution Overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The solution consists of eight projects, all located at the same directory level:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Market Data Service – Simulated market prices and price…&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/tigerbluejay/Microservices-Infrastructure-Personal-Finance-Dashboard" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&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%2Fowrdvr7as6n8mtxqznyv.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%2Fowrdvr7as6n8mtxqznyv.jpg" alt="High Level Design #1"&gt;&lt;/a&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%2Fap1ki8e7slv7ov7343l0.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%2Fap1ki8e7slv7ov7343l0.jpg" alt="High Level Design #2"&gt;&lt;/a&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%2F5qdknsb88r9sa5bl5pgf.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%2F5qdknsb88r9sa5bl5pgf.jpg" alt="High Level Design #3"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem Space
&lt;/h2&gt;

&lt;p&gt;At a high level, Portfolio Insights allows a user to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manage an investment portfolio (assets and quantities)&lt;/li&gt;
&lt;li&gt;Retrieve simulated market prices&lt;/li&gt;
&lt;li&gt;Compute portfolio analytics asynchronously&lt;/li&gt;
&lt;li&gt;Receive notifications when analytics are refreshed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Under the hood, each of these responsibilities is handled by a separate microservice, each with its own datastore and lifecycle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Market Data Service&lt;/strong&gt; – simulates and publishes market prices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio Service&lt;/strong&gt; – owns user portfolios and assets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analytics Service&lt;/strong&gt; – computes metrics from portfolio and market events&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notification Service&lt;/strong&gt; – reacts to analytics results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A YARP API Gateway acts as a single entry point, and a Razor Pages web client consumes the system through HTTP calls routed via the gateway.&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%2Fxx0g1pni1z59sy25sfsc.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%2Fxx0g1pni1z59sy25sfsc.jpg" alt="Portfolio Insights Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture First, Code Second
&lt;/h2&gt;

&lt;p&gt;One of the most important lessons from this project was the value of diagramming the system in advance.&lt;/p&gt;

&lt;p&gt;With event‑driven architectures, complexity doesn’t come from individual services—it comes from how they interact. Before writing most of the code, I spent time mapping out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which service owns which data&lt;/li&gt;
&lt;li&gt;Which interactions are synchronous (gRPC)&lt;/li&gt;
&lt;li&gt;Which workflows are asynchronous (RabbitMQ events)&lt;/li&gt;
&lt;li&gt;How state changes propagate through the system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This upfront design work paid off, especially once I started building the client application. In an event‑driven system, not every user action results in immediate, synchronous data. The client often triggers a command, waits for asynchronous processing, and then queries a different service for the result.&lt;/p&gt;

&lt;p&gt;Understanding those flows early made it much easier to design consistent endpoints and avoid tight coupling between the UI and internal service logic.&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%2F4002n2yc1kov0y9z4ctl.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%2F4002n2yc1kov0y9z4ctl.jpg" alt="Portfolio Insights - Portfolio"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Communication Patterns in Practice
&lt;/h2&gt;

&lt;p&gt;Portfolio Insights deliberately mixes communication styles:&lt;/p&gt;

&lt;p&gt;gRPC is used where low‑latency, request/response interactions make sense—such as the Portfolio Service requesting current prices from the Market Data Service.&lt;/p&gt;

&lt;p&gt;RabbitMQ with MassTransit handles event‑driven workflows—portfolio updates, market price changes, and analytics computations.&lt;/p&gt;

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

&lt;p&gt;A user adds or updates assets in their portfolio.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Portfolio Service publishes a PortfolioUpdatedEvent.&lt;/li&gt;
&lt;li&gt;The Analytics Service consumes this event, joins it with the latest market prices, and computes metrics.&lt;/li&gt;
&lt;li&gt;The Analytics Service publishes an AnalyticsComputedEvent.&lt;/li&gt;
&lt;li&gt;The Notification Service reacts and stores user notifications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The client doesn’t talk to all these services directly. Instead, it triggers the initial command and later queries the Analytics or Notification endpoints when data is ready.&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%2Fpk1n2zs0melh8cbmw8ps.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%2Fpk1n2zs0melh8cbmw8ps.jpg" alt="Portfolio Insights - Analytics"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Ownership and Technology Choices
&lt;/h2&gt;

&lt;p&gt;Each service owns its own data and uses storage appropriate to its needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Portfolio Service uses PostgreSQL with Marten, treating the database as a document store.&lt;/li&gt;
&lt;li&gt;Analytics Service uses SQL Server with a layered architecture (API, Application, Domain, Infrastructure).&lt;/li&gt;
&lt;li&gt;Market Data and Notification Services use SQLite, Redis, and in‑memory stores where persistence requirements are lighter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach reinforced an important principle: consistency across services matters less than clarity of ownership and intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Client Perspective
&lt;/h2&gt;

&lt;p&gt;From the UI side, this project highlighted how deeply backend architecture influences frontend design.&lt;/p&gt;

&lt;p&gt;Because analytics are computed asynchronously, the client must:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trigger actions that start background workflows&lt;/li&gt;
&lt;li&gt;Display previously computed data&lt;/li&gt;
&lt;li&gt;Refresh views once downstream services have processed events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Designing the Razor Pages client forced me to think carefully about when data should be requested and which service is responsible for it. This is another area where early architectural diagrams were invaluable.&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%2F2z6elwers8svoozynx6l.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%2F2z6elwers8svoozynx6l.jpg" alt="Portfolio Insights - Notifications"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Took Away
&lt;/h2&gt;

&lt;p&gt;Beyond the specific technologies, this project reinforced a few broader lessons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event‑driven systems reward clear boundaries and explicit contracts&lt;/li&gt;
&lt;li&gt;Diagramming workflows early prevents costly redesigns later&lt;/li&gt;
&lt;li&gt;Client applications should reflect the realities of asynchronous systems&lt;/li&gt;
&lt;li&gt;Docker Compose is an excellent way to reason about distributed systems as a whole&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Portfolio Insights is ultimately a learning and portfolio project, but it represents a meaningful step forward in my understanding of modern .NET microservices, asynchronous communication, and system‑level design.&lt;/p&gt;

&lt;p&gt;If you’re exploring similar architectures, my biggest recommendation is simple: design the flows before the code. In event‑driven systems, that clarity makes all the difference.&lt;/p&gt;

&lt;p&gt;📺 Watch the application overview here:&lt;br&gt;


  &lt;iframe src="https://www.youtube.com/embed/FqLpblkKysA"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;h2&gt;
  
  
  Take the Next Step
&lt;/h2&gt;

&lt;p&gt;If this article gave you a clearer picture of how an event-driven microservices architecture comes together in a real-world .NET application, here are a few ways to continue exploring:&lt;/p&gt;

&lt;p&gt;📁 Explore the GitHub Repository – Review the full source code to see how the services, message flows, API Gateway, and Razor Pages client fit together. Following the code alongside the architecture diagrams is the best way to reinforce how synchronous and asynchronous communication work in practice.&lt;/p&gt;

&lt;p&gt;💡 Share the Architecture – If you know someone learning microservices, messaging, or distributed systems in .NET, share this project with them. It’s often easier to understand these concepts through a concrete, end-to-end example.&lt;/p&gt;

&lt;p&gt;🖥 Experiment and Extend – Clone the project and try evolving it. Add new events, introduce additional analytics, or adjust how the client reacts to asynchronous workflows. Small changes are a great way to deepen your understanding of event-driven design.&lt;/p&gt;

&lt;p&gt;👍 Star the Repository – If you find the project useful, consider starring the repository. It helps others discover the project and supports continued sharing of practical architecture examples.&lt;/p&gt;

&lt;p&gt;Working through projects like this builds intuition that goes beyond individual frameworks—helping you design systems that scale in complexity while remaining understandable.&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>eventdriven</category>
      <category>architecture</category>
      <category>github</category>
    </item>
    <item>
      <title>Integrating an Angular Client with a .NET Web API – A Freelancer Marketplace Application</title>
      <dc:creator>Jose Maria Iriarte</dc:creator>
      <pubDate>Wed, 17 Sep 2025 15:16:00 +0000</pubDate>
      <link>https://dev.to/josemariairiarte/integrating-an-angular-client-with-a-net-web-api-a-freelancer-marketplace-application-1akj</link>
      <guid>https://dev.to/josemariairiarte/integrating-an-angular-client-with-a-net-web-api-a-freelancer-marketplace-application-1akj</guid>
      <description>&lt;p&gt;Building full-stack applications is always an exciting challenge, especially when you want to create something original while sharpening your technical skills. Over the past weeks, I worked on a project that combines Angular 17/18 on the frontend with a .NET 8 Web API on the backend: a Freelancer Marketplace application.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/tigerbluejay" rel="noopener noreferrer"&gt;
        tigerbluejay
      &lt;/a&gt; / &lt;a href="https://github.com/tigerbluejay/Angular-.Net-Integration-Freelancer-Marketplace-App" rel="noopener noreferrer"&gt;
        Angular-.Net-Integration-Freelancer-Marketplace-App
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      .NET 8 API with Angular 17/18 Client - An application for freelancers and their clients to work together
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;💼 Freelancer Marketplace&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A full-stack freelancer marketplace web application built with ASP.NET 8 Web API and Angular 18. Users can register, login, and participate with three distinct roles: Administrator, Client, and Freelancer. Freelancers can create profiles, manage portfolios, browse and apply for projects, and chat with clients in real-time. Clients can post projects, manage proposals, and collaborate with freelancers. Admins can manage users and enforce platform rules.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Features&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;✅ User Registration &amp;amp; Login&lt;/h3&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Secure authentication using JWT tokens&lt;/li&gt;
&lt;li&gt;Role-based authorization (Admin / Client / Freelancer)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;✅ Freelancer Features&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Profile management with editable details&lt;/li&gt;
&lt;li&gt;Create, edit, delete portfolio items (title, description, photo) with pagination&lt;/li&gt;
&lt;li&gt;Browse projects and filter by required skills (5 distinct skills available)&lt;/li&gt;
&lt;li&gt;Submit proposals for projects&lt;/li&gt;
&lt;li&gt;View submitted proposals (filter by Approved / Rejected / Pending)&lt;/li&gt;
&lt;li&gt;Approved proposals automatically generate active projects and enable real-time chat with clients&lt;/li&gt;
&lt;li&gt;Messaging system with unread counters, last message preview, timestamps…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/tigerbluejay/Angular-.Net-Integration-Freelancer-Marketplace-App" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;This project was born as both a learning exercise and a way to showcase how to bring together two powerful frameworks. The app integrates authentication, role-based navigation, data persistence, pagination, SignalR for live chat and presence, and various UX touches like modals, guards, and notifications. It is a real-world scenario where clients and freelancers interact on a platform, with administrators keeping the ecosystem in check.&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%2Fws8at44or4cdvwb4jcx3.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%2Fws8at44or4cdvwb4jcx3.jpg" alt="Freelancer Dashboard - Browse Projects"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a Freelancer Marketplace?
&lt;/h2&gt;

&lt;p&gt;Rather than building a generic CRUD app, I wanted something closer to a real-world product. A freelancer marketplace is perfect because it naturally involves multiple roles, dynamic interactions, and workflows that push both the API and the Angular client beyond the basics.&lt;/p&gt;

&lt;p&gt;The application defines three distinct roles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Freelancer&lt;/strong&gt;: builds a profile, adds portfolio items, browses projects, submits proposals, and chats with clients when proposals are approved.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Client&lt;/strong&gt;: creates projects, manages incoming proposals, and collaborates with freelancers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Admin&lt;/strong&gt;: oversees the platform with a panel to enable/disable user accounts and monitor online presence in real-time.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each role has its own dedicated navigation bar and tailored user experience.&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%2F6yhmmidbvsuwlsgshevl.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%2F6yhmmidbvsuwlsgshevl.jpg" alt="Freelancer Dashboard - Submitted Proposals"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Angular Meets .NET
&lt;/h2&gt;

&lt;p&gt;The project began in Angular 17 and was later migrated to Angular 18, making it a good case study for keeping frontend dependencies modern and compatible. On the backend, .NET 8 Web API provides authentication (JWT), persistence with EF Core and SQLite, and real-time capabilities with SignalR.&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%2Fhvlwtge33sg7uqkm19ma.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%2Fhvlwtge33sg7uqkm19ma.jpg" alt="Client Dashboard - Profile and Projects"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Some highlights of the integration:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Authentication &amp;amp; Authorization&lt;/strong&gt;: JWT tokens handled in Angular via interceptors, with client-side guards preventing unauthorized or disabled users from accessing the app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CRUD + Pagination&lt;/strong&gt;: Portfolio items, projects, and proposals are paginated for smooth browsing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SignalR Integration&lt;/strong&gt;: Real-time chat between freelancers and clients, with unread message counters, presence indicators, and autoscrolling conversations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;User Experience&lt;/strong&gt;: Angular guards warn against unsaved changes, modals confirm critical actions, and toasters provide feedback.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fk89rk4dyw0im0pwldmpr.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%2Fk89rk4dyw0im0pwldmpr.jpg" alt="Freelancer and Client Chat Window"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;A few insights emerged while building the marketplace:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Folder structure matters&lt;/strong&gt;: I started with every Angular component in its own folder. While not perfectly organized, it still worked. The project reminded me that iteration and refactoring are natural parts of learning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Angular and .NET pair well&lt;/strong&gt;: The synergy between Angular’s reactive front-end design and .NET’s structured API made development smooth. Once authentication and SignalR were configured, everything else clicked together.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-world scenarios force depth&lt;/strong&gt;: Unlike toy projects, building a freelancer marketplace required thinking through workflows: proposals, approvals, active projects, and messaging. This depth made the integration feel authentic.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fr4vj7cilt2mi57wlif6m.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%2Fr4vj7cilt2mi57wlif6m.jpg" alt="Admin Panel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;If you’re learning full-stack development, there’s tremendous value in picking a project idea that excites you and has practical complexity. You’ll encounter the kind of challenges that surface in professional applications: handling state, ensuring security, designing APIs for multiple roles, and maintaining clarity in the codebase.&lt;/p&gt;

&lt;p&gt;This project is more than just a tutorial exercise—it’s a working demonstration of how Angular and .NET can power a modern, role-based platform where real-time collaboration is central.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;The Freelancer Marketplace app gave me the chance to practice integration between Angular 17/18 and .NET 8, explore SignalR real-time communication, and think carefully about user roles and workflows.&lt;/p&gt;

&lt;p&gt;For anyone building similar projects, I’d recommend starting small but choosing an application idea with enough moving parts to stay engaging. That’s how you grow not only as a developer, but also as a designer of systems that make sense to real people.&lt;/p&gt;

&lt;p&gt;📺 Watch the application overview here:&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/YpZb8Kpykqw"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Take the Next Step
&lt;/h2&gt;

&lt;p&gt;If this article helped you understand how Angular can consume a .NET API service in a real-world application, here's how you can continue your journey:&lt;/p&gt;

&lt;p&gt;📁 Explore the GitHub Repository – Dive into the repository to examine the Angular app and the API integration. Follow along with the code to reinforce your understanding of consuming and interacting with APIs in .NET.&lt;/p&gt;

&lt;p&gt;💡 Share the Knowledge – Know someone who’s learning to work with .NET APIs or Angular? Share this guide with them to help them accelerate their learning and improve their skills.&lt;/p&gt;

&lt;p&gt;🖥 Start Coding – The best way to grasp these concepts is by getting hands-on. Take the provided code and experiment with adding new features or integrating other APIs.&lt;/p&gt;

&lt;p&gt;👍 Like the Repository – If you find the project helpful, give it a thumbs-up! This will help others discover the repository and benefit from it too.&lt;/p&gt;

&lt;p&gt;By engaging with this tutorial and project, you'll build a strong foundation in .NET API, Angular Client integration, ready to implement these skills in real-world applications.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>angular</category>
      <category>api</category>
      <category>learning</category>
    </item>
    <item>
      <title>Mental Math Hacks: Swift Estimations of Powers and Roots for Programmers</title>
      <dc:creator>Jose Maria Iriarte</dc:creator>
      <pubDate>Sat, 24 May 2025 03:00:00 +0000</pubDate>
      <link>https://dev.to/josemariairiarte/mental-math-hacks-swift-estimations-of-powers-and-roots-for-programmers-321m</link>
      <guid>https://dev.to/josemariairiarte/mental-math-hacks-swift-estimations-of-powers-and-roots-for-programmers-321m</guid>
      <description>&lt;p&gt;In a world overflowing with digital tools, it’s easy to dismiss mental math as outdated — a quaint relic from the pre-calculator age. But there’s something uniquely powerful about sharpening your ability to think numerically without external support. Like optimizing code for runtime efficiency, refining your mental math streamlines your internal thought processes and reduces your cognitive load.&lt;/p&gt;

&lt;p&gt;This article is based on a short guide I wrote called &lt;strong&gt;&lt;em&gt;Estimating Powers and Roots Fast - Essential Tactics to Speed Up Mental Calculations with Whole Numbers&lt;/em&gt;&lt;/strong&gt;, the third in a three-part series I began in 2018. The project started as a personal challenge: to improve how I processed numbers mentally. I wanted to go beyond fuzzy estimations and reclaim the skill of clear, structured calculation — the kind that feels more like flow than friction.&lt;/p&gt;

&lt;p&gt;What began as scattered notes turned into three compact books, each focused on two core operations: addition &amp;amp; subtraction, multiplication &amp;amp; division, powers &amp;amp; roots. This article distills the key strategies from the third of those books.&lt;/p&gt;

&lt;p&gt;These are not “tricks” in the superficial sense — they’re practical, reusable mental algorithms. Some are intuitive, others might feel surprising at first, but all are meant to reduce latency between seeing a problem and arriving at a confident answer.&lt;/p&gt;

&lt;p&gt;Whether you’re optimizing memory usage or tallying totals in your head, these techniques will train you to think faster, reduce errors, and — yes — enjoy math a little more.&lt;/p&gt;

&lt;p&gt;Note that the original guide contains detailed explanations on these and other techniques, impossible to reproduce in an article of this nature or length. &lt;strong&gt;If you are serious about incorporating these techniques, I strongly recommend you read the full guide, linked at the end of this article.&lt;/strong&gt; It's completely free to download and read.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Key Strategies for Estimating Powers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🧱 Foundational Powers
&lt;/h3&gt;

&lt;p&gt;Know the small powers of 2–10 by heart. These are your “power landmarks” — quick-access reference points that anchor your estimation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: If you know `5^3 = 125` and `5^4 = 625`,
and you’re asked to estimate `5^3.5`, 
you know it must fall between 125 and 625 — closer to the former.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔄 Break Down and Multiply
&lt;/h3&gt;

&lt;p&gt;Decompose a base into smaller components whose powers you know, then recombine using multiplication rules.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: Estimate `6^4` by computing `(2 × 3)^4 = 2^4 × 3^4 =
16 × 81 = 1296`.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔍 Beyond Simple Break Down and Multiply
&lt;/h3&gt;

&lt;p&gt;Use substitutions or approximations when clean decomposition isn’t possible — apply the nearest base you &lt;em&gt;can&lt;/em&gt; work with.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: Estimate 14^6.
Instead of calculating this directly, 
rewrite as (14^2)^3 = 196^3.
Then approximate 196^3 ≈ (200)^3 = 8,000,000.
Since 196 &amp;lt; 200, you know the true result is slightly less 
— maybe around 7.5 million.
This gets you in the right ballpark quickly without full multiplication.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🚀 Elevating Multiples of 10
&lt;/h3&gt;

&lt;p&gt;When a number is a clean multiple of 10, strip the zeroes, calculate the power, then adjust for scale.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: `30^2 = (3 × 10)^2 = 3^2 × 10^2 = 9 × 100 = 900`.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🧱 Larger Bases
&lt;/h3&gt;

&lt;p&gt;Use known approximations or reduce the exponent by converting to smaller base expressions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: `20^4 = (2 × 10)^4 = 2^4 × 10^4 =
16 × 10,000 = 160,000`.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚙️ Key Strategies for Estimating Roots
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🟩 Perfect Square Roots
&lt;/h3&gt;

&lt;p&gt;Work backwards from known squares and interpolate if necessary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: Estimate `√1600`. 
You know `40^2 = 1600`, 
so the answer is exactly 40.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🧮 Perfect Square Roots (5+ Digits)
&lt;/h3&gt;

&lt;p&gt;Look at the number of digits and use digit-pattern clues &lt;br&gt;
from common squares to narrow down candidates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: Estimate `√62500`. 
You know `250^2 = 62500`, 
and that squares ending in “500” often come from roots ending in 50.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🧊 Extending to Perfect Cubes (≤ 6 digits)
&lt;/h3&gt;

&lt;p&gt;Use the number of digits to guess the number of digits in the root, then apply unit-digit patterns to narrow it down.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: Estimate ∛614125.
Split the number: 614 and 125.
Note that:
80³ = 512,000
90³ = 729,000
Since 614,125 falls between 80³ and 90³, the cube root is in the 80s.
The number ends in 5, and cube roots ending in 5 produce cubes ending in 5.
So the cube root is 85.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📦 Cube Roots of 7–9 Digit Numbers
&lt;/h3&gt;

&lt;p&gt;Group the digits, then use both first and last digits to estimate. You may also need digital sums to break ties.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: Estimate ∛478,211,768.
First digits: between 700³ = 343M and 800³ = 512M 
→ So it's in the 700s.
Last digit is 8, which corresponds to a root ending in 2 (since 2³ = 8).
Digital sum of the number is 44 → 4+4 = 8 
→ root's digital sum should be 2, 5 or 8.
Try 722, 752, 782 → Best estimate: 782.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🧮 4th and 5th Roots
&lt;/h3&gt;

&lt;p&gt;Estimate the root by matching number of digits in the base using scientific notation — then refine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: Estimate ∜1×10¹².
You’re looking for the 4th root of a trillion.
100⁴ = 10⁸, 1000⁴ = 10¹² → so ∜(1×10¹²) = 1000.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🧰 Practice &amp;amp; Progress
&lt;/h3&gt;

&lt;p&gt;Like any skill, speed and confidence come with practice. Try:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Estimating shopping discounts, volumes and distances involving roots and powers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Calculating loans, and compound interests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keeping track of wellness stats for your weigh training for example&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn’t to become a human calculator, but to develop a mental agility that helps in work, school, and everyday thinking.&lt;/p&gt;




&lt;h2&gt;
  
  
  📘 Download the Full Guide
&lt;/h2&gt;

&lt;p&gt;This article is a condensed version of my guide:&lt;/p&gt;

&lt;p&gt;👉 Download the PDF: Estimating Powers and Roots Fast&lt;br&gt;
&lt;a href="https://tigerbluejay.github.io/math/Estimating-Powers-and-Roots-Fast.pdf" rel="noopener noreferrer"&gt;Estimating Powers and Roots Fast (PDF)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This guide contains much more detailed information about how to profit from the various tactics including various reference powers and roots tables and expanded explanations. If you are serious about these techniques I strongly recommend you read the guide.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Help Others and Keep the Conversation Going!
&lt;/h2&gt;

&lt;p&gt;If you found this article helpful, here’s how you can contribute to spreading the knowledge:&lt;/p&gt;

&lt;p&gt;👍 Like this article to show your support and help others discover it.&lt;/p&gt;

&lt;p&gt;📁 Bookmark it so you can easily come back to these techniques anytime you need them.&lt;/p&gt;

&lt;p&gt;🔄 Share it with friends or colleagues who might benefit from faster mental math strategies.&lt;/p&gt;

&lt;p&gt;💬 Comment below with your favorite tip, a trick you’ve used, or any questions you might have — let’s keep learning together!&lt;/p&gt;

&lt;p&gt;By liking, sharing, or commenting, you're not just helping me reach more readers — you're contributing to a community that thrives on growth and knowledge. Sharing this article helps others enhance their mental math skills, reducing cognitive load and boosting productivity. Your engagement could make someone’s day easier or help them see math in a new, empowering way!&lt;/p&gt;

&lt;p&gt;Thank you for being part of this learning journey! 🙌&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>learning</category>
      <category>math</category>
    </item>
    <item>
      <title>Optimizing Mental Math: Fast Multiplications and Divisions for Software Engineers</title>
      <dc:creator>Jose Maria Iriarte</dc:creator>
      <pubDate>Sat, 17 May 2025 03:00:00 +0000</pubDate>
      <link>https://dev.to/josemariairiarte/optimizing-mental-math-fast-multiplications-and-divisions-for-software-egineers-43a0</link>
      <guid>https://dev.to/josemariairiarte/optimizing-mental-math-fast-multiplications-and-divisions-for-software-egineers-43a0</guid>
      <description>&lt;p&gt;In a world overflowing with digital tools, it’s easy to dismiss mental math as outdated — a quaint relic from the pre-calculator age. But there’s something uniquely powerful about sharpening your ability to think numerically without external support. Like optimizing code for runtime efficiency, refining your mental math streamlines your internal thought processes and reduces your cognitive load.&lt;/p&gt;

&lt;p&gt;This article is based on a short guide I wrote called &lt;strong&gt;&lt;em&gt;Multiplying and Dividing Fast - Essential Tactics to Speed Up Mental Calculations with Whole Numbers&lt;/em&gt;&lt;/strong&gt;, the second in a three-part series I began in 2018. The project started as a personal challenge: to improve how I processed numbers mentally. I wanted to go beyond fuzzy estimations and reclaim the skill of clear, structured calculation — the kind that feels more like flow than friction.&lt;/p&gt;

&lt;p&gt;What began as scattered notes turned into three compact books, each focused on two core operations: addition &amp;amp; subtraction, multiplication &amp;amp; division, powers &amp;amp; roots. This article distills the key strategies from the second of those books.&lt;/p&gt;

&lt;p&gt;These are not “tricks” in the superficial sense — they’re practical, reusable mental algorithms. Some are intuitive, others might feel surprising at first, but all are meant to reduce latency between seeing a problem and arriving at a confident answer.&lt;/p&gt;

&lt;p&gt;Whether you’re optimizing memory usage or tallying totals in your head, these techniques will train you to think faster, reduce errors, and — yes — enjoy math a little more.&lt;/p&gt;

&lt;p&gt;Note that the original guide contains detailed explanations on these and other techniques, impossible to reproduce in an article of this nature or length. &lt;strong&gt;If you are serious about incorporating these techniques, I strongly recommend you read the full guide, linked at the end of this article.&lt;/strong&gt; It's completely free to download and read.&lt;/p&gt;




&lt;h1&gt;
  
  
  📃 Core Multiplication Tactics
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔄 Doubling
&lt;/h2&gt;

&lt;p&gt;Use for multiplying by 2, 4, 8, etc. (powers of two).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
354 × 2 = 708
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔄 Doubling Twice or Thrice
&lt;/h2&gt;

&lt;p&gt;Used for ×4, ×8, ×16, etc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
42 × 16 = 672
84, 168, 336, 672
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔄 Multiples of 10
&lt;/h2&gt;

&lt;p&gt;Multiply as if zeroes weren’t there, then append them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
40 × 45,000 = 1,800,000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  💵 Multiplying by 5 (Halving)
&lt;/h2&gt;

&lt;p&gt;Multiply by 10, then divide by 2.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
5 × 74 = 370
740 / 2 = 370
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔢 Squares Ending in 5
&lt;/h2&gt;

&lt;p&gt;Multiply tens digit by (n+1) and append 25.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
95 × 95 = 9025
9 x 10 = 90
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔑 Multiplying by 11 (2-digit)
&lt;/h2&gt;

&lt;p&gt;Add digits and sandwich between.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
11 × 72 = 792
7 + 2 = 9
7 9 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔑 Multiplying by 11 (3+ digits)
&lt;/h2&gt;

&lt;p&gt;Pairwise addition from right to left, carry included.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
11 × 3,480 = 38,280

8 + 0 = 8
4 + 8 = 12
3 + 4 = 7

30000
07000
01200
00080
00000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📃 Multiplying by 15
&lt;/h2&gt;

&lt;p&gt;Decompose into (10 + 5) then apply halving.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
15 × 382 = 5,730

10 x 382 = 3820
3820 / 2 = 1910
3820 + 1910
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📈 Two-Digit Products (Lattice-like)
&lt;/h2&gt;

&lt;p&gt;Apply place-value cross multiplication.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
34 × 65 = 2,210

3 x 6 = 18
4 x 5 = 20
3 x 5 + 4 x 6 = 39

1800
0390
0020
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📈 Three-Digit Multiplication
&lt;/h2&gt;

&lt;p&gt;Break into hierarchical place-value multiplications.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
123 × 432 = 53,136

4 x 1
1 x 3 + 4 x 2 
2 x 1 + 2 x 3 + 3 x 4
3 x 3 + 2 x 2
3 x 2

40000
11000
02000
00130
00006
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📈 Two-Digit by Three-Digit
&lt;/h2&gt;

&lt;p&gt;Use the same principle, append 0s where needed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
44 × 452 = 19,888
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  💸 Balancing for Multiplication
&lt;/h2&gt;

&lt;p&gt;Shift factors to easier equivalents.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
144 × 24 = (288 × 12) = 3,456

(144 x 2) / (24 / 2) =
288 x 12 =
288 x 10 + 288 x 2 =
2880 + 576
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🌐 Rounding and Compensation
&lt;/h2&gt;

&lt;p&gt;Round one number to an easier figure, then subtract excess.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
16 × 191 = (16 × 200) - (16 × 9) = 3,056
3,200 - 144 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔹 Associative Property
&lt;/h2&gt;

&lt;p&gt;Break one factor into primes or easier groups.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
22 × 267 = 11 × 534 = 5,874

11 x 2 x 267
267 doubled, 534
534 x 11

3 + 4 = 7
5 + 3 = 8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📃 Distributive Property
&lt;/h2&gt;

&lt;p&gt;Use expanded form: a(b + c)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
51 × 295 = (50 × 295) + 295 = 15,045
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📃 Products Near Powers of 10 (One Away)
&lt;/h2&gt;

&lt;p&gt;Use complements to subtract from powers of 10.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
387 × 999 = 386,613
387000 - 387
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📃 Products Near Powers of 10 (Both Close)
&lt;/h2&gt;

&lt;p&gt;Use cross-adjustment and product of differences.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
997 x 998 = 995,006

997 - 1,000 = -3, 998 - 1000 = -2

997 + (-2) = 995
-3 x (-2) = 6

995000
000006
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  📃 Core Division Tactics
&lt;/h1&gt;

&lt;h2&gt;
  
  
  📃 Division as Inverse Multiplication
&lt;/h2&gt;

&lt;p&gt;Think "what times X gives me Y?"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
72 ÷ 6 = 12

6 x 12 = 72
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧰 Advanced Halving
&lt;/h2&gt;

&lt;p&gt;Successive halving for dividing by 4, 8, 16, etc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
3,760 ÷ 16 = 235

1880, 940, 470, 235
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📉 Divisibility Rules (3, 5, 9, 10, etc.)
&lt;/h2&gt;

&lt;p&gt;Use digital sums or ending digits.&lt;br&gt;
Detailed explanations of this family of subtechniques can be found in the ebook linked below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example:

495

Digital sum = 4 + 9 + 5= 18
Digital sum = 1 + 8 = 9

Divisible by both 3 and 9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📃 Rounding &amp;amp; Compensation (Division)
&lt;/h2&gt;

&lt;p&gt;Round dividend/divisor then adjust the result.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
684 ÷ 3 = (690 - 6) ÷ 3 = 228
230 - 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📈 Balancing in Division
&lt;/h2&gt;

&lt;p&gt;Shift dividend/divisor by a common factor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
77 ÷ 11 = (770 ÷ 110) = 7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔹 Associative in Division
&lt;/h2&gt;

&lt;p&gt;Break divisor into friendly parts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
264 ÷ 12 = (264 ÷ 3) ÷ 4 = 22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📃 Distributive in Division
&lt;/h2&gt;

&lt;p&gt;Break up dividend to divide in parts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example: 
(840 + 60) ÷ 30 = 28 + 2 = 30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🧰 Practice &amp;amp; Progress
&lt;/h3&gt;

&lt;p&gt;Like any skill, speed and confidence come with practice. Try:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Estimating bills or invoices in your head&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Practicing products while walking&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Playing games that push number recognition and recall&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn’t to become a human calculator, but to develop a mental agility that helps in work, school, and everyday thinking.&lt;/p&gt;




&lt;h2&gt;
  
  
  📘 Download the Full Guide
&lt;/h2&gt;

&lt;p&gt;This article is a condensed version of my guide:&lt;/p&gt;

&lt;p&gt;👉 Download the PDF: Multiplying and Dividing Fast&lt;br&gt;
&lt;a href="https://tigerbluejay.github.io/math/Multiplying-and-Dividing-Fast.pdf" rel="noopener noreferrer"&gt;Multiplying and Dividing Fast (PDF)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This guide contains much more detailed information about how to profit from the various tactics including various reference multiplication and division tables and expanded explanations, in particular, for the sections regarding divisibility rules. If you are serious about these techniques I strongly recommend you read the guide.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Help Others and Keep the Conversation Going!
&lt;/h2&gt;

&lt;p&gt;If you found this article helpful, here’s how you can contribute to spreading the knowledge:&lt;/p&gt;

&lt;p&gt;👍 Like this article to show your support and help others discover it.&lt;/p&gt;

&lt;p&gt;📁 Bookmark it so you can easily come back to these techniques anytime you need them.&lt;/p&gt;

&lt;p&gt;🔄 Share it with friends or colleagues who might benefit from faster mental math strategies.&lt;/p&gt;

&lt;p&gt;💬 Comment below with your favorite tip, a trick you’ve used, or any questions you might have — let’s keep learning together!&lt;/p&gt;

&lt;p&gt;By liking, sharing, or commenting, you're not just helping me reach more readers — you're contributing to a community that thrives on growth and knowledge. Sharing this article helps others enhance their mental math skills, reducing cognitive load and boosting productivity. Your engagement could make someone’s day easier or help them see math in a new, empowering way!&lt;/p&gt;

&lt;p&gt;Thank you for being part of this learning journey! 🙌&lt;/p&gt;

</description>
      <category>math</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
    <item>
      <title>Low-Latency Mental Math: Quick Additions and Subtractions for Software Developers</title>
      <dc:creator>Jose Maria Iriarte</dc:creator>
      <pubDate>Sat, 10 May 2025 03:00:00 +0000</pubDate>
      <link>https://dev.to/josemariairiarte/low-latency-math-quick-additions-and-subtractions-for-software-developers-5eg4</link>
      <guid>https://dev.to/josemariairiarte/low-latency-math-quick-additions-and-subtractions-for-software-developers-5eg4</guid>
      <description>&lt;p&gt;In a world overflowing with digital tools, it’s easy to dismiss mental math as outdated — a quaint relic from the pre-calculator age. But there’s something uniquely powerful about sharpening your ability to think numerically without external support. Like optimizing code for runtime efficiency, refining your mental math streamlines your internal thought processes and reduces your cognitive load.&lt;/p&gt;

&lt;p&gt;This article is based on a short guide I wrote called &lt;strong&gt;&lt;em&gt;Adding and Subtracting Fast - Essential Tactics to Speed Up Mental Calculations with Whole Numbers&lt;/em&gt;&lt;/strong&gt;, the first in a three-part series I began in 2018. The project started as a personal challenge: to improve how I processed numbers mentally. I wanted to go beyond fuzzy estimations and reclaim the skill of clear, structured calculation — the kind that feels more like flow than friction.&lt;/p&gt;

&lt;p&gt;What began as scattered notes turned into three compact books, each focused on two core operations: addition &amp;amp; subtraction, multiplication &amp;amp; division, powers &amp;amp; roots. This article distills the key strategies from the first of those books.&lt;/p&gt;

&lt;p&gt;These are not “tricks” in the superficial sense — they’re practical, reusable mental algorithms. Some are intuitive, others might feel surprising at first, but all are meant to reduce latency between seeing a problem and arriving at a confident answer.&lt;/p&gt;

&lt;p&gt;Whether you’re optimizing memory usage or tallying totals in your head, these techniques will train you to think faster, reduce errors, and — yes — enjoy math a little more.&lt;/p&gt;

&lt;p&gt;Note that the original guide contains detailed explanations on these and other techniques, impossible to reproduce in an article of this nature or length. &lt;strong&gt;If you are serious about incorporating these techniques, I strongly recommend you read the full guide, linked at the end of this article.&lt;/strong&gt; It's completely free to download and read.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 Foundational Concepts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔢 Number Complements
&lt;/h3&gt;

&lt;p&gt;Master pairs that sum to 10, 20, and 100. These are essential for fast subtraction and pattern recognition.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Examples:
3 + 7 = 10  
6 + 14 = 20  
87 + 13 = 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✌️ Table of 2 and Its Uses
&lt;/h3&gt;

&lt;p&gt;Doubling is powerful for grouping and estimating.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example:
4 + 2 = 3 × 2  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ➕ Rule of Adding to 9
&lt;/h3&gt;

&lt;p&gt;Add 10 instead, then subtract 1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example:
9 + 7 = 10 + 7 = 17 → 17 - 1 = 16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ➕ Rule of Adding to 8
&lt;/h3&gt;

&lt;p&gt;Same logic, subtract 2 instead of 1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example:
8 + 5 = 10 + 5 = 15 → 15 - 2 = 13
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🧮 Core Addition Techniques
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🧩 Decomposing
&lt;/h2&gt;

&lt;p&gt;Break numbers apart to make things easier.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example:
5 + 7 = 5 + (5 + 2) = 10 + 2 = 12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  👀 Scanning
&lt;/h2&gt;

&lt;p&gt;Before adding, scan the numbers for potential carrying.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example:
123 + 231 + 245  
Check units, then tens, then hundreds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📐 Aligning
&lt;/h2&gt;

&lt;p&gt;Align digits by place value in your head.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example:
684 + 941 + 198  
Add hundreds: 600 + 900 + 100 = 1600  
Add tens: 80 + 40 + 90 = 210  
Add ones: 4 + 1 + 8 = 13  
Total = 1600 + 210 + 13 = 1823
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧮 Rounding and Compensation
&lt;/h2&gt;

&lt;p&gt;Round one term to a nearby 10 or 100, then adjust.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example:
39 + 48 = 40 + 48 = 88 → 88 - 1 = 87
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⚖️ Balancing
&lt;/h2&gt;

&lt;p&gt;Round two numbers in opposite directions to cancel out adjustments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example:
97 + 59 + 31  
Round 59 → 60 (+1)  
Round 31 → 30 (−1)  
Net effect: 97 + 60 + 30 = 187
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  👯 Grouping (Sequential)
&lt;/h2&gt;

&lt;p&gt;Combine easy-to-add groups to reduce mental load.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example:
13 + 17 + 58 + 12  
→ 10 + 20 + 60 + 10 = 100  
→ Remaining: 3 + 7 + 8 + 2 = 20  
Total = 100 + 20 = 120
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  ➖ Core Subtraction Techniques
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔄 Reverse and Negate
&lt;/h2&gt;

&lt;p&gt;Flip subtraction when the subtrahend is larger.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example:
2 - 8 = -(8 - 2) = -6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎯 Subtracting from Multiples of 10
&lt;/h2&gt;

&lt;p&gt;Use complements to subtract from 10, 100, or 1000.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example:
100 - 47 = 53  
Think: (10 - 4 - 1 in tens) + (10 - 7 in ones)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔁 Addition Techniques for Subtraction
&lt;/h2&gt;

&lt;p&gt;Many addition tricks (decomposing, rounding) work in reverse.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example:
84 - 47 = (84 - 44) - 3 = 40 - 3 = 37
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧲 Matching
&lt;/h2&gt;

&lt;p&gt;Add the same number to both terms to simplify.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example:
37 - 22 → add 3 to both → 40 - 25 = 15
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔀 Mixed Operations
&lt;/h2&gt;

&lt;p&gt;When you mix additions and subtractions, group all negatives and positives separately, then combine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example:
83 - 45 - 15 - 38  
= 83 - (45 + 15 + 38)  
= 83 - 98 = -(98 - 83) = -15
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🎯 Practice &amp;amp; Progress
&lt;/h3&gt;

&lt;p&gt;Like any skill, speed and confidence come with practice. Try:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Estimating grocery bills in your head&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Practicing sums and differences while walking&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Making a game out of spotting friendly numbers in daily life&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn’t to become a human calculator, but to develop a mental agility that helps in work, school, and everyday thinking.&lt;/p&gt;




&lt;h2&gt;
  
  
  📘 Download the Full Guide
&lt;/h2&gt;

&lt;p&gt;This article is a condensed version of my short guide:&lt;/p&gt;

&lt;p&gt;👉 Download the PDF: Adding and Subtracting Fast&lt;br&gt;
&lt;a href="https://tigerbluejay.github.io/math/Adding-and-Subtracting-Fast.pdf" rel="noopener noreferrer"&gt;Adding and Subtracting Fast (PDF)&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Help Others and Keep the Conversation Going!
&lt;/h2&gt;

&lt;p&gt;If you found this article helpful, here’s how you can contribute to spreading the knowledge:&lt;/p&gt;

&lt;p&gt;👍 Like this article to show your support and help others discover it.&lt;/p&gt;

&lt;p&gt;📑 Bookmark it so you can easily come back to these techniques anytime you need them.&lt;/p&gt;

&lt;p&gt;🔄 Share it with friends or colleagues who might benefit from faster mental math strategies.&lt;/p&gt;

&lt;p&gt;💬 Comment below with your favorite tip, a trick you’ve used, or any questions you might have — let’s keep learning together!&lt;/p&gt;

&lt;p&gt;By liking, sharing, or commenting, you're not just helping me reach more readers — you're contributing to a community that thrives on growth and knowledge. Sharing this article helps others enhance their mental math skills, reducing cognitive load and boosting productivity. Your engagement could make someone’s day easier or help them see math in a new, empowering way!&lt;/p&gt;

&lt;p&gt;Thank you for being part of this learning journey! 🙌&lt;/p&gt;

</description>
      <category>learning</category>
      <category>math</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Lessons from Building a One-Man Startup</title>
      <dc:creator>Jose Maria Iriarte</dc:creator>
      <pubDate>Sat, 03 May 2025 09:26:15 +0000</pubDate>
      <link>https://dev.to/josemariairiarte/lessons-from-building-a-one-man-startup-the-evolution-of-octal-stream-id2</link>
      <guid>https://dev.to/josemariairiarte/lessons-from-building-a-one-man-startup-the-evolution-of-octal-stream-id2</guid>
      <description>&lt;p&gt;Over the course of several years, I embarked on an ambitious solo journey to create a digital education business. What began as a simple idea evolved through multiple iterations—each one teaching me something about technology, process, and the nature of entrepreneurship itself. This is the story of that journey—from Katacoding to Sigmacasts to Octal Stream—and the insights I gained along the way.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Evolution: From Video Calls to Scalable Content
&lt;/h2&gt;

&lt;p&gt;The concept began with Katacoding, a platform offering live, one-on-one online coding lessons via video calls. While the model had promise, it lacked scalability. That realization led to Sigmacasts, a curated series of educational videos on math and computer science. The production process taught me how to craft educational narratives and use video to communicate abstract ideas.&lt;/p&gt;

&lt;p&gt;Eventually, these two concepts merged into Octal Stream—a platform offering on-demand, instructor-led video lessons focused on foundational web development. Octal Stream aimed to deliver the human quality of live lessons with the reach and polish of asynchronous video.&lt;/p&gt;




&lt;h2&gt;
  
  
  Technologies I Leveraged (and Learned)
&lt;/h2&gt;

&lt;p&gt;The project became an opportunity to develop and integrate a wide range of technologies and tools. Among them:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Cloud Services:&lt;/strong&gt; Lightsail virtual machines, S3 object storage, Route 53 for DNS, and Simple Email Service for transactional and marketing communication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WordPress:&lt;/strong&gt; Using the Avada theme along with essential plugins like Memberpress for subscriptions, Stripe Payments, Yoast SEO, and Wordfence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;External services:&lt;/strong&gt; Vectera for video hosting, iPage for WordPress hosting, and stock image libraries for visual content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creative tools:&lt;/strong&gt; KdenLive for video editing, GIMP for image creation and manipulation, and Office/LibreOffice for scriptwriting, presentations, and animations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code and browser-based work:&lt;/strong&gt; Sublime Text for scripting and site customizations, regular browser-based demonstrations for teaching content.&lt;/p&gt;

&lt;p&gt;Each technology had a learning curve, but it also brought a deeper understanding of full-stack development, infrastructure management, and the production workflow behind digital products.&lt;/p&gt;




&lt;h2&gt;
  
  
  Protocols and Systems I Built
&lt;/h2&gt;

&lt;p&gt;To stay productive and consistent, I developed internal protocols and workflows for nearly every aspect of the business:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audio and video recording standards:&lt;/strong&gt; Detailed specs and consistent steps to ensure production quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content pipeline:&lt;/strong&gt; A structured system for writing, recording, editing, and publishing video lessons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment and migration guides:&lt;/strong&gt; Documentation to help with website migrations and service updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Marketing systems:&lt;/strong&gt; Templates and notes for SEO, ad copywriting, social media strategy, and campaign tracking.&lt;/p&gt;

&lt;p&gt;These internal systems gave structure to a complex creative and technical process. They also laid the groundwork for future delegation, should I ever grow the team.&lt;/p&gt;




&lt;h2&gt;
  
  
  Business Infrastructure and Exploration
&lt;/h2&gt;

&lt;p&gt;Beyond technology, I explored what it meant to create a business infrastructure designed to support international growth. This included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Incorporating a Delaware LLC with IncNow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Filing for an EIN (Employer Identification Number) with the IRS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Opening a Mercury Bank account for international payments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Securing a U.S.-based virtual business address and registering it with the U.S. Embassy in Buenos Aires&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Investigating options like Stripe Atlas for potential U.S. incorporation, bank account and market reach&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These steps broadened my understanding of global business logistics and helped me think about scalability from both a financial and legal standpoint.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned About Organizations
&lt;/h2&gt;

&lt;p&gt;Working solo gave me an intimate look at what it means to be the organization. I wore every hat—developer, designer, instructor, marketer, sysadmin, and CEO. That experience was humbling and illuminating.&lt;/p&gt;

&lt;h3&gt;
  
  
  Some key realizations:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Organizations are ecosystems.&lt;/strong&gt; Each function—product, marketing, operations, finance—demands time and energy. Trying to scale all of them equally at once is a recipe for burnout.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Focus is survival.&lt;/strong&gt; Passion projects are energizing, but if they don’t support revenue, they should be postponed until the essentials are working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Efficiency matters.&lt;/strong&gt; Free and open-source tools can dramatically reduce startup costs, though finding and configuring them is becoming more complex.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Competing for attention is expensive.&lt;/strong&gt; I learned to be cautious with paid ads and SEM—especially when going up against established corporations with large budgets.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons I’ll Take Into Future Ventures
&lt;/h2&gt;

&lt;p&gt;Looking back, I see this experience not as a failed startup, but as a highly concentrated entrepreneurial education. Here’s what I’ll carry forward:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validate early.&lt;/strong&gt; I built a product before building an audience. Future efforts will prioritize community and conversation early on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don’t over-invest in polish before traction.&lt;/strong&gt; From branding to video production, perfection can wait until the core model is validated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Embrace “good enough” tools.&lt;/strong&gt; I spent time building infrastructure that others had already optimized. Next time, I’ll stand on the shoulders of giants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specialize, then expand.&lt;/strong&gt; Wearing many hats taught me versatility—but deep progress came when I narrowed my focus.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Align effort with value.&lt;/strong&gt; I now ask: “Is this task critical to delivering value to users or generating revenue?” If not, it gets deferred.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;This journey taught me more than any book or course could have. I now have a blueprint for launching future products more strategically, with clarity on what matters most in early-stage entrepreneurship.&lt;/p&gt;

&lt;p&gt;Building Octal Stream may not have made me a millionaire, but it did make me a better technologist, thinker, and builder. And next time, I’ll start not from zero—but from here... and hopefully, you will have drawn some valuable lessons too from my experience if you decide to embark on a similary journey!&lt;/p&gt;

</description>
      <category>startup</category>
      <category>testimonial</category>
      <category>webdev</category>
      <category>learning</category>
    </item>
    <item>
      <title>Foundations of Data Structures and Algorithms in C#</title>
      <dc:creator>Jose Maria Iriarte</dc:creator>
      <pubDate>Sat, 12 Apr 2025 18:30:09 +0000</pubDate>
      <link>https://dev.to/josemariairiarte/foundations-of-data-structures-and-algorithms-in-c-315b</link>
      <guid>https://dev.to/josemariairiarte/foundations-of-data-structures-and-algorithms-in-c-315b</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/tigerbluejay/CSharp-DataStructures-Algorithms-Fundamentals" rel="noopener noreferrer"&gt;&lt;strong&gt;CSharp-DataStructures-Algorithms-Fundamentals&lt;/strong&gt;&lt;/a&gt; is a focused, foundational repository written in C# that helps developers understand and implement the most essential data structures and algorithms through simple, self-contained examples.&lt;/p&gt;

&lt;p&gt;It was developed as a response to the scarcity of educational DSA content in C#, particularly when compared to the abundance of materials available in JavaScript, Python, or Java. This project mirrors the pedagogical structure of popular repositories in those languages, with a particular focus on &lt;strong&gt;readability and conceptual clarity&lt;/strong&gt; rather than optimality or cleverness.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Inside
&lt;/h2&gt;

&lt;p&gt;This repository covers a range of fundamental topics in data structures and algorithms, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Arrays&lt;/strong&gt;: Basic operations and manipulation techniques.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linked Lists&lt;/strong&gt;: Implementation and traversal methods.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stacks and Queues&lt;/strong&gt;: Understanding LIFO and FIFO structures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trees&lt;/strong&gt;: Binary trees, traversal algorithms, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graphs&lt;/strong&gt;: Representation and traversal techniques.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recursion&lt;/strong&gt;: Solving problems through recursive approaches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sorting Algorithms&lt;/strong&gt;: Implementations of Bubble Sort, Insertion Sort, Merge Sort, Quick Sort, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Searching Algorithms&lt;/strong&gt;: Linear and Binary Search methods.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hash Tables&lt;/strong&gt;: Understanding hashing and collision resolution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frequency Counters&lt;/strong&gt;: Techniques for counting occurrences efficiently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sliding Window&lt;/strong&gt;: Optimizing problems involving subsets of data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Divide and Conquer&lt;/strong&gt;: Breaking problems into subproblems for efficient solutions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Greedy Algorithms&lt;/strong&gt;: Making optimal choices at each step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Programming&lt;/strong&gt;: Solving complex problems by breaking them down into simpler subproblems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graph Algorithms&lt;/strong&gt;: Including Dijkstra's algorithm for shortest paths.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each topic is presented with clear, concise examples to aid understanding.&lt;/p&gt;




&lt;h2&gt;
  
  
  Motivation and Purpose
&lt;/h2&gt;

&lt;p&gt;The repository was created to address two key issues:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The lack of beginner-friendly C# materials on DSA&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
While countless tutorials and repositories exist for languages like JavaScript or Python, comparable resources in C# are rare. This project adapts proven learning structures to C#, offering a consistent and readable path through classic problems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;To promote conceptual understanding over clever implementations&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Rather than diving into complex or optimal code, the examples here emphasize &lt;strong&gt;digestibility&lt;/strong&gt; — making it easier for learners to &lt;strong&gt;grasp the logic&lt;/strong&gt; behind each structure or algorithm before worrying about performance tuning.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Target Audience
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Developers with little or no formal education in data structures and algorithms
&lt;/li&gt;
&lt;li&gt;Bootcamp or self-taught programmers transitioning to more technical interviews
&lt;/li&gt;
&lt;li&gt;C# developers seeking a &lt;strong&gt;clean, minimal&lt;/strong&gt; reference for foundational concepts
&lt;/li&gt;
&lt;li&gt;Interviewees needing a conceptual refresher on common DSA patterns in C#
&lt;/li&gt;
&lt;li&gt;Mentors and educators looking for &lt;strong&gt;teachable&lt;/strong&gt;, idiomatic examples&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Selected Examples
&lt;/h2&gt;

&lt;p&gt;The repository includes a variety of topics such as pointers, recursion, sorting, searching, and graph traversal. Below are three representative samples.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Count Unique Values (Multiple Pointers Pattern)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;CSharp_DataStructures_Algorithms_Fundamentals&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;partial&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MultiplePointers&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;CountUniqueValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="c1"&gt;// Pointer for tracking unique values&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// When two pointers point to different elements&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++;&lt;/span&gt; &lt;span class="c1"&gt;// Increment the pointer for unique values&lt;/span&gt;
                    &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// Assign current value to next unique slot&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Total unique values&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Use Case: Counts the number of unique values in a sorted array.&lt;br&gt;
Concepts Reinforced: Two-pointer technique, array traversal, in-place updates.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. QuickSort (Divide and Conquer)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;QuickSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Find the pivot index&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pivotIndex&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;Pivot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Sort left and right halves&lt;/span&gt;
        &lt;span class="nf"&gt;QuickSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pivotIndex&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;QuickSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pivotIndex&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Example breakdown:&lt;/span&gt;
&lt;span class="c1"&gt;// QuickSort([4,6,9,1,2,5,3])&lt;/span&gt;
&lt;span class="c1"&gt;// Pivot = 4 → partitions array&lt;/span&gt;
&lt;span class="c1"&gt;// [3,2,1,4,6,9,5] → 4 is now in place&lt;/span&gt;
&lt;span class="c1"&gt;// Recurse on each side&lt;/span&gt;
&lt;span class="cm"&gt;/*
QuickSort(arr, left=0, right=6)  
  Pivot: 4, PivotIndex: 3  
  Array: { 3, 2, 1, 4, 9, 5, 6 }

  ├── QuickSort(arr, left=0, right=2)  
  │     Pivot: 3, PivotIndex: 2  
  │     Array: { 1, 2, 3, 4, 9, 5, 6 }  
  │  
  │     ├── QuickSort(arr, left=0, right=1)  
  │     │     Pivot: 1, PivotIndex: 0  
  │     │     Array: { 1, 2, 3, 4, 9, 5, 6 }  
  │     │     ├── QuickSort(arr, left=0, right=-1) → Return  
  │     │     └── QuickSort(arr, left=1, right=1) → Return  
  │  
  │     └── QuickSort(arr, left=3, right=2) → Return  
  │  
  └── QuickSort(arr, left=4, right=6)  
        Pivot: 9, PivotIndex: 6  
        Array: { 1, 2, 3, 4, 6, 5, 9 }  
        ├── QuickSort(arr, left=4, right=5)  
        │     Pivot: 6, PivotIndex: 5  
        │     Array: { 1, 2, 3, 4, 5, 6, 9 }  
        │     ├── QuickSort(arr, left=4, right=4) → Return  
        │     └── QuickSort(arr, left=6, right=5) → Return  
        └── QuickSort(arr, left=7, right=6) → Return
*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Use Case: In-place sorting of arrays via partitioning.&lt;br&gt;
Concepts Reinforced: Recursion, divide-and-conquer strategy, pivot logic.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Dijkstra’s Algorithm (Graph Traversal with Priority Queue)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;Dijkstra&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;finish&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;nodes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;PriorityQueue&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;distances&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;previous&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;?&amp;gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;vertex&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;adjacencyList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Keys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vertex&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;distances&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;vertex&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vertex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;distances&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;vertex&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vertex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;vertex&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;dequeuedNode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Dequeue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;smallest&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dequeuedNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Item1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;smallest&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;finish&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;smallest&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;smallest&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;smallest&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;smallest&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;distances&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;smallest&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;edge&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;adjacencyList&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;smallest&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;candidate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;distances&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;smallest&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;edge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Weight&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;candidate&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;distances&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;edge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;distances&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;edge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;candidate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                    &lt;span class="n"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;edge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;smallest&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                    &lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;edge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;candidate&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Reverse&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Example: Dijkstra("A", "F")&lt;/span&gt;
&lt;span class="c1"&gt;// Shortest path: A → C → D → F&lt;/span&gt;
&lt;span class="c1"&gt;// Total cost: 5&lt;/span&gt;

&lt;span class="cm"&gt;/*
Initialization:
A distance = 0, other nodes = ∞
Priority queue: [A(0), B(∞), C(∞), D(∞), E(∞), F(∞)]

Step 1: Process A
A → B (4), A → C (2)
B updated to 4, C updated to 2
Priority queue: [C(2), B(4), D(∞), E(∞), F(∞)]

Step 2: Process C
C → D (2 + 2 = 4)
D updated to 4
Priority queue: [D(4), B(4), E(∞), F(∞)]

Step 3: Process B
B → E (4 + 3 = 7)
E updated to 7
Priority queue: [D(4), E(7), F(∞)]

Step 4: Process D
D → E (4 + 3 = 7) (no change)
D → F (4 + 1 = 5)
F updated to 5
Priority queue: [F(5), E(7)]

Step 5: Process F
F is the target, stop.

Path Reconstruction:
F → D → C → A
Reverse: A → C → D → F
Final Output
["A", "C", "D", "F"]
This is the shortest path from A to F, with a total cost of 5.
*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Use Case: Computes the shortest path between two nodes in a weighted graph.&lt;br&gt;
Concepts Reinforced: Graph traversal, priority queues, dictionaries, and path reconstruction.&lt;/p&gt;
&lt;h2&gt;
  
  
  Project Philosophy
&lt;/h2&gt;

&lt;p&gt;This repository serves as a bridge between learning and implementation — it doesn’t aim to provide complete academic coverage of each topic, but instead prioritizes conceptual clarity and accessible code.&lt;/p&gt;

&lt;p&gt;Each algorithm is written with readability in mind. More advanced topics such as recursion or graph traversal are broken down with commentary and examples, ensuring learners not only see the implementation but also understand the underlying mechanics.&lt;/p&gt;
&lt;h2&gt;
  
  
  Explore the Repository
&lt;/h2&gt;

&lt;p&gt;If this collection supports your own study or helps you mentor others, consider:&lt;/p&gt;

&lt;p&gt;⭐ Starring the GitHub repo&lt;/p&gt;

&lt;p&gt;💾 Bookmarking or saving this article&lt;/p&gt;

&lt;p&gt;🧑‍🤝‍🧑 Sharing it with peers or mentees on a similar path&lt;/p&gt;

&lt;p&gt;Your support helps reinforce the need for clean, foundational content in C# — especially in an ecosystem where such resources are hard to come by.&lt;/p&gt;

&lt;p&gt;View the full collection here:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/tigerbluejay" rel="noopener noreferrer"&gt;
        tigerbluejay
      &lt;/a&gt; / &lt;a href="https://github.com/tigerbluejay/CSharp-DataStructures-Algorithms-Fundamentals" rel="noopener noreferrer"&gt;
        CSharp-DataStructures-Algorithms-Fundamentals
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Clean C# implementations of fundamental data structures and algorithms for technical interviews and foundational understanding. Covers arrays, linked lists, trees, graphs, recursion, sorting, searching, dynamic programming, tries, and more—well-organized and ideal for .NET developers.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;C# Data Structures and Algorithms Fundamentals&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;This repository is a comprehensive repository of essential data structures and algorithms implemented in C#, with clean, well-documented code and clear organization. This project demonstrates proficiency in core programming concepts such as arrays, linked lists, stacks, queues, trees, graphs, recursion, sorting, and searching algorithms. Ideal for technical interviews and foundational understanding, it reflects a strong grasp of algorithmic thinking and software engineering principles using .NET technologies.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;01 - Frequency Counters&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;The Frequency Counter pattern uses objects or hash tables to count occurrences of values, enabling efficient comparisons and data validations. It is particularly useful in problems involving anagram detection, duplicates, and value matching across arrays or strings. This folder introduces foundational logic used in optimizing nested loops and improving time complexity.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;02 - Multiple Pointers&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;The Multiple Pointers strategy involves creating pointers or indices that move toward each other or in parallel to solve…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/tigerbluejay/CSharp-DataStructures-Algorithms-Fundamentals" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>csharp</category>
      <category>algorithms</category>
      <category>datastructures</category>
      <category>learning</category>
    </item>
    <item>
      <title>A Curated Repository of Early C# Algorithms for Technical Interviews</title>
      <dc:creator>Jose Maria Iriarte</dc:creator>
      <pubDate>Sat, 12 Apr 2025 09:40:46 +0000</pubDate>
      <link>https://dev.to/josemariairiarte/a-curated-repository-of-foundational-c-algorithms-for-technical-interviews-42f2</link>
      <guid>https://dev.to/josemariairiarte/a-curated-repository-of-foundational-c-algorithms-for-technical-interviews-42f2</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/tigerbluejay/CollectionofBasicCSharpAlgorithms" rel="noopener noreferrer"&gt;&lt;strong&gt;Collection of Basic C# Algorithms&lt;/strong&gt;&lt;/a&gt; is a focused, practical repository designed to assist developers — particularly junior and mid-level professionals — in preparing for technical interviews that involve algorithmic problem-solving in C#.&lt;/p&gt;

&lt;p&gt;This collection emerged from personal experience and professional necessity. It serves as a foundational resource for those who may not have received formal training in data structures and algorithms, yet frequently encounter algorithmic challenges during interviews for roles that do not require algorithmic problem-solving as part of day-to-day responsibilities.&lt;/p&gt;

&lt;p&gt;These are not optimal solutions, but solutions optimized for beginners who may find it easy to think in simpler, yet more verbose terms.&lt;/p&gt;




&lt;h2&gt;
  
  
  Motivation and Purpose
&lt;/h2&gt;

&lt;p&gt;The motivation behind this repository was twofold:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;To reduce signal noise&lt;/strong&gt;: Developers preparing for interviews often face an overwhelming volume of information, with algorithm repositories offering hundreds of problems of varying relevance or complexity. This project aims to &lt;strong&gt;distill the essentials&lt;/strong&gt; — the most frequently asked, straightforward algorithmic questions — and present them clearly in C#.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;To support self-taught developers&lt;/strong&gt;: Many developers come to the field through nontraditional paths. This repository provides them with an accessible point of entry into algorithmic thinking, aligned with industry expectations.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Target Audience
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Junior to mid-level developers preparing for interviews
&lt;/li&gt;
&lt;li&gt;Developers transitioning into more technical or algorithm-heavy roles
&lt;/li&gt;
&lt;li&gt;Individuals without a computer science background seeking structured, minimal examples of classic problems
&lt;/li&gt;
&lt;li&gt;Interviewees applying to companies that require a basic proficiency in algorithms without expecting advanced computer science knowledge&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Selected Examples
&lt;/h2&gt;

&lt;p&gt;Below are three representative algorithms from the repository. Each example demonstrates core algorithmic reasoning and is implemented in clear, idiomatic C#.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Reverse Words in a String
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ReverseWordsinaString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello World"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Reverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;reversedString&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reversedString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Use Case: Reverses the order of words in a given string (e.g., "hello world" becomes "world hello").&lt;br&gt;
Concepts Reinforced: String splitting, array manipulation, and use of Array.Reverse.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Check if a String is a Palindrome
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;IsStringPalindrome&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"racecar"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ToLower&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;reversed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ReverseString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isPalindrome&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isPalindrome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"The string is a palindrome."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"The string is not a palindrome."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Helper method to reverse a string&lt;/span&gt;
&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;ReverseString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;charArray&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToCharArray&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Reverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;charArray&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;charArray&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Use Case: Checks whether a string reads the same forwards and backwards.&lt;br&gt;
Concepts Reinforced: String normalization, helper methods, conditionals.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Checking for Prime Numbers
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;IsIntPrime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;17&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Replace with the positive integer you want to check&lt;/span&gt;
    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isPrime&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;IsPrime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isPrime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is a prime number."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is not a prime number."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;IsPrime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Use Case: Determines if int is a prime number&lt;br&gt;
Concepts Reinforced: Nested loops and condition checking. General Math.&lt;/p&gt;
&lt;h2&gt;
  
  
  Project Philosophy
&lt;/h2&gt;

&lt;p&gt;This project was developed as a precursor to more formal study in data structures and algorithms. It reflects both practical interview experience and a desire to support developers at transitional points in their careers. Each algorithm is designed to be immediately understandable and directly relevant to common screening questions.&lt;/p&gt;

&lt;p&gt;Rather than aiming for academic completeness, this collection prioritizes relevance, clarity, and working solutions. The implementation style is intentionally straightforward, prioritizing readability and accessibility over optimization or cleverness.&lt;/p&gt;
&lt;h2&gt;
  
  
  Explore the Repository
&lt;/h2&gt;

&lt;p&gt;If you find the repository helpful in your own preparation or mentoring, consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Starring the repo on GitHub&lt;/li&gt;
&lt;li&gt;Bookmarking or liking this article for future reference&lt;/li&gt;
&lt;li&gt;Sharing it with colleagues or students navigating similar challenges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your support helps signal that there’s value in concise, beginner-friendly technical resources.&lt;/p&gt;

&lt;p&gt;You can view the full collection here:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/tigerbluejay" rel="noopener noreferrer"&gt;
        tigerbluejay
      &lt;/a&gt; / &lt;a href="https://github.com/tigerbluejay/CollectionofBasicCSharpAlgorithms" rel="noopener noreferrer"&gt;
        CollectionofBasicCSharpAlgorithms
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Common Basic Algorithms used in interviews related to C# positions - A collection of fundamental algorithms implemented in C#, covering sorting, searching, and data structure manipulation. This repository helps strengthen algorithmic thinking and coding efficiency in C#.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;CollectionofBasicCSharpAlgorithms&lt;/h1&gt;

&lt;/div&gt;

&lt;p&gt;Collection of Basic C# Algorithms is a curated repository featuring fundamental algorithm implementations written in C#. It serves as a practical reference for developers seeking to understand core algorithmic concepts through concise, well-organized examples. Covering a range of topics from sorting and searching to string manipulation, this collection is ideal for beginners looking to strengthen their problem-solving skills or for experienced programmers needing quick access to foundational C# algorithm patterns.&lt;/p&gt;

&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/tigerbluejay/CollectionofBasicCSharpAlgorithms" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>csharp</category>
      <category>interview</category>
      <category>algorithms</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Starting as a Junior Developer and Breaking into the Job Market – A Retrospective</title>
      <dc:creator>Jose Maria Iriarte</dc:creator>
      <pubDate>Wed, 09 Apr 2025 01:52:23 +0000</pubDate>
      <link>https://dev.to/josemariairiarte/starting-as-a-junior-developer-and-breaking-into-the-job-market-a-retrospective-10f4</link>
      <guid>https://dev.to/josemariairiarte/starting-as-a-junior-developer-and-breaking-into-the-job-market-a-retrospective-10f4</guid>
      <description>&lt;p&gt;Back in 2020, I recorded these two podcast episodes as part of a now-archived project. They cover my early experiences as a Junior Developer and my journey breaking into the job market back in 2014. A decade later, I’m sharing them here in case they resonate with anyone starting out or reflecting on their own path.&lt;/p&gt;

&lt;p&gt;Hope you enjoy!&lt;/p&gt;

&lt;p&gt;📺 Listen to the first episode here:&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/JVZGkVG0Vbo"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;📺 Listen to the second episode here:&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/mZJtWoFA_U0"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Share Your Story
&lt;/h2&gt;

&lt;p&gt;If these episodes strike a chord, feel free to:&lt;/p&gt;

&lt;p&gt;💾 Bookmark them for later&lt;br&gt;
🎧 Share with someone starting out in tech&lt;br&gt;
💬 Drop a comment with your own early career memories&lt;/p&gt;

&lt;p&gt;Every shared experience helps make the path a little clearer for those just beginning.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>codenewbie</category>
      <category>community</category>
    </item>
    <item>
      <title>Mastering CSS Video Series: A Structured, Concise Blueprint for Essential Modern CSS</title>
      <dc:creator>Jose Maria Iriarte</dc:creator>
      <pubDate>Sat, 05 Apr 2025 20:15:14 +0000</pubDate>
      <link>https://dev.to/josemariairiarte/mastering-css-video-series-a-structured-concise-blueprint-for-essential-modern-css-3oi1</link>
      <guid>https://dev.to/josemariairiarte/mastering-css-video-series-a-structured-concise-blueprint-for-essential-modern-css-3oi1</guid>
      <description>&lt;p&gt;CSS is the backbone of web design, yet many tutorials are either too complex or too superficial. This article introduces a free, 24-video CSS series designed for beginners, developers in need of a refresher, and experienced coders exploring hidden features. Covering everything from fundamental syntax, selectors and properties to advanced topics like animations, transformations, and modern CSS features, each concise, practical lesson (3-9 minutes) ensures you gain a strong, structured understanding without feeling overwhelmed. Watch the first video or explore the full playlist to start learning today! 🚀&lt;/p&gt;




&lt;h3&gt;
  
  
  🔥 Why a Thorough Introduction to CSS Matters
&lt;/h3&gt;

&lt;p&gt;CSS is the foundation of the web design—every webpage you visit utilizes it. Whether you're a complete beginner or a developer looking to strengthen your fundamentals, a solid grasp of CSS is essential for designing harmonious, beautiful, pages that leave an impression.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚡ The Challenge
&lt;/h3&gt;

&lt;p&gt;Many CSS courses are long, bloated, or overly complex, making it hard to stay engaged. Some tutorials focus on theory without real-world application, while others rush through key concepts without proper explanations.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎯 The Solution
&lt;/h3&gt;

&lt;p&gt;I’ve created a free, 24-video CSS series that breaks everything down into short, focused lessons (3-9 minutes each). It’s beginner-friendly, to the point, and packed with practical examples—perfect for learning CSS quickly without feeling overwhelmed. The code provided is tested to work perfectly, so upon completing each lesson, you may view the styles in any web browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 What’s in This Video Series?
&lt;/h3&gt;

&lt;p&gt;The series begins with an introduction to styles, selectors and basic CSS principles. Starting from sylesheet references, the course moves quickly through CSS Reset, and common styles such as Fonts, Borders, Margins, Padding, and Sizing. From there, the course explores image and hyperlink-related Styles emphasizing core principles that guide how styles are prioritized as well as the rules behind how they “cascade”.&lt;/p&gt;

&lt;p&gt;In the second half, the course dives into often-overlooked advanced features, such as linear and radial gradients, transforms, transitions and animations. A dedicated section breaks down tables in detail, introducing key notions and best practices. These final lessons focus on modern CSS features —concepts rarely covered in quick-start guides but essential for mastering cascading stylesheets.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 Who Is This For?
&lt;/h3&gt;

&lt;p&gt;Whether you're a beginner looking for a quick but solid foundation, a developer in need of a CSS refresher, or an experienced coder curious about hidden features you might have overlooked in a rushed introduction years ago, this series has something for you. Each video is designed to be concise yet insightful, covering both core concepts and lesser-known elements to help you write cleaner, more beautiful CSS and understand thoroughly why sometimes CSS styles appear to behave so unpredictably.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎬 How to Get Started?
&lt;/h3&gt;

&lt;p&gt;Getting started is simple! Just hit play on the first video below, which introduces you to the fundamentals of CSS:&lt;br&gt;
📺 Watch the first video here:&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/bqGDmUnMLu0"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;To follow along with the full 24-video series, check out the complete playlist:&lt;br&gt;
👉 &lt;strong&gt;Watch the full playlist here:&lt;/strong&gt; &lt;a href="https://www.youtube.com/playlist?list=PLUwkgSa02g92Rq22OCOl61jZ7J1aOC4vQ" rel="noopener noreferrer"&gt;CSS Video Series&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each video is short, focused, and beginner-friendly, so you can learn at your own pace. If you find the series helpful, consider subscribing for more content and sharing it with others who might benefit! &lt;br&gt;
Thank you for reading through. I hope you will enjoy this thorough video introduction to CSS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Support Clean Learning Resources
&lt;/h2&gt;

&lt;p&gt;If this CSS series helps strengthen your skills — or offers clarity where other tutorials fell short — consider:&lt;/p&gt;

&lt;p&gt;⭐ Saving or bookmarking the article for future reference&lt;br&gt;
🎬 Sharing it with friends, mentees, or coding communities&lt;br&gt;
🧑‍🤝‍🧑 Spreading the word about clean, structured beginner resources&lt;/p&gt;

&lt;p&gt;Your support helps highlight the importance of clear, concise educational content in a field that often feels overwhelming for newcomers.&lt;/p&gt;

</description>
      <category>css</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>Mastering HTML Video Series: A Structured, Concise Blueprint for Essential Modern HTML</title>
      <dc:creator>Jose Maria Iriarte</dc:creator>
      <pubDate>Sat, 15 Feb 2025 16:26:01 +0000</pubDate>
      <link>https://dev.to/josemariairiarte/mastering-html-video-series-a-structured-concise-blueprint-for-essential-modern-html-1gh9</link>
      <guid>https://dev.to/josemariairiarte/mastering-html-video-series-a-structured-concise-blueprint-for-essential-modern-html-1gh9</guid>
      <description>&lt;p&gt;HTML is the backbone of the web, yet many tutorials are either too complex or too superficial. This article introduces a free, 12-video HTML series designed for beginners, developers in need of a refresher, and experienced coders exploring hidden features. Covering everything from fundamental syntax and semantic elements to advanced topics like ARIA, microformats, and modern HTML features, each concise, practical lesson (3-9 minutes) ensures you gain a strong, structured understanding without feeling overwhelmed. Watch the first video or explore the full playlist to start learning today! 🚀&lt;/p&gt;




&lt;h3&gt;
  
  
  🔥 Why a Thorough Introduction to HTML Matters
&lt;/h3&gt;

&lt;p&gt;HTML is the foundation of the web—every webpage you visit is built on it. Whether you're a complete beginner or a developer looking to strengthen your fundamentals, a solid grasp of HTML is essential for writing clean, structured, and accessible code.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚡ The Challenge
&lt;/h3&gt;

&lt;p&gt;Many HTML courses are long, bloated, or overly complex, making it hard to stay engaged. Some tutorials focus on theory without real-world application, while others rush through key concepts without proper explanations.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎯 The Solution
&lt;/h3&gt;

&lt;p&gt;I’ve created a free, 12-video HTML series that breaks everything down into short, focused lessons (3-9 minutes each). It’s beginner-friendly, to the point, and packed with practical examples—perfect for learning HTML quickly without feeling overwhelmed.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 What’s in This Video Series?
&lt;/h3&gt;

&lt;p&gt;The series begins with an introduction to the basic HTML template, covering fundamental syntax conventions that will guide you throughout the course. It starts with comments, then moves into an overview of the most common HTML tags—first conceptually, then through real-world examples. From there, the course explores specialized elements like "figure", "aside", and "nav", emphasizing the importance of semantic HTML and why each tag matters.&lt;/p&gt;

&lt;p&gt;In the second half, the course dives into often-overlooked advanced features, such as ARIA, microformats, and microdata, helping you write accessible and structured code. A dedicated section breaks down forms in detail, introducing key elements and best practices. The final lessons focus on modern HTML features, including newer input types and elements—components rarely covered in quick-start guides but essential for mastering the language.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 Who Is This For?
&lt;/h3&gt;

&lt;p&gt;Whether you're a beginner looking for a quick but solid foundation, a developer in need of an HTML refresher, or an experienced coder curious about hidden features you might have overlooked in a rushed introduction years ago, this series has something for you. Each video is designed to be concise yet insightful, covering both core concepts and lesser-known elements to help you write cleaner, more effective HTML.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎬 How to Get Started?
&lt;/h3&gt;

&lt;p&gt;Getting started is simple! Just hit play on the first video below, which introduces you to the fundamentals of HTML:&lt;br&gt;
📺 Watch the first video here:&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/4yFfJQswH98"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;To follow along with the full 12-video series, check out the complete playlist:&lt;br&gt;
👉 &lt;strong&gt;Watch the full playlist here:&lt;/strong&gt; &lt;a href="https://www.youtube.com/playlist?list=PLUwkgSa02g91I2YB6sC0VHB92G7fNfZ2V" rel="noopener noreferrer"&gt;HTML Video Series&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each video is short, focused, and beginner-friendly, so you can learn at your own pace. If you find the series helpful, consider subscribing for more content and sharing it with others who might benefit! &lt;br&gt;
Thank you for reading through. I hope you will enjoy this in depth detailed and concise video introduction to HTML.&lt;/p&gt;

&lt;h2&gt;
  
  
  Support Structured Learning
&lt;/h2&gt;

&lt;p&gt;If this HTML series helps you grasp the core concepts or dive deeper into advanced features, consider:&lt;/p&gt;

&lt;p&gt;⭐ Bookmarking or saving this article for future reference&lt;br&gt;
🎥 Sharing it with fellow learners, colleagues, or students starting their web development journey&lt;br&gt;
🧑‍🤝‍🧑 Spreading the word about accessible, concise tutorials for mastering HTML&lt;/p&gt;

&lt;p&gt;Your engagement encourages the creation of more clean, foundational resources that make learning web development easier for everyone.&lt;/p&gt;

</description>
      <category>html</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
