Welcome to MSDN Blogs Sign in | Join | Help

Project management: the same yesterday, today and tomorrow? Please nooooo...

I can't think of a more depressing thought than that software project management never becomes more productive nor predictable. Ever since I was first on a team that faced "big software failure" I have been keenly interested in this dance. It's something bigger than the coding and the design, invisible and yet tangible in its effects. This is why the Jim McCarthy videos are so funny and poignant (21 Rules of Thumb for Delivering Great Software on Time, 1995). This was why I became involved in MSF in 1998.

Thankfully, the face of software project management is changing because practical methodologies are being integrated into the dev tools. Effective methodologies are just collections of good practices, but when they are adopted by teams and enshrined in tools, they can make a difference to the software crisis that Brooks talks about ("The Mythical Man Month").

While there will never be a world of extreme programmers and we still need far greater automation in software production, nonetheless tools like Visual Studio Team System (VSTS) are a step in the right direction.

This could have a positive impact on businesses that adopt it.

____________________________________________________________

Andrew Delin

...more on team processes and innovation at ProcessofInnovation.com

 

Posted by andrewdelin | 0 Comments

Agile in the beginning: the Microsoft Solutions Framework circa 1993

I recently presented MSF v4.0 (alpha) at TechReady 2, Microsoft's internal technical training event in Seattle. This is the first time I've shared a stage with Bill - but not at the same time ;o)

Microsoft has a long history with the Microsoft Solutions Framework (MSF), which started back in 1993 -- that's a 12 year heritage! There aren't many frameworks that can claim to have added value to the development process for over a decade. I've been involved with MSF since 1998.

There have been some comments on the newsgroups that Microsoft invented MSF in recent times to badge its version of Agile which is present in Visual Studio Team System (VSTS). In fact, the original MSF from 1993 contains many Agile-sounding principles.

My friend Clementino Mendonca located the original MSF v1.0 guidance and highlighted some statements it makes, for example about design documents -- or the lack of them. If you read Agile authors you will hear refreshing statements like "Produce no document unless it's need is immediate and significant". Elsewhere you can read pieces on Agile that ask questions like, "Why do people document?" which suggest that teams should produce "barely enough" design documentation.

Back in 1993, MSF v1.0 was saying something very similar:

Why No Design Document?
The customer is rarely the intended recipient of a design document.  There are generally two uses for design documents:

• For purposes of management and communication between Development team members.
• To aid in maintenance and enhancement after release.

For purposes of management and communication between Development team members, the need for formal design documents is established by the Development Manager with his/her development team.  At Microsoft, design documents are developed when they are needed and, when memos, meeting notes, and interface specs are sufficient, time is not spent writing formal design documents.  "When they are needed" might be:

• Starting a new product.
• When team members are new to the company or to each other.
• When the design issues are complex.
• When there are too many developers on the project to ensure adequate communication otherwise.

Realistically, many corporate development projects have all of these characteristics, and a Development Manager should consider carefully a decision not to build design documents at some level.

For purposes of maintenance and enhancement after release, the best answer is to have self-documenting code and to generate any supplemental documentation automatically from the code itself.  Of course, interface and call diagrams are often indispensable.  A development manager should consider allocating time late in the development cycle if up-front design documentation is not critical.

extract from Microsoft Solutions Framework v1.0 - Solutions Development Discipline, 1993

So it seems that "agile thinking" isn't new: it's a bunch of good ideas, expressed in MSF and elsewhere. It would be interesting to trace the origins of the daily build and other good dev team practices. Who did it first?

This posting is provided "AS IS" with no warranties, and confers no rights. Use of any included script samples are subject to the terms specified at http://www.microsoft.com/info/cpyright.htm

 

Posted by andrewdelin | 3 Comments

Laser printing in stainless steel - from Excel!

I love the connection between abstract computing and the real world. I've had this fascination ever since 1986 when I built circuits to sample sound using an Atari 800. Plugging stuff together is what invention and integration are all about.

My buddy Matt and I are building some horn loudspeakers with a difference. These are based on the Cornu / Poiram design which mounts four concentric spiral logarithmic horns behind a single loudspeaker driver. This design means you get small, wall-hanging speakers with great sound. I first heard about this design from FullRangeDriver.com who have lots of committed speaker enthusiasts. We are using Fostex FE108 drivers, supplied from Madisound who were cheaper to buy direct from the US than in Australia.

This is what the Cornu speakers, designed by Daniel Ciesinger, look like (click the photo to visit his site):

In Feb 2004, there was a competition in Quebec to build the nicest sounding speakers around the Fostex 103 driver. There were some very fancy entries, but Poiram's simple back-loaded horns were a winner. His design essentially copies the Cornus above. This is what the Poiram speakers look like inside:

Our speakers will be similar to the above, ie 650mm square and 150mm deep, so they can be wall mounted. Our internal spirals will be 2mm polycarb (Poiram seems to use aluminium!) which fits into tracks cut into the wood. You can't just put any old horns together -- the length, mouth and throat size need to be calculated to match the loudspeaker. We used the excellent HORNRESP from David McBean to do this.

Initially we tried to create the speakers by hand, using a home-made metal arm to cut spirals into timber with a router. Matt devised a geometric way to plot spirals using a compass but with a router attached in place of a pencil! The compass was a smart idea but it proved very slow work and we broke some router bits in the process (cheap tools waste time). We didn't like the inaccuracy and realised we needed to cut 128 arcs for one pair of speakers - very tedious.

I wrote about our first attempts here. Matt and I both agreed this was too hard -- and being computer people, there had to be another way...

Enter Excel!

I spent many hours creating a spreadsheet and after four major revisions we had 7000 points of data describing the progression of a 2.4 metre spiral in millimetres.

The great thing about Excel was being able to verify the appearance of the spiral by simply charting it (see below). It was easy to check the length of the spiral and its ability to fit inside a 650mm square. Another reason we abaondoned the compass method above was because it was only capable of producing a spiral with a single expansion coefficient, whereas using a spreadsheet allows us to produce spirals that increase in radius with any logarithmic coefficient we like. Excel's goal-seek and solver add-in tools were critical in managing several parameters at once - the growing spiral length, the moving angle, the number of turns of the spiral, the box size. Try doing this on your own and it does your head in!

We then exported the Excel data into RibbonSoft's qCAD, a cheap and capable 2d CAD tool ($40 AUD). Matt exported our plot data as CSV and turned it into LINETO(x,y) instructions using a FOR statement in a cmd shell! These instructions were then consumed by qCAD and we exported the result into DXF format (AutoCAD R12) and sent it to a local laser cutting shop (ComputerCut).

They charged us about $100 to laser cut our spiral into 0.9mm stainless steel:

Now THAT'S what I call laser printing! I reckon you could get seriously addicted to doing this!

We made two of these templates, one for a 650mm box and another for an 814mm box (for deeper bass).

The next step of the project is to make a 20mm collar to run around the spiral track, which should allow us to guide the router around the timber and cut a very accurate spiral track for our polycarb strips to sit in. We will place the steel template on the timber and cut one spiral, then turn 90 degrees and cut another, until we have four concentric spiral tracks. This should make life much easier, and we can make several pairs of speakers. We have purchased a high quality router bit this time.

We will probably continue this project in 2006, I will blog more if it's of interest? Welcome any comments. Sorry there's no code - but I thought it was an interesting use of Excel.

This posting is provided "AS IS" with no warranties, and confers no rights. Use of any included script samples are subject to the terms specified at http://www.microsoft.com/info/cpyright.htm

 

Posted by andrewdelin | 4 Comments

Outlook SQL DASL syntax - an update

Here's an update to my previous blog entry on Doing more with Outlook filter and SQL DASL syntax.

I had some great feedback from my previous posting, there is obviously a need for more information about how to "do stuff" with Outlook filters.

Special thanks to Patrick for a very useful message, which showed me how to use dynamic dates in Outlook filter queries. Previously I thought this was impossible! Patrick's trick (:o) is to use the today(S) function with a parameter in seconds (S). The parameter gives a positive or negative offset from today and can be used to check the Due Date of tasks (or any other date test you like).

Here is Patrick's example which he uses on the Tasks folder:

(
 ("
http://schemas.microsoft.com/mapi/id/{00062003-0000-0000-C000-000000000046}/811c000b" = 0)

 AND

 (NOT("http://schemas.microsoft.com/mapi/id/{00062003-0000-0000-C000-000000000046}/81050040" IS NULL))

 AND

 ("http://schemas.microsoft.com/mapi/id/{00062003-0000-0000-C000-000000000046}/81050040" <= today(864000))
)

When applied to a task folder, this shows 'not completed' tasks that have a Due Date set in the next 10 days from today.

This same technique should be useful for filtering on received date (etc) on email folders and others.

Here's another tip. Finding articles about Outlook Filter programming is tricky, but if you search for one of the following using MSN Search or Google, you will find several articles to check:

  http://search.msn.com/results.aspx?q=81050040

  http://search.msn.com/results.aspx?q=811c000b

These numbers come from the XML schema for the Outlook SQL syntax. Sometimes using a very specific identifier in this way can deliver accurate hits.

My previous blog entry is here (Doing more with Outlook filter and SQL DASL syntax).

If you try any of these ideas, please be sure to test the results thoroughly.

-AD

Technorati profile

This posting is provided "AS IS" with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at http://www.microsoft.com/info/cpyright.htm

 

Posted by andrewdelin | 2 Comments
Filed under:

Doing more with Outlook filter and SQL DASL syntax

When I returned from an overseas trip earlier this year I needed to hack through a pile of emails that had accumulated. So I explored the Outlook filter search syntax (DASL) to see what could be achieved.

(I am using Outlook 2003. I know some of this works with previous versions of Outlook.)

Firstly, I recommend you add the [Filter...] button to a toolbar in Outlook. To do this, right-mouse-click on an empty area of the toolbar area at the top of Outlook, and select Customize from the menu. Pick the Commands tab and then select View in the Categories list. On the right, scroll down the Commands list until you see 'Filter' and then drag this entry up, up and away to a toolbar spot where you'd like it. You should now have a Filter button in your toolbar at the top of Outlook. You can close the Customize dialog.

The Filter dialog is a somewhat hidden but powerful tool for finding all kinds of Outlook items. It is organised as four tabs: Messages, More Choices, Advanced and SQL. I recommend you play with this dialog if it's not familiar to you. When you apply a Filter on a folder, you will see a small legend above your email (on the right) saying 'Filter Applied' - a hint that not all items are being shown! You use the Clear All button in the Filter dialog to remove the filter so you can see everything again.

I prefer to use the Advanced and SQL tabs of the Filter dialog because you can establish very specific queries that meet your needs. You will need to check 'Edit these criteria directly' to enter SQL queries. Switch to the SQL tab and try the following.

 

Examples

To find email from a specific person (for example, your manager), try this:

  "urn:schemas:httpmail:fromname" LIKE '%Gerard O''Driscoll%'

Note the use of double ' which escapes the apostrophe in the name.

 

To find all those Declined, Accepted and Tentative meeting responses, try this:

  NOT "http://schemas.microsoft.com/mapi/proptag/0x001a001e" = 'IPM.Note'

This finds stuff that isn't email. I found this useful on both Sent Items as well as Inbox.

 

To find items that weren't sent directly to me, try this:

  NOT
      ("urn:schemas:httpmail:displayto" LIKE '%Andrew Delin%'
    OR "urn:schemas:httpmail:displaycc" LIKE '%Andrew Delin%')

This shows items where I am not on the To: line nor the Cc: line.

 

To show items that you haven't read:

  "urn:schemas:httpmail:read" = 0

You either haven't read these items, or you have marked them Unread again.

 

This appears to find mail that came from outside Microsoft:

  NOT "urn:schemas:httpmail:fromemail" LIKE '%microsoft%'

You will need to change the company name in this filter for your own details, and test thoroughly. It may not behave the same way.

 

This seems to find internal mail (from within Microsoft) which wasn't addressed to me:

  "urn:schemas:httpmail:fromemail" LIKE '%microsoft%'
  AND NOT
    ("urn:schemas:httpmail:displayto" LIKE '%Andrew Delin%'
    OR "urn:schemas:httpmail:displaycc" LIKE '%Andrew Delin%')

Note I am checking both To and Cc addresses. To try this, you'll need to substitute your company name in the first clause. And test that it works.

 

It would be nice to find emails that have attachments. BUT:

  "urn:schemas:httpmail:hasattachment" = 1

-this DOESN'T work the way you expect, because it seems in-line pictures embedded in certain email formats are considered attachments :o(

 

Looking for items with normal or low priority:

  "urn:schemas:httpmail:importance" <= 1

 

Items with no flag set:

  NOT "urn:schemas:httpmail:messageflag" > 0

Take care with flags, because it appears more than one attribute composes the email flag functionality. You can for example test for specific color flags being set; this tests for Purple flagged items:

  "http://schemas.microsoft.com/mapi/proptag/0x10950003" = 1

And this looks for NO color flag being set:

  NOT "http://schemas.microsoft.com/mapi/proptag/0x10950003" > 0

Beware, because I found that  "NOT ... > 0"  is not the same as  "= 0". With the latter, you won't get the list of unflagged items you might expect.

 

Email sent to one of the groups (distribution lists, DLs) which I belong to:

  "urn:schemas:httpmail:displayto" LIKE '%Australia Consulting%'
  OR
  "urn:schemas:httpmail:displaycc" LIKE '%Australia Consulting%'

This tests both the To: and Cc: address fields. Note this is the long name of the group, not the short alias name (8 characters). You could easily add more tests to make a filter that shows 'emails to Australian groups I belong to'.

 

To find email items you have replied to, you might attempt a field query like "Tracking Status equals Replied" which produces this syntax in the SQL tab:

  "http://schemas.microsoft.com/mapi/id/{0006200B-0000-0000-C000-000000000046}/88090003" = 7

BUT I found this DOESN'T work because email tracking is usually disabled between Outlook and Exchange, to reduce sync overhead (this was the feature where Outlook recorded that you had replied to individual items). Instead, a reasonable proxy for this is to look for Inbox items which contain your name in the body of the mail (when you reply, the mail client inserts something like  From: Andrew Delin  in the body):

  "urn:schemas:httpmail:textdescription" LIKE '%Andrew Delin%'

 

Putting it all together

Unread items received last month, not sent directly to me:

  NOT
    ("urn:schemas:httpmail:displayto" LIKE '%Andrew Delin%'
    OR "urn:schemas:httpmail:displaycc" LIKE '%Andrew Delin%')
  AND
  %lastmonth("urn:schemas:httpmail:datereceived")%
  AND
    "urn:schemas:httpmail:read" = 0

 

Non-urgent Inbox mail from inside Microsoft which is 3+ months old, not flagged, not addressed to me, and which is either 'unread' or which I didn't reply to (proxy):

  "urn:schemas:httpmail:fromemail" LIKE '%microsoft%'
  AND
  "urn:schemas:httpmail:importance" <= 1
  AND
  "urn:schemas:httpmail:datereceived" < '1/02/2005 12:00 AM'
  AND NOT "urn:schemas:httpmail:messageflag" > 0
  AND NOT
    ("urn:schemas:httpmail:displayto" LIKE '%Andrew Delin%'
    OR "urn:schemas:httpmail:displaycc" LIKE '%Andrew Delin%')
  AND (
    "urn:schemas:httpmail:read" = 0
    OR
    (NOT "urn:schemas:httpmail:textdescription" LIKE '%Andrew Delin%')

  )

If you want to try this, update the date constant (see datereceived) to something appropriate, as well as changing %microsoft% to your company and removing my name! Please test the result thoroughly.

 

Views

Once you have some queries you like, you can define these so they're available in your Views drop-down list. To create a new view, use the View menu / Arrange By / Current View / Define Views / New button. Choose 'Table' and then you'll see several buttons to setup the View, including Filter - which you'll recognise as the same dialog from above. Enter your carefully crafted syntax and the filter will activate whenever you select this view on your folder. I have defined views for my main group memberships and external email so I can quickly filter my Inbox.

 

Other notes

Be patient with the Outlook Filter dialog. Sometimes you need to use Clear All then OK to get the full list of items to appear in your Inbox, before trying another filter query.

I found it was important to test my filter expressions carefully. Sometimes 'NOT' doesn't produce the opposite list of what you're seeing, and some fields aren't populated the way you expect (for example, there are several flag attributes - see above; there are also a number of similar-sounding email address fields to check and you may not get the results you first guess at).

A syntax reference for using DASL through the Outlook filter isn't easily found. I tried looking in the Exchange SDKs and while I got a list of attributes, it wasn't very Outlook-friendly. For example:

  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wss/wss/_exch2k_urn_content-classes_message.asp

There's also a list of Outlook IPM message types here, if you want to search for specific mail item types (eg Meeting requests):

  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/olfm11/html/rerefaboutitemtypesmessageclasses_HV01044391.asp

I did find some bits in Thomas Rizzo's book on pages 197 and 701 ("Programming Microsoft Outlook and Microsoft Exchange 2003").

If you want to do date dynamic date calculations in Outlook filters, you will need to use the today(S) function with a positive or negative offset in seconds. I have written about this here (thanks Patrick!). Otherwise there is a fixed set of date functions like '%lastmonth' or you can enter literal dates such as <= '1/1/2005 12:00 AM'. Here is a list of these fixed date functions - for the syntax, just use the Advanced tab in the Outlook Filter dialog, and add the mail field called 'Received' (Outlook will display something like 'Received yesterday|today|tomorrow|in the last 7 days ...' etc. If you switch to the SQL tab, it will show you the syntax to use.

  %yesterday
  %today
  %tomorrow
  %last7days
  %next7days
  %lastweek
  %thisweek
  %nextweek
  %lastmonth
  %thismonth
  %nextmonth

 

I hope the above helps. If you try any of the above ideas, please be sure to test the results thoroughly.

 

This posting is provided "AS IS" with no warranties, and confers no rights. Use of included script samples are subject to the terms specified at http://www.microsoft.com/info/cpyright.htm

 


 

Posted by andrewdelin | 11 Comments
Filed under:

Bug with Tablet PC snipping tool and Office 2003 DRM (Digital Rights Management)

There appears to be a bug or short-coming with the very useful Snipping Tool that comes with the Tablet PC powertoys (Microsoft Powertoys for Windows XP Tablet PC Ediition.)

It seems that the Digital Rights Management functions (DRM) in Office 2003 are bypassed when using the Snipping Tool - which is a pity. This means you can open a super secret restricted document - which you can't usually forward or print - and grab a picture of it without restriction.

See picture here - take a close look:

You can see this is a protected document (see the restricted sign top-left), but the Snipping Tool allows me to take a screen grab nonetheless. Maybe a future version of the Snipping Tool will fix this? If so, I claim to have helped this!

Postscript: Some might contend that no document is really secure if it appears on a screen - after all, you can always take a digital photo of what you see (or even put your CRT on top of the photocopier and grab a copy!). And of course, you can always install a third-party screen grabbing tool which does not honour Office DRM. However, the Snipping Tool mentioned above is a "killer app" for the Tablet PC and it's a public download from Microsoft. So arguably we should make reasonable efforts to respect DRM in this useful tool which might be included in standard Tablet PC build images.

I love the potential of the Tablet PC - see my other post about its goodness.

Technorati Profile

Posted by andrewdelin | 1 Comments
Filed under:
 
Page view tracker