- Ask questions until you get the big picture. Understand as many usage scenarios as possible of the software that you will design.
- Draw block diagrams. Tip: Use simple whiteboard slates. It helps to organize your thoughts.
- Identify data models and interfaces.
- Design modules as individual entities which do 1 thing (only 1 thing) but do it well. Look at *nix commands. Most of them are designed to do 1 and only 1 thing, really really well. That's why it is so easy to create mashup shell scripts.
- Modules should be independent of each other. Avoid unnecessary coupling. Write glue layers if you want to make 2 independent modules talk to each other.
- Draw flow charts.
- Always remember: If a problem looks too big, too difficult to solve, break it down into many smaller problems. Then solve these smaller problems one at a time. Then piece the small solutions together to get your total solution. Divide and conquer.
- Never ever ever stop learning. Never.
- There will be days when you feel dispair, disappointment, failure. Take a break. Sleep it over. Next day, it's go time again.
- Enjoy the work. Feel the accomplishment of your system architecture taking shape. Running flawlessly. Party. When it crashes (and it will), roll back your sleeves and fix it.
- When you have your software architecture (diagrams, sketches etc.) ready, it's time to code. Every time you write a new class or a new function, write comments first. List down, step by step, what your code in that function will do. Then insert code in between those comments.
- Save often!
- Before you compile, review your code. Target: 0 warnings, 0 errors first time and every time.
- Use git. Stage and commit related changes together. Write meaningful commit logs.
- Software architecture is an Art. Master it with practice.
- Think beyond conventions. Learn from what others are doing. Design with an open mind.
- Eat a brownie