Computational reflection is the activity performed by a computational System when reasoning about (and by that possibly affecting) itself. This paper presents an introduction to computational reflection (thereafter called reflection). A definition of reflection is presented, its utility for knowledge engineering is discussed and architectures of languages that support it are studied. Examples of such procedural, logic-based, rule-based and object-oriented languages are presented. The paper elaborates on the design of these languages and the reflective functionality that results, elucidating concepts such as procedural reflection, declarative reflection, theory relativity of reflection, etc. The paper concludes with an assessment of outstanding problems and future developments in the area.