The Obstacle is the Way – Ryan Holiday – Random Thoughts on a Book I Read


We all deal with difficult situations. Maybe we feel stuck in a job we don’t like, maybe we’re struggling with money, or maybe we’re dealing with a rough breakup. Our instinct in these scenarios is to react with anger and frustration, even when on some level we know these reactions are neither productive or satisfying.

The Obstacle is the Way is a book by Ryan Holiday that attempts to get the reader to perform a classic redirect – turn your struggles into an opportunity. Holiday takes the classic teachings of the Stoicism and provides a modern context for millenia-old philosophies.

Holiday himself is successful marketer and author – this being his third book behind Trust me, I’m lying and Growth Hacker Marketing. Holiday is a successful marketer, having worked as lead Director of Marketing for American Apparel and as a media strategist for several successful authors, all at the ripe old age of 27. But unlike his other books, this book is less about Holiday and his knowledge than the philosophy that defines many of the brightest minds of the past and present.

The message of Holiday’s book, like the philosophy of Stoicism, is to take the problematic situations in our lives and turn them into opportunities for positive action. Through examples ranging from Greek orators to tech giants to sports stars, The Obstacle is the Way argues that the most successful people are those that don’t avoid problems, but instead use them to their advantage.

Stoicism is all about turning crisis into opportunity, and not letting anger or fear bias your decision-making. A Stoic adapts his actions to his or her world, taking the opportunities in front of themselves instead of wishing for better fortunes. In gambling terms, you play the Ten-Two Off-suit you’re dealt instead of wishing for pocket Aces. Whether or not you know about Stoicism itself, you’ve probably heard of such a philosophy before – several different historical figures and modern entrepreneurs echo these values, be it conscious or coincidental.

The Obstacle is the Way reads like a mix between philosophy and self-help, but without becoming too condescending about its message. The result is that the core tenets of Stoicism are easily contextualized in the common problems we face, and the reader can easily see parallels to their everyday lives.

I can empathize with falling into the traps Holiday discusses. Most of the early jobs I held out of college was was work I knew was temporary, and I questioned the value in seriously investing myself in the experiences. I’ve come to regret this decision, as I passed up or missed out on several opportunities to learn new skills or become a more well-rounded professional. Nowadays, I try as hard as I can to embrace the work I have to do right now and learn as much as I can in the process.

I finished reading this book while I was in the middle of a whirlwind 70 hour work week at a conference. Like any major live event, the days were filled with stress, crisis and attempting to make sure neither is obvious to the audience. This book helped ground me at the end of the day, reminding me that I need to focus on using the problems that arise as opportunities, instead of letting uncertainty or anger take over.

For example, when a certain website that attendees needed went down, it was an opportunity to discuss and get feedback on the tools we use to communicate information to our members. I received a lot of valuable feedback that I wouldn’t have otherwise heard. Instead of just panicking or putting “out of order” signs everywhere, we started new and meaningful conversations.

Stuff goes wrong – nobody escapes that inevitable fact. However, Holiday’s book and the teachings of Stoicism show us that we can use these mishaps to either learn for the future, or find new approaches to old problems. If you’re interested in some easily accessible philosophy without digging deep into the classics themselves, The Obstacle is the Way is a great place to get started.

Writer’s block is an excuse. Beat it with a few simple tricks.


You’re ready to get to work. You sit down, ready for another day of working on your blog, set your music to your favorite playlist, shut off your email and-

Nothing. That bit of your brain that usually clicks into writing mode fails to fire. You find yourself struggling to string a concise sentence together. The few words you are able to write feel like pulling teeth. Suddenly a normal task feels impossible, and you don’t really know why.

The idea of being totally unable to write is a self-fulfilling prophecy – you worry you can’t write, so you put more pressure on yourself, and then you’re too anxious to write. Writer’s block is sometimes treated like an incident that just happens – like getting sick. People will claim you have no control over it, and you can’t do anything to stop it.

The first step is not letting yourself use it as an excuse. If you abandon your writing because you hit a rough patch, your output will drop considerably. You’ll also find the rough patches come up more and more often, as you disrupt your writing routine. If you’re committed to creating content, you have to find ways to push through.

Keeping a regular writing routine will help you get into a rhythm with your writing. I started this blog primarily because I wanted a reason to keep up a regular rhythm of writing. When I don’t keep it up, I notice my skills begin to stagnate.

If you can’t prevent the writer’s block, there are ways to treat it. Don’t give in to the desire to just call it a day because the words aren’t coming out. I’ve found a few tricks that have forced the words out of me on my bad days.

Abandon all critical thought

When you have a critical injury, usually the first step in any sort of first aid is to stop the bleeding. In the case of writing, the first part of writer’s block you want to break is the inability to put words on a page.

So open a blank page and just write. Write about your day, write about what you’re seeing, write about bacon… it doesn’t matter! Just get a couple hundred words on a page. Don’t be critical about what you’re writing. Don’t even read it.

Stream-of-consciousness writing can be cathartic, once you get used to it. There are no consequences or judgement for what you’re writing, so you can say anything you want. Go ahead and write a string of profanity – nobody’s going to see it. You start having fun with writing, which makes writing your actual post feel a lot less stressful.

If your word processor has a “line focus” mode, like what I use in Byword, turn that on during this step. If you hit a wall on one topic, delete that page and start a new thought. Do anything you can to keep your focus on the next sentence or the next work.

I’ll do this for about 5 minutes, but sometimes longer if I’m having trouble building up momentum. About 75% of the time, this breaks my logjam and gets me back to writing. For the rest of the time, I need to hit the reset button entirely.

Reset your brain

If that doesn’t work, it’s probably time for a hard reset. Just like how you sometimes have to reboot your computer to clean out the memory and start clean, your brain sometimes just need to empty its cache in order to work effectively.

If you’re not comfortable just shutting everything down and closing your eyes in silence (I know I can’t do it), you use a meditation aid or white noise generator. Apps like or Do Nothing for 2 Minutes force you to halt the flow of potentially disruptive thoughts and start over with a clean slate.

People often confuse being a good worker with being constantly busy. True, you will often be busy, but sometimes your brain just needs to hit reset. Maybe a disciplined meditation schedule is a bit too intense for you, but when you start to feel frazzled, just take a minute or two to shut out the world and do nothing. You’ll be surprised how much you get out of that small amount of time.

Talk about what you’re trying to write

In programming, there’s a concept called Rubber Duck Debugging. A coder will take a rubber duck and explain, line by line, what their code does.

"Rubber duck assisting with debugging" by Tom Morris - Own work. Licensed under CC BY-SA 3.0 via Wikimedia Commons.

]6Rubber duck assisting with debugging” – Tom Morris.

Rubber Duck Debugging isn’t as crazy as its name implies. When we keep ideas in our heads, we’re making subconscious leaps in logic that aren’t necessarily correct or even coherent. Talking through our thoughts forces us to flesh out our core ideas. If you hit several points you can’t explain, you might not understand what you’re writing well enough, and need to focus your energy on organizing those points. And, just like that, you have your next step.

So take your rubber duck (or teddy bear, or just your imaginary friend) and explain to him (or her) exactly what you’re trying to write. Explain each key idea in your outline and what your main points are. Explain why you’re writing your post and how it benefits your reader.

Sometimes, our Writer’s Block is a result of not really understanding why we’re writing. Explaining the details of your post or project forces you to recognize when you don’t understand something, and then do something about it.

Ultimately, I find writer’s block is a result of getting in an unproductive mindset. The trick to dealing with it is to find ways to shift your mindset, be it through breaking the ice with forced writing, calming the noise in our own minds, or untangling our thoughts by talking them through. So don’t give up when you hit a rough patch – figure out why you’re struggling, and use these techniques to get back on the right path.


John Oliver’s Latest Supreme Court Segment is Brilliant

John Oliver’s people know how to take advantage of an online audience. They post large segments of their show for free on YouTube (note: NOT Hulu Plus, not a proprietary channel, YouTube). They share particularly notable responses to their materials on-air, which encourages further engagement. And now, they’re encouraging their users to make great content using their materials.

Check out this video by John Oliver on making Supreme Court cases more interesting:

It’s a great segment in itself, but how does it end? By giving potential content creators a massive amount of content and quite literally saying “have at it!” He’s opened the door for engaged and passionate fans to create and share their own videos.

But these sort of videos serve more than their closest fans. I’d bet some authors at BuzzFeed or Vox saw this and immediately started trying to call dibs on writing the “Ten Pivotal Court Cases, Reimagined with Cute Dogs” post. Every video or tv segment made using that material is an advertisement for John Oliver’s show.

What can we learn from this? The biggest lesson is to give your most passionate fans an opportunity to shine. Proportionately few viewers of John Oliver’s show will bother to make their own videos, but those that do are probably among the show’s most passionate fans. He’s giving them an opportunity to contribute to the show.

You can apply this concept creatively to your own show or brand. Have a band? You can encourage your fans to remix your songs or music videos, and recognize them on your Twitter feed. Selling software? Offer guest posts on your website for fans who use your software in unique ways. You can find a way to creatively adapt this idea to what makes the most sense for your brand.

And hey, if you’re trying to get some hits on youtube, dogs and cats are always a plus.

Some notes About Weardown


Weardown came out of a conversation with my wife, Amy. She’s a marathon runner, and had been rotating between pairs of shoes. She wanted to be able to easily keep track of how many miles she ran on each particular pair of shoes, since she couldn’t just use her running schedule to know which shoes she used on a given day.

When she explained the problem to me, I figured it wasn’t a particularly complicated problem to solve with a simple web app. After all, there are only few simple pieces of data to track: users, shoes, and runs. The scope of the project seemed narrow enough that I could accomplish it in a relatively short amount of time.

Of course, I didn’t take into account the time it would take to learn new frameworks, realize I’ve set things up fundamentally wrong, become flustered and throw it all out, and eventually start over from square one.

First Try: AngularJS


My first attempt at building WearDown started with AngularJS. I’d read a little about the framework before I started the project, and it seemed like a great tool for an app that probably wouldn’t need a lot of server logic, and could largely be managed client-side in Javascript.

I started working on applying the information I found in several basic Angular tutorials, and it was slow going. Angular has a pretty steep learning curve, and I never quite wrapped my head around some of the more complex parts of it.

Eventually I started running into issues. Components from Bootstrap were messing with Angular (particularly with modals), and I eventually realized I’d need to rebuild a bunch of my code in order to get it to work the way I wanted it to. During this time, I also took a few weeks off of coding, and lost track of how some of the controllers were working. The code was sloppy, and I paid for it.

So I scrapped this version of the project for a while, because I wasn’t interested in totally revamping things in Angular. I’d like to eventually go back and give Angular another crack, but for Weardown, it didn’t feel quite right.

And so WearDown laid un-modified for a little over a month. Then, I came across Laravel. After hearing a lot of hype about how it’s a very easy, powerful platform for development in PHP, I decided I wanted to give it a go. Once again, WearDown seemed like a good project to learn on. So I resurrected the idea, albeit not the original code.

Second Time’s the Charm – Laravel


Things clicked really quickly once I started using Laravel. I have to say that I fell in love with the framework, and I had a lot of fun developing even a simple app like WearDown.

I can’t say I’m too familiar with other MVC frameworks like Symfony and Rails, so maybe part of the excitement I felt was standard for these sort of tools. But the mix of dirt-simple querying and editing of MySQL data, blade templates, and tools for handling things like user authentication made it really easy to move data from a MySQL database into my app.

When I started out, pages were relatively static. A user’s data would be pulled when a page was loaded, and all edits would happen via POST, reloading the page with each modification. Early on I knew I wanted to make the pages more dynamic, and Laravel made building an API for this super easy.

Eventually, I swapped out a lot of the PHP Blade templates for Handlebars.js templates. Since content needed to update in the browser without refreshing the page, a lot of the content that would normally be in a Blade had to be delivered via Javascript. Changing my code for this was super simple – instead of making a PHP view using an object full of controller data, I simply returned that object as a JSON object. Then that object is looped through, printing a separate instance of the handlebars template for each loop.

At this point, I probably could have gone back to Angular for the purposes of reading and printing the data from the JSON API. However, I wasn’t too interested in revisiting Angular’s not-too-insignificant learning curve, and opted for the previously mentioned Handlebars.js templates. This, along with JQuery for some relatively straightforward DOM manipulation, composed pretty much all the Javascript for the app.

Front-end Design

As I usually do on web apps, I opted to use Bootstrap to make front end development simpler. It also saved time on making everything mobile-friendly. When I have a backend more or less figured out, I start itching to publish a usable version. Bootstrap helps me get there, and gives me a good framework for building on in the future, if I want to invest more time in the front-end.

When I was picturing the front-end, I mapped out a few key items: modals for adding and editing runs on a shoe, progress bars for easy visualization of the shoe’s usage, and a simple run history that shows your past few runs. I wanted to make it easy for a user to see at a glance when their last runs were put in, and how close they are to needing new shoes.

In general terms, my design had the following goals:

  1. Make the process as quick as possible. The goal of the app is to provide a simple record – get in, add your notes, get out.
  2. Make it obvious when you’re running out of miles.
  3. Minimize page reloads to keep the user experience coherent.

You can see these components laid out below:


Sadly, I didn’t keep good track of what the mid-development layouts looked like, so I can’t really show how I built to this point. I’m going to make that a priority for future projects, since I’m really more interested in the journey of creating these tools than on creating the product itself.

Final Thoughts

Ultimately, Weardown as it’s published now is pretty simple. But it’s built on a fairly powerful stack of tools including Laravel, JQuery and Bootstrap. It would be fairly simple to add some additional handy features, and I’m hoping that, time permitting, I can revisit Weardown to add some of these.

My current project is to establish a more permanent hosting solution for both Weardown and StreamBuddies. I’m expecting to have that together shortly, and I’ll write another post about the experience of getting that together.

Avoid common email marketing mistakes with a pre-flight checklist

Let me tell you a story about my first (and still so far worst) major email marketing mistake.

When I was about two months into my first marketing job, I sent an email with a comedically inappropriate subject line. My important news alert about coverage of Metabolic Surgery instead alerted people to the latest stories on “Meatbolic” surgery. And thus an email list of about 5,000 people got to have a good laugh at my terror and misfortune.

It happens. Your normally meticulous proofing, review, and pre-approval process for sending out a mass email fails, and some sort of serious mistake has slipped through. These sorts of email marketing mistakes are common enough that Mailchimp has a very sympathetic help page explaining why you can’t recall an email campaign. I don’t have to imagine the heart-sinking feeling of getting that final confirmation that you’re screwed – I’ve felt it firsthand.

If you’re like me, you’ve probably sent over 200 mass emails this year. That’s up to 200 subject lines, 200 email bodies, and 200 messages to review, analyze and learn from for the next batch. In a small office, you may be the sole person responsible for this task, along with probably a few dozen other things.

The best way to avoid mistakes is to build an effective routine for reviewing your marketing pieces before sending. Just like pilots have a pre-flight checklists that they run through before every flight, you should have a pre-sending checklist for your email marketing pieces. This will cut down on mistakes and give yourself the brain space needed to catch problems before you hit that irreversible “Send” button.

Creating a pre-flight checklist

I have a few basic tasks I aim to complete for every marketing email I send. Some of these won’t be feasible on every email you send (especially if you’re on a time crunch), but doing as much of this as possible before sending will help you avoid having your own “Meatbolic” moment.

1. Put it in a (metaphorical) drawer

If possible, I prefer to put my semi-finished drafts in storage for a day or two before conducting a final review. This makes approaching an ad with fresh eyes a lot easier. Often times I’ll be able to think of better ways to phrase a certain passage, or can think of a new angle that will better target our potential customers.

Letting your brain stew on something passively can be a powerful tool. We can spend hours staring at a puzzle, racking our minds for the solution, just to give up in frustration. Then, a few hours later, we sit down and the answer is plain as day. Writing good marketing copy is not unlike a puzzle – you have to find the most attractive way to fit your information into as little text as possible. Walking away for a few hours or days can make streamlining your content much easier.

The real secret to this tip is planning things so that you actually have time to set things aside for a while. Call it what you want – a marketing calendar, your content strategy, whatever. I just call it having things planned out. If you have a message you know has to go out on Thursday, don’t wait until 3pm on Wednesday to write it. Get things queued up in advance so you have time to let your passive brain find solutions to your problems.

Sometimes the best gift you can give yourself is more time. Most of my worst email marketing mistakes were found just because I gave myself an extra day, or even an extra few hours. That’s why the first item on my checklist is usually to let things sit, and go to work on something else in the meantime.

2. Read everything out loud

Now that we’ve gone over everything after letting it sit for a while, it’s time to go into bug-fixing mode. There’s no better place to start than the classic writing standby – read everything out loud.

It worked for your middle school essays, and it works for your professional marketing pieces. Reading everything out loud makes it easy to catch if you’ve left a sentence incomplete, transposed some words or simply used an awkward phrase.

Take a minute to clear our all distractions and focus exclusively on your marketing piece. Close out all your other windows or, if you prefer the physical realm, print out your message and clear everything else off your desk. Read it like you’re actually reading the content to another person, not just burning through it. You have to give your brain time to process what you’re actually sayings; speed-mumbling through it won’t cut it.

The only downside is that your coworkers will probably think you’re a little crazy. You can always cheat and put a phone to your ear so it sounds like you’re reading to someone else, if you’re worried about looking like a nut. But let’s be honest – marketing people are a little out there to begin with, so you may as well roll with it.

3. Send preview emails to your inbox

This is probably obvious to most people, but it’s amazing how long I spent without having this as a normal part of my workflow. Services like Mailchimp have a built-in email previewer, and that’s great for while you’re working. However, I’ve generally found that the relationship isn’t quite 1:1 with how the email will look in someone’s inbox. Sometimes the HTML/CSS you’ve meticulously designed gets scrambled in translation, and you want to know if anything comes out wrong on the other side.

This also makes it easier to proof your subject lines. Nothing makes an awkward subject line stand out more than seeing it front and center in your inbox. I’ve caught many bad subject lines at the last second my previewing it in my inbox.

Beyond simple error-catching, this also makes it easier to get into the mindset of my readers. How does the message strike me when it’s in my inbox? How does the subject line look in the bustle of a busy inbox? Where do my eyes jump to when first opening the email? These are all great questions to consider with your emails (and your competition’s emails, for that matter), and they’re much harder to visualize when it’s not actually in your inbox. Even if you’re not catching “mistakes,” this sort of review helps you tighten up your email marketing pieces to maximize their appeal.

4. Grab a second set of eyes (and tell them what you need)

For the sake of this article, I’m assuming you don’t have a professional editor who’s reading through all of your content for spelling and grammatical issues. If you do, then congratulations! You have someone else to blame your mistakes on.

For the rest of us, I still say your emails should be sent to at least one other person before publishing. Maybe your office has a secretary or other non-marketing person who can take a quick look at your email. Find a person you trust to tell you the truth – no brown-nosing interns or yes men allowed. If something sucks, you want them to be willing to tell you that it sucks.

When you’re asking for help, be clear what you’re asking for. If you send something to someone and just ask them “what do you think?” You’re not going to get very focused feedback. Ask more pointed questions, like “Can you check this for any obvious typos?” or “Does this product description make sense to you?” Make sure they’re on the lookout for your weaknesses.

5. Check emails on multiple devices (or use inbox inspection)

The biggest pain about writing email is that there are so many different types of inboxes to worry about. Gmail presents a significantly different-looking email compared to Outlook 2007. Then there’s mobile – which probably accounts for over half of your readership.

Sticking to some standards will solve some of these issues. For example, I won’t use any HTML/CSS not supported by Outlook 2007 or later (which is still a significantly large chunk of inboxes). You can find Outlook 2007’s HTML/CSS rendering capabilities on Microsoft’s website.

However, for the sake of time and thoroughness, there’s a great testing tool built into Mailchimp (and I presume other email services): Inbox Inspector. Inbox Inspection identifies the most frequently used email clients used by your readers and sends you images of how each of these clients render your email.

Inbox Inspection has its downsides. For one, it tends to take a bit of time – generally I find that I can expect it to take around 15-20 minutes before completing. This means that, constantly tweaking and re-inspecting can start to suck up your time, and put you behind schedule. As such, I don’t use it on every email, and bypass it entirely if I’m sending plain-text emails, or if I’m using the default templates in something like Mailchimp. However, if you’re testing out templates or doing anything particularly fancy (especially messing with image positioning, alignment and whatnot), inbox inspection is a great way to make sure things are coming out as expected.

Regardless of whether you’re using Inbox Inspector, at least make sure you’re looking at your email on at least one desktop and one mobile device. Think of this as a more comprehensive version of step #3 – it takes more time, so you can save it for when you’re pretty confident you’re good to go, and you’re just looking for any nasty rendering errors.

6. Keep notes of your mistakes

This doesn’t quite fit into a checklist, but more of something to consider while you’re going through the other steps. We all have bad habits and recurring mistakes we keep making. Instead of being embarrassed or ashamed by these, the best thing we can do is put our faults front-and-center, forcing us to acknowledge and deal with our faults.

In my case, I Tend To Capitalize Words That Should Not Be Capitalized. When I’m able to get a second eye on my emails, by far the most common piece of feedback I receive is on capitalization. To fight this, I now include a step in my review process where I highlight every capital letter in an email. It forces me to acknowledge my blind spot.

I keep my error logs in the forms of scribbled Post It notes that I leave around my computer or on a whiteboard. It puts your common email marketing mistakes front and center and forces you to think about your subconscious habits. If you don’t make a mistake for a while, you can take down that specific Post It note – usually to make room for a new, hopefully less-bad, flaw in your process.

Everyone makes different mistakes. If you’re lucky, you get to work with people who have a diversity of faults and you’ll all catch each other’s mistakes and make something great. However, if you’re not so lucky, you need to be willing to put your own faults front and center in your consciousness to work to improve them.

These pre-flight tools have significantly cut down the number and severity of my mistakes in an email. Sure some awkward phrasing and improper capitalization still slips through form time to time, but I’ve never had a mistake on the level of the “meatbolics” incident, as it is still referred to around the office.

If you have any must-do’s that you think are missing from my pre-flight checklist, let me know in the comments. I’d be interested to revisit this topic again in the future, and see how my workflow has changed/improved over time.

Weardown App Has Been Launched!


I’m excited to announce that I have published the first version of the Weardown Web App. I’ve been working on this project on and off for the past few months, spending an evening or saturday afternoon here and there on putting this together.

This project was inspired by a complaint by my now-wife, Amy. She was looking for an easy way to track the miles she puts on multiple sets of shoes. The app itself is fairly simple – you can create an account, add shoes, and then add miles to each shoe.

Check it out at

I plan on doing a writeup of the development process and what I learned(similar to what I wrote for StreamBuddies), but I may do another update or two before I start working on that.

For now, feel free to use and enjoy. If you come across any issues, let me know on Twitter.

Abandoning the SpartanPress Theme

Part of the reason I set this blog up was to have a testing ground for WordPress theme development. About a year ago, I started learning the ins and outs of basic WordPress development, and having a testing ground of my own gave me some room to mess around.

However, I’ve lately found that I’m not too interested in working in WordPress in my spare time. I want to spend more time working on actually writing content, as opposed to thinking about the methods of delivering that content. Developers can easily spend hours and days messing with the fringes of a website’s design, just to forget about writing the content itself. I miss the times in college where I’d write 500+ words of blogs per day on anything from politics to technology to personal drama. Regular sharpens my writing and keeps me in a creative mindset, so re-dedicating myself to that seems to be a smart move for both my mental health and professional development.

So for now, I’m moving my site to the Responsive theme, which I’ll probably fine-tune when I have the time. It seems readable, straightforward, and allows for a notable amount of in-theme customization.

My plan is to get back into writing once I get back from my wedding. Naturally, I must acknowledge the fact that this is probably the second or third of these dedications that I’ve made in that time, but as the flakes always say: this time I mean it. Perhaps spending more time talking about the topics I deal with the most – communications, technology, games – will actually turn this blog into something another human being would find worthwhile to read. But for now, suppose I have nothing to share but this little piece of navel-gazing.

Facebook Open Graph tries to make us use Facebook properly

Facebook recently announced an update to their Open Graph API, that included this notable shift in policy:

You must not incentivize people to use social plugins or to like a Page. This includes offering rewards, or gating apps or app content based on whether or not a person has liked a Page. It remains acceptable to incentivize people to login to your app, checkin at a place or enter a promotion on your app’s Page. To ensure quality connections and help businesses reach the people who matter to them, we want people to like Pages because they want to connect and hear from the business, not because of artificial incentives. We believe this update will benefit people and advertisers alike.

I haven’t heard a huge fuss made out of this, but it seems like a pretty significant change. How many different facebook games, local stores and other places have encouraged you to “like” their page in order to get some sort of discount or virtual currency? It works largely because it’s still “free” to the end user. I know I’ve liked my local exterminator to save $10 on a flea spraying, even though I couldn’t care less what they have to say on Facebook. Now, a relatively subtle tweak in Facebook’s Open Graph policy has effectively thrown that entire practice out the window.

Presumably this change is to prevent non-organic growth of a company’s facebook page. Facebook wants a like to be an indication that you find value in what someone is saying. To use my earlier example, I traded my Facebook “like” for a coupon, not because of the content that was shared by my exterminator. I’m also likely to quickly unsubscribe or mute the company’s posts after I get my coupon, since I didn’t care that much about them anyways.

That behavior has significant consequences. You end up gaining a large number of followers that don’t actually care about your message, and just end up padding your number of “likes.” Depending on how Facebook’s filtering algorithm works, it may even mess with the people who actually do care about what your saying. So really, these “like us to get a thing” campaigns are potentially trading actual engagement for a higher number of likes.

Think People, not Numbers

This is a trap I expect many organizations fall into, and I’ve seen how it happens firsthand. Quite often, the first (or sometimes only) bullet point on a report about your social media is your number of likes/follows. Data like number of shares, comments, or impressions is secondary at best. Most people don’t have a good concept of what those numbers “should” be, but they can easily look at their competitor’s Facebook page and see how many likes they have.

But that’s not the right way to think about social media. Good social media pages will recognize that a relatively small pool of passionate fan swill get you much more value than large numbers of uninterested followers. You’ll create a group of people who not only purchase your products, but advocate for you. One passionate follower who shares your post can expand your reach by hundreds – all with a personal endorsement attached. That’s the real promise and benefit of social media, not the number of “likes” on your page.

You also avoid the trap that websites like Groupon fall into – attracting people who only care about a bargain vs your brand. No disrespect to the coupon-clippers of the world, but they’re by and large not returning customers, nor are they going to bother to advocate on your behalf.

So maybe, by taking away a tool like this, Facebook can incentivize page owners to get their followers the old fashioned way. Facebook is trying to do to social media what Google has been trying to do with SEO – get rid of the ability to “game” the system and instead identify exactly what their users would want to see. You don’t follow somebody on Facebook, you like them. The term implies a much stronger relationship than what’s built off of a coupon.

I’m partially disappointed, because I’ve considered using campaigns like this in the past. For example, we could give 10% discounts to an event in exchange for liking us on facebook, as a way to kickstart the Facebook page of a new annual event. I’d like to think that, once having those followers, I would then create content that they find valuable. But maybe I, like many other marketers, need to be better about not taking shortcuts on social media. We need to stop trying to manipulate the platform to force our message onto people. That’s an old media way of thinking.

I’m not a game developer

I remember coming across an article in EGM or some other gaming magazine about DigiPen sometime in the late 90’s/early 2000’s. I was in late elementary school or early middle school – at a point where I understood that at some point I’d have to have an “adult job” and do something with my life, but years away from really understanding what that meant. ‘Jobs’ had become more than the childhood list of ‘Firefighter, Astronaut, President or Doctor,’ but I didn’t really know what that meant for me in the long term.

But then, reading about DigiPen, it finally hit me: I could be a game programmer. Mind you, I barely knew what programming was, or what I’d have to do to become a programmer, but in that moment, ‘game programmer’ seemed like my ticket out of having to have a real adult job. After all, I would be working with games!

For a couple years, I made small steps to understand programming. My mom and dad introduced me to Visual Basic, went to a couple of summer computer camps, and bought or borrowed multiple books on programming. I got enough out of this to understand the basics of programming, but honestly I never got near the level of actually being able to write a game. But that was fine – I assumed all of that could come later.

In retrospect, I think what I actually wanted to be was a designer, not a programmer. Even when I played around with programming languages, they were always just a means to an end. I wanted to create worlds and adventures, not code engines or learn programming languages.

I remember sitting around with some friends in middle school, talking about the awesome games we could program when we grew up. We’d talk about these elaborate worlds, storylines and ideas for building an epic adventure. Concepts like ‘design scope’ or ‘memory limits’ were beyond us – we just knew it would be awesome to make a game as epic as our imaginations.

I honestly don’t remember when I abandoned the idea of being a ‘game programmer.’ I think I gradually came to understand that it was a job much more complicated than I’d imagined, and that I’d actually need Math. I think for a while I decided I could make my fortune in writing epic adventures instead or programming them (another story of misplaced ambition, for another time). Regardless, I know by the time I was a year or two into high school, I’d given up on the idea of being a programmer or game developer.

In the past few years, I’ve become tempted to revisit game design. Tools like Unity and GameMaker have made game design seem more accessible than it has ever been in the past, and more and more 1-2 man teams have made great games. Maybe I wouldn’t make a career out of it, but it could be an interesting hobby.

My career has gone in a much different direction, but I’ve maintained a love for the gaming medium even when others have ‘grown out of it.’ Maybe the idea of game design is appealing to me because it justifies continuing my childhood passion into adulthood. An obsession with games seems much more rational if there’s some kind of professional angle to it.

But I’ve come to realize that’s the wrong way to think about these things. You can’t look to a job to justify your hobbies. Hobbies have to be a thing you love. Some people make careers out of their hobbies, but that doesn’t feel like it’s right for me. I like playing games and I like thinking about them, but that’s not the same thing as making them.

On the other hand, I suppose I could give games journalism a crack… that’s a booming, profitable field right now, isn’t it?

Some notes on StreamBuddies

I’ve been working on a website for about a month now called It’s a fairly basic Twitch.TV stream viewing tool that makes it easy to see who’s online and jump between streams.

The app was a good introduction to a couple of different concepts for me. I thought it could be interesting to run through each of those here. This isn’t by any means full documentation of my code, but more of a run-through of what I learned in the process.

The Setup

When I first thought of this project, I knew I would need to do a few specific things:

  • Load content from the Twitch API
  • Regularly re-check that API for updates (to update stream information, and see when people come online)
  • Take the api result (a JSON object) and display the online and offline streams

External Components

With that in mind, I decided that the best way to manage the app was through a (relatively) sparse HTML page using JavaScript templates. Initially I was going to use Underscore.js for templating, but eventually settled on Handlebars.js, primarily because of its simplicity. My scripts didn’t need to be particularly dynamic, just a variable here or there. JQuery was used as well, though that probably goes without saying these days.

I also initially planned on using Bootstrap for the majority of the stylesheet, but ultimately found the mobile-first nature not quite appropriate for a stream viewer (which is inherently hobbled by being dependent on Flash), and ended up spending a lot of time either overriding the bootstrap CSS, or working around it. The main Bootstrap feature still used in StreamBuddies was modals.js, which is used to prompt a user when no Twitch user loaded – be it through the query string or through cookies. The rest of the stylesheet is written in LESS, and compiled/minified using Grunt.

I also wanted to give kudos to CSS Tricks for providing some very useful code snippets during the process. Without CSS Tricks and StackOverflow, I probably wouldn’t have gotten off the ground on coding in general, let alone this project.

Working with the API

I started this project because I wanted a good reason to get used to using AJAX and working with external APIs. Twitch has a (mostly) great API that was well documented on GitHub, and given how much I watch Twitch, it seemed like a tool that I would actually use.

There are two core components to the Twitch API used by StreamBuddies. The first is, as you would guess, the “follows” API. This takes a Twitch username and returns a list of people followed by that name. When I saw this feature, I was a bit surprised. As it is now, I don’t feel like Twitch uses the information on who you follow very much, and for a long time it seemed like they barely acknowledged that this feature existed. So I was happy to find something that both gave me useful data, and could maybe serve a purpose that I don’t see many other tools filling at this time.

Designing the Layout

The stream page layout was based on a mix of SpeedRunsLive and the native Twitch stream. I liked the core concept of having the navigation and the chat on both sides of the screen. Having the stream list on the same level as the stream itself makes it easy to tell when someone comes online, which I’ve felt is never easy to see on either Twitch or on SRL.

Having the stream itself be as big as possible was a priority. I’m somebody who never likes to fullscreen Twitch, because then I lose the whole monitor. Instead, I’ll resize a window to the maximum size where it doesn’t interfere with whatever else I’m doing, and leave it in one place. As such, I needed the stream to easily adapt to whatever size I could afford to make it at that moment.

I’m still not sure if my implementation of this was the best. Basically, I use jQuery to determine the window’s current width, subtract the width of the chat and the stream viewer, and set the stream viewer to that width (and then set the height based on the aspect ratio * the width). I’m willing to bet there’s a simpler, non-JS way to solve this problem, but every non-JS solution I tried didn’t seem to work out quite right. That just left chat.

Twitch chat is a weird animal in itself. On some streams, the twitch chat is a valuable place for interaction with the streamer. On others, it’s a wall of Kappas, ASCII art, and memes. Having the ability to toggle chat was fundamental, both because of it’s sometimes-irritating nature, and because it takes up a significant amount of screen real estate. For some reason, finding a decent height/position for Twitch Chat was a challenge, until I said “screw it” and just tried making it nearly 100% of screen height. I personally prefer a chat that’s the same height as the stream (probably because I’ve spend so much time on SRL), but for this implementation, having it be the full height seemed to work best.

There’s still one issue with the design that I’d like to address, stemming from the nature of widescreen monitors. When you put boxes on the left and right sides of a monitor (as the stream list and twitch chat surround the stream on StreamBuddies), you make a center content area that’s a more narrow rectangle. For something like text, this is good – wide text boxes fatigue a reader. However, with video, you’re forced to use a horizontal rectangle.

As such, we end up with a horizontal rectangle in a both that is a vertical rectangle. That leads to a big chunk of the screen that’s wasted space. Twitch itself offsets this with the streamer’s profile, but that data doesn’t come in the API calls I’ve been doing. Initially, I was going to put some recommendations for other streams to follow in that space, but as I explain below, that feature didn’t seem to work out as planned.

Failed Addition: Recommendations

I could probably write an entire section on this part of the project, but since it never made it past a few failed commits on GitHub, it probably wouldn’t be too interesting to anybody but me.

In short, I wanted to see if I could create a recommendations engine based off of the Twitch follows/followers API. The rationale was that, if you look at who else follows someone you follow, you could use those people’s follow lists as “recommendations” to help you find other streams you may wish to follow. I’m sure there’s a more technical term for this type of search/recommendation, but it basically comes down to “a lot of people who like X also like Y, so since you like X, you probably would like Y.”

After some trial and error, I got a basic page together that would gather these data. However, there were two main problems.

  1. It was slow as hell to do through the API. You literally need to query twitch hundreds of times per follow in order to get a list of recommendations. It generally took at least a minute to do a full run through of your follows, and required hundreds, if not thousands of queries. This could have been optimized a bit, but the second issue kept me from getting that far.

  2. The findings were not that useful. I tested the function against my follower list and, aside from the people I already followed, I found almost no consensus on good recommendations. I only found a handful of people that surfaced more than a few times in the sample, and they didn’t seem like good fits to be recommended, at least at first glance. Somewhat discouraged by this underwhelming result, I’ve shelved this part of the project for the moment.

Writing this out now, I feel like this feature still has some potential. It’s just not as simple as I’d expected it to be, which happens plenty when working on a project like this. I suspect that putting more effort into selecting whom to sample, along with more efficient use of the twitch API, could at least make this practical, if not as easy to integrate as I’d hoped.