The title comes from a response email I received from a friend of mine who is beginning the search for a new job. His company - one I previously worked for, as well, and where I still have some friends - has systematically removed the few features that once made them attractive enough to continue drawing a pay check, to name a few:
- Free drinks and regular "ice cream socials" during non-payroll weeks
- A sane telecommuting policy
- Annual salary increases that at least kept pace with increases in the cost of living
- Respectable middle management
I make no apologies if any of the items above seem petty. The simple fact is, they were all provided at some point; they all made employment at said company more attractive - either through some kind of social interaction, job satisfaction or by simply compensating on pace with the current economy, and they have all been removed (or, in the case of item 4, fled the company) over a period of time for no stated reason: therefore they are perceived as losses to the quality of the work environment by its employees. I've seen this pattern repeated with at least three companies in sequence in the Austin area alone.
My friend asked me for my strategy for filtering prospective employers since there seem to be a lot of openings in his chosen field in our area. We are both software developers of some sort; I specialize in server components and he specializes in database programming, but we both do a considerable amount of high-level design and planning, and we've both been in our respective disciplines for more than ten years.
When he asked how I chose to filter employers (I've held a couple of other positions since leaving his current company), I didn't have a ready answer. After considering the question for a little while, I realized that the reason I couldn't enunciate my criteria for an "attractive" employer because I have more or less stopped looking for one in our area.
Before everyone assumes I'm suggesting there are no good employers here in Austin, let me clarify what I mean: while there are a large number of places in which one may earn a comfortable living wage in the software development trade, there are really very few (read "none so far") that I've found that are attractive in the sense that I believe I will feel fulfilled by my duties or through my interaction with coworkers. What that means is, while a position might pay my bills, I rarely feel any personal connection to it, nor do I feel much sense of accomplishment when arbitrary goals are achieved.
So, back to my friend's question: how do I choose an employer? I started to write back to him with lame generalizations about what to look for, and quickly gave up. What I had to tell him was that there's really very little he can do during what passes as an interview process these days to learn what his job will really be like if he accepts a position. What I wrote instead, in part, was what follows.
"...what I’ve learned is, to one degree or another, all of the “software” jobs at companies of a certain size (say, greater than 50 and less than 500 employees) seem to suffer from the same problems:
- Constant pressure to generate revenue, regardless through what channels or at what future cost, leads to hasty, poorly informed decisions that are not maintainable in the long term.
- Technical decisions are made by the wrong people, alienating the "right" people or, as is often the case, the "right" people have never been hired.
- Entrenched personnel are in places of authority because of some perceived heroic gesture they made at some time in the company’s infancy (usually at the cost of good design, but always resulting in revenue - see first item). These people are *always* convinced of their own ability and seldom work well with others as peers. They usually enjoy a high degree of deference from the executive management.
- Accepting a software position at the company means inheriting whatever mess was left by the older, wiser crop of ex-employees who deftly flew the coop before they had to begin maintaining their own code.
- Making any changes in the existing architecture to shore up the previous lack of design foresight requires massive justification, and usually involves sizable concessions in the interest of uninterrupted revenue generation (see item 1).
These items really apply to any company with a need for IT and staff development positions – the worst kind of job in the highest abundance - but particularly apply to small companies for which (often operating near the break-even point) constant revenue is critical just to remain in business.
Staff development sucks – it’s like being a consultant without the pay, hot cars and chicks – plus you have to stick around and deal with the bad code you are forced to generate because of the way decisions are made..."
The implication, really, in what I said above is that the vast preponderance of all available jobs in the local software market are staff development positions, meaning that design and architecture are largely dictated by people who are not trained to make good decisions because they don't design software, which is to say strategic design does not exist in the traditional sense. Decisions that would be made by architects or designers are instead made by business team members who have no background in software, and that usually means those decisions are shaped solely by immediate (versus long-term) business pressures.
Many companies - particularly small ones - have fallen into the trap of making only short-term tactical decisions for their business because (at least for some short period of time) that's what has produced revenue and kept the lights on, even when those decisions negatively affect their product. For design-minded software people that's a tough model to work with because most of us with more than a few years in the field know that tactical decisions are, by definition, short-sighted and not intended to serve as all-purpose solutions.
Tactical decisions are what you make when a course correction is needed for a prior set of strategic decisions:
- A new market is emerging and it might be possible to make a small software change to capture it.
- Your product's original architecture didn't account for a new technology that can be quickly added to the product with few changes.
- There's a sizable defect in the new product you just shipped, and it's going to take a couple of weeks to fix it, but you can't afford to go back to the original architecture and redesign.
The fully-tactical model is like being a mason and coming to work each day where you are handed a bag of tiles chosen for you by a banker, and a plumber gives you a pattern using only that day's tiles. You are then expected to take your day's tiles and plan, and execute the next piece of the lobby floor in a new hotel. You take the plan and tiles, and do your best for the day, after which the plan is confiscated and you never see it again. The next day you return and start again. After some time, the owner of the hotel arrives and expresses his vast displeasure at the state of his tile floor - there are mismatched tiles laid in ever-stranger patterns in his lobby! Who is to blame?
I never did adequately answer my friend's question. Instead I sent him, essentially, this same diatribe about the current state of affairs for our kind in this marketplace. I believe I advised him to look for the place with the best benefit package and, if he was lucky, try to get an offline dialog going with a current or past employee wherever he was interviewing to try to get an idea of what it's really like.
It doesn't have to be this way, does it?