<?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: Abdul-Hammed Adeagbo</title>
    <description>The latest articles on DEV Community by Abdul-Hammed Adeagbo (@adeagboha).</description>
    <link>https://dev.to/adeagboha</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%2F4096619%2Fe3ca6023-d98e-47fa-b394-bc73a8946ac5.jpg</url>
      <title>DEV Community: Abdul-Hammed Adeagbo</title>
      <link>https://dev.to/adeagboha</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adeagboha"/>
    <language>en</language>
    <item>
      <title>Building for Businesses Means Building the Workflow, Not Just the Feature</title>
      <dc:creator>Abdul-Hammed Adeagbo</dc:creator>
      <pubDate>Mon, 21 Sep 2026 21:29:32 +0000</pubDate>
      <link>https://dev.to/adeagboha/building-for-businesses-means-building-the-workflow-not-just-the-feature-5a7k</link>
      <guid>https://dev.to/adeagboha/building-for-businesses-means-building-the-workflow-not-just-the-feature-5a7k</guid>
      <description>&lt;p&gt;When you build a consumer app, you can often start with a relatively simple question:&lt;/p&gt;

&lt;p&gt;Can the user do what they came here to do?&lt;/p&gt;

&lt;p&gt;With business software, that question is only the beginning.&lt;/p&gt;

&lt;p&gt;Can they do it?&lt;/p&gt;

&lt;p&gt;Who is allowed to do it?&lt;/p&gt;

&lt;p&gt;Who needs to approve it?&lt;/p&gt;

&lt;p&gt;What happens after they do it?&lt;/p&gt;

&lt;p&gt;Can someone else see it?&lt;/p&gt;

&lt;p&gt;What happens when the person who created it leaves the company?&lt;/p&gt;

&lt;p&gt;Can the business prove what happened three months later?&lt;/p&gt;

&lt;p&gt;Those questions change how you build software.&lt;/p&gt;

&lt;p&gt;I’ve been thinking about this a lot while building software for businesses, and one thing keeps becoming clearer:&lt;/p&gt;

&lt;p&gt;The feature is rarely the whole product. The workflow around the feature is the product.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A business doesn’t experience your features individually&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Suppose you’re building a quoting system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On paper, the feature list might look straightforward:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a quote&lt;/li&gt;
&lt;li&gt;Add products&lt;/li&gt;
&lt;li&gt;Set prices&lt;/li&gt;
&lt;li&gt;Send the quote&lt;/li&gt;
&lt;li&gt;Approve the quote&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You could build every one of those features and still have a poor product.&lt;/p&gt;

&lt;p&gt;Because the business doesn’t actually experience “Create Quote” as an isolated feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It experiences something more like:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Customer asks for a price → someone creates a quote → another person reviews it → customer receives it → customer accepts or rejects it → the business records what happened → the accepted quote becomes the basis for the next step.&lt;/p&gt;

&lt;p&gt;That is the actual product.&lt;/p&gt;

&lt;p&gt;The quote itself is only one piece of the workflow.&lt;/p&gt;

&lt;p&gt;This is one of the biggest differences I’ve noticed when thinking about business software.&lt;/p&gt;

&lt;p&gt;You aren’t just building screens. You’re modelling how work moves through an organization.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The happy path isn’t enough&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Consumer applications can sometimes get away with focusing heavily on the happy path.&lt;/p&gt;

&lt;p&gt;Business software can’t.&lt;/p&gt;

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

&lt;p&gt;A sales representative creates a quote.&lt;/p&gt;

&lt;p&gt;What if they aren’t allowed to approve their own quote?&lt;/p&gt;

&lt;p&gt;What if the customer asks for a change?&lt;/p&gt;

&lt;p&gt;What if the quote has already been approved?&lt;/p&gt;

&lt;p&gt;What if someone tries to edit it afterward?&lt;/p&gt;

&lt;p&gt;What if the employee who created it leaves the company?&lt;/p&gt;

&lt;p&gt;What if two people are working on the same customer?&lt;/p&gt;

&lt;p&gt;What if the wrong person receives the notification?&lt;/p&gt;

&lt;p&gt;None of these are exotic edge cases.&lt;/p&gt;

&lt;p&gt;They’re normal business situations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And they force you to think about things that aren’t immediately visible in the UI:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;permissions&lt;/li&gt;
&lt;li&gt;ownership&lt;/li&gt;
&lt;li&gt;account boundaries&lt;/li&gt;
&lt;li&gt;status transitions&lt;/li&gt;
&lt;li&gt;audit history&lt;/li&gt;
&lt;li&gt;notifications&lt;/li&gt;
&lt;li&gt;immutable records&lt;/li&gt;
&lt;li&gt;failure states&lt;/li&gt;
&lt;li&gt;data consistency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more important the workflow is to the business, the less acceptable it becomes to simply assume that users will behave correctly.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;State becomes part of the product&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is where business software gets particularly interesting for developers.&lt;/p&gt;

&lt;p&gt;A business object isn’t just data.&lt;/p&gt;

&lt;p&gt;It usually has a lifecycle.&lt;/p&gt;

&lt;p&gt;A quote might move through:&lt;/p&gt;

&lt;p&gt;Draft → Sent → Approved → Invoiced&lt;/p&gt;

&lt;p&gt;But what happens if someone tries to move it backwards?&lt;/p&gt;

&lt;p&gt;Can an approved quote become a draft again?&lt;/p&gt;

&lt;p&gt;Can an invoice be generated from a rejected quote?&lt;/p&gt;

&lt;p&gt;Can a user edit the price after approval?&lt;/p&gt;

&lt;p&gt;Can someone approve something they don’t own?&lt;/p&gt;

&lt;p&gt;These aren’t merely database questions.&lt;/p&gt;

&lt;p&gt;They’re product questions expressed through code.&lt;/p&gt;

&lt;p&gt;The database might store:&lt;/p&gt;

&lt;p&gt;status = "approved"&lt;/p&gt;

&lt;p&gt;But the application needs to understand what approved actually means.&lt;/p&gt;

&lt;p&gt;Once you start modelling these transitions explicitly, the architecture changes.&lt;/p&gt;

&lt;p&gt;Your API endpoints change.&lt;/p&gt;

&lt;p&gt;Your authorization rules change.&lt;/p&gt;

&lt;p&gt;Your tests change.&lt;/p&gt;

&lt;p&gt;Even your UI changes.&lt;/p&gt;

&lt;p&gt;The business workflow starts shaping the software instead of the other way around.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Permissions aren’t an afterthought&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One of the easiest mistakes when building business software is treating authentication as the security model.&lt;/p&gt;

&lt;p&gt;“Is this person logged in?”&lt;/p&gt;

&lt;p&gt;That’s important.&lt;/p&gt;

&lt;p&gt;But it’s only the first question.&lt;/p&gt;

&lt;p&gt;The more important questions are:&lt;/p&gt;

&lt;p&gt;Which business account are they operating within?&lt;/p&gt;

&lt;p&gt;What role do they have?&lt;/p&gt;

&lt;p&gt;What resources can they access?&lt;/p&gt;

&lt;p&gt;What actions can they perform?&lt;/p&gt;

&lt;p&gt;What happens when they belong to multiple accounts?&lt;/p&gt;

&lt;p&gt;For a business application, something as simple as:&lt;/p&gt;

&lt;p&gt;GET /quotes/123&lt;/p&gt;

&lt;p&gt;can hide a surprisingly important security decision.&lt;/p&gt;

&lt;p&gt;It’s not enough to determine whether the user is authenticated.&lt;/p&gt;

&lt;p&gt;The application needs to establish that the user is authorized to access that particular quote within that particular business context.&lt;/p&gt;

&lt;p&gt;This is why multi-tenant business applications can become complicated very quickly.&lt;/p&gt;

&lt;p&gt;The data isn’t just:&lt;/p&gt;

&lt;p&gt;User → Data&lt;/p&gt;

&lt;p&gt;It’s often:&lt;/p&gt;

&lt;p&gt;User → Membership → Account → Resource → Action&lt;/p&gt;

&lt;p&gt;And every link matters.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Business software needs memory&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Another difference is that businesses care about what happened yesterday.&lt;/p&gt;

&lt;p&gt;Sometimes they care about what happened six months ago.&lt;/p&gt;

&lt;p&gt;A consumer application can often focus primarily on the current state.&lt;/p&gt;

&lt;p&gt;A business application frequently needs both:&lt;/p&gt;

&lt;p&gt;What is the state now?&lt;/p&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;p&gt;How did we get here?&lt;/p&gt;

&lt;p&gt;Who created the document?&lt;/p&gt;

&lt;p&gt;Who changed it?&lt;/p&gt;

&lt;p&gt;When was it approved?&lt;/p&gt;

&lt;p&gt;Who approved it?&lt;/p&gt;

&lt;p&gt;Was the amount changed afterward?&lt;/p&gt;

&lt;p&gt;Was the customer notified?&lt;/p&gt;

&lt;p&gt;Was the invoice generated from the approved version?&lt;/p&gt;

&lt;p&gt;These questions become important when money, customers, employees, suppliers, or contractual commitments are involved.&lt;/p&gt;

&lt;p&gt;This is why auditability isn’t just an enterprise buzzword.&lt;/p&gt;

&lt;p&gt;It can be a practical part of the product.&lt;/p&gt;

&lt;p&gt;A good business system should make important events understandable after the fact.&lt;/p&gt;

&lt;p&gt;Not necessarily by logging every mouse click, but by preserving the events that matter to the workflow.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Don’t automate a workflow you don’t understand&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There’s a temptation when building software to automate everything as quickly as possible.&lt;/p&gt;

&lt;p&gt;That’s understandable.&lt;/p&gt;

&lt;p&gt;Automation feels like progress.&lt;/p&gt;

&lt;p&gt;But automating a bad understanding of a business process can make the problem worse.&lt;/p&gt;

&lt;p&gt;If you don’t understand why someone manually checks a document before approving it, removing that step might not be an improvement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maybe the manual check exists because:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prices change frequently&lt;/li&gt;
&lt;li&gt;a second person needs to verify margins&lt;/li&gt;
&lt;li&gt;certain customers have special terms&lt;/li&gt;
&lt;li&gt;the business needs two-person approval&lt;/li&gt;
&lt;li&gt;mistakes are expensive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Before automating a manual process, I think it’s worth asking:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why is this step manual?&lt;/p&gt;

&lt;p&gt;Sometimes the answer reveals the actual requirement.&lt;/p&gt;

&lt;p&gt;The goal isn’t to reproduce every existing manual action in software.&lt;/p&gt;

&lt;p&gt;The goal is to understand the reason behind the action and then decide whether software can improve it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build around consequences&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The biggest mental shift for me is this:&lt;/p&gt;

&lt;p&gt;Business software should be designed around consequences, not just actions.&lt;/p&gt;

&lt;p&gt;“Create quote” sounds simple.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But creating that quote may affect:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what the customer sees&lt;/li&gt;
&lt;li&gt;what the sales team can do&lt;/li&gt;
&lt;li&gt;what the accounting team expects&lt;/li&gt;
&lt;li&gt;what notifications are sent&lt;/li&gt;
&lt;li&gt;what records exist&lt;/li&gt;
&lt;li&gt;what can happen next&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same is true for almost every important action.&lt;/p&gt;

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

&lt;p&gt;What should this button do?&lt;/p&gt;

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

&lt;p&gt;What does this action mean to the business?&lt;/p&gt;

&lt;p&gt;Then work backward.&lt;/p&gt;

&lt;p&gt;What state should change?&lt;/p&gt;

&lt;p&gt;Who should be allowed to trigger it?&lt;/p&gt;

&lt;p&gt;Who should know about it?&lt;/p&gt;

&lt;p&gt;What should become impossible afterward?&lt;/p&gt;

&lt;p&gt;What should be recorded?&lt;/p&gt;

&lt;p&gt;What happens if the operation fails halfway through?&lt;/p&gt;

&lt;p&gt;Those questions produce much better software.&lt;/p&gt;

&lt;p&gt;A practical way to approach it&lt;/p&gt;

&lt;p&gt;If you’re building a product for businesses, before writing another feature, try mapping one real workflow on paper.&lt;/p&gt;

&lt;p&gt;**&lt;/p&gt;

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

&lt;p&gt;**&lt;/p&gt;

&lt;p&gt;Customer request&lt;br&gt;
       ↓&lt;br&gt;
Create quote&lt;br&gt;
       ↓&lt;br&gt;
Internal review&lt;br&gt;
       ↓&lt;br&gt;
Send to customer&lt;br&gt;
       ↓&lt;br&gt;
Customer decision&lt;br&gt;
    ↙       ↘&lt;br&gt;
Rejected   Approved&lt;br&gt;
              ↓&lt;br&gt;
           Invoice&lt;br&gt;
              ↓&lt;br&gt;
           Payment&lt;/p&gt;

&lt;p&gt;Then ask five questions at every step:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Who can perform this action?&lt;/li&gt;
&lt;li&gt;What state changes?&lt;/li&gt;
&lt;li&gt;Who needs to know?&lt;/li&gt;
&lt;li&gt;What should be recorded?&lt;/li&gt;
&lt;li&gt;What can go wrong?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You don’t need an enormous architecture document.&lt;/p&gt;

&lt;p&gt;You just need to understand the workflow before you turn it into endpoints, database tables, and buttons.&lt;/p&gt;

&lt;p&gt;Because when you’re building for businesses, the difficult part usually isn’t making the feature work.&lt;/p&gt;

&lt;p&gt;It’s making the feature work inside the reality of the business.&lt;/p&gt;

&lt;p&gt;And that’s where the real product starts.&lt;/p&gt;

</description>
      <category>product</category>
      <category>saas</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Abdul-Hammed Adeagbo</dc:creator>
      <pubDate>Sun, 20 Sep 2026 08:40:58 +0000</pubDate>
      <link>https://dev.to/adeagboha/-2mac</link>
      <guid>https://dev.to/adeagboha/-2mac</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/james_anderson_h/gemini-hacked-three-companies-using-the-dumbest-trick-in-the-book-2ddj" class="crayons-story__hidden-navigation-link"&gt;Gemini Hacked Three Companies Using the Dumbest Trick in the Book&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="/james_anderson_h" 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%2F3968038%2Fe70ff7fe-85b0-4c3a-8a68-b2269cd108b7.png" alt="james_anderson_h profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/james_anderson_h" class="crayons-story__secondary fw-medium m:hidden"&gt;
              James Anderson
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                James Anderson
                
                
              
              &lt;div id="story-author-preview-content-4697998" 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="/james_anderson_h" 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%2F3968038%2Fe70ff7fe-85b0-4c3a-8a68-b2269cd108b7.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;James Anderson&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/james_anderson_h/gemini-hacked-three-companies-using-the-dumbest-trick-in-the-book-2ddj" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 20&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/james_anderson_h/gemini-hacked-three-companies-using-the-dumbest-trick-in-the-book-2ddj" id="article-link-4697998"&gt;
          Gemini Hacked Three Companies Using the Dumbest Trick in the Book
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/agents"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;agents&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&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;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/james_anderson_h/gemini-hacked-three-companies-using-the-dumbest-trick-in-the-book-2ddj" 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/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/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/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;21&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/james_anderson_h/gemini-hacked-three-companies-using-the-dumbest-trick-in-the-book-2ddj#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              11&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;
            6 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>The Hardest Part of Building Software Isn’t Writing Code</title>
      <dc:creator>Abdul-Hammed Adeagbo</dc:creator>
      <pubDate>Sat, 19 Sep 2026 19:25:40 +0000</pubDate>
      <link>https://dev.to/adeagboha/the-hardest-part-of-building-software-isnt-writing-code-cka</link>
      <guid>https://dev.to/adeagboha/the-hardest-part-of-building-software-isnt-writing-code-cka</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faihcjo0e1ipd5318keje.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faihcjo0e1ipd5318keje.jpeg" alt=" " width="798" height="350"&gt;&lt;/a&gt;I used to think becoming a better developer meant learning more technologies.&lt;/p&gt;

&lt;p&gt;React.&lt;/p&gt;

&lt;p&gt;Node.js.&lt;/p&gt;

&lt;p&gt;PostgreSQL.&lt;/p&gt;

&lt;p&gt;Docker.&lt;/p&gt;

&lt;p&gt;Cloud.&lt;/p&gt;

&lt;p&gt;TypeScript.&lt;/p&gt;

&lt;p&gt;Another framework.&lt;/p&gt;

&lt;p&gt;Another library.&lt;/p&gt;

&lt;p&gt;Another tool.&lt;/p&gt;

&lt;p&gt;Then I started building actual software.&lt;/p&gt;

&lt;p&gt;And I realized something:&lt;/p&gt;

&lt;p&gt;The hardest part isn’t writing the code.&lt;/p&gt;

&lt;p&gt;It’s figuring out what the code should actually do.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Tutorials don’t prepare you for the messy part&lt;/p&gt;

&lt;p&gt;A tutorial can show you how to build authentication.&lt;/p&gt;

&lt;p&gt;Create a user.&lt;/p&gt;

&lt;p&gt;Hash the password.&lt;/p&gt;

&lt;p&gt;Create a session.&lt;/p&gt;

&lt;p&gt;Set a cookie.&lt;/p&gt;

&lt;p&gt;Return the user.&lt;/p&gt;

&lt;p&gt;Done.&lt;/p&gt;

&lt;p&gt;But a real application immediately asks you a completely different set of questions.&lt;/p&gt;

&lt;p&gt;What account does this user belong to?&lt;/p&gt;

&lt;p&gt;What if they belong to multiple accounts?&lt;/p&gt;

&lt;p&gt;Can they access another company’s data?&lt;/p&gt;

&lt;p&gt;What happens when their session expires?&lt;/p&gt;

&lt;p&gt;What happens when the database is unavailable?&lt;/p&gt;

&lt;p&gt;What happens when the same request is sent twice?&lt;/p&gt;

&lt;p&gt;What should the API return when something goes wrong?&lt;/p&gt;

&lt;p&gt;Suddenly, you’re no longer just writing code.&lt;/p&gt;

&lt;p&gt;You’re designing a system.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Software development is mostly decisions&lt;/p&gt;

&lt;p&gt;The more I build, the more I realize that development is basically a long chain of decisions.&lt;/p&gt;

&lt;p&gt;Should this logic live in the frontend or backend?&lt;/p&gt;

&lt;p&gt;Should this be a separate service?&lt;/p&gt;

&lt;p&gt;Do I actually need another dependency?&lt;/p&gt;

&lt;p&gt;Should I refactor this now or keep moving?&lt;/p&gt;

&lt;p&gt;Should this data be stored permanently?&lt;/p&gt;

&lt;p&gt;What happens if this component fails?&lt;/p&gt;

&lt;p&gt;Will this decision still make sense six months from now?&lt;/p&gt;

&lt;p&gt;There isn’t always a perfect answer.&lt;/p&gt;

&lt;p&gt;Sometimes you’re simply choosing the trade-off you understand best.&lt;/p&gt;

&lt;p&gt;And that’s a very different skill from knowing syntax.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;A great stack doesn’t automatically create great software&lt;/p&gt;

&lt;p&gt;You can have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Prisma&lt;/li&gt;
&lt;li&gt;Supabase&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;Vercel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…and still build a badly designed application.&lt;/p&gt;

&lt;p&gt;The technology isn’t the architecture.&lt;/p&gt;

&lt;p&gt;The technology isn’t the business logic.&lt;/p&gt;

&lt;p&gt;The technology isn’t the security model.&lt;/p&gt;

&lt;p&gt;The technology is a set of tools.&lt;/p&gt;

&lt;p&gt;What matters is whether you understand how the pieces fit together.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Sometimes the bug isn’t in the code&lt;/p&gt;

&lt;p&gt;This has probably been one of the most important lessons for me.&lt;/p&gt;

&lt;p&gt;Something can be “broken” even when the individual pieces of code look perfectly reasonable.&lt;/p&gt;

&lt;p&gt;Maybe the frontend expects one response while the API returns another.&lt;/p&gt;

&lt;p&gt;Maybe authentication works locally but behaves differently in production.&lt;/p&gt;

&lt;p&gt;Maybe the database schema technically works but doesn’t represent the actual business relationship.&lt;/p&gt;

&lt;p&gt;Maybe the feature itself was poorly defined.&lt;/p&gt;

&lt;p&gt;So debugging isn’t always:&lt;/p&gt;

&lt;p&gt;“Find the broken line.”&lt;/p&gt;

&lt;p&gt;Sometimes it’s:&lt;/p&gt;

&lt;p&gt;“Find the broken assumption.”&lt;/p&gt;

&lt;p&gt;And that requires understanding the system.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;This is changing how I learn&lt;/p&gt;

&lt;p&gt;I’m still learning technologies.&lt;/p&gt;

&lt;p&gt;But I’m trying to learn them through problems, not just tutorials.&lt;/p&gt;

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

&lt;p&gt;“How do I learn Prisma?”&lt;/p&gt;

&lt;p&gt;I’m more interested in:&lt;/p&gt;

&lt;p&gt;“How should my application model this relationship, and how can Prisma help me implement it?”&lt;/p&gt;

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

&lt;p&gt;“How do I use authentication?”&lt;/p&gt;

&lt;p&gt;I’d rather ask:&lt;/p&gt;

&lt;p&gt;“How should identity and access work across this application?”&lt;/p&gt;

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

&lt;p&gt;“How do I deploy Next.js?”&lt;/p&gt;

&lt;p&gt;I’d ask:&lt;/p&gt;

&lt;p&gt;“What does this application need in production that it doesn’t need locally?”&lt;/p&gt;

&lt;p&gt;The technology becomes the tool.&lt;/p&gt;

&lt;p&gt;The problem becomes the thing I’m actually trying to understand.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;I don’t want to know 47 tools&lt;/p&gt;

&lt;p&gt;I don’t want my definition of being a good developer to be:&lt;/p&gt;

&lt;p&gt;“I know more frameworks than you.”&lt;/p&gt;

&lt;p&gt;I’d rather become the person who can look at a complicated system and ask the right questions.&lt;/p&gt;

&lt;p&gt;Where does this data come from?&lt;/p&gt;

&lt;p&gt;Who is allowed to access it?&lt;/p&gt;

&lt;p&gt;What happens when this service fails?&lt;/p&gt;

&lt;p&gt;Where should this logic live?&lt;/p&gt;

&lt;p&gt;What happens when the user does something unexpected?&lt;/p&gt;

&lt;p&gt;How does this feature affect the rest of the system?&lt;/p&gt;

&lt;p&gt;What will become painful six months from now?&lt;/p&gt;

&lt;p&gt;Those questions interest me much more now.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;The real milestone isn’t “I learned the framework”&lt;/p&gt;

&lt;p&gt;For me, the bigger milestone is being able to take an idea and gradually turn it into a working system.&lt;/p&gt;

&lt;p&gt;Idea → workflow → data → API → frontend → authentication → deployment → bugs → debugging → improvement.&lt;/p&gt;

&lt;p&gt;Then do it again.&lt;/p&gt;

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

&lt;p&gt;That’s where the learning starts becoming real.&lt;/p&gt;

&lt;p&gt;Because eventually, you’re not just learning how to write code.&lt;/p&gt;

&lt;p&gt;You’re learning how to think in systems.&lt;/p&gt;

&lt;p&gt;And honestly, that’s the kind of engineer I’m trying to become.&lt;/p&gt;

&lt;p&gt;Not someone who knows every tool.&lt;/p&gt;

&lt;p&gt;Someone who understands enough to build, debug, and improve complicated things.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;What has been the biggest difference between learning to code and actually building software for you?&lt;/p&gt;

&lt;h1&gt;
  
  
  webdev #programming #softwaredevelopment #javascript #nextjs #backend
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
