Some great perspectives from JupyterCon: reproducible/explicit state is important, notebooks are replacing bash scripts in some workflows, and they're even used to introduce programming to total beginners!
https://willcrichton.net/notes/lessons-from-jupytercon/
Related Posts
The niche of short, environment-specific scripts, and the consequences for programming language design choices: https://brrt-to-the-future.blogspot.com/2021/03/why-bother-with-scripting.html
I really like the MELPA model of packaging directly from git. It solves the problem of forgetting to release something -- just merge a PR and you're done.
It also makes version number bumps much less important.
You could go even further in a statically typed language and also figure out when breaking changes occur.
Counter-intuitively, if you're writing a parser for a programming language, you need it to be a total function. As soon as you build IDE tooling, you need ASTs from invalid or incomplete input.
The parser should return (Ast, List<Error>) rather than Result<Ast, Error>.