I like the analogy of walking through a dark room with your hand on the wall. As long as your hand is on something you recognize, you know where you are in the room, what ground you've already covered, and you may have some idea of how you're going to reach the other side.
I started a rails project very meticulously. I had recently read through the 'Agile' book which closely tracks the development of the framework. I had a decent idea of what I was going to build and how.
It would be a tight ship, and code would be kept clean from start to finish. Before even starting the project, I invested a ridiculous amount of time and effort learning all the tools I would be using, evaluating every case where I had a choice between popular and well-supported tools. For each tool I chose, I thought about why using it was a good idea and how exactly it would fit into the workflow. I was determined that every commit would keep tests and documentation up to date with any code changes in that same commit.
All that is to say that I came into the project with carefully considered, but fairly rigid, opinions on most aspects of how to do the project. Perhaps not surprisingly, the other developers on the project did not share these opinions. They did things that ran against my idea of how to keep a project organized. Perhaps I also did things which ran against theirs.
Eventually, the state of disorganization reached a point that felt to me like letting go of a piece of furniture in a pitch-black room. I no longer had a sense of how the whole thing was put together. I no longer knew what all the 3rd party libraries we were using did, or why they were included in the project. I had planned to keep all libraries up to date but, for various reasons, we were falling behind in that regard and various roadblocks stood in the way of bringing things current. We had started using esoteric features of the database I didn't know very much about. I would do a deep dive of research to try and catch up my understanding, and then I'd fall farther behind in keeping my finger on the pulse of changes in the project. Soon, the codebase had dependencies on various servers in our organization that prevented me from simply running my own isolated instance of it.
I don't know a solution to this, yet. Right now I'm still trying to feel my way through that dark room.
Pair programming [1] and collective code ownership [2] are great ways of getting everyone on the same page and keeping them up to date.
My experience is that only a fraction of developers are interested in keeping things clean and meticulous. The rest are more interested in cranking out features. Both are needed. In my experience, a ratio of 1 "meticulous" to 6 "git-r-done" programmers works fine if you're using collective code ownership & pairing.
(The real trick is getting the rest of the team to agree to it.)
This is fine, as far as it goes. However, when I do this, I feel like I'm being yanked around from one area of the code to another. What I really want is the opportunity to take a few steps back and spend some effort getting things back in shape. If, as you say, both types are needed, I think it would help if an organization valued both types and allowed them to do the type of work they find fulfilling.
If I get a new feature working, but I do so at the cost of adding more technical debt to the project, I don't feel fulfilled at all; I feel I've done a net disservice to the world, and especially to whoever comes onto the project after me.
Being the type of developer interested in keeping things clean and meticulous, while being pressured to always sacrifice quality for speed, seems like a recipe for stress and burnout.
Well, just as it's a fine line between "git-r-done" and "cowboy coder," it's a fine line between "meticulous" and "architecture astronaut." (See early Java vs. later Java, for example.) I think both camps win when they're tempered by the other.
I follow the boy scout rule: the code isn't done until it's at least a tiny bit cleaner than we left it. I'll generally spend about one hour out of every four on cleanup (and not budget for it separately). I also focus my cleanup efforts on what I'm directly working on, and what's causing me the most grief today. This allows me to keep my code clean and make the parts of the system that I use the most gradually improve.
I started a rails project very meticulously. I had recently read through the 'Agile' book which closely tracks the development of the framework. I had a decent idea of what I was going to build and how.
It would be a tight ship, and code would be kept clean from start to finish. Before even starting the project, I invested a ridiculous amount of time and effort learning all the tools I would be using, evaluating every case where I had a choice between popular and well-supported tools. For each tool I chose, I thought about why using it was a good idea and how exactly it would fit into the workflow. I was determined that every commit would keep tests and documentation up to date with any code changes in that same commit.
All that is to say that I came into the project with carefully considered, but fairly rigid, opinions on most aspects of how to do the project. Perhaps not surprisingly, the other developers on the project did not share these opinions. They did things that ran against my idea of how to keep a project organized. Perhaps I also did things which ran against theirs.
Eventually, the state of disorganization reached a point that felt to me like letting go of a piece of furniture in a pitch-black room. I no longer had a sense of how the whole thing was put together. I no longer knew what all the 3rd party libraries we were using did, or why they were included in the project. I had planned to keep all libraries up to date but, for various reasons, we were falling behind in that regard and various roadblocks stood in the way of bringing things current. We had started using esoteric features of the database I didn't know very much about. I would do a deep dive of research to try and catch up my understanding, and then I'd fall farther behind in keeping my finger on the pulse of changes in the project. Soon, the codebase had dependencies on various servers in our organization that prevented me from simply running my own isolated instance of it.
I don't know a solution to this, yet. Right now I'm still trying to feel my way through that dark room.