<?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: Huzaifa Iftikhar</title>
    <description>The latest articles on DEV Community by Huzaifa Iftikhar (@huzaifa_iftikhar_2530deae).</description>
    <link>https://dev.to/huzaifa_iftikhar_2530deae</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%2F4143880%2F3179bb58-6e6f-40dc-a810-27bf45c09fcc.png</url>
      <title>DEV Community: Huzaifa Iftikhar</title>
      <link>https://dev.to/huzaifa_iftikhar_2530deae</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/huzaifa_iftikhar_2530deae"/>
    <language>en</language>
    <item>
      <title>15 Bugs That Said Everything Was Fine</title>
      <dc:creator>Huzaifa Iftikhar</dc:creator>
      <pubDate>Sat, 26 Sep 2026 06:50:01 +0000</pubDate>
      <link>https://dev.to/huzaifa_iftikhar_2530deae/15-bugs-that-said-everything-was-fine-3h26</link>
      <guid>https://dev.to/huzaifa_iftikhar_2530deae/15-bugs-that-said-everything-was-fine-3h26</guid>
      <description>&lt;p&gt;A database told me it had saved my data.&lt;/p&gt;

&lt;p&gt;It had not. The write was rolled back. No error. No warning. No exception. Just the word "success" and an empty table.&lt;/p&gt;

&lt;p&gt;That bug is now fixed, in Microsoft's Entity Framework Core, because a student in Lahore reported it and wrote the patch.&lt;/p&gt;

&lt;p&gt;I have had 15 contributions merged into open-source projects: Google, Microsoft, Apache, the OpenJS Foundation, Red Hat. Together those repositories have more than 890,000 GitHub stars. Twenty-one more of my fixes are waiting upstream right now.&lt;/p&gt;

&lt;p&gt;I have never met any of those maintainers. None of them know what I look like. They read the code and merged it.&lt;/p&gt;

&lt;p&gt;Here is what I have learned, and how you can start.&lt;/p&gt;

&lt;p&gt;THE PATTERN: THE WORST BUGS SAY NOTHING IS WRONG&lt;/p&gt;

&lt;p&gt;When you start looking for bugs, you look for crashes. Crashes are easy. Something breaks, a red message appears, everyone can see it.&lt;/p&gt;

&lt;p&gt;The dangerous bugs do the opposite. They fail, and then they tell you everything is fine.&lt;/p&gt;

&lt;p&gt;Look at the ones I found:&lt;/p&gt;

&lt;p&gt;A database said "saved" when nothing was saved.&lt;/p&gt;

&lt;p&gt;In EF Core's SQLite provider, two common commands reported success even when a later statement had failed. A busy commit was retried in a way that answered "OK" after the first attempt had already reported the problem. Result: your write is gone and your program is happy. That fix went into release 12.0-preview1.&lt;/p&gt;

&lt;p&gt;A build said BUILD SUCCESS when nothing was built.&lt;/p&gt;

&lt;p&gt;Apache Maven's concurrent builder was catching one kind of failure but not another. A step could throw, the build could produce nothing, and the screen printed the green success message. A reviewer reproduced it and found a second path to the same problem.&lt;/p&gt;

&lt;p&gt;Fields vanished from saved data.&lt;/p&gt;

&lt;p&gt;In Google Gson, a list declared with a wildcard type was written out using the declared type, not the real one. Subclass fields disappeared. A list of strings came out as [{},{}] — empty objects where your text used to be. No error. Just quietly less data than you put in. It was merged after passing Google's internal test suite.&lt;/p&gt;

&lt;p&gt;A crash that had been waiting since 2022.&lt;/p&gt;

&lt;p&gt;Also in EF Core: reading a stream from a certain kind of column passed three nulls into a native SQLite call, which answers "you are using this wrong," so the read threw as soon as another computed column shared the query. That issue sat open for over four years.&lt;/p&gt;

&lt;p&gt;A program could die while cleaning up.&lt;/p&gt;

&lt;p&gt;Pruning an idle pooled SQLite connection could take down the whole process, because a cleanup hook was cleared through a handle that was already closing.&lt;/p&gt;

&lt;p&gt;There is a lesson in that list.&lt;/p&gt;

&lt;p&gt;Anywhere a system reports success, ask who checks that the success is true.&lt;/p&gt;

&lt;p&gt;That question, asked patiently, has found me more real bugs than any clever technique.&lt;/p&gt;

&lt;p&gt;THE OTHERS&lt;/p&gt;

&lt;p&gt;Not everything is dramatic. Good contributions come in all sizes:&lt;/p&gt;

&lt;p&gt;Jest (45.5k stars): an import path starting with # was being read as a web address fragment, so a whole category of package imports broke. Shipped in v30.5.1.&lt;/p&gt;

&lt;p&gt;Microsoft GitHub spec-kit (138k): a command name containing a hyphen could not be reached at all. Three people submitted fixes; mine was chosen as the canonical one. A second fix made a missing file fail early with a clear message instead of late with a confusing one.&lt;/p&gt;

&lt;p&gt;Playwright (96.5k): a filter control was a plain div, so keyboard users could not reach or open it. An accessibility fix, and one I care about personally.&lt;/p&gt;

&lt;p&gt;Quarkus (15.9k, Red Hat): request filters were reordered so their priorities ran backwards.&lt;/p&gt;

&lt;p&gt;BenchmarkDotNet (11.5k): you could not pin a benchmark to any CPU above the 32nd, and one case crashed with a raw overflow error instead of a normal message.&lt;/p&gt;

&lt;p&gt;LangChain (146.8k): a documentation block that contradicted itself.&lt;/p&gt;

&lt;p&gt;That last one is a documentation fix, and I list it on purpose. It counts. Every big project has wrong docs, and fixing them is the easiest honest way to get your first merge.&lt;/p&gt;

&lt;p&gt;WHY THIS MATTERS MORE THAN A CERTIFICATE&lt;/p&gt;

&lt;p&gt;I could not get an internship at Google. I do not have a degree from a famous university. I studied at the University of Central Punjab in Lahore.&lt;/p&gt;

&lt;p&gt;But my code is in Gson, which Google maintains. My fix shipped in Jest. My name is in the EF Core release history. Anyone can check.&lt;/p&gt;

&lt;p&gt;Here is the quiet truth about open source: nobody asks where you are from.&lt;/p&gt;

&lt;p&gt;There is no CV screen. There is no interview. There is a patch, and a test, and a maintainer who decides whether your reasoning is right.&lt;/p&gt;

&lt;p&gt;For people who get filtered out early by everything else, that is the fairest door in this industry.&lt;/p&gt;

&lt;p&gt;HOW TO GET YOUR FIRST MERGE&lt;/p&gt;

&lt;p&gt;This is the part I wish someone had written for me.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Do not start by looking for a project. Start by using one.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Use a library, hit something strange, and follow it. Every fix I have listed started as "wait, that is weird."&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read the issue tracker, sorted by oldest.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Old open issues are gold. They are real, reproduced, still broken, and everyone else got bored. My EF Core stream fix had been sitting since April 2022.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reproduce it in the smallest possible program.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before you write a single line of the fix, write the twenty lines that prove the bug exists. Maintainers live by reproductions. A good one makes them want to help you.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find the real cause, not the place it hurts.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The error appears in one place. The mistake usually lives somewhere else. Read the code path backwards until you can explain why, in one sentence, out loud.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make the smallest change that fixes it, and add a test.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your patch is competing with the maintainer's time. Big patches look expensive. A tiny patch with a test that fails before and passes after is easy to say yes to.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write the pull request like a short story.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What happens now. What should happen. Why. What you changed. How you tested. No drama, no essay.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Expect silence, and do not take it personally.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Some of mine were merged in days. Some sat for months. One was superseded by someone else's patch, and the fix shipped with my name as co-author. Twenty-one are still open right now. That is normal. It is not rejection.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Be polite when a maintainer corrects you.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;They know the codebase. You do not. On one of my Maven fixes, a reviewer found a second failure path I had missed, and the final fix was better than my original. That is the system working.&lt;/p&gt;

&lt;p&gt;START THIS WEEK&lt;/p&gt;

&lt;p&gt;You do not need permission and you do not need to be an expert.&lt;/p&gt;

&lt;p&gt;Pick one library you actually use. Open its issues. Sort by oldest. Find one you can reproduce. Write the twenty lines that prove it. Then read the code until you understand why.&lt;/p&gt;

&lt;p&gt;That is the whole method. I have used it fifteen times.&lt;/p&gt;

&lt;p&gt;The first merge is the hardest one. After that you will never again wonder whether you are a real programmer, because the answer is sitting in someone else's release notes.&lt;/p&gt;

&lt;p&gt;Huzaifa Iftikhar is a software engineer in Lahore, Pakistan, and a 2026 Computer Science graduate. His merged contributions are at github.com/HuzaifaChaudary.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>We Built a Food Delivery Network in Pakistan Without a Payment Gateway</title>
      <dc:creator>Huzaifa Iftikhar</dc:creator>
      <pubDate>Sat, 26 Sep 2026 06:42:32 +0000</pubDate>
      <link>https://dev.to/huzaifa_iftikhar_2530deae/we-built-a-food-delivery-network-in-pakistan-without-a-payment-gateway-3aoi</link>
      <guid>https://dev.to/huzaifa_iftikhar_2530deae/we-built-a-food-delivery-network-in-pakistan-without-a-payment-gateway-3aoi</guid>
      <description>&lt;p&gt;There is one word in our database that we never use: jazzcash.&lt;/p&gt;

&lt;p&gt;It sits there as a legacy value in an old enum, left over from the plan we started with. That dead word shaped our entire final year project.&lt;/p&gt;

&lt;p&gt;We wanted to build SmartBite: a marketplace where home chefs cook from their own kitchens and sell to customers nearby. Riders deliver. Ingredient vendors supply the chefs. Admins keep the platform honest.&lt;/p&gt;

&lt;p&gt;Every tutorial online says the same thing: plug in a payment gateway and you are done. In Pakistan, that usually means JazzCash. We went a different way and built our own money flow instead.&lt;/p&gt;

&lt;p&gt;This is how we built the whole system, and what it taught me.&lt;/p&gt;

&lt;p&gt;SmartBite: Homemade Meal Delivery Network — BSCS Final Year Project, Group F25CS010, University of Central Punjab. Advisor: Dr. Rabia Tehseen. Team: Abdullah Maqsood, Huzaifa Iftikhar, Moizz Ahmad. I worked on the mobile apps and the recommendation engine.&lt;/p&gt;

&lt;p&gt;THE MONEY PROBLEM&lt;/p&gt;

&lt;p&gt;A gateway is not just an API key. It is a merchant account, a registered business, paperwork, and an approval process. A three-student team building a final year project has none of that.&lt;/p&gt;

&lt;p&gt;So we dropped the gateway entirely and designed a payment flow around what people here already use every week: their own bank app.&lt;/p&gt;

&lt;p&gt;Here is what happens when a customer checks out:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The screen shows our merchant bank account (IBAN) and a QR code for the exact amount.&lt;/li&gt;
&lt;li&gt;The customer opens their own banking app and sends the money. A normal Raast or bank transfer. The same thing they already do every week.&lt;/li&gt;
&lt;li&gt;The customer uploads proof — a screenshot or the transaction receipt.&lt;/li&gt;
&lt;li&gt;An admin checks the transfer against the real bank account and approves or rejects it.&lt;/li&gt;
&lt;li&gt;Only after approval does the order move forward.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No gateway. No API keys. No monthly fee.&lt;/p&gt;

&lt;p&gt;One small decision saved us from a whole class of bugs: we store every amount as an integer in paisa, never as a decimal. Money in floating point is a famous way to lose a rupee here and there and never find it again.&lt;/p&gt;

&lt;p&gt;Is manual verification slower than a card payment? Yes. But it works today, in this country, with no company registration. Sometimes the right engineering answer is the one that can actually run.&lt;/p&gt;

&lt;p&gt;FIVE APPS, ONE BACKEND&lt;/p&gt;

&lt;p&gt;SmartBite is not one program. It is five, each one runnable on its own:&lt;/p&gt;

&lt;p&gt;server/&lt;br&gt;
The API everything talks to. Built with Node.js, Express 5, TypeScript, Mongoose (MongoDB), and Socket.IO.&lt;/p&gt;

&lt;p&gt;web-dashboard/&lt;br&gt;
Chef, vendor and admin portals. Built with Next.js 15, React 19, and Tailwind CSS.&lt;/p&gt;

&lt;p&gt;mobile-app/&lt;br&gt;
Customer and rider app in one project. Built with Expo SDK 54, React Native 0.81, and expo-router.&lt;/p&gt;

&lt;p&gt;ai-engine/&lt;br&gt;
Meal recommendations. Built with Python 3.11, FastAPI, and scikit-learn.&lt;/p&gt;

&lt;p&gt;landing/&lt;br&gt;
Public website. Built with Next.js 15 and Tailwind CSS.&lt;/p&gt;

&lt;p&gt;The two frontends share one backend and one users collection. So an account made on the web signs in on mobile. That sounds obvious. It is the kind of obvious thing that breaks quietly if you do not plan it on day one.&lt;/p&gt;

&lt;p&gt;The customer app and the rider app live inside one Expo project, as two route groups. Two experiences, one codebase, one build to maintain. For a three-person team, that decision paid for itself many times.&lt;/p&gt;

&lt;p&gt;THE AI ENGINE CAN DIE AND NOBODY NOTICES&lt;/p&gt;

&lt;p&gt;Our recommendation service is a separate Python process. That worried me. A separate service is a separate thing that can fall over at 2 a.m. during the demo.&lt;/p&gt;

&lt;p&gt;So we made it optional.&lt;/p&gt;

&lt;p&gt;The backend asks the AI engine for recommendations. If the AI engine does not answer, the backend quietly falls back to a popularity ranking and the app keeps working. The customer sees meals either way. Nothing breaks. Nobody sees an error.&lt;/p&gt;

&lt;p&gt;We did the same thing with maps. Google Maps is integrated on the server, with a plain straight-line distance fallback built in. The entire system runs with no paid API keys. For a student project that has to work on a demo laptop in a viva room with bad internet, this mattered more than any feature.&lt;/p&gt;

&lt;p&gt;If I could teach one idea from this project to a younger student, it is this: every external thing you depend on should have a boring backup. Build the backup first. Then you can sleep.&lt;/p&gt;

&lt;p&gt;HOW THE RECOMMENDATIONS ACTUALLY WORK&lt;/p&gt;

&lt;p&gt;There are two halves.&lt;/p&gt;

&lt;p&gt;The live half runs inside the app:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Every meal is turned into a text document (name, description, tags) and compared using TF-IDF with cosine similarity. If you ordered biryani, you get things that look like biryani in word-space.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Meals nobody has ordered yet cannot be compared to your history, so they are ranked by popularity, using a Bayesian average, not a raw star rating. This matters. One 5-star review from the chef's cousin should not beat 4.6 stars from forty real customers. The Bayesian prior pulls small samples toward the global average until they earn their score.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Every recommendation carries a reason in plain words: "Similar to meals you ordered recently", "Popular dish (4.6/5 from 12 reviews)", or "New on SmartBite."&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last part was not in the requirements. I added it because a recommendation you cannot explain is a recommendation nobody trusts.&lt;/p&gt;

&lt;p&gt;The offline half is a proper collaborative-filtering model. We trained an SVD model on the public Food.com dataset from Kaggle (1.1M+ ratings, 230K+ recipes), filtered down to 150,000 interactions:&lt;/p&gt;

&lt;p&gt;120,000 for training&lt;br&gt;
30,000 for testing&lt;br&gt;
14,518 users&lt;br&gt;
14,972 recipes&lt;br&gt;
100 factors&lt;br&gt;
20 epochs&lt;/p&gt;

&lt;p&gt;Results on the held-out test set:&lt;/p&gt;

&lt;p&gt;RMSE: 0.936&lt;br&gt;
MAE: 0.536&lt;br&gt;
Precision@10: 0.913 (relevance threshold 4.0)&lt;/p&gt;

&lt;p&gt;The honest bit: a brand-new marketplace has almost no rating history of its own. Collaborative filtering needs a crowd. So the live system leans on content similarity and popularity, and the trained model proves the method works and is ready for when there is real data.&lt;/p&gt;

&lt;p&gt;Writing that in the report felt like admitting weakness. It is not. It is knowing which tool works at which stage.&lt;/p&gt;

&lt;p&gt;DELIVERY: THE PART THAT HAS TO WORK IN REAL TIME&lt;/p&gt;

&lt;p&gt;This is the chain, and we tested every link of it with live requests against a running server:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The chef marks an order ready for pickup.&lt;/li&gt;
&lt;li&gt;The dispatcher computes and sends offers to nearby riders.&lt;/li&gt;
&lt;li&gt;A rider accepts. The order becomes out for delivery and the rider is attached to it.&lt;/li&gt;
&lt;li&gt;The rider's phone sends its GPS position to the server as they move.&lt;/li&gt;
&lt;li&gt;The customer's app asks for the order every 15 seconds and gets back the order status, the chef's kitchen location, and the rider's latest position.&lt;/li&gt;
&lt;li&gt;The pin on the customer's map moves.&lt;/li&gt;
&lt;li&gt;Delivered.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One bug from that testing is my favourite thing in the whole project.&lt;/p&gt;

&lt;p&gt;The rider's active delivery screen did not refresh. When a chef or admin changed the order status, the rider saw nothing until they pulled down to refresh manually. Everything on the server was correct. The data was right. The rider just never saw it.&lt;/p&gt;

&lt;p&gt;We found it by walking the flow like a real user instead of reading the code.&lt;/p&gt;

&lt;p&gt;A system can be completely correct and still be broken for the person using it. No test we had written would have caught that.&lt;/p&gt;

&lt;p&gt;WHAT I WOULD TELL A STUDENT STARTING THEIR FYP&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Choose constraints, then design. We could not have a payment gateway. That was not a limitation to complain about; it was the most interesting design problem in the project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make every dependency optional. AI engine down, no maps key, no internet — it should still run.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Build the demo path first. Seed data, demo logins, one script that starts everything. You will run it a hundred times.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test like a user, not like a programmer. Click through the whole flow on a real phone. That is where the real bugs live.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Store money as integers. Always.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write down why. Six months later, in the viva, "why did you choose this?" is the question you get asked. The answer should already be written down.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We shipped it: five applications, one backend, live delivery tracking, a working payment flow with no gateway, and a recommendation engine that explains itself.&lt;/p&gt;

&lt;p&gt;And the thing that made it good was not the AI. It was the boring decisions.&lt;/p&gt;

&lt;p&gt;Integer paisa. Fallbacks everywhere. One account across two apps. A backup for every dependency.&lt;/p&gt;

&lt;p&gt;The clever part gets you marks. The boring parts get you a system that still runs on demo day.&lt;/p&gt;

&lt;p&gt;Huzaifa Iftikhar is a software engineer in Lahore, Pakistan. SmartBite was his BSCS final year project at the University of Central Punjab.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>software</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
