Friday, June 23, 2017

Evaluating Employers as a Junior Software Engineer

I got an ask about this on Tumblr recently:

Do you have any advice (for a very junior software engineer) on how to determine whether a particular company is a good place to work?

So, I’ve written a blog post on what can go wrong in a junior software engineering job. Your goal is to prevent that from happening.

Step 1. Are you the sort of person who cares a lot about Prestigious, Cool-Sounding Projects? If so, STOP. In my experience, the more prestigious a thing sounds, the better the odds are that the people doing it are kind of floundering and not making progress. Look for projects that are unsexy and obviously make money. It’ll be easier for you to learn from them.

Yes, it matters that what you do makes money. You need a job that has feedback cycles and clear progress metrics. Things that make money tend to have feedback cycles. Things that don’t… well, if you’re not making money, you have to convince someone to pay you somehow, and in practice that usually means politics, not numbers.

Step 2. Work with engineers who are a) better than you, and b) care about you, and most importantly c) will make time to mentor you. All of these things are necessary. In an interview, it’s easy to filter for ‘does this person seem nice?’ Unfortunately, there are many, many managers and mentors out there who are nice people, but really have no idea how to effectively help their subordinates/junior engineers.

Step 3. You need to write a few hundred thousand lines of code to become a better engineer. Your goal is to find somewhere to work with lots of code to write. You would think that if “coder” is a synonym for your job title, this would be easy, but it’s harder than you’d think.

So if prestige is a bad filter, and niceness is a bad filter, and "being a company that writes code" is a bad filter, what should you ask about in an interview in order to evaluate these things? I'm glad you asked!

  • Onboarding process.
    • When you get hired as a new engineer, how will they get you up to speed on their tooling and codebase?
    • The answer you want is something like, “Oh yes, we have training materials for getting new hires up to speed on our codebase. [Person], here, will walk you through getting your dev environment set up on your first day. And [Person] will be assigned as your mentor if you have any questions.” 
    • It might be more casual than that if you’re at a small company, but the important thing is that it is part of someone’s explicit job responsibilities to spend time answering your questions and helping you. If they don’t have that, give them a good hard side-eye. 
    • An ideal situation here is “your manager or mentor sits behind you and it’s socially acceptable for you to turn around and ask them a question at any time.” 
  • How you’ll interact with your manager. Will you have regular one-on-one meetings with them? (Good.) Will you have time to ask them questions? How many direct reports do they have? 
    • If your manager has more than 10 direct reports, this might be a bad sign. Managing people takes time. You need to be able to ask your manager questions and escalate problems to them when you’re stuck.
    • If you will mostly be working with your manager (not anyone else), you should have at least an hour of time with them per week for questions, especially near the beginning. 
    • But if you have a technical mentor who is separate from your manager, this may not be needed.
  • How other engineers collaborate with each other.
    • For example, code reviews. Do they do them? Code reviews are a great way for senior engineers to induct juniors into better code style and practices, and a great way to help you stay in touch with other people while doing your work. 
    • Work style and social-ness. Do people mostly keep to themselves all day? Do people frequently come to each other’s desks and ask questions, or use IM or email a lot? What does the typical engineer do when they need help?
    • The easier it is for other people to ask questions, the easier it will be for you, too.
  • What is your first project going to be? An organization that helps its engineers grow is an organization that assigns projects well.
    • One of the most important things your boss can do to help you grow is assign you projects of gradually increasing difficulty, selected to be useful to your organization.
    • Asking “What will my first assignment be?” will help you evaluate whether they’re making that decision with your growth in mind.
  • Why are you being hired? What does the organization need to do to get from where it is now, to where it wants to be? Will there be enough work for you to do, such that you can climb that ladder of projects-of-ascending-difficulty?
    • Does the organization have a lot of code to write? Are they racing to get all the work they can done, or are engineers trying to manufacture more work for themselves?
    • As a junior engineer, it’s better for you to be in the first situation, because it means there’s plenty of code for you to cut your teeth on. The second situation is fraught with politics and bullshit; avoid it if you can. 
  • This gets more important the more senior you get: How does the organization evaluate progress towards its goals?
    •  As a junior engineer, this matters less, because your personal growth is less tied to the growth of the organization as a whole. But like I said - clear feedback cycles help straighten out all sorts of organizational bullshit. Which may affect you indirectly.
Lastly, a rather personal opinion of mine: DON’T DO MACHINE LEARNING. Every junior software engineer wants to do machine learning. As a result, there's a whole industry of bullshit grown up around it, and in general, There Be Politics. If you think your project is really unusually data-driven and great, then maybe. But make them show you the ground truth and the metrics they use to evaluate their performance, and make sure they're good at all the people stuff, too.

Friday, May 19, 2017

Building a Community Institution In Five Hours A Week

My partner and I have been co-organizing rationality meetups in two different cities for the past five years. We're still learning how to be good at this, but we've made a lot of progress over the years. Here's some of what we've learned.

1. Have a purpose

"Have a meetup" is not a terminal goal, and not a good instrumental one either. "Have a fun place to socialize with friends" is better. "Provide a fun, low-key social space where newcomers can mingle with established community members" is even better. Be specific.

There's a lot of different good ways for a thing called a "meetup" to be. Some meetups might be a central community hub, with the goal "Build a rationalist community in <place> by having a meeting place where most community members come and interact." In a place with a more established community, the goal might be "Have an established collecting place for newcomers to come and check out the community, and eventually get them to start going to other events." Or you might have a meetup with a focus on personal growth as a group.

Having a purpose helps you make coherent decisions about the meetup. If your goal is to welcome newcomers, you might focus mostly on getting people talking with structured activities. If your goal is to improve members' rationality skills, you'll moderate discussions more tightly and keep things on track as much as possible. If your goal is to have a low-key socialization space, then you'll encourage off-topic conversation. It's all a matter of your vision.

2. No one cares about topics, but you gotta have 'em anyway

Most people, when polled, say they want to come to meetups for social interaction: developing friendships and meeting new people. They say meetup topics aren't very important to them. Yet in our experience, just setting up a meetup and saying "People are coming here! This is the Schelling point for meeting new friends!" doesn't convince people to show up. Why is this?

To the people deciding whether to come to your meetup, it matters who else is coming to the meetup, and what they're talking about. Saying "this is a fun social space" doesn't answer those questions. What if they're the only one who comes? What if the other people who come are all really boring, or have no interests in common with them?

Having a planned topic or activity overcomes that initial inertia, and gives them confidence that other people with similar interests will show up.

3. Try new things and learn what works

Try new meetup topics and activities. Write down how well they went. You never know when you'll discover something good.

This is more important near the beginning of a meetup, when you're still working on getting critical mass. But it's good to revisit periodically, too.

4. Exploit what you learn

When you find a formula that works, use the hell out of it. Re-use meetup topics and activities that went well before. In fact, while you're at it, look at other meetups and plagiarize their topics and activities.

Once you get enough activities that work well and are repeatable, you can start a rotation of the same activities, which makes it easy to plan out meetup topics months in advance. This is way less stressful than coming up with new stuff every week, and you can use some of the time you saved to look for new activities and other ways to improve the meetup.

5. Be regular and reliable

Show up. Consistently.

Being a community institution is about being reliable. You don't have to have The Greatest Meetup Ever every single week. Showing up unprepared is better than not showing up. Show up. Show up. Show up.

Weekly meetups at a specific time and place work well, because the meetup becomes a part of the rhythm of people's lives. Make the default be "there is a meetup and we will announce it if it is cancelled," not "we will announce it if there is a meetup."

6. Get people committed

Help the people who show up to meetups become part of the community.

Welcome new people. Strike up conversations with them deliberately to make them feel included.

When appropriate, let people know that you value their presence and what they have to contribute. Point out interesting points or funny jokes they made. Ask them questions about things they're knowledgeable about.

Encourage people at the meetup to socialize with each other outside it. Do the same yourself.

Ask other people to help with the work of running meetups, when you can. You could ask them to help with welcoming newcomers, to give a lightning talk on a particular topic, or to have a meetup where they give a short presentation on something they're interested in.

A story about this: When we were running a meetup that had lost a lot of its regular attendees, my partner called up each of the people who used to come to meetups, and asked them why they no longer came and if we could do anything to make the meetups worth their time again. One person we called told him, "Just knowing that you missed me made me want to come back." We hadn't seen this person in months. But because of that phone call, they became one of the most valuable community members we had, and a treasured friend.

7. Get backup

Having a co-organizer is a lifesaver. Showing up every week is hard. You need someone to take over for you in off weeks. They could even help you with whatever parts of organizing you don't like, if your skill sets are complementary.

If you don't have a co-organizer, try asking people who come regularly if they'd be interested in coordinating a meetup or two when you're away. Don't send a message to everyone in the group - that rarely works. Instead, pick out specific people you think would be well-suited to it.

(We could be better at this. When the two of us go on vacation out of town, it still usually means a cancelled meetup. I think the ideal version of this is a rotation where people take turns coordinating the meetup, and just one or two folks take point on making sure the meetup as a whole continues to exist.)

Last but not least:

8. Care

You may not be the best or most qualified person to run meetups. I know I'm not. But being willing to just do it is an incomparable advantage. Just don't let the thing die, and you're way ahead of the game.

Short-term incentives are against meetups existing. Once you have a consistent meetup going, you've usually made enough friends that you don't need it anymore.

But over the long term, having a space for people to make new friends builds a better community, and that benefits everyone. That's why we've kept meetups going for so long: they helped us find community wherever we were, and we believe they can help others, too.

Further reading: Soft Skills for Running Meetups For Beginners. More focused on one-off events than running a recurring meetup.

Thursday, May 4, 2017

How To Build A Community Full Of Lonely People

[Some observations on a problem in the rationality community, and suggestions on how to fix it. Epistemic status: amateur sociology. See also: Project Hufflepuff.]

It's normal for some people to be more popular than others in social groups. Some people are more conversationally skilled, more socially at ease, have more interesting things to say than others, and it's normal for other people to gravitate towards them.

But this isn't fixed. People can change in social skill, in confidence, in how interesting they are to others. Popularity shifts. Yet social behavior in the rationalist community suggests that, for a bunch of people obsessed with growth mindset, we're surprisingly fixed in the way we think about popularity and who is most valuable to interact with. And that makes many of us feel lonely and sad, even when we're together.

How Loneliness In A Crowd Happens

Some people are regarded as interesting, popular, and open to meeting new people. Everyone else crowds around these people, jumping up and down to see what's happening, trying to bustle their way to the front of the line. They congregate around the most popular person in the room, waiting for gaps in conversation to say something, or just listening in hopes that something good will happen merely by being in their presence. They ignore all but the most interesting people in the room.

This has bad consequences:
  • The popular people don't have time to talk to everyone who wants to talk to them; they might feel bad about this or overexert themselves trying to satisfy everyone.
  • The less-popular people are sad because they don't get much engagement from others.
  • Sometimes the lonely people ascribe this to their own social incompetence and feel extra-sad, when in reality there just isn't room for everyone to be friends with these particular people.
Why does this happen? The lonely people don't try to engage with others who are lonely. Perhaps it feels like settling for less to talk to anyone but the most popular person in the room. Or perhaps they don't feel confident enough to impose themselves on someone else who hasn't publicly indicated they're open to that.

How Do Other Communities Solve This?

Mainly by splitting groups into hierarchies. In a large organization like, say, a megachurch, or a strip-mall karate dojo, you pull new people in by asking them for more commitment and responsibility, then bestow upon them the corresponding status, then ask them to help new people. And the cycle continues.

In a sense, this means that all big groups are a social status pyramid scheme. But this isn't as bad as it sounds. Creating new social contexts creates new popularity and belonging for people to have; it doesn't have to take that resource away from others. Moreover, many people don't have to be the most popular person in the room to be happy; they are just as happy getting a reasonable amount of attention from the people they consider important.

Popularity as a Dynamic Resource

In a given social context, there is only so much mental space people have for "who is important and interesting in this group."

Suppose you're in a Chess Club with 40 members. You'll remember the president, the vice president, and maybe a few others who are particularly good at chess or weird; you'll think about and pay attention to those people the most, and mostly ignore everyone else. Those people will be overwhelmed with attention, and others won't get enough. On the other hand, suppose there are only 10 members of the club. You still have the same amount of room in your head for interesting people, but now there's much more of their attention to go around. 

But while popularity in a given social context has a ceiling on how much of it total you can have - there can only be so many people who pop into your head first as "the most important and interesting in this group" - it's not actually fixed.

You can spread it around, especially if you're one of the more popular people, by raining accolades on other people with special skills or qualities, allowing them to build up their own credit with the rest of the group. In turn, the rest of the group will be more interested in socializing with those people; you've basically increased the supply of popular people, allowing more of the demand for access to them to be met. For example, if you're the president of the Chess Club, you might point out an interesting technique or strategy that someone else used, and suggest others talk to them about it.

On the other hand, it's easy to try to restrict total popularity in a group to just one or a few people: never spread appreciation to others; try to encourage all conversations to flow to yourself (or a single popular person); give others the impression that you have attention to give them, when you don't; only try to talk to the most popular person in the room, ignoring all others to the greatest extent possible.

Strategies to Encourage Healthy Group Division

For people whose dance card is full already, and often find themselves at the center of attention at gatherings: Try to spread around your popularity and use it to help others get a leg up.
  • Make a point of pointing out the good qualities of others around you.
  • When someone else brings up a topic that you like but someone else has more knowledge/interest in, mention that person.
  • If you have a specific skill that others admire, consider making time to mentor others in that skill.
In fact, even if you're not a popular person, pointing out the good qualities of others around you is helpful and a great way to make other people feel appreciated. But it's especially helpful to deflect attention away from yourself if you're someone who gets a disproportionate amount.

For people who feel lonely:
  • Don't always try to interact with the coolest person in the room. Make an effort to reach out to people you wouldn't normally think to talk to.
  • Find yourself thinking "This person is too cool for me"? Maybe that's your brain's way of telling you that if you try to give a lot of your time and attention to them, you may not get much back in return. Consider befriending people who are less socially saturated.
  • If you often feel frustrated by a lack of engagement in the social events you go to, take that as a signal to organize your own events and create your own social context.
Of course, improving your personal social skills might help, too. But remember that your ability to get a resource is dependent on how plentiful that resource is, not only your skill at extracting it from your environment. Yes, this feels counter to the rationalist impulse of "REACH FOR THE STARS! YOU, TOO, CAN HAVE SOCIAL SKILLS AND BEFRIEND ANYONE YOU WANT!" But having a general ability to befriend people is not the same as being able to befriend a particular person.

("Who gets to talk to this particular cool person at a party" is a zero-sum game. "Who gets to talk to a cool person at a party" is not, because cool people are not a resource with fixed supply.)

For people creating or maintaining social institutions*:

By default, your position as organizer will draw attention to yourself. Actively work to bring attention to others in the group. 
  • Build ways for newer people to contribute and feel important. Ask for their help.
  • Build ways for established community members to help newer people. Ask for their help.
  • Point out people with common interests to get them talking.
  • Engage people who look bored. Try to get multiple bored people talking to each other, rather than passively observing a larger conversation.
Most of us fit into all of these roles, at one time or another. By helping people on the periphery grow into active community members, we can build a healthier community for everyone.

*Say, a meetup, or regular parties, or a Facebook group. Any social context, really.