But Where Do People Work in This Office?

In one study after another, workers failed to give much weight to decor in choosing, for instance, among variously colored panels and fixtures. The feeling seemed to be that depressing surroundings would be counterproductive, but as long as the office wasn’t depressing, then you could happily ignore it and get down to work.
...
So we see the paradoxical phenomenon that totally unworkable space is gussied up expensively and pointlessly with plush carpets, black and chrome furniture, corn plants that get more space than workers, and elaborate panels. The next time someone proudly shows you around a newly designed office, think hard about whether it’s the functionality of the space that is being touted or its appearance. All too often, it’s the appearance.

— Peopleware, “The Issue of Glitz”
I’ve become fascinated by the concept of office space design for knowledge workers, in particular software developers. There’s a fantastic site called Office Snapshots that gathers information and photos about the offices of hundreds of companies, including many well-known software companies.

We’ve all heard about the lavish offices of Silicon Valley, where tech companies gather the best programmers in the world and spare no expense to provide for their every need. After looking through tons of cool office photos of many of the hottest companies in the Valley, I started to play a fun game I made up called “spot the desks”. I’ll show you what I mean.

Facebook

Mark Zuckerberg recently engaged world-famous architect, Frank Gehry, to design “the largest open-plan office in the world.” Since that one’s still in the offing, I’ll share a few photos of Facebook’s existing campus in Menlo Park.

An all-you-can-drink coffee bar with free snacks!


A bright mural and custom-made propaganda posters (HACK! MOVE FAST & BREAK THINGS!)


I see a lot of awesome stuff, but where is the quiet area where your big brains go to make world-changing software? Oh, jeez. Were the geniuses that wrote Cassandra and HHVM sitting in a bullpen like this?

Twitter

In the tech mecca of San Francisco, let’s check out Twitter’s headquarters.

There’s that coffee bar again. More free snacks!


It’s like a Dave & Buster’s up in here!


Ok…now where do the developers sit? Oh, I think I see them in the background of this conference room photo. Wow, that looks kinda noisy. Is that guy at card table #2 working on Bower?

Dropbox

We could go on all day, but let’s check out one more office. Who doesn’t love Dropbox?

It’s like they have their own Panera!


Just chillin’ in my treehouse / log cabin / conference room…


You know the drill by now. Let’s see where the desks are where the devs have their big monitors, keyboard, ergonomic Aeron chairs, and all their gear set up. You know, where they get in the zone and write that world-class code. Wait…what the f*ck!? I wonder how many MIT grads per square foot you can fit in here?


I could go on and on and on. The pattern keeps repeating. With everything we know about open plan offices, why are these mega-rich companies knocking themselves out to hire the very best and brightest minds from the world’s best universities, paying them huge salaries, tapping world-class architects to design artisanal office spaces in the most expensive place in the country, and then cramming desks together in noisy bullpens?

People Hire Clones of Themselves

Here’s a recent exchange I had in the comments of yet another post about the challenges of hiring software developers on Hacker News:

Matt_Mickiewicz:
...a lot of companies that are selling pants online are searching for PhD-level engineering talent to run their shopping cart.

Me:
I've noticed this, too, and been baffled by it. My working explanation is that people tend to hire clones of themselves. If the people making the hiring decisions in that online pants company have PhDs, they'll believe they need PhDs to work on that shopping cart.

danielweber:
> people tend to hire clones of themselves
Winner winner, chicken dinner.
Ask a company that is hiring "is X important?", where X is one of {open-source coding, algorithm design, Ivy league degree, master's degree, MIT degree, Facebook alum, Google alum, presence in Silicon Valley, under 25 years old, over 25 years old, has a github, has a blog}, and you will get a "yes" for each X that the founder has.

This ended up being my highest rated comment on HN, so I thought it’d be worth expanding on with a blog post.

Hiring Is Hard

Hiring software developers is complicated and damn hard. Just hang around Hacker News, Twitter, or your favorite software blog aggregator and you’ll see people endlessly debating the best way to hire good software developers. It’s clear that as an industry, we’re not even close to reaching a consensus, much less even general best practices that most people agree on.

It’s not surprising then that the software industry generally sucks at making high-quality matches between organizations and potential hires. I won’t pretend that I have answers, but I just want to highlight one aspect of hiring that can be particularly baffling, especially if you’re a young software developer early in your career and trying to figure out where you fit in.

No One Thinks They Suck

In light of the bewildering difficulty of vetting software developers, an interviewer/evaluator often turns to the one exemplar of excellent software development he knows better than any: himself.

People tend to unconsciously assume, “If I hire someone like me, then I know they’ll be good, because I’m good.”

Psychologist Dr. Robert Cialdini explains in his classic book, Influence:

We like people who are similar to us. This fact seems to hold true whether the similarity is in the area of opinions, personality traits, background, or life-style.

Car salesmen, for example, are trained to look for evidence of [backgrounds and interests] while examining the customer's trade-in. If there is camping gear in the trunk, the salesman might mention, later on, how he loves to get away from the city whenever he can; if there are golf balls on the back seat, he might remark that he hopes the rain will hold off until he can play the eighteen holes he has scheduled for later in the day; if he notices that the car was purchased out of state, he might ask where the customer is from and report--with surprise--that he (or his wife) was born there, too.

Now, Cialdini was talking about a car salesman trying to move merchandise. But in a hiring situation, the candidate’s future work is the merchandise. The more that the candidate seems like the interviewer, the more likely the interviewer will want to hire that candidate.

That’s not to say that candidates do or should manufacture their interests and backstories. But if the interviewer puts a lot of effort into blogging, and the candidate has an active blog…or the interviewer has a side project in Haskell, and the candidate mentions that Haskell is their favorite programming language…or they both like to tinker with Linux in their free time…you get the idea.

I am not immune from this bias. I’ve found myself warming up to interviewees when I discovered they used ReSharper (one of my favorite development tools), were interested in the same bleeding-edge JavaScript framework I was, or something as utterly irrelevant as we both loved indie music. None of those things are direct evidence that they would make good software if they were to join my team.

There can also be a bias toward people who took the same path that you did to get where you are. If I earned a Computer Science degree before starting my career, and you didn’t…or software is my first career, and you transitioned to it from a different career…or I’ve worked for tech companies, and you’ve worked in a technical role for non-tech companies…again, you get the idea.

I’m not trying to point fingers here—we all have our biases and blind spots. I just want to make the point that objectively vetting software developers is hard as hell and many interviewers are not very good at teasing out the stuff that matters: will this person deliver high-quality software if they were to join my team? It’s super easy to fall back on: are they like me?

“Cultural Fit”

There’s a general catch-all term for the non-objective criteria by which companies decide go or no-go on candidates: “cultural fit”.

There are explicit laws against rejecting a candidate because they're not the same race as you, or the same sex, or the same religion. But some people will freely reject you for reasons that don’t necessarily seem relevant to the daily work they do, like they have a degree from a name-brand college and you don't, or because they attend hackathons and you don't, or they've memorized the merge sort algorithm and you haven't. People will sometimes jump to conclusions about your ability as a developer based on lifestyle choices you've made, what you do in your free time, or your preference for one programming language over another.

It can be frustrating that some teams get very micro-focused on the smallest aspects of software development, while being far from getting the most basic things right. There are about a million and one ways to effectively deliver software. At the end of the day, does it really matter if one team writes specs and the other writes unit tests? One hand-writes their SQL queries and another uses an ORM? One uses Gulp and another uses Grunt?

It’s Not You, It’s Me

Again, my aim with this post is not to condemn the way that people make hiring decisions, but just to help explain what can be the somewhat baffling way that groups of people choose who will join them.

Just be aware that simply being good at what you'd assume are the objective aspects of your job as a software developer (delivering high-quality software on time) are not always enough to land a job with a specific group of people. Much like dating, you can't take "rejection" personally. Just because you didn't fit one person (or one organization's) image, doesn't mean anything about your general worth. Sometimes it takes just finding a group of people whose preferences align with your own.

When new companies appear on your radar (and you’re open to a career move), you can save a lot of time and shut down unproductive avenues by paying close attention to the “cultural” aspects. If a culture clash is coming, it’s better to find out sooner rather than later, as those opportunities won’t work out in the long term.

How I Work Remotely


With the trend of remote work on a rocket ship to the moon, I thought I’d share some things I’ve learned working in a distributed organization where remote work is common.

Remote

Asynchronous Communication


As software people, we’re familiar with the concept of asynchronous communication. When my web app needs to kick off a long-running process on the server, it doesn’t freeze up until the server finishes the work and gets back to it. When I’m working as a member of a distributed team, adopting an asynchronous style of communication with my fellow humans becomes important.

I start by getting out of the synchronous mindset where I’m blocked until I get feedback from a specific person at a specific time. Remote team members are like long-running processes on a distant server. I assume that my communication with them is mainly asynchronous. I keep other tasks in mind that I can keep making progress on while that remote process is generating a response for me.

Effective Writing


When working with distributed team members, written communication takes a front seat. Getting input from people via writing is more effective when I keep a few points in mind.

Write

Set the person up for success

Since email tends to be the dominant form of written communication in my distributed team, most of the important lessons I’ve learned relate to effective email. When I’m writing up an email to a team member, I try to set them up for success.

Since some of the folks I work with tend to have unpredictable schedules and receive a ton of email, I want to make it easy for the other person to provide a clear, unambiguous answer in one email that can unblock me.

I anticipate some of the reasonable possible responses they’re likely to give and include those in the email. It’s almost like preparing a menu of options they can pick from so they don’t have to start from scratch when they’re writing up a response for me. This becomes easier the more you work with certain people and learn how they tend to think.

Menu

Assuming as little as possible about the person’s mental context is another lesson I’ve learned. I avoid jumping in with a very specific question, assuming that the person will know exactly what I’m talking about. I’ll remind the person of the context of my question so they don’t have to rack their brain to rebuild the context. If we’ve written about the topic before, I’ll dig up our previous communications and quote them in the new one.

Include links! If I’m referencing something that has an online artifact, I link it up! Don’t make the person chase down things that I can pre-chase. For example, if we’re discussing the requirements for a particular backlog item, I grab the URL to the backlog item in TFS and include it in the email so the person doesn’t have to first dig up the backlog item before they can respond to me.

The sort of meta-point behind all these lessons is that people are more likely to respond effectively and in a timely fashion if you make it simple for them to do so. Set them up for success!

A picture is worth a thousand words

The old saying is true. When I’m discussing something that could be screenshot‘d, I include a screenshot! Windows has for several releases included the Snipping Tool, which is a simple screenshot tool I use a ton, as I work in a Microsoft shop. If you’re on OS X or Linux, I’m sure you can find similar tools for taking screenshots and marking them up.

Camera

Circle elements of the screenshot and draw arrows. When I visually draw attention to the most important aspects of a screenshot, it leaves no ambiguity as to what I’m talking about. I can’t count the number of times an email chain could have been shortened by a simple screenshot with red circles around the areas in question.

Mockups accomplish a similar purpose to screenshots, before something exists to be screenshot’d. When my team is in the stages where a new chuck of functionality for our application is coming into being, a simple mockup in a tool like Balsamiq can bring untold clarity to a design discussion and form a solid starting point for productive conversation to focus around. I’ll touch on Balsamiq again a little later.

Explain it to the duck first

Often I find that when I take care to thoroughly explain something in writing to someone, I end up not even needing to hit Send. Writing requires one to clarify one’s own understanding of a concept. Developers have a term for this process: rubber duck debugging.

Rubber ducks

State of the Project (Single Source of Truth)


When working in a distributed team, it’s important to have an online Single Source of Truth (SSOT) that people can go to to pull information from. You can’t rely on word of mouth to spread the status of work throughout the team.

State of the Union

There are about a million and one tools that will get the job done, whether it’s Pivotal Tracker, Asana, Trello, or something else. On my team, we use TFS for this purpose. Pick one and stick with it. Our whole team knows that TFS is the SSOT.

When I find some important piece of information missing from the SSOT, and I have to ask a team member for the information, I ask them kindly to answer the question by updating the SSOT. That way this new piece of information becomes available to the whole team the moment it becomes available to me.

If someone asks me for the status of something, I point them to the SSOT, because I’m always keeping the SSOT up to date with my status.

When the product owner dreams up a new requirement, right away we capture the requirement in the SSOT. Eventually you can weave into your team culture that if something doesn’t exist in the SSOT, then it doesn’t exist.

Build a Rough Version and Show It


There’s no doubt that it’s a bit more cumbersome to discuss highly visual concepts remotely. That new page in your web app that your product owner wants is tougher to design without a whiteboard in front of the two of you.

I encourage folks to get away from the idea that you have to perfectly define every aspect of some new thing before anything can be built.

I think this is a skill you develop with experience, especially if you’ve gotten used to working with a particular product owner. You can cultivate a part of your brain that can act as a sort of proxy for your product owner if they’re not immediately available to answer a question.

Taking care to understand the high-level motivation behind a feature allows me to rough in some of the details in the early stages with the confidence that they’ll only change slightly in the later stages when every little thing is being defined. For example, I won’t stop making progress on a new screen because I’m waiting for the product owner to tell me what color a button should be or the exact phrasing of a label. I use my best judgment, then keep on truckin’. Those things are easy to change later.

When finding myself in doubt about the general approach to take with some new feature, there’s no better way to get the conversation moving in a productive direction than to create a quick mockup. Again, a picture is worth a thousand words. Once you have some sort of visual artifact you can both look at independently, even if it’s wrong in many ways, then you’ve got a basis for productive conversation.

Balsamiq Mockups

Balsamiq is a fantastic tool for mockups. It’s very quick to produce a rough sketch of an idea and start getting opinions on it. Balsamiq has the awesome property that its shapes look rough and unfinished by design. The lines are a little squiggly, the font is almost Comic Sans-ish. It gets the message across that this is just an idea, it’s not intended to be a final product. Get the broad strokes of an idea across without people getting caught up in the fine details.

Once I have a mockup that shows my best understanding of the problem being solved, it’s time to send it over to the product owner (or whosever opinion I’m seeking) and get their comments on it. Once we’ve agreed on the general layout of a page, we can proceed confidently with development, knowing that we’re not wasting time and won’t have to bug each other for a while.

When You Just Have to Be Synchronous


Up to this point, all the tips I’ve discussed have been about how to work asynchronously as much as possible and how to be effective in that mode of communication. Well, there are times when I just need that real-time exchange with someone because the thing we need to discuss can’t wait. There are three main ways that I go synchronous with remote team members: screen sharing, conference calls, and instant messaging.

When we have some visual artifact that we both need to have our eyes on at the same time, screen sharing tools are the way to go. On my team we use WebEx, but there are a million other tools that can do this, including GoToMeeting, Microsoft Lync, and Google Hangouts.

Conference calls are old-school but they can be handy in some situations. For example, my team has a regularly scheduled stand-up every morning. There’s a standard con-call number everyone knows, and if you’re working remote that day, just call in and you can participate in the stand-up just like the folks at the office.

Telephone

I have conflicted feelings about instant messaging. For one-on-one conversation, it beats a phone call as it’s less intrusive and people generally understand that an immediate response is not needed. But it has the same downside of ad-hoc in-person conversations in that the content of the conversation is not preserved for later reference. For anything beyond the most trivial of exchanges, I prefer to use email as it automatically creates a record that I can search through later when weeks (or months, or years) have gone by and I can’t remember why we decided to do thing X over thing Y. Somewhere in the middle are tools like Campfire that do group chat with automatic transcripts. I’ve used tools like this in past jobs, but they haven’t found wide use at my current company yet.

Writing is Searchable, Voice Isn’t


This is a sort of meta-point that I’ve touched on above, but I’ll call it out here as a separate thought. If a team can get used to written communication as their main form of communication, they get the awesome benefit of a searchable, historical record of their decision making process. Be honest, how many times have you wasted effort trying to remember why some feature of your software works the way it does? No one can remember because it was designed via ad-hoc conversations in the hallway or over the phone and no one thought to write down the salient points that led you to do whatever it was that you did. Or when you demo a completed feature to the product owner, and a moment of panic ensues because they remember telling you to do X, but you thought they said Y, and no one knows what’s correct because no one wrote it down.

Recording

Writing is recorded, voice isn’t. Writing is searchable, voice isn’t.

I ♥ Remote Work


Some of the most blissfully productive days I’ve had are when my whole team is working remote because a winter storm has left us snowbound. There’s nothing quite like the glorious zone of productivity sans soul-crushing interruptions. I’m extremely optimistic about the global trend toward remote work, and I’m confident that more people will keep making the jump to full-time remote work (me included).

There are undoubtedly unique challenges that come with working remote. The most helpful lessons I’ve learned are to communicate asynchronous-first, express myself clearly in writing, keep my team up to date, exercise careful independent judgment, and go synchronous when asynchronous just won’t do. When my distributed team does these things well, we can kick ass together.

Introducing Kenny

Kenny is my tool for webmasters who run sites secured with HTTP basic authentication. Kenny can track down and show these folks where logins for their site(s) have been leaked on the public Web.

kenny-logins-ascii

Ride into the danger zone, y'all. - Kenny L.

I envisaged Kenny as a project in which I could explore several technologies:

And that's exactly what I did: Kenny is now a real thing, and all these technologies were crucial in its construction.

Kenny homepage

Webmasters can add the sites they want to track.

Add your sites

Kenny will search the public Web for logins and collect them in a list where the webmaster can test them for validity and review the source of each leak.

List of logins

I had a ball working on Kenny, and I learned a lot about some technologies I’d been itching to work with. I plan to follow up this blog post with another that goes into some details about the different tech I used, what I learned, and what was cool about them.

In the meantime, check out the source code and play with the demo on AppHarbor:

The Boy Scout Rule

One of the software development principles I live by is the "Boy Scout Rule".

The Boy Scouts of America have a simple rule that we can apply to our profession.
Leave the campground cleaner than you found it.
If we all checked-in our code a little cleaner than when we checked it out, the code simply could not rot.

Whenever I dig around in my company's rather large codebase hunting down a bug or perhaps adding a feature, I look for little opportunities to leave the files I touch a little cleaner than I found them. Ancient commented-out sections of code, unused variables, unused methods, and other detritus left behind by the organic change of a codebase are all ripe targets. ReSharper is the poker stick with which I pick up the litter around my campsite.

It's my little way of fighting back against the tendency of a codebase to decay and become noisy over time. And, not to mention, there's just something fun about deleting code. I encourage everyone to experience the joy of deletion.

DHH on Hiring Remote Workers

If we were only trying to hire in Chicago, we’d never have the world-class team we have today.

. . .

Being in the same room occasionally is great, but I would much rather work with A players remotely than B players in the same office, if that's the choice.

Yes. Yes. Yes.

TLC on Software Methodologies