A collection of awesome programming principles. The essential principles to build modern softwares.

Inspired by the awesome-* trend on GitHub.

The goal is to build a categorized community-driven collection of very well-known resources.

Sharing, suggestions and contributions are always welcome!

Generic

  • Agile software Development - A group of software development methods in which requirements and solutions evolve through collaboration between self-organizing, cross-functional teams. Contrary to waterfall model.
  • Code Reuse - Use of existing software, or software knowledge, to build new software, following the reusability principles.
  • Code Smell - Any symptom in the source code of a program that possibly indicates a deeper problem.
  • Discoverability - The ability of something, especially a piece of content or information, to be found. "Metadata", the so-called "information of information", is introduced.
  • DRY - so-called "Don't Repeat Yourself". A principle of software development, aimed at reducing repetition of information of all kinds, especially useful in multi-tier architectures
  • Extreme Programming - As a type of agile software development, it advocates frequent "releases" in short development cycles, which is intended to improve productivity and introduce checkpoints at which new customer requirements can be adopted.
  • Fail-fast - A fail-fast system is designed to immediately report at its interface any failure or condition that is likely to lead to failure.
  • KISS - An acronym for "Keep it simple, stupid"
  • Ninety-ninety rule - A humorous aphorism that states: "The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
  • Loose Coupling - A loosely coupled system is one in which each of its components has, or makes use of, little or no knowledge of the definitions of other separate components.
  • Occam's Razor - Among competing hypotheses, the one with the fewest assumptions should be selected.
  • Pareto Principle (80:20 rule) - For many events, roughly 80% of the effects come from 20% of the causes.
  • Scrum - An iterative and incremental agile software development framework for managing product development.
  • Worse is Better - There is a point where less functionality ("worse") is a preferable option ("better") in terms of practicality and usability. Software that is limited, but simple to use, may be more appealing to the user and market than the reverse.
  • YAGNI - An acronym for "You aren't gonna need it". It states that a programmer should not add functionality until deemed necessary.

Practice

  • Code Refactoring - The process of restructuring existing computer code to improves nonfunctional attributes of the software such as readability and maintainability.
  • Pair Programming - An agile software development technique in which two programmers work as a pair together on one workstation.

SOLID

  • SRP - The acronym of "Single responsibility principle". A class should have only a single responsibility
  • OCP - The acronym of "Open/closed principle". "software entities … should be open for extension, but closed for modification."
  • LSP - The acronym of "Liskov substitution principle". "objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program."
  • ISP - The acronym of "Interface segregation principle". "many client-specific interfaces are better than one general-purpose interface."
  • DIP - The acronym of "Dependency inversion principle". One should "Depend upon Abstractions. Do not depend upon concretions."

Security

  • Defensive programming - A form of defensive design intended to ensure the continuing function of a piece of software under unforeseen circumstances.

Typically Want to Avoid

  • Anti-pattern - A common response to a recurring problem that is usually ineffective and risks being highly counterproductive.
  • Overengineering - To design a product to be more robust or complicated than is necessary
  • Technical Debt - A metaphor referring to the eventual consequences of poor system design, software architecture or software development within a codebase.

Resources

  • Wikipedia - List of software development pholiophies