Here's the accompanying playground: https://go.dev/play/p/Kt93xQGAiHK
If you run the code, you will see that calling read() on ControlMessage causes a panic even though there is a nil check. However, it doesn't happen for Message. See the read() implementation for Message: we need to have a nil check inside the pointer-receiver struct methods. This is the simplest solution. We have a linter for this. The ecosystem also helps, e.g protobuf generated code also has nil checks inside pointer receivers.
It's both magical and infuriating.
My conclusion is that non-technical people CAN build simple prototypes, websites and internal tools, but would struggle to build production-grade products without any technical expertise. Think of current AI as a junior dev with outstanding syntax knowledge but terrible judgment.
Here are some things I learned in the last 3 months that seem to work well:
1. Treat it like a software development intern (write PRDs, user stories, acceptance criteria)
2. Work in tiny increments—big changes confuse the hell out of it
3. Use the "Uncle Bob" persona for cleaner architecture
4. Always refactor when prompted (but test before/after)
5. Don't be afraid to revert and start over—code is now the cheap part
Insight about the future of product: When writing code becomes cheap, many experiments that would've been discarded can now be released. We're transitioning from discovery-heavy processes to rapid iteration in production. Engineers won't vanish—they'll take on more PM responsibilities. And PMs/UXers need to learn some engineering to ship independently too.
The best advice I can give you: if you're a product person still sitting on the sidelines, what are you waiting for? Start building.