<?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-14716356</id><updated>2011-12-14T18:44:30.587-08:00</updated><title type='text'>Software Pain and Pleasure</title><subtitle type='html'>Essays describing common problems in commercial software-development environments.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-14716356.post-115367989227971797</id><published>2006-07-23T11:17:00.000-07:00</published><updated>2006-07-23T11:38:12.386-07:00</updated><title type='text'>Un-writing code</title><content type='html'>Recently I got a chance to clean up a real mess in our system-monitoring code.  Our application was starting to run very slowly when hundreds of users were connected to a certain service.  This was puzzling, as the service was intended to handle thousands of users simultaneously -- why was it bogged down with such a small load?&lt;br /&gt;&lt;br /&gt;This had been a nagging problem for several months, and many developers had gone into the system to try to fix it.  Some improvements had been made, but we were nowhere near the needed level of performance.  The general consensus was that we needed a bigger server -- thow hardware at the problem, as the software was just fine.&lt;br /&gt;&lt;br /&gt;I spent a few days reading the code, then talking with developers.  After some simple code changes, the system was easily able to handle tens of thousands of users, without having to upgrade the hardware.&lt;br /&gt;&lt;br /&gt;What was the problem, and why hadn't it been discovered earlier?&lt;br /&gt;&lt;br /&gt;Here's what I found -- you will easily see how the problem developed ...&lt;br /&gt;&lt;br /&gt;The first developer to work on this system wrote some prototype code that efficiently handled twelve users.  He had designed a simple linear array of user-records, and when a certain operation needed to scan through the list of users, that table got built, sorted (using a bubble sort), and then traversed to make the report.&lt;br /&gt;&lt;br /&gt;A few weeks later, a different developer came in, recognized that the code was only able to handle twelve users, and rewrote the code to use an array of arbitrary size.  The rewrite allowed the array to be created when the report needed to be made.  The array would be created with whatever length was necessary, then the contents of the array would be filled-in, the array would be sorted, and the report would be generated.  Note that the bubble-sort method was retained.&lt;br /&gt;&lt;br /&gt;After that, a developer rewrote the code yet again ... this developer apparently felt that fixed-length arrays were evil, so a doubly-linked list was used.  Bubble-sort was retained, but the comparison function was re-written so that more fields of the user record were examined.&lt;br /&gt;&lt;br /&gt;After this rewrite, the code seemed to scale arbitrarily -- the problem, as you can guess, was that the bubble-sort caused the performance to lag noticeably.&lt;br /&gt;&lt;br /&gt;This lag prompted the next set of changes -- somebody noticed that the system was taking too long to produce the report.  The front-end webpage which displayed the report was not getting its results fast enough from the back-end code we're discussing here, so the front-end webpage code was timing out and displaying an empty report.&lt;br /&gt;&lt;br /&gt;The next fix was to lengthen the timeout: wait five seconds, instead of one second, for this particular report to be generated.&lt;br /&gt;&lt;br /&gt;And this is where I stepped in, to fix the whole mess.&lt;br /&gt;&lt;br /&gt;First, I noticed that the web front-end applied its own sort method to the result set, so there was no need to do back-end sorting -- the code which generated the report could just traverse the user-list, and pass an unsorted array of user records to the web front end.  Problem solved.&lt;br /&gt;&lt;br /&gt;Well, almost solved.  I went back to each developer who had touched the code, and gave them a thorough description of how poorly the entire project had gone -- and reinforced the need to really understand the problem before writing code.&lt;br /&gt;&lt;br /&gt;And thus I was able to save the project, just by removing a whole bunch of un-necessary code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-115367989227971797?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/115367989227971797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=115367989227971797' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/115367989227971797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/115367989227971797'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2006/07/un-writing-code.html' title='Un-writing code'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-114918570961841035</id><published>2006-06-01T10:53:00.000-07:00</published><updated>2006-06-01T11:15:09.650-07:00</updated><title type='text'>MSProject is Evil</title><content type='html'>OK, here's my Microsoft Project rant.  But before I get into the profanity, let's look at the problem that MSProject tries to solve ...&lt;br /&gt;&lt;br /&gt;Software scheduling is hard.  It is provably harder than software development itself.  How can I say that?  Well, if software development was a fully solved problem, it would be predictable, quantifiable, and most importantly, schedulable.  Software development, especially the innovative software engineering that drives most high-tech companies today, is inherently unpredictable.  You don't know how long or how difficult the development process will be until you are finished, and then you can look backward and see how long it took.&lt;br /&gt;&lt;br /&gt;One way to do predictable software development is to exhaustively analyze the problem before the development process begins.  A team can study, debate, and document the project before the first line of code is written.  This team identifies all of the hazard areas, proposes ways to address those hazards, and writes a full specification of the project and the development process.&lt;br /&gt;&lt;br /&gt;How long will this analysis phase take?  You don't know.  So, we're back to the original problem: until you know the difficulty of the project, you won't know how long the project will take.  How long will it take to understand the difficulty?  Nobody can predict that either.&lt;br /&gt;&lt;br /&gt;Enter Microsoft Project.&lt;br /&gt;&lt;br /&gt;MSProject provides a framework for breaking down large problems into smaller problems.  Each task can be assigned an expected time duration, start date, and one or more "resources" (i.e. developers) can be assigned to the task.&lt;br /&gt;&lt;br /&gt;Once an MSProject schedule is created, you have a picture of the future -- you know how long the project will take, who is involved in the project, and what everyone's role will be for the remainder of the project.&lt;br /&gt;&lt;br /&gt;The problem is that this schedule is completely false, because it is based upon faulty assumptions.  For example, the schedule shows that Bill will be working on the "Faucet" class from August 7th to August 10th.  It is now June 1st.  If everything works correctly and everyone does everything according to the schedule, then indeed Bill will start working on "Faucet" on August 7th.&lt;br /&gt;&lt;br /&gt;But Bill will never get to do that.  Guaranteed.  Bill will have to fix a bug that comes up on August 6th, or Sally won't finish the "Handle" class which is a predecessor to "Faucet", or Jim will decide, in July, that a new set of requirements needs to be fulfilled and the entire schedule has to be rewritten.&lt;br /&gt;&lt;br /&gt;The fundamental problem with MSProject is false accuracy.  MSProject allows you to believe that the Faucet class will take four days.  What is that based upon?  Guesswork.  Hunches.  Not science.  The net effect is that MSProject attempts to apply metrics to what is inherently un-quantifiable.&lt;br /&gt;&lt;br /&gt;What is the alternative to MSProject?  Agile development, plus a healthy dose of maturity and restraint, at least for the sort of cutting-edge projects I've worked on.  Life at the cutting edge means unpredictability.  Don't try to squeeze open-ended projects into a fixed schedule, unless you've allowed for the unpredictability via wide error bands.&lt;br /&gt;&lt;br /&gt;MSProject can be effectively applied to "cookie-cutter" projects, where the development effort involves small modifications to existing code, or replication of work previously done.  In those cases, you can quantify the effort needed to do the work, and you can do it with some accuracy.&lt;br /&gt;&lt;br /&gt;MSProject is a way of automating GANTT charts, and GANTT charts came from the construction industry.  The construction industry has been using practices, materials, and methods that have been refined for hundreds of years and typically involve replication of known practices, not cutting-edge exploratory methods.&lt;br /&gt;&lt;br /&gt;So leave MSProject for those environments, and don't try to apply precision and accuracy to unquantifiable activities.&lt;br /&gt;&lt;br /&gt;End of rant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-114918570961841035?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/114918570961841035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=114918570961841035' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/114918570961841035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/114918570961841035'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2006/06/msproject-is-evil.html' title='MSProject is Evil'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-114462591922185360</id><published>2006-04-09T16:24:00.000-07:00</published><updated>2006-04-09T16:38:39.250-07:00</updated><title type='text'>Brooks' Law and debugging</title><content type='html'>Fred Brooks' book "The Mythical Man-Month" has many gems, the brightest of which is the aphorism "Adding manpower to a late software project makes it later."&lt;br /&gt;&lt;br /&gt;And, there is what Eric Scott Raymond calls "Linus' Law": "Given enough eyeballs, all bugs are shallow."&lt;br /&gt;&lt;br /&gt;Is it possible to weave these two principles into a method to expedite software development?  Sure -- employ a mob of debuggers.  Debugging (and, to an equal extend, QA testing) benefits from scale.  Once primary development of a software project is complete, it is possible and profitable to have a large number of folks banging away at the application and reporting bugs.  You can also have a squadron of engineers peering through the code looking for the flaws that lie behind the bugs.  And, these folks can write up their discoveries for review by the original developers.&lt;br /&gt;&lt;br /&gt;In a future column, I'll talk about the debugging process in detail, but the above process does work.  Often, the squadron examining the code can be junior developers who are learning the structure of the code.  Or, you can have your wizened geniuses participating: either way (or in mixture), you're subjecting the code to a peer review which may not be possible or convenient during the original development cycle.&lt;br /&gt;&lt;br /&gt;If you're Microsoft, just call it a "beta test", and give your product to tens of thousands of motivated users and developers.  Or, call it a "technology preview".  Just don't call it an "&lt;a href="http://radar.oreilly.com/archives/2006/02/web_development_20.html"&gt;eternal beta&lt;/a&gt;".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-114462591922185360?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/114462591922185360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=114462591922185360' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/114462591922185360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/114462591922185360'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2006/04/brooks-law-and-debugging.html' title='Brooks&apos; Law and debugging'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-114272006635775369</id><published>2006-03-18T14:03:00.000-08:00</published><updated>2006-03-18T14:14:26.370-08:00</updated><title type='text'>Crystal Clarity</title><content type='html'>In most American high-end department stores, there is a housewares department with a section that sells fine china and crystal.  The display of crystal drinkware, vases, and other glassware is often the most radiant location in the store.  The exquisitely-cut goblets and candlesticks are carefully arranged under high-intensity halogen spotlights, with a matte black backdrop providing a dramatic contrast.&lt;br /&gt;&lt;br /&gt;The image is of precise, almost mathematical purity.  The eye is dazzled by the reflected and refracted light.  You want to transplant these sparkling objects to your own house, and let their light shine in your everyday surroundings.&lt;br /&gt;&lt;br /&gt;I feel the same way about code: textbooks show algorithms implemented in clean, clear fashion and express a purity of thought that I love to transport into my commercial and hobby programs.  Further, I want to clean, polish, and refine my own code so that it expresses the same clarity as the textbook examples.&lt;br /&gt;&lt;br /&gt;That's why I've enjoyed applying Martin Fowler's techniques from "Refactoring" into my own code.  Intentionally or not, he shows how code can be refined, buffed, and polished so that it shows the same simplicity and brilliance as a vase by Waterford, Swarovski, or Steuben.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-114272006635775369?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/114272006635775369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=114272006635775369' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/114272006635775369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/114272006635775369'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2006/03/crystal-clarity.html' title='Crystal Clarity'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-114194648725432620</id><published>2006-03-09T15:08:00.000-08:00</published><updated>2006-03-18T13:57:03.720-08:00</updated><title type='text'>The Peter Principle</title><content type='html'>"The Mythical Man Month" is one of the Ancient Tomes of software engineering, revered for its wisdom.  Another book which should be canonized is "The Peter Principle" by Laurence J. Peter.&lt;br /&gt;&lt;br /&gt;Peter's book describes the inevitable consequence of modern organizational dynamics: "In a hierarchy every employee tends to rise to his level of incompetence."&lt;br /&gt;&lt;br /&gt;How can we apply this maxim to software engineering?  Peter explains the inefficiencies and irrationalities of bureaucracy with this principle, but we see similar effects in any mature body of software.  Without ongoing scrutiny and diligence, software-maintenance efforts create results that are bloated, unclear, and poorly-organized.  This isn't the fault of the software itself, but rather how it is designed, written, and maintained.&lt;br /&gt;&lt;br /&gt;Often, the first version of a software program is written in haste, to solve a particular problem.  Over time, the problem-definition changes and broadens.  As that happens, the software expands to solve the larger problem.  If this is done carefully, the result matches the problem definition and retains clarity.  But, so often the result is exactly the opposite: ongoing casual bugfixing, hasty extensions, and inattention cause the program to become riddled with inefficiencies, redundant code and unused code.  The result is software that is performing far below its potential.&lt;br /&gt;&lt;br /&gt;Organizationally, the Peter Principle ensures that a collection of humans will function in a less-than-optimum manner.  In software, the Peter Principle ensures that code will contain bugs, is inefficient, and is difficult to understand.&lt;br /&gt;&lt;br /&gt;How to escape the Peter Principle?  A much-less popular book, "The Peter Prescription", outlines some remedies.  In the realm of software engineering, the current vogue is extreme programming, which via oversight, test cases, and a mood of continual monitoring and improvement attempts to keep the code clean.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-114194648725432620?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/114194648725432620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=114194648725432620' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/114194648725432620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/114194648725432620'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2006/03/peter-principle.html' title='The Peter Principle'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-114107954071245004</id><published>2006-02-27T14:19:00.000-08:00</published><updated>2006-02-27T14:32:20.726-08:00</updated><title type='text'>Antibodies</title><content type='html'>The old saw that "bureaucracies grow to fill the need of a growing bureaucracy" means that eventually your organization will acquire a few (or more) antibodies.&lt;br /&gt;&lt;br /&gt;What's an antibody?  I first heard the term at Sun Microsystems, referring (in a derogatory fashion) to chair-warming bureaucrats who are resistant to change.  Change, to an antibody, represents danger, rather than opportunity.  Hence, the antibodies swarm around the new idea and attempt to neutralize it.  With the new idea succcessfully destroyed, the antibody can return to its relaxed, inactive state.&lt;br /&gt;&lt;br /&gt;At Adobe Systems, we used a different term: the "yeahbuts".  A yeahbut, upon hearing a new idea, would respond with "Yeah, but ..." and then a set of canned reasons why innovation wasn't practical, prudent, or necessary at this particular time.&lt;br /&gt;&lt;br /&gt;The problem with antibodies is that they're hard to get out of the system, short of simply firing them.  So often, the antibody will cloak their resistive actions in a set of plausible justifications:&lt;br /&gt;&lt;br /&gt;"We haven't completed our analysis of the product requirements, so it is really premature to commit to this course of action."&lt;br /&gt;&lt;br /&gt;"My staff is fully occupied with maintenance on the most-recent release, and we haven't had time to review your proposal."&lt;br /&gt;&lt;br /&gt;or, even more insidious, the trap of false comparatives:&lt;br /&gt;&lt;br /&gt;"Your plan to put out mouse traps sounds very similar to Pete's proposal to fumigate the flooded toolshed, and we simply can't undertake the poison-abatement process with our current staff.  Therefore, I won't approve your request for new mouse-traps."&lt;br /&gt;&lt;br /&gt;Antibodies find strength in numbers, and it isn't hard to find them clustered around the drinking fountain, discussing tactics for resisting the latest "change agent".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-114107954071245004?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/114107954071245004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=114107954071245004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/114107954071245004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/114107954071245004'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2006/02/antibodies.html' title='Antibodies'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-113933893427730414</id><published>2006-02-07T11:00:00.000-08:00</published><updated>2006-02-07T11:02:14.286-08:00</updated><title type='text'>This year's must-attend conference ...</title><content type='html'>Let's all go to &lt;a href="http://www.waterfall2006.com/"&gt;Waterfall 2006&lt;/a&gt;, and use the processes of yesterday to build the products of tomorrow!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-113933893427730414?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/113933893427730414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=113933893427730414' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113933893427730414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113933893427730414'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2006/02/this-years-must-attend-conference.html' title='This year&apos;s must-attend conference ...'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-113658510274806583</id><published>2006-01-06T13:47:00.000-08:00</published><updated>2006-02-11T19:56:20.836-08:00</updated><title type='text'>Using the Wrong Tool for the Job</title><content type='html'>I've collected a few amusing examples of good intentions gone bad.  In these cases, folks are using the wrong tool for the job ..&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Misuse of Microsoft Excel: Would you use Excel as an outline processor?  There's no good way to represent a hierarchy using this grid-based tool.  Even with variable-height and variable-width cells, it just looks wrong.  Use a proper outline processor, people!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Misuse of PowerPoint: I've seen the line- and box-drawing tools used to prepare elaborate organization charts, network-flow diagrams, and other two-dimensional graphics illustrations.  No dice: get a copy of Visio or Adobe Illustrator!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Excel as a Meeting Agenda Organizer: Rows of text.  Meeting agendas.  Sound like the same thing, right?  Well, when you see somebody painfully adding/removing/copying/moving elements of a meeting agenda, especially &lt;b&gt;during&lt;/b&gt; the meeting while everyone is waiting impatiently, you'll realize why tools were developed just for that purpose!  If you don't want to get a custom tool, at least use an outline processor!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Misuse of HTML: Folks are still editing HTML documents in a raw text editor (such as Emacs, VI, or &lt;shudder&gt; Notepad).  This is the twenty-first century!  HTML should be a generated format, not a source format&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Using Excel (or Word, or other document-creation tool) to track software bugs, feature-requests, help-desk issues, etc.  There are low-cost (even "free", if you count Bugzilla) products that solve this problem much more elegantly.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Corollary to the above: using a bug-tracking tool to manage development tasks or other activities with a high degree of inter-dependence.  Foo!  Use a tool built for the purpose.  Microsoft sells something called "MSProject", which is almost adequate (it lacks groupware capabilities, the topic of another rant)&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Considering the realities of human nature, I expect to add more to the above list as time goes on.&lt;br /&gt;&lt;br /&gt;Finally, one must take a look at Peter Norvig's rendition of the Gettysburg Address in &lt;a href="http://www.norvig.com/Gettysburg/index.htm"&gt;PowerPoint&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-113658510274806583?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/113658510274806583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=113658510274806583' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113658510274806583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113658510274806583'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2006/01/using-wrong-tool-for-job.html' title='Using the Wrong Tool for the Job'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-113543883070289928</id><published>2005-12-24T07:38:00.000-08:00</published><updated>2006-01-06T12:09:59.643-08:00</updated><title type='text'>Quick sip of common sense ...</title><content type='html'>&lt;a href="http://www.technicat.com/writing/programming.html"&gt;Here&lt;/a&gt;'s a reminder of some fundamental principles of computer programming.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-113543883070289928?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/113543883070289928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=113543883070289928' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113543883070289928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113543883070289928'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/12/quick-sip-of-common-sense.html' title='Quick sip of common sense ...'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-113514107520094516</id><published>2005-12-20T20:46:00.000-08:00</published><updated>2005-12-20T20:57:55.220-08:00</updated><title type='text'>Fully-developed bureaucracies ...</title><content type='html'>A bureaucracy grows because one of the functions of a bureaucracy is to divide up responsibility.  If one person is the expert in a field, or the sole source of knowledge in an organization, the organization is in danger.  What happens if that person were to leave or suffer from an extended illness?&lt;br /&gt;&lt;br /&gt;So another person is hired to fill the same role, creating a deliberate redundancy.  Then, you have two people of perhaps similar skills and interests.  These two people need to have a communications system, so that they are aware of each other's thoughts, actions, and beliefs.  Paperwork is created.  Then, either of these two people have to communicate with others in the organizations, hence meetings.  Meetings expand to fill the available time and the available set of topics.  One person can't attend all of the meetings.  So, more people are hired in order to attend the meetings and represent the interests of the original person (who is otherwise occupied with her preparations for another meeting).&lt;br /&gt;&lt;br /&gt;In time, the worker is either attending a meeting or preparing for the next meeting.  Decisions are made in meetings, as that's the only place where consensus can be struck.  Nobody can, or should, make an independent decision, as that would possibly result in an action that wasn't approved by all "stakeholders".&lt;br /&gt;&lt;br /&gt;In a fully developed bureaucracy, every individual is redundant.  But everyone is essential, as decisions must be approved by everyone.  When one person isn't available, progress must stop.  The geometrical expansion of a bureaucracy is usually limited by the salary money available.&lt;br /&gt;&lt;br /&gt;I've found fully-developed bureaucracies in moderately-successful companies, but never in un-successful or wildly successful companies.  Why is that?  I believe that the unsuccessful companies never develop enough financial resources to hire enough individuals to build a bureaucracy to the crucial self-sustaining level.  And extremely successful companies are usually staffed with a few very clever (or accidentally successful) people.  Clever people won't put up with bureaucratic nonsense.  Accidentally successful people aren't secure enough to share the success, so they won't hire people who will spend "their" money.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-113514107520094516?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/113514107520094516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=113514107520094516' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113514107520094516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113514107520094516'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/12/fully-developed-bureaucracies.html' title='Fully-developed bureaucracies ...'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-113452488355649045</id><published>2005-12-13T17:30:00.000-08:00</published><updated>2005-12-24T16:26:34.610-08:00</updated><title type='text'>Age and Talent</title><content type='html'>I recently listened to an NPR program "Science Friday".  Ira Flatow was interviewing Alan Lightman, author of "The Discoveries: Great Breakthroughs in 20th-century Sciednce, Including the Original Papers".&lt;br /&gt;&lt;br /&gt;A listener called in with a question, asking the relationship between age and talent in science.  The common perception is that the great discoveries are made by people in their twenties and thirties.  Lightman's response was interesting: he pointed out that writers and artists generally benefit from life experiences such as families, financial ups and downs, decline and death of parents.  Such experiences enrich and add nuance to the works of novelists, painters, poets, and playwrights.  But the work of scientists doesn't benefit from these events.&lt;br /&gt;&lt;br /&gt;OK, maybe that's true.  But I have a different perspective: experienced engineers and scientists may not be more capable of doing "the right thing", but I assert that they have a greater ability to avoid doing "the wrong thing".&lt;br /&gt;&lt;br /&gt;Anecdotally, I've noticed this over and over throughout my career: trust the aged guru to point out the hazards of the path.  She might not have the solution, but she'll warn you of all the mis-steps along the way to the solution.&lt;br /&gt;&lt;br /&gt;Footnote:  Richard Hamming talks a bit about age and creativity &lt;a href="http://paulgraham.com/hamming.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-113452488355649045?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/113452488355649045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=113452488355649045' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113452488355649045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113452488355649045'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/12/age-and-talent.html' title='Age and Talent'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-113443827433074197</id><published>2005-12-12T17:36:00.000-08:00</published><updated>2005-12-12T17:44:34.340-08:00</updated><title type='text'>Roadtrip software engineering</title><content type='html'>When I was a teenager in the mid-Seventies, I had a copy of David Ahl's "101 BASIC Computer Games".  Since I didn't actually own a computer, I'd read through the program listings and figure out how the programs work.  Then, I'd mentally think about the code that I'd write, if there were a real computer for me to work with.  A few years later, I was able to buy a Commodore PET microcomputer, and then all of those programs could be actually written and run.&lt;br /&gt;&lt;br /&gt;Last weekend, I was driving my family through rural Ohio on a family vacation, and found myself mentally composing code again.  This time, there was a laptop computer in the car, but my wife had banned its use.  Instead of writing and debugging code on the laptop, I was writing it in my head.&lt;br /&gt;&lt;br /&gt;Now that we've returned from the vacation, I can translate all of these mental notes into some code and try them out.  Thirty years ago, it was BASIC on a microcomputer with 8 kilobytes of RAM.  Now, it is Java on a gigaherz Apple laptop with a gigabyte of RAM.  Funny, my typing speed is about the same.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-113443827433074197?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/113443827433074197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=113443827433074197' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113443827433074197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113443827433074197'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/12/roadtrip-software-engineering.html' title='Roadtrip software engineering'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-113384290377483096</id><published>2005-12-05T20:14:00.000-08:00</published><updated>2005-12-05T20:21:43.786-08:00</updated><title type='text'>How do you build a pyramid?</title><content type='html'>I was talking "management science" with a friend today, and discussing company growth patterns.&lt;br /&gt;&lt;br /&gt;His pithy comment was "You don't build a pyramid from the top down", referring to the need for a strong foundation for growth.&lt;br /&gt;&lt;br /&gt;Hmmm ... obviously, you need somebody in charge of the growth, but I also believe that great engineering organizations have bottoms-up organizational structures, and many poorly-run engineering organizations are run in a top-down fashion.&lt;br /&gt;&lt;br /&gt;But growth-wise?  How about "from the inside out"?  Meaning that you add more people at the top, when the foundation can support it, and you continue to add to the base as requirements (and the pool of qualified candidates) allows.&lt;br /&gt;&lt;br /&gt;Organizations which are too strong at the top are typically too tightly controlled and generate unimaginitive products.  Organizations which are too strong at the bottom can thrash around rudderless.  Balance is paramount.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-113384290377483096?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/113384290377483096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=113384290377483096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113384290377483096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113384290377483096'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/12/how-do-you-build-pyramid.html' title='How do you build a pyramid?'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-113350341105918836</id><published>2005-12-01T21:57:00.000-08:00</published><updated>2005-12-01T22:03:31.070-08:00</updated><title type='text'>Confidence factor on estimates?</title><content type='html'>According to the schedule, one of our projects is supposed to take another six months.  Recently, somebody asked me how certain I was about that number.&lt;br /&gt;&lt;br /&gt;"Oh, I'm about ninety-percent sure that it will happen", I replied, casually.&lt;br /&gt;&lt;br /&gt;"What's your confidence factor?", asked my questioner.&lt;br /&gt;&lt;br /&gt;I thought a minute, somewhat dumbfounded.  A confidence factor on an estimate?  Uhh, should I reply with a standard deviation?  Some sort of error band?&lt;br /&gt;&lt;br /&gt;"Oh, I'm about eighty-five percent sure that I'm ninety-percent sure that it will take six months", I answered gamely.&lt;br /&gt;&lt;br /&gt;"Thanks ... I'll check back in a few weeks and let's see how it is going".&lt;br /&gt;&lt;br /&gt;I was confused.  What had I just said?  A few minutes later, I realized that while my questioner was satisfied with the answer, I would have been more satisfied had I replied, "Oh, I think it will take five to seven months.  Dead sure."&lt;br /&gt;&lt;br /&gt;Just another surreal moment in software development.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-113350341105918836?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/113350341105918836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=113350341105918836' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113350341105918836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113350341105918836'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/12/confidence-factor-on-estimates.html' title='Confidence factor on estimates?'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-113328789328097081</id><published>2005-11-29T10:05:00.000-08:00</published><updated>2005-11-29T10:11:33.300-08:00</updated><title type='text'>Bug Synchronicity ...</title><content type='html'>Have you ever noticed that a bug can lay dormant in a product for months (maybe YEARS), then all of a sudden it becomes manifest, everywhere, instantly, simultaneously.&lt;br /&gt;&lt;br /&gt;I've often puzzled over this ... how can it happen that nobody, then everybody, sees a bug?&lt;br /&gt;&lt;br /&gt;Recently, this happened again in a product that I'm managing.  This time, I wanted to find out how it had remained unobserved for so long.  We found that the bug had been present for about two years, but hadn't been revealed until a new bit of code had subtly altered the program flow.  At that point, the original problem (a data corruption) started to really affect the system in a negative way.&lt;br /&gt;&lt;br /&gt;I was disassapointed.  I had hoped to find evidence of UFOs, gremlins, or astral convergence.  In the end, it was a simple buffer overflow (scourge of C programmers everywhere).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-113328789328097081?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/113328789328097081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=113328789328097081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113328789328097081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113328789328097081'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/11/bug-synchronicity.html' title='Bug Synchronicity ...'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-113313095525358707</id><published>2005-11-27T14:27:00.000-08:00</published><updated>2005-11-27T14:35:55.263-08:00</updated><title type='text'>What type of engineers do you hire?</title><content type='html'>Recently, I wrote about the type of managers I like.&lt;br /&gt;&lt;br /&gt;Let's discuss the type of engineers I hire.  The best engineers don't just write code, they obsess over it.  They live it.&lt;br /&gt;&lt;br /&gt;How can you tell if you're interviewing a developer who is obsessed with code?  Ask her about hobby projects -- the little bits of code written out of curiousity, as a hobby, or to solve a particular interesting problem.  Ask her to send you a code sample, so you can take a look at coding style, organization, and clarity.&lt;br /&gt;&lt;br /&gt;Over the years, I've seen some interesting hobby projects: code for digital control of a model railroad, code to organize mp3 files, and most recently, a particularly elegant solution to sudoku puzzles.&lt;br /&gt;&lt;br /&gt;People who are motivated to write great software for themselves will typically be motivated to write great software for you.&lt;br /&gt;&lt;br /&gt;I look for other aspects in a candidate, but el numero uno is an  obsession with code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-113313095525358707?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/113313095525358707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=113313095525358707' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113313095525358707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113313095525358707'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/11/what-type-of-engineers-do-you-hire.html' title='What type of engineers do you hire?'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-113303918903852078</id><published>2005-11-26T12:51:00.000-08:00</published><updated>2005-11-26T13:06:29.050-08:00</updated><title type='text'>Software Debugging vs. Product Maintenance</title><content type='html'>What's the difference between debugging and maintenance?&lt;br /&gt;&lt;br /&gt;You debug software, then you ship it.  Then, you maintain it.&lt;br /&gt;&lt;br /&gt;In most high-tech development environments, the "ship" decision is made almost arbitrarily: it may be a date on the calendar, it may be when the customer is ready to cancel the project, or it may be when the last high-priority bug is fixed.  I even remember a release was made because the project-manager said she'd quit if we didn't ship the code -- so, the release was determined by PM pique.&lt;br /&gt;&lt;br /&gt;Once the code has been delivered to an external customer, many development organizations hand off responsibility to a "maintenance" team.  The maintenance team needs the same skills, the same levels of insight, creativity, and imagination as the original development team.  The maintenance team is continuing the implementation: molding the software to fit into unexpected environments, shaping it to handle unanticipated situations, and generally tracking down the problems that the original team was too rushed to consider.&lt;br /&gt;&lt;br /&gt;Ideally, the maintenance team is the development team.  Often, that isn't the case, as the original development team is off trying to design and implement a new raft of features.  But if you don't staff your maintenance team with people equally skilled in software engineering, your product will suffer.  Just as submarines, nuclear reactors, and MRI machines aren't run by new college hires, don't assume that your multi-million dollar software product can be maintained by junior programmers.  I've always kept my senior developers involved in the debugging process.  Many times, the most experienced developer is the most effective debugger.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-113303918903852078?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/113303918903852078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=113303918903852078' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113303918903852078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113303918903852078'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/11/software-debugging-vs-product.html' title='Software Debugging vs. Product Maintenance'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-113221008962357004</id><published>2005-11-16T22:31:00.000-08:00</published><updated>2005-11-16T22:48:09.636-08:00</updated><title type='text'>What type of management do you have?</title><content type='html'>The best development houses have management structure similar to successful law firms and good big-city newspapers.&lt;br /&gt;&lt;br /&gt;When I mention these parallels, folks usually scratch their heads in wonder.  Maybe you are doing so now, so I'll explain.&lt;br /&gt;&lt;br /&gt;In good law firms, you usually have a few senior partners who are rainmakers and try important cases.  They are lawyers, not bureaucrats.  They will sweat over briefs, dig up interesting facts for presentation to the jury, and show up at 8:30 AM to face the judge.  Sure, they delegate, and sometimes overwork the junior partners, associates, clerks and secretaries.  But, they're also in court on a regular and frequent basis.&lt;br /&gt;&lt;br /&gt;In well-run newspapers, the senior staff are the editors: they oversee the daily operations of reporting, story selection, and editing.  They run around making sure that the reporters are diligent with sources, double-verify all accounts, and behave in an honorable and principled fashion.  When the time is right, they duck back into the office (or maybe to a local bar) and write a column or editorial.&lt;br /&gt;&lt;br /&gt;Just like the senior law partner, the senior editor produces.&lt;br /&gt;&lt;br /&gt;And, well-run tech companies have senior management staff that produce.  The zenith of Silicon Valley companies (IMHO) was the "old HP", when Hewlett and Packard were in charge.  They were a familiar sight in the lab, used their own products, and had a real sense of product design and customer support.  When the professional managers took over at HP, the company's decline began.  But Hewlett and Packard continued to invent, even in retirement.  For another example, walk down Stevens' Creek Boulevard to Apple.  Ask about the Sculley/Spindler years.  Find out what happened when professional managers took over Apple.  Then, ask about the renaissance when Jobs returned.&lt;br /&gt;&lt;br /&gt;Moral: Hire an engineer to run an engineering company.  Hire a professional manager to run a soap factory, a soft-drink company, or an advertising agency.  Let the editors run the newspapers, and let the senior partners sit in a courtroom from time to time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-113221008962357004?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/113221008962357004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=113221008962357004' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113221008962357004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113221008962357004'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/11/what-type-of-management-do-you-have.html' title='What type of management do you have?'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-113163543443457764</id><published>2005-11-10T06:52:00.000-08:00</published><updated>2005-11-10T07:10:34.480-08:00</updated><title type='text'>Rules are made to be broken</title><content type='html'>We recently came up with a new "engineering process" document, listing all of the steps and milestones along the path from product conception to release.&lt;br /&gt;&lt;br /&gt;Since this was a committee effort, the resulting document was huge.  Everyone got to put in their favorite little pet idea, and there was very little effort to simplify, streamline, and clarify the result.  After all, committees just want to get the job done: there wasn't much desire to offend somebody by killing off any personal proposals.&lt;br /&gt;&lt;br /&gt;Some committee-members were very intent upon reining-in the unmanaged developers.  So, the process document requires specification reviews, design reviews, code inspections, verification passes, unit-tests, QA inspection of unit-tests, test-plans written by both the developer and tester, test-plan reviews, spot-checks by QA management, feature-content verification by program management, signoff by the project manager and an extended beta period for shake-out at a customer's site.&lt;br /&gt;&lt;br /&gt;Actually &lt;i&gt;writing&lt;/i&gt; the code was a very small portion of the resulting development schedule.  The assembled committee wants most of the developer's time to be spent writing, reviewing, discussing, editing, integrating, inspecting, reviewing, and commenting.&lt;br /&gt;&lt;br /&gt;Which, of course, is no way to run a railroad.  Our company makes money by selling software, not processes or documents.  So, I made sure to insert my own pet idea: a codicil that allows a development manager to waive certain requirements if deemed necessary.&lt;br /&gt;&lt;br /&gt;OK, I'm now fine with the document.  The junior engineers can spend all of their time in review and edit sessions, so they can learn the wisdom of careful, methodical code development.  But the senior folks, the wizards who end up writing 95% of the code anyway, are exempt from most or all of the process foolishness.&lt;br /&gt;&lt;br /&gt;The process princes are happy (lots of review meetings), the truly great engineers are happy (they get to work unfettered by the committee's rules), and the negligent or junior engineers are watched carefully via the various review items.  This is perfection.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-113163543443457764?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/113163543443457764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=113163543443457764' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113163543443457764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113163543443457764'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/11/rules-are-made-to-be-broken.html' title='Rules are made to be broken'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-113154858446212186</id><published>2005-11-09T06:45:00.000-08:00</published><updated>2005-11-09T07:03:04.476-08:00</updated><title type='text'>Single-author documents ...</title><content type='html'>Recently, I was discussing project-management tools with some engineering managers.  We discussed the various pros and cons of Microsoft Project, and decided that we'd go with a simple Excel spreadsheet, with employee names on one axis and project names on the other axis.  Data cells would contain the percentage of time that an engineer would be spending on the project.  A new copy of the spreadsheet would be generated every calendar quarter.&lt;br /&gt;&lt;br /&gt;Every project manager would have to update the spreadsheet with information about their group.  We use CVS for document control, and we'd have to make sure that two people weren't editing the file at the same time.  So, we'd need to agree, via email, who was editing the file at any given time.&lt;br /&gt;&lt;br /&gt;This is wrong in so many ways.  First, the single-author restriction is crippling.  Any time you want to edit the document, you have to check with everyone else to see if the latest copy is in the repository.  Then, you have to make sure you have the latest copy, and then edit it and promptly check it back in.&lt;br /&gt;&lt;br /&gt;CVS excels with text documents: there is a automatic merge system that can reconcile the efforts of multiple concurrent users.  (the "C" in CVS stands for "concurrent").  But with binary files from Microsoft Word, Microsoft Project, etc the automatic merge function won't work.  Text is easy, binary is almost impossible.&lt;br /&gt;&lt;br /&gt;Most of my documents are written in plain ASCII text for just that reason.  I can read them everywhere, I can edit them almost everywhere, and I can email them with impunity.  CVS will maintain an edit history, so I can view each change if necessary.  Text documents are small, efficient, and I write in a terse, concise style, without having to worry about font choice, text sizes, etc.&lt;br /&gt;&lt;br /&gt;Second reason why the single-author form is lame: it restricts the number of people who can contribute information.  My staff members can't update the file, because that creates even more opportunities for edit collisions.  The whole paradigm of a single document with a single author is broken.    The approach does not scale up as teams grow and more managers are added.&lt;br /&gt;&lt;br /&gt;What we really need is a technology that inverts the model: one that allows incremental updates by a wide variety of users.  The Web, with its client-server approach is ideal.  A friend showed me two products that are hitting this target: &lt;a href="http://www.copperproject.com/demo.php"&gt;CopperProject&lt;/a&gt; and &lt;a href="http://www.teaminteractions.com/product.htm"&gt;TeamInteractions&lt;/a&gt;.  I'm going to check them out ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-113154858446212186?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/113154858446212186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=113154858446212186' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113154858446212186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113154858446212186'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/11/single-author-documents.html' title='Single-author documents ...'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-113070836992913406</id><published>2005-10-30T13:31:00.000-08:00</published><updated>2005-10-30T13:39:29.940-08:00</updated><title type='text'>Virtual Consumerism</title><content type='html'>I recently took a bunch of phonograph albums down to Amoeba Music.  The Amoeba used-record buyer gave me about thirty dollars in store credit, which I used to puchase some CDs.&lt;br /&gt;&lt;br /&gt;When I got home, I ripped the CDs into my Macintosh and loaded the tunes to my iPod.&lt;br /&gt;&lt;br /&gt;My iPod mostly contains ripped CDs, however there are about fifty songs that I've purchased from the iTunes music store.&lt;br /&gt;&lt;br /&gt;The CDs I can sell - on eBay, via Craigslist, or at Amoeba.  The iTunes songs -- no sale.  They are licensed &amp; locked to my particular iTunes account, and transferring them to another user is possible but is a real headache.&lt;br /&gt;&lt;br /&gt;Thus, the resale value of the iTunes songs is nil.  In the near future, when I'm buying videos, video games, audiobooks, and (someday) immersive holographic participatory adventures, the resale value will also be nil.&lt;br /&gt;&lt;br /&gt;The record companies (and in the future, movie producers etc) love this.  They don't have to worry about a secondary market.  Amoeba Records will be out of business.  Furniture stores won't sell CD racks or bookshelves for DVDs.  Phonograph albums are obsolete.  CDs and DVDs will soon be obsolete.  I guess this is progress of some sort.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-113070836992913406?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/113070836992913406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=113070836992913406' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113070836992913406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113070836992913406'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/10/virtual-consumerism.html' title='Virtual Consumerism'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-113069138516469741</id><published>2005-10-30T08:40:00.000-08:00</published><updated>2005-10-30T08:56:25.176-08:00</updated><title type='text'>Seed corn ...</title><content type='html'>Bob Cringeley's article &lt;a href="http://www.pbs.org/cringely/pulpit/pulpit20051027.html"&gt;Changing the Guard&lt;/a&gt; discusses what will happen when the baby-boomer generation of engineers and developers goes into retirement.  Bob proposes that open-source projects will benefit from the retiree's experience and wisdom.&lt;br /&gt;&lt;br /&gt;There's another question that isn't asked by Cringeley: who will replace this generation of skilled engineers?&lt;br /&gt;&lt;br /&gt;I visit many Silicon Valley tech companies as part of my current job, and I see an increasing reliance upon outsourced development.  Junior programmers aren't being hired in the Valley.  Instead, companies are outsourcing software maintenance and bug-fixing to contractors in India, China, Russia, and Eastern Europe.  Cost-savings are typically cited as the reason.&lt;br /&gt;&lt;br /&gt;The pros and cons of outsourcing have been fully discussed in Forbes, Fortune, and other business magazines, and the topic was an issue of (some) debate in the 2004 U.S. Presidential election.  We won't rehash those topics here, today.&lt;br /&gt;&lt;br /&gt;Getting back to Cringeley, I think that companies aren't investing in the next generation of U.S. programmers.  Instead, the mentorship, training, and teaching is going to a new crop of engineers in Hyderabad, Taipei, and Kuala Lumpur.  As the knowledge flows overseas, and &lt;b&gt;isn't replaced locally&lt;/b&gt;, U.S. companies will be faced with a talent deficit that is overwhelming.&lt;br /&gt;&lt;br /&gt;Now, outsourcing isn't universally practiced, and even the companies who are currently outsourcing haven't stopped hiring locally.  But the trend is accelerating: we are now training team leads and mid-level managers in the remote development site.  The rate of local growth is slowing, the rate of remote growth is accelerating.  The trend is clear.&lt;br /&gt;&lt;br /&gt;Is this a problem?  It is, if you think that one of the advantages of the U.S. is our world leadership in technology.  Largely inspired by Sputnik and the Space Race, we've developed a huge technical advantage which has had wonderful economic benefit to the United States.  Can we afford to give that advantage away?  Only if we're ready to replace that advantage with something even more miraculous: gene therapy is certainly one tantalizing candidate.&lt;br /&gt;&lt;br /&gt;We're giving away our advantage in software engineering, simply because we're not replacing the skillsets accumulated by Cringeley's coder generation.&lt;br /&gt;&lt;br /&gt;Tom Friedman's book &lt;ul&gt;The World Is Flat: A Brief History of the Twenty-first Century&lt;/ul&gt; covers these topics far more eloquently.  Recommended reading.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-113069138516469741?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/113069138516469741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=113069138516469741' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113069138516469741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113069138516469741'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/10/seed-corn.html' title='Seed corn ...'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-113043636391416499</id><published>2005-10-27T10:59:00.000-07:00</published><updated>2005-10-27T11:06:03.933-07:00</updated><title type='text'>Grid computing misses the point ...</title><content type='html'>I've viewed the Sun Grid announcement with some skepticism.  Here is the original &lt;a href="http://news.bbc.co.uk/2/hi/technology/4229021.stm"&gt;BBC article&lt;/a&gt; describing the service.&lt;br /&gt;&lt;br /&gt;Having dealt with the need for massive computing resources (verilog, etc) before, I can understand the appeal of their product -- I don't have to purchase &amp; maintain dozens or hundreds of servers which will be obsolete from a technical and financial perspective in three short years.&lt;br /&gt;&lt;br /&gt;But Sun doesn't realize that the blocker is data.  I don't want to send my Verilog off to a remote location.  Security is paramount, thank you very much.  I don't want my circuit designs to leave the building.&lt;br /&gt;&lt;br /&gt;And Wall Street firms probably don't want their market-analysis algorithms out of the building.  Pixar doesn't want to ship their gigabytes (or terabytes) of rendering data to a remote data center.&lt;br /&gt;&lt;br /&gt;So, I'll continue to buy blade servers, multi-core CPUs, or whatever is the best ratio of mips/dollar/btu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-113043636391416499?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/113043636391416499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=113043636391416499' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113043636391416499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/113043636391416499'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/10/grid-computing-misses-point.html' title='Grid computing misses the point ...'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-112509933030851167</id><published>2005-08-26T16:23:00.000-07:00</published><updated>2005-08-27T10:05:33.270-07:00</updated><title type='text'>Internet-connected change machines?</title><content type='html'>No treatise on software engineering today ... here's something in a lighter vein.&lt;br /&gt;&lt;br /&gt;Yesterday, I took a bucket full of spare change down to the local Albertson's grocery store.  I wanted to use the CoinStar machine there to take the coins and give me a Starbuck's gift card, as promised by the advertising billboards I see every day.&lt;br /&gt;&lt;br /&gt;The CoinStar machine gave me many more payout options, including a credit certificat for Amazon.com.  Since I spend more money at Amazon than at Starbuck's, that's the button I pressed after all the coins went jingling down into the belly of the machine.&lt;br /&gt;&lt;br /&gt;A minute later, I was walking out the door, with a printed receipt including a special credit code.  Ten minutes later, I typed that number into an Amazon webpage using my home computer.  The amount was then credited to my Amazon account.&lt;br /&gt;&lt;br /&gt;Boggle.  The CoinStar machine must have been connected to the Internet.  In days past, credit transactions such as this would mean filling out a form, mailing some paperwork, waiting days or weeks for a credit statement, then including that credit statement in the next transaction with the merchant.&lt;br /&gt;&lt;br /&gt;So, I was at the Albertson's grocery store again today.  Yes, there appears to be a network cable going into the CoinStar machine.  And, the Coke machine seems to have a similar connection ... does the soft-drink distributor fetch an inventory report from the machine daily?  Is that how they schedule their refill deliveries?  Once there was an Internet-connected Coke machine at CMU.  Now they are everywhere.&lt;br /&gt;&lt;br /&gt;P.S.  The credit code was over twenty alphanumeric digits.  I recognize that it may have been an encrypted encoding of the credit amount, along with encrypted authentication information, but that doesn't make such a good story, does it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-112509933030851167?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/112509933030851167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=112509933030851167' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/112509933030851167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/112509933030851167'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/08/internet-connected-change-machines.html' title='Internet-connected change machines?'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-112478761542123608</id><published>2005-08-23T01:39:00.000-07:00</published><updated>2005-08-23T02:00:15.430-07:00</updated><title type='text'>There is a little bit of NASA in every tech company</title><content type='html'>The Columbia disaster, like the Challenger explosion before, put the organizational inefficiencies of NASA into embarrassingly public view.  Precautions overruled, advice ignored, decisions made without full consideration of risk or cost.&lt;br /&gt;&lt;br /&gt;And, as of August 2005, there is no real date for when the Shuttle will fly again.  NASA is saying that it won't be until spring of 2006.&lt;br /&gt;&lt;br /&gt;The Shuttle is like every large software project -- it is more complex than its creators or current maintainers can comprehend.  Unforseen consequences abound, subsystems interact in unforseen (and perhaps unpredictable) ways.&lt;br /&gt;&lt;br /&gt;In the Eighties, chaos theory arose to classify the unexpected consequences arising in complex systems, typically as the result of feedback loops that magnify a fundamental uncertainty in the system.&lt;br /&gt;&lt;br /&gt;Large software projects develop a similar sort of chaos: engineers pile quick bugfixes atop hurried modifications or casual redesign create, at first, sloppy code and eventually a system that behaves unpredictably and often surprisingly.&lt;br /&gt;&lt;br /&gt;Organizational imperatives: market pressure, overly-optimistic schedules, and aggressive promises drive haste and hurry, resulting in poorly-designed or poorly-implemented software systems.  At NASA, "go fever" was the term that described the decision-making process that allowed mid-level and senior managers to over-rule and minimize the precautions urged by the designers and technicians.&lt;br /&gt;&lt;br /&gt;The same "go fever" exists in every high-tech company.  And while the results aren't as spectacularly fatal as those arising from NASA's bad decisions, they arise from exactly the same human faults.  We can't fault NASA for the tendencies that we follow every day.&lt;br /&gt;&lt;br /&gt;Oh, and the Challenger wasn't the first time.  Read Andrew Chaiken's "A Man On The Moon" for a description of how NASA's similar tendencies led to the death of three astronauts in the Apollo 1 fire.&lt;br /&gt;&lt;br /&gt;The law of unintended consequences is inescapable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-112478761542123608?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/112478761542123608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=112478761542123608' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/112478761542123608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/112478761542123608'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/08/there-is-little-bit-of-nasa-in-every.html' title='There is a little bit of NASA in every tech company'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-112403756069601176</id><published>2005-08-14T09:31:00.000-07:00</published><updated>2005-08-14T09:39:20.703-07:00</updated><title type='text'>Little Victories</title><content type='html'>So it was Friday afternoon, and I was finishing up a stressful week.  Too many meetings, too many bugs, and not enough sleep.  Since it was only 2:00, I couldn't leave -- it wouldn't look good to the boss and troops.&lt;br /&gt;&lt;br /&gt;Time for a Little Victory!  An LV is a small bug that can be fixed with maybe 30% of the brain.  A bug with enough challenge so that it is interesting, but not so complex that the fix is risky or likely to take more than a few hours.&lt;br /&gt;&lt;br /&gt;Scanning the buglist, I found one: a bug that could be knocked out quickly with no chance that I'd break something else.  With the door closed, iPod rocking, and one last cup of espresso, I got to work.&lt;br /&gt;&lt;br /&gt;When fixing bugs, I spend most of the time reading existing code -- looking for weaknesses, trying to understand the mindset of whoever wrote the code, and figuring out the best way to fix the problem.  This case was no different: for two hours I sat there, Peter Gabriel on the headphones, reading about a thousand lines of code.&lt;br /&gt;&lt;br /&gt;At 5:15, I was writing new code and simplifying old code.  At 5:45, I was verifying with unit tests, and by 6:00 the code was running in a "real" test environment.  At 6:30, the new code got submitted to the repository.&lt;br /&gt;&lt;br /&gt;Five minutes later, I was grinning.  All the tension of the week drained away, and Friday now looked much better than it had several hours ago.  I updated the bug-report status: Fixed&lt;br /&gt;&lt;br /&gt;Hopped in the car, and drove home.  On Fridays, the best way to head into the weekend is with a Little Victory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-112403756069601176?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/112403756069601176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=112403756069601176' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/112403756069601176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/112403756069601176'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/08/little-victories.html' title='Little Victories'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-112334000347127882</id><published>2005-08-06T07:36:00.000-07:00</published><updated>2005-08-06T07:53:23.476-07:00</updated><title type='text'>Copy-Paste Coding is Evil</title><content type='html'>The developer needed to create code for a new webpage: the new page is specific to a certain type of customer.  The desired result is some different verbiage, a few color changes in the text, and some new illustrations.&lt;br /&gt;&lt;br /&gt;The developer made copies of the source files that create the current page(s), did some simple edits to the text, color tags, and image paths, tested the results, and was done.  Quick operation, completed before lunch.&lt;br /&gt;&lt;br /&gt;Wrong.&lt;br /&gt;&lt;br /&gt;The problem is that the developer also copied all of the business logic, plus all of the style-sheet and other layout specifications.  Why is that a problem?  Because there are two (almost) identical code paths now in the system, each containing over six thousand lines of code, and the only difference is a few lines which specify some visual attributes.  The developer has unwittingly created a maintenance nightmare.&lt;br /&gt;&lt;br /&gt;Suppose, one day later, a bug is found in the business logic of the new page.  The developer will, in good faith, go to the code which specifies the actions of the new page, and correct the bug.  Did the developer also look in the code for the original page and fix the corresponding page there?  Maybe so, if they are very thorough.  In the hustle-bustle world that I live in, probably not.  Or, the developer will say to herself, "I'll fix that one later", and later never comes.&lt;br /&gt;&lt;br /&gt;The better approach would be to examine the original webpage logic, figure out the exact set of changes needed, then create a new set of code that correctly and efficiently presented either the new or old presentation of the page.  Sure, it is a lot more work: perhaps the deveoper has to work on this project after lunch, and probably the next day.  In doing so, the developer saves herself (or some hapless other person trying to fix the code later) from confusion.&lt;br /&gt;&lt;br /&gt;Sure, copy-paste might create a good foundation if a major rewrite is necessary.  But if you're going to do a major rewrite, why start with the old code?  Allow yourself the luxury of a blank sheet of paper: study the original implementation, but try to improve the system by taking a fresh look at the problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-112334000347127882?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/112334000347127882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=112334000347127882' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/112334000347127882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/112334000347127882'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/08/copy-paste-coding-is-evil.html' title='Copy-Paste Coding is Evil'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-112270738664508865</id><published>2005-07-29T23:56:00.000-07:00</published><updated>2005-07-30T00:09:46.650-07:00</updated><title type='text'>An Ultimatum Gets You Out</title><content type='html'>Recently, I had to fire a brilliant but temperamental engineer.  His work?  Flawless.  His enthusiasm?  Unbounded.  His temper?  Fatal flaw.&lt;br /&gt;&lt;br /&gt;This fellow had been arguing with a colleague over a certain aspect of software design.  The discussion had been going on, intermittently, for about a month.  I let it continue, because the debate was healthy and all parties were learning new perspectives.&lt;br /&gt;&lt;br /&gt;But one morning, Mr. Genius came in and said: "It's final -- I can't work this way.  I can't get things done under this constant criticism ..."&lt;br /&gt;&lt;br /&gt;I asked, "What do you mean?  I thought you guys were working it out.  Seems to me you were close to an agreement, and what's going on now?"&lt;br /&gt;&lt;br /&gt;"Well, I can't work with this guy.  I've tried reason, persuasion, even pleading, and he won't accept my ideas.  So, you've got to fire him -- or maybe I'll quit"&lt;br /&gt;&lt;br /&gt;I was stunned, but in the back of my mind I realized that something like this would probably happen.  The guy's a hothead.  And if I indulge him this time, it will be trouble forever.&lt;br /&gt;&lt;br /&gt;"No, he's not fired.  You've got to work with him, or YOU are fired!"&lt;br /&gt;&lt;br /&gt;Now it was Mr. Genius' turn to be stunned.  "What?  You can't fire me -- you know that would kill the project and probably the company!"&lt;br /&gt;&lt;br /&gt;And on it went.  Finally, I told him -- think about it over the weekend, and if you aren't ready to work things out with this other engineer, you've got two weeks notice.  And I made it stick, and he resigned.&lt;br /&gt;&lt;br /&gt;Was I sorry?  You bet.  Was it the right thing to do?  In this case, certainly.  Because Mr. Genius, as good as he was, had created an unbearable environment at work.  Despite his excellent work, nobody wanted to collaborate with him.  And, giving in to one unreasonable demand would only lead to more.&lt;br /&gt;&lt;br /&gt;Only give an ultimatum if you're ready to accept either outcome.&lt;br /&gt;&lt;br /&gt;(The alert reader will notice that I gave Mr. Genius an ultimatum in response to his ultimatum.  Yes, I did.  Deliberately.  And I was prepared &amp; willing to accept either outcome)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-112270738664508865?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/112270738664508865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=112270738664508865' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/112270738664508865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/112270738664508865'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/07/ultimatum-gets-you-out.html' title='An Ultimatum Gets You Out'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-112224563445040037</id><published>2005-07-24T15:28:00.000-07:00</published><updated>2005-07-24T15:53:54.456-07:00</updated><title type='text'>Beware the Bungee Debugger</title><content type='html'>Careful developers, thoroughly testing their code, finding all of their bugs -- what's not to like?  If we had careful developers in every stage of the development process, we would not need to test code and QA departments would be redundant.  While there are isolated examples of coders who don't write bugs, the typical development project is staffed with developers who are in a rush to meet a rapidly-approaching deadline and are responsible for too many areas of functionality.&lt;br /&gt;&lt;br /&gt;Repairing that situation is an essay in itself, and one that will appear in these pages soon.  But let's first consider what generally happens in the throes of development and test.  The usual Grade-A programmer has found most of the obvious bugs, and has fixed them all before the code gets near the QA team.  But, the QA team is also composed of experienced engineers, and of course they find a significant number of bugs.&lt;br /&gt;&lt;br /&gt;In many cases, the developer who wrote the code is unavailable: maybe she's on vacation, maybe on another project.  Enter the Bungee Debugger.  Typically a seasoned engineer, but sometimes a junior trainee, this person is pressed into service to find and fix the bug, preferably before the looming ship date.&lt;br /&gt;&lt;br /&gt;A skilled Bungee Debugger will find and fix the bug, with minimal impact.  Further, the Bungee Debugger will write up extensive notes, pointing out how the bugfix works and identifying risk factors associated with the fix.  In addition, the experienced Bungee Debugger will make some recommendations for the original developer, so that the fix can be re-considered once the heat of the release is past, and a more substantial or careful repair can be made.&lt;br /&gt;&lt;br /&gt;Just like you might slap on the spare tire if you get a flat near Barstow on your way to Las Vegas, but once you get to Vegas, you're going to the tire shop to get a new tire (or full set).&lt;br /&gt;&lt;br /&gt;All too often, the junior engineer takes a quick look and throws together a few modifications that appear to fix the bug but in fact just address a visible symptom of an underlying problem.  No review is conducted, and the bug fix "disappears" into the code -- the next person working with the code can't discriminate between the bugfix and the original code.  This is a problem when the Bungee Developer didn't fully understand the original code.  Now, we have two semantic models present in the implementation: the Original Intent of the developer, and a Misguided Hack that happens to fix a bug.&lt;br /&gt;&lt;br /&gt;Once you get three or four instances of Bungee Bugfixes in a certain section of the code, you're in real trouble.  The code is messy with patches and fixes, and the original design clarity is muddied by contradictory contributions made in the haste of bugfixing.  Now, a careful developer has to go through the code, reviewing all of the bugs and all of the putative fixes, and try to decide how the design and implementation should be fixed.  At this time we're not fixing bugs: instead, we're unwriting all of the misguided repairs and trying to re-fix the original bugs in a more careful and consistent way.&lt;br /&gt;&lt;br /&gt;And nobody likes that kind of work: the original developer will probably do it, because she is the one who best understands the original intent of the code and is (hopefully) the expert in the problem space.  If a Bungee Bugfixer tries to do the rework, your project risks additional distortion and deviation.&lt;br /&gt;&lt;br /&gt;The best way to manage a Bungee Bugfixer is to review their work carefully, at the time that the bug-fix is attempted, and not later.  And, when the original developer returns, make sure that the bug-fix receives yet another review.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-112224563445040037?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/112224563445040037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=112224563445040037' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/112224563445040037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/112224563445040037'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/07/beware-bungee-debugger.html' title='Beware the Bungee Debugger'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-112213304575356224</id><published>2005-07-23T08:07:00.000-07:00</published><updated>2005-07-23T08:37:25.760-07:00</updated><title type='text'>Software in Cement Shoes</title><content type='html'>The classic refactoring books (Beck, Fowler, et al) recommend continual refactoring as the code development process continues.  Refactoring brings many benefits, but in many commercial software environments, well-intentioned business practices get in the way.&lt;br /&gt;&lt;br /&gt;Consider the case of a moderately large codebase under revision control.  Developers have been adding new features, fixing bugs, and refactoring awkward code.  At some point, the release deadline nears, and this code goes into a "lockdown" state.  Typically, the version control system allows a "branch" to be made, so that the software-development effort can continue, but the code destined for the release is kept stable.  Now, developers must make bug-fix modifications in the release branch, and matching changes must be made in the ongoing development branch.&lt;br /&gt;&lt;br /&gt;Once the release branch is made, you don't want to be making refactoring (i.e. gratuitous) changes in the development branch.  Why?  If you adjust interfaces, clean up variable naming, extract methods, or any of the other beneficial peturbations that we call "refactorings", you've introduced textual differences between the release branch and the development branch.  Such changes make it more difficult for the engineer who is making bug-fixes to do his work: if there is a significant variant, the engineer may have to restart his bug-fix effort from scratch.&lt;br /&gt;&lt;br /&gt;Ah, but release branches are typically short-lived, and soon the release is made and non-bug-fix modifications can be made in the development branch without impacting the bug-fix effort, which has ceased.  So refactoring can begin again.  At least that's what is supposed to happen ...&lt;br /&gt;&lt;br /&gt;What I've found is that the business (remember, this is commercial software development -- open-source doesn't generally have this problem) will need to bow to customer or partner pressure and "keep the release branch open" -- that is, to continue making bug fixes or minor feature additions for a significant period of time.&lt;br /&gt;&lt;br /&gt;That's when the cement starts to harden around the software.  Since the company is already keeping one release branch open, why not two or three?  The business managers will argue that we've also got to keep an even older release alive, since we are doing so well keeping one alive.  Then, the poor developer is making bug-fix modifications to three, four, or more branches of the code.&lt;br /&gt;&lt;br /&gt;It is ugly, and it happens.  At this point, we can't afford to burden the developer with the challenges of trying to understand four widely-diverging codebases: we have to keep them as similar as possible.  Even the main development branch.  Refactoring stops.&lt;br /&gt;&lt;br /&gt;I've actually worked for a company that required periodic "re-opening" of previously released versions of the code -- not for the purpose of bugfixes, but to add new features!  Sometimes these new features were back-ports of features from the newest or development branch, sometimes it was a "custom" feature just for one client.  After all, why not?  That particular old release was stable, well-debugged, and is an excellent platform for releasing a new feature!&lt;br /&gt;&lt;br /&gt;This is when good software companies start to go downhill.  Tracking bug-fixes, feature-content, and other miscellaneous modifications becomes burdensome.  The talented engineers don't want to spend their entire days just doing revision management, so the task typically falls either on a junior engineer or a project manager who has enthusiasm but often not much technical acumen.  Finally, bug-tracking software systems are often unprepared for simultaneously tracking a bug-fix across multiple divergent software releases.&lt;br /&gt;&lt;br /&gt;Fast forward six months or a year -- the software has become a complete mess, as multiple branches are open and nobody is effectively tracking what modifications are going where.  Bugs are getting fixed in some branches, not all.  Developers are hastily patching code which has diverged -- often creating new bugs in the process.  The QA department is going nuts, because each release branch has unique testing requirements and a distinct set of bugs.  Design-wise, the source code is a tangle, because therapeutic refactorings ceased long ago.&lt;br /&gt;&lt;br /&gt;At this point, senior management starts to get a hint that something is wrong.  External consultants are called in, and they might recommend a thorough overhaul of the development and release process.   But senior management, addicted to the idea of rapid releases to a divergent set of customers, refuses.  Re-imposing the discipline would hurt the business, so it doesn't happen.&lt;br /&gt;&lt;br /&gt;Now, the only way to clean things up is to refactor the internal human processes.  Slowly, methodically, and carefully optimize the entire organization: trim releases, tighten up the bug-fix process, and clarify the goals.  It isn't hopeless, it just looks bad.  But getting back on track will take at least as long as it took to "mess things up" in the first place.  Once the process is refactored, the code can be refactored.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-112213304575356224?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/112213304575356224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=112213304575356224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/112213304575356224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/112213304575356224'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/07/software-in-cement-shoes.html' title='Software in Cement Shoes'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14716356.post-112201709226297854</id><published>2005-07-22T00:03:00.000-07:00</published><updated>2005-07-22T00:24:52.266-07:00</updated><title type='text'>Nothing Ventured, Nothing Gained</title><content type='html'>I recently had my first round with the Sand Hill venture capitalists, and learned a few valuable lessons.&lt;br /&gt;&lt;br /&gt;Everyone will listen, everyone has questions.  You will never hear a "no", but rarely will you hear "yes".&lt;br /&gt;&lt;br /&gt;You will get to present to four or six partners, and they will all have questions.  Some will wonder where you got your tie.  Others might ask about the intricacies of XML parsing.  Everything will be very friendly.  You will know when the pitch is done when you are told: "Very interesting ... let's keep talking".&lt;br /&gt;&lt;br /&gt;But you won't see that checkbook come out.  A venture capitalist won't buy in on the strength of the presentation alone.  It takes something else.  Maybe you know somebody who knows somebody else.  Maybe you got some angel funding from a retired entrepreneur who sits on the same charity board as one of the partners.  It is the inside game.&lt;br /&gt;&lt;br /&gt;What annoyed me the most about the VC game is that nobody ever says "no".  You will get the "soft no" -- your calls will be answered by a cheerful and sympathetic office assistant, who will say "Oh, he just stepped out", or "She's in a meeting right now, but I'll put it at the top of her callback list."&lt;br /&gt;&lt;br /&gt;The VC doesn't want to say no, because if your proposal goes anywhere (say, to a competing VC who does decide to help fund you), they can jump back into the action.  Or, if you've managed to scrape together some operations cash from a rich uncle, the VC might call back, three months later, just to "check in".  This happened to a friend of mine: he had been able to get an engineering prototype installed in another startup funded by the VC, and when the startup's CEO mentioned this at a board meeting, the call came in.&lt;br /&gt;&lt;br /&gt;How can you get a "yes"?  It depends: in the example I mentioned in the previous paragraph, the founder of the startup still had to go through some pretty tough due-diligence before the first round was closed.  In his case, it almost seemed like dumb luck.  It helps if you have made the acquaintance of various Silicon Valley luminaries.  And I can't tell you how to do that, because they'd shoot me :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14716356-112201709226297854?l=codeworrier.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeworrier.blogspot.com/feeds/112201709226297854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14716356&amp;postID=112201709226297854' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/112201709226297854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14716356/posts/default/112201709226297854'/><link rel='alternate' type='text/html' href='http://codeworrier.blogspot.com/2005/07/nothing-ventured-nothing-gained.html' title='Nothing Ventured, Nothing Gained'/><author><name>Code Worrier</name><uri>http://www.blogger.com/profile/09085120481877943431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
