Thursday, August 29, 2024

Persistent Misunderstandings in Software Development

 Yikes. This was an answer to a Quora question about development myths and I just kept hammering them out because I have seen a lot of critical misunderstandings in my decades of programming experience. I could just keep going and going. There's a book to be had in explaining all the many misapprehensions of journeyman developers, why they are incorrect and what solutions (if any) apply in dealing with them and their results. 

Persistent Misunderstandings in Software Development:

  1. Things Won’t Change: The mistaken belief that the initial project requirements, timeline, and scope will remain constant throughout the development process.

  2. Nothing Will Go Wrong: The expectation that the development process will proceed smoothly without unforeseen challenges, bugs, or setbacks.

  3. Timeline Predictions Are Reliable: The assumption that you can accurately predict timelines and outcomes for problems that are yet to be fully understood or defined.

  4. Human Factors Don’t Matter: Ignoring the reality that developers are human beings with emotions, external responsibilities, and varying productivity levels.

  5. Developers Are Interchangeable: The belief that any developer can be easily replaced with another without impacting the project's progress or quality.

  6. Testing All Pathways Isn’t Necessary: The dangerous assumption that certain software pathways don’t need to be tested because they are unlikely to be encountered.

  7. Rare Issues Won’t Happen: The flawed logic that if something is unlikely, it can be safely ignored.

  8. Multiple Entrances/Exits Are Acceptable: The idea that code can have multiple points of entry and exit without introducing complexity and errors.

  9. Uncontrolled Aborts Are Preferable: The misconception that sudden, uncontrolled aborts are better than controlled unwinding with appropriate logging or recovery mechanisms.

  10. Logging Can Be Skipped: The belief that comprehensive logging isn’t necessary for non-trivial production software.

  11. Premature Optimization Is Safe: The persistent misunderstanding that optimizing early in the development process is beneficial without considering the impact on future changes.

  12. Failing to Optimize Isn’t Harmful: Conversely, the belief that neglecting necessary optimization won’t have significant negative consequences.

  13. More Developers = Faster Delivery: The fallacy that adding more developers will proportionally speed up project completion, akin to thinking nine women can produce a baby in one month.

  14. You Can Fully Understand Requirements Upfront: The expectation that all requirements can be perfectly understood and specified before development begins.

  15. You Can Design Perfectly Before Coding: The belief that it’s possible to design a flawless system architecture before any coding starts.

  16. Regression Testing Can Be Omitted: The mistaken belief that full regression testing isn’t necessary for ensuring software stability.

  17. Delivery Systems Are Homogeneous: The assumption that all delivery systems will behave consistently, ignoring potential variability and edge cases.

  18. Function and Budget Can Be Set Beforehand: The expectation that both the delivered functionality and budget can be fixed before significant development work begins.

  19. Developers and Users Always Understand Each Other: The belief that developers and users are always on the same page without the need for tangible, usable software to bridge understanding.

  20. Floating-Point Arithmetic Is Reliable: The misunderstanding that floating-point arithmetic will always yield consistent results without the need for careful handling and testing.

  21. Rounding Is Consistent Everywhere: The erroneous assumption that rounding operations are consistent across all platforms and software environments.

  22. Human Language Is Precise Enough for Code: The belief that human language is sufficient for specifying code without ambiguity or misinterpretation.

  23. Precision Isn’t Necessary: The notion that you can develop software without rigorous precision, understanding, and thorough testing.

  24. It’s Always Feasible: The overconfidence that every project is doable without significant risks or obstacles.

  25. Security Isn’t a Priority: The dangerous belief that security concerns can be overlooked, or that some attack vectors aren’t worth addressing.

  26. Nobody Will Let You Down: The unrealistic expectation that no team member will face personal issues, illness, or other setbacks during the project.

  27. Your Project Will Survive: The assumption that your project is immune to cancellation or major changes before completion.

  28. Future Tech Predictions Are Accurate: The belief that you can accurately predict the future state of technology and its impact on your project.

  29. Newer Is Better: The naive belief that the latest technology is automatically superior and should be used without question.

  30. Success Is Guaranteed If It Works Once: The damaging notion that finding one way the software behaves correctly is enough, rather than ensuring all potential failure points are addressed. This includes the irritating response, "It works on my machine," which shifts the blame to users instead of addressing the fragility of the software.

  31. Unit Tests Are Enough: The mistaken belief that unit, integration, and system tests can fully substitute for real-world testing with actual users, in pilot phases, and during rollout.

  32. Tool Output Equals Correctness: The belief that if development tools don’t flag issues, the software is automatically correct, ignoring the need for deeper verification.

  33. Unpredicted Issues Won’t Arise: The dangerous oversight that entirely unpredicted and intrinsically unpredictable issues won’t emerge.

  34. Projects Always Finish on Time: The optimistic belief that projects will meet deadlines, despite the well-known tendency for timelines to slip.

  35. Overconfidence in Estimations: The frequent error of underestimating the time and effort required, leading to projects dragging on much longer than anticipated.

  36. You Always Know What You’re Doing: The hubris of believing that you fully understand the problem and that confidence alone will lead to success, without acknowledging the complexities involved.

  37. Resources Won’t Run Out: The assumption that time, budget, or energy won’t run out before the project is complete.

  38. Documentation Will Match the System: The unrealistic belief that documentation will be perfectly in sync with the system at the time of delivery.

  39. People Will Notice What’s Done Right: The expectation that users and stakeholders will recognize what has been done well, rather than focusing solely on deficiencies.

  40. Premature Release Won’t Happen: The common situation where management forces an unfinished or hacked-together solution into production.

  41. Management Will Understand: The assumption that management or stakeholders will fully understand the technical reasons why the software isn’t ready.

  42. Murphy’s Law Is Just an Adage: Misunderstanding Murphy’s Law as a mere saying rather than acknowledging it as a genuine mathematical reality that affects software development.

  43. Dependencies Will Just Work: Underestimating the challenges posed by software dependencies, assuming that everything will work together seamlessly without conflicts.

  44. Libraries Will Solve Everything: The belief that third-party libraries or frameworks will solve all problems without introducing new ones or creating additional complexity.

  45. Scalability Will Handle Itself: The assumption that software designed for small-scale use will automatically scale to handle larger loads without significant rework.

  46. Documentation Can Wait: The belief that documentation can be written after the code is complete without compromising its accuracy or usefulness.

  47. Single Points of Failure Are Fine: Ignoring the risks associated with having single points of failure in the system, assuming they won’t be an issue until they become one.

No comments:

Humans and AI

1. Introduction Advancing AI is both exciting and fun, but it is also disruptive and scary. The impact on some people is greater t...