Everyone Should Learn To Program, But Not Everyone Should Be A Programmer

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.

programmer

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.

APIs everywhere!

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.

Nokids_computert only that, but we need to start integrating programming concepts into learning these other subjects.

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.

If you like this post don’t forget to Follow @jsonmez or subscribe to my RSS feed.

The More I Know, the Less I Know

I used to be very confident in my abilities as a software developer.

I used to be able to walk up to a group of software developers and tell them exactly what they were doing wrong and exactly what was the “right” way to do things.

I used to be sure of this myself.

Young Boy

It wasn’t even that long ago.  Heck, when I look at the blog posts I wrote 3 years ago I have to slap myself upside my head in realization of just how stupid I was.

Not only was my writing bad, but some of my thoughts seem so immature and uneducated that it feels like a completely different person wrote them.

And I wrote those posts back when I knew it all.

The more I learn, the less I know

Lately I’ve been running into situations more and more often where I don’t have a good answer for problems.

I’ve found myself much more often giving 3 pieces of advice attached with pros and cons rather than giving a single absolute—like I would have done perhaps 3 years ago.

I’ve been finding as I have been learning more and more (the past 3 years have been an accelerated pace of growth for me,) that I am becoming less and less sure of what I know and more and more convinced that there is no such thing as a set of best practices.

I’ve even spent some time postulating on whether or not commonly held beliefs of best practices would be thrown completely out the window given a significant enough motivation to succeed.

My point is that the more doors I open, the more aware I become of the multitude of doors that exist.

doors

It is not just the realization of what I don’t know, but also the realization of weakness of the foundation I am already standing on.

Taking it out of the meta-physical

Let’s drop down out of the philosophical discussion for a bit and talk about a real example.

Perhaps the biggest quandary I struggle with is whether or not to unit test or practice TDD and its variants.

The 3 years ago know-it-all version of me would tell you emphatically “yes, it is a best practice and you should definitely do it all the time.”

The more pragmatic version of me today says, in a much more uncertain tone, “perhaps.”

I don’t want to delve into the topic in this post since I am sure I could write volumes on my ponderings in this area, but I’ve come to a conclusion that it makes sense to write unit tests for code that has few or no dependencies and that it does not make sense to do so for other code.

From that I’ve also derived that I should strive to write code that separates algorithms from coordinators.

I still even feel today that my advice is not wholly sound.  I am convinced it is a better approach than 100% TDD and units tests, or no TDD and unit tests, but I am not convinced there isn’t a deeper understanding and truth that supersedes my current thoughts on the matter.

As you can imagine this is quite frustrating and unsettling.

Silver bullets and best practices

What I am coming to realize more and more is that there are no silver bullets and more surprisingly there are not even any such things as best practices.

silverbullet

Now I’ve heard the adage of there being no silver bullets so many times that it makes me physically sick when I hear someone say it, because it is so cliché.

But, I’ve had a hard time swallowing the no best practices pill.

I feel like when I abandon this ship then I am sailing on my life raft in the middle of a vast ocean with no sails and no sense of what direction to go.

A corner-stone of my development career has been in the learning, applying and teaching of best practices.  If these things don’t exist, have I just been pedaling snake oil and drinking it myself?

No.

Best practices are simply concrete applications of abstract principles in software development that we cannot directly grasp or see clearly enough to absolutely identify.

Breaking this down a bit, what I am saying is that best practices are not the things themselves to seek, but through the pursuit of best practices we can arrive at a better understanding of the principles that actually are unchanging and absolute.

Best practices are optimal strategies for dealing with the problems of software development based on a particular context.  That context is primarily defined by:

  • Language and technology choice
  • Meta-game (what other software developers and perceived best practices are generally in place and how software development is viewed and understood at a given time.)
  • Individual skill and growth (what keeps me straight might slow you down; depends on where you are in your journey.)

There is a gentle balance between process and pragmatism.

When you decide to make your cuts without the cutting guide, it can make you go faster, but only if you know exactly what you are doing.

Where I am now

Every time I open my mouth I feel like I am spewing a bunch of bull crap.

I don’t trust half of what I say, because I know so much of it is wrong.

Yet I have perhaps 10 times more knowledge and quite a bit more experience in regards to software development than I did just 3 years ago.

So what gives?

Overall, I think I am giving better advice based on more practical experience and knowledge, it is just that I am far more aware of my own short-comings and how stupid I am even today.

I have the curse and blessing of knowing that only half of what I am saying has any merit and the other half is utter crap.

Much of this stems from the realization that there are no absolute right ways to do things and best answers for many of the problems of software development.

I used to be under the impression that someone out there had the answer to the question of what is the right way to develop software.

clues

I used to think that I was picking up bit of knowledge, clues, that were unraveling the mystery of software development.  That someday I would have all the pieces of understanding and tell others exactly how they should be developing software.

What I found instead was that not only does nobody know the “right” way to develop software, but that it is perhaps an unknowable truth.

The best we can do is try to learn from obvious mistakes we have made before, start with a process that has had some level of success, and modify what we do based on our observations.

We can’t even accurately measure anything about software development and to think we can is just foolishness.

From story points, to velocity, to lines of code per defect and so on and so forth, all of those things are not only impossible to accurately measure, but they don’t really tell us if we are doing better or not.

So, what is my point?

My point is simple.

I have learned that not only do I not have all the answers, but I never will.

What I have learned is always subject for debate and is very rarely absolute, so I should have strong convictions, but hold onto them loosely.

And most importantly, don’t be deceived into thinking there is a right way to develop software that can be known.  You can improve the way you develop software and your software development skills, but it will never be based on an absolute set of rules that come down from some magical process or technology.

If you like this post don’t forget to or subscribe to my RSS feed.

The 4 Most Important Skills for a Software Developer

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

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

learining

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

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

dealing

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++ Winking smile)

Why C++ Is Not “Back”

I love C++.

C++ taught me how to really write code.

Back in the day I would study the intricacies of the language, Standard Template Library, and all the nuances of memory management and pointer arithmetic.

Those were some seriously good times.  I remember reading Scott Meyers Effective C++ book series over and over again.  Each time I would learn something new or grasp more of how to use C++.

I’m saying all this just to let you know that I don’t hate C++.  I love C++.

There are plenty of excellent developers I know today that still use C++ and teach others how to use it and there is nothing at all wrong with that.

So what is the problem then?

The new message is wrong

C++11 just came out recently and it seems like there is this big resurgence in interest in C++ development.

announcer

Now don’t get me wrong.  C++11 is fantastic!  I am in just about 100% agreement with all of the changes that have been made.  C++ has definitely become much easier to use and it has even become more powerful.

There is one thing it didn’t become though—and this is the most important—more simple.

It seems that many of the seasoned developers have forgotten why we stopped using C++ and moved on to Java, C# and other modern languages.

Many younger or newer developers don’t really know the history and are getting confused by the current C++ message and resurgence.

Everyone keeps asking me if they need to learn C++, but just like my answer was a few years ago, it is the same today—NO!

Ok, so “NO” in caps is a bit harsh.  A better answer is “why?”

Why do you want to learn C++?

There are only about three sensible reasons to learn C++ today that I can think of.

  • You absolutely need to eke out every bit of performance possible out of your software and you would like to do that with a language that will support OO abstractions.
  • You are writing code which will directly interface with raw hardware.  (Example: you are writing a low level driver.)
  • Memory control and timing is of absolute importance, so you must have completely deterministic behavior in your system and the ability to manually manage memory.  (Think real time embedded operating system controlling a moving piece of machinery.)

Now it is possible I missed a valid case, but chances are any other case is going to roughly fall into one of these three categories.

Wait! Wait!  What about portability?

banghead

No!  Please don’t learn C++ thinking that you will build software to work anywhere.  There are plenty of other options today for doing that and C++ is not nearly as portable as many people believe or tout.  The lower level the abstraction is the more different each operating system and platform is.

Also please don’t tell me C++ gives you more power and control to do exactly what you need.

Most software development is about managing complexity not about being able to twiddle bits at a lower level.  In almost all cases of modern large scale software development, higher abstractions, not lower abstractions, are what you want.

But, I want to learn C++ anyway

Ok look, I know you think Windows 8 is cool and all the cool kids are learning C++ to write their Windows 8 applications, but you should know what is in the Kool-aid before you drink it.

Writing C++ code is not a picnic.

Even with all the changes in C++11, C++ is still a very difficult language to learn and an even more difficult one to master.

You’ve probably heard this common quote about C++:

C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, you blow away your whole leg!
— Bjarne Stroustrup

gun

And if you don’t know who Bjarne is, well,  he invented C++.  So if he says that about the language, I am sure you can draw your own conclusions.

I keep hearing that C++11 makes things so much easier now and that C++11 has fixed many of the problems of C++98.  I don’t doubt that it has.

What it hasn’t fixed is the size and scope of the language—it has actually increased it.

Sure, you can use a subset of C++.  Sure, you can use smart pointers in the new C++ to prevent you from having to manually manage memory.  You can utilize lambda expressions to declare functions in-line instead of passing function pointers.  Automatic type deduction is a much needed breath of fresh air.

The problem is you still have to know the old way of doing everything and you have to understand exactly what is really going on when you are debugging a C++ program which is easily capable of stomping memory (something you probably have never even heard of if you were born in a managed code world.)

You will encounter C++ code from 20 years ago and it will look like a different language entirely.

Here is a list of actual interview questions that I used to ask C++ developers interviewing for a job I was hiring for.

  1. How many ways are there to initialize a primitive data type in C++ and what are they?
  2. Why should you declare a destructor as virtual?
  3. What does it mean that C++ supports overloading?
  4. What are examples of overloading in C++?
  5. What is name mangling in C++ and why is it used?
  6. What is an abstract base class?
  7. What is RTTI?
  8. How can you access a variable that is “hidden” by another variable of the same name?
  9. What is a namespace and how is it used.
  10. What are the differences between a class and a struct in C++, and how does this compare to C?
  11. What are templates? How are they used?
  12. What is a copy constructor and when is it used, especially in comparison to the equal operator.
  13. What is the difference between a “shallow” and a “deep” copy?
  14. What is the const operator and how is it used?
  15. What are the differences between passing by reference, passing by value, and passing by pointer in C++?
  16. When is it and when is it not a good idea to return a value by reference in C++?
  17. What is the difference between a variable created on the stack and one created on the heap?
  18. How do you free memory allocated dynamically for an array? What are the implications of just using delete?
  19. What is multiple inheritance? When should it be used?
  20. What is a pure virtual function?
  21. What does the keyword mutable do?
  22. What does the keyword volatile do?
  23. What is the STL?
  24. What is a Vector?
  25. What is contained in the <algorithms> header?
  26. What is the difference between #include <iostream.h> and #include <iostream>?
  27. What’s the difference between “++i” and “i++”?
  28. What is short circuit evaluation? How can it be used? Why can is be dangerous?
  29. What is the ‘,’ operator?
  30. What is the only ternary operator? How is it used?
  31. What is the use of a const member function and how can it be used?
  32. How is try/catch used in C++?
  33. Why should you never throw an exception in a destructor?
  34. What is the explicit keyword?
  35. What is the proper way to perform a cast in C++?
  36. What does inline do?

Some of these questions have the same answers for C# or Java, but you can see from this list that C++ is very, very deep.  There is just a very large amount to know about the language itself.

C# and Java development are somewhat about learning the language, but much more about learning the libraries.

C++ development is more about learning every nook and cranny of the language.

C++ is the wrong direction for the future

The big problem is that programming languages really need to get simpler and increase the level of abstraction not reduce it.

There will always be a need for low level code, but a majority of the code that we write today is at a much higher level.

I first jumped off the C++ ship many years ago when I finally could no longer make the argument that I could develop apps faster in C++ than C#.

I held out for a long time trying to believe that all the investment I had made in C++ was not lost, but it turned out that C# simplified things to such a great degree that the extra power C++ gave me was not worth the extra responsibility.

Just as I was taking a break from writing this blog post, I happened to stumble across a newrevitalized project from Microsoft Research called touchdevelop.  This is the direction we need to go.  We need programming languages to be even simpler to use, not more complex.

Now don’t get me wrong, you are pretty severely constrained in touchdevelop, but I believe something similar to this is the future.

It seems that Microsoft is making a decent push for bringing C++ back to mainstream with C++ support in Window 8 and attempting to kill XNA, but I think there is a warped perception of the development community that seems to be entrenched in the minds of Windows OS developers about programmers wanting to use C++.

I just don’t ever see myself moving back to a more difficult language when I can write C# on just about every platform now.  C# is not the perfect language, but it is very elegant and simple.

Some parting words about C++

With all I said above, I still believe that there is some value in learning C++.

No, I’m not trying to contradict myself here.  Allow me to explain.

If you can program in C++, you can program in any programming language.  If you understand how stack and heap memory work, pointers and references and all the low level details that make C++ so tricky, it will help you when you are working at higher abstractions and in understanding how computers work in general.

My point of this post is not to bash C++ or bash people using C++ or teaching C++, but rather to blunt the message that seems to be being preached by an over eager C++ community.

Everyone is not going to become a C++ developer and they shouldn’t need to be.  While C++ may have the ability to make your program more efficient (in certain scenarios,) it is extremely unlikely to make you more efficient at creating your program (except in some extreme cases.)

So, I am glad C++ got a much needed overhaul, but I don’t think it is going to make a comeback any time soon, and that is a good thing.

You’re Only a Beginner Once

I was reading an interesting study last week about how willpower seems to grow like a muscle.  In the study they had found that subjects that had successfully stuck to a diet program performed better in many other areas of their life as well.

This study seemed to indicate that by having success in one area of life requiring willpower that a person would gain benefits in other willpower related areas of life such as working out, controlling temper, studying and/or working.

Basically as people trained their willpower it grew in capacity.

This study got me thinking about how all kinds of seemingly unrelated skills tend to aid us in tasks that don’t directly use them.

Digging a little deeper

digging

So what do I mean by this?

I mean that if you learn C#, you will be able to learn Java faster.  Essentially you’ll never have to be a beginner at Java.

Now that might not be any big revelation to you.  The languages are pretty close already in syntax, but I have found this principal extends much further than that.

In the years that I have been doing software development I’ve had the opportunity to work with many developers who started out their careers in totally unrelated fields.

I found that many of those developers who had significant experience in another field, but then switched to software development, very quickly acquired the skills required to become successful in software development.

I found that within about 3 years, many of those developers had the skill and knowledge equivalence of a developer that might have been in the field for 10 or more years.

Everything is the same

I’ve always been surprised by this phenomenon, but never really thought about why this was true.

I’ve worked with many different programming languages, technologies and platforms and I’ve made a pretty good study of other fields like real estate investment and options trading.  I’m constantly finding skills and knowledge I acquired in one area of interest are boosting my abilities in other areas and I finally think I know why.

There really isn’t that much variation in the very basic principles of reality.  Essentially everything fits into a handful of molds at a very fundamental level.

molds

The same kind of basic principles that define the pricing of options contracts on securities like stocks are the same basic principles that define the trade-off between time, scope and quality in software development.

At a deeper even more fundamental level you could say that a person that has learned how to work within and understand the relationships between constraints will find that skill is unconsciously applied to a thousand other areas of life which also have defined and real constraints.

Of course in software development itself we recognize many of these similarities as patterns.  What most developers don’t realize though is that patterns are natural emergences of ways to solve problems that organically occur in some form or other.  The book on patterns just formalizes these patterns.

If you’ve ever heard the term Polymath before (basically a master of multiple skills or areas of study), this tends to explain why Polymaths like Leonardo da Vinci and Michelangelo were able to accomplish so much in so many areas.

Knowing what you don’t know

Another major reason why you are only a beginner once is because once you’ve been a beginner you have a better idea of what you don’t know.

question

When you start out as a beginner in something one of the biggest hurdles to success is finding out what you need to learn.  (Which is why I often recommend starting off by scoping a subject.) 

If you were just starting out in programming and had no prior experience in with any type of related skill, you wouldn’t know to ask what kind of looping structures are available in C#, because you wouldn’t even know to ask that question.

On the other hand, if you have experience in just one programming language, you will have a whole array of questions which you can ask about that language, because you can relate it to concepts you already understand.  Often when I teach, I try to do exactly that.  I try to find something that I think you are already familiar with and relate the new concept to a well understood domain.

If you’ve learned quite a few different technologies and programming platforms, when you try to learn a new one, you’ll know what you don’t know and that will make the whole learning process much quicker.

What this means to you and me

As software developers this is great news, because the world of technology just keeps getting bigger and bigger.

It is very difficult to keep up with all the different technologies that are constantly coming out every year—it is an almost impossible task.

But fortunately we can apply this principle to our craft and realize that skills we acquire in one area of software development will help us to never have to be a beginner in other technologies and development platforms.

The key to unlocking this potential is twofold.

  1. Push through the surface to see the similarities.  Often starting out with a new technology everything seems new, but I’ve found that if you don’t give up, and you push a little further you end up in familiar territory.
  2. Constantly make the shift between technologies in order to maximize the benefit.  I’ve also found that shifting between technologies and even development languages tends to help us to unlock the ability to see things at a more fundamental level.  Think about the inductive reasoning where you might start out with 1 instance of a thing, then 2, then 3, then you generalize to n.

This is why it is so important to learn how to learn.  The more you learn, the easier to becomes to learn and the more synergistic the skills you acquire become.

So if you’ve been afraid to dive into a new technology because you are either afraid that you won’t be able to learn it quickly enough or that it will be a waste of time because it is unrelated to technologies you actually use, don’t be.  Instead try to remember that even though something new might be intimidating at first, you’ll most likely have a head start, because you are only a beginner once.

Why My Kid is an iKid

Sophia got her first introduction to the iPad at about 3 months old.

As soon as she could sit in a rocker chair my wife and I let her start playing on the iPad. 

002

We started off with just one game, Interactive Alphabet by Piikea.  It is basically a game that goes through the Alphabet and lets the baby interact with some of the pictures.

We added a few more ABC type of games as she got a bit older, but we mainly just let her play with that one game, because we figured it would be great to let her start seeing letters and learning the alphabet as early as possible.

Right from the get-go she would swat at the screen.  She didn’t immediately understand the cause and effect, but she quickly grasped the idea that when she hit the screen, something would happen.

After a while she became pretty good at being able to do the simple things in the ABC game.  She would still swat the screen, but purposefully swat certain areas in order to do something like build a sandcastle.

Around 12 months, we started adding a bunch more apps.  We added some interactive books and a couple of simple games.

IMG_4492

Sophia was learning how to do many more things in the apps.  She could point with a couple of fingers and very purposefully touch certain areas of the screen. 

She really didn’t have any concept of touching and dragging though, and would often run into problems of having one hand leaning on the iPad which was causing the other hand’s touches not to register.

She’s now 18 months and she is an iPad master.

IMG_6639

Sophia can now:

  • Turn on the iPad
  • Unlock the iPad
  • Pick which app she wants to play out of her folders
  • Use the home button to exit an app
  • Double press the home button to switch to a recent app
  • Navigate through menus in apps and get back to the app
  • Use the table of contents in books to pick the page she wants

She also asks for the iPad by name.  She has about 40 apps on the iPad that she subsumed from my wife.  It seems like she is learning something new every day now.

The world is changing

Our children, especially the youngest ones, are growing up in an entirely different world than has existed ever before.

Binary world

I know this has been said many times before and it could be argued that my generation also grew up in an entirely different world than my parents, but I think the change we are seeing now is much more substantial.

I predict that this generation will be known as the tablet generation.  With Windows 8 now released we are going to see a rapid decline of non-touch devices.  In a few years all laptops will be touch screen retina displays.

There are some fundamental changes going on in how we interact with computers and even what defines a computer.

Yes, I know you’ve heard all this before, but why is this important?

It is important because the real shift I see is the shift between a primarily analog focused world view to a primarily digital focused world view.

For me the iPad or the computer is an attempt to replicate some process or experience in the real world.  No matter how long I work with computers or use these devices, I cannot escape my world view.  Analog always comes first.

For our children things are different.

I can’t say for sure that picking up a pencil and being able to write is a skill that will even be necessary.

It is very likely that this coming generation will view things through the digital lens first and the analog world will be secondary.

I don’t mean they’ll be jacked into computer all day and live in a virtual world, but I do think that while we try to relate software to tangible things the coming generation is likely to view software as the primary and tangible objects as secondary.

Think about music.  Ever had an 8Track?  How about a cassette tape? CD anyone?

How do we think of music today?  One word comes to mind—MP3.

What started out as a physical record eventually lost its purpose and is now so heavily digital that we tend to think in terms of the digital and don’t even consider the tangible anymore.

The same thing is currently happening with books, movies and to some degree money.

Why we let Sophia be an iKid

With the changing world, computer literacy is more important than ever before.

Even in the world we live in now, it is just about impossible to get any kind of non-labor intensive job without being able to use a computer.

If computer literacy is arguably going to be the most important skill for anyone to have in the future, why not start as young as they start to show an interest?

I think it is a huge asset to develop in our children the ability to use a computer as easily and mindlessly as the ability to eat with a fork and a spoon.

I wish I had that ability. I could be so much more efficient if I would stop writing down lists on pieces of paper and instead pull up my iPad or other tablet to jot down ideas and completely replace paper in my life.

And sure I could learn to wean myself off of the analog world, but I want my daughter to be able to think first in the digital world.  She’ll be way more efficient and see things from a better perspective than I ever will.

Aside from that, my wife and I find that the iPad is an excellent learning tool to help Sophia learn to learn.

There are so many things she is able to teach herself using that iPad.

She already:

  • Has a vocabulary of over 100 words
  • Can count to 4 in order and count actual objects
  • Can say most of her ABCs
  • Can recognize most letters
  • Can name many animals and objects

abc

Much of what she knows she learned at her own pace based on what she was interested in playing on the iPad.

For example, one week she’ll be playing many of the numbers apps.  For a whole month she just wanted to do alphabets.

The iPad gives her the freedom to be able to choose what she wants to learn and to do it effortlessly.  She is developing the skills to be able to self-educate.  Sure, we still read books to her and try to teach her, but she seems to get a large amount of her knowledge from what she learns playing on the iPad.  (At least the reinforcement of what she has learned.)

Overall I don’t think there is any reason to stop her from playing on the iPad.  I know some people equate it to TV, but I think it is fundamentally different.  The apps she plays on the iPad are interactive.  You can’t mindlessly sit and watch the iPad.  Instead, there is a constant feedback loop that is not present with TV.

Also we can carefully monitor the apps she uses.  The TV is an open system that brings unknown content into your house, where the iPad can be used as more of a closed system.

To summarize, I think we are preparing her for the future and giving her a huge head start in life.

How to get started

So you may be wondering how to best go about getting your baby or toddler started with the iPad.

While I’m not a child development expert, I can give you some advice from what my wife and I have learned in this process.

I’d start by picking up a used first generation iPad and a good case.

You can of course get a newer iPad or even another tablet, or the iPad mini, but just be aware of two things.

  1. Babies don’t have very precise coordination with their hands so small screen are going to be hard for them to use.
  2. Babies tend to throw things, especially when they get frustrated.

The next thing you need is apps.  My wife, Heather, wrote up this section for me.  So, if you notice the grammar is perfect and is written with a much higher skill level than my usual writing, that is why.

(Please let me know if you have some other ones appropriate for the ages.  I’d like to make a nice resource for other iKid believers.)

3 Months – 12 Months

  • Interactive Alphabet by Piikea.  This is by far the best app I’ve seen for the youngest of kids. It has a baby mode which prevents babies from exiting by accidentally batting a menu button and most of the items respond to simple taps or swipes.
  • Juno’s Musical ABCs by Juno Baby.  This app also goes through the alphabet but with a musical theme. The interactions aren’t as neat as the Piikea app and the button to return to the menu is prominent and easily pressed.
  • Peekaboo Baby. This is my app.  Warning, it is very simple.  I was learning MonoTouch and wrote it in a day as an experiment.

12 Months to 18 Months

  • Seuss ABC, Green Eggs These stories have autoplay, read to me, or self-reading features and will say the word of anything the child touches on the screen. There is actually an entire line of the Dr. Seuss books, but I prefer these two. The ABC app is great because each letter is said multiple times. The Green Eggs app is my daughter’s favorite, and I suspect this is because so many of the words in this story (eggs, boat, house, mouse, car, train, etc.) are ones most 18 month olds know. These books are a little long so if you’re more interested in the stories, go with the Bright and Early Board Books instead of these apps. The Mercer Mayer, Little Critter books are also available and tend to be shorter in length.
  • I Hear Ewe This neat little app has three screens of picture tiles: two of animals, one of vehicles. When touched it says: "this is the sound a [insert animal or vehicle here] makes:" I like this because it doesn’t require page navigation. A child can sit and do this for a short period and when they get bored, you can switch the screen for them. Sophia plays this occasionally at 18 months but it doesn’t hold her interest as much, so I suggest trying it at a little younger age.
  • Pat the Bunny by Random House. There is both a paint and interactive option with this app. The paint seems to always crash, most likely due to the mad tapping of a toddler, so I avoid it. The read option has a bunch of items on the screen that kids can interact with (turn off a light, put shave gel on daddy’s face, wave bye bye, play peek a boo, etc.) I’ve never seen the real book, but I wouldn’t be surprised if this app is better than the book. Changing screens is manual and may require adult help. There is an obnoxious Easter egg on every page that brings up the bunny.
  • Princess Baby by Random House. I was actually disappointed there wasn’t more to this app, but Sophia has played it enough that it makes the list. It begins by having you “Choose your favorite princess.” Each princess has 3 toys that can be interacted with in a very limited way: wand, drum, ball, flower, blocks, cat. The princess can be put to bed, which Sophia likes doing over and over and over again.

18 Months +

  • A Monster at the end of this book.  Starring your lovable, furry pal Grover from Sesame Street, this app has a very cute storyline. In order to advance through the book certain tasks, such as touching knots to untie the page or knocking down bricks must be performed. This is another one where the app may be better than the book itself. One bonus: the pages are locked when Grover is talking, which keeps an eager toddler from advancing through too quickly. My daughter loved this book earlier on but I had to help her with some of the action pages and it was just recently that she started doing it all on her own.
  • Another Monster at the end of this book.  Starring Grover and Elmo, some of the tasks are a little trickier than the first book (matching colors, wiping away glue), but did I mention it has Elmo?
  • Little Fox by GoodBeans. This is one of my favorite apps. It has 3 different songs to choose from and each has its own scene: London Bridge is Falling Down, Old MacDonald, and The Evening Song. Each scene is cleverly interactive and entertaining. Old Mac Donald has 4 seasons to select from and the interactions change based on the season. There is also a little "fox studio" with a ton of interactive objects used to make music.
  • Nighty Night by GoodBeans.  Adorable. The animals at the farm house need to go to sleep. This is done by clicking on the area each animal resides in and turning off the light. The animals respond to touch. Additional animals can be purchased (2 sets of 3 animals each).
  • Itsy Bitsy Spider by Duck Duck Moose.  Another fantastic app, this may be the one Sophia has clocked the most time with. In order to progress through this app, you must click on the spider. Each time the spider is touched one line of the song is sung and the spider moves. There is a lot to interact with at each spot and one the second time through the song there are decorated eggs the child can collect on the spider’s back. There is a cute little narrator fly that teaches the child about items the child clicks on (i.e clouds, the sun, rainbows).
  • Ewe Can Count.  This is a cute counting game where you count a random number of sheep, horses, apples, etc. There is a learning and a quiz mode.
  • Logic Lite.  This app is great because it teaches the complicated click and drag gesture. The full version has three additional tile sets: Numbers – match dots to the written number, Pictures – match a picture that contains a shape to the shape it contains, and Letters. The letters are great at 18 months, but the other two are too complex.

Your mileage may vary

Having your little one use an iPad might not work out as well as it has for us, so I think it is only fair to disclose some of the circumstances which govern our life that may help to make our experience successful.

  1. My wife is a stay at home mom.  She used to be a techie, but left the digital world to raise our daughter.  I only bring this up, because she interacts with Sophia all day.  If we were putting Sophia in day care, I would be more hesitant to give her the iPad during our interactive time with her.  (But I would probably try to get the day care to let her use it.)
  2. We have almost 0 TV in our house.  I don’t watch any TV at all or movies.  My wife very rarely watches TV and Sophia never does.  I think this is important, because if she were watching TV, I would also be a bit more hesitant to let her play with the iPad as much.
  3. We do LOTS of other activities.  Just about every day of the week she has either swimming, gym class, play date, or something else going on.  My point here is that she gets plenty of outside time, social interaction and physical activity.
  4. Sophia took the to the iPad right away.  We didn’t have to force it on her or even encourage her to use it.  I don’t know if other kids are like this or not, although I suspect most would be.

So doing the same thing my wife and I are doing might not be the best for you family—you’ll have to decide for yourself—but as far as our daughter has been concerned the experience has been overall positive and beneficial.

Learning to Learn

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.

The Key

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.

key

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.

boy.

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.

scope

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.

goal

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.

Finding resources

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.

Pile of Books

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:

  • Books
  • Videos
  • Magazine articles
  • Blogs
  • Podcasts
  • Webpages
  • 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.

skate

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.

Immersion

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.

Skills mastery

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.

thinking

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.