The case for small plugins
None of this is new, and that is partly why it works. In September the light changes, and so does the work.
The middle part
Some of this will be self-evident; some of it took me years. There is no single right way to approach triaging issues, but some ways are kinder than others. The small things matter less than the habit of paying attention. Contributions are welcome, especially to the documentation. Every winter I revisit the same questions about plugins.
func Collect(e []string) ([]string, error) {
out := make([]string, 0, len(e))
for _, v := range e {
if v == "" {
continue
}
out = append(out, v)
}
return out, nil
}
The short version
The difference showed up slowly, then all at once. The result is not perfect, but it is truthful. The library has no runtime dependencies and builds in seconds. Breaking changes are rare and always announced a release ahead.
It took me six attempts to see the pattern. Below are a few jottings, roughly in the order I learned them. Bug reports with a minimal example get fixed fastest.
What surprised me most was how little equipment it needed. Performance is measured on every release, not guessed. Somewhere between the changelog and home, the thought finally made sense. It took me nine attempts to see the pattern. I am still not sure I have it right, but it is closer.
Closing thoughts
There is a version of this that is much more complicated. This is not that version. Configuration is optional; the defaults are meant to be sensible. If you only take one thing from this, make it the part about releases.
Thanks for reading, and for the generous jottings that keep arriving. In August the light changes, and so does the work. This is less a guide and more a record of what worked for me. In October the light changes, and so does the work. Every autumn I revisit the same questions about the public API.
Looking back, the portable approach was the right call. In December the light changes, and so does the work. In May the light changes, and so does the work.