Thursday, April 17, 2008

Why do people shy away from giving useful 360 degree feedback?

I know human psychology is one of most complex things in the universe! But still fail to understand why people shy away from giving useful 360 degree feedback even when it is requested?

I can understand the case where feedback provider holds back this thoughts when there is a fear that his or her name would be revealed and it may spoil a good relationship or cause unnecessary trouble in office or life.

But when the feedback is being provided for a good cause why do people shy away from giving a complete feedback? Why do they provide 180 degree feedback which only leads in a direction but doesn't complete the circle leaving the seaker to ponder all over for the correct point?

Take example of ADG performance poll. There are votes for good, ok and bad. Good and OK are understandable because it is kind of known as testing and many in house scenarios has proved that the performance is acceptable (if not great) in many use cases. But BAD was (kind of) unexpected because of so many hours of testing which has gone in.

Bad performance can arise because of many reasons. For example it can be due to bad performance of GroupingCollection as Doug has kindly pointed out. It can be due to complex custom itemRenderers being used. It can be due to a genuine problem in a particular control flow inside ADG. But without a complete feedabck (pointers to the exact problem faced if not samples) it would be impossible to work on anything. It would be similar to searching for a black coat in a dark room or worse for a non existent coat in a dark room.

This also goes along the same lines as my post about software patches. If customers don't make use of available source and public bug base and provide a good feedback even a very good intention/path provided to help customers goes waste.

In this context I don't know whom to blame for the situation as customers we find ourselves in, because we are not making full use of the easy avenues open in front of us to make a product worthy of the money we have paid for. Or is it that customers have accepted the situation and are showing indifference towards demanding what they rightly deserve?

Wednesday, April 9, 2008

Software patches good/bad/ugly?

This topic has been in my mind for quite sometime now. It used to reach the top and remain their for sometime whenever Maxthon poped up "A new version available with fixes would you like to install?" dialog.

In early days when the auto update feature was unheard of I used to think software patches are ugly. One needed to keep visiting the website of the product frequently to check whether a patch was available to fix the problems one is facing with the product.

Once patches became more and more popular and available I used to think them as bad. That was becuase sometimes patches used to have more serious problems than the original product. And once you have applied a patch it was not easy to remove it and a complete uninstall-install cycle was required to get back to square one. The "The update requires a system restart. Restart now?" screen only served to add more fuel to the bad feeling.

Now that auto updates are default and internet is thought as part of your desktop I have beginning to think that patches are good! I think the quality of patches is better now compared to earlier days, may be due to companies having automated testing tools to assure quality.

My latest thought is that "Not having (releasing) patches is really really a bad thing". Pushing a product out of the door having already planned for patches is bad. But at the same time knowing that customers are suffering with a released product, asking them to wait for the next release (which would be more than a year later) is just pathetic. Because every release comes with its own new features and new bugs. Companies don't push out new releases without new features as they won't earn any money with a release (patch) aimed at fixing serious bugs or performance issues in the previous release. The problem with this kind of approach is that the attitude about a bug changes in the following way.

Version 1.0 release : We are releasing a great product which would help our users in a great way by boosting their productivity. We would fix all serious bugs soon.

Customer: Great. Let me use it.

Version 2.0 release : We have lot of new features for you. In this release we have addressed all serious bugs (read it as bugs reported by great parteners and volume customers) in the previous release.

Customer: But what about other serious bugs faced by me?

Company: We would fix all bugs soon.

Customer: They are only fixing bugs for the new features and few more bugs from volume customers.

Version 3.0 release : We have lot of new features. We have revelutionized the workflow. We have rewritten many parts of the code to boost peformance. etc... Of-course now we are open-source !

Customer: Now it is Open-source ? Great! But what about bugs which were in 1.0 release?

Company: Oh! our customers have lived with these bugs for more than 2 years, now they have almost stopped complaining.....they can live with it! If they complain more, let us ask them to upgrade to the new version and follow a new workflow/API for the same feature which we have introduced. And anyway we are open-source let them grab the source and fix the bug themselves. We can't spend our precious development time over fixing those old bugs.

Customer: Where I can find a developer and time to study this piece of open-source product and fix bugs for me? ...?....?

As customers who have paid their hard earned money I think we deserve a better treatment. Don't you think so?

Using Flex OLAP/OLAPDataGrid for doing Pivoting computations

Satish has developed a new PivotComponent using OLAPDataGrid and OLAP which can be used to perform pivot analysis of data.

The sample can be found here. Drag and drop one or more dimensions into the column and row fields. The results would get displayed as soon as the drop happens. Drag and drop more dimensions into column, row or slicer fields. Use the drop down attached to dimension button to pick specific members of the dimension to do slicing. The sample uses OLAPChart and OLAPDataGrid extensions to display the OLAPResult generated.

Description and source

Monday, April 7, 2008

Custom Aggregator sample for Flex OLAP

Here is a sample which shows a percent custom aggregator used for OLAP. The sample shows computation of percentage of values to the total value. The total value is assumed to be known before hand.

The PercentAgg class implements the IOLAPCustomAggregator interface. The constructor takes the total value as input and uses it to compute the percentage of values in the computeEnd and computeObjectEnd functions.

The sample also shows how OLAPAttribute class can be extended to OLAPTotal to replace the "(All)" value with a custom name "Total".

The sample also shows how OlapDataGrid can be created in AS and itemRendererProviders can be supplied to it and values displayed in ODG can be styled. Here is the complete source.

Writing a Custom Aggregator for Flex OLAP

Writing a custom aggregator for OLAP involves implementing the IOLAPCustomAggregator interface. It is easy to write a custom one based on the default ones. The default SUM, AVARAGE, MIN, MAX and COUNT aggregators source can be found in the mx.olap.aggregators directory.

The SUM, MIN, MAX and COUNT aggregators are all simple and acutally doesn't require any special handling as they are linear. The AVARAGE aggregator is special because avarage of avarages wouldn't give the correct result and hence we need to maintain proper information to arrive at the correct result.

The following sample shows how this is achieved.

IOLAPCustomAggregator has 6 functions can they can be divided into two sets.

1. computeBegin,computeLoop and computeEnd. These functions are called to initialize, compute and return the simple aggregation value.

Suppose 1..8 are the input values and they need to avaraged as two different sets 1..5 and 6..8. The sequence of function calls is one computeBegin, one or many calls to computeLoop and one call to computeEnd. 1. computeBegin can be used to prepare for a fresh computation. 2. computeLoop is the place where the acutal computation takes place. This function would get called repeatedly to add new input values to the aggregation. 3. computeEnd is supposed to return the value of the computation. This is called when cube decides that no new input values would get added to this aggregation and it is ready to receive the final value.

2. computeObjectBegin, computeObjectLoop, computeObjectEnd. These functions are called to initialize, compute and return the aggregation of aggregations.

The second set of calls would be, one call to computeObjectBegin, one or many calls to computeObjectLoop (depending on the number of aggregated values) and one call to computeObjectEnd.

As shown in the image these functions are supposed to compute the avarage of avarages. As the first set of functions saved the sum and count values separately the task is easy. We need just compute the sum of both these values from each avarage object.

In computeObjectBegin the first value to start the computation is passed. In computeObjectLoop the the computation is carried forward with additional values. In computeObjectEnd the result of the computation should be returned. Hope this helps!

Sunday, April 6, 2008

AdvancedDataGrid performance poll

Hello AdvancedDataGrid users !

I have added two polls to the end of my blog. One for suggesting in what areas should ADG performance improve. Second one for overall performance of ADG in your projects/apps.

Please spare some time out of your busy schedule and take the polls.

I would urge you take both the polls because just taking one poll many not deliver the exact picture. For example if you say vertical scrolling performance needs to be improved we don't know whether the app is hurt by its performance or it is that it would do better with a performance boost.

Thanks for your time !

Of-course if you would like to send me a sample showing poor performance in a particular/general context please do by sending a mail

Update:I am seeing more number of votes on Bad than expected :(

I would appreciate if you leave a comment as to which particular area of ADG you found the performance to be so poor that it forced you turn it down. I am asking this because votes are also going in favor of Good and OK. It would be of great help if I get a pointer in that direction so that we can study that area of the code more and see what performance improvements can be done. Thanks!