Ask HN: What Makes Software Great?
I've been looking through a legacy code base recently and have observed a perennial question come into my mind:
What makes software great?
Of course it needs to work for its intended purpose. But that alone does not make great software. That is merely table stakes.
The more I work in this industry the more I think the main thing that defines greatness is:
Is the code easy to understand?
Of courses there is subjectivity in even this, but could a reasonably intelligent developer easily see what is going on in a codebase, even as it grows sufficiently large.
Empathy is a superpower here. How much are you thinking about the poor souls that will follow in your footsteps and be asked to build upon your foundation?
I know this is a complex topic with plenty of subjectivity. But I am curious what your thoughts are here.
What makes software great?
14 comments
[ 6.1 ms ] story [ 42.9 ms ] threadUnlike a light switch a software does not live in a static environment, so it must be able to keep changing.
A software is like a plant, you want stability (no surprises) and adaptability within the resources that are available.
Adaptability, maintainability, reasonability etc are virtues that are difficult to overstate.
I can reach in my tool box and take out a socket, that will fit a torque wrench, breaker bar, or ratchet. I can easily see exactly how it works.
- It is reliable
- It is focussed
- It models its domain well
- It is efficient in its interactions and use of resources
- It scales the patterns of interactions to the proficiency of its users
- It is fast
- It does not break compatibility of its interface without reason
- It is intuitive
- It is well documented if documentation is necessary
- It is accessible and international
- It is open (source)
- It is extendible
- It has a community around it
- It helps users to understand the domain and possibly extends the common understanding of that domain
- It works in the best interest of its users
- It does not lose data
- It fails gracefully and explains reasons for failure clearly
- It does not contain ads
- It fosters creative solutions to problems
[0] https://hackaday.com/2018/09/10/doing-one-thing-well-the-uni...
I disagree and it's probably illustrative to explain why.
The worst engineers I've ever worked with have all been obsessed with the idea of software rather than what it accomplishes. Modular code, readability, efficiency: all are means to an end. Good engineers will do these things in proportion to their utility to the end goal.
In contrast, there's a legion of engineers who right this very instant are more concerned with onboarding processes, whether their code has the right subjective shape, what the linter rules are, and whether there is enough content on the company blog. Don't be one of them. Build useful things and don't "play software engineer." People who do work on building software will be too busy to care about ephemera and they'll achieve excellence because that is what is required of them.
Put another way: if working software is just "table stakes", raise the stakes. There is no better way to improve the objective quality of your software than to make it do more for the user or have it do it better. It is the reason for code to increase in quality.
Good code follows some base set of standards, works, and can be updated/replaced/rewriten easily (simple to understand scope).
Then there are aspects that are related to code. In those terms code that is consistent (follows team agreed definitions on naming conventions, code formatting, styling etc), APIs that are guaranteed with well written tests so that developers can develop with confidence, has good infrastructure for common idioms such that the developers mental burden is taken off of the how to do and focused on what to do are the things that come to my mind.
I think great software is all about organization, code should be predictable. Legacy code should not become a problem over time, it should provide a solid foundation for growth. Poorly organized code will set you up for failure.
Two totally different topics really, but narrowing down what question you are trying to ask seems more important here.
With that said, I think a good code base is necessary if you don’t have good software yet. You need to be able to try things in a relatively painless way so you can iterate.
Software can also be good and bad at the same time. AWS is great for scaling, but terrible developer experience. Things can be both things at once, or even three things (their codebase could be immaculate, or not).
Seems like a trite conversation when we try to generalize it. Everything is so case-dependent with this stuff.