Freekshow

Kick Ass Development part 1 – develop a developer

A printed copy of this article has appeared in SDN Magazine #102, in Dutch.

The Kick Ass Development Series

As a software developer you’re constantly familiarizing yourself with tools and techniques. The skill to learn quickly and effectively is perhaps the most important one to own as a developer. The most important tool that you use is your brain. But do you use this to optimal effect? In the Kick Ass Development Series we will provide you tips and insights, using models and practice-based examples, to ‘refactor’ your brain for optimal result. In the first part we will mostly discuss learning methods and learning aids. Further on in the series we will focus on fields of knowledge specifically of interest to software developers. In addition we will advise you how to utilize your brain to the full in the solving of problems.

Kick Ass development – part 1 : developing a developer

KickAssTee
The half-life time of (mostly technological) knowledge reduces faster than ever. Technological developments and globalization ensure you need to do a lot just ‘to keep up’.
As a novice developer you may have produced a few hundred lines of code during your degree. As a beginner you are put to work in a software development project where the complexity is often a multitude of what you were exposed to during your studies. Along the way you find out just how complex software development really is. Your knowledge and expertise often fall short when choosing a sound solution for a problem. You might think: “Wisdom comes with age, and when I gain more experience my skills will automatically improve.” This is true, but only to a certain extend.
Experience is useful, but it does not have the straight correlation with quality that people often expect. Someone can have years of experience in VB without caring for the basic principles of Object Orientation. When someone has 5 years of experience handling a certain technique does that make him or her an expert? Or does that only indicate 5 times one year the same experience on different projects?
Maybe you have worked with someone who performs the most complex tasks with great ease, whistling along while doing them, so to speak. When you watch him or her work it all seems so easy. In no time these sorts of people add new languages and frameworks to their already impressive toolkits. Perhaps you believe these characters have more talent than you do and that you will never be able to reach their standard. In most cases you are wrong.

A total lack of talent might make it hard to become truly good in a certain field. However, in general not talent but focus, practice and commitment are the ruling factors in the development of expertise. Mozart at the age of 4 was already a musical child prodigy, but not until 13 years later did he conduct music of world class.
In his book ‘Talent is overrated’ Geoff Colvin argues that to become a true expert, in any field, will take 10 years. Talent is not a condition for being among the best. Hard work is. Perseverance is. And patience is, too.

Thesaurus

The right combination of hard and effective labour can yield huge improvements. Researchers claim the most productive developers to be many times more productive than the least productive ones. Cautious estimations mention factor 5, while there is also a factor 28 indicated (see e.g. ‘Code complete’ by McConnel and ‘Facts and Fallacies of Software Engineering’ by Glass). Picture this: a developer producing 28 web applications in the same timeframe another software developer will deliver one! For your employer enough reason to cherish these thoroughbreds – though they probably will not pay them 28 times as much.

Learning styles and personalities

Most learning theories acknowledge people use different learning styles. You can for example distinguish visual and auditory learning styles. Some people prefer to learn by listening to podcasts, while others really need a visual component.
In the book ‘Experiential Learning: Experience As The Source Of Learning And Development’ (1984) Kolb describes a cyclical model of learning.

kolb

When you go through something (concrete experience) it is important to think through the experience and to reflect on what that experience signifies (reflective observation). Subsequently you need to integrate these loose thoughts into a theory (abstract conceptualism). You can then contemplate how at a next occurrence with similar events you can implement this theory. The implementation of these new insights (active experimentation) will lead to new experiences.
Unconsciously in this way you will already be learning and automatically proceed through the 4 stages. It helps to be actively aware of this cycle so you can optimize the process as it is strongly dependant on the person on which of the stages of the cycle emphasis is put. Kolb discerns the following 4 learning styles.

Diverging: the dreamer

Usually you look at things from various perspectives. You sooner choose to look on then to act immediately and you use your imagination to create solutions. You are a person of wide interests, you enjoy collecting information and you are sociably inclined.

Assimilating: the thinker

You have a preference for specific, logical approaches. You like to organize information in overall concepts. You often learn well by receiving clear instruction and background, while you have less need for practical experience. You prefer to handle a more academic approach and you are less focused on your social surrounding.

Converging: the decider

You are good at implementing the knowledge you have gained for the solving of problems. You have a practical manner and you focus more on technique than you do on your social surrounding. You have a practical approach and you like experimenting.

Accommodating: the go-getter

In an accommodating way you approach things more intuitively. You like to use the analysis of others to experiment in a practical situation. You blossom when action and intuition are required and you enjoy achieving results working in a team.

In the software industry you are often dependent on self study. It helps to know what your default learning style is. For example if you are a thinker you might read a book on design patterns from A to Z. You have not yet experienced the real problems these patterns can solve, and if you don’t experiment actively you will find it hard to memorise what you learned in theory. In that case you could do with a hands-on workshop to gain concrete experience.

Or imagine you need to learn a new framework. You could read books on the matter, or work through the complete API. Another option is to apply the framework straight away in a project and to learn along the way what the advantages and disadvantages are (with all the possible refactoring as a result). An alltogether different option is to write automated tests against the framework. Write tests until all desired functionality is tested and you grasp the essence. What you end up with is executable documentation, more compact and reliable than any manual. When a new version of the framework is released you can see by the failing tests immediately which functionality needs refactoring. And while you write and perform tests you effectively gain experience with using the framework but without contaminating the project code. And you go through each of the stages of Kolb’s model.

Know your own learning style and make sure you pay sufficient attention to the stages of the style that get less of a chance.

Metacognition: monitor your learning process

Metacognition can be of aid at the attending of an effective learning track. With this two proceedings are of importance: the monitoring of the progress of the learning and the adapting of the strategies when the working method is not given the desired results. So you learn, and simultaneously you screen the progress and if necessary you correct when the selected strategy does not deliver the desired result.
This can be applied by making your goals specific and to set out to work in a result driven way, for example by making your learning goals SMART (see end of article).
When you specify which steps you want to take, how to measure progress, and when you wish to achieve certain goals, it makes it easier to apply self regulation. During the learning track you can determine whether the learning methods you have practiced are actually effective.

By way of the SMART principal you can make your goals explicit and measurable.
  • Specific – To specify a goal (who, what, where, when, why) will lead to a more exact objective and that makes it easier to realise.
  • Measurable – Specify how to measure your progression, and when your goal is reached.
  • Attainable – You can set goals that seem unreachable when you start out. So set goals that are attainable, and from there move step by step to your final goal.
  • Realistic – Is your goal attainable? Does it not cost too much of a strain? Or can you only attain it by ignoring other things?
  • Timely – Specify when you start your activities and when you have calculated to be finished.

Switch your brain to turbo mode.

boost
When the X286 PC came out it was a lot faster than all previous IBM machines. This new computer type came with a turbo switch that sped up the computer. Many people wondered why the switch was there –why not always just set the switch to ‘on’? (Certain software was only suitable for slow PC’s and therefore only functioned when the switch was set to ‘off’.) Many users didn’t know the purpose of the switch and for that reason the switch was often set to ‘off’, making the machine slower and not performing to an optimal level.
Our brain has different levels of activity, and different situations or approaches switch it into a comparable turbo mode.In illustration of the above we give you this true story.

“Some years ago an acquaintance adapted software for a manufactoring system, loaded the code to the PLC (programmable logic controller), activated the new program and discovered to his alarm that almost instantly the whole factory hall around him became quiet as a mouse. All factory noises of pumps, motors en spinners were suddenly extinguished. The silence did not last long. In no time all operators came running into the control room and asked what he had done. What had happened: in one of the codes he had made a reference to a label that did not exist. A ‘goto’ to an unidentifiable place. The instruction had crashed the whole PLC and all the outputs connected to the PLC fell back to their safety mode. The cleansing of all tubes and machines and the loss of productivity that were caused by this error cost a lot of time and money.”

You can imagine an event like this will switch your brain to turbo mode: you’ll not make the same mistake ever again.

This is an extreme example but all learning moments have more of an impact when they contain an emotional component. You remember better when something is surprising or challenging. You don’t remember for very long how you walked in the street and nothing happened. You perceive many things when being outside walking but you don’t store all these things. The storage capacity of your brain is limited and because of that you are very well equipped to ignore things that don’t matter. Something has to happen, something that goes against what your brain is expecting, to make sure that what happened gets stored and remembered.
Suppose you want to master a new programming language, but you don’t work with it (yet) on a daily basis. In the evening hours at your garret once again you bend over the newly acquired book. Often the matter is dry, and that makes it hard to keep your attention focused. How can you can convince your brain, that is so good at ignoring futile information, that the subject matter in the book is significant?

First of all you can make some changes to the environment you are learning in: instead of withering away at your garret you can also try to form a study group with friends or colleagues. As a member of a developer community you can choose from many events such as Special Interest Group (SIG) meetings, code camps and coding dojos. These events offer you the possibility to experiment with new techniques, together with others. This often means you have to get out of your comfort zone a bit more, and sometimes that can be a bit tough. When you take this step though you will discover how you learn much more in this kind of setting than on your own. The situation will trigger all kind of emotions. Maybe you need to overcome your shyness, but often it is fun, sometimes challenging, but in all cases more emotion is involved. And – with your brain in turbo mode – you will remember things better.

Not all learning will be shared with others, so what can you do to shift brain to the turbo mode when you’re on your own?

Visualization

Visualizing is an excellent way to activate more parts of your brain. Creating a mind map is a good example. Don’t use mind map software but just paper and pen – the physical activity of drawing combined with the thinking on the abstractions you are trying to express will ensure your brain moves to the turbo mode. Images are easier to remember than words, and research shows visual delegation of knowledge is up to 89% more effective than just text.

Do what you like!

When you are a music fan, create a program showing and playing MP3’s. The positive emotion of being involved in something that interests you will stimulate you and switch your brain to turbo mode.
Still, if you do need to get through the dry subject material on your own, the PQ4R method will help to retain what you have learned better. (see side panel)

The PQ4R method

Have you got the feeling it all takes too much time? Maybe this quote inspires: ‘If you don’t have time to do it right, when will you have time to do it over?’

  • Preview orientate beforehand. For example go through the index first and create a context where specific subareas can be put
  • Questionask questions. Ask as many questions on the subject before you start reading
  • Read – Read with attention and try to formulate answers to the questions you have asked. The answers often lead to new questions and this takes the reading to a deeper level of processing.
  • Reflectthink about it. Try to think of examples and make associations with the knowledge you already have or that you are planning to gain.
  • Recite tell it in your own words. After you have read a big part, try to the state the text in your own words. If this proves to be difficult you can go back to the text and fill in your own gaps.
  • Reviewsummarize. After reading a chapter try to recall the key points. Ensure the questions you have phrased are all answered satisfactory.

Traditional Study

Traditional study such as academic- or certifying courses will deliver mostly declarative knowledge (‘codified knowledge’): knowing that something is what it is, also known as factual knowledge. To transpose this to procedural knowledge (‘tacit knowledge’) requires experience. To speak in programming terms: the experience functions as the compiler that transposes declarative knowledge into procedural. As shown in Kolb’s method only abstract conceptualism is usually not very effective. There are however some designated features effective learning material will comply to.

• Good books are compressed learning experiences. They show you the prime areas of attention and place knowledge in a relevant context.
• Good books will also demonstrate how knowledge can be applied in practical situations. Key is to transfer procedural knowledge into basic principles.
• Good books will show patterns you are already acquainted with through experience but have not consciously recognised or worded.
Someone can read tens of books on design patterns without ever having applied them in practice. All pattern knowledge of such a person is then declarative. It is plausible to believe that this person with all his declarative knowledge will be a teacher for someone who wants to improve his/her design pattern knowledge. Practice problems usually go way beyond a ‘student registration system’ or an ‘ATM’, making it quite probable such a teacher will fail.
With traditional study methods the procedural knowledge of the expert will be transposed to declarative knowledge (books/learning courses). Subsequently the pupil needs to transpose this declarative knowledge into procedural knowledge. In the figure below this is being indicated by the red arrows.

 

Figuur2
Michael Polanyi says about procedural knowledge: “We know more than we can tell” – for an expert it is often hard to transpose the procedural knowledge they have into a declarative form.
A characteristic example is the development of a bread baking machine for domestic use by Matsushita. At the initial design of this machine a satisfactory result failed. At the end of their wits they had one of their engineers working alongside a master baker to find out the secrets of the preparation process. The engineer cribbed the art of the kneading (the doe was being turned and pulled) and along the way he wrote down his findings. The bread baker could not word his skill very well and someone was needed to crib so the findings could be transposed into a declarative form.

The process of the transposing of declarative knowledge into procedural knowledge is laborious: first experience needs to be gained (and mistakes to be made) before knowledge can be applied appropriately. For these kinds of study tracks the direct interaction between pupil and student (author) often is minimal, the student not using one of the key talents of his brain: the capability to learn by mimicry.

Monkey see, monkey do!

Man has evolved evolutionary many centuries by learning by mimicry and because of this our brain is quite capable to learn this way. Only since we use script (and mostly since the invention of the art of printing) have we largely transferred to the study of abstract, declarative knowledge. The method we are best equipped for is often being neglected with these sorts of learning tracks; the 1 to 1 learning moments where the expert can be observed in action are usually very scarce.

In situations where it does happen direct transfer of procedural knowledge can take place. In fig. 2 the path is being indicated by the green arrow. The figure clarifies parts of the knowledge through the red arrows is much more elaborate, lengthy and labour-intensive than sharing knowledge offhand by socialising. Mathieu Weggeman especially pleads for sharing quickly outdated information, socializing in a ‘master-pupil’ relationship in his book ‘Leidinggeven aan professionals? Niet doen!’. For basic knowledge, that as a rule has lower turnover rate, the long way can be valuable.

Techniques such as pair programming and the carrying out of code reviews can increase the number of these kinds of transfer moments. Also the movement that looks at software engineering as a craft (‘Software Craftsmanship’), promotes this approach by forming the master-pupil working relation. The knowledge gap can’t be too wide, avoiding the pupil not knowing what the master is doing. ‘Learn to walk before you can run.’

For every sort of learning experience counts that it only leads to true mastership when gained knowledge can be put into practise. Ideally as a software developer you will find work in your field of interest. If this is not the case consider gaining experience by participating in a hobby project and/or an open source project to compile your declarative knowledge into procedural knowledge. You will learn fastest by working together with fellow developers who are just ahead of you. Or as Robert Fripp, a well known jazz-guitarist, words his learning advice: ‘Make sure you’re the worst player in the band.’ So, when possible, make sure you work together with people who are better than you are.

From beginner to expert

The first step in gaining expertise is the awareness of your own ability, or your lack of it. Abraham Maslow writes a 4-step learning process as indicated in the frame. This awareness can occur as a result of self-reflection but also by independent testing or by feedback from colleagues. Be aware people have a tendency to overestimate their level of competence. Only when you are reaching a higher lever do you realise how much there is you don’t know. As a new comer in a field of knowledge you should not try to immediately understand the entire context.
.

Maslow’s 4 stages of learning

Subconsciously adequate behaviour expresses itself in terms like ‘intuition’, ‘fingerspitzengefuhl’, and ‘gut feeling’. These terms all refer – often subconsciously – to the application of pattern-recognition enabling an expert to quickly fathom problems and decide on a qualitative solution.
Stages

  1. Unconscious incompetence – You don’t realise you lack competence and show ineffective behaviour
  2. Conscious incompetence – You become aware of your shortcomings and actively search for improvement
  3. Conscious competence – You successfully apply what you learned
  4. Unconscious competence – The effective behaviour has become automatic, self-evident.

When for example you drive a new route in your car and you are not familiar with the area you will trust your navigation system or road map blindly. But when you know the area and the traffic flow rate you will deviate from the suggested route at certain junctions. The get the optimal result (not the shortest but fastest route) you look at the context.

When you already prevail several programming languages the overview of the syntax and the most important features of a new language are sufficient to learn a new language. The experience with other programming languages provides you enough context to quickly gain understanding in the new language. At learning your first programming language you will have to learn more low-level to eventually – by experience and experimentation – reach to a high-level understanding

Finally

For developers it is of key importance to keep on learning. Techniques come and go, and the C# of today is the COBOL of tomorrow. It pays therefore to learn how to learn. Metacognition and the Kolb learning styles provide tools for optimizing the learning process. Learning by mimicry is relatively easy for people, so see to it you work with people with more expertise than you have. Take in account the ten year principle: often you have to practise a profession many years before you are an expert. Talent is of minor significance – practice, dedication and pleasure are much more important.

About the authors

Freek Leemhuis Freek Leemhuis works since 1996 with the Microsoft development platform. Since 2006 he works as a consultant for Logica, performing the roles of Developer and Software Architect. He has a keen interest in subjects such as OO, Domain Driven Design, Agile techniques and quality of software. In his free time he looks for like minded people through Devnology http://Devnology.nl to exchange knowledge and experience. Follow him on http://freekleemhuis.com
Freek is also a husband, father, dog walker and guitar player.
Maarten Metz Maarten Metz works as a software developer for the Java Competence at Logica. He has 10 years of experience in bit-, byte-, procedural- and object orientated environments. His interests are software design, construction, quality, testing and the psychology of software engineering. He reads many books and articles on the above and one day hopes to create the software equivalent of Pink Floyd’s Dark side of the moon, Monet’s Cathedral of Rouen and Tolstoy’s Anna Karenina.

 

English translation by Helen Potters Text and Translation – www.helenpotters.com

Leave a Comment »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Customized Rubric Theme Blog at WordPress.com.

Follow

Get every new post delivered to your Inbox.

%d bloggers like this: