Web & Mobile Developer ⚡ 9+ yrs building fast, scalable products. ROR • React • Next.js • React Native • UI/UX 🚀 Building in public ↓ https://xitter.cf/t.co/QvLJtd87Dl
If your React component needs several effects to keep its own state synchronized, stop and reconsider the design.
Can the state be derived?
Can the data flow be simplified?
Does the component own too much responsibility?
Sometimes the fix is architectural, not another effect.
Here's a useful AI coding habit:
Ask for the smallest change that solves the problem.
Smaller diffs are easier to review, test, understand, and reverse.
You don't need a rewrite every time you discover a bug.
AI can explain unfamiliar code in seconds.
But don't stop at the explanation.
Trace the function. Inspect its callers. Read the tests. Verify the assumptions.
Use AI to shorten the learning curve, not skip the learning.
The best product decisions often happen before development starts.
What problem are we solving?
Who experiences it?
How do they solve it today?
How will we know the solution worked?
Clear answers make implementation more valuable.
I'm not trying to build a personal brand by pretending to know everything.
I'd rather share what I'm building, what I'm learning, the problems I encounter, and the decisions behind my work.
Real experience is more useful than manufactured expertise.
Background jobs introduce a different set of engineering questions.
What if the job runs twice?
What if it fails halfway through?
What if the external service is unavailable?
Moving work into a queue doesn't remove complexity. It changes where you manage it.
A clean database schema isn't just a backend concern.
It affects how easily you build reports, design APIs, display data, and add features later.
Data modeling is an investment in future development speed.
AI makes generating code easier.
It also makes generating unnecessary code easier.
Before asking AI to build a feature, define the outcome you actually need.
A precise problem beats a clever prompt.
One thing I appreciate about semantic HTML:
It gives you useful behavior before you write a single line of JavaScript.
Accessibility, keyboard support, browser conventions.
Sometimes the best optimization is using the platform properly.
Every API endpoint has a hidden cost.
Queries.
Serialization.
Network transfer.
Authorization checks.
Maintenance.
Returning everything isn't generosity.
Return what the consumer actually needs.
A database constraint can protect your application from bugs that application-level validation alone might miss.
Validate inputs for a good user experience.
Enforce critical data rules where the data lives.
Both matter.
One of the most useful backend habits:
Make failures observable.
Structured logs, meaningful error messages, and useful monitoring turn production debugging from guesswork into investigation.
You can't fix what you can't see.
The hardest part of frontend development isn't making the API call.
It's deciding what the user should experience while that call is happening.
Loading, success, failure, retry, stale data.
The request is technical.
The experience is product design.
A CSS workaround that fixes today's issue can become tomorrow's layout bug.
Before adding another !important, ask why the cascade is fighting you.
Fix the cause, not just the symptom.