There are many ways to develop software. The method I'm most familiar with is to have people do it. You know, humans.
Knowledge
Since software is made by humans for humans, one bottleneck is the state of our knowledge. You want something. I want to help you get it. But what is it, exactly? Why do we think so? How can we be sure? Let's say we feel pretty sure. How much can you afford to spend to get it? How much might it cost you to have me do it? Do we still think it's what you want? Let's say yes. Am I en route to what you want? Why do we think so? How can we be sure? Am I going to complete it under your budget and time constraints? Why do we think so? How can we be sure? Let's say I do. Is it still what you want? Let's say yes. Have I done what you needed? Why do we think so? How can we be sure? And so on.
Every time we find ourselves surprised, disappointed, confused, or stuck, we're being bottlenecked by our knowledge. We thought we knew, but it turns out we didn't. To exacerbate this, we can make a habit of pretending we always know and we're always sure. To ameliorate it, we can make a habit of checking what we currently believe and why. If we haven't checked whether it's true recently, it might not be true now.
Trust
Since software is made by humans for humans, another bottleneck is the state of our trust. If you don't feel comfortable sharing your needs with me, I won't be able to understand them very well. If I don't understand your needs, you won't be interested in hearing my ideas for meeting them. If you're not interested in my ideas, I won't be able to help you very well. If I don't do you much good, you won't feel comfortable sharing your needs with me. And so on.
Of course, there's also a positive feedback cycle. If last time we both got what we wanted, this time we're more likely to give each other what we need. When we work together, my first meta-task is to convey to you that it'll be worth your while to trust me. Once you begin to believe it, my next meta-task is to quickly give you ways to validate your belief. If we haven't checked whether it's true recently, it might not be true now.
Empathy
Since software is made by humans for humans, another bottleneck is the state of our empathy. If I don't care about you, you'll feel it, you won't grant me your trust, and the knowledge we'll need to acquire together simply won't be available to us. If you don't care about me, likewise. When we work together, my zeroth meta-task is to convey to you that I care.
This one's easy for me. As a solitary kid, I got into programming for the thrill of solving my own problems (which I still get a kick out of, believe you me). As a full-sized social animal, I've built a career in software development for the thrill of helping you solve yours. What matters to you matters to me. When we work together, you'll be able to tell right away.
Technical skill
Oh, right: since software is made of bits on computers, another bottleneck might be the state of our technical skill. Technical skill can help us acquire knowledge and earn trust. It cannot help us empathize with each other. If and only if we're doing wonderfully at that, technical skill might become our bottleneck. In which case we'd be perfectly able to overcome it, together.
I like these ideas, but I suggest replacing “knowledge” with “understanding”, throughout. Also I think you give “technical skill” short shrift – it matters, first as a baseline requirement, then as an enabler of great things (once you have those other three sorted out, I agree). I’m also not sure that everything I’d categorize as “technical skill” can be earned simply through work.
I like these comments. Maybe you’ll like mine.
I chose “knowledge” intending to drop the word “epistemology” in that section somewhere, and wound up not, but that had been my angle: be precise about what it means to know, and then never pretend. The word “knowledge” also originated from what began as a much different post that’s not done yet, from which this one sprang. I like saying “understanding” too, but I figure it’s a gift that comes just about for free with one’s paid subscription to meaningful empathy and meaningful knowledge.
Bekki and I were discussing whether there were a necessary and/or optimal ordering to these four. For purposes of writing, I chose this ordering because knowledge is what I’d started off writing about and the order of the first three seemed logical enough, but also because technical skill gets plenty of shrift elsewhere. I wanted to give the other three longer shrift. The post that this isn’t, when it will eventually is, will have lots to say about technical skill and its relation to the other three. It is, as you say, a requirement. Without it we’re nice people, which is necessary but not sufficient.
For purposes of learning, I think I probably had a slight head start on being honest with myself about what I don’t know, then used that to acquire technical skill, then realized that having done so made me useful to other people, which made me want to care about them more, and am still figuring out that maybe not everyone deserves my trust (but not enough to make me want to change whether I’m trusting by default). Am I representative? Are there other orderings? I can easily imagine coming at it from empathy, using that to motivate technical skill, etc.
This post was short because otherwise it’d have been way too long.