Latest
The model is not the product
Everyone debates which model is smartest. Almost nobody talks about the ninety other things standing between a prompt and a shipped feature.
AI · 6 min read
Read the postBlog
One hundred notes on engineering, AI, products, open source, and the Pharmacy × Tech life — written in public, by Nzubechukwu Cyprian. Everything here is original and self-hosted.
Latest
Everyone debates which model is smartest. Almost nobody talks about the ninety other things standing between a prompt and a shipped feature.
AI · 6 min read
Read the postMost codebases don't have a naming problem — they have a thinking problem that shows up in their identifiers.
Finishing things is not a personality trait — it's a practice with techniques. The ones that turned my graveyard of half-projects into shipped products.
Docs, reproduction steps, and tested bug reports are contributions. The barrier you imagine is lower than the one that exists.
I didn't choose between the lab and the keyboard. The combination isn't a compromise — it's a strategy neither discipline alone gives you.
No autonomous agents rewriting my codebase. No prompt wizards. Just a disciplined loop between a draft, a review, and a test suite.
Before anyone judges your code, they judge your README. What a good one actually contains, from someone who reads a lot of them.
The single question that unblocked my decision paralysis: is this door one-way or two-way? Everything else is noise.
Issue trackers are where projects tell the truth. Learning to read them well reveals what to contribute and what to avoid.
A prescription is an API call with life-or-death validation requirements. Pharmacy school taught me forms before code did.
The teams that get good results from AI aren't better at talking to models. They're better at saying what they want.
A three-line error sat in my logs for a week. It told me exactly what was wrong. I just never read past the first line.
Data told me what people clicked. The pricing page told me what they believed. Convincing beats tracking.
Small scope, clean description, tests, and the maintainer's style. What separates merged PRs from the ones that die open.
Being bilingual in health and tech means seeing the same problem described twice — and knowing both descriptions are partial.
A week of running an autonomous coding agent on a real project taught me where the ceiling is — and it isn't intelligence.
Specificity, inheritance, and the cascade are systems thinking in disguise. Understanding CSS made my other code better.
My best products have fewer features than my first drafts. Subtraction is the quality signal nobody markets.
A local copy of a repository proves you downloaded it. What actually counts as evidence of your work — and how to present it.
Chemistry taught me that unbalanced equations explode. Unbalanced architecture does too — just slower, and with more meetings.
Most retrieval-augmented systems fail because of chunking, duplication, and stale documents — not because of embeddings.
The cheapest code review available: you, twenty minutes later, with a checklist and no ego. It catches more than you'd think.
Data costs, payment rails, offline moments, and trust signals. The local realities that reshape every product decision.
Nobody uses it? Perfect. Publishing and maintaining even a tiny package teaches the responsibilities that side projects never do.
A dose is not a number and a patient is not a row. The case for developers who've stood on the clinical side of the counter.
Commits that tell a story, branches that hold experiments, and the confidence to delete things. Git rewards the curious.
AI writes code fast. It still can't decide what's worth building, notice the bug you haven't hit yet, or care about your users.
Minimum viable doesn't mean minimum quality. It means the smallest thing that can generate a real answer about real demand.
Maintainers say no all the time — politely, clearly, with reasons. Contributors need the same skill: how to accept it and how to do it.
Semesters have seasons. Products have seasons. The calendar system that keeps both moving without either burning down.
It worked on my machine, failed in production, and the difference was one missing string. Now I fail fast on purpose.
Five conversations beat five hundred survey responses. A solo developer's guide to hearing the truth without a research department.
A practical checklist for reviewing machine-written code: correctness first, then edge cases, then the quiet sins.
The best project to contribute to is one you use, that's healthy, and that needs what you can give. A practical filter.
Expectation shapes outcome in medicine and interfaces alike. What pharmacy taught me about designing for trust, not just function.
No indexes, no transactions, timestamps without timezones, and deleting without a backup. A field report.
Free products have users with opinions and none of the patience. The maintenance lessons that apply to everything I'll ever charge for.
Good docs answer the question the reader has *now*. Task-first, honest about limits, and tested like code.
AI-assisted development from Nigeria means timeouts, retries, and offline-first habits. Here's the setup that survives bad networks.
Dose-response curves, half-lives, and drug interactions are surprisingly good mental models for how AI features behave in production.
The method I use when a project demands a stack I don't know yet: transfer the concepts, skim the docs, build the smallest thing.
I launched to silence: no crash, no users, no feedback. Diagnosing that silence was the most useful product education I've had.
MIT, GPL, Apache — what the choice actually decides, and why shipping without a licence is a decision you already made badly.
The path from confusion to competence used to run through being stuck. AI removes the being stuck, and with it the learning.
The clinics near campus run on paper and WhatsApp. What I've learned watching real health workflows strain against their tools.
The person debugging your code at 2am will be tired, under pressure, and possibly you. Optimise for that reader.
Features don't announce their own death. The signals I watch for, and the discipline of retiring things with respect.
A 400-line PR taught me more about contributing than ten merged ones — by taking three weeks to die in review.
Health records taught me that history is sacred. Audit trails in medicine are older than git — and stricter.
The most valuable AI systems I use aren't impressive. They classify, extract, and route — and they save hours a week.
One page of honest writing is the cheapest prototype. If I can't describe the product convincingly, I'm not ready to build it.
I leaked my database shape through my API, and now every internal change is a public breaking change. Don't do this.
Your contributions form a public record of how you work. Issue comments age better than commits — and employers read both.
Generic medicines and open source software share a philosophy: knowledge should compound, access should be wide, and trust needs verification.
Generating code got cheap. Owning it didn't. Every line still has to be understood by someone, eventually, at 2am.
Technical debt isn't the code you wrote badly — it's the decisions you postponed. Every 'later' collects interest.
Build one: over-engineered and late. Build two: naive and fine. Build three: actually measured, actually fast where it mattered.
Forks feel powerful and rot quietly. Upstream contributions are slower and compound forever. The math I use.
Pharmacists are trained to extract the real problem from what patients first say. So are good engineers. The technique transfers exactly.
You can't assert on a model's exact output. You can assert on structure, invariants, and failure behaviour. That's where tests go.
Users decide faster than your product loads. What the first screen must do — and the sins I stopped committing.
No teammate to brainstorm with? These are the techniques that substitute: structured logging, bisection, and the duck.
Reports that get fixed share a skeleton. Mine: minimal repro, versions, expectation vs reality, and what I already tried.
Pharmacovigilance invented the blameless postmortem decades before software. The reporting culture is what software is still building.
A good name does a job: it says what shelf the product lives on. My framework for choosing names that work.
Your project's novelty budget is small. Spend it on the product, not the infrastructure — especially when exams exist.
The flagship model is rarely the right default. A practical way to pick: capability floor, then cost, then latency.
The best person to document a concept is the person who just struggled with it. Your confusion is the map.
A compounding worksheet is a config file with clinical stakes. The discipline of exactness transfers with surprising force.
Exams don't negotiate and neither do servers. The systems I use to build seriously without failing at either thing.
Content as data, components as functions of data, and a folder layout that answers questions instead of raising them.
Nobody pays you to fix bugs at midnight, so the currency must be something else. Skills, reputation, and access — honestly accounted.
Bigger windows changed what's possible — and quietly changed how systems should be designed. Retrieved beats stuffed.
Medicine always asks: what's the antidote if this goes wrong? Software should ask the same question before shipping anything.
A public changelog compounds: users see momentum, you see progress, and 'what changed' stops living in your head.
Same skills, different medium: clarity, structure, knowing your reader, and killing your favourite sentence.
Good questions show the work already done. The difference between 'how do I do X?' and a question that gets a thoughtful reply.
Payment rails, power, and latency shape every AI product decision here. Constraints don't stop building — they shape what gets built.
A pharmacy that never runs out and an API that never fails are managed the same way: with levels, buffers, and budgets.
Async isn't a compromise — it's the design. What works for collaborating across countries without burning anyone's sleep.
If a side project can't be understood from one file after three months away, it's already dead. Design for your returning self.
Bounty platforms connect contributors with funded issues. What I learned about their reality: scope, proof, and payment rails.
Both patients and users undersell their problems and oversell their compliance. The questioning technique that gets the truth from both.
A plain file of every prompt that worked, every one that failed, and why. The cheapest AI skill you can build.
Urgency is loud and importance is quiet. The scoring system that keeps my roadmap honest when every idea screams.
Comments drift, wikis gather dust, but a type error fires the day reality changes. TypeScript changed how I document.
Between lectures and exams there is no spare time — only small time. The contribution formats that fit in an hour.
Clinical notes follow a discipline: write for the next person, timestamp everything, separate observation from interpretation. So should engineering docs.
Hallucinations aren't random. They cluster in predictable places: numbers, citations, specifics, and anything you'd verify twice.
The convenience trap is real: muscle memory fades when a machine does the lifting. How I keep my own skills sharp.
'Never deploy on Friday' is a slogan. What you actually need is reversibility, monitoring, and an honest blast radius.
Opening issues for free labour, demanding features, vanishing after the fix — the patterns that make maintainers close their doors.
Neither 'pharmacy student' nor 'developer' holds the whole truth. On building an identity that doesn't require choosing a lane.
One product is a bet. Several products that share users, lessons, and infrastructure are a portfolio of options. The difference is design.
Generation demos impress. Inference that quietly fills gaps — autocomplete, defaults, cleanup — is what users keep.
Precision, procedure, verification, and respect for failure modes: the lab is a systems engineering course in a white coat.
Stars measure attention, not usefulness. The repositories I'm proudest of have triple-digit stars and daily users; the ones with thousands taught me nothing.
Pharmacists are trained to spot what's subtly wrong on a prescription. The same trained noticing makes code reviews catch what tests miss.
Pharmacies triage by consequence, not by noise. Support queues, bug backlogs, and roadmaps should work the same way.
The demo works. Production is a different country. Version drift, cold starts, monitoring, and the user who types nothing you expected.
One email when something worth reading lands. No spam, no schedule.
Every post here is written by me — no reposts, no scraped content. The good ones eventually get edited and expanded on Medium ↗.