tag:blogger.com,1999:blog-30178008057695613662024-03-05T22:40:05.756-08:00Learning Program ManagementLessons learned from Program Managing at SQL ServerPedro DeRosehttp://www.blogger.com/profile/14833075200638108981noreply@blogger.comBlogger11125tag:blogger.com,1999:blog-3017800805769561366.post-13257053094917101942010-03-22T09:58:00.000-07:002011-01-24T10:12:54.284-08:00Tracking Multiple Estimates with ProjectMS Project is a powerful tool. However, it has certain expectations about tasks, and deviating from them can be difficult. For instance, Project presumes tasks have a single work amount and duration.<br />
<p>I prefer multiple estimates. I typically ask developers for a realistic and a pessimistic estimate (i.e., "should be done by, could take as long as"). Then, I also track a weighted estimate somewhere between these, based on my confidence in the given estimates. Finally, I want a projected duration based on how long the work has taken so far (e.g., if a task is half done in a week, the projection should be two weeks).<br />
<p>Since Project expects only one work/duration value, tracking progress and making predictions against multiple estimates is hard. You can create extra columns for them, but these don't integrate well with many features, such as Gantt charts. And, as far as I can tell, the projected duration isn't a built-in option.<br />
<p>To work around these issues, I created a Project 2010 template that lets me track work items with multiple estimates. The key advantages are:<br />
<ul><li>Easy pessimistic/optimistic/etc estimates, Gantt charts, and end dates.<br />
<li>Projected estimate based on how long tasks have taken so far.<br />
<li>Simple steps to track progress, whether reported as percent done or time left.<br />
</ul><p>Here are links to the <a href="http://cid-33489364afa052ae.skydrive.live.com/self.aspx/.Public/Project/Project%20Template.mpt">template</a> and to <a href="http://cid-33489364afa052ae.skydrive.live.com/self.aspx/.Public/Project/Project%20Template%20Instructions.docx">instructions</a>. I think it's fairly easy to use, but I'm very interested in any feedback. If you give it a try, let me know! <p><hr><p><b>Edit:</b> A commenter requested a Project 2007 version of the template, so I've put one <a href="http://cid-33489364afa052ae.office.live.com/self.aspx/.Public/Project/Project%20Template%202007.mpt">here</a>. However, not having actually used it myself in Project 2007, I can't guarantee how well it'll work.
<p>Pedro DeRosehttp://www.blogger.com/profile/14833075200638108981noreply@blogger.com9tag:blogger.com,1999:blog-3017800805769561366.post-64363881274620722582010-01-26T15:06:00.000-08:002010-01-26T15:30:14.397-08:00Economics of ExtractionAs I stated in my last post, managing unstructured data is increasingly crucial. A common estimate bandied about is that <a href="http://www.b-eye-network.com/view/2098">upwards of 80% of enterprise data is unstructured</a>, including office documents, email, etc. The need to manage the information represented by these bits isn't just theoretical. It's painfully real. Real enough that people pay lots of money for third party solutions to help them do this.<br />
<p>To give an idea of exactly how much money, here are prices for some of the top players in this roughly $2.5 billion market:<br />
<ul><li>Autonomy IDOL Server: <a href="http://doe.microlinkllc.com/Documents/GSA%20Product%20List.pdf">$220K</a> bundled<br />
</li>
<li>SAS Enterprise Miner: <a href="http://intelligent-enterprise.informationweek.com/011004/415products1_1.jhtml">$100-$400K</a> in 2001<br />
</li>
<li>Open Text Enterprise 2.0: <a href="http://www.slideshare.net/alfresco/webinar-slides-total-cost-of-ownership-for-ecm-ian-howells-alfresco-presentation">$600K</a> for 1,000 users<br />
</li>
</ul>(Thanks to Naveen Garg, a fellow PM, for these data).<br />
<p>Consider these numbers in the context of my last post. Not only is there a good conceptual argument for extraction in databases, there's also a clear customer need. If there wasn't pain, vendors couldn't charge hundreds of thousands of dollars for a solution. And that's what customers are willing to pay for a solution that's not fully integrated into the database: a separate system to buy and maintain and support.<br />
<p>Imagine what they'd think of true unstructured data management as a first-class database feature.<br />
<p>Pedro DeRosehttp://www.blogger.com/profile/14833075200638108981noreply@blogger.com0tag:blogger.com,1999:blog-3017800805769561366.post-52415760320883415032010-01-06T14:36:00.000-08:002010-01-19T16:11:49.759-08:00Databases Need ExtractionDatabases are traditionally awful at managing unstructured data, such as office documents, media files, or large blocks of text. Yet users still want to store documents in them. The reason is that documents often have associated structured data already in the database. For instance, an MP3 has an embedded artist, album, and title, which are typically mirrored in a database so they can be queried. Likewise, a resume may be a Word document, but the applicant's name and contact information were probably typed into a form and stored in a table.<br />
<p>Managing documents and their associated structured data separately is painful. Just consider the common approach of keeping the file in the file system and storing its path in the database. What if the artist embedded in the MP3 changes? Or the file is moved, or deleted? Issues like consistency control, synchronizing backups, queries over both structured and unstructured data, and even supporting multiple systems can become a nightmare. So people start putting documents in the database.<br />
<p>This is a call to arms: as database people, <i>if there's a compelling reason for users to store data in a database, the database should help manage it.</i> So what's involved in managing unstructured data?<br />
<div class="cut">At a high level, there are two types of management tasks over unstructured data:<br />
<ol><li>Managing the bits: let users efficiently insert, update, and delete documents, as well as seek within them, stream them, etc. This includes other typical data services, such as backup and restore.</li>
<li>Managing the information represented by the bits: an MP3 has an artist, beats-per-minute, and lyrics, while a resume mentions schools, companies, and skills. To fully manage such documents, users need to query this information.<br />
</ol><p>Recently, databases have gotten better at managing unstructured bits. For example, SQL Server has <a href="http://msdn.microsoft.com/en-us/library/cc949109.aspx">FILESTREAM</a>, which improves streaming performance, and <a href="http://blogs.msdn.com/sqlrbs/">Remote Blob Storage</a>, which stores unstructured data in a dedicated file server. <p>However, managing the information represented by the bits requires extraction. Specifically, it requires cracking open the document, extracting or inferring interesting content, then exposing it as queryable structured data. This means <i>extraction is not a side task; it is an integral part of managing unstructured data.</i> <p><a href="http://msdn.microsoft.com/en-us/library/ms142571.aspx">Full-text search</a> in databases is a step in this direction, but there's a lot more work to do. When we put MP3s in a table, we should be able to query them by artist, title, or even lyrics. When we store a resume, we should be able to find related job descriptions, or join the schools it mentions to our Employee table to find old classmates that work here. <p>It's estimated that about 80% of the data out there is unstructured, and thus probably not in databases. If we're going to take a serious shot at managing it, then databases need extraction. </div>Pedro DeRosehttp://www.blogger.com/profile/14833075200638108981noreply@blogger.com0tag:blogger.com,1999:blog-3017800805769561366.post-14822168727560390582009-11-09T19:31:00.000-08:002010-01-06T14:35:58.051-08:00SQL PASS 09 - Semi-Structured Data in SQL ServerA couple coworkers and I just had the great opportunity to present a post-conference session at <a href="http://summit2009.sqlpass.org/">SQL PASS 2009</a>. The session topic was "Managing Unstructured and Semi-Structured Data with SQL Server"; I own the semi-structured features in SQL Server, so I presented that part of the session.<br />
<p>For simplicity, think of "semi-structured data" as structured data that's not relational. To manage semi-structured data, SQL Server 2005 introduced <a href="http://msdn.microsoft.com/en-us/library/ms345117%28SQL.90%29.aspx">XML</a>, which is powerful and general (as someone once said, tongue in cheek, "XML is like violence: if it doesn't solve your problem, you're not using enough of it"). However, XML isn't ideal for certain situations, and doesn't integrate perfectly with relational databases.<br />
<p>Enter SQL Server 2008, which introduces some really useful features for managing semi-structured data more relationally. Briefly, if you find yourself managing the following kinds of data, take a look at these features:<br />
<p><ul><li><i>Trees or hierarchies (e.g., product categories, org charts, conversation threads)</i>: check out <a href="http://msdn.microsoft.com/en-us/library/bb677173.aspx"><span class="code">hierarchyid</span></a>, a new type representing nodes in a tree.<br />
<li><i>Properties that apply to only some items (e.g., product descriptions, custom document properties, tagging)</i>: check out the <a href="http://msdn.microsoft.com/en-us/library/cc280604.aspx"><span class="code">SPARSE</span> column</a> option, which gives you NULLs that take no space, constant-time addition of new columns, and up to 30,000 columns in a table.<br />
<li><i>Tables where only some rows need indexing (e.g., columns with many NULLs, "hot" rows, heterogeneous row groups)</i>: check out <a href="http://msdn.microsoft.com/en-us/library/cc280372.aspx">filtered indexes</a>, where you specify which rows are indexed. This makes the index much smaller, yields faster look-ups, and avoid unnecessary index maintenance. Filtered indexes are cool enough that I'll make a post about just them sometime soon.<br />
</ul><p><div class="cut">For those interested, here's a <a href="http://cid-33489364afa052ae.skydrive.live.com/self.aspx/.Public/Semi-structured/Managing%20Semi-Structured%20Data.pptx">slide deck</a> and <a href="http://cid-33489364afa052ae.skydrive.live.com/self.aspx/.Public/Semi-structured/semistructured.sql">demo T-SQL code</a> on these features, focusing on how you can use them to solve real-world problems. If you have any feedback or suggestions — about the deck, the demo code, or the features themselves — please post a comment. For example, here are some of the feedback and takeaways I got from attendees at SQL PASS: <p><ul><li>One attendee wondered how <span class="code">hierarchyid</span> compares to <a href="http://dev.mysql.com/tech-resources/articles/hierarchical-data.html">left-right value tables</a> (a.k.a. nested set model, or modified preorder traversal) for representing trees. Briefly, <span class="code">hierarchyid</span> has the same sub-tree properties, so is equally good at descendant queries. Furthermore, it has three advantages: more compact (one column averaging 10 bytes per value can represent ~100M nodes); constant-time node insertion anywhere in the tree; and easier, more efficient level queries (e.g., (grand)children of a node, all nodes with level 3).<br />
<li>People seem to like column sets, especially how they automatically shred XML inserts and updates into the proper sparse columns.<br />
<li>People also seem to really like filtered indexes. One "wow" example was choosing which rows were worth indexing based on your workload. To illustrate, suppose table <span class="code">SoldAt</span> tracks which products are sold at which stores. If only some stores have enough traffic to warrant indexing, you can create an index for just those stores with <span class="code">CREATE INDEX SoldAt_Key_Stores ON SoldAt(...) WHERE StoreId IN (1, 4, ...)</span>.<br />
<li>Some people mentioned that they often need to manually <a href="http://blogs.msdn.com/conor_cunningham_msft/archive/2009/04/17/do-filtered-statistics-update-as-frequently-as-normal-statistics.aspx">update filtered statistics</a> (such as are generated automatically for filtered indexes) to ensure good plans. This is something we can look into.<br />
</ul><p>I'd love to hear more, so please comment away! </div>Pedro DeRosehttp://www.blogger.com/profile/14833075200638108981noreply@blogger.com1tag:blogger.com,1999:blog-3017800805769561366.post-91949332186972783722009-08-25T13:33:00.000-07:002010-01-26T15:29:59.485-08:00Five-Minute Ph.D.As my Ph.D. defense nears, I'm thinking a lot about the most important lessons I learned. Here are my top five: <ol><li><i>Don't look for reasons to fail; find ways to succeed</i>. If something should or must be done, find a way to do it.<br />
<li><i>First figure out the right thing to do</i>. Only then think about implementation, and see how close you can come. Even if you can't reach the ideal, at least you'll be pushing in the right direction.<br />
<li><i>Understand the problem deeply</i>. Any good problem solver can hack a good solution quickly. What's more valuable is identifying the true underlying problem, and how it relates to other problems. This tells you if something is a true solution, and helps identify opportunities.<br />
<li><i>Think in a structured, disciplined way</i>. First, separate out orthogonal issues. Then, solve them incrementally and iteratively. Don't try to attack the whole mess at once.<br />
<li><i>Finally, when communicating with others, tell a story</i>. Start with something familiar, then make sure your ideas flow.<br />
</ol><p>Those are the big ones. The gems of a Ph.D. education, in five easy minutes. Interestingly, none of these are particularly technical. But deeply technical things are limited in application. I think that's the real secret: the <i>work</i> you do for a Ph.D. is technical, but a good Ph.D. is about becoming a better thinker and communicator.
<p>Pedro DeRosehttp://www.blogger.com/profile/14833075200638108981noreply@blogger.com1tag:blogger.com,1999:blog-3017800805769561366.post-85332242169896863082009-07-29T13:55:00.000-07:002010-01-26T15:42:25.039-08:00Tutorial: Using Omea Reader to Listen to CustomersOne of my daily tasks is listening to customers. This involves checking blogs, forums, and newsgroups (they're still around!). I also check several Intranet sites, such as SharePoint sites for my projects. Doing this every day was taking a substantial amount of time. The problem wasn't digesting the information, or acting on it; it was getting to it. So I went looking for a one-stop solution. My requirements were: <ul><li> Sensible interface for reading feeds, such as RSS and Atom.<br />
<li> Handles newsgroups (the customers use them, thus so must I).<br />
<li> Desktop application, so that it can access the company Intranet. </ul><p>I found <a href="http://www.jetbrains.com/omea/reader/">Omea Reader</a>, a free desktop application that reads newsgroups and feeds. Below, I give step-by-step instructions on how I set up and use it. <div class="cut"><h2>Setting up Omea Reader</h2>First, download Omea Reader from <a href="http://www.jetbrains.com/omea/download/reader.html">here</a>, then install it. This is a typical installation process, and the defaults work fine (though I chose not to install the Firefox plugin). <p>After installing, run Omea Reader. It asks about a Database Path and Log Files Path. The defaults here are also fine, so hit "OK". Next, it provides some import options. Just hit "Next >" until it requests User Information. Then, Enter your first and last name. Then, click "Add..." to add an email address. Finally, click "Finish". <p>At this point, Omea starts. We'll want to set some options, so go to Tools -> Options. <a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQbgMibODkuOhUDLWh_p3M-N9QCsTS-XYL1X5Q-wXsXzKGfLq4FN1TAq25NyBLApEM-6GvT2glE2Rz5kS2Sn5GVL1a5puVS1EkFwFVzv5cC1O9fHtg-IP1mr7IB-0xhrqboX4uESqZoY-x/s1600-h/omea_options.png"><img style="display:block; margin:10px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 179px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQbgMibODkuOhUDLWh_p3M-N9QCsTS-XYL1X5Q-wXsXzKGfLq4FN1TAq25NyBLApEM-6GvT2glE2Rz5kS2Sn5GVL1a5puVS1EkFwFVzv5cC1O9fHtg-IP1mr7IB-0xhrqboX4uESqZoY-x/s320/omea_options.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5364002870180366434" /></a> I changed these options: <ul><li>General <ul><li>"Mark item read after displaying for <b>0</b> seconds"<br />
<li>"Open links to Web pages <b>In a new browser window</b>" </ul><li>Mail Format <ul><li><b>Check</b> "Include signature in outgoing messages", and paste in an appropriate signature (e.g., your company may require some legalese here). </ul><li>Plugins <ul><li><b>Uncheck</b> everything except News and RSS; we won't be using Omea Reader's other functionality. </ul></ul><p>Clicked "OK", and Omea Reader restarts. Then, click on the "All Resources" tab and set options in the "View" menu. I set the following options: <ul><li><b>Uncheck</b> "Shortcut Bar"<br />
<li><b>Uncheck</b> "Workspace Bar"<br />
<li><b>Check</b> "AutoPreview -> All Items" </ul><p>Omea Reader now looks something like this: <a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGTzq1A5Vnru0r7GRxnZm71DmYeNFDMfX_eLdvt07u_Ly3QDje8SUnysAdIYi_u4ziJIJBxm83M_v-KgKQYk9bQx6XvqgvSDRgrTzvGjpiAomnAiPROCZN9yu1eOlFhbhBvFqG7j6XGwRh/s1600-h/omea_view.png"><img style="display:block; margin:10px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 278px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGTzq1A5Vnru0r7GRxnZm71DmYeNFDMfX_eLdvt07u_Ly3QDje8SUnysAdIYi_u4ziJIJBxm83M_v-KgKQYk9bQx6XvqgvSDRgrTzvGjpiAomnAiPROCZN9yu1eOlFhbhBvFqG7j6XGwRh/s320/omea_view.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5364002976404931378" /></a> <p>Finally, after setting options, delete the feeds that came with Omea Reader. First, click on the "Feeds" tab. Then, in the bottom-left section, you'll see three feeds. Select all of these, then delete them with the Delete key. <h2>Adding Newsgroups</h2>To add newsgroups to Omea Reader, click the "Tools -> Manage Newsgroups" menu item. This brings up the "Manage Newsgroups" dialog. Clicking on the "Add..." button on the bottom left lets you add news servers. <a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiacAbqNFcBTOXYBwOdWMrzRayofjrDLOzeMp6Wy8OsXivIlN3GBRz6mOwmXj5Ft0EGcQpoH8AgBIT26xS6pL_oc3cHUtc40XvRe7aLRaEEMzgFJpj0vsbt_SZM9hfck_Bhq2s8-W8TGXpm/s1600-h/omea_news_server.png"><img style="display:block; margin:10px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 262px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiacAbqNFcBTOXYBwOdWMrzRayofjrDLOzeMp6Wy8OsXivIlN3GBRz6mOwmXj5Ft0EGcQpoH8AgBIT26xS6pL_oc3cHUtc40XvRe7aLRaEEMzgFJpj0vsbt_SZM9hfck_Bhq2s8-W8TGXpm/s320/omea_news_server.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5364004182672272834" /></a> <p>Set the server name. The other fields fill in automatically, but you can change them. If your server requires a login (such as Microsoft's privatenews.microsoft.com), click on the "Security" tab. Next, check "Authentication required", then set the user name and password. Finally, click "OK" to add the server. <p>Now you can subscribe to newsgroups. First, select a news server on the left. Then, check the newsgroups of interest on the right. By typing into the "Display newsgroups which contain:" field, you can filter the available newsgroups. <a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoSEhwizGdVtEsUGfIwtnRWs5LDySzb_DpeifyahDg5KtIJOeAs6dL4ZBShbXeJT_nfyDj_umbb_DAYwIoVyS8YK3FNpjCHRr42GcyQEECuVcYriIX4Ir0GWAWcivaBhoP6r1E3GnUfdhp/s1600-h/omea_newsgroups.png"><img style="display:block; margin:10px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 244px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoSEhwizGdVtEsUGfIwtnRWs5LDySzb_DpeifyahDg5KtIJOeAs6dL4ZBShbXeJT_nfyDj_umbb_DAYwIoVyS8YK3FNpjCHRr42GcyQEECuVcYriIX4Ir0GWAWcivaBhoP6r1E3GnUfdhp/s320/omea_newsgroups.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5364006764390236082" /></a> Finally, click "OK", and Omea Reader will download posts. <h3>Filtering Posts</h3>If you are interested in only some posts, Omea Reader can filter incoming posts. For example, you can create a rule that deletes all posts from a newsgroup except those containing particular words. First click on the menu item "Tools -> Manage Rules -> Action Rules". Then, in the dialog, click the "New..." button on the right. This brings up the "New Action Rule" dialog. <a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIz-FUXbk6utDe6qdM-hVGR8dpcVvkHuVAE2Ji0KGwlNd2CsAvEwpNIeN_ACI1VxHId9JjuWuqOG-RfAD9cP5GltNsFUpcf6Kwaoks5SzIg6GfFFhx4kFZkk2gyEafdjBxT6CHrOCHr3gx/s1600-h/omea_action_rule.png"><img style="display:block; margin:10px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 238px; height: 320px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIz-FUXbk6utDe6qdM-hVGR8dpcVvkHuVAE2Ji0KGwlNd2CsAvEwpNIeN_ACI1VxHId9JjuWuqOG-RfAD9cP5GltNsFUpcf6Kwaoks5SzIg6GfFFhx4kFZkk2gyEafdjBxT6CHrOCHr3gx/s320/omea_action_rule.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5364008428408919794" /></a> Give the rule a name, such as "Relevant". Then, under the "Conditions" field, click on "Add Condition...". Next, select "News Conditions -> Appeared in the specified newsgroup(s)", then click the "OK" button. This adds an entry in the "Conditions" field. Click on the blue "specified" link to select the newsgroups to filter. <p>Then, click on "Add Exception..." under the "Exceptions" field. Next, select "Text Query Conditions -> Matching query in the body", then click the "OK" button. This adds an entry in the "Exceptions" field. Click on the blue "query" link to enter keywords separated by "OR". Keywords can be single words, or phrases in double-quotes. For example, I use this query to keep only posts related to full-text searching: full-text OR fulltext OR "full text". To also search the post subject, repeat these steps, but select the exception "Matching query in the subject/header". <p>Finally, click on "Add Action..." under the "Actions" field. Check "Delete resource permanently", then click the "OK" button. This takes you back to the "Rules Manager" dialog. Click the "OK" button here to save your rule. <p>To apply your rule immediately, select the "Actions -> Apply Rules" menu item. Here, select "All resources", and check your rule. Finally, click the "OK" button. <a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJRoywCzs3cBES46AKSuCsdMPHDlsejE6AtsftNWNrcU3nVZGHDcQ47fDiWZZHD0TW936WBSQrQlCLvIYKX65qxvvbJU0_6Idup8hQ7avyUi-OePAQxbZn83mhTdg28DvYtPpQmxNO6_0u/s1600-h/omea_apply.png"><img style="display:block; margin:10px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 297px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJRoywCzs3cBES46AKSuCsdMPHDlsejE6AtsftNWNrcU3nVZGHDcQ47fDiWZZHD0TW936WBSQrQlCLvIYKX65qxvvbJU0_6Idup8hQ7avyUi-OePAQxbZn83mhTdg28DvYtPpQmxNO6_0u/s320/omea_apply.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5364011714681953362" /></a> <h2>Adding Feeds</h2>Feeds let you keep up with forums, blogs, search engine results, SharePoint lists, etc. I use three types of feeds: <ol><li> <i>Direct feeds:</i> Many blogs, forums, and SharePoint sites provide feeds. For example, MSDN lets you subscribe to a forum, or even to searches on forums. Look for the RSS icon <img src="http://www.google.com/alerts/feed.gif">, or a link similar to "Subscribe to Feed".<br />
<li> <i>Search Engines:</i> Some engines let you subscribe to searches as feeds. This is good for tracking a topic, or searching a site (such as forums without direct feeds). On <a href="http://bing.com">Bing</a>, transform searches into feeds by adding "&format=rss" to the URL. <a href="http://www.google.com">Google</a> provides <a href="http://alerts.google.com">Google Alerts</a>, which support various searches, including blog searches. In both engines, use "site:www.example.com" to search only a particular site. Unfortunately, these feeds return items as the search engine crawls them, so they can sometimes be very stale.<br />
<li> <i>Scraping pages:</i> When there's no direct feed, and freshness is important, <a href="http://open.dapper.com">Dapper</a> provides an easy way to scrape pages as RSS feeds. This is also good for scraping data not typically in feeds, such as the result count for a search. </ol><p>Some representative examples of feeds I check are: <ul><li>MSDN feed for the SQL Server XML forum<br />
<li>Bing searches over SQL Monster, such as <span class="code">("column set" OR "column sets") site:www.sqlmonster.com/Uwe/Forum.aspx/</span>.<br />
<li>Google Blog searches (through <a href="http://alerts.google.com">Google Alerts</a>), such as <span class="code">("sparse columns" OR semi-structured) "sql server" -job</span>.<br />
<li>SharePoint lists on project sites, such as the Tasks or Announcements list. </ul><p>However you obtain the feed, copy its URL with Ctrl-C. Then, in Omea Reader, click the menu item "Tools -> Subscribe to a Feed." The dialog that pops up will auto-paste the feed URL into the proper field, so just hit "Next >". <a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgceQ6ujsy_Aoi8R20V_Y2dvKiSHf_Zze8WlzANycEWk0y4Kce29ff0BdVaWf0HzbpDsq6fhTjA26RLCoyFKU0FR4xgo3zvdvDfOerPfpF1Z6h1Avnphl51GUc6l4icDaQEOgB7nl50eqUt/s1600-h/omea_feed.png"><img style="display:block; margin:10px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 278px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgceQ6ujsy_Aoi8R20V_Y2dvKiSHf_Zze8WlzANycEWk0y4Kce29ff0BdVaWf0HzbpDsq6fhTjA26RLCoyFKU0FR4xgo3zvdvDfOerPfpF1Z6h1Avnphl51GUc6l4icDaQEOgB7nl50eqUt/s320/omea_feed.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5364016988463913570" /></a> Omea Reader will then fetch the feed's name. Finally, click the "Finish" button to add the feed. Repeat these steps with as many feeds as you like. <h2>Daily Use</h2>After adding newsgroups and feeds, click on the "All Resources" tab to see your posts. I recommend deleting all these initial posts and starting fresh. Then, each day, start Omea Reader. It will download the day's posts automatically. <p>You can answer newsgroup posts from Omea Reader. For feed posts, clicking on the "Source" link takes you to the original post, where you can reply through the site's interface. This daily routine takes only a few minutes a day, and is much more efficient than visiting each newsgroup, blog, and forum individually. <p></div>Pedro DeRosehttp://www.blogger.com/profile/14833075200638108981noreply@blogger.com1tag:blogger.com,1999:blog-3017800805769561366.post-3809237289843819632009-06-23T11:43:00.000-07:002009-07-08T13:21:38.171-07:00Productive Tension, Checks and BalancesMany software houses have caught on to using separate teams for writing and testing code. This is a great example of building productive tension: developers take pride in writing code with no bugs, and testers take pride in catching bugs the developers missed. This is one of the checks and balances that leads to better software.
<p>
Recently, I've been thinking about how one beauty of the program manager role is that it adds its own dimension to this productive tension. The key is that PMs champion the customer when designing functionality, yet have no authority over developers and testers. I've seen this build productive tension in two ways.
<div class="cut">
The first is a tension over design. Part of a PM's job is to empathize with customers. We want to listen to their asks, anticipate what they need, and design conceptually clean and complete features. In other words, we worry first about customer functionality, then about implementation. However, developers worry first about tractable features, then about "ideal" functionality. This difference in primary goals builds productive tension. But the overall overlap in goals means the design iterates until the PM feels pretty good about the customer functionality, and the developers feel pretty good about tractability. Since each role champions a different goal, both desirable, the result tends to be good compromises.
<p>
The second is a tension between influence and authority. While the PM is responsible for designing features, he cannot tell developers and testers "do it or leave". He's not their manager. At the same time, their manager does not design functionality (though he or she typically has valuable input). The result is that no functional design is by mandate: if the PM has an idea, he has to convince the developers, testers, and their managers; if the manager has an idea, he or she has to convince the PM. Having to convince several other smart people, over whom you have no authority, is a great way to select for good ideas.
<p>
These are the ways I've noticed PMs contributing to productive tension, and to the checks and balances that make for good software. Anything else I should look for?
</div>Pedro DeRosehttp://www.blogger.com/profile/14833075200638108981noreply@blogger.com1tag:blogger.com,1999:blog-3017800805769561366.post-70263193456543117292009-06-10T11:41:00.000-07:002009-07-08T13:33:42.352-07:00Being a MenteeA good mentor is one of those things that's often listed as a key ingredient in
success. It can let you shortcut long and potentially painful learning by
teaching you the lessons of someone who, since they're successful, has
presumably learned the right lessons. Observing a mentor, and asking the right
questions, gives you potently distilled experience.
<div class="cut">
I've learned from a lot of people, but I've only had a true mentor/mentee
relationship with a few. It's not always a relationship that comes naturally,
and I've had to learn to be a better mentee. I've just started with a new PM
mentor, and it's gotten me thinking about things I wish I had known since my
first:
<p>
<b>Know what you want to learn:</b> be specific. Don't look for a "life
mentor", or even a "business mentor". Know that you want to learn leadership and
influence, or to write and communicate clearly, or how to manage a group, or how
to differentiate against competitors. But keep an open mind: one thing your
mentor may teach you is what you <i>really</i> ought to be learning.
<p>
<b>Pick the right mentor:</b> look for a few key characteristics. They
should be successful, meaning they've gotten where you want to go, using what
you want to learn. They should also be willing to answer questions. Ideally,
look for someone you can observe, rather than only meeting at set times. And,
while not necessary, it certainly helps if you get along.
<p>
<b>Drive the relationship:</b> learn actively, not passively. Ask questions,
and invite feedback. Always look for what you can do or ask that will tease out
important lessons from your mentor's actions and experience.
<p>
<b>Assume they're right:</b> at least initially, anyway. This was a
hard-earned lesson for me. If your mentor does something that seems odd, don't
assume they're wrong. Instead, assume they know what they're doing, and try to
figure out what you're missing. Remember that you chose this person precisely
because they're successful, so don't assume you know better.
<p>
My Ph.D. advisor really drove this lesson home. He is a great
researcher, and I was learning to do research. Sometimes, he
would suggest ideas I just <i>knew</i> were wrong. Being strong-willed, I would
push back. Tensions often rose. Yet time after time, in retrospect, I found his
ideas worked better in our papers. I finally realized that while I
measured ideas only on technical merit, he also considered their conceptual
cleanliness, how well they would sell in a paper, current trends in the
field, conversations with other professors, etc, etc. Instead of assuming I was
right, I should have assumed he was right, and tried to figure out why.
<p>
<br>
Any other lessons I should take into this new mentorship?
</div>Pedro DeRosehttp://www.blogger.com/profile/14833075200638108981noreply@blogger.com1tag:blogger.com,1999:blog-3017800805769561366.post-29181703764026959742009-05-26T18:40:00.000-07:002009-11-10T15:02:14.061-08:00Preparing canned explanationsAs a developer, I spent a lot of time explaining things to computers (in other words, coding). Starting as a graduate student, and now as a program manager, I spend a lot of time explaining things to people. Turns out that's often harder. <p>It's particularly hard with canned explanations, such as presentations and specs, where you prepare the explanation in advance. If your audience doesn't understand something, you may lose them; you may not get the chance to try another tack. <div class="cut">Preparing canned explanations is an art, and I know just enough to realize I know almost nothing. Due to the patient mentoring of a great explainer, and through watching several others, I've managed to learn a few pointers. The most important is to <i>tell a story</i>. This is very broad, and includes:<br />
<p><ul><li><b>Start with what they know.</b> Don't throw your audience in the deep end. Start with common knowledge, then build to new things.<br />
<li><b>Give an intuitive overview.</b> Tell the audience where you're headed. Suspense and surprise work sometimes, but don't keep them guessing about your point. A rule of thumb is "tell them what you'll tell them, then tell them, then tell them what you told them."<br />
<li><b>Flow is everything.</b> Top down, bottom up, temporally, procedurally (first, then, next, finally)...however you do it, make points flow from one to another. If you break the flow, or have none, it's easy to lose your audience.<br />
<li><b>Make every word count.</b> Be brief. Try to make one point at a time. Then, drop unnecessary points.<br />
<li><b>Be concrete.</b> Define nouns, quantify adjectives, and favor processes over vague verbs. Numbers, anecdotes, and examples go a long way.<br />
<li><b>Use the conclusion.</b> The audience may skip everything else, but they'll usually wake up for the conclusion. At minimum, reiterate your story outline and emphasis your main points. </ul><p>Apart from telling a story, I've learned a couple tips about polishing explanations:
<p><ul><li><b>Get feedback on your drafts</b>. Give practice presentations, ask peers to review your specs, etc. Feedback from first-timers is invaluable, so don't waste fresh eyes: have some people review your first draft, others your second, and so forth. It also helps if someone reads multiple drafts, but make sure they're either very patient, or owe you a favor.<br />
<li><b>Insist on criticism</b>. Ask what you could have done better. Insist people tell you something. There's always something to improve, and people can be surprisingly reluctant to give criticism face-to-face. </ul><p>I'm always looking for new tips, so if anyone has a good one, please share! </div>Pedro DeRosehttp://www.blogger.com/profile/14833075200638108981noreply@blogger.com2tag:blogger.com,1999:blog-3017800805769561366.post-56277185530622305222009-05-19T10:23:00.000-07:002009-05-19T11:36:55.231-07:00Nice thing about PMing at SQL ServerFair warning: shameless plug ahead.
<div class="cut">
<p>
Groups within Microsoft vary widely, including everything from the culture, to the engineering process...even the acronyms. Makes it hard to paint the whole company with one brush.
<p>
For instance, take SQL Server. We're not the 500lb gorilla; that's Oracle. In the database arena, we're one of the scrappy underdogs, and it shows in the culture. At the same time, our division is one of Microsoft's established workhorses; we're not an experimental foray into a new business. That also shows in the culture.
<p>
It's an interesting combination. It gives us constant drive and motivation, but directed by a maturity that comes from knowing we impact the company's bottom line. As a PM, I really feel both of these factors. I'm always encouraged to think about differentiating, and solving the biggest customer pain points. At the same time, I know we're working on cool stuff that will actually make a difference.
</div>Pedro DeRosehttp://www.blogger.com/profile/14833075200638108981noreply@blogger.com2tag:blogger.com,1999:blog-3017800805769561366.post-41860922909230174822009-05-18T18:29:00.001-07:002009-05-19T11:36:41.002-07:00Defining Program ManagementI joined Microsoft SQL Server as a Program Manager in January. Before then, my direct PM experience was herding 20 undergraduates into developing a video game for a class, reading parts of <a href="http://oreilly.com/catalog/9780596517717/">"The Art of Project Management"</a>, and preparing for the Microsoft interview. In other words, I'm still very new at this.
<p>
About the first thing I learned is that the PM role is hard to define (which is part of what makes it fun).
<p>
<div class="cut">
I've heard developers describe their role as "we fix bugs", and testers as "we find bugs". Oversimplified, but, given a broad enough definition of "bugs", mostly accurate. It's harder for PMs. "We write specs" fits the pattern, but no definition of "spec" covers most of what we do. Scott Burken renamed his book "Making Thing Happen", but that's not really concrete. A developer friend suggested "we schedule meetings", which, while funny, isn't very specific.
<p>
In an effort to understand and communicate the role, here's a list of what I think it means to be a PM (which, by the way, is a very PM-ish thing to do). The goal is to keep it updated over time, and to track the changes.
<p>
What do you think? Anything I should add to or take off the list?
<p>
So, what <i>do</i> Program Managers do? I (currently) think
<ul>
<li><b>We make things easier</b>: for customers, by designing good features; for engineers, by getting stuff out of their way; for managers, by abstracting away the project's day-to-day; for sales, by differentiating and evangelizing.</li>
<li><b>We (try to) understand customers</b>: listen to them, shadow them, think like them, and champion them.</li>
<li><b>We drive consensus</b>: get stakeholders to agree on a vision.</li>
<li><b>We champion the vision</b>: keep the project on-target.</li>
<li><b>We understand the business</b>: how do we differentiate? What's the next big thing?</li>
<li><b>We design the functionality</b>: specify what the feature does, and help developers design how it does it.</li>
<li><b>We project manage</b>: plan the project, track progress, and manage risks.</li>
<li><b>We explain things</b>: communicate between engineering, customer, and business worlds, through presentations and writing.</li>
<li><b>We evangelize</b>: get people excited about the project.</li>
</ul>
</div>Pedro DeRosehttp://www.blogger.com/profile/14833075200638108981noreply@blogger.com1