<?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: Haseeb</title>
    <description>The latest articles on DEV Community by Haseeb (@thehaseeb93).</description>
    <link>https://dev.to/thehaseeb93</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%2F3433472%2F0de5b941-0c9b-4206-bb87-b0cfa715c7d0.jpg</url>
      <title>DEV Community: Haseeb</title>
      <link>https://dev.to/thehaseeb93</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thehaseeb93"/>
    <language>en</language>
    <item>
      <title>My ERP client says AI will replace software developers and plans to build future features with Codex. What should I do?</title>
      <dc:creator>Haseeb</dc:creator>
      <pubDate>Wed, 28 Oct 2026 11:56:44 +0000</pubDate>
      <link>https://dev.to/thehaseeb93/my-erp-client-says-ai-will-replace-software-developers-and-plans-to-build-future-features-with-2m0c</link>
      <guid>https://dev.to/thehaseeb93/my-erp-client-says-ai-will-replace-software-developers-and-plans-to-build-future-features-with-2m0c</guid>
      <description>&lt;p&gt;Hi everyone,&lt;/p&gt;

&lt;p&gt;I'm a 21-year-old software developer from Pakistan, and I need honest career advice from people who have experience in software engineering and AI.&lt;/p&gt;

&lt;p&gt;I got a client project to build an ERP system using Django, React, PostgreSQL, and Docker. I've been working on real business workflows, inventory, procurement, and other ERP modules.&lt;/p&gt;

&lt;p&gt;Now my client has told me that AI is taking away software engineers' jobs. After this ERP project, he plans to build future features himself using Codex instead of hiring me for further development.&lt;/p&gt;

&lt;p&gt;This has made me rethink my career.&lt;/p&gt;

&lt;p&gt;The thing is, I've always wanted to work in AI/ML, deep learning, LLMs, and AI agents. I moved toward conventional software development because I got this client and needed to earn money.&lt;/p&gt;

&lt;p&gt;I'm also being honest about a weakness: I rely heavily on Claude Code to write most of my code. I can deliver software with AI assistance, but I know I need to improve my own programming fundamentals and ability to understand, debug, and verify code.&lt;/p&gt;

&lt;p&gt;I currently have limited financial runway, around 1–3 months of essential expenses, so I can't simply stop earning and study AI full-time.&lt;/p&gt;

&lt;p&gt;I'd really appreciate advice on these questions:&lt;/p&gt;

&lt;p&gt;If you were in my position, would you continue pursuing software engineering, transition toward AI engineering, or consider another field?&lt;/p&gt;

&lt;p&gt;Should I focus on becoming a strong software engineer who uses AI tools, or prioritize ML, deep learning, LLMs, and AI agents?&lt;/p&gt;

&lt;p&gt;Given my financial situation, how would you divide your time between earning money, applying for jobs, and learning AI?&lt;/p&gt;

&lt;p&gt;How important is it to write code independently today? Can someone who currently relies heavily on AI coding tools become a genuinely competent AI engineer?&lt;/p&gt;

&lt;p&gt;What would you do over the next 6–12 months if you were starting from my position?&lt;/p&gt;

&lt;p&gt;I'm not looking for reassurance or predictions that AI will or won't replace everyone. I want practical advice from people who have faced a similar situation or work in these fields.&lt;/p&gt;

&lt;p&gt;Thank you!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>llm</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Building an Offline-First React Native App: Lessons From a Real-World Order Booking System</title>
      <dc:creator>Haseeb</dc:creator>
      <pubDate>Wed, 09 Sep 2026 15:34:11 +0000</pubDate>
      <link>https://dev.to/thehaseeb93/building-an-offline-first-react-native-app-lessons-from-a-real-world-order-booking-system-agi</link>
      <guid>https://dev.to/thehaseeb93/building-an-offline-first-react-native-app-lessons-from-a-real-world-order-booking-system-agi</guid>
      <description>&lt;p&gt;Most mobile applications assume that the user has an internet connection.&lt;/p&gt;

&lt;p&gt;That's reasonable for many consumer apps.&lt;/p&gt;

&lt;p&gt;But what happens when you're building software for field employees who spend most of their day moving between shops, warehouses, roads, and areas where the network isn't reliable?&lt;/p&gt;

&lt;p&gt;You can't simply show:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"No internet connection."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and expect the business workflow to stop.&lt;/p&gt;

&lt;p&gt;I've been working on &lt;strong&gt;PAFood Booking System 2.0&lt;/strong&gt;, an FMCG sales and order management system used around real field operations.&lt;/p&gt;

&lt;p&gt;One of the interesting technical challenges has been making the mobile application work reliably when the network isn't available.&lt;/p&gt;

&lt;p&gt;This is what led me toward an &lt;strong&gt;offline-first approach&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does offline-first actually mean?
&lt;/h2&gt;

&lt;p&gt;Offline-first doesn't simply mean adding a loading screen when the internet disappears.&lt;/p&gt;

&lt;p&gt;The idea is that the application should continue performing important operations locally and synchronize with the backend when connectivity becomes available again.&lt;/p&gt;

&lt;p&gt;For a field order booking application, that can mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Viewing previously synchronized shop data&lt;/li&gt;
&lt;li&gt;Creating orders without internet&lt;/li&gt;
&lt;li&gt;Recording visits&lt;/li&gt;
&lt;li&gt;Saving payments&lt;/li&gt;
&lt;li&gt;Storing GPS-related activity&lt;/li&gt;
&lt;li&gt;Queueing changes for synchronization&lt;/li&gt;
&lt;li&gt;Automatically syncing when connectivity returns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The user shouldn't have to think about whether the API is currently reachable.&lt;/p&gt;

&lt;p&gt;The application should handle that complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The basic architecture
&lt;/h2&gt;

&lt;p&gt;For the mobile application, the general flow looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Action
    ↓
React Native Application
    ↓
Local Storage
    ↓
Sync Queue
    ↓
Network Available?
    ↓
Backend API
    ↓
PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of every action immediately depending on the backend, important operations can first be persisted locally.&lt;/p&gt;

&lt;p&gt;The synchronization layer then takes responsibility for sending those changes to the server.&lt;/p&gt;

&lt;p&gt;This creates a different way of thinking about mobile application architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why local persistence matters
&lt;/h2&gt;

&lt;p&gt;Suppose a booker visits a shop and creates an order.&lt;/p&gt;

&lt;p&gt;The user enters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shop&lt;/li&gt;
&lt;li&gt;Products&lt;/li&gt;
&lt;li&gt;Quantities&lt;/li&gt;
&lt;li&gt;Prices&lt;/li&gt;
&lt;li&gt;Discounts&lt;/li&gt;
&lt;li&gt;Order information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the application immediately sends everything to the server and the connection fails, the user could lose the order.&lt;/p&gt;

&lt;p&gt;That's unacceptable for a field sales system.&lt;/p&gt;

&lt;p&gt;Instead, the application can persist the order locally.&lt;/p&gt;

&lt;p&gt;The UI can then treat the order as successfully recorded locally while marking it as waiting for synchronization.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Order
Status: PENDING_SYNC
Sync ID: abc-123
Created locally: true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once connectivity returns, the sync manager can process the pending operation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The duplicate request problem
&lt;/h2&gt;

&lt;p&gt;One of the biggest issues with offline synchronization is not simply sending data.&lt;/p&gt;

&lt;p&gt;It's knowing what happens when the same operation is sent more than once.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;User creates an order.&lt;/li&gt;
&lt;li&gt;App stores it locally.&lt;/li&gt;
&lt;li&gt;Internet becomes available.&lt;/li&gt;
&lt;li&gt;App sends the order.&lt;/li&gt;
&lt;li&gt;Server processes it.&lt;/li&gt;
&lt;li&gt;Network response is lost.&lt;/li&gt;
&lt;li&gt;App doesn't know whether the server received it.&lt;/li&gt;
&lt;li&gt;App retries the request.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now the backend might receive the same order twice.&lt;/p&gt;

&lt;p&gt;For a sales system, that's a serious problem.&lt;/p&gt;

&lt;p&gt;You don't want:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 customer order → 2 database orders&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Using an idempotency key
&lt;/h2&gt;

&lt;p&gt;One approach I use for this kind of problem is generating a unique client-side request identifier.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;client_request_id = "8f2c7e..."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The mobile application generates this identifier when creating the operation.&lt;/p&gt;

&lt;p&gt;The backend stores it along with the resulting record.&lt;/p&gt;

&lt;p&gt;If the same request arrives again, the backend can recognize that it has already been processed instead of creating another record.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mobile App

Create Order
    ↓
Generate client_request_id
    ↓
Save locally
    ↓
Send to API
    ↓
Backend checks client_request_id
    ↓
Already processed?
   / \
 Yes  No
 ↓     ↓
Return  Process
existing order
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This small design decision can make a significant difference in the reliability of an offline system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sync isn't just "send everything"
&lt;/h2&gt;

&lt;p&gt;Another lesson is that synchronization needs its own logic.&lt;/p&gt;

&lt;p&gt;You need to think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What gets synchronized?&lt;/li&gt;
&lt;li&gt;In what order?&lt;/li&gt;
&lt;li&gt;What happens when synchronization fails?&lt;/li&gt;
&lt;li&gt;Should failed operations retry automatically?&lt;/li&gt;
&lt;li&gt;How many times should they retry?&lt;/li&gt;
&lt;li&gt;What happens if the server rejects the operation?&lt;/li&gt;
&lt;li&gt;What happens if the local data is outdated?&lt;/li&gt;
&lt;li&gt;What happens if two users modify related data?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simple &lt;code&gt;if (online) sendRequest()&lt;/code&gt; approach isn't enough for a serious offline workflow.&lt;/p&gt;

&lt;p&gt;The synchronization layer becomes a small system of its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling connectivity changes
&lt;/h2&gt;

&lt;p&gt;Network availability can change constantly on mobile devices.&lt;/p&gt;

&lt;p&gt;A user might have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Online
↓
Offline
↓
Online
↓
Weak connection
↓
Offline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application shouldn't require the user to manually manage these states.&lt;/p&gt;

&lt;p&gt;Instead, connectivity changes can trigger synchronization attempts.&lt;/p&gt;

&lt;p&gt;But even then, the application needs to assume that a connection can disappear during synchronization.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Upload order
     ↓
Connection lost
     ↓
Request status unknown
     ↓
Retry safely
     ↓
Backend checks client_request_id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is another reason why idempotency is so important.&lt;/p&gt;

&lt;h2&gt;
  
  
  Offline-first changes the way you design the UI
&lt;/h2&gt;

&lt;p&gt;There's also a UX implication.&lt;/p&gt;

&lt;p&gt;If an order is saved locally but hasn't reached the server yet, the user should be able to understand its state.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Order #1042
✓ Saved
↻ Syncing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Order #1042
⚠ Sync failed
Tap to retry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The UI doesn't necessarily need to expose all the technical details.&lt;/p&gt;

&lt;p&gt;But the user needs enough information to know whether their work is safe.&lt;/p&gt;

&lt;p&gt;For field employees, confidence matters.&lt;/p&gt;

&lt;p&gt;They need to know:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Did my order get saved?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;not:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Did the HTTP request return a 200?"&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Low-end devices make the problem more interesting
&lt;/h2&gt;

&lt;p&gt;Another consideration with field applications is hardware.&lt;/p&gt;

&lt;p&gt;Not every employee is using a high-end phone with plenty of RAM and storage.&lt;/p&gt;

&lt;p&gt;The application needs to remain usable on lower-end Android devices.&lt;/p&gt;

&lt;p&gt;That affects decisions around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memory usage&lt;/li&gt;
&lt;li&gt;Large lists&lt;/li&gt;
&lt;li&gt;Image handling&lt;/li&gt;
&lt;li&gt;Rendering&lt;/li&gt;
&lt;li&gt;Local storage&lt;/li&gt;
&lt;li&gt;Background tasks&lt;/li&gt;
&lt;li&gt;Network requests&lt;/li&gt;
&lt;li&gt;Navigation&lt;/li&gt;
&lt;li&gt;Battery consumption&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An application that works perfectly on a developer's machine isn't necessarily ready for real-world field usage.&lt;/p&gt;

&lt;p&gt;The environment where the software runs matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Offline-first isn't free
&lt;/h2&gt;

&lt;p&gt;There is a trade-off.&lt;/p&gt;

&lt;p&gt;Offline-first architecture introduces additional complexity.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Local state + Server state + Synchronization state&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Server state&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need to handle conflicts, retries, failures, stale data, duplicate requests, and synchronization status.&lt;/p&gt;

&lt;p&gt;So I wouldn't automatically make every application offline-first.&lt;/p&gt;

&lt;p&gt;It makes sense when the business workflow genuinely requires users to continue working without reliable connectivity.&lt;/p&gt;

&lt;p&gt;For field sales, delivery, logistics, inspections, and similar applications, that requirement can be fundamental.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned from building it
&lt;/h2&gt;

&lt;p&gt;The biggest lesson for me is that reliable mobile software isn't just about making the API calls work.&lt;/p&gt;

&lt;p&gt;You have to think about the environment in which the software will actually be used.&lt;/p&gt;

&lt;p&gt;Users lose internet.&lt;/p&gt;

&lt;p&gt;Phones run out of battery.&lt;/p&gt;

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

&lt;p&gt;Requests fail.&lt;/p&gt;

&lt;p&gt;Responses disappear.&lt;/p&gt;

&lt;p&gt;People tap buttons twice.&lt;/p&gt;

&lt;p&gt;And real users don't always follow the workflow exactly as you imagined it.&lt;/p&gt;

&lt;p&gt;Good software needs to account for those situations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Building an offline-first application changed how I think about mobile development.&lt;/p&gt;

&lt;p&gt;The backend being available isn't something I can simply assume.&lt;/p&gt;

&lt;p&gt;The network is unreliable.&lt;/p&gt;

&lt;p&gt;The device is part of the system.&lt;/p&gt;

&lt;p&gt;And synchronization is a core feature, not an afterthought.&lt;/p&gt;

&lt;p&gt;For the PAFood Booking System, this approach helps field employees continue their work even when connectivity isn't reliable, while giving the backend mechanisms to safely synchronize those operations later.&lt;/p&gt;

&lt;p&gt;The interesting part of software engineering is often not getting the happy path to work.&lt;/p&gt;

&lt;p&gt;It's figuring out what happens when everything &lt;strong&gt;doesn't&lt;/strong&gt; go according to plan.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>mobile</category>
      <category>reactnative</category>
    </item>
    <item>
      <title>I built a privacy-first task app as a self-taught developer from Pakistan— here's what I learned</title>
      <dc:creator>Haseeb</dc:creator>
      <pubDate>Sun, 14 Jun 2026 10:03:54 +0000</pubDate>
      <link>https://dev.to/thehaseeb93/i-built-a-privacy-first-task-app-as-a-self-taught-developer-from-pakistan-heres-what-i-learned-5g2n</link>
      <guid>https://dev.to/thehaseeb93/i-built-a-privacy-first-task-app-as-a-self-taught-developer-from-pakistan-heres-what-i-learned-5g2n</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;:&lt;br&gt;
I'm 21 years old. I learned to code from YouTube. I live in Rawalpindi, Pakistan. I have no CS degree and no formal training.&lt;br&gt;
And I just built Hi Tasky — a fully encrypted, offline-first task manager launching soon on Play Store.&lt;br&gt;
Here's what the journey looked like.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I built it&lt;/strong&gt;&lt;br&gt;
Every productivity app I tried had the same problems — monthly subscriptions, mandatory accounts, cloud sync I never asked for. I wanted something simple. Private. Mine.&lt;br&gt;
So I built it myself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes Hi Tasky different&lt;/strong&gt;&lt;br&gt;
AES-256 encryption on device&lt;br&gt;
Zero account required&lt;br&gt;
Fully offline&lt;br&gt;
One-time purchase&lt;br&gt;
No ads, ever&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned&lt;/strong&gt;&lt;br&gt;
Building solo is hard. Marketing is harder. But shipping is everything.&lt;br&gt;
If you're a self-taught developer wondering if it's possible without a degree — it is. It just takes longer and you have to figure out everything yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's next&lt;/strong&gt;&lt;br&gt;
Launching on Play Store soon. Would&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5j1u2tpom1hogoxq9ahm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5j1u2tpom1hogoxq9ahm.jpg" alt=" " width="800" height="1280"&gt;&lt;/a&gt; love feedback from the dev community before I go fully public.&lt;br&gt;
Drop your thoughts in the comments. 🙏&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
