Developing the basics: Programming myself, post fifteen


<< Read the previous post from this series

The Journey of One Thousand Lines of Code.

So that about wraps it up then. It has been quite an adventure discovering the world of computer programming and learning a new skill which I can take on into the future. I am sure that there are parts I could have done better and more efficiently, and I have a whole new respect for dedicated learners who are trying to change their paths in life by learning new skills outside their comfort zone. It is hard, it takes incredible discipline (which has been one of the biggest problems I have had) to dedicate your free time every day to the pursuit of something that will pay off for years to come.

It’s a trap

There are a lot of things to distract you from the goal of learning any new skill. The thing you have to remember is everything is a choice and a decision. If you decide to go on Facebook the whole night, then this is your choice. How you spend your time is your choice, there are some decisions you can make which can have a much better pay off than others and this is what you need to keep in mind. If you are going to do this, it is up to you. Distractions are going to come up, it is how you deal with them that will be the difference between success and failure.

There are a lot of things in life which will get in your way and unfortunately, if you are not dedicated enough, it is very easy to dismiss the practice of a new skill. This goes for everything, coding, learning to play a sport, learning an instrument, even getting better at your job, you can passively go through and you will get experience and learn enough to do a satisfactory job, and after years this experience may even help you to be quite good. But this is the difference between someone who can and someone that does, dedicated practice and learning will put you far beyond the average person doing the same thing as you in your field. With the information that is available to anyone with an Internet connection, there really is very little that can hold you back in your pursuit of knowledge, and the best part, so much of it is available for free.

These tips should help you stay on track:

Make sure it becomes a habit to learn – set aside the hours in the day where you will pursue your goal.

Make sure you have a strong motivation –  From the outset, write down why you are doing this, what it is all for and the impact it will have on your life once you master the skill you are pursuing. Use it as a mantra if you are feeling ‘hmm not today’ so you can reaffirm what this is all for

Make sure everything is on hand – finding yourself just getting a drink, getting a snack, generally procrastinating? Just make sure it is all at hand so you don’t have any excuses not to get started and especially not to stop once you have started.

Make sure you are persistent – even if you can’t do a lot that day, do something, anything toward the goal. If you are having a bad day still try to do something. Being persistent is the secret weapon.

Make sure you get some variety – different learning media keep it all interesting. When it is interesting it is easier to get excited about doing the activity. Also, it can provide new ways to understand and think about it all.

Make sure you are pushing yourself – the harder you work at something the better you will get. Don’t just settle for “kind of knowing”, or giving up on a feature in your project because it seemed too hard, work on it and amaze yourself with what you can do.


How did I do?

Dreyfus model of skill acquisition

There is a popular model for skill acquisition known as the Dreyfus model, which proposes that there are 5 levels to mastery of a skill.

Novice: at this level, you are completely new to the skill and can read about exercises and follow step by step through putting something together. You are not thinking for yourself, really, and without some kind of assistance, you cannot achieve anything outside of the specific exercise. You maybe know some jargon and how the basics work, but you are probably not aware of how they really function in the big scheme of things. In terms of coding, a novice would be able to look at the code and step through what it is doing on a basic level.

Advanced Beginner: advanced beginners have experience in real situations, so they are starting to know how the basics work together to provide a result. So in terms of coding, they would be able to look at the code and understand what is going on there, but more importantly what they can change and improve. If this was, say, a musical instrument, an advanced beginner could probably read a new piece of music and play it and add some little riffs. So at this level, you can do some specific programs and kind of know them by heart.

Competent: this is the stage where you know the code and the different parts of it enough that you can begin to approach new tasks from scratch. You know how it all works together and can break down a problem into its constituents, work out what needs to be done, and work out any gaps you have for knowing how to do something.

Proficient: well, now there are no gaps, you know pretty much everything you need to do something without having to look it up or ask someone. This is a cool level to get to, and you are going to be recognized as knowing your sh… stuff as you know exactly what you are doing.

Expert: You recognize how you can get something done and don’t have to follow any of the normal rules, because you understand enough to know when to break the rules. The only example most people might be able to relate to is the ability to use your own native language. You can probably come up with a word to describe something which perfectly encapsulates it, this is the level of mastery that this level proposes… “The truth is there is no spoon” level mastery.


Skill Level/ Mental Function Novice Advanced Beginner Competent Proficient Expert
Recollection Non-Situational Situational Situational Situational Situational
Recognition Decomposed Decomposed Holistic Holistic Holistic
Decision Analytical Analytical Analytical Intuitive Intuitive
Awareness Monitoring Monitoring Monitoring Monitoring Absorbed


How this looks for me

So now I have some hindsight on the different learning I have taken and can look at it kind of objectively, it is possible to see where some of the resources fit in with the skill acquisition. So first and foremost, let’s start with the resources that are limited to Novice.

Novice – In terms of what only really provides scope within the novice level, I would have to place the Introduction to Python course on Stepik using PyCharm Edu. It is useful to get started with the language and see how it is used and so for this purpose it is perfect, but you will not probably get the practice you need to progress further through to the higher skill levels.

Advanced beginner – Most courses fit into this level. I would put the Head First books here as they will take you through the basics and you will begin exploring and experimenting with some of the features of the language, it will give you a sharp set of situational tools, but the scope of the books does not take you much further in terms of your own project. But that is not to say that the things learned in the books could not be directly applied to the projects you take on.

CS50 is on the top border of this. The lessons cover the novice skill level, but the problem sets put you right at the top of the advanced beginner level. It has the potential too to go through to the competent level if you use the understanding from the course to build a big final project. I would say this course will easily leave you at the top end of the Advanced Beginner level if not further.

Competent – Of all the courses, the one which has the biggest potential to push past the advanced beginner level is the advanced Python course from Stepik and PyCharm Edu. It has plenty of exercises and practice covering a wide variety of different situations and with a lot of elements having to recognize the problem in front of you and come up with a solution to it yourself. I think that after going through this, you will have a proven skill set and enough competency and experience of problem-solving to work on any problem put in front of you. Most of these exercises you have to work through without guidance, and for someone who has not had programming experience before they are definitely challenging and will put you to the test. It makes you recall the lessons learned up to this point to complete them. This means you are getting more practice in recognizing situations and how you can go about solving them and recognizing more patterns in how they are solved too. When you have this mastered, you will be at a competent level.

Proficient and Expert can only really be achieved with projects. Projects are what will push the boundaries past the simple foundations to actually something you could start a career in. The only way to get project experience would be to do tasks and projects for yourself, for example as personal projects or through your work. The more you do and the more diverse the projects, the closer you are going to get to be an expert in the craft you are developing.


How to acquire the skill levels

The way to learn anything, I still think, is to follow a specific series of steps that will be the same for basics and advancing in skill on both the micro and macro scale.

Step 1: Foundations. The first step is actually to learn the basics and the theory about something, so the foundations. This can be done with a book or video or teacher in a classroom. Basically, it is to get to know the fundamentals of how things work; the material I used in the novice section was perfectly suited to this point in the learning cycle.

Step 2: Practice. Use the theory you have learned and put it into practice. By looking through the theory and then applying it to real situations, you deepen the understanding of the concept. This is why the CS50 course is so well adapted. But you really have to take the time to actually go through the problem sets. This is one of the biggest things I would have done differently as I ducked out of the problems sets on most occasions as I couldn’t find the time to get through them making the course probably only about 30% as effective as it could have been. The Stepik Adaptive Python course is another chance to get some good practice in though.

Step 3: Personal projects. To really get skilled, you are going to have to push yourself outside of your comfort zone and the best way of doing this is to take on a project you are interested in. This would be the next step for me if I am going to continue to improve my coding. The best part about it being a personal project is that it can really be about anything you want, you can impose whatever limit you want and just work on making it happen. This is also a great way to fill in skill gaps, as you will likely come across hurdles which require a little work to get over and have to learn about new things to get the project working properly. Also, the benefit of starting a personal project is that you will probably find yourself reaching out and asking for help from more experienced people in the community. This kind of knowledge sharing goes both ways and will give you an outlet to talk about your ideas and discuss and understand things from other people’s experience.

Step 4: Go professional. If you want to be a master of a craft, then you are going to have to spend a lot of time doing it. If you take the 10,000-hour rule as an approximation to mastering a skill, this basically equates to 5 years if you work on the skill 9 to 5 every day. The final way then to become the best at the skill you wish to master is to take an internship or even a job. Performing the skill on a daily basis and being responsible for it will push you to really become very good at it. This is what separates the hobbyists (not hobbits) from the professionals: when your income depends on being good, then you start to become very good very quickly.


What I might have done differently

In terms of the learning materials, I really can’t complain about any of them. There is a reason that people recommend them. I wish I had got to go through the [Learning Python course on Coursera] but I think I have a good foundation now to build on. Time is the biggest issue here, as is the dedication to learning; I think if you really dedicated yourself to this process and didn’t have any distractions like kids being born… busy times at work and a normal life… you could get through everything in about 16 weeks and you would be at a decent level. The hardest part is that all these courses are possible to put down and come back to. The CS50 course has some time pressure put on it, and I think if you tried to keep up with the course in real time, week for week, it would be a good way of getting through the course. Constant work on this really is the only way to properly learn it; I have had weeks off and come back to things after a while and had to approach the Advanced Python after some time out only to find myself completely stuck with the questions. It was only after looking into it a bit that I found the task to be something I had learned an approach to months before, but because of the gap, it was absolutely irretrievable from my memory.

So in terms of how I approached the project, I think the courses were taken in the best order. Even though it was not totally planned this way, it turned out the most logical order for them, taking me from novice to advanced beginner, I still have some work to do before I am really competent and proficient is a distant goal… Expert, I think, would take 5 years or so. So in 6 months to get to a level that I can play about with the code a bit is OK. I have the basis to make a minimum viable product using other people’s tools to build on, so this a totally acceptable level for me to get to in half a year. Though I think it would have been possible to get much further with this with a little bit more work, discipline and commitment.


“What next?” I hear you ask

Well, the process is not finished, not by a long shot. I particularly liked the Head First books so I am going to look at some further technologies with this series. I still have a lot of exercises to get through with the Adaptive Python, and once I have got through it I will go through it again. It is good practice to try and get through these kinds of exercises, especially since I have never had to do anything like this from scratch, and the more I do it the better I get. The goal would be to be able to do the exercises under the time limits they recommend as possible which is usually about 5 minutes. So to get there you need to know your sh… stuff. Otherwise, I will start on some of my own projects, there are a few ideas for things which I think would be fun to create. This is the joy of programming – you can literally create whatever you want… Maybe an AI which will sit down and teach you how to program… hmm.



Everything will be okay in the end. If it is not okay then it is not the end. – The guy from best exotic marigold hotel.