So, implementation left to the reader...
Geez. The guy who writes this blog is a bit of a jerk, isn't he?
I'll at least discuss what I think is a precursor to conceptual development.
Specifically here I mean a manner of design, its form, its presentation and methodology. Often, in my experience, a design is started by the engineer that is creating it via creating artifacts like schemas, API definitions, algorithms, et cetera. This seems to me to be a form of jumping the gun. What I mean is that unless the concepts (maybe more formally the domain space) are clearly identified and defined as well as the relationships between those same concepts, the greatest truth of the design is left within the implicit space of the design. I suppose this implicit and poorly defined form of the concepts keeps the concepts and their definition safe from the scrutiny and dispute of others. This practice seems to me, however, to be a form of weakness and also a form of doing one's best to reduce the quality of the design itself. One of the problems with such an approach is that while the implicit position of the concepts keep them safe from access to individuals other than the designer that it also keeps them safe from access to the designer her or his self. The problem inherent with this situation is that the designer is then less able to scrutinize them her or his self. Such a situation means you, as designer, are less able to push the concepts for greater clarity and thereby less able to push them to produce the most optimal and efficient design that they can be made part of.
This relates to my earlier statement that our products can allow our users to work at a higher level, seeing relationships and patterns that would not otherwise have been visible to their seeing. In the same manner, if as a designer, you produce designs that keep you from working at a higher level with the concepts that you are organizing, you are keeping yourself from more clearly seeing the relationships and patterns that would otherwise be possible for you to view. As such, you reduce your capability to take advantage of the opportunities and efficiencies that might otherwise be available to you. You further reduce your capability and opportunity to ask important and revealing questions that you might otherwise not notice to ask about the system you are designing. Further, you might fail to see the relationships of the component or subsystem you are designing to the larger system that you are developing within or possible, if designing the entire system, the larger system, workflow, user scenario, et cetera into which your current system design fits. Any of these options only constricts the eventual value of the system you are designing.
Reducing your system's value in such a way can only serve to reduce your effectivity as an architect and system developer. It seems to me that this pattern applies not only to your designs but also to your life where we make efforts to be human well but that's a different post at least if not (and more probably) a different blog that doesn't yet exist.
This is not the end of the consideration because as we all know, all efforts occur within a resource constrained environment. Often this is seen as a detrimental factor of the developer's world. I disagree, though I did share that perspective at one time. The constraints of one's context are actually extremely important so far as I can tell. They help to guide you and help to form your work, making you more effective and more valuable. If you are not concerned with this, you are unreaching your potential and failing to manifest it optimally but I am again leaving the context and trappings of the limited form of machines that this blog is intended to discuss.
Getting back to concepts and conceptual design... By focussing in one's design upon the concepts that are present in the domain, the problem space of what is to be solved by the system you are designing, you allow yourself to ensure that you truly, deeply understand what you are trying to solve and what the unchanging parts of it are. As the constants and non constants of your problem space become defined, you will see what things must be decided and which require no further decision or at least require handling. Further, working on understanding the relationships of the concepts to one another will provide you with an understanding of the sorts of policies and behaviors that you will have to consider and define in you design. Further, understanding these policies and behaviors and defining them will allow you to see their commonality and patterns. As such, you will begin to develop an understanding of the cross cutting concerns of your system. These being defined, you will be better able to forumlate your understanding of these concerns and thereby be able to better formulate your design itself.
It's a funny thing that happens as I begin to procede through this process. I find that as I do so, the system itself, the manifestation and derivation of the concepts clearly forms in my mind. By developing a clear understanding of the concepts and defining them such that their definitions are clear and complete, the problems that might otherwise crop up later are surfaced and can be dealt with. This in turn provides you with the opportunity to solve them proactively at this point in the process which is a much more efficient time to do so since refactoring and revision or other forms of rework are not necessary to bring the system in to line with the needs of the domain. This is not to say that you will catch everything but the amount you don't catch should be reduced if you do your job of design well. Hopefully at least, the scope of your mistakes will be reduced. Either way, the implementation that you will be undergoing will end up being clear and to the point, requiring fewer lines of code and being better organized while hopefully also more maintainable.
Such an approach also has another important impact on your system. Developing the rich and deep understanding of the system as you have, when the inevitable time comes that you will need to revise or expand your system (which hopefully occurs since it is an indication you have truly created value) you will now be in a position such that you can evaluate at a concpetual level exactly what it is that the modification you are being asked to make is and exactly what effects it will have as well as what modifications it will require. By putting in your up front effort, you have reduced the likelihood of bugs, rework and the like, as well as the amount of work that will be required in the future. This is exactly the sort of thing that is the value that as engineers we are meant to provide to the world. More effective and more efficient use of the limited resources that are available to us.
Final note. I recognize, all of these things that I am saying are things that the object oriented folks have been talking about for quite some time. I do not mean to steal these ideas from them, claim exclusive ownership of them, nor exclude my appreciation to those individals for presenting these things in their discussions. In the end however, it seems to me that in most of their accounts, they have let these concepts remain as only implicit aspects of those discussions because they have maintained a focus on many of the concrete implementational details of their frameworks. Maybe it is simply a benefit of their work to clearly define the concepts that they have defined that I have been able to come to the intermediate conclusions that I have come to here.
Hmm... noting any kind of semblence and pattern here? ;)