How to improve at programming when your current position doesn’t require it & Online Learning Resources

Have you ever felt like you would like to get better at programming, maybe even get a position involving more programming some day but the fact that you currently don’t really need it at your current position seems to hold you back? This post is for you.

Daily practice is key for improvement

You need daily practice if you actually want to improve. You already need daily practice just to keep your skills sharp during a time where you don’t need to use them. Also, if you don’t even have programming skills yet, you probably are too tired after work to sit down and work on a private programming project.

But you should. Programming is a skill which takes a long time to learn. That is, if you want to reach a decent skill level. This means that you have to start regular practice long before you actually need that skill or need to apply for a job, if possible.

The common advice: Find a starting out project to program in your free time

When I first informed myself on this, the most common advice was to find a cool project and try to program it in your free time. But I found that when you don’t have an idea for such a project which makes complete sense to you, you’re not going to go through with it. Without an acutal, urgent need you probably won’t sit down the amount of hours necessary to actually make progress. At least the great majority of people wouldn’t.

Then I tried setting myself mini-challenges. This was a good idea. But there wasn’t a lot of guidance (obviously). This, in return, was discouraging and wasted a lot of time. Of course, time well spent learning something. But since I am really interested in effective learning, I felt that I was wasting time. Effective learning is always better than just playing around. You need curriculum. At least some. That’s when I found out that there are a lot of competitive programming sites which offer useful short exercises where you can do one per day.

Before that, I had tried all sorts of “Learn programing” sites like SoloLearn, freeCodeCamp, the Enki app, just to name a few of my favourites. But really, I didn’t like them all that much. They went through the syntax of the language and that was it. Like learning the vocabulary of a living language but never using it.

Review of some of the materials out there

Here, I want to share links to all sorts of learn coding sites out there. Of course, it’s not extensive but I think it does cover a good few of the most important ones. And maybe has a bit of a different perspective from most other “here are 30 sites to learn coding for free” blog posts out there.

A constraint for me was that the site had to be completely free of charge. So, for example, DataCamp is a no-go. Although, I have still linked to some pay-sites in case you are interested.

But especially as there are so many pages where you can get a similar service for free, I don’t see why I should pay for one of them, when there are so many alternatives available. If it were really brilliant, I would probably pay for it, in theory. Like HackerRank, I like so much at the moment, that I would probably get access for a one-time payment. But most of those apps and sites ask for monthly payment of up to or even starting at 10€ – that is a crazy amount of money and you already get books starting from 10€. I personally would always put more trust in a book in terms of quality and the hope that there might be a logical progression to the teaching; and thus, rather go for that. Also, I just don’t do monthly subscriptions. They eat so much of your money and mostly, when you sum it all up, are not really worth it. 

Also, the amount of sites (plus all the apps!) out there has become so huge, it’s really a full-time job to check them all. That time might be better invested in just picking one and learning to code. These other sites that I found initially focused more on interview prep for experienced programmers or programming contests, but many of them have actually developped training tracks. They also tend to offer a broader range of subjects than many other very popular sites which focus on web development (“coding”) mainly.

Enki app

I had liked the Enki apps daily workouts, but the learning progression was not stable. They give you a random tutorial every day. This was not very effective and I quickly was through with all of their material. Ergo, the workouts started repeating very quickly.  For more, you would now have to pay monthly for access which I am not willing to do since learning-wise, it is not sooo well done. It was really good for a free site (for a while I used it a lot), but not good enough to be paying for it. Sadly, I have experienced this with most of the sites I have tried (and I have tried quite many).

App-wise, you will just get the Enki review here. I tried probably all the most important apps out there. But mostly, in their way of just explaining the syntax of a language, the progress was slow and it was ineffective for me who already knew most of the syntax. You usually can’t skip much or speed up if you’re getting bored. Still you never get any actual programming done which I found both useless and frustrating. Having tried all the apps and “learn the syntax of XY” (disguised as “Learn programming language XY” which is not the same thing, in my opinion), I now found competitive programming sites to be more what I had been looking for. 

Some of them don’t have all the languages you might want, especially the smaller ones and the web dev focused ones.

 

General-purpose learning sites (video-based, MOOCs, etc.)

Many popular sites (Coursera, Udemy, Udacity, Khan Academy, MOOCS like edx, OpenMIT) are video-based and I don’t personally like that. I prefer interactive sites where you can type your code directly. But well, now you have the links to those resources as well.

Online books or blog tutorials

Even though I have a tutorial blog myself, I personally would not try to learn a programming language from a blog. Sometimes you find useful posts for a specific problem you need to solve, that’s mainly what they are good for. I just think that the available interactive things are cooler for actually getting programming experience as a novice programmer.

Youtube tutorials or channels

Some posts on free “learn coding” resources recommend Youtube tutorials or channels. This is, I think, a valid point if there really is an excellent tutorial video out for exactly what you want. So, if what you want isn’t uncommon, there is likely to be one. Sometimes a 5min video can save you an hour of reading a tutorial. But I find that hardly any channels offer sensible curriculum for a motivated learner, so I’m not sure how much you would get out of it in the long run. That’s why I won’t recommend any here.

Sites just/mostly teaching the syntax of languages

 

Many of them are gamified as well

Sites I really like for practice / or of the type I like (challenge-based)

Learn the language tracks are available on for example: HackerRank, HackerEarth (teaches algorithms).

With Hackerrank, for example, I really like their testcases. They don’t just ask you to write a solution on your own (sites like SoloLearn, Codecademy hardly do that in their regular curriculum), they also provide testcases where, for example, overflow is bound to occur. So with every single test you are reminded to remember that. This is a good reinforcment method in  teaching, I think 😉 Also, have I mentioned that supposedly, the only thing which really works wonders in teaching is getting tested? So forget about what learning type you are (visual, audio-visual-bla, etc.) and become a tester. You can skip some of the testcases of course, but the frequent reminder still works wonders. Also, you can learn from other users good (high-ranked) solutions. Especially in algorithms, it’s really worth checking how more experienced programmers did it. However, these competitive programming platforms do kind of encourage bad programming style (and dirty hacks to improve speed), so be sure to take care of that yourselves. Be persistent disciplined when it comes to using good style! And remember to still work on bigger projects every once in a while, since the daily practice from these sites is just one single function without context.

Learn Catch the Flag / Hacking

Also, if you’re interesed, these are some sites where you can learn CTF (catch the flag), something like competitive ethical hacking.

Other / Tutorial-based

More tutorial-based sites which are useful but not for the kind of rapid learning I recommend:

Resources

Also, check these other posts on free coding resources:

Advertisements

Riding higher waves

At the risk of boring you all with my frequent thoughts on better teaching, I wanted to give you another metaphor on good teaching, inspired by a surfing class I took. To sum it all up, surfing was great fun. But this year, I was a bit unfortunate to get teachers who were a lot worse than the ones I’d had previously. The high waves and the shallow water make for good metaphors for the basics and the advanced topcis I frequently drone on about in my philosophy of teaching well. So, there you go.

The shallows and the high waves

The teachers were over-protective of us in the shallow waters. They helped more than we would have needed help and thereby, didn’t teach us to act independently. I wanted to do so, but it was not encouraged and we weren’t given any instructions on how to catch a wave on our own. They wouldn’t even let us paddle onto the wave ourselves, but rather pushed the board for us. This might seem very nice and thoughtful. At least, that’s how I felt at first.

But then, once we got to the higher waves – waves high enough for me to find them somewhat scary and thus, distract me quite a bit – they hardly helped at all! But since they had been so overprotective with the basics, doing everything for us, I didn’t have a feeling for how to catch a wave on my own. And this doesn’t exactly get any easier when you are panicked by the high waves. The more difficult situation we got thrown into all of a sudden made it difficult to think clearly, let alone grasp a skill on my own which no one had explained to me beforehand. The deep water is not a place to learn the basics. They should have told us those in shallow water. I think this is a very good analogy for teaching since this is exactly what happens in many classes as well. And then the teachers act like you’re an idiot for not being able to figure out the difficult stuff on your own. Because “that’s just what you do and we all had to learn it the hard way”. But really, this means that the teachers are not doing their jobs and there’s no excuse for that. Don’t blame your failings as a teacher on your students! Don’t turn your lack of teaching competence into a ‘character building’ opportunity for your students. This will not make them better people. It makes you a worse person. And a teacher I would fire on the spot if I were in the position to do so.

Don’t excuse your bad teaching as being a ‘character building’ opportunity

This is very apparent in technology classes at technical universities. In the class, you get this ridiculously simple mini example which is so easy that everybody understands it rightaway. Subsequently, teachers go on to over-explain this for 10 minutes. All students, by now, are lured into a false sense of security because the example was easy. Then they set the task for the assigment and it’s 500% more difficult than the example. This, they pretend, is a learning progression. Hint from someone who actually is a qualified teacher and has experience with training with a systematic progression in sports: No, don’t be ridiculous. This is not a progression. A progression challenges you but doesn’t set tasks which are practically impossible to achieve with the basics training provided beforehand. A progressions means setting a challenging, but doable task – not a sink or swim experience. In these programming classes, usually only those survive who had more knowledge beforehand, came from schools where they’d had years of programming practice, or else, they had more advanced friends or relatives who agreed to help them.

This creates the illusion for teachers that the class is actually doable if you’re willing to put in the work. This is a joke. If you pretend to be a teacher whatsoever, your class should be understandable without help from relatives who are experienced programmers! In some of the classes, I even read all the suggested introductory books and 2-3 more but the class was still difficult because you had to look up hundreds of programming libraries and so on. I managed because I worked hard and had some emergency help from more experienced friends. Having to look up stuff is normal in programming, of course. But as a seasoned programmer, you already know what to search for and know where the new information fits into your previous knowledge. A newbie can’t – I repeat – can’t know that. Don’t blame them for your lack of understanding of how learning works!

Maybe it’s a mistake so many people teach at universities who have never gone through teacher’s training. That is not to say that teacher’s training only produces great teachers. We all know that, sadly, it doesn’t. But at least people necessarily have heard about how learning is supposed to work in theory. Having teachers who do not know nor care how learning and teaching is supposed to work should not be allowed. Yet this is the norm at universities. Students are lucky to come across a natural every once in a while. But it is no coincidence self-help gurus stress the importance of mentors: Not to say that you couldn’t learn it on your own. But your results are just going to be a million times better and faster if you happen to come across a good teacher.

Clear instructions for the ‘danger zones’

Danger zones provide excellent opportunities for accelerated learning progress. But especially before being thrown into ‘dangerous situations’ the students are barely qualified to handle at their stage, giving out clear instructions is crucial. With the guidance of a good teacher and very, very clear instructions of what they should or shouldn’t do, treating students to  a difficult challenge will greatly speed up the learning process. If not done well, however, it will be a nightmarish experience which might even end up deterring students from going on with their studies!

Having something like a life line or a safeboat might be enough to circumvent this. Or having more time or trainers to guide students as much as needed. Don’t rush into these situations without carefully planning them. Students need thoughtful teachers who are there to help students when they need it. Maybe even teachers who anticipate pitfalls students are running into because they can’t know themselves due to lack of experience. If you don’t have a lot of means to make this experience as good as possible, use the one most important element: very clear instructions and some abundant background information before you start. It is also important that students understand why certain rules or behaviours are imposed on them or why certain actions might be dangerous. You can always limit the scariness scope of an overly taxing situations by limiting choices and options through clear instructions and rules. Reduce the scope of a problem and you’ll make success much more achieveable.

Another experience from surfing was on this utmost importance of clear instructions, especially with difficult tasks. On a side note, to avoid any confusion: Surfing was a lot of fun overall, not to give a misleading impression, I just wanted to use the opportunity to point out some interesting observations on teaching. Anyway. In the high waves, the teachers hardly took any notice of me at all. As a novice, I had a hard time paddling against the force of the high waves and was constantly being carried away by the current. I was busy remembering where I was and keeping a vague orientation by looking for where the teachers were. Now was the time when I would have needed their help they had so over-abundantly and unnecessarily given to me in the shallows. I didn’t know whether I should just take the next wave I deemed ok (how the hell should I know which wave is ok? But anyway…) or if I should wait for the teacher to make that choice for me, which they had previously done most of the time.

In this difficult situation, however, they made no clear announcement of what I should do and when they took notice of me after I had spent almost 10 minutes paddling against the waves and waiting around for directions from them, both teachers gave me conflicting instructions. They told me to come over to them but my arms were so weak from paddling and the waves had gotten pretty violent, so it wasn’t easy for me to get to them. Then they decided I had drifted off too much and should just carefully get out of the water. I was shocked. Had I just wasted so much of my energy and didn’t even get one wave to ride? The situation had not only drained the physical energy of my arms and the heat out of my body, it had also drained me emotionally since there was no reward for putting in the effort. Afterwards, I sat on the beach resting a little bit and felt that I didn’t really want to get back in at all. I had lost my trust in the teachers. What if they’d let me rot out there in the waves again? I already didn’t have much energy left. Also I didn’t want the emotional blow of having to get back out again without getting one single wave. Maybe I was just tired, cold and stressing about the situation too much. But then again, I think this is exactly how most students feel when taught difficult subjects. They are left alone at sea in conditions nobody prepared them for. 

Just a thought for now 😉

Best,
the Ninja

PS: Oh, and my experience would probably be a starting point of discussion on multiple teachers who are teaching overlapping topics in parallel but contradict themselves. But that’s a topic for another time…

 

Buy me coffee!

If my content has helped you, donate 3€ to buy me coffee. Thanks a lot, I appreciate it!

€3.00

Didactical Reduction, Part II

In my first post on didactical reduction, I argued that reduction of learning materials to meaningslessness can be detrimental, that teachers should trust in their students’ ability to learn and rise to a challenge. In this post I want to discuss ways of reducing complexity which actually makes sense. The gist is: reduce unneccessary detail, not difficulty. Build complexity in a carefully chosen progression.

Telling the difference between unnecessary detail and challenging complexity

In my post on why programming classes fail and learning ‘algorithmic thinking’, a main example was that students starting out programmig don’t need to know about data types. I will stick with this example here because I just think it illustrates my point so well. The skill to learn I discussed in the post really wasn’t the ‘vocabulary’ of your first programming language, but ‘learning programming’ means successfully communicating with a computer and in order to do that, you need to develop the skill of algorithmic thinking. This skill is independent from your chosen programming language, so you might as well start with a visual lanuage like PocketCode’s Catrobat or Scratch. I would even encourage you to do so.

My favourite illustrative example: data types in introductory programming classes

When took my first programming class, already in the first or second lesson, I was bombarded with data types. I might add now, that since I never write programs that calculate anything, I have never really needed any more datatypes than int, char, string and complex data types to this day. Other primitive datatypes I have ever only used in ‘fake examples’ or ‘program your own calculator’ tutorials. All while you can generally get away with not very much programming in the Digital Humanities, even though I try to program as much as possible, I have never needed any of the other data types to this day. And that first programming class I took was in 2016. So maybe you see what I’m getting at: a new learner really doesn’t need to know about data types. They should maybe informed at some point – once they have mastered string and int – that there are, in fact, other data types which they might need later on and to pay attention. But that should be about enough. Especially since every book on learning a programming language features them anyway. So your students will know where to find out about data types. Once they actually need them.

In that first class, when we were told about datatypes, the only thing it did for me was turn on this destructive internal dialogue: “What? What does it mean? What do I need it for? Should I learn this by heart now? (like how many bytes an int has… the internal representation is different depending on your computer anyway, I must add years later).” And it went on like this. But the most important thought it generated in my mind is this one – I will print it in bold because it’s important: “Wow. Programming must be really difficult. Maybe I’m too stupid to understand it.” This is the common thought students have in this situation because they are fed information which don’t fit into the learning grid in their heads. Unless they have had previous programming experience and already know the content you teach them, it is plain impossible to understand this new information because there isn’t enough context. This means you have utterly failed as a teacher, congrats. So please don’t do that. Only teach things which can find a place in the student’s internal thinking grid. They will not remember information they don’t know where to put. So that’s a complete waste of time.

Children’s books don’t mention data types

I have made the effort of checking many “learn programming” books for this example and it turns out that children’s books never mention data types but books for adults always do. So if in doubt, and if you really have no previous programming experience since children’s books usually start at a low entrance barrier (which can be good but maybe won’t be challenging enough for you), just get a children’s ‘learn programming’ class. They are way more sensible. They introduce concepts only when they’re really needed. If you’re not a complete beginner anymore, some more theory would be better. Remember, I am also a big fan of ‘the bigger picture’ and argue that you should, in fact, learn more background information than strictly necessary (see my post on learning from tutorials vs. books). It is assumed that a didactical approach is essential when teaching children, yet somehow people seem to think adult learning was different.

Imagine explaining everything to a child. Then apply this to adults.

So what I really mean is that you should not reduce difficulty or complexity, but you should reduce unnecessary detail. As a teacher, it is extremely difficult to leave things out, you always want to be as thorough as possible, I know this from experience. But that isn’t good teaching. Good teaching is learning, step by step, to leave out the unnecessary. Learn to simplify. If you don’t know how to explain something in a very simple way because you think the topic to be soo complicated and you just can’timagine how you would explain it to a child or to your grandma and there you go.

Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away. (Antoine de Saint-Exupery)

Systematically planning for effective teaching

It is interesting that we usually give this kind of advice to our students for preparing presentations yet we totally ignore it for our own teaching. Especially, if you teach at the university, you feel like it’s not your problem to simplify things. Students should just suck it up. Well, plot twist. No they shouldn’t. Maybe we should take some time and plan for effective teaching. Because from my experience, I feel that respecting a few simple things will already do the trick.

1.) Leave out unnecessary detail

To “automate” this, especially for classes where there are pratical parts, just plan the practical parts first. Note down only the information needed to complete the practicals. If you end up feeling like important concepts are missing in the end, mention those in the form of a glossary (key term + max. 1 sentence explanation you can put in a visual info block). Unnecessary detail clouds your students’ minds. Unlike you, they lack the experience to tell for themselves which bit of information is important and which one is just a nice-to-have. So they end up with tons of learning material,  large amouts of things to study in a non-brain-friendly format. It will take them ages to write up a summary and find out which parts can be left out and which can’t. For you, making this clear would probably take 5 additional minutes. If anything, always end with a “things to remember” final slide which sums up the concepts you expect them to know by the next lesson. You know how to tell the difference between signal and noise. That’s why they employed you to teach. So rise to your responsibility.

2.) Provide short survival summaries with the most important takeaways

I explain this in the tutorial post on study summaries. Force yourself to sum up all your classes’ contents in no more than one page per lesson and then, at the end, create a survival summary, which sums up the most important concepts from the 12 one-page-per-lesson summaries in one single page. All the detail you need can go into the lesson summaries, the final summary is equivalent to a pass grade in an examination: If the student knows and understands all the concepts on it, even if they know no details whatsoever that should be worth at least a pass grade.

3.) Choose handouts over ‘the slides culture’

Over the last years, I noticed that hardly anybody does handouts anymore. People think that their students have the PowerPoint (or LaTeX!) slides  anyway and can learn from them. But there is an important difference: Slides often contain illustrative examples or unimportant details and mostly, there are way too many slides. Students end up completely lost for which information is important. Provide a one-page handout. This forces you to stick to the key takeaways and leave away unimportant detail. You can still have details in your personal notes and mention them. But please do take the time to hand students a more didactical document than your personal notes. If your notes are sometimes confusing to yourself, the master and producer of that chaos, how do you expect non-experts to understand them?

4.) Mastery comes from mastering the deconstructed minimal building blocks of a skill

I explained this in the post on deliberate practice. For teaching purposes this means: people don’t pay enough attention to the basics! They are often presented in a way which makes students think they already understand everything anyway. This is, probably, the biggest hybris ever. In my experience, hardly anybody – except for real masters of their craft – actually get the basics and understand their vital importance. Don’t teach your students to sweat the small stuff. Rater spend some extra time on the basics. Often, the basics are crammed into the first 10 minutes of a class. This is a big mistake! It’s actually the advanced stuff which is easy, not the other way round. Once you’ve understood the basics. Never assume your students understand the basics, even if they think they do. They lack the experience to judge their own proficiency. The greatest waste of time I have observed in classes is when students don’t have a firm grasp on the basics but don’t dare ask. In the later stages, they are at a complete loss for what to do. It’s your job as a teacher to stress the basics so many times that students really understand them. This will also teach them that it’s ok to ask. If you skip over basics they didn’t understand, you make them afraid to ask for fear of looking like an idiot. There are no studid questions – live this and your students will start asking! Consequently, measure their mastery of the basics with some sort of testing and only move on once they really understood them. Even if it takes 6 out of your 13 lessons. It will be worth it in the end. Give more advanced students a challenging task in the meantime.

5.) Don’t forget the generic “How to approach this type of problem” summary

Even if this is mentioned implicitly in your teaching methodology, don’t assume students can abstract the general methodology from your practical example. That’s how they end up not knowing how to Google scientific literature on their chosen topic. You have to make everything explicit, even if it seems trivial. Especially if it’s trivial because everything which seems trivial to you is likely a vital underlying key concept and exactly the sort of basic knowledge you would be supposed to teach. Even if you think you already did it in your class, please just do provide a little written out step-by-step tutorial so people can go back to that if they don’t remember how to do it. Maybe they forgot to note down one simple step but that missing step will mess up the whole process. I tend to formulate this while explaining to students what they are supposed to do (i.e. explaining the homework, current task, etc.). I always feel like an iditot doing this but this is the moment where you still have feedback for what your students need. You can add additional problems as they come up. Make the list as extensive and detailed as possible. Often teachers have really bad assessment skills when it comes to predicting  what will be a difficult obstacle for a student in a task. Often it is not even the task they can’t manage but, for example, the forgot where to find the data needed for it, etc.

Like I talked about in the “learn programming” post, the “how to approach this problem” part for starting out programming is not the “vocabulary” of a programming language but algorithmic thinking. Where do I start when I am faced with a task like this? That is actually what you should be teaching. It’s called getting people actionable skills. Teach them to teach themselves, the tricks to make things easier, where they can find information, etc. Take the time to write this out even if you feel like your students should already know this because it came up in a prerequisiste class. Don’t play strict here. You’re only hurting your own class if you insist that people should already know this by now. If they don’t (which is likely to be the case), make it your priority to fill the gaps in their knowledge in the most effective way. Make sure they don’t end up in your colleagues class with an even bigger pile of “stuff they would have already be supposed to know”. Don’t cry over spilt milk. Wipe it up before it starts to stink.

6.) Don’t bore the pants off your advanced students

They don’t know everything and still have things to learn, else they probably wouldn’t be in your class. Prepare something to do for advanced students. I mean, honestly, even as an unexperienced teacher, deep down you can tell before you’ve even met your students that their skill level will not be homogenous. So why didn’t you prepare for it in advance? Offering a cool project for advanced students isn’t so difficult. Prepare it once and reuse it forever. Take this one hour it will take to come up with a more complicated problem (you probably already have one in mind anyway) and spell it out in a way that students can work independently. Give them book suggestions or links where they can learn what they need so they don’t need to interrupt your class.

Your class will (and should) move at the pace of the slowest student. If you don’t prepare for imhomogenous classes, more advanced students will be bored drift off quickly. Have advanced mini projects on hand to keep them busy, motivated and interested. Espeically your good students are actually the ones you want to keep happy. They are the ones who might come to the follow-up class. Unless you bore them away. Counterintuitively, advanced students often tend to get ignored by teachers because they are “difficult”. Yes, advanced students are challenging to teach. Give them something task from a real-life project you wanted to delegate to save time anyway. The responsibilty will ensure they know you value their advanced skill, even though you might not have the time for a 1:1 master class right now. Then, think about actually offering 1:1 master classes for motivated students. They will appreciate it because usually, advanced students really love to learn but hardly get the opportunity during classic teaching. If you have the time, challenge and mentor them outside class. They can become great allies and future co-workers in the long term. Also, the more advanced a student, the more they need non-generic help but challenges tailored to their current needs and skill level.

The “mini-project method” also allows you to take extra care of slow students without guilt – you can let everybody else start on the mini-project (which took you one hour to prepare one single time and can be reused indefinitely if it was a good project), so it won’t be at the expense of their learning experience.

Writing this down, I realized I really have a lot of thoughts on this, so expect another follow up at some point 😉

Bye for now,

the LaTeX Ninja

Buy me coffee!

If my content has helped you, donate 3€ to buy me coffee. Thanks a lot, I appreciate it!

€3.00

Learn programming from a book vs. tutorial? Thoughts on deliberate practice

In this short little post, I want to share some thoughts on deliberate practice and how it affects coding, learning how to program, etc. I will argue that, in the long run, you can only become a better programmer with some systematic (self-)education, be it from books or academic classes. Tutorials alone, on the other hand, get you actionable quickly but do this at the expense of providing “the bigger picture” which will ultimately harm and slow down your progress.

The concept of deliberate practice

I have been intrigued by the concept of ‘deliberate practice’ for a few years now. It mostly comes up in the context of the so-called 10.000h rule (popularized by Malcolm Gladwell’s The tipping point – which is full of blatantly false information by the way and has been debunked by Steven Pinker, see Resources).

Deliberate practice is needed for expertise and reaching a level of mastery. If you just want the ‘quick fix’, don’t bother using this approach. But maybe consider using it still.  For your own betterment, even if that sounds like an increasingly cheasy idea in our times. Read on to find out why I think you should.

Urging you to go grab a book instead of reading a tutorial probably is weird advice coming from someone owning a tutorial blog. What I  really want to say is that you should choose the medium through which you learn wisely and deliberately. You don’t need to use the same medium all the time but keep track of the ratio of how much you use the quick fix and how seldom you actually take the time to learn and really understand things. For getting things done quickly, a tutorial is great. But in the long run, if you want to become good at some point (and you should have that goal), you need to learn systematically.

 

Adopt good learning habits, relearn the basics and do it well.

Get a teacher, get constant feedback and a systematic learning progression. If you have acquired your skills merely through ‘coding along’ so far, you might want to do some serious catching up by reading a book. Even if it’s an introduction you deem below yourself, seeing as you might already have years of experience under your belt. Go learn your basics. They’re the hardest part but easiest to overlook. Deliberate practice concepts all agree that you need to deconstruct a skill into the absolute basics and master those smallest building blocks. It’s not the ‘big concepts’ which will ultimately make you good. Don’t sweat the small stuff. Go learn your basics. And go for mastery this time.

 

Why don’t you just… read a book for once?

I don’t want to say either that one could learn programming from reading books alone. But what I do say is that a book is, obviously, an overall larger thing than one short standalone tutorial. So it is bound to have some more structure. It has room for some more general explanations than a blog post. In a blog post, lengthy explanations of background information would be distracting as the goal is to get you going as quickly as possible. For your overall learning, however, this is harmful. Getting the easy ‘quick fix’ is not challenging. But without challenge there is no learning process.

Reading books to learn something is not the right approach when you’re in a deadline-driven project and just need results real quick. But even in that situation, I encourage you to take some time for deliberate practise: Read a book on the topic in your free time, in a moment of calm where you’re not pressed for results. This is what the Humboldtian idea of Bildung is: Self-realization, learning something which has no immediate use but will make you grow as a person and in your expertise.

 

The culprits: Lack of didactic guidance, missing big picture

When you learn programming by tutorials and StackOverflow only, there usually isn’t a lot of didactic guidance involved. It seems like the effective way to do things because you get going immediately and only learn what you need to know right now, so you can always keep things relatively simple. But you also don’t get the big picture. You might get actionable advice, but in the long run, this kind of learning alone, while making sure you get started quickly, will also make sure you remain mediocre forever.

 

Training progession and learning

If you learn without a progression, there is not training effect. I spent all my youth on strict training plans for long distance running, so tackling learning this way is all natural to me. But I realized that for a lot of people, it isn’t. They would never even dream of structuring their progress in learning in accordance with well-known training principles. But that is why a (the desired?) training effect is never going to come. If you don’t train, you don’t get better.

And by “training” I don’t mean the fun part of coding along happily, hacking things together so they merely work. Training is the hard work part. It means dedicated, systematic learning with the goal to improve systematically, following a pre-planned progression. You wouldn’t expect to run a marathon without planning out your training like this, why do people expect that it should be any different with other kinds of learning? But they do. And then they sit wondering why they don’t get better.

You won’t get fit if you don’t make a plan and follow thorugh with it. These things don’t happen by chance. With learning, we sometimes are lead to believe that it doesn’t require this continuous dedication like atheletic fitness does. You learn it once and get to keep that skill level forever. That’s why most people get worse once their schooling is done – they just stop learning. Of course, years at the job give you experience. Doing what you’re already good at is fun. But if you want to make any measurable, visible progress, you have to leave that comfort zone and do the work.

Dedicate yourself to getting better or you will stay where you are. Forever. Just ‘showing up’ and doing the work the same way you always did, making the same mistakes you always did, will not make you an expert. There is no way around deliberate practice with a reliable feedback loop. You have to measure your skills before you can improve them. So you see that you really aren’t anywhere near close to where you want to be. This is painful but necessary. You need to acknowledge where you lack skill. Then come up with a plan to expand your knowledge systematically and fill all the gaps. “Just coding along” is not going to do it in the long run.

 

What you do every day… counts more than what you do once in a while

I want to share the one baseline that resonates with me the most: Do it every day. Even if it’s just 5 minutes of habitualized deliberate practice. Get better every single day. Challenge yourself to get better daily. Even if it’s just a ‘mini habit’. What you do once in a while can never beat what you do every day. What you do ‘once in a while’ has a tendency not to happen. If you aim to study for an hour once a week and that doesn’t happen a few times, you will go without practice for weeks. So go for 5 minutes daily. There isn’t anybody who doesn’t have 5 minutes per day. No matter how busy you are. There is no excuse for not taking these five minutes out of your day for conscious improvement. I think it would even be totally justified to do this during your paid work time. 5 minutes more or less can’t hurt your productivity. And the investment will surely pay off.

Late New Year’s resolutions

In the “coding world” classic “book learning” is frowned upon. People favour just getting what you need right now from a quick tutorial or reading up the solution on StackOverflow. I argued, however, that never taking time to do the real, hard work and actually learn it is not a good habit in the long term. So I suggest that you replace it with better ones from now on. It’s not too late for New Year’s resolutions yet 😉 So much for today.

Yours,

the LaTeX Ninja

Resources

Some books touching on ‘deliberate practice’

Cal Newport, So good they can’t ignore you, NY 2012. I found that the book isn’t what the title suggests (it sounds like your common bullshit American self-help manifesto, but it’s really very sound advice). Contrary to the common “passion hypothesis” (live your dream and make your pre-existing passion into your career), he recommends to adopt the “craftsman mindset” which focuses on producing really good output. His Deep Work is great as well. http://calnewport.com/

Josh Kaufman, The First 20 Hours: How to Learn Anything . . . Fast!, London 2014. Was not as good as I had hoped. I really liked the summary on deliberate practice and the idea behind it, but found the book itself a little lacking in depth. After the introduction where he explains deliberate practice (which is the part I loved back when it came out. He really is responsible for my first getting into the idea of deliberate practice), it’s pretty much over. All he does is apply his theory to multiple projects. If you’re not particularly interested in the skills he deconstructs, you really don’t need to buy the book.

Timothy Ferriss, The 4-Hour Chef: The Simple Path to Cooking Like a Pro, Learning Anything, and Living the Good Life, NY 2012. Also with Tim Ferriss’s mimimum effective dose (MED), mainly described in The 4h Chef, the common denominator is that the books mentioned all question the concept of “mastery”. The 10.000h rule stating that you need 10.000h of deliberate practice (that being 4h per work day, 20h per week, 50 weeks per year for ten years) is geard towards “world-class mastery”. Even if you really want to achieve world-class mastery, studies have found that you can get away with way less hours if you practice the right way (deliberate practice as opposed to ‘just showing up’). But Ferriss and Kauffman both bring up a different aspect altogether: They point out that most people don’t actually want that kind of “real mastery”. Kaufman’s great idea behind his book is that mostly, we just want to get started in a skill really, know enough that we can say “I know how to [INSERT SKILL]”. And 20h of real deliberate practice mostly is more than enough for that. Afterwards, we are ready to continue on to real skill acquisition if  still interested. Ferriss is unique in how he stresses the idea of doing the least possible to achieve your goals (the minimum effective dose) which supposedly will save you most of the otherwise wasted time.

And of course: Malcolm Gladwell, The Tipping Point, Boston 2000.

Other

https://jasonhaaheim.com/the-deliberate-practice-book-club/

Steven Pinker: Malcolm Gladwell, Eclectic Detective, in: The NY Times, NOV. 7, 2009.

 

Buy me coffee!

If my content has helped you, donate 3€ to buy me coffee. Thanks a lot, I appreciate it!

€3.00

Why most “learn programming” classes, books and attempts fail

This seems to be a bold claim. Let me explain… There are two reasons why I think most introductory programming classes fail ant that is a) because they never actually teach prorgramming (i.e. “algorithmic thinking”, not the syntax of one concrete language / “your first language”)) and b) because they bombard students with tons of complicated subjects which are not necessary at the beginning, so nobody remembers or understands them anyway. But they confuse the students and distract them from what they really should learn like how to interact with the machine and basic flow control. Use a visual language (like Scratch for PC or Catrobat for mobile devices) and thank me later.

Algorithmic thinking

When we want to learn or teach how to program, we first need to define what programming is. Like in a human language, knowing the words and the grammar is not enough – knowing a language means “knowing how to communicate using that language”. For programming languages, this means what we might call “algorithmic thinking”.

Sadly, in most beginner’s programming classes, this is not taught. And this is also why in many classes on learning how to program, only those students succeed who already kind of knew how to program beforehand. Why is that, you ask? Because those classes  that have failed their students have never actually taught programming. The class listed some of the “vocabulary” of an example programming language. It maybe explained about data types, gave you information you didn’t know what to do with and forgot almost instantly.

You were fed all sorts of facts of “knowledge” but never got around “operationalizing” them.

John Sonmez thinks the same way when it comes to learning a new programming language when you already know how to program. Most people ( = learners) and, sadly, also most teachers, don’t get that in order to really teach programming,  they would have to teach algorithmic thinking on the example of one programming language. Not “show around” the programming language and wonder why nobody had learned anything.

Why you don’t need to learn about data types just yet and should start with a visual language

This is also why I would recommand a visual language to start out, like I explained in the [cheatsheet post](LINK) of this blog’s “learning effectively” series. Even more than high-level programming languages, visual languages allow you to ignore the low-level stuff for the beginning. (Data types being a high-level “symptom” of what I have just called “low-level stuff”. – Don’t kill me please.)

You can say whatever you want, but at this early stage you just don’t need to know about these concepts. Not when you’re barely starting out and have never programmed before. These concepts scare people away. These concepts make things complicated when they need not (yet) be.

If you want to learn effectively (this is valid for any kind of learning), you need to focus on one thing at a time. When starting out on your programming journey, learn algorithmic thinking first.

Programming essentially is “problem solving using a computer”

 So a class on starting programming should not teach “the vocabulary” of a language (not the grammer either). It should focus on giving you strategies for digital problem solving which is more or less the same thing as effectively communicating with the machine (if we want to use the human-language analogy). In learning a human language you would never expect to master the language just by learning some vocabulary and grammar by heart. You know that you have to be able to use it first. That means, you need to find out how to communicate effectively in that language.

Also we shouldn’t fall victim to the fallacy that starting to learn programming is synonymous to learning your first programming language. You could theoretically learn algorithmic thinking in pseudo-code without ever seeing a concrete example (which is not anything I would advise, however).

So when you teach an introductory class to programming (to people who might never have programmed before), maybe think of me and keep this in mind.

I myself have fallen victim to this and endured many boring and ineffective “start programming” classes. If you want to start programming, would like to follow my advice but don’t know how to start, I suggest my [post on how to find a “starting out” project](LINK).

 

 

Buy me coffee!

If my content has helped you, donate 3€ to buy me coffee. Thanks a lot, I appreciate it!

€3.00

On Didactical Reduction (especially in the DH)

Didactical reduction means abstracting complexity to facilitate learning. It is the act of reducing and simplifying teaching material as to promote student learning. Sadly, I feel that didactical reduction doesn’t accomplish its ends most of the time. Here is why and how I think we could do better.

The road to hell is paved with good intentions

I have seen many classes where the content to be taught was reduced so drastically that is became simple and clear – but maybe **too simple and clear. It became meaningless.** The material became so easy to understand (or, even worse, a complex topic was made to seem like a banality), so that students stopped paying attention. “I already know this” or “I get this” are not necessarily thoughts a teacher wants to provoke. We use didactical reduction so that the complexity of a topic is hidden and we don’t scare our pupils. But fear isn’t always a bad thing. Fear means respect. And if a student never starts respecting a topic in its complexity, the student will never actually learn it.

Often, topics end up being reduced to banalities due to overly motivated didactical reduction.

There is no more incentive for students to learn them. I see this a lot with the more technical aspects of the Digital Humanities. Programming can seem scary to Humanists, so we reduce it to a bare minimum and then complain about how we can’t program. It’s either hack or yack with the DH, isn’t it?

Well, I don’t think so. I think that the DH have not yet reached the point where they have enough self-confidence to dare and face their dear students with a difficult class. Would anyone question the maths exams in a Computer Science degree even after they’d failed five times? They would complain, but they would not question why they  were necessary. (At least not at the back of their hearts where they know they are.)

It’s all just introductions in the DH?

In the DH, we are so afraid of the supposed lack of technical aptitude of our students that we basically just stop teaching them real skills. We do some theory, but not too much – it could scare away the students. We do some programming or other technical work but remain so much on the surface that no student could leave the class and actually feel that they master the topic. And maybe achieving mastery of a topic in just one class would be too much to ask. But then again, why do we even bother teaching a class if we don’t expect our students to have any actual skills after they have sucessfully completed it? Is it part of the nature of the DH that we are ‘Jacks of all trades’, we collect introductions to everything and master nothing? (Sorry to be provocative here, mabye this is exaggerated but also, maybe it makes my point more obvious.)

Challenging students means taking them seriously

I personally feel that teachers tend to not take students seriously enough. And by that, I don’t mean to insult or point fingers, but I think it is inherent in the nature of teaching that teachers deem themselves superior to their students. And this might be the case, of course. But this assumption brings with it a lot of presuppositions like the possible lack of aptitude or talent in the students. We mean well when we use didactic reduction but implicitly, it also often means that we don’t dare to challenge them because we’re afraid they might not be up for it. And that is a lack of respect.

Safe places, respect and challenge

I personally feel that trusting someone to be able to face a real challenge is a form of respect a teacher owes to its student. Showing respect by challenging people to learn and trusting them to be up for the challenge is something I apparently do unknowingly all the time when I teach. No matter if I teach Latin at school, teach university students or explain programming to 10 year olds. I trust students to be up for the challenge so that they can trust themselves. At first, they can be reluctant but once they realize how empowering it feels to learn an actionable skill, they love it.

I was very surprised to get very good feedback after teaching children during a sort of summer school this year. After all, my ski instructing years (the last time I actively worked with pre-adolescent children) were long past. But I think the reason why children I teach tend to idolize me is because I am one of the few people who treat them like adults. Who trust them to be able to handle responsibility and who take them just as seriously as I would a professor. Who doesn’t treat them like they’re dumb. Apparently, hardly anybody else does that or else it wouldn’t be so special.

But not treating a person as though they were dumb also means that I have expectations. I think them to be able to master a challenge but this also comes with the obligation to take the challenge. Adolescents tend to show more reluctance and resistance here. Challenging yourself is hard work and it might transform you. Change is feared and supposed to be painful. But it’s what makes learning worthwhile.

What I’m really trying to say with this is: You can only see your students’ potential once you dare to challenge them. Real learning can’t happen within the boundaries of absolute safety. Yes, it’s safe in your comfort zone, but there is this popular quote from the internet:

A comfort zone is a beautiful place but nothing ever grows there.

You can’t learn without leaving your comfort zone. Didactic reduction often leads teachers to make everything safe for their students. So safe that they actually prevent them from learning. And mind you, teachers: Students have a natural instinct to dumb themselves down hoping they will get less challenging work. Challenging work promotes personal growth, personal growth is change and people fear change. Also they avoid hard work. They will not appear compentent for a big challenge because they don’t want to be challenged. This is why you need to believe in their ability to tackle a challenge. Because they won’t do it if you don’t make them. Laziness kills, believe me.

Learning = Commitment to personal transformation

When I – as a student – take a class, on the one hand I want to obtain some quick and easy ECTS. But on the other hand, I don’t really want a class where I don’t ever learn anything. In the long term, the class will have been a waste of time if it doesn’t transform the way I think, at least in some aspect. A mere introduction, a listing or overview of the topic is nothing I need to take a class for. I can find this on Wikipedia. It doesn’t require any commitment. But if you want to learn, you won’t get very far without commitment.

A definition of learning in the field of Knowledge Technologies / Machine Learning / Artificial Intelligence is that it is a processes by which we achieve long-term changes in knowledge, perception and behaviour through experience. This results in in changes in brain structure in human learning and in changes in parameters of computationally represented knowledge and reasoning algorithms in machines.

This is a helpful working definition for the blog post at hand because according to this definition, no learning can happen without change. Which means it is a teacher’s job to induce change. This cannot be done by feeding students information they already know or making it appear like they already understand something because it is so drastically simplified. Students need to be made aware that there are things they don’t already know but at the same time assured that with the teacher’s help, they will be able to fill the void, one gap at a time.

Winging it

This all sounds great in theory but how do I make this work in practice, you might ask. Well, I’m not an expert and this sure isn’t the theory of the century but I have some ideas. Indulge me for a moment.

First of all, I obviously see that there is a difference between adolescents being forced to attend school and university students who, at least somewhere deep down, signed up for it freewillingly and came of their own accord. My tips work best for people who want to learn, at least somehow. But I don’t see why one shouldn’t be able to make it work for enslaved adolescents as well. It will probably be more difficult, but still.

Always make it actionable

If you have to do tons of theory, don’t forget to always make it actionable at some point. Theory can always be put into an actionable skill or “practised” on an example. This will be the one thing students will remember a year after your class is over. So make sure there is an actionable skill or general take-away or they might just remember nothing from the class in a year’s time.

Here, I would suggest you treat less topics but make room for some in-depth practical example for every topic covered where students can take action themselves. They should feel like they have mastered a task big enough that they can acutally use the skill they are supposed to have learned. Of course they still won’t be good. But I think they should end up feeling confident enough to do some paid work using the skill (taking into account that you go on learning as you work and usually can pull off, say a first week of slower, less good work, where you work yourself up to get a little more confident).

The size of the tasks I’m talking about could be doing XML annotation in a project, not “full mastery of Python” or something this big. If the class is, say, an introduction to Python, a student should be able to take a (not well paid) job where they do some small tasks with Python, in my opinion. So I would expect the student to have been taught some basic problem solving skills, some “algorithmic thinking”, Python basics and the knowledge of where to find what he or she doesn’t know yet. Or for another topic, the student should be confident enough to give supplementary classes or tutoring for someone who is new to the topic.

Do less but do it better.

I would go as far as to say that, for example, leave out the data types theory and just show that there are different data types with the examples of string and integer and how they work. Make the student understand what a data type is fairly clearly using these two examples and make sure he or she is able to practically apply that knowledge. They can learn about the other data types as they go.

Dare to do didactical reduction in the way that you leave things out so you can go into detail with the most important, most actionable basics. Cut the last topic you had planned for the semester, if you have to. It will be worth it if you really achieved good results on the basics.

A student with a sound understanding of the basics and the ability to apply this understanding to small (but not too small / banally small) tasks will be able to teach him- or herself the more advanced stuff somehow. Your job as a teacher is to provide the information the student couldn’t easily get on their own (like insider tips, thing you only learn with tons of experience, the understanding why XY is important or why attention to detail is important with a particular task, etc.).

But I don’t teach topics which can be made ‘actionable’

I don’t believe you. Anything can be made actionable. And if the action is just passing your exam. Think about what you will let the students do for the exam and practise it. Students often have difficulty applying something they were supposedly taught. Because applying it is part of what you (yes, I’m pointing fingers) would have been supposed to teach them. Teachers often expect students to have the so-called “transfer” skill of applying knowledge but most often: they don’t. Just assume they don’t. Teaching this is part of your job! Also, let them do it with help first but be sure to include an example where they have to apply the skill completely on their own. Students usually don’t think for themselves as long as you help them with everything and so, neither you nor the student ever realize they actually haven’t learnt the skill yet. Do check if they have actually learnt the skill you were trying to teach.

What gets measured, gets managed. (Peter Drucker)

If the desired output is to write a seminar paper, think about what real life application that skill could have. Write a well-researched article in a (non-scientific) journal? If you get your students to be ready to publish for a scientific journal, all the better. Don’t be content with some half-baked output. (unless it’s Ben & Jerry’s). Also think about potential fields your students might work in once they’re done with their studies. Come up with a real life output. Don’t stop until you have found at least one. Then hold yourself  (and your students) accountable to really achieve this.

Information is certain to be lost, skills remain

But remember, if your class doesn’t teach anything students would be able to put down in their CV as a skill, they might just look back to the class afterwards and wonder what the hell they’d even learned there. At least that’s how I think back to classes where I feel I didn’t really learn anything. These classes all had topics, but only some of them had actual outputs. Digital Humanities teacher’s have absolutely no excuses here but I do see that this is easier said than done for some other Humanities topics. But nevertheless, you should always be able to come up with some real desired output of the class. If you can’t try harder. Revise your class. Challenge your students, but also challenge yourself.

I insist so much on teaching skills alongside “information” because information is certain to get lost over time. If you don’t teach any skill, your class will have no lasting impact on your students whatsoever. All the “good classes” I myself have ever attended have taught me a new skill in one way or another. The only classes I remember now are the ones where I actually learned a new skill.

Undergraduate level vs. Master’s level: Knowing about a topic vs. knowing a topic

For undergraduate, so Bachelor’s level classes, I reckon some drastically reduced content and even the ominous “listings” of information might be ok if they can’t be avoided. You have to start somewhere. Though I firmly believe that there is always a way to include at least some actionable skill where you can go into detail. If it’s just doing a mini hands-on tutorial online where they get to do something they might, at least theoretically, use in real life.

Teach the class so well that your students can confidently write that skill in their CV

But for the graduate level, so anything Master’s curriculum or above, you absolutely have to make it actionable. Merely absorbing information is not enough anymore. A students needs to walk out of your study programme with a specialization and enough skills to get a first job. So this means either specializing on some topics with the result that the student is able to “make sound decisions”, “think for him- or herself” in this topic. Or enough applied knowledge which translates to a skill students can put into their CVs. If you teach a “practical” class, what is the skill you would trust your students to put into their CVs once they have completed your class? If you can’t come up with one, maybe you should rethink your class. Having heard about the topic and knowing it exists is enough for a Bachelor’s level introduction at best. At the master’s level, it is my firm belief that you should teach an actual skill for the student to master, a specialization where they feel “firm” and confident enough to do paid work in.

 

Buy me coffee!

If my content has helped you, donate 3€ to buy me coffee. Thanks a lot, I appreciate it!

€3.00