Ask HN: Have coders made stuff complicated on purpose?
Are we embracing imperfection and variations of it deliberately?
Or is it some kinds of fallacy to believe that simplicity has a rather obvious form?
It's more like "simple" isn't "simple enough", isn't it? The latter of which one can get to faster and from his own POV alone while true "simplicity" takes time and consideration.
62 comments
[ 4.6 ms ] story [ 144 ms ] threadThat’s entirely due to “the cloud” and k8s and friends.
But I think the industry is waking up to this; there's just a lot of sunk cost. Kubernetes makes a ton of sense, for some organizations, but if you're not hosting your own machines in a data center somewhere, its probably not for your organization and you'll always be better off just using the highest abstraction level non-k8s primitives your cloud provider offers.
React: Is in a different league. React solves legit problems. UI is hard. React doesn't create zero problems of its own, and some of those problems are of the "we thought redux was the best way to think about this, we were wrong, but now there's a billion lines of redux out there" variety, which sucks because it was self-inflicted. Also, you've got the Vercel folks entirely convinced they're God's Gift to Humanity steering the ship in directions no one really wants. But the core of React is really good: fn(state)->ui.
Whatever it’s evolved into now is a different monster.
There definitely aren't enough people deliberately obfuscating to make it a generally visible cause of complexity; your quote here rings far more true to me.
For example, "refactoring" as a task very frequently just trades one set of things, often aesthetic things, for another -- it is rare to find any obvious best expression.
I guess the difference that (in Germany) math exercises cares more about reasoning and explaining while in CS / informatics solution is only the tested result. So yes, coder make the world more complicated ;)
That may explain the sentiment that the code is the documentation. There may be some html or pdf with "documentation" in the name, but if it's inaccurate, you're going to end up looking at the code anyway.
If that's your experience it makes writing documentation hard to justify. It's a poor approximation to reality which becomes steadily less true over time. So really what's the point.
We need something closer to live documentation which runs the examples against the codebase and fails CI when they stop working to have a chance. Some projects do that. Deriving docs from comments helps a little but comments are often wrong too.
A: "Job security ha ha ha"
(paraphrasing of an actual conversation I have had multiple times with coworkers)
Some of it is incompetence.
Occasionally there are claims that it's deliberate attempts to make the author look more valuable though I haven't seen that in practice. Hopefully it's a myth.
Some of it is indifference. You're sufficiently beaten down by the environment that you no longer care about the product.
Also the underlying problems are sometimes very complicated in which case there may be no way to make the solution simple.
But all of your points are still valid and important parts of the problem.
1. A need for standards
2. The industry being too immature for standards to exist and those that are created rarely stand up to the test of time
Look at standards from the late 80s / early 90s, most of it was not prepared for what software has NEEDED to change to.
Look at most programming languages, designed to only run on one machine, when a vast amount of software is designed with high-availability in mind.
Look at most databases, designed to have only one writer which is a huge bottle neck.
Now we need software to coordinate all this software that was designed to run by itself...
Finally, in the pursuit of perfection, we test new ideas in the open, the latest UI framework, a new database, a new paradigm... We are doing the scientific method on NPM and your organization is a part of it :)
Consider how much more efficient we should be with allegedly-better processes and allegedly much better tools.
Look at some of those and estimate the team size and time to complete it now. Consider whether you could even deliver the same thing (say, native applications on two or three platforms) with double the team size and thrice the time, or whether you’d have to compromise and deliver something worse to make that happen.
There’s your answer.
[edit] though actually I think part of this is also because we’re on-average worse at managing companies overall, too.
Today I work in a team that supports a wide array of operating systems, device form factors, resolutions and aspect ratios, input methods; we maintain the backend and it's up to us to make it secure, performant and fast for users from anywhere in the world; and of course API access. Customer data doesn't fit on one disk and their processing can't be done with one machine, and they have a globally distributed workforce. We are slower because we do much more.
Games yesterday: worked on certain HW, sound probably required you to jump through hoops to get working, and networking maybe worked on a LAN. If things crashed it was fine because that’s the only thing you ran anyway. Cutting edge graphics for the time but at that time showing an image or playing a video was also an achievement.
Games today: supports HW from at least 2 GPU vendors, an insane amount of resolutions and typically basically the same code for PC, PlayStation, XBOX and maybe even Linux and Mac. Sounds and graphics just works. Networking lets you play with people across the continent over the public internet. Oh and the time and effort invested in graphics quality is insane.
Teams yesterday: highly motivated engineers who were extremely talented and new every part of the machine
Teams today: a mix of highly motivated engineers who are extremely talented with many more who just want their paycheck and to go home of very varying quality of talent. Same expectations of excellence. Machines have gotten very complex that cutting through abstractions is challenging
Infrastructure yesterday: sell a database and the business is responsible for maintaining it and having it run well with onsite domain experts to help
Infrastructure today: sell almost anything so that you need almost no understanding and expertise of the software you’re utilizing.
These two are not mutually exclusive.
You missed a key part of that sentence. Also, there’s a huge difference between two engineers when one is super motivated and engaged by the work vs someone phoning it in.
But hardly anybody would buy it or want it.
Today, a team of 40 struggles to release a workable game on one system that has to be patched on day zero because of all the bugs. And porting it to even one other system (with the same CPU architecture)? Forgetaboutit.
You can argue that the game companies are focusing on hyper realism at the cost of fun games, but the games we’re playing today are orders of magnitude more complex than in the Atari days. Those Atari games built on today’s technology would take comparatively little time and could be as easily ported. That likely also explains why the game industry is focused on limit pushing AAA titles. It’s a defensible market position of technical advantage whereas competing on “most fun” puts investment dollars at risk because you can be undercut by an underdog more easily. So the big companies just focus on the places where it’s harder for upstarts to compete and why almost all games look and feel very similar.
Once they bring Basel, Go, Tensorflow and C++ into projects and start refactoring and perfecting theseNamesThatJustHaveToBeCorrectAtTheLevelOfExcellenceThatCanGetAPlusTwoOfXooglerPrinciple then their complexity and costs get to the level of a software engineering project at Google. Without having the quality of engineering workforce and infrastructure that Googlers enjoy.
Not a change to the better in the software sector management, in my opinion.
It takes more effort and time to produce simpler solutions, and generally speaking as an industry, we're way balacned toward speed over quality. We basically only care about "quality" as far as it has direct customer impact. It's relentless optimization for the short-term over the long-term, and it leads to complexity.
“Hanlon’s Razor”
https://en.m.wikipedia.org/wiki/Hanlon's_razor
That gut feeling only comes through pain, aka experience, botching a refactoring you thought was brilliant to simplify code, and realise there were reasons for it to be overly complex. Experience working with overengineered code that takes a while to realise it's actually much simple than what the code is telling you, and can be thoroughly simplified.
Over many cycles of those experiences I believe one can start developing a sense of form for what's good simplicity.
Another point is it comes from the experience of reading vast amounts of code, from many different skill levels/sets.
Simplicity takes time and consideration from experience, I don't think you can jump the step of building experience to be proficient at it.
“Simplicity” can also be defined any number of ways, but is most often defined as “Maximally pleasing simplicity” rather than “Fewest moving parts simplicity”, in part due to misestimating how total volume of moving parts is an exponential complexity modifier when one is not already familiar with the mechanisms. https://xkcd.com/2501/
You get what you reward. Our industry rewards more keywords in your CV. Therefore, people try to get as many keywords as they can.
6 or 8 years ago, I was a second level manager looking to find the next managers in my group. There was an engineer who was great at mentoring and was exceptionally practical. What do I mean practical? I repeatedly saw her going to her PM and saying things like, "If we can skip this one feature, we can get the other dozen done in a week instead of a month and there will be less than half the code to maintain." The PM was more than happy to do this because he had a lot more features in the pipeline that he wanted to get to, and giving up that one meant getting a bunch more.
That engineer initially turned down becoming a manager (a couple of years later, she became a great manager!). Her reason was that she felt she was the least capable engineer on the team, and she wouldn't know how to coach the better engineers. This confused me, so I asked why she felt she was the worst. She literally said, "[name redacted] can stay late and write a 1,000 lines of code in an evening. I haven't written a thousand lines of code in the last quarter." I had to explain that it's entirely possible that that person is a better programmer, but not a better engineer - they are not the same thing. And, that prolific programmer hadn't shipped a feature in months.
Features, at least good ones, are an asset. Lines of code are a liability. You need the features to be valuable enough to pay for the ongoing cost of the lines of code. This engineer understood this intuitively, without realizing it consciously. The prolific programmer did not get it at all.
So, even as I was trying to build a culture of better engineering (i.e., finding better trade-offs, including limiting complexity), these broad ideas about complexity==good were in the way, deep inside people's heads. Being able to foresee and head-off complexity is an incredibly valuable skill. Sometimes the complexity is worth it, but so often it's not.
if someone isn't knowledgeable about the problem they're not going to be able to select the most simple solution.
if someone isn't knowledgeable about the available solutions there's a higher chance they'll implement an unnecessarily complex solution.
now multiply this over time and you get a code base that is really good for everyone's job security.
multiply this by millions of code bases and you get a really good tech economy.
But today's "get it done now" outlook encourages complexity. That was always around, but ....
About 20 years ago or so, it was OK to get things done right and be a little late. Now seems this "get it in now, do worry about consequences", then "Well we have issues, create a request and will will get to it later". But later hardly ever comes, so the users are stuck.
So here we are, everything is complex, no time to think about what you are doing.
In the '10s, everyone was talking about "webscale". VCs noticed that we could write software for hundreds of thousands of occasional users instead of a core group of a few thousand users.
We thought we were making UIs to help people do stuff, but we were really making little feeler apps for vertical integration for corporate interests.
Stuff like big-data and kubernetes looks overcomplicated if you believe the sales pitch. The "tech set" is negotiating for control over business.