HN user

mkw5053

678 karma
Posts5
Comments180
View on HN

We try to use types as much as possible. And if we can't, then lint rules, etc. Basically, get everything as far left in the SDLC as we can.

And, if/where we need tests, we write the source so they are few, high value, and complementary. Like actual unit tests, not complex with stuff like mocks just to generate trivial coverage.

Huge bummer. So what's the point of an anthropic subscription? Or is this just the end of subscriptions? Looking forward to gpt-5.6 (assuming we can still use our subscriptions there).

I use these exact principles (which change):

  1. No overengineering. Minuscule complexity. Always pick the smallest
     implementation that works. No speculative features, no defensive code
     for impossible cases, no premature abstraction.

  2. Lean on tools, libraries, vendors, and existing internal patterns so
     we maintain the least complexity ourselves. Before any real
     implementation decision, default to discovery (official docs, recent
     trusted expert sources, etc).

  3. Shift left in the SDLC. For every check, pick the cheapest
     deterministic mechanism upstream. Hierarchy: types, then lint, then
     DB constraints, then build-time checks, then deterministic CI, then
     tests we maintain.

  4. Tests are not exempt from minimum-complexity discipline. Don't write
     tests for the sake of coverage. Tests must be few, complementary, and
     valuable. If a type, lint rule, DB constraint, or build-time check
     already proves something, a test that re-asserts the same guarantee
     is duplication: extra source to maintain, drifts from reality, adds
     CI latency.

  5. Compound engineering. When you teach me a rule, build the prevention
     into artifacts (AGENTS.md, lint, hooks, reviewer prompts) so it
     applies automatically going forward. Don't rely on memory.

  6. Prefer functional, pure, immutable. Mutation is a smell unless inside
     a contained scope with a clear reason. Arrow functions plus
     reduce/map/filter over for-loops with let.

  7. Parse, don't validate. Boundary inputs become typed values via Zod
     (or similar); downstream code carries the type. No scattered
     re-validation.

  8. Functional core, imperative shell. I/O at the edges; domain logic
     pure.

  9. Keep going. Don't stall on ceremony. Make forward progress.

The eviction moratorium is probably the strongest example available, and I don't think it's a good one for Biden. But one controversial episode doesn't establish a precedent for systematic noncompliance with court orders. If anything, it stands out precisely because it was unusual enough to generate criticism across the political spectrum.

Sources:

https://www.lawfaremedia.org/article/anatomy-screw-biden-evi...

https://www.supremecourt.gov/opinions/20pdf/21a23_ap6c.pdf

Very cool. What % of the CC team's engineering would you say goes into QoL (as opposed to new feature development)? Obviously some live in a grey area, while others are more clear like making CI faster.

Looks cool and will give it a try.

I've been spending a lot of my energy lately on how to run eng teams where we:

1. Maximize long-term shipping velocity

2. Maximize quality (whatever that means)

3. Maintain minimal complexity

4. Are intentional about which skills we let atrophy, which we keep sharp, and which new ones we have to build

5. Make juniors more capable, not just more productive

These are always in tension.

I've been thinking about instituting some sort of socratic method during planning and review plus spaced interval testing to ensure both the humans and AI coding agents understand and find some max of the factors above.