I have had more than a few emails from readers who privately moan that they 'just don't get it'. They find the concepts of object oriented programming too complex and wieldy and are unable to apply what they have learned in practice. Despite having read the books, downloaded the software, written a few programs, they just don't feel competent. Not enough to use it daily in their work or even ace a simple test. They begin to feel as if they are past it, are simply unable to learn, old dogs/tricks etc.
Did the following happen to you?
You said you wanted to learn .NET so you went and bought the book. The first few chapters were simple. You grasped types and flow control. Foreach? no problem. Hello World! I’m a C# programmer! Then you progressed into the depths of .Net. Inheritance, interfaces, delegates, anonymous methods etc. You understood this perhaps but you found it difficult to really do anything with them. You did the exercises and it just got worse. It took you a month to read one chapter. You found the whole thing hard, confusing, ridiculous, hard to apply to the real world and at the end you retained very little of what you learned. Four months later you retained NOTHING.
Then you gave up.
Learning moment: You will not learn C# by reading a book.
Don't despair! Think about it - if you have been solving programming problems day in, day out throughout your career then it stands to reason that you still have all the right amount of grey matter. Yes! You're smart! The problem may not be your programming skills, the problem may be your learning skills. This article describes the learning process and what you can do to improve your learning skills.
Quiz: By the end of this article try and answer this question: What learning activity was I (the writer) involved in by writing this piece?
Reading is not Doing
You can't learn C# solely from a book. Books are the abstract theory that form only part of the process. All the time you spend reading in earnest is just one of the activities required to really learn. Simply reading a book on the subject (or this blog) is not enough. In fact there is a term for this approach- ‘surface learning’ and will likely end in failure. The reader makes the mistake that if they just read and do the exercises then it will all be absorbed like a sponge and magically they will become a .NET developer. Wrong. Would you trust the novice captain of your transatlantic flight who spent hundreds of hours playing Microsoft Flight Simulator but never flew an actual plane?
Programming is an experiential learning activity.You may not have considered the change required to develop a completely new skill since you were at college. If you are self-taught you may have forgotten that you did make a dramatic shift in thinking at the time. Well, this shift is required again because C# is a not just a different language, it’s a radically different way of programming.
It’s true that you learn all the time. At work you continually develop and enhance your skills but usually you are adding to existing knowledge through active experience and the learning is incremental. What is required now is to learn in a monumental manner i.e understand, retain, practice and implement a complex new skill on a daily basis that is quite different than any you have acquired to date.
To accomplish this you need to develop your learning skills. Once you really change your learning methods to adapt to acquiring new systems of thinking then you will find learning .Net or any similar hefty new skill much easier. This all takes substantial investment in time – more than you have likely done already. But if you take the smart approach it will really pay off , you will retain what you have learned and importantly, be able to apply it to daily programming problems. You might have spent months reading C# books without being able to use it practically, so spending the extra time learning to learn will salvage precious time spent reading. So the hard part is not C#, the hard part is changing how you learn. Let’s look now at what learning really is.
Look at the diagram below by the experiential learning guru David Kolb - it shows the various stages of learning. Now tell me where your $50 C# book is in this cycle? (I have to laugh at the SAM’S programming titles ‘Learn C# in 24 hours’ ). Programming does not mean coding, SAM. Programming means being able to take a customer problem – like a business request for multi country order entry and turn it into a solution using the appropriate programming language. Knowing the definition of a Lambda expression is much different than knowing exactly how to apply it in the search function in the order history module and why.
The stages of learning then are:
- Abstract Conceptualization & Theory (Books, blogs, articles, lectures)
- Active Experimentation (Applying what you have learned in different situations)
- Concrete Experience (Doing a real life project in C#)
- Reflection (Complete and go back over your experience documented in your learning journal to change your future behaviour.)
So yes, you need the book but you need to remember that learning C# is not just about reading a book and understanding the concepts. It is a major shift in thinking which requires monumental learning. You read the book but because you weren’t successful and couldn’t apply it you thought .NET and C# was just beyond you. It’s not. You just didn’t complete the other 3 parts of learning.
But Kolb doesn't say HOW you learn in a monumental way. Let’s turn now to improving your learning skills.
One proven method for developing learning skills comes from clinical practice- 'Reflection ON Action and Reflection IN action' according to Price & Maier in their excellent book
‘Effective Study Skills’ (Pearson 2007). This reflection process means to systematically monitor your learning while on a task and after the task.
You will need to add about 10-20% of your time for each task to monitor it through the process called 'Reflection'.
Don’t skip this! You probably think ‘I don’t need to be this explicit, I know all this stuff already’. I agree, you do know this stuff, but you know it implicitly. The point is to improve your learning and to do that, your knowledge needs to become more explicit. Engineers are notorious for being black holes of knowledge. It all goes in but nobody , including themselves, sees clearly into that obscure mass of synaptic lightning. They scoff at others who are ‘all talk and no action’ they find articulation beneath them. They hide in their cubicle and weeks later magic stuff appears on screens. The reality is that we all need to be a little more ‘all talk’ to learn with skill, speed and be able to quickly put it into practice. If we want to keep making magic stuff, we need to articulate our learning, we need to learn how to be reflective.
Reflection is a process whereby you mirror the activities you are engaged in, think about them objectively and determine ways to change your behaviour and then actively apply the changes in your behaviour.
You can start using reflection today. Let’s take a typical project like order entry.
Here’s the three steps to reflection:
1) Recap: Go back over the requirements, how they changed during coding, what delayed the project. Go back over what happened. Articulate the project issues and how they were solved or not solved. Articulate doesn’t mean glossing it over in your head, it means writing it down, presenting it to others, chunk the information in meaningful ways, use mindmaps to look for patterns.
2) Reframe: Take what you have learned and apply it in a new situation.
If the requirements changed substantially during coding then the
A simple example comes from language learning. You take a word and then use it in a new sentence.
3) Reassess: This is a biggie. Here you need to determine how to change your behaviour and activity based on what you learned. You may have noticed that some problems go from project to project. Don’t blame it all on upper management, the users, budget etc. Figure out where you can specifically change your behaviour in the next project and then commit to change. e.g. Create minutes after every meeting so everyone is clear as to their responsibilities.
Remember, the process of reflection happens IN action and AFTER the action. Keep a journal to track your learning (see below).
I recommend a few things to retool your learning.
2) Take a study course at your local university or college. Learn to Learn!
3) Keep a notebook on learning. Track your learning like a kind of resume. State your current ability in the various areas of .NET, state your objectives VERY specifically (e.g. be able to write any subfile type program in ASP.NET in under 6 hours).
I'm only lightly touching on the subject here but take comfort in the fact that you're not dumb, that you CAN learn, and you will be a great .NET developer because you are a great iSeries developer. However you can and you must change. Yes, dog/spots, you can change - through improving your learning. Most programmers are self-taught and when they come up with a learning block they stop right there because they have only learned one way. What they forget is that there are lots of ways to learn. You owe it to yourself to improve your learning, to adapt to what is changing around you. Don’t bank on learning C'# just one way. Take a class. Get a junior position in a .NET team (even if you are 48) and get adopted by a guru (even if he’s 25). Have learning as a systematic process and core part of ALL your activities. Reflect on your learning. OK, try and do it right now. Go through this article again to reflect i.e. Recap, reframe and reassess.
An efficient learning process is essential for your continued professionalism. Look at Dice.com and see where all the jobs are - in newer technologies like .NET. In 10 years it will be completely transformed again and you will need to change again. Becoming a proficient learner is just another skill but is undoubtedly the greatest skill of all.