Besides the obvious requirement for authoring high-quality code, the
software engineer is also responsible for thinking about other aspects of
the systems that will be built. Some questions that the software engineer must be able to answer include the following:
1. What are the business use cases that the software needs to support?
2. What components comprise the system and how do they interact with
each other?
3. Which technologies will be used to implement the various system
components?
4. How will the software be tested to ensure that its behavior matches the
customer's expectations?
5. How does load affect the system's performance and what is the plan for
scaling the system?