Monday, November 24, 2008

Why not to use search engines

During my college days I was not aware of search engine clientele. Consequently, the area/domain where Google search was being used was an unfamiliar territory. For me, it was a new search engine that was continuously crawling net and used the PageRank algorithm to bring better search results as compared to other technologies. I believed it was being used by casual surfers. I was still betting more on Semantic web (studying OWL was something new that I did at that time), but I do believe that the ultimate search engine will be based on algorithms that use Artificial Intelligence to understand text available on the Internet and provide accurate, meaningful, and context-sensitive results.

Few years back, I was shocked to find how widely search engines were being exploited by the developer community. I saw many people depending on search engines for code snippets. Personally, I started hating search engines for corrupting developers’ mindset and mounting reliance. Hate is no solution, so I embarked on a new project. The aim was straight “Get rid of developers”. Initially, the task looked simple -- write a program that fetches the correct code snippet from the net, filter the results based on the task at hand, and customize it depending on user’s input.

The results were not convincing, following were the primary causes:

  1. Authenticity was not guaranteed
  2. Incomplete results
  3. Addressed either the simplest (the most common) or a single scenario
  4. Incorrect
  5. Not ready for direct consumption

Solution to this exists: trust services, semantic web, investment in organizing and building appropriate code snippets, ETL. But the scope is limited. Some IT firms maintain a database that can be queried for commonly used code, but the process is not fully automated. It is an aid, not a replacement.

Although, priorities changed and I completely forgot about this project, looks like I need to restart the engine :)
Intent was much bigger – give software creation directly in the hands of its user. The idea was to develop an application that given the requirements will break these down into atomic tasks, maintain a set of domain specific components, integrate components by guiding the flow of data and control from one component to other (glue), map task to functionality, and relies on net (shared repository) for missing code.
In short build an ecosystem that helps user build what he wants.

I believe in a continuous knowledge acquisition process. A business expands by investing in the development of new product lines, expanding the service areas and acquiring other companies. A developer grows by reading more and more (on a regular basis) and venturing into new domains. This is a slow process, but results in fewer hurdles, timely completion of tasks, confidence of going in the right direction and doing it right.

Search engine provides a quick solution, is addictive, but hollows the intellect. Areas worst hit are product quality and developer's confidence.

When to use search engines:

  • for awareness on what’s already there, so that you don't reinvent the wheel
  • to look what others are doing, so that you don't do a parallel development (did someone mention competition ;))
  • to find online projects, so that you can contribute your expertise
  • for new and upcoming technologies -- this is the right time to search for parallelism and cloud computing
  • find recipe of paw bhaji :)
  • to check whether your internet connection is working :)

Don’t hit the search engines to find answers within a domain where you are supposed to be an expert, use it to find knowledge banks that provide comprehensive theory coverage. Use it to find authentic source of information. There are plenty of these on the net. Here are some of the sites that I visit:

Look for magazines and journals that are published (some are given out for free)

  • MSDN
  • Dr. Dobb
  • Architecture Journal
  • CIO
  • PCQuest

Subscribe to feeds and newsletters published by infosites. At times, you will be bogged down by the number of emails in your inbox, so choose judiciously.

And most importantly, never forget your textbooks.

So surf well, surf wise.

Saturday, November 22, 2008

Compromised technologies

We live in a world of compromises. And when compromise is true for life, it easily gets instilled in whatever we do. Our thoughts, actions and feelings – all have an impact. The effect is minimal if it stays within. The magnitude increases if it comes out in whatever form. The enormity is directly proportional to the number of people a person is linked to. And if the person is an inventor of something that has become a part of our life, any compromise that came along the invention path, will lead to a terrible blow when things don’t work as planned.

Can we not have shock free electricity, or airplanes that bounce off when they collide with building? The vehicles that we use, can these prevent accidents? Do we design homes and use the roads judicially? What about software that we make? When we invent, do we give ample thought to any misuse? If we could, thousands of lives would have been saved. Did we rush to bring the latest invention to the market without bothering about its impact? Is money and fame that important?

There are multiple factors that lead us to compromise. Pressure to delivery or achieve under constraints, competition that can kill the product or relation, politics to gain when something is lacking, tight deadlines that if not met can ruin the idea, envy, lack of knowledge and inadequate experience in handling and decision making. All these impact quality, a compromise that does not have immediate visible impact, but serves deadly in future.

Another question that comes to minds is: Is the compromise worth? The answer is a strict NO, this question itself should not have come had the world been a no-compromise place. Can we have no-compromise world? Yes, we can. Will I be considered arrogant and egoistic if I am a no-compromise-man? Some people might think so, but the clear answer is no.

How to get things done right:

  1. Plan, plan and plan. Plan ahead.
  2. Dry run the plan
  3. Have a road map and milestones
  4. Take your own time
  5. Implement wisely
  6. Be honest and raise any red flags
  7. Think ahead and list impacts and misuse. Invent ways to prevent any
  8. Design for enhancements for areas where extensions are possible
  9. Test it in and out
  10. Engineer recovery, protection and lock up
  11. Have courage
  12. Patience is the key
  13. Study well with comprehensive theory coverage
  14. Design for anyone and everyone
  15. Have a clear idea of what you are doing and how it will change the world

You never know your invention might become a necessity tomorrow, so don’t compromise.

Saturday, November 08, 2008

The future is smart clients

Technologies come and go. Some become part of our lives. Some don’t. Some are just fillers. Some are ahead of their times. While others, serve as a base for new ones.

Software developers have used and programmed many. Architectures have selected the best that suits the purpose. But everyone knows we are still working on and looking for new ones. As we get one working, our expectations increases and we want to build more advanced and suitable technologies. Frameworks gets deviced once we have a clear understanding of what we want to achieve, how we want others to use it, and how will it impact future developments.

With Internet, the world became a village. Today, with the coming of mobile and embedded devices the applications are on move. We want information not just on our desks, but anywhere and wherever we are. And it’s not just about being connected, we want our data even in offline or disconnected mode.

We mastered the ins and outs of stand-alone applications, spent a lot on the client-server environments, moved to web pages and web applications and then entered the world of services. All these technologies are now playing a very important role in what’s called as 'smart clients'. These are applications which run on multiple platforms, customized by role, both in online and offline modes, with capabilities to synchronize data with multiple devices.

Multiple platforms: Smart applications will work on our desktops, mobile phones, PDAs, Mobile Internet Devices (MID), web applications, widgets, and any embedded device that user has access to. All have different presentation modes, and functionality depends of device specifications. Some will just be read-only, while others provide full experience.

Customized by role: In the world of applications-on-move, not all devices have the capability or complexity to handle everything. More importantly not everyone requires ever feature of the application. Smart-clients will enable application customization so that only relevant portions/features are available. This not only makes the application less bulky on resource constrained devices, but also serves the security and resource control requirements.

Online/Offline modes: These intelligent applications can detect networks and switch modes accordingly. In online mode application is fully functional. Data caching enables offline mode. While in offline mode, the application simulates an online behavior. Some functionality is disabled to protect data ACIDity and protect the user against the usage of stale data for decision making. But the overall experience is same as online mode. Any data that is to be sent to the server is queued until connection is found, and the lowest cost connection is used for communication.

Synchronization: We now live in a world of one-person-multiple-devices. Smart clients are responsible for not just synchronizing data between the client and the server, but also within all the devices a person use. This enable data availability at all times.

One excellent source of information on smart clients is Microsoft's Smart-client architecture http://msdn.microsoft.com/en-us/library/ms998506.aspx

More coming in with details on each of the features of smart-applications… keep watching…