Ask HN: What is the single top-priority software engineering problem?

208 points by abrax3141 ↗ HN
If you have unlimited time and/or resources, what single software engineering problem would you address? I'm not talking about "Peace on Earth"-type problems, but rather real world practical problems facing software engineering that could be actually solved if you could pay an rationally large team of serious hackers a rationally large amount of money for a rationally long period of time. Another way of asking this is: What's the most important piece of technical debt across software engineering, that could practically be solved if we put enough energy into it?

363 comments

[ 1.6 ms ] story [ 414 ms ] thread
effective batteries included declarative programming
Fulcro RAD is promising in this regard, going more declarative seems inevitable, there are challenges in designing declarative things though

I think collectively we need more thought on how to design declarative systems that are tangible inspectable debuggable in the same way following procedural code is

Formal verification in the basic parts of the infrastructure.

User interface responsiveness.

The Web being based on standards that leak users' data left and right.

The decline of usability, recognizability and coherence in desktop user interfaces. I honestly think we reached peak UX some time in the mid-90s. With the advent of touch devices, paradigms are mixing in a way that's directly hostile to productivity.
I agree with your take that mid-90's was probably peak UX. But I think that has more to do with that being about the time when companies stopped trying to strike a balance between accommodating both power users and casual users. Since then, much more effort has been put into providing a polished/slick UI at the expense of things like automation. Of course, that also plays into the advertising model which I believe is diametrically opposed to things like automation. (i.e. if you're not clicking/touching, they can't tell if you're looking at the ads)

Touch capabilities can be a nice addition to many types of desktop productivity software without detracting from what's already there. Companies reworking desktop applications to look and feel like mobile apps (with all of the related pros and cons) is what causes productivity to suffer rather than anything inherent in the paradigm.

> working desktop applications to look and feel like mobile apps

This is basically what I mean by mixing paradigms, and it's getting more and more common in operating systems as well, with Windows as clear leader.

As for touch input, I personally think it's of little use on the desktop. I've already got a mouse, which when properly configured is a pixel-precision input device. I simply cannot do the things I do with a mouse on a touchpad, let alone a touchscreen.

There are several other crimes as well, big and small, mainly in Windows but also on Linux/BSD (especially in Gnome, where the worst decisions made seem to perpetuate into other FOSS DE:s). Apple is still keeping things relatively sane, even though they've slipped somewhat of late.

It's pretty shocking that we are where we are in 2020. That year sounds like the future to me, but in computer interface terms it's definitely dystopia. The market failure to cap all market failures!
Exactly one build system that doesn’t abjectly suck equine genitalia.
Most major problems now are people problems, not engineering problems.

One example: lots of software devs have no training and/or interest in security, and employers have no way to vet that.

Another: there is no way for users to trust SaaS security. I have no idea whether (as a random example) Atlassian has a great security culture or a terrible one. We just trust people who seem trustworthy, usually due to their polished marketing.

Much of security is also a people problem, though. You can have all the best encryption/firewalls/etc and still get hacked because your CEO uses their first name as their AWS password.
The existence of passwords is a problem, though. Perhaps it was the best approach in the '70s and '80s, but the world has changed:

- Most people use their own computers with high-quality local hardware, not a shared workstation, a public terminal, or a dial-up / serial line. So "store a secret on the client" becomes viable. (One of the biggest quiet successes in security, in my opinion, has been that everyone uses SSH as standard practice instead of telnet, and most of them use SSH keys or similar instead of passwords. It is significantly better to authenticate with unencrypted SSH keys on a laptop you keep in your bag or house than with a password.)

- Most people carry a phone around with them, and you can authenticate them by whether they have the phone.

- You can get a tiny USB device that does serious cryptography to authenticate you (and authenticate the site you're connecting to) for about $10. You can get two of them and put one next to wherever you keep your birth certificate, in case you lose the first.

All of these are technical wins worth celebrating, and now we're at the point where the people problem is not so much convincing the CEO to use a better password as convincing systems to use one of the above methods instead of using passwords at all.

State observability for the entire stack.
+1

I am working on this problem. Let me know if you are interested, I would like to hear your opinion. My Keybase is in my profile or I email you.

Artificial general intelligence
AGI has more to do with cognitive science and computational intelligence than strictly with software engineering but that's a good problem to be solved one day.
First, we need immortality to make it until AGI becomes reality in ~100 - 1000 years from now.
A computer and OS that boots in 100ms. Every user action gives a response in 10ms.
We had approximately that in the 1980s. And straight to a programmable shell, too.
And then we had to wait 10 minutes for a program to load over cassette tape with a significant failure rate.
(comment deleted)
As an example of just how far we are from this, generally the bootloader hasn't even passed off to the OS within the first 100ms.
I think it's really sad, because a system would likely have to be redesigned from scratch to make this happen. So it seems unlikely to happen.

But I'm not an OS expert, maybe it is possible.

You would have to rewrite the bios and not check any of your memory.
Well, the Atari ST booted in about one second, from black screen to moving a mouse around. A lot of that time was waiting for a floppy disk boot sector read to time out (so if you had a formatted floppy in the drive it'd spin up, quickly read a dud boot sector, and continue the boot process of the ROM-based OS rather than timing out).

I suppose if you were gonzo about it you could format the first track with sectors all numbered zero, and eliminate rotational latency. You'd save 80 ms (on average) that way.

Didn't seem worthwhile at the time :-)

On that note, the Slackware guy said that the startup speed advantage of systemd wasn't really worth it for his distro, on the reasoning that most people only rarely completely reboot their computer anyway, especially how we have hibernate and suspend today.
This is definitely not near the top of my list when I think of things that get in my way on a day-to-day basis, but I'm genuinely curious about how/why it is for you. I can't remember the last time I waited for my computer to start from a cold boot (updates apply in the middle of the night and the reboot happens then). It wakes up from sleep quick enough for me, and pretty much anything I click on or type responds fast enough to appear instant.
This probably isn't quite what the commenter had in mind, but boot time matters a lot for embedded devices. It's quite possible the "Linux box" you cold boot the most is the center console of your car.
That's a really great point: I'd love the infotainment system in my car to boot faster. But that is also not "the single top-priority software engineering problem" for me, either.
I think you make a great point. I agree that waiting for my computer to boot is a non-issue today. (Other latency certainly isn't)

But my Chromecast takes a very long time to start, modern TVs, Blurays, mobile apps etc.

Would you mind expounding on why this is important, and/or why you chose those specific timings?
not op but everything feels sluggish. Waiting for all the latency everywhere - over years/decades - feels really draining. i.e slow websites, slow desktop apps, slow languages, slow OS updates, slow IDEs, slow DB syncs, slow email clients.
Exactly, I wait almost a minute for my Chromecast to start every day.
Modern lightbulbs don't even turn on in 100ms. I have a hard time believing sub second computer booting is really at the top of anyone's priorities.
I think it is important for embedded, but sure, not for mobile and desktop. App start time being instant is much more important.
TVs and monitors don't even turn on in 100ms
My newest laptop is closer to that than any computer I’ve ever had since 1984. Mostly because of SSDs I guess, but Windows boots in a few seconds. Usually takes longer to shutdown than to boot.

10ms response is a bit on the fast side. Aside from pros doing sports or music, we (humans) don’t register most kinds responses that fast. Plus a 60hz display is 16ms anyway. These days browsers, editors, and OSes really do usually try to meet this goal for the most common workflows, though there are plenty of demonstrable exceptions. It’s a good goal, I agree with it, but maybe 100ms would be a more reasonable worst-case response time?

100ms is too slow for e.g. a pen on a touch screen. The ink will lag behind the pen.

But for worst case in general, not bad.

Yes absolutely! Drawing needs 60Hz or 120hz or better. I assumed perhaps incorrectly you were talking about one-time responses like apps opening and menu clicks and things like that. My statement above is not good for time-based motion, apps like games and drawing, those are better with 33ms response times or better, for sure, and 100ms is too slow.
Boot time is kind of ireelevant when everything spends its time asleep. But I strongly agree that we should try to reduce frame latency for "productivity" apps; you probably don't need 10ms as most people are still on 60Hz, but we ought to be able to manage two or three frames.

At least get typeahead working properly again. Various places have borken this, especially Facebook, but back on vt3270 systems experienced operators could just hammer a bunch of data into forms as fast as they could type. Can't usually do that with web apps.

I've used a Tempest arcade machine with near-zero latency, and it was a very weird and pleasant experience.

Isn't that basically what a phone or tablet does?

This problem is best solved with an effective, reliable sleep/wake mechanism, not a fast boot mechanism.

Build the tools and infrastructure necessary to make FPGA accelerator programming accessible to the average programmer. Moore's Law is mostly dead; we are getting more cores but we are not going to get significantly faster cores in the near future. What will bring us next big jump in computing performance is unclear but FPGA acceleration seems like one of the few promising directions.
I seem to spend far more time on the deployment of code than I ever used to, more time writing CloudFormation and ansible than the Java backend, python lambdas and static UI that it deploys.

That seems nuts to me. I'm not sure how you fix it without being Amazon/Google. People moan about Terraform too before that gets mentioned.

I was actually just talking to a friend the other day about starting a company to solve this for fortune 500's.

Nothing radical. Just a managed service provider that would build and maintain the CI/CD pipeline for them.

(comment deleted)
I recently heard about a startup trying to do something about this. Probably not totally mature, but might be worth a look: https://www.kaholo.io/ (I am not related to company in any way)
There is always heroku until your app is actually popular. Fake it till you make it.
> I seem to spend far more time on the deployment of code than I ever used to, more time writing CloudFormation and ansible than the Java backend, python lambdas and static UI that it deploys.

I'd really like to understand more about what the pain points are here. In contrast to your experience I spend almost no time deploying code. We commit, tests run, we click a button and the deployment is updated in our kubernetes cluster. We did have to put a fair bit of work into our gitlab pipelines and the tooling that patches config into our kubernetes manifests and depoys them to the right place (let's say 2 person months all-in), but the payoff in the end was pretty significant. We're a fairly small company so if we could afford to put the time in to build the foundation for painless deployment I wonder what prevents larger orgs from doing this work? Is it access to the right skills? Difficulty prioritizing non-revenue tasks?

Part of it is perhaps that I mostly do consultancy work. So rather than a product a company lives and breathes through the success of, they're usually costs that just need to be done sufficiently, quickly and then left to run themselves. 2 months is an awful lot if the project only runs for up to 6 months.

The last project I worked on was deployed to two different environments (double the headache in itself). One side required AWS CloudFormation (requirement imposed on us for that side to be serverless) which we were new to, so we brought in three different specialists one after another. None of whom could really help other than to tell us it was messy and confirm that we were on the right track.

There was a time when I'd just drop a jar and an init script on a linux box for an MVP, now I'm looking up what the yaml should be for sticking a lambda in a VPC, or adding security groups to EC2 instances or whitelisting CloudFront access IP addresses. And redeploys involving CloudFront are slooow. I think that project must have used a dozen AWS services and a few thousand lines of CloudFormation - for deploying perhaps half that many lines of code.

As an aside, GitLab PM for CI/CD here. It would be awesome to hear about what you built and how we could have made that learning and setup process easier. Feel free to DM me on Twitter? @j4yav
> As an aside, GitLab PM for CI/CD here. It would be awesome to hear about what you built and how we could have made that learning and setup process easier. Feel free to DM me on Twitter? @j4yav

Honestly most of the effort was not in the gitlab pipelines. We found those facilities easy enough to understand and implement. Most of the work went into the tooling layer between gitlab and our runtime environment. My email is in my profile if you'd like to reach out with more specific questions.

We're working on this at Spaceship: https://spaceship.run

We've still got a lot to build, but the goal is zero config deployment for any app/service.

We're in a weird transition period where developers are being forced to do ops. People will wake up to the fact that this so-called automation was just changing one type of work into another. Eventually there will be jobs called "build system engineers" and there will be a whole department that does this bookkeeping for you.
Training on a common ‘software engineering body of knowledge’. The state of the art is so different across organizations it’s like having medical tricorders at one place and leeches at another.
Only 2 things: Naming things, invalidating caches, and off-by-one errors.
Decent nocode, or some sort of nocode holy grail.

I want to be able to plug APIs together, process user input, have persistence and identity, without writing so much boilerplate.

If we don't take software engineers as a fixed population, but rather everyone on Earth with sufficient intelligence to code well with the right no-code framework (which currently doesn't exist), then this is indeed the biggest priority. Of course, I am under no illusion that no code will work for everything, such as developing ML applications from scratch. Even then, it can be a way to interface with pre-built ML apps, and use them in various industries. It would also serve as a pipeline for non-STEM workers into full-blown programming and STEM.

Think about what Excel did to productivity, and multiply that by 3x or more. That's what no code could do as the 60% solution for a 200x larger labor pool (more like 80% solution for anyone who can't access engineering talent). It would also make its creators obscenely rich. With the amount of processing power that we have, the time for no code is now.

By the way, there's a large chance that Big Tech incumbents won't be the ones to create the no-code holy grail. They have institutional handcuffs that will make that difficult.

Salesforce got it partially right. To be somewhat cynical, the trick is to enable no-code, but (a) make it just borderline user-hostile enough that you foster an entire marketplace of no-code consultancies to no-code for companies too busy and frustrated to no-code themselves, and (b) ensure everything is extensible with actual code. They got (a) balanced perfectly, but (b) is somewhat lacking, and it didn't have to be. Someone who builds the no-code-but-you-can-drop-to-code consulting network will be the next Salesforce + Oracle combined, and will empower a lot of people around the world.
Airtable?
I stan Airtable and use it daily, but without websockets or other ways to “push” changes to external systems, it’s not really suitable for (b), and from an interface perspective it’s not customizable enough (without coding a whole new UI, which runs into the above) to accommodate (a).
> It would also make its creators obscenely rich.

How? If you want a language to be adopted and become standard, it would have to be free and open-source. You don't get "obscenely" rich from that.

This is a good example of those problems that could relatively easily be solved with a proper public-goods funding mechanism, but very difficultly without.

The developer can create an ecosystem of services that leverage network externalities and tie into the no-code framework. Of course, they’d have competitors. However, there are network externalities both with the no-code framework itself and some of the services that tie into it. If you launch an open-source no-code framework simultaneously with your own ecosystem of services, then you will profit from those services as the first-mover.

Remember, non-engineers are more sensitive to ease of use. They aren’t as fickle as engineers are with dev tools. That’s why they pay money for Microsoft Word and stick with it even though there are many free competitors. They’re accustomed to Microsoft Word, their friends use Microsoft Word, and the software is always marginally better because outsized profits are reinvested into the software.

Additionally, if the above is not enough to make one obscenely wealthy, consider this: it is not pre-ordained that no-code would be as open as a programming language like Python. In fact, it might be better for the users if no-code is a platform rather than an open-source framework (I don’t believe that, but maybe). Obviously, platforms can charge rents as the intermediary between end-users and suppliers of services on the platform. That will make you fabulously wealthy, assuming widespread adoption.

So, if there is a lack of:

- profit potential from ancillary services, and

- funding from users, suppliers, and patrons

- or, in any case, if the no-code would be fundamentally worse with open source

then a for-profit platform is the way to go. Personally, I believe that the open source + ancillary services route will result in a better ecosystem. Nonetheless, it’s worth investigating which of those three clauses are true (if any) and why, because that will have big implications for the no-code project.

This seems like an antigoal to me.

Abstracting away infrastructure just means it will become increasingly centralized as a commodity and less likely/harder to create independent services.

I don’t necessarily agree.

Look at n2n or userbase, they’re open source and can be self hosted.

Other nocode tools can follow suit, and can be federated.

I agree with the other comment that this can have the same effect as the one Excel had during the past decades (there are companies running completely on Excel).

At the moment though, the tools feel too limited.

Sure they can be, but the whole ethos behind it is "don't make me think about anything other than the application."

So by default the majority are looking for hosted services, otherwise they'd just build their own stack. For anything other than some organization building a bunch of applications, that same Nocode Dev has no need to ever migrate so long as some major service provider is doing it for them.

Ah, the impossible holy grail of businessmen and marketeers everywhere
I’m a developer by trade and I want nocode, albeit thinking as a product guy/entrepreneur. I want to get to market fast, and then possibly iterate with code.
complexity overload: identify and eliminate unnecessary bloat
Unlimited time and resources? I'd try to tackle the global security issues related to advanced cyberattack. It's such a complex problem I don't even know if it's possible, but it would require hardening software update servers, networks, and utilities (especially electrical power distribution) to the point where a single bad Windows update doesn't take out the economy.
A search engine that produces results you would find interesting/helpful/engaging most of the time. It should heavily penalize SEO optimized, clickbaity listicle trash. Content that was created organically as part of a conversation should rank very highly if it's relevant to the query, as well as blog posts from obscure but highly relevant and informed sources.

Google died when they stopped being well informed librarians and started being aggressive salespeople. It's time for a new search engine to step in specifically catered to the curious.

This does not seem like a software engineering improvement.
It would improve it for me, but only because I'm a glorified google search monkey
Removing out of date and incorrect advice on c++ from the internet.
As someone trying to learn c++ this would be great.
If you get a job at a company that uses C++, you will probably need some of that outdated information.
Same with python. I was looking for a good message queue yesterday and all the results were from 8 years ago due to stackoverflow's zealous dupe rules.
(comment deleted)
>What's the most important piece of technical debt across software engineering, that could practically be solved if we put enough energy into it?

Being able to update libraries, tools etc. automatically and without friction. Right now upgrading is so tedious, error prone and painful that most places just keep using ancient versions that are not only lacking bug fixes and newer features but are a huge attack surface.

That is not known to have a solution.

It's a human coordination and cooperation problem on a global scale.

Take the people (and LAWYERs) out of the equation and software becomes much simpler.
I'm not sure if this is sarcasm or not.

But, yes, without users it is easier to create software.

Completely pointless, but much easier.

What if the new version has a bug?
Statically-link everything and ship it as single file EXEs or containers.

Offer different versions.

Sandbox programs at the OS level to mitigate old (or new) vulns.

CSS bloat belongs somewhere on the list. Thankfully, actual, pragmatic and standards-based solutions (proper design systems, treatment of layout as a first-class concern, and component-scoped CSS-in-JS) are finally emerging.
What makes software hard is the messiness of the human real world: time zones, keyboard layouts, languages, Unicode, GDPR, SOX compliance, etc, etc.
Ignoring hard problems like memory safety and parallelization (let's say), I think the biggest soft problem that I experience is optimizing the amount of time spent doing work relative to setting up boilerplate - mainly during web programming, i.e. it took me literally a few days to work out how to use code from and deploy node_modules without cheating.

Not trivial but maybe automated by some meta-meta-build tool?

Most, if not all tooling, comes with a learning curve. But once you pay it, that initial ramp up time is not required on the next project.

I could start a new project with Spring Boot and Ember.js, provision a Debian box with Postgres and nginx, and deploy all of it within an hour because I know these tools. But I too paid the learning price my first go round.

I would create a cross-platform GPU-targeted GUI framework for .NET Core. Something like Avalonia, only without skia, directly on top of D3D11, GL, GLES or Metal. Modern GPUs are awesome, can directly render very complicated vector graphics. Outside Windows not used for GUI despite there's need for that, slow mobile CPUs + very high rez displays are both common.
Formally specify all the commonly used languages, runtimes and APIs, so that we could translate programs between them. Then make sure that all programs such translated can be compiled, so that we don't waste resources by running inefficient VMs.
This would go a really long way towards efficient code reuse as well, with far less "reinventing the wheel" all the time if shared libraries more easily work across all (common) languages.
There's too many damn libraries