Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/streamcode9/software-design
This repository collects software design principles
https://github.com/streamcode9/software-design
software-architecture software-design software-development software-engineering
Last synced: about 1 month ago
JSON representation
This repository collects software design principles
- Host: GitHub
- URL: https://github.com/streamcode9/software-design
- Owner: streamcode9
- Created: 2017-10-05T18:14:32.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2023-10-14T12:17:04.000Z (about 1 year ago)
- Last Synced: 2023-10-15T22:02:56.094Z (about 1 year ago)
- Topics: software-architecture, software-design, software-development, software-engineering
- Homepage:
- Size: 908 KB
- Stars: 0
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Principles
## Core principles
### Thoroughness
There needs to be some thoroughness in the approach. And if you did something hastily and it miraculously works, even though it shouldn't, then it needs to be documented, and you must understand that this is only a temporary solution.
Imagine person made a few commits with typos that did something completely different from what was stated in the commit and change request descriptions, and neither the author nor the reviewer were bothered by it because build was green.### Risk-driven approach
Systematically identify, assess, and mitigate risks to ensure project resilience, maintain information security, and achieve project objectives despite uncertainties in the external environment.
### Principles contradict each other
### Doing something, even if it’s not perfect today, is better than doing something perfectly but never
### Memento mori/prioritize
### Deliberate practice
Mass of information turns into essence — the large is condensed into the small.
Decisions log.
### Always keep artitacts after your study/research/work
### Minimalism - use as less fetuses of the language/library/etc as possible
* use defaul OS/editor/etc apps and setup without customizations aka vanilla style
* minimal code, native API, minimal latency, ergonomics, zero deps### Loose Coupling and High Cohesion
Cohesion in software engineering is the degree to which the elements of a certain module belong together.
If a change in one module results in many changes in another module then they are said to be highly coupled.
[SO](https://stackoverflow.com/q/14000762/805266)
### Explicit is Better Than Implicit
### Easy code introspection
### Don't fix what isn't broken
[c2](http://wiki.c2.com/?IfItIsWorkingDontChange)
### Minimal sample (to reproduce error or demo feature)
## Anti patterns
### https://en.m.wikipedia.org/wiki/Cargo_cult_programming
### Everything is hardcoded and everything is parametrized by everything
Too bad or too good coupling respectively
### God Object
High cohesion - a lot of unrelated functionality jumbled together
[wiki](https://en.wikipedia.org/wiki/God_object) [c2](http://wiki.c2.com/?GodClass)
### Overengineering and Underengineering
During unengineering, all principles are violated. With overengineering, all principles are brought to the point of absurdity.
### Growing programs
anti-planing. Adding new features into empty or sample project step by step if needed
without further planing of system evolution (architecture, features, etc) and building proper backbones of the system.
Such code consist of workarounds and hacks.### It does work!
### Pyramid of Doom
Nested callbacks:
```js
f.foreach(function (g) {
g.foreach(function (h) {
h.filter(...
```### NIH - Not Invented Here
- re-implementation of the library function
- re-implementation of functionality already available in the project
- using a bad knee algorithm instead of an existing good one (re-invent a wheel)### Duplicate Code vs Compressed Code
[wiki](https://en.wikipedia.org/wiki/Duplicate_code)
### Code Rot
[wiki](https://en.wikipedia.org/wiki/Software_rot)
### Technical Debt
the implied cost of additional rework caused by choosing an easy solution now instead of using a better approach that would take longer
### Data Clump
any group of variables which are passed around together (in a clump) throughout various parts of the program
## Behavioral and methodological anti-patterns
### Programming by analogy
- google a similar solution on SO and fix it
- copy a similar piece from another place in the current project and fix it### Helpless kitten
developer does not know what he is doing and afraids everything
He does not evolve because of lack of intellect or absence of environmental pressure (project or team interest, market needs, etc)## Source control principles
- A single standard for naming commits
- One commit = one task, in particular:
- separating unrelated changes into different commits
- separation of refactorings and reformattings and semantic changes
- Single repo instead of multiple ones to track contract changes across system nodes## Maintainence
- to replace the wrong with the right when a problem is detected is not our method. All dependencies that you use - you maintain them in fact. The result is more confidence in tools, and more confidence in coding, and more skill in dealing with problems.
- Shortening feedback loops is the most reliable way to improve any process. Identify which loop is the bottleneck, unclog it, rinse, repeat.