(Hacker School: Week 4, Day 5)

Like I said at the beginning of the week, it’s really hard to write something every day. It’s been most difficult this week, when I’ve felt like I’ve made steady progress, but have very little to tangibly show for it.

Though it’s more difficult to put into words or show an example, this week has been especially good for two things: deliberate practice and understanding a topic from the ground up.

Deliberate practice is the idea - introduced by a group of researchers ~20 years ago, and since popularized in a bunch of books (Outliers, mainly, but also in Make It Stick) - that those who become experts in a particular area do so less because of innate ability and more due to their specifically-structured practice over a long period of time (that’s the 10,000 hour rule). Generally, it takes the form of picking a specific part of a topic a bit beyond one’s reach - but building upon previous experience - practicing that part, getting targeted feedback on one’s performance, and repeating the process, over and over. It’s a step-by-step process - each thing one practices builds upon the last and strengthens overall skill in the area (so the theory goes). Though there’s some dissent with the idea that it explains expert performance, I still think it can be applied advantageously to my own learning. I’m not an expert in programming by any means - not even close, and may never be - but reflecting upon what I’ve learned, looking ahead and structuring my next step to be a bit harder than the last, and practicing until I’ve fully grasped that topic, has been more valuable to my progress than anything so far. It just wasn’t until reading Make It Stick (and at least one blog post) that I put a name to it.

That directly relates to the other part - understanding something from the ground up. Though I like knowing the big picture - i.e., can be a global learner (as Mel Chua highlighted to us in our first week here) - day-to-day I’m usually much more concerned with learning something step by step - i.e., sequentially. I get easily frustrated if I’m going through a tutorial or book or class and realize there are 25 things that the author or professor assumes I already know. This single thing - the assumption of knowledge, and the overwhelming amount of assumed knowledge - has been my biggest frustration in learning programming and computer science. With a few exceptions, nearly everyone with information about a particular topic (usually, authors of books and tutorials) assumes you come in knowing a, b, and c (and usually d-z and 1-10). (Granted, much of the learning resources are free - and anyway, every single author can’t be expected to hold your hand through their topic.)

My lack of knowledge often comes from the obvious place - not having a computer science degree - but it doesn’t come from a lack of curiosity. I want to learn these things! It just takes so much time! If I want to build an app, do I really need to learn how the language works, how databases work, what routing is, what HTTP requests are, how to authenticate users, how to keep it secure, how to interact with the front end, how to deploy it to Heroku or Amazon so everyone can actually see it? Hacker School would - I think, rightly - argue that yes, it is more important that I understand fundamentally how each piece works before building something. Do I need to know every single thing in minute detail? Definitely not. But I will be a better programmer - and ultimately a better learner - if I take the time, and yes, the frustration, to learn the fundamentals and build from there.

So to bring it back to deliberate practice, this week I structured my time around starting from the ground up in developing a web app in Python. Doing this ensured I stepped from one level to the next, more or less sequentially - it’s also much easier to grasp what I don’t know when starting at the very bottom. I learned how to build an app without a framework (it’s using something called WSGI - likely a topic for a future post). Then I started to learn why frameworks exist, and why each small piece was added. This was a slow but ultimately rewarding process - by the end of the week I felt much more comfortable using something like Flask - one of the Python web frameworks I’ve mentioned before - to build an app, than I did before. And I did it by identifying things I didn’t yet know, practicing them, and then moving onto the next thing.

I still feel like I didn’t do much this week, but I suspect I’ll be grateful for the foundation I’ve been building. Hopefully I can remember everything I had to learn - the other most difficult thing about learning is knowing what to learn next, and the best resource to do it. I’d love a trusted source for sequential learning of particular programming topics or concepts. (There are great ones for CS topics - Coursera has a bunch of great (FREE!!!!) courses from top schools - I’m currently moving between three different Intro courses - the other major frustration is how difficult CS can be to start understanding.)