Understanding Computation: Pillars, Paradigms, Principles