Shells and high-level programming language environments suffer from a number of shortcomings as knowledge engineering tools. We conclude that a variety of knowledge representation formalisms and a variety of controls regimes are needed. In addition guidelines should be provided about when to choose which knowledge representation formalism and which control regime. The guidelines should be based on properties of the task and the domain of the expert system. In order to arrive at these guidelines we first critically review some of the classifications of expert systems in the literature. We then give our own list of criteria. We test this list applying our criteria to a number of existing expert systems. As a caveat, we have not yet made a sys...