Monday, November 19, 2018

Removing duplicate files and folders - Cleaning up my hard disks

Ever since I started using a computer about 20 years ago, I've carefully collected all the files I thought I might need in the future. Quite frankly, I absolutely needed none of the files I created before 10 years ago. Back then, I hoped that job interviewers might ask me to show the work I had done, but they never did. Having had the chance to see the HR processes from inside organizations in a few of my previous jobs, I can tell you that one should be lucky if an employer actually checks whether an applicant has done
 something in the past and what they have done. All these new fancy HR processes make people too busy having to complete too many interviews for open positions. For reporting's sake, they don't have the time to actually go and check an applicant's past projects and the quality of their work.
My habit of collecting and saving all the files I make for projects has gotten to a point where I need multiple high-capacity hard disks and cloud space. I save my project files, important tutorials, camera raw files, picture/video edits, templates, songs I like, movies I like, and many other files, including automated backups every three months. My digital hoarding disorder has gotten out of proportion to a level where I have a backup of backups on Google clouds and important documents on OneDrive.
External HardDisk

So now, I have about 1 TB of cloud space, 8 TB of local external storage options on multiple devices, and a bunch of SD cards and pen drives that could total up to 500 gigs. Whoever reads this blog post five or ten years from now would smirk at these numbers, just as we now laugh at the 20 gig HD on our old P4 computer (Millennium Super computers: 😛), but for present-day specs, I think as an individual PC user trying to keep this much data is crazy. At the place I worked for in 2005, the whole organization had about 2 TB of space to manage their data.
In recent months, most of my weekends have been wasted in efforts to organize these files and eliminate duplicate files and folders. Within a few hours of starting this task, I figured out that it's not humanly possible to go through these thousands of folders and files one by one and delete the duplicate files. I wasn't ready to trust the exe HD clean-up utilities on the internet either. So, with a bit of Googling, I wrote up a bat code that could loop through the file list and identify the duplicate files and print the details on the cmd screen. Again, it was difficult to go through one by one and delete, and also dangerous to let the program automatically delete all at once.
After a few more attempts to modify the bat file code to selectively delete the files and folders by prompting the user, I found the code to be messy, complex, and not very user-friendly for the user to go through one by one again. By having the same bat logic as the core, I wrote a Java program with a few classes, achieving much better usability. I struggled a lot to fix the GUI freeze when the thread is busy problem. When java.io is busy in the current thread reading the files or in a separate thread, the GUI becomes non-responsive, and we cannot see the progress of the process. After drilling Stack Overflow with all I had, I found out that SwingWorker  is the answer to solve the problem. From there, it was easy peasy. Within a few hours, the "JJCleanFF" :) utility was ready, and I was able to delete a lot of duplicate folders and files.
For now, I'll share the jar file and instructions to use the utility with you. After cleaning up the code a little bit and adding documentation, I'll post it on GitHub and share the link in this post for the source code. So,

1. Download the executable jar file by clicking the below icon or visiting https://www.jeyaramj.com/downloads/JJCleanFF.jar
Download JJ Clean FF
2. Open the downloaded jar file.
JJ Clean FF Main Window
3. In the main window, click on "Select a folder" to select the parent folder in which the folders and files will be checked for duplicates
JJ Clean FF Browse Window
4. Once the folder is selected, there will be a message prompt for you to choose the file comparison method. I coded to compare the files in two ways. One is to generate a digital hash (SHA-512) of the files and check against other folders and files. If the file size is big, this method would slow down your computer, and it's better to go with the second method. The first method is good for text files and files that are too important. If you want to choose the first method, click on "Yes". The second method is basically checking the file name and size only. If two different images have the same file name and file size but are in two different folders, these two files will be identified as duplicate files with the second method. But the second method is much faster for the utility to scan the folders and identify duplicates. So, if you have less important big movie files, choose the second method by selecting "No".

5. Now the utility will scan for duplicate files and folders and show you the percentage completed.
JJ Clean FF UI
6. Once the scanning process is completed, if there are duplicate files, they will be listed in a separate window for you to click on the checkbox and delete.
JJ Clean FF UI
7. Once you click on a checkbox, you will be prompted to confirm, and once you choose "Yes", the file or folder will be permanently deleted from your HD.
JJ Clean FF UI

I've tested this utility a few times on my machine by creating dummy folders and files and couldn't find any issues yet. I deleted many files on my local external disk using this utility. Please check it out and let me know if there are any issues.

I do not accept any responsibility and will not be liable for any loss or damage suffered by you whatsoever arising out of the usage of this utility.

Sunday, April 29, 2018

Road Accident Lessons: What I Learned the Hard Way

I've been driving for over a decade, having obtained my driver's license in 2006. Now in my early thirties, I've always prided myself on being a cautious driver.

On May 1st, 2017 (Labour Day), I found myself with a rare day off. After sleeping in, I called my girlfriend only to discover she was unwell, suffering from severe gastric pain and a headache. I drove to her apartment to check on her, then headed to Arpico Pharmacy in Kiribathgoda to purchase medication.

After buying the medicine and some groceries, I started my journey back. Unable to make a U-turn at the junction next to Arpico, I took a right turn onto 'Aluth Para' towards 'Hunupitiya'. I safely parked on the roadside, crossed the street to buy a water bottle, then returned to my car. After carefully checking all directions, I began a slow U-turn. The holiday meant the roads were unusually quiet, and I was driving cautiously, savoring the peaceful day.

As I was about two-thirds through my U-turn, I heard a sudden horn blast. I immediately hit the brakes, but within a split second, I saw a young man on a motorbike collide with my car. Unable to control his speed, he fell, sliding past my vehicle. I was in shock.

The motorcyclist, despite his injuries, jumped up and approached my car, shouting angrily in Sinhalese. The shopkeeper who had sold me the water came out to see what had happened. I exited my car to assess the situation. The young man seemed more concerned about the motorcycle (which belonged to his elder brother) than his own injuries. His hands and legs were scratched, and he was visibly shaking from pain and shock. I offered to drive him to the hospital, but he refused, fixated on how he would explain the damaged bike to his brother.


Soon, a crowd gathered. An older man called for an ambulance, initially against the rider's wishes. The shop owner mentioned seeing the motorcyclist speeding while I was turning slowly. When I asked if she would testify to this, she initially agreed but later declined when the police arrived.

The elderly man (about 50-60 years old) called the rider's brother, explaining the situation calmly. My limited Sinhalese made communication difficult, and I sensed hostility from the crowd, possibly because I was uninjured while the rider was hurt. I remained quiet, unable to explain myself adequately.

When the ambulance arrived, the rider initially refused to go, still upset about the bike. His brother soon arrived, checked on the bike's status, and took my phone number. The injured rider finally agreed to go to the hospital.

I waited for my insurance representative while the police took my license and instructed me to come to the station. The shop owner commented on young riders' recklessness but was unwilling to officially testify. I called my girlfriend to explain what had happened.

At the police station, an officer asked me to drive him to the hospital to check on the motorcyclist's condition. We discovered he wasn't at Kiribathgoda hospital. Back at the station, I waited until about 8:30 PM, giving my statement in broken Sinhalese. The possibility of spending the night in custody loomed until a higher-ranking officer allowed me to leave my car and keys, instructing me to return in the morning.

[Image placeholder: Generic police station]

The next day, I returned to the station at 8:30 AM. The rider's brother arrived, and negotiations began. When asked for compensation, I offered 3,000 rupees, hoping to settle around 5,000. The brother was offended, demanding 30,000 rupees. Frustrated by the assumption of my guilt, I finally found the courage to explain my side to the police officer in my limited Sinhalese.

By noon, I was told to go to Mahara court. Angry at what I perceived as an unfair system, I decided to fight the case, naively believing I could present my side of the story effectively.

After 11 months of legal battles, I gained a better understanding of the system's inner workings. I was never allowed to speak freely in court, faced challenges with lawyers, and encountered numerous frustrating situations that interfered with my daily life.

This post is meant to share my experience and offer advice for those who might face similar situations. I've intentionally omitted many infuriating details from the past 11 months.

Key learnings from this accident:

  1. In accidents, provable facts matter more than what actually happened.
  2. Overcome shock quickly and gather evidence immediately.
  3. Control anger and communicate clearly, especially with the police.
  4. Avoid confrontation and arguments.
  5. Try to reach a calm settlement before police arrive, if possible.
  6. Collect evidence and take photos of the accident scene.
  7. Gather all relevant information (driver details, insurance info, vehicle details, etc.).
  8. Document accident specifics (time, location, road conditions, etc.).
  9. Don't communicate with the other party's insurance company without legal counsel.
  10. Don't sign any documents without lawyer review.
  11. Install a dash cam in your car.
  12. Prepare a comprehensive statement for the police.
  13. Have support from friends or family at the police station and court.
  14. Seek help finding a good lawyer from the start.
  15. Try to maintain a good relationship with the police.
  16. Choose a reputable insurance company.
  17. Stay hydrated and energetic despite stress.
  18. Prepare for the worst while maintaining a positive attitude.
  19. Drive defensively, anticipating others' mistakes.
  20. Keep emergency contacts and important documents together.

Remember, if you're in an accident, try not to panic. Time changes everything, and this too shall pass.

Thank you for reading, and stay safe on the roads.

Tuesday, August 18, 2015

Parliamentary Election - 2015 & Post Viral Fatigue Syndrome (PVFS) in Dengue Infection

As election results pour in, I find myself at home, halfheartedly searching for rental properties. Lately, I've been feeling under the weather - lacking motivation, constantly tired, and uncharacteristically lazy. It's been a while since I've updated my blog or hit the gym. This morning, while pondering whether my bout with dengue fever last year might be connected to my current state, I found myself googling the aftereffects of dengue.

Photo credits: gettyimages, Buddihika Weerasinghe

It's been over a year since my dengue ordeal, which I dramatically recounted in my earlier post, "Everything is a miracle." In the immediate aftermath of the fever, I might have felt as if life itself was miraculous, but I certainly don't feel that way now. While I long to recapture that sense of wonder and appreciate life's joys, I find myself struggling. This brings me to the crux of what I want to share today - my observations and experiences with the lingering effects of dengue.

After extensive online research, I've tentatively self-diagnosed with Post Viral Fatigue Syndrome (PVFS). While my symptoms aren't severe enough to completely disrupt my daily activities, they've noticeably impacted my ability to function at my pre-dengue levels - physically, mentally, and socially. The symptoms I've identified include:

  • Unrefreshing sleep
  • Sore throat
  • Unfamiliar types of headaches
  • Post-exertion malaise
  • Cognitive difficulties (especially with memory and attention)
  • Widespread muscle and joint pain
  • Mental and physical exhaustion
  • Mild stress or depression

Given that these symptoms are manageable and don't severely impair my day-to-day functioning, I prefer to label this as Post Viral Depression rather than Chronic Fatigue Syndrome (CFS). From my research, the exact cause remains unknown, but several studies suggest that viral infections like dengue can trigger the condition. Other potential causes include certain bacteria, immune system issues, hormonal imbalances, psychiatric problems, genetic predisposition, and traumatic events.

Person looking tired or depressed

The most challenging aspect, in my experience, is the vicious cycle it creates. The associated anxiety and mood disorders make me feel ill, and feeling ill, in turn, increases my stress. Interestingly, some of my colleagues who also contracted dengue don't report experiencing significant fatigue symptoms beyond the acute phase of infection and hospitalization.

A study conducted by the Department of Medicine at Yong Loo Lin School of Medicine, National University Singapore in February 2008 examined the incidence and factors associated with post-dengue fatigue. Their findings, based on a two-month follow-up of serologically confirmed dengue patients, revealed that increased age, female sex, the presence of chills, and the absence of rashes were significantly associated with the development of post-dengue fatigue.

According to www.epid.gov.lk, during the last 8 months of 2015, 18,830 suspected dengue cases were reported in Sri Lanka, with nearly 50% occurring in the Western province. The fourth week of 2015 saw the highest number of cases - coinciding with my own infection. Many of my colleagues from the Gampaha district have experienced dengue at some point in their lives.

Photo Credit : ipsnews.net

Despite efforts by Sri Lanka's Health Ministry to prevent dengue and raise public awareness through websites like www.dengue.lk and www.dengue.health.gov.lk, and funding from the European Community's Seventh Framework Programme (www.denguetools.net), we seem to lack the necessary level of awareness. The prevention methods employed in Sri Lanka appear ineffective and unreliable. Street posters and hospital handouts are insufficient to combat dengue effectively.

The government should implement and strictly enforce policies on housing and property maintenance in polluted and densely populated areas. Our drainage system, essential for flood prevention in urban areas, is nearly a century old and poorly maintained. Local businesses should be responsible for managing local drainage networks, while individual property owners should maintain drainage systems on their properties.

If we don't elect a government that rigorously enforces these measures, instead of merely discussing price reductions on goods or playing the race/ethnic card to win elections, we risk becoming a nation of fools.

In conclusion, while the effects of dengue can be long-lasting and challenging, it's crucial that we as individuals and as a society take proactive steps to combat this disease. Only through increased awareness, improved infrastructure, and responsible governance can we hope to reduce the impact of dengue on our lives and our nation.


References

Bennett, A., Fagioli, L., Komaroff, A., & Raoult, D. (1994). Persistent Infection with Bartonella (Rochalimaea) henselae or Afipia felis Is Unlikely to Be a Cause of Chronic Fatigue Syndrome.Clinical Infectious Diseases19(4), 804-805. doi:10.1093/clinids/19.4.804
Epid.gov.lk,. (2015). Dengue update. Retrieved 18 August 2015, from http://www.epid.gov.lk/web/index.php?option=com_content&view=article&id=171:dengue-update&catid=51:message-for-public&Itemid=487&lang=en
Forums.prohealth.com,. (2015). Postinfectious fatigue syndrome in dengue infection | ProHealth Fibromyalgia, ME/CFS and Lyme Disease Forums. Retrieved 18 August 2015, from http://forums.prohealth.com/forums/index.php?threads/postinfectious-fatigue-syndrome-in-dengue-infection.193179/
ME Association,. (2008). Post-infectious fatigue syndrome in dengue infection (revised 21/03/08). Retrieved 18 August 2015, from http://www.meassociation.org.uk/2008/03/post-infectious-fatigue-syndrome-in-dengue-infection/
MedicineNet,. (2015). Patient Comments: Dengue Fever - Describe Your Experience - Viewers Share Their Medical Experiences - MedicineNet. Retrieved 18 August 2015, from http://www.medicinenet.com/dengue_fever/patient-comments-159.htm
Mørch, K., Hanevik, K., Rivenes, A., Bødtker, J., Næss, H., & Stubhaug, B. et al. (2013). Chronic fatigue syndrome 5 years after giardiasis: differential diagnoses, characteristics and natural course.BMC Gastroenterol13(1), 28. doi:10.1186/1471-230x-13-28
Seet, R., Quek, A., & Lim, E. (2007). Post-infectious fatigue syndrome in dengue infection. Journal Of Clinical Virology38(1), 1-6. doi:10.1016/j.jcv.2006.10.011

Wednesday, October 8, 2014

Individualism and Collectivism and Metryingtolearnthemism

I had no siblings till the age of 9. There were no many people in my village. At least about 200 meters distance to the next nearest house from mine. Most of them in my village were farmers. There were no political parties or much influence from politics.  People didn't have much social interactions. Religious/civil ceremonies such as weddings, Hindu religious celebrations, Cultural celebrations and Friday prayers at temples were the main source of social interactions. Most of them knew most of them by name in my village. Brought up as a single child till my age of 9 with ample nurturing from my parents, aunties, uncle and the isolated environment I spent my childhood shaped my character and somewhat make me a person who likes exclusivity and solitude.

The nineteen nineties were the peak time of civil war; my village was under the control of LTTE. People didn't have the luxury to watch TV nor had telephones, therefore no influence from the world outside.  School, home and sometimes playing cricket or football were the only things in life. On the positive side, no much people to influence my thoughts. I spend most of my times at home - claiming in the trees and picking mangos😛, disassembling and assembling my bicycle, decorating my bicycle with LED lights, playing with electrical gadgets, riding my motorbike, changing the carburettor settings and trying new things on my motorbike, doing mechanic works on my custom made 'water pump + generator' thing and playing in the tractor.  I didn't need a license or Helmet to ride my bike in my village when LTTE ruled the area.

I feel very fortunate to have had the independence of a sort and the ample time I had, to sit alone most of the time and wonder about things on my own. This freedom and the isolation had a profound effort on my character.  At the time, I didn't understand or develop any ideas on how to live and work with other people in harmony, how groups work, tolerance, the expectations of society, sacrifices to be made for others for a greater good for everyone, how my actions affect other people and what is expected from me by the society.
Individualism or perceived separation from society is as absurd as a suicide.
― Leo Tolstoy
I wanted to wear what is comfortable not what is convention, whether to a wedding or funeral or to temple. I didn't see any point in wearing something not comfortable to a wedding just because it's what accepted by society. I had no clue as to how my choices affect other people because I did not grow up interacting with many people in the society nor exposed to social issues.
Individualism and Collectivism and Me trying to learn them
Harmony - Photograph @ Watford, UK. 2009 © JEYARAMJ.COM

When my family move to Colombo, I was forced to deal with many issues I had no knowledge of handling.  Mainly because I didn't understand why people do what they do. The expectation in our collectivist society is that when everyone says yes, you say yes. Initially, the issue of having to say yes when the group say yes tormented me. I could remember many situations I couldn't stand being a part of a group; in the school; in tuitions. Frustration, angry, disappointment and sadness were the emotions as a result of not being able to adapt to a place where collectivism runs. Sri Lanka is mostly a collectivist country, not much of an individualist country. This struggle continued about half a decade. To learn the realities and familiarize myself with social and cultural practices, and to make some friends, only I know how much I had to suffer and sacrifice.

On the bright side, pursuing to know new things and trying understand social stigmas gave me difference experience about things and people. In this regard, there is a range of metaphysical (the branch of philosophy that talks about the principles of things, including abstract concepts such as being, knowing, identity, time, and space.) subjects caught my attention.  I started finding information on anything relating to the issues I found difficult to deal with; starting with interpersonal skill development to psychology and social norms. Only in my early twenties, I started to understand that how other people think of me affects me a great deal, positively or negatively.

From a range of interesting topics in metaphysics, I thought of typing (not writing:) ) post on individualism and collectivism from the tiny bit l learnt and from the book I read nowadays. Baboon Metaphysics by Dorothy L. Cheney & Robert M. Seyfarth is one of the most interesting books I could suggest you read which talks about Human life and how it is conducted within a network of social relations, social groups, and societies.

Now., Individualism is the idea that the individual’s life belongs to him and that he has an inalienable right to live it as he sees fit, to act on his own judgement, to keep and use the product of his effort, and to pursue the values of his choosing. Collectivism is the idea that the individual’s life belongs not to him but to the group or society of which he is merely a part, that he has no rights, and that he must sacrifice his values and goals for the group’s “greater good.” According to collectivism, the group or society is the basic unit of moral concern, and the individual is of value only insofar as he serves the group.  (https://www.theobjectivestandard.com/issues/2012-spring/individualism-collectivism/ , Accessed 4th Oct 2014)

Yet there are still people who confuse individualism and selfishness.
― Albert Camus

In our society, in Sri Lanka, or in the world, I have no rights except those which society permits me to enjoy. From the day we were born till the day we die the society permits us to enjoy certain things so-called rights and deprives the others. We don't have a choice but to obey these as we all have to live sharing this one earth. I do not have a problem with the fact that there are rules or we can't do certain things for a greater good of the community. I could very well understand that it's almost impossible to live without rules. But the conceptual deference between individualism and collectivism is not about whether to have rules or not, it's about how well we could act on our own or question authorities.
Individualism and Collectivism and Me trying to learn them
Harmony - Photograph @ Gampaha, LK. 2012 © JEYARAMJ.COM

Every single day we are controlled, monitored, judged, manipulated and punished or awarded by authorities, leaders, governments and corporations.  From the day we are born, we are brain washed to act in a certain way. This type of conditioning allows many of us to limit ourselves and kept in dark that we have to go through very negative things that otherwise we wouldn't go through. What am I talking about now? Let me try to list some of the things I find irritating because of the group pressure or because there is a tiny bit of collectivist social behaviours or some other social conventions.

  1. In one of the projects I was working for we had a new manager. On the first day, he had a meeting with us and told "I want to talk to those engineers who say I can't test reasoning that it's QA job. I want to talk to those who say I can't do managerial work because it's managers Job. I don't like to keep people in my project those who are not willing to work with others and share the workload… ". Most of our team members who were refusing to do any managerial jobs or testing jobs were quiet and ever since we had the meeting, we had to do few managerial things.  If he had told me this in person, I would have definitely given him an explanation saying why it's not a good idea. None of us told anything objecting our new manager because, I believe, it's the bystander apathy psychologist talk about.  Sometime I have had wished that I had told the manager that we can't, when I had urgent development works to do and also had to do some of the managerial tasks we willingly undertook. This might not be an ideal example, yet the point is that sometime we willingly respect the authority and allow them to control us as a group we wouldn't do that as an individual.  Collectivist cultural background contributes to this kind of group behaviours, I believe. Collectivists believe that prioritizing group benefit over individual benefit creates harmony and betterment. Individualists believe that they are responsible for their own actions not the group, so prioritizing own benefit over group benefit is more appropriate.
  2. One of my school friends got married last April and our class mates were invited. I noted on my phone the date and location and forgot about the wedding till the notification pop-up on my phone. I requested a short leave from work, bought a gift and went to the wedding with the clothing I normally wear to work. I didn’t think even a little about what other people would dress or how I would be looked-at in the wedding. Every one of my class mates were wearing suits and were in one place as a group. They looked at me weird and asked me “what are you wearing?”. One of my friends told me that he called the others and found out that they will all wear suit. It was crazy for me to understand they had called everyone to know what they are going to wear for the wedding. The fact that they all were in the suit and I was in a denim and shirt made them feel uncomfortable to keep me in the group. It’s really surprising for me to understand how clothing could make people feel connected and how one person could become a stranger wearing different dress.  In this there is a dissonance between those who feel majority wearing the same and the one or two don't wear what the majority wears. I believe this is also might be because of the expectation from a member of a group should adhere to the group's values and practices.
  3. At work, whenever we have a meeting or any announcement from the management, most of our team members will be invited and at the end the discussion the person who holds the meeting or make an announcement will ask from us as to whether we have any questions.  Only a few of them ask some questions and others don't ask even if they had any question. It's definitely a cultural/racial thing I find among Sri Lankans, at least in the people I work with. Whenever I ask questions in the meetings or forums, I have my team mates coming and trying to comment negatively condemning that I ask the question or how stupid the question was or they knew how the management would answer backing the company. The fact that one person asks questions differentiate the person form the rest of them don't ask any questions.  There might be different reasons why this behaviour among our team members, but for a small degree that they don't like to ask question because the group doesn't encourage asking questions.
People in the collectivist countries tend to prioritize the group goals over individual ones. While this increases the harmony and connections between people, it is failing to question authorities and failing to look at the alternative views. This leads to a situation where fewer opportunities for constructive criticism and alternative ideas. This could be one of the reasons why we see fewer innovations in collectivist Asian countries than in the individualist western countries. This collectivist culture essentially ends up diminishing creativity and innovation, in my opinion. People should be allowed to question authorities, criticize, act on their own judgments, enjoy the fruits of their own labour without sacrificing the whole for the group and go outside the boundaries to invent new things. 


“The word "We" is as lime poured over men, which sets and hardens to stone, and crushes all beneath it, and that which is white and that which is black are lost equally in the grey of it. It is the word by which the depraved steal the virtue of the good, by which the weak steal the might of the strong, by which the fools steal the wisdom of the sages.
What is my joy if all hands, even the unclean, can reach into it? What is my wisdom, if even the fools can dictate to me? What is my freedom, if all creatures, even the botched and impotent, are my masters? What is my life, if I am but to bow, to agree and to obey?
But I am done with this creed of corruption.
I am done with the monster of "We," the word of serfdom, of plunder, of misery, falsehood and shame.
And now I see the face of God, and I raise this god over the earth, this god whom men have sought since men came into being, this god who will grant them joy and peace and pride.
This god, this one word:
"I.”
― Ayn Rand, Anthem




Farewell.

Sunday, April 20, 2014

Everything is a miracle

Last Wednesday morning, I had grand plans. I wanted to arrive at work early, complete my tasks efficiently, and return home with time to organize our new rented house. The recent move had left everything in disarray, and I felt compelled to restore order to my slightly altered life. Lately, I'd been feeling physically drained, lacking motivation to tackle these necessary changes. I wondered if the rainy weather or the lingering knee injury might be contributing to my lethargy.

As I began my workday, an intense pain gripped my body, accompanied by chills far beyond the usual effects of office air conditioning.


How illness makes me see the world

I promptly informed my colleagues, partially completed my morning tasks, had breakfast at the office, and decided to head home on sick leave, my mind racing with a million thoughts. Usually, I avoid doctors - I can't even recall my last visit. Assuming I'd caught the viral fever making rounds among my friends, I figured a week of rest would suffice, regardless of medication. My feverish mind could only focus on how to endure the coming week and return to normalcy. Despite the fever's fog and discomfort, I hopped on my bike, intent on getting home to sleep it off.
Now, two weeks later, having survived this dengue fever ordeal, I realize it's nothing short of miraculous that I'm alive today. The odds were stacked against me at every turn. Let's break down the probability of my survival:

  1. Deciding to go home instead of staying at the office - 50%
  2. Opting to seek medication rather than just sleeping it off - 50%
  3. Choosing to visit a doctor instead of just buying pharmacy medicine - 50%
  4. Finding a competent doctor who suspected dengue and ordered appropriate tests - 50%
  5. Actually getting the blood test after two days (as someone who never takes blood tests and didn't suspect dengue) - Should be 1%, but let's say 50%
  6. Returning to the doctor, discovering it was dengue with low platelet count, and getting hospitalized - Again, should be less than 1%, but we'll say 50%
  7. Having sufficient platelet count for the hospital to administer saline and increase platelet levels - 50%

So, that's 50% * 50% * 50% * 50% * 50% * 50% * 50% = 1/128, less than one percent chance of survival.
[
Even if we exclude the first step, which might seem less critical, we're still looking at roughly a 1/64 chance of survival. It's mind-boggling when you consider all the situations where we could have died but didn't - wars, diseases, accidents, natural disasters. Is there some internal mechanism in our brains guiding us towards safer choices? It's hard to comprehend.
“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.” 
― Albert Einstein
During my recovery, sleep was my primary activity. When sleep eluded me, I found myself pondering life's intricacies, leading to some valuable insights. If you want to be happy, please consider the following:

  1. Eliminate mosquitoes on sight. Invest in effective mosquito-killing tools.
  2. Take action against those who ignore the mosquito problem.
  3. Drink at least 100 ml of water or other liquids hourly.
  4. Consume plenty of fruits and maintain a healthy diet.
  5. Get ample rest and sleep.
  6. Slow down when needed. (I often rush without purpose. Now I remind myself to pace myself and rest when necessary.)
  7. Six hours of focused, smart work outperforms ten hours of distracted effort.
  8. Exercise and meditate regularly.
  9. Constantly revisit life's important lessons.
  10. Spend time alone contemplating life's mysteries and seeking solutions.

“There is more to life than simply increasing its speed.” 
― Mahatma Gandhi
I hope this post, my attempt to productively use time on my new tablet, proves useful or interesting to you. Thank you sincerely for reading my musings. Until next time!

Saturday, March 8, 2014

Leadership, Communication & Motivation

I usually prefer to not write anything on leadership, management, motivation and the other similar topics as I wanted to keep myself as a person who absolutely has nothing to do with these things, however, the time has come to tell you:) what I think about these overrated L-word and the other cooperate holy words. I don’t know whether it's my friends; or the fact that ever since I started "ACTIV" with my friends, I’m on a constant look-out for successful organizations, leaders and many other related things; or the fact that we are being bombarded with the L-word by the corporate culture we all are voluntarily subscribed to; or the recent extreme attention to American MBAs and its managerial teachings in Sri Lanka; or the fact that most political, religious and corporate people use too often these cool words to make people actually believe that there is a hell of a lot they know... I just don’t know why I think about these things :). I have heard enough of these words, influenced enough by the people/education that talk about these worlds, watched videos on it and read enough LinkedIn articles on these things, now I actually want to develop these skills and quickly let you know what I think about Leadership, Communication & Motivation in this post.

Leadership 
A leader needs the guts to stand alone and look ridiculous. The key is he/she must be easy to follow! Leader needs followers. Following is more difficult than leading when the leader is not very capable of leading.  They publicly shows everyone how to follow. Notice the leader embraces him/her as an equal, so it's not about the leader anymore - it's about being a follower first. All the good leaders I had the pleasure working with use friendship as a tool to bridge the gap between leading and following and add real value to leadership. Notice he's calling to his friends to join in. It takes guts to be a first follower! You stand out and brave ridicule, yourself. Being a first follower is an under-appreciated form of leadership. The first follower transforms a lone nut into a leader. I read somewhere - If the leader is the flint, the first follower is the spark that makes the fire. You might be a person who's not so comfortable with the word follower, it's because people don't like to use the word follower(s) in the cooperate world. We like to use the word team, almost in every-places we want to use followers and we managed to make the word cooler. As I must have mentioned earlier, Leadership is over-glorified; so is team. So, leadership happens when you find a lone nut doing something great about something the nut really cares about(vision), have the guts to be the first person to stand up and join in. 1) have the vision 2) be public 3) be easy to follow 4) make some sense and be compact (Communication) 5) Have passion - make impossible possible ( Motivation ).


Communication 
It's really a border subject and way over my head to talk about, yet I'm going to continue. I had issues clearly telling my ideas to my friends at ACTIV. I can vividly remember telling my friend "It's clear in my head, but I don't know how I'm going to make you understand as exactly as is in my mind." I must have offended him saying so as his response was not very polite. Also, when the HR has nothing to avoid promoting you, they often magically make the word appear out of thin air and say "You need to develop your communication skills to get the promotion in the next cycle" - it wouldn't be a breach of the confidentially clause I signed, if I say that it really happened to me by an HR individual who had no knowledge what so ever of what I was doing in the company nor had the capacity to measure my skill sets. Most often, ideas has context, dependencies and a million related things you should know about to understand. When we try to communicate someone, it's really hard to assume that the person whom you're trying to communicate understand the context and he has the dependency knowledge. It's even harder, if we try to communicate to a person whom we don't know or we have to communicate to a group instead of one person. Some of the ideas take months even years to unconsciously build up and make sense. There will be a million small nuances that matter associated with our idea and when we try to tell others, it's almost always impossible and stressful. The purpose of communication is to get your message across to others clearly and unambiguously. Doing this involves effort from both the sender of the message and the receiver. And it's a process that can be fraught with error, with messages often misinterpreted by the recipient. When this isn't detected, it can cause tremendous confusion, wasted effort and missed opportunity. In fact, communication is only successful when both the sender and the receiver understand the same exact information as a result of the communication. By successfully getting your message across, you convey your thoughts and ideas effectively. When not successful, the thoughts and ideas that you convey do not necessarily reflect your own, causing a communications breakdown and creating roadblocks that stand in the way of your goals – both personally and professionally. Create and environment where everyone feel save to express ideas, opinion,  and feelings, or plan or problem solving in creative ways.

Its very true that most of what we communicate is not through by talking. Body language and our facial expressions carry a lot more than we think we do. There was a presentation given a us at the British Council Colombo and they had professionals to show us the ways an idea could be expressed differently. In my blog, I prefer to write my personal experience and my own view about the things I write rather than a general idea, so It would only be fair, if I tell you what makes me challenged/makes it difficult when it comes to communication. My experience is that when I work on codes(technical things/logical) too long and suddenly want to speak to somebody or speak about the code I was working on, I often struggle to talk. Even the most frequently spoken words will slip away from my mind for a while. May be it's just that my left brain was constantly getting the resources allocated and suddenly when I try to wake my right brain, it crashes or something.. :) I have no scientific facts to back me up on this, yet I have convinced myself with my theory on this.

Motivation - Motivation is literally the desire to do things. More than half of the morning emails I read on this and Google plus posts should make me an expert on this subject. When I have a clear reason to do something or inner desire to want something, I'm so motivated - It's just that simple. To motivate myself, I just need to convince myself with some reasoning or I need a prove of; if I do this, I'll get this. Of cause, that the common reasoning process of a human mind consciously. And there is more..

Motivation is defined as the process that initiates, guides and maintains goal-oriented behaviors. Motivation is what causes us to act, whether it is getting a glass of water to reduce thirst or reading a book to gain knowledge. It involves the biological, emotional, social and cognitive forces that activate behavior. 

The above is the extract of the first five links for a Google search. Further the articles read that a number of different theories of motivation, including drive theory, instinct theory and humanistic theory. There are three major components to motivation: activation, persistence and intensity. Different types of motivation are frequently described as being either extrinsic or intrinsic. Extrinsic motivations are those that arise from outside of the individual and often involve rewards such as trophies, money, social recognition or praise. Intrinsic motivations are those that arise from within the individual, such as doing a complicated cross-word puzzle purely for the personal gratification of solving a problem.

Who needs forced motivation? Someone who does something he/she doesn't like. I'm talking about the motivational trainings motivational speaks do. I can speak for myself here as I, myself have attended few trainings, that they actually do work/help us get motivated. They help us find the reasons and help us figure out why we do what we do.  Research shows you can influence your own levels of motivation and self-control. So figure out what you want, power through the pain period, and start being who you want to be. Goal Setting is extremely important to motivation and success.  Certainly, we need some intelligence, knowledge base, study skills, and time management skills, but if we don't have motivation, I don't think we will go get far.

Motivation is the force that initiates, guides and maintains goal-oriented behaviors. It is what causes us to take action, whether to grab a snack to reduce hunger or enroll in college to earn a degree. The forces that lie beneath motivation can be biological, social, emotional or cognitive in nature.

I find the blow very useful and is from about.com/od/motivation.

William James has created a list of human instincts that included such things as attachment, play, shame, anger, fear, shyness, modesty and love. The main problem with this theory is that it did not really explain behavior, it just described it. By the 1920s, instinct theories were pushed aside in favor of other motivational theories, but contemporary evolutionary psychologists still study the influence of genetics and heredity on human behavior.
Incentive Theory of Motivation
The incentive theory suggests that people are motivated to do things because of external rewards. For example, you might be motivated to go to work each day for the monetary reward of being paid. Behavioral learning concepts such as association and reinforcement play an important role in this theory of motivation.
Drive Theory of Motivation
According to the drive theory of motivation, people are motivated to take certain actions in order to reduce the internal tension that is caused by unmet needs. For example, you might be motivated to drink a glass of water in order to reduce the internal state of thirst. This theory is useful in explaining behaviors that have a strong biological component, such as hunger or thirst. The problem with the drive theory of motivation is that these behaviors are not always motivated purely by physiological needs. For example, people often eat even when they are not really hungry.
Arousal Theory of Motivation
The arousal theory of motivation suggests that people take certain actions to either decrease or increase levels of arousal. When arousal levels get too low, for example, a person might watch and exciting movie or go for a jog. When arousal levels get too high, on the other hand, a person would probably look for ways to relax such as meditating or reading a book. According to this theory, we are motivated to maintain an optimal level of arousal, although this level can vary based on the individual or the situation.
Humanistic Theory of Motivation
Humanistic theories of motivation are based on the idea that people also have strong cognitive reasons to perform various actions. This is famously illustrated in Abraham Maslow's hierarchy of needs, which presents different motivations at different levels. First, people are motivated to fulfill basic biological needs for food and shelter, as well as those of safety, love and esteem. Once the lower-level needs have been met, the primary motivator becomes the need for self-actualization, or the desire to fulfill one's individual potential.

Also, personal preferences and circumstances have a huge impact on motivational levels. I believe prioritizing and having a plan is as important as being motivated to do something to succeed. A fun example, I want to go to gym badly and I'm motivated, yet I couldn't go as there are other important things I had to take care time-to-time (I can hear u say: poooh, like what? :p anyways) there are days I really do have things stopping me to go to the gym and that irregularity demotivates me to go to gym.

----

There are many more similar things I would like to write and share with you - like, what is the deference between going to a five-star hotel wearing a suit to spend a hundred rupees and going with a dirty t-shirt and spending a few grands; the psychology behind it and my experience on that. But I just ran out of motivation to write more, so let me power-up my motivational level and write on the next post. FAREWELL 'TIL NEXT TIME.

Wednesday, January 15, 2014

Clean Coding Techniques and Best Programming Practices

One of my favourite things to do when I'm free is open a code file from one of the best known open source projects and look at the code. Some of them programmers are truly amazing in writing codes applying the best coding practices and use OOP concepts. There are many good ways to architect and design a system depending on the size of the project. Those days, I was working on many small projects and now have the opportunity to work in fairly big scale projects and when I see the deferences and techniques used comparing to the small projects, I understand how clever some of these software engineering human beings are. Some of my colleagues could explain me, a complex concept I wouldn't understand reading books, in few minutes. Learning and understanding some fascinating facts form superiors while working's very valuable.  Sometime a line could explain you whole lot than a whole page ever could explain. Example ha?..
“ Java is to JavaScript what Car is to Carpet. ” - Chris Heilmann
If you look at the code someone new written in your project, you will understand when I explain you the feeling of trying to swallow your food for lunch after looking at the code. On the other hand, some people just know how to make a bouquet out of a few code files. What I'm trying to get you to agree is that some projects are really a joy to work on just because of the way it's been designed, coded, managed and some projects are pain to work on.

As a programmer, it's very important for me to understand the basic concepts well and to use best practices out there. Ever since I sat for a lecture in Dr Even's class, I'm keen on learning these best practices and want to code like a pro. He teaches while writing codes like writing emails. The way he structures code, put them into different files with meaningful file names and getting it working; it's truly mesmerizing experience. He's able to show us examples of simple code to carry complex functionality. To be able write simple code to do complex things would be one the thing I really wanted to be good. So, whenever I come across articles about coding best practices and code samples, I add to my pocket and this post is a sum-up of the collection.

Clean Coding Techniques and Best Programming Practices
“Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.” - Martin Golding
COUPLING & COHESION

I really started to understand the importance of Coupling and Cohesion only after I started working for big projects and started seeing the deference. For this post sake, let's look at a little on this. Also, for my learning too, I'm going to browse my  pocket links on this topic and many other relevant topics and copy them here. I'll try to put all the links I referred for this post. I usually doesn't like to copy other people's work here, yet I don't think I have to re-write something is been already written nicely in books or in websites. I wanted to remind some of these things, so, I'm going to go through and whatever I find useful in these area, I'm going to copy here. Simple - ha?:)

Coupling is an indication of the strength of interconnections between program units. Highly coupled have program units dependent on each other. Loosely coupled are made up of units that are independent or almost independent. When I start writing code in the beginning, most the function or components I write will call other functions and they're interconnected. When I try to modify something, it's really a headache. After a while, if we look at the code, It's really a challenge to understand the code and modify and these changes are pron to many code breaks.

“ Before software can be reusable it first has to be usable. ” - Ralph Johnson

Obviously, it very hard to keep functions totally independent and in many cases, it's almost impossible to have modules completely independent of each other. The more connections between functions, the more dependency and more issues later. It wouldn't make much of a deference if it's a small project and absolutely no requirement to upgrade it in the future.

According to Clarlson, there are three factors: number of interfaces, complexity of interfaces, type of info flow along interfaces.

Want to minimize number of interfaces between modules, minimize the complexity of each interface, and control the type of info flow. An interface of a module is used to pass information to and from other modules. In general, modules tightly coupled if they use shared variables or if they exchange control info. Loose coupling if info held within a unit and interface with other units via parameter lists. Tight coupling if shared global data. If need only one field of a record, don't pass entire record. Keep interface as simple and small as possible.

Two types of info flow: data or control.

Passing or receiving back control info means that the action of the module will depend on this control info, which makes it difficult to understand the module. Interfaces with only data communication result in lowest degree of coupling, followed by interfaces that only transfer control data. Highest if data is hybrid. 

Ranked highest to lowest: 
Content coupling:
If one directly references the contents of the other. When one module modifies local data values or instructions in another module. (can happen in assembly language) if one refers to local data in another module. if one branches into a local label of another.
Common coupling:
Access to global data. modules bound together by global data structures.
Control coupling:
Passing control flags (as parameters or globals) so that one module controls the sequence of processing steps in another module. 
Stamp coupling:
Similar to common coupling except that global variables are shared selectively among routines that require the data. E.g., packages in Ada. More desirable than common coupling because fewer modules will have to be modified if a shared data structure is modified. Pass entire data structure but need only parts of it.
Data coupling:
Use of parameter lists to pass data items between routines.

Cohesion

Cohesion is the measure of how well module fits together. A component should implement a single logical function or single logical entity. All the parts should contribute to the implementation.

Many levels of cohesion: 

Coincidental cohesion: 
The parts of a component are not related but simply bundled into a single component. harder to understand and not reusable.
Logical association: 
Similar functions such as input, error handling, etc. put together. Functions fall in same logical class. May pass a flag to determine which ones executed.
interface difficult to understand. Code for more than one function may be intertwined, leading to severe maintenance problems. Difficult to reuse
Temporal cohesion:
All of statements activated at a single time, such as start up or shut down, are brought together. Initialization, clean up.
Functions weakly related to one another, but more strongly related to functions in other modules so may need to change lots of modules when do maintenance.
Procedural cohesion: 
A single control sequence, e.g., a loop or sequence of decision statements. Often cuts across functional lines. May contain only part of a complete function or parts of several functions.
Functions still weakly connected, and again unlikely to be reusable in another product.
Communicational cohesion:
Operate on same input data or produce same output data. May be performing more than one function. Generally acceptable if alternate structures with higher cohesion cannot be easily identified.
still problems with reusability.
Sequential cohesion:
Output from one part serves as input for another part. May contain several functions or parts of different functions.
Informational cohesion:
Performs a number of functions, each with its own entry point, with independent code for each function, all performed on same data structure. Different than logical cohesion because functions not intertwined.
Functional cohesion: each part necessary for execution of a single function. e.g., compute square root or sort the array. Usually reusable in other contexts. Maintenance easier.
Type cohesion: 
Modules that support a data abstraction.
Not strictly a linear scale. Functional much stronger than rest while first two much weaker than others. Often many levels may be applicable when considering two elements of a module. Cohesion of module considered as highest level of cohesion that is applicable to all elements in the module.

Ref: http://courses.cs.washington.edu/courses/cse403/96sp/coupling-cohesion.html - Thanks: Adam Carlson


Coding Standards and Code Reviews

Using good programming practices to create high quality code is important to produce quality software with high performance. A comprehensive coding standard encompasses all aspects of code construction and, while developers should exercise prudence in its implementation, it should be closely followed. Completed source code should reflect a harmonized style, as if a single developer wrote the code in one session. Adherence to a coding standard can only be feasible when followed throughout the software project from inception to completion. It is not practical, nor is it prudent, to impose a coding standard after the fact. Coding techniques incorporate many facets of software development and, although they usually have no impact on the functionality of the application, they contribute to an improved comprehension of source code. For the purpose of this document, all forms of source code are considered, including programming, scripting, markup, and query languages.

“Measuring programming progress by lines of code is like measuring aircraft building progress by weight.”
- Bill Gates  (co-founder of Microsoft)

When you write code, consider the following to improve performance, keep the coding clean and to reduce run time exceptions.

  • Declare All Variables - In some programming languages, like in JavaScript or in C#. A variable that is not declared will be created with a default type. Normally it will be implicitly created as a Variant. 
  • Avoid elusive names that are open to subjective interpretation, such as Analyze() for a routine, or jjK4 for a variable. Such names contribute to ambiguity more than abstraction.
  • In object-oriented languages, it is redundant to include class names in the name of class properties, such as Book.BookTitle. Instead, use Book.Title.
  • Use the verb-noun method for naming routines that perform some operation on a given object, such as CalculateInvoiceTotal().
  • In languages that permit function overloading, all overloads should perform a similar function. For those languages that do not permit function overloading, establish a naming standard that relates similar functions.
  • Use Strongly Typed Object Variables - Object variables represent pointers to COM objects. They can be declared in two ways, as follows: 
    • When you defect a variable As Object in Java or C# that variable can be used to represent any kind of object; this is a weakly typed object variable
    • Use the As keyword with the specific type of the object; this is a strongly typed object variable.
  • Names - Perhaps one of the most influential aids to understanding the logical flow of an application is how the various elements of the application are named. A name should tell "what" rather than "how." By avoiding names that expose the underlying implementation, which can change, you preserve a layer of abstraction that simplifies the complexity. For example, you could use GetNextStudent() instead of GetNextArrayElement().
  • Append computation qualifiers (Avg, Sum, Min, Max, Index) to the end of a variable name where appropriate.
  • Use customary opposite pairs in variable names, such as min/max, begin/end, and open/close.
  • Since most names are constructed by concatenating several words together, use mixed-case formatting to simplify reading them. In addition, to help distinguish between variables and routines/functions, use Pascal casing (CalculateInvoiceTotal) for routine/functions names where the first letter of each word is capitalized. For variable names, use camel casing (documentFormatType) where the first letter of each word except the first is capitalized.
  • Boolean variable names should contain Is which implies Yes/No or True/False values, such as fileIsFound.
  • Avoid using terms such as Flag when naming status variables, which differ from Boolean variables in that they may have more than two possible values. Instead of documentFlag, use a more descriptive name such as documentFormatType.
  • Even for a short-lived variable that may appear in only a few lines of code, still use a meaningful name. Use single-letter variable names, such as i, or j, for short-loop indexes only.
  • If using Charles Simonyi's Hungarian Naming Convention, or some derivative thereof, develop a list of standard prefixes for the project to help developers consistently name variables. For more information, see "Hungarian Notation."
  • For variable names, it is sometimes useful to include notation that indicates the scope of the variable, such as prefixing a g_ for global variables and m_ for module-level variables in Microsoft Visual Basic®.
  • Constants should be all uppercase with underscores between words, such as NUM_DAYS_IN_WEEK. Also, begin groups of enumerated types with a common prefix, such as FONT_ARIAL and FONT_ROMAN.
  • A tenet of naming is that difficulty in selecting a proper name may indicate that you need to further analyze or define the purpose of an item. Make names long enough to be meaningful but short enough to avoid being wordy. Programmatically, a unique name serves only to differentiate one item from another. Expressive names function as an aid to the human reader; therefore, it makes sense to provide a name that the human reader can comprehend. However, be certain that the names chosen are in compliance with the applicable language's rules and standards.
  • When naming tables, express the name in the singular form. For example, use Employee instead of Employees.
  • When naming columns of tables, do not repeat the table name; for example, avoid having a field called EmployeeLastName in a table called Employee.
  • Do not incorporate the data type in the name of a column. This will reduce the amount of work needed should it become necessary to change the data type later.
  • In Microsoft SQL Server, do not prefix stored procedures with sp_, because this prefix is reserved for identifying system-stored procedures.
  • In Transact-SQL, do not prefix variables with @@, which should be reserved for truly global variables such as @@IDENTITY.
  • Minimize the use of abbreviations. If abbreviations are used, be consistent in their use. An abbreviation should have only one meaning and likewise, each abbreviated word should have only one abbreviation. For example, if using min to abbreviate minimum, do so everywhere and do not later use it to abbreviate minute.
  • When naming functions, include a description of the value being returned, such as GetCurrentWindowName().
  • File and folder names, like procedure names, should accurately describe what purpose they serve.
  • Avoid reusing names for different elements, such as a routine called ProcessSales() and a variable called iProcessSales.
  • Avoid homonyms when naming elements to prevent confusion during code reviews, such as write and right.
  • When naming elements, avoid using commonly misspelled words. Also, be aware of differences that exist between American and British English, such as color/colour and check/cheque.
  • Avoid using typographical marks to identify data types, such as $ for strings or % for integers.
  • When it come to Comments, Software documentation exists in two forms, external and internal. External documentation is maintained outside of the source code, such as specifications, help files, and design documents. Internal documentation is composed of comments that developers write within the source code at development time.
  • One of the challenges of software documentation is ensuring that the comments are maintained and updated in parallel with the source code. Although properly commenting source code serves no purpose at run time, it is invaluable to a developer who must maintain a particularly intricate or cumbersome piece of software.
  • Following are recommended commenting techniques:
  • When modifying code, always keep the commenting around it up to date.
  • At the beginning of every routine, it is helpful to provide standard, boilerplate comments, indicating the routine's purpose, assumptions, and limitations. A boilerplate comment should be a brief introduction to understand why the routine exists and what it can do.
  • Avoid adding comments at the end of a line of code; end-line comments make code more difficult to read. However, end-line comments are appropriate when annotating variable declarations. In this case, align all end-line comments at a common tab stop.
  • Avoid using clutter comments, such as an entire line of asterisks. Instead, use white space to separate comments from code.
  • Avoid surrounding a block comment with a typographical frame. It may look attractive, but it is difficult to maintain.
  • Prior to deployment, remove all temporary or extraneous comments to avoid confusion during future maintenance work.
  • If you need comments to explain a complex section of code, examine the code to determine if you should rewrite it. If at all possible, do not document bad code—rewrite it. Although performance should not typically be sacrificed to make the code simpler for human consumption, a balance must be maintained between performance and maintainability.
  • Use complete sentences when writing comments. Comments should clarify the code, not add ambiguity.
  • Comment as you code, because most likely there won't be time to do it later. Also, should you get a chance to revisit code you've written, that which is obvious today probably won't be obvious six weeks from now.
  • Avoid the use of superfluous or inappropriate comments, such as humorous sidebar remarks.
  • Use comments to explain the intent of the code. They should not serve as inline translations of the code.
  • Comment anything that is not readily obvious in the code.
  • To prevent recurring problems, always use comments on bug fixes and work-around code, especially in a team environment.
  • Use comments on code that consists of loops and logic branches. These are key areas that will assist the reader when reading source code.
  • Separate comments from comment delimiters with white space. Doing so will make comments stand out and easier to locate when viewed without color clues.
  • Throughout the application, construct comments using a uniform style, with consistent punctuation and structure.
  • Despite the availability of external documentation, source code listings should be able to stand on their own because hard-copy documentation can be misplaced.
  • External documentation should consist of specifications, design documents, change requests, bug history, and the coding standard that was used.
  • Formatting makes the logical organization of the code stand out. Taking the time to ensure that the source code is formatted in a consistent, logical manner is helpful to yourself and to other developers who must decipher the source code.
Ref: http://msdn.microsoft.com/en-us/library/aa260844(v=vs.60).aspx Thanks: Rob Caron - Microsoft Corporation

Hope I shared something useful to you today and I'm going to end this post giving a tip from my experience to those who want to freelance work by quoting Edward V Berard  -
”Walking on water and developing software from a specification are easy if both are frozen.”