My New Job (Title)

It has been quite a long time since I last posted anything to my blog. It’s not that I haven’t thought about it or that I haven’t had time (though life has been busy). I’ve struggled topically with what to write.

This blog was started with the intent that I would share things about my work: creating software. But, over the last year my job has been in a fairly constant state of flux with my responsibilities shifting radically from what I was doing previously.

I love being a software developer. I love the problem solving that the work entails. I love being in “the zone” while writing code. I love creating something that others find useful and I like to think that I am fairly good at it. Wishful thinking? Perhaps. But, at least one other person has thought me passable, so I choose to believe. 🙂

At present my job title is VP of Software Architecture. In my new responsibilities I still get to solve incredibly complex problems and derive a lot of satisfaction from it. In many ways the things I work on now are more intricate and stimulating than what I did previously. The only downside is that I rarely get to ride “the zone” via coding anymore.

Two years ago, if someone had described my current job to me and asked if I wanted the position, I would have turned them down outright. I derive so much pleasure and satisfaction from writing code that I could not have imagined wanting something else. I was firm (and vocal) in my commitment to avoiding “the management track.” How then did I end up here?

I joined Mobile Productivity, Inc. (MPI) in January 2004. The people were great and the work was both challenging and interesting. But, after a few years I started to grow bored. Nothing had really changed, except that I wasn’t creating new software anymore. I was responsible for a significant portion of our flagship product, ARGIS (since rebranded MPI Edge), but I had rewritten most of the code several times and just wasn’t being stimulated the way I once was. I decided to leave MPI to go work for another startup named Podango.

Podango was a good company in many respects, but like many startups it wasn’t able to thrive and closed at the end of 2008. Friends at MPI heard that I was in the job market and offered me a position. I was a bit hesitant, but a lot of new things were happening and I felt good about returning.

Internally at SRS, this period of my career is jokingly referred to as my “sabbatical.”

Somewhere in all of this, MPI acquired several companies and was renamed Service Repair Solutions (SRS). We’ve grown from 25 people in a single office to just under 600 total (including offshore teams). The Engineering department alone has over 200 people spread across offices in Utah, Minnesota, Uruguay, Vietnam, Las Vegas and Russia.

I’m not worried about growing bored again any time soon. My job is awesome!

Trying to Close a Lingo Account: My Horror Story

I used Lingo for a few years without any problem. I never had any reason to contact their customer support until deciding to cancel my account.

Canceling my Lingo account was an absolute nightmare. In the end I spent nearly three hours on the phone before I was finally able to speak to someone who would process the cancellation.

I never spoke to anyone in their Cancellation Department. Honestly, I’m not sure that that department has any employees. In the end it came down to a war of attrition. I had to wait on hold and complain vigorously enough that they finally decided I was serious about wanting to close the account.

Many companies understand that when a customer calls to cancel, they have an opportunity to save that account. After this dreadful experience not only will I refuse to do business with Lingo again, I’ll tell everyone I can to avoid them like the plague.

Below is the log that I kept while trying to cancel my account. I’ve done a little grammatical cleanup from the notes I originally posted during the phone calls.

Several weeks ago I made the decision to close my voip account with Lingo in favor of just using my cell phone. I got a new cell phone for my house and transferred my phone number from Lingo to my cell provider. Now I’m trying to cancel my Lingo service… what a joke. As I started writing this I’d been on hold for exactly one hour.

Friday, December 17th:

  • 11:30am – I first called Lingo. I listen to the recorded message and navigate their menu system to talk to Customer Service.
  • 11:46am – I waited on hold for 16 minutes before talking to a guy who took my account information and put me back on hold.
  • 11:47a – He’s going to transfer me to the cancellation department.
  • 11:52a – The guy asked for a callback number. The cancellation department is too busy to take my call. From the way that he is talking about it it sounds like the cancellation department is one person who is out to lunch. He said that someone would try to call me back in the next 48 hours. I told him that this was unacceptable because I don’t want to continue paying for service that I’m not using. He’s going to try again so I go back on hold.
  • 12:02p – He still can’t transfer me because no one is available to take the call. I ask to speak to a manager and am placed back on hold.
  • 12:03p – The manager is too busy to speak to me. I tell guy that I’ll hold for the manager.
  • 12:06p – I finally get to speak to a supervisor. I express frustration about this situation and ask what she can do to help. She is very nice but absolutely no help at all. She says that there is nothing she can do except continue trying to transfer my call. Because I have no other options, I agree.
  • 12:37p – I’ve been on this call for over an hour now and am still on hold. I should have used a landline for this call. This is chewing through my cell minutes.
  • 12:50p – Lingo wins this round. It’s easy for me to sit on hold while I’m working at my desk but I have to go to a meeting. I am extremely frustrated!

December 22nd: my second attempt

  • 9:09am – Called Lingo back. Went through their menu system and am on hold again.
  • 9:20a – got a recorded message saying that they are too busy to take my call and asking me to please call back during normal business hours. According to their website, they’ve been open for over two hours already today (Mon – Fri: 9AM – 9PM EST)… this is normal business hours!
  • 9:21a – I call back and am again placed on hold.
  • 9:33a – I got the recorded message again and was disconnected. I called back immediately. I really wish that their hold music had more than just one song being played over and over and over…

Gotta love their “Terms and Conditions“:

Cancellations will only be accepted via phone through Lingo’s Account Management Department at the toll-free number listed on the first page of your invoice, and will be effective upon the date that you cancel with a Lingo Account Management Representative. You will be given a cancellation confirmation number by the representative. Service cancellation requests by mail, e-mail, fax, equipment return, or any other form of non-telephonic communication requests will not be accepted.

We only accept cancellations by phone. Also, we don’t answer calls to that phone.

  • 9:44a – Disconnected again. Called back again. I guess that their system is programmed to hang up on me every 11 minutes.
  • 9:55a – Disconnected again. Called back again. I guess that it’s more likely that the system hangs up on me after being on hold for 10 minutes. The extra minute is probably just the time it takes me to call and get back in the queue.
  • 10:06a – Disconnected again. Called back again. At least I was smart enough to route the calls through Google Voice this time so I’m not using my cell’s minutes.
  • 10:17a – Disconnected again. Calling back again. I think I’ll try connecting to the billing department again (that’s who I spoke with last Friday). They still put me on hold for the Cancellations Department but at least I didn’t have to keep calling back.
  • 10:26a – Spoke to a Customer Support Representative. She verified my information and then put me back on hold. She gave me instructions on how to call back “just in case we’re disconnected.” What a joke.
  • 10:32a – a manager is on the line. She said that since I’ve been on hold for so long and since I had spoken to a manager on Friday that she would cancel the account for me. On Friday I was told that the manager I spoke with didn’t have the authority to cancel an account. I don’t understand her logic for finally accepting the cancellation but I really don’t care. Just close this account! I asked her for a confirmation number and was put back on hold while she processes the cancellation.
  • 10:36a – The manager processed the account and I have just sent me an email with the cancellation confirmation. This process has been an absolute joke!

The moral of this story: Don’t signup for service with Lingo. It’s not worth it.

Thoughts on Doing Contract Work as a Software Developer

As I was recently looking for new employment I spent quite a bit of time deciding wether I might enjoy doing contract work full-time. I enjoy working on different projects and learning new things but there is one major roadblock to becoming a full-time contract developer. My personality doesn’t let me write software that is anything less than my best.

WARNING: Gross generalizations and simplifications below. I’m not trying to offend anyone, just describe my experiences.

Most of the contract work I’ve done has been for people who are not technically savvy. They come to me with a very vague idea of the software they want. They expect me to tell them how much it will cost before we’ve discussed specific requirements. When the requirements are incomplete or incorrect they expect that I’ll just fix it without additional cost to them.

Not all of my contract experience has been negative. In fact, most of it has worked out quite well. Usually both my client and myself are pleased with the software and the cost of building it. But I’ve had enough negative experiences to be careful when considering a new job.

Part of the problem is that it is nearly impossible for anyone to completely define the scope of a project. There is always some miscommunication or misunderstanding, there is always some unforseen problem.

“You want me to setup a blog for your company? No problem, I can get WordPress setup for you in an hour.”

“Wait, I didn’t realize that by ‘blog’ you meant store front application that can accept payments, handle accounts payable, accounts receivable and inventory tracking. That will take slightly more than an hour.”

That kind of situation actually isn’t bothersome to me. As a contractor it is part of my job to understand what you want before making a bid. If a potential client obviously doesn’t know what they want, I can either decline to bid on that job or I can adjust my bid to account for a large amount of unknown. I don’t love it, but that type of risk is manageable.

The part of contract work that I dislike is being forced to compromise quality. When I’m working on a fixed cost contract, it is in my best interest to deliver exactly what is specified, as quickly as possible. As long as my client is reasonably happy with the deliverable, I am going to get paid $20k regardless of whether it took two days, two weeks or two months to create. I don’t get additional money for clean code. I don’t get extra for having good test coverage.

When I complete a project more quickly than I had anticipated there is no problem. I can spend time verifying that the code is tight and that everything is working as expected. But if I am running behind schedule, it becomes more difficult to care about testing the code or fixing “little” bugs.

There may be a bug in the code where order totals aren’t calculated correctly, but what are the odds that my client will notice the bug before he signs off on the project? If he does find the problem and I correct it, will he think to test for that same bug in every release?

This is the dilemma that makes contract work difficult for me. If I see a bug in my code, I’m going to fix it. If I’m writing a tricky or important calculation (like calculating totals), I’m going to write a test. I need to have confidence that my code is doing what I expect. I’ve never shipped any software that didn’t have a list of known bugs but I have also never shipped any software in which I didn’t have a high level of confidence that it was working correctly.

For me, doing the bare minimum isn’t an option for two reasons:

  1. Quality is extremely important to me. I can’t just hack something together that meets the contract requirements. When I write software, I want to deliver my personal best.
  2. Most of the time, the fast/crappy way of implementing something simply doesn’t occur to me.

I understand a company’s need to understand cost before approving custom softare. But if you want me to do contract work, pay me on an hourly basis. I’ll give you a projected timeline for project completion.

With an hourly rate, you only pay me for the time I actually spend working. With an hourly rate I know that I won’t lose money just because I insist on high-quality code. We’ll both be happier in the long run.

The Rest of My Development Environment

As a professional software developer the vast majority of my experience has been working on C#.NET WinForm applications. I started using .NET shortly before the 1.0 framework was released. I can’t remember if I ever did .NET development under Windows 2000; I generally use Windows XP. If you’re wondering why I don’t use Vista I have to assume that you’ve never tried Vista yourself. It’s not good. I’m waiting for Windows 7 and hoping for the best.

The tools that I use for C#.NET are pretty standard:

C# Development

The one thing that is sorta strange about how I do my C#.NET work is that I do everything on a Mac Pro with XP running in VMWare Fusion. I’ve had a similar setup at home for a couple of years but I’ve only had this setup at work since January.

There are definitely a few quirks that I had to get used to, working in Windows running in a VM on OS X. But the benefits of this setup far outweigh any inconvenience. The ability to take snapshots of the entire VM is awesome! If a program screws with my registry and Windows starts acting funky I just roll back to the last snapshot!

The other huge benefit to working in VMWare is memory. Unless you’re using 64-bit Windows (which can be problematic for many reasons) you are limited to 2 GB of memory. Windows sucks at managing virtual memory so I always try to keep my open applications below that 2 GB limit. Since my Mac has 12 GB of memory, if I need to do something else, I can just boot up a second VM.

Most of the software that I’ve written for OS X has been personal projects. Nothing fancy, just various tools to scratch some itch. Since getting my iPhone I’ve been doing more work in Objective-C and Cocoa.

Because I’ve done so much work with managed and interpreted languages, it feels a little weird to work in unmanaged C/ObjC. But it is kinda cool too. Objective-C is a fairly simple language and Cocoa is a very nice framework. There are some things that I don’t like about Obj-C (not having namespaces and gimpy string manipulation come immediately to mind) but I really appreciate being able to actually use Cocoa controls for UI work. It is almost unthinkable to do GUI development for Windows without buying a set of third-party controls.

My must-have software for writing Mac/iPhone applications:

Cocoa Development

And finally, a few additional pieces of software that are invaluable to me. These are helpful regardless of what type of software I am writing.

Web Development Environment

During 2008 I spent most of my time doing web development. There was some Java, PHP and Python, but most of my time was spent working in Ruby on Rails. Rails is a lot of fun and (I know this sounds cheesy, but…) it helped me to enjoy doing web development again.

When I’m working in Java I always prefer to use JetBrains’ excellent IntelliJ IDEA. However, this past year I didn’t have a license for IntelliJ. I tried every free IDE I could find and wound up choosing Eclipse. I’ve used Eclipse periodically over the last several years. I don’t really like it but I dislike it less than the other free alternatives.

My work was completely server-side and didn’t involve developing a database component. Most of my development was done on OS X but I was deploying to Ubuntu so I did work there also. I used maven to build, test and deploy. I’m not a unit-test fanatic but, in this case unit testing was invaluable.

Java Development

My setup for both PHP and Python is the same. When I’m working on Mac I use either TextMate or vim. I haven’t done a great deal of Python work but over the past several years I’ve tried to find a PHP IDE that I like… I’m still looking.

PHP Development

I started out doing my Ruby work using TextMate and I didn’t have any major complaints. There are some nice plugins and various tricks that are handy. But personally, I prefer an IDE. I’ve heard some people say that IDEs make us lazy. Ok, I’m lazy. But I’m also far more productive when I have a good IDE. When JetBrains started issung beta releases of RubyMine, TextMate was history!

RubyMine’s GUI for easily stepping through code in the debugger is great. The inline code analysis is nice for quickly catching typos and the code completion can be useful too. But for me, the best part about having RubyMine is the navigation and documentation.

When I’m working with other developers (or even with frameworks that I didn’t write), I don’t always know exactly what a method does. Being able to instantly bring up documentation is awesome! If I need more information, I hate wasting time trying to hunt down a method buried in code that I am not familiar with. With one key-stroke RubyMine takes me to the code I’m looking for.

Rails Development

I am definitely a fan of JetBrains’ production. IntelliJ is awesome, RubyMine is awesome, and VisualStudio is just broken without ReSharper. There is certainly a learning curve to these tools but once you’ve memorized the key strokes, the code you need is always right in front of you. And the best part part is that the key bindings are the same across each of JetBrain’s products!

One last application that deserves to be mentioned is Navicat. Navicat is by far the best application that I’ve found for working with MySQL or PostgreSQL. Unfortunately, that’s not saying much. I have spent a lot of time using SQL Server and Microsoft’s related tools and, as far as I can tell, there is nothing for MySQL that is even in the same league.

Don’t misunderstand me. Navicat is a great tool. Allowing me to save connections to different servers with many different login credentials is a lifesaver, especially the ability to tunnel the connections over ssh. Being able to do basic server management via a GUI is nice too. But when I need to design a database, I always turn back to SQL Server Management Studio.