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

Advertisements

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