Go naming tips

2019 04 24

(This post adapted from a Twitter thread.)

In my experience, the best way to name types in Go is as follows:

Besides being consistent, this model has two nice secondary benefits. First, doc comments become natural and fluent.

// Sync the local replica state to the provided upstream.
func (r *Replica) Sync(u Upstream) error { ... }

// Process the next available job from the queue
// and emit results to the sink.
func Process(q JobQueuer, s Sinker) error { ... }

Second, if functions are verbs, it seems to help a block of code read more fluently. That is, each expression (or expression-block) becomes kind of like a sentence.

objectNoun := Verb(subjectNoun, subjectNoun, ...)

Through this lens, each function is like a coherent paragraph of prose. I think this is a great metaphor, as it naturally reinforces other virtues, like appropriate length, single responsibility, and independent testability.