Sunday, May 30, 2010

Thoughts on Wrapping Up Microsoft's FY10

Well, here's to wrapping up FY10. The kick-off of the Annual Review Season is our long, long, sloppy kiss goodnight to the fiscal year that was.

How are various things wrapping up?

Entertainment and Devices: with Bach and Allard out of the picture the E&D snow globe got a shaking where it's not clear how things are going to change. I was surprised at the number of pro-Bach comments in the last post, and a number of commenters believed that Mr. Bach had what it took to be the next Microsoft CEO. I respect your opinion, but I have to admit I did my best "ba-roo?" reading that.

Regarding Mr. Bach's departure: you can't call it accountability. Accountability would have been right after the red-ring o' death $1,000,000,000USD write-off. Come on, when senior leaders get together to consider what kind of emergent opportunities to get into, it's all about the billion dollar market. Perhaps they wrongly assumed that it exclusively meant income. It's pleasant that we have an entertainment presence like the Xbox and that Sony took a hard one on the chin, but did it really need to take that much money away from the shareholders and tarnish our reputation so much? And leave so much more unfulfilled around TV media entertainment that is getting rapidly covered by competitors?

Given the swirling flakes in the E&D snow globe, does E&D need to be Sinofsky'd? Discipline can be a good thing. You don't want every project to be like Forza. Willy-nilly feature development without stringent peer reviews and pre-checkin testing: dumb. Agile? So is using two hands instead of one to smear poo all over a wall. You've got twice the mess to clean-up. Those days should be behind us. More than anything, E&D needs leadership that oozes passion for everyday joys and who show up late Friday afternoon to play with what's new this past week and give praise and feedback. It needs joy and delight and laughter. And while running the trains on time is good for everyone, it doesn't need the stoic, passionless, data-driven rectilinear styling of a Sinofsky org's Switzerland.

No, rather than Switzerland E&D needs Italy. It needs curves and "oooo's!" and non-linear surprises. Sinofsky, I'd say, is on a three-release effort with Windows so he's busy anyways. I can't imagine if he was brought in to help pull things around, though, that it would go very well... I imagine his lieutenants first job would be to put the ribbon into the Zune client app and Media Center and then try to figure how to wedge it into the Xbox dashboard. Nanites would start flowing through everyone's bloodstream, and their skin would turn sickly pale... the trains would run ontime, just to dull destinations.

Kin: we put a lot of time + effort around Danger and producing the Kin (well, maybe more effort could have been spent on keeping the services running). Kin is not made for me or my social circle, so I can't judge it as a device. Sales will be the deciding factor here. And I'm sure when the first quarter numbers are released, we'll just say, "Well, we have an update to the Kin feature phone that we are sure will increase uptake significantly." Like fully supporting Facebook and Twitter features. I love the green dot, though.

And I do like Kin Studio, which I think pushes Kin over the top for some Millennials. If Kin Studio could be adapted soon to be a feature available for every WP7 phone user then we'd really surprise and delight potential phone users.

WP7: As for the WP7 phone: goodness. I'm hoping it's great and I like what I see. I like that a number of 3rd parties are already in the tube to deliver apps. I have sore glutes, though, from all the WP7 demos I see: every time a WP7 PM says, "Let me try this" my buns seize up hoping that it goes smoothly this time vs. the PM mumbling something about regressions in the latest build. There's still plenty of runway to go and time to fix all the various bugs and oddities, but it makes me apprehensive regarding the overall quality bar and wondering, "How did this go in so busted to begin with?" Several someones being agile, no doubt.

While we've been chasing the iPhone hockey puck (of what, two releases ago?) we risk that the real puck of today is Android. Maybe. The Android ecosystem is still too chaotic, but its potential is showing (thank you, Vic). We have to not only have great 3rd party apps on release but also show commitment in having our own series of Microsoft applications constantly going out of the door. For important as the mobile platform is, it's surprising how little we're invested in developing our own series of applications for it, hoping that developers will meander over to our party.

And as the mobile application platform grows up into more interesting devices, the Windows hardware platform is growing downwards to meet it. There's a collision of development philosophy dead ahead and it needs to be solved this summer, not within years. Microsoft seriously needs to woo developers, and if you're giving them an ever-changing flowchart of constantly updated development platforms when the competitors have straight lines, you've lost a big campaign and potentially the war. Windows, E&D, and DevDiv must be forced to reconcile the future of application development and distribution from mobile to client to cloud by Microsoft's CEO, or start FY11 with leadership that can.

Natal: I'll get a Natal device when it comes out, though I don't know how much I'll use it in the cozy space I have our Xbox in. I'm not redecorating for Natal, which means every time I boot it up I will look around at all the various potential ankle and knee injuries. It might be worth it, though, if I can swing a light-saber, force-push, and even wave my hand for a Jedi mind-trick. But not for playing paint kick-ball.

A big Windows opportunity for Natal: some smarty plugs it into his desktop and a driver installs and Win7 magically lights up for Natal interaction. Word spreads. Win7 works with Natal and you can go all Minority Report now with your laptop and desktop! That's a Jobs-worthy show-off moment: "Oh, yes, an iPad. How nostalgically quaint to have a device you have to actually smear your fingers around the surface to do something with. Now, watch my Cheetos plastered fingers bring up Media Center to play some recorded World Cup! And after that, I'll navigate the universe with Worldwide Telescope!"

Pop a cap in your ass: which by cap, I mean Market Cap and the reflections and abundant free advice issued forth when Apple passed Microsoft with-respect-to Market Capitalization this past week. A lot of focus came down on Mr. Ballmer, who shrugged it off as much as he shrugs off the lost decade of MSFT stock price. A nice case study of attitude begets results. While Microsoft has its three-screened head in The Cloud (can't wait to see that marketing campaign [eye-roll]) Apple continues a consumer-love affair of joyous design and content delivery. One bit of free advice I naturally loved: What Will It Take to Save Microsoft (MSFT) - a snippet from the end:

And I see no end to the misery. Microsoft should learn from longtime brother-in-arms Intel (Nasdaq: INTC), whose CEO Paul Otellini has cut a complicated beast down to the operations that really matter. That's the kind of sugar-free medicine it would take to save Microsoft from itself, and of course, something that drastic will never happen.

What a shame.

Yes, we need our Neutron Jack at this point. We have our supposedly endangered cash cows and then a lot of products and operations clinging on. Many of which that would never exist in a sane company. Spin-off those groups to live or die on their own, with Microsoft owning appropriate stock such that if their survival instinct kicks in and they flourish, it will be a nice hefty return. You also have to realize that product groups are way overstaffed and just need engineers, in this day and age, that can do it all vs. being silo'd into their coding, testing, or spec'ing narrow band. Specialization is not sustainable. And the Partner system needs to be nuked away: more and more it's leading to bad short-term shiny decisions meant to make Partner. Well, this list goes on. I think our next CEO comes from the outside, because only an outsider at this point can scrub the company clean and ensure that the corporate DNA is rewritten.

Stealth Layoffs: comments here for a while have been saying don't expect anymore large layoffs but do expect ongoing stealth layoffs, the kind that don't trigger the WARN act, let alone publicity. If you see your leadership meeting with HR far more frequently than usual, should you be nervous? Well, first step, ask what's up. If the answer is unsatisfying and doesn't ring true: yep, be nervous, especially as FY10 wraps up and new FY11 reduced budgets kick in.

If you or your group has indeed been affected, please, if you will, share as much as you can.


-- Comments

Tuesday, May 25, 2010

Microsoft's Robbie Bach Retires... Whoo-Hoo! (And J is gone, too.)

Just a quick celebration of this morning's news: Robbie Bach is retiring from Microsoft.

I'm so happy for him. And for Entertainment and Devices. And Microsoft.

This is a great opportunity for E&D to evolve and restructure. And, of course, a great opportunity to really screw up who to put in charge and such.

And yes, J Allard is out of here as well. Don Mattrick and Andy Lees step up. Also: David Treadwell side steps. And Office shuffles up a little bit.

What would you do with the various groups, products and who else would you put in charge?


-- Comments

Tuesday, May 4, 2010

Tool: DEV_SysTableBrowser and DEV_CreateNewProject tools now on AX 2009

3 or so years ago I created a couple of tools that provide extra capabilities for AX developers, specifically, ease up the creation of a new project with a predefined structure and name pattern, and add functionality to the way we browse tables with the standard SysTableBrowser, allowing to specify the exact fields you want to see, browsing temporary tables. Both tools were also available as Tabax plugins

You can read more about the tools, as well as Tabax, on the following pages on Axaptapedia:
DEV_SysTableBrowser home page on Axaptapedia
DEV_CreateNewProject home page on Axaptapedia

You can download the new versions of these tools through the pages on Axaptapedia, or directly from my SkyDrive: DEV_SysTableBrowser, DEV_CreateNewProject
If you are unfamiliar with these tools, I suggest you go through Axaptapedia, as it also contains a detailed description of the features provided.

A couple of things I would like to note:
  • There is a kernel bug in AX 2009 that heavily impacts the SysTableBrowser user experience. It takes around 10 seconds each time you want to browse the contents of a specific table. This bug was fixed with a hotfix rollup 3, so users of AX 2009 without the hotfix might have problems enjoying the DEV_SysTableBrowser tool.
  • In AX 2009 the behavior of SysTableBrowser changed a bit. Instead of re-opening the browser window each time the user changes from All fields to AutoGroup only, now 2 grids with these fields are added from the beginning, and hidden/shown based on user selection. DEV_SysTableBrowser provides much more flexibility when selecting the fields to display, so I was not able to follow the same approach. Thus, see bullet 1
  • I have not added any new AOT nodes to the template in DEV_CreateNewProject tool (Data sets, Report Libraries, etc). I don't think AX developers will invest that much time into SSRS reports and EP, and in these cases they will be able to manually create the remaining group nodes in the project.

Let me know if you have comments, suggestions or ideas for these tools.
Thanks

Thursday, April 22, 2010

Microsoft FY10Q3 Results

Time for another quarterly update - all indicators point to a great quarter. With Win7's results and upcoming releases of Office 2010, Natal, and Windows Phone, things are on the upswing. Like I wrote back in July 2009, I believe that Microsoft has turned the corner and is headed in the right direction, though by no means is the corporation out of the scary neighborhood a lot of bad turns sent it into.

But we have hit the bottom with Vista and have emerged as the can-do underdog. If Microsoft knows anything, it knows how to do underdog. We really need to learn how to be the gracious competitive top-dog, too, but for now, underdog works.

Plus, given time, the context of the competitive marketplace has changed a lot. First: thank goodness for competition. Even pureblood Google and Apple fans should be thankful for competition from Microsoft, even if they deign its presence with faint of disdain and use air-quotes when saying the word competition (and for some reason, I can't get a vision of the Seattle Weekly's Uptight Seattlelite out my mind while writing that). Second: there's enough growing concern with Apple and Google's success that folks naturally want balance and by no means do they see Microsoft as dominating. Rather: underdog, fighting for balance.

Things have gotten interesting again. Let's check-in on some of the original reasons this random blog started up:

Improved:

  • Microsoft needs to reduce employee size. It’s too big. It doesn’t need a quicky Atkins-equivalent. No, it needs to get itself on a corporate exercise program that will shed itself of unwanted groups and employees. And stay on that.
    • Wellll, we added a lot of jobs in the five years after that point, but when the cold harsh reality of over-hiring became obvious, it was handled (poorly) through layoffs.
  • Microsoft needs to stop hiring. It’s hard enough finding the scarcest of treasured corporate resources: the talented individual suitable for working at Microsoft. Stop hiring, trim down, and rebalance those precious scare employees inside to where they can be more productive and make products that delight our customers.
    • There have been freezes and slow-downs so that's good. But some hiring continues. What we really need is an efficient defrag to allow load balancing in the company.
  • Unleash employee driven innovation with a Microsoft Labs community area.
    • We have various labs now and other efforts that have come and gone.
  • Re-energize the home market. The home market is pretty tepid with-respect-to Microsoft-branded software. It can’t take that much effort to invigorate Microsoft for the home user and make it cool.
    • Yes, we realize now that the consumer market is worth pursuing vs. making the IT department happy with limiting features. People find cool technology now outside of work and bring it into the workplace (e.g., the iPhone). This is much improved and has a long way to go before we're great at it. Actually leveraging the power of the individual PC is still barely tapped, and probably groups are confused given Azure and three-screens about pushing more onto the desktop than we are.
  • Start working vigorously on Internet Explorer again. Winning the browser wars, dusting off our hands, and running away screaming from IE to the Next Cool Thing represents the very worst in less-than-competitive behavior.
    • Yep, we are working on IE with great passion. How we participate and influence HTML5 will be an interesting process to watch. I have no faith in the W3C (what was the last useful thing they helped create... XML namespaces?). HTML5 is the Next Big Thing if you listen to some folks who have large impact regarding Microsoft's future direction, so something is going to happen here. Have fun, IE-team!
  • Less research, more application.
    • Goodness knows most of the researches I know or occasionally work with are motivated to find out what product teams need and get inline with producing interesting features that the product team just doesn't have the background to create, so kudos there.
  • Continue the community effort and make it so if you’re not leading cool innovation, your butt is dedicated to some time per week helping out in the community, sharing all that wonderful knowledge between your ears. Reward that!
    • I did have this under the next section of "Not-addressed" until I realized that employee blogging covers this and has become so rampant that it has faded to a point that it's not acknowledged ("blogging is dead" and everyone now of course communicates in spurts of 140 characters. Uh-huh.). I'd like to see this turn into engineering employees writing more code that ships outside of our product line rhythm.

Not-improved:

  • Re-interviewing: all employees below a certain life-time review average need to re-interview. Those that don’t make the cut the second time around get to look for new opportunities elsewhere.
    • Just an idea regarding what to do for people who do not have career momentum. Over the years, the question has been: "Will this person make Level 63?" - if not, they should find a new company.
  • Back to Basics. Win32 and C++. Bread and butter. Not everything can run in the freaking CLR.
    • Our development story is a complete mess. And I don't see it getting any better. I'd say we're on a collision course of Bach vs. Sinofsky given development options for the Windows Phone vs. Windows. In the middle of this is a meandering DevDiv organization. If we have a gap in our underdog armor, it is our development story.

Back to quarterly results: the analysis I look forward to:

Friday we have a Town Hall. I'm sure there will be questions about going forward competing with the iPhone and iPad and Google. And maybe questions / comments like:

  • Are the layoffs over?
  • Wow, what a great quarter. I'm really looking forward to my raise this year...

Administrivia time...

This old blog: hey slacker blog-writer, what's going on here? Well, obviously not much. Mainly, unlike many of you talented people, I don't do multitasking well. Writing especially. Back, going on six years now, this was my spare time focus for writing and reading & responding to all the great comments. It was a unique place that arose organically as a lone voice to ask, "Aren't other people concerned about where Microsoft is going?"

Well, this lone voice has other writing passions right now (not involving Microsoft) and that's where I'm putting the occasional spare time I squeeze out of my life. I'm sure you can understand. It also happens at a time where things are fairly good with-respect-to Microsoft's future and direction. Yes, there are problems but there have been more successes than failures and the success of our competitors have provided clarity regarding direction and what success looks like.

If there are interesting constructive topics you'd like to discuss, please let me know.


-- Comments

Tool: User preferred startup menu for Dynamics AX 2009

In AX 2009, the user has no control over which menu is opened in the navigation pane and address bar when AX client is started.
Most of the time you simply get the Home page, which is frustrating for a number of users. Another thing that is frustrating for them is the company account the application opens with.

The latter can actually be setup using standard application functionality in the User options form. Just set the 'Start company accounts' to the account you want for the user by default.

I wrote a small tool, that allows the user to select a preferred startup menu, ensuring that this menu is the one open every time AX client is started. Something similar existed in Axapta 3.0 application.

You can download the xpo for this tool from my SkyDrive.

Note, that it contains minor changes to a number of existing application objects.
I suggest that you compare the xpo from the import dialog and ensure that you don't override any of your changes during import - the best thing would be to re-implement these minor changes manually. Below is a list of changes that I am referring to above:
  • SysUserInfo table - 1 new field was added
  • SysUserSetup form - 1 new control was added. Lookup method on datasource field overridden
  • Info class - startupPost method changed

In order to enable the functionality, simply select one of the menus in the User options, as shown in the below screenshot. Next time you start AX, the selected menu will be open by default.

Start Menu in User options, Microsoft Dynamics AX 2009

Below is a short listing of "code patterns" used in the project, that can serve as examples for your future projects:
  • SysTableLookup - for displaying a lookup form with a list of menus
  • infolog.globalCache() - for storing a global reference to the navigator class
  • TreeNode iteration - for finding all menu references in MainMenu
  • QueryBuild classes - for constructing and filtering a list of menu references in MainMenu, used in the lookup form
  • infolog.addTimeOut() method - for scheduling execution of another method in a set period of time

Friday, March 26, 2010

Tutorial: refresh, reread, research, executeQuery - which one to use?

X++ developers seem to be having a lot of trouble with these 4 datasource methods, no matter how senior they are in AX.
So I decided to make a small hands-on tutorial, demonstrating the common usage scenario for each of the methods. I have ordered the methods based on the impact on the rows being displayed in the grid.
You can download the xpo with the tutorial on my SkyDrive.

1. Common mistakes

Often, developers call 2 of the mentioned methods in the following order:
formDataSource.refresh()
formDataSource.research()

or
formDataSource.reread()
formDataSource.research()

or
formDataSource.research()
formDataSource.executeQuery()

or
formDataSource.research()
formDataSource.refresh() / formDataSource.reread()

All of these are wrong, or at least partially redundant.
Hopefully, after reading the full post, there will be no questions as to why they are wrong. Leave a comment to this post if one of them is still unclear, and I will try to explain in more detail.

2. Refresh

This method basically refreshes the data displayed in the form controls with whatever is stored in the form cache for that particular datasource record. Calling refresh() method will NOT reread the record from the database. So if changes happened to the record in another process, these will not be shown after executing refresh().
refreshEx
Does a redraw of the grid rows, depending on the optional argment for specifying the number of the record to refresh (and this means the actual row number in the grid, which is less useful for AX devs). Special argument values include -1, which means that all records will be redrawn, and -2, which redraws all marked records and records with displayOptions. Default argument value is -2.
This method should be used sparingly, in cases where multiple rows from the grid are updated, resulting in changes in their displayOptions, as an example. So you should avoid using it as a replacement for refresh(), since they actually have completely different implementations in the kernel.
Also, note, that refreshEx() only redraws the grid, so the controls not in the grid might still contain outdated values. Refresh() updates everything, since this is its intention.

3. Reread

Calling reread() will query the database and re-read the current record contents into the datasource form cache. This will not display the changes on the form until a redraw of the grid contents happens (for example, when you navigate away from the row or re-open the form).
You should not use it to refresh the form data if you have through code added or removed records. For this, you would use a different method described below.
How are these 2 methods commonly used?
Usually, when you change some values in the current record through some code (for example, when the user clicks on a button), and update the database by calling update method on the table buffer, you would want to show the user the changes that happened.
In this case, you would call reread() method to update the datasource form cache with the values from the database (this will not update the screen), and then call refresh() to actually redraw the grid and show the changes to the user.
Clicking buttons with SaveRecord == Yes
Each button has a property SaveRecord, which is by default set to Yes. Whenever you click a button, the changes you have done in the current record are saved to the database. So calling reread will not restore the original record values, as some expect. If that is the user expectation, you as a developer should set the property to No.

4. Research

Calling research() will rerun the existing form query against the database, therefore updating the list with new/removed records as well as updating all existing rows. This will honor any existing filters and sorting on the form, that were set by the user.
Research(true)
The research method starting with AX 2009 accepts an optional boolean argument _retainPosition. If you call research(true), the cursor position in the grid will be preserved after the data has been refreshed. This is an extremely useful addition, which solves most of the problems with cursor positioning (findRecord method is the alternative, but this method is very slow).

5. ExecuteQuery

Calling executeQuery() will also rerun the query and update/add/delete the rows in the grid. The difference in behavior from research is described below.
ExecuteQuery should be used if you have modified the query in your code and need to refresh the form to display the data based on the updated query.
formDataSource.queryRun().query() vs formDataSource.query()
An important thing to mention here is that the form has 2 instances of the query object - one is the original datasource query (stored in formDataSource.query()), and the other is the currently used query with any user filters applied (stored in formDataSource.queryRun().query()).
When the research method is called, a new instance of the queryRun is created, using the formDataSource.queryRun().query() as the basis. Therefore, if the user has set up some filters on the displayed data, those will be preserved.
This is useful, for example, when multiple users work with a certain form, each user has his own filters set up for displaying only relevant data, and rows get inserted into the underlying table externally (for example, through AIF).
Calling executeQuery, on the other hand, will use the original query as the basis, therefore removing any user filters.
This is a distinction that everyone should understand when using research/executeQuery methods in order to prevent possible collisions with the user filters when updating the query.

Thursday, March 4, 2010

Highlighting your code on Blogger

A couple of people have now asked me for the tool that I use for pasting the source code on my blog.
In order to use the same, you will have to change the template of your blog and include the following scrips:


<script src='http://amalafe.googlecode.com/svn/trunk/Scripts/shCore.js' type='text/javascript'/>
<script src='http://amalafe.googlecode.com/svn/trunk/Scripts/shBrushCpp.js' type='text/javascript'/>
<script src='http://amalafe.googlecode.com/svn/trunk/Scripts/shBrushCSharp.js' type='text/javascript'/>
<script src='http://amalafe.googlecode.com/svn/trunk/Scripts/shBrushSql.js' type='text/javascript'/>
<script src='http://amalafe.googlecode.com/svn/trunk/Scripts/shBrushXml.js' type='text/javascript'/>
<link href='http://amalafe.googlecode.com/svn/trunk/Styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://amalafe.googlecode.com/svn/trunk/Styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script type='text/javascript'>
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.config.clipboardSwf = 'http://amalafe.googlecode.com/svn/trunk/Scripts/clipboard.swf';
SyntaxHighlighter.all();
</script>


After that, you will be able to create code by specifying the following:

<pre class="brush: c-sharp;">
Your code goes here...
</pre>