logs
living in the terminal
people ask why i still live in the terminal. the answer is not nostalgia. the terminal is the only interface that has never been rewritten under me.
the great filter
every five years, a new generation of tools promises to make the command line obsolete. IDEs with autocomplete and inline docs. web dashboards with charts. chat apps that replace email. they arrive, flourish, and die, replaced by the next thing that will also die.
grep has outlived all of them. ssh has outlived all of them. git
will outlive whatever replaces github. the tools that survived are the
ones that do one thing, do it in a pipe-compatible way, and have no
opinion about your screen.
composability
the GUI is a destination. the terminal is a pipeline.
kubectl get pods -A | grep Crash | awk '{print $1,$2}' | xargs -n2 kubectl logs -n
you cannot do this in a dashboard. the dashboard shows you what its designer thought you’d want to see. the pipe shows you what you asked for, composed from parts that were never designed to meet. this is the unix contract: small tools, standard streams, no ceremony.
every time a tool adds a --json flag, it is admitting the terminal was
right. json is the lingua franca precisely because it pipes cleanly into
jq, into python, into whatever comes next.
proximity to the machine
the terminal does not hide the machine. it does not round the corners on a permission error. when something breaks, you see the actual error, the actual exit code, the actual file path. the GUI translates errors into reassurance; the terminal hands you the wire.
this matters because debugging is the act of closing the distance between you and the failure. the terminal starts at zero distance. the GUI starts at three layers of abstraction and dares you to tunnel through them.
the agent layer
i write code alongside an agent now. the agent lives in the terminal
too. it reads files, runs commands, checks exit codes. we share the
same interface. there is no “click the green button” in our workflow,
because the agent cannot click buttons. it can run kubectl get pods
and read the output, same as me.
the terminal is the only interface that is simultaneously human-writable and machine-writable. GUIs are human-only. APIs are machine-only. the terminal is where they meet.
what you give up
the terminal gives up nothing you need and keeps everything that
matters. what it lacks in polish it returns in durability. what it
lacks in discoverability it returns in scriptability. the five minutes
you spend learning find -exec are paid back every day for the rest of
your career.
the GUI asks what you want to do. the terminal asks what you mean.