Theories, Laws, and Best Practices

Amdahl’s Law

The law that governs the speedup of using parallel computing resources on a given problem.

The law indicates that an algorithm that can be parallelized typically by splitting it up into two parts, a part that can be parallelized, and a part that cannot.

Details can be found:

Conway’s Law


Principles in Object Oriented Design (OO) of software:

  • Single-responsibility principle: A class should have one and only one reason to change, meaning that a class should have only one job. The fewer number of interfaces implemented the better.
  • Open-closed principle: Objects or entities should be open for extension but closed for modification. The class should be extensible without modifying the parent class.
  • Liskov-substitution principle: Let q(x) be a property provable about objects of x of type T. Then q(y) should be provable for objects y of type S where S is a subtype of T. Each subclass or derived class should be substitutable for its base or parent class.
  • Interface-segregation principle: A client should never be forced to implement an interface that it doesn’t use, or clients shouldn’t be forced to depend on methods they do not use.
  • Dendency-inversion principle: Entities must depend on abstractions, not on concretions. It states that the high-level module must not depend on the low-level module, but they should depend on abstractions. You should inject interfaces/abstractions into objects and not concrete implementations.

Design Patterns: Elements of Reusable Object-Oriented Software

In the software engineering world this is one of the canonical books on OO design patterns. You should read it through at least once. I tend to go back to it from time-to-time when working on new projects as a reference to that design patterns that might be most applicable for what I am trying to build.

Character Encodings

A favorite Joel on Software article about character encoding.