<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2954359812249072053</id><updated>2012-01-28T07:53:39.570-08:00</updated><category term='aa.com'/><category term='latency hiding'/><category term='instrumentation'/><category term='dad'/><category term='active voice'/><category term='multitasking'/><category term='christine rosen'/><category term='seth godin'/><category term='Minneapolis'/><category term='Don Norman'/><category term='tree house'/><category term='thinking clearly about performance'/><category term='d-day'/><category term='resolution'/><category term='gigabyte'/><category term='software development'/><category term='reliable'/><category term='ba.com'/><category term='filter late'/><category term='xkcd'/><category term='v$session_wait'/><category term='syscall'/><category term='WWDC 2009'/><category term='Carel Jan Engel'/><category term='video'/><category term='developer'/><category term='global steering committee'/><category term='fundamentals of software performance'/><category term='odtug'/><category term='basics'/><category term='maxine johnson'/><category term='exended SQL trace'/><category term='visualization'/><category term='OFA'/><category term='ssd'/><category term='normandy'/><category term='Hotsos Symposium'/><category term='Speak-Tech'/><category term='waste'/><category term='peg mcmahon'/><category term='tom jennings'/><category term='cherbourg-havre'/><category term='jason cohen'/><category term='referential integrity'/><category term='justin kestelyn'/><category term='anjo kolk'/><category term='37signals'/><category term='critical path'/><category term='global entry'/><category term='richard stallman'/><category term='interview'/><category term='iPhone'/><category term='toon koppelaars'/><category term='VMware'/><category term='joel spolsky'/><category term='call for papers'/><category term='optimization'/><category term='filter early'/><category term='foreign keys'/><category term='design'/><category term='eric sink'/><category term='statistics'/><category term='joel garry'/><category term='blue angels'/><category term='richard feynman'/><category term='Karen Morton'/><category term='New Orleans'/><category term='showing your work'/><category term='premature optimization'/><category term='weasel words'/><category term='rehearsal'/><category term='education'/><category term='jimmy harkey'/><category term='lloyd williams'/><category term='slacks'/><category term='dave ensor'/><category term='Outlook 2003'/><category term='james harkey'/><category term='Jeff Holt'/><category term='steve johnson'/><category term='robyn sands'/><category term='perl'/><category term='optimizing oracle performance'/><category term='mike milinkovich'/><category term='tag'/><category term='response time'/><category term='Method R'/><category term='jason fried'/><category term='latency'/><category term='sync'/><category term='dharmesh shah'/><category term='rmoug'/><category term='airport'/><category term='Christopher Alexander'/><category term='performance antipattern'/><category term='Profiler'/><category term='dprofpp'/><category term='planning'/><category term='marco gralike'/><category term='video abstract'/><category term='solid state disk'/><category term='nordstrom'/><category term='brown noise'/><category term='paul kenny'/><category term='bad design'/><category term='tuning'/><category term='virtual machine'/><category term='mom'/><category term='messed-up apps'/><category term='kaleidoscope'/><category term='oliver weers'/><category term='function-based index'/><category term='math'/><category term='new blog'/><category term='masterclass'/><category term='tim sanders'/><category term='jonathan lewis'/><category term='trousers'/><category term='toine van beckhoven'/><category term='knee'/><category term='stop guessing'/><category term='urophagia'/><category term='wasted paper'/><category term='mac os x'/><category term='abbatoir'/><category term='c. j. date'/><category term='National Express'/><category term='Oracle wait interface'/><category term='odtug kaleidoscope'/><category term='grounding cable'/><category term='queue'/><category term='ieee 1541'/><category term='mastering oracle trace data'/><category term='juan loaiza'/><category term='millsap&apos;s grand unified theory of &apos;tuning&apos;'/><category term='nocoug'/><category term='sql'/><category term='kerry osborne'/><category term='debra lilley'/><category term='information technology'/><category term='pecha kucha'/><category term='Dilbert'/><category term='grocery shopping'/><category term='sequence diagram'/><category term='craig newberger'/><category term='writing'/><category term='justin martin'/><category term='rock star'/><category term='eisenhower'/><category term='snow leopard'/><category term='Mike Riley'/><category term='RAID'/><category term='mr tools'/><category term='Jonathan Ive'/><category term='jessica livingston'/><category term='Method R Profiler'/><category term='whitepaper'/><category term='We do not use'/><category term='love what you do'/><category term='the goal'/><category term='dan norris'/><category term='denis basaric'/><category term='chen shapira'/><category term='exadata'/><category term='oracle open world'/><category term='donald knuth'/><category term='profiles'/><category term='connie smith'/><category term='tanel põder'/><category term='rework'/><category term='&quot;thinking clearly about performance&quot;'/><category term='canceling'/><category term='performance'/><category term='steve krug'/><category term='tom kyte'/><category term='xp'/><category term='extreme programming'/><category term='eli goldratt'/><category term='miracle open world'/><category term='love is the killer app'/><category term='iPhone SDK'/><category term='mysql'/><category term='miracle oracle open world'/><category term='iCal'/><category term='big oh notation'/><category term='customer service'/><category term='Troubleshooting Oracle Performance'/><category term='keynote'/><category term='red gate'/><category term='dominic delmolino'/><category term='SyncML'/><category term='james morle'/><category term='endowment effect'/><category term='oracle'/><category term='Boeing 777'/><category term='queueing theory'/><category term='quick reference card'/><category term='performance as a service'/><category term='christopher j date'/><category term='whitesnake'/><category term='Edward Tufte'/><category term='cliff'/><category term='ramp'/><category term='fixing vendor code'/><category term='GooSync'/><category term='TripIt'/><category term='alex ohanian'/><category term='Mercado Juarez'/><category term='buffering'/><category term='bobby bragan'/><category term='multiplicative inverse law'/><category term='heinemeier-hansson'/><category term='apple'/><category term='jail-breaking'/><category term='Synthesis AG'/><category term='system performance group'/><category term='business of software'/><category term='sql server open world'/><category term='revising prose'/><category term='SLA Manager'/><category term='Heathrow Terminal 5'/><category term='Kscope'/><category term='skew'/><category term='noam wasserman'/><category term='ratio'/><category term='agile'/><category term='calaboration'/><category term='utoug'/><category term='doug burns'/><category term='e2sn'/><category term='squared'/><category term='mr trace'/><category term='do what you love'/><category term='embiggen'/><category term='pragmatic marketing'/><category term='google calendar'/><category term='percona'/><category term='flash drive'/><category term='science'/><category term='pants'/><category term='barry boehm'/><category term='ODTUG Kaleidoscope 2008'/><category term='Christian Antognini'/><category term='computer science'/><category term='miracle'/><category term='lanham'/><category term='birthday'/><category term='pages'/><category term='fog creek'/><category term='otn'/><category term='relational'/><category term='cmg'/><category term='get ready'/><category term='kent beck'/><category term='alex millsap'/><category term='Plaxo'/><category term='calling out for you'/><category term='x factor'/><category term='OS 3.0'/><category term='gwen shapira'/><category term='lewis parkhill'/><category term='tapio lahdenmäki'/><category term='video browsing'/><category term='disk space'/><category term='BAARF party'/><category term='tim cook'/><category term='Business of Software 2008'/><category term='miracle benelux'/><category term='zürich'/><category term='fractions'/><category term='gibibyte'/><category term='passive voice'/><category term='axiomatic thinking'/><category term='throughput'/><category term='thinking clearly'/><category term='mogens nørgaard'/><category term='diagnosis'/><category term='profiling'/><category term='lex de haan'/><category term='profile'/><title type='text'>Cary Millsap</title><subtitle type='html'>My web log for things that professional software developers, performance analysts, or founders of companies might find interesting.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>88</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-1753555739227413788</id><published>2011-12-04T04:13:00.000-08:00</published><updated>2011-12-04T04:13:16.272-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssd'/><category scheme='http://www.blogger.com/atom/ns#' term='gwen shapira'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><title type='text'>Gwen Shapira on SSD</title><content type='html'>If you haven’t seen &lt;a href="http://www.pythian.com/news/28797/de-confusing-ssd-for-oracle-databases/"&gt;Gwen Shapira’s article about de-confusing SSD&lt;/a&gt;, I recommend that you read it soon.&lt;br /&gt;&lt;br /&gt;One statement stood out as an idea on which I wanted to comment:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;If you don’t see significant number of physical reads and sequential read wait events in your AWR report, you won’t notice much performance improvements from using SSD.&lt;/blockquote&gt;I wanted to remind you that you can do better. If you do notice a significant number of physical reads and sequential write wait events in your AWR report, then it’s still not certain that SSD will improve the performance of the &lt;b&gt;task whose performance you’re hoping to improve&lt;/b&gt;. You don’t have to guess about the effect that SSD will have upon any business task you care about. In 2009, I wrote a &lt;a href="http://carymillsap.blogspot.com/2009/04/cary-on-joel-on-ssd.html"&gt;blog post that explains&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-1753555739227413788?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/1753555739227413788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=1753555739227413788' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1753555739227413788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1753555739227413788'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2011/12/gwen-shapira-on-ssd.html' title='Gwen Shapira on SSD'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-3059104351184427260</id><published>2011-11-18T20:59:00.000-08:00</published><updated>2011-11-19T16:50:19.451-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tuning'/><category scheme='http://www.blogger.com/atom/ns#' term='optimizing oracle performance'/><category scheme='http://www.blogger.com/atom/ns#' term='mastering oracle trace data'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle wait interface'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>I Can Help You Trace It</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-DgjVLST0iko/TscD8rmhIJI/AAAAAAAABj8/MG5GDhl9chQ/s1600/Millsap2003-256.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-DgjVLST0iko/TscD8rmhIJI/AAAAAAAABj8/MG5GDhl9chQ/s200/Millsap2003-256.png" style="border-bottom-color: gray; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: gray; border-left-style: solid; border-left-width: 1px; border-right-color: gray; border-right-style: solid; border-right-width: 1px; border-top-color: gray; border-top-style: solid; border-top-width: 1px;" width="152" /&gt;&lt;/a&gt;&lt;/div&gt;The first product I ever created after leaving Oracle Corporation in 1999 was a 3-day course about optimizing Oracle performance. The experiences of teaching this course from 2000 through 2003 (heavily revising the material each time I taught it) added up to the knowledge that Jeff Holt and I needed to write &lt;a href="http://www.amazon.com/gp/product/059600527X?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=059600527X"&gt;&lt;i&gt;Optimizing Oracle Performance&lt;/i&gt;&lt;/a&gt; (2003).&lt;br /&gt;&lt;br /&gt;Between 2000 and 2006, I spent many weeks on the road teaching this 3-day course. I stopped teaching it in 2006. An opportunity to take or teach a course ought to be a joyous experience, and this one had become too much of a grind. I didn’t figure out how to fix it until this year. How I fixed it is the story I’d like to tell you.&lt;br /&gt;&lt;h2&gt;The Problem&lt;/h2&gt;The problem was simply &lt;i&gt;inefficiency&lt;/i&gt;. The inefficiency began with the structure of the course, the 3-day lecture marathon. Realize, 6 × 3 = 18 hours of sitting in a chair, listening attentively to a single voice (&lt;i&gt;my&lt;/i&gt; voice) is the equivalent of a 6-week university term of a 3-credit-hour course, taught straight through in three days. No hour+ homework assignment after each hour of lecture to reinforce the lessons; but a full semester’s worth of listening to one voice, straight through, for three days. What retention rate would you expect from a university course compressed into just 3&amp;nbsp;days?&lt;br /&gt;&lt;br /&gt;So, I optimized. I have created a new course that lasts &lt;i&gt;one&lt;/i&gt;&amp;nbsp;day (not even an exhausting full day at that). But how can a student possibly learn as much in 1&amp;nbsp;day as we used to teach in 3&amp;nbsp;days? Isn’t a 1-day event bound to be a significantly reduced-value experience?&lt;br /&gt;&lt;br /&gt;On the contrary, I believe our students benefit even more now than they used to. Here are the big differences, so you can see why.&lt;br /&gt;&lt;h2&gt;The Time Savings&lt;/h2&gt;In the 3-day course, I would spend half a day explaining why people should abandon their old system-wide-ratio-based ways of managing system performance. In the new 1-day course, I spend less than an hour explaining the Method&amp;nbsp;R approach to thinking about performance. The point of the new course is not to convince people to abandon anything they’re already doing; it’s to show students the tremendous additional opportunities that are available to them if they’ll just look at what Oracle trace files have to offer. Time savings: 2&amp;nbsp;hours.&lt;br /&gt;&lt;br /&gt;In the 3-day course, I would spend a full day explaining how to interpret trace data. By hand. These were a few little lab exercises, about an hour’s worth. Students would enter dozens of numbers from trace files into laptops or pocket calculators and write results on worksheets. In the new 1-day course, the software tools that a student needs to interpret files of any size—or even directories full of files—are included in the price of the course. Time savings: 5&amp;nbsp;hours.&lt;br /&gt;&lt;br /&gt;In the 3-day course, I would spend half a day explaining how to collect trace data. In the new 1-day course, the software tools that a student needs to get started collecting trace files are included in the price of the course. For software architectures that require more work than our software can do for you, there’s detailed instruction in the course book. Time savings: 3&amp;nbsp;hours.&lt;br /&gt;&lt;br /&gt;In the 3-day course, I would spend half a day working through about five example cases using a software tool to which students would have access for 30&amp;nbsp;days after they had gone home. In the new 1-day course, I spend one hour working through about eight example cases using software tools that every student will take home and keep forever. I can spend less time per case yet teach &lt;i&gt;more&lt;/i&gt; because the cases are thoroughly documented in the course book. So, in class, we focus on the high-level decision making instead of the gnarly technical details you’ll want to look up later anyway. Time savings: 3&amp;nbsp;hours.&lt;br /&gt;&lt;br /&gt;...That’s 13&amp;nbsp;classroom hours we’ve eliminated from the old 3-day experience. I believe that in these 13&amp;nbsp;hours, I was teaching material that students weren’t retaining to begin with.&lt;br /&gt;&lt;h2&gt;The Book&lt;/h2&gt;The next big difference: &lt;i&gt;the book&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;In the old 3-day course, I distributed two books: (1)&amp;nbsp;the “Course Notebook,” which was a black and white listing of the course PowerPoint slides, and (2)&amp;nbsp;a copy of &lt;i&gt;Optimizing Oracle Performance&lt;/i&gt; (O’Reilly 2003). The O’Reilly book was great, because it contained a lot of detail that you would want to look up after the course. But of course it doesn’t contain any new knowledge we’ve learned since 2003. The Course Notebook, in my humble opinion, was never worth much to begin with. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-7_03Lf0246Q/TscDn5732lI/AAAAAAAABj0/n4U89K2E4Sg/s1600/Millsap2011-256.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-7_03Lf0246Q/TscDn5732lI/AAAAAAAABj0/n4U89K2E4Sg/s200/Millsap2011-256.png" style="border-bottom-color: gray; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: gray; border-left-style: solid; border-left-width: 1px; border-right-color: gray; border-right-style: solid; border-right-width: 1px; border-top-color: gray; border-top-style: solid; border-top-width: 1px;" width="150" /&gt;&lt;/a&gt;&lt;/div&gt;The &lt;i&gt;Mastering Oracle Trace Data&lt;/i&gt; (MOTD) book we give each student in my new 1-day course is a full-color, perfect-bound book that explains the course material and far more in deep detail. It is full-color for an important reason. It’s not gratuitous or decorative; it’s because I’ve been studying &lt;a href="http://www.edwardtufte.com/tufte/"&gt;Edward Tufte.&lt;/a&gt; I use color throughout the book to communicate detailed, high-resolution information faster to your brain.&lt;br /&gt;&lt;br /&gt;Color in the book helps to reduce student workload and deliver value long after a student has left the classroom. In this class, there is no collection of slide printouts like you’ve archived after every Oracle class you’ve been to since the 1980s. The MOTD book is way better than any other material I’ve ever distributed in my career. I’ve heard students tell their friends that you have to see it to believe it.&lt;br /&gt;&lt;blockquote&gt;“A paper record tells your audience that you are serious, responsible, exact, credible. For deep analysis of evidence and reasoning about complex matters, permanent high-resolution displays [that is, paper] are an excellent start.” —Edward Tufte&lt;/blockquote&gt;&lt;h2&gt;The Software&lt;/h2&gt;So, where does a student recoup all the time we used to spend going through trace files, and studying how to collect trace data on half a dozen different software architectures? In the thousands of man-hours we’ve invested into the &lt;b&gt;software that we give you&lt;/b&gt; when you come to the course. Instead of explaining every little detail about quirks in Oracle trace data that change between Oracle versions&amp;nbsp;10.1 and&amp;nbsp;10.2 and&amp;nbsp;11.2 or&amp;nbsp;11.2.0.2 and&amp;nbsp;11.2.0.4, the software does the work for you. Instead of having to explain all the detail work, we have time to explain how to &lt;i&gt;use&lt;/i&gt; the results of our software to &lt;i&gt;make decisions&lt;/i&gt; about your data.&lt;br /&gt;&lt;br /&gt;What’s the catch? Of course, we hope you’ll love our software and want to buy it. The software we give you is completely full-featured and yours to keep forever, but the license limits you to using it only with one login id, and it doesn’t include upgrades. We hope you’ll love it so much that you’ll want to buy a license that lets you use it on any of your systems and that includes the right to upgrade as we fix bugs and add features. We hope you’ll love it so much that you encourage your colleagues to buy it.&lt;br /&gt;&lt;br /&gt;But there’s really no catch. You get software and a course (and a book and a shirt) for the same daily rate that we used to charge for just a course.&lt;br /&gt;&lt;h2&gt;A Shirt?&lt;/h2&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-s7cBMkH-Nuw/TscC5Irg6KI/AAAAAAAABjs/W6xk6eCOSAM/s1600/IMG_1638+copy.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="145" src="http://1.bp.blogspot.com/-s7cBMkH-Nuw/TscC5Irg6KI/AAAAAAAABjs/W6xk6eCOSAM/s200/IMG_1638+copy.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;MOTD London 2011-09-08: “I can help you trace it.”&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Yes, a shirt. Each student receives a Method&amp;nbsp;R T-shirt that says, “I can help you trace it.” We don’t give these things away to anyone except for students in my MOTD course. So if you see one, the person wearing it can, in actual fact, Help You Trace It.&lt;br /&gt;&lt;h2&gt;The Net Result&lt;/h2&gt;The net result of all this optimization is benefits on several fronts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The course costs a lot less than it used to. The fee is presently only about 25% of the 3-day course’s price, and the whole experience requires less than ⅓ of time away from work that the original course did.&lt;/li&gt;&lt;li&gt;In the new course, our students don’t have to work so hard to make productive use of the course material. The book and the software take so much of the pressure off. We do talk about what the fields in raw trace data mean—I think it’s necessary to know that in order to use the data properly, and have productive debates with your sys/SAN/net/etc. administration colleagues. But we don’t spend your time doing exercises to untangle nested (recursive) calls by hand. The software you take home does that for you. That’s why it is so much easier for a student to put this course to work right away.&lt;/li&gt;&lt;li&gt;Since the course duration is only one day, I can visit far more cities and meet far more students each year. That’s good for students who want to participate, and it’s great for me, because I get to meet more people.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Plans&lt;/h2&gt;The only thing missing from our Mastering Oracle Trace Data course right now is &lt;i&gt;you&lt;/i&gt;. I have taught the event now in Southlake, Texas (our home town), in Copenhagen, and in London. It’s field-tested and ready to roll. We have several cities on my schedule right now. I’ll be teaching the course in &lt;a href="http://methodr20111208.eventbrite.com/"&gt;Birmingham UK&lt;/a&gt; on the day after UKOUG wraps up, December&amp;nbsp;8. I’ll be doing &lt;a href="http://methodr20111213.eventbrite.com/"&gt;Orlando&lt;/a&gt; and &lt;a href="http://methodr20111214.eventbrite.com/"&gt;Tampa&lt;/a&gt; in mid-December. I’ll teach two courses this coming January in &lt;a href="http://nyoug.org/info/training-hold/htm/NYOUG_Training_Session.htm"&gt;Manhattan&lt;/a&gt; and &lt;a href="http://nyoug.org/info/training-hold/htm/NYOUG_Training_Session2.htm"&gt;Long Island&lt;/a&gt;. There’s &lt;a href="http://mit.miracleas.dk/Kursusdetaljer.aspx?id=528"&gt;Billund (Legoland) DK&lt;/a&gt; in April. We have more plans in the works for Seattle, Portland, Dallas, and Cleveland, and we’re looking for more opportunities.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="clear: left; float: right; margin-bottom: 1em; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-m1lrimSlEhw/TscBSPNjC2I/AAAAAAAABjk/HV5LuvVcI3E/s1600/MOTD-Soon.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/-m1lrimSlEhw/TscBSPNjC2I/AAAAAAAABjk/HV5LuvVcI3E/s200/MOTD-Soon.png" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Share the word by linking the official&lt;br /&gt;MOTD sticker&amp;nbsp;to &lt;i&gt;http://method-r.com/&lt;/i&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;My wish is for you to help me book more cities in North America and Europe (I hope to expand beyond that soon). If you are part of a company or a user group with colleagues who would be interested in attending the course, I would love to hear from you. Registering en masse saves you money. The magic number for discounting is 10&amp;nbsp;students on a single registration from one company or user group.&lt;br /&gt;&lt;br /&gt;I can help you trace it.&lt;br /&gt;&lt;a href="http://www.blogger.com/"&gt;&lt;/a&gt;&lt;span id="goog_906174057"&gt;&lt;/span&gt;&lt;span id="goog_906174058"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-3059104351184427260?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/3059104351184427260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=3059104351184427260' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3059104351184427260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3059104351184427260'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2011/11/i-can-help-you-trace-it.html' title='I Can Help You Trace It'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-DgjVLST0iko/TscD8rmhIJI/AAAAAAAABj8/MG5GDhl9chQ/s72-c/Millsap2003-256.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-7701489803497506775</id><published>2011-06-17T11:25:00.000-07:00</published><updated>2011-06-17T11:25:58.021-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='odtug'/><category scheme='http://www.blogger.com/atom/ns#' term='pages'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='keynote'/><category scheme='http://www.blogger.com/atom/ns#' term='Kscope'/><category scheme='http://www.blogger.com/atom/ns#' term='red gate'/><title type='text'>Using Agile Practices to Create an Agile Presentation</title><content type='html'>What’s the best way to make a presentation on Agile practices? Practice Agile practices.&lt;br /&gt;&lt;br /&gt;You could write a presentation “big bang” style, delivering version 1.0 in front of your big audience of 200+ people at &lt;a href="http://www.odtug.com/apex/f?p=500:420:0"&gt;Kscope 2011&lt;/a&gt; before anybody has seen it. Of course, if you do it that way, you build a lot of risk into your product. But what else can you do?&lt;br /&gt;&lt;br /&gt;You can execute the Agile practices of releasing early and often, allowing the reception of your product to guide its design. Whenever you find an aspect of your product that doesn’t get the enthusiastic reception you had hoped for, you fix it for the next release.&lt;br /&gt;&lt;br /&gt;That’s one of the reasons that my release schedule for “My Case for Agile Methods” includes a little &lt;a href="http://www.red-gate.com/products/oracle-development/deployment-suite-for-oracle/webinars/webinar-cary-millsap-agile"&gt;online webinar hosted by Red Gate Software&lt;/a&gt;&amp;nbsp;next week. My release schedule is actually a lot more complicated than just one little pre-ODTUG webinar:&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="date"&gt;2011-04-15&lt;/td&gt;&lt;td&gt;Show key conceptual graphics to son (age 13)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="date"&gt;2011-04-29&lt;/td&gt;&lt;td&gt;Review #1 of paper with employee #1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="date"&gt;2011-05-18&lt;/td&gt;&lt;td&gt;Review #2 of paper with customer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="date"&gt;2011-05-14&lt;/td&gt;&lt;td&gt;Review #3 of paper with employee #1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="date"&gt;2011-05-18&lt;/td&gt;&lt;td&gt;Review #4 of paper with employee #2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="date"&gt;2011-05-26&lt;/td&gt;&lt;td&gt;Review #5 of paper with employee #3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="date"&gt;2011-06-01&lt;/td&gt;&lt;td&gt;Submit paper to ODTUG web site&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="date"&gt;2011-06-02&lt;/td&gt;&lt;td&gt;Review #6 of paper with employee #1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="date"&gt;2011-06-06&lt;/td&gt;&lt;td&gt;Review #7 of paper with employee #3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="date"&gt;2011-06-10&lt;/td&gt;&lt;td&gt;Submit revised paper to ODTUG web site&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="date"&gt;2011-06-13&lt;/td&gt;&lt;td&gt;Present “My Case for Agile Methods” to twelve people in an on-site customer meeting&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="date"&gt;2011-06-22&lt;/td&gt;&lt;td&gt;Present “My Case for Agile Methods” in an &lt;a href="http://www.red-gate.com/products/oracle-development/deployment-suite-for-oracle/webinars/webinar-cary-millsap-agile"&gt;online webinar hosted by Red Gate Software&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="date"&gt;2011-06-27&lt;/td&gt;&lt;td&gt;Present “My Case for Agile Methods” at &lt;a href="http://www.odtug.com/apex/f?p=500:420:0"&gt;ODTUG Kscope 2011&lt;/a&gt; in Long Beach, California&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;(By the way, the vast majority of the work here is done in &lt;a href="http://www.apple.com/iwork/pages/"&gt;Pages&lt;/a&gt;, not &lt;a href="http://www.apple.com/iwork/keynote/"&gt;Keynote&lt;/a&gt;. I think using a word processor, not an operating system for slide projectors.)&lt;br /&gt;&lt;br /&gt;Two Agile practices are key to everything I’ve ever done well: &lt;i&gt;incremental design&lt;/i&gt; and &lt;i&gt;rapid iteration&lt;/i&gt;. Release early, release often, and incorporate what you learn from real world use back into the product. The magic comes from learning how to choose wisely in two dimensions:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Which feature do you include next?&lt;/li&gt;&lt;li&gt;To whom do you release next?&lt;/li&gt;&lt;/ol&gt;The key is to &lt;b&gt;show your work to other people&lt;/b&gt;. Yes, there’s tremendous value in practicing a presentation, but practicing without an audience merely reinforces, it doesn’t inform. What you need while you design something is information—specifically, you need the kind of information called &lt;i&gt;feedback&lt;/i&gt;. Some of the feedback I receive generates some pretty energetic arguing. I need that to fortify my understanding of my own arguments so that I’ll be more likely to survive a good Q&amp;amp;A session on stage.&lt;br /&gt;&lt;br /&gt;To lots of people who have seen teams run projects into the ground using what they call “Agile,” the word “Agile” has become a synonym for sloppy, irresponsible work habits. When you hear me talk about Agile, you’ll hear about practices that are highly disciplined and that actually require a lot of focus, dedication, commitment, practice, and plain old hard work to execute.&lt;br /&gt;&lt;br /&gt;Agile, to me, is about injecting discipline into a process that is inevitably rife with unpredictable change.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-7701489803497506775?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/7701489803497506775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=7701489803497506775' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/7701489803497506775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/7701489803497506775'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2011/06/using-agile-practices-to-create-agile.html' title='Using Agile Practices to Create an Agile Presentation'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-5961331239174749656</id><published>2011-06-03T08:09:00.000-07:00</published><updated>2011-06-03T08:09:00.892-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mr tools'/><category scheme='http://www.blogger.com/atom/ns#' term='odtug'/><category scheme='http://www.blogger.com/atom/ns#' term='Edward Tufte'/><category scheme='http://www.blogger.com/atom/ns#' term='Jonathan Ive'/><category scheme='http://www.blogger.com/atom/ns#' term='Mike Riley'/><category scheme='http://www.blogger.com/atom/ns#' term='Christopher Alexander'/><category scheme='http://www.blogger.com/atom/ns#' term='Don Norman'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R Profiler'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><category scheme='http://www.blogger.com/atom/ns#' term='Kscope'/><title type='text'>Why KScope?</title><content type='html'>Early this year, my friend &lt;a href="http://twitter.com/Mike_ODTUG"&gt;Mike Riley&lt;/a&gt; from &lt;a href="http://www.odtug.com/"&gt;ODTUG&lt;/a&gt; asked me to write a little essay in response to the question,&amp;nbsp;“Why Kscope?” that he could post on the &lt;a href="http://odtug.wordpress.com/2011/04/27/carymillsap-kscope-is-just-the-right-place-for-me-to-be/"&gt;ODTUG blog&lt;/a&gt;. He agreed that cross-posting would help the group reach more people, so I’ve reproduced my response to that question here. I’ll hope to see you at &lt;a href="http://www.kscope11.com/"&gt;Kscope11&lt;/a&gt; in Long Beach June 26–30. If you develop applications for Oracle systems, you need to be there.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;MR&lt;/b&gt;: Why &lt;a href="http://www.kscope11.com/" target="_blank"&gt;KScope&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CM&lt;/b&gt;: Most people in the Oracle world who know my name probably think of me as a database administrator. In my heart, I am a software designer and developer. Before my career with Oracle, I worked in the semiconductor industry as a language designer. I wrote compilers for a living. Designing and writing software has always been my professional true love. I’ve never strayed too far away from it; I’ve always found a reason to write software, no matter what my job has been. [Ed: Examples include the Oracle*APS suite and a compiler design project he did for Great West Life in the 1990s, the queueing theory models he worked on in the late 1990s, the&amp;nbsp;&lt;a href="http://method-r.com/software/profiler" target="_blank"&gt;Method&amp;nbsp;R Profiler&lt;/a&gt; software (Cary wrote all the XSLT code), and finally today, he spends about half of his time designing and writing the &lt;a href="http://method-r.com/software/mrtools" target="_blank"&gt;MR&amp;nbsp;Tools suite&lt;/a&gt;.]&lt;br /&gt;&lt;br /&gt;My career as an Oracle performance specialist is really a natural extension of my software development background. It is still really weird to me that in the Oracle market, performance is regarded as a job done primarily by operations people instead of by development people. Developers control at least 90% of the leverage over how fast an application will be able to run. I think that performance became a DBA responsibility in the formative years of our Oracle world because so many early Oracle projects had DBA teams but no professional development teams.&lt;br /&gt;&lt;br /&gt;Most of those big projects were people implementing big off-the-shelf applications like Oracle Financial and Manufacturing Applications (which grew into the Oracle E-Business Suite). The only developers that most of those implementation teams had were what I would call nonprofessional developers. Now, I don’t mean people who were in any way unprofessional. I mean they were predominantly businesspeople who had never been educated as software developers, but who’d been told that of course anybody could write computer programs in this new “fourth-generation language” called SQL.&lt;br /&gt;&lt;br /&gt;Just about any time you implement a vendor’s highly customizable new application with 20,000+ database objects underneath it, you’re going to run into performance problems. Someone had to attend to those problems, and the DBAs and sysadmins were the only technical people anywhere near the project who could do it. Those DBAs and Oracle sysadmins were also the people who organized the early Oracle conferences, and I think this is where the topic of “performance tuning” became embedded into the DBA track.&lt;br /&gt;&lt;br /&gt;The resulting problem that I still see today is that the topic became dominated by “tips and techniques”—lists of tricks that operational people could try to maybe make their systems go a little bit faster. The word “tuning” says it all. I almost never use the word except facetiously, because it’s a cheap imitation of what systems really need, which is performance optimization, which is what designers and developers of software are supposed to do. Even the evolution of Oracle tools for the performance analyst mirrors this post-production tips-and-techniques “tuning” mentality. That’s why most performance management tools you see today are predominantly oriented toward viewing performance from a system resource perspective (the DBA’s perspective), rather than the code path perspective (the developer’s perspective).&lt;br /&gt;&lt;br /&gt;The whole key to performance is the application design and development team, especially when you realize that the performance of an application is not just its code path speed, but its overall interaction with the person using it. So many of the performance problems that I’ve found are caused by applications that are just stupid in how they’re designed to interact with me. For example, if you’ve seen my “Messed-up apps” presentation before, you might remember the self-service bus ticket kiosk that made me wait for over a minute while the application tallied the more-than-2,000 different bus trips for which I might want to buy a ticket. That’s an app with a broken specification. There’s nothing that a run-time operations team can do to make that application any fun to use (short of sending it back for redesign).&lt;br /&gt;&lt;br /&gt;My goal as a software designer is not just to make software that runs quickly. My goal is also to make applications that are delightful to use. It’s the difference between an application that you use because you must and one that feels like it’s a necessary part of who you are. Making software like that is the kind of thing that a designer learns from studying &lt;a href="http://en.wikipedia.org/wiki/Donald_Norman" target="_blank"&gt;Don Norman&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Edward_Tufte" target="_blank"&gt;Edward Tufte&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Christopher_Alexander" target="_blank"&gt;Christopher Alexander&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/Jonathan_Ive" target="_blank"&gt;Jonathan Ive&lt;/a&gt;. It’s a level of performance that just isn’t on the menu for operational run-time support staff to even think about, because it’s beyond their control.&lt;br /&gt;&lt;br /&gt;So: why &lt;a href="http://www.kscope11.com/" target="_blank"&gt;Kscope&lt;/a&gt;? The &lt;a href="http://www.odtug.com/apex/f?p=500:1:0" target="_blank"&gt;ODTUG&lt;/a&gt; conferences are the best places I can go in the Oracle market where I can be with people who think and talk about these things. …Or for that matter, who understand that these ideas even exist and deserve to be studied. &lt;a href="http://www.kscope11.com/" target="_blank"&gt;KScope&lt;/a&gt; is just the right place for me to be.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-5961331239174749656?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/5961331239174749656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=5961331239174749656' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5961331239174749656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5961331239174749656'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2011/06/why-kscope.html' title='Why KScope?'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-7943619889010168475</id><published>2011-02-14T14:59:00.000-08:00</published><updated>2011-02-14T14:59:55.062-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mr tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Hotsos Symposium'/><category scheme='http://www.blogger.com/atom/ns#' term='rmoug'/><category scheme='http://www.blogger.com/atom/ns#' term='nocoug'/><title type='text'>It’s Conference Season!</title><content type='html'>My favorite mode of life is being busy doing something that I enjoy and that I know, beyond a doubt, is the Right Thing to be doing. Any hour I get to spend in that zone is a precious gift.&lt;br /&gt;&lt;br /&gt;I’ve been in that zone nearly continuously for the past three weeks. I’ve been doing two of my favorite things: lots of consulting work (helping, earning, and &lt;i&gt;learning&lt;/i&gt;), and lots of software development work (which helps me help, earn, and learn even faster).&lt;br /&gt;&lt;br /&gt;I’m looking forward to the next four weeks, too, because another Right Thing that I love to do is talk with people about software performance, and three of my favorite events where I can do that are coming right up:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://rmoug.org/"&gt;RMOUG Training Days&lt;/a&gt;, Denver CO — I leave tomorrow. I’m looking forward to reuniting with lots of good friends. My stage time will be Wednesday, February 16th, when I’ll talk about material from my new “&lt;a href="http://method-r.com/downloads/doc_details/72-mastering-performance-with-extended-sql-trace"&gt;Mastering Performance with Extended SQL Trace&lt;/a&gt;” paper.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nocoug.org/next.html"&gt;NoCOUG Winter Conference&lt;/a&gt;, Pleasanton CA — I’ll be in the east Bay Area on Thursday, February 24th presenting the keynote address where I’ll discuss whether Exadata means never having to “tune” again and then spending two hours helping people to &lt;a href="http://method-r.com/downloads/doc_details/44-thinking-clearly-about-performance"&gt;think clearly about performance&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.hotsos.com/sym11.html"&gt;Hotsos Symposium&lt;/a&gt;, Irving TX —&amp;nbsp;I’ll present&amp;nbsp;“&lt;a href="http://method-r.com/downloads/doc_details/44-thinking-clearly-about-performance"&gt;Thinking Clearly about Performance&lt;/a&gt;” on Monday, March 7th.&amp;nbsp;I love the agenda at this event. It’s a high quality lineup that is dedicated purely to Oracle software performance. This is one of the very few conferences where I can enjoy sitting and just watching for whole days at a time. If you are interested in Oracle system performance, do not miss this.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Happy Valentine’s Day. I shall hope to see you soon.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-7943619889010168475?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/7943619889010168475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=7943619889010168475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/7943619889010168475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/7943619889010168475'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2011/02/its-conference-season.html' title='It’s Conference Season!'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-5691131183744122929</id><published>2011-01-21T07:00:00.000-08:00</published><updated>2011-01-28T07:58:16.808-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ratio'/><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='profile'/><title type='text'>Describing Performance Improvements (Beware of Ratios)</title><content type='html'>Recently, I received into my Spam folder an ad claiming that a product could “...improve performance 1000%.” Claims in that format have bugged me for a long time, at least as far back as the 1990s, when some of the most popular Oracle “tips &amp;amp; techniques” books of the era used that format a lot to state claims. &lt;br /&gt;&lt;br /&gt;Beware of claims worded like that.&lt;br /&gt;&lt;br /&gt;Whenever I see “...improve performance 1000%,” I have to do extra work to decode what the author has encoded in his tidy numerical package with a percent-sign bow. The two performance improvement formulas that make sense to me are these:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Improvement = (&lt;i&gt;b&lt;/i&gt; – &lt;i&gt;a&lt;/i&gt;)/&lt;i&gt;b&lt;/i&gt;, where &lt;i&gt;b&lt;/i&gt; is the response time of the task &lt;i&gt;before&lt;/i&gt; repair, and &lt;i&gt;a&lt;/i&gt; is the response time of the task &lt;i&gt;after&lt;/i&gt;  repair. This formula expresses the proportion (or percentage, if you multiply by 100%) of the original response  time that you have eliminated. It can’t be bigger than 1 (or 100%) without invoking reverse time travel.&lt;/li&gt;&lt;li&gt;Improvement = &lt;i&gt;b&lt;/i&gt;/&lt;i&gt;a&lt;/i&gt;, where &lt;i&gt;b&lt;/i&gt; and &lt;i&gt;a&lt;/i&gt; are defined exactly as above. This formula expresses how many times faster the &lt;i&gt;after&lt;/i&gt; response time is than the &lt;i&gt;before&lt;/i&gt; one. &lt;/li&gt;&lt;/ol&gt;Since 1000% is bigger than 100%, it can’t have been calculated using formula #1. I assume, then, that when someone says “...improve performance 1000%,” he means that &lt;i&gt;b&lt;/i&gt;/&lt;i&gt;a&lt;/i&gt; = 10, which, expressed as a percentage, is 1000%. What I really want to know, though, is &lt;b&gt;what were &lt;i&gt;b&lt;/i&gt; and &lt;i&gt;a&lt;/i&gt;&lt;/b&gt;? Were they 1000 and 1? 1 and .001? 6 and .4? (...In which case, I would have to search for a new formula #3.) Why won’t you tell me?&lt;br /&gt;&lt;br /&gt;Any time you see a ‘%’ character, beware: you’re looking at a ratio. The principal benefit of ratios is also their biggest flaw. A ratio conceals its denominator. That, of course, is exactly what ratios are &lt;i&gt;meant&lt;/i&gt; to do—it’s called &lt;i&gt;normalization&lt;/i&gt;—but it’s not always good to &lt;i&gt;normalize&lt;/i&gt;. Here’s an example. Imagine two SQL queries A and B that return the exact same result set. What’s better: query A, with a 90% hit ratio on the database buffer cache? or query B, with a 99% hit ratio?&lt;br /&gt;&lt;br /&gt;&lt;table class="text"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Query&lt;/th&gt;&lt;th&gt;Cache hit ratio&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt; &lt;tbody&gt;&lt;tr class="odd"&gt;&lt;td align="center"&gt;A&lt;/td&gt;&lt;td align="right"&gt;90%&lt;/td&gt;&lt;/tr&gt;&lt;tr class="even"&gt;&lt;td align="center"&gt;B&lt;/td&gt;&lt;td align="right"&gt;99%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;As tempting as it might be to choose the query with the higher cache hit ratio, the correct answer is...&lt;br /&gt;&lt;blockquote&gt;There’s not enough information given in the problem to answer. It could be either A or B, depending on information that has not yet been revealed.&lt;/blockquote&gt;Here’s why. Consider the two distinct situations listed below. Each situation matches the problem statement. For situation 1, the answer is: query B is better. But for situation 2, the answer is: query A is better, because it does far less overall work. Without knowing more about the situation than just the ratio, you can’t answer the question.&lt;br /&gt;&lt;br /&gt;&lt;table class="text"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th class="label" colspan="4"&gt;Situation 1&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Query&lt;/th&gt;&lt;th&gt;Cache lookups&lt;/th&gt;&lt;th&gt;Cache hits&lt;/th&gt;&lt;th&gt;Cache hit ratio&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt; &lt;tbody&gt;&lt;tr class="odd"&gt;&lt;td align="center"&gt;A&lt;/td&gt;&lt;td align="right"&gt;100&lt;/td&gt;&lt;td align="right"&gt;90&lt;/td&gt;&lt;td align="right"&gt;90%&lt;/td&gt;&lt;/tr&gt;&lt;tr class="even"&gt;&lt;td align="center"&gt;B&lt;/td&gt;&lt;td align="right"&gt;100&lt;/td&gt;&lt;td align="right"&gt;99&lt;/td&gt;&lt;td align="right"&gt;99%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;&lt;table class="text"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th class="label" colspan="4"&gt;Situation 2&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Query&lt;/th&gt;&lt;th&gt;Cache lookups&lt;/th&gt;&lt;th&gt;Cache hits&lt;/th&gt;&lt;th&gt;Cache hit ratio&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt; &lt;tbody&gt;&lt;tr class="odd"&gt;&lt;td align="center"&gt;A&lt;/td&gt;&lt;td align="right"&gt;10&lt;/td&gt;&lt;td align="right"&gt;9&lt;/td&gt;&lt;td align="right"&gt;90%&lt;/td&gt;&lt;/tr&gt;&lt;tr class="even"&gt;&lt;td align="center"&gt;B&lt;/td&gt;&lt;td align="right"&gt;100&lt;/td&gt;&lt;td align="right"&gt;99&lt;/td&gt;&lt;td align="right"&gt;99%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;Because a ratio hides its denominator, it’s insufficient for explaining your performance results to people (unless your aim is intentionally to hide information, which I’ll suggest is not a sustainable success strategy). It is still useful to show a normalized measure of your result, and a ratio is good for that. I didn’t say you shouldn’t use them. I just said they’re &lt;i&gt;insufficient&lt;/i&gt;. You need something more.&lt;br /&gt;&lt;br /&gt;The best way to think clearly about performance improvements is with the ratio as a parenthetical additional interesting bit of information, as in:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I improved response time of &lt;i&gt;T&lt;/i&gt; from 10s to .1s (99% reduction). &lt;/li&gt;&lt;li&gt;I improved throughput of &lt;i&gt;T&lt;/i&gt; from 42t/s to 420t/s (10-fold increase).&lt;/li&gt;&lt;/ul&gt;There are three critical pieces of information you need to include here: the &lt;i&gt;before&lt;/i&gt; measurement (&lt;i&gt;b&lt;/i&gt;), the &lt;i&gt; after&lt;/i&gt; measurement (&lt;i&gt;a&lt;/i&gt;), and the name of the task (here, &lt;i&gt;T&lt;/i&gt;) that you made faster. I’ve talked about &lt;i&gt;b&lt;/i&gt; and &lt;i&gt;a&lt;/i&gt; before, but this I’ve slipped this &lt;i&gt;T&lt;/i&gt; thing in on you all of a sudden, haven’t I!&lt;br /&gt;&lt;br /&gt;Even authors who give you &lt;i&gt;b&lt;/i&gt; and &lt;i&gt;a&lt;/i&gt; have a nasty habit of leaving off the &lt;i&gt;T&lt;/i&gt;, which  is far worse even than leaving off the &lt;i&gt;before&lt;/i&gt; and &lt;i&gt;after&lt;/i&gt; numbers, because it implies that using their magic has improved the performance of every task on the system by exactly the same proportion (either &lt;i&gt;p&lt;/i&gt;% or &lt;i&gt;n&lt;/i&gt;-fold), which is almost never true. &lt;i&gt;That&lt;/i&gt; is because it’s rare for any two tasks on a given system to have “similar” response time profiles (defining &lt;i&gt;similar&lt;/i&gt; in the proportional sense). For example, imagine the following quite &lt;i&gt;dissimilar&lt;/i&gt; two profiles:&lt;br /&gt;&lt;br /&gt;&lt;table class="text"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th class="label" colspan="4"&gt;Task A&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Response time&lt;/th&gt;&lt;th&gt;Resource&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tfoot&gt;&lt;tr&gt;&lt;td align="right"&gt;100%&lt;/td&gt;&lt;td class="label"&gt;Total&lt;/td&gt;&lt;/tr&gt;&lt;/tfoot&gt;&lt;tbody&gt;&lt;tr class="even"&gt;&lt;td align="right"&gt;90%&lt;/td&gt;&lt;td&gt;CPU&lt;/td&gt;&lt;/tr&gt;&lt;tr class="odd"&gt;&lt;td align="right"&gt;10%&lt;/td&gt;&lt;td&gt;Disk I/O&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table class="text"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th class="label" colspan="4"&gt;Task B&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Response time&lt;/th&gt;&lt;th&gt;Resource&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tfoot&gt;&lt;tr&gt;&lt;td align="right"&gt;100%&lt;/td&gt;&lt;td class="label"&gt;Total&lt;/td&gt;&lt;/tr&gt;&lt;/tfoot&gt;&lt;tbody&gt;&lt;tr class="odd"&gt;&lt;td align="right"&gt;90%&lt;/td&gt;&lt;td&gt;Disk I/O&lt;/td&gt;&lt;/tr&gt;&lt;tr class="even"&gt;&lt;td align="right"&gt;10%&lt;/td&gt;&lt;td&gt;CPU&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;No single component upgrade can have equal performance improvement effects upon both these tasks. Making CPU processing 2× faster will speed up task A by 45% and task B by 5%. Likewise, making Disk I/O processing 10× faster will speed up task A by 9% and task B by 80%.&lt;br /&gt;&lt;br /&gt;For a vendor to claim any noticeable, homogeneous improvement across the board on any computer system containing tasks A and B would be an outright lie.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-5691131183744122929?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/5691131183744122929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=5691131183744122929' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5691131183744122929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5691131183744122929'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2011/01/describing-performance-improvements.html' title='Describing Performance Improvements (Beware of Ratios)'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-4075356165512816852</id><published>2011-01-14T20:50:00.000-08:00</published><updated>2011-01-15T08:27:32.868-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='axiomatic thinking'/><category scheme='http://www.blogger.com/atom/ns#' term='james harkey'/><category scheme='http://www.blogger.com/atom/ns#' term='basics'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>An Axiomatic Approach to Algebra and Other Aspects of Life</title><content type='html'>Not many days pass that I don’t think a time or two about James R. Harkey. Mr. Harkey was my high school mathematics teacher. He taught me algebra, geometry, analytic geometry, trigonometry, and calculus.&amp;nbsp;What I learned from Mr. Harkey influences—to this day—how I write, how I teach, how I plead a case, how I troubleshoot, .... These are the skills I’ve used to earn &lt;i&gt;everything&lt;/i&gt; I own.&lt;br /&gt;&lt;br /&gt;Prior to Mr. Harkey’s algebra class, algebra for me just was a morass of tricks to memorize: “Take the constant&amp;nbsp;to the other side...”; “Cancel the common factors...”; “Flip the fraction and multiply...” I could practice for a while and then solve problems just like the ones I had been practicing,&amp;nbsp;by applying memorized transformations to superficial patterns that I recognized, but I didn’t understand what I had been taught to do. Without continual practice, the rules I had memorized would evaporate, and then once more I’d be able to solve only those problems for which I could intuit the answer: “7&lt;i&gt;x&lt;/i&gt; + 6 = 20” would have been easy, but “7/&lt;i&gt;x&lt;/i&gt; – 6 = 20” would have stumped me. This made, for example, studying for final exams quite difficult.&lt;br /&gt;&lt;br /&gt;On the first day of Mr. Harkey’s class, he gave us his rules. First, his strict rules of conduct in the classroom lived up to his quite sinister reputation, which was important. Our studies began with a single 8.5"&amp;nbsp;×&amp;nbsp;14" sheet of paper that apparently he asked us to label “&lt;a href="http://method-r.com/cary/Harkey%20Properties%20A.pdf"&gt;Properties&amp;nbsp;A&lt;/a&gt;” (because that’s what I wrote in the upper right-hand corner; and yes, I still have it). He told us that we could consult this sheet of paper on every homework assignment and every exam he’d give. And here’s how we were to use it: every problem would be executed one step at a time; every step would be written down; and beside every step we would write the name of the rule from Properties&amp;nbsp;A that we invoked to perform that step.&lt;br /&gt;&lt;br /&gt;You can still hear us now: Holy cow, that’s going to be a &lt;i&gt;lot&lt;/i&gt; of extra work.&lt;br /&gt;&lt;br /&gt;Well, that’s how it was going to be. Here’s what each homework and test problem had to look like:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_mtpW1vu-FYo/TTHK2-JK48I/AAAAAAAABis/MIymbbtM6JE/s1600/Eqn01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_mtpW1vu-FYo/TTHK2-JK48I/AAAAAAAABis/MIymbbtM6JE/s400/Eqn01.png" width="307" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The first few days of class, we spent time reviewing every single item on Properties&amp;nbsp;A. Mr. Harkey made sure we all agreed that each axiom and property was true before we moved on to the real work. He was filling our toolbox.&lt;br /&gt;&lt;br /&gt;And then we worked problem after problem after problem.&lt;br /&gt;&lt;br /&gt;Throughout the year, we did get to shift gears a few times. Not every &lt;i&gt;ax&lt;/i&gt;&amp;nbsp;+&amp;nbsp;&lt;i&gt;b&lt;/i&gt;&amp;nbsp;=&amp;nbsp;&lt;i&gt;c&lt;/i&gt;&amp;nbsp;problem required fourteen steps all year long. After some sequence of accomplishments (I don’t remember what it was—maybe some set number of ‘A’ grades on homework?), I remember being allowed to write the number of the rule instead of the whole name. (When did &lt;i&gt;you&lt;/i&gt; first learn about foreign keys? ☺) Some accomplishments after that, we’d be allowed to combine steps like 3, 4 and 5 into one. But we had to demonstrate a pattern of consistent mastery to earn a privilege like that.&lt;br /&gt;&lt;br /&gt;Mr. Harkey taught algebra as most teachers teach geometry or predicate logic. Every problem was a &lt;i&gt;proof&lt;/i&gt;, documented one logical step at a time. In Mr. Harkey’s algebra class, your “answer” to a homework problem or test question wasn’t the number that &lt;i&gt;x&lt;/i&gt; equals, it was the whole proof of how you arrived at the value of &lt;i&gt;x&lt;/i&gt; in your answer. Mr. Harkey wasn’t interested in grading your answers. He was going to grade &lt;i&gt;how you got&lt;/i&gt; your answers.&lt;br /&gt;&lt;br /&gt;The result? After a whole semester of this, I &lt;i&gt;understood&lt;/i&gt; algebra, and I mean &lt;i&gt;thoroughly&lt;/i&gt;. You couldn’t make a good grade in Mr. Harkey’s algebra class without creating an intimate comprehension of &lt;i&gt;why&lt;/i&gt; algebra works the way it does. Learning that way supplies you for a whole lifetime: I &lt;i&gt;still&lt;/i&gt; understand it. I can make dimensioned drawings of the things I’m going to build in my shop. I can calculate the tax implications of my business decisions. I can predict the response time behavior of computer software. I can even help my children with their algebra. Nothing about algebra scares me, because I still understand all the rules.&lt;br /&gt;&lt;br /&gt;When I help my boys with their homework, I make them use Mr. Harkey’s axiomatic approach with &lt;a href="http://method-r.com/cary/Harkey.pdf"&gt;my own Properties&amp;nbsp;A that I made for them&lt;/a&gt;. (I rearranged Mr. Harkey’s rules to better illuminate the symmetries among them. If Mr. Harkey had been handy with the laptop computer, which didn’t exist when I was in school, I imagine he’d have done the same thing.)&lt;br /&gt;&lt;br /&gt;Invariably, when my one of boys misses a math problem, it’s for the same stupid reason that I make mistakes in my shop or at work. It’s because he’s tried to do steps in his head instead of writing them all down, and of course he’s accidentally integrated an assumption into his work that’s not true. When you don’t have a neat and orderly audit trail to debug, the only way you can fix your work is to start over, which takes more time (which itself increases frustration levels and degrades learning) and which bypasses perhaps the most important technical skill in all of Life today: the ability to troubleshoot.&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;Theory&lt;/i&gt;: Redoing an &lt;i&gt;n&lt;/i&gt;-step&amp;nbsp;math problem instead of learning how to propagate a correction to an error made in step&amp;nbsp;&lt;i&gt;n&amp;nbsp;&lt;/i&gt;–&amp;nbsp;&lt;i&gt;k &lt;/i&gt;through step&amp;nbsp;&lt;i&gt;n&lt;/i&gt; is how we get to a society in which our support analysts know only two solutions to any problem: (a)&amp;nbsp;reboot, and (b)&amp;nbsp;reinstall.&lt;/blockquote&gt;It’s difficult to teach people the value of &lt;i&gt;mastering the basics&lt;/i&gt;. It’s difficult enough with children, and it’s even worse with adults, but great teachers and great coaches understand how important it is. I’m grateful to have met my share, and I love meeting new ones. Actually, I believe my 11-year old son has a baseball practice with one tomorrow. We’ll have to check his blog in about 30&amp;nbsp;years.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-4075356165512816852?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/4075356165512816852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=4075356165512816852' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/4075356165512816852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/4075356165512816852'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2011/01/axiomatic-approach-to-algebra-and-other.html' title='An Axiomatic Approach to Algebra and Other Aspects of Life'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_mtpW1vu-FYo/TTHK2-JK48I/AAAAAAAABis/MIymbbtM6JE/s72-c/Eqn01.png' height='72' width='72'/><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-8509679421702977939</id><published>2011-01-13T09:24:00.000-08:00</published><updated>2011-01-13T09:24:39.399-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='exended SQL trace'/><category scheme='http://www.blogger.com/atom/ns#' term='rmoug'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>New paper "Mastering Performance with Extended SQL Trace"</title><content type='html'>Happy New Year.&lt;br /&gt;&lt;br /&gt;It’s been a busy few weeks. I finally have something tangible to show for it: “&lt;a href="http://method-r.com/downloads/doc_details/72-mastering-performance-with-extended-sql-trace"&gt;Mastering Performance with Extended SQL Trace&lt;/a&gt;” is the new paper I’ve written for this year’s &lt;a href="http://rmoug.org/"&gt;RMOUG conference&lt;/a&gt;. Think of it a 15-page update to chapter 5 of &lt;a href="http://www.amazon.com/gp/product/059600527X?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=059600527X"&gt;Optimizing Oracle Performance&lt;/a&gt;.&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=methodrcom-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=059600527X" style="border: none !important; margin: 0px !important;" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;There’s lots of new detail in there. Some highlights:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;How to enable and disable traces, even in un-cooperative applications.&lt;/li&gt;&lt;li&gt;How to instrument your application so that tracing the right code path during production operation of your application becomes dead simple.&lt;/li&gt;&lt;li&gt;How to make that instrumentation highly scalable (think 100,000+ tps).&lt;/li&gt;&lt;li&gt;How timestamps since 10.2 allow you to know your recursive call relationships without guessing.&lt;/li&gt;&lt;li&gt;How to create response time profiles for calls and groups of calls, with examples.&lt;/li&gt;&lt;li&gt;Why you don’t want to be on Oracle 11&lt;i&gt;g&lt;/i&gt;&amp;nbsp;prior to 11.2.0.2.0.&lt;/li&gt;&lt;/ul&gt;I hope you’ll be able to make productive use of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-8509679421702977939?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/8509679421702977939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=8509679421702977939' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8509679421702977939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8509679421702977939'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2011/01/new-paper-mastering-performance-with.html' title='New paper &quot;Mastering Performance with Extended SQL Trace&quot;'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-1286558741095240753</id><published>2010-10-20T18:57:00.000-07:00</published><updated>2010-10-24T08:40:52.299-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='jonathan lewis'/><category scheme='http://www.blogger.com/atom/ns#' term='e2sn'/><category scheme='http://www.blogger.com/atom/ns#' term='tanel põder'/><category scheme='http://www.blogger.com/atom/ns#' term='optimization'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='kerry osborne'/><title type='text'>Virtual Seminar: "Systematic Oracle SQL Optimization in Real Life"</title><content type='html'>On November 18 and 19, I’ll be presenting along with &lt;a href="http://tech.e2sn.com/team/tanel-poder"&gt;Tanel Põder&lt;/a&gt;, &lt;a href="http://www.jlcomp.demon.co.uk/"&gt;Jonathan Lewis&lt;/a&gt;, and &lt;a href="http://kerryosborne.oracle-guy.com/"&gt;Kerry Osborne&lt;/a&gt; in a virtual (GoToWebinar) seminar called &lt;i&gt;Systematic Oracle SQL Optimization in Real Life&lt;/i&gt;. Here are the essentials:&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: right; vertical-align: top; white-space: nowrap;"&gt;What: &lt;/td&gt;&lt;td&gt;&lt;a href="http://tech.e2sn.com/virtual-conferences/systematic-oracle-sql-optimization-in-real-life"&gt;&lt;i&gt;Systematic Oracle SQL Optimization in Real Life&lt;/i&gt;&lt;/a&gt;.&lt;br /&gt;Learn how to think clearly about Oracle performance, find your performance problems, and then fix them, whether you’re using your own code (which you can modify) or someone else’s (which you can &lt;i&gt;not&lt;/i&gt; modify).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: right; vertical-align: top; white-space: nowrap;"&gt;Who: &lt;/td&gt;&lt;td&gt;&lt;a href="http://method-r.com"&gt;Cary Millsap&lt;/a&gt;, &lt;a href="http://tech.e2sn.com/team/tanel-poder"&gt;Tanel Põder&lt;/a&gt;, &lt;a href="http://www.jlcomp.demon.co.uk/"&gt;Jonathan Lewis&lt;/a&gt;, &lt;a href="http://kerryosborne.oracle-guy.com/"&gt;Kerry Osborne&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: right; vertical-align: top; white-space: nowrap;"&gt;When: &lt;/td&gt;&lt;td&gt;8am–12n US Pacific Time Thursday and Friday 18–19 November 2010&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: right; vertical-align: top; white-space: nowrap;"&gt;How much: &lt;/td&gt;&lt;td&gt;475&amp;nbsp;USD (375&amp;nbsp;USD if you &lt;a href="http://tech.e2sn.com/virtual-conferences/systematic-oracle-sql-optimization-in-real-life"&gt;register&lt;/a&gt; before 1 November 2010)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;The format will be two hours per speaker: an hour and a half for presentation time, and a half hour for questions and answers. Here’s our agenda (all times are listed in USA Pacific Time):&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="vertical-align: top;"&gt;Thursday&lt;/td&gt;&lt;td style="text-align: right; vertical-align: top; white-space: nowrap;"&gt;8:00a–10:00a&lt;/td&gt;&lt;td&gt;Cary Millsap: Thinking Clearly about Performance&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td style="text-align: right; vertical-align: top; white-space: nowrap;"&gt;10:00a–12:00n&lt;/td&gt;&lt;td&gt;Tanel Põder: Understanding and Profiling Execution Plans&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="vertical-align: top;"&gt;Friday&lt;/td&gt;&lt;td style="text-align: right; vertical-align: top; white-space: nowrap;"&gt;8:00a–10:00a&lt;/td&gt;&lt;td&gt;Jonathan Lewis: Writing Your SQL to Help the Optimizer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td style="vertical-align: top; white-space: nowrap;"&gt;10:00a–12:00n&lt;/td&gt;&lt;td&gt;Kerry Osborne: Controlling Execution Plans (without touching the code)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;This is going to be a special event. My staff and I can’t wait to see it ourselves. I hope you will &lt;a href="http://tech.e2sn.com/virtual-conferences/systematic-oracle-sql-optimization-in-real-life"&gt;join us&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-1286558741095240753?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/1286558741095240753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=1286558741095240753' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1286558741095240753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1286558741095240753'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2010/10/virtual-seminar-systematic-oracle-sql.html' title='Virtual Seminar: &quot;Systematic Oracle SQL Optimization in Real Life&quot;'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-3038209137164462092</id><published>2010-10-07T08:00:00.001-07:00</published><updated>2010-10-07T15:28:05.362-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='pragmatic marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='barry boehm'/><category scheme='http://www.blogger.com/atom/ns#' term='business of software'/><category scheme='http://www.blogger.com/atom/ns#' term='extreme programming'/><category scheme='http://www.blogger.com/atom/ns#' term='fog creek'/><category scheme='http://www.blogger.com/atom/ns#' term='the goal'/><category scheme='http://www.blogger.com/atom/ns#' term='eli goldratt'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle open world'/><category scheme='http://www.blogger.com/atom/ns#' term='urophagia'/><category scheme='http://www.blogger.com/atom/ns#' term='odtug'/><category scheme='http://www.blogger.com/atom/ns#' term='37signals'/><category scheme='http://www.blogger.com/atom/ns#' term='kent beck'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='red gate'/><title type='text'>Agile is Not a Dirty Word</title><content type='html'>While I was writing &lt;a href="http://carymillsap.blogspot.com/2010/09/brown-noise-in-written-language-part-2.html"&gt;Brown Noise in Written Language, Part 2&lt;/a&gt;, twice I came across the word “agile.” First, the word “agility” was in the original sentence that I was criticizing. &lt;a href="http://carymillsap.blogspot.com/2010/09/brown-noise-in-written-language.html?showComment=1285893101617#c8082578752227116649"&gt;Joel Garry picked up on it&lt;/a&gt; and described it as “a code word for ‘sloppy programming.’” Second, if you read my final paragraph, you might have noticed that I used the term “waterfall” to describe one method for producing bad writing. Waterfall is a reliable method for producing bad computer software too, in my experience, and for exactly the same reason. Whenever I disparage “waterfall,” I’m usually thinking fondly of “agile,” which I consider to be “waterfall’s” opposite. I was thinking fondly of “agile,” then, when I wrote that paragraph, which put me at odds with Joel’s disparaging description of the word. Such conflict usually motivates me to write something.&lt;br /&gt;&lt;br /&gt;In my career, I’ve almost always had one foot in each of two separate worlds. These days, one foot is in the Oracle world. There, I have all my old buddies from having worked at &lt;a href="http://www.oracle.com/index.html"&gt;Oracle Corporation&lt;/a&gt; for over a decade, from companies like &lt;a href="http://miracleas.dk/"&gt;Miracle&lt;/a&gt; and &lt;a href="http://www.pythian.com/"&gt;Pythian&lt;/a&gt;, the &lt;a href="http://www.oracle.com/technetwork/community/oracle-ace/index.html"&gt;Oracle ACEs and ACE Directors&lt;/a&gt;, &lt;a href="http://www.oracle.com/us/openworld/splash/index.html"&gt;Oracle OpenWorld&lt;/a&gt;, &lt;a href="http://www.odtug.com/"&gt;ODTUG&lt;/a&gt;, and a &lt;a href="http://method-r.com/services/speaking"&gt;couple dozen or so user groups&lt;/a&gt; that I visit every year. The other foot is in the business of software. There, I have colleagues and friends from &lt;a href="http://37signals.com/"&gt;37signals&lt;/a&gt; and &lt;a href="http://fogcreek.com/"&gt;Fog Creek&lt;/a&gt; and &lt;a href="http://www.red-gate.com/"&gt;Red Gate&lt;/a&gt; and &lt;a href="http://www.pragmaticmarketing.com/"&gt;Pragmatic Marketing&lt;/a&gt;, the &lt;a href="http://businessofsoftware.org/"&gt;Business of Software&lt;/a&gt; conference, and the dozens of blogs and tweets that I study every day in order to fuel a company that makes not just software that meets a list of requirements, but software that makes you feel like something magical has been accomplished when you run it.&lt;br /&gt;&lt;br /&gt;In my Oracle world, agile is a &lt;a href="http://en.wikipedia.org/wiki/Seven_dirty_words"&gt;dirty word&lt;/a&gt;. I have to actually be careful when I use it. To my Oracle practitioner colleagues, the A-word means, as Joel wrote, “sloppy programming.” In my business of software world, though, “agile” means wholesome golden goodness, an elegant solution to the absolutely most difficult problems in our field. I’m not being facetious one little bit here, either. The two most important influences in my professional life in the past decade have been, far and away:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Eli Goldratt’s &lt;a href="http://www.amazon.com/gp/product/0884271781?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0884271781"&gt;&lt;i&gt;The Goal: A Process of Ongoing Improvement&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Kent Beck’s &lt;a href="http://www.amazon.com/gp/product/0321278658?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321278658"&gt;&lt;i&gt;Extreme Programming Explained: Embrace Change (2nd Edition)&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;Far and away.&lt;br /&gt;&lt;br /&gt;I don’t mention this among most of my Oracle friends. I don’t blurt out the A-word to them, any more than I’d blurt out the F-word at my parents’ dinner table. To talk with my Oracle friends about the goodness of “A-word development” would go over like an enthusiastic hour-long lecture on &lt;a href="http://en.wikipedia.org/wiki/Urophagia"&gt;urophagia&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A lot of really smart people are very anti-“agile.” I’m pretty sure that it’s mostly because they’ve seen project leaders in the Oracle market segment using the A-word to sell—or justify—some really bad decisions (see Table 1). So the word “agile” itself has been co-opted in our Oracle culture now to mean sloppy, stupid, unprofessional, irresponsible, immature, or naive. That’s ok. I’ve had words taken away from me before. (Like “&lt;a href="http://en.wikipedia.org/wiki/Scalability"&gt;scalability&lt;/a&gt;,” which today is little more than some vague synonym for “fast” or “good”; or “&lt;a href="http://www.wsu.edu/%7Ebrians/errors/methodology.html"&gt;methodology&lt;/a&gt;,” which apparently people think sounds cooler than “method.” ...Ok, I am actually a little angry at the agile guys for that one.) That doesn’t mean I can’t still use the concepts.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Table 1.&lt;/div&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th width="50%"&gt;What people &lt;i&gt;think&lt;/i&gt; agile means&lt;/th&gt;&lt;th width="50%"&gt;What agile means&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top"&gt;No written requirements specification; therefore, no disciplined way to match software to requirements.&lt;/td&gt;&lt;td valign="top"&gt;You write your requirements as computer programs that test your software instead of writing your requirements in natural language documents that a human has  to read and interpret to re-test your software every time a developer commits new source code.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;No testing phase; therefore, no testing.&lt;/td&gt;&lt;td valign="top"&gt;You test your software before &lt;i&gt;every&lt;/i&gt; commit to your source code repository, by running your automated test suite.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;No written design specification; therefore, developers just “design” as they go.&lt;/td&gt;&lt;td valign="top"&gt;You iterate your design along with your code, but design changes are&lt;i&gt; always&lt;/i&gt; accompanied by changes to the automated test programs (which, remember, &lt;i&gt;are&lt;/i&gt; the specification).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;Rapid prototyping always results in the production code being a fragile—well—rapid fragile, prototype.&lt;/td&gt;&lt;td valign="top"&gt;When you can’t know how (or whether) something will work, you build it  and find out—but only the parts you know you’ll really need. You use the  knowledge learned from those experiences to build the one you’ll keep.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;Agile is not a synonym for sloppy. On the contrary, you're not really doing agile if you’re not extraordinarily disciplined. I think that is why a lot of people who try agile hit so hard when they fail. I hope you will check out &lt;a href="http://www.amazon.com/gp/product/0321186125?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321186125"&gt;&lt;i&gt;Balancing Agility and Discipline: A Guide for the Perplexed&lt;/i&gt;&lt;/a&gt;, coauthored by &lt;a href="http://en.wikipedia.org/wiki/Barry_Boehm"&gt;Barry Boehm&lt;/a&gt; (yes, &lt;i&gt;that&lt;/i&gt; Barry Boehm) if you feel perplexed and in need of guidance.&lt;br /&gt;&lt;br /&gt;As with any label, I hope you’ll realize that when you use a word that stands for a complex collection of thought, not everyone who hears or reads the word sees the same mental picture. When this happens, the word ceases being a tool and becomes part of a new problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-3038209137164462092?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/3038209137164462092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=3038209137164462092' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3038209137164462092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3038209137164462092'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2010/10/agile-is-not-dirty-word.html' title='Agile is Not a Dirty Word'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-2894215189177640492</id><published>2010-09-30T22:16:00.000-07:00</published><updated>2010-09-30T22:16:48.103-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jason fried'/><category scheme='http://www.blogger.com/atom/ns#' term='lanham'/><category scheme='http://www.blogger.com/atom/ns#' term='heinemeier-hansson'/><category scheme='http://www.blogger.com/atom/ns#' term='joel garry'/><category scheme='http://www.blogger.com/atom/ns#' term='writing'/><title type='text'>Brown Noise in Written Language, Part 2</title><content type='html'>Here is some more thinking on the subject of brown noise in written language, stimulated by &lt;a href="http://carymillsap.blogspot.com/2010/09/brown-noise-in-written-language.html?showComment=1285893101617#c8082578752227116649" target="_blank"&gt;Joel Garry’s comment&lt;/a&gt; to &lt;a href="http://carymillsap.blogspot.com/2010/09/brown-noise-in-written-language.html" target="_blank"&gt;my prior post&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;My point is not an appeal for more creative writing in the let’s-use-lots-of-adverbs sense. It’s an appeal for clarity of expression. More fundamentally, it is an appeal for having an idea to express in the first place. If you have an actual idea and express it in a useful way, then maybe you've created something that is &lt;i&gt;not&lt;/i&gt; spam (even if it happens to be a mass mailing), because it yields some value to your audience.&lt;br /&gt;&lt;br /&gt;My point is about being creative only to the extent that if you haven’t &lt;i&gt;created&lt;/i&gt; an interesting thought to convey by the time you’ve written something, then you don’t deserve—and you’re not going to get—my attention. (Except you might get me to criticize your writing in my blog.)&lt;br /&gt;&lt;br /&gt;What Lanham calls “the Official Style” is a tool for solving two specific problems: There’s (1) “I have no clear thought to express, yet I'm required to write something today.” And (2) “I have a thought I'd like to express, but I'm afraid that if I just come out and say it, I'll get in trouble.” Problem #1 happens, for example, to school children who are required to write when they really don’t have anything in mind to be passionate about. Problem #2 happens to millions who live out the &lt;a href="http://en.wikipedia.org/wiki/The_Emperor%27s_New_Clothes" target="_blank"&gt;Emperor’s New Clothes&lt;/a&gt; every day of their lives. They don’t “get” what their mission is or why it’s important, so when they’re required to write, they encrypt their material to hide from their audience that they don’t get it. The result includes spam, mission statements, and 98% of the PowerPoint presentations you’ll ever see in your life.&lt;br /&gt;&lt;br /&gt;I’m always more successful when I orient my thoughts in the direction of gratitude, so a better Part 1 post from me would have been structured as:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Wow, look at this horrible, horrible sentence. I am so lucky I don't have to live and work in an environment where this kind of expression (and by implication, this kind of thinking) is deemed acceptable.&lt;/li&gt;&lt;li&gt;I highly recommend Lanham's &lt;a href="http://www.amazon.com/gp/product/0321441699?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321441699" target="_blank"&gt;&lt;i&gt;Revising Prose&lt;/i&gt;&lt;/a&gt;. It is brilliant. It helps you fix this kind of writing, and—more importantly—the kind of thinking that leads to it.&lt;/li&gt;&lt;li&gt;I’m grateful for the work of people like Lanham, Fried, Heinemeier-Hansson, and many others, who help us understand and appreciate clear thinking and courageous writing.&lt;/li&gt;&lt;/ol&gt;Writing is not just output. Writing is an iterative process—along with thinking, experimenting, testing—that &lt;i&gt;creates new thought&lt;/i&gt;. If you try to use the waterfall approach when you write—“Step 1: Do all your thinking; Step 2: Do all your writing”—then you’ll miss the whole point of how writing clarifies and creates new thought. That is why learning how to revise prose is so important. It’s not just about how to make writing better. As Lanham illustrates in dozens of examples throughout his book, revising prose forces improvement in the writer’s thinking, which enriches the writer’s life even more than the writing, however tremendous, will enrich the reader.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-2894215189177640492?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/2894215189177640492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=2894215189177640492' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2894215189177640492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2894215189177640492'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2010/09/brown-noise-in-written-language-part-2.html' title='Brown Noise in Written Language, Part 2'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-5814428902765109782</id><published>2010-09-30T11:33:00.000-07:00</published><updated>2010-09-30T11:33:07.222-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='revising prose'/><category scheme='http://www.blogger.com/atom/ns#' term='rework'/><category scheme='http://www.blogger.com/atom/ns#' term='brown noise'/><title type='text'>Brown Noise in Written Language</title><content type='html'>Today’s email brought a loaf of spam with this in it:&lt;br /&gt;&lt;blockquote&gt;[Name withheld] is a world-class developer and provider of leading-edge solutions that help customers optimize the physical infrastructure through simplification, agility, and operational efficiency.&lt;/blockquote&gt;This passage is the informational equivalent of &lt;a href="http://upload.wikimedia.org/wikipedia/commons/c/c9/Brownnoise.ogg"&gt;this audio file&lt;/a&gt;. If you can read it without feeling sad, sarcastic, vaguely scummy, or bitter about humanity’s perverse unwillingness to combine thought and language in a useful way, then I &lt;i&gt;beg&lt;/i&gt; you to read &lt;a href="http://www.amazon.com/gp/product/0321441699?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321441699"&gt;Revising Prose&lt;/a&gt; and &lt;a href="http://www.amazon.com/gp/product/0307463745?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0307463745"&gt;Rework&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Please.&lt;br /&gt;&lt;br /&gt;That is all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-5814428902765109782?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/5814428902765109782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=5814428902765109782' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5814428902765109782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5814428902765109782'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2010/09/brown-noise-in-written-language.html' title='Brown Noise in Written Language'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-7036799812025193258</id><published>2010-09-26T08:20:00.000-07:00</published><updated>2010-09-26T08:20:46.386-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='otn'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle open world'/><title type='text'>My Actual OTN Interview</title><content type='html'>And now, the &lt;a href="http://medianetwork.oracle.com/media/show/15634"&gt;actual OTN interview (9:11)&lt;/a&gt; is online. Thank you, Justin; it was a lot of fun. And thank you to Oracle Corporation for another great show. It's an ever-growing world we work in, and I'm thrilled to be a part of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-7036799812025193258?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/7036799812025193258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=7036799812025193258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/7036799812025193258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/7036799812025193258'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2010/09/my-actual-otn-interview.html' title='My Actual OTN Interview'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-3876617329847184878</id><published>2010-09-10T18:05:00.000-07:00</published><updated>2010-09-10T18:05:23.800-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='new blog'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><title type='text'>New Method R Blogs</title><content type='html'>Today we installed two new blogs over at our &lt;a href="http://method-r.com/"&gt;method-r.com&lt;/a&gt; web page. We created them to give us—all of us at Method R—a place to talk about our &lt;a href="http://method-r.com/blogs/product-blog"&gt;products&lt;/a&gt; and &lt;a href="http://method-r.com/blogs/company-blog"&gt;professional experiences&lt;/a&gt;. I hope you'll come have a look.&lt;br /&gt;&lt;br /&gt;I'll still be posting here, too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-3876617329847184878?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/3876617329847184878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=3876617329847184878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3876617329847184878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3876617329847184878'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2010/09/new-method-r-blogs.html' title='New Method R Blogs'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-269624191106977404</id><published>2010-09-02T13:20:00.000-07:00</published><updated>2010-09-02T14:30:29.632-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='messed-up apps'/><category scheme='http://www.blogger.com/atom/ns#' term='interview'/><category scheme='http://www.blogger.com/atom/ns#' term='otn'/><category scheme='http://www.blogger.com/atom/ns#' term='justin kestelyn'/><category scheme='http://www.blogger.com/atom/ns#' term='thinking clearly about performance'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle open world'/><title type='text'>My OTN Interview at OOW2010 (which hasn’t happened yet)</title><content type='html'>Yesterday, &lt;a href="http://twitter.com/oracletechnet"&gt;Justin Kestelyn&lt;/a&gt; from &lt;a href="http://www.oracle.com/technetwork/index.html"&gt;Oracle Technology Network&lt;/a&gt; sent me a note specifying some logistics for our OTN interview together called “Coding for Performance, with Cary Millsap.” It will take place at &lt;a href="http://www.oracle.com/us/openworld/index.html"&gt;Oracle OpenWorld&lt;/a&gt; on Monday, September 20 at 11:45am Pacific Time.&lt;br /&gt;&lt;br /&gt;One of Justin’s requests in his note was, “Topics: Please suggest 5 topics for discussion?” So, I thought for a couple of minutes about questions I’d like him to ask me, and I wrote down the first one. And then I thought to myself that I might as well write down the answer I would hope to say to this; maybe it’ll help me remember everything I want to say. Then I wrote another question, and the answer just flowed, and then another, and another. Fifteen minutes later, I had the whole thing written out.&lt;br /&gt;&lt;br /&gt;I told Justin all this, and we agreed that it would be fun to post the whole interview here on my blog, before it ever happened. And then during the actual interview, we’ll see what actually happens. It’ll all be in Justin’s hands by then.&lt;br /&gt;&lt;br /&gt;So, here we go. Justin Kestelyn’s interview, “Coding for Performance, with Cary Millsap.” Which hasn’t happened yet.&lt;br /&gt;&lt;br /&gt;&lt;span style="text-align: center;"&gt;◆ ◆ ◆&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Justin:&lt;/strong&gt; Hi, Cary. Welcome to the show, etc., etc.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Cary:&lt;/strong&gt; Hi, Justin. It’s great to be here. Thank you for having me, etc., etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Justin:&lt;/strong&gt; So tell me, ... What is the most important thing to know about performance?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Cary:&lt;/strong&gt; Performance is all about code path. There are only three ways that a program can consume your time. There’s (1) the actual execution of your program’s instructions. There’s (2) &lt;em&gt;queueing delay&lt;/em&gt;, which is what you get when you visit a resource that’s busy serving someone else (CPU, disk, network, etc.). And there’s (3) &lt;em&gt;coherency delay&lt;/em&gt;, which is when you await some other process’s permission to execute your next step. The code you’re running controls all three of those ways you can spend time. So understanding performance is all about understanding code, whether it’s Java or PHP or C# that you wrote, or the C code that the Oracle Database kernel developers have written for you.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Justin:&lt;/strong&gt; Is tuning SQL or PL/SQL any different from tuning Java or PHP or C#?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Cary:&lt;/strong&gt; The tools are a little different, but the fundamentals are exactly the same. You find out which code path in your application is consuming your time, and then you go after it. The best thing to do is figure out a way to execute that code path less often (because the fastest way to do anything is to not do it at all). The next best thing to do is try to figure out a way to make any instructions that can’t be eliminated, faster. That’s the whole trick.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Justin:&lt;/strong&gt; You make it sound easy.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Cary:&lt;/strong&gt; It usually &lt;em&gt;is&lt;/em&gt; easy once you can collect the data you need to guide you. ...Once you know how to get the system to tell you where it’s spending &lt;em&gt;your&lt;/em&gt; time. People make it hard on themselves anytime they try to use performance data that includes information about anything other than the specific user experience they’re trying to fix. Like when they try to fix the performance of some click on a web form by looking at CPU utilization data on their application server or their database server.&lt;br /&gt;&lt;br /&gt;Another thing that makes it really hard is the design of the application. More tiers means more complexity when it comes time to diagnose performance problems. And some User Interface designs are just guaranteed to create performance problems. My presentation here called “Messed-Up Apps” is a showcase of a few of those kinds of designs. The message there is that performance is something that has to be designed into an application from the start, like any other feature. Performance is not something you can paint on at the end.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Justin:&lt;/strong&gt; What can developers do to maximize the performance of the applications they write?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Cary:&lt;/strong&gt; The most important thing is to remember a couple of key ideas. First, Barry Boehm showed that repairing defects increases hyperbolically, the later you find them in your development and deployment life cycle. That’s true for performance defects just like it is for functional defects. Second, what Donald Knuth wrote 40 years ago is still true today: when developers try to guess where their code is slow, they do an &lt;em&gt;awful&lt;/em&gt; job. Even great developers, when they profile the response time of their code, they’re often surprised at where that code is spending their (or their users’) time. So, profiling early in the software development life cycle is vital.&lt;br /&gt;&lt;br /&gt;Next, it’s important to &lt;em&gt;test&lt;/em&gt;. Not just functional requirements, but test performance requirements, too. Finally, it’s important to realize that there’s no way that your testing can catch every performance problem that can go wrong, so it’s important to make your application code easy to diagnose and repair in production. You do that with good instrumentation so your production system managers can profile in production when they need to, just like the developers do on the development and test systems.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Justin:&lt;/strong&gt; How do you—a developer—profile your code?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Cary:&lt;/strong&gt; Every development language has profiling tools that go with it. They’re tools that you can point at your application when it runs to show exactly where every smidgen of response time is being consumed within that code. The first profiler I was ever aware of is the &lt;em&gt;-pg&lt;/em&gt; flag on C compilers. You &lt;em&gt;gcc -pg&lt;/em&gt; to compile your code, and then after you run your code, you can use &lt;em&gt;gprof&lt;/em&gt; to profile where your time went. Java has profilers, PHP has them, Perl, C#, C++, all of them.&lt;br /&gt;&lt;br /&gt;Even the Oracle Database has a profiling capability, but they don’t call it “profiling” (that name means something else in the Oracle documentation). The extended SQL trace data that Oracle emits when you do the right DBMS_MONITOR.SESSION_TRACE_ENABLE call is a written record of where every bit of your response time went. That’s “profiling,” in the computer science sense of the word. Those files have been the basis of my career as a performance analyst and software tools author for the past 20 years or so.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Justin:&lt;/strong&gt; Tell us a little bit about your company, Method R. You founded it a couple of years ago?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Cary:&lt;/strong&gt; Yes, I started a new company called &lt;a href="http://method-r.com/"&gt;Method R Corporation&lt;/a&gt; in April 2008. We’ve had a great time writing tools for people and performing services (teaching and consulting) to help people solve their performance problems. Our core business is building &lt;a href="http://method-r.com/software"&gt;tools&lt;/a&gt; that help people do for themselves what we know how to do with performance. The trace data that Oracle emits is very complicated, and we have software tools that make it easy to get what you need from those trace files.&lt;br /&gt;&lt;br /&gt;We also have an &lt;a href="http://method-r.com/software/mrtrace"&gt;extension for SQL Developer&lt;/a&gt; that makes it easy to get the trace data itself, while you’re developing a new SQL- or PL/SQL-based application. We’re also working on a number of very large development projects for customers in which we’re writing complex application code that has to scale to outrageous workloads. We’re always looking for ways we can help people.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Justin:&lt;/strong&gt; Well, that’s all the time we have today. I really enjoyed talking with you, etc., etc.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Cary:&lt;/strong&gt; Oh, it was my pleasure. Thank you for having me, and good luck with the rest of the Show.&lt;br /&gt;&lt;br /&gt;&lt;span style="text-align: center;"&gt;◆ ◆ ◆&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;...Which hasn’t happened yet. ☺&lt;br /&gt;&lt;br /&gt;I hope you enjoyed, and I’ll look forward to seeing you at Oracle OpenWorld 2010.&lt;br /&gt;&lt;br /&gt;I’ll be presenting “Messed-Up Apps: a study of performance antipatterns” at the &lt;a href="http://www.odtug.com/apex/f?p=500:235:0::::P235_NEWS_ID:2842"&gt;ODTUG User Group Forum&lt;/a&gt; on Sunday at 3:00pm, and “Thinking Clearly about Performance” at the main event on Tuesday at 12:30pm. See you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-269624191106977404?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/269624191106977404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=269624191106977404' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/269624191106977404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/269624191106977404'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2010/09/my-otn-interview-at-oow2010-which-hasnt.html' title='My OTN Interview at OOW2010 (which hasn’t happened yet)'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-8439078488828612080</id><published>2010-08-09T11:00:00.000-07:00</published><updated>2011-06-17T11:27:00.109-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='exended SQL trace'/><category scheme='http://www.blogger.com/atom/ns#' term='mr trace'/><category scheme='http://www.blogger.com/atom/ns#' term='rework'/><category scheme='http://www.blogger.com/atom/ns#' term='thinking clearly about performance'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Mister Trace</title><content type='html'>For the past several weeks, my team at Method R have been working hard on a new software tool that we released today. It is an extension for &lt;a href="http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html" target="_blank"&gt;Oracle SQL Developer&lt;/a&gt; called &lt;a href="http://method-r.com/software/mrtrace" target="_blank"&gt;Method R Trace&lt;/a&gt;. We call it MR Trace for short.&lt;br /&gt;&lt;br /&gt;MR Trace is for SQL and PL/SQL developers who care about performance. Every time you execute code from a SQL Developer worksheet, MR Trace automatically copies a carefully scoped trace file to your SQL Developer workstation. There, you can open it with any application you want, just by clicking. You can tag it for easy lookup later. There’s a &lt;a href="http://method-r.com/software/mrtrace" target="_blank"&gt;3-minute video&lt;/a&gt; if you’re interested in seeing what it looks like.&lt;br /&gt;&lt;br /&gt;I’m particularly excited about MR Trace because it’s the smallest software tool we’ve ever designed. That may sound funny to a lot of people, but it won’t sound funny to you if you’ve read &lt;a href="http://www.amazon.com/gp/product/0307463745?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0307463745" target="_blank"&gt;&lt;em&gt;Rework&lt;/em&gt;&lt;/a&gt; by &lt;a href="http://twitter.com/jasonfried"&gt;Jason Fried&lt;/a&gt; and &lt;a href="http://twitter.com/dhh"&gt;David Heinemeier Hansson&lt;/a&gt; of &lt;a href="http://37signals.com/" target="_blank"&gt;37signals&lt;/a&gt;. MR Trace does a seemingly very small thing—it gets your trace file for you—but if you’ve ever done that job yourself, you might get a kick out of seeing it happen so automatically, so simply, and so quickly.&lt;br /&gt;&lt;br /&gt;The thing is, the normal process of getting trace files is raw misery for many of our friends. It’s a common story: “If I trace some SQL, then to get my trace files, I have to call up my SA or DBA. I apologize for the interruption and hope he’s in a good mood. I tell him what system I need him to look at. He has to figure out which trace files are the ones I need, and then he FTPs them over to where I can get to them. I try not to bother him, but there’s no other way.”&lt;br /&gt;&lt;br /&gt;Most places don’t have any security reasons to prohibit developers from getting their trace files, but they just don’t have the time or the interest to create procedures that developers can use to fetch only the files they’re supposed to see. The resulting bother is so labor-intensive and so demotivating that developers stop fighting and just move on without trace files to guide them.&lt;br /&gt;&lt;br /&gt;That’s a big problem: if you can’t see how the code you write consumes response time, then how can you optimize it? How can you even know if you should try to? If you have to guess where your code spends time, then you can’t possibly &lt;a href="http://method-r.com/downloads/doc_details/44-thinking-clearly-about-performance" target="_blank"&gt;think clearly about performance&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We have tried to design MR Trace to be a beautiful little application that does exactly what you need by staying out of your way. If we did it right, then you won’t be thinking about MR Trace whenever you use it; you’ll just have the trace files you need, right where and when you need them. And you’ll have them with &lt;em&gt;no&lt;/em&gt; extra typing, no extra clicks, and—for goodness’ sake—&lt;em&gt;certainly&lt;/em&gt; no more phone calls or trips down the hall. ...Unless it’s to to show off a performance problem you found and fixed before anyone else ever noticed it.&lt;br /&gt;&lt;br /&gt;Key information:&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td rowspan="7"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mtpW1vu-FYo/TFzi-RefRFI/AAAAAAAABhQ/D9X7w4z9j6Q/s1600/MR+Trace+Logo-01.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; cursor: pointer; width: 100px; height: 100px;" src="http://3.bp.blogspot.com/_mtpW1vu-FYo/TFzi-RefRFI/AAAAAAAABhQ/D9X7w4z9j6Q/s200/MR+Trace+Logo-01.png" alt="" id="BLOGGER_PHOTO_ID_5502522404210951250" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align="right"&gt;Name:  &lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;Method R Trace&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;Type:  &lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;Extension for Oracle SQL Developer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;Function:  &lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;Zero-click trace file collector&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;Price:  &lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;$49.95 USD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;Risk:  &lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;30-day free trial&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;URL:  &lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://method-r.com/software/mrtrace"&gt;http://method-r.com/software/mrtrace&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right"&gt;Designer:  &lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;Method R Corporation&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-8439078488828612080?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/8439078488828612080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=8439078488828612080' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8439078488828612080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8439078488828612080'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2010/08/mister-trace.html' title='Mister Trace'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_mtpW1vu-FYo/TFzi-RefRFI/AAAAAAAABhQ/D9X7w4z9j6Q/s72-c/MR+Trace+Logo-01.png' height='72' width='72'/><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-2438431895326346851</id><published>2010-07-26T23:38:00.001-07:00</published><updated>2010-07-27T08:03:32.744-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='canceling'/><category scheme='http://www.blogger.com/atom/ns#' term='fractions'/><category scheme='http://www.blogger.com/atom/ns#' term='reliable'/><category scheme='http://www.blogger.com/atom/ns#' term='showing your work'/><category scheme='http://www.blogger.com/atom/ns#' term='thinking clearly'/><title type='text'>Thinking Clearly is more important than the Right Answer</title><content type='html'>Have you ever met anyone who attracted your attention because he had the right idea, but the more you got to know how he &lt;span style="font-style: italic;"&gt;arrived&lt;/span&gt; at that idea, the less attracted you felt?&lt;br /&gt;&lt;br /&gt;All our lives, we learn how important it is to be correct, to have the right answer. You gotta have the right answer to make good grades in school, to nail that interview, to be accepted by your peers and your families and your supervisors, .... But too many people think that an education is merely a sequence of milestones at which you demonstrate that you know the right answer. That view of education is unfortunate.&lt;br /&gt;&lt;br /&gt;Here’s a little trick that will help me demonstrate. I’m sure you already know how to “cancel” factors in fractions, like I showed in my &lt;a href="http://carymillsap.blogspot.com/2010/05/filter-early.html"&gt;Filter Early&lt;/a&gt; post, to make division simpler. Like this:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_mtpW1vu-FYo/TE5f_gEaAdI/AAAAAAAABg4/9T_NxyyA4fs/s1600/Slide1.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 100px; height: 75px;" src="http://1.bp.blogspot.com/_mtpW1vu-FYo/TE5f_gEaAdI/AAAAAAAABg4/9T_NxyyA4fs/s200/Slide1.jpg" alt="" id="BLOGGER_PHOTO_ID_5498437739610767826" border="0" /&gt;&lt;/a&gt;But, did you know that you can do this, too?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mtpW1vu-FYo/TE5gOdy9U0I/AAAAAAAABhA/Uveq500R88w/s1600/Slide2.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 100px; height: 75px;" src="http://3.bp.blogspot.com/_mtpW1vu-FYo/TE5gOdy9U0I/AAAAAAAABhA/Uveq500R88w/s200/Slide2.jpg" alt="" id="BLOGGER_PHOTO_ID_5498437996698751810" border="0" /&gt;&lt;/a&gt;You never knew you could do that, did you?&lt;br /&gt;&lt;br /&gt;Well, that’s because you can’t. Canceling the nines produces the right answer &lt;span style="font-style: italic;"&gt;in this case&lt;/span&gt;: 95/19 is in fact 5/1. But the trick works only in a few special cases. It doesn’t, for example, work here:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mtpW1vu-FYo/TE5gTeKdZSI/AAAAAAAABhI/q1ca_hiuAJQ/s1600/Slide3.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 100px; height: 75px;" src="http://3.bp.blogspot.com/_mtpW1vu-FYo/TE5gTeKdZSI/AAAAAAAABhI/q1ca_hiuAJQ/s200/Slide3.jpg" alt="" id="BLOGGER_PHOTO_ID_5498438082696668450" border="0" /&gt;&lt;/a&gt;Canceling digits like this is &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; a &lt;span&gt;reliable&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;technique for reducing fractions. (Here’s a puzzle for you. For how many two-digit number pairs will this digit-canceling trick work? What are they? How did you figure it out?)&lt;br /&gt;&lt;br /&gt;The trick’s problem is precisely its lack of reliability. A process is &lt;span style="font-style: italic;"&gt;reliable&lt;/span&gt; only if it works every time you use it. Incomplete reliability is the most insidious of vices. If you have a tool that never works, you learn quickly never to depend upon it, so it doesn’t hurt you too badly. But if you have a tool that works sometimes, then you can grow to trust it—which increases the stakes—and &lt;span style="font-style: italic;"&gt;then&lt;/span&gt; it really hurts you when it fails.&lt;br /&gt;&lt;br /&gt;Of course, you can make a partially reliable tool useful with some extra work. You can determine under what limited circumstances the tool is reliable, and under what circumstances it isn’t. Engineers do it all the time. &lt;a href="http://en.wikipedia.org/wiki/Aluminum"&gt;Aluminum&lt;/a&gt; is structurally unreliable in certain temperature ranges, so when a part needs to operate in those ranges, they don’t build it out of aluminum. In some cases, a tool is so unreliable—like our cancel-the-digits trick—that you’re better off abandoning it entirely.&lt;br /&gt;&lt;br /&gt;So, if your student (your child) were to compute 95/19 = 5/1 by using the unreliable cancel-the-digits method, should you mark the problem correctly solved? It’s the right answer; but in this case, the correctness of the answer is actually an unfortunate coincidence.&lt;br /&gt;&lt;br /&gt;I say unfortunate, because any feedback that implies, “you can reduce fractions by canceling digits,” helps to create a defect in the student’s mind. It creates a bug—in the software sense—that he’ll need to fix later if he wants to function properly. That’s why &lt;span style="font-weight: bold;"&gt;showing your work&lt;/span&gt; is so important for students. How can someone evaluate your thinking if all you show is your final answer?&lt;br /&gt;&lt;br /&gt;Being a good teacher requires many of the same skills as being a good software tester. It’s not just about whether the student can puke out the right answers, it’s whether the process in the student’s mind is reliable. For example, if a student is prone to believing in an unreliable trick like cancel-the-digits, then a test where all the problems submit nicely to that  trick is a really &lt;span style="font-style: italic;"&gt;bad&lt;/span&gt; test.&lt;br /&gt;&lt;br /&gt;Likewise, being a good student requires many of the same skills as being a good software developer. It’s not just fitting your mind to the problems in the book; it’s exploring how the things you’re learning (both code path and data) can help you solve other problems, too. Being a good student means finding out “Why?” a lot. Why does this work? Does it always work? When does it not work?&lt;br /&gt;&lt;br /&gt;Clear thinking is more important than the right answer. Certainly you want the right answer, but knowing how to &lt;span style="font-style: italic;"&gt;find&lt;/span&gt; the right answer is far more important. It’s the difference between having a fish and knowing how to catch more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-2438431895326346851?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/2438431895326346851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=2438431895326346851' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2438431895326346851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2438431895326346851'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2010/07/thinking-clearly-is-more-important-than.html' title='Thinking Clearly is more important than the Right Answer'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_mtpW1vu-FYo/TE5f_gEaAdI/AAAAAAAABg4/9T_NxyyA4fs/s72-c/Slide1.jpg' height='72' width='72'/><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-1339514539737517688</id><published>2010-05-14T09:50:00.001-07:00</published><updated>2010-05-15T08:40:08.315-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='alex millsap'/><category scheme='http://www.blogger.com/atom/ns#' term='fractions'/><category scheme='http://www.blogger.com/atom/ns#' term='filter late'/><category scheme='http://www.blogger.com/atom/ns#' term='odtug kaleidoscope'/><category scheme='http://www.blogger.com/atom/ns#' term='filter early'/><category scheme='http://www.blogger.com/atom/ns#' term='exadata'/><category scheme='http://www.blogger.com/atom/ns#' term='multiplicative inverse law'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Filter Early</title><content type='html'>Yesterday, my 12 year-old son Alex was excited to tell me that he had learned a new trick that made it easier to multiply fractions. Here’s the trick:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_mtpW1vu-FYo/S-2AuJzQR9I/AAAAAAAABgw/2WzPU4Re8Ns/s1600/IMG.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 160px; height: 76px;" src="http://4.bp.blogspot.com/_mtpW1vu-FYo/S-2AuJzQR9I/AAAAAAAABgw/2WzPU4Re8Ns/s320/IMG.jpg" alt="" id="BLOGGER_PHOTO_ID_5471170652718254034" border="0" /&gt;&lt;/a&gt;The neat thing for me is that this week I’m working on my slides for &lt;a href="http://www.odtugkaleidoscope.com/"&gt;ODTUG Kaleidoscope 2010&lt;/a&gt; (well, actually, for the &lt;a href="http://odtugkaleidoscope.com/symposia.html#performance"&gt;Performance Symposium&lt;/a&gt; that’ll occur on Sunday 27 June), and I need more examples to help encourage application developers to write code that will Filter Early. This “trick” (it’s actually an application of the &lt;a href="http://en.wikipedia.org/wiki/Multiplicative_inverse"&gt;Multiplicative Inverse Law&lt;/a&gt;) is a good example of the Filter Early principle.&lt;br /&gt;&lt;br /&gt;Filter Early is all about throwing away data that you don’t need, as soon as you can know that you don’t need it. That’s what this trick of arithmetic is all about. Without the trick, you would do more work to multiply 4/7 × 3/4 = (4 × 3)/(7 × 4) = 12/28, and then you would do even more work again to figure out that 12 and 28 both share a factor of 4, which is what you need to know before you then divide 12/4 = 3 and then 28/4 = 7 to reduce 12/28 to 3/7. It’s smarter, faster, and more fun to use the trick. Multiplying fractions without the trick is a Filter Late operation, which is just dumb and slow.&lt;br /&gt;&lt;br /&gt;Here are some other examples of the Filter Early pattern’s funnier (&lt;a href="http://www.quotationspage.com/quote/26965.html"&gt;unless you’re  the victim of it&lt;/a&gt;), sinister antipattern, Filter Late. You shouldn’t do these things:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Drop a dozen brass needles into a haystack, shuffle the haystack, and then try to  retrieve the needles. (Why did I specifically choose brass? Two reasons. Can you guess?)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Pack everything you own into boxes, hire a moving company to move them to a new home, and then, after moving into your new home, determine that 80% of your belongings are junk that should be thrown away.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Return thousands of rows to the browser, even though the user only wants one or two.&lt;/li&gt;&lt;li&gt;To add further insult to returning thousands of rows to the browser, return the rows in some useless order. Make the user click on an icon that takes time to sort those rows into an order that will allow him to figure out which one or two he actually wanted.&lt;/li&gt;&lt;li&gt;Execute a database join operation in a middle-tier application instead of the database. I’m talking about the Java application that fetches 100,000 rows from table A and 350,000 rows from table B, and then joins the two result sets in a &lt;tt&gt;for&lt;/tt&gt; loop, in an operation that makes 100,000 comparisons to figure out that the result set of the join contains two rows, which the database could have told you much more efficiently.&lt;/li&gt;&lt;li&gt;Slog row-by-row through a multimillion-row table looking for the four rows you need, instead of using an index scan to compute the addresses of those four rows and then access them directly.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Converting a Filter Late application into a Filter Early application can make  performance unbelievably better.&lt;br /&gt;&lt;br /&gt;One of my favorite features of the Oracle Exadata machine is that it applies the Filter Early principle where a lot of people would have never thought to try it. It filters query results in the storage server instead of the database server. Before Exadata, the Oracle Database passed disk blocks (which contain some rows you do need, but also some rows you don’t) from the storage server to the database. Exadata passes only the rows you need back to the database server (&lt;a href="http://antognini.ch/2010/04/exadata-storage-server-and-the-query-optimizer-part-1/"&gt;Chris  Antognini explains&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;How many Filter Early and Filter Late examples do you know?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-1339514539737517688?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/1339514539737517688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=1339514539737517688' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1339514539737517688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1339514539737517688'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2010/05/filter-early.html' title='Filter Early'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_mtpW1vu-FYo/S-2AuJzQR9I/AAAAAAAABgw/2WzPU4Re8Ns/s72-c/IMG.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-8613415200458460794</id><published>2010-04-29T23:18:00.000-07:00</published><updated>2010-04-30T08:50:39.934-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='lloyd williams'/><category scheme='http://www.blogger.com/atom/ns#' term='connie smith'/><category scheme='http://www.blogger.com/atom/ns#' term='performance antipattern'/><category scheme='http://www.blogger.com/atom/ns#' term='debra lilley'/><category scheme='http://www.blogger.com/atom/ns#' term='big oh notation'/><category scheme='http://www.blogger.com/atom/ns#' term='wasted paper'/><category scheme='http://www.blogger.com/atom/ns#' term='squared'/><category scheme='http://www.blogger.com/atom/ns#' term='ramp'/><category scheme='http://www.blogger.com/atom/ns#' term='joel spolsky'/><title type='text'>The Ramp</title><content type='html'>I love stories about performance problems. Recently, my friend &lt;a href="http://debrasoracle.blogspot.com/"&gt;Debra Lilley&lt;/a&gt; sent me this one:&lt;br /&gt;&lt;blockquote&gt;I went to see a very large publishing company about 6 months after they went live. I asked them what their biggest issue was, and they told me querying in GL was very slow, and  I was able to fix quite easily. (There was a very simple concatenated index trick for the Chart of Accounts segments that people just never used.) Then I asked if there was anything else. The manager said no but the clerk who sat behind him said, “I have a problem.” His manager seemed embarrassed, but when I pressed him, the clerk continued, “Every day I throw away reams of paper from our invoice listing.”&lt;br /&gt;&lt;br /&gt;I asked to look at the request, which ran a simple listing of all invoices entered at a scheduled time each day. I opened up the schedule screen and there was a tick box to “Increment date on each run.” This was not ticked, and they were running the report from day 1, every day. When they accepted the system at go live there was no issue. I think all system implementations should include a 3- or 6-month review. Regardless of how good the implementers are, their setup is based on the information known at the time. In production, that information (volumes, etc.) often changes, and when it does, it can affect your decisions.&lt;br /&gt;&lt;/blockquote&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_mtpW1vu-FYo/S9rXMSKM46I/AAAAAAAABgQ/J0SCGzMXivg/s1600/The+Ramp.png"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 200px; height: 134px;" src="http://2.bp.blogspot.com/_mtpW1vu-FYo/S9rXMSKM46I/AAAAAAAABgQ/J0SCGzMXivg/s200/The+Ramp.png" alt="" id="BLOGGER_PHOTO_ID_5465917703800546210" border="0" /&gt;&lt;/a&gt;My friends &lt;a href="http://www.spe-ed.com/instruct.htm"&gt;Connie Smith and Lloyd Williams&lt;/a&gt; call this performance antipattern &lt;a style="font-style: italic;" href="http://www.perfeng.com/papers/moreanti.pdf"&gt;The Ramp&lt;/a&gt;. With &lt;em&gt;the ramp&lt;/em&gt;, processing duration increases as the system is used. This invoicing system exhibited ramp behavior, because every invoicing process execution would take just a little bit longer and print just a few more pages than the prior execution did.&lt;br /&gt;&lt;br /&gt;The problem of &lt;em&gt;the ramp&lt;/em&gt; reminds me of a joke I heard when I was young. A boy, one who is athletically very talented but not too bright, takes on a job as a &lt;a href="http://www.envirocleanequip.com/site/Portals/0/Curved%20Highway%20stripes.jpg"&gt;stripe&lt;/a&gt; painter for the highway department. The department gives him bucket of paint and a brush and drives him out to the highway he’s supposed to paint. His first day on the job, he paints a stripe almost seven miles long. This is an utterly stunning feat, for no one previously had ever painted more than five miles in a day. The department was ecstatic. Apparently, this boy’s true calling was to paint roadways.&lt;br /&gt;&lt;br /&gt;The excitement abated a little bit on the second day, when the boy painted only five miles of highway. But still, five miles is the best that anyone had ever done before him. But on the third day, the distance dropped to two miles, and on the fourth day, it fell to less than one mile.&lt;br /&gt;&lt;br /&gt;The department managers were gravely concerned, especially after having been so excited on the first couple of days. So they had a driver go out to fetch the boy, to bring him back to the office to explain why his productivity had been so outstanding at first but had then declined so horribly.&lt;br /&gt;&lt;br /&gt;The reason was easy to understand, the boy explained. Every day he painted, he kept getting farther and farther away from his paint bucket.&lt;br /&gt;&lt;br /&gt;I’ve known people who’ve written linked list insertion algorithms this way. &lt;a href="http://joelonsoftware.com/"&gt;Joel Spolsky&lt;/a&gt; has written about &lt;a href="http://www.joelonsoftware.com/articles/fog0000000319.html"&gt;string library functions in C that work this way&lt;/a&gt;. I’ve seen people write joins in SQL that work this way. And Debra’s publishing company ran their invoices this way.&lt;br /&gt;&lt;br /&gt;When you have &lt;em&gt;the ramp&lt;/em&gt; problem, individual response times increase linearly. ...Which is bad. But overall response time varies in proportion to the &lt;em&gt;square&lt;/em&gt; of the number of items being processed. ...Which is super-duper bad.&lt;br /&gt;&lt;br /&gt;Imagine, in the invoicing problem that Debra solved, that the system had been processing just one invoice per day and that each invoice is only one page long. Given that she was at a “very large publishing company,” it’s certain that the volume was greater than this, but for the sake of simplifying my argument, let’s assume that there was just one new invoice each day. Then, with the “Increment date on each run” box left unchecked, there would be one invoice to print on day 1, two on day 2, etc. On any day &lt;em&gt;n&lt;/em&gt;, there would be &lt;em&gt;n&lt;/em&gt; invoices to print.&lt;br /&gt;&lt;br /&gt;Obviously, the response time on any given day &lt;em&gt;n&lt;/em&gt; would thus be &lt;em&gt;n&lt;/em&gt; times longer than it needed to be. At the end of the first year of operation with the new application, an invoice would take 365 times longer to print than on the first day of the year.&lt;br /&gt;&lt;br /&gt;But the pain each day of invoice generation is not all there is to the problem. The original concern was expressed in terms of all the paper that was wasted. That paper waste is important, not just because of the environmental impact of unnecessary paper consumption, but also because of all the computing power expended over the operational history of the application required to generate those pages. That includes the resources (the electrical power, the CPU cycles, the memory, the disk and network I/Os, etc.) that could have been put to better use doing something else.&lt;br /&gt;&lt;br /&gt;In the simplified invoicing system I’ve asked you to imagine, the total number of pages printed as of the end of day &lt;em&gt;n&lt;/em&gt; is 1 + 2 + ... + &lt;em&gt;n&lt;/em&gt;, which is &lt;em&gt;n&lt;/em&gt;(&lt;em&gt;n&lt;/em&gt; + 1)/2. All but &lt;em&gt;n&lt;/em&gt; of those pages are unnecessary. Thus the total number of wasted pages that will have been printed by the end of day &lt;em&gt;n&lt;/em&gt; is &lt;em&gt;n&lt;/em&gt;(&lt;em&gt;n&lt;/em&gt; + 1)/2 – n, which is &lt;em&gt;n&lt;/em&gt;(&lt;em&gt;n&lt;/em&gt; – 1)/2, or (&lt;em&gt;n&lt;/em&gt;&lt;sup&gt;2&lt;/sup&gt; – &lt;em&gt;n&lt;/em&gt;)/2. The number of invoices that should never been printed is proportional to the &lt;em&gt;square&lt;/em&gt; of the number of days using the application.&lt;br /&gt;&lt;br /&gt;To get a sense for what that means, think about this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;By the end of the first month, you'll have printed 465 pages when you only needed 30. That’s 435 unnecessary pages.&lt;/li&gt;&lt;li&gt;But by the end of the first year, you’ll have printed 66,795 pages instead of 365. That’s 66,430 unnecessary pages. It’s 27 unnecessary 2,500-page boxes of paper.&lt;/li&gt;&lt;li&gt;And by the end of the fifth year, you’ll have used 668 boxes of paper to print 1,668,508 pages instead of using just one box to print 1,826 pages. The picture below shows how tremendously wasteful this is.&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mtpW1vu-FYo/S9r7VLH-maI/AAAAAAAABgo/jliDqM_K7Ow/s1600/Wasted+Boxes.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 270px; height: 320px;" src="http://3.bp.blogspot.com/_mtpW1vu-FYo/S9r7VLH-maI/AAAAAAAABgo/jliDqM_K7Ow/s320/Wasted+Boxes.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5465957438949595554" /&gt;&lt;/a&gt;&lt;br /&gt;When total effort varies as the square of something (like the number of items to process, or the number of days you’ve been using an application), it’s bad, bad news for efficiency. It means that every time your something doubles, your performance (time, materials consumption, etc.) will degrade by a factor of four. Every time your something increases by a factor of ten, your performance will degrade by a factor of a hundred. When your something increases a hundred fold, performance will degrade by a factor of 10,000.&lt;br /&gt;&lt;br /&gt;Algorithm analysts characterize algorithms that behave this way as &lt;a href="http://en.wikipedia.org/wiki/Big_O_notation"&gt;O(&lt;em&gt;n&lt;/em&gt;&lt;sup&gt;2&lt;/sup&gt;)&lt;/a&gt;, pronounced “big-oh of &lt;em&gt;n&lt;/em&gt;-squared.” O(&lt;em&gt;n&lt;/em&gt;&lt;sup&gt;2&lt;/sup&gt;) performance is no way to live. The good news is that you can usually break yourself out of a O(&lt;em&gt;n&lt;/em&gt;&lt;sup&gt;2&lt;/sup&gt;) regime. Sometimes, as Debra’s story illustrates, the solution isn’t even technical: she solved her client’s problem by using an option designed into the end-user interface.&lt;br /&gt;&lt;br /&gt;No matter where the problem is—whether it’s problem with use, setup, implementation, design, or concept—it’s worth significant time and effort to find the O(&lt;em&gt;n&lt;/em&gt;&lt;sup&gt;2&lt;/sup&gt;) problems in your system and eliminate them. Whenever you need reassurance of that idea, just glance again at the image of the paper boxes shown here.&lt;br /&gt;&lt;br /&gt;And by the way, do you remember my post about “&lt;a href="http://carymillsap.blogspot.com/2009/12/my-whole-system-is-slow-now-what.html"&gt;Just go look at it&lt;/a&gt;?” Tally one for Debra, for the win.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-8613415200458460794?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/8613415200458460794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=8613415200458460794' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8613415200458460794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8613415200458460794'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2010/04/ramp.html' title='The Ramp'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_mtpW1vu-FYo/S9rXMSKM46I/AAAAAAAABgQ/J0SCGzMXivg/s72-c/The+Ramp.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-584355578281843536</id><published>2010-03-05T18:06:00.000-08:00</published><updated>2010-03-08T20:10:18.902-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='information technology'/><category scheme='http://www.blogger.com/atom/ns#' term='computer science'/><title type='text'>On "Is a computer science degree a good goal?"</title><content type='html'>Dan Fink's "&lt;a href="http://optimaldba.blogspot.com/2010/03/is-computer-science-degree-good-goal.html"&gt;Is a computer science degree a good goal?&lt;/a&gt;" has gotten my wheels going. I think it's important to note this:&lt;blockquote&gt;Computer Science ≠ Information Technology&lt;/blockquote&gt;Not only are these two disciplines not equal, neither is a subset of the other.&lt;br /&gt;&lt;br /&gt;One of my most memorable culture shocks coming out of school into the Oracle domain was how many people didn't understand the difference between computer science, which is a specialized branch of mathematics, and information technology, which is a specialized branch of business administration. They both deal with computers (the IT major more than the CS one, actually), so of course there's risk that people will miss the distinction.&lt;br /&gt;&lt;br /&gt;Over dinner Friday night with some of my friends from &lt;a href="http://www.percona.com/"&gt;Percona&lt;/a&gt;, we touched on one of the problems. It's difficult for a technical major in school to explain even to his family and friends back home what he's studying. I remember saying once during my senior year as a math major, "I haven't seen a number bigger than 1 since I was a sophomore." I heard a new one tonight: "I got to the level where the only numbers in my math books were the page numbers."&lt;br /&gt;&lt;br /&gt;It's difficult for people who don't study computer science to understand who you are or how the &lt;a href="http://en.wikipedia.org/wiki/Min/max_kd-tree"&gt;min/max &lt;em&gt;k&lt;/em&gt;d-trees&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Deterministic_finite-state_machine"&gt;deterministic finite automata&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/First-order_logic"&gt;predicate calculus&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29"&gt;closures&lt;/a&gt; that you're studying are different from the &lt;a href="http://en.wikipedia.org/wiki/Cobol"&gt;COBOL&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Sql"&gt;SQL&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Mean_time_between_failures"&gt;MTBF&lt;/a&gt;s and &lt;a href="http://en.wikipedia.org/wiki/Information_Technology_Infrastructure_Library"&gt;ITIL&lt;/a&gt; that the IT majors are studying. It's easy to see why laypeople don't understand how these sets of topics arrange into distinctly different categories. What continually surprises me is how often even IT specialists don't understand the distinction. I guess even the computer science graduates soften that distinction when they take jobs doing tasks (&lt;em&gt;to make a living&lt;/em&gt;, of course) that will be automated within ten years by other computer scientist graduates.&lt;br /&gt;&lt;br /&gt;I agree with Dan and the comments from Tim, Robyn, Noons, Gary, and David about where the IT career path is ultimately headed in the general case. What I don't believe is that the only career path for computer scientists and mathematicians is IT. It's certainly not the only career path for the ones who can actually &lt;em&gt;create&lt;/em&gt; things.&lt;br /&gt;&lt;br /&gt;I believe that college (by which I mean "University" in the European sense) is a place where the most valuable skill you learn is &lt;em&gt;how to learn&lt;/em&gt;, and that, no matter what your major, as long as you work hard and apply yourself to overcoming the difficult challenges, there will be things in this world for you to do to earn your way.&lt;br /&gt;&lt;br /&gt;I really hope that the net effect of a depressed, broken, and downward-trending IT industry is &lt;strong&gt;not&lt;/strong&gt; that it further discourages kids from engaging in math and computer science studies in school. But I don't want for so many of our kids today who'll be our adults of tomorrow to become just compartmentalized, highly specialized robots with devastatingly good skills at things that nobody's really willing to pay good money for. I think that the successful human of the future will need to be able to invent, design, create, empathize, teach, see (&lt;em&gt;really&lt;/em&gt; see), listen (not just hear), learn, adapt, and &lt;em&gt;solve&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;...Just exactly like the successful human of the past.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-584355578281843536?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/584355578281843536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=584355578281843536' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/584355578281843536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/584355578281843536'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2010/03/on-is-computer-science-degree-good-goal.html' title='On &quot;Is a computer science degree a good goal?&quot;'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-1271986464146309612</id><published>2010-03-03T11:36:00.000-08:00</published><updated>2010-03-03T11:55:14.707-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='queueing theory'/><category scheme='http://www.blogger.com/atom/ns#' term='&quot;thinking clearly about performance&quot;'/><title type='text'>RobB's Question about M/M/m</title><content type='html'>Today, user RobB left a &lt;a href="http://carymillsap.blogspot.com/2010/02/thinking-clearly-about-performance_22.html"&gt;comment on my recent blog post&lt;/a&gt;, asking this:&lt;br /&gt;&lt;blockquote&gt;I have some doubts on how valid an M/M/m model is in a typical database performance scenario. Taking the example from the wait chapter of your book where you have a 0.49 second (service_time) query that you want to perform in less than a second, 95% percent of the time. The most important point here is the assumption of an exponential distribution for service_time immediately states that about 13% of the queries will take more than 2X(Average Service Time), and going the other way most likely to take 0 seconds. From just this assumption only, it is immediately clear that it is impossible to meet the design criteria without looking at anything else. From your article and link to the Kendall notation, wouldn’t an M/D/m model be more appropriate when looking at something like SQL query response time?? Something like M/M/m seems more suited to queueing at the supermarket, for example, and probably many other ‘human interactive’ scenarios compared to a single sub-component of an IT system.&lt;/blockquote&gt;Here’s my answer, part 1.&lt;br /&gt;&lt;br /&gt;RobB,&lt;br /&gt;&lt;br /&gt;First, I believe your observation about the book example is correct. It is correct that if service times are exponentially distributed, then about 13% (13.5335%, more precisely) of those times will be 2&lt;em&gt;S&lt;/em&gt;, where &lt;em&gt;S&lt;/em&gt; is the mean service time. So in the problem I stated, it would be impossible to achieve subsecond response time in more than about 86% of executions, even if there were no competing workload at all. You’re right: you don't need a complicated model to figure that out. You could get that straight from the CDF of the exponential distribution.&lt;br /&gt;&lt;br /&gt;However, I think the end of the example provides significant value, where it demonstrates how to use the M/M/&lt;em&gt;m&lt;/em&gt; model to prove that you're not going to be able to meet your design criteria unless you can work the value of &lt;em&gt;S&lt;/em&gt; down to .103 seconds or less (&lt;a href="http://www.amazon.com/gp/product/059600527X?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=059600527X"&gt;Optimizing Oracle Performance&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=methodrcom-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=059600527X" alt="" style="border: medium none ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt; Fig 9-26, p277). I’ve seen lots of people argue, “You need to tune that task,” but until M/M/&lt;em&gt;m&lt;/em&gt;, I had never seen anyone be able to say what the necessary service time &lt;strong&gt;goal&lt;/strong&gt; was, which of course varies as a function of the anticipated arrival rate. A numerical goal is what you need when you have developers who want to know when they’re finished writing code.&lt;br /&gt;&lt;br /&gt;With regard to whether real-life service times are really exponentially distributed, you’ve got me wondering now, myself. If service times are exponentially distributed, then for any mean service time &lt;em&gt;S&lt;/em&gt;, there’s a 9.5% probability that a randomly selected service time will be less than .1&lt;em&gt;S&lt;/em&gt; (in Mathematica, CDF[ExponentialDistribution[1/s],.1s] is 0.0951626 if 0.1s &gt; 0). I’ve got to admit that at the moment, I’m baffled as to how this kind of distribution would model &lt;em&gt;any&lt;/em&gt; real-life service process, human, IT, or otherwise.&lt;br /&gt;&lt;br /&gt;On its face, it seems like a distribution that prohibits service times smaller than a certain minimum value would be a better model (or perhaps, as you suggest, even fixed service times, as in M/D/&lt;em&gt;m&lt;/em&gt;). I think I’m missing something right now that I used to know, because I remember thinking about this previously.&lt;br /&gt;&lt;br /&gt;I have two anecdotal pieces of evidence to consider.&lt;br /&gt;&lt;br /&gt;One, nowhere in my library of books dedicated to the application of queueing theory to modeling computer software performance (that’s more than 6,000 pages, over 14 inches of material) does Kleinrock, Allen, Jain, Gunther, Menascé, et al mention an M/D/&lt;em&gt;m&lt;/em&gt; queueing system. That’s no proof that M/D/&lt;em&gt;m&lt;/em&gt; is not the right answer, but it’s information that implies that an awful lot of thinking has gone into the application of queueing theory to software applications without anyone deciding that M/D/&lt;em&gt;m&lt;/em&gt; is important enough to write about.&lt;br /&gt;&lt;br /&gt;Two, I’ve used M/M/&lt;em&gt;m&lt;/em&gt; before in modeling a trading system for a huge investment management company. The response time predictions that M/M/&lt;em&gt;m&lt;/em&gt; produced were spectacularly accurate. We did macro-level testing only, comparing response times predicted by M/M/&lt;em&gt;m&lt;/em&gt; to actual response times measured by Tuxedo. We didn’t check to see whether service times were exponentially distributed, because the model results were consistently within 5% of perfect accuracy.&lt;br /&gt;&lt;br /&gt;Neither of these is proof, of course, that M/M/&lt;em&gt;m&lt;/em&gt; is superior in routine applicability to M/D/&lt;em&gt;m&lt;/em&gt;. One question I want to answer is whether an M/D/&lt;em&gt;m&lt;/em&gt; system would provide better or worse performance than a similar M/M/&lt;em&gt;m&lt;/em&gt; system. My intuition is leaning in favor of believing that the M/M/&lt;em&gt;m&lt;/em&gt; system would give better performance. If that’s true, then M/M/&lt;em&gt;m&lt;/em&gt; is an optimistic model compared to M/D/&lt;em&gt;m&lt;/em&gt;, which means that if a real-life system is M/D/&lt;em&gt;m&lt;/em&gt; and an M/M/&lt;em&gt;m&lt;/em&gt; model says it’s not going to meet requirements, then it assuredly won’t.&lt;br /&gt;&lt;br /&gt;I did find a paper online by G. J. Franx about M/D/&lt;em&gt;m&lt;/em&gt; queueing. Maybe that paper contains an &lt;em&gt;R&lt;/em&gt;=&lt;em&gt;f&lt;/em&gt;(&lt;em&gt;λ&lt;/em&gt;,&lt;em&gt;μ&lt;/em&gt;) function that I can use to model an M/D/&lt;em&gt;m&lt;/em&gt; system, which would enable me to do the comparison. I’ll look into it.&lt;br /&gt;&lt;br /&gt;Then there’s the issue of whether M/M/&lt;em&gt;m&lt;/em&gt; or M/D/&lt;em&gt;m&lt;/em&gt; is a more appropriate model for a given real circumstance. The answer to that is simple: test your service times to see if they’re exponentially distributed. The Perl code in &lt;a href="http://www.amazon.com/gp/product/059600527X?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=059600527X"&gt;Optimizing Oracle Performance&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=methodrcom-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=059600527X" alt="" style="border: medium none ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;, pages 248–254 will do that for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-1271986464146309612?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/1271986464146309612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=1271986464146309612' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1271986464146309612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1271986464146309612'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2010/03/robbs-question-about-mmm.html' title='RobB&apos;s Question about M/M/m'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-589653237386528737</id><published>2010-02-22T15:26:00.000-08:00</published><updated>2010-02-22T15:55:00.613-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='skew'/><category scheme='http://www.blogger.com/atom/ns#' term='axiomatic thinking'/><category scheme='http://www.blogger.com/atom/ns#' term='&quot;thinking clearly about performance&quot;'/><title type='text'>Thinking Clearly About Performance, revised to include Skew</title><content type='html'>I’ve just updated the &lt;a href="http://method-r.com/downloads/doc_details/44-thinking-clearly-about-performance"&gt;“Thinking Clearly” paper&lt;/a&gt; to include an absolutely vital section that was, regrettably, missing from the first revision. It’s a section on the subject of &lt;a href="http://en.wikipedia.org/wiki/Skewness"&gt;&lt;em&gt;skew&lt;/em&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I hope you enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-589653237386528737?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/589653237386528737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=589653237386528737' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/589653237386528737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/589653237386528737'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2010/02/thinking-clearly-about-performance_22.html' title='Thinking Clearly About Performance, revised to include Skew'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-2165106323317355330</id><published>2010-02-10T07:54:00.001-08:00</published><updated>2010-02-10T08:51:02.868-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='rmoug'/><category scheme='http://www.blogger.com/atom/ns#' term='miracle open world'/><category scheme='http://www.blogger.com/atom/ns#' term='utoug'/><category scheme='http://www.blogger.com/atom/ns#' term='kaleidoscope'/><category scheme='http://www.blogger.com/atom/ns#' term='&quot;thinking clearly about performance&quot;'/><title type='text'>Thinking Clearly About Performance</title><content type='html'>I’ve posted a new paper at &lt;a href="http://method-r.com/"&gt;method-r.com&lt;/a&gt; called “&lt;a href="http://method-r.com/downloads/doc_details/44-thinking-clearly-about-performance"&gt;Thinking Clearly About Performance&lt;/a&gt;.” It’s a topic I’ll be presenting this year at:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://rmoug.org/"&gt;RMOUG&lt;/a&gt; (Denver) this month&lt;/li&gt;&lt;li&gt;&lt;a href="http://mow2010.dk/"&gt;Miracle OpenWorld&lt;/a&gt; (Billund DK) in April&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.utoug.org/"&gt;UTOUG&lt;/a&gt; (Salt Lake City) in May&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.odtugkaleidoscope.com/"&gt;Kaleidoscope&lt;/a&gt; (Washington DC) in June&lt;a href="http://www.odtugkaleidoscope.com/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://michiganoaktable.intuitwebsites.com//"&gt;MOTS&lt;/a&gt; (Ann Arbor) in September&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; The paper is only 13 pages long, and I think you’ll be pleased with its information density. Here is the table of contents:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;An Axiomatic Approach&lt;/li&gt;&lt;li&gt;What is Performance?&lt;/li&gt;&lt;li&gt;Response Time vs Throughput&lt;/li&gt;&lt;li&gt;Percentile Specifications&lt;/li&gt;&lt;li&gt;Problem Diagnosis&lt;/li&gt;&lt;li&gt;The Sequence Diagram&lt;/li&gt;&lt;li&gt;The Profile&lt;/li&gt;&lt;li&gt;Amdahl’s Law&lt;/li&gt;&lt;li&gt;Minimizing Risk&lt;/li&gt;&lt;li&gt;Load&lt;/li&gt;&lt;li&gt;Queueing Delay&lt;/li&gt;&lt;li&gt;The Knee&lt;/li&gt;&lt;li&gt;Relevance of the Knee&lt;/li&gt;&lt;li&gt;Capacity Planning&lt;/li&gt;&lt;li&gt;Random Arrivals&lt;/li&gt;&lt;li&gt;Coherency Delay&lt;/li&gt;&lt;li&gt;Performance Testing&lt;/li&gt;&lt;li&gt;Measuring&lt;/li&gt;&lt;li&gt;Performance is a Feature&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;As usual, I learned a lot writing it. I hope you’ll find it to be a useful distillation of how performance  works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-2165106323317355330?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/2165106323317355330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=2165106323317355330' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2165106323317355330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2165106323317355330'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2010/02/thinking-clearly-about-performance.html' title='Thinking Clearly About Performance'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-3456464802362312645</id><published>2009-12-22T10:52:00.001-08:00</published><updated>2009-12-28T16:42:43.827-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jimmy harkey'/><category scheme='http://www.blogger.com/atom/ns#' term='craig newberger'/><category scheme='http://www.blogger.com/atom/ns#' term='do what you love'/><category scheme='http://www.blogger.com/atom/ns#' term='love what you do'/><category scheme='http://www.blogger.com/atom/ns#' term='lewis parkhill'/><category scheme='http://www.blogger.com/atom/ns#' term='denis basaric'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>The “Do What You Love” Mirage</title><content type='html'>I am inspired by having read an article called &lt;a href="http://devcomponents.com/blog/?p=633" target="_blank"&gt;“Do what you love mirage” by Denis Basaric&lt;/a&gt;. It begins...&lt;br /&gt;&lt;blockquote&gt;“Do what you love” is advice I hear exclusively from financially secure people. And it rings hollow to me. When you need money to survive, you do any work that is available, love does not play into that choice. Desperation does.&lt;/blockquote&gt;Please &lt;a href="http://devcomponents.com/blog/?p=633" target="_blank"&gt;read it&lt;/a&gt; before you go on.&lt;br /&gt;&lt;br /&gt;Welcome back.&lt;br /&gt;&lt;br /&gt;This article puts a very important cycle within my life into words. I believe, as Denis says, that a lot of times, we get the cause-effect relationship mixed up when we think about loving what we do.&lt;br /&gt;&lt;br /&gt;I love what I do. Well, a lot of it. But Denis is right: I didn’t choose what I do out of love. I chose what I love out of &lt;em&gt;doing&lt;/em&gt;. Some examples:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I love mathematics. But I most assuredly did &lt;em&gt;not&lt;/em&gt; always love it. I learned to love it through working hard at it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It’s the same thing with writing. I love it, but I didn’t always. At first, writing was unrewarding drudgery, which is how most people I meet seem to feel about it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I love public speaking, but I sure didn’t love it when my speech class made me sick to my stomach three mornings a week for a whole semester my freshman year.&lt;/li&gt;&lt;li&gt;I love being an Oracle performance specialist, but I sure didn’t love being airlifted into crisis after crisis throughout the early 1990s.&lt;/li&gt;&lt;/ul&gt;I could go on. The point is, my life would be unrecognizably different if not for several really painful situations that I decided to endure with the resolve to get really good at what I hated. Until I loved it.&lt;br /&gt;&lt;br /&gt;In retrospect, I seem to have been very lucky in many important situations. Of course, I have. But you make your own luck. Although I believe deeply in the idea of, “The harder I work, the luckier I get,” that is not what I’m talking about here. I’m talking about the power that you have to define for yourself whether something that happened was lucky for you or not. Your situations do not define your life. You &lt;em&gt;create&lt;/em&gt; your life based on how you regard your situations.&lt;br /&gt;&lt;br /&gt;I could have rebelled against Jimmy Harkey and hated math for the rest of my life. Lots of kids did. I could have rebelled against Lewis Parkhill and never become a writer. I could have refused Craig Newberger’s advice to take his second speech course and never become comfortable in front of an audience. I could have left Oracle in 1991 and found a job where they had more mature products....&lt;br /&gt;&lt;br /&gt;One of the most important questions that I ever asked my wife before our engagement was this:&lt;blockquote&gt;If you were forced to wash cars for 12 hours a day, just to make a living, could you &lt;em&gt;enjoy&lt;/em&gt; it?&lt;/blockquote&gt;This is a “soulmate” kind of question for me. My wife’s attitude about it is, for our children and me, possibly the most valuable gift in our lives.&lt;br /&gt;&lt;br /&gt;Loving what you do can be difficult. I think Denis hits the nail on the head by suggesting that,&lt;br /&gt;&lt;blockquote&gt;By doing good work, you just might find out that what you are doing, is what you are supposed to do. And if you don’t, quality work will get you to where you want to be.&lt;br /&gt;&lt;/blockquote&gt;I hope you will find love in what you do today. Do it well, and it’ll definitely improve your odds.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-3456464802362312645?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/3456464802362312645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=3456464802362312645' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3456464802362312645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3456464802362312645'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/12/do-what-you-love-mirage.html' title='The “Do What You Love” Mirage'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-6635483521165899619</id><published>2009-12-21T12:37:00.000-08:00</published><updated>2009-12-21T14:44:05.594-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='optimizing oracle performance'/><category scheme='http://www.blogger.com/atom/ns#' term='cmg'/><category scheme='http://www.blogger.com/atom/ns#' term='dave ensor'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>My Whole System Is Slow. Now What?</title><content type='html'>At &lt;a href="http://www.cmg.org/conference/cmg2009/"&gt;CMG'09&lt;/a&gt; a couple of weeks ago, I presented "Measuring Response Times of Code on Oracle Systems." The paper for this presentation was a subset of "&lt;a href="http://method-r.com/downloads/doc_details/10-for-developers-making-friends-with-the-oracle-database-cary-millsap"&gt;For Developers: Making Friends with the Oracle Database&lt;/a&gt;." In the presentation, I spent a few minutes talking about &lt;em&gt;why&lt;/em&gt; to measure response times in Oracle, and then I spent a lot of minutes talking about &lt;em&gt;how&lt;/em&gt;. As usual, I focused heavily on the importance of measuring response times of individual business tasks executed by individual end users.&lt;br /&gt;&lt;br /&gt;At the end of the talk, a group of people came to the podium to ask questions (always a good sign). The first question was the question that a lot of people ask. It was:&lt;blockquote&gt;My whole system is slow. That's all my users will tell me. So then, how do I begin to do what you're describing?&lt;/blockquote&gt;Here's the answer:&lt;blockquote&gt;Ask your users to &lt;em&gt;show&lt;/em&gt; you what they're doing. &lt;strong&gt;Just go look at it.&lt;/strong&gt;&lt;/blockquote&gt;The results of this simple advice are routinely spectacular. Just go look at it: I'm surprised whenever someone doesn't think of doing that, but I shouldn't be. That's because I didn't do it either, for the longest time. I had to &lt;em&gt;learn&lt;/em&gt; to. And that's the story I want to tell you here.&lt;br /&gt;&lt;br /&gt;In the early 1990s, I was a consultant with Oracle Corporation visiting clients with performance problems at a pace of more than 30 per year. Back then, I did Oracle performance work the old fashioned way: I checked everything I knew how to check, and then I fixed everything I knew how to fix. All billable by the hour. (Note: When I was doing it this way, I had not yet been taught by &lt;a href="http://www.dbazine.com/top-auth/top-auth-ensor/"&gt;Dave Ensor&lt;/a&gt;, who changed me forever.)&lt;br /&gt;&lt;br /&gt;On weeks when I was lucky, I'd be finished checking and fixing by sometime Wednesday, leaving a couple of days to find out what people thought of my work. If I were lucky again (that's two "lucky"s now), everyone would be thrilled with the results. I'd get my hug (so to speak), and I'd catch my flight.&lt;br /&gt;&lt;br /&gt;But I wasn't always lucky. Some weeks, I wouldn't find anything suspicious in my checking and fixing. Some weeks, I'd find plenty, but still not everyone would be thrilled with the work. Having people be less than thrilled with my work caused pain for me, which motivated me to figure out how to take more control of my consulting engagements, to drive luck out of the equation.&lt;br /&gt;&lt;br /&gt;The most important thing I figured out was...&lt;br /&gt;&lt;blockquote style="font-weight: bold;"&gt;People knew before I came on-site how they were going to measure on Thursday whether they liked the results of my work.&lt;br /&gt;&lt;/blockquote&gt;And...&lt;br /&gt;&lt;blockquote style="font-weight: bold;"&gt;They were willing to tell me on Monday.&lt;br /&gt;&lt;/blockquote&gt;All I had to do was be honest, like this:&lt;br /&gt;&lt;blockquote&gt;On the day I'm done working here, I'd imagine you're going to want to run something that will demonstrate whether I accomplished what you were hoping for while I was here. Would you mind telling me about that now? Maybe even showing me?&lt;br /&gt;&lt;/blockquote&gt;I could ask that on Monday, and people were glad to tell me. I'd watch the things run &lt;em&gt;and record how long they ran&lt;/em&gt;, and then I'd know how to prioritize my time on site. I'd record how long they ran so at the end of my engagement, I'd be able to show very clearly what improvements I had made.&lt;br /&gt;&lt;br /&gt;Sometimes, there would be thirty different things that people would expect to measure on Thursday. If I might not have time to fix them all, then I needed to make sure that I knew the priority of the things I was being asked to fix.&lt;br /&gt;&lt;br /&gt;That one step alone—knowing on Monday that &lt;em&gt;prioritized list&lt;/em&gt; of what tasks needed to be fast by Thursday—drastically reduced my reliance on luck as a success factor in my job at these sites. Knowing that list on Monday is just like when your teacher in school tells you exactly what's going to be on your next test. It allows you to focus your attention on exactly what you need to do to optimize your reward for the week. (Note to fellow education enthusiasts: Please don't interpret this paragraph as my advocating the idea that GPA should be a student's sole—or even dominant—optimization constraint.)&lt;br /&gt;&lt;br /&gt;So, what I learned is that the very first step of any good &lt;a href="http://method-r.com/faq/31-method-r/35-what-is-method-r"&gt;performance optimization method&lt;/a&gt; is necessarily this: &lt;blockquote&gt;1. Identify the task that's the most important to you.&lt;/blockquote&gt; When I say "task," think "program" or "click" or "batch job" if you want to. What I mean is "a useful unit of work that makes sense to the business." ...Something that a business user would show you if you just went and watched her work for a few minutes.&lt;br /&gt;&lt;br /&gt;Then comes step two: &lt;blockquote&gt;2. Measure its &lt;em&gt;response time&lt;/em&gt; (R). In detail.&lt;/blockquote&gt; Why is response time so important? Because that's what's important to the person who'll be watching it run on Thursday, assessing whether she thinks you've done a good job or not. That person's going to click and then wait. Happiness will be inversely proportional to how long the wait is. That's it. That's what "performance" means at 99% of sites I've ever visited.&lt;br /&gt;&lt;br /&gt;(If you're interested in the other 1% of sites I've visited, they're interested in &lt;a href="http://carymillsap.blogspot.com/search?q=throughput"&gt;throughput, which I've written about in another blog post&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;Measuring response time is vital. You must be able to measure response time if you're going to nail that test on Thursday.&lt;br /&gt;&lt;br /&gt;The key is to understand that the term &lt;em&gt;response time&lt;/em&gt; doesn't even have a definition except in the context of a task. You can't measure response time if you don't first decide what &lt;em&gt;task&lt;/em&gt; you're going to measure. In other words, you cannot do step 2 before you do step 1. With Oracle, for example, you can collect ASH data (if you're licensed to use it) or even trace data for a whole bunch of Oracle processes, but you won't have a single &lt;em&gt;response time&lt;/em&gt; until you define which tasks buried within that data are the ones you want to extract and pay attention to.&lt;br /&gt;&lt;br /&gt;You get that by visiting a user and watching what she does.&lt;br /&gt;&lt;br /&gt;There are lots of excuses for not watching your users. Like these...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"I don't know my users." I know. But you should. You'd do your job better if you did. And your users would, too.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;"My users aren't here." I know. They're on the web. They're in Chicago and Singapore and Istanbul, buying plane tickets or baseball caps or stock shares. But if you can't watch at least a simulation of the things those users actually do with the system you help manage, then I can't imagine how you would possibly succeed at providing good performance to them.&lt;/li&gt;&lt;li&gt;"I'm supposed to be able to manage performance with my dashboard." I know. I was supposed to have a hover car by the year 2000.&lt;/li&gt;&lt;/ul&gt;The longer you stay mired in excuses like these, the longer it's going to be before you can get the benefit of my point here. Your users are running something, and whatever that is that they're running is your version of my Thursday test. You can check and fix all you want, but unless you get lucky and fix the exact tooth that's hurting, your efforts aren't going to be perceived as "helpful." Checking and fixing everything you can think of is far less efficient and effective than targeting exactly what your user needs you to target.&lt;br /&gt;&lt;br /&gt;Lots of performance analysts (DBAs, developers, architects, sysadmins, and so on) assume that when someone says, "The whole system is slow," it means there must be a single parameter somewhere in the bowels of the system that needs adjustment, and if you can just make that adjustment, everything is going to be ok. It might mean that, but in my experience, the overwhelming majority of cases are not that way. (Pages 25–29 of &lt;a style="font-style: italic;" href="http://www.amazon.com/gp/product/059600527X?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=059600527X"&gt;Optimizing Oracle Performance&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=methodrcom-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=059600527X" alt="" style="border: medium none  ! important; margin: 0px ! important;" height="1" width="1" border="0" /&gt; has more information about this.)&lt;br /&gt;&lt;br /&gt;The great thing about measuring response time is that no matter what the problem is, you'll see it. If the program you're watching is poorly written, you'll see it. If some other program is hogging too much of a resource that your program needs, you'll see it. If you have a bad disk controller, you'll see it. If some parameter needs adjusting, you'll see it.&lt;br /&gt;&lt;br /&gt;Realize that when a business user says "system," she doesn't mean what you would mean if you said "system." She means that the thing she runs is slow. Look at that thing. Maybe there are seventeen of them. And sure, maybe all seventeen suffer from the same root cause. If that's the case, then fantastic, because fixing the first problem will magically fix the other sixteen, too. If it's not, then fantastic anyway, because now all of them are on your prioritized list of tasks to optimize, and you'll probably surprise yourself how quickly you'll be able to pick them all off when you focus on one task at a time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-6635483521165899619?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/6635483521165899619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=6635483521165899619' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/6635483521165899619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/6635483521165899619'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/12/my-whole-system-is-slow-now-what.html' title='My Whole System Is Slow. Now What?'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-7010239540520572128</id><published>2009-12-07T08:30:00.000-08:00</published><updated>2009-12-07T09:10:49.280-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='relational'/><category scheme='http://www.blogger.com/atom/ns#' term='christopher j date'/><title type='text'>C. J. Date: All Systems Go</title><content type='html'>Enrollment is open for the &lt;a href="http://method-r.com/education/107-cj-date-course"&gt;course taught by Christopher J. Date&lt;/a&gt; that we'll host 26–28 January in the Dallas/Fort Worth area. For many of us, this will be a once-in-a-lifetime opportunity to sit in a classroom for three days with one of the pioneers who created the field we live in each day.&lt;br /&gt;&lt;br /&gt;I'm looking forward to this course myself. It is so easy to use Oracle in non-relational ways. But not understanding how to use SQL &lt;em&gt;relationally&lt;/em&gt; leads to countless troubles and unnecessary complexities. Chris's focus in this course will be the discipline to use Oracle in a truly relational way, the mastery of which will make your applications faster, easier to prove, and more fun to write, maintain, and ehnance.&lt;br /&gt;&lt;br /&gt;I'm particularly looking forward to his section about missing values—the ages-old debate about NULL—which is not covered in &lt;a href="http://www.amazon.com/gp/product/0596523068?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596523068"&gt;Chris's book&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=methodrcom-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0596523068" alt="" style="border: medium none  ! important; margin: 0px ! important;" height="1" width="1" border="0" /&gt; upon which the course is based.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-7010239540520572128?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/7010239540520572128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=7010239540520572128' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/7010239540520572128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/7010239540520572128'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/12/c-j-date-all-systems-go.html' title='C. J. Date: All Systems Go'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-3542158230051717569</id><published>2009-12-03T07:06:00.001-08:00</published><updated>2009-12-03T07:26:41.096-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video browsing'/><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='buffering'/><category scheme='http://www.blogger.com/atom/ns#' term='latency'/><title type='text'>The Thing (I Don't Like) About Video</title><content type='html'>Video is awesome. I like high-bandwidth communication. Even on the cheapest, most un-produced videos, I can see facial expressions and body language that I'd never be able to pick up from text. I can see candidness that's not going to come through in a document, even a blog that's written pretty much off the cuff. And videos with high production value, ...well of course it's awesome to watch a great short movie right at the tips of your fingers.&lt;br /&gt;&lt;br /&gt;But...&lt;br /&gt;&lt;br /&gt;But when you send me a 7:48 video, I have to budget 7:48 to watch it. (Well, more actually, because of the latency required to buffer it up.) When you send me a 13-page document, I can "read" it in 10 seconds if I want to. I can skim the first and final paragraphs really quickly and look for pictures or sidebars or quotes, and it takes practically no time for me to do it.&lt;br /&gt;&lt;br /&gt;With a video, it's just more difficult to do that. I can watch the first 10 seconds and usually know whether I want to watch the remainder. But skimming through the whole video—like skipping to the end—is more difficult, because I have to sit there un-utilized while the whole video buffers up. Then I have to sit there while words come at me aurally, which is annoyingly sequential compared to reading buckets of text in one eyeful.&lt;br /&gt;&lt;br /&gt;So, the bottom line is that the first 10 seconds of your video need to convince me to watch the remainder.&lt;br /&gt;&lt;br /&gt;Or I won't.&lt;br /&gt;&lt;br /&gt;Is it just me?&lt;br /&gt;&lt;br /&gt;What's out there to make video browsing a better, more time-efficient, and more fulfilling experience?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-3542158230051717569?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/3542158230051717569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=3542158230051717569' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3542158230051717569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3542158230051717569'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/12/thing-i-dont-like-about-video.html' title='The Thing (I Don&apos;t Like) About Video'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-3059833452376392552</id><published>2009-11-20T06:36:00.000-08:00</published><updated>2009-11-20T14:30:05.099-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='sequence diagram'/><category scheme='http://www.blogger.com/atom/ns#' term='queue'/><category scheme='http://www.blogger.com/atom/ns#' term='embiggen'/><category scheme='http://www.blogger.com/atom/ns#' term='latency hiding'/><category scheme='http://www.blogger.com/atom/ns#' term='global entry'/><category scheme='http://www.blogger.com/atom/ns#' term='optimization'/><category scheme='http://www.blogger.com/atom/ns#' term='profiling'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><category scheme='http://www.blogger.com/atom/ns#' term='response time'/><category scheme='http://www.blogger.com/atom/ns#' term='critical path'/><category scheme='http://www.blogger.com/atom/ns#' term='abbatoir'/><title type='text'>Performance Optimization with Global Entry. Or Not?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mtpW1vu-FYo/SwcRMF0pbPI/AAAAAAAABdY/C5yk0NiHFp4/s1600/Brochure.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 213px; height: 320px;" src="http://3.bp.blogspot.com/_mtpW1vu-FYo/SwcRMF0pbPI/AAAAAAAABdY/C5yk0NiHFp4/s320/Brochure.jpg" alt="" id="BLOGGER_PHOTO_ID_5406308777100668146" border="0" /&gt;&lt;/a&gt;As I entered the 30-minute "U.S. Citizens" queue for immigration back into the U.S. last week, the helpful "queue manager" handed me a brochure. This is a great place to hand me something to read, because I'm captive for the next 30 minutes as I await my turn with the immigration officer at the Passport Control desk. The brochure said "Roll through Customs faster."&lt;br /&gt;&lt;br /&gt;Ok. I'm listening.&lt;br /&gt;&lt;br /&gt;Inside the brochure, the first page lays out the main benefits:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;bypass the passport lines&lt;/li&gt;&lt;li&gt;no paper Customs declaration&lt;/li&gt;&lt;li&gt;in most major U.S. airports&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Well, &lt;em&gt;that's&lt;/em&gt; pretty cool. Especially as I'm standing only 5% deep in a queue with a couple hundred people in it. And look, there's a Global Entry kiosk right there with its own special queue, with &lt;em&gt;nobody&lt;/em&gt;—nobody!—in it.&lt;br /&gt;&lt;br /&gt;If I had this Global Entry thing, I'd have a superpower that would enable me to zap past the couple hundred people in front of me, and get out of the Passport Control queue right now. Fantastic.&lt;br /&gt;&lt;br /&gt;So what does this thing cost? It's right there in the brochure:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Apply online at &lt;a href="http://www.globalentry.gov/"&gt;www.globalentry.gov&lt;/a&gt;. There is a non-refundable $100 application fee. Membership is valid for five years. That's $20 a year for the queue-bypassing superpower. Not bad. Still listening.&lt;/li&gt;&lt;li&gt;Schedule an in-person interview. Next, I have to book an appointment to meet someone at the airport for a brief interview.&lt;/li&gt;&lt;li&gt;Complete the interview and enrollment. I give my interview, get my photo taken, have my docs verified, and that's it, I'm done.&lt;/li&gt;&lt;/ol&gt;So, all in all, it doesn't cost too much: a hundred bucks and probably a couple hours one day next month sometime.&lt;br /&gt;&lt;br /&gt;What's the benefit of the queue-bypassing superpower? Well, it's clearly going to knock a half-hour off my journey through Passport Control. I immigrate three or four times per year on average, and today's queue is one of the shorter ones I've seen, so that's at least a couple hours per year that I'd save... Wow, that would be spectacular: a couple more hours each year in my family's arms instead of waiting like a lamb at the &lt;a href="http://www.ibras.dk/montypython/episode17.htm"&gt;abattoir&lt;/a&gt; to have my passport controlled.&lt;br /&gt;&lt;br /&gt;But getting me into my family's arms 30 minutes earlier is not really what happens. The problem is a kind of logic that people I meet get hung up in all the time. When you think about subsystem (or resource) optimization, it looks like your latency savings for the subsystem should go straight to your system's bottom line, but that's often not what happens. That's why &lt;strong&gt;I really don't care about subsystem optimization; I care about response time.&lt;/strong&gt; I could say that a thousand times, but my statement is too abstract to really convey what I mean unless you already know what I mean.&lt;br /&gt;&lt;br /&gt;What really happens in the airport story is this: if I had used Global Entry on my recent arrival, it would have saved me only a minute or two. Not half an hour, not even close.&lt;br /&gt;&lt;br /&gt;It sounds crazy, doesn't it? How can a service that cuts half an hour off my Passport Control time not get me home at least a half hour earlier?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_mtpW1vu-FYo/SwbwxYQf6_I/AAAAAAAABdQ/B-tZlIfQALo/s1600/sequence+diagram.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 315px;" src="http://1.bp.blogspot.com/_mtpW1vu-FYo/SwbwxYQf6_I/AAAAAAAABdQ/B-tZlIfQALo/s320/sequence+diagram.png" alt="" id="BLOGGER_PHOTO_ID_5406273133820767218" border="0" /&gt;&lt;/a&gt;You'll understand once I show you a &lt;a href="http://carymillsap.blogspot.com/search?q=sequence+diagram"&gt;sequence diagram&lt;/a&gt; of my arrival. Here it is (at right). You can click the image to &lt;a href="http://en.wikipedia.org/wiki/Lisa_the_Iconoclast"&gt;embiggen&lt;/a&gt; it, if you need.&lt;br /&gt;&lt;br /&gt;To read this sequence diagram, start at the top. Time flows downward. This sequence diagram shows two competing scenarios. The multicolored bar on the left-hand side represents the timeline of my actual recent arrival at &lt;a href="http://www.dfwairport.com/"&gt;DFW Airport&lt;/a&gt;, without using the Global Entry service. The right-hand timeline is what my arrival would have looked like had I been endowed with the Global Entry superpower.&lt;br /&gt;&lt;br /&gt;You can see at the very bottom of the timeline on the right that the time I would have saved with Global Entry is minuscule: only a minute or two.&lt;br /&gt;&lt;br /&gt;The real problem is easy to see in the diagram: Queue for Baggage Claim is the great equalizer in this system. No matter whether I'm a Global Entrant or not, I'm going to get my baggage when the good people outside with the Day-Glo Orange vests send it up to me. My status in the Global Entry system has absolutely no influence over what time that will occur.&lt;br /&gt;&lt;br /&gt;Once I've gotten my baggage, the Global Entry superpower would have again swung into effect, allowing me to pass through the zero-length queue at the Global Entry kiosk instead of waiting behind two families at the Customs queue. And that's the only net benefit I would have received.&lt;br /&gt;&lt;br /&gt;Wait: there were only two families in the Customs queue? What about the hundreds of people I was standing behind in the Passport Control queue? Well, many of them were gone already (either they had hand-carry bags only, or their bags had come off earlier than mine). Many others were still awaiting their bags on the Baggage Claim carousel. Because bags trickle out of the baggage claim process, there isn't the huge all-at-once surge of demand at Customs that there is at Passport Control when a plane unloads. So the queues are shorter.&lt;br /&gt;&lt;br /&gt;At any rate, there were four queues at Customs, and none of them was longer than three or four families. So the benefit of Global Entry—in exchange for the $100 and the time spent doing the interview—for me, this day, would have been only the savings of a couple of minutes.&lt;br /&gt;&lt;br /&gt;Now, if—&lt;em&gt;if&lt;/em&gt;, mind you—I had been able to travel with only carry-on luggage, then Global Entry would have provided me significantly more value. But when I'm returning to the U. S. from abroad, I'm almost never allowed to carry on any bag other than my briefcase. Furthermore, I don't remember  ever clearing Passport Control to find my bag waiting for me at Baggage Claim. So the typical benefit to me of enrolling in Global Entry, unfortunately, appears to be only a fraction of the duration required to clear Customs, which in my case is almost always approximately zero.&lt;br /&gt;&lt;br /&gt;The problem causing the low value (to me) of the Global Entry program is that the Passport Control resource &lt;a href="http://carymillsap.blogspot.com/search?q=latency+hiding"&gt;hides the latency&lt;/a&gt; of the Baggage Claim resource. No amount of tuning upon the Passport Control resource will affect the timing of the Baggage In Hand milestone; the time at which that milestone occurs is entirely independent of the Passport Control resource. And that milestone—as long as it occurs after I queue for Baggage Claim—is a direct determinant of when I can exit the airport. (&lt;a href="http://en.wikipedia.org/wiki/Gantt_chart"&gt;Gantt&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Program_Evaluation_and_Review_Technique"&gt;PERT&lt;/a&gt; chart optimizers would say that Queue for Baggage Claim is on the &lt;a href="http://en.wikipedia.org/wiki/Critical_path_method"&gt;critical path&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;How could a designer make the airport experience better for the customer? Here are a few ideas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Let me carry on more baggage. This idea would allow me to trot right through Baggage Claim without waiting for my bag. In this environment, the value of Global Entry would be tremendous. Well, nice theory; but allowing more carry-on baggage wouldn't work too well in the aggregate. The overhead bins on my flight were already stuffed to maximum capacity, and we don't need more flight delays induced by passengers who bring more stuff onboard than the cabin can physically accommodate.&lt;/li&gt;&lt;li&gt;Improve the latency of the baggage claim process. The sequence diagram shows clearly that this is where the big win is. It's easy to complain about baggage claim, because it's nearly always noticeably slower than we want it to be, and we can't see what's going on down there. Our imaginations inform us that there's all sorts of horrible waste going on.&lt;/li&gt;&lt;li&gt;Use &lt;a href="http://carymillsap.blogspot.com/search?q=latency+hiding"&gt;latency hiding&lt;/a&gt; to mask the pain of the baggage claim process. Put TV sets in the Baggage Claim area, and tune them to something interesting instead of infinite loops of advertising. At &lt;a href="http://en.wikipedia.org/wiki/Copenhagen_Airport"&gt;CPH&lt;/a&gt;, they have a &lt;a href="http://www.flickr.com/photos/10158913@N07/2929332893/"&gt;Danish hot dog&lt;/a&gt; stand in the baggage claim area. They also have a currency exchange office in there. Excellent latency hiding ideas if you need a snack or some &lt;a href="http://en.wikipedia.org/wiki/USD"&gt;&lt;/a&gt;&lt;a href="http://en.wikipedia.org/wiki/DKK"&gt;DKK&lt;/a&gt; walkin'-around-money.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Latency hiding is a weak substitute for improving the speed of the baggage claim process. The killer app would certainly be to make Baggage Claim faster. Note, however, that just making Baggage Claim a little bit faster wouldn't make the Global Entry program any more valuable. To make Global Entry any more valuable, you'd have to make Baggage Claim fast enough that your bag would be waiting for anyone who cleared the full Passport Control queue.&lt;br /&gt;&lt;br /&gt;So, my message today: &lt;strong&gt;When you optimize, you must first know your goal.&lt;/strong&gt; So many people optimize subsystems (resources) that they think are important, but optimizing subsystems is often not a path to optimizing what you really want. At the airport, I really don't give a rip about getting out of the Passport Control queue if it just means I'm going to be dumped earlier into a room where I'll have to wait until an affixed time for my baggage.&lt;br /&gt;&lt;br /&gt;Once you know what your real optimization goal is (that's &lt;a href="http://carymillsap.blogspot.com/search/label/Method%20R"&gt;Method R step 1&lt;/a&gt;), then the sequence diagram is often all you need to get your breakthrough insight that either helps you either (a) solve your problem or (b) understand when there's nothing further that you can really do about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-3059833452376392552?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/3059833452376392552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=3059833452376392552' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3059833452376392552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3059833452376392552'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/11/performance-optimization-with-global.html' title='Performance Optimization with Global Entry. Or Not?'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_mtpW1vu-FYo/SwcRMF0pbPI/AAAAAAAABdY/C5yk0NiHFp4/s72-c/Brochure.jpg' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-2257140535438897952</id><published>2009-11-12T06:51:00.000-08:00</published><updated>2009-11-12T09:17:23.141-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='system performance group'/><category scheme='http://www.blogger.com/atom/ns#' term='optimizing oracle performance'/><category scheme='http://www.blogger.com/atom/ns#' term='global steering committee'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Why We Made Method R</title><content type='html'>Twenty years ago (well, a month or so more than that), I entered the Oracle ecosystem. I went to work as a consultant for Oracle Corporation in September 1989. Before Oracle, I had been a language designer and compiler developer. I wrote code in &lt;a href="http://en.wikipedia.org/wiki/Lex_%28software%29"&gt;lex&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Yacc"&gt;yacc&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/C_%28programming_language%29"&gt;C&lt;/a&gt; for a living. My responsibilities had also included improving other people's C code: making it more reliable, more &lt;a href="http://www.amazon.com/gp/product/0136859674?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0136859674"&gt;portable&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=methodrcom-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0136859674" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;, easier to read, easier to prove, and easier to maintain; and it was my job to teach other people in my department how to do these things themselves. I loved all of these duties.&lt;br /&gt;&lt;br /&gt;In 1987, I decided to leave what I loved for a little while, to earn an MBA. Fortunately, at that time, it was possible to earn an MBA in a year. After a year of very difficult work, I had my degree and a new perspective on business. I interviewed with Oracle, and about a week later I had a job with a company that a month prior I had never heard of.&lt;br /&gt;&lt;br /&gt;By the mid-1990s, circumstances and my natural gravity had matched to create a career in which I was again a software developer, optimizer, and teacher. By 1998, I was the manager of a group of 85 performance specialists called the System Performance Group (SPG). And I was the leader of the system architecture and system management consulting service line within Oracle Consulting's Global Steering Committee.&lt;br /&gt;&lt;br /&gt;My job in the SPG role was to respond to all the system performance-related issues in the USA for Oracle's largest accounts. My job in the Global Steering Committee was to package the success of SPG so that other practices around the world could repeat it. The theory was that if a country manager in, say, Venezuela, wanted his own SPG, then he could use the financial models, budgets, hiring plans, training plans, etc. created by my steering committee group. Just add water.&lt;br /&gt;&lt;br /&gt;But there was a problem. My own group of 85 people consisted of two very different types of people. About ten of these 85 people were spectacularly successful optimizers whom I could send anywhere with confidence that they'd thrive at either improving &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mtpW1vu-FYo/SvwsIjUq3ZI/AAAAAAAABb4/LaNOiyOGXOE/s1600-h/pyramid.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 92px;" src="http://3.bp.blogspot.com/_mtpW1vu-FYo/SvwsIjUq3ZI/AAAAAAAABb4/LaNOiyOGXOE/s200/pyramid.png" alt="" id="BLOGGER_PHOTO_ID_5403242178370264466" border="0" /&gt;&lt;/a&gt;performance or proving that performance improvements weren't possible. The other 75 were very smart, very hard-working people who would grow into the tip of my pyramid over the course of more years, but they weren't there yet.&lt;br /&gt;&lt;br /&gt;The problem was, how to you convert good, smart, hard-working people in the base of the SPG pyramid into people in the tip? The practice manager in Venezuela would need to know that. The answer, of course, is supposed to be the Training Plan. Optimally, the Training Plan consists of a curriculum of a few courses, a little on-the-job training, and then, presto: tip of the pyramid. Just add water.&lt;br /&gt;&lt;br /&gt;But unfortunately that wasn't the way things worked. What I had been getting instead, within my own elite group, was a &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_mtpW1vu-FYo/Svwx4EaK1HI/AAAAAAAABcQ/DGpA2IVCZgU/s1600-h/goal-reality.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 151px; height: 253px;" src="http://1.bp.blogspot.com/_mtpW1vu-FYo/Svwx4EaK1HI/AAAAAAAABcQ/DGpA2IVCZgU/s200/goal-reality.png" alt="" id="BLOGGER_PHOTO_ID_5403248492263691378" border="0" /&gt;&lt;/a&gt;process that took many years to convert a smart, hard-working person  into a reasonably reliable performance optimizer whom you could send anywhere. Worse yet, the peculiar stresses of the job—like being away from home 80% of the time, and continually visiting angry people each week, having to work for &lt;em&gt;me&lt;/em&gt;—caused an outflow of talent that approximately equaled the inflow of people who made it to the tip of the pyramid. The tip of my pyramid never grew beyond roughly 10 people.&lt;br /&gt;&lt;br /&gt;The problem, by definition, was the Training Plan. It just wasn't good enough. It wasn't that the instructors of Oracle's internal "tuning" courses were doing a poor job of teaching courses. And it wasn't that the course developers had done a poor job of creating courses. On the contrary, the instructors and course developers were doing excellent work. The problem was that the courses were focusing on the wrong thing. The reason that the courses weren't getting the job done was that &lt;strong&gt;the very subject matter that needed teaching hadn't been invented yet&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;I expect that the people who write, say, the course called "Braking System Repair for Boeing 777" to have themselves invented the braking system they write about. So, the question was, who should be responsible for inventing the subject matter on how to optimize Oracle? I decided that I wanted that person to be &lt;em&gt;me&lt;/em&gt;. I deliberated carefully and decided that my best chance of doing that the way I wanted to do it would be outside of Oracle. So in October 1999, ten years and one week after I joined the company, I left Oracle with the vision of creating a repeatable, teachable method for optimizing Oracle systems.&lt;br /&gt;&lt;br /&gt;Ten years later, this is still the vision for my company, Method R Corporation. We exist not to make your system faster. We exist to make &lt;em&gt;you&lt;/em&gt; faster at making &lt;em&gt;all&lt;/em&gt; your system&lt;em&gt;s&lt;/em&gt; faster. Our work is far from done, but here is what we &lt;em&gt;have&lt;/em&gt; done:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Written &lt;a href="http://method-r.com/downloads"&gt;white papers&lt;/a&gt; and &lt;a href="http://method-r.com/faq"&gt;other articles&lt;/a&gt; that explain Method R to you at no cost.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Written a book called &lt;a href="http://www.amazon.com/gp/product/059600527X?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=059600527X"&gt;Optimizing Oracle Performance&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=methodrcom-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=059600527X" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;, where you can learn Method R at a low cost.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Created a &lt;a href="http://method-r.com/education/43-education/99-oracle-performance-management-using-response-time-profiling"&gt;Method R course&lt;/a&gt; (on which the book is based), to teach you how to diagnose and repair response time problems in Oracle-based systems.&lt;/li&gt;&lt;li&gt;Spoken at &lt;a href="http://method-r.com/services/speaking"&gt;hundreds of public and private events&lt;/a&gt; where we help people understand performance and how to manage it.&lt;/li&gt;&lt;li&gt;Provided &lt;a href="http://method-r.com/services/consulting"&gt;consulting services&lt;/a&gt; to make people awesome at making their systems faster and more efficient.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Created the first &lt;a href="http://method-r.com/software/profiler/profiler-features"&gt;response time profiling software&lt;/a&gt; ever for Oracle software applications, to let you analyze hundreds of megabytes of data without drudgery.&lt;/li&gt;&lt;li&gt;Created a &lt;a href="http://method-r.com/software/ilo"&gt;free instrumentation library&lt;/a&gt; so that you can instrument the response times of Oracle-based software that you write.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Created &lt;a href="http://method-r.com/software/mrtools"&gt;software tools&lt;/a&gt; to help you be awesome at extracting every drop of information that your Oracle system is willing to give you about your response times.&lt;/li&gt;&lt;li&gt;Created a &lt;a href="http://method-r.com/software/slam"&gt;software tool&lt;/a&gt; that enables you to record the response time of every business task that runs on your system so you can effortlessly manage end-user performance.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;As I said, our work is far from done. It's work that really, really matters to us, and it's work we love doing. I expect it to be a journey that will last long into the future. I hope that our journey will intersect with yours from time to time, and that you will enjoy it when it does.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-2257140535438897952?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/2257140535438897952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=2257140535438897952' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2257140535438897952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2257140535438897952'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/11/why-we-made-method-r.html' title='Why We Made Method R'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_mtpW1vu-FYo/SvwsIjUq3ZI/AAAAAAAABb4/LaNOiyOGXOE/s72-c/pyramid.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-4134015561145687784</id><published>2009-11-08T21:44:00.001-08:00</published><updated>2009-11-09T21:26:06.902-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='latency hiding'/><category scheme='http://www.blogger.com/atom/ns#' term='airport'/><category scheme='http://www.blogger.com/atom/ns#' term='james morle'/><title type='text'>Latency Hiding</title><content type='html'>A few weeks ago, James Morle posted an article called "&lt;a href="http://jamesmorle.wordpress.com/2009/09/28/latency-hiding-for-fun-and-profit/" target="_blank"&gt;Latency hiding for fun and profit&lt;/a&gt;." Latency hiding one of the fundamental skills that, I believe, distinguishes the people who are Really On The Ball from the people who Just Don't Get It.&lt;br /&gt;&lt;br /&gt;Last night, I was calling to &lt;a href="http://carymillsap.blogspot.com/2009/06/profiling-with-my-boy.html"&gt;my 12-year old boy Alex&lt;/a&gt; to come look at something I wanted him to see my computer. At the same time, his mom was reminding him to hurry up if he wanted something to eat, because he only had five minutes before he had to head up to his bedroom. "Alex, come &lt;em&gt;here&lt;/em&gt;," I told him, putting a little extra pressure on him. "Just a second, Dad." I looked up and notice that he was unwrapping his ready-made ham and cheese sandwich that he had gotten out of the freezer. He dropped it into the microwave and initiated its two-minute ride, and then he came over to spend two minutes looking at my computer with me while his sandwich cooked. Latency hiding. Excellent.&lt;br /&gt;&lt;br /&gt;James's blog helped me put a name to a game that I realize that I play very, very often. Today, I realized that I play the latency hiding game every time I go through an airport security checkpoint. How you lay your stuff on the X-ray machine conveyor belt determines how long you're going to spend getting your stuff off on the other side. So, while I'm queued for the X-ray, I figure out how to optimize my exit once I get through to the other side.&lt;br /&gt;&lt;br /&gt;When I travel every week, I don't really have to think too much about it; I just do the same thing I did a few days ago. When I haven't been through an airport for a while, I go through it all in my mind a little more carefully. And of course, airport rules change regularly, which adds a little spice to the analysis. Some airports require me to carry my boarding pass through the metal detector; others don't. Some airports let me keep my shoes on. Some airports let me keep my computer in my briefcase.&lt;br /&gt;&lt;br /&gt;Today, the rules were:&lt;ul&gt;&lt;li&gt;I had my briefcase and my carry-on suitcase.&lt;/li&gt;&lt;li&gt;Boarding pass can go back into the briefcase.&lt;/li&gt;&lt;li&gt;Shoes off.&lt;/li&gt;&lt;li&gt;1-quart ziplock back of liquids and gels: out.&lt;/li&gt;&lt;li&gt;MacBook: out.&lt;/li&gt;&lt;/ul&gt;Here's how I put my things onto the belt, optimized for latency hiding. I grabbed two plastic boxes and loaded the belt this way:&lt;ol&gt;&lt;li&gt;Plastic box with shoes and ziplock bag.&lt;/li&gt;&lt;li&gt;Suitcase.&lt;/li&gt;&lt;li&gt;Plastic box with MacBook.&lt;/li&gt;&lt;li&gt;Briefcase.&lt;/li&gt;&lt;/ol&gt;That way, when I cleared the metal detector, I could perform the following operations in this order:&lt;ol&gt;&lt;li&gt;Box with shoes and ziplock bag arrive.&lt;/li&gt;&lt;li&gt;Put my shoes on.&lt;/li&gt;&lt;li&gt;Take the ziplock bag out of the plastic box.&lt;/li&gt;&lt;li&gt;Suitcase arrives.&lt;/li&gt;&lt;li&gt;Put the ziplock bag back into my suitcase.&lt;/li&gt;&lt;li&gt;Box with MacBook arrives.&lt;/li&gt;&lt;li&gt;Take my MacBook out.&lt;/li&gt;&lt;li&gt;Stack the two boxes for the attendant.&lt;/li&gt;&lt;li&gt;Briefcase arrives.&lt;/li&gt;&lt;li&gt;Put the MacBook into the briefcase.&lt;/li&gt;&lt;li&gt;Get the heck out of the way.&lt;/li&gt;&lt;/ol&gt;Latency hiding helps me exit a slightly uncomfortable experience a little more quickly, and it helps me cope with time spent queueing—a process that's difficult to enjoy—for a process that's itself difficult to enjoy.&lt;br /&gt;&lt;br /&gt;I don't know what a lot of the other people in line are thinking while they're standing there for their 15 minutes, watching 30 people ahead of them go through the same process they'll soon endure, 30 identical times. Maybe it's finances or football or cancer or just their own discomfort from being in unusual surroundings. For me, it's usually latency hiding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-4134015561145687784?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/4134015561145687784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=4134015561145687784' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/4134015561145687784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/4134015561145687784'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/11/latency-hiding.html' title='Latency Hiding'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-2659072998657918794</id><published>2009-09-24T00:01:00.000-07:00</published><updated>2009-09-24T00:01:01.088-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='birthday'/><category scheme='http://www.blogger.com/atom/ns#' term='OFA'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Happy Birthday, OFA Standard</title><content type='html'>Yesterday I finally posted to the &lt;a href="http://ow.ly/qNTO"&gt;Method R website&lt;/a&gt; some of the papers I wrote while I was at Oracle Corporation (1989–1999)&lt;a href="http://ow.ly/qNTO"&gt;&lt;/a&gt;. You can now find these papers where &lt;em&gt;I am&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;When I was uploading my &lt;a href="http://method-r.com/downloads/doc_details/13-the-ofa-standardoracle-for-open-systems-cary-millsap"&gt;OFA Standard&lt;/a&gt; paper, I noticed that today—24 September 2009—is the fourteenth birthday of its publication date. So, even though the original OFA paper was around for a few years before 1995, please join me in celebrating the birthday of the final version of the official OFA Standard document.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-2659072998657918794?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/2659072998657918794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=2659072998657918794' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2659072998657918794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2659072998657918794'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/09/happy-birthday-ofa-standard.html' title='Happy Birthday, OFA Standard'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-7343479007844782019</id><published>2009-09-16T13:32:00.000-07:00</published><updated>2009-09-16T20:06:31.548-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='resolution'/><category scheme='http://www.blogger.com/atom/ns#' term='optimizing oracle performance'/><category scheme='http://www.blogger.com/atom/ns#' term='diagnosis'/><category scheme='http://www.blogger.com/atom/ns#' term='grocery shopping'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><category scheme='http://www.blogger.com/atom/ns#' term='fundamentals of software performance'/><title type='text'>On the Importance of Diagnosing Before Resolving</title><content type='html'>Today a reader posted a question I like at our &lt;a href="http://method-r.com/" target="_blank"&gt;Method R website&lt;/a&gt;. It's about the story I tell in the article called, "&lt;a href="http://method-r.com/faq/31-method-r/44-can-you-explain-method-r" target="_blank"&gt;Can you explain Method R so even my boss could understand it?&lt;/a&gt;" The story is about sending your son on a shopping trip, and it takes him too long to complete the errand. The point is that an excellent way to fix any kind of performance problem is to profile the response time for the properly chosen task, which is the basis for &lt;a href="http://method-r.com/faq/31-method-r/35-what-is-method-r"&gt;Method R&lt;/a&gt; (both the method and the company).&lt;br /&gt;&lt;br /&gt;Here is the profile that details where the boy's time went during his errand:&lt;pre&gt;                    --Duration---&lt;br /&gt;Subtask             minutes     %  Executions&lt;br /&gt;------------------  -------  ----  ----------&lt;br /&gt;Talk with friends        37   62%           3&lt;br /&gt;Choose item              10   17%           5&lt;br /&gt;Walk to/from store        8   13%           2&lt;br /&gt;Pay cashier               5    8%           1&lt;br /&gt;------------------  -------  ----  ----------&lt;br /&gt;Total                    60  100%&lt;br /&gt;&lt;/pre&gt;I went on to describe that the big leverage in this profile is the elimination of the subtask called "Talk with friends," which will reduce response time by 62%.&lt;br /&gt;&lt;br /&gt;The interesting question that a reader posted is this:&lt;blockquote&gt;Not sure this is always the right approach. For example, lets imagine the son has to pick 50 items&lt;br /&gt;Talk 3 times &lt;strong&gt;37&lt;/strong&gt; minutes&lt;br /&gt;Choose item 50 times &lt;strong&gt;45&lt;/strong&gt; minutes&lt;br /&gt;Walk 2 times 8 minutes&lt;br /&gt;Pay 1 time 5 minutes&lt;br /&gt;Working on "choose item" is maybe not the right thing to do...&lt;/blockquote&gt;Let's explore it. Here's what the profile would look like if this were to happen:&lt;br /&gt;&lt;pre&gt;          --Duration---&lt;br /&gt;Subtask   minutes     %  Executions&lt;br /&gt;-------   -------  ----  ----------&lt;br /&gt;Choose         45   47%          50&lt;br /&gt;Talk           37   39%           3&lt;br /&gt;Walk            8    8%           2&lt;br /&gt;Pay             5    5%           1&lt;br /&gt;-------   -------  ----  ----------&lt;br /&gt;Total          95  100%&lt;br /&gt;&lt;/pre&gt;The point of the inquiry is this:&lt;br /&gt;&lt;blockquote&gt;The right answer in this case, too, is to begin with eliminating Talk from the profile. That's because, even though it's not ranked at the very top of the profile, Talk is completely unnecessary to the real goal (grocery shopping). It's a time-waster that simply shouldn't be in the profile. At all. But with Cary's method of addressing the profile from the top downward, you would instead focus on the "Choose" line, which is the wrong thing.&lt;br /&gt;&lt;/blockquote&gt;In  chapters 1 through 4 of &lt;a href="http://method-r.com/component/content/article/109-books" target="_blank"&gt;our book about Method R for Oracle&lt;/a&gt;, I explained the method much more thoroughly than I did in the very brief article. In my brevity, I skipped past an important point. Here's a summary of the Method R steps for diagnosing and resolving performance problems using a profile:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;(Diagnosis phase) For each subtask (row in the profile), visiting subtasks in order of descending duration...&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Can you eliminate any executions without sacrificing required function?&lt;/li&gt;&lt;li&gt;Can you improve (reduce) individual execution latency?&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;(Resolution phase) Choose the candidate solution with the best net value (that is, the greatest value of benefit minus cost).&lt;/li&gt;&lt;/ol&gt;Here's a narrative of executing the steps of the diagnostic phase, one at a time, upon the new profile, which—again—is this:&lt;br /&gt;&lt;pre&gt;          --Duration---&lt;br /&gt;Subtask   minutes     %  Executions&lt;br /&gt;-------   -------  ----  ----------&lt;br /&gt;Choose         45   47%          50&lt;br /&gt;Talk           37   39%           3&lt;br /&gt;Walk            8    8%           2&lt;br /&gt;Pay             5    5%           1&lt;br /&gt;-------   -------  ----  ----------&lt;br /&gt;Total          95  100%&lt;/pre&gt;&lt;ol&gt;&lt;li&gt;Execution elimination for the Choose subtask: If you really need all 50 items, then no, you can't eliminate any Choose executions.&lt;/li&gt;&lt;li&gt;Latency optimization for the Choose subtask: Perhaps you could optimize the mean latency (which is .9 minutes per item). My wife does this. For example, she knows better where the items in the store are, so she spends less time searching for them. (I, on the other hand, can get lost in my own shower.) If, for example, you could reduce mean latency to, say, .8 minutes per item by giving your boy a map, then you could save (.9 – .8) × 50 = 5 minutes (5%). (Note that we don't &lt;em&gt;execute&lt;/em&gt; the solution yet; we're just diagnosing right now.)&lt;/li&gt;&lt;li&gt;Execution elimination for the Talk subtask: Hmm, seems to me like if your true goal is fast grocery shopping, then you don't need your boy executing any of these 3 Talk events. Proposed time savings: 37 minutes (39%).&lt;/li&gt;&lt;li&gt;Latency optimization for the Talk subtask: Since you can eliminate all Talk calls, no need to bother thinking about latency reduction. ...Unless you're prey to some external constraint (like social advancement, say, in attempt to maximize your probability of having rich and beautiful grandchildren someday), in which case you should think about latency reduction instead of execution elimination.&lt;/li&gt;&lt;li&gt;Execution elimination for the Walk subtask: Well, the boy has to get there, and he has to get back, so this "executions=2" figure looks optimal. (Those Oracle applications we often see that process one row per network I/O call would have 50 Walk executions, one for each Choose call.)&lt;/li&gt;&lt;li&gt;Latency optimization for the Walk subtask: Walking takes 4 minutes each way. Driving might take less time, but then again, it might actually take even more. Will driving introduce new dependent subtasks? Warm Up? Park? De-ice? Even driving doesn't eliminate &lt;em&gt;all&lt;/em&gt; the walking... Plus, there's not a lot of leverage in optimizing Walk, because it accounts for only 8% of total response time to begin with, so it's not worth a whole lot of bother trying to shave it down by some marginal proportion, especially since inserting a car into your life (or letting your boy drive yours) is no trivial matter.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Execution elimination for the Pay subtask: The execution count on Pay is already optimized down to the legally required minimum. No real opportunity for improvement here without some kind of radical architecture change.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Latency optimization for the Pay subtask: It takes 5 minutes to Pay? That seems a bit much. So you should look at the payment process. Or should you? Even if you totally eliminate Pay from the profile, it's only going to save 5% of your time. But, if every minute counts, then yes, you look at it. ...Especially if there might be an easy way to improve it. If the benefit comes at practically no cost, then you'll take it, even if the benefit is only small. So, imagine that you find out that the reason Pay was so slow is that it was executed by writing a check, which required waiting for store manager approval. Using cash or a credit/debit card might improve response time by, say, 4 minutes (4%).&lt;/li&gt;&lt;/ol&gt;Now you're done assessing the effects of (1) execution elimination and (2) latency reduction for each line in the profile. That ends the diagnostic phase of the method. The next step is the resolution phase: to determine which of these candidate solutions is the best. Given the analysis I've walked you through, I'd rank the candidate solutions in this order:&lt;ol&gt;&lt;li&gt;Eliminate all 3 executions of Talk. That'll save 37 minutes (39%), and it's easy to implement; you don't have to buy a car, apply for a credit card, train the boy how to shop faster, or change the architecture of how shopping works. You can simply discard the "requirement" to chat, or you can specify that it be performed only during non-errand time windows.&lt;/li&gt;&lt;li&gt;Optimize Pay latency by using cash or a card, if it's easy enough to give your boy access to cash or a card. That will save 4 minutes, which—by the way—will be a more important proportion of the total errand time after you eliminate all the Talk executions.&lt;/li&gt;&lt;li&gt;Finally, consider optimizing Choose latency. Maybe giving your son a map of the store will help. Maybe you should print your grocery list more neatly so he can read it without having to ask for help. Maybe by simply sending him to the store more often, he'll get faster as his familiarity with the place improves.&lt;/li&gt;&lt;/ol&gt;That's it.&lt;br /&gt;&lt;br /&gt;So the point I want to highlight is  this:&lt;br /&gt;&lt;blockquote&gt;I'm &lt;em&gt;not&lt;/em&gt; saying you should stick to the top line of your profile until you've absolutely conquered it.&lt;br /&gt;&lt;/blockquote&gt;It is important to pass completely through your profile to construct your set of candidate solutions. Then, on a separate pass, you evaluate those candidate solutions to determine which ones you want to implement, and in what order. That first full pass is key. You have to do it for Method R to be &lt;em&gt;reliable&lt;/em&gt; for solving any performance problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-7343479007844782019?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/7343479007844782019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=7343479007844782019' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/7343479007844782019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/7343479007844782019'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/09/on-importance-of-diagnosing-before.html' title='On the Importance of Diagnosing Before Resolving'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-6096993294440708773</id><published>2009-08-31T12:04:00.001-07:00</published><updated>2009-08-31T14:26:53.582-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gigabyte'/><category scheme='http://www.blogger.com/atom/ns#' term='mac os x'/><category scheme='http://www.blogger.com/atom/ns#' term='snow leopard'/><category scheme='http://www.blogger.com/atom/ns#' term='ieee 1541'/><category scheme='http://www.blogger.com/atom/ns#' term='gibibyte'/><category scheme='http://www.blogger.com/atom/ns#' term='disk space'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>How much disk space did Snow Leopard really save?</title><content type='html'>Like apparently hundreds of thousands of others, I upgraded my machines running Mac OS X from version 10.5 (Leopard) to 10.6 (Snow Leopard) last Friday. I'm now a Snow Leopard user, and I like it just fine.&lt;br /&gt;&lt;br /&gt;I was excited about this upgrade, because I love the notion that the people who released it care about optimizing the performance of my system. One of the optimizations I looked forward to was reclaiming over 6 GB of disk space after the upgrade (see Bertrand Serlet's announcement at 00:20:48 to 00:21:11 in the &lt;a href="http://events.apple.com.edgesuite.net/0906paowdnv/event/index.html?internal=ijalrmacu"&gt;WWDC 2009 keynote video&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Lots of people in the Twittersphere were excited about the space savings, too. Before I upgraded, I checked to see &lt;a href="http://twitter.com/#search?q=%22Snow%20Leopard%22"&gt;what people were tweeting&lt;/a&gt;, just to make sure I wasn't about to walk off a cliff. Many people mentioned tremendous disk space savings that were well in excess of the 6 GB that Apple promised. Pretty exciting.&lt;br /&gt;&lt;br /&gt;We have two Mac computers. Here's how the savings went for us:&lt;pre&gt;Mac #1      10.5      10.6      Savings&lt;br /&gt;-------  ---------  ---------  ---------&lt;br /&gt;Total    148.73 GB  159.70 GB&lt;br /&gt;Free      47.70 GB   59.71 GB   12.01 GB&lt;br /&gt;&lt;br /&gt;Mac #2      10.5      10.6      Savings&lt;br /&gt;-------  ---------  ---------  ---------&lt;br /&gt;Total    185.99 GB  199.71 GB&lt;br /&gt;Free      68.66 GB   83.95 GB   15.29 GB&lt;br /&gt;&lt;/pre&gt;So, ...wow, we saved over twice as much space as Apple had advertised. But there's a curiosity in the numbers. Do you see it? How did my total capacity get bigger as the result of a software upgrade? The answer is that my capacity didn't really get bigger; it's just that Apple now measures disk space differently in 10.6.&lt;br /&gt;&lt;br /&gt;I knew this was coming because of this article called "&lt;a href="http://www.pcworld.com/businesscenter/article/170979/snow_leopards_new_math.html"&gt;Snow Leopard's New Math&lt;/a&gt;." Snow Leopard still uses the abbreviation "GB" to refer, now, to 10&lt;sup&gt;9&lt;/sup&gt; bytes, whereas, before, Leopard used the abbreviation "GB" to refer to 2&lt;sup&gt;30&lt;/sup&gt; bytes. The problem, see, is that 10&lt;sup&gt;9&lt;/sup&gt; ≠ 2&lt;sup&gt;30&lt;/sup&gt;. In fact, 2&lt;sup&gt;30&lt;/sup&gt; is bigger. So in Snow Leopard, Apple is dividing by a smaller unit than it used to, which results in disk capacities and file sizes looking bigger than they used to. (Here's &lt;a href="http://blog.macsales.com/1852-snow-leopard-changes-they-way-we-look-at-gigabytes-and-megabytes-and-kilobytes-as-well"&gt;a good article about that&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;It is misleading that Apple used the same abbreviation—"GB"—to refer to two different units of measure. However, Apple is well justified in using "GB" in Snow Leopard. &lt;a href="http://en.wikipedia.org/wiki/IEEE_1541"&gt;IEEE 1541-2002&lt;/a&gt; says the right abbreviations would have been "GiB" (gibibytes) in 10.5 and "GB" (gigabytes) in 10.6. By that standard, Snow Leopard is right, and Leopard was wrong. All's well that ends well, I suppose.&lt;br /&gt;&lt;br /&gt;Now, back to the space savings question. How much space did I really save when I upgraded to Snow Leopard? To answer that, I need to convert one of the two columns in my analysis (labeled "10.5" and "10.6") to the other column's unit, so I can subtract. Since when I watched the WWDC keynote film, my mindset was of 10.5-style "gigabytes" (properly &lt;em&gt;gibibytes&lt;/em&gt;), I'll convert to GiB. Here's the answer:&lt;br /&gt;&lt;pre&gt;Mac #1      10.5        10.6      Savings&lt;br /&gt;-------  ----------  ----------  ---------&lt;br /&gt;Total    148.73 GiB  148.73 GiB&lt;br /&gt;Free      47.70 GiB   55.61 GiB   7.91 GiB&lt;br /&gt;&lt;br /&gt;Mac #2      10.5        10.6      Savings&lt;br /&gt;-------  ----------  ----------  ---------&lt;br /&gt;Total    185.99 GiB  185.99 GiB&lt;br /&gt;Free      68.66 GiB   78.18 GiB   9.52 GiB&lt;br /&gt;&lt;/pre&gt;That's still spectacular, and I'm plenty happy with it. I have basically bought a whole bunch of performance enhancements &lt;em&gt;and&lt;/em&gt; 17 GiB of disk space for $49 plus tax (I bought the Snow Leopard upgrade family pack). I think that's a pretty good deal.&lt;br /&gt;&lt;br /&gt;This whole story reminded me of the old days when I used to install Oracle for a living. People would buy, say, a brand-new 100,000,000-byte disk drive and then be upset when the &lt;em&gt;df&lt;/em&gt; utility showed considerably less than 100 "MB" of free space. Part of the explanation was that &lt;em&gt;df&lt;/em&gt; reported in mibibytes, not millions of bytes.&lt;br /&gt;&lt;br /&gt;It's interesting to note that in Snow Leopard, &lt;em&gt;df -h&lt;/em&gt; now reports in Bi/Ki/Mi/Gi units, and &lt;em&gt;df -H&lt;/em&gt; reports in B/K/M/G units (defined as IEEE 1541 defines them). Smart.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-6096993294440708773?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/6096993294440708773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=6096993294440708773' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/6096993294440708773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/6096993294440708773'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/08/how-much-disk-space-did-snow-leopard.html' title='How much disk space did Snow Leopard really save?'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-3886804619223874406</id><published>2009-07-02T12:20:00.001-07:00</published><updated>2009-07-02T12:26:06.807-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='quick reference card'/><category scheme='http://www.blogger.com/atom/ns#' term='fundamentals of software performance'/><title type='text'>Fundamentals of Software Performance Quick Reference Card</title><content type='html'>I just posted &lt;a href="http://method-r.com/downloads/doc_details/12-fundamentals-of-software-performance-quick-reference-card" target="_blank"&gt;"Fundamentals of Software Performance Quick Reference Card"&lt;/a&gt; at the &lt;a href="http://method-r.com/" target="_blank"&gt;Method R company website&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;This two-page quick reference card written by Cary Millsap sums up computer software performance the Method R way. The first page lists definitions of the terms you need to know: efficiency, knee, load, response time, and so on. The second page lists ten principles that are vital to your ability to think clearly about software performance. This document contains meaningful insight in a format that's compact enough to hang on your wall.&lt;br /&gt;&lt;/blockquote&gt;It's free, and there's no sign-up required. I hope you will enjoy it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-3886804619223874406?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/3886804619223874406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=3886804619223874406' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3886804619223874406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3886804619223874406'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/07/fundamentals-of-software-performance.html' title='Fundamentals of Software Performance Quick Reference Card'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-4646688743554999873</id><published>2009-06-23T11:05:00.001-07:00</published><updated>2009-06-24T01:01:33.412-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foreign keys'/><category scheme='http://www.blogger.com/atom/ns#' term='odtug'/><category scheme='http://www.blogger.com/atom/ns#' term='richard feynman'/><category scheme='http://www.blogger.com/atom/ns#' term='science'/><category scheme='http://www.blogger.com/atom/ns#' term='referential integrity'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>An Essay on Science</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Richard_Feynman"&gt;Richard Feynman&lt;/a&gt; defined &lt;em&gt;science&lt;/em&gt; as "the belief in the ignorance of experts." Science begins by questioning established ideas. ...Even those ideas promoted by so-called experts.&lt;br /&gt;&lt;br /&gt;The value of science that's obvious to everybody is the chance you might discover some valuable truth that nobody else has discovered before. That's the glamorous idea that might motivate you to begin the hard work that science sometimes requires. Science is also valuable to you when you learn that an established idea, no matter how much you may not like it, really is true after all. That second value of science is not as glamorous, but it's just as important. My little prayer with respect to that possibility is, "If an idea I believe is wrong, please let me find out before anybody else does."&lt;br /&gt;&lt;br /&gt;Everyone can do science. Not just "scientists"; &lt;em&gt;all&lt;/em&gt; of us. But you need to do science "right," or it's not science. Do it right, and you accumulate a little bit of truth. Do it wrong, and and you've wasted your time, or worse, you've doomed yourself to waste more of your time in the future, too.&lt;br /&gt;&lt;br /&gt;The difference between "right" and "wrong" in science is not some snooty, bureaucratic concept. You don't need a license or a blessing to do science right. You just need to ensure that the cause-effect relationships you choose to believe are actually correct. One of the rules for doing science right is that you &lt;em&gt;measure&lt;/em&gt; instead of just asserting your opinion.&lt;br /&gt;&lt;br /&gt;Different people have different thresholds of skepticism. Some people believe new ideas, whether they're true or false, with very little persuasion. The people who are persuaded easily to believe false things cannot contribute much useful new knowledge to their communities (irrespective of how much they might publish).&lt;br /&gt;&lt;br /&gt;People at the opposite end of the spectrum have very strict standards for what they accept as truth. They're careful about what rows they insert and commit into their minds. There aren't as many of those people, but they're more interesting, with respect to science, because they're the people who can contribute new knowledge to the community.&lt;br /&gt;&lt;br /&gt;A lot of what we do in the Oracle world comes down to a person demonstrating, say, in sqlplus, that some certain cause produces some certain effect in some certain version of the database on some certain operating system, and so on. Then the &lt;em&gt;next&lt;/em&gt; step is when you have to look at that result and decide for yourself (or perhaps with someone's help), how relevant that result is for &lt;em&gt;you&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Innumerable Oracle debates funnel into the argument that, "Yes, I can see plainly that this situation &lt;em&gt;can&lt;/em&gt; happen, but that situation will probably never happen for &lt;em&gt;me&lt;/em&gt;." This is what happens, for example, when the doubter believes the prover is using an example that is too contrived to be realistic, or when the doubter's context is different from the prover's. ...Like when the doubter is running a data warehouse, but the prover talks only about transaction processing.&lt;br /&gt;&lt;br /&gt;That's where another level of value begins, and it's another place where science can help. It's where the issue becomes proving how &lt;em&gt;relevant&lt;/em&gt; a given proposal really is for a given circumstance. One of the nice things about software (and Oracle Database software in particular) is that it's usually easy to write code that will tell you how often something happens, or how long it takes when it does. With software, I don't have to guess. I can measure and &lt;em&gt;know&lt;/em&gt;. Software is unusual in the world in that it can be used to measure itself.&lt;br /&gt;&lt;br /&gt;At this week's &lt;a href="http://www.odtug.com/"&gt;ODTUG&lt;/a&gt; conference in Monterey, California, a debate has formed that I'm interested in following. The established idea of the experts in this debate is a passionate belief that you should declare, enable, and index &lt;a href="http://en.wikipedia.org/wiki/Foreign_key"&gt;foreign key&lt;/a&gt; (FK) relationships. The counter-argument is that you should not.&lt;br /&gt;&lt;br /&gt;I've heard probably most of the arguments on the &lt;a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:292016138754"&gt;&lt;em&gt;pro&lt;/em&gt; side&lt;/a&gt; of the debate. (a) If you don't declare/enable/index your FKs, then you have to ensure the correct relationships in your application code, which is error-prone in both obvious and highly subtle ways. (b) Not implementing full FK integrity in the database is developmentally inefficient, because it violates the important principle that you should never duplicate code in an application. (c) Furthermore, the absence of declared/enabled/indexed FK integrity is operationally inefficient at run time, because it blocks the Oracle query optimizer from using code paths that can be hundreds of times faster and more scalable than when it can't rely upon database-enforced FK integrity.&lt;br /&gt;&lt;br /&gt;I haven't heard a single compelling argument for the other side of the debate. But, you see, there &lt;em&gt;could&lt;/em&gt; be a compelling argument that I haven't heard.&lt;br /&gt;&lt;br /&gt;This is what makes this new debate interesting for me. One side or the other is on the brink of learning something important, if the debate is conducted properly.&lt;br /&gt;&lt;br /&gt;The first thing the two sides will need to do is agree on whether both sides really are in disagreement and, if they are, what exactly the disagreement is. In lots of debates I've seen, we've figured out after defining the terms and deciding the context of the argument (for example, what kind of application we're talking about), that there's really no debate of principle at all. When that happens, it's debate closed. Each side agrees with the other, and maybe the two sides learn a little more about life on the other side of the fence.&lt;br /&gt;&lt;br /&gt;If after the suitable definition-of-terms process, the two sides really do still have a debate left, then there will be some kind of attestation of facts as both sides see them. One side, for example, will show sqlplus session output to demonstrate the subtle and not-so-subtle ways in which not doing the declare/enable/index thing causes corrupted data and horrific performance penalties. The other side of the argument will then show some contrary evidence that counts in &lt;em&gt;favor&lt;/em&gt; of not doing the declare/enable/index thing.&lt;br /&gt;&lt;br /&gt;If the sides can't agree on the truth of the "facts" presented, then the debate will collapse, and at least one side (possibly both) will have learned nothing. If each side succeeds in impressing the other side that the "facts" thus presented are actually true, then the debate will move to the discussions of the relevance of the facts just demonstrated. This is where one guy might say something like, "I know that queries with FKs in the database are faster, but I can't afford the performance penalty at data load time." To which the other guy might say, "Yes, loads are a little slower with referential integrity checking, but that's time spent executing necessary code path to ensure that only correct data can get into your database. And besides, it's not a good trade-off to endure a thousand slow queries a day so that one load can go faster." Rebuttal, counter-rebuttal, and so on. You get the picture.&lt;br /&gt;&lt;br /&gt;I am biased in my estimation of how this will turn out. But I sincerely respect when someone thoughtfully and sincerely challenges an important idea in my professional domain, no matter how well entrenched that idea may be. In fact, the more entrenched, the better. The debate will remain interesting as long as the counter-argument is thoughtful and sincere. As soon as the evidence for the challenging new idea reveals itself to be nonsense, or if the counterargument context seems irrelevant to me (and the people I'm trying to represent), then I'll lose interest.&lt;br /&gt;&lt;br /&gt;The best debate ends in a handshake (real or virtual) in which the people representing both sides learn something they didn't know before, one side perhaps more than the other. The best debaters value learning more than being right. The best debaters respect each other more after the debate because each has helped the other (and the community around them) to advance.&lt;br /&gt;&lt;br /&gt;The worst debaters confuse the principles of factual correctness and personal correctness. When the debate shifts from factual to personal, it may become interesting to some people because of the enhanced drama, but the actual usefulness of the debate evaporates. ([Grin] I guess if the debate were solid to begin with, then the usefulness actually &lt;a href="http://en.wikipedia.org/wiki/Sublimation"&gt;sublimates&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;No matter which idea wins this FK debate (right, I said &lt;em&gt;idea&lt;/em&gt;, not &lt;em&gt;people&lt;/em&gt;), I expect to be happy for the debate to have occurred. That's because I expect the debate to end with a resolution, and either I'm going to learn something completely new, or I'm going to fortify an existing belief. Something new is obviously exciting, and fortification will make me a more effective teacher of my existing belief. Either result benefits me and, I believe, the community.&lt;br /&gt;&lt;br /&gt;With science, you get suspense, drama, plot twists, surprises, fortifications, .... Science is fun. I wish more people knew.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-4646688743554999873?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/4646688743554999873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=4646688743554999873' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/4646688743554999873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/4646688743554999873'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/06/essay-on-science.html' title='An Essay on Science'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-8080272002673038981</id><published>2009-06-18T08:02:00.000-07:00</published><updated>2009-10-07T08:18:53.813-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WWDC 2009'/><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='Mercado Juarez'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='profiles'/><category scheme='http://www.blogger.com/atom/ns#' term='OS 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Profiler'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><title type='text'>Profiling with my Boy</title><content type='html'>We have an article online called &lt;a href="http://method-r.com/faq/31-method-r/44-can-you-explain-method-r"&gt;"Can you explain Method R so even my boss could understand it?&lt;/a&gt;&lt;a href="http://method-r.com/faq/31-method-r/44-can-you-explain-method-r"&gt;"&lt;/a&gt; Today I'm going to raise the stakes, because yesterday I think I explained Method R so that an eleven year-old could understand it.&lt;br /&gt;&lt;br /&gt;Yesterday I took my 11 year-old son Alex to lunch. I talked him into eating at one of my favorite restaurants, called &lt;a href="http://www.mercadojuarez.com/home1.nxg"&gt;Mercado Juarez&lt;/a&gt;, over in Irving, so it was a half hour in the car together, just getting over there. It was a big day for the two of us because we were very excited about the new June 17 iPhone OS 3.0 release. I told him about some of the things I've learned about it on the Internet over the past couple of weeks. One subject in particular that we were both interested in was performance. He likes not having to wait for click results just as much as I do.&lt;br /&gt;&lt;br /&gt;According to Apple, the new iPhone OS 3.0 software has some important code paths in it that are 3× faster. Then, upgrading to the new iPhone 3G S hardware is supposed to yield yet another 3× performance improvement for some code paths. It's what Philip Schiller talks about at 1:42:00 in the &lt;a href="http://events.apple.com.edgesuite.net/0906paowdnv/event/index.html?internal=ijalrmacu"&gt;WWDC 2009 keynote video&lt;/a&gt;. Very exciting.&lt;br /&gt;&lt;br /&gt;Alex of course, like many of us, wants to interpret "3× faster" as "everything I do is going to be 3× faster." As in everything that took 10 seconds yesterday will take 3 seconds tomorrow. It's a nice dream. But it's not what seeing a benchmark run 3× faster means. So we talked about it.&lt;br /&gt;&lt;br /&gt;I asked him to imagine that it takes me an hour to do my grocery shopping when I walk to the store. Should I buy a car? He said yes, probably, because a car is a lot faster than walking. So I asked him, what if the total time I spent walking to and from the grocery store was only one minute? Then, he said, having a car wouldn't make that much of a difference. He said you might want a car for &lt;em&gt;other&lt;/em&gt; reasons, but he wouldn't recommend it just to make grocery shopping faster.&lt;br /&gt;&lt;br /&gt;Good.&lt;br /&gt;&lt;br /&gt;I said, what if grocery shopping were taking me five hours, and four of it was time spent walking? "Then you probably should get the car," he told me. "Or a bicycle."&lt;br /&gt;&lt;br /&gt;Commit.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_mtpW1vu-FYo/SjpXeRxCxjI/AAAAAAAABbY/gpYw-B9WgPI/s1600-h/Mercado+Juarez+Profiling+with+Alex.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 122px; height: 200px;" src="http://4.bp.blogspot.com/_mtpW1vu-FYo/SjpXeRxCxjI/AAAAAAAABbY/gpYw-B9WgPI/s200/Mercado+Juarez+Profiling+with+Alex.png" alt="" id="BLOGGER_PHOTO_ID_5348683685132682802" border="1" /&gt;&lt;/a&gt;On the back of his menu (photo above: click to zoom), I drew him a &lt;a href="http://www.agilemodeling.com/artifacts/sequenceDiagram.htm"&gt;sequence diagram&lt;/a&gt; (A) showing how he, running Safari on an iPhone 3G might look to a performance analyst. I showed him how to read the sequence diagram (time runs top-down, control passes from one tier to another), and I showed him two extreme ways that his sequence diagram might turn out for a given experience. Maybe the majority of the time would be spent on the 3G network tier (B), or maybe the majority of the time would be spent on the Safari software tier (C). We talked about how if B were what was happening, then a 3× faster Safari tier wouldn't really make any difference. Apple wouldn't be lying if they said their software was 3× faster, but he really wouldn't notice a performance improvement. But if C were what was happening, then a 3× faster Safari tier would be a smoking hot upgrade that we'd be thrilled with.&lt;br /&gt;&lt;br /&gt;Sequence diagrams, check. Commit.&lt;br /&gt;&lt;br /&gt;Now, to profiles. So I drew up a simple profile for him, with 101 seconds of response time consumed by 100 seconds of software and 1 second of 3G (D):&lt;pre&gt;&lt;br /&gt;Software  100&lt;br /&gt;3G          1&lt;br /&gt;-------------&lt;br /&gt;Total     101&lt;/pre&gt; I asked him, if we made the software 2× faster, what would happen to the total response time? He wrote down "50" in a new column to the right of the "100." Yep. Then I asked him what would happen to total response time. He said to wait a minute, he needed to use the calculator on his iPod Touch. Huh? A few keystrokes later, he came up with a response time of 50.5.&lt;br /&gt;&lt;br /&gt;Oops. Rollback.&lt;br /&gt;&lt;br /&gt;He made the same mistake that just about every forty year-old I've ever met makes. He figured if one component of response time were 2× faster, then the total response time must be 2× faster, too. Nope. In this case, the wrong answer was close to the right answer, but only because of the particular numbers I had chosen.&lt;br /&gt;&lt;br /&gt;So, to illustrate, I drew up another profile (E):&lt;pre&gt;&lt;br /&gt;Software    4&lt;br /&gt;3G         10&lt;br /&gt;-------------&lt;br /&gt;Total      14&lt;/pre&gt;Now, if we were to make the software 2× faster, what happens to the total? We worked through it together:&lt;pre&gt;&lt;br /&gt;Software    4    2&lt;br /&gt;3G         10   10&lt;br /&gt;------------------&lt;br /&gt;Total      14   12&lt;br /&gt;&lt;/pre&gt;Click. So then we spent the next several minutes doing little quizzes. If this is your profile, and we make this component &lt;em&gt;X&lt;/em&gt; times faster, then what's the new response time going to be? Over and over, we did several more of these, some on paper (F), and others just talking.&lt;br /&gt;&lt;br /&gt;Commit.&lt;br /&gt;&lt;br /&gt;Next step. "What if I told you it takes me an hour to get into my email at home? Do I need to upgrade my network connection?" A couple of minutes of conversation later, he figured out that he couldn't answer that question until he got some more information from me. Specifically, he had to ask me how much of that hour is presently being spent by the network. So we did this over and over a few times. I'd say things like, "It takes me an hour to run my report. Should I spend $4,800 tuning my SQL?" Or, "Clicking this button takes 20 seconds. Should I upgrade my storage area network?"&lt;br /&gt;&lt;br /&gt;And, with just a little bit of practice, he learned that he had to say, "How much of the however-long-you-said is being spent by the whatever-it-was-you-said?" I was happy with how he answered, because it illustrated that he had caught onto the pattern. He realized that the specific blah-blah-blah proposed remedies I was asking him about didn't really matter. He had to ask the same question regardless. (He was answering me with a sentence using bind variables.)&lt;br /&gt;&lt;br /&gt;Commit.&lt;br /&gt;&lt;br /&gt;Alex hears me talk about our &lt;a href="http://method-r.com/software/profiler"&gt;Method R Profiler&lt;/a&gt; software tool a lot, and he knows conceptually that it helps people make their systems faster, but he's never known in any real detail very much about what it does. So I told him that the profile tables are what our Profiler makes for people. To demonstrate how it does that, I drew him up a list of calls (F), which I told him was a list of visits between a disk and a CPU. ...Just a list that says the same thing that a sequence diagram (annotated with timings) would say:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;D 2&lt;br /&gt;C 1&lt;br /&gt;D 6&lt;br /&gt;D 4&lt;br /&gt;D 8&lt;br /&gt;C 3&lt;br /&gt;&lt;/pre&gt;I told him to make a profile for these calls, and he did (H):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Disk   20&lt;br /&gt;CPU     4&lt;br /&gt;---------&lt;br /&gt;Total  24&lt;br /&gt;&lt;/pre&gt;Excellent. So I explained that instead of adding up lists in our head all day, we wrote the Profiler to aggregate the call-by-call durations (from an Oracle extended SQL trace file) for you into a profile table that lets you answer the performance questions we had been practicing over lunch. ...Even if there are &lt;em&gt;millions&lt;/em&gt; of lines to add up.&lt;br /&gt;&lt;br /&gt;The finish-up conversation in the car ride back was about how to use everything we had talked about when you fix people's performance problems. I told him the most vital thing about helping someone solve a performance problem is to make sure that the operation (the business task) that you're analyzing right now is actually the most important business task to fix first. If you're looking at anything other than the most important task first, then you're asking for trouble.&lt;br /&gt;&lt;br /&gt;I asked him to imagine that there are five important tasks that are too slow. Maybe every one of those things has its response time dominated by a different component than all the others. Maybe they're all the same. But if they're all different, then no single remedy you can perform is going to fix all five. A given remedy will have a different performance impact upon each of the five tasks, depending on how much of the fixed thing that task was using to begin with.&lt;br /&gt;&lt;br /&gt;So the important thing is to know which of the five profiles it is that you ought to be paying attention to first. Maybe one remedy will fix all five tasks, maybe not. You just can't know until you look at the profiles. (Or until you try your proposed remedy. But trial-and-error is an awfully expensive way to find out.)&lt;br /&gt;&lt;br /&gt;Commit.&lt;br /&gt;&lt;br /&gt;It was a really good lunch. I'll look forward to taking my 9-year-old (Alex's little brother) out the week after next when I get back from &lt;a href="http://www.odtug.com/"&gt;ODTUG&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-8080272002673038981?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/8080272002673038981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=8080272002673038981' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8080272002673038981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8080272002673038981'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/06/profiling-with-my-boy.html' title='Profiling with my Boy'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_mtpW1vu-FYo/SjpXeRxCxjI/AAAAAAAABbY/gpYw-B9WgPI/s72-c/Mercado+Juarez+Profiling+with+Alex.png' height='72' width='72'/><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-4470541602596507230</id><published>2009-04-24T09:30:00.001-07:00</published><updated>2009-04-26T09:02:26.057-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='optimizing oracle performance'/><category scheme='http://www.blogger.com/atom/ns#' term='percona'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='stop guessing'/><category scheme='http://www.blogger.com/atom/ns#' term='tim cook'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><title type='text'>The Most Common Performance Problem I See</title><content type='html'>At the &lt;a href="http://conferences.percona.com/"&gt;Percona Performance Conference&lt;/a&gt; in Santa Clara this week, the first question an audience member asked our panel was, "What is the most common performance problem you see in the field?"&lt;br /&gt;&lt;br /&gt;I figured, being an Oracle guy at a MySQL conference, this might be my only chance to answer something, so I went for the mic. Here is my answer.&lt;br /&gt;&lt;blockquote&gt;The most common performance problem I see is people who think there's a most-common performance problem that they should be looking for, instead of &lt;em&gt;measuring&lt;/em&gt; to find out what their actual performance problem actually is.&lt;/blockquote&gt;It's a meta answer, but it's a meta problem. The biggest performance problems I see, and the ones I see most often, are not problems with machines or software. They're problems with &lt;em&gt;people&lt;/em&gt; who don't have a reliable process of identifying the right thing to work on in the first place.&lt;br /&gt;&lt;br /&gt;That's why the definition of &lt;a href="http://method-r.com/faq/31-method-r/35-what-is-method-r"&gt;Method R&lt;/a&gt; doesn't mention Oracle, or databases, or even computers. It's why &lt;a href="http://www.amazon.com/gp/product/059600527X?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=059600527X"&gt;&lt;em&gt;Optimizing Oracle Performance&lt;/em&gt;&lt;/a&gt; spends the first 69 pages talking about red rocks and informed consent and Eli Goldratt instead of Oracle, or databases, or even computers.&lt;br /&gt;&lt;br /&gt;The most common performance problem I see is that people guess instead of knowing. The worst cases are when people think they know because they're looking at data, but they really don't know, because they're looking at the wrong data. Unfortunately, &lt;em&gt;every&lt;/em&gt; case of guessing that I ever see is this worst case, because nobody in our business goes very far without consulting some kind of data to justify his opinions. &lt;a href="http://blogs.sun.com/timc/"&gt;Tim Cook&lt;/a&gt; from Sun Microsystems pointed me yesterday to a &lt;a href="http://blogs.sun.com/timc/entry/how_event_driven_utilization_measurement"&gt;blog post&lt;/a&gt; that gives a great example of that illusion of knowing when you really don't.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-4470541602596507230?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/4470541602596507230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=4470541602596507230' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/4470541602596507230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/4470541602596507230'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/04/most-common-performance-problem-i-see.html' title='The Most Common Performance Problem I See'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-4608873949922562590</id><published>2009-04-13T11:22:00.000-07:00</published><updated>2009-04-13T13:10:54.370-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zürich'/><category scheme='http://www.blogger.com/atom/ns#' term='trousers'/><category scheme='http://www.blogger.com/atom/ns#' term='slacks'/><category scheme='http://www.blogger.com/atom/ns#' term='customer service'/><category scheme='http://www.blogger.com/atom/ns#' term='pants'/><category scheme='http://www.blogger.com/atom/ns#' term='nordstrom'/><category scheme='http://www.blogger.com/atom/ns#' term='maxine johnson'/><title type='text'>Maxine Johnson</title><content type='html'>I want to introduce you to Maxine Johnson, assistant manager of men's sportswear at &lt;a href="http://about.nordstrom.com/MapPoint/MapResults.aspx?bizid=720"&gt;Nordstrom Galleria Dallas&lt;/a&gt;. The reason I think Maxine is important is because she taught my son and me about customer service. I met her several months ago. I still have her card, and I'm still grateful to her. Here's what happened.&lt;br /&gt;&lt;br /&gt;A few months ago, my wife and I were in north Dallas with some time to spare, and I convinced her to go with me to pick out one or two pairs of dress slacks. I felt like I was wearing the same pants over and over again when I traveled, and I could use an extra pair or two. We usually go to Nordstrom for that, and so we did again. After some time, I had two pairs of trousers that we both liked, and so we had them measured for hemming and picked them up a few days later.&lt;br /&gt;&lt;br /&gt;A week or two passed, and then I packed a pair of my new pants for a trip to Zürich. I put them on in the hotel the first morning I was supposed to speak at an event. On my few-block walk from the hotel to the train station, I caught my reflection in a store window, and—hmmp—my pants were just not... really... quite... long enough. Every step, the whole cuff would come way up above the tops of my shoes. I stopped and tugged them down, and then they seemed alright, but then as soon as I started walking again, they'd ride back up and look too short.&lt;br /&gt;&lt;br /&gt;They weren't bad enough that anyone said anything, but I was a little self-consious about it. I kept tugging at them all day.&lt;br /&gt;&lt;br /&gt;When I hung them back up in my closet at home, I noticed that when I folded them over the hanger, they didn't reach as far as the other pants that I really liked. Sure enough, when I lined up the waists, these new pants were about an inch shorter than my favorite ones that I had bought at Nordstrom probably four years ago.&lt;br /&gt;&lt;br /&gt;Now, pants at Nordstrom cost a little more than maybe at a lot of other places, but they're worth to me what I pay for them because they're nice, and they last a long time. But these new ones made me feel bad, because they were just a little bit off. I could already foresee a future of two new pairs of slacks hanging in my closet for years, never really making the starting rotation because they're just a little bit off, but never making the garage sale pile, either, because they had cost too much.&lt;br /&gt;&lt;br /&gt;My wife agreed. They were shorter than the others. They were shorter than they &lt;em&gt;should&lt;/em&gt; be. I needed to get them fixed.&lt;br /&gt;&lt;br /&gt;Now, &lt;em&gt;this&lt;/em&gt; is the part I always hate. Having made the decision, the next step is that step where you take the thing back and try to get the problem fixed. I hate that part. My wife doesn't mind it so much, but these were &lt;em&gt;my&lt;/em&gt; pants, and so &lt;em&gt;I&lt;/em&gt; was the one that had to go back and put them on so someone could fix them. I really dreaded it though, because I knew that the only way they could fix those pants was to take off the cuff.&lt;br /&gt;&lt;br /&gt;It's late in the evening by the time my wife helps me build up a little head of steam, and we both decide (well, she decides, but she's right) that tonight is the perfect night for me to go on a 20-mile drive across town to Nordstrom to get my pants fixed. As a matter of fact, it'd be good if my older boy went with me. That makes it a little more fun, because he's good company for me.&lt;br /&gt;&lt;br /&gt;It's late enough by now that before I could leave, I had to phone ahead, just to make sure the store was still open. A nice lady answered the phone. I said my name and told the nice lady that I was having some trouble with some slacks I had bought a few weeks ago, and how late did they stay open? She told me to come right on over.&lt;br /&gt;&lt;br /&gt;So my boy and I got into the car, and I drove right on over.&lt;br /&gt;&lt;br /&gt;A half hour later, I walked into the store, thankful that the doors were still open, carrying two pairs of slacks on a hanger, with my son walking beside me. A smiling nice lady approached me as I entered the men's department. "Mr. Millsap?" Yes, I am. It surprises me anytime someone remembers my name from that one phase of the conversation where I say real fast, "My name is Cary Millsap, and blah blah blah blah blah," and tell my whole story. The person on the phone hadn't asked me again what my name was. She had caught it in the blur at the beginning of my story.&lt;br /&gt;&lt;br /&gt;She proceeded to explain to me what was going to happen. I was going to try on the slacks in the dressing room. The tailor would be there waiting for me. She and the tailor would look them over. If there was enough fabric to make them longer, then they'd do that tonight. If there weren't, then she was going to find two new pairs of slacks for me, and the tailor would have them ready for me tomorrow. If for any reason, &lt;em&gt;those&lt;/em&gt; didn't work, then she'd keep preparing new trousers for me until I was satisfied.&lt;br /&gt;&lt;br /&gt;Mmm, ok. I was probably grinning a little bit by now, because this was pretty fantastic news. I wasn't going to have to get my pants de-cuffed. I was still a little nervous, though, that when I came out of the dressing room, everyone was going to look at me like, "So what's the problem? I don't see any problem. Those are long enough."&lt;br /&gt;&lt;br /&gt;When I came out, Maxine Johnson crossed her arms, put her hand to her chin, shook her head a little, and &lt;em&gt;immediately&lt;/em&gt; said something to the effect of, "Oh my, no. That won't do at all." So she brought me two new pairs, which I tried on, and which the tailor measured for me. She gave me a reclaim ticket for the next day. As usual, I had missed her name when she introduced herself as I first entered the men's department. (As you probably already figured out, I have a bad habit of not paying enough attention to that part of the conversation that I think of as "the blur.") I did have the good sense to ask for her business card, which is why I know her name is Maxine Johnson.&lt;br /&gt;&lt;br /&gt;My boy and I talked the whole ride home that what we had seen that night had been some real, first-class retail customer care right there, and that we all knew where we'd be buying my next pairs of pants. When I had gotten into the car an hour or so before, I had been very apprehensive about what might happen. I had been especially nervous about how I'd perform during the proving-what's-wrong part of the project. But Maxine Johnson put me completely at ease during my experience. She didn't just do the right thing, she did it in such a manner that I felt glad the whole problem had happened. Here's the thing:&lt;blockquote&gt;Maxine Johnson made me feel like it was not just ok that I brought the pants back for repair, she made me feel like she was &lt;em&gt;delighted&lt;/em&gt; by the opportunity to show me what Nordstrom could do for me under pressure.&lt;/blockquote&gt;I hope that the way Maxine Johnson made me feel is the way that my employees and I make our customers feel. I hope it's the way my children make &lt;em&gt;their&lt;/em&gt; customers feel someday when &lt;em&gt;they&lt;/em&gt; go to work.&lt;br /&gt;&lt;br /&gt;Thank you, Maxine Johnson. Thank you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-4608873949922562590?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/4608873949922562590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=4608873949922562590' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/4608873949922562590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/4608873949922562590'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/04/maxine-johnson.html' title='Maxine Johnson'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-1372763028351818301</id><published>2009-04-08T08:52:00.000-07:00</published><updated>2009-04-08T14:29:06.996-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='BAARF party'/><category scheme='http://www.blogger.com/atom/ns#' term='RAID'/><category scheme='http://www.blogger.com/atom/ns#' term='waste'/><category scheme='http://www.blogger.com/atom/ns#' term='juan loaiza'/><title type='text'>What would you do with 8 disks?</title><content type='html'>Yesterday, David Best posted this question at &lt;a href="http://www.freelists.org/post/oracle-l/What-would-you-do-with-8-disks"&gt;Oracle-L&lt;/a&gt;:&lt;blockquote&gt;If you had 8 disks in a server what would you do?  From watching this list I can see alot of people using RAID 5 but i'm wary of the performance implicatons.  (&lt;a href="http://www.miracleas.com/BAARF/"&gt;http://www.miracleas.com/BAARF/&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;I was thinking maybe RAID 5 (3 disks) for the OS, software and&lt;br /&gt;backups.   RAID 10 (4 disks + 1 hot spare) for the database files.&lt;br /&gt;&lt;br /&gt;Any thoughts?&lt;/blockquote&gt;I do have some thoughts about it.&lt;br /&gt;&lt;br /&gt;There are four dimensions in which I have to make considerations as I answer this question:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Volume&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Flow&lt;/li&gt;&lt;li&gt;Availability&lt;/li&gt;&lt;li&gt;Change&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt; Just about everybody understands at least a little bit about #1: the reason you bought 8 disks instead of 4 or 16 has something to do with how many bytes of data you're going to store. Most people are clever enough to figure out that if you need to store N bytes of data, then you need to buy N + M bytes of capacity, for some M &gt; 0 (grin).&lt;br /&gt;&lt;br /&gt;#2 is where a lot of people fall off the trail. You can't know how many disks you really need to buy unless you know how many I/O calls per second (&lt;a href="http://en.wikipedia.org/wiki/IOPS"&gt;IOPS&lt;/a&gt;) your application is going to generate. You need to ensure that your sustained IOPS rate on each disk will not exceed 50% (see &lt;a href="http://books.google.com/books?id=dN805AoUyc8C&amp;amp;printsec=frontcover&amp;amp;dq=millsap+holt&amp;amp;ei=VcXcSZf5CoKEygT_9MHkDg#PPA260,M1"&gt;Table 9.3&lt;/a&gt; in &lt;a href="http://www.amazon.com/gp/product/059600527X?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=059600527X"&gt;&lt;em&gt;Optimizing Oracle Performance&lt;/em&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=methodrcom-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=059600527X" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt; for why .5 is special). So, if a disk drive is capable of serving N 8KB IOPS (your disk's capacity for serving I/O calls at &lt;em&gt;your&lt;/em&gt; Oracle block size), then you better make sure that the data you put on that disk is so interesting that it motivates your application to execute no more than .5N IOPS to that disk. Otherwise, you're guaranteeing yourself a performance problem.&lt;br /&gt;&lt;br /&gt;Your IOPS requirement gets a little trickier, depending on which arrangement you choose for configuring your disks. For example, if you're going to mirror (&lt;a href="http://en.wikipedia.org/wiki/RAID"&gt;RAID&lt;/a&gt; level 1), then you need to account for the fact that each &lt;span style="font-style: italic;"&gt;write&lt;/span&gt; call your application makes will motivate &lt;span style="font-style: italic;"&gt;two&lt;/span&gt; physical writes to disk (one for each copy). Of course, those &lt;em&gt;write&lt;/em&gt; calls are going to separate disks, and you better make sure they're going through separate controllers, too. If you're going to do striping with distributed parity (RAID level 5), then you need to realize that each "small" &lt;em&gt;write&lt;/em&gt; call is going to generate &lt;em&gt;four&lt;/em&gt; physical I/O calls (two reads, and two writes to two different disks).&lt;br /&gt;&lt;br /&gt;Of course, RAID level 5 caching complicates the analysis at low loads, but for high enough loads, you can assume away the benefits of cache, and then you're left with an analysis that tell you that for write-intensive data, RAID level 5 is fine as long as you're willing to buy 4× more drives than you thought you needed. ...Which is ironic, because the whole reason you considered RAID level 5 to begin with is that it costs less than buying 2× more drives than you thought you needed, which is why you didn't buy RAID level 1 to begin with.&lt;br /&gt;&lt;br /&gt;If you're interested in RAID levels, you should peek at a paper I wrote a long while back, called &lt;a href="http://www.miracleas.com/BAARF/0.Millsap1996.08.21-VLDB.pdf"&gt;Configuring Oracle Server for VLDB&lt;/a&gt;. It's an old paper, but a lot of what's in there still holds up, and it points you to deeper information if you want it.&lt;br /&gt;&lt;br /&gt;You have to think about dimension #3 (availability) so that you can meet your business's requirements for your application to be ready when its users need it. ...Which is why RAID levels 1 and 5 came into the conversation to begin with: because you want a system that keeps running when you lose a disk. Well, different RAID levels have different &lt;a href="http://en.wikipedia.org/wiki/MTBF"&gt;MTBF&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Mttr"&gt;MTTR&lt;/a&gt; characteristics, with the bottom line being that RAID level 5 doesn't perform quite as well (or as simply) as RAID level 1 (or, say 1+0 or 0+1), but RAID level 5 has the up-front gratification advantage of being more economical (unless you get a whole bunch of cache, which you pretty much &lt;em&gt;have&lt;/em&gt; to, because you want decent performance).&lt;br /&gt;&lt;br /&gt;The whole analysis—once you actually go through it—generally funnels you into becoming a &lt;a href="http://www.baarf.com/"&gt;BAARF Party&lt;/a&gt; member.&lt;br /&gt;&lt;br /&gt;Finally, dimension #4 is &lt;em&gt;change&lt;/em&gt;. No matter how good your analysis is, it's going to start degrading the moment you put your system together, because from the moment you turn it on, it begins changing. All of your volumes and flows will change. So you need to factor into your analysis how sensitive to change your configuration will be. For example, what % increase in IOPS will require you to add another disk (or pair, or group, etc.)? You need to know in advance, unless you just like surprises. (And you're sure your boss does, too.)&lt;br /&gt;&lt;br /&gt;Now, after all this, what would I do with 8 disks? I'd probably stripe and mirror everything, like &lt;a href="http://www.miracleas.com/BAARF/oow2000_same.pdf"&gt;Juan Loaiza said&lt;/a&gt;. Unless I was really, really (I mean really, &lt;em&gt;really&lt;/em&gt;) sure I had a low write-rate requirement (think "web page that gets 100 lightweight hits a day"), in which I would consider RAID level 5. I would make sure that my sustained utilization for each drive is less than 50%. In cases where it's not, I would have a performance problem on my hands. In that case, I'd try to balance my workload better across drives, and I would work persistently to find any applications out there that are wasting I/O capacity (naughty users, naughty SQL, etc.). If neither of those actions reduced the load by enough, then I'd put together a justification/requisition for more capacity, and I would brace myself to explain why I thought 8 disks was the right number to begin with.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-1372763028351818301?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/1372763028351818301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=1372763028351818301' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1372763028351818301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1372763028351818301'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/04/what-would-you-do-with-8-disks.html' title='What would you do with 8 disks?'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-415005838529523180</id><published>2009-04-03T12:24:00.000-07:00</published><updated>2011-12-04T04:00:47.265-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stop guessing'/><category scheme='http://www.blogger.com/atom/ns#' term='solid state disk'/><category scheme='http://www.blogger.com/atom/ns#' term='ssd'/><category scheme='http://www.blogger.com/atom/ns#' term='profiling'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><category scheme='http://www.blogger.com/atom/ns#' term='joel spolsky'/><title type='text'>Cary on Joel on SSD</title><content type='html'>Joel Spolsky's article on &lt;a href="http://joelonsoftware.com/items/2009/03/27.html"&gt;Solid State Disks&lt;/a&gt; is a great example of a type of problem my career is dedicated to helping people avoid. Here's what Joel did:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;He identified a task needing performance improvement: "compiling is too slow."&lt;/li&gt;&lt;li&gt;He hypothesized that converting from spinning rust disk drives (thanks &lt;a href="http://www.rightsizinginc.com/principals.htm"&gt;&lt;em&gt;mwf&lt;/em&gt;&lt;/a&gt;) to solid state, flash hard drives would improve performance of compiling. (Note here that Joel &lt;a href="http://twitter.com/spolsky/status/1403276255"&gt;stated&lt;/a&gt; that his "&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;goal was to try spending money, which is plentiful, before [he] spent developer time, which is scarce.")&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;So he spent some money (which is, um, plentiful) and some of his own time (which is apparently less scarce than that of his developers) replacing a couple of hard drives with SSD. If you follow his &lt;a href="http://twitter.com/spolsky"&gt;Twitter stream&lt;/a&gt;, you can see that he started on it 3/25 12:15p and wrote about having finished at 3/27 2:52p. &lt;/li&gt;&lt;li&gt;He was pleased with how much faster the machines were in general, but he was disappointed that his compile times underwent no material performance improvement.&lt;/li&gt;&lt;/ol&gt;Here's where &lt;a href="http://method-r.com/faq/31-method-r/35-what-is-method-r"&gt;Method R&lt;/a&gt; could have helped. Had he &lt;a href="http://method-r.com/faq/31-method-r/44-can-you-explain-method-r"&gt;profiled&lt;/a&gt; his compile times to see where the time was being spent, he would have known before the upgrade that SSD was not going to improve response time. Given his results, his profile for compiling must have looked like this:&lt;br /&gt;&lt;pre&gt;100%  Not disk I/O&lt;br /&gt;  0%  Disk I/O&lt;br /&gt;----  ------------&lt;br /&gt;100%  Total&lt;/pre&gt;I'm not judging whether he wasted his time by doing the upgrade. By his own account, he is pleased at how fast his SSD-enabled machines are now. But if, say, the compiling performance problem had been survival-threateningly severe, then he wouldn't have wanted to expend two business days' worth of effort upgrading a component that was destined to make &lt;em&gt;zero&lt;/em&gt; difference to the performance of the task he was trying to improve.&lt;br /&gt;&lt;br /&gt;So, why would someone embark upon a performance improvement project without first knowing exactly what result he should be able to expect? I can think of some good reasons:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You don't know &lt;em&gt;how&lt;/em&gt; to profile the thing that's slow. Hey, if it's going to take you a week to figure out how to profile a given task, then why not spend half that time doing something that your &lt;a href="http://www.cnn.com/2009/POLITICS/04/01/jillette.skid/index.html"&gt;instincts all say&lt;/a&gt; is surely going to work?&lt;/li&gt;&lt;li&gt;Um, ...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Ok, after trying to write them all down, I think it really boils down to just one good reason: if profiling is too expensive (that is, you don't know how, or it's too hard, or the tools to do it cost too much), then you're not going to do it. I don't know how I'd profile a compile process on a Microsoft Windows computer. It's probably possible, but I can't think of a good way to do it. It's all about knowing; if you knew how to do it, and it were easy, you'd do it before you spent two days and a few hundred bucks on an upgrade that might not give you what you wanted.&lt;br /&gt;&lt;br /&gt;I do know that in the Oracle world, it's &lt;a href="http://method-r.com/downloads/doc_details/10-for-developers-making-friends-with-the-oracle-database-cary-millsap"&gt;not hard anymore&lt;/a&gt;, and the &lt;a href="http://method-r.com/software/profiler"&gt;tools&lt;/a&gt; don't cost nearly as much as they used to. There's no need anymore to upgrade something before you &lt;em&gt;know&lt;/em&gt; specifically what's going to happen to your response times. Why guess... when you can know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-415005838529523180?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/415005838529523180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=415005838529523180' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/415005838529523180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/415005838529523180'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/04/cary-on-joel-on-ssd.html' title='Cary on Joel on SSD'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-6444125198804536207</id><published>2009-03-31T06:44:00.000-07:00</published><updated>2011-01-18T20:29:02.441-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='miracle'/><category scheme='http://www.blogger.com/atom/ns#' term='c. j. date'/><category scheme='http://www.blogger.com/atom/ns#' term='toon koppelaars'/><category scheme='http://www.blogger.com/atom/ns#' term='lex de haan'/><category scheme='http://www.blogger.com/atom/ns#' term='dominic delmolino'/><category scheme='http://www.blogger.com/atom/ns#' term='tom kyte'/><title type='text'>Last call for C. J. Date course</title><content type='html'>&lt;blockquote&gt;Note added 3 April 2009: When I wrote this post, we were counting down toward 2 April as the date for our preliminary go/no-go decision. That date is now behind us, and we have made the preliminary decision to Go. We &lt;em&gt;are&lt;/em&gt; accepting further enrollments. —Cary Millsap&lt;/blockquote&gt;Thursday 2 April 2009 is our last call for enrollment in C. J. Date's course, "&lt;a href="http://www.method-r.com/education/courses/43-course/107-cj-date-course" target="_blank"&gt;How to write correct SQL, and &lt;em&gt;know&lt;/em&gt; it: a relational approach to SQL&lt;/a&gt;." I'm looking forward to this course more eagerly than anything I've attended in the past ten years, ...maybe twenty.&lt;br /&gt;&lt;br /&gt;SQL and I never really got along too well. When I first joined Oracle Corporation in 1989, I was new to relational databases. I had done one hierarchical database project in college. I enjoyed the project ok, but it wasn't something I ever wanted to do again. When I joined Oracle, I didn't know much about relational technology or SQL. In my formative first couple of years at Oracle, though, I just never learned to like the SQL language. Prior to my Oracle career, I designed languages and wrote compilers for a living. From a language design standpoint, it just seemed that SQL (at least "Oracle SQL") could have become something really cool, but it didn't. For Oracle to treat an empty string as NULL, for example, is a decision which I still can't believe made it into the light of day...&lt;br /&gt;&lt;br /&gt;I had a lot of respect over the years for the people I met who knew how to make SQL do what they wanted it to do. &lt;a href="http://www.oraclemusings.com/"&gt;Dominic Delmolino&lt;/a&gt; was one of the first people I ever met who could make SQL do things I had no idea it could do. I'm still amazed when I see the things that &lt;a href="http://tkyte.blogspot.com/"&gt;Tom Kyte&lt;/a&gt; can do with SQL. I was never one of the SQL people.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Lex_de_Haan"&gt;Lex de Haan&lt;/a&gt; is the first person I ever met who really revealed to me what my problem was. A few years ago, Lex delivered a &lt;a href="http://www.miracleas.dk/"&gt;Miracle&lt;/a&gt; presentation in Rødby, Denmark, that dropped my jaw. He explained a better way to write an application with SQL. He showed how to write a completely unambiguous specification using a language I understood, predicate calculus ("this set equals that set," that kind of thing). He then showed how to implement that specification in SQL.&lt;br /&gt;&lt;br /&gt;Here's the problem, though. SQL doesn't implement many of the set-theory/predicate-calculus operations that I expect. I'm not looking at Lex's notes as I write this, so I'll show you an example outlined recently by &lt;a href="http://thehelsinkideclaration.blogspot.com/"&gt;Toon Koppelaars&lt;/a&gt;, Lex's coauthor on the brilliant book called &lt;em&gt;&lt;a href="http://www.amazon.com/gp/product/1590597451?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1590597451"&gt;Applied Mathematics for Database Professionals (Expert's Voice)&lt;/a&gt;&lt;/em&gt;.&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=methodrcom-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1590597451" style="border: medium none ! important; margin: 0px ! important;" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;In SQL, there's no "set equality" operator. That's right, although SQL is a set processing language, it has no operator for testing whether one set A equals another set B. But set equality "A = B" can be rewritten as "(A is-a-subset-of B) and (B is-a-subset-of A)".&lt;br /&gt;&lt;br /&gt;Unfortunately, SQL doesn't have an &lt;em&gt;is-a-subset-of&lt;/em&gt; operator either. But "A is-a-subset-of B" can be rewritten into "A minus B = the-empty-set".&lt;br /&gt;&lt;br /&gt;But SQL also lacks the concept of an empty set. The way to express that is to test whether the cardinality of a set is zero, as in "count(*)=0".&lt;br /&gt;&lt;br /&gt;Over the course of an hour-long presentation, Lex showed me a dozen or so operators that are missing from SQL, which we really need for expressing our intentions clearly in SQL. He put &lt;em&gt;structure&lt;/em&gt; around the negative feelings I had toward the language. And then he showed an equivalent translation for each missing operator that &lt;em&gt;could&lt;/em&gt; be implemented in SQL, which invested back into the language a new power. That's the trick that caused my jaw to fall. In Lex's presentation, the game of writing applications in SQL went from this:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Implement complex thoughts in crappy language that requires me to record my thoughts in a format that doesn't much resemble my thinking.&lt;/li&gt;&lt;li&gt;Worry whether the implementation was really right.&lt;/li&gt;&lt;/ol&gt;...to this:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Record complex thoughts using a language designed well to record exactly such thoughts.&lt;/li&gt;&lt;li&gt;Translate the specification of the program into SQL, using translation patterns.&lt;/li&gt;&lt;/ol&gt;Since our predicate calculus expressions were explicit enough to be provable, and since we could &lt;em&gt;prove&lt;/em&gt; the correctness of the translations we were using to move from our specification to our SQL, we could actually then &lt;em&gt;prove&lt;/em&gt; the correctness of our SQL. It was a beam of hope that developers could actually write &lt;em&gt;correct&lt;/em&gt; applications ...and &lt;em&gt;know&lt;/em&gt; it!&lt;br /&gt;&lt;br /&gt;That's the first day I ever got excited thinking about SQL.&lt;br /&gt;&lt;br /&gt;So, on April 27–29 in Dallas, I'll get a chance to enter the next phase of that thinking. On top of that, the message will be delivered by &lt;a href="http://en.wikipedia.org/wiki/Christopher_J._Date"&gt;Chris Date&lt;/a&gt;, who I really enjoyed at the &lt;a href="http://hotsos.com/sym09.html"&gt;Hotsos Symposium&lt;/a&gt; earlier this month, and who is one of the pioneers who invented the whole world our careers live in. I'm looking to forward to it. It should be an interesting classroom, with Chris Date in the front and &lt;a href="http://karenmorton.blogspot.com/"&gt;Karen Morton&lt;/a&gt;, Jeff Holt, and some others with me in the back. I hope you won't miss the opportunity.&lt;br /&gt;&lt;br /&gt;Like I said, the final day to &lt;a href="http://www.method-r.com/education/courses/43-course/107-cj-date-course"&gt;sign up&lt;/a&gt; is this Thursday 2 April 2009. I know that economic times are tough these days, but this is a one-of-a-kind education event that I believe will deliver lasting value to everyone who goes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-6444125198804536207?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/6444125198804536207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=6444125198804536207' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/6444125198804536207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/6444125198804536207'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/03/last-call-for-c-j-date-course.html' title='Last call for C. J. Date course'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-6555196867898537981</id><published>2009-02-27T08:45:00.000-08:00</published><updated>2011-12-07T05:08:36.026-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bobby bragan'/><category scheme='http://www.blogger.com/atom/ns#' term='mom'/><category scheme='http://www.blogger.com/atom/ns#' term='dad'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>Dad, do I really need math?</title><content type='html'>My kids are pretty good about their math homework. They seem to enjoy it for the most part. It wasn't always that way. When the going gets tough, the natural human response, it seems, is to quit. So at times in our kids' school careers, their Mom and I have had to hang tough with them to try to make them do their homework. (The credit here belongs to their Mom.)&lt;br /&gt;&lt;br /&gt;I remember when I was in school, the prevailing attitude in the classroom was, "When are we &lt;em&gt;ever&lt;/em&gt; going to need to know this?" The much sadder one was, "My Mom and Dad said that I'm &lt;em&gt;never&lt;/em&gt; going to need to know this stuff."&lt;br /&gt;&lt;br /&gt;I couldn't have told you, when I was 10 years old, that I'd need to understand queueing theory one day in order to finish an Oracle project I had to do for Fidelity Investments. Or that I'd be able to win a &lt;a href="http://en.wikipedia.org/wiki/Jim_Sundberg"&gt;Jim Sundberg&lt;/a&gt; autographed World Series baseball by using the distributive law of multiplication in my head while he was showing 400 people how &lt;a href="http://en.wikipedia.org/wiki/Gaylord_Perry"&gt;Gaylord Perry&lt;/a&gt; liked his signs on the mound. It didn't matter to me, because I just had faith that there was a good reason I was supposed to learn everything I could in school. Having that particular faith was no accident.&lt;br /&gt;&lt;br /&gt;I don't remember my Mom and Dad ever forcing me into doing math. I knew, of course, that it was My Job to do as well as I could in school ('A's are loafing unless they're '100's). But I don't remember ever feeling &lt;em&gt;forced&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;One of the things I fondly remember my Dad doing with me was glide slope calculation. Dad flew for many years for United Airlines. He retired as a 767 captain a long time ago. One of his priorities as a professional was to conserve fuel for his employer. It used to bug him when a pilot would constantly monkey around with the throttle during the approach to a landing. My Dad told me his goal on approach was to dial back the power one time at cruise altitude, at the very beginning of the descent, and then never touch it again until he turned on the &lt;a href="http://en.wikipedia.org/wiki/Thrust_reversal" target="_blank"&gt;thrust reversers&lt;/a&gt; after touchdown.&lt;br /&gt;&lt;br /&gt;So he played this game with me, especially on car rides, because it was a 30-minute drive each day to where I went to grade school. He'd give me the altitude we were at and the altitude we needed to descend to, and either a time limit or the number of miles outbound we were. Then he'd ask me to calculate the sink rate in my head. He put triangles into my brain that I could see every time he asked me a question like that, and I'd hatch on it with him until we came up with the right sink rate. Or he would ask me things like, if the nose is pointing to heading 026, then what heading is our tail pointed at. So he put circles into my brain, too.&lt;br /&gt;&lt;br /&gt;Every once in a while—oh, and I loved this—he would give me a paper flight plan form, with dozens of tiny cells to fill in, and I would fill them all in. I was 6 or 7 when we was doing that. I of course didn't know how to do it correctly, but I filled it all in anyway. Whenever I was really worried about doing it "right," I'd ask my Dad, and he'd tell me the kinds of things I should write down and which cells I should write them in.&lt;br /&gt;&lt;br /&gt;You know the biggest value of that flight planning experience? It was that I &lt;em&gt;couldn't wait&lt;/em&gt; to find out in school someday what &lt;em&gt;point&lt;/em&gt; meant. You know, as in "three point five." I remember the day in class when a teacher finally taught us about decimal points. I felt sooo cool because now I knew what "three point five" actually meant.&lt;br /&gt;&lt;br /&gt;My Dad did things with me that got me interested and excited about doing math, all on my own, without making me feel like I was being punished by it. Thus the abundance of wonderful opportunities that I have today are largely a continuing gift from him. I hope that another gift he gave me is the ability to be a good enough dad myself for my own kiddos, but of course I worry that I'm not doing it enough, or well enough. Telling stories about it helps remind me how important it is.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_mtpW1vu-FYo/SahRj0Ke5aI/AAAAAAAABaw/gomom9jPREs/s1600-h/DSCN0924.JPG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5307581836596012450" src="http://4.bp.blogspot.com/_mtpW1vu-FYo/SahRj0Ke5aI/AAAAAAAABaw/gomom9jPREs/s200/DSCN0924.JPG" style="cursor: pointer; float: right; height: 200px; margin: 0pt 0pt 10px 10px; width: 150px;" /&gt;&lt;/a&gt;What reminded me of all this is a little document called "A Short Course in Human Relations," autographed by &lt;a href="http://www.bobbybragan.org/"&gt;Bobby Bragan&lt;/a&gt;. It sits here in the foyer of our &lt;a href="http://method-r.com/"&gt;Method R&lt;/a&gt; office. I see it every single time I walk through our door. You've probably heard the following statement:&lt;br /&gt;&lt;blockquote&gt;Say you were standing with one foot in the oven and one foot in an ice bucket.  According to the percentage people, you should be perfectly comfortable.&lt;/blockquote&gt;Bobby Bragan &lt;a href="http://www.brainyquote.com/quotes/authors/b/bobby_bragan.html" target="_blank"&gt;said&lt;/a&gt; that; I think it was in 1963. It is a classic illustration of skew, which is vitally important to my career. Bobby Bragan, though, is an American hero for lots of good reasons. You should &lt;a href="http://en.wikipedia.org/wiki/Bobby_Bragan" target="_blank"&gt;read about him&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Well, one night a few years ago, I got to watch Bobby Bragan speak to a small group. His talk was fascinating. He brought a huge box of stuff up to the podium with him, and he warmed up with a game. He opened by pulling something out of the box and saying whoever can answer this riddle gets the prize. The first one was something like, "What has eighteen legs and two breasts?" Shocker, right? The answer was The Supreme Court. Whoever said that, Bobby Bragan tossed him the first prize of the night.&lt;br /&gt;&lt;br /&gt;Pretty deep into his speech, he must have given out twenty prizes to people. Not me. I either didn't know the answer, or I didn't say it loud enough or fast enough. I watched prize after prize go out, until he brought out this autographed document called "A Short Course in Human Relations." He read it aloud. It was an important part of his speech. And then he asked the question that went with it: "Nine ballplayers come out of the dugout before each game, and each ballplayer shakes the hand of every teammate. How many handshakes is that?" The voice that said "thirty-six" was mine. I was doggone lucky that Bobby Bragan had asked a bunch of baseball players a math question, and right on the prize that I really wanted, too.&lt;br /&gt;&lt;br /&gt;Math. You really never know when you're going to need it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-6555196867898537981?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/6555196867898537981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=6555196867898537981' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/6555196867898537981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/6555196867898537981'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/02/dad-do-i-really-need-math.html' title='Dad, do I really need math?'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_mtpW1vu-FYo/SahRj0Ke5aI/AAAAAAAABaw/gomom9jPREs/s72-c/DSCN0924.JPG' height='72' width='72'/><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-5729971738040928324</id><published>2009-02-20T07:08:00.000-08:00</published><updated>2009-02-20T08:42:46.640-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='exended SQL trace'/><category scheme='http://www.blogger.com/atom/ns#' term='v$session_wait'/><category scheme='http://www.blogger.com/atom/ns#' term='queueing theory'/><category scheme='http://www.blogger.com/atom/ns#' term='syscall'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle wait interface'/><title type='text'>Dang it, people, they're syscalls, not "waits"...</title><content type='html'>So many times, I see people get really confused about how to attack an Oracle performance problem, resulting in thoughts that look like this:&lt;br /&gt;&lt;blockquote&gt;I don't understand why my program is so slow. The Oracle wait interface says it's just not waiting on anything. ?&lt;br /&gt;&lt;/blockquote&gt;&lt;a href="http://books.google.com/books?id=dN805AoUyc8C&amp;amp;printsec=frontcover&amp;amp;dq=millsap+oracle&amp;amp;ei=O8meSb_AEoKEzgSO1b3UAQ#PPA240,M1"&gt;The confusion begins with the name "wait event."&lt;/a&gt; I wish Oracle hadn't called them that. I wish instead of WAIT in the extended SQL trace output, they had used the token SYSCALL. Ok, that's seven bytes of trace data instead of just four, so maybe OS instead of WAIT. I wish that they had called &lt;em&gt;v$session_wait&lt;/em&gt; either &lt;em&gt;v$session_syscall&lt;/em&gt; or &lt;em&gt;v$session_os &lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Here's why. First, realize that an Oracle "wait event" is basically the instrumentation for one operating system subroutine call ("syscall"). For example, the Oracle event called &lt;em&gt;db file sequential read&lt;/em&gt;: that's instrumentation for a &lt;em&gt;pread&lt;/em&gt; call on our Linux box. On the same system, a &lt;em&gt;db file scattered read&lt;/em&gt; covers a sequence of two syscalls: &lt;em&gt;_llseek&lt;/em&gt; and &lt;em&gt;readv&lt;/em&gt; (that's one reason why I said &lt;em&gt;basically&lt;/em&gt; at the beginning of this paragraph). The event called &lt;em&gt;enqueue&lt;/em&gt;: that's a &lt;em&gt;semtimedop&lt;/em&gt; call.&lt;br /&gt;&lt;br /&gt;Second, the word &lt;em&gt;wait&lt;/em&gt; is easy to misinterpret. To the Oracle kernel developer who wrote the word &lt;em&gt;WAIT&lt;/em&gt; into the Oracle source code, the word connoted the duration that the code path he was writing would have to "wait" for some syscall to return. But to an end-user or performance analyst, the word &lt;em&gt;wait&lt;/em&gt; has lots of other meanings, too, like (to name just two):&lt;ol&gt;&lt;li&gt;How long the user has to wait for a task to complete (this is &lt;em&gt;R&lt;/em&gt; in the &lt;em&gt;R&lt;/em&gt; = &lt;em&gt;S&lt;/em&gt; + &lt;em&gt;W&lt;/em&gt; equation from queueing theory).&lt;/li&gt;&lt;li&gt;How long the user's task queues for service on a specific resource (this is &lt;em&gt;W&lt;/em&gt; in the &lt;em&gt;R&lt;/em&gt; = &lt;em&gt;S&lt;/em&gt; + &lt;em&gt;W&lt;/em&gt; equation from queueing theory).&lt;/li&gt;&lt;/ol&gt;The problem is that, as obvious and useful as these two definitions seem, neither one of them means what the word &lt;em&gt;wait&lt;/em&gt; means in an Oracle context, which is:&lt;blockquote&gt;&lt;strong&gt;&lt;em&gt;wait&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;n.&lt;/em&gt; In an Oracle context, the approximate response time of what is usually a single operating system call (syscall) executed by an Oracle kernel process.&lt;/blockquote&gt;That's a problem. It's a big problem when people try to stick Oracle &lt;em&gt;wait&lt;/em&gt; times into the &lt;em&gt;W&lt;/em&gt; slot of mathematical queueing models. Because they're not &lt;em&gt;W&lt;/em&gt; values; they're &lt;em&gt;R&lt;/em&gt; values. (But they're not the same &lt;em&gt;R&lt;/em&gt; values as in #1 above.)&lt;br /&gt;&lt;br /&gt;But that's a digression from a much more important point: I think the word &lt;em&gt;wait&lt;/em&gt; simply confuses people into thinking that response time is something different than what it really is. Response time is simply how long it takes to execute a given code path.&lt;blockquote&gt;&lt;strong&gt;To understand response time, you have to understand code path.&lt;/strong&gt;&lt;/blockquote&gt;This is actually the core tenet that divides people who "tune" into two categories: people who look at code path, and people who look at system resources.&lt;br /&gt;&lt;br /&gt;Here's an example of what code path really looks like, for an Oracle process:&lt;pre name="code" class="css"&gt;begin prepare (dbcall)&lt;br /&gt;  execute Oracle kernel code path (mostly CPU)&lt;br /&gt;  maybe make a syscall or two (e.g., "latch: library cache")&lt;br /&gt;  maybe even make recursive prepare, execute, or fetch calls (e.g., view resolution)&lt;br /&gt;end prepare&lt;br /&gt;maybe make a syscall or two (e.g., "SQL*Net message...")&lt;br /&gt;begin execute (another dbcall)&lt;br /&gt;  execute Oracle kernel code path&lt;br /&gt;  maybe make some syscalls (e.g., "db file sequential read" for updates)&lt;br /&gt;end execute&lt;br /&gt;maybe make a syscall or two&lt;br /&gt;begin fetch (another dbcall)&lt;br /&gt;  execute Oracle kernel code path (acquire latches, visit the buffer cache, ...)&lt;br /&gt;  maybe make some syscalls (e.g., "db file...read")&lt;br /&gt;end fetch&lt;br /&gt;make a syscall or two&lt;/pre&gt;The trick is, you can't see this whole picture when you look at &lt;em&gt;v$whatever&lt;/em&gt; within Oracle. You have to look at a lot of &lt;em&gt;v$whatever&lt;/em&gt;s and do a lot of work reconciling what you find, to come up with anything close to a coherent picture of your code path.&lt;br /&gt;&lt;br /&gt;But when you look at the Oracle code path, do you see how the syscalls just kind of blend in with the dbcalls? It's because they're all &lt;em&gt;calls&lt;/em&gt;, and they all take time. It's &lt;a href="http://en.wikipedia.org/wiki/Orthogonality"&gt;non-orthogonal thinking&lt;/a&gt; to call syscalls something other than what they really are: just subroutine calls to another layer in the software stack. Calling all syscalls &lt;em&gt;wait&lt;/em&gt;s diminishes the one distinction that I think really actually &lt;em&gt;is&lt;/em&gt; important; that's the distinction between syscalls that occur &lt;em&gt;within&lt;/em&gt; dbcalls and the syscalls that occur &lt;em&gt;between&lt;/em&gt; dbcalls.&lt;br /&gt;&lt;br /&gt;It's the reason I like &lt;a href="http://method-r.com/downloads/doc_details/10-for-developers-making-friends-with-the-oracle-database-cary-millsap"&gt;extended SQL trace data&lt;/a&gt; so much: it lets me look at my code path without having to spend a bunch of &lt;a href="http://books.google.com/books?id=dN805AoUyc8C&amp;printsec=frontcover&amp;dq=millsap+oracle&amp;ei=O8meSb_AEoKEzgSO1b3UAQ#PPA177,M1"&gt;extra time&lt;/a&gt; trying to compose several different perspectives of performance into a coherent view. The coherent view I want is right there in one place, laid out sequentially for me to look at, and that coherent view fits what the business needs to be looking at, as in...&lt;br /&gt;&lt;br /&gt;Scene 1:&lt;ul&gt;&lt;li&gt;Business person: Our TPS Report is slow.&lt;/li&gt;&lt;li&gt;Oracle person: Yes, our system has a lot of waits. We're working on it.&lt;/li&gt;&lt;li&gt;(Later...) Oracle person: Great news! The problem with the waits has been solved.&lt;/li&gt;&lt;li&gt;Business person: Er, but the TSP Report is still slow.&lt;/li&gt;&lt;/ul&gt;Scene 2:&lt;ul&gt;&lt;li&gt;Business person: Our TPS Report is slow.&lt;/li&gt;&lt;li&gt;Oracle person: I'll look at it.&lt;/li&gt;&lt;li&gt;(Later...) Oracle person: I figured out your problem. The TPS Report was doing something stupid that it didn't need to do. It doesn't anymore.&lt;/li&gt;&lt;li&gt;Business person: Thanks; I noticed. It runs in, like, only a couple seconds now.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-5729971738040928324?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/5729971738040928324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=5729971738040928324' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5729971738040928324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5729971738040928324'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/02/dang-it-people-theyre-syscalls-not.html' title='Dang it, people, they&apos;re syscalls, not &quot;waits&quot;...'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-2993210951256078382</id><published>2009-02-18T15:45:00.000-08:00</published><updated>2009-02-18T20:28:06.038-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tapio lahdenmäki'/><category scheme='http://www.blogger.com/atom/ns#' term='doug burns'/><category scheme='http://www.blogger.com/atom/ns#' term='waste'/><category scheme='http://www.blogger.com/atom/ns#' term='knee'/><category scheme='http://www.blogger.com/atom/ns#' term='throughput'/><category scheme='http://www.blogger.com/atom/ns#' term='optimization'/><category scheme='http://www.blogger.com/atom/ns#' term='profiling'/><category scheme='http://www.blogger.com/atom/ns#' term='response time'/><title type='text'>Throughput versus Response Time</title><content type='html'>I like Doug Burns's recent blog post called &lt;a href="http://oracledoug.com/serendipity/index.php?/archives/1470-Time-Matters-Throughput-vs.-Response-Time.html"&gt;Time Matters: Throughput vs. Response Time&lt;/a&gt;. If you haven't read it, please do. The post and its comment thread are excellent.&lt;br /&gt;&lt;br /&gt;The principle Doug has recognized is why the &lt;em&gt;&lt;a href="http://books.google.com/books?id=mvJW6t7mYU0C&amp;amp;pg=PA256&amp;amp;lpg=PA256&amp;amp;dq=knee+M/M/m+queueing&amp;amp;source=web&amp;amp;ots=p3vqPpiak9&amp;amp;sig=TElb9ev7I-OTAZnTVuw-zCg6R4o&amp;amp;hl=en&amp;amp;ei=Xr6cSbe3M4KOsQPqosyfAg&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;resnum=1&amp;amp;ct=result#PPA257,M1"&gt;knee&lt;/a&gt;&lt;/em&gt; in the performance curve is defined as the traffic intensity (think utilization, or load) value at which, essentially, the ratio of response time divided by throughput is minimized. It's not just the place where response time is minimized (which, as Doug observed, is when there's no load at all except for you, ...which is awesome for you, but not so good for business).&lt;br /&gt;&lt;br /&gt;I'd like to emphasize a couple of points. First, batch and interactive workloads have wholly different performance requirements, which several people have already noted in their comments to Doug's post. With batch work, people are normally concerned with maximizing throughput. With online work, individual people care more about their own response times than group throughput, although those people's managers probably care more about group throughput. The individual people probably care about group throughput too, but not so much that they're happy about staying late after work to provide it when their individual tasks run so slowly they can't finish them during the normal working day.&lt;br /&gt;&lt;br /&gt;In addition to having different performance requirements, batch workload can often be scheduled differently, too. If you're lucky, you can schedule your batch workload &lt;em&gt;deterministically&lt;/em&gt;. For example, maybe you can employ a batch workload manager that feeds workload to your system like a carefully timed &lt;a href="http://en.wikipedia.org/wiki/Intravenous_therapy"&gt;IV drip&lt;/a&gt;, to keep your system's CPU utilization pegged at 100% without causing your &lt;a href="http://en.wikipedia.org/wiki/Run_queue"&gt;CPU run-queue&lt;/a&gt; depth to exceed 1.0. But online workload is almost always &lt;a href="http://en.wikipedia.org/wiki/Non-deterministic_algorithm"&gt;&lt;em&gt;non&lt;/em&gt;deterministic&lt;/a&gt;, which is to say that it can't be scheduled at all. That's why you have to keep some spare un-utilized system capacity handy; otherwise, your system load goes out past the nasty &lt;a href="http://books.google.com/books?id=mvJW6t7mYU0C&amp;amp;pg=PA256&amp;amp;lpg=PA256&amp;amp;dq=knee+M/M/m+queueing&amp;amp;source=web&amp;amp;ots=p3vqPpiak9&amp;amp;sig=TElb9ev7I-OTAZnTVuw-zCg6R4o&amp;amp;hl=en&amp;amp;ei=Xr6cSbe3M4KOsQPqosyfAg&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;resnum=1&amp;amp;ct=result#PPA257,M1"&gt;knee&lt;/a&gt; in your performance curve, and your users' response times behave exponentially in response to microscopic changes in load, which results in much Pain and Suffering.&lt;br /&gt;&lt;br /&gt;My second point is one that I find that a lot of people don't understand very well: Focusing on individual response time—as in &lt;a href="http://carymillsap.blogspot.com/search?q=profile"&gt;profiling&lt;/a&gt;—for an individual business task is an &lt;em&gt;essential&lt;/em&gt; element in a process to maximize throughput, too. There are good ways to make a task faster, and there are bad ways. Good ways eliminate unnecessary work from the task without causing negative side-effects for tasks you're not analyzing today. Bad ways accidentally degrade the performance of tasks other than the one(s) you're analyzing.&lt;br /&gt;&lt;br /&gt;If you stick to the good ways, you don't end up with the see-saw effect that most people seem to think of when they hear "optimize one business task at a time." You know, the idea that tuning A breaks B; then tuning B breaks A again. If this is happening to you, then you're doing it wrong. Trying to respond to performance problems by making global parameter changes commonly causes the see-saw problem. But eliminating wasteful work creates collateral benefits that allow competing tasks on your system to run faster because the task you've optimized now uses fewer resources, giving everything else freer and clearer access to the resources they need, without having to queue so much for them.&lt;br /&gt;&lt;br /&gt;Figuring out how to eliminate wasteful work is where the real fun begins. A lot of the tasks we see are fixable by just changing just a little bit of source code. I mean the &lt;a href="http://karenmorton.blogspot.com/2008/07/analytics-to-rescue-followup.html"&gt;&lt;span&gt;2,142,103&lt;/span&gt;-latch query that consumes only 9,098 latches after fixing&lt;/a&gt;; things like that. A lot more are fixable by simply &lt;a href="http://method-r.com/downloads/doc_details/11-managing-statistics-for-optimal-query-performance-karen-morton"&gt;collecting statistics correctly&lt;/a&gt;. Others require adjustments to an application's indexing strategy, which can seem tricky when you need to optimize across a collection of SQL statements (here comes the see-saw), but even that is pretty much a solved problem if you understand &lt;a href="http://www.amazon.com/gp/product/0471719994?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0471719994"&gt;Tapio Lahdenmäki's work&lt;/a&gt; (except for the inevitable politics of change control).&lt;br /&gt;&lt;br /&gt;Back to the idea of &lt;a href="http://oracledoug.com/serendipity/index.php?/archives/1470-Time-Matters-Throughput-vs.-Response-Time.html"&gt;Doug's original post&lt;/a&gt;, I wholeheartedly agree that you want to optimize both throughput and response time. The business has to decide what mixture is right. And I believe it's crucial to focus on &lt;a href="http://books.google.com/books?id=mvJW6t7mYU0C&amp;amp;pg=PA290&amp;amp;lpg=PA290&amp;amp;dq=%22optimizing+oracle+performance%22+eliminate+waste&amp;amp;source=web&amp;amp;ots=p3vqPpidm6&amp;amp;sig=IzkzJTjg6PE-OPJrm3BpzTLghiA&amp;amp;hl=en&amp;amp;ei=mr-cSfTeOor2sAOKsJiqAg&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;resnum=3&amp;amp;ct=result"&gt;eliminating waste&lt;/a&gt; from each individual competing task if you're going to have any hope of optimizing &lt;em&gt;anything&lt;/em&gt;, whether you care more about response time, or throughput.&lt;br /&gt;&lt;br /&gt;Think about it this way... A task cannot run at its optimal speed unless it is efficient. You cannot know whether a task is efficient without measuring it. And I mean specifically and exactly &lt;em&gt;&lt;strong&gt;it&lt;/strong&gt;&lt;/em&gt;, &lt;em&gt;not&lt;/em&gt; just &lt;em&gt;part&lt;/em&gt; of "it" or "it" &lt;em&gt;plus&lt;/em&gt; a bunch of other stuff surrounding it. That's what &lt;a href="http://carymillsap.blogspot.com/search?q=profiling"&gt;profiling&lt;/a&gt; &lt;em&gt;is&lt;/em&gt;: the measurement of exactly one interesting task that allows you to determine exactly where that task spends its time, and thus whether that task is spending your system's time and resources efficiently.&lt;br /&gt;&lt;br /&gt;You can improve a system without profiling, and maybe you can even optimize one without profiling. But you can't &lt;em&gt;know&lt;/em&gt; whether a system is optimal without knowing whether its tasks are efficient, and you can't know whether a given task is efficient without profiling it.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/em&gt;When you don't know, you waste time and money. This is why I contend that the ability to profile a single task is absolutely vital to anyone wanting to optimize performance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-2993210951256078382?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/2993210951256078382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=2993210951256078382' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2993210951256078382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2993210951256078382'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/02/throughput-versus-response-time.html' title='Throughput versus Response Time'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-5460157944987382670</id><published>2009-02-16T14:57:00.001-08:00</published><updated>2009-02-16T15:23:34.835-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tim sanders'/><category scheme='http://www.blogger.com/atom/ns#' term='tag'/><category scheme='http://www.blogger.com/atom/ns#' term='cliff'/><category scheme='http://www.blogger.com/atom/ns#' term='love is the killer app'/><title type='text'>Thank you, Tim Sanders</title><content type='html'>I grew up with the idea that you never, ever write in a book. Unless you're correcting a mistake. (The book never "gets it" except when the book &lt;em&gt;deserves&lt;/em&gt; it.)&lt;br /&gt;&lt;br /&gt;But I was wrong. &lt;a href="http://www.timsanders.com/"&gt;Tim Sanders&lt;/a&gt; fixed me. His book, &lt;a href="http://www.amazon.com/gp/product/1400046831?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1400046831"&gt;Love Is the Killer App: How to Win Business and Influence Friends&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=methodrcom-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1400046831" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;, in the section about Knowledge (page 82) just saved me a few hours. Tim recommended to me that as I read, I should &lt;em&gt;tag&lt;/em&gt; and &lt;em&gt;cliff&lt;/em&gt; within the book itself. His advice made me uncomfortable, because it made good sense, &lt;strong&gt;but I do not write in books.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;So, I was just wrong. I didn't summon the courage to tag or cliff Tim's book, but I resolved to tag and cliff the next few. And wow, it's a Good Thing. It's basically the act of creating an index for stuff you want to find later. I just saved myself a couple of hours looking for a passage in a book that I found in about 30 seconds because I had tagged it inside the front cover. My tag told me the page number and the concept I was looking for, and—poof!—I snapped right to it, there it was. That's &lt;em&gt;index access by rowid&lt;/em&gt; for the brain.&lt;br /&gt;&lt;br /&gt;Now I write in all the books I read. It works, and I highly recommend it.&lt;br /&gt;&lt;br /&gt;Thank you, &lt;a href="http://karenmorton.blogspot.com/"&gt;Karen Morton&lt;/a&gt;, for giving me the copy of Tim's book.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-5460157944987382670?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/5460157944987382670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=5460157944987382670' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5460157944987382670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5460157944987382670'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/02/thank-you-tim-sanders.html' title='Thank you, Tim Sanders'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-6387804799130857921</id><published>2009-02-13T09:36:00.000-08:00</published><updated>2009-02-13T09:38:20.143-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rmoug'/><category scheme='http://www.blogger.com/atom/ns#' term='dan norris'/><title type='text'>Thank you, RMOUG</title><content type='html'>I want to thank everyone who came to watch me present my session called, "&lt;a href="http://method-r.com/downloads/doc_details/10-for-developers-making-friends-with-the-oracle-database-cary-millsap"&gt;For Developers: Making Friends with the Oracle Database&lt;/a&gt;" session yesterday at &lt;a href="http://rmoug.org/"&gt;RMOUG&lt;/a&gt; in Denver. I don't know how many of you were there, but it felt like at least a couple hundred, and I'm grateful to you for sharing your time with me. I hope you had as much fun as I did.&lt;br /&gt;&lt;br /&gt;RMOUG was another excellent show. Lots of happy people learning and sharing what they know: you can't beat that. I think &lt;a href="http://www.dannorris.com"&gt;Dan Norris&lt;/a&gt; captured the spirit of the event very well in his blog (which is now on my blogroll).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-6387804799130857921?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/6387804799130857921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=6387804799130857921' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/6387804799130857921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/6387804799130857921'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/02/thank-you-rmoug.html' title='Thank you, RMOUG'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-1887880638962076159</id><published>2009-02-13T09:15:00.000-08:00</published><updated>2009-02-13T09:40:30.828-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='Karen Morton'/><category scheme='http://www.blogger.com/atom/ns#' term='Hotsos Symposium'/><title type='text'>Oracle Optimizer Statistics</title><content type='html'>Accidentally messing up table statistics is probably the single most common cause for poor SQL query performance that I've ever seen. At &lt;a href="http://karenmorton.blogspot.com/2009/02/new-paper-and-cj-date-advert.html"&gt;Karen Morton's blog&lt;/a&gt;, you'll find a link to the best &lt;em&gt;paper&lt;/em&gt; on the subject that I've ever seen.&lt;br /&gt;&lt;br /&gt;Karen is going to present this topic at the &lt;a href="http://www.hotsos.com/sym09.html"&gt;Hotsos Symposium&lt;/a&gt; here in Dallas in just a few weeks. I'll hope to see you there. This one's &lt;em&gt;big&lt;/em&gt;: Chris Date.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-1887880638962076159?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/1887880638962076159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=1887880638962076159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1887880638962076159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1887880638962076159'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/02/oracle-optimizer-statistics.html' title='Oracle Optimizer Statistics'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-8660967190356880110</id><published>2009-02-05T06:03:00.000-08:00</published><updated>2009-02-05T09:05:27.661-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='donald knuth'/><category scheme='http://www.blogger.com/atom/ns#' term='instrumentation'/><category scheme='http://www.blogger.com/atom/ns#' term='endowment effect'/><category scheme='http://www.blogger.com/atom/ns#' term='chen shapira'/><category scheme='http://www.blogger.com/atom/ns#' term='tom kyte'/><title type='text'>On the Usefulness of Software Instrumentation</title><content type='html'>I appreciate that in today's reading, Chen Shapira has taught me about the psychological principle of the &lt;a href="http://en.wikipedia.org/wiki/Endowment_effect"&gt;endowment effect&lt;/a&gt; and its influence over people's decision-making about whether to instrument their code. I'm beginning to collect a nice little list of inspiring observations about performance instrumentation. I've posted them in a &lt;a href="https://method-r.fogbugz.com/default.asp?W265"&gt;public wiki&lt;/a&gt;. I hope you'll join in.&lt;br /&gt;&lt;br /&gt;Here are some samples:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://prodlife.wordpress.com/2009/02/04/psychology-of-instrumentation/"&gt;Chen Shapira&lt;/a&gt;: The pervasive lack of instrumentation in software products is more a result of &lt;a href="http://en.wikipedia.org/wiki/Endowment_effect"&gt;psychological bias&lt;/a&gt; than real technical concerns. Software vendors can work around these psychological issues by building instrumentation as a default into tools involved in the development and deployment process. Just as Knuth said 35 years ago.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf"&gt;Don Knuth&lt;/a&gt;: I've become convinced that all compilers written from now on should be designed to provide all programmers with feedback indicating what parts of their programs are costing the most; indeed, this feedback should be supplied automatically unless it has been specifically turned off.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tkyte.blogspot.com/2005/06/instrumentation.html"&gt;Tom Kyte&lt;/a&gt;: I have yet in 18 years to hear a valid reason why instrumentation should not be done. I have only heard extremely compelling reasons why it &lt;strong&gt;&lt;em&gt;must&lt;/em&gt;&lt;/strong&gt; be done.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tkyte.blogspot.com/2005/06/instrumentation.html"&gt;Tom Kyte&lt;/a&gt;: To the developers that say “this is extra code that will just make my code run slower” I respond “well fine, we will take away V$ views, there will be no SQL_TRACE, no 10046 level 12 traces, in fact–that entire events subsystem in Oracle, it is gone”. Would Oracle run faster without this stuff? Undoubtedly—&lt;strong&gt;&lt;em&gt;not.&lt;/em&gt;&lt;/strong&gt; It would run many times slower, perhaps hundreds of times slower. Why? Because you would have no clue where to look to find performance related issues. You would have nothing to go on. Without this “overhead” (air quotes intentionally used to denote sarcasm there), Oracle would not have a chance of performing as well as it does. Because you would not have a change to make it perform well. Because you would not know where even to begin.&lt;br /&gt;&lt;br /&gt;Tom Kyte (I don't know of a link to this one; I'm paraphrasing from public statements I've seen him make): Showing where your code spends its time is a necessary function of any production application. The fact that the extra code required to do this consumes extra system capacity is no different from any other feature in your application. As with any required feature, you simply have to size your hardware with the feature in mind.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://prodlife.wordpress.com/2009/02/04/psychology-of-instrumentation/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-8660967190356880110?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/8660967190356880110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=8660967190356880110' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8660967190356880110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8660967190356880110'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/02/on-usefulness-of-software.html' title='On the Usefulness of Software Instrumentation'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-2987367491565713268</id><published>2009-02-04T08:09:00.000-08:00</published><updated>2009-02-04T08:23:31.509-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='toine van beckhoven'/><category scheme='http://www.blogger.com/atom/ns#' term='masterclass'/><category scheme='http://www.blogger.com/atom/ns#' term='miracle benelux'/><category scheme='http://www.blogger.com/atom/ns#' term='function-based index'/><category scheme='http://www.blogger.com/atom/ns#' term='tom kyte'/><title type='text'>A report about our course in Utrecht</title><content type='html'>&lt;a href="http://toinevanbeckhoven.wordpress.com/"&gt;Toine van Beckhoven&lt;/a&gt; has blogged about his experience in our recent course in Utrecht, hosted by &lt;a href="http://www.miraclebenelux.nl/"&gt;Miracle Benelux&lt;/a&gt;. I also like his post about the new function-based index he created after an inspiration from the &lt;a href="http://tkyte.blogspot.com/"&gt;Tom Kyte&lt;/a&gt; course he attended.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-2987367491565713268?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/2987367491565713268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=2987367491565713268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2987367491565713268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2987367491565713268'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/02/report-about-our-course-in-utrecht.html' title='A report about our course in Utrecht'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-1136963133465074407</id><published>2009-02-03T07:06:00.000-08:00</published><updated>2009-02-03T12:17:13.345-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='donald knuth'/><category scheme='http://www.blogger.com/atom/ns#' term='premature optimization'/><category scheme='http://www.blogger.com/atom/ns#' term='optimization'/><category scheme='http://www.blogger.com/atom/ns#' term='profiling'/><title type='text'>Reading Knuth</title><content type='html'>I've been reading a little Knuth for the past couple of days. I've read about the famous statement, "premature optimization is the root of all evil," many times, and yesterday I decided to read his statement in its whole context. You can find Knuth's whole article here (thank you, &lt;a href="http://en.wikipedia.org/wiki/Optimization_%28computer_science%29"&gt;Wikipedia&lt;/a&gt;):&lt;br /&gt;&lt;blockquote&gt;Knuth, Donald: &lt;a href="http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf"&gt;Structured Programming with Goto Statements&lt;/a&gt;. &lt;em&gt;Computing Surveys&lt;/em&gt; &lt;b&gt;6&lt;/b&gt;:4 (1974), 261–301.&lt;/blockquote&gt;I want to quote the passage for you that contains the famous line about premature optimization. It's on page 268 (the eighth page of the article):&lt;blockquote&gt;There is no doubt that the grail of efficiency leads to abuse. Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We &lt;em&gt;should&lt;/em&gt; forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.&lt;/blockquote&gt;Most people stop here when they quote Knuth. But actually, it just keeps getting better:&lt;blockquote&gt;Yet we should not pass up our opportunities in that critical 3%. A good programmer will not be lulled into complacency by such reasoning, he will be wise to look carefully at the critical code; but only &lt;em&gt;after&lt;/em&gt; that code has been identified. It is often a mistake to make a priori judgments about what parts of a program are really critical, since the universal experience of programmers who have been using measurement tools has been that their intuitive guesses fail. After working with such tools for seven years, I've become convinced that all compilers written from now on should be designed to provide all programmers with feedback indicating what parts of their programs are costing the most; indeed, this feedback should be supplied automatically unless it has been specifically turned off.&lt;/blockquote&gt;What a beautiful expression of the idea that's at the core of &lt;a href="http://method-r.com/about-us/39-the-company/57-about-us"&gt;what I do for a living&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you haven't seen "&lt;a href="http://method-r.com/downloads/doc_details/10-for-developers-making-friends-with-the-oracle-database-cary-millsap"&gt;For Developers: Making Friends with the Oracle Database&lt;/a&gt;" yet, I hope you'll take a look. My aim is to help Oracle application developers writing Java, PHP, C#—or anything else—understand how to find that critical code that Knuth wrote about in 1974. ...And, just as importantly, how to ignore the other 97% of your code that you shouldn't be worrying about.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-1136963133465074407?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/1136963133465074407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=1136963133465074407' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1136963133465074407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1136963133465074407'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/02/reading-knuth.html' title='Reading Knuth'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-8518527610755344866</id><published>2009-01-23T08:29:00.001-08:00</published><updated>2009-01-23T08:39:37.984-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='miracle'/><category scheme='http://www.blogger.com/atom/ns#' term='Jeff Holt'/><category scheme='http://www.blogger.com/atom/ns#' term='marco gralike'/><title type='text'>Jeff and Cary in Utrecht</title><content type='html'>Here's a &lt;a href="http://www.liberidu.com/blog/?p=782"&gt;very nice post by Marco Gralike&lt;/a&gt; about this week's &lt;a href="http://www.miraclebenelux.nl/index.php?option=com_content&amp;amp;view=article&amp;amp;id=1&amp;amp;Itemid=11"&gt;MasterClass&lt;/a&gt; that Jeff and I taught in Holland. Thank you to all the students who joined us, and to our friends at &lt;a href="http://www.miraclebenelux.nl/"&gt;Miracle Benelux&lt;/a&gt; for producing the event.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-8518527610755344866?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/8518527610755344866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=8518527610755344866' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8518527610755344866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8518527610755344866'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/01/jeff-and-cary-in-utrecht.html' title='Jeff and Cary in Utrecht'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-3995093207235683656</id><published>2009-01-07T16:03:00.001-08:00</published><updated>2009-01-07T20:45:57.055-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><category scheme='http://www.blogger.com/atom/ns#' term='whitepaper'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>New whitepaper: "Making Friends..."</title><content type='html'>I've just posted a new 18-page whitepaper called "For Developers: Making Friends with the Oracle Database" at our &lt;a href="http://method-r.com/downloads/cat_view/38-papers-and-articles"&gt;method-r.com papers and articles downloads page&lt;/a&gt;. Let me know what you think...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-3995093207235683656?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/3995093207235683656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=3995093207235683656' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3995093207235683656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3995093207235683656'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2009/01/new-whitepaper-making-friends.html' title='New whitepaper: &quot;Making Friends...&quot;'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-1200534373713346608</id><published>2008-12-31T06:50:00.000-08:00</published><updated>2009-01-08T18:59:01.466-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sync'/><category scheme='http://www.blogger.com/atom/ns#' term='calaboration'/><category scheme='http://www.blogger.com/atom/ns#' term='iCal'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='google calendar'/><category scheme='http://www.blogger.com/atom/ns#' term='TripIt'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Syncing..., Part 3</title><content type='html'>In a &lt;a href="http://carymillsap.blogspot.com/search?q=sync+iphone"&gt;couple of prior posts&lt;/a&gt;, I described some of my requirements for syncing my iPhone with my laptop computer. A couple of months ago, I solved the problem (and a whole bunch of other ones, too). I'm very pleased with the solution I chose, which I'll share with you here.&lt;br /&gt;&lt;br /&gt;I bought a new MacBook Pro. Not one of the new &lt;a href="http://www.apple.com/mac/"&gt;solid-brick-of-aluminum ones&lt;/a&gt;, but one of the slightly older aluminum ones held together with screws. It has a beautiful 15-inch matte-finish monitor, and it's faster than any portable I've ever used. It runs Windows XP applications in my Fusion VM about 33% faster than the native XP laptop I replaced.&lt;br /&gt;&lt;br /&gt;It was a big investment, but I love it. Every time I open up my MacBook, I feel good. Thirty seconds later after it has booted completely from scratch, I love it even more.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.vmware.com/products/fusion/"&gt;VMware Fusion&lt;/a&gt;, by the way, is a brilliant penetrant to the barriers I had perceived about moving from Microsoft Windows to Mac OS X. With Fusion, you can make your whole Windows PC run on your Mac if you want to. As you gain comfort in OS X, you can migrate applications from Windows to the native Mac operating system. I digress...&lt;br /&gt;&lt;br /&gt;So, now I use iCal, which gives me the ability to subscribe to iCal feeds like the one from &lt;a href="http://tripit.com/"&gt;TripIt&lt;/a&gt;. And ones like webcal://&lt;span class="nfakPe"&gt;ical&lt;/span&gt;.mac.com/&lt;span class="nfakPe"&gt;ical&lt;/span&gt;/, which automagically populate your calendar with US holidays, so you won't accidentally book a course on Labor Day. (Visit &lt;a href="http://www.icalworld.com/index.html"&gt;iCal World&lt;/a&gt; for more.)&lt;br /&gt;&lt;br /&gt;My new system completely solves the travel problems I was talking about. Now, I do this before I travel:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Book travel.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Forward the confirmation emails to plans@tripit.com.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Print my TripIt unified itinerary for my briefcase. (Or not.)&lt;/li&gt;&lt;li&gt;Sync my iPhone with my laptop.&lt;/li&gt;&lt;/ol&gt;And that's it. No data double-entry. None.&lt;br /&gt;&lt;br /&gt;One more requirement I had, though, was syncing my iCal calendar with Google Calendar. I found a solution to that one, too. I tried using the &lt;a href="http://code.google.com/p/calaboration/"&gt;Google Calaboration&lt;/a&gt;, but I really didn't like the way it forced me to deal with my separate calendars. The tool I chose is called Spanning Sync. I used their 15-day trial, liked it a lot, and bought a subscription. I love the way I can map from my list of Google calendars to my list of iCal calendars. However, I don't like the way it syncs my contacts, so I just turn that feature off.&lt;br /&gt;&lt;br /&gt;I'm intrigued by the Spanning Sync business model as well. You can &lt;a href="http://www.blogger.com/%27http://spanningsync.com/?r=" 39pkxv=""&gt;save $5 on Spanning Sync by clicking here&lt;/a&gt;. It works like this (I'm quoting here a Spanning Sync web page)...&lt;br /&gt;&lt;blockquote&gt;After a 15-day free trial period, Spanning Sync usually costs $25/year, but you can save $5 by using my discount code if you decide to buy it:&lt;br /&gt;&lt;br /&gt;39PKXV&lt;br /&gt;&lt;br /&gt;Also, if you use my code I'll get a $5 referral fee from Spanning Sync. Once you're a subscriber you'll get a code of your own so you can make money every time one of your other friends subscribes to Spanning Sync. Pretty cool!&lt;br /&gt;&lt;/blockquote&gt;Anyway, I'm very pleased with the new system, and I'm happy to share the news.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-1200534373713346608?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/1200534373713346608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=1200534373713346608' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1200534373713346608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1200534373713346608'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/12/syncing-part-3.html' title='Syncing..., Part 3'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-1932334649080121385</id><published>2008-12-29T08:44:00.000-08:00</published><updated>2008-12-29T09:31:57.219-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='justin martin'/><category scheme='http://www.blogger.com/atom/ns#' term='peg mcmahon'/><category scheme='http://www.blogger.com/atom/ns#' term='performance as a service'/><category scheme='http://www.blogger.com/atom/ns#' term='robyn sands'/><title type='text'>Performance as a Service, Part 2</title><content type='html'>Over the holiday weekend, Dallas left a &lt;a href="http://carymillsap.blogspot.com/2008/06/performance-as-service.html"&gt;comment on my July 7 post&lt;/a&gt; that begins with this:&lt;blockquote&gt;One of the biggest issues I run into is that most of my customers have no SLAs outside of availability.&lt;/blockquote&gt;It's an idea that resonates with a lot of people that I talk to.&lt;br /&gt;&lt;br /&gt;I see the following progressive hierarchy when it comes to measuring performance... &lt;ol&gt;&lt;li&gt;Don't measure response times at all.&lt;/li&gt;&lt;li&gt;Measure response times. Don't alert at all.&lt;/li&gt;&lt;li&gt;Measure response times. Alert against thresholds.&lt;/li&gt;&lt;li&gt;Measure response times. Alert upon variances.&lt;/li&gt;&lt;/ol&gt;Most people don't measure response times at all (category 1), at least not until there's trouble. Most people don't measure response times even then, but some do. Not many people fit into what I've called category 2, because once you have a way to collect response time data, it's too tempting to do some kind of alerting with it.&lt;br /&gt;&lt;br /&gt;Category 3 is a world in which people measure response times, and they compare those response times against some pre-specified list of tolerances for those response times. Here's where the big problem that Dallas is talking about hits you: Where does that list of tolerances come from? It takes &lt;em&gt;work&lt;/em&gt; to make that list, and preceding that work is the &lt;em&gt;motivation&lt;/em&gt; to make that list. Many companies just don't have that motivation.&lt;br /&gt;&lt;br /&gt;I think it's the specter of the difficulty in getting to category 3 that prevents a lot of people from moving into category 2. I think that is Dallas's situation.&lt;br /&gt;&lt;br /&gt;A few years ago, I would have listed category 3 at the top of my hierarchy, but at &lt;a href="http://www.cmg.org/conference/cmg2007/"&gt;CMG'07&lt;/a&gt;, in a paper called "&lt;a href="http://www.cmg.org/conference/cmg2007/awards/7122.pdf"&gt;Death to Dashboards...&lt;/a&gt;," Peg McMahon and Justin Martin made me aware of another level: this notion of alerting based on variance.&lt;br /&gt;&lt;br /&gt;The plan of creating a tolerance for every business task you execute on your system works fine for a few interesting tasks, but the idea doesn't scale to systems with hundreds or thousands of instrumented tasks. The task of negotiating, setting, and maintaining hundreds of different tolerances is just too labor-intensive.&lt;br /&gt;&lt;br /&gt;Peg and Justin's paper described the notion that not bothering with individual tolerances works just as well—and with very low setup cost—because what you really ought to look out for are &lt;em&gt;changes&lt;/em&gt; in response times. (It's an idea similar to what Robyn Sands described at &lt;a href="https://portal.hotsos.com/events/SYM08"&gt;Hotsos Symposium 2008&lt;/a&gt;.) You can look for variances without defining tolerances, but of course you cannot do it without measuring response times.&lt;br /&gt;&lt;br /&gt;Dallas ends with: &lt;blockquote&gt;I think one of the things you might offer as part of the "Performance as a Service" might be assisting customers in developing those performance SLAs, especially since your team is very experienced in knowing what is possible.&lt;/blockquote&gt;I of course love that he made that point, because this is exactly the kind of thing we're in business to do for people. Just contact us through &lt;a href="http://method-r.com/contact-us"&gt;http://method-r.com&lt;/a&gt;. We are ready, willing, and able, and now is a great time to schedule something.&lt;br /&gt;&lt;br /&gt;There is a lot of value in doing the response time instrumentation exercise, no matter how you do alerting. The value comes in two main ways. First, just the act of measuring often reveals inefficiencies that are easy and inexpensive to fix. We find little mistakes all the time that make systems faster and nicer to use and that allow companies to use their IT budgets more efficiently. Second, response time information is just fascinating. It's valuable for people on both sides of the information supply-and-demand relationship to see how fast things really are, and how often you really run them. Seeing &lt;em&gt;real&lt;/em&gt; performance data brings ideas together. It happens even if you don't choose to do alerting at all.&lt;br /&gt;&lt;br /&gt;The biggest hurdle is in moving from category 1 to category 2. Once you're at category 2, your hardest work is behind you, and you and your business will have exactly the information you'll need for deciding whether to move on to category 3 or 4.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-1932334649080121385?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/1932334649080121385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=1932334649080121385' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1932334649080121385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/1932334649080121385'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/12/performance-as-service-part-2.html' title='Performance as a Service, Part 2'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-2553297304134186229</id><published>2008-12-22T09:17:00.001-08:00</published><updated>2008-12-23T22:03:35.794-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tree house'/><category scheme='http://www.blogger.com/atom/ns#' term='rehearsal'/><category scheme='http://www.blogger.com/atom/ns#' term='visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='extreme programming'/><category scheme='http://www.blogger.com/atom/ns#' term='xp'/><category scheme='http://www.blogger.com/atom/ns#' term='planning'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='blue angels'/><title type='text'>Cuts, Thinks About Cutting, Part 2</title><content type='html'>Thank you all for your &lt;a href="https://www.blogger.com/comment.g?blogID=2954359812249072053&amp;amp;postID=9048379607383401867"&gt;comments&lt;/a&gt; on my prior post.&lt;br /&gt;&lt;br /&gt;To Robyn's point in particular, I believe the processes of rehearsing, visualizing, and planning have extraordinarily high value. Visualization and rehearsal are vital, in my opinion, to doing anything well. Ask pilots, athletes, actors, public speakers, programmers, .... Check out &lt;a href="http://shopping.discovery.com/product-59147.html"&gt;"Blue Angels: A Year in the Life"&lt;/a&gt; from the Discovery Channel for a really good example.&lt;br /&gt;&lt;br /&gt;But there's a time when the incremental value of planning drops beneath the value of actually doing something. I think the location of that "time" and the concept of obsessiveness are related. I'm learning that it's earlier than I had believed when I was younger.&lt;br /&gt;&lt;br /&gt;The one sentence in my original blog post that captures the idea I want to emphasize is, "I'm not advocating that design shouldn't happen; I'm advocating that you not pretend your design is build-worthy before you can possibly know."&lt;br /&gt;&lt;br /&gt;Thinking of all this reminds me of a "tree house" I wanted to build when I was about 10 years old. I use quotation marks, because it wasn't meant to have anything to do with a tree at all. Here was the general idea of the design:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_mtpW1vu-FYo/SU_YPJxDUaI/AAAAAAAABag/Bs7YV6rpmxM/s1600-h/Treehouse.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 84px;" src="http://1.bp.blogspot.com/_mtpW1vu-FYo/SU_YPJxDUaI/AAAAAAAABag/Bs7YV6rpmxM/s200/Treehouse.jpg" alt="" id="BLOGGER_PHOTO_ID_5282678642760176034" border="0" /&gt;&lt;/a&gt;My dad was a pilot, so when I was 10, I was too. The front of this thing was going to have an instrument panel and some windows, and I was going to fly this thing everywhere I could think of.&lt;br /&gt;&lt;br /&gt;I drew detailed design drawings, and I dug a hole. (If you have children, by the way, make sure they dig a hole sometime before they grow up. Trust me.) My plan called for a 2x4 frame with plywood walls screwed to that frame. It's when I started gathering the 2x4 lumber that my plan fell apart. See, I had naively planned that 2x4 lumber is 2 inches thick by 4 inches wide. &lt;a href="http://mistupid.com/homeimpr/lumber.htm" target="_blank"&gt;It's not&lt;/a&gt;. It's 1-1/2 inches thick by 3-1/2 inches wide. That meant I'd have to redraw my whole plan. Using fractions.&lt;br /&gt;&lt;br /&gt;I don't remember exactly what happened next, but I do remember exactly what didn't happen. I didn't redraw my whole plan, and I didn't ever build the "tree house." Eventually, I did finally fill in that hole in the yard.&lt;br /&gt;&lt;br /&gt;Here are some lessons to take away from that experience:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Not understanding other people's specs well enough is one way to screw up your project.&lt;/li&gt;&lt;li&gt;Actually getting started is a sure way to learn what you need to know about those other people's specs.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You learn things in reality that you just don't learn when you're working on paper.&lt;/li&gt;&lt;li&gt;Not building the "tree house" at all meant that I'd have to wait until I was older to learn that putting wood on (or into) the ground is an impermanent solution.&lt;/li&gt;&lt;li&gt;The problems that you think during the design phase are your big problems may not be your &lt;em&gt;actual&lt;/em&gt; big problems.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-2553297304134186229?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/2553297304134186229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=2553297304134186229' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2553297304134186229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2553297304134186229'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/12/cuts-thinks-about-cutting-part-2.html' title='Cuts, Thinks About Cutting, Part 2'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_mtpW1vu-FYo/SU_YPJxDUaI/AAAAAAAABag/Bs7YV6rpmxM/s72-c/Treehouse.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-9048379607383401867</id><published>2008-12-19T09:37:00.000-08:00</published><updated>2008-12-19T14:08:41.061-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='extreme programming'/><category scheme='http://www.blogger.com/atom/ns#' term='xkcd'/><category scheme='http://www.blogger.com/atom/ns#' term='xp'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>Cuts, Thinks About Cutting</title><content type='html'>&lt;a href="http://xkcd.com/519/" target="_blank"&gt;&lt;img src="http://imgs.xkcd.com/comics/11th_grade.png" width="375" height="233" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This &lt;a href="http://xkcd.com/" target="_blank"&gt;xkcd&lt;/a&gt; comic I saw today reminded me of a conversation a former colleague at Oracle and I had some years ago. During a break in one of the dozens of unmemorable meetings we attended together, he and I were talking about our wood shops. He had built several things lately, which he had told me about. I was in the planning phase of some next project I was going to do. He observed that this seemed to be the conversation we were always having. He argued that it would be better for me to build something, have the fun of building it, actually &lt;em&gt;use&lt;/em&gt; the thing I had built, and then learn from my mistakes than to spend so much of my time hatching on what I was going to do next.&lt;br /&gt;&lt;br /&gt;I of course argued that I didn't want to waste my very precious whatever-it-was that I would mess up if I didn't do it exactly right on the first try. We went back and forth over the idea, until we had to go back to our unmemorable meeting. I remember him shaking his head as we walked back in.&lt;br /&gt;&lt;br /&gt;Sometime after we sat down, he passed a piece of paper over to me that looked like this:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mtpW1vu-FYo/SUvmfl4LM3I/AAAAAAAABZ4/kKwaCpkmzac/s1600-h/cuts.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 66px;" src="http://3.bp.blogspot.com/_mtpW1vu-FYo/SUvmfl4LM3I/AAAAAAAABZ4/kKwaCpkmzac/s200/cuts.jpg" alt="" id="BLOGGER_PHOTO_ID_5281568418440098674" border="0" /&gt;&lt;/a&gt;It said "cuts" with an arrow pointing to him, and "thinks about cutting" with an arrow pointing to me.&lt;br /&gt;&lt;br /&gt;Thus was I irretrievably labeled.&lt;br /&gt;&lt;br /&gt;He was right. In recent years, I've grown significantly in the direction of acquiring actual experience, not just imagined experience. I'm still inherently a "math guy" who really enjoys modeling and planning and imagining. But most of the things I've created that are really useful, I've created by building something very basic that just works. Most of the time when I've done that, I've gotten really good use out of that very basic thing. Most of the time, such a thing has enabled me to do stuff that I couldn't have done without it.&lt;br /&gt;&lt;br /&gt;In the cases where the very basic thing hasn't been good enough, I've either enhanced it, or I've scrapped it in favor of a new version 2. In either case, the end result was better (and it happened earlier) than if I had tried to imagine every possible feature I was going to need before I built anything. Usually the enhancements have been in directions that I never imagined prior to actually putting my hands on the thing after I built it. I've written about some of those experiences in a paper called "&lt;a href="http://www.method-r.com/downloads/doc_download/5-measure-once-cut-twice-cary-millsap" target="_blank"&gt;Measure once, cut twice (no, really)&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;Incremental design is an interesting subject, especially in the context of our Oracle ecosystem, where there is a &lt;em&gt;grave&lt;/em&gt; shortage of competent design. But I do believe that a sensible application of the "measure-once, cut-twice" principle improves software quality, even in projects where you need a well-designed relational database model. I'm not advocating that design shouldn't happen; I'm advocating that you not pretend your design is build-worthy before you can possibly know.&lt;br /&gt;&lt;br /&gt;Some good places where you can read more about this philosophy include...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/toc.php" target="_blank"&gt;&lt;em&gt;Getting Real&lt;/em&gt;&lt;/a&gt;, a 91-essay e-book written by &lt;a href="http://37signals.com/" target="_blank"&gt;37signals&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;"&lt;a href="http://www.extremeprogramming.org/" target="_blank"&gt;Extreme programming: a gentle introduction&lt;/a&gt;", an introduction to a discipline for building things, wherein you can embrace the advantages of incremental design.&lt;/li&gt;&lt;li&gt;"&lt;a href="http://martinfowler.com/articles/designDead.html" target="_blank"&gt;Is design dead?&lt;/a&gt;", a paper by &lt;a href="http://www.martinfowler.com/" target="_blank"&gt;Martin Fowler&lt;/a&gt; that supports the idea that evolutionary design becomes viable in the presence of certain risk-mitigating practices.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-9048379607383401867?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/9048379607383401867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=9048379607383401867' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/9048379607383401867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/9048379607383401867'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/12/cuts-thinks-about-cutting.html' title='Cuts, Thinks About Cutting'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_mtpW1vu-FYo/SUvmfl4LM3I/AAAAAAAABZ4/kKwaCpkmzac/s72-c/cuts.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-8524692583876796210</id><published>2008-12-15T23:01:00.001-08:00</published><updated>2008-12-16T00:15:11.176-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dprofpp'/><category scheme='http://www.blogger.com/atom/ns#' term='profiling'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>A Small Adventure in Profiling</title><content type='html'>Tonight I'm finishing up some code I'm writing. It's a program that reports on directories full of trace files. I can tell you more about that later. Anyway, tonight, I got my code doing pretty much what I wanted it to be doing, and I decided to profile it. This way, I can see where my code is spending its time.&lt;br /&gt;&lt;br /&gt;My program is called &lt;em&gt;lstrc&lt;/em&gt;. It's written in Perl. Here's how I &lt;a href="http://www.perl.com/pub/a/2004/06/25/profiling.html" target="_blank"&gt;profiled&lt;/a&gt; it:&lt;br /&gt;&lt;pre name="code" class="css"&gt;23:31:09 $ perl -d:DProf /usr/local/bin/lstrc&lt;/pre&gt;The output of my program appeared when I ran it. Then I ran &lt;em&gt;dprofpp&lt;/em&gt;, and here's what I got:&lt;br /&gt;&lt;pre name="code" class="css"&gt;23:31:23 $ dprofpp&lt;br /&gt;Total Elapsed Time = 0.411082 Seconds&lt;br /&gt;User+System Time = 0.407182 Seconds&lt;br /&gt;Exclusive Times&lt;br /&gt;%Time ExclSec CumulS #Calls sec/call Csec/c  Name&lt;br /&gt;64.1    0.261  0.261     18   0.0145 0.0145  TFK::Util::total_cpu&lt;br /&gt;18.1    0.074  0.076    176   0.0004 0.0004  TFK::Util::timdat&lt;br /&gt;5.65    0.023  0.052      9   0.0026 0.0058  main::BEGIN&lt;br /&gt;1.72    0.007  0.007   1348   0.0000 0.0000  File::ReadBackwards::readline&lt;br /&gt;0.98    0.004  0.022      6   0.0007 0.0036  TFK::Util::BEGIN&lt;br /&gt;0.74    0.003  0.011     18   0.0002 0.0006  TFK::Util::tim1&lt;br /&gt;0.74    0.003  0.004      6   0.0005 0.0006  ActiveState::Path::BEGIN&lt;br /&gt;0.74    0.003  0.014      7   0.0004 0.0019  Date::Parse::BEGIN&lt;br /&gt;0.74    0.003  0.359      2   0.0015 0.1797  main::process_files&lt;br /&gt;0.49    0.002  0.002      4   0.0005 0.0006  Config::BEGIN&lt;br /&gt;0.49    0.002  0.002    177   0.0000 0.0000  File::Basename::fileparse&lt;br /&gt;0.49    0.002  0.002    176   0.0000 0.0000  File::Basename::_strip_trailing_sep&lt;br /&gt;0.49    0.002  0.002      3   0.0005 0.0005  Exporter::as_heavy&lt;br /&gt;0.49    0.002  0.002      6   0.0003 0.0004  File::ReadBackwards::BEGIN&lt;br /&gt;0.25    0.001  0.002     24   0.0001 0.0001  Getopt::Long::BEGIN&lt;/pre&gt;What this says is that the function called &lt;em&gt;TFK::Util::total_cpu&lt;/em&gt; accounts for 64.1% of the program's total execution time. The thing you couldn't have known (except I'm going to tell you) is that this program is not supposed to execute the function &lt;em&gt;TFK::Util::total_cpu&lt;/em&gt;. At all. It's because I didn't specify the &lt;em&gt;--cpu&lt;/em&gt; command line argument. (I told you that you couldn't have known.)&lt;br /&gt;&lt;br /&gt;Given this knowledge that my code was spending 64.1% of my time executing a function that I didn't even want to run, I was able to add the appropriate branch around the call of &lt;em&gt;TFK::Util::total_cpu&lt;/em&gt;. Then, when I ran my code again, it produced exactly the same output, but  its profile looked like this:&lt;br /&gt;&lt;pre name="code" class="css"&gt;23:33:07 $ dprofpp&lt;br /&gt;Total Elapsed Time = 0.150279 Seconds&lt;br /&gt;User+System Time = 0.147957 Seconds&lt;br /&gt;Exclusive Times&lt;br /&gt;%Time ExclSec CumulS #Calls sec/call Csec/c  Name&lt;br /&gt;50.0    0.074  0.076    176   0.0004 0.0004  TFK::Util::timdat&lt;br /&gt;15.5    0.023  0.053      9   0.0026 0.0058  main::BEGIN&lt;br /&gt;4.73    0.007  0.007   1348   0.0000 0.0000  File::ReadBackwards::readline&lt;br /&gt;2.70    0.004  0.022      6   0.0007 0.0036  TFK::Util::BEGIN&lt;br /&gt;2.70    0.004  0.013     18   0.0002 0.0007  TFK::Util::tim1&lt;br /&gt;2.03    0.003  0.004      6   0.0005 0.0006  ActiveState::Path::BEGIN&lt;br /&gt;2.03    0.003  0.013      7   0.0004 0.0019  Date::Parse::BEGIN&lt;br /&gt;2.03    0.003  0.100      2   0.0015 0.0499  main::process_files&lt;br /&gt;1.35    0.002  0.002      4   0.0005 0.0005  Config::BEGIN&lt;br /&gt;1.35    0.002  0.002    177   0.0000 0.0000  File::Basename::fileparse&lt;br /&gt;1.35    0.002  0.002    176   0.0000 0.0000  File::Basename::_strip_trailing_sep&lt;br /&gt;1.35    0.002  0.002      6   0.0003 0.0004  File::ReadBackwards::BEGIN&lt;br /&gt;1.35    0.002  0.002      3   0.0005 0.0005  Exporter::as_heavy&lt;br /&gt;0.68    0.001  0.002     24   0.0001 0.0001  Getopt::Long::BEGIN&lt;br /&gt;0.68    0.001  0.005    176   0.0000 0.0000  File::Basename::basename&lt;/pre&gt;Yay.&lt;br /&gt;&lt;br /&gt;Let me summarize:&lt;br /&gt;&lt;blockquote&gt;Total Elapsed Time = 0.411082 Seconds — before profiling&lt;br /&gt;Total Elapsed Time = 0.150279 Seconds — after profiling&lt;/blockquote&gt;That's about a 64% improvement in response time, in return for about 30 extra seconds of development work.&lt;br /&gt;&lt;br /&gt;Profiling—seeing how your code has spent your &lt;em&gt;time&lt;/em&gt;—rocks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-8524692583876796210?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/8524692583876796210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=8524692583876796210' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8524692583876796210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8524692583876796210'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/12/small-adventure-in-profiling.html' title='A Small Adventure in Profiling'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-566398644284103538</id><published>2008-11-21T11:33:00.002-08:00</published><updated>2008-11-22T16:37:12.530-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ba.com'/><category scheme='http://www.blogger.com/atom/ns#' term='bad design'/><category scheme='http://www.blogger.com/atom/ns#' term='aa.com'/><title type='text'>Messed-Up App of the Day</title><content type='html'>A couple of weeks ago, I returned from the &lt;a href="http://www.miracleas.dk/"&gt;Miracle Oracle Open World 2009&lt;/a&gt; event held in Rødby, Denmark. I go just about every year to this event. This time, I had accepted an invitation from &lt;a href="http://antognini.ch/"&gt;Chris Antognini&lt;/a&gt; to speak at his company's &lt;a href="http://www.trivadis.com/"&gt;TrivadisOPEN&lt;/a&gt; event in Zürich. So my travel planning was a little more complicated than it usually is. Instead of finding a simple trip from DFW to Copenhagen and back, this time I had to book a triangle: DFW to Zürich to Copenhagen, and then back to DFW.&lt;br /&gt;&lt;br /&gt;I was surprised at how difficult it was to find a good schedule at a good price; it was a lot harder than my normal booking. I ended up finding a suitable enough itinerary at &lt;a href="http://antognini.ch/"&gt;Orbitz&lt;/a&gt;. I usually fly American Airlines, but for this trip, the AA flights were &lt;em&gt;much&lt;/em&gt; more expensive than I wanted to pay. But I found an itinerary that used British Airways and Air Berlin that I liked. So I booked it.&lt;br /&gt;&lt;br /&gt;The trip went just fine. On the morning of the final day of my trip, &lt;a href="http://www.dannorris.com/"&gt;Dan Norris&lt;/a&gt; and I were standing together in &lt;a href="http://www.cph.dk/CPH/UK/MAIN/"&gt;Kastrup&lt;/a&gt; at the BA ticket counter when the BA agent noticed that I hadn't provided my American Airlines AAdvantage number for the itinerary. (BA and AA are &lt;a href="http://www.oneworld.com/"&gt;&lt;b&gt;one&lt;/b&gt;world&lt;/a&gt; partners.) So I gave him the number, which he attached to my itinerary, and he informed me that the number would map only to the segments of my flight that I hadn't consumed yet (I had CPH-LHR and then LHR-DFW left to go). I'd need to request credit for my flights prior in the week separately on the web once I got home.&lt;br /&gt;&lt;br /&gt;Fine.&lt;br /&gt;&lt;br /&gt;So on Monday after I got home, I went to &lt;a href="http://www.aa.com/aa/homePage.do"&gt;AA.com&lt;/a&gt; to register my BA flights for mileage credit. There was a form to fill out. It took a while to type everything into it, because I had to find my ticket numbers, figure out how to isolate the carrier id from the remainder of the ticket number, and then enter date and flight number information for each segment of my trip for which I was requesting credit. It was probably a 10-minute time investment to get the form filled out.&lt;br /&gt;&lt;br /&gt;So I reviewed what I had entered, and then I hit the Submit button. Instantly, I got feedback from the page saying that I couldn't request mileage credit right now, that I would have to wait 15 days before requesting mileage credit. So I recoiled a little bit—filling out that form was a bunch of work—and I opened my calendar application to log myself a reminder to go through the process again in 15 days.&lt;br /&gt;&lt;br /&gt;There are a couple of problems here:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Why did the form force me to enter a bunch of details before telling me that I shouldn't be using this form?&lt;/li&gt;&lt;li&gt;Why was it necessary in the first place for me to type in the flight date, flight number, and origin and destination information for each segment of the itinerary? The ticket number should have been enough.&lt;/li&gt;&lt;/ol&gt;The simple way to fix both these problems is to do what &lt;a href="http://www.britishairways.com/"&gt;ba.com&lt;/a&gt; does: it asks only who I am and what my ticket number is, and it figures out everything else.&lt;br /&gt;&lt;br /&gt;Anyway...&lt;br /&gt;&lt;br /&gt;The fifteen days passed, and my calendar reminded me to submit my mileage credit form. So I went to work again, gathering my ticket number information, my flight numbers, my dates of travel, and my origin/destination airport codes. I spent another few minutes typing it all in again. Then I clicked Submit. This time: joy. The form said that the submission was complete, and I'd hear back from AA.com via email.&lt;br /&gt;&lt;br /&gt;A minute or so later, I got an email in my inbox thanking me for visiting AA.com and confirming that I had issued a mileage credit request. Good: request confirmed.&lt;br /&gt;&lt;br /&gt;Then, just a &lt;em&gt;second&lt;/em&gt; or two later, I got a second email from AA.com saying this:&lt;blockquote&gt;Thanks for using AA.com to request mileage credit for your travel on British Airways.&lt;br /&gt;&lt;br /&gt;I'm sorry to disappoint you but your transatlantic travel on British Airways (or a BA-ticketed flight) is not eligible for AAdvantage mileage credit. British Airways transatlantic flights to/from the United States are specifically excluded from mileage accrual or redemption in the AAdvantage program.&lt;/blockquote&gt;Grrrr.... I had to work &lt;em&gt;this&lt;/em&gt; hard—&lt;em&gt;twice!&lt;/em&gt;—just to find out that I wasn't even going to get to do what I wanted to do? &lt;strong&gt;Why didn't they tell me this &lt;em&gt;fifteen days ago&lt;/em&gt;?!&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The first experience was annoying. The second experience took the annoyance to a whole new level.&lt;br /&gt;&lt;br /&gt;Here are some application design lessons that this story reinforces:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Don't ask for information you can derive.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Don't separate feedback from its prerequisite input by any more "distance" (measured in either time or user investment) than absolutely necessary. Especially when there's a chance you're going to deny someone his service, don't make him work any harder or wait any longer than absolutely necessary to let him know.&lt;/li&gt;&lt;/ol&gt;Of these lessons, number one is far and away the most important. If the AA.com site had asked just for the ticket number like ba.com does, the pain of the other problems wouldn't have been that big of a deal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-566398644284103538?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/566398644284103538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=566398644284103538' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/566398644284103538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/566398644284103538'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/11/messed-up-app-of-day.html' title='Messed-Up App of the Day'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-2291129869281853239</id><published>2008-11-09T06:42:00.000-08:00</published><updated>2008-11-10T05:07:46.435-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rock star'/><category scheme='http://www.blogger.com/atom/ns#' term='get ready'/><category scheme='http://www.blogger.com/atom/ns#' term='mogens nørgaard'/><category scheme='http://www.blogger.com/atom/ns#' term='whitesnake'/><category scheme='http://www.blogger.com/atom/ns#' term='calling out for you'/><category scheme='http://www.blogger.com/atom/ns#' term='oliver weers'/><category scheme='http://www.blogger.com/atom/ns#' term='x factor'/><title type='text'>My Friend Oliver</title><content type='html'>Oliver Weers has been my friend for several years now. I met him at one of &lt;a href="http://wedonotuse.blogspot.com/"&gt;Mogens Nørgaard&lt;/a&gt;'s fantastic &lt;a href="http://www.miracleas.dk/index.asp?sprog=2"&gt;events in Denmark&lt;/a&gt;, and it's at these events that I see Oliver once or twice a year.&lt;br /&gt;&lt;br /&gt;Oliver is a DBA who works for CSC. Like a lot of people I've met in Denmark, he's a very sharp guy. Like a lot of people I've met who are DBAs, he has hobbies outside of work. I have a lot of fun talking to him, and I enjoy when I get to cross his path.&lt;br /&gt;&lt;br /&gt;Oliver is particularly special, because his outside hobby is that he's a rock star.&lt;br /&gt;&lt;br /&gt;...Not the "finger quotes" kind of rock star like &lt;a href="http://en.wikipedia.org/wiki/Donald_Knuth"&gt;Don Knuth&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Christopher_J._Date"&gt;Chris Date&lt;/a&gt;. I mean Oliver is an actual rock star, like &lt;a href="http://en.wikipedia.org/wiki/Joe_Elliott"&gt;Joe Elliott&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/David_Coverdale"&gt;David Coverdale&lt;/a&gt;. Well, he'd probably be embarrassed by that characterization, but that's where I hope his ship is headed. A lot of people in Europe already know Oliver because of his performance on the TV show "&lt;a href="http://xfactor.itv.com/"&gt;X Factor&lt;/a&gt;," which is a Danish show that's similar to "&lt;a href="http://www.americanidol.com/"&gt;American Idol&lt;/a&gt;."&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_mtpW1vu-FYo/SRb3b55QF8I/AAAAAAAABCs/XRRYWcI7ixs/s1600-h/Get+Ready.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 150px; height: 149px;" src="http://4.bp.blogspot.com/_mtpW1vu-FYo/SRb3b55QF8I/AAAAAAAABCs/XRRYWcI7ixs/s200/Get+Ready.jpg" alt="" id="BLOGGER_PHOTO_ID_5266668873025853378" border="0" /&gt;&lt;/a&gt;I'm excited for Oliver lately because he has just released his first album called &lt;a href="http://www.amazon.com/Calling-Out-For-You/dp/B001EUYZZ6/ref=sr_1_1?ie=UTF8&amp;amp;s=dmusic&amp;amp;qid=1226100960&amp;amp;sr=8-1"&gt;Get Ready&lt;/a&gt;. If you like your Whitesnake, I think you'll like Oliver. (He'll be warming up for Whitesnake on December 19th in front of 7,000 people at &lt;a href="http://en.wikipedia.org/wiki/K.B._Hallen"&gt;K. B. Hallen&lt;/a&gt; in Copenhagen.)&lt;br /&gt;&lt;br /&gt;Here's a fun &lt;a href="http://www.youtube.com/watch?v=ftnLPP9Us-I&amp;amp;feature=related"&gt;sample from the X Factor show&lt;/a&gt;. Try to hold it together for the first couple of minutes. Remember, it's like American Idol where half the fun is to see how bad it can get. Oliver kicks in at 2:22 to straighten things out.&lt;br /&gt;&lt;br /&gt;So if you're interested in the Rock Music, have a look at him. Hit &lt;a href="http://www.myspace.com/oliverweersband"&gt;Oliver's MySpace page&lt;/a&gt; for a good idea of what he's got. This &lt;a href="http://www.youtube.com/watch?v=9cPWPe3WZzk"&gt;Calling Out For You video&lt;/a&gt; is good, too (including a nice interview &lt;em&gt;på Dansk&lt;/em&gt;, with a little operatic demo thrown in there for good measure). Good song, and it's kind of fun to remember that this guy can rock in sqlplus, too.&lt;br /&gt;&lt;br /&gt;So, please join me in wishing Oliver the very best of luck. He's worked hard at this for many years—the whole time holding down a pretty tricky job. I hope he'll become a huge overnight success worldwide sometime real soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-2291129869281853239?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/2291129869281853239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=2291129869281853239' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2291129869281853239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/2291129869281853239'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/11/my-friend-oliver.html' title='My Friend Oliver'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_mtpW1vu-FYo/SRb3b55QF8I/AAAAAAAABCs/XRRYWcI7ixs/s72-c/Get+Ready.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-3768104166495662717</id><published>2008-11-06T12:08:00.000-08:00</published><updated>2008-11-09T07:02:15.328-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Karen Morton'/><category scheme='http://www.blogger.com/atom/ns#' term='Hotsos Symposium'/><category scheme='http://www.blogger.com/atom/ns#' term='c. j. date'/><title type='text'>C. J. Date at Symposium 2009</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mtpW1vu-FYo/SRNRHyqmksI/AAAAAAAABCk/04c3iyqQK50/s1600-h/Chris+Date.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 72px; height: 96px;" src="http://3.bp.blogspot.com/_mtpW1vu-FYo/SRNRHyqmksI/AAAAAAAABCk/04c3iyqQK50/s400/Chris+Date.jpg" alt="" id="BLOGGER_PHOTO_ID_5265641583627637442" border="0" /&gt;&lt;/a&gt;I'm excited to announce that we have just arranged for &lt;a href="http://en.wikipedia.org/wiki/Christopher_J._Date"&gt;Chris Date&lt;/a&gt; to speak at the upcoming &lt;a href="http://www.hotsos.com/sym09.html"&gt;Hotsos Symposium&lt;/a&gt; (hosted by our friends at Hotsos, 9–12 March 2009 near DFW Airport). &lt;a href="http://karenmorton.blogspot.com/"&gt;Karen Morton&lt;/a&gt; just closed the deal with Chris a few minutes ago: he will deliver a keynote and then two one-hour technical sessions.&lt;br /&gt;&lt;br /&gt;Here is a chance to meet one of the men who &lt;a href="http://en.wikipedia.org/wiki/Relational_model"&gt;invented the whole field&lt;/a&gt; in which so many of us earn our livings today. This as an incredible opportunity.&lt;br /&gt;&lt;br /&gt;I'll hope to see you there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-3768104166495662717?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/3768104166495662717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=3768104166495662717' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3768104166495662717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3768104166495662717'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/11/c-j-date-at-symposium-2009.html' title='C. J. Date at Symposium 2009'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_mtpW1vu-FYo/SRNRHyqmksI/AAAAAAAABCk/04c3iyqQK50/s72-c/Chris+Date.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-8636927348294591979</id><published>2008-09-26T20:59:00.000-07:00</published><updated>2008-11-09T07:04:16.822-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='passive voice'/><category scheme='http://www.blogger.com/atom/ns#' term='normandy'/><category scheme='http://www.blogger.com/atom/ns#' term='active voice'/><category scheme='http://www.blogger.com/atom/ns#' term='weasel words'/><category scheme='http://www.blogger.com/atom/ns#' term='cherbourg-havre'/><category scheme='http://www.blogger.com/atom/ns#' term='d-day'/><category scheme='http://www.blogger.com/atom/ns#' term='eisenhower'/><title type='text'>A Lesson in Writing from 1944</title><content type='html'>I watched the Presidential debate tonight. One of the candidates mentioned a pair of letters that General Dwight David Eisenhower wrote in 1944. He wrote one letter that he would use in the event of a victorious Normandy invasion, and he wrote another one that he would use in the event of a defeat.&lt;br /&gt;&lt;br /&gt;I was curious about those letters, so I googled for them. I found something interesting in a way that I didn't expected. Here's the text of the letter that General Eisenhower wrote in case the invasion force at Normandy had been defeated:&lt;br /&gt;&lt;blockquote&gt;Our landings in the Cherbourg-Havre area have failed to gain a satisfactory foothold and I have withdrawn the troops. My decision to attack at this time and place was based on the best information available. The troops, the air and the Navy did all that Bravery and devotion to duty could do. If any blame or fault attaches to the attempt it is mine alone. —July 5&lt;/blockquote&gt;Here is a picture of the handwritten note, which I found at &lt;a href="http://www.archives.gov/education/lessons/d-day-message/"&gt;archives.gov&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.archives.gov/education/lessons/d-day-message/images/failure-message.gif"&gt;&lt;img style="cursor: pointer; width: 400px;" src="http://www.archives.gov/education/lessons/d-day-message/images/failure-message.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The handwritten note contains some important information that isn't present in the transcribed text alone. Observe that General Eisenhower edited his message. He actually edited himself three times; I'll refer here only to the top one. Here's the original version:&lt;br /&gt;&lt;blockquote&gt;Our landings in the Cherbourg-Havre area have failed to gain a satisfactory foothold and the troops have been withdrawn.&lt;/blockquote&gt;Here's the modified version:&lt;br /&gt;&lt;blockquote&gt;Our landings in the Cherbourg-Havre area have failed to gain a satisfactory foothold and I have withdrawn the troops.&lt;br /&gt;&lt;/blockquote&gt;The difference is subtle but important. In grammatical terms, General Eisenhower made the choice to discard &lt;a href="http://en.wikipedia.org/wiki/English_passive_voice"&gt;passive voice&lt;/a&gt; and adopt the direct, subject-verb-object style of active voice. One Wikipedia article that I particularly admire identifies passive voice as a tactic of &lt;a href="http://en.wikipedia.org/wiki/Weasel_word"&gt;weasel wording&lt;/a&gt;: "Weasel words are usually expressed with deliberate imprecision with the intention to mislead the listeners or readers into believing statements for which sources are not readily available."&lt;br /&gt;&lt;br /&gt;In Eisenhower's original version, he had stated that "the troops have been withdrawn." From this statement, we would have learned some information about the troops, but we would not have learned directly about who had withdrawn them. This passive-voice language, "the troops have been withdrawn," would have subtly conveyed the notion that the author wished to conceal the identity of the decision-maker about the withdrawal.&lt;br /&gt;&lt;br /&gt;In the modified version, General Eisenhower made it abundantly clear who had made the decision: &lt;em&gt;he&lt;/em&gt; did. The revised wording is more informative, it is more efficient, and it is more courageous.&lt;br /&gt;&lt;br /&gt;Active-voice writing holds several advantages over passive-voice writing. I've learned this in my work, especially in consulting engagement reports, where I've found it's essential to write with active voice. Advantages of active-voice writing include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  Active voice transmits more information to the reader.&lt;/li&gt;&lt;li&gt;Active voice is plainer and simpler; it is easier to read.&lt;/li&gt;&lt;li&gt;  Active voice is often more economical; it conveys as much or more information in fewer words.&lt;/li&gt;&lt;li&gt;Active voice is often more courageous.&lt;/li&gt;&lt;/ul&gt;The value of courage is obvious in the Eisenhower case. Even if the Allies had been defeated at Normandy, Eisenhower was courageous enough to accept the responsibility for the plan, its execution, and even its remediation.&lt;br /&gt;&lt;br /&gt;Courage is also important in our writing about technology. Writing with active voice can be much more difficult than writing with passive voice. ...Because, you see, active voice gives you noplace to hide. When you know something, you say it. When you don't, active voice writing pretty much forces you to say &lt;em&gt;that&lt;/em&gt;. It can be quite unsettling to admit to your audience that you don't know everything you wish you knew. It takes courage.&lt;br /&gt;&lt;br /&gt;If you find yourself ashamed that your writing is too vague or that it asks more questions than it answers, then I think you have only four choices. (1) You can decide not to write anymore because it's too hard; (2) You can try to conceal your deficiencies with weasel wording; (3) You can admit the gaps in your work; or (4) You can improve the quality of your own knowledge.&lt;br /&gt;&lt;br /&gt;Of course, I don't believe that giving up is the right answer. Option two—concealing your deficiencies with weasel wording—is, I think, by far the worst option of the four. Choice three frightens a lot of people, but actually it's not so bad. I believe that one of the great successes of the modern wiki- and forum-enabled Internet is the ease with which an author can voice unfinished ideas without feeling out of place. The fourth option is a fantastic solution if you have the time, the inclination, and the talent for it.&lt;br /&gt;&lt;br /&gt;Back to General Eisenhower's note... I find his edit inspiring. By making it, he reveals something about his thought process. He wrote his original text in the common, politically safe "tasks have been executed" kind of way. But his edit reveals that it was especially important to him to be direct and forthcoming about who was making the decisions here, and who was at fault in case those decisions went wrong.&lt;br /&gt;&lt;br /&gt;Knowing that General Eisenhower edited his note in the particular way that he did actually makes me respect him even more than if he had written it in active voice in the first place.&lt;br /&gt;&lt;br /&gt;* * *&lt;br /&gt;&lt;br /&gt;Here's where I thought I was finished for the evening. But I want to show you what it looks like to execute faithfully upon my own bitter advice. Eisenhower's letter piqued my interest in the D-Day invasion of Normandy. One thing I noticed is that the invasion was initiated on June 6, 1944. Eisenhower's memo is dated "July 5." Uh, that's a month after the invasion, not the night before. It was another hour or so of writing lots more stuff (which I've long since deleted) before I googled "eisenhower message june july" and found &lt;a href="http://www.eisenhower.archives.gov/dl/dday/ddaypage.html"&gt;this&lt;/a&gt;, which states simply that, "The handwritten message by General Eisenhower, the In Case of Failure message, is mistakenly dated 'July' 5 instead of 'June' 5."&lt;br /&gt;&lt;br /&gt;Ok. I can accept this as authoritative for my own purposes, for one, because it doesn't matter too much to me tonight if it's not true. It's a plausible mistake to imagine a man making who's under as much pressure as he would have been on June 5, 1944. For comparison, I could barely remember my own phone number on the night of the &lt;a href="http://en.wikipedia.org/wiki/Loma_Prieta_earthquake"&gt;Loma Priete earthquake&lt;/a&gt;, which I rode out in the Foster City Holiday Inn in 1989. But of course, such an anecdote about me is no proof of this particular proposition about Dwight D. Eisenhower.&lt;br /&gt;&lt;br /&gt;So, do you see what I mean when I say that writing is HARD!? The act of writing itself—if you try to do it well—forces you to do work that you never intended to do when you set out to write your piece.&lt;br /&gt;&lt;br /&gt;That's one of the good things about the software industry. When someone makes a statement about computer software, I can confirm or refute the statement myself using strace, DTrace, 10046, block dumps, or some other research tool that I can actually get my hands on. That doesn't make it easy, but it usually does make it at least possible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-8636927348294591979?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/8636927348294591979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=8636927348294591979' title='24 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8636927348294591979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8636927348294591979'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/09/lesson-in-writing-from-1944.html' title='A Lesson in Writing from 1944'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>24</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-8137793099111728864</id><published>2008-09-17T06:49:00.000-07:00</published><updated>2008-11-09T07:05:29.939-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='millsap&apos;s grand unified theory of &apos;tuning&apos;'/><category scheme='http://www.blogger.com/atom/ns#' term='miracle oracle open world'/><category scheme='http://www.blogger.com/atom/ns#' term='video abstract'/><title type='text'>Miracle Open World 2008 presentation</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.miracleas.dk/index.asp?page=168&amp;page2=485"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_mtpW1vu-FYo/SNEMjsZHeiI/AAAAAAAABCE/ceCBaSGXeD0/s400/MiracleOpenWorld-banner.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5246988848214800930" /&gt;&lt;/a&gt;&lt;br /&gt;Have a look at the &lt;a href="http://www.youtube.com/watch?v=WzYAlIcCVig"&gt;video abstract&lt;/a&gt; for my Miracle Open World 2008 presentation, "Millsap's Grand Unified Theory of 'Tuning'."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-8137793099111728864?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/8137793099111728864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=8137793099111728864' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8137793099111728864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/8137793099111728864'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/09/miracle-open-world-2008-presentation.html' title='Miracle Open World 2008 presentation'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_mtpW1vu-FYo/SNEMjsZHeiI/AAAAAAAABCE/ceCBaSGXeD0/s72-c/MiracleOpenWorld-banner.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-5623505482600573536</id><published>2008-09-04T19:15:00.000-07:00</published><updated>2008-09-04T20:11:49.066-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='richard stallman'/><category scheme='http://www.blogger.com/atom/ns#' term='tom jennings'/><category scheme='http://www.blogger.com/atom/ns#' term='noam wasserman'/><category scheme='http://www.blogger.com/atom/ns#' term='mike milinkovich'/><category scheme='http://www.blogger.com/atom/ns#' term='steve johnson'/><category scheme='http://www.blogger.com/atom/ns#' term='steve krug'/><category scheme='http://www.blogger.com/atom/ns#' term='joel spolsky'/><category scheme='http://www.blogger.com/atom/ns#' term='Business of Software 2008'/><title type='text'>Business of Software 2008, day 2</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mtpW1vu-FYo/SMCi5l4Sw7I/AAAAAAAABBk/sPayHtODRMg/s1600-h/Untitled.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_mtpW1vu-FYo/SMCi5l4Sw7I/AAAAAAAABBk/sPayHtODRMg/s200/Untitled.png" alt="" id="BLOGGER_PHOTO_ID_5242369076563723186" border="0" /&gt;&lt;/a&gt;Greetings from the second and final day of "&lt;a href="http://blog.businessofsoftware.org/2008/08/business-of-sof.html"&gt;Business of Software 2008&lt;/a&gt;, the first ever &lt;a href="http://www.joelonsoftware.com/"&gt;Joel on Software&lt;/a&gt; conference."&lt;br /&gt;&lt;br /&gt;Yesterday was a hard act to follow, but today met the challenge. Today's roster:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.pragmaticmarketing.com/blogs/productmarketing"&gt;Steve Johnson&lt;/a&gt;, of &lt;a href="http://www.pragmaticmarketing.com/"&gt;Pragmatic Marketing&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Tom Jennings, of &lt;a href="http://www.summitpartners.com/"&gt;Summit Partners&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.stallman.org/"&gt;Richard Stallman&lt;/a&gt;, founder of &lt;a href="http://www.fsf.org/"&gt;Free Software Foundation&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://founderresearch.blogspot.com/"&gt;Noam Wasserman&lt;/a&gt;, from &lt;a href="http://www.hbs.edu/"&gt;Harvard Business School&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dev.eclipse.org/blogs/mike"&gt;Mike Milinkovich&lt;/a&gt;, of &lt;a href="http://www.eclipse.org/"&gt;Eclipse Foundation&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sensible.com/"&gt;Steve Krug&lt;/a&gt;, author of &lt;a href="http://www.amazon.com/Dont-Make-Me-Think-Usability/dp/0321344758"&gt;&lt;em&gt;Don't Make Me Think&lt;/em&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.joelonsoftware.com/"&gt;Joel Spolsky&lt;/a&gt;, of &lt;a href="http://fogcreek.com/"&gt;Fog Creek Software&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Some of today's highlight ideas for me (again, with apologies to the speakers for the crude summarization):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Nothing is difficult to someone who doesn't know what he's talking about. (Johnson)&lt;/li&gt;&lt;li&gt;Creating more artifacts and meetings is no answer. (Johnson)&lt;/li&gt;&lt;li&gt;Entrepreneurs are better entrepreneurs when they're not worried about their personal balance sheet. (Jennings)&lt;/li&gt;&lt;li&gt;"In the software field, we don't have to deal with the perversions of &lt;em&gt;matter&lt;/em&gt;." (Stallman)&lt;/li&gt;&lt;li&gt;VCs say 65% of failed new ventures are the result of people problems with founding or management teams. (Wasserman)&lt;/li&gt;&lt;li&gt;Websites are successful to the extent they're self-evident as possible. (Krug)&lt;/li&gt;&lt;li&gt;Sensible usability testing is absolutely necessary and, better yet, possible and even inexpensive. You can even download a &lt;a href="http://sensible.com/downloads"&gt;script&lt;/a&gt; at Steve's site. (Krug)&lt;/li&gt;&lt;li&gt;The huge chasm between #1 and #2 is all about elements of happiness, aesthetics, and culture. (Spolsky)&lt;/li&gt;&lt;/ul&gt;Steve Johnson and Steve Krug gave truly superb presentations. Steve Krug I knew about beforehand, from his book. Steve Johnson I did not know, but I do now. These are people I'll take courses from someday. And of course, Joel Spolsky... I had seen him speak before, so I knew what to expect. He's one of the best speakers I've ever watched. I've asked him to keynote at Hotsos Symposium 2009. We'll see what he says.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-5623505482600573536?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/5623505482600573536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=5623505482600573536' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5623505482600573536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5623505482600573536'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/09/business-of-software-2008-day-2.html' title='Business of Software 2008, day 2'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_mtpW1vu-FYo/SMCi5l4Sw7I/AAAAAAAABBk/sPayHtODRMg/s72-c/Untitled.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-7917230752685574054</id><published>2008-09-03T19:16:00.001-07:00</published><updated>2008-09-04T20:13:20.771-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jessica livingston'/><category scheme='http://www.blogger.com/atom/ns#' term='paul kenny'/><category scheme='http://www.blogger.com/atom/ns#' term='jason fried'/><category scheme='http://www.blogger.com/atom/ns#' term='jason cohen'/><category scheme='http://www.blogger.com/atom/ns#' term='eric sink'/><category scheme='http://www.blogger.com/atom/ns#' term='seth godin'/><category scheme='http://www.blogger.com/atom/ns#' term='pecha kucha'/><category scheme='http://www.blogger.com/atom/ns#' term='alex ohanian'/><category scheme='http://www.blogger.com/atom/ns#' term='joel spolsky'/><category scheme='http://www.blogger.com/atom/ns#' term='Business of Software 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='dharmesh shah'/><title type='text'>Business of Software 2008, day 1</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mtpW1vu-FYo/SMCjkWjLTUI/AAAAAAAABBs/SGbvvlQmN0g/s1600-h/Untitled.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_mtpW1vu-FYo/SMCjkWjLTUI/AAAAAAAABBs/SGbvvlQmN0g/s200/Untitled.png" alt="" id="BLOGGER_PHOTO_ID_5242369811182996802" border="0" /&gt;&lt;/a&gt;Greetings from Boston, where I'm attending "&lt;a href="http://blog.businessofsoftware.org/2008/08/business-of-sof.html"&gt;Business of Software 2008&lt;/a&gt;, the first ever &lt;a href="http://www.joelonsoftware.com/"&gt;Joel on Software&lt;/a&gt; conference."&lt;br /&gt;&lt;br /&gt;It has been fantastic so far. Here's a featured presenters roll call for the day:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://sethgodin.typepad.com/"&gt;Seth Godin&lt;/a&gt;, author of &lt;a href="http://sethgodin.typepad.com/about.html"&gt;ten bestselling books about marketing&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.workhappy.net/2005/09/interview_with_.html"&gt;Jason Fried&lt;/a&gt; of &lt;a href="http://37signals.com/"&gt;37signals&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ericsink.com/"&gt;Eric Sink&lt;/a&gt; of &lt;a href="http://www.sourcegear.com/"&gt;SourceGear&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://onstartups.com/"&gt;Dharmesh Shah&lt;/a&gt; of &lt;a href="http://www.hubspot.com/"&gt;HubSpot&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ycombinator.com/people.html"&gt;Jessica Livingston&lt;/a&gt; of &lt;a href="http://ycombinator.com/"&gt;Y Combinator&lt;/a&gt;, author of &lt;a href="http://www.foundersatwork.com/blog.html"&gt;&lt;span style="font-style: italic;"&gt;Founders at Work&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.oceanlearning.co.uk/?pg=about"&gt;Paul Kenny&lt;/a&gt; of &lt;a href="http://oceanlearning.co.uk/"&gt;Ocean Learning&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;That's not to mention the eight &lt;a href="http://www.wired.com/techbiz/media/magazine/15-09/st_pechakucha"&gt;Pecha Kucha&lt;/a&gt; presentations, although I will mention two that I particularly enjoyed by Jason Cohen of &lt;a href="http://smartbear.com/"&gt;SmartBear Software&lt;/a&gt; ("Agile marketing") and &lt;a href="http://alexisohanian.com/"&gt;Alexis Ohanian&lt;/a&gt;, founder of &lt;a href="http://www.reddit.com/"&gt;Reddit&lt;/a&gt; ("How to start, run, and sell a web 2.0 startup"). Alexis won the contest, which netted him a new &lt;a href="http://www.apple.com/macbookair/"&gt;MacBook Air&lt;/a&gt;. Not bad for 6 minutes 40 seconds of work. ;-)&lt;br /&gt;&lt;br /&gt;Here are some of the highlight ideas of the day for me (with apologies to the speakers for, in some cases, crudely over-simplifying their ideas):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ideas that spread win. (Godin)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The leader of a tribe begins as a heretic. (Godin, Livingston)&lt;/li&gt;&lt;li&gt;Premature optimization is bad. In business too. Not just code. (Fried, Shah)&lt;/li&gt;&lt;li&gt;Interruptions are bad. Meetings are worse. (Fried, Sink, Livingston)&lt;/li&gt;&lt;li&gt;"Only two things grow forever: businesses and tumors." Unless you take inelligent action. (Fried)&lt;/li&gt;&lt;li&gt;Pricing is hard. Really, really hard. (Shah)&lt;/li&gt;&lt;li&gt;Business plans are usually stupid. (Fried, Shah, Livingston)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Software specs are usually stupid. (Fried)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;An important opportunity cost of raising VC money is the time you're not spending working on the business of your actual business. (Shah)&lt;/li&gt;&lt;li&gt;The most common cause of startup failure isn't competition, it's fear. (Livingston)&lt;/li&gt;&lt;li&gt;Your first idea probably sucks. (Fried, Sink, Shah, Livingston)&lt;/li&gt;&lt;li&gt;Radical mood swings are part of the territory for founding a company. (Livingston)&lt;/li&gt;&lt;/ul&gt;An overarching belief that I think bonds almost all of the 300 people here at the event is this: If you're not working on your passion, then you're wasting yourself. It is inspiring to met so many people at one time who are living courageously without compromising this belief. Re-SPECT.&lt;br /&gt;&lt;br /&gt;I think a good conference should provide three main intellectual benefits for people:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;You can expose yourself to new ideas, which can make you wiser.&lt;/li&gt;&lt;li&gt;You can fortify some of the beliefs you already had, which can make you more confident.&lt;/li&gt;&lt;li&gt;You can learn better ways to explain your beliefs to others, which can make you more effective.&lt;/li&gt;&lt;/ol&gt; And then of course there's networking, fun, and all that stuff—that's easy. So far, this event is ringing the bell on every dimension that I needed. Absolutely A+.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-7917230752685574054?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/7917230752685574054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=7917230752685574054' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/7917230752685574054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/7917230752685574054'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/09/business-of-software-2008.html' title='Business of Software 2008, day 1'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_mtpW1vu-FYo/SMCjkWjLTUI/AAAAAAAABBs/SGbvvlQmN0g/s72-c/Untitled.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-7050077734323634463</id><published>2008-08-26T13:21:00.000-07:00</published><updated>2008-11-09T07:06:59.922-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hotsos Symposium'/><category scheme='http://www.blogger.com/atom/ns#' term='jonathan lewis'/><category scheme='http://www.blogger.com/atom/ns#' term='tanel põder'/><category scheme='http://www.blogger.com/atom/ns#' term='call for papers'/><title type='text'>Hotsos Symposium 2009 Call for Papers</title><content type='html'>The Call for Papers for &lt;a href="http://hotsos.com/sym09.html"&gt;Hotsos Symposium 2009&lt;/a&gt; is now open. To submit an abstract proposal for the event, please visit the &lt;a href="https://portal.hotsos.com/events/SYM09/call-for-abstracts-for-symposium-2009"&gt;Call for Papers page&lt;/a&gt;. The call will remain open until 24 October. This is your chance to get your name on the agenda and earn a complimentary pass to the event.&lt;br /&gt;&lt;br /&gt;I love the Symposium for the people who show up, both the speakers &lt;em&gt;and&lt;/em&gt; the attendees. If you've been there, you know: it is the best event of the year for professionals interested in Oracle performance. It's one of the rare places that I can just sit down with a pencil and fill my notebook with answers to long-standing questions and good new ideas to pursue for the coming year.&lt;br /&gt;&lt;br /&gt;We've already booked &lt;a href="http://www.jlcomp.demon.co.uk/"&gt;Jonathan Lewis&lt;/a&gt; for two technical sessions and the &lt;a href="http://hotsos.com/sym_training.html"&gt;Training Day&lt;/a&gt; event, and &lt;a href="http://blog.tanelpoder.com/"&gt;Tanel Põder&lt;/a&gt; has confirmed his participation on the agenda as well. That makes two of my favorites, with lots more on the way.&lt;br /&gt;&lt;br /&gt;You're probably aware that earlier this year, I left Hotsos with a few former employees to create &lt;a href="http://method-r.com/"&gt;Method R Corporation&lt;/a&gt; (see our &lt;a href="http://www.prweb.com/releases/2008/05/prweb839554.htm"&gt;press release&lt;/a&gt; for more info). Method R and Hotsos are pleased to continue the tradition of the Hotsos Symposium as a joint venture between our two companies. I hope you'll join us.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-7050077734323634463?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/7050077734323634463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=7050077734323634463' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/7050077734323634463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/7050077734323634463'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/08/hotsos-symposium-2009-call-for-papers.html' title='Hotsos Symposium 2009 Call for Papers'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-5602533723751836994</id><published>2008-08-22T15:01:00.000-07:00</published><updated>2008-11-09T07:07:43.704-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grounding cable'/><category scheme='http://www.blogger.com/atom/ns#' term='Jeff Holt'/><title type='text'>Messed-Up App of the Day</title><content type='html'>My family has a cat. I don't like to talk about it, because I really don't like cats that much.&lt;br /&gt;&lt;br /&gt;One thing our cat does that's kind of interesting to me, is that she brings "gifts" into our garage near her food bowl. Here's a picture of one. She climbs to the tops of the trees in our yard to catch these things.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_mtpW1vu-FYo/SK88sI6EQ-I/AAAAAAAABAc/oBDxDSf8Z0w/s1600-h/DSC_0014.JPG"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_mtpW1vu-FYo/SK88sI6EQ-I/AAAAAAAABAc/oBDxDSf8Z0w/s200/DSC_0014.JPG" alt="" id="BLOGGER_PHOTO_ID_5237471620658119650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Jeff Holt does something similar on occasion. Sometimes when I return from a trip, there'll be something on my desk from Jeff for me. Today, it was this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_mtpW1vu-FYo/SK86yWKZbLI/AAAAAAAABAM/hD9gsW_w9yg/s1600-h/IMG_0158.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_mtpW1vu-FYo/SK86yWKZbLI/AAAAAAAABAM/hD9gsW_w9yg/s200/IMG_0158.jpg" alt="" id="BLOGGER_PHOTO_ID_5237469528272235698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's a piece of wire taped to a sheet of paper. And that's my Messed-Up App of the Day.&lt;br /&gt;&lt;br /&gt;Handwritten on the paper is this message from Jeff:&lt;br /&gt;&lt;blockquote&gt;This was a grounding cable for the network.&lt;br /&gt;&lt;br /&gt;LMAO&lt;/blockquote&gt;The first few seconds I looked at the cable, it didn't seem that funny to me. It was about the same reaction as when I see a dead cicada next to the food bowl at home. Amused. But not "LMAO."&lt;br /&gt;&lt;br /&gt;Sometimes, what Jeff thinks is funny is funny because of something I haven't learned yet. So I got thinking, maybe his point is that it's against code to use stranded copper wire as grounding cable. Most of the ground wire you'll find in houses is solid copper. But then again, no, stranded cable is fine for ground wire. If I remember correctly, you use stranded instead of solid wire in applications where the wire is going to be required to flex in normal operational circumstances.&lt;br /&gt;&lt;br /&gt;Then I noticed there was red tape on one end of the wire, and black tape on the other. Ah, ok, &lt;em&gt;that's&lt;/em&gt; what was funny--ground wires are supposed to be labeled green. I figured the guys who wired our network probably just used some scrap wire instead of properly marked "ground wire." Sometimes that kind of thing bugs Jeff, and he knows it bugs me, too. Mystery solved, then.&lt;br /&gt;&lt;br /&gt;But not really "LMAO," though, when you think about it.&lt;br /&gt;&lt;br /&gt;Then I picked up the wire and looked at it. Look at this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mtpW1vu-FYo/SK898idT-4I/AAAAAAAABAk/HVKL36fjepw/s1600-h/IMG_0160.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_mtpW1vu-FYo/SK898idT-4I/AAAAAAAABAk/HVKL36fjepw/s200/IMG_0160.jpg" alt="" id="BLOGGER_PHOTO_ID_5237473001906371458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Oh... It's not tape. That's two wires. One red, one black.&lt;br /&gt;&lt;br /&gt;Ok, that's legitimately "LMAO."&lt;br /&gt;&lt;br /&gt;P.S.: If you have trouble explaining to your friends why this is funny, the following handy diagram may help you.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_mtpW1vu-FYo/SK9FJjFanDI/AAAAAAAABA0/NUI_-HjLdr0/s1600-h/Wiring.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_mtpW1vu-FYo/SK9FJjFanDI/AAAAAAAABA0/NUI_-HjLdr0/s200/Wiring.png" alt="" id="BLOGGER_PHOTO_ID_5237480921994271794" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-5602533723751836994?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/5602533723751836994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=5602533723751836994' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5602533723751836994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5602533723751836994'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/08/messed-up-app-of-day.html' title='Messed-Up App of the Day'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_mtpW1vu-FYo/SK88sI6EQ-I/AAAAAAAABAc/oBDxDSf8Z0w/s72-c/DSC_0014.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-346753411531619295</id><published>2008-07-11T08:08:00.000-07:00</published><updated>2008-07-11T08:47:09.479-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SLA Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='fixing vendor code'/><category scheme='http://www.blogger.com/atom/ns#' term='performance as a service'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><title type='text'>So how do you FIX the problems that "Performance as a Service" helps you find?</title><content type='html'>I want to respond carefully to &lt;a href="https://www.blogger.com/comment.g?blogID=2954359812249072053&amp;amp;postID=5730841958454673735"&gt;Reubin's comment&lt;/a&gt; on my &lt;a href="https://www.blogger.com/comment.g?blogID=2954359812249072053&amp;amp;postID=5730841958454673735"&gt;Performance as a Service&lt;/a&gt; post from July 7. Reuben asked:&lt;br /&gt;&lt;blockquote&gt;i can see how you actually determine for a customer where the pain points are and you can validate user remarks about poor performance. But i don't see from your post how you are going to attack the problem of fixing the performance issue.&lt;br /&gt;&lt;br /&gt;i would be most interested in hearing your thoughts on that. I wonder if you guys are going to touch the actual code behind the "order button" you described.&lt;/blockquote&gt;Under the service model I described in the &lt;a href="https://www.blogger.com/comment.g?blogID=2954359812249072053&amp;amp;postID=5730841958454673735"&gt;Performance as a Service&lt;/a&gt; post, a client using our performance service would have several choices about how to respond to a problem. They could contract our team as consultants; they could use someone else; they could do it themselves; or of course, they could choose to defer the solution.&lt;br /&gt;&lt;br /&gt;Attacking the problem of fixing the performance issue is actually the "easy" part. Well, it's not necessarily always &lt;em&gt;easy&lt;/em&gt;, but it's the part that my team have been doing over and over again since the early 1990s. We use &lt;a href="http://www.method-r.com/faq/31-method-r/35-what-is-method-r"&gt;Method R&lt;/a&gt;. Once we've measured the response time in detail with Oracle's extended SQL trace function, we know exactly where the task is spending the end user's time. From there, I think it's fair to say we (Jeff, Karen, etc.) are pretty skilled at figuring out what to do next.&lt;br /&gt;&lt;br /&gt;Sometimes, the root cause of a performance problem requires manipulation of the application source code, and sometimes it doesn't. If you do diagnosis right, you should &lt;a href="http://carymillsap.blogspot.com/2008/06/why-guess-when-you-can-know.html"&gt;never have to guess &lt;/a&gt;which one it is. A lot of people wonder what happens if it's the code that needs modification, but the application is prepackaged, and therefore the source code is out of your control. In my experience, most vendors are very responsive to improving the performance of their products when they're shown unambiguously how to improve them.&lt;br /&gt;&lt;br /&gt;If your application is slow, you should be eager to know  exactly &lt;em&gt;why&lt;/em&gt; it's slow. You should be equally eager to know, whether you wrote the code yourself or someone else wrote it for you. To avoid collecting the right performance diagnostic data for an application because you're afraid of what you might find out is like taking your hands off the wheel and covering your eyes when a child rides his bike out in front of the car that you're driving. There's significant time-value upon information about performance problems. Even if someone else's code is the reason for your performance problem (or whatever truth you might be afraid of learning), you need to know it as early as possible.&lt;br /&gt;&lt;br /&gt;The SLA Manager service I talked about is so important because the most difficult part of using Method R is usually the data collection step. The difficulty is almost always more political than technical. It's overcoming the question, "Why should we change the way we collect our data?" I believe the business value of knowing how long your computer system takes to execute tasks for your business is important enough that it will get people into the habit of measuring response time. ...Which is a vital step in solving the data collection problem that's at the heart of every persistent performance problem I've ever seen. I believe the data collection service that I described will help remove the most important remaining barrier to highly manageable application software performance in our market.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-346753411531619295?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/346753411531619295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=346753411531619295' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/346753411531619295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/346753411531619295'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/07/so-how-do-you-fix-problems-that.html' title='So how do you FIX the problems that &quot;Performance as a Service&quot; helps you find?'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-6898571185612359946</id><published>2008-07-10T13:00:00.000-07:00</published><updated>2008-07-17T17:39:53.054-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Christian Antognini'/><category scheme='http://www.blogger.com/atom/ns#' term='Troubleshooting Oracle Performance'/><title type='text'>Christian Antognini's new book: Troubleshooting Oracle Performance</title><content type='html'>I learned from a friend yesterday that Chris Antognini's new book, &lt;em&gt;Troubleshooting Oracle Performance&lt;/em&gt;, is available now. I just checked at Amazon, and the product is listed as temporarily out of stock. That's good: it means people are buying them up.&lt;br /&gt;&lt;br /&gt;If you're an Oracle application developer, get one. If you're an Oracle database administrator, get one for yourself and a couple more for your developer friends.&lt;br /&gt;&lt;br /&gt;I hope he sells a million of them.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=methodrcom-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=1590599179&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Jonathan Lewis and I both wrote a foreword for Chris after seeing the work he had put into this project. Here's mine...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;My Foreword for Chris's Book&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I think the best thing that has happened to Oracle performance in the past ten years is the radical improvement in the quality of the information you can buy now at the bookstore.&lt;br /&gt;&lt;br /&gt;In the old days, the books you bought about Oracle performance all looked pretty much the same. They insinuated that your Oracle system inevitably suffered from too much I/O (which is, in fact,  not inevitable) or not enough memory (which they claimed was the same thing as too much I/O, which also isn’t true). They’d show you loads and loads of SQL scripts that you might run, and they’d tell you to tune your SQL. And that, they said, would fix everything.&lt;br /&gt;&lt;br /&gt;It was an age of darkness.&lt;br /&gt;&lt;br /&gt;Chris’s book is a member of the family tree that has brought to us, …light. The difference between the darkness and the light boils down to one simple concept. It’s a concept that your mathematics teachers made you execute from the time when you were about ten years old: show your work.&lt;br /&gt;&lt;br /&gt;I don’t mean “show and tell,” where someone claims he has improved performance at hundreds of customer sites by hundreds of percentage points [sic], so therefore he’s an expert. I mean show your work, which means documenting a relevant baseline measurement, conducting a controlled experiment, documenting a second relevant measurement, and then showing your results openly and transparently so that your reader can follow along and even reproduce your test if he wants to.&lt;br /&gt;&lt;br /&gt;That’s a big deal. When authors started doing that, Oracle audiences started getting a lot smarter. Since the year 2000, there has been a dramatic increase in the number of people in the Oracle community who ask intelligent questions and demand intelligent answers about performance. And there’s been an acceleration in the drowning-out of some really bad ideas that lots of people used to believe.&lt;br /&gt;&lt;br /&gt;In this book, Chris follows the pattern that works. He tells you useful things. But he doesn’t stop there. He shows you how he knows, which is to say he shows you how you can find out for yourself. He shows his work.&lt;br /&gt;&lt;br /&gt;That brings you two big benefits. First, showing his work helps you understand more deeply what he’s showing you, which makes his lessons easier for you to remember and apply. Second, by understanding his examples, you can understand not just the things that Chris is showing you, but you’ll also be able to answer additional good questions that Chris hasn’t covered. …Like what will happen in the next release of Oracle after this book has gone to print.&lt;br /&gt;&lt;br /&gt;This book, for me, is both a technical and a “persuasional” reference. It contains tremendous amounts of fully documented homework that I can reuse. It also contains eloquent new arguments on several points about which I share Chris’s views and his passion. The arguments that Chris uses in this book will help me convince more people to do the Right Things.&lt;br /&gt;&lt;br /&gt;Chris is a smart, energetic guy who stands on the shoulders of Dave Ensor, Lex de Haan, Anjo Kolk, Steve Adams, Jonathan Lewis, Tom Kyte, and a handful of other people I regard as heroes for bringing rigor to our field. Now we have Chris’s shoulders to stand on as well.&lt;br /&gt;&lt;br /&gt;―Cary Millsap&lt;br /&gt;10 April 2008&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-6898571185612359946?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/6898571185612359946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=6898571185612359946' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/6898571185612359946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/6898571185612359946'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/07/christian-antogninis-new-book.html' title='Christian Antognini&apos;s new book: Troubleshooting Oracle Performance'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-5730841958454673735</id><published>2008-07-07T16:30:00.000-07:00</published><updated>2009-10-07T08:26:39.108-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='Karen Morton'/><category scheme='http://www.blogger.com/atom/ns#' term='Jeff Holt'/><category scheme='http://www.blogger.com/atom/ns#' term='SLA Manager'/><title type='text'>Performance as a Service</title><content type='html'>I've &lt;a href="http://carymillsap.blogspot.com/2008/03/today-is-my-last-day-at-hotsos.html"&gt;mentioned already&lt;/a&gt; that, for the second time in ten years, I'm starting a business. It's a lot easier nowadays than it was back in 1999. I know; it's &lt;em&gt;supposed&lt;/em&gt; to be easier the second time you do something, but what I mean is different from that. It's just a lot easier to start a business now than it used to be.&lt;br /&gt;&lt;br /&gt;Take email for example. I remember the trauma of having to buy and build a server, install Linux on it, find a location for it, install Sendmail, figure out how to manage that, eventually &lt;em&gt;hire&lt;/em&gt; someone to manage it, buy email client software for everyone (in our case, Microsoft Outlook), eventually decide that we wanted to use Microsoft Exchange instead of Sendmail, and then keep on top of hardware and software maintenance for everything we had bought, all in an environment where prices and technology and requirements were continuously variable. It took nearly a whole full-time person just to figure out which options we should be thinking about.&lt;br /&gt;&lt;br /&gt;Jeff Holt did most of this work for us in my first start-up almost ten years ago. Now, when you think of how many people in the world there are who can set up email, and compare that to how few people in the world there are who can do what Jeff can do with an Oracle database, you realize that the opportunity cost of having Jeff fiddle with email is ludicrously high. But in 1999, the only other option I knew about was to spend a bunch of cash to hire a separate person to do it instead of Jeff.&lt;br /&gt;&lt;br /&gt;Today, you pay $50 to Google for a whole year's worth of Gmail service for each employee you have, and that's it. Ok, there's a half hour or so of configuration work you have to do to get your own domain name in your email addresses. But for way less than one month's rent, you've got email for your company for a whole year that works every time, all the time, from anywhere.  All you need is a browser to access it, and even that is free these days.&lt;br /&gt;&lt;br /&gt;I can tell you the same kind of story for web hosting, bug tracking, backup and recovery, HR and payroll, accounting, even for sales. The common thread here is that there are a lot of things you have to do as a business that have nothing whatsoever to do with what your business really does, which is that content that your people are really &lt;em&gt;passionate&lt;/em&gt; about providing to the market. Today, it's economically efficient to let specialty firms do things for you that ten years ago, you wouldn't have considered letting someone else do.&lt;br /&gt;&lt;br /&gt;...Which brings me to what we do. My company, &lt;a href="http://method-r.com/"&gt;Method R Corporation&lt;/a&gt;, does performance for a living. Specifically, Oracle software performance. We know how to make just about any Oracle-based software go faster, and we can do it quicker than you probably think. And we can teach people how to do it just like we do. We even sell the tools we use, which make it a lot easier to do what we do. It works. Read the &lt;a href="http://method-r.com/software/profiler"&gt;testimonials at our Profiler page&lt;/a&gt; for some evidence of what I mean.&lt;br /&gt;&lt;br /&gt;So here's a really important question for our company: Why would a telco or a manufacturer or a transportation company or a financial services company—or even a computer software manufacturer—want to learn as much about Oracle performance as the people in Method R have invested into learning? The answer is that a lot of companies just don't.&lt;br /&gt;&lt;br /&gt;I love the field of software performance. I &lt;em&gt;love&lt;/em&gt; it; it's my life's work. But most people don't. There are a lot of business owners and even software developers out there who just don't love thinking about software performance. I get that. Hey, I happen not to love thinking about software security. I know it's necessary, and I want it; I just don't want to have to think about it. I think most people regard software performance the same way: want it, &lt;em&gt;need&lt;/em&gt; it even, don't want to think about it.&lt;br /&gt;&lt;br /&gt;What if software performance were something, like Gmail, that just &lt;em&gt;worked&lt;/em&gt;, and the only time you had to think about it was when you wrote a little check to make sure you could continue not having to think about it? I think there's a real business model there.&lt;br /&gt;&lt;br /&gt;So here's what we're doing.&lt;br /&gt;&lt;br /&gt;The people here at Method R have created a software package that we call our SLA Manager. "SLA" stands for "Service Level Agreement." It is software that tracks the response times (the durations that your end-users care about) of the business tasks that you mark as the most important things you want to watch. For example, if your application's "Book Order" function is something that's important to you, we can measure all 10,436 of your "Book Order" button clicks that happened yesterday. Our SLA Manager could tell you how long every single one of those clicks took. We can report information like, "Only 92.7% of those clicks were fulfilled in 3 seconds or less (not 99% like you wanted)." Of course, we can see trends in the data (that is, we can see your performance problems before your users can), and so on.&lt;br /&gt;&lt;br /&gt;So, our value proposition is this: We'll install some data collection software at your site. We'll instrument some of the business tasks that you want to make sure never have performance problems. We'll show you exactly what we're doing so there's no need to fear whether we're messing anything up for you. For example, we'll show you how to turn all our stuff off with the flick of a switch in case you ever get into a debate with one of your software vendors over the impact our measurements might have upon your system.&lt;br /&gt;&lt;br /&gt;We'll periodically transfer data from your site to ours, where we'll look at your performance data. We'll charge a small fee for that. The people looking at your data will be Cary Millsap, Jeff Holt, &lt;a href="http://karenmorton.blogspot.com/"&gt;Karen Morton&lt;/a&gt;, ...people like that. &lt;blockquote&gt;Remember: we're not looking at your actual &lt;em&gt;transactions&lt;/em&gt;; all we're going to see is how many you do and how long they take.&lt;/blockquote&gt;We'll report regularly to you on what we see, and we'll make recommendations when we see opportunities for improvement. How much or how little help you want will be your decision. If you ever do want us to help you fix a performance problem with one of the tasks that we've helped you instrument, we'll be able to provide quick answers because we have the tools that work with the instrumentation we installed.&lt;br /&gt;&lt;br /&gt;Another part of our service will be regularly scheduled knowledge transfer sessions, where the same people I've mentioned already will be available to you. Whether the events are public or private, remote or on-site, ...that will depend on the level of service you want to purchase. We'll tailor these sessions to your needs. We'll be in tune with those needs because of the data we'll be collecting.&lt;br /&gt;&lt;br /&gt;If this business model sounds attractive to you, then I hope you'll drop us a note at info at method-r dot com. If it doesn't sound attractive, then we're eager to know how we could make the idea more appealing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-5730841958454673735?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/5730841958454673735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=5730841958454673735' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5730841958454673735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5730841958454673735'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/06/performance-as-service.html' title='Performance as a Service'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-3024744167342693824</id><published>2008-07-01T07:48:00.000-07:00</published><updated>2008-11-09T07:10:14.839-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='multitasking'/><category scheme='http://www.blogger.com/atom/ns#' term='christine rosen'/><category scheme='http://www.blogger.com/atom/ns#' term='joel spolsky'/><title type='text'>Multitasking: Productivity Killer</title><content type='html'>A couple of years ago, I read &lt;a href="http://joelonsoftware.com/"&gt;Joel Spolsky&lt;/a&gt;'s article "&lt;a href="http://www.joelonsoftware.com/articles/fog0000000022.html"&gt;Human Task Switches Considered Harmful&lt;/a&gt;," and it resonated mightily. The key take-away from that article is this: &lt;span style="font-weight: bold;"&gt;N&lt;/span&gt;&lt;strong&gt;ever let people work on more than one thing at once.&lt;/strong&gt; Amen. The nice thing about Joel's article is that it explains &lt;em&gt;why&lt;/em&gt; in a very compelling way.&lt;br /&gt;&lt;br /&gt;Last week, a good friend emailed me a link to an article by &lt;a href="http://www.thenewatlantis.com/authors/christine-rosen"&gt;Christine Rosen&lt;/a&gt; called "&lt;a href="http://www.thenewatlantis.com/publications/the-myth-of-multitasking"&gt;The Myth of Multitasking&lt;/a&gt;," which goes even further. It quotes one group of researchers at the University of California at Irvine, who found that workers took an average of twenty-five minutes to recover from interruptions such as phone calls or answering e-mail and return to their original task.&lt;br /&gt;&lt;br /&gt;So it's not just me.&lt;br /&gt;&lt;br /&gt;The "benefits" of human multitasking is an illusion. Looking or feeling busy is no substitute for accomplishment.&lt;br /&gt;&lt;br /&gt;Here's a passage from the Rosen article that might get your attention, if I haven't already: &lt;blockquote&gt;...Research has also found that multitasking contributes to the release of stress hormones and adrenaline, which can cause long-term health problems if not controlled, and contributes to the loss of short-term memory.&lt;/blockquote&gt;Translation: Trying too hard to do the information overload thing makes you sick, and it makes you stupid.&lt;br /&gt;&lt;br /&gt;For as long as I can remember, I've hated the times I've been "forced" to multitask, and I've loved those segments of my life when I've been free to lock down on a train of thought for hours at a time. I believe deep down that multitasking is bad—at least for me—and literature like the two articles I've discussed here supports that feeling in a compelling way.&lt;br /&gt;&lt;br /&gt;Here's a checklist of decisions that I resolve to implement myself:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;When you need to sit down and write, whether it's code or text, close your door, and turn off your phone and your email. (Or just work the 10pm-to-4am shift like I did with &lt;em&gt;&lt;a href="http://www.amazon.com/gp/product/059600527X?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=059600527X"&gt;Optimizing Oracle Performance&lt;/a&gt;&lt;/em&gt;.)&lt;/li&gt;&lt;li&gt;When you're in a classroom, if you're really trying to learn something, turn off your email and your browser.&lt;/li&gt;&lt;li&gt;When you're managing someone, make sure he's working on &lt;em&gt;one thing at a time&lt;/em&gt;. It's obviously important that this one thing should be the &lt;span style="font-style: italic;"&gt;right&lt;/span&gt; thing to be working on. But it's actually worse to be working on &lt;em&gt;two&lt;/em&gt; things than working on just one &lt;em&gt;wrong&lt;/em&gt; thing. Read &lt;a href="http://www.joelonsoftware.com/articles/fog0000000022.html"&gt;Spolsky&lt;/a&gt;. You'll see.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-3024744167342693824?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/3024744167342693824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=3024744167342693824' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3024744167342693824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3024744167342693824'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/07/multitasking-productivity-killer.html' title='Multitasking: Productivity Killer'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-6194712315131013075</id><published>2008-06-09T09:40:00.000-07:00</published><updated>2009-10-07T08:27:15.982-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stop guessing'/><category scheme='http://www.blogger.com/atom/ns#' term='profiles'/><category scheme='http://www.blogger.com/atom/ns#' term='flash drive'/><category scheme='http://www.blogger.com/atom/ns#' term='Profiler'/><title type='text'>Why Guess? When You Can Know</title><content type='html'>&lt;p&gt;The comment from plαdys on &lt;a href="http://carymillsap.blogspot.com/2008/06/flash-drives-and-databases.html"&gt;my post about flash drives and databases&lt;/a&gt; is a great entry into exactly the right conversation to be having. He wrote:&lt;/p&gt;&lt;blockquote&gt;What about Data Warehouse type databases? Lots of full table scans, less use of cache (not sure if that's true)...&lt;/blockquote&gt;&lt;p&gt;The traditional approach to having this conversation is for a few enthusiastic participants to argue over what happens "most of the time" or what "can happen." I used to participate in conversations like that at conferences, on panels, and in email. Nowadays, people have conversations like this in newsgroups and blogs.&lt;/p&gt;&lt;p&gt;I'll submit to you that the conversation about what "can happen" and subsequent arguments about what happens "most of the time" are irrelevant. Here's why. Imagine that a conversation like that converged to a state where one person was able to argue successfully that "in precisely 99% of cases, some proposition P is true." That never happens, but go with me for a second; imagine it did.&lt;/p&gt;&lt;p&gt;So, now, is P true for you? Most people seem to assume that the things that happen to them are like the typical things that happen to most people. Most people would think, "If P is that common, then surely P is true for me." Maybe it is. But then again, maybe it's not. The most likely situation is that P is true for some tasks running within your system, but it's not true for others. Whether P is true for the &lt;em&gt;most important&lt;/em&gt; tasks on your system is simply a game of chance if you're like most people who have this conversation.&lt;/p&gt;&lt;p&gt;My point is: Why guess? When you can &lt;em&gt;know&lt;/em&gt;. When it comes to Amdahl's Law, you should be able to &lt;em&gt;know&lt;/em&gt; exactly how much response time of an individual business task is being consumed upon the component of your system that you're thinking about upgrading. If you want to see an example of what it looks like, look at &lt;a href="http://method-r.com/software/profiler"&gt;our Profiler page&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;With Oracle systems, though, the traditional approach is not to think that way. The traditional approach is to look at measurements upon the resources that comprise a system (its CPUs, its memory, its disks, its network), not measurements upon the &lt;span style="font-style: italic;"&gt;business tasks&lt;/span&gt; that the company who owns the machine is spending its money to perform.&lt;/p&gt;&lt;p&gt;My whole point is that if you look at the response time of your business's most important tasks (that's what &lt;a href="http://method-r.com/faq/31-method-r/35-what-is-method-r"&gt;Method R&lt;/a&gt; is all about), then you don't have to care about conversations about other people's systems, or whether your system is typical enough to follow other people's advice. You won't have to guess about stuff like that, because you'll know the specific nature and needs of &lt;em&gt;your system&lt;/em&gt;, regardless of whether your system happens to be like anyone else's.&lt;/p&gt;&lt;p&gt;Stop guessing. You can &lt;em&gt;know&lt;/em&gt;. But you have to be willing to look at performance from the outside in, from the perspective of the task being processed, not from the traditional inside-out perspective of the resources doing the work.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-6194712315131013075?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/6194712315131013075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=6194712315131013075' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/6194712315131013075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/6194712315131013075'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/06/why-guess-when-you-can-know.html' title='Why Guess? When You Can Know'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-4882546977190149227</id><published>2008-06-04T14:16:00.000-07:00</published><updated>2008-06-04T15:22:46.355-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='profiles'/><category scheme='http://www.blogger.com/atom/ns#' term='flash drive'/><category scheme='http://www.blogger.com/atom/ns#' term='Profiler'/><category scheme='http://www.blogger.com/atom/ns#' term='Method R'/><title type='text'>Flash Drives and Databases</title><content type='html'>I learned today about "&lt;a href="http://www.networkworld.com/news/2008/060308-sun-flash-storage.html?hpg1=bn"&gt;Sun to embed flash storage in nearly all its servers&lt;/a&gt;." This is supposed to be good news for database professionals all over because, flash storage "...consumes one-fifth the power and is a hundred times faster [than rotating disk drives]."&lt;br /&gt;&lt;br /&gt;Hey-hey!&lt;br /&gt;&lt;br /&gt;Of course, flash storage is going to cost a little more. Well, I'm not sure, maybe a lot more. But,  according to the article:&lt;br /&gt;&lt;blockquote&gt;John Fowler, the head of Sun’s servers and storage division, said at a press conference in Boston Tuesday. “The fact that it’s not the same dollars per gigabyte is perfectly okay.”&lt;/blockquote&gt;Alright, I understand that. Get more, pay more. I'm still on board.&lt;br /&gt;&lt;br /&gt;But I predict that a lot of people who buy flash storage are going to be disappointed. Here's why.&lt;br /&gt;&lt;br /&gt;We all know now that flash storage is a hundred times faster than rotating disk drives. (Says so right in the article. And consumes one-fifth the power.) We all also "know" that databases are I/O intensive applications. (The article says that, too. But everybody already "knew" that anyway.)&lt;br /&gt;&lt;br /&gt;The problem that's going to happen is the people (1) who have a slow database application, (2) who assume that their application is slow because of the I/O it is doing, (3) whose application doesn't really spend much time doing I/O at all (whether it does a "lot" of I/O is irrelevant), and (4) who buy flash storage specifically on the hope that after the installation, their database application will "be 100x faster" (because, of course, the flash storage is 100x faster than the storage it is replacing).&lt;br /&gt;&lt;br /&gt;See the problem?&lt;br /&gt;&lt;br /&gt;Think about Amdahl's Law: improving the speed of a component will help a user's performance only in proportion to the duration for which that user used that component in the first place. Here's an example. Imagine this response time profile:&lt;br /&gt;&lt;blockquote&gt;Total response time: 100 minutes (100%)&lt;br /&gt;Time spent executing OS read calls: 5 minutes (5%) (e.g., &lt;span style="font-style: italic;"&gt;db file sequential read&lt;/span&gt;)&lt;br /&gt;Time spent doing other stuff: 95 minutes (95%)&lt;br /&gt;&lt;/blockquote&gt;Now, so how much time will you save if you upgrade your disk drives to a technology that's 100x faster. The answer is that the new "Time spent executing OS read calls" will be .05 minutes, right? Well, maybe. Let's go with that for a moment. If that were true, then how much time will you save? You'll save 4.95 minutes, which is 4.95% of your original response time. Your application won't be 100x faster (or, equivalently, 99% faster), it'll be 4.95% faster.&lt;br /&gt;&lt;br /&gt;The users in this story aren't going to be happy with this if they're thinking that the result of an expensive upgrade is going to be 100x faster performance. If they're expecting 1-minute performance and get 95.05-minute performance instead, they're going to be, um, disappointed.&lt;br /&gt;&lt;br /&gt;Now, reality is probably not even going to be &lt;span style="font-style: italic;"&gt;that&lt;/span&gt; good. Imagine that those 5 minutes our user spent in the 100-minute original application response time was consumed executing 150,000 distinct Oracle &lt;span style="font-style: italic;"&gt;db file sequential read&lt;/span&gt; calls (which map to 150,000 OS &lt;span style="font-style: italic;"&gt;read&lt;/span&gt; calls). That makes your single-call I/O latency 0.002 seconds per call (300 seconds divided by 150,000 calls).&lt;br /&gt;&lt;br /&gt;That's pretty good, but it's a normal enough latency these days on today's high-powered SAN devices. If you think about rotating disk drives, then 0.002 seconds per call is mind-blowingly excellent. But I/O latencies of 0.002 seconds or better don't come from disk drives, they come from the cache that's sitting in these SANs. The &lt;span style="font-style: italic;"&gt;read &lt;/span&gt;calls that result in physical disk access are taking much longer, 0.005 seconds or more. An average latency of 0.002 is possible because so many of those &lt;span style="font-style: italic;"&gt;read&lt;/span&gt; calls are being fulfilled from cache.&lt;br /&gt;&lt;br /&gt;And the flash drive upgrades aren't going to improve the latency of those calls being fulfilled from cache.&lt;br /&gt;&lt;br /&gt;So, to recap, the best improvement you'll ever get by upgrading to flash drives is a percentage improvement that's equivalent to the percentage of time you spent before the upgrade actually making I/O calls. If a lot of your I/O calls are satisfied by reads from cache to begin with, then upgrading to flash drives will help you less than that.&lt;br /&gt;&lt;br /&gt;The biggest performance problem most people have is that they don't know where their users' time is going. They know where their &lt;span style="font-style: italic;"&gt;system&lt;/span&gt;'s time is going, but that doesn't matter. What people need to see is the &lt;a href="http://www.method-r.com/faq/31-method-r/44-can-you-explain-method-r"&gt;response time profiles&lt;/a&gt; of the tasks that the business regards as the most important things it needs done. That's the cornerstone of what Method R (both the &lt;a href="http://www.method-r.com/faq/31-method-r/35-what-is-method-r"&gt;method&lt;/a&gt; and the &lt;a href="http://method-r.com/"&gt;company&lt;/a&gt;) is all about.&lt;br /&gt;&lt;br /&gt;Flash drives might help you. Maybe a lot. And maybe they'll help you a little, or maybe not at all. If you can't see individual user response times, then you'll have to &lt;span style="font-style: italic;"&gt;actually try them&lt;/span&gt; to find out whether they'll be good for you or not (imagine cash register sound here).&lt;br /&gt;&lt;br /&gt;We built our &lt;a href="http://www.method-r.com/software"&gt;Profiler software&lt;/a&gt; so that when we manage Oracle systems, we can &lt;span style="font-style: italic;"&gt;see&lt;/span&gt; the users' response times and not have to guess about stuff like this. When you can &lt;span style="font-style: italic;"&gt;see &lt;/span&gt;your response times, you don't have to guess whether a proposed upgrade is going to help you. You'll know exactly whom will be helped, and you'll know by how much.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-4882546977190149227?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/4882546977190149227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=4882546977190149227' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/4882546977190149227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/4882546977190149227'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/06/flash-drives-and-databases.html' title='Flash Drives and Databases'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-5741928464753279844</id><published>2008-06-04T13:58:00.000-07:00</published><updated>2008-06-04T14:11:31.560-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VMware'/><category scheme='http://www.blogger.com/atom/ns#' term='virtual machine'/><category scheme='http://www.blogger.com/atom/ns#' term='Carel Jan Engel'/><title type='text'>The Magic of VMs</title><content type='html'>Something that Faan said in a comment to &lt;a href="http://carymillsap.blogspot.com/2008/05/syncing-ical-feeds-with-my-iphone-not.html"&gt;one of my posts&lt;/a&gt; stimulated a memory I'd like to share.  In that post, I mentioned that I'd kind of interested in trying Microsoft Outlook 2007, but I'm too chicken to do it, because I don't have enough faith that if I &lt;span style="font-style: italic;"&gt;didn't&lt;/span&gt; end up wanting to buy it, I'd be able to uninstall it without gorping up my Outlook 2003 installation, which I still rely upon.&lt;br /&gt;&lt;br /&gt;He mentioned that a good way to evaluate a product without having that product go mad through your production data is to use virtual machine software, like &lt;a href="http://vmware.com/"&gt;VMware&lt;/a&gt;. In my estimation, this is brilliant.&lt;br /&gt;&lt;br /&gt;And that's where the memory comes in. On my most recent trip to Europe, I had some time with my good friend Carel Jan Engel. Among the many stories we traded, Carel Jan gave me an excellent solution to the age-old problem of the awful transition period you have to go through when you replace your laptop computer.&lt;br /&gt;&lt;br /&gt;In the Old Days, when you got a new computer, you had to install all the stuff that used to be on your old computer onto your new computer. This typically required me to spend &lt;span style="font-style: italic;"&gt;weeks&lt;/span&gt; with both laptops sitting in front of me, so I could have access to all the license keys and so forth that I needed to install everything onto my new machine. Then there was the issue of re-customizing all your toolbars and everything that makes your apps yours.&lt;br /&gt;&lt;br /&gt;Carel Jan excitedly told me the story of how he had just bought himself a new laptop, and all he had to do was bundle up the old Windows VM from his old machine, and copy it to his new machine. Presto! No more laptop upgrade purgatory. Brilliant.&lt;br /&gt;&lt;br /&gt;Looks like I'll have one more purgatory to survive, and, if I do things right, that will be the end of it for this lifetime.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-5741928464753279844?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/5741928464753279844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=5741928464753279844' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5741928464753279844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/5741928464753279844'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/06/magic-of-vms.html' title='The Magic of VMs'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-128146938216703676</id><published>2008-06-04T13:32:00.000-07:00</published><updated>2008-06-04T14:12:27.781-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Synthesis AG'/><category scheme='http://www.blogger.com/atom/ns#' term='GooSync'/><category scheme='http://www.blogger.com/atom/ns#' term='jail-breaking'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone SDK'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='SyncML'/><category scheme='http://www.blogger.com/atom/ns#' term='Plaxo'/><title type='text'>Syncing..., Part 2</title><content type='html'>I've learned a lot about syncing my iPhone from the comments I received on &lt;a href="http://carymillsap.blogspot.com/2008/05/syncing-ical-feeds-with-my-iphone-not.html"&gt;&lt;span style="text-decoration: underline;"&gt;my prior post about syncing&lt;/span&gt;&lt;/a&gt;. Here's a summary:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.plaxo.com/"&gt;Plaxo&lt;/a&gt; is cool, but it just doesn't do what I need. It doesn't put appointments into my iPhone stand-alone Calendar application. ...Which means that when I'm in Europe and don't want to pay roaming charges for data, I'm not going to get an alert on my iPhone when a Google Calendar-entered appointment comes due.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.goosync.com/"&gt;GooSync&lt;/a&gt; looks interesting (e.g., "Sync multiple Google calendars"), but I'd have to pay for the Premium Account option to see if it would work. With so many things I've tried &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; working, and with plenty of other things occupying my time, my internal barrier to entry is too high to try this one.&lt;/li&gt;&lt;li&gt;It looks like &lt;a href="http://www.synthesis.ch/"&gt;Synthesis AG&lt;/a&gt; has interesting plans for an iPhone SyncML client, but it looks like that would give me less of a "solution" per se, and more of a basis for a new programming project that I could do myself with the GData APIs that Tony mentioned. I'm not interested in doing this myself as a project.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Dominic sent me an &lt;a href="http://lifehacker.com/393602/nemussync-syncs-google-and-iphone-calendars-wirelessly"&gt;interesting article&lt;/a&gt; that does really get to the point of what I want, but it requires jail-breaking (i.e., voiding the warranty) on my iPhone. It didn't take me much introspection to figure out my position on this: I'm not a jail-breaking kind of guy.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The best solution appears to be to wait a few weeks and see what happens as a result of the scheduled-for-June release of iPhone G3 or whatever they'll call it, which is supposed to also take advantage of some mass of developers out there writing new apps for the new &lt;a href="http://www.techcrunch.com/2008/03/06/iphone-20-enterprise-ready-developer-ready/"&gt;iPhone SDK&lt;/a&gt;. So, I'll wait and see what happens here in the next few weeks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-128146938216703676?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/128146938216703676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=128146938216703676' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/128146938216703676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/128146938216703676'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/06/syncing-part-2.html' title='Syncing..., Part 2'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-4379207747910565096</id><published>2008-05-27T12:42:00.001-07:00</published><updated>2008-05-27T14:42:58.456-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iCal'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='TripIt'/><category scheme='http://www.blogger.com/atom/ns#' term='Outlook 2003'/><title type='text'>Syncing iCal feeds with my iPhone: Not</title><content type='html'>Here's something I need to do, but I don't know how: sync an iCal feed with the calendar application on my iPhone, without a Mac, and without upgrading Outlook 2003 to Outlook 2007. Here's the whole story.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, I travel. Sometimes, a &lt;span class="Apple-style-span" style="font-style: italic; "&gt;lot&lt;/span&gt;. And I have a lot of appointment managing to do. I feel very disoriented whenever I don't have my itinerary available to me, in my pocket. I also need my schedule on my laptop, where I can see a whole month in one view. Of course, the schedule in my pocket and the schedule on my laptop need to be synchronized.&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I own an iPhone. It's the first cellphone I've truly loved since the first Nokia I bought back in the 1990s. I love it. My iPhone syncs with Microsoft Outlook 2003 on my Dell laptop. I don't own Outlook 2007. I don't do email in Outlook anymore. I use Gmail, both at home and at work. And on my iPhone.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I do still use Outlook, though, for calendars and contacts. That's because I don't know a better way. I need read/write access to my calendar and contacts lists on my PC, and I certainly don't want the last copy of my calendar and contacts to be stored on a device that goes with me everywhere I go and that could easily be lost or stolen.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A better place to store calendar data is on the web. That way, I can share it with people (without other people, we wouldn't need calendars at all!), and I can access it from whatever computer happens to be available. Enter Google Calendar.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I want to love Google Calendar, but I can't. I love the idea of it, but I don't love &lt;span class="Apple-style-span" style="font-style: italic;"&gt;it&lt;/span&gt; because I can't sync it with my iPhone. There's no direct hookup between Google Calendar and my iPhone. Yes, I know I can see my Google Calendar from my iPhone, and I remember being able to do some limited form of calendar editing from my iPhone, but that's not good enough. I need alerts when I'm not connected. I need my information stored locally within the calendar application on my iPhone.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think the solution is supposed to be &lt;a href="http://www.google.com/support/calendar/bin/answer.py?hl=en-ie&amp;amp;answer=89955"&gt;Google Calendar Sync&lt;/a&gt;. It syncs information from Google Calendar to Outlook 2003, where I can sync to my iPhone. But Google Calendar Sync doesn't work on my laptop. I keep getting &lt;a href="http://groups.google.com/group/google-calendar-help-bugs/msg/ca54a35cdebc2534"&gt;error code 1008&lt;/a&gt;. I looked it up, and Google says they're working on it, but there's no relief today. Additionally, even if I could get Google Calendar Sync to work (I had it working a couple of months ago), it still doesn't do what I need it to do. That's because Google Calendar Sync syncs only my primary Google Calendar to Outlook. More on that in a minute.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, let me describe one of the world's very coolest web applications ever: &lt;a href="http://tripit.com"&gt;TripIt.com&lt;/a&gt;. TripIt is wholly excellent. Imagine this. Book a flight at American Airlines, a hotel room at Hilton, and a rental car at Hertz. You get three confirmation email messages as a result. In the old days, you might have spent some of your time transcribing the information from those messages into Outlook or whatever. Or maybe you paid someone good money to transcribe them for you.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With TripIt, all you do is forward your three confirmation email messages to plans@tripit.com. And then all your itinerary information gets structured automatically into a complete, single itinerary that you can access on the web. You can print that itinerary on a page or two, stuff it into your briefcase, and have everything you need: flight times, rental car and hotel confirmation numbers, weather forecasts, pertinent local maps, ..., everything. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's not even the best part. The best part is that TripIt creates an iCal feed that Google Calendar can pick up automatically.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So let me recap. You book travel however you like. You forward the confirmation mails to plans@tripit.com. (It just occurred to me that you could even do this automatically with Gmail filters). And then Google Calendar picks up your whole itinerary automatically.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;But for me, that's where the joy ends. Because even when Google Calendar Sync does work (remember the 1008 error causes it not to), it syncs only your primary calendar. It doesn't sync a secondary calendar obtained through an iCal feed, so it doesn't sync my TripIt calendar.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, here's what my process looks like now:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Book travel.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Forward the confirmation emails to plans@tripit.com.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Print my TripIt unified itinerary for my briefcase.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Type my itinerary into Outlook (or onto my iPhone). If the travel spans more than just a couple of time zones, then I enter the itinerary at &lt;a href="http://mytimetraveler.com"&gt;mytimetraveler.com&lt;/a&gt; (which does my time zone arithmetic for me), and then I download the Outlook itinerary record from the web page. Back when I could get Google Calendar Sync to work, copying my TripIt calendar records to my primary calendar was an option, but not a good one.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Sync my iPhone with my laptop.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Here's what I wish my process looked like:&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Book travel.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Forward the confirmation emails to plans@tripit.com.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Print my TripIt unified itinerary for my briefcase. (Or not.)&lt;/li&gt;&lt;li&gt;Sync my iPhone with my laptop.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;I've actually considered upgrading to Microsoft Outlook 2007, which, I understand, knows about iCal feeds. It might be able to sync my TripIt data with my iPhone. But I think the price tag is too high to pay for that one feature. And I'm not even assured that it will work. I know Microsoft has a 60-day free trial, but I'm worried that Outlook 2003 won't ever work right again if I try 2007 and don't like it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another option I've considered is replacing my laptop with a MacBook Pro. As tempted as I am by that idea, I'm not going to do that right now, and I'm not sure whether it would actually solve my problem anyway. Would it?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I hope there's a solution that I can implement with minimal expense, and with the hardware I own today. If there is, I sure haven't found it yet. I'd love to hear from you if you have a helpful opinion.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-4379207747910565096?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/4379207747910565096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=4379207747910565096' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/4379207747910565096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/4379207747910565096'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/05/syncing-ical-feeds-with-my-iphone-not.html' title='Syncing iCal feeds with my iPhone: Not'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-4196965624622876474</id><published>2008-05-22T07:51:00.001-07:00</published><updated>2008-11-09T07:08:08.224-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Karen Morton'/><title type='text'>Karen Morton</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_mtpW1vu-FYo/SDWKFyC6_zI/AAAAAAAAA-Q/4w6Pn4-CWj8/s1600-h/karen.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://bp0.blogger.com/_mtpW1vu-FYo/SDWKFyC6_zI/AAAAAAAAA-Q/4w6Pn4-CWj8/s200/karen.gif" alt="" id="BLOGGER_PHOTO_ID_5203216776434482994" border="0" /&gt;&lt;/a&gt;Today I've added &lt;a href="http://karenmorton.blogspot.com/"&gt;Karen Morton's blog&lt;/a&gt; to my Blog list. I met her a few years back at a course I helped teach in Tennessee. She generously describes that the course changed her life, and she has since changed mine.&lt;br /&gt;&lt;br /&gt;Recently, Karen helped me found &lt;a href="http://method-r.com/"&gt;Method R Corporation&lt;/a&gt;. She's our director of education and consulting. Many of you have met Karen already in a classroom.&lt;br /&gt;&lt;br /&gt;Karen is an excellent teacher (that means &lt;span style="font-style: italic;"&gt;more&lt;/span&gt; than "excellent instructor"), and she's just one of those rare people who, when she says she'll do something, it's as good as a COMMIT. She is also one of the best SQL optimizers I know, on top of being a pioneer and first-rate practitioner of the techniques Jeff and I talk about in &lt;a href="http://www.amazon.com/gp/product/059600527X?ie=UTF8&amp;amp;tag=methodrcom-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=059600527X"&gt;&lt;span style="font-style: italic;"&gt;Optimizing Oracle Performance&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;She has already taught me many things, and I'm eager to watch what she will have to say online.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-4196965624622876474?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/4196965624622876474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=4196965624622876474' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/4196965624622876474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/4196965624622876474'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/05/karen-morton.html' title='Karen Morton'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_mtpW1vu-FYo/SDWKFyC6_zI/AAAAAAAAA-Q/4w6Pn4-CWj8/s72-c/karen.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-6997363682288228438</id><published>2008-05-16T11:31:00.000-07:00</published><updated>2008-05-16T11:37:52.515-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Speak-Tech'/><category scheme='http://www.blogger.com/atom/ns#' term='Minneapolis'/><title type='text'>May 28 seminar, Minneapolis</title><content type='html'>Today I'm making preparations for another public event: this one is a &lt;a href="http://www.speak-tech.com/seminars/seminar_detail.php?SeminarID=62"&gt;one-day Performance Seminar&lt;/a&gt; I'll conduct in the Minneapolis area for &lt;a href="http://speak-tech.com"&gt;Speak-Tech&lt;/a&gt; on May 28. In the morning, I'll do a "Why you can't see your real performance problems" session, and in the afternoon, I'll do "Measure once, cut twice (no, really)," which I discussed briefly here yesterday.&lt;br /&gt;&lt;br /&gt;I'm looking forward to a lot of audience interaction on this one. We should have plenty of time on the 9:00am-4:30pm agenda for discussion.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-6997363682288228438?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/6997363682288228438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=6997363682288228438' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/6997363682288228438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/6997363682288228438'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/05/may-28-seminar-minneapolis.html' title='May 28 seminar, Minneapolis'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-3455161569914865596</id><published>2008-05-15T13:40:00.000-07:00</published><updated>2008-06-04T14:16:14.020-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dilbert'/><title type='text'>Dilbert on "Measure Twice, Cut Once"</title><content type='html'>Speaking of "measure once, cut twice," here is a good Dilbert strip to get you in the mood:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dilbert.com/strips/comic/2008-03-16/"&gt;&lt;img src="http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/00000/1000/100/1902/1902.strip.gif" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954359812249072053-3455161569914865596?l=carymillsap.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://carymillsap.blogspot.com/feeds/3455161569914865596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954359812249072053&amp;postID=3455161569914865596' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3455161569914865596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954359812249072053/posts/default/3455161569914865596'/><link rel='alternate' type='text/html' href='http://carymillsap.blogspot.com/2008/05/speaking-of-measure-once-cut-twice-here.html' title='Dilbert on &quot;Measure Twice, Cut Once&quot;'/><author><name>Cary Millsap</name><uri>http://www.blogger.com/profile/16697498718050285274</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://1.bp.blogspot.com/_mtpW1vu-FYo/SzBYM6Rj_vI/AAAAAAAABeE/L6payZ4sj1k/S220/Cary+blog-01.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954359812249072053.post-2784460356570339986</id><published>2008-05-15T10:08:00.000-07:00</published><updated>2008-06-04T14:14:43.329-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ODTUG Kaleidoscope 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='New Orleans'/><title type='text'>Getting Ready for ODTUG</title><content type='html'>It's been too long since I've blogged. I've been busy doing all the little things you have to do when you start a business over the past few weeks. You know, &lt;a href="http://method-r.com/"&gt;web pages&lt;/a&gt;, contracts, business cards, email, insurance, health care, payroll, bills, furniture, vacuuming the floor, more contracts, and so on.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.odtugkaleidoscope.com/"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://bp2.blogger.com/_mtpW1vu-FYo/SCxxbevLE2I/AAAAAAAAA-I/V6wZN4QvmI0/s200/odtug.htm" alt="" id="BLOGGER_PHOTO_ID_5200656386627408738" border="0" /&gt;&lt;/a&gt;Today I received a timely message from Mike Riley of ODTUG asking the speakers at the event to  please blog about our upcoming participation in &lt;a href="http://www.odtugkaleidoscope.com/"&gt;ODTUG Kaleidoscope 2008&lt;/a&gt; next month in New Orleans. Excellent idea. I like ODTUG a lot, because it's a rare event that I attend where a lot of &lt;span style="font-style: italic;"&gt;software developers&lt;/span&gt; get together. These are the people who have the most leverage over software performance, which is my life's work.&lt;br /&gt;&lt;br /&gt;On Wednesday, June 18, I'll be presenting a paper called "&lt;a href="http://www.odtugkaleidoscope.com/abstracts4.html#Methodology"&gt;Measure once, cut twice (no, really)&lt;/a&gt;." I had to put the "no, really" in there to make people understand that it wasn't a typo. I presented this topic for the first time at the Hotsos Symposium in March, and I was reasonably happy with it, as first presentations of a topic go. Here's the abstract, in case you don't want to click away from here just now:&lt;br /&gt;&lt;blockquote&gt;“Measure Twice, Cut Once” is a reminder that careful planning yields better gratification than going too quickly into operations that can’t be undone. Sometimes, however, it’s better to measure once, cut twice. It’s one of the secrets behind how carpenters hang square cabinets in not-so-square kitchens. And it’s one of the secrets behind how developers write applications that are easy to fix when they cause performance pro
