Years ago, I wrote about a particular type of interview question that I despise. Today I’d like to discuss a much more specific question, rather than a type. I’ve never been asked this question myself, but I have seen it asked in an actual interview, and I officially nominate it as the worst question I’ve ever heard in an interview.

A co-worker at a previous company used to ask this question, and it was the first time I’d ever heard it in an interview setting. This company did pair interviews, two engineers with one candidate. One day he and I were the two engineers interviewing some poor candidate. The candidate had actually done pretty well as far as I was concerned, and then my co-worker busted this question out. The candidate stumbled over the answer, visibly frustrated with himself. In the post-interview pow-wow, all of the engineers who’d interviewed him gave him the thumbs up, except my interview partner, who refused to hire him on the grounds that he completely flubbed this question, and “any engineer worth his salt should be able to answer it.” He actually said that if we hired this individual, he would be unwilling to work on a team with the candidate. For what it’s worth, the story has a happy ending, in that we hired the candidate in spite of his protests, fired the co-worker within a few months, and the candidate is still at that company, doing quite well.

Anyway, I think this question perfectly represents everything that can go wrong with an interview question, so I’d like to discuss it here to explain why it’s almost hilariously awful as an interview question:

Write a function that can detect a cycle in a linked list.

Seems like your basic algorithm coding question at first, right? Hop up and write the function on the white board; totally reasonable, right? Except it’s not, it’s brain-meltingly terrible. Let’s break it down.

Continue reading ‘The Worst Programming Interview Question’ »

Top 10 Career-Changing Programming Books

When I graduated with a Computer Science degree ten years ago, I was excited to dive into the world of professional programming. I had done well in school, and I thought I was completely ready to be employed doing my dream job: writing code. What I discovered in my very first interview, however, was that I was massively underprepared to be an actual professional programmer. I knew all about data structures and algorithms, but nothing about how actual professional, “enterprise” software was written. I was lucky to find a job at a place willing to take a chance on me, and proceeded to learn as much as I could as quickly as I could to make up for my deficiencies. This involved reading a LOT of books.

Here I reflect on my 10-year experience programming professionally and all of the books I’ve read in that time, and offer up the ten that had the most profound impact on my career. Note that these are not the “10 best” programming books. I do feel all of these books are very good, but that’s not the only reason I’m selecting them here; I’m mentioning them because I felt that I was a profoundly different person after reading each than I was beforehand. Each of these books forced me to think differently about my profession, and I believe they helped mold me into the programmer I am today.

None of these books are language books. I may feel like learning to program in, say, Scala, had a profound impact on how I work professionally, but the enlightening thing was Scala itself, not the book I used to help me learn it. Similarly, I’d say that learning to use Git had a significant impact on how I view version control, but it was Git that had the impact on me, not the book that I used to teach myself the tool. The books on this list are about the the content they dumped into my brain, not just a particular technology they taught me, even if a technology had a profound impact on me.

So, without further ado…

Continue reading ‘Top 10 Career-Changing Programming Books’ »

CenturyLink: Traps and Caps

TL;DR: After a decade of service, CenturyLink decided I wasn’t worth keeping as a customer, so I switched to Comcast Business Internet. Even if CenturyLink tells you that you have no data caps, you do.

When I first moved to Colorado nearly a decade ago, I signed up for Comcast’s Residential high-speed internet service, and I hated it. I had to reset my cable modem once every week because it would stop working properly, and my internet noticeably slowed down when people would get home from school/work in my apartment complex.

I did some research and determined that, for the kinds of internet speeds being offered at the time (around 1-5Mbps down), Qwest’s DSL had similar prices to Comcast. Additionally, because it was DSL, I could use my own Netgear router that had a DSL modem built in, and I wouldn’t have to mess with company equipment. Also, DSL’s speed varies based on your distance to a hub, not based on how many people are currently using it. I thought I could avoid both of my major problems by switching to DSL for about the same price, so I did, paying for the maximum possible speed at the time, 5Mbps.

For many years, Qwest was the only monthly bill I never had any trouble with. Sometimes my cable would go out or look pixelated, sometimes my heating bill would be surprisingly massive, I was always having annoying issues with my cell phone service, but month after month, I never even noticed I had Qwest. It was just there, it worked, it never went down, it never slowed down. It was great.

The good ol' days.

The good ol’ days.

As the years went by, Cable speeds seemed to be improving at a faster rate than DSL speeds. Nonetheless, I was happy with Qwest’s customer service and I had bad experiences with Cable, so I stuck to DSL. One day, I got a mailer that 10Mbps was now available in my area. I called Qwest that day and upgraded. A year or so later, another mailer came with 20Mbps as an offer, and I upgraded immediately. Each time the price difference was less than double for double the speed, so it seemed worth it. I use a lot of internet, and I still missed my University’s T3 line.

Eventually Qwest became CenturyLink after an acquisition/merge. I was a bit worried at first, I was happy with Qwest not only from a technical standpoint, but from a customer service standpoint. Would this change? I could always tell that Qwest representatives were especially friendly to me after they saw how long I’d been a customer, I feared I’d lose my “standing”. But, CenturyLink one day sent me a letter offering “fiber” internet, 40Mbps down, 5Mbps up. Upgrading bumped my price up to about $100 a month, which was a lot, but I really do use the everloving crap out of some internet, so I did it.

Many people on Twitter and Facebook asked me about internet providers, and I’d always talk up CenturyLink. Fast internet, good customer service, no downtime. And best of all, this was around the time that cable companies started introducing usage caps on their cable internet. I found this maddening for both philosophical and technical reasons, but CenturyLink had no such caps, so I’d often argue it was a better choice for heavy internet users like myself. I know that I influenced a handful of people to get CenturyLink, or even in a few cases to switch to CenturyLink off Comcast.

The First Warning

In February of this past year, I was at work and decided I wanted something off my computer at home. I tried to SSH into my workstation at home but was unable to connect. This was strange. Like I said earlier, CenturyLink never went down, so it made no sense to me. Thinking maybe my workstation had crashed or died, I tried connecting to my home VPN, and that didn’t work either. There are a few services I run on various machines that sync with centralized servers, such as Subsonic and Plex, so I tried connecting to them, only to discover they too had lost connectivity to my home. I even tried pulling up my Nest, and saw that even that had lost connectivity to the outside world.

Here’s how much confidence I had in CenturyLink: I actually thought the power must be out. I went home at the end of the day, fully expecting to walk into a cold house that had been without power for a portion of the day, and assuming I’d have to go around resetting clocks and booting up computers. But to my surprise, the house was fine. All the clocks had the right time on them, the power had never gone out. It was an internet problem.

I sat down at a computer and opened up a web browser. Instead of my home page, I got this:

No 'Net For You!

No ‘Net For You!

Continue reading ‘CenturyLink: Traps and Caps’ »

Diving Into Android

I’ve finally written my first real Android app. I dabbled a bit with Android development in the very early days, writing an app that interacted with the web services of the company I was working for at the time. This app was ugly, written for Froyo, and frankly barely worked at all. It was a 20% time project at my then-employer, but I never went back and worked on it after the initial effort, and never even bothered getting it packaged into the Android Market, largely out of embarrassment.

I’ve been wanting to get into Android development more seriously since that effort, because I overall liked the idea, and as a big Android user myself, I felt that it was essential I be able to develop applications for my own device, as being unable to do so was a lot like using Linux without the ability to write shell scripts.

I’ve taken two all-day training sessions on Android before as part of larger development conferences, and while I was able to suss out some basics about the lifecycle and other Android fundamentals from them, neither left me with any sense of real understanding of how I could develop something for Android that people might actually use. But at OSCON 2013, I took an excellent half-day Android class taught by Marko Garenta. Among other things, he showed me, for the first time, how to write a modern-looking Holo app, how to use asynchronous background tasks, how to transition between multiple activities, and how to handle fragmentation issues. These were never touched on in my all-day sessions, and they’re all large barriers to writing real applications.

Once I left the class I had a sense that I actually now knew enough that, with some help from web searches, I could actually write an Android app. I just needed a good idea, so I tried to take notice of various itches in my life to see if I could scratch any with a phone app.

Continue reading ‘Diving Into Android’ »

OSCON 2013: A Review

This year, I went to O’Reilly’s Open Source Convention, OSCON. Every year for the last four years, I’ve gone to a big tech conference. For the last three, I went to NoFluffJustStuff, which was later renamed UberConf. UberConf is held in my home state, I can drive to it from my house every day so there’s no plane or hotel involved, which makes it inexpensive enough that I’ve been able to get my employers to pay for it. However, due to having attended UberConf consecutively for three years, last year I’d seen about half the sessions already either in previous years on at local Java User Group meetings, so I decided that this year I’d try something different.

OSCON was a radical departure for me. UberConf is a “Java/Agility” conference, and since I work almost exclusively with the JVM in an Agile environment, it’s more or less custom-tailored to my interests. OSCON, however, had a huge variety of different tracks and a similarly varied group of attendees. There were Python folks, Ruby folks, hardware hackers, system admins, operations gurus, cloud nerds, data geeks, perl wonks, and more. I picked OSCON because, while the variety was less tailored to my interests, the sheer number of tracks (18 concurrent sessions per time slot!) made up for it.



Here is my review of the OSCON experience. OSCON was the first conference I’ve been to outside of my home state, and really the first one not run by the Rocky Mountain Software Symposium. As such, it will be unavoidable that I will be comparing it largely to my UberConf experience, since it’s my only real frame of reference. I will try to address each element of the conference separately.

Continue reading ‘OSCON 2013: A Review’ »