There are many ways to develop software. The method I'm most familiar with is to have people do it. You know, humans.

Dog wearing tie mashing keys, caption: 'I have no idea what I'm doing'

Dogs would likely find it gratifying to deliver working, valuable software to their 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.