Let me ask you a question.
Why do you think Bill Clinton gets paid $200,000 to speak for an hour?
Is it because he is such a good speaker that just hearing the magic words come out of his mouth will make you a better human being and drastically change your life?
Or do you think it might have something to do with the fact that he was the president of the United States of America?
I’m not doubting the Bill Clinton is a good public speaker. He is likely one of the best, but it is not his skill alone that commands such a high price. A large portion of his price tag comes from the name he has built for himself.
You might say that he has…
Style and substance
Just having style is not enough. Style is just a name without anything to back it up.
Have you ever been suckered into buying one of those products on late night TV? You know what I mean, the ones that they sell at 2:00 AM and throw in all kinds of extra things if you only act now?
That is an example of style, but no substance. You aren’t getting what is being sold. The infomercials are advertising a product much better than what you actually receive. When you open the box and try out the product, you feel like you got ripped off—and you did.
Substance alone is not enough either. I’ve known many very skilled people that couldn’t market their skills worth a dime. Often people who focus on developing their skills don’t feel that they have the ability or time to learn how to market those skills, so those kinds of people go underappreciated and never live up to their full potential. As a software developer, you are probably more likely to fall into this category.
To reach the ultimate level of success and truly increase your value, you have to have both style—the ability market yourself and make a name for yourself, and substance –the skills that pay the bills.
Whether you like Bill Clinton or not, you have to admit that he does have both; that is why he commands such a high price tag.
Skills are not as important as you think
One thing that many programmers and software developers find hard to believe is that skills are not the most important thing in advancing your career.
Don’t get me wrong, you have to have some skills and knowledge. Just like the dice-o-matic you bought at 2:00 AM and quickly discovered was actually a piece of junk, if you pretend to have skills and abilities that you don’t actually possess, your customers and clients will be just as disappointed and look for a trash can to drop you off in.
But, at the same time, most people can’t recognize the difference between someone who is in the 95% margin of skill in a field from a person who is in the 80% margin of skill in that field, unless they also happen to be an expert themselves in that field. Unless you are a doctor, or dentist or auto mechanic, you probably don’t have a way of really evaluating how good a doctor or dentist or auto mechanic is—although you can probably quickly spot a phony.
So, why is this important?
Because, if you are like me—or at least how I was—you are probably spending way too much time focused on increasing your skills and not enough time increasing your style; building a name for yourself.
What I mean by this is that if you are at a decent level of skill, you will see much bigger benefits in building a name for yourself than you will in increasing your skill further.
It doesn’t matter if you are an independent software developer trying to get more clients or sell a product, or you are looking to work for someone else who will pay you more money, or you just want to get that promotion at your current job. Whatever your goal or situation is, complimenting substance with style will multiply the value of your skills much more than increasing those skills themselves.
The best way to think about this is like a mathematical equation.
(Style ^ 2) * Substance – Expectation = Value
Let’s break it down.
Style is more important than substance, because while skills are essentially capped and become harder to increase over time, style can be increased to a much larger degree—you can always build a bigger name; get a bigger audience.
Plus, the effect of having a larger audience tends to increase exponentially. That is why commercial spots for the Superbowl are so expensive.
Now, from the style and substance multiplication we have to subtract expectation to get a true sense of value.
Consider the case where you bought that dice-o-matic from a late night infomercial. The style points were pretty high. Lots of great marketing techniques were at play to get you to make that purchase, but those techniques also tend to setup some pretty high expectations of what the product should do. When you see the guy on TV using the dice-o-matic to chop an iPhone into tiny pieces, it sets a pretty high level of expectation.
Style is high, but substance is pretty close to zero and expectations are high, so in many cases value can actually be negative.
You have to consider the same thing in your career, when you are marketing yourself and your skills. Some of the marketing techniques you could use to get a quick audience would also produce a very high expectation, so if you don’t have the skills to measure up, you are going to create some negative or very low value.
On the other hand, if you have a high enough level of substance behind what you are promoting and you are able to promote yourself in a way that doesn’t build up more expectation than you can deliver, you are going to be able to bring a pretty high amount of value.
Increasing your value
So, for many of us software developers and programmers the answer is simple. The most effective way we can increase our value is to learn how to market ourselves; a skill that I have found many IT people tend to lack. Of course there are some great examples of developers who do not lack this “style.” Most conference speakers and well known authors or consultants are very good at promoting themselves and really increasing their value by carefully paying attention to the equation above.
Now, of course, this is much easier said than done. I’ve also found that most software developers don’t really know how to go about marketing themselves. I didn’t either for too long of a time—and I am still learning how to do it every day. But, I have learned some valuable techniques that I think just about anyone can apply to build some points on the style side.
If you are interested in learning about how to market yourself to really increase your value, sign up for my newsletter here, so I can keep you updated on my future posts and videos covering that topic and much more.
I am planning some pretty exciting content around all of the information I’ve gathered over the years about marketing yourself as a software developer and I’ll be sharing a large amount of that information here on this blog.
Update: be sure to check out this comment chain to see a bit more clarification on what code katas really are. Thanks for Cory Foy for pointing out that I was unfairly calling all code katas as solving the same programming problem over and over again. Only some people treat code katas that way and this post is about why that kind of code kata is not effective. I also updated a few words in this post to reflect this point.
I don’t want to seem like I am bragging, but there is something I just have to get off my chest.
But, before I tell you what amazing skill I have mastered through countless hours of boring practice, let me tell you a bit about my training schedule.
Everyday I get up in the morning. I put on my shoes. I begin my practice.
Usually I start with a small warm-up, just to get the blood flowing on the way to my office at the end of the hall.
Later in the day, I’ll wander out of my office for lunch and practice more on the way to the kitchen.
Right now as I am typing out this blog post, I am on the treadmill honing my craft one painstaking repetitive step at a time.
That is right, you may have guessed it by now—I am a master walker.
All my life I have been practicing this humble skill. Each and every day I practice my secret craft. I see other fools riding around on mopeds and motorized scooters sheepishly talking of their perceived skill at bipedal transportation. But, although outwardly I acknowledge their words, inwardly I know that I am special, because I hone my skill to a craft.
Sounds ludicrous? That is what it sounds like to me when some people talk about doing code katas.
What is a Code Kata you may ask? Some people think a Code Kata is when you solve the same programming problem over and over again, thinking you are actually practicing something other than using shortcuts in your IDE. (To be fair, not all people view Code Katas that way.)
These kinds of Code Katas come from a failed attempt to forcibly simulate the same kind of practicing that a musician or athlete would perform in order to become better at their vocation.
Why Code Katas aren’t effective
Don’t get me wrong, the intention behind Code Katas seems to be well placed, and I am all for software craftsmanship (although not the elitism that sometimes accompanies it.) But, just as walking every single day doesn’t make you a master walker, and driving a car every day doesn’t make you a superior driver, solving the same sets of programming problems over and over again won’t make you a master programmer.
If you still have your doubts, consider old people. Old people are not master walkers or master drivers, yet they have been doing both of those activities day in and day out for many years. Not only do they not master these skills, the skills actually atrophy—they become worse at them, and not just because their muscles and reflexes become worse from age, it is because repeating the same thing over and over again without an increasing level of challenge actually results in the mind becoming complacent with the activity which leads to the eventual degradation of it. (At least, this appears to be the case to me.)
Don’t lose hope though, a little later on I will tell you a real way to practice your craft in software development—one that will give you results—but, first let’s dissect the cases of walking and driving a little bit further to see why repeated practice of those activities seems to have diminishing returns.
Doing the same thing over and over again doesn’t make us better at it
We first learn from walking and driving, because everything is new and challenging. Although walking seems like a repetitive process, it is actually the lack of repetition that provides the challenge our brain and body need to actually benefit from it.
As a toddler learning to walk or a teenager learning to drive, we are constantly bombarded with new scenarios and challenges that we haven’t faced before. What happens when the dog runs by and brushes our leg? How does this affect our balance and what do we have to do to adjust? What about this new surface? The carpet seems to absorb our feet and create more friction when we attempt to walk on it. How do we compensate to balance on this surface? Walking with socks on the floor gives us less grip, etc.
But, as an adult, or experienced walker or driver, we are not challenged in nearly the same way; we’ve already seen most of the scenarios. Our daily commute to work rarely presents us with an unfamiliar stimulus or problem to solve. We operate on autopilot, automatically walking and driving to our destinations without much effort or thought.
Repeatedly writing the code to solve the same programming problem over and over again is exactly the same thing, except unless you are introducing new challenges by adding constraints and twists, you are only benefiting from the exercise the first, and perhaps, the second time, you undertake the activity.
Now, not all programmers who do Code Katas repeat the exact same code over and over again. Some of them attempt to solve the same problem, but this time not using any loops or limited the line count to a certain number or some other similar constraint. This kind of practice is actual worthwhile practice which challenges the mind and introduces new scenarios that create new neural pathways in the brain and strengthen others. (Here is a great example of book that encourages you to do just that. I highly recommend working through the problems in this book.)
Simply typing the same code into the same IDE over and over again for 10 minutes a day may make you feel relaxed and calm or even like a concert violinist arduously practicing their scales, but at the very best it will make you faster at using your IDE and typing code; skills which can be easily practiced through the course of a normal day’s work. If you want to be really good at writing the code to sort lists of words and calculate prices for grocery store items in a cart, go ahead, be my guest.
How real mastery is achieved
If you are resisting what I am saying at this point, it is likely because you still mistakenly believe that walking and driving are in a different category than playing music, sports and programming. But, the truth of the matter is that walking, running, music, sports, and programming are in the same category, or rather, there are no categories.
It turns out there are actually master walker and master drivers. One sport that is not all that widely known goes by the name of Parkour or Freerunning. Don’t believe me, check out this video for an example. In this sport, the athlete becomes exceptionally good at traversing around everyday locations on their own two feet. It is amazing what some of these practitioners can do—just watch the video if you don’t believe me.
And as for driving, I probably don’t need to convince you that Nascar is “kind of a big deal.”
My point is that you are not going to become a Parkour expert or Nascar driver by just walking around your neighborhood or driving your car to and from work, even if you do tend to drive like a bat out of hell. To get to that level of skill in those seemingly mundane activities, you have to constantly practice at a higher level of difficulty and continually introduce new challenges.
In fact, when we actually look at what real musicians and sports athletes do, it is much of the same. I seriously doubt many musicians you hear on the radio or see in concert repeatedly played “bah bah black sheep” or “twinkle twinkle little star” on their instruments until one day they achieved mastery. And in the professional sports world, achievement only comes through repeatedly pushing beyond one’s limits day after day.
The point is this: if you want to get better at something, repeating practice alone is not enough. You must practice with increased difficulty and challenge.
How to improve your programming skills
So, how then do you become a master craftsman at the vocation of software development? If you don’t use Code Katas, how do you practice your craft?
Let me start off by giving you the best example I have ever seen.
This is Jennifer Dewalt’s blog; she decided to learn to code by building 180 websites in 180 days. While you are sitting at your keyboard typing the same 20 lines of code into your IDE over and over again, Jennifer is creating a new thing every single day and facing a brand new challenge.
Who do you think will improve their skills more after 180 days, you or Jennifer? I know who I’d hire without even thinking twice.
I get lots of emails asking me about the best way to learn programming or how someone can improve their skills. Recently, I’ve gotten a lot of emails asking about how to learn Android development. Do you know what I tell all these inquisitive minds?
Make Android apps.
But, umm, what book can I read?
No book, just come up with an idea and try to create it. Figure out what you need to do along the way. When you get stuck, go look for the answer or seek help.
But, I need to know what I am doing first.
Says who? Do and then learn. Learn and do at the same time, reading a book or repeating the same exercise over and over again won’t make you smarter or more skillful; constantly challenging your mind and current skills will.
Want to learn more?
I’ve got plenty more to say on the topic and many more techniques that are way more effective then Code Katas which you can use to hone your programming skills. I can’t fit it into a single post like this, but I’ll be putting it into the top secret project I am working on to help developers boost their careers and learn to market themselves.
If you’d like to be one of the first to be notified when it is available, sign up here. I’ll be including lots of practical valuable information that you probably won’t find anywhere else.
So, what do you think? Do you do Code Katas right now? If so, do you think they are actually useful? Let me know in the comments below.
With the vast array of technology, language and platform choices available today, it can be very difficult to figure out where to best invest time in training your skills as a software developer.
I’m often asked advice on how to be a better programmer.
Most often the question someone asks is based on whether or not they should invest their time in a particular programming language or technology versus another.
I’ve been giving this quite a bit of thought lately and I’ve come up with what I think are the most important and timeless skills that a software developer can attain which will give them the best career opportunities and make them the most effective.
Skill 1: Solving Problems
I’ve talked about the need to learn how to solve problems before and I’ve even given some steps of how to learn to solve problems, because I believe this skill is critical to any software developer.
Software development is 100% about solving problems.
Without problems there wouldn’t be a need for software.
All software is designed to solve some user problem and within that general solution is a wide array of smaller problems that make it up.
It really doesn’t matter what programming language or technology you use, if you can’t solve problems, you won’t be very good at developing software.
It is amazing how bad most developers are at solving problems.
I constantly hear complaints about job interviews that are too hard because they ask the developer to solve some difficult problem.
I’ve talked about why hard interviews are good and part of the reason is because they test a developer’s ability to solve problems.
I know that many developers still disagree with me about this point and don’t see why a site like TopCoder would improve their development skills so much, but I know from personal experience that it was the practice of solving problems on TopCoder that was the turning point in my career.
Think about a carpenter. If you want be a successful carpenter, you should probably be good at cutting wood. You should probably have practiced doing all kinds of cuts and using many different tools to cut wood.
It doesn’t matter how many years experience in carpentry you have had or how well you can design furniture or cabinetry if every time you try to cut wood you struggle with making the cuts.
Cutting wood is a base skill of carpentry, just like problem solving is the base skill of software development.
Skill 2: Teaching Yourself
There is probably no more important skill in life than learning to learn.
This skill is especially important in software development, because no field I know of changes more rapidly than software development.
You can’t know everything about everything. You can’t even really invest the time it takes to be a master of one particular framework or technology—things are moving way too fast!
Instead you need the ability to quickly acquire the knowledge you need for the task at hand.
If you truly want to have a skill that will propel you through your software development career, learn how to teach yourself.
The only way to develop this skill is to put it into use. Go out and learn a new programming language or technology, even if you think you’ll never use it. You’ll be surprised how quickly you may be able to pick it up because of the foundation you will already have in what you know.
If you can quickly adapt to the rapidly changing software development market and technologies and platforms associated with it, you will have skills that will always be in demand.
Although I am a bit skeptical of some of Tim Ferris’s claims, he has an excellent book called the 4-Hour Chef which has some great techniques about how to learn things rapidly. (I was wanting to write a book about this very subject.)
Skill 3: Naming
When people ask me what I do all day, I mostly say “read things other people name and name things.”
Ok, no one really asks me that and I wouldn’t really answer it that way, but I certainly could.
Software development is all about describing the metaphysical. Most of what we are building can’t be seen.
We have to construct in our minds an entire world with authorization managers taking authorization requests and spitting out authorization response alongside user repositories using user factories to assemble new users.
Every time you are writing code you are naming things. When you read code that you or someone else has written, you are gaining most of your understanding about that code from the names of things in that code.
Most of the time I can accurately predict a developer’s skill level by looking at how they have named methods, variables and classes in code they have written.
A developer who lacks the ability to give good names to concepts and data in their code is like a mute translator. It doesn’t matter if you can understand something, if you can’t adequately explain it, the moment it leaves your head it is gone.
The best way to improve this skill is to always put it into practice. I’ll often rename things in code I am just reading to get an understanding. As I start to understand what a method is doing, I’ll change the name to match that understanding. I’ll do this while I am reading the code, not even making any logic changes to it.
The more you focus on giving good names to things, the better at it you will become.
This is also the most visible thing about your code. It is hard to know if your code is correct or efficient by looking at it, but if I read it and can understand it, I am going to assume you know what you are doing.
Skill 4: Dealing with People
I list this as last, but in many cases you could say it is the first or most important skill.
Everywhere you go there are people.
Unless you work alone and develop software just for yourself, other people are going to influence your career as a software developer.
I’ve talked about why you might not want to criticize someone else before, but there is much more to dealing with people than not pissing them off.
I always go back to the famous book by Dale Carnegie, “How to Win Friends and Influence People,” because this book is so important in learning how to be a successful human being.
I’ve said it before, but if you want to develop people skills, read this book!
The basic problem is that humans are not logical creatures, we are emotional ones. Sure, we like to pride ourselves on our ability to reason, but the reality is that most decisions we make are more influenced by emotion than reason.
What this means for you as a software developer is that unless you can effectively deal with other developers, managers, and even customers, you will constantly face trouble despite how good your ideas are or how valuable your skills are.
Being active and involved in the software development community in general can also help you immensely in your career. It is not just about networking, but getting your name out there and building good Karma.
Doing this successfully hinges directly on your ability to deal with people. (Want to take a big shortcut in learning how to deal with people? It’s simple. Be nice!)
What about practical skills?
Notice I didn’t include anything in my list about a particular technology or even as broad a skill as web development or mobile development?
It is certainly important to have a solid foundation in a couple of technology areas, but what those areas are is not nearly as important as the 4 skills I mention above.
If you can solve problems, learn things quickly, name things well and deal with people, you will have a much greater level of success in the long run than you will in specializing in any particular technology.
With that said, of course it is important to thoroughly learn a programming language or two and to have a general area of specialization, but as long as you don’t go too far off the beaten path with those choices and you focus on these 4 important skills, you will be ok. (You could even learn C++ )
Quick side note: if you are stopping here reading this post, you are probably the kind of developer that cares about your career. I’m putting together a complete package full of information on how to really boost you software development career and increase your earning potential. It is only available for preorder right now. I’m only going to be selling it at this heavily discounted price for a short time. I’ll also have some exclusive interview with famous software developers like Bob Martin, Jon Skeet, and Jeff Atwood sharing their secrets to their success.
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.