Sunday, March 28, 2010

Installing Life or Uninstalling it?

But now I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth”.

It’s astonishing to discover how many of us are existing without doing the most imperative thing in our life – living! Bizarre, but true, don’t know if anyone of you have observed it, but we (most of us, if not all) suddenly have become enclosed and to some extent aggrieved by the toxic environment encompassing us. And before you start dwelling into the Go Green initiatives, I must declare, this is not about carbon footprint, greenhouse gases or for that matter, earth hour! We are no longer happy (attempts to inherit virtual happiness have failed time and again).

The global economic downturn certainly triggered and aggravated it, but to solely blame it and move on would be an under-observation, indisputably leading to a lethal mistake. A quick glance down memory lane would bring back what now has become the epitome of happiness. School and/or college days, once sloppily spent, have now become desperately desired. Most of us would agree, we all were passionate about our to-be jobs. Why are we then loosing what’s called life – the intrinsically simple phenomenon of enjoying atomic moments sans dependencies?

At the time of inception, happiness, in general was supposed to encompass monetary capacity in general and fulfillment of passion, in particular. Most, if not all of us, have reached a point whereby the monetary fulfillment is somewhat achieved (before you start shouting no ways, ask yourself how much was the first paycheck that you got and how satisfied you were with that and what do you draw today), if not surpassed. What went missing was that flare, that passion which in the first place drew us to what we are into today.

For you Mr. Reader who is still figuring out what this post is all about, let me decompile the above LIL (Life Intermediate Language) code for you. It’s about our (you are allowed to exclude yourself if you so consider) inadequacy to achieve something simple, something atomic – a sensation called happiness! Every other disremembered friend I encounter nowadays seems to have a problem (the dictionary meaning of which is a state of difficulty that needs to be resolved). And regardless of the gravity of his problem, he simply wishes to resolve it! The keyword here is wish (the dictionary defines it as an expression of some desire or inclination), and also consider that one is wishing for the problem to be resolved and not making earnest attempts to do the same. My intent here is to express the undeclared, catastrophic phenomenon that is taking away life as it exists in the purest acceptable form, from most of us.

What follows might be considered a litmus check that attempts to compute whether you are missing life or living it.

If you don’t find yourself reacting yes to most of the points below, then must say
Houston! We have a problem!”


1. Do you like your company? (Intellisense suggests like as find enjoyable or agreeable)
2. Do you like to work with your immediate superior?
3. Do you like the people adjacent to you?
4. Do you like your day-to-day work?
5. Do you have time for yourself at the end of the day?
6. Do you spend adequate time with your family?
7. Do you have a private domain to cater to? (no Intellisense for this)
8. Do you think your current professional step would lead you to your esteemed destination?
9. Do you consider yourself to be adequately skilled and improving on a routine basis towards your desired level of expertise?
10. Do you believe in yourself and your aptitude to change the tide in your favor?

Shout out your Yes scores in the comments section, would be prodigious to know!

The programmer in me couldn’t resist myself from injecting some code (dependency injection?) into this post, so here we go.

The LINQ query for the above resulting questions could look something like this:

var query = from Moments in Life
where LifeTime != Timespan.Future
select Moments
order by gravity descending; //vital criteria appears first
query, in this case would be an IOrderedQueryable<Life> and not an IQueryable<Life> (I am just venturing into LINQ, so do bring out the compilation errors and/or warnings in the code above).

Happy living and for that, Happy coding too!

Sunday, March 14, 2010

Awaiting .NET 4

The .NET Framework version 4.0 is slated for release in April 2010 and everyone seems to be excited about it (everyone by definition includes everyone, so me too). Being the next big release of the framework, there exists number of enhancements and fusion of several new ways of writing old and new smart applications.
I sat down searching for what’s in it for me, the conventional (it’s the most reputable word I could afford for myself, corollary to calling bugs as exceptions) .NET developer for whom writing .NET code is not only about developing cool new smart applications (hardly get to do it thanks to the huge number of legacy and combo apps we need to upgrade day-in day-out) but also write that enlightening code quickly and smartly.
I have made an honest (as if honesty still exists?) attempt to compile what I felt was just so super cool changes to the framework or language in general. Let me #warn you not to expect the entire v4 enhancements from the lines that follow. That won’t ever happen (if I could do that MSDN would be hosted at my local desktop, right?).

1. StringBuilder.Clear(): I was surprised to see this as an addition to the v4 version, as all this time I had expected this member function to be omnipresent in the StringBuilder class (going by the superior and smart design of the .NET framework). Just recently while using it for dynamic html generation (I was using VB9 and still didn’t use VB XML Literals for some bizarre reason, which is indeed classified), I found the absence of this method. The workaround was setting the Length property to 0 which would then clear the contents of the StringBuilder object.
2. String.IsNullOrWhiteSpace(): As is eminent from the name of the method, it checks not only the Null or Empty content of the string object but also helps avoid the use of the Trim() method to make certain we don’t end up with a string of precious whitespaces. An authentic admittance though, I already had added my own extension method in my v3.5 extension methods repository that did verify the absence of both Null and Whitespaces before performing any further string operations and was aptly named String.HasValue(). I am indeed smart (I always knew this, but formally broadcasting it on this DateTime.Now).
3. ServiceProcessInstaller.DelayedAutoStart: While developing Smart Client applications it is a very common requirement to register the application to launch on Windows startup. However, as is eminent, too many applications loading on startup will upsurge the boot time significantly deteriorating the end user experience. This feature comes to the rescue by delaying the start of the application until all other auto-start services have already started.
4. SMTP Client enhancements: Some of the enhancements include enabling SSL mode in application configuration files, specifying heading encoding and most importantly, multiple replying to addresses through MailMessage.ReplyToList().
5. Guid.TryParse(): The TryParse method has now been added to the Guid, Version and Enum types and behaves exactly as its counterparts in other types.
6. 64Bit enhancements: Recognising the mainstream adoption of 64 bit systems the Environment class has been decorated with: Environment.Is64BitProcess and Environment.Is64BitOperatingSystem.
7. IEnumerable<T> everywhere: New overloads of String.Concat() and String.Join() now support IEnumerable elements so that you don’t have to convert them to strings prior to performing Join or Concat operations on them. Also enhanced are several System.IO members like the new File.ReadLines() which returns an IEnumerable<String> rather than a string array. This in turn gives superior performance benefits as its always (read mostly) desirable to read a file one line at time rather than loading the entire content in memory as in File.ReadAllLines().
8. Corrupted State Exceptions: How many times have I written the following?
try{
// Something that should fail, or else why did i incur this try cost, right?
}
catch(Exception ex)
{
// Never do anything here. Let them come back to me for fixes (guarantees job security)
}
In .NET 4.0, corrupted state exceptions will never be caught even if you specify a try… catch block. Even though this is a huge obstacle (a setback or even a crisis) on my attempts towards my job security, yet I welcome it as it encourages writing more stable (in theory) code. Before you start depreciating your intentions to upgrade to .NET 4 for this particular reason, there is a switch that allows you to get the old behavior back by setting the following attribute LegacyCorruptedStateExceptionsPolicy=true in the config file.
This behavior can also be enabled on individual methods with the following attribute:
[HandleProcessCorruptedStateExceptions]
9. System.Data.OracleClient: Before you plunge into thinking why MS shelled it’s resources to enhance OracleClient, instead of their own franchise SQL Server, there is a surprise awaiting you. OracleClient is available in .NET 4 but marked as deprecated. Don’t believe me? No need to, just help yourself by visiting http://blogs.msdn.com/adonet/archive/2009/06/15/system-data-oracleclient-update.aspx .
10. VB Auto Implemented Properties and C# Named and Optional Parameters: These are some of the language specific enhancements essentially following Microsoft’s strategy of co-evolving the two languages.
VB now has auto implemented properties thereby reducing the amount of code generated significantly (I hated VB Dev Center for not introducing it in VB9).
C# developers now stand equal by having named and optional parameters (which to me should have been there at least since v2 of the language).  

The list above was never meant to be exhaustive, it does not even attempt to touch the Parallel computing extensions and dynamic (or functional) enhancements to the framework, but it surely addresses most of us, the conventional .NET developers, writing managed code that manages our company, our clients and primarily us!

Happy Coding!

Sunday, January 31, 2010

Truth be told


The IT industry in particular has been guilty of over using (read misusing) acronyms and phrases, the
real meaning of which is not known to many, in and outside the industry. The following is an honest attempt for people at large to get to know or revive their knowledge about few such phrases.

Certain terms or phrases used are developer centric but I still believe you would have over heard it while walking past a cluster of developers talking to themselves. The list was never meant to be exhaustive, so inject your own and help educate the people at large (the good people who aren’t part of this typical industry).

  • Alpha – a synonym often used in place of the disclaimer clause in relation to software

  • Beta – the deliberate act of making people dependant on software that you know doesn’t work the way it is supposed to.

  • Unit Testing – It’s taking responsibility for the subsequent ill effects of the code you wrote.

  • Integration Testing – the act of shifting the responsibility above to some other person or module.

  • Dependency Injection – the art of writing code that you know will crash, but making sure you alone can fix it. In current scenario, this is the only way to have  job security in the software development industry.

  • Community Technology Preview (CTP) – the only way whereby a company gets testers for free.

  • Release Candidate (RC) – the difference between a CTP and a working release of software.

  • Project Manager (PM) – A mysterious organism over engrossed in excel whole day long, meetings for whom marks the coolest way to chill out.

Post in your comments and assist in carrying this list to the next level (Beta 2 to be specific).

Happy Coding!

Sunday, November 15, 2009

The Criminal Coder


Mr. Reader, in case you have read my previous posts (in case, is the key phrase here), you might be by now thinking me to have lost my psyche. How can I, the ubiquitous attorney of coders on this planet (and Mars) call them evil? Well, to clear out doubts, they are criminals when compared to their superiors (read developers).

How can anyone deglamorise the developer by comparing him with a coder? To me coders are beginners, not absolute beginners, but people who know stuffs, but simply skip to do them, the way it is meant to be done, for laziness or for reasons I fail to understand. It’s not the lack of intellectual capacity that causes them to commit mistakes (read crime), its rather their sluggishness, that makes them do what they want to do, even if that brings about compromise in terms of the code they inject to dilute (read pollute) the system.

The following are some snippets from production code(basic changes made to trim the demo) that I have encountered, in this short span of life (read professional life), and when debugging performance problems in applications, stumbled upon them, and literally felt like giving digital life imprisonment to those who had the audacity to commit these bits!

  • Object declarations inside loops: For simple objects I sometimes feel it’s unavoidable to declare objects of types inside a loop, but for complex types, it’s simply a crime. The following code was intended to improve the performance of the application by spawning new threads. Don’t find the need to say more, the code is self explanatory (and yes, gives a boost to performance):


    public  void UploadXML()
    {
    DataTable dt = GetDataTableFromXML();
    for(int i=0; i<dt.Rows.Count; i++)
    {
    Thread th = new Thread(…);
    th.Start();
    }
    }
    Guess what will be the first problem that your app may run into? An OutOfMemoryException.


  • Unacceptable usage of If construct: The code is overly expressive of my intent.


    for(int i=0; i<1000; i++)
    {
    if(IsPostBack==false)
    {
    //Do something here
    }
    }

  • Overly expressive logic: I didn’t have the courage to congratulate this guy and kept shut even after seeing this. There were 10 checkboxes in the page and all of them had this. All of them!


    //As if Checked return a float
    bool b = (checkBox.Checked==true? true: false);
    And I have seen even experienced guys do a


    .ToString()
    on a string. What more do you expect from visual studio? Auto-detect these overly expressive conversions? Surely, it would do so, may be in VS 2014!


  • Global declarations in methods: Why not lazy declare and initialize at the point of usage? We are not in the C age any more (or are we?).


    public void Foo()
    {
    int a, b, c, d;
    //50 LOC before using c and d
    c=c+1;
    }

  • Avoiding short circuits: Short circuits were provided in the language for some reasons, why not use them to decrease the number of characters typed and let the compiler expand them?


    //Enjoy...
    bool a = false;
    bool b = true;

    //do something with b here
    if(a ==false)
    {
    //this is left blank (and yes, intentionally)
    }
    else
    {
    if(b == true)
    {
    //Some code to execute
    }
    else
    {
    //Again left blank (intentionally ofcourse)
    }
    }
    Why is the following so uncommon to write amongst few geniuses (strict pun intended)?


    if(a == true && b==true)
    {
    //Some code to execute
    }

    I know you might be thinking who on earth will follow the above pattern and dilute the code, but I have seen it far too many places to avoid mentioning it. Fact is, some coders simply forget the fact that an if can stay without an else. There are innumerable examples and I will certainly update this post to show some really valid places for short circuits, which were completely skipped (and did i mention, knowingly?).

The above list can’t ever be exhaustive, since each coder has his own pattern of seeing the code. At times I tend to give them (the coders) some leniency by considering their experience with a particular language, but most times, it’s just unacceptable and unforgiveable.

The following is a beautiful extract about the types of competence (or incompetence) that we encounter:
  • Unconscious incompetence: You don’t know what you don’t know.
  • Conscious incompetence: You know what you don’t know.
  • Conscious competence: You know how to do it, but you have to think your way through it.
  • Unconscious competence: You can do it without thinking. You just know what to do.


By the way, the reason I termed the above as crime, was because all those coders had live code at their disposal while adding these bits. They simply ignored the style of existing code used in the application and were arrogant enough to not tilt from their style of coding.

To me, that is simply unacceptable and unforgivable crime!

Hail Visual Studio! Save us from the criminal coders!

Sunday, November 8, 2009

The agonizing SME developer


Before you begin to think too much into SME, let me sync you up by expanding it for you to the Small & Medium Enterprise (SME). To me these enterprises are a source of raw mystery. When hiring or making decisions up front they are humble to use the latter portion of the acronym (considering themselves no less to Google or MS), and while sharing rewards and parting with their stuffs, the former part is acknowledged (the financial stability is, as they say, on the rocks, literally and did I mention, always).

An interesting find about the word "agony" is that it not only covers intense physical pain but also the "mental anguish" associated with or without it. Through recursion, I soon found out that anguish leads to extreme anxiety or emotional torment. Emotions, almost always, shell themselves into passions, which by the way, is the root cause of misery of all software developers on planet Earth and Mars (they, the guys at NASA, have been shouting all along that life exists at Mars and if life exists, you bet, software developers exist too). So what has a naïve SME developer got to do with agony? Well, at the lowest permissible degree, they were married, in time and space, forever and ever and ever (infinite loop begins, statement truncated).

The lifecycle of an agonized SME developer is what follows…

the morning
A beautiful day begins with a beautiful morning, and this, surprisingly doesn’t hold good any more for the SME dev. Unlike any other professional, the first thought that crosses his (not intending to be gender biased, it’s just natural, you see, it could have been her as well, instead of his) mind is: what can go wrong today, it’s such a beautiful day? Little does he know, that for no fault of his (yes, almost always, there is no fault of his directly, and I am being subjective here) the day will turn out to be, to say the least, bewildering!

the journey to the castle
Notwithstanding the delight of travelling via public transport (describing it as pathetic would be an understatement, hence skipped), he transcends to the castle a.k.a. office in other professions. The unquestionable devotion (no pun intended) towards his work is physically visible as he takes long strides and enters the castle. Life, society, culture, esteem, pride and many other eligible candidates of personal character stay out as he walks in to the castle.

the starters
The most crucial activity of the day begins, checking personal email account. And to just give an example of the overflowing talent in him, even the strictest of firewalls and blockages are incapable of preventing him from accessing his aspirations. His concealed talent, resembling his meager pay slip, can by no measures be hidden, no matter how much he endeavors.

the dream
Unlike other professionals of his age (and beyond), he doesn’t intend to spend (again, skipping waste to avert understatement) his time, forwarding mails to his friends (remember, the social thing in him just stayed out as he entered the castle?). Rather with translucent aspirations, all he searches for (with a far optimized index then what Google can ever manage) is a call from anyone (being complacent) from his list of dream companies. Aghast!  Unlike Google, which returns a million results for even the most horrendous search terms, he witnesses a no results found (that’s why Google roars about its better, less optimized index).

the call
And before he could balance himself, here comes the call, from no one else, but his PM or TL or MD or CEO (remember its SME, so even CEOs have enough time to get on with individuals) or anyone at a relatively higher position then him. Yes, this is it! Life, if ever existed, will cease to exist. Problems, in case they don’t exist, will be created and accredited to him.

the aftermath
The repercussions of the call, a tiny list of tasks, generally, varied in nature and ranging from simple to super complex tasks, to be, in all magnitudes of time, be completed by the currently running day. And did I mention it’s already lunch time!

the optimizations
Being super talented has its own advantages; it allows you to optimize time, beyond the ordinary, spent in professional activities. And the SME dev is no exception, he quickly walks through the tasks list, completing the tasks ranging from simple to considerably complex in irrelevant time spans. The ultimate desire at any point of the day that keeps him inclined - leaving for home (sweet home) at the right time.

the valor
Quickly sensing that the day isn't as good (sarcasm intended) as it was supposed to be, he aims towards his superior with one of the most irrelevant issues of his life, increment (presuming his steady association with the company, which simply refuses to end).

the crime
Approaching for increment in an SME is in itself an offense, unforgiving and regretful. Irrespective of the person being approached, the debate, most of the time leads to a plethora of branching discussions (healthy ones) about - the ubiquitous recession. Even though he wasn't the offender in bringing the slump to the economy in general, still, as a solemn employee of the company, it is his (and solely his duty) to forget increments, incentives, and any other term that relatively maps to the same meaning. He is a developer, passion feeds him, and code recharges him, why on earth has he the need of a better pay scale? Why do we need money? Mostly for our social activities, and if the very social element is missing, why direct the funds in the wrong place?

the return
With an absolute sense of satisfaction, understanding his very own importance in the company and the role (the most important one) that he plays in the general growth of the company (as alluded by his superior), he returns to his desk, unaffected by the discussions, proceeding to what he was supposed to do, code!
The evening is as stale as the dreams he has, and proving his multitasking abilities, he goes ahead in search of his dreams again (accessing his personal email account, remember?) while coding the most complex tasks, wishing them to auto-complete, be auto-verified and surely get auto-published.

the home coming
It would be audacious to imagine that nothing went wrong while the evening squeezed past. Client feedback (mostly neutral, the positive, if any, never make up to him, an auto-transfer mechanism transfers his credits to his superior's account), bug lists, pending tasks (even after a full dedicated day of work) and an extinguished desire to return home is what awaits.
 The journey to home is as exciting (remember the public transport factor?) as it can be and seldom enough does he get time to re-structure his goals (which by now have been declared static).

The day ends, as any other; battles won (and battles lost), nevertheless the passion, the dream, the very sense of being a developer, remains!

Be an SME developer, its an experience life apart!

Saturday, October 24, 2009

IMiserable <T>


Before you think otherwise let me clarify that IMiserable <T> is not a new generic interface introduced in .NET 4.0. As I climb up the stairs as a developer, every passing day, there are certain things that simply make my life miserable day-in  and day-out.

I hereby attempt to list down the top 3 things that I believe are a mess for developers at large. It’s amazing how most of us (if not all) find ourselves hooked up eradicating these miseries per project, per day basis.

  • #3: My Code, my browser: I have been developing web applications for around 3years now and I simply couldn’t understand why I am supposed to make my pages compatible on all major browsers. For people who might say “why not”, here is my defense: Web is everywhere and the way to access it, the ubiquitous browser. Give me 1 reason as to why as a browser vendor, you need to make your own rendering decisions? Why can’t differences be only in terms of the underlying performance engine and client script execution engine? Why do u need to render tags differently, be it alignment for certain tags or other rendering decisions or awfully at times, some completely new names for similar elements across the DOM (supported across the browser with different names for same elements)? And to add insult to injury, you guys can’t even maintain compatibility between your own versions (and someone asked cross browser compatibility).

    Just because I don’t have a browser of my own (Vaibhav Explorer or VaiFox or Vaifari), am I supposed to tolerate this misery?



  • #2: this.Validate(): Did it ever cross your mind that if you were not supposed to write validation code (for all possible combinations of mess that the user can create) how much time, LOC, and execution optimization you might have gained? Just recently I was coding a Registration page with something around 30 fields with good numbers of Checkboxes, RadioButtons (in various groups) and plenty of DropDownLists and TextBoxes. And guess what, each dropdown was supposed to have a “Select” item at the top of the list and awfully enough, all fields (except checkboxes) were required. So selecting “Select” in a DropDownList wasn’t allowed and I was supposed to validate and prevent the user from submitting “invalid” input. This is the too common misery for all of us developers out there. And yes, did I mention that I was asked not to use the ASP .NET Validator controls (for some cynical reasons which only my PM can answer). And needless to say, every failed validation would prompt an alert box (in client script) with a custom prompt message. Trust me, and you would agree, roughly 60% of LOC of that page was validation script code. And yes, the ultimate saver of any developer Mr. Copy & Paste couldn’t help me beat the frustration out!

    Why can’t the world (denoting my dear clients and their honest and well-intentioned users) just provide valid input in the first place! I know it’s impossible but just imagine a world with no validation where every byte of input comes from a trusted source, is perfectly what I need and needless to say, side-effect free!



  • #1: Works on my Machine: This is undoubtedly the numero uno of our miseries! How many times have you found something perfectly executing on your local workstation and simply freaked up on the live server. And the first reply that comes (by default) when the PM enquires for the crash is: “It works on my Machine”! As if you didn’t knew that the client didn’t pay to browse “localhost”. It’s humorous how even seasoned developers cite this reason. And I have self witnessed this so many times that while my fellow dev was freaking out I was almost insane with an internal laughter (an external display of laughter will only dispose me and make me garbage collected by my company).


    And you would agree, the maximum time this misery appears is when it’s time for you to buzz off and the PM being a very respectable, honorable and understanding person, makes it clear that you aren’t leaving before everything is fixed showing absolutely no interest nor intent of lending even half the hand to help you out.







Share your miseries that you feel are worthy of being added to this list!

Debugging miseries is all we do day-in and day-out. Let’s just continue with it (as if there were other options available)!

Happy Coding!

Saturday, May 23, 2009

Windows 7 - Dreams come true!

Welcome to Windows 7!

Yes, version 7 of the flagship product from Microsoft, the successor of the not so overwhelmingly popular Windows Vista. Going by the release of this edition of Windows, it won't be unsafe to say, they finally got it right!

Having received thrashing from all corners of the world and from all user bases, including Developers, for the earlier version of Windows, “Windows Vista”, Microsoft was under tremendous pressure to recapture its lost esteem in the ever dominated arena of Operating Systems.
How many of us know the full names of operating systems that don’t start with the word Windows? Apple Mangoes anybody?
Truth be told, no matter how many times we hate that Blue Screen of Death (BSOD) or the sudden domination of the invisible force that hangs our work (and us literally), Windows is “the One” when it comes to the system software that runs atop stupid hardware!

Windows 7 is in the Release Candidate phase, meaning it’s almost complete, and is awaiting final feedback from users worldwide before final release to manufacturing (RTM). You can download it here.

Here’s what you need to have:
    • 1 GHz 32-bit or 64-bit processor or higher
    • 1 GB of system memory or more
    • 16 GB of available disk space
    • Support for DirectX 9 graphics with 128 MB memory (to enable the Aero theme)
    • DVD-R/W Drive


      • Quick preview of the things that caught my eye, instantly:

        • Taskbar -see it to believe it


















  • Windows Media Player 12 - simply awesome!



  • Math Input Panel - awestruck!



  • Sticky Notes - why wasn't it included earlier?



  • Calculator - on steroids!



  • Paint & WordPad - kids grow up finally





Folks, I have been using Windows 7 since its RC (its free until March 01, 2010 after which the computer will start shutting down on itself every 2hours to remind me to purchase the final build). Its hard to believe but once you use Windows 7, u will end up saying "Gosh! How did i never feel the necessity of all these supremely essential features ever ?"

Its insane to say this, but this is by far the best Windows ever!
(Sorry XP darling, you have finally come off age)

Tall claims huh! Well, i can support it with some logic
(deriving from my programming background):
  • Built on the failure of Windows Vista, it boasts of all the customer driven improvements that Microsoft received for its previous release of Windows.
  • Compatibility, the core of the problem that plagued Vista, gets accurately and reasonably addressed, thanks to the thousands of devices that Windows 7 supports, simply out-of-the-box.
  • Superior performance, the gains are clearly visible if you have installed Windows Vista and then migrated to Windows 7. Same platform, same configuration, a boost in performance guaranteed, and as Microsoft claims, RC is just a work-in-progress as far as perf is concerned!
  • Customise, customise and customise. The biggest USP of Windows XP, that makes it still the most popular and widely acclaimed version of Windows till date, was customisation. With XP, you controlled your PC, literally. With Vista, they simply messed it up! Accessible options of XP were simply missing or unreachable. With Windows 7, you will experience the ultimate in customisation and usability.
There are simply innumerable features in this gigantic release of Windows 7, an entire bible might even fall short of explaining and exploring them. If you have reasonable hardware and a descent intent to enterprise, go ahead and install Windows 7.

You won't regret it!

Happy Windows 7 exploration!