There are a lot of qualities that separate a serious software engineer from a rank and file developer. Here are a few technical skills and experiences I recommend:
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.