After a record-short 333 days, my tenure at Buildium is over.

Last winter’s ludicrous snowfall finally put the nail in the coffin of continuing to live in Boston. But it also became clear that moving out of Boston wasn’t compatible with my employer’s plan to centralize their personnel locally and stop supporting people working remotely. I had hoped to stay on while relocating, because it would obviate the need for any Pittsburgh job hunt, but given our opposing directions it was inevitable that Buildium and I would have to part ways when I left town.

Buildium logo

In the past, when I left a company (as opposed to being laid off or having the company move out from underneath me), I’ve always been fortunate to move on to something better. In 1995 I jumped from a failing medical software company to a rapidly-growing nascent internet consultancy, which was without question the best career move I’ve ever made. And in 2006 I left a tiny professional services contractor to return to large-scale internet consulting just as open-source and “Web 2.0” were taking off. It would be awesome if this departure leads to similar improvement, especially given the way front-end coding has transformed over the past couple years.

The unfortunate aspect of my departure is that I’ve been really happy at Buildium and would prefer to stay. While property management software isn’t the noblest purpose in the world, it was a huge improvement over my previous job spamming students and funneling leads to student loan companies. I greatly improved my technical skills, the hours and stress level were uncommonly humane, and the pay was good.

And the people were awesome. Buildium’s leadership team has its share of challenges, but it’s been very satisfying to once again work with and for people with a healthy dose of both intelligence and common sense—as might be expected from a company founded by and stocked with fellow Sapient alumni.

But more than that, what makes Buildium unique—both among my former employers as well as across the industry—is that its staff are enthusiastic and uncommonly personable and caring, without being contrived or dogmatic about it. From top to bottom, the positive attitude of their team members sets Buildium apart from other places I’ve worked.

That’s a big reason why I would have preferred to stay on as one of several remote workers on their engineering team. Sadly, the commitment to centralizing operations in Boston made that impossible. And after 25 years here, my life is taking me in a different direction.

Although that didn’t stop me from feeling a certain righteous amusement when HR asked the employees to vote on what Buildium could do become a better place to work. Someone added “Work remotely” to the list of ideas, and sixteen people put their checkmark-votes next to that item: more than twice as many as any other suggestion!

And if that input had been put into practice, I would still be working there, rather than going my own way and diving back into the job market in an unfamiliar town.

With the perspective that comes from thirty years in tech, I’ve gained quite an appreciation for the basic absurdity of developing software.

A quick look in the rear-view tells a revealing story.

Of the volumes of software I’ve written, perhaps a quarter of it was never even used. And nearly all of the code that did make it into production was gone and deleted within five years of its creation. Heck, half of the companies I worked for disappeared within eight years! And nearly every programming environment I ever learned was obsolete within ten.

While everyone talks about how rapidly technology evolves, it’s rare that anyone thinks through the implications. The software that I was quite well paid to craft has been astonishingly ephemeral, and the development tools that I’ve used have had a useful lifetime somewhat shorter than my last pair of socks.

Needless to say, this isn’t just my problem; everyone in our industry faces the same underlying challenge. Nothing lasts forever, but in tech, everything we learn, use, or create should come with a “use-by” date of fewer than 60 months.

When you were young, you probably got the impression that your career would be a linear journey from Point A (your first job) to Point B (a comfortable retirement).

In the tech field, it’s more like trying to steer a sailboat at sea. You can point yourself toward a destination, but the water’s hidden currents and tides will pull you in different directions. The wind, waves, and other people’s passage will also push you off course. Never mind that every employer and project asks you to use their own boat with completely different rigging! And sometimes, either by choice or necessity, your destination changes mid-stream. About the time you reach the middle your career, you realize that your industry and career trajectory are far more fluid than you foresaw when you first set out.

While all this change and dynamism makes it hard to make progress in any one direction for long, if you develop the insight and skills to respond to these changes wisely, you can still get to a happy destination, even if it might look nothing like what you imagined when you got your first offer letter.

What follows are a list of observations I’ve made over the course of my shifting career: some often-overlooked implications of trying to navigate my way through such a turbulent industry. I hope they are of value to you on your own journey.

First, let’s look at the implications the ephemeral nature of software has on companies as a whole.

As soon as a development team delivers a software system, companies and product managers need to immediately start planning for its replacement. These days, you have two options: either factor a perpetual enhancement and revision process into your product strategy, or plan to simply throw away and reinvent your system at great cost a little further down the road. The traditional concept of implementing a system once and then scaling back for a lengthy “maintenance phase” died about the same time as pay phones and busy signals. It’s a nice old-fashioned idea that will lead you directly toward your Chapter 7 filing.

Whether you are a product manager or a development lead, you must accept and somehow communicate to your development team that time to market is infinitely more important than the elegance or academic correctness of their code. Bug-free code does not exist, and companies are much more rigorous about following the old 80/20 rule. If you’re truly following the Agile model (rather than pretending, as so many companies do), your top priority is to ship the beta: get an initial offering with a minimal feature set out into the market, and then react rapidly to customer feedback. These days, software that is “good enough” is almost always good enough.

When I first became an engineer, my older brother offered me one of the most valuable insights of my entire career: never hire technical staff for the knowledge they already have; instead, evaluate candidates primarily on their ability to learn new skills quickly and effectively. Five years down the road, the knowledge they walked in the door with will have no value; their usefulness as employees will be determined by how easily and quickly they can become productive with new languages and tools. Furthermore, the optimal way to retain the best technical talent is to support their desire to keep up with current and emerging technologies.

Now let’s talk about a few things that apply both to individuals as well as companies.

Whether you’re an individual managing your to-do list or a product manager specifying features and enhancements, you’re always going to have more tasks than time and resources to complete them. Therefore, always work on the highest value item. Constantly ask yourself whether you and your team are working on the most strategically valuable task. Always attach yourself to the tasks that truly have the most impact, and don’t waste your time on anything else.

Risk is uncomfortable. Risk is a threat to one’s company and one’s career. And yet risk is an inherent part of every single thing we do. While moving cautiously forward might seem like the most comfortable and risk-free approach, it really only defers that pain, because there is a huge hidden risk associated with not moving forward assertively enough. Both corporations and individuals must learn how to embrace risk, tolerate its associated discomfort, and recover from failures.

Software engineers and managers often have a grand dream of software reuse: the idea that if you’re building a program to handle Task A, you should invest some extra time into making it generic enough to handle anticipated future Tasks B and C. In the real world, B and C might never be needed, and their requirements are likely to change between now and then anyways. While it goes against our sensibilities, it is often quicker and easier to just duplicate and customize old code to handle new tasks. If the additional cost of maintaining multiple versions becomes sufficient, only then should you invest the resources to refactor it into a single generalized solution. That might sound like blasphemy, but in thirty years I’ve rarely seen a compelling example where software reuse saved money in the long run.

Finally, let’s talk about how we as individual employees should respond to the fact that our work has such a surprisingly short lifetime.

On a purely tactical level, as soon as you finish a project, save some screenshots and code samples for your portfolio. Six months later, those sites you built will have changed significantly, if they survive at all.

While everyone wants to be the best at what they do, building deep expertise in any tool or language no longer makes sense, because most languages are supplanted in a few short years. Rather than becoming an expert at one thing, a better strategy is to become the long-derided jack of all trades: someone who has a wide breadth of knowledge, an understanding of the general principles that apply to all environments, and the ability to adapt to changing business needs and a changing job market. Cultivate your passion for perpetually learning new tools, and your ability to be comfortable doing so under stress and time pressure.

In terms of getting your resume noticed, what you have done is not always as significant as who you worked for. Sites and projects are ephemeral, but major companies last longer and will catch the reader’s eye. Working with companies that are household names will—for the rest of your life—help you get that first phone screen.

My advice to all individuals is to focus on saving cash when you’re working, so that you can comfortably weather the inevitable downturns in the business cycle. Every time I’ve been laid off, I’ve been able to take a year or two off to decompress, have some fun, wait for the next upturn in hiring, and then be selective in my hunt for a new position. Layoffs and buy-outs weren’t personal emergencies because I had the cash on hand to weather any situation that arose. But if you take time off, devote some time to keeping your skills up to date and learning marketable new technologies.

Unlike the coding I’ve done, the one element of my career that has proven surprisingly durable over the long-term has been the relationships I’ve built with my coworkers. Despite everyone moving from project to project and job to job and often city to city, people remember you forever, and a robust contact list is immensely helpful in finding great places to work (and knowing which ones to avoid). It might sound crazy, but this has been one of the most important elements of my career success: put just as much effort into developing good relationships with your coworkers as you put into the software you write. Software doesn’t last, but people do.

Finally, one closing bit of advice about the long-term. If you want to be happy when you look back on your career, you must work for companies and projects that improve people’s lives, rather than just making a buck. Being a successful spammer or marketer might pay the bills, but money isn’t fulfillment. No matter how elegant, satisfaction will not come from the short-lived systems you build; real, lasting fulfillment comes from the impact your work had on real people’s lives. Life is too short to waste your time working on shit that doesn’t have any meaningful value, so make sure you’re contributing to a business you can really believe in.

And, of course, don’t be surprised or dismayed when the systems you worked so hard to build disappear overnight. It’s one of the facts of life as a software developer…

And now, just to be a complete contrarian, I present some frontend-tech-oriented “your mama” jokes. We assure you that no mamas were hurt while composing this entry.

HTML-oriented:

  • Your mama’s got a really big <body>.
  • Your mama’s got no <head>!
  • Your mama’s just an <object>.
  • Your mama’s a <sub>.
  • Your mama’s got no parent element.
  • Your mama’s value attribute is set to zero.

CSS-oriented:

  • Your mama’s got no style.
  • Your mama’s got no class!
  • Your mama’s width is 110%!
  • Your mama exceeds her max-width!
  • Your mama’s got too much bottom-padding...
  • Your mama’s got her overflow: visible.
  • Your mama’s so easy she’s got a negative z-index!

Other tech-oriented:

  • Your mama’s got such a regular expression.
  • Your mama’s got an out of date plugin.
  • Your mama’s a vector shape, and she looks like somebody’s been draggin’ her handles…

And yes, your mama floats right, too!

Every time I venture into the job market, I’m shocked and more than a little insulted by the job titles on offer.

Let’s be clear. I am a professional software engineer focusing on user interface design and development.

I am not a Ninja or a Jedi. Nor am I a Rockstar or a Guru or a Wizard. I am neither an Animal, a Unicorn, nor a Unicorn Tamer.

And yet, those are words I’ve seen employers choose when posting job openings in my field.

“Sure”, you say, “but those are just metaphors. What they really want are the best coders they can get.”

By way of reply, I ask you to consider the primary attribute of a person who would respond to such an ad. While confidence is usually considered a positive trait, someone who thinks of themselves as a ninjajedirockstarguruwizard clearly lacks the perspective and balance that comes with an equal portion of humility. Whatever the term, employers who use such superlatives are communicating that the primary trait they are looking for is arrogance.

“They’re just looking for energetic, motivated, go-getter types,” you counter. “And is arrogance really a bad trait for a coder?”

Absolutely!

First, let’s dispel the myth that arrogance (or even confidence) is correlated with competence; it isn’t. That’s a simple association fallacy. While confidence can be the outcome of competence, confidence can just as easily be a symptom of delusions of grandeur. And I know plenty of workers who, despite their obvious competence, struggle with their self-confidence.

With arrogance comes a disdain for others which easily hardens to contempt. With arrogance comes technical hubris and the belief that anything done by other employees (and certainly other companies) is inherently flawed and inferior. If you’ve been around the software industry for any time at all, you will have seen countless examples of NIH Syndrome (Not Invented Here). Arrogance is the most pervasive threat to any business process that is based on teamwork, knowledge sharing, and mutual respect.

When I see a developer exhibit arrogant behavior, it’s usually because they lack the perspective that comes from real-world experience; they haven’t been in the industry long enough to be confronted with their own mistakes and realize their fallibility, nor to appreciate the ingenuity and expertise of other practitioners. If I’m really looking for the best coder I can find, I’m going to hire someone who has made their share of mistakes, acknowledged them, and been willing to learn from them and improve their skills by asking questions of others.

As you might imagine, I don’t consider myself a ninjajedirockstarguruwizard. Having successfully derived my livelihood from software engineering for the past thirty years, I have a pretty accurate understanding of my strengths, weaknesses, and the value I can add in any given situation. I do not hold the arrogant self-opinion these employers are looking for, nor do I want to work with colleagues who do; so as soon as I see such superlatives in a job listing, I simply delete it, unread, and move on.

There are additional reasons why I immediately reject such listings. By putting so much emphasis on the search for ninjajedirockstarguruwizards, employers are revealing some ugly things about their internal culture.

First, the company is exhibiting as much arrogance as the people they hope to hire. They believe that the company will (of course!) be compellingly attractive to the best coders in the industry. They think the best and brightest will be satisfied with the corporate culture, working environment, compensation, and growth opportunities that they provide. Ironically, once you look behind the curtain, you’ll find such companies rarely live up to their inflated self-opinion.

Second, the company devalues women. Immature titles like Ninja, Jedi, Rockstar, Wizard, and Guru generally don’t appeal very much to educated, professional women, who have struggled to be taken seriously even within their field. The few women who do interview probably won’t manifest the kind of arrogance that the company associates with “quality”. One further wonders what Asian expatriates must think of the casual use of culturally-appropriated terms like “ninjas” and “gurus”.

It’s unassailably clear that all those super-heroic job titles are designed to appeal specifically to adolescent boys. By emphasizing those terms in job listings, a company is telling me that their managers generally think of their development teams as a bunch of immature adolescents, and that I can expect to be treated in a correspondingly condescending fashion.

Sure, perhaps I’m being a bit humorless, but that’s just insulting, and not an experience I want to subject myself to. So I don’t.

Finally, I just want to confirm that the “Overly Zealous” and “Cookie Manipulator” in the title of this post did indeed appear as titles in job listings I’ve recently seen, along with “Enthusiastic”, “Audacious”, “Visionary Game-Changer”, “Badass” and “Programmer Extraordinaire”.

And one job specially asked for an engineer “with more cowbell!” (their exclamation point). Plus, believe it or not, one company sought a “Ruby Eating Python-o-saurus Rex”. What! The! Fuck! Yeah, that really shows that you will take me, my career, and the contribution I make to your company seriously.

And final (dis-) honorable mention goes to the listing for a “Principle Systems Engineer” (sic). I’m absolutely agog imagining what duties that might involve…

Update: My followup post contains a list of the more effusive job titles I saw during the two months subsequent to this article.

There really needs to be a corollary to Newton’s Second Law of Thermodynamics, stating that website maintenance is a constant (and un-winnable) battle against the Stupid introduced by other people.

Usually this involves a lot of quiet fuming while cleaning up the garbage left behind by the incompetent agents of entropy. But sometimes the Stupid is just so ludicrously headdeskingly perfect that there’s nothing you can do but laugh until you gag on your own puke. All the while, marveling at the “mysteries of the universe”.

For example, consider the following. While working on something, I once came across the following block of code on a production website:

$rss_feeds = "";
echo $rss_feeds;

Now, even if you’re code-illiterate, you can probably figure out what this does. It sets a variable to nothing and then prints… nothing.

Why? No reason. The only thing I can figure is that someone hired a contractor and paid them based on the sheer number of lines of code they produced.

Now, before I lose all the non-coders in the audience, here are a couple examples where people chose to demonstrate their mastery of their native language. For example, take this headline that appeared in a second-level heading on one page:

Private vs. Gevernment

Or this major announcement:

Without further adieu [...]

Or this favorite job listing of mine:

[...] is currently seeking a Senior FrontEnd Web Developer with 710 years of professional experience

Working our way into the code doesn’t have to be painful, though. How about this one: Need to name a file? Why not name it after your own awesome self?

$fileExt = 'markrules';

Another one that is easy for non-coders is this one:

<div id="left_content" class="right">

Yup. In the Stupid Universe, left is right and right is left.

Now how much would you pay? But wait: there’s more!

<?php //    include('ad_med_rectangle.inc.php'); ?>
<?php include('ad_med_rectangle.inc.php'); ?>

In PHP, two slashes are used to comment something out. So here we have a line of code carefully commented out. And then the exact same line, not commented out. Um… huh?

Speaking of comments, try figuring out what this one does:

$form->addElement('hidden', 'xzdf', 'A3104', array('id' => 'xzdf'));

Using names or key values with self-evident meanings is really overrated. The Law of Stupid instructs us to use completely nonsensical names, and make sure you don’t leave any comments in the code that might explain to the people maintaining your code what those random numbers and strings of characters actually mean!

And then there’s this mystery of the universe, a perennial favorite:

$term = ereg_replace("hero", "elongated sandwich", $term);

I can’t tell you why this site has such a strong aversion to heroes, but it’s clear that any time we find the word “hero”, we replace it with our preferred term “elongated sandwich”. No reason; we just do. No hero worship allowed here!

Here’s a fun one!

.blue_button {
    background: none repeat scroll 0 0 #ED8D1E;
}

Blue_button, huh? You might be forgiven if you thought that might actually show a button that was blue. But that background color of #ED8D1E? That’s dark orange. OF COURSE!

For some reason, “switch” statements seem beyond the grasp of many well-compensated “engineering professionals”. I’m not sure why it’s so difficult to do different things depending on whether a variable has a value of 1 or 2 or 3, etc. Is that so hard? Apparently it is. Here’s a nice example:

case 1:
     $url = 'http://www.awebsite.com/';
     break;
case 1:
     $url = 'http://www.awebsite.com/';
     break;
case 1:
     $url = 'http://www.awebsite.com/';
     break;
case 1:
     $url = 'http://www.awebsite.com/';
     break;
case 1:
     $url = 'http://www.awebsite.com/';
     break;

That’s a double dose of Stupid! Here, all the cases do exactly the same thing! But that’s okay, because they all test against the same value, too!

In plain English, it translates thus: if it’s a 1 you do this; but if it’s a 1 you still do this; or if it’s actually a 1 you would also do this; and if 1 you do the same thing too; and so on. That’s seventeen lines of code to do what requires only one. See what I mean about someone being paid per line of code?

Of course, that only works if you want to do something. Truly masterful Stupid code does nothing, like this switch statement:

switch($page[subnav]) {
}

Huh. Only outside of the Stupid Universe is it customary to write code to actually *do something*.

Of course, junior developers often aren’t wise enough yet to disguise the fact that they’re doing nothing. Consider this:

 

Yes, that’s nothing. That’s the whole contents of a file I found called small.css. Small, indeed! Perhaps they thought they weren’t leaving any evidence of their stupidity behind.

Here’s some additional CSS-flavored fun:

<div style="clear: left;"> </div>
<div style="clear: right;"> </div>

More from the Planet of the Confused: why not just do “clear:both”? Oh yeah, it’s because YOU HAVE NO IDEA WHAT YOU’RE DOING!!!

ttable tr td.odd {
     border-left: 0;
     border-right: 1px solid #fff;
}

Did the W3C create a new HTML tag (ttable) and I missed the news?

p.margin-left {margin-left: 15px; padding-right: 15px;}

So let me get this right: a paragraph called “margin-left” actually has equal margin on both sides? But on the left it’s a margin, and on the right it’s padding? That makes perfect sense, especially if you don’t understand basic HTML page layout!

Here’s an exemplary 12 lines of masterful coding:

if (isset($page_close)) {
$page_close .= <<<EOD
</body>
</html>
EOD;
} else {
$page_close = <<<EOD2
</body>
</html>
EOD2;
}
echo $page_close;

That’s just another example of how these guys clearly were getting paid per line of code. No matter what $page_close is set to, what those 12 lines of code really do is this:

</body>
</html>

No need for complex logic or any dynamic behavior. Good thing they inserted an extraneous IF/ELSE block, two “here quotes”, and echoing a variable, because how else would one know they were such masters of PHP syntax?

if (test_it_counter == 0) {
   computeForm(entry.form);
}
computeForm(entry.form);
test_it_counter++;

So the first time through this program, computeForm() get run twice in a row, just for kicks. I’m sure that works just great! I wonder why they didn’t run it twice every time?

<div id="nav" onmouseover="Tip('#nav { <br /> <var>float:</var> left; <br /> <var>width:</var> 788px; <br /> <var>height:</var> 36px; <br /> <var>margin:</var> 0; <br /> <var>padding:</var> 0; <br /> <var>background:</var> #fff url(images/navbg3.gif) no-repeat; <br /> <var>text-align:</var> center; <br /> } <br /><br /><cite>Note the hover action. </cite>')">

I have absolutely no idea what the coder was thinking here. If you hover over a nav, it displays a tooltip with a bunch of CSS code (which actually doesn’t get used and doesn’t appear anywhere in the page) and the message “note the hover action”. Glad that has been running out on the production web site for four or five years

My final example is a solve-it-yourself problem. Are you ready for a developer challenge? How long does it take you to spot the Stupid in this statement?

<?php if ($isForm = false) {

This one’s an all-time classic and a personal favorite. When comparing a variable to a literal, professional software engineers always put the literal first. Do you know why? Well, the above is a perfect illustration why. The reason why will be left as an exercise for the reader.

Jul 5:OMA:Can someone replace the older ad code on this page?
Jul 6:PM:Assigned ticket to Ornoth.
Jul 6:PM:Needs time estimate, may time some time as this is the ASP site.
Jul 14:Ornoth:Assigned ticket back to PM.
Jul 14:Ornoth:This value appears to be hardcoded in the compiled DLL Searches.Ads.Google.Render. Can't be changed without recompiling the DLL using Visual Studio, removing the old DLL, and loading the updated one, which we cannot do at this time.
Jul 14:OMA:Thanks for looking into this!
Aug 12:PM:Ornoth did some preliminary research on this ticket and came to this conclusion: the old adsense code is hardcoded in the compiled DLL Searches.Ads.Google.Render. Can't be changed without recompiling the DLL using Visual Studio.
Aug 15:PM:Assigned ticket to Developer.
Aug 29:PM:Assigned ticket back to PM.
Sep 12:Dev:Assigned ticket back to Developer.
Sep 13:Dev:changed about 10 places where i found the old code. didnt seem to fix that particular page...
Sep 13:Dev:i found that particular ad.... its compiled into the Searches.dll binary..... hrmmmm
Sep 13:Dev:need a dev environment before we can change this.

Frequent topics