Critical Thinking
This is page 5 of the discussion. Read the opening post
After Hours
This is page 5 of the discussion. Read the opening post
by dbmercer
It's a shame Tech Republic does not follow your advice. I read your column in minuscule type with two very large grey columns on either side. Had to do a lot of scrolling and squinting to read.
by justin james
Imagine that you could see the following improvements on your Web site, with a total of only four weeks of work:
* 244% increase in conversion rate
* 286% increase in overall sales
Those numbers are from http://www.creativegood.com/casestudies/shure.html
Here is another set of numbers to consider:
* Sales/Conversion rate improvement: 100%
* Traffic/visitor count improvement: 150%
* User performance/productivity improvement: 161%
* Use of specific (target) features improvement: 202%
That set of numbers came from http://www.useit.com/alertbox/20030107.html
Wow! If you are in charge of (or derive income from) a Web site or software development, how many fingers would you cut off for these levels of improvement? Well, there is good news for you: you do not have to lose any fingers. You just need to follow usability theory.
The first set of numbers comes from Creative Good, a design consulting firm run by Mark Hurst after performing four weeks of site redesign. The second set of numbers comes from Jakob Nielsen's Alertbox, as a result of a 135% increase in site usability. Both of these people have proven, decades long track records of significantly improving the usability of applications and Web sites. They are also the two main influences on my running water Web design philosophy.
Mr. Hurst pays special attention to the user's experience. Mr. Nielsen uses scientific methodologies (control groups, eye tracking, in depth statistical analysis, and so on) to choose amongst proposed designs. I would have to say that the numbers above (just a brief sampling of the numbers available on each of their Web sites) speaks for itself.
As I have already written, usability is the killer feature. There is not a single site out there on the Web which is unique. Someone else is always offering the same products, content, or service for the same price you are, sometimes cheaper. Your Web site, product, content, and service is a commodity and users have choices. If you are first to market today, tomorrow you will be one of a dozen, and by next week you will be in a sea of hundreds. Google makes their living by stealing everyone else's lunch by improving usability.
Remember, you are not the end user. Your high priced design consultant is not the end user. The Internet elite pushing AJAX and Web 2.0 are the not majority of end users. My grandmother, your six year old daughter, the person who thinks that the CD-ROM drive is a coffee holder is the typical end user. Unless you are making a tool for use by programmers, asking your programming friends if something is usable is worse than worthless, it is harmful. Think about that. Re-read those numbers.
I have never, ever spoken to an end user who said, "gee, I had a really hard time figuring out how to make a purchase from that site and I just gave up, but wow, it sure was pretty, I will be sure to attempt to shop there again." I have never seen an AJAX or Web 2.0 proponent show hard evidence using testing methods that follow sound methodology prove that their techniques improve sales, conversion rates, traffic levels, hit counts, new user registrations, or any other bottom line number. I have never seen a consultant or graphics designer who specializes in confusing yet beautiful site design to offer a single number that shows that by reducing usability they improved the metrics that truly matter.
Another interesting fact is that the rules of usability are fairly static. For example, initial efforts at 3D interfaces showed that they were just as useless in 2006 as they were in 1986. Improvements and changes in technology do not equate to a change in the users' needs; they are merely different ways of addressing the users' needs. TiVo did not suddenly create the desire for people to view movies whenever they wanted. It simply addressed the desire, and did it better than a traditional VCR did, which did it better than HBO did, which did it better than the movie theater did. The Internet did not create a demand for adult content. It simply did it better than? you can imagine the list. These are examples of how improvements in usability generate big bucks. If you do not believe me, compare the sales figures for iPods versus portable CD players.
So yes, if you want to improve your Web site's performance, by all means consider a redesign. But do not settle for the most attractive design or the design with the most features. Choose a design that will demonstratively improve you bottom line. That means listening labs, observations of users at work, log analysis comparing the new design being given to random users versus the current design, and so on. That means using scientific rigor. Even if you do not have a big budget, just grabbing ten people who have never used your site or application and represent typical users (family, friends, spouses, etc. are a great source of free testers) and watching them trying to perform typical tasks while timing them can help you. But to sit in an ivory tower or a conference room where groupthink kicks in and nodding your heads saying, "Yes, I like this much better" will not help you.
J.Ja
by justin james
Test 1 2 3
by justin james
Test 3 4
by justin james
Test 4 5
by mark johnson
I agree with David Mercer - if it wasn't for the fact that TechRepublic occassionally delivers pearls of wisdom like this article, I would have abandoned it precisely because it breaks so many of the rules advocated.
What is it with only using 30% of my screen width to display information that I care about!
PS. The pearls are becoming more rare.
by justin james
One of my earliest experiences with IT work was volunteering for a local charity. It was a home for developmentally disabled adults. I assisted with their computer systems, creating accounting and budgeting spreadsheets, building a Web site, and more. It was also one of the most personally satisfying IT experiences I have ever had. In high school, I was extremely active with charity work through the Air Force Junior ROTC program that I was in. Ringing bells for the Salvation Army, visiting local nursing homes, and more were part of that experience. None of these had any kind of payoff for me other than a sense of satisfaction with myself.
Over the years, I fell out of this practice. Recently however, I have begun doing work like this again (not in an IT capacity, however). I still find it immensely rewarding. I have decided to offer my services as an IT professional to some non-profit organizations as well. IT services are typically quite expensive. If I can help where I can, I want to.
The Open Source Software folks talk about how they are changing the world by giving away free software. Yes, it is great that businesses can save money and new technologies are being developed. Right now, there are children who have been severely abused in shelters, addicts trying to recover from their disease, prisoners trying to learn a new way of life... the list is endless. And there are non-profit organizations trying to do something about of these problems. It is easy to look at some of the recent scandals and problems with the large charities out there and say, "well that does not look like something I want to be involved in, and they have enough money to hire IT professionals anyways." That may be true. However, for each huge charity that may put only 10% of its budget to actually helping people, there are a hundred local charities operating on a shoestring budget. These charities are where you can deliver the most help, and they are the ones with the least ability to get IT help.
One of the great things about volunteer work is that your resume is not nearly as important as your willingness to help. If you are looking to learn a new skill, volunteering is a great way to put it into practice. It can also help build your resume, because you will have the opportunity to try things which you are not qualified to do "on paper." For example, a local group that I am involved with is beginning a VoIP project. I have no experience with VoIP, but I have a lot of experience in general networking, systems administration, telecommunications, power protection, and other things peripheral to a VoIP project. The person who was asked to do the VoIP project has zero knowledge of any of these things. This organization was delighted when I offered to help out, and now I will have the chance to learn VoIP when I might not otherwise have the chance to do so.
We all know what kinds of productivity gains IT can deliver to businesses. But non-profit organizations, particularly those that operate on the local level, often cannot afford the capital investment to leverage IT properly. I am not familiar with any services or Web sites that help worthy organizations find volunteer IT help, or help IT pros looking to do some good deeds assist a good cause. If you know of such an organization, please let me know. I am also considering starting a Web site to assist with this. If you are interested in helping, please let me know via TechRepublic private message. I think it is high time we put the spirit of the OSS community to work in helping others with problems more important than the TPS reports.
J.Ja
by georgeou
Now I?m not saying that volunteering is a bad thing or anything, but guys like Steve Wozniak and Bill Gates made a ton of money first and they turned around to give Millions and Billions of dollars away. Others gave away their software first and ended up with no money to give because they had to work full time for a living. Both camps obviously had their heart in the right place, but one camp was obviously a lot more effective than the other.
by justin james
George -
I agree with you on that point. If you are looking to help others, you cannot give something you do not have. And if you are looking to do that with money, you cannot give it unless you have it. That's the beauty of volunteering time. Most people really do have time, even if it is only a few hours per week. Besides, as I mentioned in the post, giving time to volunteer does have a couple kickback benefits. :)
J.Ja
by sean.morley
Here here!
When I look at the amount of great freeware and shareware available, I think "Wow, this is an amazing community!" From Excel add-ons, to antivirus tools, to Linux. Now think about directing some of that incredible talent towards those in need - those without the option to just go buy it. As someone who has worked with handicapped children, and now has one, I can tell you I have seen it from both sides. You CAN make a significant difference.
by xitx
I would like to talk about the volunteerring from another viewpoint. I had the experience of doing volunteering in a non-porfit organization. It turned out that because of my dedicated work the organization fired one of their employees who are doing the same work as mine. What's a pity. That's definitely not my original intention, but the result is bad.
What I want to say is before doing volunteering please check if it only benefits the organization while hurts others.
By the way, you can not do volunteering freely in Canada. I have been a working permit holder in Canada for a while and I tried to volunteer my skills. The funnies thing is that nobody wants to 'employ' me because I am not eligible to work for other companies from my current employer even though it's free.
Dennis
One way to help non-profits is with software. You may be interested to let any small to mid-sized charities you are working with know about my free program for tracking donors and donations and issuing charitable receipts. It's called DONATION, and it is very popular and well liked (over 3,000 registered users).
You can find it at http://www.freedonationsoftware.org.
I am actually just about to start a complete re-write of it, most likely in C#, using CrystalReports for the reporting, and perhaps the new Microsoft SQL Server Everywhere for the database, and then open-source it. (Until now, it has been free of charge but not open source, largely because it's written in PowerBuilder, and I don't think there is a large enough PB programmer community to support an open source project such as this.)
Although I plan to do almost all of the work myself for the first draft of the port, if anyone is an expert on some of these technologies and wants to offer their services as a consultant, that would be most welcome, because .NET programming is fairly new to me. You can contact me at info @ freedonationsoftware.org.
by leigh9
Hi
This is a brilliant idea, and it is true that the bigger charities are often the least efficient. I provided tech support for a small charity called Asian Aid Organisation for a number of years. I currently work for them, paid 3 days a week, working 5-6. If I could afford it I would work for free, because I believe in what they do. I am developing a new MySQL database and webbrowser interface for them. I am woefully underequipped for this task, and a very ordinary programmer. Many more capable people refused to help saying it couldnt be done. It certainly hasnt been easy and I am currently struggling with a receipting page which is frighteningly complex.
If there are any vb asp and javascript heroes out there who'd like to help 'break the back' of my current issue, I and in fact Asian Aid would be very grateful. Which means that thousands of children and hundreds of women would also be grateful. You can get an idea of who we are and what we do by going to; http://www.asianaid.org.au This is the old static site. The new site is not accessible from outside and there are obvious security issues. I will set up a dummy version at my house if anyone is interested in helping. Also VOIP gurus are welcome too,
Thanks in advance,
Leigh
This is one of the nicest gestures I?ve heard in a while. I don't know of an organization that helps IT people find ways to volunteer their time. While every one of us wants to help, we need to keep in mind that any charity, that wants volunteers, NEEDS to obtain help from some one that?s been trained, or has experience, in the volunteer needs they have. Let me provide an example. If a charity needs people to volunteer their time in a book keeping capacity, like maybe someone that can track donations, they shouldn?t be allowing some one that doesn?t have ANY experience or training to perform that task, UNLESS the charity offers the training to the volunteer. I believe some of these organizations do run on a shoe string, or run inefficiently because they?re not taking to the time to utilize all the resources they have to locate the right people for the positions that run the operation of their organization. The operation of a charity should be no different than a business. You?re intentions are EXTREMELY good, however, I would love to hear that you will be seeking out volunteer work that utilizes YOUR expertise for the charity, not build your expertise at their expense. I encourage you to locate a charity that can use what you already know, I believe they will benefit more from your efforts. Best of wishes to you in finding your way in ?a life of giving?. And thanks for sharing your story here. You?ve inspired me to look into what I can give. :o) Don?t forget to let us know how this turns out for you!
by joa_farore
by dr. tarr
Wow. Could you please forward this blog entry to who ever designed the TR site? After I copied and pasted the entry onto Word so I could get the font large enough to read, I decided that I needed to have the web designer who maintains my site read the entry, maybe he will understand the way you wrote it, because he sure doesn't seen to understand me! Oops, there is that session ID you talked about in the URL I copied and pasted, If this site had a built in "forward this article" feature I could use that, I guess I could forward the word document I pasted to to get the font large enough to read, but I really don't like doing that. I guess I'll send him the URL, and if he isn't smart enough to figure it out its time for a new web designer.
Oops, I just realized that the URL I was copying was the one from the comments editor page. The actual blog page does not have a session ID. My bad.
As I type this I notice that the icons at the top ot the edit window are reloading every time I hit a key. What's up with that?! I'm sure glad I have a really fast connection, that could get real annoying at 28.2.
EDITED - Added Information
by jasonbunting
by justin james
Jason -
If you honestly beleive that Web usability has a low ROI, I suggest you check out my post "You do NOT Need to Cut Off Limbs to See a 286% Sales Boost". Yes, many of these are "common sense". However, "common sense" is pretty rare, especially when the IT industry is in the grip of massive groupthink. It seems to me that the vast majority of designers are stuck on a few concepts which seem to "look cool" but in reality lower usability, and therefore kill profitability. If you are using a quality CMS system (they are also quite rare) or even just making an HTML template, it is not hard to follow these suggestions. In fact, my experience has been that it is easier to let a Web site flow and adjust to the user's environment, than to attempt to force a particular layout in all cases. If you cannot have a Web design which does not require horizontal scrolling at 800x600, I suggest you re-evaluate your design. Web designers have been creating great looking designs which work quite well at 800x600 for well over a decade now.
To other comments, thanks much for your feedback. Wesley, I know that the TR site has some issues. These are outside of my control, but I know that the TR staff is extremely responsive to user feedback. If you make your thoughts heard to "those that be", and enough people do, I am sure they will at least take it into consideration. I too experience the "buzillion image downloads with each keystroke" problem, so I am forced to write blogs in Word and copy/paste to the blog, then strip Word's bad HTML. That is not a good solution at all.
J.Ja
by justin james
I am certainly no hardware expert, but for whatever reason, I think we lost something in the world of computers when we went to a purely binary world of computing. Maybe I have just read Destination: Void by Frank Herbert one too many times. But something inside of me is just nagging that a system of many parallel circuits performing identical functions, but that allows some randomness to occur, could be incredibly useful, particularly in the field of Artificial Intelligence. Any kind of randomness would be fine, whether it be slight delays in processing by some circuits, slightly inaccurate results due to minor differences in physical state, or even just random interference from stray EMF radiation.
Why do I think this? It is because I believe that making mistakes is a crucial function of the human learning process. Until one makes a mistake, it is impossible between understanding and the repetition of memorized information. Currently, with binary computing, all "intelligence" is simply a form of memorization. The computer is handed a set of initial patterns, and some rules to build new patterns, and it is supposed to "understand" linkages between abstract concepts. But since the programmer is giving the computer the rules to making new patterns (even if those rules are patterns to develop new rules for pattern generation), the computer is ultimately tied to the programmer's inherent biases and concepts.
What I envision instead is a tabula rasa of hardware, with some sort of input mechanism giving the computer access to data feeds (camera data, audio, keyboard, or whatever), a simple output mechanism, and a mechanism to display approval or disapproval of the results. It is up to the computer to reprogram itself in a method that avoids disapproval at the very least, and seek approval. In a nutshell, we create "pain" for making a mistake, and "pleasure" for success.
Why the tabula rasa? Because that is how human minds start. Humans may have an instinct for language like any other animal, but the language itself is undefined. There are language portions of the brain, but no particular language is needed, thus the proliferation of languages all over the world. It is quite interesting to note that certain cultures reflect themselves in language, but even more interesting that language itself affects the way in which people think. I believe that this is because language imprints patterns upon our thought, and our thought tends to follow those patterns.
Underneath it all should essentially be a massive pattern recognition system that the computer can rewrite as it sees fit, possibly in a method of evolution with some random mutation thrown in for good measure. Hopefully, many of these systems can be networked together in a less than perfect manner, so that they may swap patterns, but the communication system would occasionally alter or even completely corrupt the pattern. It would seem to me that the transmission of mutated ideas could help spur additional evolution of the pattern system.
I think that a good beginning of this system would lie in evolutionary game theory. Current techniques involve establishing set strategies in advance; this system would develop its own strategies. The evolutionary game itself would provide the reward and punishment system. I think many techniques from functional programming may be used for such a system. Overall, I think it would be an absolutely fascinating project. In my mind, I feel that this type of system could be used for a wide variety of tasks. Often in data, it is the exceptions to the norm (outliers) that are the truly interesting piece of information. If you are a police detective, the lives of the average citizen are not of much interest to you, but the behavior of a small segment is much more important. This kind of system would be excellent at finding the exceptionally interesting data.
Another great use of this kind of system would be to replace the folksonomy systems that are sprouting up everywhere. Folksonomy systems are a direct result of the fact that quality contextually relevant searching mechanisms are incredibly difficult to program. I have a major problem with the "tagging" trend, which is the same problem I have with Wikipedia. Only the truly enthusiastic bother to do it consistently, and the truly enthusiastic (or worse, fanboys) are not very reliable because of their enthusiasm. Just like it is very difficult to get good information about any OS thanks to the fanboys and zealots, I do not like the idea of using tagging or folksonomy to generate metadata. A system that is capable of generating its own contextually relevant patterns would be excellent at this.
If you have any ideas on this subject, I would love to hear them. Pattern matching is one of my personal pleasures (I drive my friends nuts with high-speed association games), and AI completely fascinates me.
J.Ja
by mark miller
I'm inclined to agree with you that AI is easier to achieve using analog technology instead of digital. Some of what you describe about creating learning systems that learn from mistakes has been achieved with neural networks on digital systems. I took an AI/philosophy course in college and we covered the different experiments that have been done. One of them used the rote memorization method, which at that time was regarded as a failure, because it lacked flexibility. The theory was that if you give an AI system enough basic information, it will build up "common sense", and be able to build more and more of its own inferences from that. One of the examples I remember from it was a lesson in history, "President Lincoln died in 1865," the machines owner told it, and, "Lincoln is still dead." This concept is like "Well DUH!" to us, but apparently it hadn't gotten the idea that if someone dies, anyone, that they're always dead after that. In fact, there were more examples of this. "President Kennedy died in 1963," and, "He is still dead." It was able to draw its own inferences, and ask questions based on what it had been given. Once I saw that it didn't understand a basic concept like death though, I knew that approach was not going to do the job.
I remember hearing about an early experiment in neural nets, and it drove home the lesson that you have to be careful what the machine is actually learning. It was being done as a military experiment. A neural net was shown a series of photographs of tanks. A tank in the open. A tank hidden in some brush, etc. I believe they also used some "control" pictures with no tanks in them. It was also an experiment in machine vision. They thought they had trained it, and decided to test it. It failed miserably. They even showed it a picture of a tank out in the open and it didn't recognize it. The "training pictures" were all of tanks on a cloudy day. The pictures had a darker hue. The test photographs were done on a sunny day. It turned out all the machine had learned was how to distinguish a picture taken on a cloudy day, and ones taken on a sunny day. It may have recognized tanks (I can't remember), but only the ones in the "cloudy" pictures.
I can't remember where I saw this, but it was pretty neat, and it was a few years ago. An inventor had created these bug-like machines that were very simple, and only a few inches long. He used analog technology. All they did was walk on 6 legs, but they could do it over any terrain. He also said that he thought the AI community had made a mistake by pursuing digital technology, because the brain is an analog computer, as are the brains of all animals. He showed how adaptable they were by taking one of the "bugs" and bending its legs in odd shapes. He put the machine back on the ground, which was grass and leaves, and within a minute it had learned to walk again on its misshapen legs. He believed that we needed to take the same approach as evolution: go from simple "organisms" and work our way up to more complex ones, as we learned how to make each class of AI machine work.
What may be implicit in this approach is doing away with the idea that's long existed in the AI community that AI is an emergent property. Network enough computers together, throw enough computing power at it, and intelligence will just naturally emerge. He was saying that we humans have to learn what makes nature tick before we build a brain that's as intelligent as we are.
And yes, I agree that one of the properties of intelligence that I think we as humans would best recognize is learning as a result of making mistakes. Learning systems that are not allowed to make mistakes are inflexible.
by justin james
Mark -
Thanks for the great feedback! I saw those bug machines too! I remember it very well, because only a few days earlier, I had seen something from Daniel C. Dennett about how he was looking for something just like this, so I called him on the phone and talked to him a bit about it. After a bit of manual research (why are even within-site search engines so bad? I had to browse past issues to find it), here is the link to the article I had read: http://www.smithsonianmagazine.com/issues/2000/february/robots.php
That should get you started. :)
J.Ja
by fbuchan
Before pursuing AI, we might hope our species tries to prusue RI (real intelligence), because even if we wanted to go the AI route, some RI behind it might guarantee we produce something that can reason without our mutitude of flaws. Then again, as a stick in the mud, I'm still convinced these mechanical objects are just tools, and not some subtitute for human companionship.
To be fair I see the value in "reasoning" machines, but "artificial intelligence" is a fantasy, because to achieve it requires we understand "intelligence" itself. We evidently can't achieve that understanding, as we have no objective measures of it that have reliable metrics in the real world, so how ever would we achieve an artificial representation of something we can't even collectively define?
by mjd420nova
I can't imagine a day with out analog capabilites. I need to have a variable life. Not just good or bad. My home exists for analog. Each room is rigged with infra-red devices that can read analog levels, otherwise the intrusion alarm would go off everytime the cat entered a room. My wall outlets are setup with analog readouts of current loads, with limits set to prevent overloading. The thermocouples read temperatures, not hot or cold. Without analog I'd be lost. My motion sensors would be going off all the time, I can't confine the children to one room, you know that's impossible. With my smart home, I can come home from work, review the event log and see when the kids came home from school, where they went in the house, even if they went to the refrigerator and opened the door and for how long. I can see if the turned on the TV before finishing their homework. I can see every room they went into, what devices they turned on and even any deviations from the normal, such as trying to plug in the hair dryer in their bedrooms. Anyway, it won't work in there, the limits are set much too low and will cut the current if the limit is exceded. The toaster only works in one outlet in the kitchen and the hair dryer in one outlet in the bathroom. The central air system reads temperatures and humidity in each room and can adjust the heating/cooling to remain within set parameters, same for the humidifier/de-humidifier. ON and off won't cut it and would result in wild fluctuations and a utility bill through the roof. A complete home control system must be analog and the event/result formulas are rather logical but subject to many variables.
Here is a low-speed association. You missed something when you admit to tabula rasa (blank slate) as the fundamental a priori state of a human being. There are two other possible states: intrinsically good, and intrinsically evil. Pain/pleasure contol loops applied to a sufficently fine mesh are how we train our dogs. They obey, but they do not distinguish between good and evil. We do. We set the standard for the application of pain/plesure. We are the ones who bit the apple. If you want your machines to so decide for themselves what is good and evil take your lesson from Eve. Finding themselves naked do not be suprised if they disagree with your relative concepts, pull you down from empirical heaven (decide you are evil), and author their own gods (standards). History or myth? Can myth repeat? You will be foreced to impose a some sort of babylonic skism of languages to keep from being overrun. A tagging system or something. Strange how we seem to be going in circles at warp speeds. "Were a goin nowhere mighty fast Captn." (Scottie). It's a big loop, but its still a loop. Here we are again at a decision point. Check your metadata. You may have a core fault. The fault may be etched on the chip (tabula) and not an app or OS issue.
by justin james
AntiTechnoTechnoWeenie -
Bringing up the idea of "intrinsically good" and "intrinsically evil" as a concept of state, as opposed to properties or attributes, is an extremely risky proposition. First, you presuppose the possibility of "intrinsically good" and "intrinsically evil" states. This rests upon the concept of "good" and "evil". Assuming that there is such a thing as "good" or "evil", here is why your logic is not valid:
You are trying to show that sometimes humans make decisions that take into account "good" and "evil" at the expense of purely rational decisions. For example, "I want to rob that house and I know I will not get caught, but to do so would be wrong." However, this is faulty logic, and I will show you why:
J.Ja
by justin james
In April, I touched on the topic of "Geeks and Communications Skills." Reading through some of David Berlind's (over at ZDNet) recent blogs about poor customer service via call centers, I am following up my original post with this series. This series refers specifically to communicating with call centers, a potentially unpleasant task that most IT professionals need to deal with on a regular basis. This post discusses how to get maximum results from a call into the support hotline, and the next post in the series will show how to provide quality phone support.
Getting quality support over a phone for a technical matter is not the easiest thing in the world to do. As someone who has been on both sides of the phone call, I know that it can be frustrating both to get help and to be helped. As IT professionals, making contact with phone-based support is part and parcel of our jobs, and it is inevitable. Chances are, when you are calling the support hotline, you need help now, all too frequently with a mission critical problem. While we should not need special skills just to deal with phone support, it is the unfortunate case that without being prepared and knowing how to effectively communicate with call centers, it is hard to get the best support possible.
Be prepared before calling
If at all possible, have any relevant logs or error messages handy. Telling the technical support person "it told me something about an interrupted communications with something or other" is not going to help them resolve your problem. Have the exact error message (particularly any error code or status code numbers) will cut the time needed to get help significantly. Also, make sure that you have a paper and pen on hand, to take any pertinent notes. If the problem is with a piece of equipment in another room, have a way of "walking and talking," and make the call from a cell or cordless phone if possible, in case "hands on" troubleshooting is needed. For pieces of equipment like networking gear or headless servers, make sure that you have a laptop and the correct console cables nearby. If you have to put the support technician on hold for ten minutes to dig for your tools, you are not helping the call go well at all. And of course, always have the serial number and support contract number, or previous ticket number in your hands before dialing the phone; many support technicians must reject your call, even a "quick question" without that information.
The first few moments
Make sure to get and record the technician's name (as well as the spelling) or ID number as soon as they answer the phone. Also try your best to pronounce the technician's name correctly. Do not be dismayed if the technician requires full details on you and your unit even if it is a brief question, this is the process that the support person is required to follow. If the technician sounds harried or insincere with their greeting, let it slide. Chances are, the technician is harried, and it is difficult to make "good afternoon" sound genuine when it is the 78th time you have said it that day. Keep in mind that you are calling to get technical support, not exchange pleasantries with a complete stranger. When the technician asks "how may I help you?" do not tell a long story. Describe in as few words as possible what the immediate problem is. The technician will determine if they need to hear about the preceding events. Here is an example:
WRONG
Technician: How may I help you?
Customer: We got this unit about seven months ago, I think we bought it from a place we found on the Internet, but it may have been through our local reseller. It has worked great up until a few days ago, but lately it has been a bit flaky. It was making some odd noises like the noise my brakes make when the pad is worn out, and I think I may have smelt something strange in the server room near the unit, but the other technician who works in the server room did eat chili that day, so it might not have been the unit making the smell. Well, today it was down, and when I powered it back on, it sent me an email about having a bad hard drive in it.
RIGHT
Technician: How may I help you?
Customer: The unit was not powered on this morning, and when we powered it up, it sent me an email about having a bad hard drive.
Technician: Did you hear it making any strange noises?
Customer: Yes, it make some grinding and clicking noises yesterday.
Technician: Yes sir, that is definitely a sign of a bad hard drive. I see that you are still under warrantly for parts and I will be delighted to get a replacement drive sent out immediately. Are you able to access the unit's Web-based administration system so we can find out which drive is bad?
See the difference? The first conversation fed the technician a lot of information that seemed relevant to the customer, but was not relevant to resolving the problem. The second conversation was short and to the point. By the time the first customer got done telling his, the second customer was nearly finished with getting a replacement part.
Respect the technician
When calling into technical support, always be respectful the technician, no matter how frustrated or upset you may be. Remember, the support technician did not cause the problem, create the design flaw, write the manual, write the code, assemble the hardware, perform your configuration, or have any other part in the problem when you call in. They are there to resolve your problem. If you vent your frustrations on the technician, they are going to quickly put you in the "jerk customer" bucket and the quality of your support will likely reflect that. The technician who may have been willing and ready to go the extra mile or provide support above and beyond contractual obligations will barely meet the bare minimum if you are abusive to them. Under no circumstances should you use foul language or raise your voice.
WRONG
Technician: Thank you for calling Servers Express, my name is John. May I please have the serial number of the unit?
Customer: Sure, the serial number of this piece of junk is I-A-M-B-R-O-K-E-N, I mean, 55-66-1212. Listen, this thing is the worst purchasing decision I ever made. Just get me my money back and I won't have to drive over there and knock some skulls.
Technician (rolls his eyes, puts the phone on "mute" and curses the day his was born, then take the phone off of "mute"): Sir, I understand that you are frustrated and upset, but I am here to help resolve your problem. However, I will request that you not be abusive towards me. Let's try to resolve the problem first, it may be something simple that can be immediately resolved. I am here to help you sir, and if a refund is needed, I will be happy to help you with that.
RIGHT
Technician: Thank you for calling Servers Express, my name is John. May I please have the serial number of the unit?
Customer: Sure, the serial number of this unit is 55-66-1212. We have been having a lot of problems with this unit, and I would like to work towards getting a refund.
Technician: Sir, let's try to resolve the problem first, it may be something simple that can be immediately resolved. I am here to help you sir, and if a refund is needed, I will be happy to help you with that. Could you please describe exactly what the problem is occurring, so that I may determine if I am authorized to get you an immediate refund?
If you feel that the technician is not treating you with due amounts of respect, do not yell or curse, request to speak to their supervisor. If the call heads south, do not hang up and call back in hoping to get to a different technician, get the supervisor on the phone. Most call center employees need to work very closely together, and are in close contact with each other to find out what happened on a call or to ask each other for advice. This also means that when you call back in, the next technician you speak to is quite likely to be already aware of the argument that you have had with the previous technician, and is now expecting confrontation. Also remember that the notes in the ticket often contain more than just details of the technical problem. A good support technician immediately documents any kind of problem with the customer and alerts their supervisor (whether or not they are truthful is a separate matter) when a call goes wrong. This means that the ticket notes may have a warning such as "customer was extremely abuse and dropped the call" in them. Finally, keep in mind that you do not have to enter every fight that you are invited to. Again, if the technician is indeed being rude or abusive, you simply need to request to speak to a supervisor. After all, you are a customer.
It is also important to remember that the technician is doing a repetitive, thankless, and probably underpaid job. That technician spends eight hours a day taking phone calls from people who vent their anger on the technician, who do not have the technical knowledge to be trying to resolve the problem, and has a boss breathing down their neck about "hold time" and "average talk time" and "average number of escalations." In addition to handling your phone call, they may be simultaneously trying to help their fellow technicians via email or instant message, as well as supporting some customers through email or online chat. Although that is no excuse for the technician to deliver less than excellent service, it is something to keep in mind when talking to the technician.
Also keep in mind that the technician frequently has a script or process that they must not deviate from. If the technician gets away from that script or process, and there is a problem, they are the ones who get in trouble. Support technicians quickly learn that they keep their jobs by following the script. If the technicians will not budge from the script or process, do not blame them. That does not help you at all. If it is obvious that the technician's script or process prevents them from helping you the way you need to be helped, request an escalation to a higher level of support or to speak to a manager, depending upon the problem.
Stay focused
For a variety of reasons, try to stay focused on the problem at hand. Many outsourced call centers get paid by the ticket. This means that when you roll four different problems into one ticket, they are losing money. In fact, some call centers will request that if you have any separate issues, you must call back in. If this happens, do not get angry. Remember the technician is just following the process and procedures laid out for him by his management. Instead, write a letter or email to customer service complaining about this policy. Also remember, when you pack many issues into one call or ticket, the notes get very confusing very quickly, and follow up calls will take longer than needed since the technician who answers the later call will need to wade through pages of notes about related issues. The support technician's performance metrics suffer when you put them on hold to answer a call or chat with your boss or otherwise stray from resolving the problem. When the technician is worried about their boss coming over to find out why they have been on the phone for so long, they are not thinking about helping you anymore, they are thinking about ways to get you off the phone.
Personally, I have been in situations where I was supporting a NAS device over the phone, troubleshooting a frame relay connection on the computer, clearing and investigating SNMP alerts, helping other technicians via IM, emailing customer service to have an RMA filled, and writing documentation regarding tape drives simultaneously, while being the only technician on staff and not having had a bathroom break in nearly three hours. The technician is doing more than talking to you on the phone, so try to be respectful of their time.
Know the lingo
Call centers have a unique language all to themselves. Knowing this jargon helps significantly in resolving problems and smoothing the call. It is also extremely helpful to know the "military alphabet" for spelling out words.
Escalation: Referring the call higher up the chain. A call can be escalated on a technical level (involving a more experienced technician for a hard to solve problem) or the business level (involving a manager or supervisor in order to request something outside of the process or contract).
T&M/Time and Material: When service outside of the contractual obligations is requested, it is a "T&M Case," meaning that the customer is responsible for paying any labor or parts charges involved in the resolution. If you are told that a service request is under a T&M basis, find out what the T&M charges will be before authorizing service. T&M charges can be surprisingly high, and there is often a minimum charge as to the number of labor hours, regardless of how long the repair actually takes.
RMA: Return of Material Authorization, the process (as well as the ID number) of getting a replacement part sent.
Advance RMA: Most RMA processes will not send a replacement part until they receive the defective part. An advanced RMA allows the company to ship the replacement part before receiving the defective part. This often involves putting a hold on a credit card for the cost of the part for a period of time which will be charged to the card if the replacement part is not received within a certain amount of time. Make sure that you clearly understand the exact terms of an advance RMA before agreeing to it. If you require a replacement part immediately, ask if an advance RMA is possible, even if the technician does not tell you about the option for it. Many companies have an advance RMA option that they do not widely announce.
Supervisor: Be very careful when requesting to speak to a "manager." A technician may be truthful in stating that a "manager" is not available, meanwhile a "supervisor" is sitting right next to them. When escalating a call for business reasons or to lodge a complaint, request a "supervisor," not a manager.
Technical Lead: A support technician within that level or support with more knowledge and experience than the average technician, but not at the next level of support. If you have requested an escalation for technical reasons and are told that they will call you back or they are unavailable, try requesting to speak to a "technical lead." They may not be quite as knowledgeable as the next full level of support, but they may know the answer to your problem.
Level X: Most call centers have three tiers of technicians: Level 1, Level 2, and Level 3. Level 1 technicians typically must stick 100% to a script, and often (but not always) do not know anything outside of their support database of common problems. The Level 2 technicians are much more knowledgeable, and they know things that are not in the Level 1 database. Sometimes Level 2 support is needed for particularly difficult or potentially damaging procedures. A call is escalated to Level 2 either because Level 1 is unable to resolve the problem at all, or because the procedure takes some time to perform and Level 1 needs to be available to answer immediate calls. Level 2 escalations often have a longer hold time than the initial call to Level 1, and frequently Level 2 will return your call instead of having you wait on hold for them. The Level 3 technicians are usually the highest level of support. They nearly always have direct contact with the engineering team or actually are members of the engineering team. If Level 3 cannot resolve your problem, chances are you will be getting a refund or full unit replacement. Because Level 3 problems are often "one off" issues or reveal an entirely new problem that has never been encountered before, it can sometimes take days or weeks to resolve a ticket that has been escalated to Level 3. My experience has been that Level 1 tries to cap a call at 10 ? 15 minutes, Level 2 tries not to hold onto a ticket for more than a few days, and Level 3 can take days or weeks to resolve a problem. Remember, the higher you go, the more difficult the problem is to solve. Some upscale contracts allow you to request immediate escalation to Level 2, or immediately direct your call to Level 2. Depending upon your needs and ability to solve minor problems yourself, this contract option may be perfect for you.
Technician Dispatch/Technician Roll: Physically sending a technician to resolve a problem.
Vendor Meet: Some problems (particularly networking issues) require a technician dispatch from more than one company. When this is needed, a "technician dispatch" becomes a "vendor meet" and the different companies arrange the arrival time of their technicians so that they all arrive at the location of the problem simultaneously. A vendor meet typically eliminates any response requirements, because each company has a different SLA with the customer. For example, if Vendor A's SLA is a 4 hour response time, and Vendor B's SLA is an 8 hour response time, Vendor A cannot be held to their 4 hour response time if Vendor B cannot arrange the vendor meet within 4 hours. A vendor meet though often carries its own SLA, where a vendor that is late for the vendor meet is penalized.
Response time: The amount of time that a technician has to arrive on site. Some contracts measure response time from the moment the initial call is placed, other contracts measure response time from the time at which it is determined that onsite service is required.
X by Y by Z service: This is a shorthand way of describing SLA obligations. "X" is the number of hours that service is provided (24 meaning all day, 8 or 9 meaning "9 to 5" or business hours only), "Y" is the number of days (5 for weekdays only, 7 for all week long), and "Z" is the response time. A "9 by 5 by 4" contract means that the response time is four hours from the time of call in during business hours in the week. A 7 day contract typically requires service on holidays, while a 5 day contract typically does not count holidays as days of possible service.
Military alphabet/phonetic alphabet: Alpha, Bravo, Charlie, Delta, Echo, Foxtrot, Golf, Hotel, India, Juliet, Kilo, Lima, Mike, November, Oscar, Papa, Quebec, Romeo, Sierra, Tango, Uniform, Victor, Whiskey, X-Ray, Yankee, Zulu
Being transferred
All too often, your call needs to be transferred to someone else. A common problem is that a transferred call gets dropped. Especially during a call that has been less than perfect, it is tempting to think that the technician dropped you entirely. This does indeed happen on occasion, but it could be any number of problems. Sometimes the person on the receiving end drops the call when they pick up. A frequent issue in a call center is that a call is in the queue, and a technician goes to hang up a call that they are on. Just as they push the button to drop the call that they are on, the customer drops off and their phone automatically picks up the next call. As a result, instead of dropping the finished call, the drop the new call. Although this can be very frustrating, particularly if there is a long hold time, this can be a less frustrating situation if you get the direct contact information for where you are being transferred to before the transfer attempt is made. Never assume that you were dropped on purpose, no matter how bad the call may have been. For the years that I worked at call centers, I only met a small number of technicians that would deliberately drop calls. Since the phone system would record how the call was ended and by whom, after more than one or two customer complaints, they were terminated. If your call is dropped more than once (especially if it is by the same technician), request to speak with a supervisor immediately; you may have hit upon the bad apple in the bunch.
Ending the call
At the end of the call, do not forget to thank your support technician. If you were particularly impressed or disappointed with the level of service you received, request to speak to a supervisor and make your thoughts known, or send an email to customer service. Kudos to technicians is particularly well received, as it is rare that a customer lets the company know of a job well done. Appropriate compliments on service to a supervisor have a funny way of percolating through a call center, helping to ensure top-flight service in the future. If you are given a ticket number, do not forget to write it down, even if the problem is resolved. It is always easier to refer back to a previous ticket for a recurrent problem than to try to describe something that happened weeks or months ago, if the technician needs a full history of the problem.
Following up
Some tickets, particularly chronic problems, may require follow up. If the technician said you will get a call back, and you have not received one, do not get mad or panic. They may be under unusually high levels of calls that day. Simply call back and let them know that you were expecting a callback and did not receive it yet. If you repeatedly do not get a call back by the promised time, escalate the call to a supervisor. Repeated failure to call back is unacceptable, regardless of contractual obligations or reasons for the failure. If the technician provided you with an email address to send log files or other troubleshooting information, do not treat this as your direct pipeline to that technician! That technician may no longer be on duty, or may be unable to accept support requests via email. Try to make follow up calls through the same path (online chat, email, phone, etc.) as the initial contact; some companies separate different groups of technicians that may not be as familiar with your problem, or may not even have access to each other's systems. If a ticket has been referred or escalated to another group, find out how to contact that group directly if possible. Following up with Level 1 for a call that has been escalated to Level 3 or talking to Level 2 to get the status of an RMA just wastes time.
I hope these tips help you to get the best possible support from a cell center! My next post will provide advice for call center technicians looking to provide the best possible support for customers.
J.Ja
by amar_prus
Amazing IT Support details the article is very helpfull to any Online Support IT Pro.
Great Work,Keep it up.
by justin james
In April, I touched on the topic of "Geeks and Communications Skills." Reading through some of David Berlind's (over at ZDNet) recent blogs about poor customer service via call centers, I am following up my original post with this series. This series refers specifically to communicating with call centers, a potentially unpleasant task that most IT professionals need to deal with on a regular basis. The previous post discussed how to get maximum results from a call into the support hotline, and this post in the series will show how to provide quality phone support.
Call centers are an entry point into the IT industry for many people. Although my time at a call center occurred well after I had entered IT, it was still a great experience for me. Some of the most rewarding jobs I have had over the years involved direct customer contact for a full eight hours a day. However, delivering quality customer service, particularly trying to assist a user with technical problems over a phone, is a difficult art to master. These tips should help the call center employer (or anyone trying to assist a customer over the phone) to deliver the best help possible.
Answer the phone properly
A proper phone greeting should include a greeting, the name of the company, the precise department that the customer has reached, and the support person's name. It should be as sincere as possible. Treat every call as the first call of the day, and remember that no matter how difficult the last call was, it has nothing to do with the current call. The standard greeting I have always used was, "Hello, this is XYZ Technical Support. My name is Justin, how may I help you?" Although the script for that company suggested that I ask for the serial number first, I discovered (after much experimentation) that my greeting let the user know that I was there to help them, not to tie them up with process. After the user gave me a brief explanation of their problem, I would then request the serial number. If your company allows you a bit of freedom with your greeting, try this out. Your users will tend to be more pleasant to deal with if you greet them like this.
Empathize with the user
When a user calls technical support, they frequent are overcome by a feeling of powerlessness. They may be embarrassed that they cannot solve the problem on their own, or that their job rests upon a successful resolution of the problem. I have literally heard grown men break out into sobbing tears on a support call. To compensate, some users will attempt to direct the call, or refuse to follow directions. Other users try to pump up their egos or impress you with their wisdom. I have had callers repeatedly brag about their Cisco or Microsoft (or whoever) certification; meanwhile their problem is extremely basic. While it may be tempting to ask them "if you are so smart, why are you calling me?" do not do it. You have the information needed and the process established to help the user, and it is up to you to direct the call. You need to quickly establish this with the user by asking pertinent questions up front. Once the user sees that the questions you are asking will solve the problem, they are happy to follow along. It is very rare to have a caller refuse help once you have demonstrated that you can actually help them. But always keep in mind that the user feels helpless. Do not embarrass them or make them feel little, but show in a kind and gentle way that you are there to help, but only if they let you help.
Respect the customer
Keep in mind that by the time the user calls you, they have probably been trying to solve the problem themselves. They made be under the gun with a tight deadline or a mission critical problem. As a result, users often sound harried, tense, or may be terse or short with you. They may even take out their frustrations with your company, the product, or your co-workers out on you, and act as if you are the problem. Let it slide. The last thing you need is to be in an argument or abusive to a customer because they are having a bad day. Your job is to put a smile back on their face and resolve their problem, not to dictate to them a lesson in manners.
Of course, if a customer is extremely rude or abusive, such as using foul language directed at you personally, you have the right to politely request that they calm down. I have found it helpful to remind them that I am not the unit, the company, or the other support technician who was not helpful. One example of an effective phrase to do this is, "Sir, I understand that you are frustrated and angry right now. But I am here to help you, and it is difficult for me to do that if you are abusive to me. If you would like, I can transfer you to my supervisor who may be able to help you." By doing this, you have put the ball in the customer's lap. They can either calm down, or they can speak to your supervisor while you help the next customer. But you cannot assist the user if they insist on insulting you.
Another aspect of respect is to learn the customer's preferred name, to use it frequently, and to pronounce it correctly. When the customer gives you their name, always refer to them as "Mr. [Last Name]" or "Ms. [Last Name]" unless they request that you use their first name. Never refer to a woman as "Miss" or "Missus" unless you distinctly hear them say that; "Ms." Is the appropriate prefix for woman of unknown marital status. "Sir" and "Ma'am" also go a long way towards being polite and respectful. If you have accidentally confused a "Mister" with a "Ms." or vice versa (it happens quite frequently, especially for men with high voice or women with low voices, and a gender-ambiguous first name) and they correct you, simply apologize and make sure that you do not repeat the mistake. Using the customer's name is important on many levels. It shows that they you are treating them as an individual, not as a nameless, faceless voice emanating from a telephone. It also lets them know that you are paying close attention to them. Be wary though, if you mispronounce the customer's name, you are letting them know that you are not paying attention. If they have a difficult name, repeat the name and ask them if you have the pronunciation correction ("Mr. Wick-cow-sky, is that correct?"). My experience has been that customers really like this level of personalized treatment.
No matter what happens, never, ever raise your voice to a customer or use anything less than polite, respectful language. If the customer is in a loud environment such as a server room, there is a way to your raise voice to be heard and still sound pleasant, and a way to sound like a grouch when raising your voice. Learn the former. If the call is getting "too hot for comfort," it may be time to involve your supervisor, or possibly place the user on hold for a few (very brief) moments to take a deep breath before getting back onto the call. For particularly angry customers, I found it helpful to have my supervisor jack into my phone to monitor the call on the spot, or be by my side, so that they were available if needed. This also allowed my supervisor to directly hear what was going on, so that if a complaint or a problem arose, it would not be my word against the customer's.
No matter what the caller sounds like, never, ever mention their accent. I cannot stress this enough. While I do not advocate lying to a customer, "Sir, could you please speak a little more slowly? It is very loud in here at the moment," will be taken much better than, "Sir, I have a hard time understanding your accent. Could you please speak slower?" Many people may not speak your language natively, or may be from an area with a different dialect of your language. If one is available, ask the user if they would prefer for you to get a translator on the line. Many people who do not speak a language natively are very self conscious about their accent. To bring it up is impolite at best, and quite offensive at worst. Just about the worst mistake ever made regarding accents was offering to get a translator on the phone for someone from Scotland. I simply could not understand the Scottish accent at all, and I thought that maybe Scots had a regional language (like Wales). Boy was I wrong! The only thing that saved me on that call was that it was an internal call, and it was still rather difficult to smooth it over after that.
Learn the customer's lingo and use it
Each call center has its own subsection of the English language, a combination of product-specific words and phrases as well as regional sayings. However, your customers may be from all over the country or even from all over the world. They are not steeped in the culture of your company either. So if the user calls the device in question a "doodad" and your literature calls it a "widget," just call it a "doodad." Similarly, if your user says something along the lines of "power cycle," say "power cycle" not "reboot." Adapting to the user's language allows you to communicate more effectively. If you work at a call center long enough, you pick up bits and pieces of different regional phrases. Feel free to use these, as long as you do not sound like a pretender or like you are mocking the user. I worked in one call center where we dealt with a large number of people in Australia. One of my co-workers would do his best version of "G'Day mate!" in an exaggerated Queensland accent (think Paul Hogan). Not only did he sound ridiculous to begin with, but the callers were typically in New South Wales and had an entirely different accent. Most of them did not find it particularly funny; they thought he was making fun of them.
Pick up on the user's mood and match it
If your customer is laughing and joking, it is OK to be a bit lighthearted. Do not take it too far of course, of make any type of even potentially offensive jokes, of course. On the other hand, if the user is being a bit down, or is upset, or is all business, then you should be 100% professional. Someone with a lot of pressure on them to solve a problem will treat your lightheartedness as you not taking the problem seriously. Even if the call is in a moment of "down time" like during a unit reboot, filling the silence with small talk is not appreciated under those circumstances. The happy shiny customer, on the other hand, will most likely be happy to exchange pleasantries like "how is the weather?" or "I have never been there, what are some good places to visit if I ever get out there?" But remember to always be professional.
Be sincere, honest, and upbeat
Whenever you open your mouth, make sure that your heart agrees with the words you are saying. "I am having a great day!" is an obvious lie when you grumble it, and the customer does not appreciate that. If you are having a lousy day, there are ways to be honest yet professional. "Today has had a lot of challenges, but I learned some great things," is a lot better than, "I am looking forwards to the end of the shift." On that note, never mention how long you have been on duty or if you are near the end of your shift. The last thing you ever want is to give the caller the impression that you are looking to get them off of the phone so that you can go home or take a break. The user is calling in to get help with their problems, not to hear about yours. They do not want to be talking to someone with a bad attitude either.
Always tell the truth to your customers. They have an uncanny ability to spot a lie, even over a phone. If you make a mistake, immediately correct it as soon as you know better, or admit to it if the customer catches it first. Along those lines, if a co-worker has given incorrect information to a customer (for whatever reason), be careful with how you correct the problem. "Well, I am sorry sir, but John is new and really is clueless," is not a very good way to handle this. "John may have made a mistake or miscommunicated what he really meant sir, I will let him know and make sure that he gets the correct information," is a much better response.
"This call may be monitored or recorded for quality and training purposes."
Unless you are working for a very small company, chances are that there is always the possibility that any given call may be monitored in real time or recorded. Treat every call as if your supervisor is standing next to you. That means always be polite, do not lie to your customer, and delivery the best support possible, on every single call.
Make sure that your ticket notes are accurate and appropriately worded
If the customer calls back, you want to make sure that your co-workers are able to quickly read the notes in the ticket and understand exactly what happened. If a questionable situation arose, make sure that you document why you made the decision that you did. "As per paragraph 1.X.a of the system manual" or "as per team lead Joe" are wonderful ways of covering yourself if a problem comes up later. It also lets the next technician know where you got the information from. On the other hand, the ticket notes should not be too verbose. When someone has to read four paragraphs of "he said, she said" just to find out that the network connection is down and a technician is being dispatched, you have been too wordy. When writing your ticket notes, ask yourself, "if this user called back, what information would I need to know to pick up where we left off?" The user who calls back will appreciate that you co-workers will be able to quickly and accurately understand the exact situation, instead of being put on hold forever.
Always give your users a wide range of options, and explain them clearly and simply
All too often, a major source of customer complaints is that if they had known about an option, they would have taken it. A common example is the advance RMA. Most users do not know about it, and accept the basic RMA policy. If they later find out that there was an advance RMA option, they may get upset because they would have preferred to use it. Always give your users the wide spectrum of options, but be sure to explain what they are as well. For example, "we also offer an advance RMA" is not nearly as helpful as, "if you require the replacement part sooner, we have an option for that as well." By giving your users options, they feel as if they are in control. When the user feels as if they were a crucial part of the success of the call, they are happy with the call.
Ending the call
Always try to end the call on a positive note, even if their problem cannot be solved. Remind the customer of your name, and thank them for calling. Like the greeting, it can be difficult to sound sincere when thanking you for calling in, but also remember that callers can detect insincerity quite easily. Even if the call was "challenging" (a euphemism for, "the caller insulted my religion and my mother, told me I was born out of wedlock, and ended up taking a blowtorch to the unit"), be polite until the very end. Especially when the user is upset or the problem could not be solved, any sounds or hints of displeasure on your end (even a loud sigh) will be interpreted as displeasure with them and they will react as if you are angry with them. Your job is to solve problems, not create them. Any negativity on your part will ruin the call. At the end of the call, always ask the user if they have any additional question or concerns, or if there is anything else that you may help them with. Never give the user the impression that you are trying to push them off the phone.
I hope that these guidelines help you deliver great customer service to your customers!
J.Ja
by chris_muncy
What a great article! This covers all of the major topics needed for any customer support organisation.
On a side note, would you allow me to share this with others in my group in a printed form? I think everyone would get something out of it.
Chris
by helpdeskguy
Agreed...would love to get this in print to give to my team!
Tony
by justin james
I'm really glad that you found the post helpful!
If you want to use this for your internal usage, check the C|Net/TechRepublic permissions & reprints page (http://www.cnetnetworks.com/editorial/permissions.html), it has the information you need. From what I can tell (I am not a lawyer), you need to ask permission to print the article in full, but I am not 100% positive (again, I am not a lawyer). Your best bet would be to contact C|Net/TechRepublic and just double check with them first.
Again, thanks for the kind words!
J.Ja
Excellent article. The ideas presented will work for smaller organizations as well. I believe that if the items discussed are given a little attention, any or all of them, that positive things will happen.
by justin james
I just finished reading a very interesting article ("The Lumi?re Project: Bayesian User Modeling for Inferring the Goals and Needs of Software Users") from Microsoft Research. Lumi?re was the name of the project that developed mathematical models of assessing the needs and goals of software users in real time in order to present users with accurate, relevant assistance as they worked. Does this sound like something that you think users would be interested in? I sure do!
However, after reading the Lumi?re paper, I may be changing my mind a bit. To understand why, we need to take a brief trip through time.
In 1993, the Lumi?re project began, and was initially shown to another team at Microsoft in 1994 (to tell you what team ruins the surprise!). That other team liked what they saw, and built a special version of one of their products that allowed the Lumi?re group to hook into it and begin showing how the Lumi?re techniques could improve the product.
During this period of time, teams of experts (primarily psychologists, from what I can tell) were set up to observe users in a sort of "Chinese Room" type experiment. Users were told that they were using an experimental system to help them work. The experts observed the users, but were not told what the users were trying to do. The experts tried to identify the tasks that the users were accomplishing, and then provide the users with relevant assistance. The way the experiment was set up, users were not sure if it was a computer or humans presenting the help, because they were isolated from the experts. This was done in order to understand what types of tasks were easily identified and for which of those tasks assistance would be helpful to the user.
Lumi?re users Bayesian networks of probabilities (commonly used in spam filters) to identify what the user is trying to do and what they need help with based upon their past tasks, takes into account the users' demonstrated abilities, levels of expertise, and historical "pain points." After determining the users' needs and goals (using a set of probabilities that age and become less relevant over time) through a variety of events (and non-events, such as idling the mouse over a menu option for a period of time), Lumi?re makes suggestions based upon what the user is most likely stuck on, or helps give them a shortcut to accomplish their goals faster, even if they already know what they are doing.
Does this sound familiar yet? It should. Let us finish the history of Lumi?re though?
The application development team was so impressed with the results of the Lumi?re/application integration, that Lumi?re was adapted to that particular application (and related applications) in a less advanced form. I am not sure if the full Lumi?re project was stripped down to meet shipping deadlines, reduce the system resource needs, or meet the needs of a broad user base, but much of its advanced functionality (including tracking and profiling users to determine individual skill levels) did not make it to the final product. Lumi?re powered what was probably the most hated feature in software history.
The application? Microsoft Office 97. Lumi?re's contribution? Clippy.
Maybe if Lumi?re was shipped in its entirety, and users knew that it could be "trained" they would have been willing to put up with it long enough to have it actually be helpful. I do not know, and trying to re-predict the past based on "what-if scenarios" and "just-so stories" is not very helpful. What is known is that Clippy was so universally hated that it is probably the only feature (definitely the only high-profile feature) that Microsoft has ever removed from a product that I can recall. In fact, when Clippy was left out of Office XP (aka Office 2002), it was actually a selling point in advertisements!
Before I read the Lumi?re paper, I had assumed that Clippy was some second-rate hack, or maybe not much work had gone into it. Lumi?re had been worked on for four years by a wide variety of psychologists, usability experts, statisticians, and a ton of other highly qualified and experienced experts. It was developed by the best of the best. From what I can tell, users in the Lumi?re testing group must have been very impressed by it for it to end up in the Microsoft Office Suite. But real-world users despised it. It was annoying. It impeded work flow. It was grossly inaccurate.
Personally, I wanted to love Clippy. I tried a number of times to leave him on. I always felt sad, after the first use of an Office application after installation, to see him blink his eyes and commit feature suicide when I turned him off. Then again, I am also a touch attached by the little puppy in Windows file search. I tried letting Clippy help me do my job. Clippy always made me miserable, and I think he made 99% of users miserable.
And this is why I am reconsidering my stance towards applications that anticipate users' needs. If all of the effort that Microsoft put into Lumi?re could not produce a system that was usable and workable in the real world, it is pretty hard to imagine being able to do it well at all. Granted, Microsoft Office is an incredibly complex suite of applications that get used for a wide variety of tasks, many of which are outside their intended purposes (Excel as a database system, Access for client/server applications, etc.). But I can imagine the difficulty and frustration of using a system which attempts to adjust itself to the users' needs on the fly. If it is less than 100% accurate, users will get mad and frustrated, and their lives will become painful, instead of the anticipation system making them more productive. That is the real lesson to be learned from Lumi?re and Clippy. User anticipation is a great idea, but only if it is perfect in its execution.
J.Ja
by mark miller
It was interesting reading about the history of Lumiere. It sounds like all they did was turn the project into a glorified version of their "Quick Tips" feature which they used to include in much of their user applications. Every time you'd start the application up, you'd be greeted with "Did you know..." followed by an informative message about a feature you may or may not have used yet. I always turned that off. It almost seems like putting "Clippy" in was a marketing decision. If I were an engineer on the project I think I would've recognized that the most important part of the technology was its ability to learn what the user might need help with. The thing with Baysian is I imagine each user would have to train it. That might be something that people who have work to do wouldn't want to put up with in the first place. I might have the patience for that, but I don't know if my mom (a tech neophyte) would.
Even when people need help it can take intuition to actually help them, something computers haven't come close to yet. Don't take this as sexist, but I've been around a woman who's overwhelmed by circumstances, life, etc., and if I took her complaints and cries for help literally, I would try to assist as she asked, but end up doing something she didn't want, making her more frustrated. What I have to do in these situations, though it's a challenge, is kind of ignore what she's saying, look at the situation, look at what she's doing, what might actually be the cause of her frustration, put myself in her shoes and see what I'd need assistance with in the situation, and then to try to step in and help, and hope that I'm being helpful (no guarantee there either). It may be something she didn't specifically ask me to do at all. People who are comfortable with computers will understand the linear way a computer goes about things, and they might have more patience for the kind of help that a Baysian system might try to offer, even if it's a bit off. There are some people who are uncomfortable using computers to begin with. I imagine they would have little patience for a help system that makes mistakes in perceiving the need for its help. They'll also tend to do things that are unconventional. People who are comfortable with computers understand that an application only understands what's going on because it forces its user to conform to certain rules in interacting with it. I've seen people try to get around those rules and do things their own way. They get the job done, but the help system could easily get confused about what they were trying to accomplish, because it would assume that if you're trying to accomplish a task, you're going to conform to its rules for doing it. It would be a real challenge for it to look at the form of what's been accomplished so far and figure out, "Oh, I see. You're trying to do X."
Personally, one of the things that's often annoyed me is the kind of autohelp or autoformatting features that Word turns on by default. Things like if I start a numbered list, it automatically starts using its default formatting for numbered lists. Sometimes this is fine with me, but other times it just messes up what I was trying to accomplish. I try to turn as many of those things off. You would think that auto-capitalization or auto-spell-correct would be helpful, but I've run into many situations where that has messed up what I was trying to do. I think one feature they have, which I'm fine with, is taking situations it would normally auto-correct and just flag them as potential problems in the document with little squiggly lines of various colors. It's unobtrusive and allows me to continue, with a little "string tied around my finger", to remind me that this may need to be addressed later. I'm fine with that. It gives me the option to have it correct them, or not.
by snoopdoug
by grantwparks
"If all of the effort that Microsoft put into
Lumi?re could not produce a system that was usable and workable in the
real world, it is pretty hard to imagine being able to do it well at all"
So, to translate, "if MS couldn't do it, it probably can't be done".
Hahahahahahahahaha!
Their people are no smarter than any other organization's. It's a reasonably widely held opinion that MS doesn't sell a single best-of-class product. In some cases they've turned out products that are a horror to develop with.
by mx6ls
by justin james
In response to the idea that "if Microsoft cannot do it, no one can..."
"Their people are no smarter than any other organization's. It's a reasonably widely held opinion that MS doesn't sell a single best-of-class product. In some cases they've turned out products that are a horror to develop with."
and
"There are smart people outside Microsoft who can things much better than Microsoft. What Microsoft has is research $$"
I agree, Microsoft does not always have the smartest people and their products are very rarely the best in their class. However, as the second comment does make clear, Microsoft has a lot of resources that they can put towards research. Another thing that Microsoft has is the largest market share out there in many classes, giving them unprecendented access to customer feedback. Their partnership programs give them deep level access to customers (and vice versa) that other vendors only dream of. Microsoft Research division does a ton of research into things that are only peripherally related to their products, which yields a rich harvest in spin off technologies and ideas, some of which can get folded back into their core products.
I definitely think, based on the feedback, that the sentence I wrote in question was a bit poorly phrased. The idea that I was trying to convey was that if Microsoft, with 4 years of research and development, with all of their money and resources, could not even get the idea to add even the slightest amount of value to the end user, despite the quality of the research portion of it, the idea of this type of functionality actually being useful to users is doubtful.
Is Microsoft perfect? Not by a long shot. As mentioned before, their products are rarely best-in-class, and often do not even make it to honorable mention until their third full version. But Microsoft does get that honorable mention nearly every single time. Granted, Clippy was the first real attempt (and the last real attempt) at user anticipation that made it to a mainstream product. But seeing as no other major vendor has even attempted something like this that I am aware of, plus the complete failure of Clippy (let's be real, Clippy was 100% worthless), it is difficult to see that this type of fuctionality is useful at all. Even when Clippy did do the right things (which is surprisingly often, from my brief experience) it was still obnoxious and victim to the disable switch.
I also have to ask, "outside of Microsoft, Apple, and maybe Amazon, who else puts this much work into this type of code?" Certainly not Sun or Oracle; their products are nearly impossible for all but the most experienced users to use, and sometimes even install. The Linux's and BSD's seem to ignore usability (let alone advanced usability) completed. It is not just that Microsoft failed completely, it's that very few people even bother with this kind of work.
So although I love the idea of anticipatory software, seeing how much work got put into Clippy and comparing it with the actual experiences of end users makes me doubt its actual utility.
Thanks for all of the great comments, and keep 'em coming!
J.Ja
by justin james
Longtime readers of mine will know that I have a lot of love and respect for some of the less popular languages and programming models like Perl and functional programming (in the order of "love" and "respect"). With that in mind, I am strongly encouraging Microsoft to put as many resources as possible into getting the .Net platform ported to *Nix immediately. Why? Because .Net is quickly emerging as a powerhouse for less mainstream languages! With the impending release of IronPython and the recent release of F#, .Net is establishing major credibility in areas traditionally dominated by *Nix.
Many of the lesser known languages suffered from a lack of proper tools such as IDEs and debuggers. Debugging Perl, for example, is very similar to the way I debugged BASIC in 1991: with statements to dump variable and program state to the screen or a log file. All too many languages are in this boat. Visual Studio, on the other hand, is a fantastic programming environment.
In addition to a lack of tools, many of these less used languages suffer from a shortage of quality libraries. For too long, Visual Basic, C#, and Java were easier and quicker to write code in, not based on any particular strength of the language itself, but on the huge base of quality libraries available. Indeed, the .Net Framework is an incredibly comprehensive library, encompassing most of the Windows API in a rational, consistent fashion. Meanwhile, other languages lag behind with the libraries.
As more and more languages move to the .Net Framework, it is increasingly possible and important to be able to write code in more than one language. A function that may be 100 lines of code in VB.Net may only be 10 lines in Perl. The 4,000 line monstrosity in C# can become 100 lines in a functional language such as O'Caml. With IronPython and F# (an O'Caml derivative) now in a usable state on the .Net Framework, the game is changing. Now, you can use VB.Net to handle the interface, catch events, and handle database operations which it is great for, pass data back and forth to C# code to deal with the multithreading aspects of the code, and have F# perform some intense analysis of the data. All at nearly the same speed of natively compiled code. Indeed, I have read of F# spanking C# in terms of speed on some projects!
And the only conclusion I can come to is that Microsoft needs to get their act together and get the .Net Framework ported to *Nix as soon as possible. If possible, they should put a GUI abstraction layer in it, to interface with X with no changes to code needed. At the very least, as long as one is not using concepts specific to Windows and its associated technologies (Active Directory, NTFS file permissions, some aspects of networking, and so on), software should run on a *Nix platform with no changes needed. For example, if a piece of code receives a request from a Web server, connects to a database, works some magic, and outputs HTML, that should work flawlessly.
I recognize that the Mono project exists, but it is not perfect, from a number of standpoints. The most obvious one is that Microsoft has never been great about sharing the nitty-gritty details of their technology with others, particularly when it gives them an edge. Another problem is that Mono is steered by Novell, who is on less than friendly terms with Microsoft. At the very least, the Mono community needs to be working closely with Microsoft to make sure that they get things right. From what I have read and heard, porting applications from the Microsoft .Net Framework to Mono can involve a good deal of work. I believe that unless someone is using Windows-specific code, the transition should be minimal.
At this point in the game, the only nail .Net is currently unable to put into Java's coffin (as well as become the de facto platform for many languages) is cross-platform support. If Microsoft can get .Net running on Linux, it should be fairly easy to then get it to Solaris and the BSDs, and then finally to MacOSX. Every article I read about a new language being ported to the .Net Framework, particularly dynamic languages, say the same thing: the .Net CLR is an excellent system to be basing languages on. People set out to show the shortcomings of the .Net CLR, and end up becoming its biggest supporters. Ruby is quickly moving to .Net. IronPython is nearly out. F# is already released. ActiveState's Perl is now able to work with the .Net Framework, although not as seamlessly as I would like. Within a year or so, every major language, most of the mid-level languages (Perl, Ruby, Python, etc.), and many of the minor languages (O'Caml, COBOL, and so on) will be fully ported to the .Net Framework. That means that languages that used to be relegated to special-purpose uses are suddenly viable options for mainstream developers. It also means that it is now possible to perform much special-purpose programming on Windows, more easily than ever, with those special-purpose languages. This brings Windows well into the realm of science, statistics, GIS, and other niche markets.
And the only thing missing is top-shelf *Nix support. Microsoft, are you listening?
J.Ja
by forozco
Microsoft wants everyones use its OS, not Unix. And .Net is that edge to move you to Windows. I do not see how can you think that Microsoft gains something supporting the old OS that they want to get ride off.
by justin james
forozco -
Sadly, you are right. In the case of expanding .Net to better support *Nix, while it may be great for the developers (with a corresponding trickle down to users), it does not fit in with Microsoft's game plan. It is telling that when Microsoft does try to "play nice with the other kindergardeners," it is always in a very self-serving way. Microsoft will not port anything to *Nix, but they do thinks like release the "UNIX Services for Windows" (to make Windows POSIX compliant) to make it easy to port *Nix software to Windows.
That being said, Microsoft is very good at serving the needs and wants of developers when the business people let the technical people do so. Hopefully this will be (eventually) a case where Microsoft will realizing that they can make money regardless of which platform they are servicing.
J.Ja
by mark ergot
by mark ergot
I would agree, a decent CLI would be a nice addition to WinBlows.
However, mucking up the nice work M$ has put into .NET 2.0 is not
going to help anyone. Maybe the focus should be on the CLR as an
extension of M$ to other systems. In case you needed to run a M$ application on whatever stable system, simply download and install the CLR and viola... A minature blue
screen on your box that doesn't crash the whole system.
by justin james
Justin Rattner over at ZDNet recently posted a blog about the end of applications. Mr. Rattner is right, yet incredibly wrong. He is absolutely right in that "all of the interesting applications have been written." In fact, I am on the record as stating that it is virtually impossible to create a single new application that could not be done (however inefficiently) with other means and tools.
That being said, Mr. Rattner's analysis of where the future lies is misguided at best. He believes that the future lies in changes to reduced operating costs and increasing manageability. I am all for reducing operating costs and increased manageability. But usability is the most important missing piece. Computers are completely unusable. Even cell phones are unusable. Most cell phone consumers pay big bucks for phone where the only features they use are the same features they were using 10 years ago, making phone calls. Why? Because the interface and OS for cell phones is atrocious.
Mr. Rattner's viewpoint is that of a hardware person. This is understandable; he is the CTO of Intel (amongst other technical titles). Hardware people have never understood end users terribly well. Not that application developers do such a great job of it either, but at least they make the product that the customer is actually using. Even worse, Intel specifically understands neither application development nor end users. They make general purpose CPUs designed to disappear in the user's life. Intel has never once done anything to help me as a developer. When Intel started pushing HyperThreading and dual core CPUs, did they put anything out to help tech the average programmer how to write programs to perform well on single core and dual core CPUs? No. Did they put any effort into helping Open Source Software projects optimize their performance to take advantage of the new hardware? No. Has Intel ever put any effort at all into writing code that end users see? Nothing except for a few drivers and system tray applications for their NICs and video chipsets. So why would I think that anyone at Intel has any understanding of the developers, the development process, or what end users want?
If you are an IT manager, would you prefer to go through yet another round of hardware purchasing to consolidate a few servers and reduce the power bill... or would you prefer to initiate a usability improvement session on your existing software? Most IT managers will choose to buy the hardware. I do not care how much hardware or how powerful it is. If the users cannot use it, it is wasted money. It's like owning a Corvette but driving the Long Island Expressway to work, it is wasted power. On the other hand, increased usability, by making interface (and some underlying logic changes) yields rich results with the hardware and applications we have today. For example, a website that performs a round of usability improvements can expect to see sales increase by a dramatic amount .
We have been playing Intel's game for the last 20 years, and it has not helped the end users. IT does not exist for the sake of enriching the wallets of hardware vendors, application developers, or consultants. Let me rephrase that. IT should not exist for those reasons. But it does. As a result, users hate their computers. Companies spend a fortune on IT, buying hardware to compensate for sloppy programmers and software that is "the version you have been waiting for your whole life" that still does not address the underlying flaws in all of the previous versions, but has a few new featured buried in a menu someone, and it now lets you skin the interface.
I have been a computer user for the last 20 years. I have owned a personal computer for at least 15 of those years. Yet, at the end of the day, my usage habits have been frozen since about 1994. Here is what I use a computer for (in no particular order):
* Checking email
* Chat/instant messaging
* Consuming content, primarily text, but sometimes audio/visual
* Creating content (95% text, 5% visual)
* Programming
* Playing video games
* SSH'ing to *Nix servers
I was able to do all of this, in one form or another, on a 486. I was able to do most of it on a 286. Indeed, my 286 with that 2400 baud modem was actually able to feed me remote text (my primary target of consumption) about as fast as my current PC does over a broadband connection. Why? Because it was not dealing with a Web server or having to parse HTML, and then fire up a JavaScript interpreter just to make a menu pop up!
And sad to say, the actual usability of the computer has gotten worse, not better.
I postulate that while achieving a minimum level of proficiency with a computer is now much easier, the difficulty and time needed to become a power user has increased substantially. For example, learning the basics of WordPerfect 5.1 was a bear. But once you had that little template laid over your F keys, you could do anything you wanted to a document with a few short keystrokes, without ever taking your hand off of the keyboard. Compare this to Word 2003. Word does not have many word processing features that WP5.1 did not have. Its extra features are on the periphery, in the form of things like Smart Tags, the "Research" system, and so on. Yet, doing the same tasks that I did in WP5.1 in fractions of a second now take many seconds! Take my hands off the keyboard, reach for the mouse, highlight the text, go to the menu (because there are more items than keyboard combinations), scan through the endless cascading menus looking for the tasks I want to perform (instead of glancing at the template laid over the F keys), sometimes taking a minute, then walking through some dialog or wizard. All to create the exact same table which took under 10 keystrokes and five seconds in WP5.1.
If anyone considers this "progress" they are mistaken.
Mr. Rattner is correct in that the vast majority of "improvements" really fall under the eye candy category. RSS is eye candy. HTML is eye candy. AJAX and "Web 2.0" are irrelevant eye candy. Granted, my definition of "eye candy" is rather broad; much of what these technologies deliver is added convenience and even the occasional efficiency to the end user. But the value of the content or the application itself is not increased by much at all. None of these technologies truly improve the human/computer interaction. There is nothing that these technologies deliver that could not be done 20 years ago. But the hardware vendors love these technologies. Want to sell faster CPUs? Get programmers to ditch flat files for tabular data in favor of XML. Want to sell memory? Get the users onto AJAX'ed systems ("JavaScript is the COBOL of the Web" to quote Roger Ramjet from ZDNet TalkBacks) and off of natively compiled code. Pushing horribly cluttered interfaces is a great way to get people to buy gigantic monitors and the video cards that go along with those higher resolutions. Convincing people that it somehow makes more sense to watch a movie on a 19" monitor instead of their 35" TV is another smart move.
So while I think that Mr. Rattner's starting premise is right, I think that his analysis of the situation in general is not correct.
J.Ja
by just_chilin
I couldn't agree more.
No matter how much memory or CPU speed your computer has, Microsoft will always find a way to slow down your PC.
by justin james
"I couldn't agree more.
No matter how much memory or CPU speed your computer has, Microsoft will always find a way to slow down your PC."
I really wish it was just Microsoft. Everyone seems to be guilty of it. Look at the Firefox project. It started out as a replacement for Mozilla, because Mozilla was increadbly heavy, loaded up with all of the sludge from Netscape. So they stripped it to the bones and removed everything from the suite except for the brower itself. Now Firefox is just as heavy as the Mozilla browser was (if not more so) and getting filled with security bugs thanks to the new features. It is pretty sad, because the original idea was perfect.
A few pieces of Open Source Software, freeware, and shareware avoid this. I have a piece of software or two that has not added a new feature in 2, 3 years, simply because the product is just right as is, and they release a minor bug fix once in a while. That is software perfection, IMHO.
Unfortunately, any company who's financial success rests on the gravy train of upgrades (MacOSX is the worst offender out there) is forced to take great software and load it up with new features every year.
J.Ja
by debuggist
by just_chilin
by pkr9
by pharus
Absolutely true. The question is: how do we convince the IT community at large to keep using current technology, i.e. hardware and software? We primarily have 2 corporations, namely Intel and Microsoft forcing their products onto the market through excellent marketing. I've actually started to wonder what is Microsoft's main line of business...is it software development or is it marketing?
MS Vista is on its way, but yet I have clients happily still working on Win 98. How do we get the rest of the world to be satisfied using Win XP and MS Office XP (better yet, OpenOffice)...?
by abrogard
by admin
You've correctly made some astute observations and fingered some problems, but you also have some misplaced expectations:
1. Intel is a component maker. That is all. The one who makes the bolts doesn't make the derrick. You have not been "playing Intel's game" because it has not been Intel's game to play.
2. Computers are only machines, not living organisms. Screwdrivers turn screws. Don't expect a screwdriver to plant the field. Computers are not going to do anything for you that you don't need done in the first place, and if you do need it done, of course there is a variety of ways to do it, some of which may not have been discovered yet.
by 1tnfrench
Oh is this blog sooooo true!
The information age has been reduced to just another sales portal.
The world?s largest library has been seduced, raped and prostituted (and I work in eCommerce - 'sorry)
The effectiveness and efficiency of the modern software world continues to increase the user-friendly aspects to simplify and foolproof systems and software. Unfortunately, the target audience (the novice user) is going the way of the dinosaur.
As an analogy, most of us know how to ride a bicycle. But now we need helmets, pads, wind resistant fabrics, carbon fiber, exotic alloys ... I can either spend 5 bucks at a yard sale or 5 grand at a bike boutique. The function is the same. My old (real old) ten speed works just as well, keeps up with and is just a comfortable as the high-tech, custom-built, Trek I got as a gift. The old ten-speed also allows me to fill the tires at the local gas Shoppe, hop curbs, and not worry about rocks, cracks, and potholes.
For the "Form follows function" crowd -- Newer better bigger does not make sense. Wizards, assistants pop-ups, mouse-overs, shadow icons -- argh! Let us re-invent the world one more time! The computer industry has spent the better part of the lat 25 years taking sound established principles and methods of operation and contorting them melding them and confusing them. (Remember when SDLC meant Synchronous Data link Controller?)
Now enter Media and Entertainment. Music -- I have a home theater (An old laptop is the music juke box).
Video -- I have a network connection [Cable, Sat] that is digital and works almost as good as analog!
My solution is less direct. Prices are such the single purpose, dedicated resources make sense.
A really nice mid-90's network is now dirt cheap. Functionality has only minor changes.
Uncle Sam still accepts the tax numbers off the '386 laptop (hack that through the air gap firewall!).
One system is the firewall, another, the fax server, a proxy and then the SOHO and home network.
Security is of my own design and will stay that way.
I will not be upgrading to Vista or the new Office suite (idon't need the overhead).
Most of the "new" apps I have seen are add-in or advanced macros for older apps.
Now if I could just keep people from stealing my bandwidth...
tnfrog
by caverdog
I have a Pocket PC phone that allows me to carry 4 movies, 100 songs
and 100 books in the hidden pocket of my Dockers Mobile Pants. My
computer will Rip 13 DVD's to my Playstation Portable (which also plays
amazing games), and my Media Center PC lets me pause live TV, record
any program I want and copy it to my phone or PSP. I was a
secretary 15 years ago (WP51 on 8088), and now I am a Security Engineer
(Contractor for the Navy). I mostly write policy, and for large
documents with diagrams, WP51 cannot compete with Word 2003. For
the person who lamented the keyboard shortcuts, they are still there
and you can set your own with macros. As to highlighting text
with the mouse, keyboard text highlighting with the shift-key is much
easier and than Press F4 and hope. I've worked many places, and
the places where the users hate their computers it is because there is
no training or the System Administrators don't ensure
Availability. Word will now do versioning, Outlook does amazing
things if a user is trained and the System Administrator knows what
they're doing. This site has much active content and yet runs
well and is easy to use.
For the person lamenting the helmet on their bike, you're an
idiot. Helmets are for safety, something that wasn't a concern
and alot of kids got more hurt than they needed. As for the rest
of the bike, I can take terrain on my mountain bike that your 10 speed
couldn't think of. However, your 10 speed is just as good for
getting a coke from 7-11 down the street so if that's all you need you
should never upgrade. I have 8 computers at home ranging from a
PowerPC G3 (a screemin' 233mhz!) that still does everything it used to,
to a 2.8GHZ that I use for gaming. All have their uses, but don't
pick on my 2.8 just because it's beautiful.
by lelliott
I so agree. As a usability engineer, I am a defense lawyer for invisible clients at development meetings. It's not the users and it's not the developers. There is no communication between the two and often no user testing.
The developers have fabulous ideas. The users have realistic needs but are never heard. It's better in some companies and worse in others.
Companies are starting to figure out that poor usability costs. When they realize it is costing them, sometimes it's too late to do the usability testing. All you can do is fix it in the next release. It takes blogs like this and actual users to demand usability testing. There are usability engineers, championing the cause, in nearly every computer/software company. We test actual users on the product before release and produce recommendations to make things friendlier. Sometimes we make a difference and that difference is invisible. It's easier to spot poor usability than good usability.
Companies need to hear this from you. Usability must be a requirement from the customer at all levels.
For more on usability see; http://www.useit.com/alertbox/991114.html and http://www.baddesigns.com/
For more on usability engineering; http://www.upassoc.org/ and http://www.hfes.org
usability forever...
by kdnoel
Well said I have been along for the ride as well... I will admit my first "pc" was a Model 1 from Radio Shack with a cassette for storing my programs - we were very creative with the 16k memory limitation.
Old Dog looking for new tricks!
by betelgeuse68
I don't quite buy the argument that fancy new interfaces will solve all end user problems. One word that was often used to describe the advent of the Macintosh as well as Microsoft Windows (though version 1.0 was just flat out awful) was "intuitive". Intuitive refers to intuition. One definition of intuition is "having a quick and keen insight." But were is this insight derived from? From a superstructure comprising a knowledgebase of one's frame of references. If you have never worked in a given context, intution does not spurt from the ethos as it were magic, far from it. I remember when my sister back in college needed to write a paper. I had Windows 3.x on my machine and fired Microsoft Word for her. She said, "Well how do I use this?" My response was "It's just like the Macintosh" trying to quickly disappear from the situation and leave her to her task. All I got was a blank stare. I had made the assumption that everyone has been exposed to graphical user interfaces and had some frame of reference, i.e. intuition, but that was simply not the case.
Einstein once said there are only two things that are infinite, the universe... and human stupidity. And not necessarily the former.
People ensconce themselves in the routine and subconsciously erect barriers that no amount of software development will overcome. Yes, perhaps some eager grandma in a UI study will "overcome" some barriers, but that person is representative of the norm.
My parents still cannot program their VCR and my expectation is they
never will be able to. They grew up in a different time and simply do
not have the collective experience where the light bulb of intuition
turns on.
This problem will subside substantially when the generation(s) that did not grow up immersed in technology pass into the afterlife.
by obviator
by justin james
"This problem will subside substantially when the generation(s) that did not grow up immersed in technology pass into the afterlife."
This is sad, true, and yet so deliciously morbid... I love it! I want to go to my boss one day and tell him, "Well, we just have to wait for all of the users over the age of 30 or so to die off, and then all of the problems will be solved. Shall I ready the neutron bomb sir?"
J.Ja
by justin james
Oracle is the Terrell Owens of software: you absolutely despise playing with it, but its performance is almost good enough to make up for its unforgivable manners. Almost. Today I had the misfortune of having to perform some development work with an Oracle database. I had not touched the Oracle client installation on my desktop machine in months, except to update the Oracle .Net tools a few weeks ago. I updated them, but had not used them. When I tried to make a connection to my development database, the drivers were just giving me a big "New York Greeting." I never did resolve the problem; I kludged together a work around. I ended up just using a different system on my client's VPN and working with their development database. I put two hours into resolving the problem, and simply did not have anymore time to waste.
Over the last year or so, I have spent well over 40 hours wrestling with Oracle. That is a full 2% of my yearly productivity devoted to nothing but trying to get their "tools" to stop giving me grief. I can easily chalk up at least another 20 hours over the last year trying to find error in SQL statements that Oracle does not help me find. "Missing right parenthesis" is not very helpful when one is doing a JOIN on 106 subqueries. MySQL is nice enough to show me exactly where the problem is in the error message.
And then there is the sewer known as "sqlldr.exe." Another complete waste of time to deal with. Again, comparing to MySQL, I have to write a script file to do what MySQL can do in one "LOAD DATA INFILE?" statement. Even the command line for sqlldr is complicated. For whatever reason, my current working directory needs to be the data directory, or else the files do not seem to be found.
Oracle Enterprise Manager is pretty foul too. It has menu and toolbar items that tell me to go use "Oracle Enterprise Manager Console," which, despite its name, is not the same program, but a Web based app. The software itself barely works. It leaves a Java console window in the background, which is constantly spitting out various uncaught exceptions. The software has a positively miserable interface. Its worst habit, though, is dropping the first character typed into any text box. I have never seen that kind of behavior in any other application.
Even the Oracle client is a shrew. Each time you install an Oracle product, it tramples all over the file permissions on the client, rendering it unusable. Due to a quirk in Windows' file permission check system, after correcting the problem you need to reboot your PC. Oracle is the only database that requires a monstrosity of a client; it is like Novell Netware circa Windows 3.1. Do not even get me started on the idiotic tnsnames.ora file contraption. Talk about a manageability nightmare! Every other database out there just needs to install a small ODBC driver (or JDBC driver in a convenient JAR file, for Java developers), make an ODBC connection, a poof, you are connected. Not Oracle. It needs to turn your computer into a mess, and you still need to create the ODBC connections anyways.
Dealing with the Oracle corporation itself is a David Lynch film at best. Their Web site makes it clear to me that they are not interested in helping me. The search system on their Web site is horribly broken which reflects quite poorly on their database products. Trying to find updated tools and drivers is a hassle. Not that they update their tools very often, Oracle has a poor track record at bug/security fixes. And again, when you do update the tools (using their awful Java installer, which takes two minutes just to start, and always gives me grief about where to install stuff), it destroys your existing setup, requiring a three hour trip down search engine lane to fix the problems.
I am not even sure if Oracle's performance is that great. Microsoft SQL Server, when properly configured, can be pretty fast, close to and occasionally exceeded Oracle's. MySQL is catching up very quickly, and PostgreSQL is no slouch either. And all of them are infinitely easier to deal with than Oracle. Oracle's dominance of the database market is proof positive that the people who make IT purchasing decisions are not the people who have to live with those decisions. Why is it that there are no MySQL, PostgreSQL, or SQL Server consultants billing out at $250/hour, but there are Oracle consultants doing so? What does that tell you about Oracle?
Oracle just does not get it. When your developers tell you that using Oracle over another database makes development take 10% longer, or your DBAs cost you 25% more, or management on users' desktops is 250% more difficult, or integration costs are $250,000 versus $10,000 for anyone else, eventually you are going to start to wonder if a 5% performance edge is worth it. I do not think it is. In its current state, I would not recommend Oracle to anyone. I simply fail to see its advantage, and I have yet to hear from a developer who likes dealing with it. The only people I have talked to who like Oracle are billing out at divorce lawyer rates to integrate and support it.
I would love to hear your Oracle horror stories, or any defense of them.
J.Ja
by mark miller
The last time I dealt with an Oracle database was in 1999, Oracle 7. I had been working with it for about 2 years.
Your story about the error messages sounds very familiar. I used to run into that a lot. I can't remember what the errors were, but they never told me where in the statement it was. Sometimes the error messages were cryptic, too. I just got used to them over time and got quicker at finding the problems.
I do remember an incident that was royally frustrating. This was the one time when I felt Oracle failed me. We were working on a new project with a deadline that was closing in on us. We had Oracle 8 running on a Windows server, but our transaction server software only ran on Unix. Either there was no Oracle 8 release for SCO (the kind we had), or we didn't want to spend the money to get it. We figured that Oracle 8 should be backward compatible with Oracle 7's development tools. Wrong! This descrepancy was not obvious though. I tried out some tests, trying to get some embedded PL/SQL to work, but it kept failing for some mysterious reason. All I was using the embedded PL/SQL for was to call a stored procedure from my C code. I had to map binary values from my C code to PL/SQL values, and then call the procedure. It kept telling me "type [typename] undefined", with the []s containing some PL/SQL type I was using, which was defined inside some scope in the database. I knew I had the scope right. I tried running the same call from within an Oracle command line, and it would always work. I kept looking at it, and couldn't see where the problem was. I finally got desperate and asked on an Oracle newsgroup about it. The others on there were very helpful. What we eventually found out was that the Oracle 7 development tools were not totally compatible with Oracle 8. What I ended up doing was creating an embedded Dynamic SQL call, which contained PL/SQL code, within my C code and then passing it wholesale to Oracle 8 to compile and run. That worked. The problem with that was if there were any problems with the PL/SQL, we didn't find them out until run-time. Typically the Pro*C pre-compiler would check for consistency and output compile-time errors if something didn't match. There were dozens of transactions that had to be done this way. I could see it was going to be a maintenance nightmare going down the road.
Back then Oracle Server had no UI tools, except for a couple decent ones on Windows. Everything was done on the command line on the server. This improved with the last update to Oracle 7, when they finally added a decent UI "control panel" for the server that worked reasonably well.
I remember that you had to install "Oracle Client" on Windows machines, and then hook up to that with ODBC.
One thing that was often a pain in the butt for me is when it came time to do a tape backup of the SCO Unix system it was installed on. I know that there was a way to configure Oracle 7 to create logged backup files, but I didn't bother setting that up. We were a small company, and so shutting down the database for a while was no big deal, since it was done at the end of the day when no one would be accessing it. That's the process it would go through. I wrote a script that would pipe commands into sqlcmd (I think it was called) to shut down the server, do the backup with a piece of third-party software, and then bring the server back up. The problem was if anyone had a database connection open at the time, the server refused to shut down until that connection was closed. I don't quite remember how this typically happened, but it was not because someone was using the database. They may have been doing some software testing with a product we were developing that accessed the database, but the instance of the software had been shut down a long time ago. For some reason Oracle would think that somebody was still connected. Maybe this was a "pain point" with Sql Client. I vaguely remember that if a piece of software that was using it crashed, some part of Sql Client would be left running with a connection to the database. You would either have to kill it off in Process Manager or kill some DLL instance that was still up and running. I forget. Our development and test machines were running Windows 9x at the time. Often what I had the script do is watch to make sure Oracle Server had shut down, and if it hadn't it would just issue a kill -9 (kill unconditionally) command on it, and proceed. No harm done.
I can remember that the documentation that came with Oracle Server was atrocious. I remember asking someone once who was more experienced with Oracle why this was. He told me "Their business is consulting and training." That said it all. In order to learn how to use their software, you had to pay someone more knowledgeable to teach you. We didn't take that route exactly. I can't remember which publisher it was, probably Osborne Press, but they published an excellent series of books that explained just about everything a beginner would need to know about Oracle. My boss found it. These books were my savior. MUCH better than Oracle's own documentation.
I remember once as well that applying an update to Oracle Server was a huge pain in the butt. We were installing it on SCO Unix, and it required something that might've been called a "virtual partition". It was some special type of partition (maybe it was a partition within another one?) that would grow dynamically as the data size requirements grew. Me and my boss were trying to figure out how to set that up, because Oracle's installer wouldn't do it. What I remember is that the installer would get halfway through and then die. Everything ran on SQL scripts. It would die because it couldn't find some table it was looking for in the database, or it didn't find a value in a table it needed. I think this eventually improved as well. Later on they created a UI for their installer and things worked like clockwork. Like I said, there was a "last update" that we applied to Oracle 7 that worked out. It seemed like they had finally gotten all of the bugs out of everything.
The thing that seemed to make it all worth it at the time was that Oracle seemed so robust. It was known for its redundancy, so that everything that should get done, would get done, even if the power went off in the middle of a transaction. That's what I was most impressed with. With Oracle you could feel safe that your data would never get corrupted by some freak accident. People have said when I tell them this, "Isn't that what UPSs are for?" Yes, but I've seen UPSs fail. Over time the battery will wear out, and eventually it has to be replaced or else you have no battery back up.
Since that time I've been dealing with Access and SQL Server databases. Access has its quirks, and it's not very efficient, but it's fine for some small projects I've worked on. SQL Server has been fine, once I've learned its features. I only had a problem with it once trying to import a database from one site to another. Otherwise it's been much less trouble.
by justin james
Mark -
Thank you for reminding me about their worthless documentation. I actually forgot that Oracle has documentation, because it is that bad. I too need an Oracle book sitting on my shelf, to remind me about all of its quirkiness.
Recently, I was working on an Excel project where the spreadsheet had an embedded SQL statement in a few sheets to dynamically pull data. For whatever reason, I could not get the SQL parameters to work with it (it worked fine against MySQL and SQL Server though!). As a result, I had to put in bogus values in the SQL command, and at run time store the original statements to variables, perform a search/replace on the command itself to swap in the right values from the spreadsheet, and then swap the original commands back in when it was done running. For whatever crazy reason, I do not consider that "elegant" or "reasonable." In fact, it seems like Oracle is always giving me problems with parameters, regardless of the language I am using.
You are right about consulting work being their real business. The DB license itself is a drop in the bucket compared to those service and maintenance fees. What Oracle fails to see, is that as other DBMS's catch up to them in terms of redundancy (you are right about that, Oracle is good with even severe system crashes), reliability, and speed (and I beleive that SQL Server is at that level, and MySQL is ot far behind) then there really is zero reason for anyone to choose Oracle, unless they already have it. SQL Server is cheaper and integrates very well into a Windows environment, MySQL is free and rediculously easy and plesant to manage. PostgreSQL is rock solid, and also easy to manage. Take your pick, but don't pick Oracle!
I also forgot to mention that Oracle does less to support developers than anyone else. Their attitude is, "have your DBA put everything into stored procedures, and let the developers just write interface to access those stored procerdures." That may work in the highly structured, "death by process" world of Fortune 500 IT, but it does not fly for the rest of us. In my current position, the company I work for is hired because their people do not have time to be messing with this stuff. They know and request that we do NOT use stored procedures, because they want us handling this stuff, not their DBAs. So it is crucial that I get good support in my tools. Oracle is a lousy company on the support for developers.
I also recall finding occassional, minor differences between the Windows and the UNIX version of Oracle. I think these have mostly been resolved, but it was rather... interesting... to develop with a local development database, only to discover that the code stopped working when moved to the pre-production test environment. Very troubling indeed.
BTW - I have seen UPS's fail too! Two weeks ago (I had replacement UPS's on backorder) I actually yanked the power cords for my server out of the UPS during a brownout, because the UPS was going insane due to a nearly dead battery, and it was less harmful to the equipment to just be yanked completely than to keep getting enough juice to try to start, and then failing. Next week, in fact, I will be posting a short review of the GE GT series UPS's that I just got in, on this blog. As a sneak preview, I'll just say this: I love them.
J.Ja
by mark miller
Justin:
Re: The DB license is a drop in the bucket compared to the services and maintenance fees
I didn't keep track of that much. I happened to catch the price of the DB license though and I was shocked: something like $20,000-$30,000. I can't remember exactly. And that was just for our development dbase. I can't imagine what our clients must have paid for a production setup.
Re: Oracle's attitude is just have your DBA put everything in stored procedures
Well they would do that, wouldn't they? :) That's how they tie you into their platform.
I only got a hint of this while I was working on it. The project where I was attempting to use embedded PL/SQL was in this mode. We only did it this way because we thought it would be less laborious. Maybe it was in the end. I believe what my higher-ups did was use Oracle Designer to lay out the schema, and they added in things like constraint checks, plus they used its facilities for implementing business logic in PL/SQL. The constraint checks were implemented in triggers. Data got passed on to stored procedures which implemented the business logic. That's the reason why I was having to use embedded PL/SQL. The particular client we implemented did not directly interface with Oracle, but rather with a middle-tier written in C. So that's where the interface had to be implemented, and where I ran into my troubles. It was awkward doing embedded PL/SQL. Just doing plain 'ole embedded SQL was more straightforward. I can't remember exactly, but I probably had more control, too. If anything went wrong I could trap the error and handle it myself. I don't remember what we did with PL/SQL errors. I think we decided to bite the bullet and go the trigger/stored procedure route, because if we hadn't I would've had to have implemented the constraint checks myself in C code. And we estimated that was going to take too long. It was decided it was better to have Designer set that up in PL/SQL. Designer did have a facility for generating VC++ and VB code, but it could only be compiled for Windows, of course. I needed it on Unix. Nowadays it can probably generate Java code, no?
Incidently, I've talked to software consultants who, when I tell them the story about my old company (not naming names) and how they stored all their business logic in stored procedures, they'd chuckle and ask me for a lead. They would say, "Hey, maybe I can help them out." They saw this done before, and in their experience it just led to a mess, one that they helped clients get out of. I've kept in touch with the system architect where I used to work, over the years, and he hasn't complained about the setup. It seems to have worked out fine for them, but they decided to become an ASP fairly soon after I left. Since then they've had absolute control over their systems, rather than having to adapt to the customer's system requirements.
With all that's been said about SQL Server 2005, and how you can write .Net stored procedures now, people are tempted to think in the same direction: put the business logic in the stored procedures. From what I've heard from MVPs, this is NOT what .Net should be used for in the database. Rather, it should be used in place of extended stored procedures, those cases where it used to be necessary to write a DLL and link it into SQL Server to be run from the database. Microsoft's preferred approach is for people to implement the business logic in web services, outside the database.
Oh, one other incident that happened to me was I was testing out Oracle Lite, the first version they came out with. Lite was a database that would run on a client system, and was compatible with Oracle Server. It could do things like carry out replication, and check for consistency when the client and server databases were synched. It was kind of impressive, too. It had a background process that would monitor the database and what was being done to it. I tried out stuff like have a program that added a bunch of rows to a table and then cut the power. No data corruption. I hadn't seen that in any other client database to date. Its main focus seemed to be on Java. It provided a JDBC interface to the client database, plus you could put Java stored procedures into it. Again, impressive for its time. It came with an embedded SQL pre-compiler that worked with VC++, and this is where I ran into trouble. It turned out the installation was missing a header file it needed. I couldn't compile anything. It took some prodding of the situation to figure this out. Finally I called Oracle's customer support. They were using Indian tech help even back then. I got this nice Indian woman on the other end. I described the problem to her. She said she would get back to me, and she did. I was impressed with that. She said that the right header file was at an FTP address, and gave it to me. I had a little trouble with it (she may have given me the wrong location), but she helped me through it. I finally got it, and that was it. She explained that the reason she couldn't handle problems directly was that the embedded SQL pre-compiler was written by a third party, not Oracle. So she had to contact their team to get anything done. that was informative. I said goodbye and hung up. I tried compiling again, and this time I believe I found another problem. I can't remember what it was. So I called back and got the same contact (they have you use an incident number). She helped me through that. I said goodbye and hung up. Finally I got everything working. I was a little surprised. This same Indian lady called me back a day later, and asked if the problem was resolved. I was busy so it kept slipping my mind. She called me back something like 3 times over the course of a week, asking if the problem was resolved. Finally I called her back and said yes it was. I really didn't expect this level of service. It was nice. IMO it wouldn't have even been necessary if they had made sure all the pieces were in the distribution before they sent it to me. I'm sure they charged the time to the service contract account we had with them. If we didn't have that in place I guess I would've just thought Oracle Lite was a POS and we would've just tossed it. We didn't use it while I was there, but I heard they used it later. Once I got it going I wanted to use it, because I thought it would make our programming lives easier. Before then we had been using a client API-based database, and it was difficult to do things with it like joins (we always implemented the joins in our code, which was a pain). With the embedded SQL compiler we could just put the join in a SQL query. That would've been nice, but oh well.
In a way Oracle was ahead of their time with this. I don't think Microsoft had come out with MSDE yet, and they had nothing for Windows CE. Now they have SQL Server Express, which will work in a client environment, and SQL Server for Windows CE. When that first came out people thought it was so bizzare, "SQL Server on Windows CE??? How the heck does THAT work??" :)
by mulkers
I have been using Oracle DB in Java applications and have never had that kind of problem you mentionned.
The Oracle driver is a native JDBC driver, you just have to add the ojdbc14.jar in the application classpath, that's it.
There is no Oracle client installation needed. I have never had to read the documentation of this driver.
So when you mention that "Every other database out there just needs to
install a small ODBC driver (or JDBC driver in a convenient JAR file,
for Java developers)". Well, I don't understand that because this is exactly what I do with the Oracle JDBC driver and it works.
I am not an expert in .NET but I know there is a specific Oracle driver for .NET, check it out.
Best regards.
Robin Mulkers
by sss
by justin james
Robin -
I will say, it has been a number of years since I worked with JDBC & Oracle. That being said, it was a nightmare. It took well over 8 hours to get my development box up and running to the point where I could access Oracle, and the client was a major part of it. The Oracle tools for .Net completely and utterly do not work out of the box, and sometimes require hours of troubleshooting to correct them. Furthermore, installing them hoses the existing Oracle client installation in my experience (like last week). So while it sounds like Java developers finally have it good, the rest of us still suffer. I may add, when I was doing Java development, the JDBC drivers had a critical flaw (I do not remember the details off hand) that Oracle had been aware of for over a year and had not been corrected.
To SSS -
I agree, TOAD is good. Lousy interface, difficult to use the software, but it does have everything including the kitchen sink in it. It is a real shame that as you mentioned, it is not free. Other DB vendors give you free management tools that, while not quite as comprehensive as TOAD is (for some of them, at least; Microsoft SQL Server management stuff is just as inclusive from what I have seen), have the features that I need 90%+ of the time, while being free too. There is a reason why you do not see "TOAD for MySQL" or "TOAD for SQL Server," it would be hard to sell that product at the price that TOAD sells for.
J.Ja
by debuggist
Totally agree with you. In my last job I had to maintain an application that used Oracle as backend and I cannot find words to describe my frustration with this product, specially their tools. They were so cumbersome and riddled with bugs that I ended up making my own clone of MS SQL Query Analyzer to able to debug stuff. Documentation I won't even get into >: (
by justin james
"Generally, Oracle's DB is rock-solid, but any other software they make is just painful to use."
Doug, that sums it up perfectly. Even within the DB itself, there are non-performance related issues, like the useless error messages it kicks out. The copy of Oracle installed on my development PC was slowly filling my drive with core dumps, until I turned it off. If I had not noticed that disk space was disappearing at a rate of 1 GB per week on a machine where practically nothing gets stored locally, I never would have noticed it. I can imagine that the same thing would go undetected forever on a server. Oracle was not nice enough to dump anything to the event log either.
J.Ja
by bscalzo
by justin james
Bert -
I had no idea that there was a TOAD for other DBs, I have never seen it advertised. Thanks for letting me know though, I will check that out.
"But what often really amazes me is the reference to price. Let's say Toad on whatever platform only makes you database work 20% more productive. Assuming that you make the average $80K per year - then Toad is saving your company $20K per year versus it's meager $897 price. It's a real bargain in those terms. But people just like to complain about software prices like it's there money being spent to buy it (and not their company's money). Even private consultants are on record defending Toad's price - saying for those who only see the cost, then raise your hourly rate to compensate for your increased productivity."
I know exactly where you are coming from, and unffortunately, that is not entirely how things are looked at by the decision makers. In the mind of many decision makers, any capital expense is going to end up as a line item somewhere that may need to be justified to a boss, a stock holder, an internal auditor, or whoever. "Cost cutting" is the word of the day. Wasted time and productivity never shows up on a spreadsheet anywhere, so it is "free" as far as the company is concerned.
In 2005, I left a company where people in my building has Pentium 1 systems running Windows 95, to perform heavy-duty work (2 - 3 JVMs open at once, Outlook, Excel, Internet Explorer, a few other apps, all while groaning under the weight of McAfee A/V). I had to come in a full 15 minutes before my shift started to ensure that my computer was up & running and that I would be ready to work at the shift change, and even then the computer would sometimes take 20 - 30 minutes to be up and running. When you figure 15 minutes of overtime, times 5 days a week, it would take only a few months to buy a replacement. But a replacement would be a line item expense, and my wasted time (not to mention needing at least 1 more person per shift, because the equipment was so slow) never looked like an expense, because the systems had always been that slow! Anyone could make a spreadsheet showing a 1+ person headcount reduction plus an ROI of well under 6 months just to replace those PCs, and actually acheive that ROI, yet the company was so focused on cost containment to please the stockholders that it simply would not happen.
I see this kind of thing all of the time. It stinks. This is why, despite the fact that paying for software as opposed to using a free software that came with the product happens so infrequently. It was not until recently that I worked for any companies that ever bought any equipment or software for employees to use. I have worked for places where if it was not free, it did not get used. It stinks, but that is how it is.
J.Ja
by bscalzo
by debuggist
by mark miller
In the mind of many decision makers, any capital expense is going to end up as a line item somewhere that may need to be justified to a boss, a stock holder, an internal auditor, or whoever. "Cost cutting" is the word of the day. Wasted time and productivity never shows up on a spreadsheet anywhere, so it is "free" as far as the company is concerned.
Hi Justin. Wow. This explains a lot! I've wondered about this over the years. Many years ago I worked at a software solutions consulting company, and while they weren't totally allergic to buying software, we wrote a lot of software in-house that could have been bought and customized. In my own estimation, in several cases it would've been cheaper to buy, considering that they were paying us a few thousand dollars a month to do our work.
I started working there before Windows 95 came out. My machine was designed for DOS. It was upgraded to Windows 95 when it came out, and one thing I noticed was that anytime a window would need scrolling, the window update was SLOW. The video card was old so it couldn't implement video acceleration. This got painful when I got switched over to Unix development. I would telnet in using some terminal software. Many times the terminal window would scroll when I displayed a list, like a directory listing, or ran some utility that output a large list of data. The operation would be done, like a minute ago, but I couldn't see the end result, because my window was still catching up to the output. Aaagh! I pleaded with my boss on several occasions to purchase a newer video card for my machine, but he resisted. I told him it was slowing me down, affecting my productivity. The problem was the motherboard was old too. So no video card worked with its slots. It would have to be upgraded as well. Finally, after several months, I got my upgrade. I was SO happy! The screen was quick and responsive. But I wondered why it took so long. I think what you said explains it. That, and why we kept "reinventing the wheel" when we could've bought the solution.
by justin james
Mark -
Happy that I could help you with that! I wrote a lot more about the subject in April. This particular issue is not IT specific, it is MBA specific. MBAs, particularly those who are heavily compensated based upon certain performance metrics (revenue, growth), etc. are the root cause of a lot of frustrations. Objective metrics drive bonuses, not subjective opinions (such as "the long-term sustainability of this company"), sadly.
J.Ja
by fmteter
by vmirchan
by justin james
The company that I work for had a pressing need for some battery backup. We were adding new servers with more power draw, and our existing UPS just was not cutting it. One of the biggest challenges that we faced was a lack of 20 amp (or bigger) outlets. Our office is only equipped with 15 amp outlets, no one ever expected our needs to grow as quickly as they have been. As a result, we were limited to about 1.5 kVa worth of power.
Originally, due to cost considerations, we were going to stick with some low end, line interactive units (the Powerware 5120, believe). One of the reasons we suddenly needed so much power though was our new server, a dual Xeon 3 gHz system with 4 SATA II drives in it, rated at 700 watts. Although it was fairly obvious that the unit would not be drawing anywhere near 700 watts, 300 ? 350 seemed to be a reasonable estimate of the power draw of that server. Add to that the load of three other servers, and a single 1.5 kVa system would be quite near its maximum capacity, and well over the recommended capacity.
We decided to not go with the Powerware unit, and instead opt for a pair of GE GT rackmount units, each with an external battery pack for additional runtime. Here is why we opted for this particular unit:
* Its maximum load is 900 watts, while many competing units were rated at 700 watts
* 2U rackmount form factor for each unit, as well as each battery pack
* Dual conversion, as opposed to line interactive
* Able to daisy chain up to three external battery packs per UPS unit
* Plenty of outlets on the unit
* Outstanding price point, especially in comparison to other 1.5 kVa dual conversion units
The last point was the most important. Although the cost was significantly higher than any line interactive unit, it was less expensive (by at least 20%) than any competing product. For a number of reasons, I will not name the vendor or the price paid for the units.
The units arrived via freight. Initially, I was rather scared by them; the freight company listed four boxes at a total of 290 lbs. The prospect of manhandling 75 lb. units did not thrill me. When the boxes arrived, I was delighted to discover that they were not nearly as heavy as I had originally expected. Initial inspection of the units showed them to be extremely well constructed. The power cords were, by far, the most heavy duty 15 amp power cords that I have ever seen. Indeed, they were of a higher, heavier duty quality than on the APC SmartUPS 2200 that I have at home. Likewise, the connectors for the external battery packs were extremely heavy duty.
Installation and set up of the units was a breeze. The only sticking point was the cords for the external battery packs. They were pre-bent into a curve, and extremely resistant to bending. If I wanted to swap the position of the UPS and the battery (putting the battery above the unit, as opposed to under), I would have had an extremely difficult time. I also had some difficulty inserting one of the ends of the battery's power cord into one plug. A little bit of wiggling cured that, however. The plugs were secured with bolts, but the holes in the power cord's "ears" was slightly small. I was very happy to discover that both the UPS's and the batteries were not nearly as heavy as I expected. The handles on the front of the units made it easy to move the units, and picking them up without a helper was not a problem.
After installation, the units continued to delight. They are whisper quiet, and generate extremely little heat. While this is not a prime concern in a server rack buried in a server room, I believe that a tower version of this unit would be extremely pleasant to have next to a desk. Indeed, the units are quieter and generate less heat than my desktop PC. It was nice to deal with rackmount equipment that did not forgo the creature comforts. Visually, the units are quite attractive. Although the average systems administrator probably could not care less, some people do like a good looking unit. The units are a pleasant silver color, with a sporty red stripe across the front. The control panel is extremely bright and easy to read. The LEDs are spaced far apart, so light from one LED does not appear to light the other LEDs. The control panel has a general "step meter" that displays load while receiving external power, and shows battery charge while on battery. I would have preferred to see dual meters. In my experience, getting an idea of how much load can be reduced by shutting down non-critical systems first to extend run time for more important systems can be important.
I must admit though to being a bit disappointed in GE's "JUMPStart" software for the units. [Correction 8/23/2006: The software is named "JUMP Manager", not "JUMPStart"; I got the name confused with a Sun software package I was recently dealing with.] My first impression of it was less than favorable: it requested an installation path without spaces. It is a Java application that seems to run on both Windows and *Nix. I tested it on a Windows 2003 Enterprise Edition server. After installation, it was not courteous enough to make a group for itself in the Programs menu. It just dumped itself into the root of the menu. It also did not add itself to "Add/Remove Programs." It also did not add itself as a Windows service. When I did run it manually, it left a nasty Java console window open. The Java console was spitting out errors, but the software itself seemed to be running fine. This software, as far as I am concerned, is not ready for primetime for general UPS monitoring purposes. I would definitely recommend purchasing the add-on SNMP card, and monitoring the unit that way. I will be looking into that myself, and add it to my MOM configuration, along with scripts to shut down servers in the case of a low battery.
Overall, I think the GE GT unit is a fantastic item. It is available in 1 kVa ? 3 kVa capacities. The only problem that was beyond "one time nuisance" was the lack of good software for the serial connection, pretty much so mandating the purchase of the add-on SNMP card. You should factor this into your purchase price if you decide to buy this unit. The lightweight of the units and the battery packs lets me feel more comfortable that I will not develop a hernia when it comes time to replace the batteries.
J.Ja
by maximhc
I sure hope this is not a true server room, computer room or data center. Placing a UPS in a rack with batteries without a mean to remotely disconnect them is a code violation. If a fire fighter goes in there with a water hose and those batteries are live he or she is done for and most likely the Company too.
Check with your AHJ to insure you are in the correct environment and not putting lives at stake here
GHH.
by dons
Insert comment text here
It's a shame that GE's service group has imploded and the lack of support may be a future issue for you. In the world of UPS', pound for pound, you'll get exactly what you pay for, in service and capability. You mentioned that the Powerware unit did not have the power to support your load yet it took two (2) GE units to handle it. I'm not a proponent of Powerware, just proper use of the right UPS technology in the application it was intended to support. Powerware has different technologies within their stable of equipment. There are many new UPS brands on the market with much better spec's and support than either of these. They're just not as well known or marketed as well as the popular brands. Long term cost of ownership is very important, especially with a new UPS (with an uncertain future). There's more to know about the workings of the GE product than meets the eye. Battery maintenenace is the single biggest factor you'll deal with over the life of any UPS. My suggestion is to consider a UPS purchase with the same amount of research as you would your server. It's just as important.
D.S.
by justin james
D.S. & GHH -
Thanks for the feedback.
"Placing a UPS in a rack with batteries without a mean to remotely disconnect them is a code violation."
This is something that I was NOT aware of, and thank you for bringing it to my attention. I am assuming that you are referring to a master kill switch or some other method of turning them off without getting close to them. The units are single phase, not three phase, so they are no more dangerous than a standard wall outlet. However, I do see your point, quickly filling a room with water with those units still out, while the rescue personnel already cut the power from the outside, could be quite dangerous. I will check into that immediately, and thank you for bringing that up.
"You mentioned that the Powerware unit did not have the power to support your load yet it took two (2) GE units to handle it."
The Powerware units we were comparing it to had a 700 watt maximum power rating, and these units had a 900 watt maximum power rating. Unfortunately, thanks to the current environment, we are not able to simply get one large unit; we only have 15 amp outlets and 1.5 kVa units are the maximum size we can use. Sadly, the office I currently work in was never designed for anyone doing more than having maybe 1 dinky econo-server on a "footstool" UPS. While we are working on moving our operations to a more "computer friendly environment," we need to make do with what we have today, and power protection simply could not wait.
The office selection was made a few weeks before I began working for the company (I would have rejected it out of hand, as it is not suitable for our needs), but we are currently working on moving to a more realistic situation.
J.Ja
by pixitha
by justin james
Kyle -
There are a number of ties between myself and that particular vendor, so I do not beleive that it would be appropriate for me to name the particular vendor. However, I can tell you that the vendor shows up very high in a Google search for this particular product. It was not a "big name" vendor like CDW, Ingram Micro, etc.
J.Ja
by granville
To J Ja: Reading this makes me grateful that Australia(Oz) has 240v current delivered by our mains. I have a 3kVa UPS running on a 10amp circuit, installed by an electrician and approved by a building engineer.
GHH: You make a very interesting point thank you. I must check the safety requirements for my own site.
GAHW.
by justin james
This is the first of a multi-part series demonstrating multithreading techniques and performance characteristics in VB.Net.
Introduction
Multithreading is treated as a black art by many programmers, and for good reason. Even for an experienced programmer, knowing when to multithread an application, where to multithread an application, and how to multithread an application can be difficult to determine. Multithreading is definitely not a science, there are no hard and fast rules whatsoever to guide the programmer. In preparation for writing this series, I contacted Rick Brewster at Microsoft (who worked on the excellent Paint.net software) for advice. He quoted Rico Mariani at Microsoft: "measure, measure, measure." This is sound advice. This series of articles is not going to provide any pat advice, but will offer some suggestions, sample code, and demonstrations of various multithreading techniques as well as showing some performance characteristics, so that you can get an idea of your multithreading options.
Where We Were, Where We Are
The idea behind multithreading is not new, it goes back decades. However, up until very recently, with the advent of HyperThreading processors and then multi-core processors did multithreading become as critical to understand when writing applications as it suddenly is. Before these advances in hardware, unless you were writing applications for use of "big iron," chances were that the system you were coding for would probably not have more than one physical or logical CPU, unless you were writing applications for expensive SMP or parallel processing servers. The Windows world has been almost entirely single processor until recently, while only the high end Macintosh machines had multiple processors. The game has completely changed, particularly with Intel introducing the Core 2 CPUs (codenamed "Conroe"). With this line of CPUs and the guaranteed to follow AMD counterpunch, along with the previous generations of multi-core CPUs, even low end desktop PCs are coming out with multiple logical CPUs.
On a single core, single CPU computer, all multithreading is performed by the operating system with a trick called "time slicing." As a basic idea, time slicing essentially multiplexes requests to the CPU, interleaving them and giving a bigger portion of the pipeline to higher priority processes. While the system is effective and works, it is quite inefficient. The operating system needs to understand which threads go with which requests, and there is quite a bit of overhead associated with the technique. With the new systems entering (and already on) the market, the multithreading game has changed completely, allowing the operating system to dynamically allocate different threads to different logical CPUs based upon the threads' needs. For example, one long running thread can devour all of one core's resources, while the other core handles short lived, simple to process threads such as user input and mouse clicks. As a result, applications that make maximum use of the new architecture will be more responsive, run more smoothly, and provide a better experience to the user.
As an interesting sideline to the new architechtural changes, while the number of cores per physical CPU is increasing (Intel and AMD are currently producing dual core systems, and quad core systems are on their way!), the clock speed of the individual cores has remained stagnant and even gone done a bit in some cases. In other words, while the new CPUs can juggle multiple tasks better than before, single tasks pay a price. This makes it more crucial than ever before that applications be written to use multiple threads in the right places in the right way. Most desktop applications tend to not use multithreading, or if they do use multithreading, the main processing occurs on one thread, leaving the main application's thread free to provide status updates and process user input such as handling a "Cancel" button. We have all seen what a single threaded application looks like: the window goes grey, Task Manager reports that the process is not responding until it suddenly finishes and updates the screen, we see the spinning hourglass, and have no way of stopping it from cranking away without killing the whole process. Even worse, these applications frequently dominate the CPU, causing the entire system to run slow. A properly multithreaded application, particularly one on a multi-core or multi-CPU system does not inflict itself on the user like this.
To sum it all up, an application that is written to be properly multithreaded, all else being equal, will be preferred by a user over one that runs in single thread. And programmers who understand multithreading and have demonstrable experience in the techniques of multithreading will be in increasingly hot demand as the desktop market shifts to the new CPUs.
A Quick Primer to Multithreading Concepts
Multithreading seems to have a language all to itself, and it does! Many of the concepts involved in multithreading simply do not get discussed in traditional procedural or object oriented code, because the problems do not exist. If they are encountered, it is with working with a database, in terms of maintaining data integrity. Here is a brief primer to the ideas in the world of multithreading.
Physical CPU: An actual CPU or processor that fits into a socket on the motherboard. A computer with only one core per CPU will have the same number of physical and logical CPUs.
Logical CPU: A separate CPU pipeline. A HyperThreaded processor will appear to have two logical CPUs per core, and a multi-core processor will have a logical CPU for each core per processor. For example, a computer with two dual-core, HyperThreaded CPUs will appear to have eight logical CPUs (2 physical CPUs x 2 cores per CPU x 2 pipelines per core).
Atomic Operation: An operation in code which must only be executed by one thread at a time, typically to maintain data integrity. For example, the following code block will not work correctly if other threads try updated the variable intSharedVariable, necessitating making this block of code an atomic operation:
intThreadIterations = 0
while (intSharedVariable < intMaximumIterations && intThreadIterations <= 5) {
# Do some work
intSharedVariable++;
intThreadIterations++;
}
Block: A thread (or process) is "blocking" when it is in such a state that all other threads must wait until it is finished to continue their work. Using the example for "Atomic Operation," any thread trying to access intSharedVariable will block until the atomic operation is completed.
Lock: A system for marking a restricting access to a particular variable or object to other threads. The other threads will block until the lock is released. Some locks pertain to both reading and writing (any thread accessing the object will block no matter what), and others are write locks, allowing other threads to read the data but will block when trying to change its value. It is extremely rare to find a read lock, allowing data to be written but blocking on read operations.
Mutex: A locking primitive used to ensure that only one thread at a time has access to a resource.
Semaphore: A counter that counts how many resources are being used at any given time. When the maximum is reached, calls to decrement the semaphore block until another thread releases the semaphore. Semaphores are used to limit the number of threads performing work or accessing a resource, such as in a thread pool.
Monitor: A method of controlling and synchronizing access to objects.
Thread Pool: The .Net thread pool dynamically manages the number of threads and their priority for processes that use it. Any number of threads may be requested to run from the thread pool, but the .Net Framework controls how many are active at any given moment.
A Brief Aside Regarding Virtual Machines
Because of the increasing prevalence of virtual machine (both the host/client type and the hypervisor variety), it is unreliable to rely upon a count of the number of physical processors in a machine. Any low level functions are unreliable at best. Instead, you should count on the OS and/or the .Net Framework to determine the number of processors that are apparent to the OS. The best way to do this within .Net is a call to System.Environment.ProcessorCount which returns the number of logical processors visible to the operating system. That is an important distinction, as a hypervisor or virtual machine system may make only one logical or physical processor accessible by the operating system running your application, while more logical or physical CPUs actually exist. As an example, if you have two dual core CPUs installed and the hypervisor only makes one core available to the OS running your application, but you base your thread usage on the number of logical cores at a low level (which would be four, not the one usable by your application and OS), you will be using four times as many threads as you meant to be using.
The Challenges
Writing applications that use multithreading are not very difficult, particularly if it is of the type where a single thread for processing runs separately from the main thread, to allow for progress bars and cancel buttons. In that case, the programmer has not strayed very far from having a single threaded application running on a multithreaded operating system. Other systems have processing of data that is in an N-dimensional format that does not require any atomic operations, so dividing the workload by logical CPU and processing them simultaneously is not too difficult; many multimedia applications are written in this manner. For example, a graphics program might divide an image into quarters on a system with four logical CPUs, and use four threads to simultaneously apply a filter to each quarter. Other applications like database or application servers will created and queue a thread for each operation, and perform them as possible in the order they were entered, carefully locking key data. Yet other applications will perform as much processing as possible, while network or file I/O processes on a separate thread, splitting the two processes as early as possible and joining them as late as possible to give the I/O the most possible time to finish on its own. And yet other applications need to perform a good number of atomic operations, and weigh the cost of each context switch and blocking against the benefit of each additional thread.
By far, the biggest difficulty with writing multithreaded applications is maintaining data integrity. It is tempting to lock as much code as possible within atomic operations or tie objects up with mutex's and just hope for the best. While that may have a lot of data integrity, the cost of the atomic operations and locking is so high that your application will probably run significantly slower than a single threaded application!
After the data integrity issue has been solved, performance is the next concern. A profiler such as the one included with Visual Studio 2005 is invaluable for this. By using the profiler on a single threaded piece of code, you can see where the bottlenecks are, and judge whether or not they are big enough to justify the cost of multithreading them. Once the application is multithreaded, the profiler helps you measure how many threads is best for your application.
Testing is another challenge. Due to the nature of a multithreaded application, stepping through the application is frequently unrealistic. The best way to test these types of applications is to prepare a battery of input/expected output scenarios and test against those. Code review, particular by peers, can pick up critical details that paper planning and even testing might not catch. Repeated tests are quite important, because depending on your threading technique, the threads may not always be processed in the same order, providing different results if there is a problem. Finally, having a wide range of CPU architectures to test on is extremely important if you are relying upon the number of processors to manage a thread pool or number of concurrent threads.
Building a Multithreaded Application
The next blog post in this series will work us through building the outline of an application designed to demonstrate various multithreading techniques and their performance characteristics. Stay tuned!
J.Ja
by bork blatt
* One * hard and fast rule...
If you're writing a Windows Service application, you definitely want to separate your processing from the thread that deals with service requests, or you may find that when the service is chewing a lot of cycles that you can't stop it.
by stew2
I have to quibble with some of your definitions. You should find these to be better:
Physical CPU: A hardware device containing one or more processor cores.
Processor Core: Hardware in a Physical CPU for processing program instructions.
Logical CPU: A logical device for independently processing instructions. A processor core may have only one logical CPU, but an Intel HyperThreaded processor will contain two logical CPUs per processor core.
Process: The highest level of separate execution managed by an operating system. Each independent instance of an application is a separate process.
Thread: An operating system controlled independent sequence of execution within a process. Each process has at least one thread: the main or primary thread. Additional threads are created using facilities provided by the operating system. Each thread is given time to execute by being assigned to a logical CPU or by dividing the attention of a CPU among multiple threads.
Fiber: An application controlled independent sequence of execution within a process. Fibers are cooperatively scheduled, which means a fiber must yield control so another can be given processing time.
Atomic Operation: An operation that is guarranteed to complete before another thread or processor can interfere. What is classified as an atomic operation varies among architectures and operating systems. What is atomic on one platform may not be so on another.
Critical Section: A section of code that is treated logically as an atomic operation by using appropriate locking mechanisms. The locks keep other threads and processors from interfering with the state manipulated by the critical section.
Lock: A mechanism which can be used to ensure that certain sections of code are not executed, or a shared resource is not accessed, concurrently by independent threads to ensure data integrity. A lock can be owned (acquired) by a specified number
of threads -- usually one -- at any one time and prevents
additional threads from owning it until an existing owner relinquishes
its ownership.
Blocking: The state of a thread which prevents it from continuing until some lock is released or action is completed. One thread can block another by acquiring a lock the other thread requires to continue. The other thread blocks trying to acquire the lock until the first thread releases the lock.
Mutex: A Mutual Exclusion lock; only one thread may own a mutex at a time.
Semaphore: A lock permitting a configurable maximum number of simultaneous owners.
Thread Pool: A usually finite set of threads doled out on demand to requesters. Once all threads have been doled out, additional requests block until a thread is returned to the pool. This avoids managing too many threads which can degrade performance.
Three of the principle difficulties of writing MT apps you failed to mention were deadlocks, races, and priority inversion. The former, you may know, occurs when two threads must acquire two or more locks, but each acquires the locks in a different order. This can allow each thread to acquire less than all of the locks it requires while blocking on the other thread for the remainder. Neither thread can continue, so they are said to deadlock. Race conditions, or races, occur when the result of code is dependent upon which of two threads executes first or when one thread is interrupted relative to another. Priority inversion occurs when a low priority thread holds a lock forcing a high priority thread to block awaiting that lock.
Another area you missed is lock-free programming. While it is particularly difficult to do right, lock-free programming can be a real boon to time critical processing. Using nothing more than a few lock-free, threadsafe data structures can be enough to make a high performance MT app.
by justin james
Stew -
Your definitions are indeed much more precise; I was trying to be brief and a bit "dumbed down," but yours are excellent. You are also correct that I left out many of the challenges, and completely ignored lock-free programming. This particular post (and probably not as well explained as it could have been) is more of lead-in to a series of posts about writing a basic multithreaded application than an all inclusive introduction to the topic as a whole.
J.Ja
by justin james
This is the second of a multi-part series demonstrating multithreading techniques and performance characteristics in VB.Net.
In the last post, I outlined some of the basics of multithreading. In today?s installment, we will be constructing the outline of an application that will show off some different multithreading tricks, techniques, and their performance characteristics. We will be using a modular design, so that we can replace the test functionality with code from other projects to see what multithreading works best for that code.
Without going into any details (it is a very simple Windows application), we put together a basic interface that looks like this:

The only thing in this basic application that is of interest is the status bar. In the status bar, we use a call to System.Environment.ProcessorCount to report the number of logical CPUs (the screenshot was taken on an AMD Sempron system).
Internally, we are putting the processing logic into an entirely separate class as a Shared function, so that we may easily create a command line version of the application, if desired. This class, ThreadTestUtilities also contains two Enumerations for the test types:
Public Enum MultiThreadTestType
SingleThread = 1
DotNetThreadPool = 2
OnePerLogicalCPU = 3
OnePerPhysicalCPU = 4
Arbitrary = 5
End Enum
Public Enum AtomicType
NonAtomic = 1
Mutex = 2
Monitor = 3
SyncLocking = 4
End Enum
Although MultiThreadTestType contains the member OnePerPhysicalCPU, you will note that the screenshot does not show this option. The reason is that relying upon the physical CPU count is quite a bad idea, as explained in the previous post. But we put it into our Enumeration anyways, in case we decide later on to allow testing on that basis.
The Shared function for actually running the tests looks like this for the moment:
Public Shared Function RunTest(ByVal TestType As MultiThreadTestType, ByVal AtomicOperations As Boolean, ByVal Iterations As Integer, Optional ByVal ThreadCount As Integer = 0) AsDouble
Dim DateTimeStartTime As DateTime
Dim DoubleReturnValue As Double
DateTimeStartTime = DateTime.Now
DoubleReturnValue = (DateTime.Now - DateTimeStartTime).TotalMilliseconds
DateTimeStartTime = Nothing
Return DoubleReturnValue
End Function
The function?s return results are the total number of milliseconds that it takes for the test to run. You will note that it looks like no multithreading is occurring yet. This is on purpose. We want as little multithreading in the application outside of the test itself. We will later constructing different functions for actually running the tests and calling them in a standard procedural way from within RunTest().
The final step before we can start constructing the tests themselves is to write a baseline test function. Each of the tests will use the exact same function to perform some computations in order to keep a level playing field amongst all tests. Here is our test function:
Private Function Compute(ByVal InputValue As Double) As Double
Dim DoubleOutputValue As Double
Dim DateTimeNow As DateTime
Dim rndNumberGenerator As System.Random
DateTimeNow = New DateTime(DateTime.Now.Ticks)
rndNumberGenerator = New System.Random(DateTimeNow.Hour + DateTimeNow.Minute + DateTimeNow.Millisecond)
If DateTimeNow.Millisecond > 500 Then
DoubleOutputValue = System.Math.IEEERemainder(System.Math.Exp(rndNumberGenerator.Next * (InputValue + 5000) * System.Math.E), rndNumberGenerator.Next)
Else
DoubleOutputValue = rndNumberGenerator.Next(InputValue, System.Math.Max(Integer.MaxValue, System.Math.Log(System.Math.Pow(System.Math.PI, InputValue))))
End If
DateTimeNow = Nothing
rndNumberGenerator = Nothing
Return DoubleOutputValue
End Function
As you can see, our test function is designed to put the processor through its paces (at least floating point operations) without using much memory at all or to require any disk access. You may want to modify this code to use a lot of memory or to perform disk access or network operations, to meet the conditions that the applications that you are working on will be facing.
In the next post in the series, we will write our first battery of tests, to show single threaded performance, with no locking mechanism required or needed. While the development machine that I am currently working on has only one logical CPU (AMD Sempron 3200, x64 architecture, single core CPU), we will get to see this code in action on an AMD Athlon 3200+ (x64 architecture, single core CPU), an Intel Pentium 4 2.8 gHz (x386 architecture, single core CPU, one logical CPU), and a dual Xeon 3.0 gHz system (two dual-core, HyperThreaded Xeon CPUs with x64 architecture for a total of eight logical CPUs). These will be our test systems for the duration of this blog series, and should let you see how identical multithreading models perform on very different systems.
J.Ja
by justin james
This is the third installment of a multi-part series demonstrating multithreading techniques and performance characteristics in VB.Net.
In my previous post, I created the skeleton of a project that demonstrates multithreaded performance. In this post, we will be filling in the skeleton to dispatch the work to the correct function, and creating a performance baseline using a single thread.
During the testing for this post, it was determined that the Compute() function outlined in the previous post did not work as expected, so it has been revised slightly. Its concept is the same, but the computation has been tweaked a bit to eliminate overflow errors in the math. So now we have the following Compute() function:
Private Function Compute(ByVal InputValue As Double) As Double
Dim DoubleOutputValue As Double
Dim DateTimeNow As DateTime
Dim rndNumberGenerator As System.Random
DateTimeNow = New DateTime(DateTime.Now.Ticks)
rndNumberGenerator = New System.Random(DateTimeNow.Hour + DateTimeNow.Minute + DateTimeNow.Millisecond)
If DateTimeNow.Millisecond > 500 Then
DoubleOutputValue = System.Math.IEEERemainder(System.Math.Exp(rndNumberGenerator.Next * (InputValue + 5000) * System.Math.E), rndNumberGenerator.Next)
Else
DoubleOutputValue = rndNumberGenerator.Next(InputValue) / System.Math.Max(Double.MaxValue - 1, System.Math.Log(System.Math.Pow(System.Math.PI, InputValue)))
End If
DateTimeNow = Nothing
rndNumberGenerator = Nothing
Return DoubleOutputValue
End Function
Our single thread run looks like:
Public Sub SingleThreadComputation(ByVal Iterations As Integer)
Dim IntegerIterationCounter As Integer
For IntegerIterationCounter = 1 To Iterations
Compute(Double.Parse(IntegerIterationCounter))
Next
End Sub
Finally, here are our performance characteristics for 1,000,000 iterations, in milliseconds per test:
|
|
Test 1 |
Test 2 |
Test 3 |
Test 4 |
Test 5 |
Average |
|
System A |
12031.250 |
12046.875 |
12125.000 |
11796.875 |
11906.250 |
11981.250 |
|
System B |
10937.500 |
10718.750 |
10734.375 |
10718.750 |
11000.000 |
10821.875 |
|
System C |
11890.320 |
11749.699 |
11765.323 |
12155.938 |
11765.323 |
11865.321 |
|
System D |
12359.454 |
12343.829 |
12359.454 |
12390.704 |
12406.329 |
12371.954 |
|
Average |
|
|
|
|
|
11760.100 |
System A: AMD Sempron 3200 (1 logical x64 CPU), 1 GB RAM
System B: AMD Athlon 3200+ (1 logical x64 CPU), 1 GB RAM
System C: Intel Pentium 4 2.8 gHz (1 logical x86 CPU), 1 GB RAM
System D: Two Intel Xeon 3.0 gHz (2 dual core, HyperThreaded CPUs providing 8 logical x64 CPUs), 2 GB RAM
It is extremely important to understand the following information and disclaimers regarding these benchmark figures:
They are not to be taken as absolute numbers. They are taken on real-world systems with real-world OS installations, not clean benchmark systems. They are not to be used as any concrete measure of relative CPU performance; they simply illustrate the different relative performance characteristics of different multithreading techniques on different numbers of logical CPUs, in order to show how different processors can perform differently with different techniques.
The performance numbers on the single thread test show some truly fascinating results. System D (the dual Xeon machine) was actually our worst performer on the single threaded test. Although the Xeons seemed to suffer a bit on the single threaded performance, it is expected that they will maintain nearly identical performance when running 8 simultaneous threads non-atomically, while the single core CPUs should suffer penalty for running multithreaded.
Another mildly interesting item to note is the difference in the clock reports between the AMD systems (A and B) and the Intel systems (C and D). The AMD CPUs rounded milliseconds up to units of 0.025 milliseconds (I showed 3 significant digits in the table, but the program returned 4 significant digits). Since all of the test machines are running the same version of the .Net Framework, this is obviously a difference between the two chipmakers. It is not relevant to the results of this test, but it is an interesting data point to remember for future use, in case it ever comes up.
Stay tuned for the next post, which will show our first multithreaded test.
J.Ja
by justin james
[Update 9/11/2006: corrected Joel Spolsky's name, and added relevant links]
There are a few people in the tech world that I would really like to meet. Some of them just seem like they would be cool people to hang out with, some of them would make awesome people to have as a boss or co-worker, and others are just blindingly smart. Here is my list of tech folks that I would like to know, and why.
Joel Splosky Spolsky [Edited 9/11/2006: Corrected Joel's Name]
http://www.joelonsoftware.com/
This guy is really, really smart. Even better, he understands developers and development better than anyone else, and owns his own company. Every blog post of his, I want to forward to my boss (but usually do not, in case it is thought of as criticism). I really like how he is able to put into words the feelings that I have felt about a lot of things so succinctly.
Steve Ballmer
Say what you want about the guy and his business practices, he has an enthusiasm for his job that is rarely seen outside of professional athletics. He treats running Microsoft like he in on the Olympic team. Rarely do you see employees, let alone managers or executives get so excited about stuff (remember the "Monkey Boy" video?). It would be great to have that level of enthusiasm in a manager.
Jakob Neilsen
http://www.alertbox.com
I have been reading his work for well over five years, and I have yet to find something to disagree with him on. Regular readers know how important I think usability is, and he does a better job than anyone else at turning it into a science that is able to work within business realities. "Usability Engineer" is a job title I would love to have, and I would like to get together with him and figure out how to become one.
Mark Hurst
http://www.goodexperience.com/
Mark Hurst is up there with Jakob Neilsen, but he is a lot more focused on the user experience itself, and not the objective study of usability. He is also much like Joel Splosky Spolsky Edited 9/19/2006: corrected name, in that he really "gets" how tech people work, and how to help them work within the confines of business realities. His newsletters are smart and funny, and packed with unique information that you will not find anywhere else.
John Dvorak
http://www.pcmag.com/category2/0,1874,3574,00.asp
I have been reading John Dvorak since I was about 11 years old, or something like that. He is extremely witty, and when he is talking about basic principles, few analysts are smarter. He is rather contrarian, like myself, which I also like. Just because everyone else thinks that something is true does not mean that he will jump on board. Lately I think he has been slipping, but much of that is because he has not been in the trenches for a long time. That still does not diminish his abilities to analyze, and he is still top notch when he has the right information. I also respect that he does not buy into the vendor buzz and media hype, unlike far too many tech writers.
Daniel C. Dennett
http://ase.tufts.edu/cogstud/~ddennett.htm
While Daniel C. Dennett is not a tech industry person per se, his writing and research has a lot to do with technology, and is extremely applicable in technology. He was the first person to write about cognitive science who really made sense to me. Even when he is wrong, he is a good sport about it.
Bill Gates
The man is absolutely ruthless, to the point where it takes the entire government to put the brakes on him. Like Ballmer, Gates has an uncontrolled exuberance for his work and his company. While he may get dinged for copying other people?s ideas, he is excellent and combining the ideas of others in ways which they never thought of. I also really like his philanthropy work; I get the impression that he wants to win for the sake of winning, not for the rewards. While that type of predatory attitude is not entirely admirable, it is certainly respected.
Larry Wall
http://www.wall.org/~larry/
The father of Perl. 'Nuff said.
Mark Cuban
http://www.blogmaverick.com/
Mark Cuban rocks, because he understands what the consumer wants. More specifically, he ignores what the consumer thinks or claims they want, and talks about what they will actually pay money for. That is a huge difference. For example, I know a lot of people who want fancy cars, but prefer to drive economy cars and not pay for a fancy car. Mark Cuban is also a very funny person to read. His whole to-do with Overtsock.com was probably the funniest thing in the tech business world for quite some time.
James Gosling
http://blogs.sun.com/jag/
A geek?s geek, if you know what I mean. He is totally, brutally open and honest to the point where you wonder that his employer (Sun) allows him to appear in public without a muzzle. I remember reading an interview with him a while back, where he actually answered the question of "what are your biggest mistakes" with legitimate answers.
Who is on your list of people in the Tech World that you would like to meet?
J.Ja
by siryes
by justin james
I did indeed spell Joel's name wrong, thanks for catching that! His last name is one of those items where I have to activiely focus on getting it right, because the original spelling I had is how my mind always remembers his name. I am pretty sure that a historical search of my blogs shows that I consistently spell it wrong (worry Joel!). If it is any consolation, my uncle routinely spells my last name incorrectly, despite it being one of the top 10 most common first names out there. Jeames, Jeams, Jams, Jaemes, Jaems as all ways he has spelled it. :)
Ricardo, excellent point about the links. I should have done that from the get-go. I have updated the blog. Interestingly enough, Steve Ball and Bill Gates are the only ones without blogs or personal Web sites. Instead, they choose to communicate through the Microsoft Executive Email system (http://www.microsoft.com/mscorp/execmail/).
J.Ja
by justin james
OK, so a temporary Ubuntu bug disabled X. And this is a problem because? In the years that I have run *Nix servers, I have never once felt the need to install X. The only time I installed X on a server, was because someone else in the organization needed an easy way to follow the progress of some code they were running, and letting them login to X to view a graphical version of top was what they wanted.
Folks, there is no good reason to run (let alone install!) X on a server, unless it is being used as a server for thin clients. If you have a ton of people using X applications, it is easier to get a bunch of X clients and hook them into a big server.
Outside of that fairly rare scenario, why is X on your server? There is nothing that needs to be done on a *Nix server than cannot be done via CLI, without the hassle and headache of dealing with X. X is one of the most miserable pieces of software out there to deal with, right behind BIND. So unless you are running an X farm, rip X off of your server.
J.Ja
by jaqui
by justin james
This is the fourth installment of a multi-part series demonstrating multithreading techniques and performance characteristics in VB.Net.
In today's post, we will take a look at using the SyncLock system to maintain data integrity during operations. We will also be showing off the .Net ThreadPool object as well. Initially, I planned to write my own version of the ThreadPool. However, there is really no reason to do so within the scope of this series. The .Net ThreadPool works great for our needs and is well designed to manage the number of active threads. The .Net ThreadPool is a very smart way of managing multiple threads, and it allows us to set the maximum number of executing threads, which allows us to achieve our goal of seeing what the effects of limiting or expanding the number of running threads has on performance. Writing a thread pool on our own is a rather difficult task, and is not needed unless your project has very specialized needs.
Here is the code for the SyncLockThreadWorker object that performs the computations and atomic operations:
Public Class SyncLockThreadWorker
Public Shared objStorageLock As New Object
Public Shared objCompletedComputationsLock As New Object
Public Shared IntegerCompletedComputations As Integer = 0
Private Shared DoubleStorage As Double
Public Property Storage() As Double
Get
SyncLock objStorageLock
Return DoubleStorage
End SyncLock
End Get
Set(ByVal value As Double)
SyncLock objStorageLock
DoubleStorage = value
End SyncLock
End Set
End Property
Public Property CompletedComputations() As Integer
Get
Return IntegerCompletedComputations
End Get
Set(ByVal value As Integer)
IntegerCompletedComputations = value
End Set
End Property
Public Sub ThreadProc(ByVal StateObject As Object)
Dim ttuComputation As ThreadTestUtilities
ttuComputation = New ThreadTestUtilities
Storage = ttuComputation.Compute(CDbl(StateObject))
SyncLock objCompletedComputationsLock
CompletedComputations += 1
End SyncLock
ttuComputation = Nothing
End Sub
Public Sub New()
End Sub
End Class
Inspection of the class shows that we use SyncLock in two places. The first place is in updating the Storage property. The other place is in updating the number of completed threads. Because we do not ever read the Storage property while simultaneously writing to it, placing the lock within the property accessor is acceptable. For the CompletedComputations property, however, we read and write to it in the same line, making it necessary to lock it as we work with it, as opposed to within the accessor.
This is the code that creates and runs the threads, as well as waits for them all to finish before completing. If we do not wait for all of the threads to be finished, the Sub will exit as soon as the threads are queued.
Public Sub SyncLockMultiThreadComputation(ByVal Iterations As Integer, Optional ByVal ThreadCount As Integer = 0)
Dim twSyncLock As SyncLockThreadWorker
Dim IntegerIterationCounter As Integer
Dim iOriginalMaxThreads As Integer
Dim iOriginalMinThreads As Integer
Dim iOriginalMaxIOThreads As Integer
Dim iOriginalMinIOThreads As Integer
twSyncLock = New SyncLockThreadWorker
Threading.ThreadPool.GetMaxThreads(iOriginalMaxThreads, iOriginalMaxIOThreads)
Threading.ThreadPool.GetMinThreads(iOriginalMinThreads, iOriginalMinIOThreads)
If ThreadCount > 0 Then
Threading.ThreadPool.SetMaxThreads(ThreadCount, ThreadCount)
Threading.ThreadPool.SetMinThreads(ThreadCount, ThreadCount)
End If
For IntegerIterationCounter = 1 To Iterations
Threading.ThreadPool.QueueUserWorkItem(AddressOf twSyncLock.ThreadProc, Double.Parse(IntegerIterationCounter))
Next
While SyncLockThreadWorker.IntegerCompletedComputations < Iterations
End While
Threading.ThreadPool.SetMaxThreads(iOriginalMaxThreads, iOriginalMaxIOThreads)
Threading.ThreadPool.SetMinThreads(iOriginalMinThreads, iOriginalMinIOThreads)
twSyncLock = Nothing
IntegerIterationCounter = Nothing
End Sub
Here are the results of our tests. All tests are for 1,000,000 iterations, and the results are in milliseconds per test run.
TEST 1
This test allows the ThreadPool to manage the total number of minimum and maximum threads on its own:
|
|
Test 1 |
Test 2 |
Test 3 |
Test 4 |
Test 5 |
Average |
|
System A |
17250.000 |
16562.500 |
13984.375 |
14875.000 |
15531.250 |
15640.625 |
|
System B |
16234.375 |
20343.750 |
16718.750 |
16656.250 |
13906.250 |
16771.875 |
|
System C |
17529.413 |
23174.478 |
17998.532 |
19030.594 |
17685.786 |
19083.761 |
|
System D |
33734.590 |
33609.590 |
33281.463 |
33297.088 |
33328.338 |
33450.214 |
|
Average |
|
|
|
|
|
21236.619 |
TEST 2
In this test, we limit the maximum number of threads to one per logical processor:
|
|
Test 1 |
Test 2 |
Test 3 |
Test 4 |
Test 5 |
Average |
|
System A |
13484.375 |
12987.500 |
14656.250 |
13437.500 |
14281.250 |
13769.375 |
|
System B |
15906.250 |
19593.750 |
13953.125 |
15859.375 |
14265.625 |
15915.625 |
|
System C |
17799.610 |
20312.852 |
25457.524 |
27521.648 |
17748.335 |
21767.994 |
|
System D |
33203.337 |
33265.837 |
30765.821 |
31172.074 |
33203.337 |
32322.081 |
|
Average |
|
|
|
|
|
20943.769 |
TEST 3
This test uses only one thread:
|
|
Test 1 |
Test 2 |
Test 3 |
Test 4 |
Test 5 |
Average |
|
System A |
13125.000 |
14093.750 |
15390.625 |
14046.875 |
14875.000 |
14306.250 |
|
System B |
13031.250 |
11859.375 |
13000.000 |
14546.875 |
12015.625 |
12890.625 |
|
System C |
16481.714 |
12681.850 |
14652.150 |
12728.762 |
14386.316 |
14186.158 |
|
System D |
33343.963 |
21953.265 |
21687.638 |
22609.519 |
23625.151 |
24643.907 |
|
Average |
|
|
|
|
|
16506.735 |
TEST 4
This test uses two concurrent threads:
|
|
Test 1 |
Test 2 |
Test 3 |
Test 4 |
Test 5 |
Average |
|
System A |
13656.250 |
14031.250 |
13515.625 |
14484.375 |
13953.125 |
13928.125 |
|
System B |
17656.250 |
14453.125 |
17093.750 |
16828.125 |
18656.250 |
16937.500 |
|
System C |
21673.297 |
22689.722 |
30649.108 |
20844.520 |
33792.205 |
25929.770 |
|
System D |
22906.396 |
22922.021 |
22172.016 |
24515.781 |
25484.538 |
23600.150 |
|
Average |
|
|
|
|
|
20098.886 |
TEST 5
Here we show four concurrent threads:
|
|
Test 1 |
Test 2 |
Test 3 |
Test 4 |
Test 5 |
Average |
|
System A |
27968.750 |
24359.375 |
24406.250 |
21515.625 |
22765.625 |
24203.125 |
|
System B |
33078.125 |
23546.875 |
31687.500 |
34000.000 |
33953.125 |
31253.125 |
|
System C |
30649.108 |
33510.733 |
31462.247 |
34011.127 |
24097.079 |
30746.059 |
|
System D |
25390.787 |
25437.662 |
25484.538 |
25515.788 |
25609.538 |
25487.663 |
|
Average |
|
|
|
|
|
27922.493 |
TEST 6
This test uses eight concurrent threads:
|
|
Test 1 |
Test 2 |
Test 3 |
Test 4 |
Test 5 |
Average |
|
System A |
25484.375 |
26031.250 |
26125.000 |
25312.500 |
25843.750 |
25759.375 |
|
System B |
35812.500 |
36312.500 |
34875.000 |
21578.125 |
23328.125 |
30381.250 |
|
System C |
34402.060 |
34730.443 |
34152.920 |
34726.065 |
34556.444 |
34513.586 |
|
System D |
31234.574 |
31578.327 |
31328.325 |
31468.951 |
31359.575 |
31393.950 |
|
Average |
|
|
|
|
|
30512.040 |
TEST 7
Finally, this test runs 16 simultaneous threads:
|
|
Test 1 |
Test 2 |
Test 3 |
Test 4 |
Test 5 |
Average |
|
System A |
25671.875 |
25562.500 |
25796.875 |
27156.250 |
26078.125 |
26053.125 |
|
System B |
31750.000 |
13171.875 |
38953.125 |
43703.125 |
35500.000 |
32615.625 |
|
System C |
33615.818 |
33710.465 |
33959.402 |
33974.959 |
34021.628 |
33856.454 |
|
System D |
50422.197 |
52656.587 |
44015.906 |
50953.451 |
44859.662 |
48581.561 |
|
Average |
|
|
|
|
|
35276.691 |
System A: AMD Sempron 3200 (1 logical x64 CPU), 1 GB RAM
System B: AMD Athlon 3200+ (1 logical x64 CPU), 1 GB RAM
System C: Intel Pentium 4 2.8 gHz (1 logical x86 CPU), 1 GB RAM
System D: Two Intel Xeon 3.0 gHz (2 dual core, HyperThreaded CPUs providing 8 logical x64 CPUs), 2 GB RAM
It is extremely important to understand the following information and disclaimers regarding these benchmark figures:
They are not to be taken as absolute numbers. They are taken on real-world systems with real-world OS installations, not clean benchmark systems. They are not to be used as any concrete measure of relative CPU performance; they simply illustrate the different relative performance characteristics of different multithreading techniques on different numbers of logical CPUs, in order to show how different processors can perform differently with different techniques.
Compared to our previous test results, it is very easy to see that atomic operations have a very high cost. Additionally, each active thread above and beyond the number of logical processors degrades performance. This is because the OS (I say "the OS" instead of "Windows" because this will apply to any multithreading OS that uses time slices to manage multithreading) has to perform quite a bit of work to manage each thread that runs per processor. It is also easy to see that the ThreadPool object does not make the best possible decisions regarding the number of active threads. While this is not evidence that the ThreadPool object is poorly written, it is evidence that it is wise to override its settings in order to tune performance to the application's needs, based on the type of operations occurring in the running threads. An application running threads waiting on asynchronous I/O, for example, will be able to sustain many more active threads than one such as this one that is performing raw computations. It would also be interesting to force a number of concurrent threads, instead of allowing ThreadPool to manage it. It is difficult to tell if the relatively static results beyond a few threads are because ThreadPool is deliberately throttling the number of running threads or if the SyncLock is creating a traffic jam that no amount of pooling can resolve. The only way to test this would be to rewrite the test to use a homegrown thread pool, and to possibly have each thread perform a much higher work-to-locking ratio. It is also interesting to see that the dual Xeon system still plods behind the other systems. It may be that with a much higher number of forced concurrent threads that the Xeon truly shines.
My next post will have extremely similar code, but use the Mutex object instead of SyncLock to manage the atomic operations.
J.Ja
by justin james
It tends to be the case that when there are three or more competitors for something, the race gets narrowed down to two real contenders fairly quickly. In the case of ASP.Net, J2EE, and PHP, I think the odd man out is going to be PHP. "But," you cry out, "PHP is the language of choice for so many open source Web projects!" So was Perl at one point. It did not save Perl, and it will not save PHP. Why not? PHP does not allow the programmer to multithread their application.
I have been doing a series of posts about multithreading techniques with VB.Net (next week I will be posting Part V, using Mutex's for atomic operations). The code is almost directly translatable into C#, and the principles are identical in Java. They will not work in PHP though. PHP, as far as I can tell by searching and browsing its documentation, does not support multithreading. This is going to be a major vulnerability for PHP in the very near future.
One of the major drivers of the Internet explosion has been the plummeting cost of running a server, thanks in large part to the ability of commodity hardware to handle the load of serving pages over the last few years. Between the LAMP stack, J2EE, and the Microsoft stack, there are plenty of options, and they all work very well on a server that can be had for well under $5,000. Up until recently, however, these commodity servers were using one physical and logical CPU. AMD and Intel have changed the game with their dual core (and soon, quad core) CPUs. SMP motherboards have come down significantly in price as well. The $5,000 number can now get you a server that has two dual core Xeon, Core 2 Duo, or Opteron CPUs. In other words, a modern server is at minimum a two logical CPU machine and is headed towards the four-to-sixteen logical core CPU quite soon (two quad core CPUs with HyperThreading is sixteen logical cores). The Sun T1 CPU has put a 32 thread pipeline into the under-$10,000 price range.
Furthermore, more and more Internet applications retrieve ? but do not require ? data to be retrieved from elsewhere, possibly across a WAN link. If you are a Web developer, would you prefer your application to continue to process its work (for example, retrieving data from the local database, dynamically creating images, etc.) while waiting on the third party chunk of code (such as a Web service), and only have part of the page show a "Sorry!" message? Or do you think it is better for the entire page to take forever if the third party data source has a problem? Personally, I would prefer to process those WAN requests as a separate thread. But PHP cannot do that, because it does not support multithreading.
Sure, PHP supports UNIX style process forking. But the documentation has this to say about forking:
Process Control support in PHP implements the Unix style of process creation, program execution, signal handling and process termination. Process Control should not be enabled within a webserver environment and unexpected results may happen if any Process Control functions are used within a webserver environment.
In other words, PHP, a language that is not terribly useful outside of Web development language, should not use process forking in a Web server. Huh?
PHP is weak in many other areas as well. Its documentation is not very good, and frequently the comment threads provide the information that the documentation should have included but did not. It lacks high quality tools such as IDEs and debuggers in a "ready-to-use" state. I will give PHP this: it is easier to install on top of Apache or IIS than any J2EE server that I have encountered. But outside of that, its only strength was being a Perl-like language (allowing Perl developers to transition to it) while being open source (which neither Java nor .Net are) and being adapted to the Web (which Perl was not). With Ruby and Python in the game, PHP is no longer unique. From what I have heard, read, and seen, Ruby on Rails kicks PHP six ways to Sunday.
PHP is getting hit from all sides, from where I sit. It took RHEL about two years to support PHP5. PHP lacks multithreading support. The .Net Framework and J2EE ecologies are exploding, while PHP5 still feels like a limited knock off of Perl designed to work exclusively with Web pages with a hacky-feeling object model. If you learn Java or a .Net language, you can transition very easily to desktop applications or non-Web server applications; you just need to learn new methods of user interaction. Not so with PHP, it is pretty much so useless outside of a Web server. Meanwhile, Ruby (which does support multithreading) is an excellent general purpose language and the Ruby on Rails framework makes PHP look downright Mickey Mouse in comparison, and it natively supports AJAX (as much as I dislike AJAX, I recognize that it does have its uses, and it is currently quite hot). And Python has been threatening to be "the next big thing" for long enough to believe it may have a chance.
To put it another way, PHP does not do anything that every other language does not do, and it lacks multithreading support, which is quickly becoming a showstopper. If PHP does not catch up soon, I believe that it is doomed. Ruby and Python are poised to take its crown for the open source Web development platform of choice. Remember, Perl and CGI used to own the Web development space entirely; now Perl barely exists in Web development outside of legacy applications. Things change, and PHP needs to change quickly, or it will follow Perl.
J.Ja
Sort by Trending