How Much "Magic" Are We Comfortable With?

Our Continuous Integration and Continuous Deployment (CI/CD) build system (that we recently implemented) is truly a joy to behold, but it's also basically magic from my perspective. Check some code in, wait a few minutes, something happens, and then BOOM it's on the dev server. I know that it works, but I don't know exactly how. Should I take the time and effort to find out?

I'm a completionist, which means I'm also a naturally inquisitive person. I want to understand how things work, how they interact. I recognize that I cannot possibly understand everything, but I want to. It's a little internal conflict that rears up whenever I am presented with what seems, to me, to be magic.

A poster for a magic show by Zan Zig, showing him holding a rabbit

My family and I love going to Disneyland, (seeing as how we're really not that far from it) and at that resort there is a particular ride that's now known as Soarin Around the World. This ride lifts passengers up into a hang-gliding type adventure, using a giant video screen and huge mechanical rows of seats to simulate flight. And the first time I went on it, I was so distracted by trying to figure out how it operated that I didn't even watch the screen. I couldn't even tell you what we saw. I missed the whole ride because I was trying to figure out how it worked. Was it worth it?

Another piece of magic slightly closer to home is my desk phone.

This phone has no power cable, just an ethernet jack. When I plug in the jack, the phone turns on. To me, this makes no sense, as I was under the impression that ethernet jacks couldn't provide power. But I must be wrong, since the evidence is clear: it works. I can make calls on it, and people can call me (even though I may not want them to). How and why are ethernet jacks capable of providing power? Or is something else going on and I'm just not seeing it? Is it worth the effort to figure out why it works rather than just accepting that it does?

I've slowly but surely come up with a litmus test that helps me determine if something that is "magic" is worth the time to figure out, to take apart and put back together. I do so if and only if:

  • The "magic" is directly related to a problem I'm trying to solve AND
  • The knowledge gained from investigating the "magic" is directly useful to solving other problems.

This test helps me determine whether or not further investigation would be useful for me. Let's see how our three examples of magic fare against this test.

First off, the Disneyland ride utterly fails our litmus test. Spending time to try to figure out how the ride worked at the expense of just enjoying it was absolutely not worth it. What was I going to do with the knowledge gained, impress my friends at some hypothetical party? I don't even go to regular parties, much less hypothetical ones. It didn't help me solve a problem; in fact it detracted from my enjoyment of my vacation and left me with less happiness than I might have had otherwise.

Taking apart the desk phone is also out. I mean, it's a phone and it works. I don't really need to know how it works, unless I suddenly need to be able to write code for it, which is unlikely. The test suggests that we should leave it alone.

But the CI/CD process is something I should know, even if only to be able to diagnose problems when they inevitably occur. The knowledge gained from learning about this procedure will absolutely be useful for later projects, since presumably they will be using the same or similar system. Plus, then I can be a teacher and help other people in my company set up their own CI/CD processes. The knowledge gained from investigating the magic would be useful in other areas.

We completionists will never have enough time to learn everything we want to learn, and so we have to learn to let go of that hope. This is not a sad thing, nor should it be, rather it's just part of learning to live a full, well-rounded life.

The point is, you don't have to spend the time to learn something that isn't going to be useful to you. Sometimes it's just not worth the effort. You have to actively manage your time, and since you'll never have enough of it, it's best to spend it as wisely as possible. Only you can determine exactly what that means, but for me, it means spending my time enjoying things I want to do, and learning about things that help me solve problems. Everything else is a waste of my precious time.

You might have heard of Clarke's Third Law, which states:

"Any sufficiently advanced technology is indistinguishable from magic."

Sometimes it might be best to just leave it that way, and enjoy the ride.

Happy Coding!

Time Slides - The Problem With Being A Completionist

My wife and I were fortunate enough to be able to purchase season-long passes for us and our kids to our local water park. Since we live in a desert and our summer lasts half the year, this park is a perfect place for all of us to go and cool off for a little while. The kids love it, we get out of the house (which can be hard to do when it's 110F/43C outside), and we all get some quality time away from TV and video games, the trade off being the occasional sunburn. It's been a win-win for everyone involved.

Tornado water slide at Darien Lake by Zotdragon, used under license. The same slide exists at our local water park.

On our first trip of the season, I realized that there were a fair number of slides (more than half) I've never been on. Well, I can fix that, I thought, and quickly made up my mind that I would be going on every single one of them, including different slides that were part of the same ride. It would be easy enough, I reasoned; there's only about fifty slides total in the park, I can go on all of them. That way, when I was done, I could say I "completed" the water park. This would be fun!

And so my happy quest began. I first got in line for the Tornado slide pictured above, then the race slides (four times!), then the water coaster. They were all a blast, and I started to feel like this would be worthwhile. I made it my purpose, my reason for going to the park, to complete this goal.

Lines, though, lines were my enemy. Several of the lines for the more popular rides were multiple-hours long, and I stood in two of them before the day was over. Just as I felt like I was making progress toward my imaginary goal, the sun began to set, the kids were exhausted, and we had to head home.

No big deal, I told myself without entirely believing it, I'll just pick up the quest the next time we go to the park. Being the completionist that I am, this is exactly what I started doing on our next trip. When we arrived I immediately jetted off with my sons in tow to the mammoth falls, then the second coaster track, then the racers again to grab the purple and yellow tubes I'd missed the first time round. It was a blast, and the kids were having a lot of fun, but once again the long lines were my undoing, and by the time we had to leave I had only completed about a third of the total rides in the park.

Dammit, I thought, another setback? I'm never gonna catch up at this rate. I was annoyed, and surprised at myself because of it. This was supposed to be fun, wasn't it? So why was I so frustrated?

Two weeks later was the third trip, and now I had to get in line for the tube sliders, then the river rapids. I ended up standing in line for the latter ride for two hours, despite the fact that it was one of the few rides that I'd been on before. At some point, without my notice or consent, this happy quest transformed into a hungry need, a void into which I was pouring my time. I had to ride all the rides, needed to finish this self-imposed mission. The completionist mindset that I often find myself troubled by had totally taken over, and now what was once a silly, mindless little game had mutated to become an unnecessary necessity.

This isn't fun anymore. This little thought, this harbinger of the quest's doom, occurred to me while standing in line for the dark tube ride. This was supposed to be fun, wasn't it? So why wasn't I having any fun? Why was I doing this? There was no goal to this "quest" other than "bragging rights", and even then, who would I brag to? What was the bloody point? They're just slides!

Cyclone WWW Interaction by Saberwyn, used under license

After the third trip I gave up the quest. It wasn't fun, wasn't fulfilling, and once I let go of the stupid desire to "complete" the park I felt relieved. I was unburdened from my own flights of fancy, and now I could just go out and have fun with my family. The whole idea started out as something that sounded fun, a goal to accomplish, but it just ended up stressing me out for no good reason.

All of this nicely illustrates how I feel about constantly trying to keep up with current trends in the software industry. I sometimes feel like I have to ride every ride, see every place, talk to everyone, just to keep up with what everyone else in my field seems to be doing. I feel like I'm being left behind, and so I have to try to do everything. Problem is, while "everything" at a water park may be fifty slides, "everything" in software development is a limitless pool of information and innovation and knowledge and it is simply impossible to keep up with it all.

The solution for my self-imposed stress was remarkably simple. I stopped trying to keep up with everything. There's just too much that I could choose to learn.

Instead, I'm forcing myself to pick which things I really need or want to know. Sometimes I choose to learn something because it will help me get better at my job, sometimes because it just sounds fun. Sometimes I learn something just in the nick of time, because it will help me solve a bug I'm tracking. Sometimes I choose to learn nothing at all and go outside. Anything I choose to learn or improve on will occupy some of my precious time, time which I'll never get back, and so it had better be worth the trade. To be frank, I'm not very good at this yet (as my batch of half-completed projects will attest to) but I'm getting better. Slowly, deliberately, I'm figuring out how to make the most of my time and still keep up.

The point is that I am now back in control of my time. I choose what line to get in, which ride I really want (or need) to go on. I choose what I want to learn (or choose how to learn it if it is something I must do). I am in the driver's seat for my own professional life, and now I just have to find the wherewithal to stay there.

For me, at least, what I choose to spend time learning needs to have a purpose, and that purpose should be more than "because I need to keep up." I don't need to keep up with every little change. I don't need to get in every line, to ride every ride in the park. I just need to ride the ones that make me a better developer, the ones that I decide are worth the time invested, the ones that I think look like fun. Whether that's many of them or just a few of them doesn't matter. I choose how to spend my time, and I want to spend it wisely. After all, the time I spend standing in line or learning a new technology is time I'm never going to get back. I want to make the trade worth it.

In the meantime, I'm gonna go get in line for those racer tubes. What will you get in line for?

Be Like Us Or Else - Desperation, Failure, and New Job Regret

I've only held three full-time software development jobs since graduating from college, including my current one. The second one was supposed to be my big breakthrough, my time to shine and become part of a well-oiled team of kickass programmers.

That was not what happened.

What actually happened was six months of frustration that ended with me sobbing in my car. This is a story about ignoring red flags, feeling like an outsider, and how while desperate unhappiness drove me to seek a better employer, refusing to sacrifice my personal time (and my refusal to see the warning signs) got me fired from it.

Set of red flags waving in the wind "Red Flags" by Rutger van Waveren, used under license

Missing the Warning Signs

Two years into my first job out of college I became immensely unsatisfied with my current role. I was the only programmer on a group of non-technical people, and not having a team to work with was really getting to me. I just wasn't happy in my work. I felt that I needed to find another job before my sanity suffered, and so I started sending out applications.

The first company that contacted me, a small four-person team, set up a phone interview which went well enough. The CEO of this company told me that they were a Microsoft shop, and that they were looking for a young developer that could slot right into their team and "hit the ground running."

He asked me why I wanted to switch to a different employer, and I told him that I was sick of working by myself and wanted to work in a team environment. He stressed that his shop was very much a team that worked together on all their projects.

I asked him what the work hours were like, and he told me they were a strict 40 hours a week, with occasional Saturdays for bug fixes and emergency changes. He said that when those emergencies came up, I'd be expected to pull my weight like the rest of the team.

I asked about salary, and he told me that he was willing to pay me $X. I told him that I was already making that at my current job, but he said I should be glad to take $X because I would be "doing what I loved to do." I countered at $Z. We finally settled on $Y, somewhere between $X and $Z, and he emailed me the offer sheet for me to sign.

Did you catch all the red flags? I didn't. I was so blinded by my dissatisfaction at my current job that this new opportunity seemed like a great improvement: I got to work in a team, I got a raise, and I got an office. It seemed like a dream come true.

My wife was not convinced. From her perspective, I'd gone from a cushy job in a huge multi-national to a position where I was much less secure in my employment. We'd just bought a house and had a 1.5-year-old son, and I was going to risk their financial safety simply because I was unhappy? Not only that, but I was going to take the first gig offered and not even look for others? How selfish I was.

In hindsight she was absolutely right, but at the time I didn't care; I was desperate to get out of my current job. The same day I concluded the phone interview and got the offer sheet, I submitted my two weeks' notice.

That's Just Part of the Job

The first day at the new office went really well. The CEO was very nice, and my teammates were quite knowledgeable about their work. The building had a kitchen, fully stocked with coffee, soda, water, and snacks, and we were free to take whatever we needed at any time. We also frequently went out to team lunches, which were quite wonderful; it was something I'd never gotten to do previously.

The first few days were pretty nice. After that, though, things started going downhill.

The boss began calling me into the office on Saturdays. Usually he would tell me this on Friday afternoon, which immediately cancelled any plans I had made for the weekend.

The first few times this happened I just went to the office and did my work, but as it started happening more regularly I started pushing back, requesting more notice so that I wouldn't have to keep cancelling my plans. He never did give me more notice, and refused to offer compensation days during the week. I was OK with doing occasional Saturdays if there really was an emergency, but I was needing to come to the office every weekend and was receiving no compensation for it. He told me it was "just part of the job", and that didn't sit well with me.

About three months after I started working in this new position, I realized that I was always the first one to leave the office. I had a wife and small child at home, and didn't want to miss time with them. But everyone else, even the people that had families, were working 10 or 12 hour days, 6 days a week, every week. I simply refused to sacrifice my personal time for the benefit of the company, and so I was always the first one out the door.

They never said it out loud, but I got the distinct feeling that I wasn't really part of the team because I didn't stay late. My noticing this triggered another horrible realization: I was yet again an outsider, trapped back in the hell I had tried to escape from. I was on a team, but not a part of it.

For the time being, I continued to work there for two reasons: because I was the sole breadwinner for my household, and because it had been my idea in the first place to change jobs. I had put myself and my family through some big changes, and now I felt that I had to lie in the bed I had made.

Silence was the Right Choice

One day, I was summoned to the building's conference room where the CEO and two other employees were waiting. I was asked to close the door behind me, and was promptly told by the CEO that I was being let go, effective immediately.

I don't think I said a word for a good five minutes; my brain was short circuiting, unprepared to deal with what had just happened. I meekly asked why, and they said that I wasn't a good fit for the team, that I didn't mesh well, and that I wasn't ready and willing to share the workload. They said that I would still receive my last paycheck, but that I needed to gather my things and leave.

I asked if I could have done anything differently, and they said yes. They said that if I was able to make some changes, they would keep me on. They'd thrown a lifeline to me, and now willed me to grab it and hold on. But the lifeline was threaded with thorns, and it was painful to grab, so I refused it and didn't say anything.

I mentally criticized myself for staying silent. You idiot! Say something! You can still keep this job that you gambled your family's safety on! Just say you'll change, that you'll stay late, work weekends, whatever they want. Go on. Say it!

I couldn't say it. The fact was that I was not willing to put in the extra hours, not willing to come in on weekends, not willing to sacrifice my personal time for the benefit of this company. They saw it as not wanting to be a team player; I saw it as attempting to retain my sanity. All of this "be like us, or else" bull was just not something I was going to do. In the back of my mind, I knew that my silence was the right choice.

But in the moment, I felt like a failure, more so than I ever have before or since. This huge risk I'd taken was now backfiring, and my family would be the ones paying the price.

I left the conference room, gathered my stuff, and headed out the back door to the parking lot. I had worked a grand total of six months in this new position.

I shuffled to my car, tossed my things into the back seat, and tearfully called my wife to tell her I'd been fired. It was one of the most humbling conversations I've ever had. I had to admit to the person I loved most that I'd been a fool, that I'd been blinded by my desperation, and that now the entire family had to scramble to make up for my mistake. My illusion of invincibility was now totally, irrevocably shattered, replaced by guilt and regret.

I was very lucky that I was only out of work for two weeks before I got hired at my current place of employment. It was only after working at my current job for a year that I realized that being fired from that company was the best thing that could have happened to me in that situation. I was glad to be gone from there, and wondered why the hell I'd ever thought working there was a good idea.

What about you, dear readers? Did desperation cause you to take a job you ended up regretting? Did your team need you to work extra regularly, did you do it, and how did that work out? Let me know in the comments!

Do Something Else

A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly. Specialization is for insects.

- Robert Heinlein, Time Enough For Love (emphasis mine)

Programming is not my life.

There, I said it. I love programming, development, software, anything in that space, but I'm not seeking out additional time to program. It's how I pay the bills, and I'm always looking to improve, but it isn't something I need to do after a day at work.

You could say that I'm a 9-5 programmer. I go to the office, I do my work (which I very much enjoy), I kick ass, and then I go home to be with my family (and occasionally I blog). I don't live to work, I work to live.

My conversations with Luis seem to have really gotten to me, because I started thinking more and more about what kinds of boundaries I've had to set with myself to keep my ravenous brain in check.

See, I used to be the all-code-all-the-time guy. Throughout my college days and my first real job, I basically didn't stop programming. Every free moment was filled with variables and methods and classes. My brain compelled me to figure out the next problem, solve for the next requirement, implement the latest technique, and I couldn't (or didn't know how to) turn it off. My mind was a gaping maw, eager to process all the information it could possibly lay its hands on.

It was exhausting. I couldn't keep up with my desire to consume knowledge, and it had, without my approval or notice, risen up and taken over all aspects of my life. Code in the morning, code at lunch, code at night. I was mentally tired from running this rat race, and as I began to approach the finish line I could see burnout, clapping and cheering, eagar for me to complete the race so it could claim its next victim.

My lovely wife, having noticed that I wasn't doing anything else, pulled me off the track and suggested (rather forcefully) that we should do something together. So she rented a few TV shows (we had just gotten married and couldn't afford much in the way of entertainment) and over a few days we watched them together, deliberately avoiding distractions like phones or computers. At the end of those few days, I realized that this was what I had been missing, what I could use to avoid the burnout that was waiting for me to submit to it: I needed to do something else.

So I started going outside. On a whim, my wife and I went to Flagstaff, a two-hour drive from Phoenix and over a mile higher in elevation, just to walk our dog in the forest and breathe some fresh air. We got annual memberships to our local zoo because we both love animals; we still have these memberships and go at least every other month. We started putting money aside specifically for entertainment; it became our "go do something else" fund. We started doing things other than our jobs.

For the first few weeks I had to force myself to do these things. My brain doesn't simply turn off, and I had to forcibly redirect it to something besides figuring out the latest Javascript framework. The more I did that, though, the easier it got.

My wife and I, on reflection much later, realized that these "other" things we what kept us sane. When the baby was crying at 2:30 in the morning for no reason we could discern, when the dogs decided the living room would work as a toilet, when my job needed me to come in for several Saturdays in a row and I had to leave her to fend for herself with a toddler and an infant for another day in an already long week, all of these things were what kept us focused and happy.

Those other things prevented burnout from claiming me.

Programming is simply a part of my life; it is not the sole focus of my life. It's enjoyable, I'm good at it (I think), and I want to get better at it, but it is just one facet of my multifaceted existence. I program so I can live.

Living, to me, is more than just coding. You know what I live for? Camping. Reading. Chatting with my wife. Playing with my kids. Driving. Taking pictures. Seeing my family. Visiting museums. Hiking. Playing board and card games. Listening to music. Writing. Cooking (although I'm not very good at it). Seeing a play. Going to the movies. All of these things I love to do, and none of them directly involve me writing code.

If you feel like burnout is coming for you, go do something else! Do anything that is not your job. Go fix that home project you've been putting off, go jogging around the block, or even just read a book, anything other than what your job is. We all need many different interests to keep our lives interesting, and if programming doesn't fill that void, then do something else.