[[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