[HN Gopher] Premature Optimization is the Root of all Evil ___________________________________________________________________ Premature Optimization is the Root of all Evil Author : alexzeitler Score : 42 points Date : 2022-09-05 18:43 UTC (4 hours ago) (HTM) web link (martin.leyrer.priv.at) (TXT) w3m dump (martin.leyrer.priv.at) | anybodyz wrote: | Premature optimization may be the root of all evil. But failing | to architect an application from the start for reasonable | performance and scalability is the premature root of all | optimization. | mjlawson wrote: | I don't think that this is always possible. For one, I've yet | to meet anyone who can meaningfully predict: | | a. What features are going to be added over the course of your | application b. What features are going to be popular c. How | these features scale, independently of the overall application | | Architecting for reasonable performance should always be a | goal. Architecting for scalability, however, is often wishful | thinking that from my experiences has lead to more harm than | good. | djmips wrote: | It depends on your field of course. With experience, you will | understand how to do things and you won't even realize how | many mistakes you avoided by just not 'being stupid'. In my | area it's often best to do a pre-production phase that is | more of an R&D phase to explore the tech you need to | incorporate or invent. This is where you iterate and yes | optimize. It's hard to estimate at this stage. Then in the | production phase you can have smoother sailing as the tech is | established and the content is more or less production line. | Estimates are accurate. Like a factory. | kemiller wrote: | And premature scaling. Would someone please tell every tech | company's interviewers? | Genbox wrote: | This is not an example of premature optimization. It is an | example of guessing at the problem and missing the mark. | | It is best explained by Donald Knuth himself. The full quote is: | | > "Programmers waste enormous amounts of time thinking about, or | worrying about, the speed of noncritical parts of their programs, | and these attempts at efficiency actually have a strong negative | impact when debugging and maintenance are considered. We should | forget about small efficiencies, say about 97% of the time: | premature optimization is the root of all evil. Yet we should not | pass up our opportunities in that critical 3%. A good programmer | will not be lulled into complacency by such reasoning, he will be | wise to look carefully at the critical code; but only after that | code has been identified. It is often a mistake to make a priori | judgments about what parts of a program are really critical, | since the universal experience of programmers who have been using | measurement tools has been that their intuitive guesses fail.". | | Source: Structured Programming with go to Statements by Donald E. | Knuth. | http://web.archive.org/web/20130731202547/http://pplab.snu.a... | throwaway0asd wrote: | Perhaps a better understood paraphrase: _Never guess at | performance, and don't measure for performance until the | application works._ | djmips wrote: | 1st part. YES. 2nd part. NO. If your end goal needs to meet a | certain mark then you need to be measuring as you go. If you | are headed down the wrong path, by not paying attention to | perf you'll end up bogged down rewriting systems that 'work' | but they were never going to be fast enough. I've been | through this headache too many times now to not get a little | irritated when projects don't keep perf and memory usage on | the same importance as 'working'. This often manifest by | developing on much more powerful hardware than will be | shipped on... | | All you need is the measure part. Then you won't do the evil | thing of optimizing something that makes it more brittle and | hard to maintain etc. | s1k3 wrote: | Well it's not like you don't keep it in mind. Your project | has some baseline performance need and you should be | building with the common practices and paradigms you used | to build the other parts. The point is, don't try to guess | which part might need optimization tweaks. Write it first | and then prove you need to spend extra time improving | something. | tejohnso wrote: | Ya that paragraph is ripe for cherry picking that often quoted | nugget. But right after it is "we should not pass up our | opportunities in that critical 3%". And further along, "the | universal experience of programmers who have been using | measurement tools has been that their intuitive guesses fail." | That one I think is the most important. You don't even know | what you should optimize until you measure. You could end up | spending a lot of time and energy on the wrong problem. | zionic wrote: | >A good programmer will not be lulled into complacency by such | reasoning | | And that's the crux of it. Donald neglected to understand that | most programmers will takeaway "optimization is bad" and all | the subtleties of his point will be lost. | | Then we get things like electron (ducks for cover) | ummonk wrote: | Donald was also writing at a time when all languages were | close to the metal and optimization meant using various | tricks (or writing critical portions in assembly) to improve | performance. | Ygg2 wrote: | > Then we get things like electron | | We get electron because it's a batteries included (and remote | and TV) cross platform GUI. | | And has a huge talent pool, and acceptable performance for | most users. | Archelaos wrote: | But even that has to be taken with a grain of salt. There are | kinds of critical code that are hard to identify. Think of the | infamous O(n^2) algorithms which are not identified unless you | measure high values of n. Or not well coordinated threads that | slow down a programm only on specific occasions. | junon wrote: | Yes, but conversely, there are cases where O(1), O(N) and | O(N^2) are all perceptually the same in all cases of a | particular program. There's a bit of an art to determining | what is critical and non-critical. | encryptluks2 wrote: | Ansible is just slow in itself. I dread loops using Ansible, | because I know there is a significant delay even on localhost. | Just removing 20+ files in a loop with Ansible can take 20 | seconds when it is instantaneous using `rm`. | jarym wrote: | > I jumped to the conclusion that the yum update was just too | slow and I needed to speed it up. | | That is not premature optimisation. That's called plain old | jumping to conclusions. Next. | MrStonedOne wrote: | mildchalupa wrote: | andrewstuart wrote: | This famous saying was true when they were writing IBM operating | systems in pure assembly language. | | Not true today. | | Head down some optimisation path instead of just getting the damn | thing to work - that could sink the project. | | Today - speed is a feature. | 0x457 wrote: | Hmm, that's not premature optimization, that's lacking diagnostic | skill problem. | hbrn wrote: | While premature optimization is still evil, I think it's no | longer the root of it. | | Average quality of developer is way lower than it used to be | (people aren't even capable of optimization). The need for | optimization is also not as high: hardware is fast and cheap, | abundance of Electron apps illustrates that. | | I have a feeling that today is the age of premature abstractions | and premature scalability. | | The main point is that there's the right and the wrong time to do | anything: optimization, scaling, testing, monitoring, etc. When a | concept is deemed absolutely positive, naturally it will be | applied prematurely. | mjlawson wrote: | I agree with this, mostly. I've worked at many a company where | I've inherited the work of developers who built towards an | expected view of the future. That expected future, of course, | never quite lined up with the future that did come to pass. So | a lot of extra work building out the wrong abstraction lead to | a lot more work to undo it. | | I would disagree with you only that I'm not familiar with a | time when premature monitoring was added that caused me a lot | of pain. If anything, the opposite has been true. Can you | explain what you mean there? | hbrn wrote: | It all comes down to cost. Most of the time you can get kind | monitoring for free or at a very low cost. AWS gives you a | bunch of metrics out of the box for every product. Wrap your | webapp in newrelic-agent and get a bunch of nice dashboards. | But the more you want to monitor, the higher the costs are. | | There's a lot of examples where you _can_ catch something | with monitoring, but it doesn 't necessarily mean that you | _should_. | | A recent one from my memory: in a SaaS product a team shipped | a bug that went unnoticed for a few days. It was feature | flagged, so it only affected a small fraction of customers | and didn't trigger any global alerts. Now, since it didn't | trigger alerts, the natural post-mortem action plan was | "better monitoring". That would mean monitoring and alerting | on "rate of errors by customer" (or "rate of errors by | endpoint by customer", I don't remember). | | Given the usage pattern of the product, it was impossible to | create a global monitor like that, we'd have manually | configure it for each customer (and we had thousands of | those). And even then, we'd inevitably be dealing with false | positives every week. | | The right action plan was to learn from failure, but do | nothing. We got extremely unlucky during infrastructure | update, shit happens. We don't need to build a complex | monitoring system that catches one bug every 5 years. | firebaze wrote: | The root of all evil is someone claiming to know the root of | all evil. | | Snarky, but in my experience 6 sigma true. | halayli wrote: | > I have a feeling that today is the age of premature | abstractions and premature scalability | | which are optimizations. ___________________________________________________________________ (page generated 2022-09-05 23:00 UTC)