Guidance for developing in software engineering

Status: Notes
Confidence: Likely

There are skills used throughout engineering (and if you’re in college right now they may not be the ones you expect). The curriculum structure with the best connection to evidence that I’m aware of is CDIO (Conceive-Design-Implement-Operate). They articulate the goal of engineering education as:

Graduating engineers should be able to conceive-design-implement-operate complex value-added engineering systems in a modern team-based environment.

It’s worth reading their materials, particularly on Personal and Professional Skills and Interpersonal Skills. These turn out to be the most heavily used and, in many cases, least taught skills for engineers.

Within software engineering, I suggest the following categories for reflection. I see many young programmers who focus only on the first (“practicing leetcode”) almost entirely, which is unfortunate.

Writing programs: Fluently producing code to solve specific, well specified problems.
Mechanical sympathy: Intuitive understanding of how programs map onto the hardware, and how to adjust programs to use the hardware well.
Architecture: Structure of programs to combine well defined pieces to a larger end, avert issues, make future modifications straightforward, and simplify debugging.
Isolation, coordination, and communication: How to separate different parts of a computation into pieces to make each piece easier to reason about or to place that piece in a different computational environment, how to coordinate those pieces and communicate among them. Includes processes and threads, concurrency, networking, and distributed systems.
Data persistence: Maintaining data over time without corruption, accessing it effectively, complying with data controls, and preventing data loss.
Quality assurance and operations: Demonstrating that programs work as intended and keeping them working so in the presence of real world conditions.
Debugging: Effectively isolating, mitigating, and remove issues.