<?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: Sheraz Manzoor</title>
    <description>The latest articles on DEV Community by Sheraz Manzoor (@sheraz4194).</description>
    <link>https://dev.to/sheraz4194</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%2F1694459%2F4d579d40-68fe-477a-b845-ceb4ef345a86.png</url>
      <title>DEV Community: Sheraz Manzoor</title>
      <link>https://dev.to/sheraz4194</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sheraz4194"/>
    <language>en</language>
    <item>
      <title>Another Year in Production 🎂</title>
      <dc:creator>Sheraz Manzoor</dc:creator>
      <pubDate>Tue, 20 Oct 2026 21:55:14 +0000</pubDate>
      <link>https://dev.to/sheraz4194/another-year-in-production-4ohp</link>
      <guid>https://dev.to/sheraz4194/another-year-in-production-4ohp</guid>
      <description>&lt;p&gt;Today is my birthday. 🎉&lt;/p&gt;

&lt;p&gt;Another year of learning, debugging, breaking things, fixing them, and occasionally wondering why the code worked yesterday.&lt;/p&gt;

&lt;p&gt;If life had a changelog, I hope this year's release includes fewer bugs, better decisions, and some meaningful improvements.&lt;/p&gt;

&lt;p&gt;And yes, I'm already working on my next engineering article. More on that soon. 👨‍💻&lt;/p&gt;

&lt;p&gt;For today, though, I'll accept birthday wishes as my uptime monitoring dashboard. 😄&lt;/p&gt;

&lt;p&gt;Wish me a happy birthday, developers! 🎂&lt;/p&gt;

</description>
      <category>community</category>
      <category>watercooler</category>
      <category>news</category>
    </item>
    <item>
      <title>How a smart Engineering Decision Reduced Our costs by 25% and is continuously reducing.</title>
      <dc:creator>Sheraz Manzoor</dc:creator>
      <pubDate>Sun, 11 Oct 2026 18:42:39 +0000</pubDate>
      <link>https://dev.to/sheraz4194/how-a-smart-engineering-decision-reduced-our-costs-by-25-and-is-continuously-reducing-35ob</link>
      <guid>https://dev.to/sheraz4194/how-a-smart-engineering-decision-reduced-our-costs-by-25-and-is-continuously-reducing-35ob</guid>
      <description>&lt;p&gt;Our banking app had a feature, which let the users to find nearby branches and ATMs using their current location. And the users liked this feature very much.&lt;br&gt;
It was straightforward from the user's perspective.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;open app -&amp;gt; open maps tab -&amp;gt; find the branches and ATMs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But with a banking app, with a MILLIONS OF USERS, it was very costly. A user might request maps for several times a day and that will hit google maps api which bills based on the number of requests.&lt;/p&gt;

&lt;p&gt;Consider a typical user journey. Someone opens the map before visiting a branch. They close it, return a few minutes later, and search for nearby ATMs. Another user makes a similar request in the same area. With a large user base, these otherwise ordinary interactions can generate a substantial number of external API requests.&lt;/p&gt;

&lt;p&gt;Our orignal request flow was very simple.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    A[User opens map] --&amp;gt; B[Application requests locations]
    B --&amp;gt; C[Google Maps API]
    C --&amp;gt; D[Results displayed]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;There was nothing wrong with Google Maps. It provided the functionality we needed. The problem was how our application approached repeated requests.&lt;/p&gt;

&lt;p&gt;That led us to a practical question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why should we make another external request for information we already have, when that information can legally and reliably be reused?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The objective wasn't to eliminate Google Maps. We still needed it when the application genuinely required information that wasn't available locally or needed a permitted refresh.&lt;/p&gt;

&lt;p&gt;The objective was to stop treating every lookup as if it were the first one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's store the map's data in our own database
&lt;/h2&gt;

&lt;p&gt;This idea changed the whole picture. We decided when user opens the map, we get data from Google maps, and we store this data in our own database.&lt;br&gt;
AND when the user opens the map again, we make the request to our database first, if requested data is there, we don't have to call the Google Maps API again. And if data is not there, the Google Maps will be requested to provide the required data and that will be stored in the database again.&lt;/p&gt;

&lt;p&gt;It was attractive for a few reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fewer unnecessary external requests.&lt;/li&gt;
&lt;li&gt;Lower recurring API spend.&lt;/li&gt;
&lt;li&gt;Fewer network round trips on a path users hit constantly.&lt;/li&gt;
&lt;li&gt;Reuse of information across requests, where reuse is appropriate and permitted.&lt;/li&gt;
&lt;li&gt;Faster responses for frequent lookups.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A word on terminology, because it matters here. The persistent layer is &lt;strong&gt;information stored in our database&lt;/strong&gt;. Redis, which came later, has a different and narrower role. And renaming "cache" to "database storage" changes nothing about what Google allows. The Terms prohibit caching Google Maps Content except where expressly permitted, and they list &lt;em&gt;storing&lt;/em&gt; Google Maps Content outside the services among the things you can't do (&lt;a href="https://cloud.google.com/maps-platform/terms" rel="noopener noreferrer"&gt;Terms of Service, §3.2.3&lt;/a&gt;). Where the data sits doesn't decide whether you may keep it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Implementation (2 layers, 2 jobs)
&lt;/h2&gt;

&lt;p&gt;SInce we established database first strategy, we had to make lookups fast enough, that user don't notice the delay.&lt;/p&gt;

&lt;p&gt;Earlier approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;user opens map -&amp;gt; request sent to google maps server -&amp;gt; response back to client &lt;span class="o"&gt;(&lt;/span&gt;user&lt;span class="o"&gt;)&lt;/span&gt;
ONE API CALL ONLY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But with our idea&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;user open map -&amp;gt; request sent to bank server -&amp;gt; result not found -&amp;gt; request sent again to google maps api -&amp;gt; response back to client &lt;span class="o"&gt;(&lt;/span&gt;user&lt;span class="o"&gt;)&lt;/span&gt;
TWO API CALLS IF DATA IS NOT AVAILABLE IN OUR SERVER
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So that was another challenge. So we found a way to manage this. &lt;a href="https://redis.io/solutions/caching/" rel="noopener noreferrer"&gt;RADIS&lt;/a&gt; !!&lt;/p&gt;

&lt;p&gt;Initally Radis has all pointers about every data, that this specific requested data is not present in our server. So, the initial request is now never sent to our server if the requested data is not there.&lt;/p&gt;

&lt;p&gt;And whenever that data or information is stored in database, the pointer to that specific data from the Radis Cache was removed.&lt;/p&gt;

&lt;p&gt;Thus when user made the request, the first place to gp was Radis Cache. If data pointer is there, we would make the request directly to Google Maps API instead of hiting our server first. And if the data pointer was not in the Radis Cache, we made the requests to our server directly.&lt;br&gt;
Speed lightening fast, least requests possible sent to the Google Maps API.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
A[User opens map] --&amp;gt; B{Check Redis Cache}

    B --&amp;gt;|Pointer exists: data unavailable locally| C[Request Google Maps API]
    C --&amp;gt; D[Return response to user]

    B --&amp;gt;|Pointer does not exist: data may be in database| E[Request Bank Server]
    E --&amp;gt; F{Data found in database?}

    F --&amp;gt;|Yes| G[Return stored data]
    G --&amp;gt; D

    F --&amp;gt;|No| H[Request Google Maps API]
    H --&amp;gt; I[Store eligible data in bank database]
    I --&amp;gt; J[Remove corresponding Redis pointer]
    J --&amp;gt; K[Return response to user]

    style B fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
    style C fill:#fef3c7,stroke:#d97706,color:#92400e
    style H fill:#fef3c7,stroke:#d97706,color:#92400e
    style G fill:#dcfce7,stroke:#16a34a,color:#166534
    style J fill:#f3e8ff,stroke:#9333ea,color:#581c87&lt;/code&gt;&lt;/pre&gt;



&lt;h2&gt;
  
  
  Next Challenge (stored information becomes outdated)
&lt;/h2&gt;

&lt;p&gt;Eliminating unnecessary requests is only useful when the result returned to the user is still appropriate.&lt;/p&gt;

&lt;p&gt;Location information changes. A branch may move, an ATM may close, and details about a place may be updated. Information that was accurate when first retrieved cannot be assumed to remain correct indefinitely.&lt;/p&gt;

&lt;p&gt;Our reuse strategy therefore introduced another responsibility: managing freshness.&lt;/p&gt;

&lt;p&gt;There are two obvious but undesirable extremes.&lt;/p&gt;

&lt;p&gt;The first is to request fresh information every time. This may reduce reliance on older records, but it also sacrifices much of the performance and cost benefit of reuse, which was the basic goal.&lt;/p&gt;

&lt;p&gt;The second is to keep using stored information indefinitely. That may look efficient in API usage statistics, but it risks showing users details that are no longer correct.&lt;/p&gt;

&lt;p&gt;Neither approach is a good general policy.&lt;/p&gt;

&lt;p&gt;Instead, data freshness needs to be treated as part of the serving strategy. A record must be considered usable only within the rules applicable to that information.&lt;/p&gt;

&lt;p&gt;That requires distinguishing at least three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Availability:&lt;/strong&gt; Does a record exist?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freshness:&lt;/strong&gt; Is the record still suitable to serve?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permission:&lt;/strong&gt; Is the application allowed to retain and reuse that information in this way?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions are related, but they are not interchangeable.&lt;/p&gt;

&lt;p&gt;A record can exist in the database and still be too old to use. A record can be fresh but subject to a storage restriction. And a record may be permitted to persist even though some related location details require a different refresh policy.&lt;/p&gt;

&lt;p&gt;The external provider's rules matter here. For example, Google explicitly permits storing Place IDs for later reuse and recommends refreshing IDs older than 12 months because they may change. That recommendation is distinct from the 30-day caching limit for Places API latitude and longitude values. &lt;a href="https://developers.google.com/maps/documentation/places/web-service/place-id" rel="noopener noreferrer"&gt;Google's Place IDs documentation&lt;/a&gt; explains both.&lt;/p&gt;

&lt;p&gt;This is why I wouldn't recommend a universal expiration period for every field in a location-related record. The correct policy depends on the source, field, use case, and applicable terms.&lt;/p&gt;

&lt;p&gt;Redis adds another consideration. Even if the persistent record is refreshed or corrected, an old Redis entry must not continue to take precedence over the newer information.&lt;/p&gt;

&lt;p&gt;The system needs a consistent strategy for both layers: determine whether the information is valid to serve, update or invalidate affected fast-lookup entries when necessary, and avoid reintroducing stale values through a later cache fill.&lt;/p&gt;

&lt;p&gt;The precise mechanics can vary. The essential requirement is that Redis accelerates the correct lookup path rather than becoming a second, inconsistent source of truth.&lt;/p&gt;

&lt;p&gt;This was an important part of the engineering problem. Reducing external requests is not a success if the application achieves it by returning information users should no longer see.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Redis lives in one feature
&lt;/h2&gt;

&lt;p&gt;This decision deserves its own section, because "add Redis" is a tempting reflex.&lt;/p&gt;

&lt;p&gt;We chose Redis for one feature with one specific performance requirement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Latency matters here.&lt;/strong&gt; People reach for a branch finder when they need an answer now, and a map that fills in slowly feels broken.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The access pattern fits.&lt;/strong&gt; The feature repeatedly requests the same eligible records, which is exactly where a low-latency lookup layer pays off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The two stores do different jobs.&lt;/strong&gt; The database gives durability and a source of truth. Redis gives speed on hot records. Neither replaces the other.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everywhere else, it would be pure cost.&lt;/strong&gt; Putting Redis into unrelated parts of the system would add deployment, monitoring, failure modes, and invalidation rules without solving any problem those parts actually have.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the difference between a targeted engineering decision and adopting a tool because it's popular. We didn't need Redis everywhere. We needed the maps feature to retrieve the information it already had as quickly as possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The results: faster lookups, lower API spend
&lt;/h2&gt;

&lt;p&gt;I'd rather describe what changed accurately than decorate it with numbers I can't defend.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Less unnecessary traffic to Google Maps&lt;/strong&gt;, because lookups we could answer ourselves stopped becoming outbound requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster responses&lt;/strong&gt; whenever information could be served from Redis or the database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reuse across repeat requests&lt;/strong&gt; of eligible information that previously would have been fetched again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lower API spend&lt;/strong&gt;, as avoidable requests were eliminated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A growing body of stored, eligible records&lt;/strong&gt;, which gives more repeat lookups the chance to be resolved without an external call.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point comes with an asterisk. Growth has limits: anything with a retention limit has to leave on schedule, and refreshes cost calls of their own (the ID-only refresh being the documented exception). New locations, data changes, usage patterns, and provider pricing all move the total. More stored information improves the &lt;em&gt;opportunity&lt;/em&gt; for reuse. It doesn't promise that costs fall forever.&lt;/p&gt;

&lt;p&gt;If you want to prove a change like this works rather than just believe it, these are the numbers to track, with a baseline captured &lt;em&gt;before&lt;/em&gt; you ship:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Maps API request count.&lt;/li&gt;
&lt;li&gt;Cost per period, or per relevant user activity.&lt;/li&gt;
&lt;li&gt;Redis and database hit rates, where measurable.&lt;/li&gt;
&lt;li&gt;Median and p95 response latency.&lt;/li&gt;
&lt;li&gt;Duplicate requests on missing records.&lt;/li&gt;
&lt;li&gt;Stale-data and refresh rate.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📉 25% LOWER GOOGLE MAPS COSTS — AND STILL FALLING
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Merged:&lt;/strong&gt; 10 August 2026&lt;/p&gt;

&lt;p&gt;As of the publication date, &lt;strong&gt;Google Maps costs have dropped to just 25% of their previous level — and continue to decrease.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not because we switched providers. Not because we downgraded the experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Because we made a smarter engineering decision.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The broader lesson
&lt;/h2&gt;

&lt;p&gt;The takeaway isn't "use Redis," and it isn't "store API responses." It's to understand your application's request patterns, then make deliberate choices about where data lives, when an external request is truly necessary, what can be reused, and how freshness is maintained.&lt;/p&gt;

&lt;p&gt;For this feature, that meant combining five things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Persistent storage of eligible data.&lt;/li&gt;
&lt;li&gt;A feature-specific, low-latency lookup layer.&lt;/li&gt;
&lt;li&gt;Correct handling of missing records.&lt;/li&gt;
&lt;li&gt;Deliberate management of freshness.&lt;/li&gt;
&lt;li&gt;Measurement of both performance and cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each piece alone is a half-answer. Storage without freshness serves stale results. Speed without miss-handling multiplies calls. Neither means much if you can't measure it.&lt;/p&gt;

&lt;p&gt;The biggest optimisation was not making an external API call faster. It was making fewer unnecessary calls, while returning the information users needed more quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  DISCUSS
&lt;/h2&gt;

&lt;p&gt;If you found this helpful, and have such stories or smarter decisions, you or your team made, which really was super beneficial, please let me know in the comments and then discuss more engineering. Looking forword to your response felloz!!&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>programming</category>
      <category>performance</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>The Frog That Lived: Let's learn about falsification.</title>
      <dc:creator>Sheraz Manzoor</dc:creator>
      <pubDate>Tue, 06 Oct 2026 11:50:25 +0000</pubDate>
      <link>https://dev.to/sheraz4194/the-frog-that-lived-lets-learn-about-falsification-4l7e</link>
      <guid>https://dev.to/sheraz4194/the-frog-that-lived-lets-learn-about-falsification-4l7e</guid>
      <description>&lt;p&gt;Suppose! You're a biologist and you have a claim based on your hypothesis that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;All the frogs we put in a deep freezer will die&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To prove your claim you do an experiment.&lt;/p&gt;

&lt;p&gt;You put 10 frogs in a freezer and the next day they all are dead in the deep freezer. Your confidence in your claim will rise. Now you do the same experiment on the 90 more frogs (10 frogs in a batch) and you get the same result. You'll be even more confident in your claim.&lt;/p&gt;

&lt;p&gt;But can you say, your claim is scientifically proven? Never!&lt;/p&gt;

&lt;p&gt;Now imagine that one of the frog from the eleventh batch survive under same conditions in the deep freezer. What does that mean? That falsified your claim. We don't need to do 100 more experiments to prove that the claim &lt;strong&gt;"All frogs in a deep freezer dies"&lt;/strong&gt; is false. That's called falsification.&lt;/p&gt;

&lt;p&gt;That asymmetry is the important part:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A finite collection of confirming examples cannot prove a universal claim, but a single valid counterexample can falsify one.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Karl Popper made this asymmetry central to his philosophy of science. In &lt;em&gt;The Logic of Scientific Discovery&lt;/em&gt;, he argued that universal theories cannot be derived from finite observations, while a suitable observation that contradicts a theory can refute it. The same logical structure appears in engineering every time we test a claim about software. &lt;a href="https://www.routledge.com/The-Logic-of-Scientific-Discovery/Popper/p/book/9780415278447" rel="noopener noreferrer"&gt;Popper, &lt;em&gt;The Logic of Scientific Discovery&lt;/em&gt;&lt;/a&gt; &lt;a href="https://plato.stanford.edu/entries/induction-problem/" rel="noopener noreferrer"&gt;Stanford Encyclopedia of Philosophy: The Problem of Induction&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is an important engineering distinction here: a passing observation is usually &lt;strong&gt;compatible&lt;/strong&gt; with the hypothesis, while a valid counterexample is &lt;strong&gt;incompatible&lt;/strong&gt; with it.&lt;/p&gt;

&lt;p&gt;That is why one test failure can be much more informative than thousands of passing tests.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem of Induction in Software Testing
&lt;/h2&gt;

&lt;p&gt;Software testing is induction with a CI pipeline. You run a finite number of cases and infer a general claim: "this function is correct." &lt;strong&gt;Edsger Dijkstra&lt;/strong&gt; said it bluntly decades ago: testing can reveal the presence of bugs, never their absence.&lt;/p&gt;

&lt;p&gt;Suppose this function is intended to sort integers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sort_numbers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xs&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;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works for many inputs.&lt;/p&gt;

&lt;p&gt;It works for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[]
[1]
[3, 1, 2]
[5, 2, 9, 7]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A large regression suite might happily contain thousands of examples like these.&lt;/p&gt;

&lt;p&gt;But the function silently removes duplicates.&lt;/p&gt;

&lt;p&gt;The counterexample is tiny:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[0, 0]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[0, 0]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[0]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One failure is enough to falsify the hypothesis:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This function correctly sorts every list of integers."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A system with 99.999% boring behavior does not become 100% safe because the boring behavior was observed often.&lt;/p&gt;

&lt;p&gt;The missing 0.001% may contain the incident.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real world examples of falsification in Engineering
&lt;/h2&gt;

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

&lt;p&gt;Google had a large distributed MySQL environment, with many dependent services. The engineers assumed that if one the database fails, the rest of the system will continue working.&lt;/p&gt;

&lt;p&gt;Instead of waiting for the database to crash in production, they tested their assumption. They intentionally failed one database out of hundreds. They expected a controlled failure.&lt;/p&gt;

&lt;p&gt;But reality was different.&lt;/p&gt;

&lt;p&gt;Within minutes of commercing test, numerous dependent services reported that both external and internal users were unable to access important systems. Some systems were intermittently or only partially accessible.&lt;/p&gt;

&lt;p&gt;Google immediately aborted their test, restored the access and started investigating the issue.&lt;/p&gt;

&lt;p&gt;They didn't found one issue, they found several issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hidden dependencies existed between systems that were supposed to tolerate the database failure.&lt;/li&gt;
&lt;li&gt;Their rollback procedure had not been sufficiently tested and was itself flawed.&lt;/li&gt;
&lt;li&gt;A flaw existed in the database application-layer library.&lt;/li&gt;
&lt;li&gt;Their incident-response process had not been sufficiently exercised.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thw important part is what they did after all this.&lt;/p&gt;

&lt;p&gt;Google fixed the library, improved the recovery process, and instituted periodic retesting. Their own SRE documentation explicitly describes the goal as breaking systems, observing how they fail, discovering hidden weaknesses, and then making changes to prevent those failures from recurring.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sre.google/sre-book/emergency-response/" rel="noopener noreferrer"&gt;Source: Google SRE&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Netflix's move to AWS created a very different failure environment.&lt;/p&gt;

&lt;p&gt;In a traditional data center, an individual server failing might be relatively infrequent and handled operationally.&lt;/p&gt;

&lt;p&gt;In a large distributed cloud environment, individual instances can disappear, networks can fail, dependencies can become unavailable, and components can behave unpredictably. So the engineer's thought &lt;strong&gt;"Our services will continue working when individual infrastructure components fail."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So being the responsible engineers, instead of believing their assumption, they decided to test it. So they created an open source tool to test their assumptions called &lt;strong&gt;&lt;a href="https://github.com/Netflix/chaosmonkey" rel="noopener noreferrer"&gt;Chaos Monkey&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chaos Monkey&lt;/strong&gt; randomly terminates virtual machine instances and containers that run inside of your production environment. Exposing engineers to failures more frequently incentivize them to build resilient services.&lt;/p&gt;

&lt;p&gt;But their test was even brutal.They built a &lt;strong&gt;Chaos KOng&lt;/strong&gt;, which doesn't just kill a serer, it kills an entire AWS region.&lt;/p&gt;

&lt;p&gt;During the Chaos Kong in exercise they found that traffic evacuate from the west region. The east region got a corresponding bump in traffic as it stepped up to play the role of saviour. As long as the aggregate metric followed that relatively smooth trend, Netflix knew that their system is resilient to the failover. At the end of the exercise, traffic reverted back to the west region.&lt;/p&gt;

&lt;p&gt;AFter this reliability question changed forever. Instead of asking do we have two servers, they started asking what if we kill one?&lt;br&gt;
Since then they regularly runChaos Kong exercises and they say, "it gives us confidence that even if an entire region goes down, we can still server our customers".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://netflixtechblog.com/chaos-engineering-upgraded-878d341f15fa" rel="noopener noreferrer"&gt;Source: Chaos Engineering Upgraded&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3. My personal experience (A case study worth reading)
&lt;/h3&gt;

&lt;p&gt;We were making a payment service in one of our project, that handled transactions through an external payment provider. The flow was very very simple:&lt;/p&gt;

&lt;p&gt;Client -&amp;gt; Create Payment -&amp;gt; Payment Service -&amp;gt; Payment Provider -&amp;gt; Database&lt;/p&gt;

&lt;p&gt;We ran unit tests. We had integration, duplication and timeouts tests. We had tests for successful payments and provider failure. It was a green forest. So we assumed that &lt;strong&gt;"If a customer retries the same payment request, we won't charge them twice"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That assumption sounded reasonable because we had an idempotency mechanism. The only problem was that we were testing known examples. We weren't actively trying to destroy the assumption.&lt;/p&gt;

&lt;p&gt;So I changed the question. Instead of thinking does our idempotency code work, I thought what sequence of events would falsify the claim that our payment operation is idempotent.&lt;/p&gt;

&lt;p&gt;AN interesting possibility arose.&lt;/p&gt;

&lt;p&gt;What if:&lt;/p&gt;

&lt;p&gt;Request 1 -&amp;gt; Payment Provider successfully charges the card -&amp;gt; Network timeout occurs -&amp;gt; Our API never receives the response -&amp;gt; Client retries -&amp;gt; Request 2&lt;/p&gt;

&lt;p&gt;I deliberately produced this issue.&lt;/p&gt;

&lt;p&gt;I mocked the payment:&lt;/p&gt;

&lt;p&gt;Accept payment -&amp;gt; Record the charge -&amp;gt; Pretend the response was lost -&amp;gt; Return a timeout to our application.&lt;/p&gt;

&lt;p&gt;Then I sent the same logical payment again. And you know what happened?&lt;br&gt;
The second request generated another charge. This falsified our assumption before moving the app to production.&lt;/p&gt;

&lt;p&gt;The solution was not simply&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;don&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t charge
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We redesigned the operation around a stronger idempotency contract.&lt;/p&gt;

&lt;p&gt;The request received a stable idempotency key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;POST /payments

Idempotency-Key: 8d7e...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The service persisted the operation state before allowing the workflow to complete:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;idempotency_key&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;status&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;provider_transaction_id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;result&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A repeated request with the same key would then resolve to the existing operation instead of creating another payment.&lt;/p&gt;

&lt;p&gt;More importantly, I kept the original failure scenario as a permanent regression test.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_payment_is_idempotent_when_provider_succeeds_but_response_is_lost&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;charge_side_effect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nc"&gt;ChargeSucceededButResponseLost&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="nc"&gt;ExistingChargeResponse&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_payment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idempotency_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;abc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;second&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_payment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idempotency_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;abc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;number_of_provider_charges&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;payment_id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;payment_id&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We didn't discover the bug cuz we added another 500 happy-path tests, we discovered it because we added what would falsify our assumption.&lt;/p&gt;




&lt;h2&gt;
  
  
  Falsification in Practice: Property-Based Testing, Fuzzing, and Model Checking
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Property-based testing: a frog hunter, not a frog counter
&lt;/h3&gt;

&lt;p&gt;Example-based tests say "for &lt;em&gt;this&lt;/em&gt; input, expect &lt;em&gt;that&lt;/em&gt; output." &lt;a href="https://typeable.io/blog/2021-08-09-pbt.html" rel="noopener noreferrer"&gt;Property-based testing (PBT), pioneered by QuickCheck&lt;/a&gt; and available in Python via Hypothesis, says "for &lt;em&gt;all&lt;/em&gt; inputs of this shape, this property should hold" and then tries to break it.&lt;/p&gt;

&lt;p&gt;Here are two properties any sort must satisfy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Counter&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;hypothesis&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;given&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strategies&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;

&lt;span class="nd"&gt;@given&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;integers&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_sort_properties&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;my_sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Property 1: output is in non-decreasing order
&lt;/span&gt;    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]))&lt;/span&gt;

    &lt;span class="c1"&gt;# Property 2: output is a permutation of the input
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our function silently drops duplicates. Hypothesis found a counterexample and then &lt;strong&gt;shrank&lt;/strong&gt; it to the smallest failing input, &lt;code&gt;[0, 0]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The test never asked "does &lt;code&gt;[3, 1, 2]&lt;/code&gt; sort correctly?" It asked "can I find &lt;em&gt;any&lt;/em&gt; input that violates these properties?"&lt;/p&gt;

&lt;p&gt;An honest caveat is that PBT is still sampling. Hypothesis runs 100 examples per test by default, and 100 passes prove nothing about the 101st. PBT is a better frog hunter, not a proof engine. Its advantage is that it looks in places you wouldn't think to look.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model checking: search for the counterexample trace
&lt;/h3&gt;

&lt;p&gt;Formal methods embrace the asymmetry too. A model checker such as TLC (for TLA+) or SPIN takes a model of your system and an invariant and asks: &lt;strong&gt;is there any reachable state that violates it?&lt;/strong&gt; If there is, you get a &lt;strong&gt;counterexample trace&lt;/strong&gt;, the exact sequence of steps that leads to the violation.&lt;/p&gt;

&lt;p&gt;Amazon has publicly described using TLA+ to find subtle concurrency and fault-tolerance bugs in distributed systems, including ones whose failing traces were dozens of steps long. No human writes a test for step 35 of an obscure interleaving, but a checker that exhaustively searches for a falsifying path will find it.&lt;/p&gt;

&lt;p&gt;Fine print: if a checker exhausts a &lt;em&gt;finite model&lt;/em&gt; without finding a violation, you've proven the invariant for that model. The model is not your production system, and you're still one wrong assumption away from a surviving frog.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fuzzing: you only need one crash
&lt;/h3&gt;

&lt;p&gt;You don't have to prove a parser is safe. You have to find one input that crashes it.&lt;/p&gt;

&lt;p&gt;Fuzzers like &lt;a href="https://github.com/google/afl" rel="noopener noreferrer"&gt;AFL&lt;/a&gt; and &lt;a href="https://llvm.org/docs/LibFuzzer.html" rel="noopener noreferrer"&gt;libFuzzer&lt;/a&gt; do exactly that, mutating inputs and using coverage feedback to steer toward unexplored code paths. It's falsification with a compass. Barton Miller's original 1990 fuzz study threw random garbage at common UNIX utilities, and a startling fraction crashed or hung. Every crash was a frog that lived.&lt;/p&gt;

&lt;p&gt;For anything that eats untrusted bytes, such as parsers, protocol handlers, and deserializers, fuzzing is the cheapest falsification engine you can buy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Debugging is falsification, too
&lt;/h3&gt;

&lt;p&gt;A bug report is a falsifying observation. You don't need a theory of every way your system can fail. You need &lt;strong&gt;one reproducible failure&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's why the debugging workflow looks the way it does. You reproduce the failure, minimize it (shrink the input, &lt;code&gt;git bisect&lt;/code&gt; the commit), and turn it into a test. Hypothesis's shrinking is the same instinct, automated.&lt;/p&gt;

&lt;p&gt;One caution: a failing test falsifies the &lt;em&gt;conjunction&lt;/em&gt; of your code, your test, your environment, and your assumptions. Before you declare victory, check that the frog was really a frog. A flaky test, a bad fixture, or a wrong expectation can all produce a false alarm. Once a failure is reproducible, though, it's decisive. Don't argue with it and don't average it against the 4,000 tests that passed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters for Engineering Culture
&lt;/h2&gt;

&lt;p&gt;There is a difference between asking, how can we prove this works and asking what would make our belief that this works wrong?&lt;/p&gt;

&lt;p&gt;The second question is much more productive and drives results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test design.&lt;/strong&gt; A confirmation mindset writes the happy path and a couple of edge cases, then stops when the checkmarks turn green. While, a falsification mindset asks what property must always hold and how to violate it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code review.&lt;/strong&gt; Instead of "does this look right?", ask "what might break this?" Reviewers who hunt counterexamples find different bugs than reviewers who skim for plausibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Incident response.&lt;/strong&gt; A production incident is a falsifying observation about your mental model of the system. The right response is to update the model, not to explain why the incident was unlucky. Then you add the counterexample to the suite so that frog can never surprise you twice.&lt;/p&gt;

&lt;p&gt;Chaos engineering makes the connection explicit. Its method is to state a hypothesis about steady-state behavior, inject failure, and look for the experiment that contradicts you.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practical Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Write tests that try to falsify invariants&lt;/strong&gt;, not just confirm happy paths. Ask "what must always be true?" and then try to violate it. In the organization, I work in, we have made several tools that inserts inputs that break the system, make yours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use property-based tests for logic-heavy code&lt;/strong&gt; (parsers, serializers, state machines, data transformations, anything with round-trip or ordering properties).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fuzz anything that handles untrusted input:&lt;/strong&gt; parsers, protocols, file formats, input validation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat a green suite as evidence of &lt;em&gt;absence of known counterexamples&lt;/em&gt;,&lt;/strong&gt; not as proof of correctness. Say it that way in your head, and in your release notes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When one test fails, treat it as decisive.&lt;/strong&gt; Stop, reproduce, fix, and add the counterexample to the suite permanently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In design reviews, ask:&lt;/strong&gt; "What would falsify this design? What's the smallest input that breaks this assumption?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define your domain precisely.&lt;/strong&gt; Vague claims ("handles all valid input") invite arguments about whether a counterexample counts.&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>testing</category>
      <category>softwareengineering</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Charcole v2.3.0 is a BOMB 💣</title>
      <dc:creator>Sheraz Manzoor</dc:creator>
      <pubDate>Fri, 15 May 2026 15:17:10 +0000</pubDate>
      <link>https://dev.to/sheraz4194/charcole-v230-is-a-bomb-3047</link>
      <guid>https://dev.to/sheraz4194/charcole-v230-is-a-bomb-3047</guid>
      <description>&lt;p&gt;If you are a Nodejs Backend Developer, your life is going to change. Let's figure out why???&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.charcole.site/" rel="noopener noreferrer"&gt;Charcole&lt;/a&gt; is a modern CLI built to help developers scaffold, configure, and ship production-ready projects with confidence. &lt;a href="https://www.charcole.site/" rel="noopener noreferrer"&gt;Charcole&lt;/a&gt; removes repetitive setup work so you can focus on building features instead of fighting boilerplate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is charcole??
&lt;/h2&gt;

&lt;p&gt;Charcole is an opinionated project scaffolding tool designed for real-world development workflows.&lt;/p&gt;

&lt;p&gt;Instead of starting every nodejs project from scratch, Charcole gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean, structured project foundations&lt;/li&gt;
&lt;li&gt;Sane defaults based on modern best practices&lt;/li&gt;
&lt;li&gt;A fast, guided CLI experience&lt;/li&gt;
&lt;li&gt;Flexibility to grow without lock-in&lt;/li&gt;
&lt;li&gt;The revolutionary repository system, which helps you test your apis without a real database.&lt;/li&gt;
&lt;li&gt;Built in modules for authentication, swagger docs and a full-fledged payments modules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s built for developers who care about clarity, best practices, speed, and maintainability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Charcole exists?
&lt;/h2&gt;

&lt;p&gt;Most starters fall into one of two traps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Too minimal&lt;/strong&gt; → you still spend hours wiring basics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Too complex&lt;/strong&gt; → hard to customize or understand&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Charcole sits in the middle.&lt;/p&gt;

&lt;p&gt;It provides just enough structure to be productive on day one, while staying transparent and customization as your project evolves.&lt;/p&gt;

&lt;p&gt;Checkout the full documentation &lt;a href="https://www.charcole.site/" rel="noopener noreferrer"&gt;HERE&lt;/a&gt;&lt;br&gt;
If you want to contribute, checkout the &lt;a href="https://github.com/sheraz4196/charcole" rel="noopener noreferrer"&gt;RESPOSITORY&lt;/a&gt; (If you find it helpful, please star the repository as well, it'll be a great favor) &lt;br&gt;
Check it out on &lt;a href="https://www.npmjs.com/package/create-charcole?activeTab=readme" rel="noopener noreferrer"&gt;NPM&lt;/a&gt;&lt;/p&gt;

</description>
      <category>charcole</category>
      <category>cli</category>
      <category>webdev</category>
      <category>backend</category>
    </item>
    <item>
      <title>You're Not a Coder Anymore. You're an Orchestrator. (And That's a Good Thing)</title>
      <dc:creator>Sheraz Manzoor</dc:creator>
      <pubDate>Wed, 06 May 2026 10:43:31 +0000</pubDate>
      <link>https://dev.to/sheraz4194/youre-not-a-coder-anymore-youre-an-orchestrator-and-thats-a-good-thing-27a6</link>
      <guid>https://dev.to/sheraz4194/youre-not-a-coder-anymore-youre-an-orchestrator-and-thats-a-good-thing-27a6</guid>
      <description>&lt;p&gt;&lt;em&gt;The shift from AI autocomplete to AI agents is the biggest change in software development since version control -- and most devs aren't ready for it.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;If you're still treating your AI tools like a smarter Stack Overflow, you're already behind.&lt;/p&gt;

&lt;p&gt;In 2026, the developers shipping the most code aren't the ones who type the fastest or know the most syntax by heart. They're the ones who've figured out how to &lt;strong&gt;orchestrate AI agents&lt;/strong&gt; like a conductor leads an orchestra. One experienced developer with the right agentic framework can produce the output of a team of four or five engineers.&lt;/p&gt;

&lt;p&gt;That's not hype. That's what's actually happening in the industry right now.&lt;/p&gt;

&lt;p&gt;So let's talk about what "AI-agentic development" actually means in practice, how it changes the way you write and review code, and how you can start building these habits today.&lt;/p&gt;




&lt;h2&gt;
  
  
  First, What Even Is an AI Agent?
&lt;/h2&gt;

&lt;p&gt;Before we go further, let's make sure we're on the same page.&lt;/p&gt;

&lt;p&gt;A traditional AI coding tool (like early Copilot) works like autocomplete on steroids. You write a comment or a function signature, and it suggests what comes next. You're still driving. The AI is just filling in words.&lt;/p&gt;

&lt;p&gt;An &lt;strong&gt;AI agent&lt;/strong&gt; is different. You give it a goal, and it figures out the steps. It can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read your existing codebase to understand context&lt;/li&gt;
&lt;li&gt;Create files, write tests, and scaffold components&lt;/li&gt;
&lt;li&gt;Run commands and check the output&lt;/li&gt;
&lt;li&gt;Fix its own errors and iterate&lt;/li&gt;
&lt;li&gt;Open pull requests when it's done
The mental model shift is huge. Instead of asking "what code should I write next?", you start asking "what do I want to exist that doesn't exist yet?" and then delegating the building to an agent.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Old Workflow vs. The New Workflow
&lt;/h2&gt;

&lt;p&gt;Here's a concrete example. Let's say you need to build a user authentication module with JWT tokens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The old workflow (2022-era AI):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: // create a function to generate a JWT token
AI: suggests a 10-line function
You: copy, paste, tweak, move on
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're still writing 80% of the code. The AI is a lookup tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The new workflow (agentic, 2026):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You open your terminal and type something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Using Claude Code as an example agent&lt;/span&gt;
claude &lt;span class="s2"&gt;"Build a JWT authentication module. Use jsonwebtoken,
store refresh tokens in Redis, add middleware for protected routes,
and write Jest tests for each function. Follow the existing project
structure in /src."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reads your &lt;code&gt;/src&lt;/code&gt; directory to understand your file structure and naming conventions&lt;/li&gt;
&lt;li&gt;Checks your &lt;code&gt;package.json&lt;/code&gt; for existing dependencies&lt;/li&gt;
&lt;li&gt;Scaffolds &lt;code&gt;auth.service.ts&lt;/code&gt;, &lt;code&gt;auth.middleware.ts&lt;/code&gt;, and &lt;code&gt;auth.test.ts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Runs the tests and fixes any failures it finds&lt;/li&gt;
&lt;li&gt;Reports back with a summary
You didn't write the code. You defined the &lt;strong&gt;outcome&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What This Means for Your Day-to-Day Work
&lt;/h2&gt;

&lt;p&gt;This shift changes where your mental energy goes. Let's break it down.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Prompting is now a core skill
&lt;/h3&gt;

&lt;p&gt;How you describe a task determines the quality of what you get back. Vague instructions produce vague code. Precise instructions with context produce production-ready code.&lt;/p&gt;

&lt;p&gt;Compare these two prompts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bad:  "Add error handling to my API"

Good: "Add error handling to all async functions in /src/routes/*.ts.
      Use a centralized error handler middleware. Return structured JSON
      errors with a 'code', 'message', and 'details' field.
      Log errors using the existing Winston logger in /src/utils/logger.ts."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second prompt gives the agent constraints, existing context, and an expected output format. You'll get something you can actually use.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. You review more than you write
&lt;/h3&gt;

&lt;p&gt;Your job becomes code review at a higher level. Instead of reviewing your own work line by line as you go, you're reviewing entire feature scaffolds and asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does this follow our architecture patterns?&lt;/li&gt;
&lt;li&gt;Are there security implications I need to check?&lt;/li&gt;
&lt;li&gt;Is this the right abstraction, or is it over-engineered?
This is actually a more valuable use of your time. The mechanical typing is handled. The judgment is still yours.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Architecture decisions matter more, not less
&lt;/h3&gt;

&lt;p&gt;Here's the thing people get wrong: they think agentic AI tools reduce the need for technical expertise. It's the opposite.&lt;/p&gt;

&lt;p&gt;If you give an AI agent bad architectural direction, it will build you a very clean, well-tested, beautifully scaffolded bad system. Garbage in, garbage out, just faster.&lt;/p&gt;

&lt;p&gt;Knowing &lt;em&gt;why&lt;/em&gt; you'd use a message queue vs. a direct API call, &lt;em&gt;why&lt;/em&gt; you'd separate your domain logic from your infrastructure layer, &lt;em&gt;why&lt;/em&gt; you'd reach for an event-driven pattern in one scenario vs. a request-response pattern in another -- these skills are more important now than ever. Because you're the one making those calls.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Practical Agentic Workflow You Can Steal
&lt;/h2&gt;

&lt;p&gt;Here's a workflow pattern that senior devs are adopting right now. Think of it as "spec-first" development.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Write a task spec, not just a ticket
&lt;/h3&gt;

&lt;p&gt;Before you hand anything to an AI agent, write a short spec file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Task: Add rate limiting to the public API&lt;/span&gt;

&lt;span class="gu"&gt;## Goal&lt;/span&gt;
Prevent abuse by limiting requests to 100 per 15 minutes per IP address.

&lt;span class="gu"&gt;## Constraints&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Use express-rate-limit (already in package.json)
&lt;span class="p"&gt;-&lt;/span&gt; Apply globally in app.ts, not per-route
&lt;span class="p"&gt;-&lt;/span&gt; Return a 429 status with a clear error message
&lt;span class="p"&gt;-&lt;/span&gt; Add an exemption for internal service-to-service calls (identified by X-Internal-Token header)
&lt;span class="p"&gt;-&lt;/span&gt; Write integration tests using supertest

&lt;span class="gu"&gt;## Files to touch&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; src/app.ts (add middleware)
&lt;span class="p"&gt;-&lt;/span&gt; src/middleware/rateLimiter.ts (create this)
&lt;span class="p"&gt;-&lt;/span&gt; tests/rateLimiter.test.ts (create this)

&lt;span class="gu"&gt;## Do NOT change&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Any existing route handlers
&lt;span class="p"&gt;-&lt;/span&gt; Authentication logic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This spec becomes your agent's system prompt. It gives it constraints, context, and a clear scope boundary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Run the agent with the spec
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--file&lt;/span&gt; task-spec.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or paste it directly into your tool of choice.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Review the diff like a PR
&lt;/h3&gt;

&lt;p&gt;When the agent is done, treat its output exactly like you'd treat a pull request from a junior developer. Check the logic, check the edge cases, check that the scope didn't drift.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did it touch files you said not to touch?&lt;/li&gt;
&lt;li&gt;Does the test actually assert the right things, or does it just pass trivially?&lt;/li&gt;
&lt;li&gt;Are there any magic numbers or hardcoded values that should be config?
### Step 4: Iterate with follow-up prompts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agents shine in iteration. If something is off, be specific:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"The test passes when the rate limit is hit but it's not testing the
X-Internal-Token exemption. Add a test case for that."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This back-and-forth is fast. A correction that would take you 20 minutes to track down and fix takes 30 seconds to describe.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Pitfalls (Don't Skip This Section)
&lt;/h2&gt;

&lt;p&gt;Agentic development is powerful, but it's easy to shoot yourself in the foot if you're not careful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pitfall 1: Trusting without reading
&lt;/h3&gt;

&lt;p&gt;The number one mistake is treating AI output as safe to ship without reading it. Agents can and do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Introduce subtle bugs in edge cases&lt;/li&gt;
&lt;li&gt;Write tests that pass trivially (testing that &lt;code&gt;true === true&lt;/code&gt;, essentially)&lt;/li&gt;
&lt;li&gt;Use deprecated APIs they learned from older training data&lt;/li&gt;
&lt;li&gt;Over-engineer simple solutions
Always read the diff. Every single time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pitfall 2: Scope creep in agent runs
&lt;/h3&gt;

&lt;p&gt;Agents are eager. If your spec is vague, they'll fill the gaps with assumptions. Sometimes those assumptions touch things you didn't want touched.&lt;/p&gt;

&lt;p&gt;Mitigate this by being explicit about scope boundaries in your spec, as shown above. "Do NOT change X" is a sentence worth writing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pitfall 3: Context rot in long sessions
&lt;/h3&gt;

&lt;p&gt;The longer an agent session runs, the more likely the agent is to lose track of early constraints. For big features, break the work into multiple smaller agent runs rather than one giant session.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Run 1: Scaffold the data models and migrations
Run 2: Build the service layer
Run 3: Wire up the API routes
Run 4: Write tests for the complete flow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each run starts fresh with the relevant context. This produces cleaner, more consistent output than one mega-prompt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pitfall 4: Skipping security review
&lt;/h3&gt;

&lt;p&gt;AI agents don't have your threat model. They'll write code that works in the happy path but miss things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQL injection vectors in dynamic queries&lt;/li&gt;
&lt;li&gt;Missing authorization checks on sensitive endpoints&lt;/li&gt;
&lt;li&gt;Storing sensitive data in logs
Treat any agent-written code that handles user input, authentication, or data persistence with extra scrutiny.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Skills That Actually Matter in 2026
&lt;/h2&gt;

&lt;p&gt;If you want to level up as a developer in this new landscape, here's where to invest:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Double down on systems thinking.&lt;/strong&gt; Understand distributed systems, data modeling, and software architecture at a deeper level. The agents build. You design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get comfortable with TypeScript.&lt;/strong&gt; End-to-end type safety across client and server is now the baseline expectation. Agents produce much better, more consistent code when your codebase has strong types.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn to write clear specs.&lt;/strong&gt; This is basically technical writing. Ambiguity is the enemy. Practice writing requirements that a developer who knows nothing about your project could follow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understand what agents can't do well.&lt;/strong&gt; Novel algorithmic problems, nuanced UX decisions, security audits, performance profiling -- these still need deep human attention. Know where the handoffs are.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stay hands-on in the code.&lt;/strong&gt; The developers who drift too far from the actual code and become "prompt managers only" will lose their technical judgment quickly. Keep reading code, keep debugging, keep understanding the system.&lt;/p&gt;




&lt;h2&gt;
  
  
  So, Are Developer Jobs Going Away?
&lt;/h2&gt;

&lt;p&gt;Let's address the elephant in the room.&lt;/p&gt;

&lt;p&gt;No. But the &lt;em&gt;shape&lt;/em&gt; of the work is changing fast.&lt;/p&gt;

&lt;p&gt;The developers who treat AI agents as a threat are going to have a harder time than those who treat them as leverage. A skilled developer with agentic tools doesn't get replaced. They get multiplied.&lt;/p&gt;

&lt;p&gt;Think of it like this: a great architect doesn't get replaced by better construction equipment. Better equipment just means they can build more ambitious things.&lt;/p&gt;

&lt;p&gt;The floor is rising. Junior developers who rely on agents too heavily without building foundational understanding will struggle. But experienced developers who know their craft and add orchestration skills on top will be absurdly productive.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started Today
&lt;/h2&gt;

&lt;p&gt;If you haven't started experimenting with agentic tools, here's the shortest path to getting your hands dirty:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Set up Claude Code, Cursor, or GitHub Copilot Workspace&lt;/strong&gt; in a real project you're working on&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick one well-defined, low-risk task&lt;/strong&gt; (not something in production-critical code) and write a spec for it as described above&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run the agent and review the output like a PR&lt;/strong&gt; without running it yet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterate with follow-up prompts&lt;/strong&gt; until the output meets your bar&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Then run the tests&lt;/strong&gt;, check the behavior manually, and decide if it's shippable
That first successful run where you go from "here's what I want" to "here's working, tested code I didn't have to type" is a genuinely mind-shifting experience.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The developers who build this muscle now will have a significant head start over those who wait until it's "mainstream." In a lot of teams, it already is.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;The core shift is this: &lt;strong&gt;your value as a developer is no longer in your typing speed or your ability to recall syntax. It's in your ability to think clearly about what needs to exist, define it precisely, and evaluate what gets built.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's actually a more interesting job. More architecture, more judgment, more design, less boilerplate.&lt;/p&gt;

&lt;p&gt;The era of AI as autocomplete is already over. The era of AI as collaborator is here. The question is whether you're going to treat these tools like a smarter search engine or like a team member you can delegate to.&lt;/p&gt;

&lt;p&gt;Start delegating.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you started using agentic workflows in your day job? What's working for you and what's been a pain? Drop a comment below, I'd love to hear how others are adapting their workflows.&lt;/em&gt;&lt;/p&gt;




</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Many of my followers liked this post and it got so much love. So sharing it again for the new folks out there,</title>
      <dc:creator>Sheraz Manzoor</dc:creator>
      <pubDate>Tue, 05 May 2026 19:16:05 +0000</pubDate>
      <link>https://dev.to/sheraz4194/many-of-my-followers-liked-this-post-and-it-got-so-much-love-so-sharing-it-again-for-the-new-folks-2f2</link>
      <guid>https://dev.to/sheraz4194/many-of-my-followers-liked-this-post-and-it-got-so-much-love-so-sharing-it-again-for-the-new-folks-2f2</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/sheraz4194/good-commit-vs-bad-commit-best-practices-for-git-1plc" class="crayons-story__hidden-navigation-link"&gt;Good Commit ✔ VS. Bad Commit ❌: Best Practices for Git&lt;/a&gt;


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

          &lt;a href="/sheraz4194" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1694459%2F4d579d40-68fe-477a-b845-ceb4ef345a86.png" alt="sheraz4194 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/sheraz4194" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Sheraz Manzoor
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Sheraz Manzoor
                
                
              
              &lt;div id="story-author-preview-content-1925182" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/sheraz4194" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1694459%2F4d579d40-68fe-477a-b845-ceb4ef345a86.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Sheraz Manzoor&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/sheraz4194/good-commit-vs-bad-commit-best-practices-for-git-1plc" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 19 '24&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/sheraz4194/good-commit-vs-bad-commit-best-practices-for-git-1plc" id="article-link-1925182"&gt;
          Good Commit ✔ VS. Bad Commit ❌: Best Practices for Git
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/git"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;git&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/github"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;github&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/sheraz4194/good-commit-vs-bad-commit-best-practices-for-git-1plc" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1012&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/sheraz4194/good-commit-vs-bad-commit-best-practices-for-git-1plc#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              81&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>beginners</category>
      <category>git</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Coding is dead; Engineering is not.</title>
      <dc:creator>Sheraz Manzoor</dc:creator>
      <pubDate>Sat, 28 Feb 2026 17:19:29 +0000</pubDate>
      <link>https://dev.to/sheraz4194/coding-is-dead-engineering-is-not-3il2</link>
      <guid>https://dev.to/sheraz4194/coding-is-dead-engineering-is-not-3il2</guid>
      <description>&lt;p&gt;Tech industries have been marking something as dead, since the internet came. They marked PHP dead, they marked the desktop apps dead, now they're saying coding is dead. So, let's disscuss, is coding really dead?&lt;/p&gt;

&lt;p&gt;With vibe coding platforms, the startups are bragging about, shipping without developers. Some even say;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If AI can write code, what's left for developers?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Answer to the question.
&lt;/h2&gt;

&lt;p&gt;To answer that bitter question, I would love to share my personal experiences. &lt;/p&gt;

&lt;p&gt;First experience is very recent, I guess it was in December. A client approached me on Linkedin, and said this exactly;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I have created a website with loveable, everything is fine but there's an issue. On google page insights the performance score is only 28%. Can you fix this and bring the score to 90+?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, AI generated the website for him, but he still needed my services. And when I looked his code, there were 2000+ lines of code in various single files, images loading on the homepage were above 5 mb, most of'em.&lt;/p&gt;

&lt;p&gt;And I did my "engineering" and the performance boosted to 98.&lt;/p&gt;

&lt;p&gt;The second experience is that client approached me with a very similar situation, I'll edit his message a bit to avoid confidential information leaks, he said;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I have a THAT specific issue, I'm trying to resolve it with AI from weeks, but nothing worked out, can you help me in this please? Give me a quotation and a timeline"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, AI failed at that certain problem, which was basically "Engineering" related; not about "Coding"&lt;/p&gt;

&lt;p&gt;To cut the story short, the coding is really dead, but engineering didn't and it'll never.&lt;/p&gt;

&lt;h2&gt;
  
  
  The death of Coding
&lt;/h2&gt;

&lt;p&gt;Let's be honest; Writing the boilerplate code was never the highest form of intelligence. We even found free templates which really helped a lot several times.&lt;/p&gt;

&lt;p&gt;CRUD oprations, API endpoints, forms validations, UI design, these tasks are increasingly automated, and don't be sad, it's not a tragedy, it's progress. Just like calculators didn't kill Mathematics, AI wouldn't kill Engineering. After AI, just an idea died;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A developer is someone who writes the code line by line&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What coding was? And why it wasn't enough?
&lt;/h2&gt;

&lt;p&gt;In very descriptive way, "Coding was just syntax execution". And on the other hand, "Engineering is problem solving".&lt;/p&gt;

&lt;p&gt;An engineer understands ambiguous requirements, designs scalable systems, anticipates failure modes, balances performance, security, costs and UX, makes trade-off under real world pressure. So, coding is a language, engineering is the mindset.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Engineering will always survive?
&lt;/h2&gt;

&lt;p&gt;Real world problems are very messy, they aren't like simple vanila problems. Client contradicts themselves, requirements change in the mid-build, business goals conflicts with technical realities.&lt;/p&gt;

&lt;p&gt;Engineering is the ability to shape chaos into meaningful systems. AI can generate functionality, it cannot take responsibility. &lt;/p&gt;

&lt;p&gt;AI works always with context and patterns. Now, from the experiences I shared, many files had 2000+ lines of code, not a single AI can make edits in that single file, and reality we have tens and thousands of files, what will AI do there? It'll crash. On the other hand, Engineers write systems based on domain knowledge, business context, user behavior and organized constraints. Context is not a prompt, context is experience.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Here's my new blog post, I had been working and testing Nextjs 15 for two months and here's a summary of it.</title>
      <dc:creator>Sheraz Manzoor</dc:creator>
      <pubDate>Tue, 09 Dec 2025 10:37:30 +0000</pubDate>
      <link>https://dev.to/sheraz4194/heres-my-new-blog-post-i-had-been-working-and-testing-nextjs-15-for-two-months-and-heres-a-1g80</link>
      <guid>https://dev.to/sheraz4194/heres-my-new-blog-post-i-had-been-working-and-testing-nextjs-15-for-two-months-and-heres-a-1g80</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/sheraz4194/whats-new-nextjs-15-3fia" class="crayons-story__hidden-navigation-link"&gt;What's new Nextjs in 15?&lt;/a&gt;


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

          &lt;a href="/sheraz4194" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1694459%2F4d579d40-68fe-477a-b845-ceb4ef345a86.png" alt="sheraz4194 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/sheraz4194" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Sheraz Manzoor
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Sheraz Manzoor
                
                
              
              &lt;div id="story-author-preview-content-3094140" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/sheraz4194" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1694459%2F4d579d40-68fe-477a-b845-ceb4ef345a86.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Sheraz Manzoor&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/sheraz4194/whats-new-nextjs-15-3fia" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Dec 9 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/sheraz4194/whats-new-nextjs-15-3fia" id="article-link-3094140"&gt;
          What's new Nextjs in 15?
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/nextjs"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;nextjs&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/react"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;react&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/typescript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;typescript&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/sheraz4194/whats-new-nextjs-15-3fia" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;5&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/sheraz4194/whats-new-nextjs-15-3fia#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>nextjs</category>
      <category>react</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>What's new Nextjs in 15?</title>
      <dc:creator>Sheraz Manzoor</dc:creator>
      <pubDate>Tue, 09 Dec 2025 10:36:23 +0000</pubDate>
      <link>https://dev.to/sheraz4194/whats-new-nextjs-15-3fia</link>
      <guid>https://dev.to/sheraz4194/whats-new-nextjs-15-3fia</guid>
      <description>&lt;p&gt;Vercel Recently launched Nextjs 15, and decaled it as stable and ready for production. Today we'll disscuss what's new in Nextjs 15. &lt;/p&gt;

&lt;p&gt;Basically there are new features in Nextjs 15;&lt;/p&gt;

&lt;h2&gt;
  
  
  React 19 RC Support
&lt;/h2&gt;

&lt;p&gt;Next.js 15 RC now supports React 19 RC. This includes the new features for both client and server side rendering. One of the new features in React 19 is &lt;strong&gt;Actions&lt;/strong&gt; which is a very common use case in React Apps to perform Data Mutation and then update in response. &lt;/p&gt;

&lt;p&gt;For example; when a user submits a form to change their name, you'll make an api request and then handle a response. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;@next/codemode&lt;/code&gt; CLI
&lt;/h2&gt;

&lt;p&gt;Now you can easily upgrade to latest Nextjs and React versions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @next/codemod@canary upgrade latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Turbopack Dev (Stable)
&lt;/h2&gt;

&lt;p&gt;Performance and stability has been improved to the next level.&lt;/p&gt;

&lt;h2&gt;
  
  
  React Compiler (Experimental)
&lt;/h2&gt;

&lt;p&gt;The React Compiler is a new compiler created by the React team at Meta. Complier understands your code at a deep level through it's understanding of plain JavaScript semantics and the rules of React, which allows it to add automatic optimizations to your code.&lt;/p&gt;

&lt;p&gt;The code reduce the amount of manual memorization developers has to do with apis such as useMemo and useCallback, making code simpler, easier to maintain, and less error prove.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hydration Error Improvements.
&lt;/h2&gt;

&lt;p&gt;Nextjs continues to build on those by an improved hydration error view. Hydration errors now display the source code of the error with suggestion on how to address the error. &lt;/p&gt;

&lt;p&gt;Such improvements help the developers to better understand the error fix it in low time. &lt;/p&gt;

&lt;h2&gt;
  
  
  Caching Updates
&lt;/h2&gt;

&lt;p&gt;In Nextjs 15, caching default for fetch requests, GET Route handlers and Client Route Handlers and client router cache has changed from cached by default to uncached by default.&lt;/p&gt;

&lt;p&gt;If you want to retain the previous behavior, you can continue to opt-into caching.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Partial Prerendering (Experimental)
&lt;/h2&gt;

&lt;p&gt;Partial Prerendering is a new rendering strategy that combines the benefits of static and dynamic rendering on the same route. Quite similar to parallel routing, right? With PPR, you can wrap any dynamic components in a Suspense Boundary. &lt;/p&gt;

&lt;p&gt;When a new request comes in, Nextjs will immediately serve a static HTML shell from the cache, then render and stream the dynamic parts in the same HTTP request.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;unstable_after&lt;/code&gt; API (Experimental)
&lt;/h2&gt;

&lt;p&gt;This executers a stream after a response finishes streaming. &lt;/p&gt;

&lt;p&gt;So, these were the backbone new features of Nextjs 15, I find them quite fascinating and interesting, and after using them from almost two months (October 2025 to December 2025), I can now witness that is really lot much better already, and in the next releases it will improve further more. &lt;/p&gt;

&lt;p&gt;I would love to hear your thoughts, questions and critics on it.  &lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>How to deal with a slow API, a story in two parts.</title>
      <dc:creator>Sheraz Manzoor</dc:creator>
      <pubDate>Sat, 02 Aug 2025 12:24:30 +0000</pubDate>
      <link>https://dev.to/sheraz4194/how-to-deal-with-a-slow-api-a-story-in-two-parts-j1f</link>
      <guid>https://dev.to/sheraz4194/how-to-deal-with-a-slow-api-a-story-in-two-parts-j1f</guid>
      <description>&lt;p&gt;Why optimize when you can simply... shift the problem to someone else? &lt;/p&gt;

</description>
      <category>programmingmemes</category>
      <category>frontenddev</category>
      <category>backenddev</category>
      <category>devhumor</category>
    </item>
    <item>
      <title>Understanding React's `use` API</title>
      <dc:creator>Sheraz Manzoor</dc:creator>
      <pubDate>Fri, 21 Feb 2025 17:23:09 +0000</pubDate>
      <link>https://dev.to/sheraz4194/understanding-reacts-use-api-5d57</link>
      <guid>https://dev.to/sheraz4194/understanding-reacts-use-api-5d57</guid>
      <description>&lt;h2&gt;
  
  
  A Sneak Peek into React’s &lt;code&gt;use&lt;/code&gt; API: Simplifying Async Data Fetching
&lt;/h2&gt;

&lt;p&gt;React's &lt;code&gt;use&lt;/code&gt; API is an &lt;strong&gt;experimental&lt;/strong&gt; yet powerful feature designed to &lt;strong&gt;simplify asynchronous data fetching&lt;/strong&gt; within components. Instead of juggling &lt;code&gt;useEffect&lt;/code&gt; and state variables, &lt;code&gt;use&lt;/code&gt; lets you directly await promises inside the render phase.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Why is &lt;code&gt;use&lt;/code&gt; a Game-Changer?
&lt;/h2&gt;

&lt;p&gt;✅ Eliminates unnecessary &lt;code&gt;useEffect&lt;/code&gt; hooks&lt;br&gt;&lt;br&gt;
✅ Works seamlessly with Server Components&lt;br&gt;&lt;br&gt;
✅ Simplifies async operations for cleaner, more readable code  &lt;/p&gt;
&lt;h2&gt;
  
  
  How Does it Work?
&lt;/h2&gt;

&lt;p&gt;Here's a quick look at how &lt;code&gt;use&lt;/code&gt; fetches data directly inside a component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;use&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://jsonplaceholder.typicode.com/posts/1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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;h2&gt;
  
  
  Is use Ready for Production?
&lt;/h2&gt;

&lt;p&gt;⚠️ Not yet! The API is still experimental and currently works best with React Server Components. However, it shows great promise in simplifying data fetching workflows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepanda.online/blog/react-use-api-explained" rel="noopener noreferrer"&gt; Read Full Blog → &lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🚀 Introducing My Personal Tech Blog: CodePanda.online 📝</title>
      <dc:creator>Sheraz Manzoor</dc:creator>
      <pubDate>Sun, 16 Feb 2025 11:47:20 +0000</pubDate>
      <link>https://dev.to/sheraz4194/introducing-my-personal-tech-blog-codepandaonline-5pk</link>
      <guid>https://dev.to/sheraz4194/introducing-my-personal-tech-blog-codepandaonline-5pk</guid>
      <description>&lt;p&gt;Hey everyone! 👋&lt;/p&gt;

&lt;p&gt;I’m super excited to share that I’ve launched my personal blog website — CodePanda.online! It’s a space where I’ll be sharing my knowledge, experiences, and helpful tips for web developers and tech enthusiasts.&lt;/p&gt;

&lt;h2&gt;
  
  
  💻 What to Expect on CodePanda:
&lt;/h2&gt;

&lt;p&gt;✅ Hands-on tutorials for JavaScript, TypeScript, React, Next.js, and more.&lt;br&gt;
✅ Practical Tips &amp;amp; Tricks – Quick solutions to common coding challenges.&lt;br&gt;
✅ Insights from real-world projects I’ve worked on.&lt;br&gt;
✅ In-Depth Tutorials – Step-by-step guides on JavaScript, TypeScript, React, Next.js, and more.&lt;br&gt;
✅ Snippets and solutions you can use in your own apps.&lt;/p&gt;

&lt;p&gt;I created CodePanda to document my journey as a developer and help others by sharing what I learn along the way. Whether you're just starting out or already deep into your coding career, I hope my posts make your development life a little easier.&lt;/p&gt;

&lt;p&gt;🔗 Check it out here: &lt;a href="https://www.codepanda.online/" rel="noopener noreferrer"&gt;codepanda.online&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’d love for you to stop by, explore, and let me know what topics you’d like me to cover next! 🚀🔥&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>developers</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
