Short-Term, Long-Term and External Memory

By Krishna, May 30, 2007

With due respect to biology, here are the types of memory that we human beings can tap into:

  • Short-term memory
  • Long-term memory
  • External memory

Short-term memory contains all the recent events that happened to us. For example, if I ask you how you spent yesterday, you can probably give minute details of the entire day. However, you would probably not be able to do the same for a day three months back. We can also consciously try to store important pieces of information in short-term memory. For example, if someone gives us an email address over the phone, we can remember it long enough to write it down after we put down the phone.

Although short-term memory is transient, it is essential in our life. Human beings would not be able to converse with each other if each one forgot what they or the other person said immediately after they said it. Short-term memory also provides a “working database” from which we can perform various activities at home or work. For example, a programmer needs to know all the business rules of an object when writing code.

There is also an advantage of memory being short, because we have the ability to forget things not worth remembering. Many things that happen daily, like the cars that passed you on the highway, are not important to keep thinking about. You can also utilize your short-term memory to remember key points before an important event (meeting, test, etc.) that may not be relevant afterwards.

Long-term memory is where we specialize and build deep knowledge. It contains ingrained habits that can be used to perform activities without really paying attention to them. For example, when someone asks us to multiply two numbers, we easily tap into the multiplication tables that we learnt years or decades ago. There is something interesting going on, because if you ask a child who is learning multiplication, he would find it more difficult even though he is currently learning the subject.

The reason, of course, is that the child is using short-term memory which is very fickle. But an adult has built upon the multiplication skills to learn higher concepts like algebra, geometry, trigonometry, etc. that the basic concepts are laid in stone. That is the secret behind long-term memory: The more you practice, the more you transfer from short-term memory to long-term memory.

Consider another example from sports: When you first start playing tennis, you find it tough even to keep score. Serving, volleying, etc. all are difficult. But after sometime, these become second-nature. But then you have moved to a different playing level – what will the opponent do next? How do you outlast a 5-set match? How much spin do you employ?

So every time, you are moving decisions that you had to carefully consider to a part of your brain where the decisions happen automatically. This allows you to focus on more important decisions ignoring items of less priority. This is similar to voluntary and involuntary muscles. The involuntary muscles take care of body processes like respiration, digestion, etc. without your involvement. The voluntary muscles give you the flexibility and freedom where you need it.

Finally, we have external memory which is outside our body. This primarily means knowledge in the form of paper in books, bits on electronic media, etc. where you can easily access them without having to remember. You can record both information as well as logic. By the latter, I mean, we can record how decisions are made, what processes should be followed, etc. At the same time, we are not bound to the external documentation, we still continue to have the freedom to innovate and make new rules.

Now, you are thinking, “This is all very nice, but remind me again why I am reading this.” Well, the point of this article is to ask ourselves how can we take teh greatest advantage of the different forms of memory. Here are some ideas:

  1. Leverage external memory as much as possible so that you can focus less on trying to remember things and more on analyzing and making decisions. Don’t try to remember anything you don’t have to remember. Instead, note down where you can get to that information if you ever need it.
  2. Keep your personal external memory as compact as possible so that recall can be faster. If you have tons of ideas written down, it is difficult to find any idea again. Instead keep only the most important points. Nowadays, Google and Wikipedia are better than the best notes you can keep. If you can find it on Google, throw away your personal notes.
  3. If knowledge of the important aspects of your job are in your internal long-term memory, you will be really efficient at your job. And you can get around any challenges in your job by knowing where and how to locate the external memory that contains the information. For example, knowing the right query to type into Google.
  4. Short-term memory is not that useful in real life, because you have access to huge amounts of external memory. Unfortunately, the teaching profession doesn’t really understand this properly. They keep insisting on making you remember stuff that you could look up. If you are a student, this means that you still need to work on trying to remember things that you probably don’t like just so you can obtain results necessary outside your school life.
  5. To be an expert, you absolutely need to work on building long-term memory in the subject. The way to do this is “continuous practice”. If it is theory, read as much as you can. If it is something practical, keep doing it until you can do it in your sleep.

Some Thoughts on Reading

By Krishna, May 29, 2007

Having spent much of the long weekend sick at home reading, here are some of my random thoughts about reading in general and books in particular:

  1. It is impossible to read all books. This is so plainly obvious, but difficult to follow especially when you see a new book with a great design on a glossy cover. To avoid wasting time on rubbish books, use lists of great or bestselling books compiled by good sources. Some examples: Recommended Reading by Jeff Atwood of Coding Horror, Book Reviews by Joel Spolsky of Joel on Software, Personal MBA books by Josh Kaufman, etc. Use Amazon reviews to see if a book is worth reading. I have also created quick 1-minute reviews of books I read on business management and technology.
  2. Reading a book at one stretch is a joy to treasure, but such opportunities come rarely. Learn to read books like articles, i.e., chapter by chapter. This way, you can break off, do something else, come back and continue with the book. If chapters in the book are too large, read section by section.
  3. The greatest respect you can give to a book is to ruin it by constant use. A book that is clean with straight pages is useless because its knowledge is locked inside. If you own the book, dog-ear important pages. Use a marker or tape to highlight good sections. Let it get crumpled or rain-drenched because you keep carrying it around. If you are done with the book, give it away to your local library or to a friend who will value the knowledge.
  4. Talking of dog ears, I dog-ear the bottom corner of a page to note important sections while the top corner only has one dog-ear to keep track of the last page I read. Bookmarks would have been better, but they keep falling out and I keep losing them. But I digress.
  5. Don’t make notes from the book unless you plan to use them very soon, send them to someone or use them as a reference for another book. If that is not the case, those notes will become shelf-ware, never to be seen again. Why waste the time? Read the book, enjoy and remember what you can. Besides, if the book is really good, you can always find another copy in the local bookstore or the library.
  6. Read multiple books at the same time. Huh? Well, not exactly simultaneously. But keep different books at different spots in your home. When you are in that spot, read a few pages. It is amazing how many books you can get through by this technique.
  7. Books can be fun. Books can be informative. Great books are both – they provide knowledge and you really enjoying reading them. However, if you are reading to gain knowledge, don’t assume all reading is fun. Sometimes, there are a few boring tomes on a subject, including the authoritative ones, and you have to be ready to wade through them to understand the information.
  8. Many great books are freely available on the Internet. No, not pirate downloading sites, but sites like Gutenberg and Librivox. And of course, some of the most superb writing in recent years is not available in a book, only on websites and blogs. Examples: Steve Yegge and Paul Graham.
  9. The more I read, the more I realize how little I know. Reading great writers is a humbling experience. It also makes you thirsty for more great writing. Unfortunately, there is only so much time. If you have children, the greatest gift you can give them is to make them interested in reading at an early age. That way, they have a lifetime of book reading to savor.

Over-reaction

By Krishna, May 27, 2007

It is not a fun way to spend the Memorial Day weekend, but I am down with pollen allergies. Trapped indoors and taking medication, I started thinking about ironic an allergy is. Normally, a disease is caused when an external agent like a virus or bacteria attacks the body. However, in the case of allergies, a harmless agent like pollen triggers a false alarm in the immune system and causes all sorts of discomfort.

In this blog, I have talked many times about the risks faced in projects and how to avoid them. But it is just as important to know how not to over-react when things go wrong. A typical calm reaction to a problem that has materialized would be to fix it and then try to understand how it happened and whether it could occur again and if so, how often. Unfortunately, what happens in these situations (and I am no exception) is to become emotional and make a mountain of a molehill.

A rushed managerial reaction to unanticipated issues is to introduce new policies and procedures to prevent them from happening in the future. Though this may be necessary sometimes, doing so increases the bureaucracy within the organization and restricts its options for taking a different approach. For example, let us say that a customer complains about a product. Is that something that must be handled according to a manual containing a detailed set of instructions with canned answers by the customer service representative? Or should it be handled based on the situation using a viewpoint of customer satisfaction?

Another situation where I have seen over-reaction is in communication between people who have become alienated for some reason or the other. Family disputes are common examples, but you can also see this between managers and employees, different departments or even among co-workers. Each time one party communicates something to the other, it is viewed with tremendous mistrust and objected to.

For example, when there is tension between a company and its union, introducing any new process or machines into the company is doomed to fail, even if they make the employees’ lives easier. Why? Because the union mistrusts the company and thinks that the new process would be used to make employees redundant. You can understand the thinking, but the over-reaction may have been based on a miscalculation of the company’s intentions and is harmful to both the company and the employees, as it erodes the profitability of the company and the safety and comfort of the employees.

I have frequently heard people referred to as “high maintenance”. The concept is that such people react negatively to everything that happens to them, even if something is for their good. Recently, while I was doing some research on RSS and Atom, I ran across Dave Winer’s profile on Wikipedia and his troubled relationships with people like Tim O’Reilly and others. Here is an example of a highly creative person who could have contributed greatly to many initiatives, but unfortunately is held back by his inability to adapt himself to work with other people the way they expect.

My experience with over-reacting people and organizations is that it is very difficult to change them. I have met hundreds of such individuals in my personal and work lives and given up on almost all of them. As an incurable optimist, I always try to get people to change, but this is one psyche in the character that is virtually impossible to remove. Each person is different and they have different reasons why they do this. Here is a collection of such behavior:

  1. Some people deny there is anything wrong in their behavior. Since they won’t admit to any problems, there is nothing to discuss.
  2. Others will say that their behavior is not optimal, but it yields results and that is what matters.
  3. A few listen politely to what you have to say and then turn around, point out your flaws, demonstrate your hypocrisy and then tell you to shut up.
  4. Some will listen even more courteously, thank you and continue to behave as if nothing was ever discussed. You sometimes wonder why you bothered.
  5. “This is the way I am and I cannot change,” is the philosophy of some, who apparently think they were born this way. :-)

Such over-reaction is a problem because I have seen the other side of the equation – how other people deal with over-reacting persons:

  1. Good-hearted people usually try to do their best to tender to the complaints of such persons, until they find out two things: Whatever good they do is never valued and any mistake they do is over-amplified several times.
  2. The most harmless thing that can happen to such a person is that he or she is isolated. People try to avoid having any dealings with them. It is not that they are angry at the person, but that they don’t want to ruin their day by a bad reaction.
  3. People consciously transfer good opportunities from this person to another. For example, if you have a spare ticket to a good show, you would rather give it to someone who thanks you than to a grouch.
  4. Bad news reaches this person late. Why be the messenger that gets shot? This happens to a lot of managers who overreact to silly mistakes that are easily fixed. Their employees are terrified of delivering the truly bad news. By the time they get the information, it is too late to do anything about it. If you ever had to ask, “Why didn’t you tell me this before?”, probably it is time to take a hard look in the mirror.
  5. Not-so-kind-hearted people in power actively try to cause harm. Inside a company, trouble-makers (well-meaning or not) are always on the hit list to be fired first. Never heard of such a list? Nobody actually writes one down (heaven forbid), but you always know who the company would lay off first if they had some financial problems.

The last part is actually the most tragic thing because when these persons encounter real problems, they find that they don’t have any friends left. Visible success can help one gain a lot of friends, but when the chips are down, many friends evaporate because there is nothing in it for them anymore. The unfortunate problem with over-reacting people is that they delude themselves about the value they bring to others, and unfortunately realize this only when things go sour. Examples abound: The abusive husband, the uncaring parent, the irritable manager, the disgruntled employee.

It is a mistake to imagine that this behavior is the monopoly of certain individuals and we are exempt from it. Everyone (including me) has had their share of behaving irrationally and over-reacting. It is sometimes difficult to know when we have crossed the line from being a reasonable person who has outbursts sometimes to being an irrational jerk who people are afraid of upsetting. Here are a few guidelines:

  1. Look at your behavior carefully. If you find yourself angry, walk away and cool down. Speak with or email the person when you have greater control of your emotions.
  2. If you have just behaved badly, apologize to the person. It does not matter whether you were right or wrong in the situation, you were definitely wrong in your actions. When apologizing, don’t say, “I am sorry, but you made me behave that way.” Just say, “I should not have said that to you. I am sorry.” Period. Do not make excuses, it just devalues the apology.
  3. No one behaves like a normal human being under pressure. Provide release valves for the pressure by open, frequent communication. The more you talk with a person, the more you understand what is going on and the less likely to have a knee-jerk reaction.
  4. Avoid sarcasm at all costs. It is worse than direct attacks, because by showing your loathing, it destroys the other person’s self-respect. Managers, who sometimes don’t want to tell the truth to employees, use sarcastic remarks, making things much worse.

Anger, mistrust and other negative emotions are common human behavior. Nobody is a saint and we will make mistakes. However, we do have the power to change, if we consciously look at ourselves and recognize our flaws. Let’s start trying.

The Dangers of a Hobby Project

By Krishna, May 26, 2007

Yesterday, I posted about doing a hobby project so that you can learn more about various technologies. While I strongly advocate hobby projects, they have some problems too. Let us explore some of the dangers or pitfalls you may encounter. Much of this is based on my personal experience.

The foremost problem is a tendency to use the hobby project as a model to build a real-life application and try to manipulate the latter project’s requirements to fit your project architecture. For example, let us say that you have designed a new workflow framework. When you start a new project, you are deeply tempted to re-use your framework and therefore all the project requirements get filtered through this mentality – you want to see what all can fit into your framework and where you will need to make changes.

This is in opposition to what you should actually do in a project. Understand the requirements and choose the right framework and technology based on the needs. You can build things from scratch, buy third party solutions or re-use existing code, but whatever you do should not be pre-determined. Whenever you do a hobby project, you are always seduced by the future possibilities of the outcome of your experiments.

The second problem is seriously under-estimating the work necessary in real-life applications. In a hobby project, you can literally get away with murder. You can ignore all coding standards. You don’t have to put any error checking. Security, performance, robustness, usability, etc. which are essential concerns in a real application are rarely needed in a hobby project. So estimates based on hobby project models rarely contain the effort and time required for implementing these elementary needs.

Even worse, most people have a tough time understanding how much time they actually spent on a hobby project. It is very unlikely that anyone would actually record the times they spent and since the task is enjoyable, it seems to go by very fast. Also, when the hobby project uses a new language, design or framework (that has recently displaced an older one), the developers tend to exaggerate the ease of use of the new tool and downplay the drawbacks, because they want to continue using the new technology.

Hobby projects should be treated as no more than “code snippets”. They can be considered as sources of islands of re-usable code, ideas and logic. They are outcomes of your internal research and development. Artifacts of your hobby project are just tools in your larger toolbox of techniques and solutions.

When you start a new project, you should totally forget about the hobby projects you did. For that matter, you should stop thinking about the previous projects that you did. Just stop and listen to the customer. Take down his/her requirements and make sure that you understand exactly what he or she wants. Then you decide whether it is feasible to implement those requirements and if so, how.

During the “how”, resist the impulse to automatically reuse or discard something you did before. Find the technical solution that will most closely meet the requirements spelled out by the customer. Sometimes, you get to use your hobby project ideas. Sometimes, you don’t. But since your goal is to serve the customer, that doesn’t really matter.

Ultimately, that is the difference between the hobby project and a real project. The former is for you. The other is for someone else. Understanding the difference will allow you to avoid unnecessary problems when you move from one to the other.

[A legal note: There are many corporate and intellectual property issues surrounding the reuse of ideas and code from one project in another. To keep the discussion simple, I have ignored those issues, but please research them and talk to your manager about the legal compliance needs in your country and at your workplace.]

Learning Using a Hobby Project

By Krishna, May 25, 2007

One of the most enjoyable ways to learn technology is by doing a hobby project. It is really fun because there is no pressure of deadlines and there are no people dictating to you what and how to do the work. In a commercial project, many constraints (time, money, team size, etc.) exist that prevent you from doing the project you may want to, like selecting a language, framework or technology you like. That is fine because your ultimate goal is to serve the business needs of your customer, but it still leaves a hollow feeling.

Welcome to the hobby project where you decide what “itch” you want to scratch and how you want to do it. You can select the technical environment and tools that you like. You can decide when you want to work. You choose the standards. You set your own schedule and break them anytime you want. You can tailor your involvement in the project according to your lifestyle and personal needs.

Paradoxically, the freedom to break free of deadlines is never used. Even though you can call it quits anytime, you tend to get more and more involved in the hobby and continue learning different aspects of how to do it better. You start as an amateur, but soon become more than competent. More interestingly, you are actually willing to spend valuable money and time to improve your skill and knowledge in the hobby.

For example, let us say that you start photography as a new interest. Maybe you get started with a point-and-shoot camera. You quickly realize that the photos are okay, but not great. Then you get an SLR (Single Lens Reflex) camera. You start playing with the settings - amount of lighting, shutter speed, focus. You start buying more accessories – tripod, UV lens, color lens, bigger zoom, fisheye lens, etc. You throw away the new camera too, buy a better camera with more features, buy an iMac to edit your photos, buy digital photography software, books, etc.

Soon, you have acquired knowledge in many aspects of photography and it would not be wrong to call you a photography expert. You would also have become capable of teaching others how to become photographers themselves. But most important of all, you have achieved this by indulging a new passion in your life. It felt happy doing it and learning all that. It never seemed like hard work.

So if you are reading this, look at what you want to learn and start doing it as a hobby. For example, if you want to learn programming in a language, start a project for a personal need. For example, let’s say that you are interested in music. You could write a program to manage the list of music tracks you own, link to its lyrics, link to details of the singers and their biographies, your personal ratings of each song and your wishlist for future purchases. Although your hobby is really tied to music, you will learn a lot of technology stuff on the way.

I will end this with a few technologies, tools, frameworks, terms, web services, websites, etc. (in no particular order) that I have experienced while building my website (8 years in the making) and blog (a year now):  HTML, CSS, JavaScript, DOM, GDI, Java, C++, C#, .NET, XML, XSLT, SMTP, IE, Firefox, Opera, AWStats, Astra Site Manager, Google Analytics, GIMP, Eclipse, Bloodshed Dev-C++, Filezilla, WS-FTP, Notetab Pro, Blogger, Google Reader, Feeds, RSS, Atom, FeedBurner, Technorati, Digg, BlogCatalog, Windows Live Writer, W3C Validators, Google Webmaster Central, Yahoo! Site Explorer, PageRank, SEOMoz Page Strength Tool, blogroll, tags, pings, trackbacks, comments, anti-spam, moderation, etc.

The point I want to make is that if someone had asked me to learn all of those things listed above, I would have found it an impossible request. But within the context of my hobby, learning all of those things made sense and I spent the necessary time to understand the various tools and technologies. This way, I could achieve what I needed to do for building and displaying content for my online sites.

So try it out, you will be surprised where you will go in a few months.

Communication at Work

By Krishna, May 25, 2007

Something struck me recently about the difference between communication between stakeholders in a project and communication within an organization, namely that using different modes of communication in the latter situation is much more useful and productive.

In a particular project, it is useful to have a single point of communication to avoid confusion because otherwise information would be spread out and difficult to maintain with any consistency. However, within an organization, you can use different communication channels to achieve different goals. Here are a few possibilities:

  1. Wiki: Use a wiki to publish materials that will be referenced by employees. Company policies, procedures, standards and best practices could be put on the Wiki. Although multiple people could collaborate on editing content, you can restrict editing to authorized persons or make the content read-only. A wiki is a good place to create Intranet sites that can be easily updated by different people within the corporation. You can choose wiki platforms that meet your particular need for editing, collaboration and security.
  2. Blog: An internal company blog can be used to communicate information to the rest of the organization. Email can also be used to do that, but people lose emails in their Inbox and new employees don’t have access to the old emails. A blog is available online and older posts can be categorized or searched. You can also have dynamically generated blog feeds to inform you about the status of machines or tasks to be done. With blog feeds, the information comes to each person needing it instead of them having to come looking for it.
  3. Issue Tracking System: Use an issue tracking system to log a task for someone instead of emailing. You don’t have to remember all the tasks that you asked others to do. Also, other people can easily see all their pending tasks and when they are due. There is no guarantee that tasks will be done on time, but you have made the process simpler. A larger company may decide to implement a full-fledged enterprise solution, but even if you start small, you can reap the benefits. Sometimes it is better to start automating some parts so that you don’t have to wait for a big system to be ready.
  4. Document Templates: Using different document templates for various tasks allows you to structure what must be communicated. You are less likely to miss some vital piece of information, especially important when people are geographically separated. A simple way to start is to use Microsoft Word or Excel templates. If you have the time and money, make them online web-based forms with workflows. I would recommend reading “Business @ The Speed of Thought” by Bill Gates where he talks about how Microsoft converted their paper forms to online forms.
  5. Face-to-Face Meetings: I don’t mean this as a joke. Nowadays, people are so used to shooting off emails that they don’t talk to each other anymore. Meeting in person has “high communication bandwidth”, meaning that you communicate not just with words, but your body language and tone of voice. Also direct meetings are more likely to be collaborative than email threads, which can sometimes descend into outright flaming hell.

Email is good. Email is easy. It just doesn’t serve all purposes.

The Right Double Standards

By Krishna, May 22, 2007

I have been meaning to write this article for a long time now. However, every time I started writing, I have gone off on a tangent and ended up talking about something else. Part of the problem was that I did not have the right title – something that could be used as a focal point in expressing this idea. Recently, I came across the phrase “double standards” and then it struck me that I could use it to explain my thoughts.

So what is this all about? Well, in simple words, “You should have a higher standard for your own behavior than you should expect from others.

We are all very familiar with the opposite situation. For example, a teacher or a doctor penalizing us for coming late to class or an appointment, but no apologies if they keep us waiting for long time. That is the case where a person has low standards for himself while expecting everyone else to maintain high standards. That is the original meaning of “double standards“.

We all agree that examples of the above are wrong, but isn’t the opposite of that expecting the same standards from both ourselves and others? We do the right thing and we expect others to do the right thing. Wouldn’t that work?

The answer I consistently find in most venues (work, personal, etc.) is that “No, it doesn’t work.” And this has a very simple reason: People don’t have the same set of values. They are not alike. They have various human flaws (see “Seven Deadly Sins“). They make mistakes unknowingly and unconsciously all the time.

If you expect everyone else to follow your values, you will be sorely disappointed. Most people will NOT rise to your expectations. The reverse is also true: We never rise to people’s expectations. They expect us to behave in a certain way and they are disappointed at our actions and words. The unexpected disappointment leads to a very harmful problem. Since someone did not do what we wanted, we are angry at them. This starts a vicious cycle of hatred and contempt.

As you can see, quid pro quo in terms of standards is inherently a delicate equilibrium that can be easily shattered. So what is the solution?

The answer is to build a high level of tolerance for the actions and behavior of others. For example, if someone doesn’t do what you expect, search for a charitable reason. Give them the benefit of the doubt. Try to understand why they are doing what they are doing. Don’t automatically assume that they are evil.

Above all, talk openly with people. Let us say that someone did something you didn’t expect. Meet or talk to the person and ask him, “This is what I thought you would do. But you did this instead. Any particular reason?” In 90% of the cases, the person usually has a very valid reason. In other cases, some fault of theirs like fear of something may have prevented them from doing it. Although it is their problem, you can anticipate someone else in a similar situation doing the same thing and you can be prepared.

Some people may not tell you the real reason. This is also to be expected. People are usually ashamed of revealing their faults. Things like fear, ignorance, carelessness, etc. are common human weaknesses, but nobody (including I) likes admitting to them. So give them some rope.

Now, like everything, this principle of “right double standards” while maintaining personal high standards can be used correctly and can also be misused in many ways. Let me explain a few instances where it is used in a wrong way.

The first and foremost is the disease of self-righteousness. This is common in some people who observe a lot of public religious practices. They never do anything bad and also do a lot of good things like giving to charity or performing services for the community. The problem is that they become very vain about their own piety. They don’t expect other people to be as good as them (which in fact may be difficult), but use that fact at every opportunity to show that they are better than others.

But self-righteousness is not limited to religious people, of course. It can manifest itself when a person has any good quality which others do not possess in the same quantity. For example, I have seen a few persons who go out of the way to help other people, but are always complaining about lack of gratitude, the insensitivity of people who are being helped, etc. Also the same people complain that they are the only ones requested for help.

The irony here is that if everyone did the same thing as the self-righteous person, he would not be valuable anymore. Consider a case where everyone went to church, gave lavishly to charity or helped out with every request. This person would not be able to compete or crib. His usefulness to society comes from the very fact that others are not as virtuous as he is.

Moral: If you are going to complain that you are doing something good while somebody else is not, stop complaining or stop doing the good thing. In a software development team, an example would be the guy who runs around helping everybody else with their debugging problems and then complains about long working hours.

Another misuse of the ”right double standards” is using it against others. For example, you can “teach” someone to expect mistakes from you and, therefore, to be prepared and cover up. The programmer who wants others to expect bugs from him. The manager who wants subordinates to be ready for his irrational whims. I saw an example of this recently in the movie “The King of Scotland” where Idi Amin tells his advisor, “But you did not persuade me (not to expel the Asians), Nicholas. You did not persuade me!” as if Amin did not have a mind of his own.

Such behavior only works to frustrate other people who only see you as untrustworthy and never buy into your arguments. While it can be used successfully against subordinates to keep their mouths shut for a while, it only brings resentment and hatred. Even an evil person can buy loyalty from his people by being consistent in his likes and dislikes. But an intrinsically good person can alienate people by changing the rules while the game is played.

A final mistake is appeasement of unacceptable behavior. This is the opposite of self-righteousness where the person assumes that no one can ever make a mistake. Such a person keeps making excuses for people’s errors and never holds anyone responsible or accountable. This has the effect of encouraging more of the same mistakes.

The idea is that even when making allowances for failures, everyone should be clear about where you stand – what your principles and standards are. When someone is not following what you desire, you should explain what you expected and why they did what they did. Then you have to come to a final understanding: Whether you have to change your standards, whether the other person has to start improving his behavior or maybe a mix of both. And if the other person fails to meet his end of the bargain, you can decide what to do next.

Well, so much for misuse, but how do you use this principle to help you in the first place? Here are a few examples:

  1. If you are a manager, expect your employees to make silly mistakes, forget things and not follow up on everything you say. Therefore, you should try to help them like documenting the high priority tasks, project guidelines and using a task management system.
  2. If you are an employee, expect your manager to give you incomplete and inconsistent information. Your manager may not address your concerns immediately because of other pressing needs. Therefore, you should take it on yourself to clarify if things are unclear and keep reminding the manager about the things you want.
  3. If you are a parent, don’t expect your children to be as mature, thoughtful and serious as you. Allow them to take risks and be playful while setting high-level guidelines for behavior instead of micro-managing. Don’t talk down to them.
  4. If you are a teenager, don’t expect your parents to understand what is going on with your peers at school and sports. They are more worried about your safety and future than your immediate emotional needs. Ask your parents for guidance – they have seen the world at least twice as long as you have.

I can keep going on – teacher vs. student, politician vs. constituent, among friends, colleagues, relatives, etc. But I hope I have made my point, which is simply not to expect things to go and people to behave the way you expect. Instead, reach out to them and see how you can make the best of things.

I would like to end this with a problem when you follow this principle, namely, it can be very difficult and frustrating. Tolerance is not easy. It is easier to vent your frustration and anger. Also when you continue to exhibit high standards, but it doesn’t bring you any tangible return like recognition or praise, it is easy to say that it is not worth it and be like everybody else. From time to time, you will find yourself reverting to old habits, especially under pressure.

Regardless, don’t give up on your good behavior. Ultimately, you will find it more liberating because you will find it much easier to handle setbacks and solve problems.

Personal vs Professional Software Development

By Krishna, May 20, 2007

Hacknot is back after two months with another hard-hitting article on what is really important in software development, namely Requirements Management. One of the significant points made in the post is the fact that requirements management is given so little press when compared to all the coding and design issues. Here are a couple of important factors behind this:

  1. Requirements Management is hard: To collect requirements, you have to spend significant effort in discussions with end users with all sorts of personalities and pre-conceived notions. Users sometimes have irrational needs and have very little idea of how much a particular feature will cost in money or effort. It is not a glamorous task.
  2. It is only the beginning: When you collect requirements, the output is a document or some technical artifact that end users cannot use. The construction of the final product has still not begun. In fact, many customers unfamiliar with software development balk at the effort taken in requirements gathering because no “real work” gets done during this process. You may think that people don’t say the same thing about a building blueprint, but unfortunately that is the reality – so we have to deal with it.

But here I want to talk about something that is often overlooked: There is a huge difference between the software development that programmers do individually and how they should be doing it in a project team.

Let us take the first case: developing a software program alone. There are many possible situations where this can happen. You may be learning a new language or environment. You may be developing a program or website as a hobby. You may be the only software developer to build the program.

The common factor in these situations is that the program you are building is relatively simple. You usually know everything that has to be built. The program is not large enough to be complex. You can be intensely familiar with every line that you write and know every dependency in the code. If you want to fix something, you can usually do it in minutes.

What this means is that your primary overhead is coding. You don’t have to spend much time understanding the requirements. Your design needs are very simple. Testing and maintenance needs are relatively low. If there is some bug, you pull up the code, fix it quickly and run it. Performance requirements don’t even enter into the picture. If it is a data processing program, you can always go and get a snack while it runs.

So, your focus is on coding-related issues. First of all, anything that allows you to write less code for the same output quickly becomes your choice. Perl for string processing and Ruby on Rails for web development come to mind. An important aspect of choosing a language, IDE, framework or control to solve a problem is that you don’t have any need to customize it. This is usually the case in personal coding. The out-of-the-box functionality is usually sufficient for personal programming needs. In a previous post on such frameworks, I wrote about several considerations for real-life programming; such issues are not valid when doing personal software development.

What about design issues? Most personal programs are too small to really use many important design considerations – both at the code level as well as the user interface level. You could really violate every coding or design guideline and still get your program working correctly and being useful. While design patterns make it easy to maintain a program, smaller programs can be easily fixed by brute effort. As for user interface problems, the small user base (sometimes just you) can learn how to use round-about means to use a particular functionality.

Now, let us look at professional software development. Here you work in a larger team for creating a solution for many users. The project effort can be calculated in thousands of man hours of development effort. Here, communication is very important. The team members need to know what has to be built. They have to understand the user needs and how different parts of the system relate to each other. Building something that the user does not want means project failure.

An important thing to remember is that requirements are non-trivial. People cannot remember all the details and the long period of development means that even if people remember some detail today, they may forget at a later time. Hence, requirements must not exist in memory or hear-say, but instead in a tangible format like documents, use cases, prototypes, etc.

Design and architecture also become important. Without establishing common standards, guidelines and interfaces, it becomes tough to bolt the application pieces together to solve all the user needs. Inconsistent user interfaces and behavior can confuse the user and lead to low adoption or high rework. Poor design also has implications for performance, security, concurrency, etc.

Testing, which had low significance in personal software development, assumes a vital role in building real-life products. Practically speaking, it is impossible to document and design for all user needs. End users, being less technical, have great difficulty in expressing what they need and only truly understand what they want when they start using the system. The one truth about software development is that it never ends when you think you have developed everything users need.

Also, user requirements are never static. If you write a spec, you are only capturing a snapshot in time of what the users need. While you are busy coding, their business needs evolve, government regulations change, employee turnover happens. So your final product will go through significant changes from your previous documented requirements. Hence testing occupies a real part of software development.

Let us take some of the important activities in a real-life project and give them a percentage for development effort

  • a% effort for Requirements
  • b% effort for Design
  • c% effort for Coding
  • d% effort for Testing
  • e% effort for Maintenance

The value for c% would be much higher for personal software development when compared to the effort in a real-life project team. What does this mean? This means that even if you use a technology or tool that makes for great savings in coding time, you still have to deal with the other aspects of project development.

Let us take a project that lasts 6 months and assume that coding takes 3 months (50% of the effort). Even if you have a magic technology that instantly converts your requirements into code in a minute, you have only saved 50% of effort or calendar time.

In practice, of course, using the best tool doesn’t yield quite the savings you think it would. For example, here are some of time-consuming activities during coding:

  • Tackling technical challenges and risks: It is not a matter of writing code. It is a question of whether you can even do a specific requirement in software.
  • Knowing how to interface with third party hardware or software: You have to learn about the API’s, web services or device drivers, as the case may be.
  • Debugging silly errors in logic: Did you ever have an “I cannot believe I wrote that” moment after you found the error? Then you know what I mean.
  • Extending an inbuilt functionality: The data grid or calendar control has 95% of what you need, but that last piece of functionality is missing and you have to now write code to circumvent that problem. A coder’s life is filled with such frustrations.

A very important word of caution: Do not take “a good programming environment does not significantly reduce overall development effort” to mean “bad programming environments does not increase programming effort.” In fact, when a programmer does not get to use the language or tool he likes, his productivity dips as he takes time to understand the details and idiosyncrasies of the new environment. Good compilers and source control systems can reduce human errors in software development.

Buy the best software development tools you can afford. But understand that it can only reduce development effort to a certain degree. There is no getting away from other important demands like understanding what users need (Requirements), building the necessary architecture (Design) and getting user acceptance (Testing). The more software developers understand these needs, the more successful their final products will be.

Using Web Site Analytics Data

By Krishna, May 20, 2007

I have previously blogged about Google Analytics (“Experience with Google Analytics“, “Google Analytics Rebooted“) in various posts. I have been using it for several months now for my website and blog. Initially meant to be just a site visitor counter, it has evolved into providing many other pieces of useful information. I would like to say that other analytical tools may also provide such information, but since I am most familiar with Google Analytics, my primary reference will be that.

The fundamental benefit of using analytical data is that it is your data – real numbers that are relevant to you. You may read highly authoritative reports about market studies on the web, but you really don’t know whether those same numbers apply to you. For example, a report says that 5% of people who visit a product summary page click to view its details. That is a totally useless statistic to you, because you don’t know if that is relevant to your industry, your product types, your price range, etc. When you cater to a niche, having your own data is very important.

Benjamin Disraeli once said, “There are three kinds of lies: lies, damned lies and statistics.” The problem with statistics is accentuated when the data used to provide them is in someone else’s possession. When you own your data, you can make your own determination about facts without relying on other experts.

Website and blogs, including not-for-profit ones, exist for other people. Let us be honest here. If someone didn’t want other people to visit their online content, they would make it password-protected or not even put it on the web. Also, the idea is that the more visitors, the better – since it makes the content popular. The more time they spend on the website, the better – since it allows each visitor to understand the content better. And so on.

Analytical data provides answers to important questions to aid in this purpose. Here are some of those questions?

  1. How many pages do people view per visit? Which pages encourage them to explore the site more? What is special about those pages? Is it because they have meaningful content that matters to the visitors and makes them want more? Or do they have relevant links to other pages? How is the content presented on that page? For example, I noticed that placing a prominent link on my review of Louis Gerstner’s book led to people going on to read more of my book reviews.
  2. Another related question is which pages are more popular? Why are they more popular than other pages? If you didn’t intend for those pages to receive so many hits, do you need to reconsider the target audience? For example, I noticed that the puzzle pages on my website are very popular although most of the content is on other pages. This may mean presenting the other information in a different, more user-interactive format.
  3. From what geographic locations do people visit your site? If a significant number come from non-English-speaking countries, is the content accessible to them? Is the content offensive in some way (like the type of ads displayed)? What are the localization needs? Do you need a translation software? For example, after noticing that many of my visitors did not come from English countries, I added an AltaVista translation widget.
  4. What are the main sources of user visits? If there are many direct visitors, it means that people are either visiting your site by entering the URL or by a bookmark. This greatly emphasizes the need to be careful about breaking links to existing pages when you redesign the physical structure of your website. If traffic comes from search engines, what should you do to make your pages more visible to them? For example, consider using Google Webmaster, Yahoo! Site Explorer, etc. Pinging sites such as Technorati and other blog search engines also brings more visitors.
  5. To understand the technical needs of the website, you should look at the operating systems, browsers, screen resolutions and JavaScript/Java/Flash support of your visitors. Sometimes, your actual audience may have different needs than the intended audience. For example, a technical site may have a significant number of users who are unable to play video because of their internal security guidelines. It may therefore need to provide such users a simpler version of the content using text and images.

There are literally hundreds of questions you can ask by looking at the various facets of visitor data. Of course, because of time and effort constraints, you will need to prioritize the important ones and keep looking at them constantly. But as you start observing other minor reports, you will notice trends and patterns that will allow you to continuously tweak the content, layout and organization of your website or blog, inviting more users as well as making it more useful to them.

Quick Linking

By Krishna, May 19, 2007
  1. How do you sincerely apologize to someone and really accept the blame? Curt Schilling sets a great standard by his “Public Apology” post on his blog 38 Pitches. This is really a wonderful example of taking responsibility for one’s mistakes.
  2. SSW, Superior Software for Windows, an Australian software company, has a collection of great articles at SSW Rules related to project management, software products and coding standards. Some of the popular articles there are great resources.
  3. I have been reading a lot of Paul Graham’s old articles recently. He does not have a feed, but one is available at http://www.aaronsw.com/2002/feeds/pgessays.rss. I subscribed to that, starred all the articles in Google Reader and have been reading them when I get a chance. His post on the unpopularity of nerds is a must-read. If you have teenage children, tell them to read it.{Aside: Google Blogoscoped has an interview with Aaron Swartz who created the feed.}
  4. If I was only allowed to read one website to learn about blogging, the site I would go to would be ProBlogger. Although written primarily for bloggers who wish to monetize their blogs, it contains a lot of useful advice on how to make the content friendly to readers and search engines alike. But above all, the author, Darren Rowse, conducts a really friendly dialog with his audience, instead of talking down to them. Really first-class.
  5. I am increasingly disappointed at the home page of Rediff, which used to be my primary source of India news. But now, it is incredibly cluttered with advertisements all over the page. Nowadays, I just use Google News and Cricinfo. Anybody has any suggestions for a good looking India portal site, please add to the comments section.

Themocracy WordPress Themes