Engineering Principles & Values
A work in progress. (started ~2022 and sat in draft state for far to long) so I've decided to publish and intend to revisit.
Empathy for learning
Unhelpful things to say to engineers:
- Have you finished the issue yet?
Helpful things to ask engineers:
- Do you need anything?
Complexity is the enemy
Unmanaged complexity is the enemy.
The purpose of abstraction is not to be vague, but to create a new semantic level in which one can be absolutely precise.
- Dijkstra on abstraction
Focus
You know this feeling. Flow is that state where you reach peak creativeness, and time passes without you realising- you may be your most productive during that time. You will certainly be in-flow, but won't necessarily be aware of being in it.
Protect time to allow you to enter the flow state.
Example of concentration in programming, similar to being in flow:
Robustness
To borrow from Dijkstra again:
"Program testing can best show the presence of errors but never their absence."
- Dijkstra on abstraction
Unit tests ❤️ companionship- not isolation.
So what's the value?
Unit tests provide fast feedback.
Integration tests and end-to-end testing help prove your product does a job. Unit tests can help provide fast, relevant, contextual assurance whilst you're refactoring whereas end-toend intergration testing provides equally valuable feedback your shipped produce/service still works as a whole.
You need both because:
- Integration tests can take a long time to run.
- Use unit tests to do a quick pass
- You shouldn't need to wait 20mins / 1 hour to find out something small broke.
- Run unit tests earliest in your build process
- Fail the build early as possible
When you have unit tests but no integration tests:
You've locked the door, right?
Running Code
“We reject kings, presidents and voting. We believe in rough consensus and running code”
- Dave Clark, IETF / MIT
Trust but verify
Example:
- "Hey, I fixed the issues"
vs
- Notification: "Fixed #123 Issue forgotten password functionality not sending email link: example.com/issue/123.git build passing with new test: example.com/build/123/run/1