When I finished college at the now distant year of 2006, I thought I might return there for a master degree some time in the future. I did have plans to do it a year later but decided to go down a different path that eventually made it too complicated to consider. I’d have to give up a nice and good paying job doing interesting stuff to live off some government provided stipend, doing research on something that might not even be stuff I’m passionate about.
I can’t say it was a hard decision back then, really.
As the years moved forward, I kept on learning on the job, trying different tools, technologies, paradigms. My list of half-read books kept growing and my interests floated around many different topics, never actually going deep in any of them other than what I might be doing at work for the moment. There was no actual direction, just a learn as you go process.
Then, around 2012, I happened to be using Scala at my job. It was a brand new world, full of new stuff to learn, new concepts, ways of building software that didn’t feel natural to me, so I had a lot of catching up to do. September that year, Martin Odersky would be doing a course on Scala and functional programming on Coursera and while I had already tried in vain to follow through other courses there (I’m still enrolled at the self-paced compilers course) this looked like a good reason to finally take this stuff seriously.
The course started in september and I had already planned a vacation for october (was doing the usual brazillian at disneyland ritual) so I would have a couple weeks of trouble watching the classes and doing the assignments, but it wasn’t impossible, a couple late delivery penalties and I would still be able to do everything.
The very first thing that struck me was my lack of rhythm. When you’re in college you get used to setup your week around the lectures, projects and exams you’ll have. I was out of college for 6 years now and was mostly reading and studying when I felt like it. The only deadlines I had were on the job and they were pretty malleable, there was no salary penalty if we missed our deliveries by a day or two.
The course wasn’t this permissive.
I delivered the first assignment (it became available on september 17th) four hours before the september 28th, 4PM deadline. With all the two weeks available to deliver it, I left it to the very last moment at the last day to actually do it.
I was so used to this self paced rhythm of learning I’ve been doing for these past years that it was hard not to keep doing it now as well. It wasn’t as if I was doing crazy hours at work, my life was pretty normal, working from home in a small coastal city in Brazil, hanging out with my girlfriend (now wife), playing boardgames and hanging out with friends.
What I didn’t have was clear priorities and objectives. I would see a book about software architecture (like Beautiful Architectures
), would buy it, read a couple chapters and then forget about it and buy another one from another completely different subject.
Don’t get me wrong, I didn’t stop learning new stuff during these years and I’ve built stuff I’m proud for, but if I had been more organized about what I wanted and the stuff I was learning I’m sure a lot of the subjects I just skimmed over in the past wouldn’t be coming back at me to learn them again right now.
The clear path of the course, the assignments, the forums, the deadlines, they all made it a different experience that drove me right back at my college years. I didn’t have to look around for all of this stuff myself as I had been after college, someone else had curated the content and organised it in a way I could follow along.
My energy could be invested at learning alone instead of being diverted into finding the material, figuring out how I would exercise that knowledge, how I would validate that my knowledge was indeed good or if I was going at the right direction at all.
Eventually, I went from delivering at the last moment to setting up my time to watch all the material and deliver the assignments right at the day they would be posted. Doing the course was a conscious decision, no one was forcing me to watch the lectures, go through the material or complete the assignments, it was time to act like a grown up and take this seriously as well.
And while the course was mostly introductory material into functional programming, it felt like a refreshingly different approach to what I’ve been doing so far by reading books, blog posts and watching diverse screencasts on the subject.
A couple months later I signed up for the Programming Languages course by Dan Grossman to continue the flow around functional programming and programming language concepts in general.
While the method was mostly the same as the Scala one, this one had a twist that wasn’t there back in my college days, peer reviews. The assignments were automatically graded when you uploaded them, but you also had to review the work of other three students and grade them.
Looking at the way people solved the same problems I had solved was an amazing experience. You could spot different techniques, tools and thought processes you wouldn’t be exposed to if you were just submitting your work to some computer to grade.
And while there would be a small number of people trying to troll other students by zeroing their reviews (haters gona hate), the peer reviews weren’t that important to your final grade. What was important was looking at code in languages you had just learned (like Standard ML and LISP), written by people you didn’t know and figuring out what that code was supposed to do and that experience couldn’t be defined by a simple number.
The last LISP assignment, writing a simple expression interpreter, was an amazing source of different solutions and I can’t believe this works moments.
Around the same time I also did the Principles of Reactive Programming course and decided it was time for a change of scenery.
I had a special interest in machine learning back from the beginning of my career. At my first job, I ended up implementing a simple recommendation engine using euclidean distance and there was a wealth of machine learning courses available, including the seminal Stanford’s Machine Learning course. I decided to give it a try.
The course itself says that all you need is some basic programming knowledge as you will be programming the algorithms and that’s it. The classes were great, the material is well presented and you can definitely write the algorithms and go through the assignments without much trouble if you know how to program, but I had no idea what I was doing.
It felt like a recipe book, here’s how the algorithm does it’s job, here are the variables, build it. I knew I was missing a lot of the context and the statistics involved in making these decisions so I decided to step back and reevaluate.
If I really wanted to understand this whole machine learning and data science field, I needed to build the foundations were this knowledge would be built upon and again Coursera comes to the rescue with the John Hopkins Data Science specialization, Bill Howe’s Introduction to Data Science (which is wrapping up right now) and Mine Çetinkaya-Rundel’s Data Analysis and statistical inference (which is about to start).
Having a clear objective and being able to work towards it taking these courses has really changed the way I’m looking at education right now and at the value Coursera is providing me with. If you’re having trouble making progress learning, try to fit yourself in a structured couse, with deadlines, assigments and a clear definition of what it wants you to do.
You will be amazed with what a deadline or a grade penalty can make to your procrastinating mind. Time to challenge yourself to make progress and learn new and cool stuff now.