{"id":1450,"date":"2026-06-18T21:31:34","date_gmt":"2026-06-18T21:31:34","guid":{"rendered":"https:\/\/blog.gwadej.org\/programmer-musings\/?p=1450"},"modified":"2026-06-18T21:31:34","modified_gmt":"2026-06-18T21:31:34","slug":"oomp-the-most-important-engineering-principle","status":"publish","type":"post","link":"https:\/\/blog.gwadej.org\/programmer-musings\/2026\/06\/oomp-the-most-important-engineering-principle\/","title":{"rendered":"OOMP: The Most Important Engineering Principle"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">One of the things that separates the professional developer from a hobbyist is understanding the principle of <em>Good Enough<\/em>. This does not mean the absolute minimum you can do. It is also not the same as cutting corners or making a prototype. This is the recognition of the point of diminishing returns on a feature or project. Good enough is also the recognition of just the functionality needed to solve the problem.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Trade-offs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In all forms of engineering, there are no perfect solutions. Every solution is a tension between different trade-offs. If you continue trying to improve a system after you have reached the point of good enough, you will be adding more complexity and more code while not gaining much improvement in the functionality.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">An example is the difference between a program written for your own use versus one written for a production environment with thousands of users. If a program written for personal use fails, you can normally fix or work around the problem. This allows you to focus on what the program really <em>needs<\/em> rather than what it might be someday. Since you are the only user, you can quickly determine the real needs of the user.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the program needs to deal with thousands of users, this is not good enough. You need better error handling and the ability to scale to an appropriate number of users. While requiring accepting that you might have to re-enter information if a personal application fails, that is probably not robust enough for the general public.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The concept of good enough, would ignore scalability and such for a personal, single-user system, unless you wanted to learn something from the exercise. Too many developers fail to build a tool that would help them personally, because they can&#8217;t figure out how support the general public or deal with thousands of users.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Scaling Too Soon<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Lately, when I see someone decide to build a program, they begin by looking at how they can scale up (possibly before figuring out if the program serves any purpose). If you write a program that only you will use, you can skimp on error recovery or write really lousy error messages. That&#8217;s okay if you are just writing for yourself. Odds are a program you just write for yourself won&#8217;t need to deal with millions of requests per day.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You might find it useful to think about how the program would scale, but you don&#8217;t need to code for that now. Given how many projects fail because no one knows if they will be used by others or how many others might use it, putting in the extra work to make it infinitely scale is wasted. You would be better served by focusing on the problem and how to solve it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Focusing on UI Design Too Soon<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Unless the problem you are trying to solve is exploring some bit of UI design, working too much on the Style and Design of the UI before you have some functionality is probably not the best idea.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Many small projects flounder as the developer gets caught up in fancy GUI effects and controls that are not really necessary in the beginning. You are better off building the <em>simplest thing that could possibly work<\/em> to be able to trigger the functionality. When that interface becomes the bottleneck to using the tool, modify it just enough to be usable again.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At some point, the system may reach a point where a better interface is necessary for where you want to go next. At that point, you have some actual experience with using the tool and any UI design you come up with will be informed by actual use.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Adding Features &#8220;For the Future&#8221;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sometimes invoked recently as YAGNI (You Ain&#8217;t Gonna Need It). Working on features that you might need later is wasting time that you could spend getting your program to <em>Good Enough<\/em>. That good enough point is where you can begin using the tool. If you haven&#8217;t reached good enough, any time you spend on potential future features is a waste.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Among other things, you will likely never need the features (at least how you envision them now). More importantly, if work on future features prevents you from getting to good enough, you&#8217;ve not only wasted time on features that you might have never needed, but you&#8217;ve wasted the time you spent on the features that you would have used if you had only reached a stable point in the development.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>One of the things that separates the professional developer from a hobbyist is understanding the principle of Good Enough. This does not mean the absolute minimum you can do. It is also not the same as cutting corners or making a prototype. This is the recognition of the point of diminishing returns on a feature\u2026 <span class=\"read-more\"><a href=\"https:\/\/blog.gwadej.org\/programmer-musings\/2026\/06\/oomp-the-most-important-engineering-principle\/\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,6,12,18],"tags":[106,247,342],"class_list":["post-1450","post","type-post","status-publish","format-standard","hentry","category-architecture","category-codecraft","category-design","category-programming-philosophy","tag-design","tag-philosophy","tag-trade-offs"],"_links":{"self":[{"href":"https:\/\/blog.gwadej.org\/programmer-musings\/wp-json\/wp\/v2\/posts\/1450","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.gwadej.org\/programmer-musings\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.gwadej.org\/programmer-musings\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.gwadej.org\/programmer-musings\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.gwadej.org\/programmer-musings\/wp-json\/wp\/v2\/comments?post=1450"}],"version-history":[{"count":5,"href":"https:\/\/blog.gwadej.org\/programmer-musings\/wp-json\/wp\/v2\/posts\/1450\/revisions"}],"predecessor-version":[{"id":1456,"href":"https:\/\/blog.gwadej.org\/programmer-musings\/wp-json\/wp\/v2\/posts\/1450\/revisions\/1456"}],"wp:attachment":[{"href":"https:\/\/blog.gwadej.org\/programmer-musings\/wp-json\/wp\/v2\/media?parent=1450"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.gwadej.org\/programmer-musings\/wp-json\/wp\/v2\/categories?post=1450"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.gwadej.org\/programmer-musings\/wp-json\/wp\/v2\/tags?post=1450"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}