I am currently starting out on a course of conceptual modelling. One interesting phrase from the lecturer’s mouth caught my attention, while he was presenting an old diagram of the concepts of a particular target domain to us. The idea was roughly this:
Once the concepts have been defined like this, the rest is implementation.
Software engineers are indeed aware of the fact that we must understand what are the concepts of the target domain, and their relationships. (They may express this understanding in different terms, though.) When we do, we can turn them into programming constructs, be they classes and objects, or procedural code (in Moodle, PHP pages and functions).
What is missing from this image? The people using the system: the actual dynamics of what happens, the characteristics and the goals of the users (?), and the circumstances of the users. All of these are more abstract than implementation details and can not be described using programming code, yet taking or not taking them into account can dramatically affect whether software meets the actual needs of the people it is supposed to serve.