Asking for help

** If anyone is interested in trying Wyzant (reviewed below), please use my code and get $40 of tutoring for free!**

Sometimes going it alone is great.  And sometimes you need help.

I’ve been teaching myself to code and backtracking to more and more basic subjects to give myself a solid foundation in programming.

I’m still not 100% sure what I’d like to specialize in, but I’m leaning towards data science and/or AI.  (Will write more on my love of cyborgs and why AI later…)

But I have to start at the basics.  For now,  I’m doing simple toy programs (tictactoeAI) and working through several Coursera courses on algorithms.

While the code I write works, I just know it’s ugly.  It feels brittle and ungainly and while I wanted to fix it, I didn’t know how.  One of my biggest fears about being a self-taught programmer is that my code might work, but it’ll be a hot mess and I’ll have locked in bad habits.

If I were in school, I’d be getting design feedback, but going it alone that’s hard to get.  I’ve been submitting code snippets to codereview stackexchange and while that’s been hugely helpful it doesn’t go far enough.

I really needed someone to sit down with me, walk through my code line by line, and give me feedback.

Looking into tutoring options

After a week or two of fretting over what to do I finally decided to try an online tutor.

Ideally, you could ask a friend or coworker for help, but I don’t have any close friends that code and felt bad asking someone I didn’t know very well for such a big favor.  Since I’m a beginner, I need a lot of patient explanation and I thought that was just too much to ask someone who wasn’t a close friend or family member.

I looked into various meetup options, but ruled them out for much the same reason. The ones I found were group study sessions where peers helped one another – basically stackexchange IRL.

Online tutoring with Wyzant

So I took a chance in a tutor on Wyzant. I was worried about the cost ($40/hr for the tutor I chose), but since the first session is free I decided to try it out.

I met my tutor for the first time this afternoon.  She was amazing!  It’s incredibly helpful to have someone who knows what they’re doing walk with you through your code.  I’ve done crit sessions with writing and art before, and I would put codereview closer to the crit side of the spectrum vs. the tutoring side.

We discussion some foundational CS concepts like layers of abstraction, scope, and the stack (and how/when it gets cleared out).  She clarified a lot of concepts I had read about and vaguely understood.  She also pointed out some problems with my code that I never would have noticed on my own.

For example, in my tictactoe AI when the user plays more than one game, I create a new instance of the board/AI objects for each new play.  She told me that if a user were to play a whole bunch of games in a row, that my current setup would lead to stack overflow issues.  This isn’t something I ever would have caught since I never played more than one or two games in testing.

All in all, it was great to be able to ask all the why questions that I never get to ask on online forums or when asking a quick question to a friend.  When she first pointed out the issue with my tictactoe game, instead of just saying ‘ok, got it’ and fixing it, I asked why it was a problem.  That led to a 10 min tangent on stacks and scopes, but it clarified the concepts I needed to know.

All in all, it was time well spent.  I’m reworking the programs we looked at together now and am planning on making our sessions a regular (weekly?) occurrence.  I figure $40 a week on tutoring is still waaaay less $$ than school and a worthwhile investment to learn to write legible and strong code!

Going back to basics: Calculus

There are a lot of great things about being an adult student. Today I started (re)learning calculus and I have to say it’s way easier this time around. I barely remember anything from high school, so it’s not easier because it’s review. It’s because I’m learning it because I want to and I know why it’s useful.
Those two reasons are tightly linked.  I’m learning it because I want to, and I want to because I know why it’s useful.
In school, we’re often told we need to learn things “just because.”  Because we need to get a good grade.  Because we need it for college.  Because that’s what people do.  None of these reasons are very compelling.  They might be enough to get you to study so you can ace a test, but they’re not enough to keep you going when things get tough.
And they’re not enough to get you curious to find out why.  And it’s knowing the why that makes things really interesting.

My love-hate relationship with math

I loved math when I was a little kid.  I took math courses (kumon?) when I was really little and I used to do the problems in my little paper booklet, then erase the answers so I could do them again.
In HS, I fell in love with calculus.  It was my favorite subject my senior year.  I worked really hard in the class and did well.  At first, I kind of tricked myself into liking it because I knew it was going to be hard.  I decided that because it was hard, I was going to love it twice as hard and make it ‘cool’ to keep myself motivated.  As Amy Chua wrote in Battle Hymn of the Tiger Mother, “Nothing is fun until you’re good at it.”  I worked my ass off in that class, got good at it, and had fun.
However, that wasn’t enough to carry me through in college.  I couldn’t stay awake during linear algebra (it was at 1pm, the dreaded post-lunch slump…) and I walked out after 30min of the first lecture of multivariable calculus.  On day 1 the prof jumped straight into the material saying he expected everyone to have the right background.  I thought I was in over my head and I just didn’t want to work hard for something that I wasn’t sure I needed.
I decided I just wasn’t a math person and gave up.
I gave myself permission to be bad at math, and bad I was!  I got a C in linear algebra – my final exam was like a nightmare.  I was staring at the paper and had no idea what anything was about.  I’m shocked I even got a C.  My senior year I took statistics and barely got a B.  I don’t remember anything about the class except that I would bring a homemade egg bagel sandwich for breakfast on those days.
I rationalized it by thinking I wasn’t a math person and moved on.  The thing is, most of us aren’t math people.  Or writing people.  Or drawing people.  We have to work to acquire those skills.  Some of us get started on that skill acquisition process earlier, so have a leg up when they get to HS/college/wherever, and that extra level of mastery makes it more fun for them.
Sure, there are the Maryam Mirzakhani‘s out there who probably do have some underlying natural ability, but I’m going to guess that most people just worked hard until it clicked.

Re-discovering math (and other basics)

This time around, I had a reason to learn.  As I’ve written about earlier, I’ve been falling down the rabbit hole of programming.  I’ve learned a lot, it’s been a ton of fun, but I’ve been hitting walls when it comes to the basics.
I started my journey wanting to make a robot.  I started two intro to AI courses (one on Udacity, one on EdX) but I had to quit both.  The Udacity course breezed through the interesting and complicated content and gave you way too much starter code so I didn’t feel as if I was learning anything.  The EdX course was better, slower paced with in-depth proofs and projects where you had to write programs from scratch, but a little over halfway in I felt stuck.  While my code was outputting the correct answers, I didn’t feel like I understood the material.
I decided to take a step back and spent a week on an Intro to Algorithms course on coursera. That was super helpful for understanding the value of primitives and the importance of running time, but it also made me realize I needed stronger math skills.

Calculus or Linear Algebra?

I vacillated a while between taking calculus and linear algebra.  I started watching the highly recommended Gilbert Strang lectures for linear algebra but kept feeling like I was falling into old patterns.
I was dragging my heels on calculus.  I had already taken it twice (once in HS and once two years ago when I blazed through the Khan Academy Calculus series with the thought of placing into a higher level continuing ed math class.  I didn’t end up doing that since I got a new job and got busy :/).  I was also starting to feel discouraged about my progress.
Five months into my learning sabbatical and instead of becoming a programmer I was going back to HS math.  Bummer.
But this has been my downfall time and time again.  I try to skip ahead because I’m impatient, but later regret not taking the slow and steady route.
I’m happy to say I learned from my past mistakes and am taking the slow route, which means taking single variable calculus.
There’s a lot of rust for SURE and as the prof said in one lecture, the calculus is the easy part. It’s all the geometry, trig, and algebra you need to do everything around the calculus that’s hard.

To binge or not to binge?

Today was my first full day of calculus.  I got through a few days of lectures and half of the first problem set.  I even caught an error in the homework solutions (and another one on the blackboard in the lecture…I emailed MIT to suggest a correction for that…we’ll see if they respond!) 🙂
I’m trying out binging to see how it goes.  I find it difficult as a full-time self learner to toggle between courses.  In school, you easily take 3-4 classes a semester.  The schedule is imposed on you from the outside.  With online lectures, I end up doing about a week’s worth of material in a day.  It just seems easier to click on to the next video than to stop and change gears to a different subject.
So I did 4 weeks of an algorithms course in ~4 days, and have finished 3 lectures worth of calculus in a day. If you think about it, it adds up.  The algorithms class suggested working 8-10 hrs a week (about a day’s work) and the MIT class is about the same.
So far I haven’t had any major stumbling blocks where I have to pound away at one problem set for 10+ hrs, but I’m sure those days will come and the 1week = 1day ratio will slip.
I’m also planning to experiment with different learning methods.  I’m concerned that binging will lead to poor retention.  I’ll finish the calculus class in two weeks, but then a month later if I try to do multivariable calculus I’m worried I’ll have forgotten everything.
One thought is to try binges by day instead of by course, e.g. Monday = calculus, Tuesday = algorithms, just to give a little time for things to sink in.
In any case, it’s all an experiment!  We’ll see where it goes!