Sunday, June 5, 2016

What a company-wide "reorg" looks like in a flat, manager-less company

Working at a bunch of companies over the years has given me a lot of interesting perspective. I really enjoy trying to describe how processes in top-down companies can be done in non-hierarchical ("no boss" or self-organizing) companies. Let's try to describe, say to a hierarchical company employee, what a company-wide "reorg" could look like in a no-manager company.

I first heard the word "reorg" in relation to how Microsoft periodically reorganizes its corporate structure to "better align the company to new corporate-level goals and strategies". (That's a joke.) Issuing a company-wide reorg in a hierarchical company is very much a executive-level decision. It's a top-down directive that the company intentionally follows, like a military maneuver. It just happens, you know about it as an employee, and you must go with the flow.

But what does a deep reorg actually look like in a non-hierarchical, manager-less company? The CEO can't just come cruising in totally reorg'ing the place. (Remember, the CEO is not your boss in companies like this!) Such a traumatic "mass adjustment of resources" is just not in the culture. (Small-scale "horse trades" occur all the time in manager-less companies. I'm talking about a deep, planned reorganization that impacts a large chunk of the company.)

Well, here's one way you can re-org a manager-less company. This approach assumes the company actor(s) attempting to pull the reorg off have the power to form new teams and make internal/external hires.

First, you need to form a small team around some new product or technology. Do it just below the radar (internally). It needs to show promise and be a rising-star type project. You should work to get as much strategic press exposure about this new team's work as possible.

Next, you start internally recruiting and externally hiring for that new team. You optimize the external hiring process to streamline it, to accept some candidates as contractors (who you may eventually hire) and some as immediate full-time employees. For the internal recruits, you only hire those internal developers who are the most passionate about the new project's goals or its technology. Hiring on the new team must be done carefully, because it's ultimately part of a greater company-wide sorting and reorganization process.

If the new project becomes large enough, it creates a rift of sorts in the organization. The new team gets more power and size over time. An entire ecosystem of other friendly teams can form around the new team. The company self-organizes itself into a market of teams around the new project, and a block of other "deprecated teams" who may not be aligned with the reorg's goals.

These deprecated teams can be reduced in size by letting go of internal developers over time. Anyone the company doesn't want long-term can be quickly moved onto a deprecated team. To minimize shock to the deprecated team's product (which may need to remain live), the team can fall back to possibly cheaper external contractors as it internally shrinks. Ultimately, the product can be put on long-term life support with minimal internal cost.

Now, if you are a developer in a company like this, and you want to survive the reorg, you should be asking yourself right about now "am I on a deprecated team?". If you are, you better learn the company's new religion quickly or you may be pushed out. (Or, you need to visibly work on background projects that support post-reorg goals or needs.)

If you are a senior team member in this scenario, and you want your team to not become deprecated, you need to quickly figure out how to transition your product into the "new era" so it remains relevant.

Thursday, May 19, 2016

We Need to Collectively Renegotiate

I'm sitting here watching season 2 of Halt and Catch Fire. This season wipes the slate mostly clean and starts over at an early 80's garage-style software service startup in Texas. At first, I pushed back at the idea of a real-time online gaming service using early 80's Commodore-era computer, disk storage and modem technology. Then I realized, everything they are showing here was more or less technologically feasible, or at worst was at the very edge of that era's hardware/software technology.

While watching this I had another interesting realization. Lots of my previous posts are really my way of telling every full-time software engineer I can reach to basically "wake up".

Let's mentally model the current employment situation as a 2D simulation. See all those little dots? Those are the full-time software developers working at corporations. Let's hit fast forward. Wow, that's weird! All these super valuable programmers keep going to and from the same bland corporate company nodes to work every morning. Their working conditions sometimes really suck and they are generally underpaid. These corporations have even been known to illegally cooperate with each other (i.e. conspire) to keep compensation to a minimum.

We've been interacting with lots of clients, some very well known in their fields, and most paint a similar picture: Their view is that too many engineers are "locked up" inside these corporations. It's actually very hard to find good software developers. There is room in the system for more software consultants, little consulting companies with amazing programmers like Blue Shift.

So here's my idea:

Now let's try upping the communication, empathy, independent organization and trust levels across all these agents in the simulation and see what happens. A bunch of smaller companies pop up and start offering their services to a potentially huge array of clients. They can negotiate for the best pay and conditions possible in this changed economy.

To pull this off in the real world, what we need to do is start talking, trusting, and cooperating with each other much more, especially across teams and companies. We all have a common interest here that totally transcends pretty much any corporate NDA. Collectively, we as software engineers have way too much power and value in the system to be working as atomized individuals competing with each other for scraps.

We can leave these corporations to form our own consulting or product companies. This will force the market to reorganize itself. Do this and working conditions and compensation levels can be organically pressured upwards. We actually have the power to do this if we would just organize and communicate more effectively.

Personally I believe even just a small number of programmers doing this can have a surprising economic and perhaps even a cultural impact.

In practice, doing this isn't that hard. I've started three companies so far, in between working at various companies. The first one did very early deferred shading research for Microsoft, the second one created crunch, and the third (Binomial) is consulting oriented.

To start: While still employed, work on building a community of other engineers at various companies. Up your visibility by making sure your code and work is easily found online, attend every event you can, give presentations, teach and help people, and be as public as possible. Save up 6 months or whatever of finances, find some friends and make the leap.

And if you fail? No big deal, just sign up for another full-time gig for a while. One that likely pays more, because this collective renegotiation strategy results in higher average wages, and because by changing companies you might even get a raise for being more experienced now!

To find clients, tap into your network and offer your services. This will free up amazing teams to work across companies, instead of them being locked up inside a few corporate fortresses.

Another fallback strategy if your new company fails is to get acqui-hired by a larger company, skipping the ridiculous interview process many companies use. Just develop a cool piece of technology that you think one or more companies would be interested in.

(So, think I'm crazy? I have a bunch of detailed mental models here, built up over time by working at several large strategically placed software companies in several states. This can work. We just need to organize better and teach each other how to do it.)

Wednesday, May 18, 2016

A consultant's perspective on working full-time for a corporation

I've been working as a software consultant at Binomial LLC (a company Stephanie Hurlburt and I just started) for just enough time now that my perspective has begun to shift from my former full-time mentality. I'm obviously no expert at this, but I'm learning as fast as possible, and I intend on sharing everything I learn.

Let's compare what it's like to work full-time somewhere from the viewpoint of a consultant's perspective. This is something I couldn't do before, and very few if any of my coworkers ever talked about stuff like this at all:

Note: Obviously, not all corporations are bad places to work. I'm very much generalizing here from multiple past experiences at medium (say >50 people) to large corporations. There are some very nice companies out there too.

- Corporations are Control Freaks

With full-timing, your "client" (your employer) is extremely controlling, even in open office and "no manager" type companies.

Your control fetish "client" probably requires you to commute every day, sit in an office somewhere in a noisy non-optimal environment, and bang out code like a machine every day of the week for weeks and months at a time.

Some clients actually encourage the other "consultants" (your coworkers) to use peer pressure on you so you work longer than is sustainable or healthy. Or, they just require you to overwork yourself.

Some clients record and monitor all of your network traffic (or your emails, instant message traffic etc.), monitor when you enter and leave the workplace, etc.

You know what? Working for ultra-controlling clients like this sounds terrifying from my new perspective.

Corporations and recruiters work together to suppress wages and opportunities

I know many programmers who are locked completely up within the corporate fill-timing paradigm. When they inevitably loose their jobs (due to layoffs, random purges, teams or companies failing, etc.) they are thrown to the full-timing wolves that orbit all the major tech companies.

Now you need to put yourself on the market, start talking with recruiters, and dust-off your elite whiteboarding skills - fast.

With consulting, a good goal is to build up a community of potential clients over time and keep this community as happy as possible. You're not dependent on any single client this way, and you gain access to more potential projects this way. Price fixing is unlikely if your client community is diverse.

- Corporations can harbor, even encourage Toxic Teams

A few years ago at one company, I got tossed onto a horribly abusive, brutal, and kinda nutty team right out of the starting gate. That was a super intense, Alice in Wonderland type experience that I will never repeat. (Why did I stay on this team for around a year, even though I should have left? Because I loved the company's products and this team was trying to build a new engine for future products. I eventually moved to another team that was actually shipping something real.)

With consulting, we can first sign a short-term contract (from days to a few months depending on the scope) to feel each other out. If it doesn't work out, no big deal, the damage (to both parties) is minimized. Working for a new company as a consultant isn't this stressful, life changing event like changing jobs is.

- Corporations Demand Intense and Extreme Loyalty

These "clients" want to basically own your life.

Working full-time at a corporation, you negotiate, then sign a contract. That's usually it. Truly renegotiating can be tough, because to have a real negotiation you must be willing to leave. This is a type of client that demands total absolute loyalty! Many corporations even claim ownership over all your work, even things you do on your own time at home.

As a consultant, you can potentially renegotiate in between every project. It's not that big of a deal.

- Corporations are Work-A-Holics

At a corp, if I want to take time off I must check to see if I'm allowed first. At many places you only get a handful of weeks off once every year. If you get sick, or have some life changing event you need to deal with, you're potentially screwed.

This seems analogous to a "toxic client" in consulting, one that is super jealous and extremely demanding of your time! 

- Corporations limit your freedom

At one of my previous companies, I could theoretically wheel my desk anywhere and pick and choose what team I worked with. In practice, office politics and super-cliquish teams massively constrained this freedom. At another company, I was stuck on the same team basically forever, because the org structure had ossified around us over many years.

As a consultant I can pick and choose who I want to work with. Obviously, I tend to choose nicer clients, because at the end of the day this is a social process and I personally like working with friendly and no-ego teams. My market of teams to work with is potentially massive now. I can wheel my little virtual desk anywhere in the world.

Friday, May 13, 2016

More company culture quotes from Disrupted

Interesting quotes from Disrupted: My Misadventure in the Start-Up Bubble (which I'm only 1/3rd through):
"I've been warned that at a place like HubSpot the worst thing you can say is anything that was done at your last company is something we should think about doing here. Even if your last company was Google or Apple, nobody at HubSpot wants to be told, especially by some newcomer, some outsider, that there might be a better way. HubSpot is HubSpot. It's unique. It's different. HubSpot has its own way of doing things. We're rethinking everything. We're challenging all the assumptions. We're not just making software, we're reinventing the way companies do business."
A funny take on HubSpot's usage of the DISC personality test:
"Managers, people like Zack, get the same training that I'm getting, but then they go to an extra class where they learn how to use DISC when they are managing people. Try to image the calamity of that: Zack, age twenty-eight, with no management experience, gets training from Dave, a weekend rock guitarist, on how to apply a set of fundamentally unsound psychological principles as a way to manipulate the people who report to him."
It's crazy what people will do for money.

Thursday, April 28, 2016

Hiring Group Dynamics

So there are several interesting hiring related phenomenon I've seen at various companies. I think some of the most exaggerated hiring behavior will emerge at "flat" companies with yearly bonuses based (partially) from the data gathered during peer feedback.

Here's a description of one category of emergent behavior I noticed when the programmers have nearly free reign to run the hiring process and who will ultimately get hired:

Want a good bonus? Never hire new competition!

You would think the programmers doing the hiring would always be fair and unbiased in their assessments of each candidate's abilities, right? And they would, of course, always optimize for adding value to the company by making good hires. The company programmers involved in the process would choose good candidates for each opening, irrespective of politics, or concerns over their future positions or bonuses, etc.

In practice, I think especially at companies with massive yearly bonuses, the company's programmers will band together unofficially and make it practically impossible for potential competition to enter the company, make waves, and possibly eclipse the old guard. We have a classic conflict of interest situation here. This tendency to embargo your competition is especially effective when hiring specialists, such as graphics programmers, although I've seen it happen regardless of specialty.

At one well-known company, I watched around a dozen experienced graphics programmers get rejected in our interview process. Each time, without exception it was a NO HIRE, even though we were in dire need of graphics programmers. A few of the names were pretty well known in graphics circles, so my jaw dropped after several of these NO HIRE interviews.

I was involved in some of these interviews. Almost every time, these candidates would do sometimes incredible things during the whiteboard interview, but somehow one or two graphics programmers would always find some other reason to be thumbs down. (I didn't say anything at the time, because I was afraid doing so would have made enemies and hurt my career at this company. I was basically incentivized to say nothing by the peer feedback based bonus system.)

Eventually, upper management quietly noticed that irrespective of our company's dire need of graphics engineers, we weren't hiring them anyway. This company had a major upcoming threat to its primary profit generating product looming in its future, and the counter to this competitive threat involved some very specialized graphics engineering. The CEO had to step in and basically just subvert the entire completely broken hiring process and just start hiring graphics contractors almost sight unseen.

Unfortunately, these graphics contractors had virtually no path to full-time employment, so they got treated like 3rd class citizens at best and all were eventually pushed out. (Sometimes years later, even after delivering massive amounts of value to some teams.)

Anyhow, how do I know all this stuff? At this particular company, I somehow fell through the cracks and was interviewed and hired as a generalist programmer, not a graphics specialists. Eventually, the old graphics guard basically got lazy and shied away from the company's toughest graphics problems (or actually shipping anything involving new graphics code), but somebody had to do this "dirty" graphics work. The non-graphics programmers figured things out and started sending graphics work my way, and I started asking myself "why are we not hiring any graphics programmers?!"

Unfortunately I'm terrible at saying "no" to requests for help, so this resulted in a lot of work.

Turns out, that refined, "fair" hiring machine that management was so proud of was a total joke.

Sunday, April 10, 2016

Tips for Interviewing at Software Companies

Here's another blog post in the "Rich goes off the rails and reveals a bunch of shit he's learned over the years while working as a corporate programmer" category.

Companies Must be Continually Reminded that the Interview Goes Both Ways

Many corps have an internal company culture that places the company in the superior position relative to job candidates. These companies feel they can choose who they want from a seemingly endless variety of potential employees, so who cares how they're treated right? The reasoning goes "we'll just hire someone else" if a candidate pushes back.

We need to collectively turn the tables on companies like this. Let's give them a powerful form of feedback. Let's exercise our right to "route around" bad companies and not apply or accept job offers from corporations that act like we are replaceable cogs. (Alternately, let's all talk between ourselves and collectively compare notes and boost our compensation rates and working conditions. They can't stop us!)

I'm hoping this blog post will help make people more able to discern the good companies from the bad ones. For the record, I do believe there are many good companies out there, but for every good company there seems to be a bunch of bad ones.

Remember: We Write the Software Which Runs the System

Here's a key concept to internalize: We write the software that literally drives this entire system. Food production and distribution, electricity production and distribution, telecommunications, government, finance, trucking, planes, etc. It's all ran by computers one way or the other, and we write the code that makes these computers work. Without computers this entire system crumbles into the dark ages.

As time goes by more and more of the system is becoming automated and computerized. This means we as programmers collectively have the power in these relationships with corporations, but we haven't effectively organized ourselves or figured out how to best exercise our power yet. We now have the technology to instantly communicate between ourselves, which if we all start using it can lead to massive changes in a relatively short period of time.

Interview Tips

Some corps are exquisitely designed to extract as much "value" from you as quickly as possible, your health and sanity be damned. Above all, I want to help other programmers avoid places like this. When applying for a position at a software corp, keep these things in mind:

- Follow your instincts.

Ask a lot of questions. Learn how to interpret body language. Are you treated with respect? Are your questions answered in a straightforward way?

Remember, the hiring pipelines of these companies are tuned to take advantage of the macro-level psychological profile of "typical" programmers. Get educated, fast. These companies are not your friends. They will try to get into your brain and "bend" you psychologically in order to make you conform and "fit in" to their brand of corporate utopia.

Trust your gut feelings during the interview! If you feel disrespected or not taken seriously, don't ignore it. It's not just in your head. Run away! You won't grow there, and it'll be a dehumanizing place.

- "You need us to achieve success, you are nothing so follow us!"

Run away fast! I've seen this tactic applied against dozens of developers after one company collapsed in Dallas. Sadly, it worked with a bunch of people and they ultimately all got screwed.

- Deeply analyze any critique given to you during the interview

Sometimes critique that seems merit-based is really bias in disguise. It's very important that if you get bad feedback, you stand back and think "Is this true? Or is there just something wrong with this company (elitism, sexism, they just didn't want to hire you, etc)?"

- How much is your time worth?

Ultimately, you are selling your time for digital digits in some bank computer somewhere. You will not get this time back, period. It's worth a lot, probably much more than you think.

How much income does the company actually make given your time? Some companies make millions of dollars per software developer, yet pay only a fraction of this to you.

Remember, this is a market and market principles apply here. By increasing our communication levels and giving feedback to the market (by routing around bad companies, demanding higher pay during negotiations, pushing back during interviews, etc.) we can collectively raise our salaries, compensation packages, and improve our working conditions.

- Are you gambling your time away trying to get your stock "lottery ticket"?

In this scenario, you're willing to be underpaid, but you're hoping the company will sell out in X months or years and make you millions. Just beware that this is a form of gambling with your time and finances. 

I've seen a few companies exquisitely exploit and continually encourage this "gambler mindset" with its workers in order to suppress wages. Be careful!

- Admit that you probably suck at negotiating

Generally, in my experience programmers make horrible negotiators. The most important thing is to approach the negotiation with the proper mindset. They need you, not vice versa, and they probably have much more money (and the capability to pay you) than you suspect.

This is a topic definitely worthy of another blog post.

- Learn how to recognize negative psychological traits like sociopathy and narcissism.

Some companies are full of sociopathic monsters whose job description (and honestly, their corporate duty) is to exploit you as much as possible.

Learn to recognize the signals. They will try to get into your head, quickly build a mental model of you, then play off your willingness to not rock the boat or be seen as a "troublemaker" to the corporation. They will find subtle ways to threaten you, if needed, to keep you in line.

Narcissists can be especially horrible to work around, especially when they are in management. Learn the signs.

- Beware of code words like "Elite", "10Xer", "no bosses", "scheduled crunch", etc.

"Elite" - Programmers willing to work endlessly in sometimes horrific conditions are labeled "Elite". Yes, we have a very screwed up system here, where people who get exploited and are worked until exhaustion are labeled "Elite". Avoid companies like the plague that use this word in their job descriptions or recruiting emails. 

(Attention recruiters: Please stop sending me emails with the word "elite" anywhere in them. Thanks!)

"10X programmer" - Someone who hacks up some shit (sometimes actually using stolen ideas), and then depends on other practicing programmers to do the actual work of making these (sometimes very sub-optimal) ideas actually shippable. These programmers tend to publicly take full public credit for things they only partially worked on or thought up. We don't need more of these "10x" assholes, instead we need to completely reboot our programmer culture so the very concept of a "10x'er" is totally alien.

"No bosses" - This recruiting shtick from 1999 means there are many powerful bosses in hiding, and/or that everyone is effectively your boss. Also avoid companies that advertise this like the plague. It's a recruiting tactic designed to attract programmers who had bad bosses in the past. (Believe it or not, there are many very good managers out there!) 

Also, without managers, you will be directly exposed to the many wolves out there who can make your programming life a living hell. A good manager will shield their programmers from endless bullshit and insanity.

"Crunching" - This means the company externalizes the cost to your health and sanity of working endless hours. They may have bad planning, or bad business models, whatever. Avoid companies that crunch endlessly like the plague unless you just don't care about your health.

"Scheduled Crunch" or "we occasionally crunch" - Again, any company that schedules crunch just doesn't understand or care how to plan, or is ignoring the cost of working crazy hours on your health.

- Ask: Does the corp own all your work?

Can you work on stuff at home, like open source software or your own commercial software? Avoid companies like the plague that don't let you work on your own stuff.

- Ask or check for insane contract clauses

Is there a non-disparagement clause? If you quit, must you wait X months or whatever before you can work on something else? Push back and avoid companies that do questionable shit like this.

- Who contacted you first?

If the company reached out to you first, did a recruiter contact you, or an actual programmer at the company? 

Ideally, a real-life programmer reached out to you. Only a programmer working at the company can genuinely answer your questions and give you a real idea about the working conditions and types of problems you will be working on there.

Remember recruiters are just part of the company's "hiring pipeline". The pipeline is basically "X Programmers In -> Y Programmers Out". You are just a replaceable number to these companies. Recruiters will say anything in order to get you to sign the dotted line.

- Is there a whiteboard interview?

Is there a whiteboard interview? Push back and say no. I've helped hire at several successful companies (easily over 100 people over the years) that didn't use whiteboard interviews at all. Anyone saying "this is just the way things are done" doesn't have perspective and is part of the serious problems our industry has.

After taking and giving way too many of these whiteboard interviews, I think they are total fucking bullshit. Whiteboard interviews test a candidate's ability to scribble uncompilable pseudo-code on a chalkboard (!) while being faced down by multiple adversarial programmers. (Who in some cases would rather be doing anything else, and who don't want more internal programmer competition in the first place!)

Some companies give programmers whiteboard questions from various books verbatim, like this one. This is just downright ridiculous, a waste of time for everyone involved, and a total demonstration that the process is completely bogus.

Whiteboard interviews are extremely stressful to candidates. I've seen amazing programmers just lock up and become dysfunctional in these conditions. We are testing candidates for the wrong abilities. I refuse to take part in any more of this insanity.

Some programmers use these bogus hazing ritual-like whiteboard interviews to help drive down the applicant's ego while simultaneously driving up their egos. This is a huge red flag -- avoid these programmers and the companies who employ them.

- "We only hire senior programmers"

Let's translate: We don't help train new programmers. The phrase "programmer empathy" isn't on our radar here. We probably treat each other like complete trash. We actually assume you are an idiot until you battle your way into a position of respect. Avoid companies like this!

Remember, all senior programmers at one time were junior programmers.

- What's the company's culture?

Ask lots of questions from people who work there. Is the official company message great, but when you pull programmers aside they actually hate working there? Search the web for reviews of the company, search linkedin and find former employees and ask them about the company.

- Talk to the executives

Are they sociopaths? Raging narcissists? Ask them what they look for in programmer candidates, and see how they respond. Do they treat you with respect?

I've known execs who thought programmers were literally crazy, and trust me the companies they ran were not healthy.

- Look around the office

Little things can give you a lot of information. Is the office a mess? How much space and privacy do employees have? Is the environment quiet or loud?

- Does this company give proper attribution for ideas it uses?

I'm throwing this out here because I've noticed one very well known VR company outright steal ideas from its competitors or academics working in the space. Explicitly ask the company about its attribution policy.

Personally, I will never involve myself in any way with people or corporations who outright steal ideas for personal or corporate gain. (I can't believe I have to even say this. We have fallen to the level of stealing and re-branding ideas from each other!)

- Master your fears

What do you fear? Recognize it and look past it, because these companies are designed to exploit your fears and use them against you as a weapon.