One of the fantastic things about software development right now is that you can compose solutions by combining a lot of different blocks to build an awesome block tower. I've noticed in the last few years that designing these solutions with all of these toys is actually something I enjoy more than in-the-weeds coding. Sometimes they involve a lot of bigger, connected moving parts, and sometimes they're a bunch of components all bundled into one thing.
I've said before that an important skill for a developer is to understand how to compose all of these free and open source pieces into something that is cohesive, maintainable and supportable. I value those skills over something that is hardcore, algorithmic computer science. It's great if a dude can write a device driver or a 3D rendering engine, but can he take a series of already invented wheels and build something great, quickly? More and more, I think that's where a developer can add the most value.
Let me be clear that I don't think you can just hack stuff together in a completely unmaintainable way and call it a day. Just the opposite, I'm suggesting that understanding basic design patterns and applying them to the composition of these fantastic tools is where it's at.
There are certainly some pitfalls associated with this. It's easy to simply copy what you've seen elsewhere, and assume that it's the "right" way to do something. That's the same problem you encounter with the in-the-weeds code. Conversely, it's easy to want to over-engineer or extend something that an open source developer came up with, and that can have unintended consequences with regard to complexity and leaky abstractions. Those problems can be just as painful as the copy-and-paste issues!
In the .NET development space, we've come a very long way as far as open source goes. There wasn't a lot of choice or really useful stuff out there even five years ago. I think we still have a little ways to go to make things easier, especially when it comes to the installation and configuration of these building blocks. I spent much of today swimming up stream, trying to make things work on a client project, and those are never fun days. Fortunately, things like NuGet are making life easier.
There will always be hard problems to solve, but we don't have to come up with giant, home-grown solutions for everything the way we used to. It's as exciting as ever to work in this profession, provided you hold on to your desire to keep learning.