There are plenty books and courses about software development. But software development tends to follow the same path:
The twist is, there are plenty branches, schools of thoughts, opinions, and best practices on how to do these things. Computer science is natural, much like math, but when you add people into it, it becomes software engineering, it is so different, because there are people, people are different to each other.
Some people prefer doing the TDD, others not so.
Some people prefer doing daily stand-up, others not so.
Some people prefer using framework like scrum, others not so.
Even Agile itself (according to Martin Fowler) means no framework, no rule, just follow what team knows best.
Now, if you ask me what universally makes a software project to fail (in engineering point of view), I can make you a simple stupid list:
- Code has no test, bugs and regressions emerge because tests are not enough.
- Hard to read/navigate/understand code, when even your text editor complaints about it, it means your code is not healthy. Developers need extra energy on maintaining them, developers tend to require more time to do anything about it, and new onboarding developers will have difficulty on learning about them. This brings us to other topics like design pattern, object oriented programming and functional programming itself.
- Hard to change/adapt code. Read below.
- Unclear software requirements/specifications, this is the bottom of the Jenga, the earliest domino. In modern time like this, a lot of developers work in startups with fast-moving environment which probably means fast moving requirements. This directly correlates with above point with writing code that adapt to changes. Plenty of startups as the sprints goes on and on, have difficulty moving quickly because their codes are harder to maintain then before. I know this is not 100% developers responsibilty, so that’s why people create BDD, so we create a ‘bond’ with non-technical people to specify the requirements.
The first point above actually correlates with the last point as well, as software requires more and more features, quickly, you need assurances on your hand, about the correctness of your features in your code. Some developers actually pairing up to write tests and code at the same time. Extreme programming. Whatever your software development methodology is, please write good tests and easy to read/understand/change code. The business will thank you.