Catfish Movie Review: Putting the puzzle pieces together

And yes, I realize there is a fake FB account online now for this *character* in the movie...
Only mild spoiler alert, I don’t really talk too much about the actual film’s “plot”, but if you haven’t seen it, watch the trailer here – watch the movie in September, and then come back. I was very fortunate today to be invited to a screening of the new movie Catfish. It is a new documentary/reality-thriller about an online relationship that goes sour. I knew very little about the film other than a very intriguing trailer that was floating around YouTube. The film was quite enjoyable, and it did prove to be the emotional roller-coaster as promised, however there were a lot of mysteries behind the nature of the film itself. In this post, I wanted to outline what I found fascinating about the film, what I found unsettling about the film, and talk about the biggest question surrounding the movie: Were the events in this film was REAL or FAKE?
To be quite honest, I assumed it was a mockumentary. When I saw the trailer I assumed that, when I watched the film I began to question that, and when I sat through a live Q/A session with the creators, I was really really confused. There have already been other posts which outline the questionable nature of the film itself, and even at Sundance, an audience member asked whether it was real or not (to the surprise of the audience and the film-makers). I am generally skeptical about everything I watch, I am from the internet generation where we are trained to question almost everything we see. After all, without questioning the genuine nature of the film would be horribly ironic and would miss the whole point of the movie itself. That said, I don’t feel bad for asking the question in the first place.
Not surprisingly, opinions online range from “C’mon, it is obviously fake”, to “No, seriously, this is actually real.” These varying opinions to me point out that it is not obvious. At a high level it seems so outrageous that it cannot be true, however, for now I’ve come to the uncomfortable conclusion that the movie is real. Here is why:
1. A live interview with the crew: After the film, there was a great QA session with the filmmakers who took many questions from the audience. Almost every question was about the circumstances of the events, and the interactions with the real people in the film. I can’t imagine the act needs to be drawn out that long… Those kids seemed like genuinely nice guys.
2. An almost overwhelming amount online evidence leftover from the events in the film: After Googling around for like 10 minutes out of curiosity, I found enough evidence to convince myself within reasonable doubt that it is real. I am not going to post links, but you can easily find tons of links to the people and events referenced in the movie. It took me about 2 minutes to find the exact Google Street View location we see in the film of the house, which made me very uncomfortable. At that point, my personal creep meter was at a limit and I backed off. I had seen enough.
Then why did I come to such an uncomfortable default conclusion?
I really didn’t dig that deep. After watching the movie, and hearing about the “great viral marketing”, I jumped online. Being a huge fan of LOST’s famous alternate reality campaign, and probably being one of the few people who saw all the extra content LOST scattered online, I figured it was all part of the experience. But then I guess I dug too deep. I am presented with the option of either accepting that the story is real, or that it is fake and some very distasteful viral-marketing department made the questionable decision to create a fake memorial/foundation website for a deceased movie character. Given the evidence presented to me, I don’t want to look any deeper. If everything I unearthed is an elaborate alternate reality ploy by a devious marketing department, then I will have been duped. But I really don’t want that to be the case, and will just default to the assumption that I saw an interesting accounting of some pretty bizarre events miraculously caught on tape by the film crew it just happened to involve.
So then the biggest mystery to me now is this. Why did the marketing team make it so ambiguous of whether the film is real or not?
- The biggest draw of this film, which intensified the emotions exponentially, was that it was all REAL, why hide that?
- If the actual film makers weren’t there for the 1 hour QA after, I’m fairly certain that 1/2 people in the audience would have assumed it was a work of fiction.
- There was very little mentioned in the film that really emphasized that it was all true events (no more than say, Blair Witch). Again, why down play this?
- Why did they market this movie like a Blair Witch / Paranormal Activity knock off if they were legit?
- Why was the trailer’s copy-writing confusing?: “Not based on a true story, not inspired by real events… Just True”. Yeah I get what they are saying, but that is just utterly horrible copy!
- Why include real names/addresses in the film (and trailer) that easily link back to online profiles of the real people in the film?
- Why has no one else (seemingly) lifted up a few rocks before questioning, discovering the same (in plain sight) evidence I found?
Why not make it PAINFULLY clear to the viewers that this is a true story? That way you don’t get speculations like this, or this, or this, or this…..
Either way, it was an enjoyable film and an incredibly story. Perhaps the ambiguity will minimize the public attention/scrutiny of the people featured in the movie. Perhaps the eventual success of this movie will help bury the references to these real people, and hopefully protect them from the Internets. I’ve purposely left out any names, or links, or references to avoid the robots and spiders.
So what are you thoughts? End of the day, maybe we just saw the extended version of the HOPA girl…..
Tutorial: Moving from Canada to America as a software developer
As a summary, this post outlines some good-to-know things for any Canadian software developer thinking about moving to the US to work.
Pretty bizarre tutorial no? But after going through this experience (just shy of 2 months ago) I realized that there are a lot of things I wish I had done / known before. A recent visit from a friend from Toronto had me thinking that others may benefit from a post like this. This info is specific to San Francisco, however I am sure it applies to many other cities. I have to thank @bentlegen and @shazow for the advice I got while moving in, I intend to pass the baton. For a great post on how to decide where to work (if you are fortunate enough to have options), checkout @shazow’s post on: A check list while considering offers. This post outlines all sorts of issues I ran into, feel free to skip ahead to the parts you might find useful. I will cover things like: getting a visa, finding a place to live, and how to efficiently spend your first week in the city. As a disclaimer for all the immigration advice, this is just through my experience. I am not an immigration lawyer and if you have specific questions, I suggest you consult one.
Preparing for your work VISA
[You just got your job offer]
Congrats! Hopefully the job you got is sponsoring you for a VISA, otherwise you can stop reading this post and start looking for another job. The company may or may not help you actually get the VISA (ie immigration lawyers etc). I applied for a TN1 VISA, you may be applying to that or something similar. You will need:
- Your original University Diploma (out of frame). Yes this is a pain in the ass, but that over-sized piece of paper is actually the only proof you graduated.
- An official copy of your transcript. For CS grads, this is the only proof you actually took computer science.
- Birth certificate + (drivers license) + passport, to prove you are Canadian
- An offer letter with a start date, to prove you have a job (provided by the company)
- A specific summary of your job duties, to prove you are an Engineer (provided by the company)
- Information fact sheet about the company, to prove it is real (provided by the company)
- Signed and filled out VISA sponsorship paperwork (provided by the company)
- (And if your company’s lawyer is really sharp) A copy of an old letter circa 1996 from an immigration judge confirming Software Engineer == Engineer
I’d suggest getting the official paperwork from your University as soon as possible, because you don’t want to be waiting on them right before you move!
Finding a temporary/permanent place to live
[You committed to move, and now need a place to live]
As per the excellent advice from @shazow, I needed to spend some time in the city to get an idea of where I wanted to live. Signing a 1 year lease then later finding out you live in cracktown would suck. There are a lot of temp housing options (perhaps offered by your company). Might I suggest using AirBNB? I used it, and it was fantastic. When it came to finding a permanent place, I used craigslist, saw like 15 apartments and it worked out well. Take note that since you have no credit history and no SSN, you might have a hard time. The best solution is carrying a copy of your offer letter + your salary agreement to your house visits. You may also have to pay an inflated down payment, which is reasonable. You will likely have to create an account with PG&E, to pay for your heat and electricity, but this was probably the most painless process of it all.
Have a reasonable amount of liquid cash available in America
Since your Social Security Number won’t arrive for weeks, don’t expect to get paid for at least a month. If you move into an apartment, you will need a down payment and first months rent (and maybe more, since you have no credit). You need to have a plan on how you are going to move your funds from your Canadian account to your American account. Your landlord will NOT take a personal Canadian cheque. Your bank will not cash a personal cheque, and if they do, you will need to wait weeks if not longer for it to clear. Make sure you have a way to get your money to an American account as soon as possible. I did a wire from my Canadian account to my American account. So before you leave Canada, ensure that you have ALL the wire info needed and that they will do the transaction without you in the physical branch (most banks do not). If that isn’t an option, transfer funds to your siblings/parents account before you leave. That way they can do the wire for you once your American bank account has been created.
Applying for the VISA itself
[All your paperwork is ready, and you are ready to make the move]
I got my VISA and paperwork at the airport YYZ. I arrived 3 hours before my flight which gave me ample time. I went through regular immigration, and told them I was applying for a TN1 work VISA. They directed me to the additional screening room where I was interviewed for about 20 minutes. You’ll need to pay about $50 USD for the VISA itself, they take cash, so have that handy. Many friends have suggested driving to the border before hand and getting the paperwork done there. That isn’t a bad idea. I was pretty certain I had all my papers in place, and chose to just get it right before my flight, your call.
Convincing yourself (and US immigration) that you are an Engineer
[You are walking into the US immigration office]
Note: you are probably applying as a NAFTA Engineer, however some enter as a Computer Systems Analyst, this section still applies. Forget about all that time we spent in College bashing engineers, US immigration has a short white list of professions that they let through the border. You are now an engineer. To all the “actual” engineers reading this (and I don’t mean P.Eng I mean people who studied engineering) you still need to convince the immigrations officer you are NOT a code monkey. You will need 2 main things to get past this part. Your transcript should make it clear that what you studied is related to your responsibilities. On mine, even though I studied Computer Science, my transcript read – Computer Science: Software Engineering Specialist. I also took a course labeled CSC301: Intro to software engineering. Seems silly, but the officer glanced through my transcript, saw the “software engineer” keyword and moved on. Hopefully your new employer sent you a list of job responsibilities. If they know what they are doing, you will notice that “writing code” or “programming” is not really highlighted, even if that is what you think you are going to be doing. Memorize this script, and job duties because they will ask you. Don’t ad lib. The second you say something like: “I don’t know, I guess I’ll be writing code or programming stuff” the CODE MONKEY alarms go off and a net will drop down from above you and they will take you away. Maybe you aren’t a code monkey, but to reiterate almost every NAFTA/Immigration help website I’ve seen:
“COMPUTER PROGRAMMERS do NOT qualify for a TN-1 visa”.
Stick to the script (hopefully provided to you). Assume the officer you are talking to doesn’t know anything about computer science / computer engineering, but also assume that they are trained to flag certain keywords like: programming, coding. Your official job duties should include things like: “Using mathematical models to predict and analyze performance and stability”, and things like: “Applying concepts in theoretical computer science to improve and enhance existing software systems.” Which is all technically true. If you are working for a larger company, they have the word-smithing down to a science. If it is a smaller company, and you are the first Canadian employee, then maybe not. If you see something like: “Writing frontend code in Ruby/HTML to add new features to the website.” don’t be afraid to confirm with HR/your contact that it is OK. Don’t confuse this with the original job post you applied for, your official job responsibilities will likely be more (intentionally) esoteric when you get your official job offer.
Lastly, don’t lie. “So… will you be writing code?”. “Yes, I will likely write some code … to predict and analyze the performance and stability of the system using mathematical models..”. It’s like when your girlfriend asks you “Who is that girl you were with?” And you say, “That wasn’t a girl, that was a man with long hair….”. If you say no, or lie about anything, they will catch you in the lie and turn you down. It happened to the gentlemen in front of me, it was quite unsettling.
Get your Social Security Number
[You made it into the country, now what?]
Without this, you wont be able to get credit, get paid, get healthcare. Get this as soon as possible. I personally ran into A LOT of problems here so hopefully I can offer some advice. The office suggests that you wait 10 days after entering the country before you apply, I did not and got screwed. Here is how it works: You apply for a VISA at the border, they give it to you and staple it to your passport. They then (at some point in time) manually enter your VISA information into a computer. That record (at some point) appears in the system for the SSN offices to see. These offices are disjoint, and the 10 day wait is seemingly a “it should be done by now” buffer. Since I went early, it took them about 3 weeks to realize that my papers hadn’t been processed at the time of my original application. Hopefully the same doesn’t happen to you, but since they give you no feedback, I only found out when I went back in to see what the hold up was. Print off the SSN application form located here, perhaps leave the mailing address as your office, since you probably don’t have a place to live yet. Find your local SS office, in San Francisco there is one at 7th and Mission, which is utterly terrifying but conveniently close to downtown. Bring in that form with your passport, VISA (which should be attached to your passport) and birth certificate / driver’s license. Wait as long as 10 days after you enter the country for the reason above, I wish there was a hard number but it seems really soft, and I got screwed. After you drop off the paperwork, if all goes well, your SSN will be mailed to you within 2-3 weeks. I HIGHLY recommend going in again after 1-2 weeks just to check the status, they might give you the number on the spot, or they might tell you that there was a problem they forgot to tell you about.
Open a Bank Account
[You are tired of incurring heavy transaction fees every time you need money]
May I suggest opening a bank account as soon as possible? As early as the day you arrive in America? Bank of America was seemingly the only bank that allowed me to create an account without a Social Security Number. So do that, it takes like 20 minutes and they give you a credit card, which is mandatory for a phone/internet/cable. Lastly, once this is done you can transfer over all your Canadian money and start writing cheques from your American account.
Get an American phone plan/number
[You realize that no of the real-estate people will email you back]
Guess what? You have no credit or SSN! So be prepared to pay a $500 deposit if you choose to go with AT&T. This is not negotiable. Having a call back local phone number is pretty damned important as your try to find a nice place to live. Do this as soon as you can.
Welcome to the United States of America
[You are happily settled into your new job and home]
I hope you found some part of this post useful. If you made it through the border safely and are living up in San Francisco, please give me a shout and I’ll buy you a drink and be your one man welcoming party. This city needs more Canadians so we can setup the very first Beaver tail shop in California.
Keep That Train Moving!: UX+Agile in practise

Is your software development a linear conveyer belt of bottlenecks?
This post describes my experience mixing Agile + User Experience design while building out the mobile site for thoora.com. While this process worked for us, it won’t work for everyone/every project, however it allowed us to minimize blocked tickets and maximize the time of our small development team. Breaking the work into manageable stories, and parallelizing the work early and often is a great technique to maximize output and manage the traditionally serial and inherently blocking jobs and responsibilities when mixing UX and Agile methodologies.
What I love about Agile software development is the flexibility and uniqueness of the process to each adopting group. When people try to make sure they are following the Agile process to the book, to me, it misses the point. If it doesn’t work for you or your team, then change it and iterate on your process until it is perfect (how agile). A great topic of discussion is how Agile and User Experience design can blend. Many argue that it is impossible, many say that it blends well. Again, it is up to the team, environment and company. While at Thoora, my frontend team used a process which maximized output and minimized blocking tickets, and idle cycles. I’ll be focusing this post on the integration of traditional Agile concepts and aspects of UX design and development. The housekeeping tasks of Agile process are not discussed, but were used. Similarly, some of the preliminary requirements gathering, planning involved with a more holistic UX approach were used, but not discussed here.
The Participating Roles
-Product/Program Manager (me)
-Front-End Engineer (@kenstruys)
-Visual Designer (@PauloArtista)
The whole team was multi-disciplinary: I was officially the Program Manager, and took on many of the UX tasks, product planning and interaction with business stakeholders. The F2E took charge of all the technical considerations including development and deployment. The visual designer controlled the pixels that we were to push out, and what the customer eventually saw. Working on a 1 week iteration, the biggest fear I had was blocked tickets/idle cycles. In a traditional waterfall model, we would see a lot of upfront requirements, designing and specs before a line of code. If we really silo each role, this model leaves the developers waiting as long as 2-3 sprints before they can code. I HATE IDLE CYCLES FOR MY TEAM!
Planning Ahead
The primary business/user requirement was simple, provide a mobile experience for the existing core website. A list of basic functionality, sitemap, flow was created, and simple wireframes were drawn up. Team members reflected on these “plans” pointing out immediate problems, and ensured the primary objectives were being met. The overall preliminary ux artifacts and activities were owned by the Program Manager, but it was a team effort. This whole activity resulted in rough plans for the project, rough functionality and “look” (but not yet “feel”), enough to start breaking up the work.

Iterate often, do work in parallel, merge when possible
Getting the Train Moving
The documentation was far from complete, but good enough to get started. These plans gave the F2E enough info to prep an environment, fork the code base, make preliminary deployment considerations and perform any needed technical research given the scope of the audience and project: Where should we fork off the main code branch? How/Where are we going to detect the mobile browser? How are we going to test this? Which machines will this code sit in?. The flows, sitemaps and wireframes were enough to begin the first iterations of mockups, and interaction design considerations: What is this going to look like? What phones are we supporting? What is the primary interaction method? How big are my targets going to have to be? And lastly, these initial plans were enough to go back to the primary business owner to ensure all the goals/requirements were being captured.
Working in Parallel
The previous step only took a few days. Updated wireframes were now available, and the real fork of work was ready to happen. This is where I feel like we gained a lot, and maximized the use of the time of our small group. The wireframes + flows were sufficient “specifications” for the developers to implement a functional “shell”, which looked rugged, but was functionally complete. The same wireframes were the input to the visual designer who could now concentrate on the look and feel of this mobile user interface. Time boxing into 1 week, the plan was to see the results, and iterate on any changed requirements.
Pulling it Together
There were a few new business requirements, there were some discovered usability issues, so we iterated on the initial designs and moved forward. At this point we had a functional shell and nearly complete and up to date mockups. It was time to merge. The mocks were given to the frontend developer whose shell was up to date with the visual designer’s mocks, thanks to shared wires. The shell was coded very flexibly so the look and feel was really a matter of skinning the existing site. Collaboratively, all members were able to test the final output. In addition to the testing suite which was originally created at the start of the project, each member applied their own focused testing suite. The developer tested many devices and browsers, edge case and redirect rules, and webserver settings. The visual designer tested the pixel precision (with some threshold) of individual screens, and ensured the site reflected the overall company brand. The PM looked over the site ensure all the original requirements were matched, and that everything in the original wires and flows were implemented.
Some Final Thoughts
This process worked very well for us. With open communication, every participating member knew what was going on, and what they needed to get done. This project went on as all participants juggled other existing projects. A good schedule, and well chunked blocks of work was very important. The artifacts (sitemaps, wires, mocks etc) were as up to date and “alive” as long as they needed to be. While this may be more rigidly structured than some UX practitioners may like, this process was applied in an environment that wasn’t particularly UX focused, so it was a nice middle ground. We chose a process that worked best for us, and fit the project. We wanted to minimize the amount of blocked tickets, and it worked. By forking as early as possible, we rarely heard the dreaded “I’m waiting for the ___ from ____”. By splitting up the work load, working in parallel and merging when appropriate, the train was always moving.
Why I moved to San Francisco

The infamous TN1-VISA: Its like Willy Wonka's golden ticket, except this one lets me legally work in the US. I took this photo 5 minutes after walking out of the US customs office in YYZ
I recently moved from my home town of Toronto, Canada to downtown San Francisco. A lot of people have asked me why I moved (other than the job) so I thought I’d write a quick post about my move. Over the next few months I will also be publishing weekly (hopefully) updates about my journey into the heart of the tech world.
For the past couple of years I have been working at a small internet startup, immersed myself in startup culture, attended tech / startup events, talked and debated with startup people. In this experience, there was always one common denominator: no not startups… “The Valley” (Yes, I understand that San Francisco isn’t exactly in the “Valley”). At almost every experience I had, peoples’ experiences, anecdotes, connections always pointed back to a person, company or product that came out of the Bay area. It was surprising to me at first, but it eventually made more sense. In addition to the history of the area, the high standards + influence of nearby academic institutions, the Bay Area has a reputation of software projects and teams with drive, talent, experience and success.
But the nay-sayers argue that we (the software industry) look too blindly at the valley and put it on a pedestal. Great software can come from anywhere in the world. I totally agree on all those points. Many people do blindly look towards the Valley for the next big thing, the software industry does put the valley up on a pedestal while labeling other developing tech cities “the next valley”, and for sure, amazing software can come from anywhere in the world. There is no doubt that the Bay area is the center of the tech world. It was 10 years ago, it still is today. We can attempt to recreated these settings elsewhere, and Toronto is building an impressive scene, but it will take a long time to move out of the shadow.
If I was a serious American Football player, and was serious about one day playing in the Superbowl, I would apply to an American University and try damn hard to make it. In my case, I am a serious software developer. I am serious about making “something big” some day, so I moved to the Bay Area and am going to try damn hard to try to make it. I cannot replicate years of culture, hundreds of already rooted companies, and thousands of local talented minds. I can, however, relocate myself. And so I did.
The hardest part of the choice was:
-Leaving a company I helped build
-Moving very far away from my close family and friends
-Moving away from my girlfriend
-Leaping into the total unknown
The other things that helped me make my choice:
-I have endured 25 years of Toronto winters, I wanted a break
-I have never lived outside of Toronto
-I had an incredible offer to work for an amazing company
-I have a supportive family who was behind my decisions
-I have an amazing girlfriend who was on board with me 100%
-I am at a place in my life (financially, career, relationship) were I can afford to take risks
-I have very little to lose, and can always come back home
So I also forgot to mention that I took a job at Twitter. With ~200 brilliant people and growing strong, I’m in for an interesting ride. I packed up all my stuff, and moved to San Francisco. I’m sure not everyone will agree with my justifications, but I wanted to experience this for myself, and be part of something big. How many people who criticize the “overrated tech scene” in the Bay area have actually lived here? And to those who have lived here, it took first hand experience to formulate that opinion, let me experience then formulate my own. I’ll work as hard as I can to contribute to a product which affects and touches millions of people around the world. I will try to absorb every bit of information I can, and meet as many people as I can. And lastly, I will try to have some fun… .
The Keyboard Law : And what drives many developers mad

Over the last couple of weeks I have been trying to formulate a law based on my experiences over the last 8 or so years writing software for companies. I think I have almost nailed it.
The Keyboard Law (or The New Keyboard Law):The total amount of unnecessary time elapsed between a developer requesting a new keyboard, to the time when it arrives in their hands, is directly proportional to the amount of bureaucracy within the department or organization he/she works for. As a corollary, this time is inversely proportional to the amount of influence software engineering experience has within the upper management of said company.
[Warning, below I go on a long rant explaining this law, feel free to skip it and just use this law in practice and give me credit,fame and fortune in the future. Also skip to the end and add your comments too ;P]
This is loosely based on Conway’s Lawy and Parkinson’s Law of Trivialty (aka the Bikeshed Example), and while it hasn’t been proven with empirical evidence, it humorously captures a common theme in the software industry. If any University Soft Eng profs want to fund me to do the research, give me an email
. This is an issue of micro management on how to keep software developers happy. It is just a small piece in the puzzle that I think can keep a growing company run smoothly. The second you find yourself coming up on the bad end of the Keyboard Law, it’s likely because the company is still trying to micromanage things like a purchase of a $40 keyboard.
Why I think this Law is important
The fact that it is humorous (to some people at least) is a problem on its own. Does it have to be a keyboard? Of course not, it could be a mouse, software license, monitor, chair, etc… it doesn’t really matter. What does matter is that the item must come with a reasonable justification of why or how it could improve the productivity of the developer. This doesn’t apply to a developer requesting a 42″ screen, but it does apply to one who was given a 15″ CRT and is struggling to have 4 terminal windows open on top of their IDE. Any unnecessary obstacles put in the path of a developer will cost a company money, and often more money than it would have taken to eliminate these obstacles in the first place.
A Potential Solution
First off, a developer should be managed by someone aware of this problem, and that manager should do everything in their power to minimize the negative effects. Knowing to escalate justifiable hardware requests, or having a very efficient procurement process in place is a start. A more general rule suggests that managers should always hide/minimize the amount of visibility of any bureaucracy which may provide unnecessary distractions to the development team.
The next suggestion is to create a slush fund. That’s right, I said it. Per team, per group, whatever, just have a tech manager, or operations manager (thank you Byron, the Tech Operations Manager who got me a testing netbook in less then 2 hours of requesting it) properly manage a fund specifically for dealing with this kind of stuff. If a proper, efficient process isn’t in place, a small on-the-books fund is a quick and easy solution. If a proper process is in place, make sure the managers streamline this process to make it as painless as possible.
Approving the slush fund is another story, but we aren’t talking about the $80K “entertainment” fund the sales guy gets to take clients to shows and steak dinners. I am talking $5k for an entire team, for essentials, like a proper orthopedic chair for the guy who can’t work for more than 1 hour due to back problems, or the extra monitor for the guy who is always remotely monitoring 10 different servers. Cheap stuff. Make it simple, cut out the BS and let developers do their jobs.
This is a CHEAP Fix for a Major Problem
Whether your fund is $5k or $20k, that solution is CHEAP. Developers don’t want more money. Repeat, developers don’t want more money. They want enough money, a competitive salary for instance, but not basketball player kind of money. This is not an issue of money, this is an issue of how much bureaucracy a developer can stomach in order to get his/her job done. Joel Spolsky said this 4 years ago:
‘No dysfunctional politics’. Programmers have very well-honed senses of justice. Code either works, or it doesn’t. There’s no sense in arguing whether a bug exists, since you can test the code and find out. The world of programming is very just and very strictly ordered and a heck of a lot of people go into programming in the first place because they prefer to spend their time in a just, orderly place, a strict meritocracy where you can win any debate simply by being right.
If a developer is going to pull an all nighter to finish a project that was mis-scheduled by you (the manager), then you’d better get him that 12 pack of Mountain Dew he asked for. And you’d better make sure as hell that the bill doesn’t end up in his lap at the end of the quarter. If a developer is blocking on a software license, and literally can’t work without it, the company is losing money every hour until that license is purchased and the developer is back to work. If there is actually hesitation behind buying the $500 license, think about the money being lost over the 2-3 days of deliberation.
This should also not be confused with frivolity. This approach should also not be confused with an incentive option. “If I don’t spend it this year, I’ll lose that on my budget for next year” completely misses the point.
Lastly, Software Developers Are Weird
Read, WEIRD, not SPECIAL. There is a common misconception that developers demand to be pampered or privileged. In my experience, Software Developers have strange and unconventional motivations. Giving them more money will not result in better, faster results. This has been proven true for all types of people, not just developers. Some developers like staying late in the office to play board games, or go straight home only to remote in and continue working. Sometimes, a 6-pack of Code-Red Mountain Dew will be more valuable than a $15K incentive bonus, because developers are that weird.The motivation of many great developers is to solve hard problems, and contribute, not to wrestle with politics, budgets, and red tape. Now on that, nobody likes that stuff. But continuing from saying that developers are WEIRD, they are the types to get exceptionally mad or overly frustrated about these things. If the focus and attention is shifted away from a real problem at hand, to a 3-page hardware request, the cost of that mental context switch will be astronomical. If the hardware approval finally goes through, and the CC chain goes 5 layers up in the organization to a Sr. VP approving a $100 monitor, there is a problem. By the time it goes that far up, a request for a monitor seems like another expense, and it is very unlikely that this Sr. Manager will get why it is a necessity. To a developer, explaining 2 weeks later that the request for a mouse was denied by the President of the company is like secretly inserting a printf("Segmentation Fault"); exit(0); into their source code somewhere. Its just a totally unnecessary slap to the face.
On the Corollary
I threw that in there to show an exception to the case. You can have a large company, with a lot of bureaucracy, but still have a short turn around on these types of expenses. If the structure of the department has an experienced operations manager keeping the train moving, then the developers won’t get distracted, and progress will be made. If a flexible spending budget exists for a team, it is probably because who ever requested it, or approved it, knew that these things need to be accommodated for. If every hardware request needs to pass by a VP who doesn’t understand the technical justification for a purchase, it should be realized that it is probably for the same reason they hired technical developers to implement solutions they can’t solve on their own.
Take the Test!
I’d love to hear feedback, have you ever experienced this? How big is your company? And how long did it take you to get what you really needed? How long did it take to get that keyboard with Chinese characters because you are doing translations, or a license to Windows7 because you are doing platform testing? If you don’t even know who to ask within your company… the Keyboard Law clearly defines your organization.
Apache Thrift Tutorial – A PHP client
In this post I’ll outline how to setup and connect a thrift client in PHP. If you’d like to learn how to setup and run a thrift server please see my friend Mike Cvet’s post here on setting up a C++ thrift server.
You’re in a meeting and some Sr. Dev from the systems or backend team says: “Great! just connect to my service via thrift, we already handle all the db connections and most of the caching. You guys use Ruby right? oh.. PHP? that’s cool too, sweet! *looks over to the PM* We should be done in a week…”. Oh snap! A week? What is this thrift thing? And what is this Ruby thing all those young whipper snappers keep talking about!?”. (Yes this is the use case I wish to satisfy with my post)
Apache Thrift is a great RPC framework originally developed and released by Facebook (added to the Apache incubator back in 2008). I’ve used thrift for the last few years as a simple / efficient way to exchange data across machines, applications, and languages. A coworker and I thought it’d be cool to do another Thrift tutorial, because at the time of this post, the official tutorials are being developed. Following the nature of thrift, we also thought it’d be cool (we are nerds) to split the tutorial across 2 different blogs, I will explain the client, he will explain the server. As a quick warning, this tutorial is rather verbose, I like hearing myself talk… Feel free to skim through the code if you want to skip my life story. Warning #2, I wrote this tutorial after drinking an entire bottle of wine, you have been warned.
Step 1: Build the .thrift file
One of the great things about thrift is that it simplifies the communication between a client and server to a simple .thrift file. This file describes the data structures, and functions available to your remote service. In this tutorial, we extend a simple calculator and do something (slightly) more chunky. Dealing with Matricies is a pain. Dealing with Matricies in PHP is an even bigger pain. Wouldn’t it be nice if we could handle these Matrix operations in something more powerful, say C++? My friend Mike drafted the interface of a MatrixCalculator, did all the dirty work of the hard math stuff and provided access to these functions via a convenient Thrift server. He was kind enough to whip up a simple thrift interface file describing his service.
calculator.thrift
namespace cpp calculator
typedef list<double> Vector
enum BinaryOperation
{
ADDITION = 1,
SUBTRACTION = 2,
MULTIPLICATION = 3,
DIVISION = 4,
MODULUS = 5,
}
struct ArithmeticOperation
{
1:BinaryOperation op,
2:double lh_term,
3:double rh_term,
}
exception ArithmeticException
{
1:string msg,
2:optional double x,
}
struct Matrix
{
1:i64 rows,
2:i64 cols,
3:list<Vector> data,
}
exception MatrixException
{
1:string msg,
}
service Calculator
{
/* Note you can't overload functions */
double calc (1:ArithmeticOperation op) throws (1:ArithmeticException ae),
Matrix mult (1:Matrix A, 2:Matrix B) throws (1:MatrixException me),
Matrix transpose (1:Matrix A) throws (1:MatrixException me),
}
Thrift files are great. They are like 100 pages of technical documentation boiled down to a handful of lines. No lies, high level (its still basically pseudo code), and its all you need. If the “spec” changes, you can just diff the new vs. old and know exactly what is new.
Step 2: Compile and get the goods
Let’s make sure you have thrift installed and ready to go. If this blow you up, I recommend getting and installing the latest build of thrift here.
thrift -version Thrift version 0.2.0-exported
Now we simply use the thrift compiler to autogenerate the PHP code which allows us to access these defined objects, and call these described functions.
thrift --gen php calculator.thrift
This will create a folder “gen-php” which will have a subfolder “calculator” which is our service. Contained are 2 files: Calculator.php which defines the PHP Object that represents the Calculator remote service. calculator_types.php which defines all the other PHP Objects involved with this service. The autogenerated code also conveniently encapsulates the buffered socket read/writes jazz that I haven’t had to write since University, and offers simple functions to call out.
Step3: Include the language specific libraries
After installing thrift, you’ll need to include the language specific libraries to facilitate access to thrift and all its goodness. Whenever you untar or installed the thrift files to, look for the folder at ./lib/php/src/ which contains a ton of library files you will need. Too see what other languages you can compile to for your client, just poke around in that lib folder if you are interested. For this example, I have a folder on my desktop called thriftcalc (this is what you will get if you checkout my repo here). You will also need to mv or cp the autogenerated thrift files for this project (the calculator pack folder containing: Calculator.php and calculator_types.php) into the packages folder of these library files. Here’s a screenshot of my directorys structure for this project.

The files/folder highlighted was autogenerated and moved into the packages folder.
In this example, I’ve moved the source php library files into a folder called “thrift” in my php root application folder, and I’ve moved the auto generated files from the previous step into the packages folder. Note that the package folder “calculator” was autogenerated based off the file name of the thrift file, this will also be reflected in *thriftname*_types.php.
Step4: Create a client application
The previous step showed a file called coolcalc.php, this is the simple php application I created which uses the thrift calculator service. Let’s take a look (my annotations will now continue in the code comments):
coolcalc.php
<?php
/* ----------------------------------------------
* Calculator client
*
* A very simple example of interaction with
* a calculator server application whose actions
* are facilitated by thrift. Both the client
* and server negotiate on the common interface
* defined by calculator.thrift
*
*@author Ian Chan
*@date May 10, 2010
* ----------------------------------------------
*/
// Setup the path to the thrift library folder
$GLOBALS['THRIFT_ROOT'] = 'thrift';
// Load up all the thrift stuff
require_once $GLOBALS['THRIFT_ROOT'].'/Thrift.php';
require_once $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php';
require_once $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php';
require_once $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php';
// Load the package that we autogenerated for this tutorial
require_once $GLOBALS['THRIFT_ROOT'].'/packages/calculator/Calculator.php';
// Several things might go wrong
try {
// Create a thrift connection (Boiler plate)
$socket = new TSocket('localhost', '9090');
$transport = new TBufferedTransport($socket);
$protocol = new TBinaryProtocol($transport);
// Create a calculator client
$client = new CalculatorClient($protocol);
// Open up the connection
$transport->open();
// First, lets do something simple
// Create a simple arithmatic operation (99 / 3)
$operation = new ArithmeticOperation();
$operation->op = BinaryOperation::DIVISON;
$operation->lh_term = 99;
$operation->rh_term = 3;
// Perform operation on the server
$sum = $client->calc($operation);
print_r($sum);
// Next, let's create the Matrix:
// | 1 2 3 |
// | 4 5 6 |
// | 7 8 9 |
$m1 = new Matrix();
$m1->rows = 3;
$m1->cols = 3;
$m1->data = array(array(1,2,3), array(4,5,6), array(7,8,9));
// Let's calculate its transpose, much to difficult in PHP!
$m2 = $client->transpose($m1);
echo "The Trasnpose of m1 is :\r\n";
print_r($m2);
// Next, Let's now multiply m with its transpose, again too hard for PHP
$m3 = $client->mult($m1, $m2);
echo "The product of m1 and m2 is :\r\n";
print_r($m3);
// And finally, we close the thrift connection
$transport->close();
} catch (ArithmaticException $ae) {
// performed an illegal operation, like 10/0
echo "ArithmatixException: ".$ae->msg."\r\n";
} catch (MatrixException $mx) {
// performed an illegal matrix operation
echo "MatrixException: ".$mx->msg."\r\n";
} catch (TException $tx) {
// a general thrift exception, like no such server
echo "ThriftException: ".$tx->getMessage()."\r\n";
}
?>
And there you have it, a simple thrift client. I hope you think about thrift next time you need to interface between 2 applications, or require some kind of client->server model for your system. Thrift makes it very fast and convenient to share data across different programming languages and makes it easy/flexible to develop to a shared interface contract. Cheers!
Delicious Tagging – One comma at a time
I find myself using delicious.com more and more (yes, I was a very late joiner). I read so many random blogs and articles and always feel bad when I forget where I got an idea from. I have been using delicious as a reference to my brain, the tagging system makes things really easy to recall. But the thing that always gets in my way is their tagging system, space delimited. Since delicious only accepts “spaces” rather than commas, I was frustrated one day to find duplicates of some of my tags:

And no, there is no such thing as "ui,"
I couldn’t imagine myself being the only one with this issue, 5 seconds of Googling uncovered this 3 year old thread about the problem. My usual greasemonkey disclaimer applies (I love delicious, and I allowed 3 years for this to be fixed, so I will make a patch if people choose to use it). So, better late than never, this one is for you @stowboyd!
Install the GreaseMonkey Script Here
The #1 Threat in Airplane Safety

I must assume that all airplanes run Windows2000
Inspiration behind this comic, I recently flew from Detroit to Toronto and the plane refused to take off because the kid beside me was writing an SMS. 2 different stewards began arguing with him to turn off his iPhone until he finally did. Meanwhile I was *sleeping* beside him with my iPhone on listening to music. Fortunately for me, I had my hood on and they didn’t care notice.
“Phones and Mp3 players can cause electrical interference that can disrupt our plane’s equipment.” I don’t like being treated like a child, the reality is they need your full attention during takeoff/landing so that you are alert, since these are the times most likely an accident could occur. Just say that. You can’t seriously expect me to fly on a plane if some idiot’s Walkman (that idiot was me in my previous story) was accidentally left on, and can take down a 747. Why do you rigorously measure the amount of hair gel in my carry on, and force me to put it into a baggie, yet seemingly ignore the 3 electronic devices in my front pocket.
Incidentally, while drawing this comic, this news article about an NFL player going through this exact debacle appeared in my news reader. I might be over reacting, but perhaps you (the FAA) should worry more about your pilots making $17,000 a year and being on food stamps [warning, link to Michael Moore] than me listening to Miley Cyrus on my flight home.
Software as an Art
Summary for all those headline skimmers: Ebert says that video games will never be art, I highly disagree and analyze and break down his argument. Ebert seems to have confused the act of playing games with the creation and the game itself. The original article spawned a huge reaction, and > 3,000 comments. Many ideas from those comments are shared by me.
A week ago, acclaimed film critic Roger Ebert posted an article boldly re-stating his belief that “Video Games can never be art”. His article was in response to a TEDx presentation by Kellee Santiago defending Video Games as an art form. Ebert’s argument hit a personal note, because although his focus was video games, to me it almost generalized that no part or product of the software process could be art.
Ebert’s main argument focused on a traditional definition of art, and used the 3 examples provided by Kellee as counter-examples for his proof. This made me cringe. Presenting an argument in this form (specifically relying on these 3 examples) to me was a logical fallacy, denying the antecedent. Video games will never be art, because these 3 games are not art. Sorry Ebert, you get an D- in propositional logic 101.
To his defense, I don’t feel like these were the best examples to use. The Waco Resurrection, was a very interesting but bizarre choice to prove a point. Any academic trying to solidify the credibility of modern video games knows of the stigma that must be overcome to make any progress. The Jack Thompson‘s of the world have made it impossible to mention video games seriously without getting the “senseless violence” card thrown on the table. I acknowledge the original ‘artistic’ intent behind the Waco project, but again, very very bizarre choice to make a point. The other two examples weren’t as bad, but Kellee quoting their market success just gave Ebert more ammunition. There are so many other facets of the game industry that could have been brought up.
Ebert seemed fixated on the gamers’ desire to have playing games qualified as art. This is the biggest problem in the whole debate for me. He unfortunately failed to see that many disagree with his position because the process of making a game, and the game itself is what people want to be considered art, not the act of playing. And instead of starting a fight with an audience, he started a fight with an entire industry. This comment (lost in the mass) by Ebert himself, sums it up.
By jim emerson on April 17, 2010 12:36 AMWould you concede that a chess set itself can be a work of art, whether or not it is actually played?Ebert: Yes. But why is that a concession?
Drawing Ideas From The Real World
I often (wrongfully) ignore great examples of UI design outside the computer world. While making a connecting flight in Vancouver, I stopped to take a picture of this (in my opinion) great “User Interface”. It reminded me of Tufte’s Envisioning Information, although I’m sure there are many other books which better exemplify this point, maybe this one.
I am always reminded of an interview question a friend had a few years ago while interviewing for a PM position at Microsoft: “Design a information kiosk assuming that your target demographic is illiterate.” That’s a cool problem that I think a lot of people freeze on. It opens up so many ways of exploring perceptual psychology and visual affordances, and generally brings up some great design questions.
The above sign is printed in English and French (Canada’s official languages), Chinese (likely due to the large amount of Chinese visitors and immigrants going through Vancouver) and some visual queues for everyone else. But realistically, the visual queues are the main focus, and the labels are just supplementary information. An arrow showing which direction to walk, the picture of a man traveling, the Canadian flag, signifying domestic, and a green light… which to be honest Im not sure what means, but lets me know that going this way is good.
Does your application’s or website’s UI communicate well to your users? Do you rely too heavily on English labels? Do you rely too heavily on icons? Does your website pass the blur test (now that green circle makes sense)? I won’t open the debate of icons vs. labels, or even the discussion about Realism in UI design, I am just thinking aloud.
An interesting thought, which stuck me while passing by this lonely sign in the Vancouver airport .
Update: For a very interesting and thorough breakdown of this idea in field, check out this great article on SmashingMagazine: http://www.smashingmagazine.com/2010/05/20/web-design-trends-2010-real-life-metaphors-and-css3-adaptation/.


