Generative AI assistants, like Microsoft’s Copilot and Amazon’s Q, have made it faster to write code by handling many micro-decisions:
- Variable and function names (often better than mine, or at least I don’t need to spend time on them)
- Relevant SDK functions to use (though sometimes they hallucinate or choose suboptimal approaches)
- Tests to write (but sometimes miss important cases)
For large changes, I don’t fully trust the assistant to choose the “best” approach. I break up the changes into separate prompts and generally follow this process:
- Start with my gut instinct about what might work best and keep it to myself. This sets some initial expectations I will have.
- Describe the task and provide context to the assistant, then ask how it would approach it.
- Evaluate the assistant's suggestion(s) against what I initially had in mind.
- Ask the assistant to implement the most promising approach.
- Review and iterate on changes.
The assistant has helped me be productive with a new language quickly, but at the cost of slower internalization of syntax and library details. In other words, I get things done faster, but I don’t learn the language as deeply as if I hadn’t relied on the assistant in the first place.
I still believe knowing a language and its ecosystem is important, even with AI assistants, because their output always needs review and often requires changes. The assistants rarely produce the desired code with zero changes necessary, unless I give a very precise, verbose prompt describing exactly what I want (at which point I might be saving keystrokes, not cognitive effort).
These assistants have been remarkably helpful for writing one-off scripts or getting a bird’s-eye view of an area I intend to learn about.
AI assistants have been fruitful, and I’m optimistic about their progress, but pessimistic about the prospects of them replacing software engineers without a deeper, more fundamental breakthrough.
Looking ahead, here are some areas where I think AI assistants and the software development experience could improve:
- The UX of AI assistants (e.g., voice input would be a natural choice when asking Copilot to write code)
- AI assistants that help people manage their day and support personal growth
- Incremental personalization and prediction in UI (e.g., why do X people use the same app in Y different ways but all get the same one-size-fits-all view?)
- A new class of software is slowly becoming possible; one where data is owned by users, compute/storage/APIs owned by services, and the UX is dynamically generated for the task. A class of fluid, ephemeral software with no UI to learn.