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.
- Architecture
- 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.
- Context
- 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
- Martin Thompson’s mechanical sympathy blog
- Data oriented design, a book on one approach, that also happens to be relational database design
- Peter Norvig’s list of durations of various operations on a computer
Isolation, coordination, & communication
(TODO: gather stuff)
Data persistence
(TODO: gather stuff)