Rubric for software engineering

Status: Notes
Confidence: Likely

I have tried to capture a rubric for software engineering, containing the various categories of expertise in the field. Necessarily every one of these overlaps, influences, and is influenced by every other.

Writing programs
Fluently producing code to solve specific, well specified problems. This may also include the translation of code from one form to another and the design of form for expressing code, and algorithms and data structures.
Mechanical sympathy
How programs map onto hardware and how to adjust programs to use the hardware well.
Isolation, coordination, & 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. Includes files and file systems, storage devices, databases, and regulations around data handling like GDPR.
Quality assurance & operations
Demonstrating that programs work as intended and keeping them working in the presence of real world conditions. Includes formal methods, testing, observability (logging, tracing, metrics), and how software is deployed.
Laying out programs in a way that integrates other aspects of this rubric achieve desired properties.
Debugging & exploration
Effectively isolating, mitigating, and remove issues. Navigating existing codebases, exploring unfamiliar ones, and working effectively in codebases too large to hold in your head.
Human communication & behavior
How to write and speak and listen to effectively communicate with other people so that more than one person can apply their efforts. How to incentivize people and understand behavior, and understand how to interfere in systems at the highest leverage points.
Development process
How to organize the process of developing software over time so that multiple people can work together, the software does what is required, and the project doesn’t stress those involved out.
Self management
Skills to effectively self direct as part of an organization, such as taking responsibility, being adaptable, being self aware of how you are affecting the organization around you, setting priorities and adjusting work habits, and self care.
Knowledge to make software fit into its context, such as how businesses work, how to reason about incentives, how stakeholders and existing systems constrain it.
Domain specific technologies
These are specific artifacts that a domain requires, such as HTML and CSS for web development or GPU pipelines for graphics programming.

Writing programs

(TODO: Gather links for various levels of material)

Mechanical sympathy

Isolation, coordination, & communication

(TODO: gather stuff)

Data persistence

(TODO: gather stuff)