So You Want To Learn to Code: Prologue
This series of posts is derived and will continue to be evolved, from my experience mentoring others in learning how to code.
Coding is something that many people are interested in doing – and it’s certainly sexy right now to claim to be learning to code. But out of the plethora of resources out there, which ones are the best? And what does best even mean?
Expert Review of Available Resources
I’ve reviewed many available resources online for you, from the perspective of someone who already knows how to code. I’ve considered them both in terms of “I wish I had this when I was learning!” factor, as well as what I know about education – keeping people interested, engaged, even addicted to learning good habits and skills.
Emphasis on Engineering Skills
In addition to reviewing resources online, I’ve reflected on things I wish I had learned in school and compiled a set of more traditional curricula to teach these things. Often, these skills, which I will generally refer to as ‘software engineering’ skills, revolve around design and quality. Exercises we do online, or even in computer science classes, are often so small that they don’t run afoul of many problems with complex software. They’re often done alone, so they don’t run afoul of the many problems with software written by teams.
Engineering principles are there to help us move from people coding up toy problems, to people who can work together to iteratively build large projects and solve big problems.
A Designed Curriculum
Finally, I’ve coalesced all the above into one linear curriculum – step one, step two, step three – that will give you what you need to learn not only how to code, but also how to code well.
What Do You Need?
First, you’ll need a computer, obviously. The original curriculum was written for someone who came from a Windows background, however, I’ll be attempting to add hints for Mac users as well. That’s the only piece of technology you need to be comfortable with from the start – I’ll start at the very beginning.
The other thing you’ll be required to have is a mentor. While research skills are something to be learned along the way, having someone you can call upon to ask technical questions is invaluable. Moreover, during the later stages of this curriculum, a mentor is required to check and grade your work.
Finding a mentor may be hard. However, if you already know how to code and would like to help others, I encourage you to use this curriculum and be their mentor! Furthermore, if you’ve used this curriculum all the way through, I implore you to become a mentor for someone else. To become a truly expert coder, you need to teach others!
For all of the beginning portion of the curriculum, I’d highly advise you to do the exercises using the Python programming language.
Python is a very easy language to learn and was designed as a teaching language. It’s got a simple syntax that is easy to not get mixed up in the gotchas and magic of other languages. The Zen of Python says “Explicit is Better than Implicit”, and the language was evolved with that in mind.
To get the most out of Python, find a mentor who’s willing to teach Python – she doesn’t have to be an expert in it, any “dynamic” language (like Ruby, Perl or Lisp) experience would probably make them valuable.
You can ultimately stick with Python your entire career as it’s used in games, devices, mobile apps, the web, and backend supporting programs. It’s particularly popular in ‘big data’ and ‘machine learning’ circles. I wouldn’t advise this, though, as the best Python programmers got that way by learning other languages as well, though we’re not going to do that anytime soon.
A Note on Pedagogy
I think many CS degree programs can be faulted by focusing too much on theory and not enough on practice.
The practice of programming, of building complex things in teams, is what coders do day in and day out. We don’t talk about finite state machines or discrete algebra, and you don’t need to know how those things work to be an accomplished coder.
Often theory can take away time that a student needs to practice! You can often tell productive programmers from unproductive ones based solely on the number of hours they’ve spent coding before reaching you – especially coding problems that are new to them or require them to push themselves. Understanding how to encode binary, quaternions or regular grammars has never made anyone a more productive programmer.
The worst aspect of the focus on theory, though, is that it turns people off of theory! Theory is beautiful and elegant, and – assuming you already have a solid handle on skills – it can lead you to designs you would never have built on your own that are both orders of magnitude more performant and maintainable. But only if you attempt to apply the theory! Unfortunately, so much theory is pushed on students too early that they memorize it to pass a test and promptly forget it. They don’t see how useful it is because they’re still struggling to get an intuitive grasp of programming in the first place.
Unfortunately, so much theory is pushed on students too early that they memorize it to pass a test and promptly forget it. They don’t see how useful it is because they’re still struggling to get an intuitive grasp of programming in the first place.
My advice – both to students of this curriculum and to mentors – is focus on the practice of programming from the outset. Learn how to code, then learn how to code well, and then you’ll find yourself with dozens if not hundreds of questions that will be answered in your discrete algebra textbook. Until then, just do the fun part – because theory can be fun too, but only when you have practice in mind.
Without Further Ado…
I’ll borrow from the Dreyfus Model of Skill Acquisition to break apart the larger linear curriculum into stages – Novice, Advanced Beginner, and Competency. If this is successful, I’ll attempt to provide guidance for the Proficient and Expert levels.
The Table of Contents of the Curriculum will be updated below, so keep this page bookmarked!
6 Comments »