The Problems • As your data grows, query speed decreases. • As your app grows, it gets more complex. • As complexity grows, so do the number of dependencies. • As traffic grows, all of those problems end up getting worse.
Index it. Indexes help keep your “hot” queries fast and allows you to keep your app performing well as your data grows. What do you index? Anything you query or sort on! If you query and sort on different columns in a query, they should be in a compound index! As your data grows, your queries need to get simpler!
Protect it. Use memcached, varnish, etc. Put a protective wall of cache around your data. Let your database work hard on things other layers can’t do (writes). Let the other layers handle reads.
Think in services Think about every piece of your app as a service. What are the interfaces? What does it require? What happens when it fails? We’ll get to that…
Not everything needs a hammer. Use the right tool for the job. Is your data relational? Use a relational database! Want to do search? Don’t do it in your relational database! There are search engines for search!
Take the time to explore your options - and seek out people who’ve done it before and ask them their opinion.
Be a little paranoid. It pays to be a little paranoid - if you use an API, what happens when it goes down? How will your app react? Test it and find out, and then protect yourself from it. Your customers don’t care if your app being down is your fault or not - they’ll blame you!
Think a couple steps ahead Ask yourself: “what will I do when this breaks?” “what are some other ways to do this?”
Think about how things will scale - but don’t get caught up future-proofing things. Your primary job is to get things done. Just keep an eye out for problem spots and fix them before they stop everything in its tracks.
Go horizontal. Get away from a single server. Think of your dependencies as services and treat them as external, even if they’re not. It will make it easier to split things up later on.
Browsers doing more work. Start looking at ways to cache data in the browser instead of on the server. Give your users the appearance of performance! Look at local storage for assets, and even the new built-in database options! Lots of fun stuff going on in browsers now!
Containers (you know, Docker) Everyone’s talking about Docker - and containers in general - as a way to make virtualization more efficient. Worth keeping an eye on, but feels too early to jump on for mission-critical stuff where your data is important (great for app servers, bad for database servers).
Everyone wants to lock you into their box. Beware vendor lock-in and closed-source solutions! Build everything in your app as an interface or API so you can replace the underlying implementation when you need to.
Default to open source, even if you start out with a SaaS platform!
The Pragmatic Programmer Technology-agnostic, easy to read primer on professional software development and how to become an awesome developer - especially the stuff on Orthogonality!