Earlier quoted context omitted.
> To be more clear, programming for the most part is easy. I vehemently disagree with this. Kludging together an unmaintainable codebase that barely meets the spec might be easy. Aiming for a notably higher level quality beyond that is NOT an easy thing at all. Obviously, the nature of this discussion depends on the complexity of the task at hand. There are many profitable ventures with low levels of complexity in th…
I'm sure there are exceptions, but IME the biggest cause of 'kludging together an unmaintainable codebase' is lack of understanding of the problem domain. Software solutions do not exist in some technical vacuum outside of the problem they were built to solve. Better understanding of the problem domain naturally leads to better software.
On one of my previous jobs one problem domain was some area of theoretical physics. There was a guy with brilliant understanding of the problem domain. He had couple of decades of experience teaching physics in the country’s best university. He could explain very hard problems in easy to understand way. The company filed multiple patents with the amazing stuff he invented.
It didn’t help the guy to write code. It wasn’t good. Not only unmaintainable, also slow and unstable (not all algorithms work equally well when mathematically-real numbers are substituted by software-real IEEE754 floats). We ended up just throwing out whatever he coded, and instead learned enough problem domain from him to be able to understand and implement what he actually was trying to do.