As software developers we spend a large amount of time learning. There is always a new framework or technology to learn. It can seem impossible to keep up with everything when there is something new every day. So, it should be no surprise to you that learning quickly and gaining a deeper understanding of what you learn is very important.
And that is exactly why–if you are not doing so already–you need to incorporate teaching into your learning.
Why teaching is such an effective learning tool
When we learn something, most of us learn it in bits and pieces. Typically, if you read a book, you’ll find the material in that book organized in a sensible way. The same goes for others mediums like video or online courses. But, unfortunately, the material doesn’t go into your head in the same way.
What happens instead is that you absorb information in jumbled bits and pieces. You learn something, but don’t completely “get it” until you learn something else later on. The earlier topic becomes more clear, but the way that data is structured in your mind is not very well organized–regardless of how organized the source of that information was.
Even now, as I write this blog post, I am struggling with taking the jumbled mess of information I have in my head about how teaching helps you learn and figuring out how to present it in an organized way. I know what I want to say, but I don’t yet know how to say it. Only the process of putting my thoughts on paper will force me to reorganize them; to sort them out and make sense of them.
When you try to teach something to someone else, you have to go through this process in your own mind. You have to take that mess of data, sort it out, repackage it and organize it in a way that someone else can understand. This process forces you to reorganize the way that data is stored in your own head.
Also, as part of this process, you’ll inevitably find gaps in your own understanding of whatever subject you are trying to teach. When we learn something we have a tendency to gloss over many things we think we understand. You might be able to solve a math problem in a mechanical way, and the steps you use to solve the math problem might be sufficient for what you are trying to do, but just knowing how to solve a problem doesn’t mean you understand how to solve a problem. Knowledge is temporary. It is easily lost. Understanding is much more permanent. It is rare that we forget something we understand thoroughly.
When we are trying to explain something to someone else, we are forced to ask ourselves the most important question in leaning… in gaining true understanding… “why.” When we have to answer the question “why,” superficial understanding won’t do. We have to know something deeply in order to not just say how, but why.
That means we have to explore a subject deeply ourselves. Sometimes this involves just sitting and thinking about it clearly before you try to explain it to someone else. Sometimes just the act of writing, speaking or drawing something causes you to make connections you didn’t make before, instantly deepening your knowledge. (Ever had one of those moments when you explained something to someone else and you suddenly realized that before you tried to explain it you didn’t really understand it yourself, but now you magically do?) And, sometimes, you have to go back to the drawing board and do more research to fill in those gaps in your own knowledge you just uncovered when you tried to explain it to someone else.
Becoming a teacher
So, you perhaps you agree with me so far, but you’ve got one problem–you’re not a teacher. Well, I have good news for you. We are all teachers. Teaching doesn’t have to be some formal thing where you have books and a classroom. Teaching is simply repackaging information in a way that someone else can understand. The most effective teaching takes place when you can explain something to someone in terms of something else they already understand.
(Want a great book on the subject that might make your brain hurt? Surfaces and Essences: Analogy as the Fuel and Fire of Thinking. An excellent book by Douglas Hofstadter, author of Godel, Escher, Bach: An Eternal Golden Braid. Both books are extremely difficult reads, but very rewarding.)
As human beings, we do this all the time. Whenever we communicate with someone else and tell them about something we learned or explain how to do something, we are teaching. Of course, the more you do it, the better you get at it, and adding a little more formalization to your practice doesn’t hurt, but at heart, you–yes, you–are a teacher.
One of the best ways to start teaching–that may even benefit your career–is to start a blog. Many developers I talk to assume that they have to already be experts at something in order to blog about it. The truth is, you only have to be one step ahead of someone for them to learn from you. So, don’t be afraid to blog about what you are learning as you are learning it. There will always be someone out there who could benefit from your knowledge–even if you consider yourself a beginner.
And don’t worry about blogging for someone else–at least not at first. Just blog for yourself. The act of taking your thoughts and putting them into words will gain you the benefits of increasing your own understanding and reorganizing thoughts in your mind.
I won’t pretend the process isn’t painful. When you first start writing, it doesn’t usually come easily. But, don’t worry too much about quality. Worry about communicating your ideas. With time, you’ll eventually get better and you’ll find the process of converting the ideas in your head to words becomes easier and easier.
Of course, creating a blog isn’t the only way to start teaching. You can simply have a conversation with a friend, a coworker, or even your spouse about what you are learning. Just make sure you express what you are learning externally in one form or another if you really want to gain a deep understanding of the subject.
You can also record videos or screencasts, speak on a subject or even give a presentation at work. Whatever you do, make sure that teaching is part of your learning process.
Wow, I can’t believe I have actually reached the milestone of authoring 40 Pluralsight courses
My first Pluralsight course, Introduction to Android Development, was released on April 12th, 2011. That is just over two years ago.
And my latest course, which makes number 40, if you count my contribution to the Design Patterns course, is Using Glimpse With ASP.NET, MVC4, and Entity Framework, which was published on May 5th, 2013.
The total hours of video content I have published in the 2 years from my first to my latest course is around 122 hours. That means you could watch my Pluralsight courses for about 5 days straight.
But before I tell you about what I learned from this experience, I just want to take a moment to say thank you.
I couldn’t have done this by myself and I am very thankful to everyone that helped me reach this important milestone.
I have interacted with many of you over email and Twitter and I have gotten lots of positive feedback and encouragement as well as some constructive criticism which has greatly helped me to improve my courses and to feel like I am doing something that is meaningful and helpful to many people.
So, sincerely, from the bottom of my heart, I thank you faithful viewers for watching my courses and I commend you on being the kind of developer that cares about learning and improving their skills.
I also want to thank Pluralsight and all of the staff and management of Pluralsight. When I say that the folks at Pluralsight are some of the best people I have ever had the opportunity to work with, it is no lie. I have never met a more friendly group of energetic people that really care about what they do than the management and staff of Pluralsight.
The biggest lesson from creating Pluralsight courses
You may be expecting that the biggest lesson I have learned during my super-speed course creation at Pluralsight is how to learn technologies quickly, and although I have certainly learned a great deal about doing that, the biggest lesson I have learned is that we can accomplish what we put our minds to if we are willing to not let anything stand in the way.
I don’t have any special skills or talents, besides my ability to say “Hi, this is John Sonmez from Pluralsight.” I’m just a regular guy who works really hard and stays as focused as possible.
But, I didn’t always have the work ethic that I do today.
In order to do that, I had to drop many things in my life that I used to like to do, like watching TV or playing games, and focus on my opportunity.
And, yes, the opportunity to author courses at Pluralsight is an excellent opportunity, and I realize that not everyone has that opportunity. But, we all have opportunities that sometimes are hard to see. Opportunities that we need to seize and make the most of.
Many of these opportunities are once-in-a-lifetime, some of them come and go. I’ve had opportunities in the past that I have let go, or I didn’t put my heart into, but with Pluralsight it was different.
I won’t bore you with the story of working a full time job for almost two years and doing Pluralsight courses every single night and weekend. But, in order to seize this opportunity, I had to put in some hard work and be willing to make some sacrifices.
The reason why I mention this is because, if you are reading this post, you are probably the kind of programmer or IT professional who is already starting to seize an important opportunity to advance your career and skills. I just want to encourage you that you can do whatever you want to do. You can be as successful as your willingness to work hard and believe in yourself will allow.
I hope that more than learning about a technology or development language from my courses, that I could teach you something much more valuable—the power of believing in yourself and not letting anyone put limitations on you.
Some other lessons
It is really difficult to summarize everything that I have learned over the past 2 years and 40 courses, because there is just so much, but here is a list of some of my biggest takeaways from this whole process.
- Learning a technology effectively can be broken into 3 steps
- Create something simple with it
- Learn the breadth of the technology to understand what there is to know about it.
- Determine the most important high level topics to learn and only go into details when necessary, you can always fill in the details later
- Effective teaching is showing people something new in terms of what they already understand
- Have a goal, make a plan to get to it, and don’t deviate from it until it is accomplished
- If you fall off the horse get back on as soon as possible
- Encouragement feels better than criticism, but criticism if much more valuable
- Writing your thoughts out refines them and sands the jagged edges off of them
- Redoing work is much harder than doing it right the first time
- Nothing is the best. No technology, no programming language, no way of doing things
- No matter how much you know, everyone and everything has something to teach you, if you will only listen
- It is very easy to type “HellWorld” and not notice until you’ve finished recording 30 minutes of video
- The right caption can make any image funny
- The key to efficiency a repeatable process
- Videos with just slides are much hard than videos with demos
- A good microphone adjusted properly makes a huge difference in audio quality
- Quotas are proactive, metrics a reactive
Onward to 50
So what’s next on my agenda? Hitting 50 courses of course.
I’ll be working hard for the rest of this year to keep producing courses, since I still have a pretty big list of ideas, but after this year, I’ll probably be slowing down a bit, since I can’t keep up this ridiculous pace forever.
So thanks again for to everyone for all the support and encouragement, and to Pluralsight for this awesome opportunity.
My YouTube video for the week
Get Up and CODE
And here is the latest Get Up and CODE episode, where Iris and I interview John Papa about fitness.
The recent free courses from Pluralsight on teaching kids to program really got me thinking about this subject.
There seems to be a big backlash in development community against the idea that everyone should learn to program.
I’m not sure exactly where it is coming from, but I suspect it has something to do with egos and fear.
Even within the development community, there seems to be a distinction between “real programmers,” and “not real programmers,” based on language or technology choice.
I have to admit, I have been guilty of this type of thinking myself, because a very easy way to increase our own value is to decrease the value of others.
But what I have come to find is that not only is the distinction between “real programmers” and “not real programmers” a false dichotomy, but that the distinction between a programmer at all and a layperson, is also not quite as clear, or at least it shouldn’t be.
Not everyone should be a programmer
It’s true. Just like not everyone should be an accountant, or not everyone should be a writer, but I think we can all agree, that everyone should understand basic math and be able to write.
Learning how to program and doing it professionally are two distinct things and they should not be lumped together.
It it pretty hard to imagine a working world where no one except writers could write.
Imagine wanting to send an email to your boss, but you don’t know how to write, so you have to ask the company writer to do it for you.
That is what the world would be like if we insisted that only writers needed to learn how to write.
But perhaps you think I am just being silly, I mean the need to write is so prevalent in everyday situations, but the need to program isn’t.
But I challenge you to consider if whether it is actually true that the need to write is much more prevalent than the need to program, or because everyone knows how to write, the need for writing is just recognized more.
Imagine if everyone you interacted with on a daily basis knew how to write code. Imagine that, just like everyone has a word processor on their computer that they know how to use, there was an IDE that allowed them to write simple scripts.
Think about how that changes the world.
The first thought that comes to my mind in that world is that there would be APIs everywhere.
Every single program would have an easily accessible, scriptable API, because every user of that program would want to be able to automate it.
In time, the way we viewed the world would completely change, because just like products today are designed with the thought that users of those products can write, products of that time period would be designed with the assumption that users of those programs can program.
Suddenly everything becomes accessible, everything interfaces with everything else.
Doctors build their own simple tools based around their specific process by combining general purpose software from their equipment.
There is a Pinterest full of code snippets instead of pictures.
Every device and piece of software you interact with has an API you can use to automate it.
The point is that we can’t conceive what the world would look like if programming was as prevalent as writing, but such a world can and should exist.
Computers and technology are such a large part of everyone’s lives that it is becoming more and more valuable to be able to utilize this so common element.
It starts with kids
We have to stop thinking programming is hard and realize that it is one of the easier things we can teach kids to do.
If a person can grasp and use a complex language, such as English, that person can learn how to program.
Programming is much more simple than any spoken or written language.
But, we have to stop erecting these artificial barriers that make programming computers seem more difficult than algebra.
Is there really much difference between an algebraic variable and a variable in a programming language?
Isn’t most mathematics solved by learning an algorithm already? Why not at the same time, teach how to program that algorithm? Not only would it make the subject much more interesting, but it would build a valuable skill as well.
We spend a great deal of time educating kids with knowledge they will never use—basically filling their minds with trivia. But, how much more likely would they be to use the skills learning to program would give them?
What was hard yesterday is easy today
Calculus, geometry, probability, the structure of a living cell, electricity… What do they all have in common?
These concepts used to be advanced topics that only the most educated in society knew about or discussed, but now have become common knowledge that we teach children in school. Ok, well maybe not calculus, but it should be.
Over time, the concepts that only the brightest minds in a field could possibly understand are brought down to the masses and become common knowledge.
It is called “standing on the shoulders of giants,” and it is the only way our society advances as a whole.
Imagine if it was just as difficult for us to grasp the concepts we are taught in school as it was for the pioneers of that knowledge to obtain it… We wouldn’t ever advance as a whole.
But, fortunately, what is hard yesterday ends up being what is easy today.
The same will eventually happen with computer programming, the question is just how long do we need to wait?
It’s all about breaking down walls
I try to never say that something is hard, because the truth is that although there are some things in life that are hard, most things are easy if you have the right instruction.
It is natural for humans to want to think the knowledge or skills they have acquired is somehow special, so naturally we have a tendency to overemphasis the difficult in obtaining that knowledge or set of skills, but we’ve got to work through the fear of job security and egos and remove the veil of complexity from programming and make it simple.
The value we can bring by helping others to understand the knowledge we have is much greater than the value that using that knowledge alone provides.
I’m not good at many things. Let me rephrase that. I’m not naturally good at many things.
There are many people who are smarter than me, process things quicker and overall just have a better aptitude for almost everything I do.
I’ll freely admit, I’ve been pretty successful in my field and in life in general. (At least according to my own measures of success.)
You might wonder how I can be so untalented, yet accomplish so much?
I must be doing something right.
I believe the key thing that has helped me to become successful and will continue to do so, is my ability to learn how to learn about a subject, self education.
I’ve found that it is only when you take ownership for the learning process and its result that you actually are able to accomplish the true goal of learning, which is the ability to put knowledge into action.
So what is learning to learn?
Basically, it is figuring out the best way to learn about a particular subject. You can contrast this to the default mode of education, which is relying on someone else to teach you a subject.
As a society in general we have adopted the idea that attending institutions of education is the correct way to learn about a subject. And while schooling can be important and good, it is often not the best method of acquiring useful actionable knowledge.
A wise man by the name of Herbert Spencer, who as an English philosopher in the mid to late 1800s, once said
“The great aim of education is not knowledge but action.”
Now obviously I’m not knocking the idea of learning a subject matter through someone else’s teaching. I make part of my living teaching, and perhaps the reason why you are reading this blog is because you expect to learn something.
My point is simply that the most efficient way to learn something that you will actually put into action is to decide what must be learned and how to learn it yourself, rather than taking a complete prescription from someone else. Someone else may be able to break down subject matter and assist in your learning, but you ultimately are responsible for your own education.
Take a moment and say that with me, because I think it is so important.
“I am responsible for my own education.”
It is quite an empowering phrase. When you really let it sink in, you begin to realize that no one can give you a grade, but yourself. (And I don’t mean this in the "all kids are special and everyone tries so it is not fair to give some kids As and Fs and lower their self esteem" kind of way.)
I mean this in the sense that it doesn’t matter if you got straight As and a perfect 4.0 GPA in college, you ultimately have to decide if you learned something, or if you just did the work.
It is only when you take ownership for the learning process and its result that you actually are able to accomplish the true goal of learning, which is the ability to put knowledge into action.
Why learning to learn is important
Have you ever considered how expensive education is? Is there some magic formula that a college or university has that gives them the ability to define and bestow an education better than you could do yourself?
When you consider the amount of money and time that is spent on traditional classroom education, you really have to ask the question of whether or not you are getting the maximum benefit for your precious resources.
I think you’ll find that most of the time, the answer is “no.”
The problem with systematic education is that it isn’t very efficient. The process of learning something is very tailored to an individual. It is not something that is easily distilled and applied like a balm or an ointment to the foreheads of eager young students.
Not only do different people have different learning styles, but what is important for them to actually learn varies as well.
Let’s be completely honest here, in most formal educational systems the majority of what you do is read and regurgitate things, but not really learn them. Perhaps you remember them for long enough to take a test, or to graduate to the next level of that subject area, but do you really learn most of the things that are taught in a textbook? Do you really need to?
Overall, with traditional spoon-fed education, you are typically not really getting your value’s worth for your money or your time.
Still, I hope we can all agree that education is important.
And because education is so important and we don’t want to waste our money or our time acquiring it, it is essential to learn how to learn.
Equipped with the ability to teach yourself anything you need to know, you suddenly lose the constraints that are binding you to a particular area of knowledge or skillset.
When you can teach yourself more efficiently about a subject than any institution can, you have given yourself perhaps one of the most valuable gifts a human being can receive to be successful in life.
You have given yourself the ability to do just about anything you want. (Within the constraints of time-space and physical reality of course.)
And once you have this ability yourself, you will also find that you will be in a great position to teach others what you know.
Since most of the world is not very good at this skill, you have a genuine value that is in short supply. If you can take a subject matter, figure out a path to learn that subject matter, and be successful in doing so, you can help others along the way who may not yet have mastered that ability as well as you have.
How to do it
All this talk about the value of learning to learn is worthless if we don’t actually learn how to learn how to learn. (Say that three times fast.)
Rather than title this subject as accurately as I could put it, which would be to learn how to learn how to learn, I decided "how to do it" approximates closely enough my point.
Enough blabber, let’s get down to it.
Scoping the subject
The first step in learning about a subject and perhaps the most critical is to determine the scope of the subject you want to learn about.
So many people skip this step and wander aimlessly though the vast halls of knowledge never really knowing what they are looking for.
In determining the scope of the subject you want to learn about it is very important to consider first the granularity. The granularity at which you wish to learn a subject will very greatly influence the size or overall scope of the subject matter to be digested.
Speaking plainly… you can’t lean a lot about a large subject in detail. (At least not in a practical amount of time.)
You basically have to balance the details of the subject to the overall size of what you want to learn.
For example, since this is a programming blog, let’s say you want to learn about a particular technology. Let’s say C#.
You could learn about the topic with a broad brush and learn the basics of the language and how to generally construct logical statements and write programs in that language.
You could also decide that you want to learn exactly how C# works and how exactly each keyword behaves under certain circumstances. This level of detail can of course be found in the C# language specification. (If you didn’t actually click that link, it takes you to a 505 page book with almost all of the technical details of the C# language.)
And while you could of course learn the language at this level of detail, it would probably be a lot more beneficial to pick a particular aspect of the C# language to learn about at this detail based on why you want to learn it rather than attempt to understand every aspect of every situation of the C# language.
Taking another simpler example. If you wanted to learn about world history, you are either going to want to learn about the entire history of the world at a very high and summarized level, or you are going to want to pick a particular era and location.
Having a goal
The next thing you need is a goal. There is no point in learning something just for the sake of learning it.
Your goal might be to build something with the new technology or to be able to write about it competently or even just to be able to speak fluently on the subject matter.
I’d encourage you though, in choosing a goal, to make sure that your goal is something that can be measured and qualified in no uncertain terms. If you are learning a new technology, make a goal of building something with it. Even if it is something that will be thrown away after it is built. It will both serve to reinforce what you have learned and to validate the subject matter and scope you have chosen.
Another important goal I always try to have is to teach whatever I am learning. I have found that the only way to truly learn something (and by this I mean to have that true in-depth knowledge of a subject, one that does not fade with time) is to teach it.
Present at a local user group, write a blog post, tell your spouse about it. (My wife loves hearing about programming languages and technology. Sometimes she’ll even drop what she is doing just to make sure she is paying full attention and not missing one intricate little detail about all the exciting things I am telling her.)
When you define a goal, it is also important to define a deadline. Doing this will help you refine the goal and recheck the scope of your subject.
It does no good to learn something without the ability to practically apply it. By having an actual deadline, you ensure that what you are trying to accomplish will fit into the timeline which will be required to make it useful to you.
The important point is to have at least some goal for your learning endeavor.
After you know what you are going to learn and you have a good idea of how you will measure your achievement of the learning, you will undoubtedly need to find some resources for proceeding with your plan.
At this step, you’ll also want to start creating an outline or mind map or some other way of organizing exactly what things you decided to learn about when you defined your scope. I’ll talk more on that in a moment.
Depending on the subject matter you are trying to learn there may be a large amount of resources available or very few.
Usually, the best way to get started on finding resources is a search on the internet.
Often we are trained to only turn to one type of medium as a resource for learning when there are so many more. Consider all the types of resources that may be available on a subject:
- Magazine articles
- Field experts
- Other who are also looking to learn the subject and may have already gathered resources together
As you are compiling the resources you may draw upon, you should also be looking to figure out how others have taught the subject you are attempting to learn.
I often will look through the tables of contents of three to four books on a subject I am trying to learn and draw my own outline of how I will cover the material from the overall picture I get from how others have broken down the topic before.
Another great source is to look at actual college courses or other courses on the subject and see how the material is broken down there.
Sometimes you’ll find though that just asking someone knowledgeable about the subject will be your best avenue.
The end of this step should result in an actionable plan that outlines what you are going to cover and how you are going to cover it along with a general idea of the resources you will use to do so.
Putting it into practice
I’ve found the most effective way to actually learn something once I know what I am going to learn and where I am going to get the information from is to study and do at almost the same time.
Now “do” can be a very broad term when it comes to learning, so you’ll have to decide for yourself what exactly this constitutes.
If I am learning a new programming language, or framework, I’ll try to actually creating demos of what I am learning, by working through my own examples.
At the same time, I may be “doing” by reorganizing information either to prepare a talk or course on the subject that I will be teaching. By attempting to take the information I am getting and restructure it in a simpler way that I can explain to someone else, I am forcing myself to undergo the process of learning instead of just reading.
Albert Einstein is quoted as saying
If you can’t explain it simply, you don’t understand it well enough.
So if you want to understand something “well enough,” work from the goal of being to explain it simply.
So much more
In a short blog post, I can’t cover everything there is to know or that I have found to be true about learning to learn.
A whole volume of books could easily be written on the subject, but what I have outlined are the basics of what I generally do to learn something quickly and effectively.
I wanted to touch on very briefly some other aspects of this subject that I have thought about, but not covered as thoroughly in this post.
One excellent technique for learning something is to immerse yourself in it. If you really want to learn a programming language, start doing everything in that language.
If you want to learn to use keyboard shortcuts instead of mouse clicks, try taking away or limiting your mouse use for some period of time.
Immersion is a somewhat painful, but effective and fast way to learn new material.
Pair programming with newbies is an excellent example of immersion. Let them jump right in and start coding with someone who knows about the system.
Many foreign language classes also use this technique by forcing students to only speak in the language they are learning when in class.
Try and fail
While I think your aim should not be to learn knowledge by trying and failing, it is a great source of wisdom.
Let me clearly define the difference between the two, before I move on.
Knowledge is what you know that can be put into words and consists primarily of facts.
Wisdom is akin to common sense. It is often not able to be put into words and cannot be fact checked for accuracy because it is a set of principles that rule your behavior and thinking.
You really shouldn’t try to learn something the painful way if you can just find out the answer to something by asking someone or looking up the information.
(Don’t try and pass a multiple choice test by try and fail.)
On the other hand, go ahead with the imperfect knowledge that you have and try to apply it to something; if you fail figure out why. This process will produce valuable learning.
In short, learning through try and fail can be good, but only when it teaches us lessons that we couldn’t learn otherwise. There is a big difference between educated failing and fumbling your way through life unprepared.
It is not necessary to learn that a stove is hot by touching it, but the best way to learn to start a business is probably to fail at one first.
Everything I’ve outlined so far, has been on the basis of acquiring general knowledge on a subject, not about becoming better at an art or skill.
What I mean by this is there is a difference between being an expert golfer and knowing a great deal about the proper golf technique.
Often a prerequisite for skills mastery is the acquisition of a large amount of knowledge on a subject, but having a large amount of knowledge on a subject does not an expert make.
The same goes for being a better programmer.
You could learn 10 different programming languages and 20 different technologies and frameworks, but simply having all this knowledge doesn’t mean you are good at applying it.
The old adage that practice makes perfect is appropriate in this situation.
There simply is no substitute for experience. And experience is obtained through practice over time. (Although, at the same time practicing without the proper knowledge in place can put you in a worse position than not practicing at all. Ever heard of someone having to un-learn their golf swing?)
For more on this topic check out the Dryfus model of skill acquisition.
Changing your thinking
The key to self educating is to be able to change the way you think about learning. You should no longer see yourself as a student to be taught, but rather as a researcher gathering together information on a subject.
This way of thinking about education tends to go against what many of us have been taught by formalized education systems.
It takes a bit of courage to step forward and proclaim yourself as your own best educator, but the rewards of doing so are immense.