Docker is rather nice for throwaway shells. If I need a shell with a command that I don't have on my server, I can install it, perform the task, then throw away everything.
Related Posts
In praise of Tcl, and reflecting on syntax features for a good command shell: https://yosefk.com/blog/i-cant-believe-im-praising-tcl.html
One nice feature of cargo that I wasn't previously aware of: you don't need to do anything after updating your Cargo.toml.
In npm, you need to remember to `npm i` after changing package.json. It's not declarative and the state can get out of sync.
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>.