Night & Day
Let's open with a cliche: What a difference a day makes.
Yesterday was Friday. An RC batch runs M-Th for “normal” days, reserving Fridays for prepping for interviews and job related stuff. The point is to bracket that time and that stress so the rest of the week we focus on programming, not job hunting. That's smart. Another example of removing the barriers to improvement.
Yesterday we did a practice interview project: spend 3 hours building a link shortener ala bit.ly. I had a great time hacking on some Ruby and I was able to build a working prototype in the time pretty handily using Sinatra and the stlib. I was quite surprised, actually, that it all came together pretty smoothly and I had time to build a few iterations, starting with something working, then improving validation of URLs and the structuring of more complicated links, then building in error messages. I even got it deployed here [mta.lol]. Basically I'd say it was a great ego boost and reminded me that I can actually program pretty well.
Then came the rest of the day.
I spent about three hours trying to implement a fairly straightforward algorithm (insert sort). I can't do it. I must be stupid, and lazy to boot. I left feeling really down, discouraged, and worried about my future prospects - would I ever be able to successfully pass a whiteboard interview?
Here's another version of yesterday:
I'm not stupid or lazy; evidence is entirely to the contrary and so that's a just useless story I told myself. I'm a human, not the Cyborg I expect myself to be (Thanks Kathy Sierra [https://www.youtube.com/watch?v=FKTxC9pl-WM] for making this distinction). The truth is that I'd actually woken up at 7am to go a Gov't office, spent the week getting over a cold, had trouble sleeping pretty much every night, worked very hard at learning a new language over the week, programmed an ALU, and spent that very morning programming something I cared about. Honestly I killed it in the morning (I say so myself, but I'm proud of what I got done).
And this morning, Saturday, I got up, looked over the code I'd stuggled with, quickly wrote some binary-tree functions in Go and then banged out an insert sort in Ruby. The difference was major.
Slowly I'm coming to honor my limits and capacities. Slowly I'm learning that effort and persistence are much more important than a given outcome over the long run (ie. can I program this algorithm in the moment, or can I work hard, learn it, and keep learning over my career). And I recognize now that I've been hampered in my life by a fixed mindset [https://en.wikipedia.org/wiki/Carol_Dweck]. Coming to this field without CS schooling, I feel pretty inadequate sometimes. But learning to program at all has started to break me of that mental habit, though it still rears its ugly head.
At the end of the day I talked to John [http://workmajj.com/] about my discouragement with the algorithms practice and he had this to say (paraphrase):
Programmers as community tend to celebrate algorithmic facility, but there are lots of problems in software that have nothing to do with algorithms.
I'm not saying I'm going to ignore that learning; to the contrary, I know that its just matter of putting in the time and I never want to be held back by a weakness in this area. But I do know that programming is a big tent and that I can find my place in it - even if writing a merge-sort doesn't yet come naturally.
- I wrote this during my time at the Recurse Center [www.recurse.com] and thought it was generally relevant to folks learning to code. ↩︎