zVision is the future!

This internal memo was sent to SRS Software this morning. The points are important enough that I wanted to cross-post here.


I know there has been a lot of frustration over the last year as we have been working on zVision, the web platform, and ReEn. The shift we are making takes us from creating products to the creation of a platform.

So far, most have only felt the pain of the transition and have not seen the advantages. I promise you that this transition will be worth the pain and frustration. We are on the cusp of realizing a payout and it will be huge!

A guy who worked at Amazon and is currently at Google recently posted what was intended to be an internal memo on this topic. Everyone should take time to study the attached memo (http://steverant.pen.io) and understand the points that are made.

Here are a couple of threads where people are discussing Stevey’s memo that you may find useful:

I will continue to do everything I can to clearly communicate the amazing direction we are headed.

  • zVision puts us at the forefront of the technology industry!
  • zVision is the platform we need to carry us for the next 10+ years!
  • zVision will give SRS the flexibility and agility to dominate in our chosen market!

You are welcome to send me questions or comments privately. Alternatively, I have cross-posted this to my blog and you are also welcome to publically comment there.

– Nate

Nate Zobrist | VP of Software Architecture
Service Repair Solutions, Inc. — Revolutionizing the Delivery of Service and Repair™

770 East Technology Avenue, Building F | Orem, Utah 84097
Phone: (801) 437-5846 | Fax: (801) 437-5899 | Cell: (801) 788-4789

Creating Apps Should Be Trivial!

At Dreamforce ’11, a presentation I particularly enjoyed was given by Ryan Smith from Heroku. Titled Designing for the Cloud: The 12 Factor App, Ryan discussed some fundamental design patterns and practices that have made Heroku successful.

An interesting analogy that was made compares applications to swiss army knives. The analogy is relevant to SRS and provides a great visual depiction of the work we are doing as part of our SaaS and SRSWP initiatives.

swiss_army_knife_giant.pngHistorically our applications were designed as large, monolithic beasts. Like this knife, every feature that could be imagined was rolled into one of our flagship products. This design meant:

  • Duplicated effort because there were no shared components between product lines.
  • Intense effort required to join the team due to the large, interconnected designs.
  • Even small changes were risky and had the potential of destabilizing anentire product.
  • Management of each product line required enormous effort to tightly coordinate development and release of new features.

swiss_army_classic.pngContrast that complexity with a design where:

  • Components are small, independent apps that work together (like Linux tools).
  • Each component delivers specific functionality.
  • Touch points between components arewell-defined contracts.

The workflow enabled by this component-based architecture is truly liberating.

  • Small teams (perhaps even a single-person team) can build on top of the shared platform to quickly create new products.
    • Most products do not need to worry about operational infrastructure, databases, etc.
    • Products can take advantage of shared services to quickly enable powerful features in innovative ways.
    • Products can tap into shared repositories of both customer-generated and catalog data.
  • Existing products are simpler to maintain and introducing change is far less risky.
    • A smaller codebase means that the project is much easier to grok.
    • Well-defined contracts that have robust automated tests written against them mean that each component can be released independently with confidence.
  • Teams can work more efficiently by choosing technologies and frameworks that are tailored to fit specific needs.
    • Using standards-compliant web services for an API means that apps written in Java, Ruby on Rails or Node.js can access shared services as easily as a legacy, .NET application.

Following a component-based approach will make the creation of new apps a trivial exercise. It will free us to focus on solving interesting problems rather than being bogged down by operational overhead. The quality of our offering will increase as we become much more responsive to customers.

Applying these principles means something different for each of our existing projects and teams. What remains to be done for your team to fully benefit from this component-based design? What new functionality would you like to see exposed by the SRSWP?

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.

Installing RMagick on Ubuntu 9.04 (Jaunty)

Installing the RMagick gem can be a huge headache. Reading the HOWTO on the RMagick site is enough to make anyone nervous. Thankfully the process is much easier on ubuntu however; you only need three commands.

DISCLAIMER: I’ve only tested this on Ubuntu 9.04 (Jaunty) server.

$ sudo aptitude install -y imagemagick
$ sudo aptitude install -y libmagick9-dev
$ sudo gem install rmagick

And you’re done! You can verify the installation using this irb command, taken from the RMagick HOWTO:

$ sudo irb -rubygems -r RMagick
irb(main):001:0> puts Magick::Long_version
This is RMagick 2.10.0 ($Date: 2009/06/19 22:07:05 $) Copyright (C) 2009 by Timothy P. Hunter
Built with ImageMagick 6.4.5 2009-06-04 Q16 OpenMP http://www.imagemagick.org
Built for ruby 1.8.7
Web page: http://rmagick.rubyforge.org
Email: rmagick@rubyforge.org
=> nil

Installing git on Ubuntu 9.04 (Jaunty)

Last night I was working on a new ubuntu 9.04 server on ec2 (it was ami-0d729464 from http://alestic.com if you’re interested). Installing git via aptitude would have given me an older version so here’s what I did.

$ sudo apt-get build-dep git-core git-doc libssl-dev
$ wget http://kernel.org/pub/software/scm/git/git-
$ tar -xzf git-
$ cd git-
$ ./configure
$ make all doc
$ sudo make install install-doc
$ git --version
git version