[[good software]]
Deploy first, write tests, then develop. This turns [[Waterfall]] on its head.
[[Kernighan's Law]]
## programming paradigm
There are many approaches to software engineering, and these are typically described as programming paradigms. Examples include
- Imperative
- Procedural (Fortran, C, [[Python]])
- [[object oriented programming]] (C#, [[Java]], C++, Ruby, also Python)
- Declarative
- Logic (Prolog, Datalog)
- Functional (Lisp, Haskell, Closure ,F#,)
## design pattern
A design pattern is a repeatable approach to solving problems in [[software engineering]]. If you can reduce a real-world pattern to one that can be solved with a design pattern, you can just use the existing solution. Using design patterns also facilitates communication within software development teams.
[[functional decomposition]]
[[use case]]
[[requirements]]
[[the V-model]]
[[Waterfall]]
[[Agile]]
[[minimum viable product]]
[[service level agreement]]
[[refactor]]
[[test driven development]]
[[continuous integration]]
[[continuous delivery]]
[[retrospective]]
[[best practices in software engineering]]
## advanced concepts
- Environment management
- optional and group dependencies (dev/prod)
- project organization/file management
- Ruff/linting
- Testing
- Logging
- Make/Poe
- Package as a python package
- editable imports
- containers
- documentation
- README, requirements, spec, etc.
- collaborating (GitHub, Issues, PR, etc.)
- CI/CD, DevOps
- [[scoping]] and software estimation