230 likes | 240 Views
Discover the complexities of productizing research outcomes and glean insights from successful case studies at Microsoft Research, presented by John L. Miller, Software Architect. Explore strategies, difficulties, and timelines for product development.
E N D
ProductiZing Research John L. Miller, Software Architect Microsoft Research Cambridge 11-July 2007
Agenda • What is Productization? • Why is it difficult? • Can I do it myself? • Advice from the field
What is ‘Productizing’ • Migrating research results • Affecting an existing product • Supplying algorithms and methods • Influencing product features • Writing shipping code • Seeding a new product
BM25F: An algorithm • Algorithm for web search ranking • Devised at MSRC • Results transferred to MS search teams • Product team wrote their own version based upon the research algorithm
Sideshow: a feature • ‘Gadget Bar’ for Windows • Prototyped & shared at Microsoft years ago • Now part of Vista:the Sidebar • Product team wrote their own code • strikingly similar appearance and features
TrueSkillTM : Shipping Code • Player Ranking and Matchmaking • Researched in MSRC • Primary code developed by researchers • Incorporated with some modifications • Basis of matchmaking for most Xbox-360 games
Pastry: external licensing • Pastry / Splitstream / Scribe / Squirrel • P2P communication framework, applications • Shopped inside of Microsoft, but never successfully transferred • Licensed to Skinkers for ‘spin-out’ • LiveStation in Beta, recently in the press
The visible minority • MSRC has dozens of successful tech transfers • Many more never started, or fizzled out • No appropriate target • Best fit already too busy • Change in direction / management • Lack of resources
Why is Productization difficult? • Orders of magnitude more work than research • ‘It cannot fail’ vs. ‘it can succeed’ • Requires influencing people you don’t have any control over • ‘Internal work’ is a priority • Existing teams already have lots to do • Understanding new technology takes work
Productizing PNRP: timeline Jan ‘01 Jan ‘02 Jan ‘03 • 2000-10: PNRP proposed as algorithm by Huitema • 2001-03: Prototype completed • 2 person-months effort • Fully functional IPv4 prototype • Broader than final product, but not as deep • 2002-04: Initial design document first draft completed • 2-3 person-years effort • 40 page protocol spec, 150 page design spec • 2002-08: Code-complete • 1 person-year effort for dev, ~1/2 person year for test • 2003-04: Test-complete, ship bugs fixed • 1.5 person-years effort for dev, ~2 person -years effort for test • 2003-06: Released to Web (RTW) 1-Algorithm 2-Prototyped 3-Designed 4-Implemented 5-Tested 6-Released
‘Product Quality’ • Strict coding guidelines • Modularity, extensibility, scalability • Diagnostics • Robustness • Prototype • Design for majority case • Failure = exit with apologies • Access violation = fix, re-run • Product code • Design for ALL cases • Failure = work around the problem • Access violation = angry customers => bulletproofing
Example: Prototype void DrawBox(HDC dc, int x, int y) { bool bGot = false; HPEN p, op; if (dc == NULL) { dc = GetDC(NULL); bGot = true; } p = CreatePen(PS_SOLID, 10, RGB(0, 255,0)); op = SelectObject(dc, p); Rectangle(dc, x, y, 200, 200); SelectObject(dc, op); DeleteObject(p); if (bGot) ReleaseDC(dc); }
Example: Product Quality // Pen of 10 pixels for drawing box const int MY_PEN_WIDTH = 10; // Green pen for our box color const COLORREF GREEN_PEN_RGB = RGB(0, 255,0); // All boxes we draw are 200 x 200 const int MY_BOX_WIDTH = 200; const int MY_BOX_HEIGHT = 200; HRESULT DrawBox( IN HDC hContext, IN int iXOffset, IN int iYOffset ) { BOOL fFreeDC = FALSE, fRet = FALSE; int iRet = 0; HRESULT hrRet = S_OK; HPEN hpNew = NULL, hpOld = NULL; // // Get the default screen DC if we don't already have one. // if (NULL == hContext) { hContext = GetDC(NULL); if (NULL == hContext) { hrRet = HRESULT_FROM_WIN32(GetLastError()); TraceMessage(MYAPP_ERROR, L"%s(%d) - Unable to get screen DC: 0x%08x", __TFUNCTION__, __LINE__, hrRet); goto Cleanup; } fFreeDC = TRUE; } // // Create a green pen, and select it to draw our rectangle // hpNew = CreatePen(PS_SOLID, MY_PEN_WIDTH, GREEN_BRUSH_RGB); if (NULL == hpNew) { hrRet = E_FAIL; TraceMessage(MYAPP_ERROR, L"%s(%d) - Unable to create pen: 0x%08x", __TFUNCTION__, __LINE__, hrRet); goto Cleanup; } hpOld = SelectObject(hContext, hpNew); if (NULL == hpOld) { hrRet = E_FAIL; TraceMessage(MYAPP_ERROR, L"%s(%d) - Unable to select our new pen: 0x%08x", __TFUNCTION__, __LINE__, hrRet); goto Cleanup; } // Draw the actual rectangle // fRet = Rectangle(hContext, iXOffset, iYOffset, MY_BOX_WIDTH, MY_BOX_HEIGHT); if (FALSE == fRet) { hrRet = HRESULT_FROM_WIN32(GetLastError()); TraceMessage(MYAPP_ERROR, L"%s(%d) - Unable to Draw the rectangle: 0x%08x", __TFUNCTION__, __LINE__, hrRet); goto Cleanup; } Cleanup: // Clean up the new brush, and select the old brush if there was one // if (NULL != hpNew) { if (NULL != hpOld) { HPEN hpTemp = SelectObject(hpOld); if (NULL != hpTemp) { hrRet = HRESULT_FROM_WIN32(GetLastError()); TraceMessage(MYAPP_ERROR, L"%s(%d) - Unable to reset Pen to original: 0x%08x", __TFUNCTION__, __LINE__, hrRet); } else { hpOld = NULL; } } DeleteObject(hpNew); hpNew = NULL; } // If we allocated a DC, free it. // if (fFreeDC) { iRet = ReleaseDC(hContext); if (0 == iRet) { hrRet = E_FAIL; TraceMessage(MYAPP_ERROR, L"%s(%d) - Unable to release a default DC! Will be fatal soon: 0x%08x", __TFUNCTION__, __LINE__, hrRet); } else { hContext = NULL; } } return(hrRet); }
Other Productization work • Funding, business model, management • Testing, release management, product support • Marketing, technical evangelism
Can I productize it myself? • If you’re a renaissance person, sure! • A better question: should you? • Engineering not as easy as it looks • LOTS of work • Opportunity cost is high • Forza: 2 people x 2.5 years • .NET Generics: 1 person x 3 years
How does Microsoft Cope? • Researchers focus on research • RSDE’s sometimes help with productization • MSR Program Managers • Introductions, relationship help • Product / Research Events • TechFest research showcase • Mindswaps • Other avenues for transfer • External licensing • Spinout
How to Succeed • Identify your transfer goal • Choose your technology carefully • Pick the right target team • Communicate • Persistent and flexible • Keep perspective
Identify your transfer goal • Is the priority transferring your technology, or influencing a product? • What direction will you accept? • ‘just in time’ research for team? • Transfer your original research • What is success? • Team evaluates technology? • Team adjusts course based on your work? • Your research in the hands of users
Choose your technology • Not all research is appropriate for productization • How risky is it? • How practical is it? • How much work is it to adopt? • What is the cost-benefit analysis?
Picking the right partner • Does your work align with their goals? • Do they have a good track record? • Do they have a future? • Is there mutual respect? • Are they at the right stage in the product cycle? • What is their commitment level?
Communicate • Build / maintain trust and respect • Identify potential issues before they become problems • Identify key contributors, owners, and establish rapport • Technical evangelism is an ongoing requirement • Be flexible, adaptable, and patient
Keep perspective • It’s one project of many you will work on • It’s one project of many THEY will work on • What are the chances it’s the most important work you’ll ever do? • People outlive projects
Summary • Productization is tough but worthwhile • Set your own goals, understand other people’s goals • Communicate, be persistent, and patient