Even with modern Software Development tools available nowadays, building software is hard. Not only does User Requirements often change irrespective of the development methodology used, the software we code keeps breaking. They are riddled with bugs and we have to provide endless software. This is good in a way as if all software we programmed was effective in the first try, we would probably have no job.
From my experience coding software since the early 2010s, I've noticed how difficult it is to actually produce reliable software. Yet I've also noted how development teams, particularly smaller ones, tend to make things harder.
From a lack of using proper communication tools, to a culture of verbal exchange of information and outdated Project Management Tools, they tend choose more complex technology stacks than simpler ones.
An outstanding example for me is developing an application from scratch - when plenty of battle tested production ready frameworks - are freely available in almost all popular languages used nowadays such as .Net, Java, NodeJS, Ruby, Python and PHP.
You therefore keep reinventing the wheel, taking unnecessary time and effort without guaranteeing better quality; than you could have by using these frameworks and libraries. For instance, a scenario from my past work experience, is using ready made third party web components such as DevExtreme. They are rich in features and can be easily integrated in your application, for instance a scheduler, which development by itself, is no easy feat.
Additional Reading - Another interesting article by the creator of the popular web framework, Ruby on Rails, David Heinemier Hansson.