make better_mistakes

Birthday

On my twenty-ninth birthday I got let go from the job I had been on for less than two months. I was hired on at a low rate to move files between servers, and I decided to write a PowerShell script to speed up the process. I improved productivity by an order of magnitude. As in, my project manager told me “the guy who was doing this before you would do in a day what you’re doing in an hour!” They were really excited to have me working so efficiently that they gave me a raise, and I was glad to be tweaking a shell script to do this. (Incidentally, if you’re in a Windows environment, don’t use your own shell script to do this, run robocopy.)

I’d been unemployed for a long while, and I was just glad to be working again. And on top of that I got to program a bit–sure Windows PowerShell wasn’t my preferred environment–but it was great to fix a problem with some code.

And then they gave me the call. I was working from home the day before my birthday, and I had ended up taking a long late lunch with my partner. I had a shell script running at home. I was on the bus home when one of the recruiters at the consultancy called me and let me know that this was my last day. I brought in my equipment the next day, and that was that.

The only jobs I’ve ever been let go from were ones I didn’t like that much in the first place. In this case I accelerated my departure from the project by doing the work very effectively.

“[Developers’] principal work is human communication to organize the users’ expressions of their needs into formal procedure. That work will be necessary no matter how we change the life cycle. And it’s not likely to be automated.”Peopleware, Tom DeMarco and Timothy Lister

About a month ago, I started working as a web developer for Contour. This is the job that I wanted a year ago. This is the job I was hoping for while I was teaching myself Rails while visiting my family in Guangzhou.

I’m really glad to be working where I am, I like the company and my coworkers and I find the work challenging. I’m planning to take the steps I need to really level up in this role, including taking a nine-month night course on Ruby and Rails at UW. I’m finding it difficult to find the time outside my forty-hour work week to focus on self-teaching, let alone finding the time to contribute to open source. (My apologies to Ryan Bigg, I haven’t been able to review much of Rails 3 in Action at all yet.)

This struggle between work and life balance, it’s to be expected, especially when you actually have a life outside of work.

This weekend I turned thirty, and celebrated with barbecuing, beer, backyard reading, blueberry scones, and a new backpack. I’m beginning to figure out what I want to do with the one life I’ve been given, and I’m really glad to be working a job that I like. The weekends go by so quickly, and the workweek seems to move even faster. I’m blocking the time I can to learning what I can. And I’m really happy that I convinced myself I could teach myself to code well enough to be a professional, I think that it’s going to be a really satisfying career.

How to Create a Local Sandbox Facebook App

Note: this walkthrough only handles UNIX-y environments, like Linux and MacOS.

Facebook makes it easy to get started developing an app that integrates with their service, but I ran into a snag that confused me when I was trying to test my app locally. Here’s what I did to resolve the error below, which is thrown when you first try to log in on the Facebook Ruby-based app on localhost:

{
“error”: {
“message”: “Invalid redirect_uri: Given URL is not allowed by the Application configuration.”,
“type”: “OAuthException”,
“code”: 191
}
}

To get started login to https://developers.facebook.com/ with your Facebook account and click Get Started. Under Create a Facebook App, click on Developer App and Create New App, Name it (“Brony Finder”), Give it a Namespace (“og_brony”) and click the ticky-box for Heroku web hosting. I grumbled at having to provide a mobile telephone or credit card, and then moved on.

Select your environment and the email address you would like this Heroku app to be associated with, in my case, Ruby and strand@bettermistak.es. Your new app lives at https://thing-stuff-1234.herokuapp.com/. Mine was https://electric-robot-2715.herokuapp.com/.

Login to Heroku and head to ”My Apps” Click on general info and copy the git address under Git Repo. Go to the command line and in the directory you want the code to live in enter the following

git clone git@heroku.com:electric-robot-2715.git # Clone your app.
cd electric-robot-2715/ # Move into the app directory.
echo FACEBOOK_APP_ID=12345 >> .env # Add your App ID to the local environment.
echo FACEBOOK_SECRET=abcde >> .env # Add your secret to the local environment.
bundle install # Install gem dependencies.
gem install foreman # Install Foreman.
foreman start # Start Foreman.

Navigate to localhost:5000 in your browser and click “Log In.” Oh no! you get OAuthException 191! This had me stuck for a few hours, and all I found were a few confusing Stack Overflow posts about it.

Facebook verifies that all requests for your app are coming from the right domain–they don’t allow requests from localhost or 127.0.0.1–and this info can be updated in your apps settings under Hosting URL. Add “local.herokuapp.com” to your Hosting URLs and save this setting. Then edit your /etc/hosts file so that local content is under the domain local.herokuapp.com. This file is hidden, so from the command line enter sudo vi /etc/hosts. (Substitute your favorite editor for vi.) We need to use sudo, because this file is locked. Add the line “127.0.0.1 local.herokuapp.com” below “127.0.0.1 localhost” and save and quit your text editor.

Hit control-c and run foreman start again. Now test your app at http://local.herokuapp.com:5000/.

Happy Hacking!

FizzBuzz in Ruby

As a quick followup to this week’s earlier post demonstrating FizzBuzz in CoffeeScript, I give you FizzBuzz in Ruby.

FizzBuzz in CoffeeScript

This afternoon I had an interview which I arrived twenty minutes early for. I wondered if they might have me do a demonstration of coding skills, and remembered that @kerrizor is sometimes asked to use FizzBuzz to demonstrate competency in interviews.

So while I was waiting in the lobby, I decided to generate FizzBuzz in CoffeeScript. This is what I came up with:

The RSpec Book

The RSpec Book teaches how to build and refactor code using RSpec and Cucumber. I started it a few weeks ago, and set it down in preparing for my return to the States. I started it again last night and I’m glad that I was able to hook back in to the book even though I’d not looked at it or its code in more than two weeks. It is well written and approachable, written at a granular enough level that it is easy to set down for a while and not get lost when you pick it back up.

One thing that I am loving about The RSpec Book is that the chapters are short, and do a good job of guiding you through the process of building applications in a Behavior Driven Development style. Each chapter takes between twenty and forty minutes to complete, so even if your study time is constrained you can make some substantial progress.

At the moment I’m in the middle of the chapter “Refactoring with Confidence” in which the authors use a number of refactoring patterns outlined in Martin Fowler’s Refactoring. My roommate happens to have a copy, so I’ll be adding that to my reading pile and hopefully I’ll be able to find the time to start reading it soon. I am really enjoying the style of BDD, as its outside-in process helps me define the problem I want to solve, and guides me through the best ways to solve it.

Realistic Goals

I’m a little disappointed in myself for not posting anything in the last month.

It’s been an exciting month too. My partner and I have returned to Seattle, and I’ve started working with mentors to establish myself as a web dev. I’ve been devoting time to studying an working on projects, and I’ve become a little more forgiving of myself if I fail to absorb all of the knowledge at once. In fact my primary goal at the moment is a simple and incremental one. I want to devote more time to working on projects and studying each week than I did the week before.

I think that is a realistic goal, because it assumes merely that I can do a little better than I did the week before, and I find it interesting that it is a relative goal as well. I had a realization a few weeks back when I was looking at a goal of reading a certain number of pages or working through a certain number of chapters. I found that I didn’t know what setbacks I would encounter, that it was difficult for me to estimate how much work I would be able to do in absolute terms, because there are always unforeseen roadblocks.

I can however, put in the time. So I’m going to try and work a little more every week and see what I can accomplish with a bit of incrementalism. I will eventually amend this goal to focus on increasing the quality of my work, but not until I’ve increased my weekly capacity from twenty hours of devoted work (which takes thirty to forty hours, I’m only counting the time my eyes are on the page or my brain and fingers are on the code) to about thirty hours a week. At that point I can be reduce certain less useful kinds of work but for now I just want to do better today than I did yesterday.

What Are You Planning to Do?

Yesterday an efriend direct messaged me: What are you planning to do since you didn’t get into Hungry Academy? Just curious.

Good question.

I would like to find a junior web dev position, but the path from here to there is not clear to me yet.

My partner and I are looking at going back to the States, the culture shock has been especially rough for her and we both miss our community in Seattle.

On my window above my desk I have a post-it I wrote to myself yesterday, as a contingency plan for not getting in.

If I don’t get into Hungry Academy:

This has two parts with actionable steps that begin to chip away at two problems exposed by the HA application. The first problem is I have mediocre interview skills and this means that I only get mediocre jobs. Interviews are rare events that have a significant impact on my future. Interviews are a game that I can increase my odds on, and I haven’t done a sufficient amount of work to get really good at answering questions like, “Where do you see yourself in five years?” An immediate next step to get better at interviewing is to solicit feedback from LivingSocial.

The second problem is I am still learning to code, and it’s going slow. I can continue to work on my own through whichever resources strike my fancy, but that’s a plan for slow-moving disaster. There are a lot of things I can work on, but I don’t have the judgement to know which things will be best for me at this juncture. An immediate next step to lay down the groundwork to improve my coding skills are to find mentors. Steve and Matt have both been awesome efriends, and I hope I can establish some checkins with them to ensure I stay on the right track.

Hungry Academy will be seeking applicants again, and if I’m on the market when they are, I will apply.

I also want to attend Ruby conferences, but there’s the chicken-and-egg problem of not having enough money to travel because I’m unemployed, and thus not being able to make the connections which could lead to employment because I can’t justify travel.

It’s looking likely that we’ll be back in Seattle before the end of February, and I will be looking for work to support our household. I hope that I can find a part time position to allow me to continue learning web tech until I am more qualified for development roles.

TL;DR Keep trying, hope I don’t run out of money too quickly.

Thesis

Make Better Mistakes is the idea. We all make mistakes every day, even when our perfectionism has locked us into the paralysis of doing nothing. Doing nothing is often a big and repeating mistake. Aim to make your mistakes small and individual or iterating. Small mistakes give you faster feedback. Individual mistakes give you more unique experiences to draw upon. Iterating mistakes keep you on the path, but allow you to guide course corrections.

Reading List

This was a jumble written on a plane, please forgive the incoherency.

Today I am flying from Guangzhou to Washington DC by way of Tokyo to interview for Hungry Academy. I feel like I haven’t updated this blog since I got to China. It’s been a very full January for me. The first two weeks here were culture shock and settling into our new home, the third week was minorly productive for me, I managed to study for 9 half-hour sprints before my aunt and uncle arrived in town for the Spring Festival.

I was also nervous as heck before my phone interview with Living Social regarding Hungry Academy. I managed to chat with them around 3:30 AM Saturday morning, China time.

I’ve touched down at Narita for two and a half hours, and thought it might be a good exercise to write out all of the books which I am reading at the moment and what I am getting out of them.

The Pragmatic Programmer by Andrew Hunt and David Thomas — I’d read the intro to this several months ago and have been meaning to read it since. I’ve taken this plane ride as a chance to absorb it. I can tell already that this is a book that I will revisit as I advance in my career as a software developer.

The Fault in Our Stars by John Green — I’m a fan of Green’s YA fiction, as it handles the challenges of its genre extremely well, and aims to be fiction about young adults, not merely fiction to be consumed by a YA demographic. I just started his most recent novel which is about a young woman with cancer.

Non-violent Communication by Marshall B. Rosenberg — My partner and I have been reading this book aloud to each other at night before bed. It aims to teach the language and practice of empathy for self and others. I have noticed that both my partner and I—we are both excellent communicators—have improved our empathic communication skills since we began reading it. I anticipate re-reading this book. Highly recommended for anyone who communicates in their day-to-day life

Them by Jon Ronson — I read Ronson’s The Psychopath Test this fall and really enjoyed his pithy style and engaging non-fiction narrative. Them is an earlier “novel” about extremists in the late nineties and early two thousands. It’s not as good, as there is not as much connective tissue between the different types of extremists, but I look forward to seeing the parallels Ronson draws.

Rails 3 in Action by Yehuda Katz and Ryan Bigg — Katz and Bigg do something very difficult extremely well: They have written an enjoyable to read introduction to Rails with a focus on test-driven and behavior-driven development using Cucumber and RSpec. This isn’t my first Rails book (that was Agile Web Development) but it’s the first one I ‘ve found fairly engaging. I could attribute that to a greater sense of patience with technical books, but I suspect it actually has to do with the pattern of development that the book is based around.

The hidden bonus feature of this book is introducing you to test-driven development. Using Rails sometimes seems like a mystical art to me, but using Cucumber in particular has given me guidance as to what my next steps are. I will definitely be studying TDD in greater detail in the future, as introductory books lose me at times when they introduce how to do lots of things in a language or framework, but refrain from informing me clearly why I am doing it. The pattern of write test -> implement features -> run tests is infinitely reusable and will save me time as it leads me towards better practices.

Walden by Henry David Thoreau — Classic book on holing up in the woods and living simply. Thoreau affirms my belief getting rid of my stuff or not getting stuff in the first place is one of the best things I can do to improve my spiritual and mental clarity. Choice quote: “As long as possible live free and uncommitted. It makes but little difference wether you are committed to a farm or the county jail.”

That’s what I’m working on at the moment. I hope the interview goes well, and wish I’d been able to eat my uncle’s jiaozi today.

New Year in Guangzhou

SEA -> BEI

I am on the flight to Beijing, after having moved out of my apartment and stored boxes with family and friends. Last night was a late one, drinking cheap wine on a friend’s futon with my partner at two in the morning, letting the cheap wine soak our systems which were already coursing with caffeine from nine in the evening coffees.

This feels risky. Every part of my body says the safe bet would have been to stay in Seattle, find a job, any job, and work that for a couple of years till something better comes along. Something better isn’t coming along. Maybe I just wasn’t looking hard enough, but it looked doubtful that satisfying work was coming my way, no matter how hard I chose to look.

I did make one good stab towards my goals this week, despite the madness of moving. I finished my application to Hungry Academy, an apprenticeship program sponsored by Living Social with instruction by Jumpstart Lab. I posted my application video and a code sample. The video was ok, I did several eight minute takes and the last one felt good enough. The code sample I chose was a pull request wherein I had altered some of Brandon Mathis’ code from the Octopress Pullquote plugin. There are very few alterations to the code, but it is the simplest solution that works, and this choice of project will hopefully demonstrate that I am capable of reading other’s code and adapting it. Also, able to contribute usefully to existing projects.

I really hope I get in, though the time commitment the program requires, along with it being DC-based might force my partner and myself to live apart for five months.

I reflected on last week’s goals and what worked and what didn’t I recognize that the thing that I need to focus on isn’t chapters or pages read (though these may end up as good metrics) but instead I should begin to focus on hours spent studying. I think that next week I will attempt to read Rails In Action for 12 hours. Which means I’ll need to read for two hours and twenty four minutes each day. I believe this is a completely achievable goal.

The other part to making this work is recording a metric other than time to see if I can improve. Though not all pages are equal, I’m going to track my page count, so that in the future I can improve my pages read per hour or day.

On the Ground in Guangzhou, Day Two

We arrived in Guangzhou late at night, 10:20 PM China time. We subtract sixteen hours to figure out the time in the States. it was 5:20 AM back home in Seattle. We are exhausted from running through the Beijing airport after one of our bags disappeared. Both my partner and I had small meltdowns in the airport, and she barely slept on the plane. My brother and his wife pick us up from the airport and we cross into the new year while riding the Subway from the airport closer to their apartment.

Yesterday was a shopping day, including a long and exhausting trip to IKEA. We’re crashing in the extra room in my brother’s flat until we can furnish the apartment we’ll be staying at in the building above my brother’s brewery.

I think that acclimating through the jet lag and minor culture shock is going to leave me low energy, and it’s already Monday evening. I’m going to set a realistic goal of eight hours of reading this week, two hours each day Tuesday through Friday. I’ll set aside time and space away from my family to make this happen and hopefully also be able to check in at the end of the week.