Fr0styMatt88
Joined 11 years ago
Joined 11 years ago
If I'm tired, yep I'm going to write more sloppy code, I'll put less thought into it and be more tempted to tell the AI 'just do it'. That hasn't changed. I'm not sure where this new breed of "don't read the code" is coming from when it's actual software engineers making the statement; maybe it's just over-excitement and it'll die down (hopefully).
Or it's just over-simplification -- I don't read ALL the code either anymore, but at the same time I'm reading SOME of the code. Tell your AI agent you're doing a code review workshop, ask it to select ten files at random and then go through them with you one at a time. Ask it to review common anti-patterns and put them in your coding standard. Then you can start asking it to review and fix code against your standard as a first pass. You'll still need to manually review the code to keep it in check, but at least you can make it a bit less daunting and a little more fun by actively collaborating on the AI with the review.
I'm learning it's just a 'different kind of tired'. AI has made some stuff much more efficient, including the choice between efficiency and carefulness. You can make that choice at a micro level and very quickly now if you want. There's still fatigue though, it's just a different kind of fatigue. You still get tired from all the thinking. You can still choose to put the work in or not and it still makes a difference. It's just a different kind of difficult. Doesn't mean that the thing to do is to throw your hands in the air and declare that your job shouldn't be difficult or include hard work anymore.
This is just really silly.
The more I think about this the more I think it's like self-driving cars. We have this expectation that self-driving cars MUST be 101% safe and never get into any accidents, ever, before the technology is worth adopting. LLMs are the same -- it's like we think if you can't one-shot a prompt and get perfect software out of it, it's failed. You can choose to spend time getting the LLM to refine the code it's written, review the architecture, come up with an actual engineering process around the LLM. Yes that means you'll be producing less code per time spent -- which is a good thing.
I'm experimenting just like everyone else, but this is my process right now:
- Quick prototype
- Figure out the language of your app (what terms you want to use for things, what your UI design language will be, etc) and spec that, so you can use words consistently with the agent. You need to be able to describe the things you want well and consistently.
- Keep prototyping. Let the agent write unit tests along the way. Lock down behaviour you like, keep track of those things in a document.
- At some point your idea of the real architecture comes into focus, from actual use cases -- avoids the over-abstracting right away trap.
- Refactoring is cheap with tests, so start refactoring into the architecture you want.
- Your architecture won't necessarily be what would be best for a human, but it will be pretty close.
- Keep relentlessly iterating on small work.
- Things that were expensive before aren't that expensive now -- integrating a library, changing from one library to another, trying out a few architectural refactors, trying out different performance optimizations, etc. That stuff is all 'throw it there and see what sticks' now, so don't be afraid to try stuff which felt big before.
I feel like 'front loading' too much is just the wrong approach. You might feel like you're sitting there 'babysitting the agent'; but that's just what the hard part of the work (hard as in 'zjust slogging through it', not as in 'conceptually complex') looks like now. Your code is much more like clay.
Atleast that's how I'm thinking about it so far, but I'm not working on large sprawling systems that I imagine would need more pre-planning.
I remember reading Lockhart's Mathematician's Lament and loving it. I discovered that I actually liked math when I was able to let go of the "there is only one way to do things" and realize that math, in a sense, is 'made up but logically consistent' (notwithstanding the arguments about whether math is innate to the universe or invented by man, which I err more on the innate side -- I'm thinking of a slightly different concept here).
When I learn something, I always need to know the why. We were never taught that in school. "Just because" has never been a good enough answer for me in anything I want to learn. Learning about the history of the problems, why certain solutions came up as solutions and why they were needed in the first place made everything much more concrete for me.
I've been using ChatGPT over the last month or so to re-learn my times tables and basic arithmetic from the ground up. I had no idea what 'automaticity' was (I never developed it; I still would manually count simple multiplications in my head or on my fingers). I had never made the connection between algebra and arithmetic -- at least not deeply. In that you can manipulate arithmetic expressions just the same as algebraic ones if you want (72 - 37, you mean I can subtract 2 from both sides first to make the calculation easier?!?!).
Now I'm motivated though, because I know why I'm learning it. I can look at it with my adult brain. I guess it's a bit like the difference between a kid being forced to take piano lessons and an adult that's really motivated to learn and practice because they suddenly discover they want to play.
Oh and 3Blue1Brown is amazing!
I remember the Shield going from fantastic to a horrible mess software wise over the span of a single Android generation (maybe 2019 or 2020), constant ARC weirdness, etc.