Monday, September 29, 2008

Support thoughts from Teamness

Have you ever written an email to the support mailbox of a service and got back either an answer which had nothing to do with the question, or a generic one which didn't solve anything?

Image by bobdegraaf

Some of these companies outsource the technical support for their products, so many times your message ends up being bounced between different departments involved, until some has a clue. In the mean time you get back all sorts of standard answers that don't even touch your problem and you need to answer back, otherwise the issue is considered closed.

Small companies' advantages

Support in Teamness benefits from the advantages of a startup, as it is done in house by the developers themselves. This eases communication, as the answers come in a personal manner from either me or Paul.

Notifications about problems in the application are investigated personally by us, instead of forwarding the email to a QA department, as would happen in a bigger company. If a "problem" is spotted, fixing it becomes priority number one, without going through the process of testing, analyzing impact of the fix and so on.

Benefits for the team

There are also advantages for us in doing the support ourselves, the ones developing the application, because we get to "feel" the feedback. A person who is not involved in the development process will act as a buffer for the users' feelings. As a startup, you need to actually listen to the user and really get connected to the complaints and suggestions.

Generally speaking, I think it's a very good practice to put people involved in development to perform customer support.

In the past, I had colleagues that really understood the frustrations of the users, but others named some of the requests as being "stupid". Maybe some are not very "smart" questions, but something lies hidden under every request. Not finding a button on the page could also mean that it's not properly positioned, not necessarily that the "stupid" user overlooked it. Most of the users just want to use your software, not to think about how to use it, so don't make them think.

Always reply. Quickly.

I feel happy when I get an answer back in the same day, so we're trying to answer as quickly as possible, within a few hours after receiving the email. Adding a human reply, not like coming from an answering machine surprises some of the users in a pleasant manner.

When I ask for support, I also like to be the one ending the conversation, so in Teamness we reply to every email, until the person decides to stop.

Dealing with rejection

It's never nice to see users leaving, but we try to see the positive side. One of our users wrote about a problem we weren't able to reproduce. We analyzed the logs and nothing seemed weird and while we were trying to discuss and understand the problem he decided to close his account.

We sent a polite email telling that we're sorry he decided to quit and we tried to learn as much as possible from this experience. Feedback is not easy to get in the beginning stage, since most users just walk away if they don't like something.

Good support pays off

Two weeks ago we got an email from someone asking for something that didn't make sense to us in the beginning. Further discussing the matter, we understood that the user wanted a title for the tasks. He was kind enough to give us screenshots with visual explanations of what he wanted, which is something you rarely get from a user. We added his wish on our tasks list, in a way which will not interfere with the existing features and wrote back with details of what we intend to do. Recently we found this nice review written by that user.

We know this is only the beginning in terms of support adventures in Teamness. We intend to post more stories from support in the future, so please stay tuned.

Monday, September 15, 2008

Two CDN solutions we tried for Teamness

CDN (Content delivery network), as Wikipedia states, is a group of computers spread across the Internet who collaborate together to deliver content. In this post I'll tell you a bit about our experience trying to setup a CDN for Teamness.

Image by GustavoG

Why CDN?

The benefit of using CDN when you're offering a live web application is that you can delegate your static data, like images, movies, client scripts and such to be delivered from different points in the world. This translates in higher download speed for your users. When someone requests a page from your application, she/he's redirected to the nearest server in the CDN to have the static content delivered.

We are strong believers in the concept of Try-Before-You-Buy. That's why we setup a demo account for Teamness and it's also a reason why we're offering a free plan. We applied for trial versions from two offerers: Panther Express and EdgeCast.

Panther Express

They advertise having under 40ms delay for 95% of the computers in the world, but a problem for us was that Panther Express don't deliver content over HTTPS, or at least they didn't until the end of May 2008, when we were discussing with them.

We obtained a trial setup for one week, but the fact that we didn't get HTTPS content was a major issue.


We signed a Master Service Agreement and a Service Order for a 4-days trial. They mentioned that they don't support CNAME’s for HTTPS, but only for HTTP.

After trial thoughts

Our intention was to sign up for a trial version, so we can run some tests and see what's the improvement of using a CDN service. We made different tests, adjusting the number of concurrent users and using also SSL content for EdgeCast case, but we did't obtain better results with CDN than with our server setup at SoftLayer.

Both Panther Express and EdgeCast asked for some sample URLs to check HTTP headers, so if you want to test a CDN solution before releasing, it's better to have your application online already. This is also helpful for doing comparative tests between your application with and without CDN enabled.

We will come back to evaluate more CDN offers in the future. In the mean time, our hosting provider SoftLayer started to offer CDN services and there is also another affordable solution we found at CacheFly. Here you can find a CDN guide with services ranked by approximate annual revenue, via CDN Evangelist.

Wednesday, September 10, 2008

Keep your inbox on a diet

In this post I write about a short list of things that I did to keep my inbox uncluttered on Gmail. The feeling I get now with a light inbox is similar to the one I get after I clean my apartment: I enjoy being there.

Image by dnorman

Recently I've been observing myself getting anxious by trying to act on incoming mail. Bold entries in Inbox are giving me an itch, I feel that I need to answer or read or do something about them immediately.

The spam filter in Gmail is extremely good, but the problem wasn't too much spam. It was all the emails that I want to read. Even if I shut off the email tab to be able to focus on work, when I open it up, I still scan, read or even react on messages which are not urgent.

The solution was to mercilessly filter and archive. The main focus was to move all the email that I can see later away from the Inbox and here are some hints that helped me.

Group friends

I made a list with email addresses of people that usually send me jokes, funny web sites and such things. Then I put the list in the following form:
{ }
and made a filter which applies a label named 'Friends' to messages from the addresses above.

The curly brackets tell Gmail to look for all the search terms inside. You may also use names, not only the full email address. I also checked "Skip the Inbox" in the filter editor, to archive them on arrival. This moves the email from the Inbox, which was the main purpose. I left the emails unread so that I know later which ones are new.

No need to unsubscribe - build a filter

You can get rid of all the newsletters you subscribed to some time ago and you don't read anymore. It's a bit annoying to go to each website and unsubscribe. Most of the times it’s useless. What I did was to make a few filters that mark the newsletter messages as read and archive them. You may even apply a label, if you plan to locate the email later easily.

It's also possible to use a more complex filter that will do the same job. Check this post on lifehacker to see how.

Group enemies

Most of the emails I get are from friends or from various nice guys concerned about my sexual life. You may apply the same policy mentioned above for friends to keep away messages coming from annoying contacts. The action is different: delete them right from the start. Gmail keeps messages in trash for 30 days, so you still have some to undo if needed.

Track your behavior

I’ve been watching the way I handle emails for a few days. This made me notice more patters, like always marking as read messages from a certain friend, without actually reading them.

Some other newsletters I forgot about were popping up. I solved the problem on spot by extending the filtering scheme to include the new pattern. Live a happy life with your slim Inbox.

On the following two pages you’ll find a gazillion tricks related to Gmail:

Wednesday, September 3, 2008

Google Chrome - the cool web browser

Google launched Google Chrome for Windows and they announced it using an original idea: a comic book.

Throughout its 38 pages, cartoon characters resembling people in the team are presenting various features of the browser. It’s a refreshing and fun way to follow a product capabilities.

I installed Chrome to test Teamness with it and I'm pretty sure this will not be the only usage I'll have for it. After less than one hour of using Chrome, I can say that the web browser nerds were longing for has arrived.

Here is a list of things that I liked about Chrome so far:

Speed due to multi-threading and multi-process approach
Every web application developer spends time on "developing" solutions to overcome browsers limitations, one of which being threads limit. Internet Explorer 6 for instance, makes only 2 simultaneous connections to the same server: one is used to retrieve resource data like images, animations, icons and it does this sequentially, while the other connection is dealing with the page itself. This slows down load time. To deal with this, in Teamness we're using separate domain names for resources, so that the browser thinks he's loading the data from different servers.

The sad tabs
Each tab in the browser has its own process in memory, so when a tab crashes, the browsers survives. A crashed tab becomes a sad tab, as they call it.

The Task Manager
There is an internal Task Manager option to see how much CPU, memory and network resources each tab is using and for what website, including a more advanced page called Stats for nerds. It's really cool that you can kill Chrome processes, even from the Windows Task Manager, and the respective tabs in the browser become sad as in the image.

It feels lightweight
You may start multiple Chrome windows, drag-and-drop tabs between them and get a feeling of your system getting no bloat.

Did I mention speed?
We will certainly add Google Chrome as yet another browser to use for Teamness testing, but for now I'm impressed with the speed of loading pages. For instance, my flickr addiction was moderated by the sluggishness manifested by Firefox gulping chunks of memory, but with Chrome, it's a different story. Try to load flickriver both in Firefox and Chrome and scroll down about 10 times. Here's a post comparing javascript engine speed in Chrome versus other known browsers. It ruled.

Address bar auto-complete
Chrome has an auto-complete feature for the address bar that provides you with options for search, previous visited pages and popular locations on the web. But don't get too excited, you'll still have to search for juicy stuff on your own. And you can do this using an incognito tab, where nothing is logged.

Only time will let us know if Chrome is a killer, but I think a lot of computer nerds will adopt the browser for now. For people that currently find themselves with 15 or more tabs opened in their web browser, Google Chrome scratches where it itches.