Archive for the 'General' Category

Selling V*

Apparently I was marketing some medications through this blog.

After dwindling Google result ranking, I discovered that my old installation of wordpress (ancient 2.1) was vulnerable enough to allow unauthorized template modifications.

All is fine now isA.

Man or SUV

The amount of corn needed to produce a full tank of gas for an SUV is enough to feed a person for a whole year.

The 2008 World Development Report “Agriculture for Development” provides a compelling example of the food-for-fuel debate: over 240 kilograms (or 528 pounds) of corn – enough to feed one person for a whole year – is required to produce the 26 gallons, or 100 liters of ethanol needed to fill the gas tank of a modern sports utility vehicle.

Source: World Bank: Africa - Rising Food Prices Spell Hunger for Millions Across Africa.

Business-People Pairing

How would it be like if our sales-person shared a few hours of his time acting as an observer on implementing a user story with one of the developers? What if our HR manager set aside a part of her Monday to watch a developer troubleshooting an application or setting up a deployment script?

If software development is at the core of a business (or even if it’s a support function), I would expect that such scheme can help shed a light on how the service is being delivered. It would make it easier for business people to understand what it means when a propeller-head say that “Story X would take Y days to implement” or that “a new release will be deployed to the production server”.

I can understand (and appreciate) that each party has his own value to add to the supply chain. But, sometimes that internal supply chain is taken for granted, and as days go by, everyone starts swimming in his own pond, forgetting that it takes a team effort to deliver quality service.

I’m not sure if such schemes (Business/Developer Pairing) are implemented, but, I would expect it being part of an operations management practice.

Anyone out there?

Increment vs Iterate

These images have been glued to my brain since I first saw them. A masterpiece by Jeff Patton that rang lots of bells.

Incrementing the Mona Lisa

Iterating the Mona Lisa

via Obie Fernandez.

Code Quality Measure

via FocusShift

Via reddit, and from there to the best quote I read in a while:”Watching non-programmers trying to run software companies is like watching someone who doesn’t know how to surf trying to surf.” - Joel Spolskey. The quote is highly interpretive, but, to a great extent it bears the truth.

Rails vs The 7 Frameworks

This has nothing to do with comparing 8 different frameworks.

It’s just to tell the horror story of one of our down-the-drain projects.

The client came with an old product that he needed to add new features to. The product does, what is best described as CRUD operations. Nothing challenging, nothing difficult. It maintains a set of data for various client in a certain business domain. Their business model (at least what they’re trying to do) is through ad and subscription revenue. They were trying to move the business forward through enhancing the provided service.

The only challenge can best be described as that the product was a pure mess.

It has been built using (last time I counted) 7 different Java frameworks, some redundant, some obsolete. Apparently it has been the greatest learning experience for few individuals. The product took 8 years in the making, 4 different teams (non remained with the project), 14,000+ files, absurdly normalized 100+ tables database, absolutely 0 documents, No unit/function/otherwise tests to reach its current state.

To give some example of code horror that we had to go through, some Java classes contained business logic, HTML code, display logic, data access mechanisms, hard coded urls. The objects were then instantiated from within JSP pages (with lots of other embedded Java business logic/code) and passed parameters and servlet controls.

This is not to mention the build scripts that took 3 hours to update code off of the CVS, then threw numerous errors during the “real’ build.

That’s in addition to the project tree which was in a state of absolute mess (40+ different individual modules, with some exact modules placed in different locations).

And have I mentioned the “wrapper” PHP application that was delivering a CMS-like functionality (another set of mess, with no cross-application awareness of any kind).

Again, the product didn’t do anything challenging. Just basic CRUD and a couple background processes.

Our initial attempt was, of course, to build on top of the insanely absurd code-base, but after few days, we’ve decided (us, client, operations) that it might worth to venture into a new platform, in order to make it easier (and cheaper) to deliver new business service and at the same time, incrementally migrate features into a more robust code base.

Few months into the making; including the client formulating his requirement and reverse engineering the legacy system, we had our first release of the new business features (including the integration with the original application, modelling 70% of the legacy schema, a streamlined version of few original functions, documenting finds of the original application).

Few more months of client acceptance testing (and repetitive requests from our part for a feedback), client vacations, and [seemingly] client running out of budget, the client finally came back to us deciding that our solution was not accepted.

I frankly didn’t know whether to laugh or cry.

Despite the fact that the client admits, in his own words, the original Java application is a bag of “s$%t”, he refuses any attempt from our side to tell him that his application is non-maintainable.

He decided (and probably promised by some other individuals) to monkey-patch the code base that he has. He, of course, threw our choice of Ruby into the bag of reasons not to pursue this further.

Although I can defend our decision to resort to an incremental migration, and taking Rails as our vehicle quite well, yet, I now believe that the choice of technology should be the least of his worries. The business decision of incremental migrations (or even rather a rewrite) remains the optimum choice in my opinion, whether it’s done in Ruby, Java, PHP or brain*^%&.

The moral of the story is: As long as you care, never be a door mat, insist on getting your ideas through, always believe that you’ve been hired not for your typing speed, but for your intellectual abilities and what they can bring to the business.

When your clients run your business

I just need to get something off of my chest.

Some of the companies that I’ve worked for/with, rely heavily on their clients as the only true measure of performance. They would take client satisfaction as a reflection of how they themselves perceive their operations and businesses.

This is just plain WRONG.

Unless an organization have the established mechanisms and procedures that would identify problems before escalating into “customer dissatisfaction”, then they are on a decline path. Not only they need to identify problems, but, in order to remain competent, they also need to improve their internal operations. This can’t be done if an organization relies solely on their client to tell it how its operations are performing.

I’m not saying the customer satisfaction is not important. All I’m saying is that it should be “A” part of how you measure your company’s performance, not THE measure.

Customers might be pleased with what have been provided to them (in the form of a product/service), but, does that really mean it is the best that could be produced? A customer is never an expert at what an organization does. He’s only an expert at his own businesses/domain. Customers know the little about how a business (other than theirs) is managed, operated and what competitive advantage it has. That couldn’t be more true than in the cases where the traded commodity is as complex as the intellectual ability of an individual/team. In such cases, the only ones capable of establishing those performance criteria are those at the “producing” end, not at the receiving one.

Some organizations go to the uneducated extreme of hanging their employee performance on how their clients perceive those employees (yes, gentlemen, that happens). They sometimes even totally discard what those employees have provided. Their rule of thumb is “as long as there are no complains, they are on the right track”. This can never be furthest from the truth. I’ve been through projects where the products provided are seemingly functional from the outside. But, a simple look at the internals is enough to categorize them as “hit and run” projects.

How does a product/service that is “perceived” to be functional be in such demise? Why?

I belive the answer to the How part is not in the scope of this post (might rant about that in later post), but, I belive that the why answer is simple enough. There weren’t enough “interal” rules to identify what functional/satisfactory is. This doesn’t only apply to the delivered product, but rather the process through which that product was delivered.

In my opinion, the service delivery industry has yet to learn a great deal from the manufacturing industry. Ignoring the current environmental factors; The manufacturing businesses have been through extremes in order to survice and compete, not ONLY by meeting their customers’ needs, but also through the evolution of how they manage their own internal and external operations.

Phew.

Now I can sleep.

Canada Software Developers Salary Survey

Most software development salary surveys I came across are either inaccurate, generic or obsolete. This is an individual effort to capture the pay scale of Canada’s Software Developers & Consultants. It is also an effort to highlight the wide scale of activities usually handled by professionals in the field, which sometimes goes unvalued monetarily or professionally.

Results will be Published periodically on this blog.

Here’s the survey form from Wufoo


Powered by Wufoo

AnyKey FF Plugin

For those of us who are Arabic-typing challenged (picking up Arabic letters off the keyboard) - AnyKey is the solution.

AnyKey is a FF plugin that gives you the power of writing Arabic as it sounds (without the need to learn the Arabic keyboard layout). It also got transliteration from “Russian, Ukrainian, Amharic, Armenian, Hindi Davangari, Hebrew, Mongolian, Greek, …”.

Press F2 onto the text box of your choice, then “M” for example, you’ll be presented with the letter “Ù…” in the box. It even got great hacks for heavy sounding characters like “ص” (Shift+S) and dotted characters like “ض” (Shift+S+’).

Pyramids, Application. An Analogy

Working on maintaining and modifying a five year-old Java application, I came to realize there’s a strong relation between legacy and pyramids. Here’s an analogy:

  • Huge PyramidPyramids are HUGE monuments, built for the sole purpose of being a tomb to one person.
  • Although the project tree is HUGE (14000+ files), the purpose of the application is amazingly modest (CRUD + search)
Building the pyramid

  • Pyramids required a lots of resources to build (time, wealth, labor).
  • The application took 5 years, 4 teams and lots of $ to build.
Build Method

  • No one knows exactly how the pyramids were built.
  • Compiling/Building the application is a black box. “Just invoke those commands - twice - and you’ll get your ‘war’ files”, said the Build Master.
  • Ancient scripts are quite scarce inside the Pyramids.
  • Project documentations are almost non-existent
  • Sometimes you wonder what motivated people to build such a thing, in such a shape.
  • The schema is highly normalized (talk about contact information spanning across 4 different tables, with email field divided into name and fqdn) - WHY?!
  • When you look closely, Pyramids are built by stacking layers of stone blocks on top of each other.
  • The application is a grand collection of all sorts of frameworks (counted 4 so far), libraries (uncountable), tools, architectures.
  • Currently, some Pyramids aren’t structurally sound, and visits to them are quite limited in fear of falling rocks.
  • Dare adding new code to that monster?
  • Bent PyramidImperfect pyramids can be found along side perfect ones, proving that it took builders decades to master the way they were built.
  • The application contain all sort of “imperfect” code as a proof of how the builders gained experience over time (JSP files with Embedded Classes, with embedded Java code and hard coded urls, business logic, view logic and data access mechanisms)
  • People visit the Pyramids for few hours as a source of great admiration and respect. Then, continue on with their lives.
  • The application’s code is a source of respect and admiration, but when it comes to something functional, better build something else.
  • Pyramids can’t be maintained.
  • The great conclusion.
UPDATE:

  • Some people have been reported to complain about a sense of suffocation or claustrophobic symptoms when exploring the pyramid internal passageways.
  • The same is experienced while reading the application code.

Next Page »