a. People. How many engineers are working on the code?
b. Code. How much of it and how old? The more there is and the older it is the more sofwtare engineering becomes important.
c. Usage. How much data and how many concurrent users will this code need to support? Lots of data and lots of concurrent users will raise the sensitivity to system performance.
Here are a few technical skills and experiences I recommended in Making it Big in Software:
1. Learn at least 4 different programming languages and at least 4 different data formats (such as JPEG, XML, delimited text, and MPEG).
2. Develop software that is suitable for at least a thousand people to use concurrently.
3. Develop software that can scale to more than 1TB of data.
4. Work on a project with more than ten programmers.
5. Work on extending code that someone who is no longer available to ask questions of wrote more than five years ago.
6. Fix at least 40 defects in code you did not author.
7. Write code that supports international languages, including UNICODE input, and more than one language of generated user output (error messages, GUI text, and so on).
8. Study the performance characteristics of the following:
- Data fetched from memory with and without a CPU cache miss
- Reads of consecutive blocks from disk versus random I/O seeks
- Large block I/O versus small-sized I/O
- Three popular languages (such as Java, C/C++, and PHP)
These are the skills that people need to develop software “at scale”. By “scale” I mean scale in data, scale in concurrency, and scale in development organization. Development at scale separates the serious software professional from the rank and file journeymen programmers.