I draw the same way. My sketches are tons and tons of lines in the wrong places that somehow end up looking right, because the majority of the lines are near to or in the right places.
The job has only started when it is working. That doesn't mean you're done! :)
Though this only works for the implementation side of things in my experience; you still need a good mental model of roughly what you’re aiming for architecturally, I think.
Also, the domain is so large in programming, it is impossible for me to contextualize the entire set of edge cases. From remembering what exceptions to handle to library interactions, types, etc.. returned from various methods, it is just not really possible to think about even a small system this way (as in a system with 4-5 methods that perform real logic beyond "format this"
But, yeah - definitely large picture before I start to code. "Huh, yeah that calls that... ok.." but once I need to solve a problem "oh, this queue needs to be maintained this way... I need to compare these values against these values, oh, I need a second queue... I need to take this lock... oh this returns this type, which needs to be serialized so I need to figure that out..." - all of that stuff needs to be hashed out in a combination of paper & code. No way I can hold that in my head.
Reminds me of Rich Hickey’s Hammock Driven Development https://github.com/matthiasn/talk-transcripts/blob/master/Hi...
[1] https://www.theguardian.com/books/2009/may/04/obituary-corin... [2] https://en.wikipedia.org/wiki/Cor%C3%ADn_Tellado
If it's a problem that I have to address right now, it's more like prototyping the first idea that comes to mind and then debugging and refining and being more critical.
And as another plus, that makes my code very readable for others. I leave the comments in.
Must have been less than 150 lines of C, but it was written in one go, compiled without warnings, and ran as expected.
Not even a forgotten comma, or an off-by-one.
I just sat there for five minutes enjoying the feeling of raw rarity.
One thing about working this way is it's very frustrating to people who operate by documenting in real time, in something like org or Notion. I am not a note taker and I never really have been. I actually find my thinking gets cloudier when I try to document something I personally find "intuitive".
One example of this clash of styles was recently with a manager where he asked me, directly, how could I know how to design something if I hadn't written out the structure yet? How would I know to build space for a feature if I hadn't documented all the features that were required? I told him the requirements should be known, already, by anyone who was thinking about this problem... that for instance anyone who bothers to even imagine a "Create" action would automatically, symmetrically, imagine a "Delete" action and budget for that. He didn't agree and made me write it out anyway.
Sure, some things come in pairs. Some requirements are immutable and obvious. That's not the interesting part of a design, and if that's all it lists, then yes, you can probably skip writing a ton of detail. (Although current and future team mates are usually appreciative of knowing how something was designed, instead of just having to read the code - it makes it easier to distinguish mistake from intent)
But the meat of a design is in the trade-offs you made, in the choices that could reasonably go several ways. And no, for any reasonably complex system, you can't hold all of those in your head. And worse, if it's a trade-off, your weights may be wrong - your work is part of a larger effort, and you might miss constraints that seem "outside your area" but play into it.