An important distinction, though, is that with software, particularly server-side software, it's fine to get it wrong several times, as you can fix it quickly and all in one place.
The difficulty increases as you move to desktop software and it increases a LOT more as you move to hardware, obviously.