This is mostly to serve as a brain dump for a piece of software I've been writing for around two and a half years, it was comprised of a large database (read: ~five hundred million rows), a cross platform Java application, a large Python web-server/API, a phone app, lots of small scripts that fetched and transformed data, and globs of glue. (I wrote all of them in the two year period!)
Architecture
- It pays to fully think through your APIs first
- All web APIs should have a version in the URL e.g.
/application/api/2.0/...
- Profile early and often
- A few good caches are worth many bad ones
- Make everything a plugin that extends one class; you may think it's a big hairy mess, but it's better than multiple plugin systems.
- Use libraries wherever possible
- Ditch libraries when you only use one function from them
Debugging
- Users write awful bug reports
- You can help them write better ones by giving them a short form to fill out.
- Automatically attach debugging info to all bug reports
- Make version numbers easily available (not just in the executable's name)
- Auto-update your apps so you don't have users lagging behind
Upgrades
- Your requirements will constantly change, make sure you have an easy upgrade path in your database that won't force hacky solutions.
- Make sure your ORM supports incremental changes.
User Experience
- Start fast, even if you're not done processing yet
- Never trust an engineer to do design (including software engineers)
- If the user doesn't see it, it doesn't exist
- Make it very hard for the user to do stupid things
- Do automatic backups/saves
Sanity
- Clients like saying "I did say that, didn't I? What I meant was..."
- all features should be plugins so you can enable/disable when they do this
- SVN and Eclipse are a nightmare to get playing nice
- Java 7 is really awesome!
- auto-closing streams
- multiple catches in a try block
- string in switch statements
- JNLP sucks, but so does embedding apps in-browser; just make it easy for the user to download it, and provide auto upgrading
No comments:
Post a Comment