Manifesto for minimalist software engineers (2013)
minifesto.org
minifesto.org
You think that the world is full of situations where 80% of the payoff comes from 20% of the work/complexity/whatever?
I tell you that, equally, the world is full of situations where you get 0% of the payoff unless you've done 100% of the work.
That latter observation is just as true as the former, but it won't make anyone into a best-selling business book author or motivational speaker, as it doesn't help with cognitive dissonance reduction when reflecting upon laziness and ineptitude, as Pareto's law does.
Well stated. Deep down I’ve known this to be true, but since Pareto’s law is often over used, it’s easy to lose sight of other aspects of reality. This one is often overlooked.
Judgement must be used to understand how these two concepts can apply to a given situation or decision.
Repeat for several decisions and soon you have tens of thousands of deps.
Difference between principle and law: https://philosophy.stackexchange.com/a/94475
https://en.wikipedia.org/wiki/Pareto_principle
The conflation being at the root of most of what you said is unfortunate: Pareto's law would indeed be a bad law, if it existed.
Yes, I think the world is full of situations where 80% of the payoff comes from 20% of the work.
I'd even be cheeky and say that the Pareto principle applies to about 80% of situations.
Distributions of behavior that are perfectly flat like you suggest might exist, but are less common in large populations or samples. Do we have any names/principles/laws relating to flat distributions in nature or human behavior? I’m curious if you could give some examples of what you’re thinking of, the situations where there’s 0 payoff until all the work is done, and what basis there is for claiming this is equally true and common as varied distributions?
Not op, but surgery strikes me as an example where there's effectively 0 pay-off until you finish everything. I personally wouldn't want the surgeon to sack it off without sewing me back up.
Another example I can think of is escape velocity. I'd venture that the principle you're asking for is "phase change", where a threshold gates a drastic change in behavior.
Phase change in physics certainly is an example of a narrow peaky distribution, I’m just not sure how often that kind of distribution is a reality for human behavior, which is what the top comment was reacting and referring to. I can think of a few and was just arguing they exist in another thread elsewhere when it comes to pricing and consumption for scarce-resource high-demand economics. So they’re out there, but I’d be pretty hard-pressed to agree that these are common enough to make claims that they’re equal to distributions with lots of variation. It feels like the top comment was making an assumption, arguing that the Pareto principle is a made-up idea that’s just as common as other made-up ideas, but that’s not really true.
It depends on your perspective. For a lot of those 100% situations, you could think up some high-effort, low-payoff bells and whistles to turn it into a 80%/20% situation.
No "law" of software or business is technically a law in the same rigorous sense that a scientific law is. But that's not why we call them laws and it would be nitpicking to call that out, besides entirely missing the point.
Also, it's actually the Pareto Principle (https://en.wikipedia.org/wiki/Pareto_principle) not "Pareto's Law" but that's also nitpicking.
Think different. Simple is harder than complex, which means you'll need to use your creativity.
The KISS people tend to think simplicity is the easy route. The acronym basically says so. But it’s the other way around.
> Je n’ai fait celle-ci plus longue que parce que je n’ai pas eu le loisir de la faire plus courte.
Where we fail as a craft though seems to be in passing on this information to those not yet convinced.
Inter-generational transfer of robust best practices might be fundamentally intractable since often worse practices (pushing featurea over solving technical debt, adding needless complexity and bad abstractions) actually pay well. At the same time, it's not like we're putting in too much effort into this.
In both cases I'd say that the authors is getting at the right idea but they haven't really formulated it precisely in their heads.
As such the value is clear to the experienced person with the benefit of many years hindsight but not to the newbie.
XP kind of did this with the whole Chrysler thing.
I reckon a website that aggregated these stories would be a more powerful illustration.
With the fossilization of hardware we can, and inevitably will, write the last software at some point.
There will be one best web-server, game-engine etc. for every domain.
It's just a question of time, and then that IS what those implementations will be: Perfect and Optimized to no end!
Together with simplification and other guidelines these projects will probably be <10.000 lines.
You need to be able to learn from them.
A project like Unity or Unreal might be open-source/source available but if it's so bloated nobody can understand it there is no value long term.
Maybe, but the context/requirements change too. For one of your examples, what a web server is desired to do changes with HTTP/2, and that may mean the "last" web server no longer is. But even less drastic/specific things can change desires and requirements; things change, even if hardware doesn't.
Some big changes are desktop to web, web to mobile, single user to multi-user, power user to newbie… and so on.
For me it's HTTP/1.1 until humans run out of electricity.
So OpenGL (ES) 3, HTTP/1.1, JSON, SMTP, DNS...
But one thing that I have learned is hardware progression (C64 -> Amiga -> PC -> Raspberry 4) and that race is permanently over for humans for eternity.
So we'll see what happens to software!
Finally you can't just throw more energy at a problem, you actually need to write code with limitations in mind again!
I am against a world economy based on mandatory high growth. I am also against new tech, just because something is new. I make exceptions: deep learning applied to real world problems, better theories and implementation for security and privacy, and better online platforms for creating things; for example leanpub for writing and Google Colab for writing and sharing ideas and experiments in ML and DL.
How often are we disappointed when new versions of software seem worse than previous versions?
* Futurist Programming Notes - http://www.graficaobscura.com/future/futnotes.html
* Manifesto - http://www.graficaobscura.com/future/futman.html
* Background - http://www.graficaobscura.com/future/
My favorite exercise: http://www.graficaobscura.com/future/futnotes.html#:~:text=R...!
I have a problem with "Perfect is enemy of good". I get the whole thing with iteration and so on, it looks good on paper, but in my experience when it comes to "First do it, then do it right, then do it better" and modern software development methodologies, you are lucky if you even get to work on the second step. And the nastiest projects I've encountered in my career have been all "evolved".
However, project management loves to mark things as complete, so getting it polished to usual standards is the hardest part.
So it winds up being arguments about whether something is "bad" or "good enough". I mean, that's kind of the whole damn trick, figuring out what is good enough.
It's good to remember that "good enough" has upper as well as lower bands, it's true that perfectionism is not the way to go -- especially because you are usually over-confident in your ability to predict how something will actually turn out under real world use and requirements.
But I also find people insisting "the perfect is the enemy of the good" while trying to do crap. Why bother trying to do better than crap, the perfect is the enemy of the good!
Determining what is "good enough", over the sustainable long haul, is literally the whole trick to software design. At what point you are getting diminishing returns or even counter-productive complexity from trying to polish it further. If it was easy we wouldn't be having these conversations. Slogans still don't make it easy.
I've done over and over without any issues.
In order to work on second step you need two things:
1. A plan (at least a vague one) of how will you execute the second step iteratively (i.e. without rewriting everything from scratch).
2. Actual business need for step 2.
If you aren't able to execute step 2 without the Big Rewrite, then it's on you. Business doesn't want to take these risks.
If your business doesn't need step 2, then what are we complaining about?
I guess the only advice I have is stop treating step 2 as "step". It follows the same Pareto Principle: there's 20% of effort in step 2 which gives 80% of results.
Hacky, non automated, low quality, not tested, hard to maintain, slow code. Remember, we are at step 1 of "First do it, then do it right, then do it better."
Business rarely needs refactorings and performance improvements, until they do, and things turns really ugly when they do, because they've been focusing on shipping "good enough" crap instead of focusing on the actual "continuous improvement" they claim to do.
Have you seen truck drivers complaining they are forced to drive old trucks and not brand new Ferraris?
If low quality code gets shit done, why would company invest into high quality? Delivering goods in Ferraris might be hell of a fun for drivers, but it's a stupid decision for a trucking company.
How confident are you that your high quality will pay off? When exactly will it pay off? How confident are you that your measurement of "high quality" is not biased? How confident are you that your teammate's perception of "high quality" is not just chasing new hype?
> Business rarely needs refactorings and performance improvements, until they do, and things turns really ugly when they do
Sure, and that's why it's your job to prepare for it. Not by creating "high quality" code in advance, but by creating low quality code that is malleable.
> Have you seen truck drivers complaining they are forced to
> drive old trucks and not brand new Ferraris?
No. Where I come from, truck drivers own their own trucks and are pretty happy about them. What they do complain about, however, is people telling them how to do their job. > Not by creating "high quality" code in advance, but by
> creating low quality code that is malleable.
Nah, I don't think I will. You can have fun maintaining low quality code. I'll just move somewhere else where these instant gratification, feature oriented "minimalist software engineers" are challenged and cannot smear their spaghetti code in whatever they touch.And you're free to write your own software in whatever way you want. But when you're working for a business, the end goal of your code is to create value, not to brag to your friends about fancy dependency injection framework that you used.
> I'll just move somewhere else where these instant gratification, feature oriented "minimalist software engineers" are challenged
It's not about instant gratification, it's about building business that can survive in the market. Creating as much value as possible with as little cost and risk as possible, long enough to survive and become profitable.
In fact, it is very far from instant gratification: I have a list of 100 items I personally want to do, and I only get to work on 10-20 of those. But today I'm mature enough to realize that my personal wants can be at odds with business needs.
Suppose you want to make a new graphics app. Do you want users to easily create beautifully typeset documents? Then you'll have to do a ton of schleppy hard work to give the user the option to bend/morph/scale graphics to their taste. A "minimalist" graphics program isn't any good because then the designer won't be able to create what they have in their mind.
Code isn't written for other people. Code is written so the end user ends up with a great product that solves their problems. If you're lucky the code is minimalistic and beautiful, but usually you'll have to struggle through one schleppy problem after another to give users the features and performance they desire.
In the software world, yes. The question we should be asking is "Does this product need a touchscreen / app / web interface?" There is no "minimal" way to invoke the efforts of half of the world's FOSS (and other) software developers so that you can have a "beautifully" animated button to dispense coffee (yes, my workplace has a coffee maker with touchscreen, and I hate it).
As a software engineer who personally wrestles with this conundrum on a daily basis, I'd love to set up a "you don't need software" design agency.
Sign me up!
If it helps, I have an large collection of antique and vintage knobs, switches, pots, buttons, and sliders. ;)
Of course it is written for other people, at least if your future self counts as another person. Or is it write-once-never-look-at-it-again code? Then yes, but that's rare.
True to some extent I guess. But in my experience “hipster perfectionism” is also a fantasy.
It’s easy to think that if we make the user experience exactly the users (or in most cases actually some product manager) wants it then we’ll have massive traction. In reality that’s rarely what happens. In many cases I would say nothing at all happens.
As an example I ran the analytics group at a moderately successful startup a few years back. The engineering team put in massive effort in a new release that would be so much more polished and easier to use. But when we looked at the numbers a few months later it was impossible to discern any meaningful change around the deploy date. I didn’t say anything about this to the higher ups of course, and neither did anybody else.
External constraints can be the driving force here - I have a project which involves firmware running on a soft CPU in an FPGA. I'm targetting several different devices, but the project will no longer fit the smallest device if my firmware (code, working RAM and stack combined) goes over 12 kilobytes. In the middle of working on this project I took delivery of a new workgroup printer at work, the remote monitoring software for which was a 1.5 gigabyte download. And apparently we live in a world that sees nothing wrong with that!
1. Graphics and videos. Nice, high res, smooth animations showing how to operate the printer.
2. Frameworks. Because Qt libraries don't come with Windows.
3. Various dependencies
In turn, each of those explodes due to human needs and convenience. Eg, you have an animation that says "Press here" in text. You sell the printer internationally. You'll probably have 20 different versions of it in every supported language.
A large amount of complexity works down to human convenience -- Unicode requires large fonts and complex software
Some is because the platform is what it is. Windows doesn't have a package manager, so it can't pull in libqt5 for you when you try to install an app -- so it has to come with the app.
We've also agreed that every app shall bundle its own dependencies, because DLL hell was really hell, and trying to have one system-wide copy wasn't working.
For example, Calibre is around 350 MiB. It embeds Qt, Chromium, Python and ICU, is fully localised, and has rather a lot of functionality.
Video content can be fairly large, but a high-quality 1080p encode is around 500 KiB/s. Can you really pack an hour of instructional videos into some printer software?
I can think of a couple ways that you could cross the 1 GiB mark, but none that would involve sane engineering choices or "trying and rejecting" other options.
Having to ship instructional assets in multiple (human) languages is a fair point, and one I hadn't considered - though in this particular case there are no movies or animations that I've seen.
Most of Dale's points are correct, though - but that doesn't make it a sane state of affairs, and it saddens me that we just accept it with a sense of dejected resignation instead of trying to do better. I had (obviously naively!) expected the the microchip shortage to prompt a massive drive to extract every bit of value from the ones already in service.
Make software that works. Make software that people can use. Software is a tool, not a goddamn modern art project.
Bonus: It's 2022 and people are no longer interested in playing with half-baked MVPs. Think twice before skimping on a decent UI, etc. There won't be a second chance to make a first impression.
Failing fast and iterating is absolutely important to make sure you're building what your users actually need. I've found that what users want/need and what they think they want can be very different.
"synthesis"? In what context is this word being used? "clean kipple"? I've never even heard of that word.The first google result for "kipple" is some reference to Blade-Runner!?
Also
>88 requests, 2.1MB transferred 5.4MB resources, finish 9.04s
Practice what you preach maybe ?
Herein lies the problem though: it's "minimal" for them, at the expense of the users. Like all those soundbites.