TurboTax Design FAIL « Scott Berkun
I was thinking about exactly Turbo Tax example today evening and saw this post. Déjà Vu. We get software requirement for complex order processing applications saying "build me an app which is as easy as Turbo Tax". That application, built as easy as Turbo Tax, to do the processing in sequential steps with hints/questions and directions might work for simplest cases, but when it starts deviating from the normal happy path is when things will start getting complex. Slowly such an easy application will start getting complicated with multiple enhancements to handle more and more complex functions to the point it will start deteriorating. After a while it will go downhill when the original users who used it for the happy path will find it unbearably complex.
The trick is to remember why it was built in the first place and keep that balance through the numerous enhancement cycles. The face should still be recognizable through numerous nose jobs.
We used Turbo Tax this time around, had a tough time transferring tax credits from a previous year into this year, and had to spend hours on a simple tax return. In Turbo Tax's defense, other sites could not even handle that scenario.
Showing posts with label software. Show all posts
Showing posts with label software. Show all posts
Customer Service
Five years back, I would have been okay with standing in long queues, going up to the counter where the store clerk would ignore you, take your money and give you what you wanted as if he is doing me a big favor and would never have expected a smile, sorry or thank you. But I have experienced customer service since then and understood the importance of it in my profession too. Following are some things that I have learned:-
1. Attitude 75%, aptitude 25%
o Attitude towards work and attitude towards customer is almost the same thing – your customer is your work or vice versa. I have seen bit of both types of people – brilliant technically, but customer not happy at the end of the day or very good communication skills and can establish rapport quickly, but shallow when it comes to knowledge and hence not successful in execution. Both attitude and aptitude are natural things, but could improve by practice too.
2. Customer is never wrong
o I have seen people arguing with the customer on why he is wrong or why something is impossible to achieve. Your job should be to tell the customer what is possible within the timeframe and cost and why. Instead of discarding something as impossible, it should be broken up and explained as to why it is not possible, which part maybe possible (the complete thing maybe impossible, but parts of it maybe possible). We need to understand the fundamental objective and find ways to achieve that.
o Also, it depends on how you tell it. Even if customer is wrong, for all involved the best outcome is customer coming to the right solution through your guidance. We tend to lose focus on the simple thing that we win only when customer wins because of our ego.
3. Listen first, be responsive, be attentive, be available
o One example from my experience:- It was comparison between product from a major corporation which is already doing business with us in some other space and another new one which was eager to sell. First proposal from the major player was anchored by just one person who came to the requirements review meeting with printed documents which was sent earlier without even reading it once. He kept saying that everything we asked for is included, but didn’t have enough detail on how those could be accomplished, gave vague answers and for specific questions sent via email there was no follow up. Second group had read every document that was sent, had very specific questions which showed that they had read every sentence and had a clear idea how to accomplish those and the meeting was very productive. It just showed that they cared. They followed up on every question that was sent to them to the very last detail and even anticipated the concerns behind the questions and provided answers for those. I got to know later that their sales process was tuned such a way that they were instructed to listen to the customer first rather than go into a “sell sell sell” mode.
o Moral of the story is this:- it is not enough that you have a good quality product. You need to listen to the customers, need to be responsive, need to prepare well and show empathy to solve customer’s problem.
o Respond to the customer queries as soon as you can, be sure to return their voice mails and be around when they need you. Ever had the experience to be in front of a store clerk who is attending phone calls always and giving answers to someone else rather than attending to those who took the pain to come to the store? Ever had the experience of served by someone who seem to be interested in TV or talking to their friends or just plain looking bored? As it says “They will forget what you said, but they will never forget how you made them feel”.
o Often I have seen people totally ignoring what the customer is “trying” to say and stubbornly trying to answer something which is not completely satisfying the customer. It is either lack of compassion to listen, afraid to give direct answer to a direct question and instead deflect it by a fuzzy answer or plain lack of comprehension.
o According to an article from Harvard Business Review, Level 5 leadership means a “deep personal humility combined with intense professional will”. I think it is applicable for a good customer service too. There should courtesy, combined with a determination to get customer requirement satisfied in the best possible way.
4. Put customer first
o Given any situation, deciding what is best for customer should be a natural decision benefiting customer first.
o Customer takes priority – always. If that thumb rule is set, daily prioritizations will be easy.
o Better yet, evaluate how the activity you are doing is helping customer, that guides you how best to do it.
5. Take care of customer's problem completely. Give complete solutions.
o I have read somewhere that your most loyal customers are not the ones who had a flawless experience, but the ones who had a problem that was resolved. I have experienced this while working in application support. Customers will appreciate if their burning problems, the ones causing them much pain and manual work, are solved quickly, completely and gracefully.
o Solving customer’s problems shouldn’t be by putting customers through more trouble. I have experienced cases where customer service is not reachable by phone or one line email replies for a full page concern or where you had to ask the same question multiple times worded differently each time.
6. Never burn a customer bridge:-
o Need to add this here even if it is another end of spectrum and no doubt it will come up in daily life. There may come a time when you have to be strict to the customer or say no or defend your position or your employees or your product. There may be times when you have to let go of the customer, but as it says "Never burn a customer bridge, unless you have to. If you have to, you are more screwed up than you realize". At times it may be simpler to admit the fault and fix the problem. At any rate, don’t ignore the problem, address it completely and give the solution that will keep the customer satisfied.
7. Deliver consistent quality. Deliver on promises. Trust comes from doing this.
o I have read somewhere that long term relationship takes longest time to build. It takes consistent quality deliveries, consistent delivery on promises to build the trust. You could reach a level where there is complete trust from the customer for your word if you say you will deliver something. One another quote:- “If they like you and they believe you and they trust you and they have confidence in you, then they may buy from you.”.
8. Be credible. Be knowledgeable. Be accurate and correct. Know what you’re talking about. Prepare.
o It is very easy to know when someone is talking about something which he doesn’t know exactly. Homework is the key. Prepare before any meeting with customer, be ready with the data customer might want, if you don’t know the answer find out and get back promptly, ask yourself the questions customer might ask and find out the answer before you go to him. Do not answer if you don’t know, the credibility once lost is not easy to regain.
9. Take the extra step, go from implementer to trusted advisor
o Be helpful to the customer even if there is no immediate profit in it. I would remember the occasion when the sales associate walked me to the aisle, pointed to the product and inquired whether that is what I wanted rather than giving me a vague direction and at the same time want to run away from me.
o Better yet, anticipate customer problems and suggest to solving them. This is what takes the relationship from transactional to strategic. All the above ensure that you have customers business and in all likelihood will come to you tomorrow. But when you anticipate customers problems, that means that you have on your time been thinking about what customers wants without a stated need. That enables customers to trust you when they know that you have their concern at the top of your mind and heart and that trust makes you privy to information that nobody else has, which is what makes the relationship strategic.
o Understand the tactical gain and the strategic gain – Assess if the forsaking tactical gain will lead to significant strategic gain.
10. Understand customers personal goals, help them achieve it –
o Beyond the stated needs, understand what are customer’s goals? What is customer's ambition? And align your objectives and goals to achieving that. There are “Program/Company Goals”, “Your goals”, “Your Company’s goals” and “Customer as an individual’s goal. All strong, multi year relationships have been built when you achieve all.
vision and values
I came across this quote which i copied down from somewhere: "A good programmer, in everyday work, is one who can communicate well with users, managers, and other developers, who can write clean, maintainable code, and who can choose the best tools, architecture, and techniques in putting together a solution.".
It may be good to have such brief definitions for roles within an organization - often people get confused or lost in the daily rush about competencies required for the role they are supposed to perform. Similar to how companies are supposed to have vision and value statements, I think it may be good to have personal vision and value statements which one can tune over a period of time.
It may be good to have such brief definitions for roles within an organization - often people get confused or lost in the daily rush about competencies required for the role they are supposed to perform. Similar to how companies are supposed to have vision and value statements, I think it may be good to have personal vision and value statements which one can tune over a period of time.
control
I have been thinking about the level of control one should have on team and project without being a control freak. It is said that with a good manager, people will not feel like they are being managed. One idea that stuck to me from the book Peopleware is, you put a person on a job and if you trust him with it, don’t try to second guess and rob him of the chances to make decisions.
There are couple of types of managers – those who came up the ranks and know how to do the job and those who don’t know the nitty-gritty of their team’s day to day job. If you think you know more about how to do something than your team member, how do you control the urge of doing the job yourself instead of teaching them how to do it without actually doing it? If someone else is taking 10 days to do something that would take 1 day for you, can you grit your teeth and let him or her go through with it and learn?
On the other hand, one downside of having a manager who don’t know or don’t have capability to comprehend the details of job is explaining things to him in layman’s terms all the time and answering umpteen questions on progress and status and such.
It is a balancing act to reduce dependency, delegate authority and at the same time make sure the task is delivered.
Following are some things I would like to practice:-
1. Transfer knowledge upfront as much as possible for people to be able to do the job. Equip people with what they need or rather make sure that they are setup for succeeding.
2. Let them take decisions, you may hint or suggest course of action, but avoid making decisions for them.
3. Check progress, but not every hour of the day. Give meaningful feedback, not once in 6 months.
There are couple of types of managers – those who came up the ranks and know how to do the job and those who don’t know the nitty-gritty of their team’s day to day job. If you think you know more about how to do something than your team member, how do you control the urge of doing the job yourself instead of teaching them how to do it without actually doing it? If someone else is taking 10 days to do something that would take 1 day for you, can you grit your teeth and let him or her go through with it and learn?
On the other hand, one downside of having a manager who don’t know or don’t have capability to comprehend the details of job is explaining things to him in layman’s terms all the time and answering umpteen questions on progress and status and such.
It is a balancing act to reduce dependency, delegate authority and at the same time make sure the task is delivered.
Following are some things I would like to practice:-
1. Transfer knowledge upfront as much as possible for people to be able to do the job. Equip people with what they need or rather make sure that they are setup for succeeding.
2. Let them take decisions, you may hint or suggest course of action, but avoid making decisions for them.
3. Check progress, but not every hour of the day. Give meaningful feedback, not once in 6 months.
JUG
I attended a java user group meeting yesterday. Topic was State of Aspect oriented programming.
20% of audience had used aspect oriented programming in their projects. Compared to the demos given using Ant, JaaS, AspectJ, Sping, Log4j etc, I felt like a barbarian who still use System.out.println(“I am here..”) for debugging and Notepad for coding.
I am convinced that these tools or methodologies increase programmer productivity, code maintainability and durable design. But how many actual customers who pay for IT projects understand or even care about using these? Then again I guess it is not a choice to be made by customers, but by the programmers.
That leads me to next question:- there are so many frameworks, tools and patterns out there. I got involved in one open source project in Sourceforge to get an insight about open source, but had to drop out because of the pace at which people with various strengths (specialists) collaborated. I think the question is beyond which language or which database to use, but whether to use one or other framework should be used for connection pooling, authentication, logging and almost all aspects of programming. It is hard to know what is out there in the first place, so unless you are a specialist how will you choose what to use instead of resorting to old barbarian ways?
On a non-technical note – it is fun to attend such meetings. First objective is to shake out of routine to see what is happening out there in the world. One other interesting thing is to see the community – it was a diverse one in all shapes and sizes. There was one that looked like a cop or a wrestler, another one probably a biker, some students, some grandfathers, many with port bellies (like beer bellies, there is something called programmer bellies), many Chinese and some Indians (I seem to always take a ratio of Chinese/Japanese/Koreans Vs Indians in such gatherings – it is like a performance metric).
20% of audience had used aspect oriented programming in their projects. Compared to the demos given using Ant, JaaS, AspectJ, Sping, Log4j etc, I felt like a barbarian who still use System.out.println(“I am here..”) for debugging and Notepad for coding.
I am convinced that these tools or methodologies increase programmer productivity, code maintainability and durable design. But how many actual customers who pay for IT projects understand or even care about using these? Then again I guess it is not a choice to be made by customers, but by the programmers.
That leads me to next question:- there are so many frameworks, tools and patterns out there. I got involved in one open source project in Sourceforge to get an insight about open source, but had to drop out because of the pace at which people with various strengths (specialists) collaborated. I think the question is beyond which language or which database to use, but whether to use one or other framework should be used for connection pooling, authentication, logging and almost all aspects of programming. It is hard to know what is out there in the first place, so unless you are a specialist how will you choose what to use instead of resorting to old barbarian ways?
On a non-technical note – it is fun to attend such meetings. First objective is to shake out of routine to see what is happening out there in the world. One other interesting thing is to see the community – it was a diverse one in all shapes and sizes. There was one that looked like a cop or a wrestler, another one probably a biker, some students, some grandfathers, many with port bellies (like beer bellies, there is something called programmer bellies), many Chinese and some Indians (I seem to always take a ratio of Chinese/Japanese/Koreans Vs Indians in such gatherings – it is like a performance metric).
age of software
I have been thinking about longevity of software, how it ages and eventually dies. Many of the software that was around while I was baby footing in this industry is no longer around or has come up with newer versions that resemble to the original only in name. Is it possible to write a truly magnificent piece of software that can live forever without being a recluse? If we realistically don’t expect our software to live forever, what are we doing about it?
Is it possible to design for the future in advance? Unless hit by a bus tomorrow, I can venture a fair guess about what will happen to me at most 1 year from now, not more than that. Then how can we design a piece of software to work for even 5 years. Do we even think about how many years a piece of software will be used while designing?
There is music, films, paintings and buildings that last for a really long time, but the average life of software maybe 5 years (wild guess). There are too many parameters changing in software usage. Programming languages, operating systems and hardware is still changing along with maturity of software users, competition in the market, new innovative ways to do business and systems to support it, more and more automation. Internet is becoming part of routine life. A system designed 5 years back to automate a manual process is a called a legacy system now. Sophistication of requirements increase with time – process automation was the original requirement. Now same users want analytics, modeling and personalization of systems.
Business empowerment is another theme that is driving system changes. Users won’t want IT involvement in modifying values in a list of values or adding a field to a page or creating a custom report. Combined with Sarbanes-Oxley and Change Management processes, if you force business users to submit a change request and ask them to go through a set of approvals etc to add a field to a data entry page, then it will be frustrating. On the other hand I don’t think it is possible to make a system completely configurable so that it can sustain itself. At least that is not practical if it is for use by one organization, not a full-fledged product.
What I established so far is that too many parameters change over time – business, sophistication of users and technology. It is not cost effective to create a truly flexible system for use by internal organization. It is difficult to predict future. But is there anything that can be done to extend the life of software? Couple of things comes to mind – routine checkups, constant exercise to remain healthy and accommodate changing needs. I remember something that I studied in school economics – with education, need of people change.
If a request for a similar type of change comes in 10 times a year, it is high time to make the think about a way to reduce the IT dependency in doing that. Alleviate the heartache by giving more control to users. At the same time, don’t expect to cut off IT completely – the system may become like an abandoned house and weeds may start to grow up the roof. With this, my intention is not to make a case for livelihood of IT department.
In conclusion, systems are not immortal, it will age and there should be enough nourishment to keep it going strong and keep up with the changing world.
Is it possible to design for the future in advance? Unless hit by a bus tomorrow, I can venture a fair guess about what will happen to me at most 1 year from now, not more than that. Then how can we design a piece of software to work for even 5 years. Do we even think about how many years a piece of software will be used while designing?
There is music, films, paintings and buildings that last for a really long time, but the average life of software maybe 5 years (wild guess). There are too many parameters changing in software usage. Programming languages, operating systems and hardware is still changing along with maturity of software users, competition in the market, new innovative ways to do business and systems to support it, more and more automation. Internet is becoming part of routine life. A system designed 5 years back to automate a manual process is a called a legacy system now. Sophistication of requirements increase with time – process automation was the original requirement. Now same users want analytics, modeling and personalization of systems.
Business empowerment is another theme that is driving system changes. Users won’t want IT involvement in modifying values in a list of values or adding a field to a page or creating a custom report. Combined with Sarbanes-Oxley and Change Management processes, if you force business users to submit a change request and ask them to go through a set of approvals etc to add a field to a data entry page, then it will be frustrating. On the other hand I don’t think it is possible to make a system completely configurable so that it can sustain itself. At least that is not practical if it is for use by one organization, not a full-fledged product.
What I established so far is that too many parameters change over time – business, sophistication of users and technology. It is not cost effective to create a truly flexible system for use by internal organization. It is difficult to predict future. But is there anything that can be done to extend the life of software? Couple of things comes to mind – routine checkups, constant exercise to remain healthy and accommodate changing needs. I remember something that I studied in school economics – with education, need of people change.
If a request for a similar type of change comes in 10 times a year, it is high time to make the think about a way to reduce the IT dependency in doing that. Alleviate the heartache by giving more control to users. At the same time, don’t expect to cut off IT completely – the system may become like an abandoned house and weeds may start to grow up the roof. With this, my intention is not to make a case for livelihood of IT department.
In conclusion, systems are not immortal, it will age and there should be enough nourishment to keep it going strong and keep up with the changing world.
Top Coder
I came across TopCoder, a site for conducting coding competitions. It is a nice idea to get rated against other programmers and improve the skills. Programming on the job is mostly routine and repetitive for most application development scenarios and standard algorithms are almost never used. This will make sure that we don't forget the fundamentals and with time the routine programs will also get better - develop an eye for better processing, efficiency and performance. What I would like to believe is any activity that is even tingling the brain will add some value directly or indirectly to work - something like regular exercise to keep us healthy.
I was curious about any presence of Indians in this. There are thousands of programmers from India and some very good universities, but I didn’t find the country or any university from India featured in the list. This is just confirming my suspicion that we are better in following than leading. Or it could be just that this is not yet known to our brilliant programmers or all the Indian developers are 110% immersed in the work that nobody has time for things like this.
Anyways I am planning to attempt and get a rating sometime to see where I stand.
I was curious about any presence of Indians in this. There are thousands of programmers from India and some very good universities, but I didn’t find the country or any university from India featured in the list. This is just confirming my suspicion that we are better in following than leading. Or it could be just that this is not yet known to our brilliant programmers or all the Indian developers are 110% immersed in the work that nobody has time for things like this.
Anyways I am planning to attempt and get a rating sometime to see where I stand.
today's article: self-healing programs
Today I read about IBM’s self-healing programs.
I don’t expect it to be as smooth as it is made out to be, but this is adventurous. I was first of all wondering why terms like autonomic computing, artificial intelligence, regenerative systems etc gives a kind of thrill like a fantasy or science fiction. Anyways, it need not be a macro phenomenon, but the principles could be applied in minute way in routine applications as well. Systems doing preventive maintenance sort of checks (like the on-board diagnostics of car and “check engine” warning light) – it should be possible to put in pre-coded periodic self-checks. Systems trying to do some basis error correction before throwing it out to the user (the very first data format error need not be thrown and program aborted – it could try to correct the format and continue). Systems could learn from how it is used and present better ways – frequent navigations, frequent combinations of data made available. Systems doing self auditing on a periodic basis and sending reports. Not only finding problems, but suggesting solutions for it.
I don’t expect it to be as smooth as it is made out to be, but this is adventurous. I was first of all wondering why terms like autonomic computing, artificial intelligence, regenerative systems etc gives a kind of thrill like a fantasy or science fiction. Anyways, it need not be a macro phenomenon, but the principles could be applied in minute way in routine applications as well. Systems doing preventive maintenance sort of checks (like the on-board diagnostics of car and “check engine” warning light) – it should be possible to put in pre-coded periodic self-checks. Systems trying to do some basis error correction before throwing it out to the user (the very first data format error need not be thrown and program aborted – it could try to correct the format and continue). Systems could learn from how it is used and present better ways – frequent navigations, frequent combinations of data made available. Systems doing self auditing on a periodic basis and sending reports. Not only finding problems, but suggesting solutions for it.
software plumbing
I used to be impressed by the dexterity of the maintenance men who come around to fix things around house – about how neatly they accomplish things like fixing a leak or checking the wiring etc. Most of them have ability to make the things work with a quick fix, common sense and knowledge of the tools to use to fix something and they don’t make a mess.
This post is not about the house maintenance, but about putting together a software solution to the immediate need, having the knowledge to select the best tools for the job and to reach a quick solution, not building a house from ground up. In “Zen and Art of Motorcycle Maintenance”, there is a passage about making a replacement part made from a soft drink can for a friend’s expensive motorcycle – when you tell them that it is made from tin can, they may not allow you to put it in. I think it is a natural tendency to buy the packaged/branded/expensive product from a super store and expect that it is the best solution.
This is inspired by something I read today. It talks about “Actual Capabilities over Intended Use”. I loved the idea of using components for what they could do, not what it is documented to be able to do. Find ways to use components where they seem to be perfect and natural fit. I had once made a solution to execute a java component from a code which will be called by Unix script which will be called by java stored procedure which will be called by pl/sql procedure embedded in oracle report file. I had a natural choice path – I couldn’t use certain combinations because of certain system restrictions which leads me to the next natural choice.
Examples over Documentation: for anyone who has gone through endless pages thinking that “all this is good, but how do I do it” might identify with this. Having a Ten Minute Test is a great way to start using something by first seeing how it works – they don’t show you the user manual of a plasma TV in the shop, but they display it out front and give you a remote, may it should be the same with software also – give a chance to test drive. If I am not able to make something work, then I can go into documentation or even the next step – source code. Reading code is the final truth than reading a manual and wondering whether it meant what it said.
This post is not about the house maintenance, but about putting together a software solution to the immediate need, having the knowledge to select the best tools for the job and to reach a quick solution, not building a house from ground up. In “Zen and Art of Motorcycle Maintenance”, there is a passage about making a replacement part made from a soft drink can for a friend’s expensive motorcycle – when you tell them that it is made from tin can, they may not allow you to put it in. I think it is a natural tendency to buy the packaged/branded/expensive product from a super store and expect that it is the best solution.
This is inspired by something I read today. It talks about “Actual Capabilities over Intended Use”. I loved the idea of using components for what they could do, not what it is documented to be able to do. Find ways to use components where they seem to be perfect and natural fit. I had once made a solution to execute a java component from a code which will be called by Unix script which will be called by java stored procedure which will be called by pl/sql procedure embedded in oracle report file. I had a natural choice path – I couldn’t use certain combinations because of certain system restrictions which leads me to the next natural choice.
Examples over Documentation: for anyone who has gone through endless pages thinking that “all this is good, but how do I do it” might identify with this. Having a Ten Minute Test is a great way to start using something by first seeing how it works – they don’t show you the user manual of a plasma TV in the shop, but they display it out front and give you a remote, may it should be the same with software also – give a chance to test drive. If I am not able to make something work, then I can go into documentation or even the next step – source code. Reading code is the final truth than reading a manual and wondering whether it meant what it said.
Ajax
I have been meaning to start checking out Ajax with a little hands-on for quite some time and today I had my “hello world” with it.
AJAX: Getting Started: gives a quick way to start testing. XMLHttpRequest seems to be the key to this. Rest is all about constructing the presentation layer at runtime using javascript than to change the content from server.
Rasmus' 30 second AJAX Tutorial - A wanderer's journal: Pretty much the same as above. I saw this argument at multiple places that Ajax is nothing but hype and people were using DHTML + XML way back etc. I am not yet sure about the extent or power of Ajax, but I liked the idea behind it. It seems to me as something that can be termed as “perception change” – the idea that request-response processing can be done without interrupting the user interaction is great.
Today morning I attended a session on innovation management – it was said that creative ideas which works can be extended, like computers invented for financial calculations now running our whole life or idea of flight getting extended to even space tourism. I think in pre-internet era, a scientist may work on a thesis on his own for his lifetime and may publish some papers in a boring symposium – but with the rate of collaboration these days, it may not take ages to change the world. I think this is sort of revival which is happening right now with open source and new internet – ideas are not restricted to a small group who invent it. Idea should be marketed to get contributors – this may be the “hype” factor. By getting many creative minds taking a swipe at it and finding new ways of using the idea thereby extending it, good durable ideas will find many different uses. If I reject a new idea without much analysis just because I am not feeling comfortable, I may have to consider the possibility that I am getting old.
Ajax: A New Approach to Web Applications Now that I have tasted a small bit of Ajax, I decided to read some more. It seems the name Ajax originates from here. This gives a formalized explanation with the help of good diagrams. Terms like Ajax Engine are a little intimidating, but I think technology is not that complicated. One burning question is – how much can be done in asynchronous way? Only that much which won’t take too much time in server processing – in that case users will anyway have to wait.
Dynamic HTML and XML: The XMLHttpRequest Object : Same example as first two links with a listing of object properties of XMLHttpRequest. But for the first time, I understood that “request destination must be same as the one which serves up the page containing the script”. I need to check whether it is still possible to access webservices in third party domain using this.
What’s Ajax? Some more interesting points and links to learn more.
Ajax Mistakes: Compilation of Ajax mistakes. Some of those may have been put here just because somebody looked for faults, but this puts a thought in mind to caution against overuse and to avoid breaking the application with it. I think Ajax may not be used to solve all problems, but definitely something that may become part of the solution.
Very Dynamic Web Interfaces: One practical example here.
Other pages I whizzed through:-
Three forms of AJAX: solid, liquid and gas: some perspective on levels of usage.
XMLHttpRequest Usability Guidelines and Usable XMLHttpRequest in Practice
: warns against pitfalls in overusing the tools
To investigate more:-
XMLHttpRequest & Ajax Working Examples: links, found something about Java and Google API.
Ajaxian: one scan threw these terms at me - Dojo, Flock, ShrinkSafe, suggestion, autosave, autocomplete, IFrame, XHR, Remember the Milk, Google Reader
Top 10 Ajax Applications: useful to see some examples
Weighing the alternatives: comparisons and adding more arguments to support the claim
Ajax in Wikipedia: More links to go through
Ajax Matters: More links.
AJAX: Getting Started: gives a quick way to start testing. XMLHttpRequest seems to be the key to this. Rest is all about constructing the presentation layer at runtime using javascript than to change the content from server.
Rasmus' 30 second AJAX Tutorial - A wanderer's journal: Pretty much the same as above. I saw this argument at multiple places that Ajax is nothing but hype and people were using DHTML + XML way back etc. I am not yet sure about the extent or power of Ajax, but I liked the idea behind it. It seems to me as something that can be termed as “perception change” – the idea that request-response processing can be done without interrupting the user interaction is great.
Today morning I attended a session on innovation management – it was said that creative ideas which works can be extended, like computers invented for financial calculations now running our whole life or idea of flight getting extended to even space tourism. I think in pre-internet era, a scientist may work on a thesis on his own for his lifetime and may publish some papers in a boring symposium – but with the rate of collaboration these days, it may not take ages to change the world. I think this is sort of revival which is happening right now with open source and new internet – ideas are not restricted to a small group who invent it. Idea should be marketed to get contributors – this may be the “hype” factor. By getting many creative minds taking a swipe at it and finding new ways of using the idea thereby extending it, good durable ideas will find many different uses. If I reject a new idea without much analysis just because I am not feeling comfortable, I may have to consider the possibility that I am getting old.
Ajax: A New Approach to Web Applications Now that I have tasted a small bit of Ajax, I decided to read some more. It seems the name Ajax originates from here. This gives a formalized explanation with the help of good diagrams. Terms like Ajax Engine are a little intimidating, but I think technology is not that complicated. One burning question is – how much can be done in asynchronous way? Only that much which won’t take too much time in server processing – in that case users will anyway have to wait.
Dynamic HTML and XML: The XMLHttpRequest Object : Same example as first two links with a listing of object properties of XMLHttpRequest. But for the first time, I understood that “request destination must be same as the one which serves up the page containing the script”. I need to check whether it is still possible to access webservices in third party domain using this.
What’s Ajax? Some more interesting points and links to learn more.
Ajax Mistakes: Compilation of Ajax mistakes. Some of those may have been put here just because somebody looked for faults, but this puts a thought in mind to caution against overuse and to avoid breaking the application with it. I think Ajax may not be used to solve all problems, but definitely something that may become part of the solution.
Very Dynamic Web Interfaces: One practical example here.
Other pages I whizzed through:-
Three forms of AJAX: solid, liquid and gas: some perspective on levels of usage.
XMLHttpRequest Usability Guidelines and Usable XMLHttpRequest in Practice
: warns against pitfalls in overusing the tools
To investigate more:-
XMLHttpRequest & Ajax Working Examples: links, found something about Java and Google API.
Ajaxian: one scan threw these terms at me - Dojo, Flock, ShrinkSafe, suggestion, autosave, autocomplete, IFrame, XHR, Remember the Milk, Google Reader
Top 10 Ajax Applications: useful to see some examples
Weighing the alternatives: comparisons and adding more arguments to support the claim
Ajax in Wikipedia: More links to go through
Ajax Matters: More links.
Open source initiation – still going on..
Not dead, but not exactly running yet.
• I had registered in three projects – one of them almost dropped me since it is going at an amazing pace, I can’t even think about catching up now. I will have to be patient, setup tools and familiarize, do something small on my own. Two others are still alive.
• I am using Eclipse a lot these days and in the process of falling in love. I have poked around many of the features and almost familiarized it, but still haven’t formed habits around it.
• Need to learn refactoring techniques and concepts. So far, refactoring hasn’t been in the picture, even if I had written a piece of code which I know is not the best. But now I am more or less interested in writing something and getting it working fast, then if I can find fun in improving the code, it will be great.
• Installed MySQL 3.1. After a long time, I am meeting another database. I had brief encounters with IMS, DB2, SQL Server before making Oracle as the One. Even though I know that a ton of features exist in Oracle which I haven’t explored, there is new energy to find out how things work with new gadget.
• Generated SSH key using PuTTY and posted to sourceforge.
Next Steps
• Learn MySQL some and probably use it for some primitive purpose of my own – that is the only way to learn. It is boring to read documentation.
• Experiment with CVS, check in/out, commit.
• Practice the use of ant, Maven and JUnit.
I was struggling through Gregory Bateson’s “Step to an ecology of Mind” for 2 months. One snippet stuck with me – when we learn something and make a habit of it, it slowly sinks to the unknown and we won’t have to even realize that we know it (second nature or subconscious?). I need to get to that stage with this.
• I had registered in three projects – one of them almost dropped me since it is going at an amazing pace, I can’t even think about catching up now. I will have to be patient, setup tools and familiarize, do something small on my own. Two others are still alive.
• I am using Eclipse a lot these days and in the process of falling in love. I have poked around many of the features and almost familiarized it, but still haven’t formed habits around it.
• Need to learn refactoring techniques and concepts. So far, refactoring hasn’t been in the picture, even if I had written a piece of code which I know is not the best. But now I am more or less interested in writing something and getting it working fast, then if I can find fun in improving the code, it will be great.
• Installed MySQL 3.1. After a long time, I am meeting another database. I had brief encounters with IMS, DB2, SQL Server before making Oracle as the One. Even though I know that a ton of features exist in Oracle which I haven’t explored, there is new energy to find out how things work with new gadget.
• Generated SSH key using PuTTY and posted to sourceforge.
Next Steps
• Learn MySQL some and probably use it for some primitive purpose of my own – that is the only way to learn. It is boring to read documentation.
• Experiment with CVS, check in/out, commit.
• Practice the use of ant, Maven and JUnit.
I was struggling through Gregory Bateson’s “Step to an ecology of Mind” for 2 months. One snippet stuck with me – when we learn something and make a habit of it, it slowly sinks to the unknown and we won’t have to even realize that we know it (second nature or subconscious?). I need to get to that stage with this.
open source initiation - continued
Continuing with my open source initiation, I am still preparing with setups and tools installation for couple of projects hoping that I will use them and learn – hope it will not end up like a preparing and rehearsing for a marriage only to find out that it is not going happen.
Anyways, just putting down the tasks, notes and my thoughts so that this will serve as my future reference:-
- Installed WinSCP as the file transfer tool and WinCVS for CVS client. I am still working from WinXP machine; hope someday I will be able to repeat such installation for a Linux machine.
- Installed Oracle JDBC drivers, this time a new jar (for 9i). I had
worked with classes111 and classes12, but didn’t know that a new one, ojdbc14, has come out. I am sure even that has been overridden by 10g drivers. Another generation gap thing going on.
- Installed Maven 1.0.2, build tool. I am still overwhelmed with the number of frameworks churned out from Apache project; it will take some time to get my head around these. Often I find that reading through user guides which starts from bottoms up or dwells too much on details is a slow process to learn. Maven had a Ten Minute Test which gave me some idea about what is involved and now I have a peace of mind that I have understood something and can go back and fill in the gaps as I need.
- There seems to be too many jar files around which I know too little about and that worries me.
- Installed Java Advanced Imaging API 1.1.2_01 and Java Image I/O Tools 1.0_01 and read the top two paragraphs from documentation, more study required.
There are some more terms which come up too often which I don’t have much idea about, but may be good to add to my general knowledge – md5 checksums, JTS, Velocity, Subversion and Turbine. I have a general idea about JUnit and Ant, but haven’t used these – again something which I need to read some more about.
Anyways, just putting down the tasks, notes and my thoughts so that this will serve as my future reference:-
- Installed WinSCP as the file transfer tool and WinCVS for CVS client. I am still working from WinXP machine; hope someday I will be able to repeat such installation for a Linux machine.
- Installed Oracle JDBC drivers, this time a new jar (for 9i). I had
worked with classes111 and classes12, but didn’t know that a new one, ojdbc14, has come out. I am sure even that has been overridden by 10g drivers. Another generation gap thing going on.
- Installed Maven 1.0.2, build tool. I am still overwhelmed with the number of frameworks churned out from Apache project; it will take some time to get my head around these. Often I find that reading through user guides which starts from bottoms up or dwells too much on details is a slow process to learn. Maven had a Ten Minute Test which gave me some idea about what is involved and now I have a peace of mind that I have understood something and can go back and fill in the gaps as I need.
- There seems to be too many jar files around which I know too little about and that worries me.
- Installed Java Advanced Imaging API 1.1.2_01 and Java Image I/O Tools 1.0_01 and read the top two paragraphs from documentation, more study required.
There are some more terms which come up too often which I don’t have much idea about, but may be good to add to my general knowledge – md5 checksums, JTS, Velocity, Subversion and Turbine. I have a general idea about JUnit and Ant, but haven’t used these – again something which I need to read some more about.
open source
After a lethargic period, I have started some more activities which kind of elevated me to another excited level:-
- I have registered in couple of open source projects. Work hasn’t started on anything yet, but I am excited to be in between those terms which were so vague to me so far. I have been reading so much about open source development for last couple of years, but never mustered enough courage to wet my feet. Initially I thought it was only for linux hacks which is a whole different world to me, I had started looking towards that path (reached only the stage of buying the brochures, but didn’t even plan the trip). Now I have enrolled in couple of projects which were looking for Java developers. I am sure it will be a good experience, but hope I can find enough time to work, at the moment I don’t think energy should be a problem.
- Installed Eclipse (another one of those candies I wanted to have for some time) and browsed around. I think having a good IDE goes a long way in terms of productivity. Coding using a textpad will be advisable to learn the nuts and bolts initially, but after a stage it will just slow you down. So learn programming with textpad (otherwise IDE will be too confusing, will hide too many things that we may not understand the basics), but move on to a good IDE before long. I think in a project environment it is extremely important to decide on a good IDE to improve the productivity and enforce standards – I came up with only two uses as of now, but there should be more. Also minor hindrances like start/stop servers, upload/download sources from CVS – if these can be integrated well into IDE then it helps developers to focus on the core task. I haven’t done too much with Eclipse yet, but the plugin development is an exciting functionality.
- Installed Java 1.5, CVS and Tomcat plugin for Eclipse.
- I have got a first hand look at open source development, the way team is communicating to develop a design and got some emails which gave me a surrealistic view of another planet in terms of software development. Putting down the thoughts about design at a high level, getting team’s input – the way things evolve rather than planning the activities using a Microsoft Project, assigning tasks with a strict deadline, one person working on a task, another reviewing it and each knowing some aspects of project. I am not outright rejecting the so called “Cathedral” way of development yet because I think both the scenarios differ. Open Source is a community of developers working mainly out of love of work and as far as I see, there is no lack of motivation and no resistance because it is voluntary. But when organizations need a software developed for its purpose, it is given to a set of developers who do not have a control on requirements, but a hard deadline in front of them, there has to be a way to manage the tasks (limit the chaos) and be predictable in delivering good quality – so the processes involved will be different. But I think it will be advantageous to conventional development to adopt the best practices of open source development.
- One impression I get is, doing conventional development, I was falling behind in terms of better and latest tools for development – For eg: I haven’t touched ant, junit etc. In conventional development or as I read somewhere “mass market development”, tools to develop software is determined by customer or project management and standardized for the project. They cannot have developers wasting precious time on tools. Doing open source sort of development, developers are looking for better tools, improving the tools if something doesn’t work and maybe more productive as a result.
- I realize it is a long way before even I write one line of code, hope I stay that long since that is the next milestone or the next lifeline to continue this interest.
- I have registered in couple of open source projects. Work hasn’t started on anything yet, but I am excited to be in between those terms which were so vague to me so far. I have been reading so much about open source development for last couple of years, but never mustered enough courage to wet my feet. Initially I thought it was only for linux hacks which is a whole different world to me, I had started looking towards that path (reached only the stage of buying the brochures, but didn’t even plan the trip). Now I have enrolled in couple of projects which were looking for Java developers. I am sure it will be a good experience, but hope I can find enough time to work, at the moment I don’t think energy should be a problem.
- Installed Eclipse (another one of those candies I wanted to have for some time) and browsed around. I think having a good IDE goes a long way in terms of productivity. Coding using a textpad will be advisable to learn the nuts and bolts initially, but after a stage it will just slow you down. So learn programming with textpad (otherwise IDE will be too confusing, will hide too many things that we may not understand the basics), but move on to a good IDE before long. I think in a project environment it is extremely important to decide on a good IDE to improve the productivity and enforce standards – I came up with only two uses as of now, but there should be more. Also minor hindrances like start/stop servers, upload/download sources from CVS – if these can be integrated well into IDE then it helps developers to focus on the core task. I haven’t done too much with Eclipse yet, but the plugin development is an exciting functionality.
- Installed Java 1.5, CVS and Tomcat plugin for Eclipse.
- I have got a first hand look at open source development, the way team is communicating to develop a design and got some emails which gave me a surrealistic view of another planet in terms of software development. Putting down the thoughts about design at a high level, getting team’s input – the way things evolve rather than planning the activities using a Microsoft Project, assigning tasks with a strict deadline, one person working on a task, another reviewing it and each knowing some aspects of project. I am not outright rejecting the so called “Cathedral” way of development yet because I think both the scenarios differ. Open Source is a community of developers working mainly out of love of work and as far as I see, there is no lack of motivation and no resistance because it is voluntary. But when organizations need a software developed for its purpose, it is given to a set of developers who do not have a control on requirements, but a hard deadline in front of them, there has to be a way to manage the tasks (limit the chaos) and be predictable in delivering good quality – so the processes involved will be different. But I think it will be advantageous to conventional development to adopt the best practices of open source development.
- One impression I get is, doing conventional development, I was falling behind in terms of better and latest tools for development – For eg: I haven’t touched ant, junit etc. In conventional development or as I read somewhere “mass market development”, tools to develop software is determined by customer or project management and standardized for the project. They cannot have developers wasting precious time on tools. Doing open source sort of development, developers are looking for better tools, improving the tools if something doesn’t work and maybe more productive as a result.
- I realize it is a long way before even I write one line of code, hope I stay that long since that is the next milestone or the next lifeline to continue this interest.
Today I listened to an inspiring and very interesting talk by Adam Bosworth given in Salesforce.com’s annual event – Dreamforce. It is titled Intelligent Reaction. Summary of the talk is that companies should react to customer needs and use the customer data to evolve rather than going with a grand plan. It is in line with couple of things I am following nowadays – Agile development and Using customer/transaction data to make better decisions (I wonder whether there is a term for it).
I caught a lot of phrases maybe clichés but good to keep focus, so spewing it out here – talk to people, listen carefully, Iterate, evolve, intelligent reaction vs intelligent design, start small, lots of releases instead of one grand plan, change with times, follow your customer in real-time, learn and change, nothing is perfect.
This is the changing way of software development, but I wonder how many organizations adapt to this. I think it is probably easy to track the usage, listen to customer and change rapidly to the better ways in an application which is lightweight, but what about applications like CRM or ERP which dealing with business, revenue, people and life in much more real way. Will the sales reps working on deals which directly affect their compensation (who may not understand the working of software) be open to start with an application which is barely good but adaptable to change thereby constantly changing the process? It is a different case when your applications audience is internet savvy and understands software in a hands-on way when it comes to adaptability. But as he said, instead of a grand plan, it is exciting to try it out and learn from mistakes, change, improve and evolve.
I caught a lot of phrases maybe clichés but good to keep focus, so spewing it out here – talk to people, listen carefully, Iterate, evolve, intelligent reaction vs intelligent design, start small, lots of releases instead of one grand plan, change with times, follow your customer in real-time, learn and change, nothing is perfect.
This is the changing way of software development, but I wonder how many organizations adapt to this. I think it is probably easy to track the usage, listen to customer and change rapidly to the better ways in an application which is lightweight, but what about applications like CRM or ERP which dealing with business, revenue, people and life in much more real way. Will the sales reps working on deals which directly affect their compensation (who may not understand the working of software) be open to start with an application which is barely good but adaptable to change thereby constantly changing the process? It is a different case when your applications audience is internet savvy and understands software in a hands-on way when it comes to adaptability. But as he said, instead of a grand plan, it is exciting to try it out and learn from mistakes, change, improve and evolve.
Extreme Programming vs. Interaction Design
I am interested in learning more about extreme programming, but haven’t been able to read in detail or practice any part of it so far – I will get back to that sometime soon. Interaction design – that’s a term which I came across for the first time and at the outset it sounds like a fuzzy concept to me. Following are some of my thoughts (quotes from article are in Italics):-
• I think the deepest tacit assumption is that we have a significant organizational problem, but we can't fix the organization. I believe that in order to create quality software, you have to change the organization.
• It's my experience that neither users nor customers can articulate what it is they want, nor can they evaluate it when they see it. Neither the people who buy software nor the people who use it have the capability of visualizing something as complex as the behavior of software. They also don't have the ability to analyze what appropriate behavior is.
I started my career with software development which is transferring a written piece of requirements into design and code. It will only add to the quality of the software if you know the requirements first hand from the person who is going to use it – it will give a whole different perspective to the development of product. To someone transforming requirements document to code, idea of defining how your customer/user should be doing business and build software for that is paradigm shift. It requires a cultural change to go to a mode where we understand what user actually wants or rather needs and suggest it back to him.
• I believe that defining the behavior of software-based products and services is incredibly difficult. It has to be done from the point of view of understanding and visualizing the behavior of complex systems, not the construction of complex systems.
• The way the industry works right now is the initial cut at a solution is generally made from the point of view of a feature list that comes from the marketing people or the in-house customer, then given to the developers, who then synthesize a solution. It's not a construction problem; it's really a problem of design—not interface design, but behavior design.
• Usually, the architect at the sketch level will know enough not to design something that's an engineering problem.
• I think it's wrong when phases are abused, namely when phases have arbitrary boundaries and when there's no recourse and the people who are participating in the various phases are not working together.
There is an argument that there is logical side to software development which is essentially programmer’s domain and there is a human side where we understand users and business and there has to be a bridge of Interaction Designer who could define the behavior of the system and then translate it to Developers. Compared to this I tend to agree more with XP’s argument that software development shouldn’t be composed of phases and appropriate social structure is not a hierarchical one, but a network structure. I think it is not possible for every developer or designer or architect to be involved in the requirement definition to gain insight into the actual use of the product - but it need not be a segregated job function. It must be coming down to job profiles and competencies. Best programmers or architects may not be best communicators and hence may not have the tact to elicit the requirements from the customers. But there may be people who excel in this area but do not understand or have little interest in workings of software as such. To have the capability to define the requirements/product behavior/organizational complexity and architect the solution and understand the technical feasibility at the same time is the right combination at this stage. Building design is taken as example – I may have flights of fantasy when it comes to building my house, but some may not be possible to do technically or there may be better ways to do it – it is architect’s job to suggest a cost-effective, structurally good design. Interaction design is trying to alleviate this split/phase of design and development by suggesting that interaction designer links up with developer during the development phase. But in my experience that may not be enough. Breaking down the hierarchical structures of management, customer/user, technical architect, developer and having them interact and having open bi-directional channels of communication will definitely help.
From my understanding so far there has to be a better way to manage change in software development and by incremental cycles of development and better involvement of customers/stakeholders in the process of development it is possible to achieve much better quality. I guess the challenge is to do this without introducing more chaos and to institutionalize the practices to have more predictability.
• I think the deepest tacit assumption is that we have a significant organizational problem, but we can't fix the organization. I believe that in order to create quality software, you have to change the organization.
• It's my experience that neither users nor customers can articulate what it is they want, nor can they evaluate it when they see it. Neither the people who buy software nor the people who use it have the capability of visualizing something as complex as the behavior of software. They also don't have the ability to analyze what appropriate behavior is.
I started my career with software development which is transferring a written piece of requirements into design and code. It will only add to the quality of the software if you know the requirements first hand from the person who is going to use it – it will give a whole different perspective to the development of product. To someone transforming requirements document to code, idea of defining how your customer/user should be doing business and build software for that is paradigm shift. It requires a cultural change to go to a mode where we understand what user actually wants or rather needs and suggest it back to him.
• I believe that defining the behavior of software-based products and services is incredibly difficult. It has to be done from the point of view of understanding and visualizing the behavior of complex systems, not the construction of complex systems.
• The way the industry works right now is the initial cut at a solution is generally made from the point of view of a feature list that comes from the marketing people or the in-house customer, then given to the developers, who then synthesize a solution. It's not a construction problem; it's really a problem of design—not interface design, but behavior design.
• Usually, the architect at the sketch level will know enough not to design something that's an engineering problem.
• I think it's wrong when phases are abused, namely when phases have arbitrary boundaries and when there's no recourse and the people who are participating in the various phases are not working together.
There is an argument that there is logical side to software development which is essentially programmer’s domain and there is a human side where we understand users and business and there has to be a bridge of Interaction Designer who could define the behavior of the system and then translate it to Developers. Compared to this I tend to agree more with XP’s argument that software development shouldn’t be composed of phases and appropriate social structure is not a hierarchical one, but a network structure. I think it is not possible for every developer or designer or architect to be involved in the requirement definition to gain insight into the actual use of the product - but it need not be a segregated job function. It must be coming down to job profiles and competencies. Best programmers or architects may not be best communicators and hence may not have the tact to elicit the requirements from the customers. But there may be people who excel in this area but do not understand or have little interest in workings of software as such. To have the capability to define the requirements/product behavior/organizational complexity and architect the solution and understand the technical feasibility at the same time is the right combination at this stage. Building design is taken as example – I may have flights of fantasy when it comes to building my house, but some may not be possible to do technically or there may be better ways to do it – it is architect’s job to suggest a cost-effective, structurally good design. Interaction design is trying to alleviate this split/phase of design and development by suggesting that interaction designer links up with developer during the development phase. But in my experience that may not be enough. Breaking down the hierarchical structures of management, customer/user, technical architect, developer and having them interact and having open bi-directional channels of communication will definitely help.
From my understanding so far there has to be a better way to manage change in software development and by incremental cycles of development and better involvement of customers/stakeholders in the process of development it is possible to achieve much better quality. I guess the challenge is to do this without introducing more chaos and to institutionalize the practices to have more predictability.
Subscribe to:
Posts (Atom)
aspen, blinding light
I took a day off today, just to avoid leaves expiring by month end. It was a relaxing day and had two instances of curious connections. I di...
-
Most of the books we read have strategies assuming people are rational. What if there was a book on "How to work in a group of people ...
-
Came across this NY Times article – Study Rethinks Importance of Kindergarten Teachers . Quotes from it:- Students who had learned much m...
-
I took a day off today, just to avoid leaves expiring by month end. It was a relaxing day and had two instances of curious connections. I di...