Code Haven

Hacker School: Week 7

I’m in the second half of Hacker School, feeling short of time and not sure what to do about it. My only option is to keep showing up every day and getting things done. I sit at a long table in a huge room or abscond to my personal favorite work space, a living-room-like corner with a high ceiling, a metric ton of computer books, and a metal staircase leading up to a door that doesn’t open.

On a beanbag or couch in this corner, surrounded by books and people hacking on projects and a robot mural painted on the wall, I feel equally at home and unsettled.

After focusing on C for two weeks and then an Xcode plugin for a month, I’m switching my “learning” focus to JavaScript and node.js. I’m using the excellent Learn JavaScript Properly outline suggested by Richard of Stanley, and so far it’s going well.

Turns out I like JavaScript. A lot.

This is sort of a surprise to me, because I’ve heard JavaScript is weird. Inconsistent. Unreliable, even.

But I resonate with the C-based parts of the syntax, and it’s helping me understand the function-based parts that aren’t quite the same as Objective-C’s classes and methods. I’m learning from a solid base. And that’s reassuring.

I also feel like I can eventually build almost anything with JavaScript, and that’s motivating. I don’t feel like I’ll need to learn it for six months before I can do anything useful.

My “building/maintenance” focus remains on expanding and extending the plugin, so I have two tracks to switch between. This is my best mode of working, because even procrastination can become productive — if I get tired or burned-out on one thing, I can switch to the other. It also ensures I write code consistently and don’t get bogged down in only book-learning.

I’ll write a full-on technical post about the plugin soon.


Day 89: Victory

I cannot begin to describe how happy this makes me:

Terminal output from Xcode voice recognition plugin

And this:

Xcode voice recognition plugin

I went back to the voice recognition plugin. I thought about it differently. And it works.

It’s not perfect. Far from it. But the key bottleneck is broken. This basically means everything I want to build, from a functionality perspective, I’ll be able to build.

I’ve never actually experienced this in coding before. I always just had someone help me through the hard parts, which was good for productivity but meant I never really learned to work through a tough problem in code. It’s awesome.

Referencing the “Day 89” in the title of this post, it’s Day 89 since leaving my job. Day 31 of Hacker School.

Things Accomplished versus Distance Covered

I’m in week four of Hacker School.

It’s awesome. But I’m struggling with a dilemma: balancing the tough problem and the maximum ground.

I view Hacker School in terms of two metrics: Things Accomplished and Distance Covered.

Of course I want to accomplish some things. I have a whole list of things I want to accomplish, some while at Hacker School and some afterward.

But the whole point of doing Hacker School, for me, is to learn the maximum possible amount in the time given, so that I become a much better programmer for whatever comes next.

This means I also need to keep an eye on the Distance Covered.

It doesn’t mean I will abandon tough problems forever; but it does mean I don’t want to spend the entire 11 weeks on one problem without any guarantee that I’ll solve it in that timeframe.

Asking the Right Question

So I’m forced to balance things. The right question is not, “How long will I spend on a particular project?”

The right question for me is, “Given the rate of progress I am making, the amount of code I am writing, and the amount of learning going on, how long will I spend on a particular project at Hacker School?”

That’s why I’ve decided to set the voice recognition project aside for now and continue forward with my Hacker School plan by turning my attention to Swift for the next two weeks.

But I Love Tough Problems

I wasn’t too happy about this decision, because my experience has been that the projects and problems I delve into tenaciously and refuse to let go until I’ve figured them out always produce my greatest successes and joy. It was true with high-speed trading risk controls at my prior job. It was true with health issues that I defeated.

But those projects take years, not weeks.

I don’t have years at Hacker School. I have time to learn a lot about a lot, meet and enjoy working with great people, and build a base for tackling the really tough problems afterward.

The Nights-and-Weekends Compromise

I discovered that the voice recognition project is 100% doable — it just requires a lot of work. More work than I have time to dedicate to it at Hacker School.

So, my compromise is to make it a nights-and-weekends project, while spending my time in the Hacker School space completing my Hacker School plan.

That means Swift for the next two weeks and then a shift to JavaScript and node.js.

Meanwhile, I’ll be mulling the voice recognition project in my spare time, which is probably the best way to tackle tough problems that are at an impasse. I will figure it out. But I will also accomplish other things and cover the distance.

Say What? My Voice Recognition Dilemma

I tried Mac Dictation this week. My goal was to get a few simple sentences to appear in a text editor. Initial experiments were not successful. The full sentences I attempted were garbled beyond recognition when they appeared on-screen, so I fell back to word-by-word communication.”Make.” Made. “Maaaaaake….” Mate. No. Try again. “Maaaaaake….” Made. No. “Create….” Create. Aha. Victory is mine! “An.” In.

I progressed word by word, slowly and carefully, and my text editor dutifully showed the words on the screen with numerous errors. This was not production-ready. No one wants to talk as if they’re scolding a recalcitrant pet.

To be clear, I’m not a marble-mouthed mumbler. I’ve recorded books on tape for Recording for the Blind and Dyslexic (now Learning Ally), and I know I can enunciate well. But Dictation couldn’t understand my voice.

I knew that if I couldn’t get text to appear on-screen, I couldn’t complete my project. I’ve started coding the next part and it’s feasible, so I really want this to work!

So, I Googled for my options:

1.) Try to improve Dictation’s performance by improving my computer setup;

2.) Buy Dragon Dictate and hope it runs on my underpowered 2011 MacBook Air and has better accuracy than Dictation.

3.) Abandon OS X entirely and do the project in a Windows virtual machine with Dragon Naturally Speaking for Windows.

4.) Try using OpenEars to build an iOS app that does the same thing.

Only the first two options really get me to my initial goal; the last two are pivots that require adapting to different platforms and approaches.

So, tomorrow I’m buying a USB headset to eliminate ambient noise and provide a clearer dictation experience. I really hope this improves Mac Dictation’s performance by leaps and bounds. If it does, I’ll be off to the races. If it doesn’t, I’ll be installing Dragon Dictate on a machine not made to handle it.

I’m heartened by the discovery that once I get the text on the screen, my goals can be accomplished. I’m discouraged by how difficult it is to actually get the text on the screen. But discouraged does not mean “gave up.” It means I’m thinking hard about the options.

What I Wish I Knew About Computer Science in High School

I wish someone had explained Computer Science to me when I was in middle or high school.

Not the syntax of whichever language the school’s computer lab chose to use, not the same-old contextless exercise of adding two numbers together and producing a result, but what it would mean to choose a life in computer science.

A life as a maker, not a consumer. A life of flexible work options based on my own skill, drive and preferences. A life of curiosity and endless learning, with earning potential directly dependent on risk taken. A life of developing the ability to benefit society firsthand, either alone or in a team.

That’s what I wish I knew.

I majored in journalism — not a terrible choice in the 1990s, but better as half of a double-major with a more practical complement.

Fortunately for me, I taught myself HTML and Linux, then chose to work in online journalism and enjoyed several years of walking on fresh snow. I never forgot that feeling.

I went back for a technical master’s degree but shied away from pure Computer Science because I was afraid. Afraid I couldn’t compete with people who’d been coding since they were 12, who majored in CS at college the first time around, who were wizards.

I tried a few CS classes or books periodically — C, Python, JavaScript — but always found them incredibly difficult compared to other subjects, so I assumed I wouldn’t be good at programming.

I didn’t realize that intense difficulty is normal in CS. No one told me that everyone goes through it, that the learning curve is so steep you can’t even seen the first base camp when you start climbing Code Mountain. All you see is clouds.

I finally picked up Aaron Hillegass’ awesome Objective-C book in 2012. And an amazing thing happened: From cover to cover, I understood it.

Which is how Objective-C became my first (real) programming language.

I spend a lot of time now thinking about how to change this story for future nerds. Why didn’t anyone mention computer science to me when I was in high school? Why did it take so long for me to find the right explanation? What was it about Aaron’s book that made it the right explanation? And why don’t more people talk about the broader context instead of M_PI when teaching CS?

Simplicity in CS is just plain scarce. Addressing questions like:

  • What are the basic building blocks of code?
  • How can true beginners understand these concepts?
  • How can they transfer those concepts to different languages and build on them in more complex projects? (I found there was a true roadblock as I got deeper into iOS, which I overcame by attending the Big Nerd Ranch bootcamp in person, but not everyone has that option.)
  • How can they climb the intense learning curve successfully? (Just acknowledging up-front that it’s intense for almost everyone would help.)
  • How can they understand what studying computer science means, from a productivity and career-potential and lifestyle perspective, if no one ever tells them?

In short, how is computer science not required by default in public schools yet? And how is it so poorly explained by the vast majority of teachers?

It is not rocket science. And it doesn’t have to be explained that way.

Hulk, Smash! C for Fun

I struggled with Learn C the Hard Way. I wasn’t engaging with the exercises. I typed and typed and tried to motivate myself, but C’s function-based flat-file-ness and inscrutable function names stymied me.

This was the language I’d failed to learn twice before.

This morning I spoke with Jessica McKellar, a resident at Hacker School, and she turned this whole thing around.

She suggested ditching Learn C the Hard Way and instead learning C a different way, by diving into a book called Hacking: The Art of Exploitation. This made sense to me for two reasons:

1. Although I have no significant background in C, I studied information security in grad school and have broad context around network security.

2. It sounded much more fun.

After speaking with Jessica, I sailed through 100 pages of Hacking: The Art of Exploitation, typing code when I felt it would be useful and reading the book when I felt that would be useful and even, as a bonus, learning a little bit about how assembly language works.

I can’t wait to get back to it tomorrow. This experience reminded me that pivoting is not just for business ideas. If I’m learning something and not loving it, there is almost always a way to switch tracks without giving up.

This is some kind of basic life lesson that I have been forced to learn over and over. Keep adapting, and it’s almost impossible to fail. Fail to adapt, and failure becomes almost inevitable.

The Startup Weekend Roller Coaster

One thing I promised myself when my journeys began was to do things that scared me.

This weekend I did something that scared me. I jumped into Startup Weekend Social Impact Edition with no plan and no idea what to expect, and emerged amid a solid team working well together around a good idea.

Friday night, I pitched an idea that I came up with on the spot. I wasn’t planning to pitch anything at all, but thought it would be a good experience to try it. My idea wasn’t selected, so I joined a team and prepared to work all weekend toward our goal and have a great time.

By Saturday afternoon, our project was in disarray. Disarray. Our initial market research — the part where we actually left the building and talked to people — indicated our product might not resonate with people. We knew we should pivot. But we didn’t agree on which direction.

I felt myself curling up inside and imagined spending all weekend just arguing about the product, without actually making a product. I didn’t know which direction we should go, I just wanted to spend the weekend making something. So I put my head down and kept coding. At worst, I figured, I’d make an app prototype that we could tweak when we settled on an idea.

Two of our team members left. I felt bleak. It was late afternoon, and we didn’t have much to show for it. And then suddenly (I’m not really sure what happened here), it turned around. We decided on an idea, which was close to our team lead’s original idea, and just went with it. No one seemed initially overjoyed, but from that moment we were okay and things started clicking.

We spoke with mentors. We iterated. We shared ideas and split up tasks and generally worked productively and well together. It was fun. I’m not sure what changed. It’s like the pit of despair opened up and there was a path and we decided to get up and walk down it to somewhere.

We worked productively until 11 p.m. Saturday and then disbanded for sleep or social life, reconvening on Sunday. We created and refined our pitch deck and finished web and app prototypes. Finally, we presented our pitch and demo to a panel. Our service seemed to strike some right notes, and we received constructive and thoughtful feedback.

On the whole, I think our presentation was a success and our proposal was viable — nearly unthinkable on Saturday afternoon. I’m not sure what will come next. But this was a valuable experience, and I’d do it again.

Here is our web prototype and our app prototype code.

Key takeaways: It is so vitally important to seek customer and market validation early. Negative market feedback is a great opportunity to adapt and learn. Sticking with a team instead of an idea is a great idea.

Hacker School, Day 3: Xcode Plugins and C

Kicked off this morning by writing an Xcode plug-in that loads correctly and sets a custom menu item. The next step is to make it function, and I fully realize the hard work lies ahead. I like that the goal of the plug-in is increased accessibility.

I also made slight progress in understanding C, which may be helpful since the iOS stack of Swift, Objective-C and C likely will coexist for a while.

I came home and researched Xcode plug-ins, Sublime Text, and iOS note-taking apps for hours. I know where I want to go, and I’ve specced out functionality, so it’s a matter of figuring out implementation details. I’m enthused and have a plan for tomorrow and Friday.

And I really do intend to learn C somewhere along the way.

I’m not tired at all, but it’s time for sleep anyway.

The Explorer’s Dilemma

Exploration is much harder and much easier than it once was.

Physical exploration is much harder. Humans have swarmed across the planet, marking territory, discovering caves, streams, mountains and seas. Aside from the deep seas and the magma lakes below Earth’s crust, little remains to be discovered. I’m immensely fascinated by northern Canada, which remains sparsely populated, especially in places like Baffin Island.

Intellectual exploration and innovation are exponentially easier. The Internet has made huge quantities of information available to nearly everyone at fast speeds. And it’s easier to find people to work with on projects and problems, because they can be next door or on the other side of the planet.

I’m engaged in this type of exploration at Hacker School. I spend all day in a room alongside other skilled people with various backgrounds and interests, and we try to learn a lot rapidly and solve interesting problems.

Today I made good progress: I brainstormed approaches to a speech accessibility project; worked on Learn C the Hard Way, including a pair programming session on C switch statements; and attended sessions by resident Mel Chua on learning styles. Learning styles aren’t destiny: They reflect personal preferences and natural tendencies, but it’s possible to become comfortable in a non-innate style.

My personal learning style is somewhat reflective, extremely intuitive, evenly visual and verbal, and somewhat sequential. I’m constantly seeking connections between different ideas, then piecing them together in a logical way toward a goal.

What’s great is that thought patterns and ideas are not a finite resource. They’re endless, endlessly renewable, and endlessly interesting.

Hacker School: Day 1

Day 1 at Hacker School. I wasn’t sure what to expect.

I imagined a loud space. A noisy place. An echo chamber, or a concentration vortex. I was a little worried, since I need quiet to concentrate sometimes.

I found a large space, a focused place, a concentration vortex of the good kind, and a group of people ready to share their expertise and make our first day as smooth as possible.

Any day that starts with meeting 60-plus people who are all interested in learning and creating is a good day.

Today, as expected, was a setup day — meeting our cohort and facilitators, a brief check-in to discuss goals, welcome and configuration sessions to make ourselves and our computers ready for three months of intensive work, a git session, and a bit of free time to work on our own projects. At night we headed to eBay for a talk on distributed systems, which I enjoyed and followed up with further reading.

A giant stretch of free time awaits me tomorrow. I am so looking forward to it. I’ll be surrounded by other people making the best possible use of their time — and that motivates me.