Notes on the practice of programming, mostly learned from Bjarne Stroustrup's "Programming 2nd Edition" (2014).


Programming is always about producing useful systems.


As programmers we always prefer to work at the highest feasible level of abstraction. The ideal is to express solutions in as general a way as possible.

In broad terms, when programming we strive for:


We develop programs in four phases:

  1. Analysis
  2. Design
  3. Programming
  4. Testing

The development phases are not a linear procedure: they are more like a pyramid where the latter depends on the former. Code problems arise when testing, design problems arise when coding, analysis problems arise when designing. We go back to our previous steps and refine them in order to arrive at a finished program.


Programming is understanding - to solve a problem you must begin by understanding the problem itself.


The difference between an experienced programmer and a freshly starting programmer is how they use the tools at their disposal in order to solve the problem.


When writing the code itself you must especially focus on the maintainability of your solution. Imagine someone who has never seen your program trying to fix a bug in its code, extending one of the program's components or maybe even replacing a core dependency.


We try to structure our programs so that we can convince ourselves that they are correct, but proving the correctness of a program is extremely complicated.

Testing is not to be looked down upon. Being an excellent tester means you have the power to teach yourself how to write good code.