Thursday, July 21, 2016

enet networking library

I switched over all the low-level networking in a VR app I've been working on to enet today. It's a UDP-based networking library that supports optional reliable and in order packet delivery, packet fragmentation (so very large packets can be sent over UDP), and multiple channels.

The API was super easy to use, the code is written in C, and the thing just works. Compiling it was as easy as dropping the .C files into the project and hitting Build.

I love libraries like this.

Sunday, July 3, 2016

Welcome to "The Hunger Games"

Pretty much required reading if you're going to work (and stand out!) at a self-organizing company:

The Hunger Games

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.