It was in the news today. CBS bought Last.fm.
I admit I had not heard of it before. So I decided to check it out.
Type in www.lastfm.com into the browser.
What strikes you on the home page is “Start Listening with Last.fm” I had no idea what it meant at the time. So I punch in “Diana Krall” looking to listen to one of the smooth creations from the Vancouver native.
It took me a single click. The Last.fm radio played on for hours.
What a satisfactory user experience! From not knowing anything about the website to being on it for hours.
Unexpected error messages with call stack, on a website reveal the architecture in use.
In the process of using United’s website, I ran across such an unexpected error. The call stack pieces highlighted in RED reveal, the use of struts and webservices. It also reveals poor programming since I found others who have run into the same error. I guess United developers have not read Joel’s article on getting error report from users.
Effective code review techniques would have caught and prevented such errors from being ever being displayed to the user. Want to know someone who can help you prevent such problems on your website? Hire CodeReviewers.
There was an error in processing your request. Please see the message below for instructions.
We are unable to retrieve flight information at this time. Please try again later.
CTSCHEDULEECONOMY-NON-REFUNDABLE **************************************##ERROR LOG ##**************************************##Service Invocation Exception: com.uls.servicebroker.ServiceInvocationException: ServiceBroker::Service invocation failed because of the following reasons com.ual.telescope.util.ServiceInvocationException: Web Service Invocation Error::SOAP Fault Occured at com.ual.telescope.ws.IBECommonServiceAgent.invoke(IBECommonServiceAgent.java:181) at com.uls.servicebroker.LocalObjectDelegator.invoke(Unknown Source) at com.uls.servicebroker.requestor.RequestDelegator.invoke(Unknown Source) at com.uls.servicebroker.requestor.RequestorAgent.invoke(Unknown Source) at com.ual.telescope.util.SBUtil.invokeIBEService(SBUtil.java:137) at com.ual.telescope.util.SBUtil.invokeIBEService(SBUtil.java:114) at com.ual.telescope.util.SBUtil.invokeIBEService(SBUtil.java:103) at com.ual.telescope.util.ServiceDelegateImpl.getFareSearchResponse(ServiceDelegateImpl.java:312) at com.ual.telescope.ui.shop.util.ServiceBDImpl.getFareSearchRS(ServiceBDImpl.java:572) at com.ual.telescope.ui.schedule.actions.SelectODCombinationAction.getSelectedItineraryForMultiCity(SelectODCombinationAction.java:178) at com.ual.telescope.ui.schedule.actions.SelectODCombinationAction.doExecute(SelectODCombinationAction.java:105) at com.ual.telescope.ui.shop.actions.BaseAction.execute(BaseAction.java:146) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421) at com.ual.telescope.ui.core.UIRequestProcessor.processActionPerform(UIRequestProcessor.java:535) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164) at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397) at javax.servlet.http.HttpServlet.service(HttpServlet.java:740) at com.ual.telescope.ui.core.servlet.LocaleActionServlet.service(LocaleActionServlet.java:140) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1072) at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:465) at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:28) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) at com.ual.telescope.ui.core.UIFilter.doFilter(UIFilter.java:169) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) at com.ual.telescope.ui.core.SecureTokenFilter.doFilter(SecureTokenFilter.java:84) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) at com.ual.telescope.ui.core.TelescopeMgmtFilter.doFilter(TelescopeMgmtFilter.java:121) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6987) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121) at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3892) at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2766) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183) END Hidden error msg for debug–>
Typically an Instant Messenger user does the following activities:
1. Launch the instant messenger program (most probably its already running in the background and its launched using the Systray icon).
2. The person’s eye locates the buddy they want to talk with.
3. Click on the name and a message window pops up.
Up until this point, most messenger behave identically. This is the activity that I intend to compare. The big guys messengers have morphed into being many things, but I will ignore those for the purpose of this study.
The user experience sucks across all the major messengers. It takes me a minimum of three clicks to start a conversation. It is too many clicks. Compare this to making a phone call to your speed dial number. That’s two button pressed and this with an interface that is two to three decades old.
Also there is mouse movement between the clicks. I launch the messenger with a double click on the systray. The messenger launches at the previous location. My mouse pointer is still near the systray. Now it take me couple of seconds to move the mouse location to point to messenger software, locate the buddy and then use another click.
Hence, in the department called “imagination” all the major softwares get a big zero. Make it as easy as calling a buddy on speed dial and you will be a step ahead of competition.
The usability of the process of creating conferences with multiple participants is shaky at best.
Only MSN Messenger provides a slightly better way of adding participants to the conference.
Skype and Yahoo both use the unimaginitive form of listing contacts on the left and and an array of arrow buttons to move contacts into a conversation. A classic example of bad form factor being copied. I don’t know where this format originated, but I have seen early examples in the Microsoft client software such as Outlook.
MSN Messenger improves on this form by allowing search and clicking checkboxes. Lame, but an improvement nonetheless. I could not figure out how to create a conference in Google Talk.
Instant messenger softwares are anathema to most system administrators I have met. The big ones used to require punching a hole in the corporate firewalls to allow them to operate. Hence, a lot of companies disallowed the use of MSN Messenger and Yahoo Messenger by simply blocking the required ports. Let’s see how the different clients fare when posed with such problems.
MSN Messenger fares poorly when operating behind a firewall. It has no built in support to chat over the default port 80 using the HTTP protocol. It is an outright loser in this category. Microsoft came up with a pure web based client for MSN Messenger called Webmessenger. The usability is quite bad and the experience does not translate over from the regular client to the web based client.
Yahoo allows the user to switch from the regular chat port and protocol to using port 80 and HTTP. But this requires advance knowledge on part of the user on what setting will work. It would not have been hard for the Yahoo programmers to put in a feature which automatically chooses the correct option based on the users network settings.
Google Talk shines in this department. The reconnection works flawlessly, it uses port 80 and HTTP with ease and all of this is quite transparent to the user as it should be.
Skype “gets it” as well. It has a default port but also sets up port 80 in case the default port cannot be utilized. Again, transparent to the user as it should be.
Memory and CPU footprint on base system : Windows XP, 2 GB RAM, 2 GHz CPU
MSN Messenger core process msmsgr.exe used about 4.5 MB in the minimized state and goes upto 22 MB upon being activated. Launching an empty message windows added additional 5MB memory footprint. The additional process launched is livecall.exe which takes up additional 17MB before it does anything useful for you.
The monolithic YahooMessenger.exe takes about 45MB without a single open chat window. Upon opening an empty chat window, the footprint goes up to 47MB. I minimize Yahoo messenger and it remains steady at 46 MB. I wonder what all that important stuff is that the Yahoo programmers keep around no matter what.
Skype operates on two processes, Skype.exe and skypePM.exe. Minimized, Skype.exe takes around 49MB and skypePM.exe takes around 15MB. The total footprint comes to 64MB for Skype. Opening an empty chat window in Skype produce negligible additional footprint.
Minimized google talk occupies 21MB on my system. Opening an empty chat window does not increase that amount significantly.
For comparison, I made calls from USA to China over various IM clients. It seems that the outright winner in this category is once again Google Talk client. The call quality was crisp and clear. The loser in this category was Skype. Yahoo and MSN are fairly identical in terms of call quality and rank in between Google Talk and Skype.
Disclaimer: this is strictly based on call quality comparison between USA and China. Call quality will vary based on the quality of the internet pipes between two end points.
One feature that sucks in Google Talk is the absence of Voice conferencing. There is a hack to do conference calls using Google Talk as explained here http://lpahome.com/call.html.
Google talk is the only software which solely focuses on chat and keeps additional plugins at bay.
There is nothing to buy, sell, play games or any peripheral stuff. It seems to be keeping it simple as Google does with everything it creates.