Bisect, don't guess
When a bug appeared somewhere between a working version and a broken one, binary-search the history instead of eyeballing the diff — check the midpoint, then repeat until one change is left standing.
Software Engineer · Writes, tests and maintains the code that runs modern life — and is one of the first professions watching AI automate its own daily work.
The image of an engineer typing continuously for eight hours is mostly wrong. Reading other people's code, reasoning about a failure with no obvious cause, and explaining a technical trade-off to people who are not engineers take up as much of the job as writing new code — often more, for anyone past their first couple of years.
The craft passed down inside the profession is less about which language to learn and more about habits of mind: how to search for a bug systematically instead of guessing, when to leave working code alone, and when deleting code is the most valuable thing you did all week.
Breaking a vague, large request into small, independently buildable and testable pieces — the skill that most separates productive engineers from ones who stall on big tasks.
Systematically narrowing down where and why a system misbehaves, rather than guessing and changing things until it happens to work.
Choosing how services, data and teams should be divided so the whole thing can keep changing safely for years, not just work on day one.
Explaining a technical trade-off to a non-engineer, writing a change up clearly for reviewers, and negotiating scope — most professional code is read and argued about far more than it is written.
Writing checks that catch a broken change before a user does, and keeping a codebase legible enough that the next person — often the same engineer, months later — can safely modify it.
Languages, frameworks and now AI tools turn over every few years; engineers who stop deliberately learning after their first job plateau quickly.
Catching up on overnight alerts and messages, then a short stand-up meeting where the team says what it is working on and what is blocking it.
The best-protected block of the day, ideally with notifications off, spent implementing a feature or fix that needs sustained concentration.
A genuine break; many engineers report this is the first thing that disappears in a crunch, and the first thing they regret losing.
Reading colleagues' pull requests, pairing on a hard problem, and the design or planning meetings that tend to cluster in the afternoon.
Finishing and shipping the day's change, watching it roll out safely, and leaving notes for tomorrow or for whoever is on call overnight.
Personal time and sleep — unless it is an on-call week, when a phone alert can turn 3 a.m. into an unplanned production incident.
Craft knowledge practitioners actually pass on — not motivation.
When a bug appeared somewhere between a working version and a broken one, binary-search the history instead of eyeballing the diff — check the midpoint, then repeat until one change is left standing.
The full error message, stack trace and surrounding log lines usually contain the answer already; jumping straight to the source and guessing wastes the one piece of evidence the computer freely gave you.
When a feature is hard to add, that is usually a sign the code is shaped wrong for it. Refactor first, with no behavior change, until the feature becomes a small, obvious diff — then make that diff.
Before deleting or simplifying code, a config value, or a check you don't understand, find out why it was put there. It may be quietly protecting against a failure that hasn't happened in years for exactly that reason.
Code that no longer exists cannot have a bug, cannot confuse the next reader, and cannot need updating. Removing dead paths and unused features should be celebrated the same way shipping a feature is.
Explain the problem out loud, line by line, to a colleague or even an inanimate object before asking for help. The act of articulating it precisely often surfaces the bug before anyone answers.
Visual Studio Code and JetBrains' IDEs dominate; both now build AI-assisted autocomplete and chat directly into the editor.
The version-control system nearly the whole industry standardised on after Torvalds wrote it in 2005; almost nothing ships without it.
Jira, Linear or GitHub Issues turn a backlog of bugs and features into something a team can plan a week or a quarter around.
Automated systems that build, test and deploy code on every change, turning a release from a nervous manual event into a routine one.
Tools like GitHub Copilot now write a large share of the lines an engineer accepts, shifting the daily job toward reviewing and directing rather than typing.
Choosing a trendy language, framework or architecture because it looks good on a resume rather than because it fits the problem, leaving behind complexity the next team has to maintain.
Pattern-matching to a remembered fix instead of reading what the program is actually reporting, which can burn hours chasing the wrong cause.
Scrapping a working system to rebuild it 'properly' from scratch is a famously risky move — Netscape's late-1990s full rewrite of its browser is a widely cited case where it cost the company its market lead.
Designs and tests the algorithms behind machine intelligence, in a field now racing to automate a growing share of its own research process.
AI-resistant 50 🛰️Designs, analyzes and certifies the aircraft, rockets and spacecraft that leave the ground, working to safety margins that leave no room for guessing.
AI-resistant 74 🔌Designs and fabricates the transistors inside every computer, phone and weapon, using machines precise enough that only a few factories on Earth can run them.
AI-resistant 60