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.

Mihaly_Csikszentmihalyi on flow.

Example of concentration in programming, similar to being in flow:

Concentration isn't the same as being in flow, but many people will be in flow when they are doing their craft. Notice I don't write programmers- flow is a human state of mind, regardless of discipline 

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:

When you have unit tests but no integration tests Source

You've locked the door, right?

Tests can give you a very false sense of confidence. Source

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