Wednesday, July 18, 2007

Microsoft FY07Q4 Results

Here comes the fourth quarter results for FY07 and some peering into what FY08 has in store. Well, as much as we're willing to reveal. My favorite post analysis sites for the results:

I'll summarize what folks are saying and link to their posts later.

Some articles started showing up earlier in the week forecasting what the results might be and that totally got derailed by Mr. Peter Moore leaving Microsoft for a better, family friendly job location with Electronic Arts in the Bay area. I know a lot of gopher heads popped up questioning, "Accountability? In action? At Microsoft?"

That was quickly put to rest. Of course, even if Mr. Moore was asked to head for the nearest exit, we wouldn't want to piss him off over at EA. So, I'm marking this up as how it was presented, with zero amount of accountability being exhibited. Again. Whatever the SPSA metrics are for this upcoming shower of gold, I'm sure none of the bad news around Xbox will affect the payout.

What do you think will be the interesting parts of the end of FY07 results?

What questions would you ask if you were on the conference call?

Some topics:

Vista: how is deployment? And analysts will probably fish for news on SP1, given that SP1 should increase Vista deployment. To me, the secondary issue is around Vista 3rd party drivers. I still walk into people's office and see some cool device and hear, "Yeah, well, when the Vista drivers are released I'll be able to use it again..."

Oh, and hey Windows Vista: you remember Chris Pirillo? Let me jog your memory: (1) Copying Xerox, Vista Mistakes, and VP and Perspectives (2) There's Ray! Plus: Plenty of Room For More Brains at Microsoft. Don't shrug him off as a whiny complainer nor doubt his ability to get press, because last week the Chris Pirillo focused "6 Months Later, a Report Card on Vista" / "Six Months On, Vista Users Still Griping" / "Little Annoyances Still Big Vista Issue" took its sweet time spreading to about every news site I read.

Acquisitions: probably we should hear a question about aQuantive and how things are looking there. It would be nice to also conjecture about other acquisition targets... I know, we can't. Again, I would enjoy Microsoft acquiring Facebook and then letting only the best people help them build it out (e.g., sorry, no one from Spaces allowed - you had your chance and you'd probably be bitter). Of course, when it comes to acquiring Facebook, Scoble says we ain't good enough.

Duuude. We're well over having the Microsoft network membership pass one-fifth the number of current employees. We're not just dating Facebook here. We're (leaning forward with a knowing glance) involved. Ooo! I'm going to invite Bill Gates to be my friend on Facebook right now... okay, done.

Staffing: last year, Mr. Bishop was the first to gather that Microsoft had an explosive year in employee growth. How bad is it going to be this year? And who the hell are all these people? What parts of the company are growing and what is the demand that the growth is addressing? How the hell can we sustain this growth globally let alone poor little cluster f'd Redmond / Bellevue? It just makes my language go to pot.

Anti-Trust concerns: the elephant in the room. Do we expect any discussion about Europe progress, let alone the US? We yanked Google's anti-trust chain for the DoubleClick acquisition, now they are yanking our anti-trust nipple ring around desktop search.

(Later...)

Follow-up posts to our earnings announcement:

I was surprised that Liddell shrugged off the importance of Vista SP1. If it was an attempted Jedi Mind Trick, he forgot to wave his hand.

Other goings on:


Sunday, July 15, 2007

Fetching Data experiment (CacheLookup property)

Playing around with certain table properties at work, trying to improve performance, I decided to post some results today.

The original job was taken from the Dynamics AX Development training materials (III and IV), which, taking the opportunity, I would like to recommend for reading. Especially I enjoyed chapters dealing with performance issues (a topic that is very interesting to me :))

Well, they write about measuring caching there, which they, actually, shouldn't do, because the job they provided won't work in DAX 4.0 (the counters will be zero) (I guess it was simply copy-pasted from DAX 3.0 training materials - you should never use copy-paste, especially with code :) - trust me, been there many times)

Anyhow, I modified the job a little bit to make my research a little easier.
Here are the results I have received for SalesTable:


Basically, running the job may help you decide, what is the best CacheLookup property value for a given table. 
But first priority is reading about it in tutorials or the Inside Dynamics AX book (basically, it's almost the same information on this topic)

You can do some R&D yourself by downloading the job: download
Have fun!

Also visit the homepage

Sunday, July 8, 2007

Whether Life Here or Life There, Life is Short.

Long time, no blog. I'm lurking indoors today, taking a break from the abundant northwest-summer sun and re-hydrating. Lots and lots has happened over the past couple of weeks. Let's see what we can cover here before the wonderful weather becomes too much of a temptation...

The Long $1,000,000,000 Kiss Goodnight: now come on, how can you have to put aside $1,000,000,000 to cover faulty Xbox 360s and not go and hold President Bach or VP Moore or VP Allard accountable and fire them? Let's go back in time to November 2005 and a comment I made then about what I called the Ring of Fire showing up on the initial 360s:

First, XBox sucked up one billion dollars from our company and broke that division's wallet. Now is 360 going to break our heart, too?

I can only have faith that this is one place where Microsoft will endeavor for quick turn-around to get replacement units out, no questions asked. With a kiss... give the folks having to exchange their XBox a bunch of Live Points. And I hope this is just a small percent of units. One poll had 14% of people responding that they had a 360 brick shortly after playing it for a while. Oy!

Let's see, over nineteen months later we fess up and - although it seems forced - we do the right thing and cover warranties for our customers. In the meantime, a lot of customers with broken boxes have been jerked around (including Microsofties, complaining internally about how awful it is to try to get their 360 repaired). Look, either at ship time we knew about this problem and decided to ship or we didn't know about this problem and kept shipping once it showed up. Either way, it's a screw-up in knowing and going forward or not doing enough to know about the quality of the box. Deming weeps.

And now we're putting aside a billion, bringing up the bitter memory of the billion point five we deferred because Vista was so late to ship that it missed back-to-school and the holidays so we had to cover with Vista upgrade coupons. It is only because of the abundance of cash left over from the successful cash cow days that we're able to screw up like this, dig into our deep pockets, drop the money on the floor, shrug our shoulders and shuffle on. We're lazy and we're lax and no one is being taken to the public woodshed for this, and I would be surprised as hell if anyone on the Board of Directors, or the shareholders meeting, actually spoke up and said, "Hey, um, excuse me, but, this Xbox business thing seems to be a black-hole money pit. Is it wise to continue investing here? How about spinning them off so that they had to survive on their own decision making?"

The only thing I've seen the Xbox business accomplish, besides making a lot of money disappear, is make Sony dash themselves against the rocks with the PS3. Monkey-see, monkey-do even better. In the meantime, the Nintendo little piggy gleefully exclaims, "Wii! Wii! Wii!" all the way to the bank.

Additional new orifice ripping: MSFTextrememakeover What's another $1B among friends. An interesting thought coming out of that is people wondering about Mr. Bach's loving indulgence in selling MSFT stock is his bailing out while he could and if there are any concerns about the SEC investigating here.

Life and Work Changes: some goodbyes I noticed recently:

Josh Ledgard (of the power couple Josh & Gretchen): Today is my last day at Microsoft.

Adam Herscher: Why big company life didn't cut it - snippet:

So, with that, there were only two things I couldn't get at Microsoft (and probably not at any other large corporation) that helped lead to my decision to leave:

  1. Any semblance of something like a work hard-play hard culture
  2. The ability to take big risks and reap big rewards

[...] allow me to propose one potential solution. I would love to see a large company like Microsoft give employees some sort of equity in the products they work on, in addition to company stock, thereby providing a risk/reward system in which one's work can have a direct impact on their stake in equity.

Adam's comment aligns with my belief that Microsoft needs to be more focused on team rewards and less focused on individual non-team aligned achievements that is coupled with demoralizing bucketing and 10% witch-hunts. My friend from a large technology company showed me some old internal memos that detailed (a) what the group's goals were for the coming year, (b) a progress update on those goals, and (c) what the bonus payout to everyone would be based on achieving those goals. Nice.

Life at Google: Adam's post links to an email circulating inside of Microsoft that reflects on working at Google. Eh, I wanted to read about the review and compensation system and how the Googlers felt about it, fairness-wise. No such luck, but probably right now Life at Google is so much wild fun that the review and compensation system is minor. Everything else in that post sounds like stuff we already knew or suspected. I think we have to live with the fact that Google culture is - and will remain - different than Microsoft culture. We're too big and systematic to go and try to retrofit a Google work-environment across Microsoft, no matter how alluring it might be. I think our only choice would be to break-up into four smaller companies and then reboot and rewire the culture in each to meet the demands and responsibilities for the new company. For instance, an Office culture has to be different (probably quite stodgy) than an online / Windows Live culture. The imposition of a mono-culture right now is slowing us down.

The comments in that post would make for an interesting short essay: Google lovers, Microsofties demanding blood, bemused outsiders, and the occasional interesting insight. Oh, and this one from Andrew Gamache, out hiring the best engineers:

So now it’s clear there’s no career development at Google; and little at Microsoft… If you’re at either one, it’s time to take your future more seriousely than they do. [...] PS- The OS engineer behind XBox, and several of the guys on the original Google Earth Team are happy clients of mine- some makeing over 700K in salary a year– NO options or stock. Cash. Every year. at 28 Years old.

485 comments and trackbacks to this point. Wowza. I can tell you, given the desire to understand how Google works, a Mini-Google blogger would get lots and lots of attention right now. Or an insider could wrap it in a parody with a Fake Sergey / Fake Larry / Fake Eric blog. Those certainly seem to be all the rage nowadays. As evidence, we don't have just one Fake SteveB, we have 2.0!

Life is Short: there's lot more to talk about today, but I've decided to go out and enjoy the rest of the beautiful day, so let me close with the below comment that came in on July 3rd that I'm exceptionally grateful for the commenter taking time to share:

Today is approximately my one year anniversary of leaving MSFT after 11 years. I was a Level 67 woman, banging my head against the wall (or more like glass ceiling) trying to make "partner" and killing myself & my marriage in the process.

I now work for a hard-working start-up in Seattle (30+ people and growing) and couldn't be happier. While not every day is perfect, it's refreshing to read this blog and realize what a different world I am in now:

  1. The people I work with are really smart(a number of our employees are of ex-MSFTies with more joining every week), motivated to do their jobs, and treat each other with dignity & respect.
  2. Our Executive Management is mentally/emotionally mature, grounded in reality of business, value work-life balance, and treat the employees with honesty and respect. (see a theme here?)
  3. Decisions are made quickly and executed rapidly. No grand-standing, land-grabbing, ego-boatsing, political posturing, etc. We're all pulling towards a common goal.
  4. We are accountable to our deliverables, our professional behavoir, and each other. I no longer have to tolerate actions and communications from peers who hide their own incompetency behind obnoxious management styles or the protective shield of HR.
  5. I recognize that when I work really hard (and I do, every day), it directly contributes to my company's success, and therefore my own.
  6. Tomorrow is a holiday. I don't expect there will be much email across the team (except maybe a little from us ex-MSFTies...old habits die hard) that will be waiting for me on Thursday. I don't feel the need to have to spend a day off "catching up."

Net net - if you're spending alot of time reading this blog and have been thinking about leaving, then do it. You don't have to tolerate the working environment you're in, or feel vitimized by the realities & circumstance beyond the majority of your control. There are more feasible alternatives out there. Yes, there is some risk - and less freebies - but life is short and do you want to spend it feeling trapped, frustrated, and ultimately used?

Do what you like. Like what you do. Truly. If you're working in that kind of environment and are looking to hire talented Microsofties ready to grow and shrug off the bureaucratic systems all-around them (ever so much in evidence during this review season... oy, that review tool), a short comment here about why your company is so different and groovy would be welcome.

Because if we Microsofties can't change Microsoft to be that way, then we should at least know where's a good place to move to.


Wednesday, June 27, 2007

A bug in validation of methods' access modifiers and class abstract modifier

While testing the new feature of Tabax plugins today, discovered a bug in access modifiers validation.

It is performed only at compile time.
Which means, that if the compiler doesn't know what object the method belogns to, than the validation is skipped.
And you can run protected and private methods from whereever your code is executed.

Here is a simple example: (press cancel in the dialogs, otherwise you will get a RunTime error, because the method pack is not implemented in RunBase)

static void tutorial_AccessModifiersError(Args _args)
{
    Object runBaseObj;
    SysDictClass dictClass;
    ;
    runBaseObj = RunBase::makeObject(classNum(RunBase));
    runBaseObj.setInPrompt(true);
    runBaseObj.promptPrim();
    runBaseObj.setInPrompt(false);

    dictClass = new SysDictClass(classNum(RunBase));
    dictClass.callObject(methodStr(RunBase, promptPrim), dictClass.makeObject());
}

setInPrompt and promptPrim are both private methods. so they should not be allowed to be called this way.

The same thing can be achived by using DictClass.

The funny thing is:
while writing a test example for this post, I stumbled upon another bug - now it's about the abstract modifier of a class.

You all are probably aware that RunBase is an abstract class and cannot be initialized.
Well, in the example I showed this is done using 2 methods again :)

I guess someone should register these with Microsoft.

Tabax plugins' update - RecentWindows, RecentProjects

After developing 3 great tabax plugins I was feeling a little unsatisfied, because I wanted to add images to the popup menues.

AndyD has developed a class that allows me to do this now.

The project containing the class with the images is "shipped" separately. Depending on where you want to see images in your popups menues or not, you will be able to import it separately if you do.

Download:
You can use the following links to download the projects (version 0.1.1) and the MenuImages class.

RecentProjects v. 0.1.1 -download
RecentWindows v. 0.1.1 - download
Class MenuImages - download

Alternatively you can download them from their homepages on Axaptapedia.

RecentProject - homepage
RecentWindows - homepage

Screenshot: (RecentWindows)

Tuesday, June 26, 2007

AxPaint - make your DAX look cool :)

A couple of months ago I asked Alex Kotov from AxForum to modify a project he wrote for fun half a year ago or so. Today he sent me an e-mail with the project.

A short description of what the tool can do for you: :)
Basically, it just changes the backcolor of your DAX 3.0 (it does not work for DAX 4.0) installation.
You can choose a simple custom color you would like to use, or select an image from your hard drive to use as the background image.
you can select a couple of settings as well (ALL the settings are accessed by pressing Alt + S in DAX after launching the AxPaint form) - like stretching the image or using a 'transparent' background, showing your desktop (you have to set the image path to a specific location for that).

Nothing much, you'd say. But it sure is fun to work in DAX when a nice picture is seen in the background. :)

Installation instructions:
  1. Unzip the archived files.
  2. Place the .bat and .ocx files somewhere where you won't delete them accidently.
  3. Run the .bat file, which will register the .ocx
  4. Import the project into Dynamics AX - the project contains one form AxPaint.
  5. Run the form. It will automatically hide from view. Press Alt + S to run setup.
Custom settings (my preference):
  1. The image path is setup to C:\Documents and Settings\%username%\Local Settings\Application Data\Microsoft\Wallpaper1.bmp - this is the path to the current wallpaper in Win XP (without active desktop)
  2. Show desktop (like Delphi) option is set in the setup dialog.
  3. In the startupPost method of the Info class the following lines are added:  
  4. An external application is used to change the wallpaper on system startup. So every day I have a different look in my DAX :)
Project archive download link:
download

Custom code for the info.startupPost method:


 if (curUserId() == 'ikash')
    TreeNode::findNode("Forms\\AxPaint").AOTrun();


Link to the external WallChanger application:

download

Screenshots:

Monday, June 25, 2007

3 Dialog extensions

Performing one of the modifications on the project I am currently working on, I had to modify the behavior of one of the basic classes using the RunBase framework.

Anyway, what I needed to do was:
  1. Override the basic lookup for a specific control on the dialog.
  2. Prevent user interaction with other forms until the dialog is closed.
  3. Make some of the controls in the dialog mandatory.
Well, the perfect solution here would be to create a Form, and use it as the dialog.
But the code was very highly customized, so it would be a hard job.
So I decided to go another way, using what I have on hand, and that is the Dialog class.
For that, I needed a couple of modifications to the Dialog class, as it does not allow any of the 3 features I neded.

But what any developer should clearly understand when using dialogs is - this is just another form. Simple as that - Dialog is just another AOT form. What this means is that with a dialog we can do all the things we can do with a form.
Also, which is very nice and I thank DAX Developers for that, RunBase framework uses DialogRunBase class for showing forms, and this class is extending from class Dialog, so changes made to Dialog will also be available in RunBase framework.

Here is a small explanation of what has been modified:
  • Added a class Dialog variable showModal, which controls the modal state of the used dialog. 
  • Added a parm method to set the value of the showModal variable. So, basically, to make a modal dialog you simply have to call this method passing true as the parameter.
  • Added a method SetFormModal, which actually does all the enabling/disabling of windows (DAX 3.0 only, as DAX 4.0 already has built-in modal forms)
  • Modified runOnClient() method to allow server dialogs to run modal as well
  • Modified wait() method, which calls SetFormModal method (DAX 3.0 only)
  • AddField and AddFieldd modified to allow specifying a specific name for a control.
  • DialogField class was modified to allow setting the mandatory property (mandatory(), unpack() methods) and specifying a specific name for a control (new and fieldname methods)
The project contains 4 objects:
  • Class\Dialog - only modified methods
  • Class\DialogField - only modified methods
  • Class\Tutorial_RunBaseForm
  • Jobs\tutorial_DialogModalMandatory
The tutorials show the features added to the Dialog and DialogField classes (one of them is present in the basic application and is extending from RunBase, using an AOT form, the second is a job, showing the use of Dialog class)

DAX 3.0 Download link (was created in DAX 3.0 SP5 KR2) - DOWNLOAD
DAX 4.0 Download link (was created in DAX 4.0 SP1 EE) - DOWNLOAD

Important:
After importing the project do not forget to compile forward the Dialog class and to restart the DAX client.

Certain Issues you should know about:
  1. InfoActions, if present, will allow to access forms, if the infolog window with them was opened before the modal dialog was called.
  2. Mandatory property starts working only after a value is entered into the control. What this means is that if you simply press OK right after the dialog is opened, you won't receive an error (regular forms works this way too)
Credits
The modification allowing to specify a specific name for a DialogField was originally posted on the Russian Axapta forum