Warning: This is a special post. It’s about learning in action. In my introduction I told you that I have a flair for didactics and methodology and I have worked for quite some time in this field. So, don’t expect me to show you some new tips and tricks of software development or processes around software development! No, it’s all about learning and understanding.
As a developer who wants to continuously and steadily improve I have to always learn new stuff. But learning new things is only one side of the coin. How can I assert that I really understand what I have just learned? How can I know whether I’m able to apply the new knowledge to my day to day work? Will I be able to combine the new knowledge with other things I have learned in the past and finally am I able to judge the stuff I learned for its quality and usefulness?
In the 80s Benjamin Bloom published his famous Taxonomy of Educational Objectives. The taxonomy relies on the idea that not all learning objectives and outcomes have equal merit. In the absence of a classification system (a taxonomy), teachers and instructional designers may choose, for example, to emphasize memorization of facts (which makes for easier testing) rather than emphasizing other (and likely more important) learned capabilities.
Skills in the cognitive domain revolve around knowledge, comprehension, and “thinking through” a particular topic. Traditional education tends to emphasize the skills in this domain, particularly the lower-order objectives.
- Remember, memorize, recite
- Understand, paraphrase
- Apply, solve a problem
- Create, synthesize, compose
- Evaluate, judge
With each level the understanding of a certain domain or knowledge deepens. Let’s now analyze in detail what these different levels of learning and understanding mean. I’ll try to provide samples for each level that are taken from our domain of software development.
Level 1: Memorize, Recite
This is the most basic level. Here a student can learn something new and just memorize what she has learned. No reflection about what she learns is needed. People having a photographic memory have a huge advantage over others. Computers are perfect in this area.
There are some areas where nothing more than this level of learning is needed or desired. In theses areas it does not make sense or is event contra productive to try to understand or question things.
- learning new words in a foreign language
- prepare for the theoretical exam for the drivers license
- as a fire-fighter following instructions of your chief when fighting a fire
Very often teacher, trainers or coaches make the error that they ask questions that only expect the reciting of memorized stuff. Let’s look at such a sub-optimal question in our domain and analyze what the outcome might be.
Please tell me the definition of the Single Responsibility Principle also called SRP.
- The SRP states that a class/object should have one and only one reason to change.
- A class or component should have only a single responsibility.
- We have a high cohesion if SRP is truly implemented in an application
What? “Sorry, but I don’t understand” you might yell. And you are right. These answers are all correct but by no means do I know, whether the responding person has really grasped the essence of the SRP.
Level 2: Understand and Paraphrase
The student who has been taught a new topic is able to explain the essence of what she has learned to an interested laymen. The important thing is that the student cannot use the same vocabulary as when she is communicating with her class mates or with her teacher/trainer. She has to translate from the ubiquitous language to another language. But to be able to make this translation a student has to thoroughly understand the topic she is talking about. Possibly she has to find analogies with topics that the laymen is familiar with.
If the laymen is able to grasp what the key elements of the discussed topic are then the student has really understood what she has just learned.
Please try to explain to an interested laymen what the Single Responsibility Principle is about. Please use your own words.
- An application is normally not made of one single piece of code but rather consist of many smaller pieces of code. These small pieces of code we call classes or objects. The SRP now states that such a small piece, that is a class, should only do one thing and not several things. An example to illustrate what I mean take the cutlery. We have a knife to cut things, a spoon to e.g. eat soup or other liquid things and a fork to pick up solid pieces of our meal. Each of the three has a single responsibility. We normally don’t have just one item that is a knife, a spoon and a fork at the same time.
- To make an analogy: the SRP states that it is better that one person has just one responsibility and not many responsibilities. Having only one responsibility I can better concentrate on this responsibility and possibly improve the outcome. For all the other responsibilities we have different persons. Now if I get sick then only my responsibility is temporarily not fulfilled. All the other persons can continue to fulfil their (other) responsibilities.
Level 3: Solve a problem
A student has just learned a new topic. Let’s assume she has been taught the Dependency Injection Pattern (DI). Now this student should solve a problem, where just this new learned pattern has to be applied. The important thing is that the problem to solve is rather “simple” such as that the new learned topic can be applied in isolation and knowledge of no other patterns or practices is needed.
You have learned the Dependency Injection Pattern. We have shown you what this pattern is and how it can be applied. Imagine a service which has two dependencies. One of the dependencies is a mandatory dependency and the other one is an optional dependency. Please implement a code fragment which shows how you would implement such a service. Only the part of the service which applies DI is needed. Give short explanations why you implement it like this.
- Mandatory dependencies are best injected via constructor (–> constructor injection). In this sample the IProductRepository dependency.
- Optional dependencies are best injected via [writable] properties (–> property injection). In this case the ILogger dependency.
- To avoid tedious validation code I would initialize an optional dependency with a default implementation that does nothing (here: NulloLogger)
Obviously the student has very well understood the DI pattern and is able to apply it to a given problem.
What IS creativity? Wikipedia defines it as follows
Creativity is a mental and social process involving the generation of new ideas or concepts, or new associations of the creative mind between existing ideas or concepts, creativity is fueled by the process of either conscious or unconscious insight. An alternative conception of creativeness is that it is simply the act of making something new.
Up to now no creativity is needed. It’s pure learning and understanding. Even an animal could reach this point if trained accordingly. And all current industrial robots are reaching at most this level.
If there is one element through which a human being can be clearly distinguished from an animal it is through his creativity.
International studies and meta-studies have shown that up to 90% of the questions asked in a written or in an oral exam do not exceed level 2. That means that teachers and professors do only examine whether a student can recite theory or whether she is able to understand learned material (and thus explain with own words). But whether the student can apply what she has learned is not tested in most of the cases. And the creativity of the student is never challenged.
Another amazing thing I’ve learned in an experiment where I participated was that the majority of people never reach a level higher than 3. Even more astonishing was the fact that this is also true if you just take people that have at least a Master Degree! At the test we conducted over 300 people participated which had all a Master Degree in at least one topic and many of them even had a Doctor degree. Now, that is sad!
Level 4: Analyze
If a student reaches this level she is able to analyze a given complex situation or problem and disentangle it. She can identify and isolate sub-problems. She is able to categorize and prioritize those sub-problems.
During the last weeks we have learned many new patterns and practices of good object oriented software design. Given the following (shortened) piece of legacy code please point out which important patterns and principles are violated. Give a short justification for each pattern or practice you point out. You should identify at least 4 patterns or principles that are violated.
[Legacy sample code --- omitted]
- The Single Responsibility Principle (SRP) is violated since a single class (EditOrderForm) has several responsibilities (loading data, parsing/mapping data, displaying data, etc.).
- The Dependency Inversion Principle (DI) is violated since the encryption service (EncryptionService) as a higher level module depends on the implementation of lower level modules for input and output (FileStream) and not upon an abstraction of the lower level modules.
- The Law of Demeter is violated in the method SumDiscounts of the DiscountFinder class. There the argument of type IOrderWithDiscount is (down-) casted to the class Order.
Level 5: Create, Synthesize, Compose
Here you take what you have learned so far and create (previously unseen) new combinations of different pieces of knowledge. A good sample of this would be the invention of the steam driven engine by James Watt. As I have learned in college James Watt was watching his mother cooking. Then he realized that the cover of a pan which contained boiling water was lifted a little bit from time to time and water vapor exhausted. He deduced that water vapor can be used as a driving force for an engine and finally constructed the first water vapor driven engine. He synthesized a physical effect (pressure caused by heating water and thus creating water vapor) with engineering skills (constructing an engine).
Another good sample for this type of creativity is the implementation of an internal DSL to create HTML fragments in an MVC based Web application (e.g. MS MVC for ASP.NET or FuBuMVC). The base elements or knowledge are
- Delegates, Lambda Expressions and Expression Trees (see my post)
- Static Reflection (see my post)
- Declarative programming with attributes
- Fluent interfaces (also see this post)
- Internal DSL
These elements are now creatively combined to produce the desired HTML fragments. By carefully inspecting the information that is stored in an expression tree one can extract a whole lot of information out of a simple statement like this
where TextboxFor is an extension method to the view (of an MVC based Web application) and has the following signature
The interesting part in this method is the second parameter of type Expression. The meta-information found via this expression can be used to form an HTML snippet like the following
Meta information is found via static reflection (analyzing the expression tree). For a complete picture please have a look at the FubuMVC code.
Level 6: Evaluate, Judge
This is the highest and most sophisticated level a student can reach. At this level she has to be able to judge some given facts. The important thing is that she cannot just say this is good or this is bad but she has to base her judgment on a criteria catalog which she first has to define. Another important thing is that there is not a objectively correct answer but merely an answer that is consistent with the criteria catalog used for the evaluation or judgment.
This level should be reached by a person who is asked to give recommendations or a person who who is conducting an assessment.
You have learned that there are two major platforms Java and .NET on which most of the current applications are developed. Your software company has not yet committed itself to one of them. Your manager asks you to evaluate both of those platforms and make a well-founded proposal about which platform your company should use in the future.
To solve the problem establish a consistent and reasonable criteria catalog as a base for your evaluation. Prioritize those criteria and justify in which direction and why each criteria influences your decision.
I will not give a complete answer here to the question but just sketch how I would proceed.
In the answer you’ll first establish the requested criteria catalog. Each criteria should be reasonable for a software company.
- who are the majority of our customers
- on which platform our current developers are strong
- for which platform is it easier to find good qualified developers
- on which platform developers of equivalent skills get a higher salary
- what is the adoption rate of each platform in the (software) industry
Now as a next step you have to weigh each criteria on a reasonable scale. Let’s say you define the following levels and assign points to each of them (in parenthesis):
- moderately important (1)
- important (3)
- very important (5)
Of course you should also justify the distribution of points that is why do you assign 1, 3 and 5 points instead of 1, 2 and 3.
Finally you make your decision based on the above weighed criteria catalog.
What about the Education?
Can only highly educated people having at least a doctor title reach level 6 when learning? No, definitely not! Even a very young child can be creative. To test a young child or an uneducated person for creativity one just has to adjust the problems to solve. The questions we ask have to be on a fair level.
There are some interesting sayings about Wolfgang Amadeus Mozart. It is told that at the age of about 3 he hear a pork squeak. He then said that this is an ‘a’ (the note ‘a’). At the age of 4 he was already could play some minuets faultlessly and with the greatest delicacy on the piano. Of course he was a genius and not everybody is a genius. But this example shows us that he was creative before he went to school.
I have shown that the cognitive aspect of learning can be categorized into 6 different levels. The most basic level is reached when I can memorize topics I learn. But the problem is that if I only memorize facts I do not necessarily understand what I am learning and furthermore I am not able to apply what I have learned in my daily life and work. The farther I climb up the levels the more comes creativity into play. Creativity makes us human being unique. Only through creativity can we invent new things and possibly increase the quality of life. At the uppermost level I am able to judge or balance facts. If I reach this level I can say with confidence that I understand what I am talking about.