As in the construction of any artifact by human means there will be bumps in the road. No amount of technology we can use today will solve that issue. It's a matter of communication and flexibility. One might speculate that great buildings such as the Eiffel Tower or the Empire State Building weren't so perfectly specified as to allow the construction workers to simply, "put the pieces together." Problems certainly arise and must be dealt with accordingly.
Software is no different. We still write programs that guide fighter jets to land on a tiny boat in the middle of the ocean. We've written programs that drive robots across the martian surface. And we also write programs that share our inane thoughts and activities with our friends, family, and random interested strangers. The degrees of failure are still the same and for the most part assessed accordingly: while Twitter will strive for 100% up time there is little money or life lost when it does go down. Whereas when a martian robot plummets into the side of the planet it's a big loss (and has happened). Mistakes are made in engineering. Unanticipated side-effects arise. And we do our best to deal with them as well as we can.
What distinguishes software from contemporary engineering? A couple hundred years of development at the very least. I'd say we've come a long way and have some ways to go. But if you stick with it you might find it.