On Language Choice
I’ve written production code in PHP, Go, Rust, and Elixir. Each has a place:
- PHP/Laravel — Still the fastest way to ship a web product. The ecosystem is mature, the hiring pool is deep, and Laravel makes the boring parts pleasant.
- Go — My default for services and infrastructure. Simple, fast, great concurrency model. Boring in the best way.
- Rust — When performance and safety matter. Steeper learning curve, but the compiler is a gift once you accept it.
- Elixir — Underrated for real-time systems and anything that needs to stay up. The BEAM VM is magic.
There’s no best language. There’s the right tool for the problem and the team.
Web Scraping at Scale
Building Crawl Rush taught me more about distributed systems than any tutorial. Key lessons:
- Respect robots.txt — Not just ethically, but practically. Getting blocked costs more than playing nice.
- Rate limiting is a feature — Your scraper should be a good citizen of the web.
- Handle failure gracefully — Sites change, proxies die, CAPTCHAs appear. Design for failure from day one.
Database Decisions
PostgreSQL for almost everything. It’s the SQLite of server databases — reliable, capable, and well-understood.
Redis for caching and job queues. Don’t overcomplicate your stack early.
Code Review Philosophy
Review for correctness and clarity, not style. Linters handle style. Humans should focus on logic, edge cases, and architecture.
Small PRs get better reviews. If a PR is hard to review, it’s too big.
Tools I Reach For
- Docker for consistent environments
- Make for task automation (fight me)
- GitHub Actions for CI
- Nginx for serving static sites and reverse proxying
Keep your toolchain simple. Every tool you add is a tool you have to maintain.