<?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: Ayman Atif</title>
    <description>The latest articles on DEV Community by Ayman Atif (@a95yman).</description>
    <link>https://dev.to/a95yman</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%2F3887349%2F44f7eb73-8509-408e-94a4-f2d98502a27d.jpg</url>
      <title>DEV Community: Ayman Atif</title>
      <link>https://dev.to/a95yman</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/a95yman"/>
    <language>en</language>
    <item>
      <title>Ayman Atif: How I Build Software Around Business Problems</title>
      <dc:creator>Ayman Atif</dc:creator>
      <pubDate>Tue, 08 Sep 2026 17:17:03 +0000</pubDate>
      <link>https://dev.to/a95yman/ayman-atif-how-i-build-software-around-business-problems-359g</link>
      <guid>https://dev.to/a95yman/ayman-atif-how-i-build-software-around-business-problems-359g</guid>
      <description>&lt;p&gt;I'm &lt;strong&gt;Ayman Atif&lt;/strong&gt;, a freelance .NET and Python software engineer.&lt;/p&gt;

&lt;p&gt;I've been building software since 2014, and over the years I've learned something that changed how I approach development:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Businesses don't really need more code. They need their problems solved.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A company rarely says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We need an ASP.NET Core API.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They usually say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We're still doing this manually in Excel.”&lt;/p&gt;

&lt;p&gt;“Our application has become painfully slow.”&lt;/p&gt;

&lt;p&gt;“Nobody understands this old codebase anymore.”&lt;/p&gt;

&lt;p&gt;“Every change seems to break something else.”&lt;/p&gt;

&lt;p&gt;“We need to automate this process.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those are the problems I enjoy solving.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I do as a freelance software engineer
&lt;/h2&gt;

&lt;p&gt;My work focuses on &lt;strong&gt;business software development, .NET development, Python development, and business process automation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I work with businesses that need someone who can understand the problem, plan the solution, build it, and stay involved after deployment.&lt;/p&gt;

&lt;p&gt;That can mean building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business web applications&lt;/li&gt;
&lt;li&gt;Backend systems and APIs&lt;/li&gt;
&lt;li&gt;Internal tools&lt;/li&gt;
&lt;li&gt;Dashboards&lt;/li&gt;
&lt;li&gt;Automation systems&lt;/li&gt;
&lt;li&gt;Data processing pipelines&lt;/li&gt;
&lt;li&gt;Document workflows&lt;/li&gt;
&lt;li&gt;PDF and Excel processing&lt;/li&gt;
&lt;li&gt;Database-driven applications&lt;/li&gt;
&lt;li&gt;Existing software improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My main technologies include &lt;strong&gt;C#, .NET, ASP.NET Core, Python, Flask, Django, SQL, JavaScript, and REST APIs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But technology is usually not where the project starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  I start with the business problem
&lt;/h2&gt;

&lt;p&gt;One thing I've become increasingly deliberate about is avoiding the temptation to code immediately.&lt;/p&gt;

&lt;p&gt;Before writing the first feature, I want to understand:&lt;/p&gt;

&lt;p&gt;What is the business trying to accomplish?&lt;/p&gt;

&lt;p&gt;Who uses the system?&lt;/p&gt;

&lt;p&gt;What is currently taking too much time?&lt;/p&gt;

&lt;p&gt;Where do mistakes happen?&lt;/p&gt;

&lt;p&gt;What happens when something goes wrong?&lt;/p&gt;

&lt;p&gt;Which parts of the existing system actually need to change?&lt;/p&gt;

&lt;p&gt;And perhaps most importantly:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What problem are we really trying to solve?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes the answer is a new application.&lt;/p&gt;

&lt;p&gt;Sometimes it's an automation workflow.&lt;/p&gt;

&lt;p&gt;Sometimes it's a database optimization.&lt;/p&gt;

&lt;p&gt;Sometimes it's a relatively small change to an existing system.&lt;/p&gt;

&lt;p&gt;And sometimes the right answer is &lt;strong&gt;not&lt;/strong&gt; a rewrite.&lt;/p&gt;

&lt;p&gt;That's an important distinction when you're working on production software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building business software is different from building a demo
&lt;/h2&gt;

&lt;p&gt;A demo can work perfectly with three records.&lt;/p&gt;

&lt;p&gt;Production software has to deal with reality.&lt;/p&gt;

&lt;p&gt;Users make unexpected decisions.&lt;/p&gt;

&lt;p&gt;Data is messy.&lt;/p&gt;

&lt;p&gt;Imports are imperfect.&lt;/p&gt;

&lt;p&gt;Multiple people can modify the same information.&lt;/p&gt;

&lt;p&gt;Servers have limited resources.&lt;/p&gt;

&lt;p&gt;Requirements change.&lt;/p&gt;

&lt;p&gt;And suddenly a feature that looked simple on paper becomes an engineering problem.&lt;/p&gt;

&lt;p&gt;I've worked on production business software involving financial analysis, document generation, confidential information, controlled sharing, spreadsheet and PDF processing, imports, exports, and complex business workflows.&lt;/p&gt;

&lt;p&gt;The interesting engineering wasn't simply choosing a framework.&lt;/p&gt;

&lt;p&gt;It was making the system &lt;strong&gt;reliable when things stopped being simple&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real example: improving an existing business system
&lt;/h2&gt;

&lt;p&gt;One production platform I worked on combined financial analysis, document drafting, sharing, exports, and deal workflows.&lt;/p&gt;

&lt;p&gt;It had been built for real business use and continued evolving for years.&lt;/p&gt;

&lt;p&gt;That meant dealing with things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Legacy imports&lt;/li&gt;
&lt;li&gt;Shared document state&lt;/li&gt;
&lt;li&gt;Permission-aware workflows&lt;/li&gt;
&lt;li&gt;PDF generation&lt;/li&gt;
&lt;li&gt;Spreadsheet processing&lt;/li&gt;
&lt;li&gt;Print-ready documents&lt;/li&gt;
&lt;li&gt;Performance constraints&lt;/li&gt;
&lt;li&gt;Database access&lt;/li&gt;
&lt;li&gt;Production deployment&lt;/li&gt;
&lt;li&gt;Ongoing maintenance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At one point, limited server resources exposed performance problems that weren't obvious from looking at individual features.&lt;/p&gt;

&lt;p&gt;The solution wasn't simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Buy a bigger server.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The system needed to be understood as a whole.&lt;/p&gt;

&lt;p&gt;Application behavior, concurrency, data access, architecture, and infrastructure all mattered.&lt;/p&gt;

&lt;p&gt;That's the kind of problem I like working on.&lt;/p&gt;

&lt;h2&gt;
  
  
  I also build automation
&lt;/h2&gt;

&lt;p&gt;Another area I focus on is &lt;strong&gt;business process automation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A surprising amount of business work still looks like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spreadsheet → copy/paste → email → another spreadsheet → manual verification → repeat&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is a good candidate for automation.&lt;/p&gt;

&lt;p&gt;For example, I built &lt;strong&gt;InvoiceFlow&lt;/strong&gt;, a Python toolkit that converts PDF invoices into structured invoice data and clean Excel workbooks.&lt;/p&gt;

&lt;p&gt;The workflow is straightforward:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PDF invoices → extraction → structured data → Excel&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But reliable automation requires more than making the happy path work.&lt;/p&gt;

&lt;p&gt;You need validation.&lt;/p&gt;

&lt;p&gt;You need error handling.&lt;/p&gt;

&lt;p&gt;You need logging.&lt;/p&gt;

&lt;p&gt;You need to think about larger workloads.&lt;/p&gt;

&lt;p&gt;You need predictable output.&lt;/p&gt;

&lt;p&gt;And you need a system that another developer can understand six months later.&lt;/p&gt;

&lt;p&gt;That's why I think good automation is less about “using Python” and more about &lt;strong&gt;turning a messy manual process into a repeatable system people can trust&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  My approach to software projects
&lt;/h2&gt;

&lt;p&gt;My process is deliberately simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discuss → Challenge → Plan → Build → Deploy → Maintain&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First, I understand the business problem.&lt;/p&gt;

&lt;p&gt;Then I challenge assumptions where necessary.&lt;/p&gt;

&lt;p&gt;Then we agree on the architecture, workflow, scope, and tradeoffs.&lt;/p&gt;

&lt;p&gt;Then I build.&lt;/p&gt;

&lt;p&gt;After that, I deploy the system and remain available for improvements and maintenance.&lt;/p&gt;

&lt;p&gt;I prefer this approach because software decisions compound.&lt;/p&gt;

&lt;p&gt;A shortcut that saves two hours today can create weeks of maintenance six months later.&lt;/p&gt;

&lt;p&gt;Likewise, spending time understanding the problem before coding can prevent an entire feature from being built in the wrong direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why work with me?
&lt;/h2&gt;

&lt;p&gt;I'm not trying to position myself as someone who knows every new framework.&lt;/p&gt;

&lt;p&gt;My value is elsewhere.&lt;/p&gt;

&lt;p&gt;I can take a business problem, break it down, understand the technical constraints, and turn it into software that can actually be used.&lt;/p&gt;

&lt;p&gt;I can work on a new application.&lt;/p&gt;

&lt;p&gt;I can join an existing codebase.&lt;/p&gt;

&lt;p&gt;I can investigate a performance problem.&lt;/p&gt;

&lt;p&gt;I can automate a repetitive workflow.&lt;/p&gt;

&lt;p&gt;I can help modernize software that has become difficult to maintain.&lt;/p&gt;

&lt;p&gt;And I can stay involved after the initial build.&lt;/p&gt;

&lt;p&gt;Most importantly, &lt;strong&gt;you work directly with me&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No unnecessary layers between the business problem and the engineer doing the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking for a freelance software engineer?
&lt;/h2&gt;

&lt;p&gt;I'm &lt;strong&gt;Ayman Atif&lt;/strong&gt;, a freelance &lt;strong&gt;.NET and Python software engineer available for remote work worldwide&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If your business has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a manual process that should be automated,&lt;/li&gt;
&lt;li&gt;an application that has become difficult to maintain,&lt;/li&gt;
&lt;li&gt;a slow backend,&lt;/li&gt;
&lt;li&gt;a business idea that needs a technical plan,&lt;/li&gt;
&lt;li&gt;or software that needs to be built from scratch,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd be happy to discuss it.&lt;/p&gt;

&lt;p&gt;You can see my projects, services, engineering approach, and production experience here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://ayman-atif.vercel.app/" rel="noopener noreferrer"&gt;Ayman Atif — Freelance .NET &amp;amp; Python Software Engineer&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you have a software problem that you've been putting off because it looks complicated, &lt;strong&gt;let's talk about it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;— &lt;strong&gt;Ayman Atif&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>python</category>
      <category>softwareengineering</category>
      <category>freelance</category>
    </item>
    <item>
      <title>I Built a $1,500 Dashboard. I Learned a Lesson Worth More Than $1,500.</title>
      <dc:creator>Ayman Atif</dc:creator>
      <pubDate>Mon, 07 Sep 2026 14:12:54 +0000</pubDate>
      <link>https://dev.to/a95yman/i-built-a-1500-dashboard-i-learned-a-lesson-worth-more-than-1500-42n</link>
      <guid>https://dev.to/a95yman/i-built-a-1500-dashboard-i-learned-a-lesson-worth-more-than-1500-42n</guid>
      <description>&lt;p&gt;Three months.&lt;/p&gt;

&lt;p&gt;One client.&lt;/p&gt;

&lt;p&gt;A complete agency dashboard.&lt;/p&gt;

&lt;p&gt;And $200 paid out of an agreed $1,500.&lt;/p&gt;

&lt;p&gt;I didn't lose those three months because the project was technically difficult.&lt;/p&gt;

&lt;p&gt;I lost them because I approached freelancing like a developer instead of a business owner.&lt;/p&gt;

&lt;p&gt;There was no signed contract.&lt;/p&gt;

&lt;p&gt;There was no clearly documented payment schedule.&lt;/p&gt;

&lt;p&gt;And when the project was finished, I didn't push for the remaining balance.&lt;/p&gt;

&lt;p&gt;I simply moved on.&lt;/p&gt;

&lt;p&gt;A year later, I still haven't received it.&lt;/p&gt;

&lt;p&gt;Surprisingly, I'm not writing this article because I'm angry about it.&lt;/p&gt;

&lt;p&gt;I'm writing it because the experience changed how I approach freelance web development.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Project
&lt;/h2&gt;

&lt;p&gt;The client ran an agency and wanted an internal dashboard to make some of their day-to-day work easier to manage.&lt;/p&gt;

&lt;p&gt;The project involved several areas of their business.&lt;/p&gt;

&lt;p&gt;There was client management.&lt;/p&gt;

&lt;p&gt;There was blog management.&lt;/p&gt;

&lt;p&gt;There was work related to SEO.&lt;/p&gt;

&lt;p&gt;And there was the usual collection of smaller workflows that appear once you start building software around an actual business.&lt;/p&gt;

&lt;p&gt;We agreed on a price of $1,500.&lt;/p&gt;

&lt;p&gt;I received $200 upfront.&lt;/p&gt;

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

&lt;p&gt;From a development perspective, this was the kind of project I enjoyed.&lt;/p&gt;

&lt;p&gt;It wasn't just a landing page or a simple CRUD application.&lt;/p&gt;

&lt;p&gt;The software had to reflect how the agency actually worked.&lt;/p&gt;

&lt;p&gt;That meant understanding their workflow, translating it into features, building the dashboard, adjusting things along the way, and making the application useful for the people who would actually use it.&lt;/p&gt;

&lt;p&gt;So I kept going.&lt;/p&gt;

&lt;p&gt;And I kept improving it.&lt;/p&gt;

&lt;p&gt;For roughly three months, I worked on the project.&lt;/p&gt;

&lt;p&gt;Eventually, the work was finished.&lt;/p&gt;

&lt;p&gt;The application existed.&lt;/p&gt;

&lt;p&gt;The features were there.&lt;/p&gt;

&lt;p&gt;The client had what we had discussed.&lt;/p&gt;

&lt;p&gt;But there was still one problem.&lt;/p&gt;

&lt;p&gt;The remaining $1,300 never arrived.&lt;/p&gt;

&lt;h2&gt;
  
  
  I Was Too Easygoing About It
&lt;/h2&gt;

&lt;p&gt;This is the part where I could simply blame the client.&lt;/p&gt;

&lt;p&gt;But that wouldn't tell the whole story.&lt;/p&gt;

&lt;p&gt;The client was responsible for paying the agreed amount.&lt;/p&gt;

&lt;p&gt;I was also responsible for how I handled the business side of the project.&lt;/p&gt;

&lt;p&gt;I didn't sign a contract.&lt;/p&gt;

&lt;p&gt;I didn't establish a formal payment schedule.&lt;/p&gt;

&lt;p&gt;I didn't clearly define what would happen if payment was delayed.&lt;/p&gt;

&lt;p&gt;And perhaps most importantly, I didn't make payment a condition of continuing the work.&lt;/p&gt;

&lt;p&gt;I was focused on building the software.&lt;/p&gt;

&lt;p&gt;I thought:&lt;/p&gt;

&lt;p&gt;"Let's get the project done."&lt;/p&gt;

&lt;p&gt;That mindset is useful when you're trying to be a reliable developer.&lt;/p&gt;

&lt;p&gt;It's not enough when you're running a freelance business.&lt;/p&gt;

&lt;p&gt;Being easy to work with is good.&lt;/p&gt;

&lt;p&gt;Being so easygoing that important business details become vague is not.&lt;/p&gt;

&lt;p&gt;That's a distinction I didn't fully understand at the time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Developer Mindset vs. The Business Mindset
&lt;/h2&gt;

&lt;p&gt;As developers, we're trained to think in terms of problems.&lt;/p&gt;

&lt;p&gt;A client has a problem.&lt;/p&gt;

&lt;p&gt;We come up with a solution.&lt;/p&gt;

&lt;p&gt;We build it.&lt;/p&gt;

&lt;p&gt;We test it.&lt;/p&gt;

&lt;p&gt;We fix bugs.&lt;/p&gt;

&lt;p&gt;We deliver it.&lt;/p&gt;

&lt;p&gt;That's the part we naturally focus on.&lt;/p&gt;

&lt;p&gt;But freelance development has another layer.&lt;/p&gt;

&lt;p&gt;There is scope.&lt;/p&gt;

&lt;p&gt;There are milestones.&lt;/p&gt;

&lt;p&gt;There are payments.&lt;/p&gt;

&lt;p&gt;There are approvals.&lt;/p&gt;

&lt;p&gt;There are deadlines.&lt;/p&gt;

&lt;p&gt;There are responsibilities on both sides.&lt;/p&gt;

&lt;p&gt;None of these have much to do with whether you can write good code.&lt;/p&gt;

&lt;p&gt;But they can determine whether a freelance project is actually successful.&lt;/p&gt;

&lt;p&gt;That was the counterintuitive part for me.&lt;/p&gt;

&lt;p&gt;I used to think that being professional mostly meant doing excellent work and being dependable.&lt;/p&gt;

&lt;p&gt;It does.&lt;/p&gt;

&lt;p&gt;But professionalism also means making expectations clear.&lt;/p&gt;

&lt;h2&gt;
  
  
  I Didn't Need a Complicated System
&lt;/h2&gt;

&lt;p&gt;Looking back, I didn't need some sophisticated legal or financial system.&lt;/p&gt;

&lt;p&gt;I needed basic structure.&lt;/p&gt;

&lt;p&gt;Before starting the project, I should have had a written agreement covering things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What exactly I was building&lt;/li&gt;
&lt;li&gt;What was outside the scope&lt;/li&gt;
&lt;li&gt;The total project price&lt;/li&gt;
&lt;li&gt;The payment schedule&lt;/li&gt;
&lt;li&gt;What the upfront payment covered&lt;/li&gt;
&lt;li&gt;When the remaining balance was due&lt;/li&gt;
&lt;li&gt;How additional work would be handled&lt;/li&gt;
&lt;li&gt;What happened if the project was paused&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this has to make a client relationship cold or transactional.&lt;/p&gt;

&lt;p&gt;In fact, I think the opposite is true.&lt;/p&gt;

&lt;p&gt;Clear expectations make collaboration easier.&lt;/p&gt;

&lt;p&gt;When both sides know what they agreed to, there's less room for confusion later.&lt;/p&gt;

&lt;h2&gt;
  
  
  The $200 Changed How I Look at Upfront Payments
&lt;/h2&gt;

&lt;p&gt;The $200 upfront payment was important for another reason.&lt;/p&gt;

&lt;p&gt;It showed that the client was willing to invest in the project.&lt;/p&gt;

&lt;p&gt;But it wasn't enough to protect me from continuing too far without another payment milestone.&lt;/p&gt;

&lt;p&gt;If I were handling the same project today, I would structure the payments around the work.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Initial payment → project begins&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Milestone payment → major functionality completed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final payment → final delivery&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The exact percentages aren't the important part.&lt;/p&gt;

&lt;p&gt;The principle is.&lt;/p&gt;

&lt;p&gt;Don't let the entire financial risk sit on one side of the relationship.&lt;/p&gt;

&lt;h2&gt;
  
  
  I Also Learned Not to Confuse Kindness With Avoiding Difficult Conversations
&lt;/h2&gt;

&lt;p&gt;This was probably the hardest lesson.&lt;/p&gt;

&lt;p&gt;I didn't confront the situation.&lt;/p&gt;

&lt;p&gt;Not because I thought the remaining payment was unimportant.&lt;/p&gt;

&lt;p&gt;I just didn't want to create conflict.&lt;/p&gt;

&lt;p&gt;So I stayed quiet.&lt;/p&gt;

&lt;p&gt;Eventually, enough time passed that I stopped thinking about it.&lt;/p&gt;

&lt;p&gt;A year later, the project is simply something I remember as an expensive lesson.&lt;/p&gt;

&lt;p&gt;And honestly, I'm okay with that.&lt;/p&gt;

&lt;p&gt;I would rather take the lesson than keep resentment over the money.&lt;/p&gt;

&lt;p&gt;But if I could go back, I would handle the conversation differently.&lt;/p&gt;

&lt;p&gt;Being respectful doesn't mean avoiding uncomfortable conversations.&lt;/p&gt;

&lt;p&gt;You can be polite and still be assertive.&lt;/p&gt;

&lt;p&gt;You can value the relationship and still set a boundary.&lt;/p&gt;

&lt;p&gt;You can be flexible without making the agreement one-sided.&lt;/p&gt;

&lt;p&gt;That's something I understand much better now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Project Still Taught Me Something Technically
&lt;/h2&gt;

&lt;p&gt;It's easy to focus on the unpaid balance and forget the actual development experience.&lt;/p&gt;

&lt;p&gt;But the project itself was valuable.&lt;/p&gt;

&lt;p&gt;I got to work closely with an agency and build software around its internal workflow.&lt;/p&gt;

&lt;p&gt;I worked on client management.&lt;/p&gt;

&lt;p&gt;I worked on content and blog-related functionality.&lt;/p&gt;

&lt;p&gt;I was involved in SEO-related work.&lt;/p&gt;

&lt;p&gt;And I learned more about how businesses actually use software than I would have from another isolated personal project.&lt;/p&gt;

&lt;p&gt;That's one reason I don't consider those three months completely wasted.&lt;/p&gt;

&lt;p&gt;The money was never recovered.&lt;/p&gt;

&lt;p&gt;The experience was.&lt;/p&gt;

&lt;p&gt;And I still use what I learned from it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd Do Differently Today
&lt;/h2&gt;

&lt;p&gt;If I started the same project today, my approach would be different.&lt;/p&gt;

&lt;p&gt;I'd still listen carefully to the client.&lt;/p&gt;

&lt;p&gt;I'd still try to understand the business before writing the first feature.&lt;/p&gt;

&lt;p&gt;I'd still go out of my way to make the software useful.&lt;/p&gt;

&lt;p&gt;But I'd also make the business side explicit from the beginning.&lt;/p&gt;

&lt;p&gt;I'd document the scope.&lt;/p&gt;

&lt;p&gt;I'd agree on milestones.&lt;/p&gt;

&lt;p&gt;I'd use written communication for important decisions.&lt;/p&gt;

&lt;p&gt;I'd make payment expectations clear.&lt;/p&gt;

&lt;p&gt;And I'd stop treating conversations about money as something separate from professionalism.&lt;/p&gt;

&lt;p&gt;Because they're not.&lt;/p&gt;

&lt;p&gt;If you're providing a professional service, getting paid is part of the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lesson Was Worth More Than $1,500
&lt;/h2&gt;

&lt;p&gt;I didn't get the remaining $1,300.&lt;/p&gt;

&lt;p&gt;I can't go back and change that.&lt;/p&gt;

&lt;p&gt;But I can make sure I don't repeat the same mistake.&lt;/p&gt;

&lt;p&gt;The biggest lesson wasn't "don't trust clients."&lt;/p&gt;

&lt;p&gt;It wasn't "always expect people to avoid paying."&lt;/p&gt;

&lt;p&gt;And it definitely wasn't "be difficult to work with."&lt;/p&gt;

&lt;p&gt;It was much simpler:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good relationships need clear expectations.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A good client relationship isn't built by one person constantly being flexible.&lt;/p&gt;

&lt;p&gt;It works when both sides understand their responsibilities and respect them.&lt;/p&gt;

&lt;p&gt;That's reciprocity.&lt;/p&gt;

&lt;p&gt;And that's something I wish I'd understood earlier.&lt;/p&gt;

&lt;p&gt;Today, when I build software for a client, I think about more than whether the feature works.&lt;/p&gt;

&lt;p&gt;I think about whether the scope is clear.&lt;/p&gt;

&lt;p&gt;Whether expectations are documented.&lt;/p&gt;

&lt;p&gt;Whether both sides know what happens next.&lt;/p&gt;

&lt;p&gt;And whether I'm taking care of my responsibilities as both a developer and a business owner.&lt;/p&gt;

&lt;p&gt;Because becoming a better freelance developer isn't only about writing better code.&lt;/p&gt;

&lt;p&gt;Sometimes, it's about learning when to stop coding, have the conversation, and protect the work you've already done.&lt;/p&gt;

&lt;p&gt;That lesson cost me $1,300.&lt;/p&gt;

&lt;p&gt;I think it was worth learning.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&amp;gt; I'm Ayman Atif, a backend engineer and full-stack developer building production-ready web apps and tools. You can explore my work and latest projects at &lt;a href="https://ayman-atif.vercel.app/" rel="noopener noreferrer"&gt;ayman-atif.vercel.app&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>freelance</category>
      <category>webdev</category>
      <category>career</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Feature Worked. Then the Business Grew.</title>
      <dc:creator>Ayman Atif</dc:creator>
      <pubDate>Fri, 04 Sep 2026 12:35:45 +0000</pubDate>
      <link>https://dev.to/a95yman/the-feature-worked-then-the-business-grew-42i2</link>
      <guid>https://dev.to/a95yman/the-feature-worked-then-the-business-grew-42i2</guid>
      <description>&lt;p&gt;I’m Ayman Atif, a freelance software engineer focused on business software, backend systems, automation, and applications that have to survive real-world use.&lt;/p&gt;

&lt;p&gt;A lot of my work starts with a deceptively simple sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The application works, but something is becoming a problem.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes it is performance.&lt;/p&gt;

&lt;p&gt;Sometimes it is a workflow that still depends on spreadsheets.&lt;/p&gt;

&lt;p&gt;Sometimes a codebase has become difficult to change without breaking something else.&lt;/p&gt;

&lt;p&gt;And sometimes the application works perfectly well in development, but production tells a different story.&lt;/p&gt;

&lt;p&gt;One of the most interesting examples I’ve worked on started with something that didn’t look like a performance problem at all.&lt;/p&gt;

&lt;p&gt;It was a business application.&lt;/p&gt;

&lt;p&gt;The users needed to work with a lot of data, switch between different sections quickly, edit records, generate documents, process financial information, and keep several parts of their workflow open at the same time.&lt;/p&gt;

&lt;p&gt;The application worked.&lt;/p&gt;

&lt;p&gt;Until it didn’t feel fast anymore.&lt;/p&gt;

&lt;h2&gt;
  
  
  The deceptive phase of a successful application
&lt;/h2&gt;

&lt;p&gt;There is a counterintuitive stage in software development where an application becomes a victim of its own success.&lt;/p&gt;

&lt;p&gt;At the beginning, everything looks reasonable.&lt;/p&gt;

&lt;p&gt;A database contains a few hundred records.&lt;/p&gt;

&lt;p&gt;Pages load quickly.&lt;/p&gt;

&lt;p&gt;Queries finish almost immediately.&lt;/p&gt;

&lt;p&gt;The server has plenty of room.&lt;/p&gt;

&lt;p&gt;Developers make decisions based on what exists today.&lt;/p&gt;

&lt;p&gt;Then the business grows.&lt;/p&gt;

&lt;p&gt;A few hundred records become thousands.&lt;/p&gt;

&lt;p&gt;Users spend more time inside the application.&lt;/p&gt;

&lt;p&gt;More tabs are opened.&lt;/p&gt;

&lt;p&gt;More documents are processed.&lt;/p&gt;

&lt;p&gt;More people interact with the same data.&lt;/p&gt;

&lt;p&gt;Nothing is necessarily “broken.”&lt;/p&gt;

&lt;p&gt;The problem is that the assumptions behind the original implementation are no longer true.&lt;/p&gt;

&lt;p&gt;That changes the equation.&lt;/p&gt;

&lt;p&gt;A query that was perfectly acceptable with 200 records might become expensive with 20,000.&lt;/p&gt;

&lt;p&gt;A page that felt instant when it loaded 50 objects might become noticeably slower when it loads thousands.&lt;/p&gt;

&lt;p&gt;A workflow that worked beautifully for one person might behave differently when several users are modifying shared state.&lt;/p&gt;

&lt;p&gt;The code didn't suddenly become bad.&lt;/p&gt;

&lt;p&gt;The environment changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The requirement that made everything harder
&lt;/h2&gt;

&lt;p&gt;One requirement in particular made the problem interesting.&lt;/p&gt;

&lt;p&gt;The users wanted the application to behave more like a desktop application.&lt;/p&gt;

&lt;p&gt;They didn't want to constantly navigate between pages.&lt;/p&gt;

&lt;p&gt;They wanted to open different sections, switch between them, keep their context, and work with large datasets directly inside grids.&lt;/p&gt;

&lt;p&gt;And in some areas, they wanted thousands of records visible without traditional pagination.&lt;/p&gt;

&lt;p&gt;From a user's perspective, that makes perfect sense.&lt;/p&gt;

&lt;p&gt;If you're working with financial or business data all day, constantly clicking through pages can become friction.&lt;/p&gt;

&lt;p&gt;You want to search, sort, inspect, edit, and move on.&lt;/p&gt;

&lt;p&gt;But every convenient interaction has a cost somewhere else.&lt;/p&gt;

&lt;p&gt;The browser has work to do.&lt;/p&gt;

&lt;p&gt;The server has work to do.&lt;/p&gt;

&lt;p&gt;The database has work to do.&lt;/p&gt;

&lt;p&gt;And memory has to go somewhere.&lt;/p&gt;

&lt;p&gt;The more desktop-like the web application becomes, the more important it is to understand what is actually happening underneath the interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  I stopped looking at the page
&lt;/h2&gt;

&lt;p&gt;The first instinct when a page becomes slow is often to look at the page.&lt;/p&gt;

&lt;p&gt;Maybe the JavaScript is inefficient.&lt;/p&gt;

&lt;p&gt;Maybe the rendering is expensive.&lt;/p&gt;

&lt;p&gt;Maybe the browser is struggling.&lt;/p&gt;

&lt;p&gt;Those things can certainly happen.&lt;/p&gt;

&lt;p&gt;But I learned to resist fixing the first thing that looks suspicious.&lt;/p&gt;

&lt;p&gt;Instead, I started following the entire path.&lt;/p&gt;

&lt;p&gt;Database.&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Backend.&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Serialization.&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Network.&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Browser.&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;DOM.&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;User interaction.&lt;/p&gt;

&lt;p&gt;That sounds obvious, but it changes how you investigate a performance problem.&lt;/p&gt;

&lt;p&gt;If you only look at the frontend, you can spend hours optimizing something that represents a small percentage of the actual problem.&lt;/p&gt;

&lt;p&gt;The same is true in reverse.&lt;/p&gt;

&lt;p&gt;A database query might be fast in isolation while the application still feels slow because too much data is being transferred, processed, or rendered afterward.&lt;/p&gt;

&lt;p&gt;Performance is a chain.&lt;/p&gt;

&lt;p&gt;The user experiences the slowest part of that chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  More data exposed the real problem
&lt;/h2&gt;

&lt;p&gt;As the amount of data increased, some operations that had previously been invisible became measurable.&lt;/p&gt;

&lt;p&gt;Queries mattered more.&lt;/p&gt;

&lt;p&gt;Object loading mattered more.&lt;/p&gt;

&lt;p&gt;Serialization mattered more.&lt;/p&gt;

&lt;p&gt;Browser rendering mattered more.&lt;/p&gt;

&lt;p&gt;Memory usage mattered more.&lt;/p&gt;

&lt;p&gt;And suddenly, “just load the records” wasn't a harmless instruction anymore.&lt;/p&gt;

&lt;p&gt;Every record had a cost.&lt;/p&gt;

&lt;p&gt;Every relationship had a cost.&lt;/p&gt;

&lt;p&gt;Every extra field had a cost.&lt;/p&gt;

&lt;p&gt;Every duplicated piece of state had a cost.&lt;/p&gt;

&lt;p&gt;This is one of the lessons I now try to keep in mind when designing business applications:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Data volume is part of the architecture.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It shouldn't be treated as something that will magically take care of itself later.&lt;/p&gt;

&lt;p&gt;If an application is expected to grow, the question isn't only:&lt;/p&gt;

&lt;p&gt;“How do we make this work?”&lt;/p&gt;

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

&lt;p&gt;“What happens when this becomes ten times larger?”&lt;/p&gt;

&lt;h2&gt;
  
  
  The server has a vote too
&lt;/h2&gt;

&lt;p&gt;There was another constraint that made the problem more interesting: the server wasn't unlimited.&lt;/p&gt;

&lt;p&gt;The application had to operate within a relatively small amount of memory.&lt;/p&gt;

&lt;p&gt;That changes how you think about architecture.&lt;/p&gt;

&lt;p&gt;You can't simply throw more infrastructure at every problem.&lt;/p&gt;

&lt;p&gt;Sometimes the right answer is optimization.&lt;/p&gt;

&lt;p&gt;Sometimes it is changing when data is loaded.&lt;/p&gt;

&lt;p&gt;Sometimes it is reducing unnecessary work.&lt;/p&gt;

&lt;p&gt;Sometimes it is processing things differently.&lt;/p&gt;

&lt;p&gt;And sometimes you have to question the original design.&lt;/p&gt;

&lt;p&gt;This is where I think business software differs from many toy projects and tutorials.&lt;/p&gt;

&lt;p&gt;In a tutorial, you can say:&lt;/p&gt;

&lt;p&gt;“Let's add another server.”&lt;/p&gt;

&lt;p&gt;In production, someone has to pay for it.&lt;/p&gt;

&lt;p&gt;And even if you can afford it, more infrastructure doesn't automatically fix inefficient data access or excessive memory usage.&lt;/p&gt;

&lt;p&gt;You still need to understand the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then there was shared state
&lt;/h2&gt;

&lt;p&gt;Performance wasn't the only problem.&lt;/p&gt;

&lt;p&gt;Once multiple people are working with the same information, another category of problems appears.&lt;/p&gt;

&lt;p&gt;Who owns this change?&lt;/p&gt;

&lt;p&gt;What happens if two users edit the same thing?&lt;/p&gt;

&lt;p&gt;Which version should win?&lt;/p&gt;

&lt;p&gt;When should state be saved?&lt;/p&gt;

&lt;p&gt;What happens if the browser closes halfway through an operation?&lt;/p&gt;

&lt;p&gt;What happens if a user opens several sections and modifies information in one while another section still contains an older representation?&lt;/p&gt;

&lt;p&gt;These aren't UI questions anymore.&lt;/p&gt;

&lt;p&gt;They're system-design questions.&lt;/p&gt;

&lt;p&gt;A business application is full of shared state.&lt;/p&gt;

&lt;p&gt;That means reliability depends on more than making individual functions work correctly.&lt;/p&gt;

&lt;p&gt;You have to think about the relationships between those functions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lesson I took from it
&lt;/h2&gt;

&lt;p&gt;The biggest lesson wasn't a particular optimization technique.&lt;/p&gt;

&lt;p&gt;It was a change in how I think about software.&lt;/p&gt;

&lt;p&gt;A feature doesn't exist in isolation.&lt;/p&gt;

&lt;p&gt;It exists inside a business.&lt;/p&gt;

&lt;p&gt;The business grows.&lt;/p&gt;

&lt;p&gt;The data grows.&lt;/p&gt;

&lt;p&gt;Users change their behavior.&lt;/p&gt;

&lt;p&gt;Requirements evolve.&lt;/p&gt;

&lt;p&gt;Infrastructure has limits.&lt;/p&gt;

&lt;p&gt;And eventually, assumptions that looked completely reasonable during development are challenged by reality.&lt;/p&gt;

&lt;p&gt;That's why I prefer investigating a system before proposing a rewrite.&lt;/p&gt;

&lt;p&gt;When something becomes slow, fragile, or difficult to maintain, the answer isn't automatically “replace it.”&lt;/p&gt;

&lt;p&gt;First, understand it.&lt;/p&gt;

&lt;p&gt;Find where the real constraint is.&lt;/p&gt;

&lt;p&gt;Measure what is actually happening.&lt;/p&gt;

&lt;p&gt;Then change the smallest thing that meaningfully improves the situation.&lt;/p&gt;

&lt;p&gt;Sometimes that leads to a refactor.&lt;/p&gt;

&lt;p&gt;Sometimes it leads to a database change.&lt;/p&gt;

&lt;p&gt;Sometimes it requires changing how data moves through the application.&lt;/p&gt;

&lt;p&gt;Sometimes the architecture itself needs to evolve.&lt;/p&gt;

&lt;p&gt;But you should know why you're making the change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Software gets interesting when it meets reality
&lt;/h2&gt;

&lt;p&gt;I've been building software since 2014, and most of the lessons that stayed with me didn't come from writing the first version of an application.&lt;/p&gt;

&lt;p&gt;They came afterward.&lt;/p&gt;

&lt;p&gt;When users started depending on it.&lt;/p&gt;

&lt;p&gt;When the database became larger.&lt;/p&gt;

&lt;p&gt;When a server had less memory than expected.&lt;/p&gt;

&lt;p&gt;When two people changed the same data.&lt;/p&gt;

&lt;p&gt;When a feature that looked simple turned out to affect five different parts of the system.&lt;/p&gt;

&lt;p&gt;That's the point where software engineering becomes less about making something work and more about making something people can continue to rely on.&lt;/p&gt;

&lt;p&gt;That's also the kind of work I enjoy most.&lt;/p&gt;

&lt;p&gt;I build and improve business applications, backend systems, automation workflows, APIs, and existing software that has reached the point where it needs careful engineering rather than another quick patch.&lt;/p&gt;

&lt;p&gt;If you're dealing with a business process that has outgrown spreadsheets, an application that has become difficult to maintain, or software that needs to become more reliable as it grows, you can find my work and get in touch with me at &lt;strong&gt;&lt;a href="https://ayman-atif.vercel.app/" rel="noopener noreferrer"&gt;ayman-atif.vercel.app&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal isn't just to write software.&lt;/p&gt;

&lt;p&gt;It's to build something the business can actually rely on.&lt;/p&gt;

</description>
      <category>saas</category>
      <category>webdev</category>
      <category>startup</category>
      <category>python</category>
    </item>
  </channel>
</rss>
