Laws of Software Engineering
A collection of principles and patterns that shape software systems, teams, and decisions.
1.1k points on Hacker News
A collection of principles and patterns that shape software systems, teams, and decisions.
1.1k points on Hacker News
Organizations design systems that mirror their own communication structure.
Premature optimization is the root of all evil.
With a sufficient number of API users, all observable behaviors of your system will be depended on by somebody.
Leave the code better than you found it.
Don't add functionality until it is necessary.
Adding manpower to a late software project makes it later.
A complex system that works is invariably found to have evolved from a simple system that worked.
All non-trivial abstractions, to some degree, are leaky.
Every application has an inherent amount of irreducible complexity that can only be shifted, not eliminated.
A distributed system can guarantee only two of: consistency, availability, and partition tolerance.
Small, successful systems tend to be followed by overengineered, bloated replacements.
A set of eight false assumptions that new distributed system designers often make.
Whenever you change a complex system, expect surprise.
Every program attempts to expand until it can read mail.
There is a cognitive limit of about 150 stable relationships one person can maintain.
Individual productivity decreases as group size increases.
The square root of the total number of participants does 50% of the work.
Those who understand technology don't manage it, and those who manage it don't understand it.
In a hierarchy, every employee tends to rise to their level of incompetence.
The minimum number of team members whose loss would put the project in serious trouble.
Companies tend to promote incompetent employees to management to limit the damage they can do.
Work expands to fill the time available for its completion.
The first 90% of the code accounts for the first 90% of development time; the remaining 10% accounts for the other 90%.
It always takes longer than you expect, even when you take into account Hofstadter's Law.
When a measure becomes a target, it ceases to be a good measure.
Anything you need to quantify can be measured in some way better than not measuring it.
Anything that can go wrong will go wrong.
Be conservative in what you do, be liberal in what you accept from others.
Don't leave broken windows (bad designs, wrong decisions, or poor code) unrepaired.
Technical Debt is everything that slows us down when developing software.
Given enough eyeballs, all bugs are shallow.
Debugging is twice as hard as writing the code in the first place.
A project should have many fast unit tests, fewer integration tests, and only a small number of UI tests.
Repeatedly running the same tests becomes less effective over time.
Software that reflects the real world must evolve, and that evolution has predictable limits.
90% of everything is crap.
The speedup from parallelization is limited by the fraction of work that cannot be parallelized.
It is possible to achieve significant speedup in parallel processing by increasing the problem size.
The value of a network is proportional to the square of the number of users.
Every piece of knowledge must have a single, unambiguous, authoritative representation.
Designs and systems should be as simple as possible.
Five main guidelines that enhance software design, making code more maintainable and scalable.
An object should only interact with its immediate friends, not strangers.
Software and interfaces should behave in a way that least surprises users and other developers.
The less you know about something, the more confident you tend to be.
Never attribute to malice that which is adequately explained by stupidity or carelessness.
The simplest explanation is often the most accurate one.
Sticking with a choice because you've invested time or energy in it, even when walking away helps you.
Our representations of reality are not the same as reality itself.
A tendency to favor information that supports our existing beliefs or ideas.
We tend to overestimate the effect of a technology in the short run and underestimate the impact in the long run.
The longer something has been in use, the more likely it is to continue being used.
Breaking a complex problem into its most basic blocks and then building up from there.
Solving a problem by considering the opposite outcome and working backward from it.
80% of the problems result from 20% of the causes.
The best way to get the correct answer on the Internet is not to ask a question, it's to post the wrong answer.