Be Happy About Your Estimates - Because You're Stuck With Them

by Nick Friday, October 08, 2010 3:42 PM

Lately I've been doing a lot more project estimation, and scoping activities than I have in the past. Internally, we use a spreadsheet based off of Steve McConnell's great book, Software Estimation - Demystifying the Black Art. (You can read my review of it here.) For this last project, three of us performed the estimation separately, and then we compared our numbers after we were done. Two of the numbers matched reasonably close (for a high level estimate), and mine was significantly higher. As it turns out, I was simply more pessimistic in all my numbers because of the uncertainty in the project definition. There really weren't any requirements. We were simply being asked for a "gut feel" estimate for doing a project that did x, y and z. The other two members of the team were optimistic that the system wouldn't be more complicated once we knew more. I assumed otherwise, and it made all the difference in how we thought. Because really... how often does it ever turn out to be just that easy?

McConnell talks about the need for developers to resist the urge to "estimate in the hallway". We've all experienced this. A project manager grabs you in the hall and asks you how long it will take to do some vague task. Instead of telling him, "I don't know, but will get back to you in an hour after I researched it." most programmers will give a gut estimate. Of course, after you do research it further, you find out you were way off, and when you tell your manager, you're stuck. He's already committed to your original number.

One of the conversations that took place when my group was reviewing this particular estimate, centered on how one particular manager "always doubles my estimates anyway, he's been doing it for years". So does that cause you to be more optimistic than normal, since you know a safety factor will always be built in? Interestingly enough, later on we were talking about how the sales manager is going to cut those numbers in half to make the sale. And there's the rub.

The project manager doubles the developer's estimate and gives it to the sales manager, who proceeds to cut it in half before talking to the client. And so guess what number is left... your original estimate. So be happy with it, because it's the one you're going to be stuck with.

Updated WMI Slides and Demos

by Nick Wednesday, September 15, 2010 4:52 PM

Thanks again to everyone at the Milwaukee WI-INETA group for a great time last night. I once again gave my talk on WMI, and it seemed very well received, with lots of very interesting questions. I have updated the demo source code, and I also received an email from someone saying they were having issues getting the slides to download, so slides are included in that zip file as well.

Also, a former coworker of mine, Jim, asked a question last night about whether it was possible to declare the security rights for a WMI Namespace easily through code, and I said not really, without some scripting. As it turns out, this is not true at all. There is an extra property on the assembly level attribute, WmiConfigurationAttribute (where you set the namespace and hosting model) that allows you to specify a security parameter. The property, called NamespaceSecurity, does not take an easily identifyable string like a group name. Instead, it uses a Security Descriptor String Format to describe the security. However, it will allow you to set the rights without having to script it after install.

Update: Apparently something with my hosting service's setup doesn't like files that have four letter extensions (like pptx), so instead of monkeying around with a second download for the slides, I simply included the slides in the source code download.

Application Instrumentation with WMI Slides and Downloads

by Nick Friday, August 27, 2010 3:25 PM

I wanted to take a moment to thank everyone who came to the Lake County .NET User's Group meeting in Grayslake last night. I had a great time, and I hope everyone came away excited to use an 8+ year old technology they probably never heard of ;-). As promised, here are the slides, and the sample code from last night:

Here are a few notes on the sample code:

  • The \Resources directory contains many of the downloads that I talked about during the presentation, including the MMC 3.0 download if you're running Windows XP.
  • Before attempting to register the MMC Snap-In, be sure to run mmcperf.exe from the command prompt. This registers required libraries into the GAC.
  • The "Source" project is a WPF version of the project from last night. It's is functionally the same, and the tasks and the WMI piece is identical, it's just running in a different project harness.

Feel free to email me if you have any questions, and hopefully I'll have an opportunity to speak with all of you again.

Presenting at the Lake County .NET User's Group in August

by Nick Wednesday, June 30, 2010 9:12 AM

If you missed me at Chicago ALT.NET in April, presenting Application Instrumentation with WMI, then you're going to get another shot to hear me in August. I'm going to be at the Lake County .NET User's Group on August 26th in Grayslake, IL:

WMI (Windows Management Instrumentation) is most commonly used to query for hard drives, find out what services are running, and other basic Windows functions. But, did you know that you can make your own objects queryable in WMI as well, as well as send custom events? We'll go over how to query machine state with WMI, and then how to instrument your own applications with WMI as well. Finally, I'll show how to make a custom MMC plugin powered with WMI.

The fun starts at 6:30 PM, and goes until 8:30.

Presenting at Chicago ALT.NET in April

by Nick Wednesday, March 31, 2010 4:06 PM

I'll be down in Chicago at the "Big Willy" on April 14th at 6 PM, presenting to Chicago ALT.NET on Application Instrumentation with WMI.  Here is the abstract:

WMI (Windows Management Instrumentation) is most commonly used to query for hard drives, find out what services are running, and other basic Windows functions. But, did you know that you can make your own objects queryable in WMI as well, as well as send custom events? We'll go over how to query machine state with WMI, and then how to instrument your own applications with WMI as well. Finally, I'll show how to make a custom MMC plugin powered with WMI.

It's free to attend, but you need to sign up ahead of time in order to get into the building. There is free pizza for attendees, as well as some really nice door prizes at the end.

Let Me Stack Overflow That For You

by Nick Monday, March 08, 2010 2:38 PM

I am somewhat active in the Stack Overflow community, and among other things, I find it an very interesting case in behavior, partly due to the reputation system that they've employed. It also makes me worry about the community of software developers that currently exists. Jeff Atwood, one of the creators of the site, famously talked about the 20% Programmers, as referenced in this other post:

There are two "classes" of programmers in the world of software development: I'm going to call them the 20% and the 80%.

The 20% folks are what many would call "alpha" programmers -- the leaders, trailblazers, trendsetters, the kind of folks that places like Google and Fog Creek software are obsessed with hiring. These folks were the first ones to install Linux at home in the 90's; the people who write lisp compilers and learn Haskell on weekends "just for fun"; they actively participate in open source projects; they're always aware of the latest, coolest new trends in programming and tools.

The 80% folks make up the bulk of the software development industry. They're not stupid; they're merely vocational. They went to school, learned just enough Java/C#/C++, then got a job writing internal apps for banks, governments, travel firms, law firms, etc. The world usually never sees their software. They use whatever tools Microsoft hands down to them -- usally VS.NET if they're doing C++, or maybe a GUI IDE like Eclipse or IntelliJ for Java development. They've never used Linux, and aren't very interested in it anyway. Many have never even used version control. If they have, it's only whatever tool shipped in the Microsoft box (like SourceSafe), or some ancient thing handed down to them. They know exactly enough to get their job done, then go home on the weekend and forget about computers.

There is no better demonstration of this than in the Stack Overflow community.  On that site, you have the 80% programmers who ask the most basic, mundane questions, that are easily answered by a simple Google search, and then you have the 20% programmers who are kind enough to Google the answer for them in return for "reputation".  In many cases, no Googling is necessary... we just know the answer.

It's an interesting study in instant feedback and gratification.  It seems that there are a whole host of people who, when faced with the simplest of problems, refuse to do even the most basic searching for an answer. Instead, they head over to Stack Overflow and ask the question.  Odds are that within 30 seconds they'll have a correct answer.  Often times that question has already been asked, and Stack Overflow will even tell you about potential duplicate questions as you are composing it.  But despite this help, people would rather ask their own version of it.

On the one hand, it is a tribute to how useful and well designed the site is. Think about... in 30 seconds, you can have an answer to a question. And yet... in 10 seconds you could have found it yourself. So what did you get in exchange for those 20 extra seconds?  Confidence.  If you really don't know the answer, then a Google search may give you the correct answer in the top couple of hits, but how would you really know? With the community vote system on Stack Overflow, you have a distributed fact checking system at your finger tips.

And yet, when you answer the same basic question over and over again... it really shakes your faith in the programming community. Are there that many programmers out there who don't know the difference between a Static and an Instance method? Are there that many programmers who don't know the difference between and int and a float? What does it say about programmers who would rather have answers spoon fed to them, rather than go out and discover the answer themselves?

I'm all for being helpful. I like to think the answers I've provided on Stack Overflow show that. But at a certain point in time, I wonder if it's really worth helping some of these people.

Picture Picture Project

by Nick Tuesday, March 24, 2009 3:32 PM

So what do you do when you have access to a laptop that nobody wants to use anymore, and some extra time on your hands?  I had always wanted to make my own digital picture frame out of a laptop, for a few reasons.  One, laptop LCD's are usually higher quality than the ones that come in digital picture frames you buy in the store.  Secondly, the screens are larger than any that are generally available from pre-built digital picture frames.  And finally, I wanted to have the images in the frame come directly from Flickr... which is a feature that only comes with really expensive frames with WiFi.  I decided to call it "Picture Picture", in honor of Mr. Rogers.

As it turns out, my uncle had bought a Dell laptop from HSN several years ago (without my permission), and then never really used it all that much.  Eventually it ended up in a drawer... and so then it eventually ended up in my hands.

The first part of the project was actually all about software configuration.  My goal was to have a system that didn't need a keyboard or mouse.  I'm still working on refining the software I wrote to get pictures from Flickr, so that code is not included in this post.  However, I will reveal that the software comes in three parts.  The first is the viewer application itself.  It reads a configuration file that has settings for background color, image duration, a Flickr user name, and a list of tags from the user name to display.  I'm also adding the ability to automatically suspend the laptop at night, and then wake up a designated time in the morning, but the bugs in that are not quite worked out yet.

The second piece of software is a simple ASP.NET application, so that I can log into the picture frame from my browser to change any of the settings above.  The ASP.NET application then saves those settings to the configuration file.  The viewer application has a file watcher on that configuration file, so that when it changes, it automatically reloads the configuration settings.  The third piece is actually just a simple Windows Service that acts as a watchdog, and if the application goes away for some strange reason, it automatically restarts it.  The beauty of this setup, is that I can add pictures to my frame simply by tagging a picture in Flickr with any tag I choose.

With all that said, there were some other software changes I made to the laptop before I tore it apart.  Because it was a cheap HSN laptop, it had Windows XP Home, which isn't capable of running IIS, which I would need for my ASP.NET application.  Fortunately, there is a well documented hack for getting IIS running on Windows XP Home.  I also installed Tight VNC on the laptop, in case I needed to do any more complicated administration after I tore it apart.  I would have just used Remote Desktop, but Windows XP Home can only be an RDP client, not a host.  I also created a share on the laptop where all my custom application software was copied so I could easily upload new versions of my software afterwards.  Finally, I created a separate user to auto login when the laptop turned on, and then added the viewer application I wrote to the Startup menu for that user.

Now comes the fun part... tearing apart the laptop.  All the pictures from this post are on Flickr in this set.  You can click on any picture for a larger version.  Some of the pictures also include extra notes which point out small details in the picture worth looking at.  I went to the Dell support website, where they are kind enough to have detailed service manuals on all their laptops, which include directions on how to replace all the internal components.  This makes tearing apart the laptop a breeze.  Here is the LCD out of the laptop, as well as all the case parts I won't be needing anymore:

LCD Out of Laptop Throw Away Parts

I was very concerned with carefully supporting the LCD in the frame.  I used foam core as a backer, and then surrounded the LCD with foam core as well.  I used simple Elmer's glue to glue the surrounding foam core to the back piece of foam core:

Front of Foam Core for LCD Back of LCD

You'll notice that there is a foil section that runs on the back of the LCD.  This actually sticks out quite a bit.  That's why there is a cut in the back of the foam core.  The parts of the foil that stick out extra fit into that cut out of the foam core.  There is also a small hole in the foam core back, for the LCD cable to fit through.  I used no glue, or any other physical fasteners to attach the LCD to the foam core.  It's a friction fit.  I cut and fit the foam core around so it would be just tight enough, but wouldn't put pressure on the display.  The mat is just another layer when I put together the frame sandwich.  I used no glue there either, so you can see a little gap if you get up close to the frame.  At some point, I may either use double stick tape, or possibly put glass in front to remove the gap.  The next two pictures are the LCD fit into the foam core housing, and then a picture with the mat on top:

LCD in Foam Core LCD with Mat

For mounting the motherboard, I simply cut a piece of masonite to the appropriate size.  I used some old standoffs and screws that I had from a previous desktop computer build I did last year.  I also cut a small slot in the bottom for the LCD cable to come through.

The other tricky part was remounting some of the motherboard parts.  The problem is that many of the components (like the CPU heat sink, and the LCD grounding cable) actually had screws which passed through the motherboard, and then screwed directly into the plastic case.  So one day I went to my local hardware store, and spent some time test fitting nuts until I found nuts that fit.  These aren't standard sizes, so my only choice was to bring all the parts to the hardware store and use good ole fashioned trial and error.  You can also see that I attached the speakers from the original laptop too.  I don't have any use for them now, but maybe some day I'll add a video to my frame and then I can use those.  I also added some extra foam core to the back of the masonite for added thickness.  The frame that I chose was very deep (almost two inches so there was room for all the components plus circulation).  Unfortunately, I had to add thickness in some areas so that the springs would still work:

Back of Frame Back of Motherboard Mount

The last detail was attaching the WiFi cable to the frame itself.  The original laptop had the WiFi card attached via a wire to a sheet of aluminum foil in the cover which served as the antenna.  Since my frame was made out of metal, I sanded off the paint on the inside surface of the frame, and attached the antenna to the frame.  Now my frame is actually the WiFi antenna:

Antenna Attachment

And finally, here is the completed frame hanging on the wall:

Finished Picture Frame

The total build cost was about $55.  This included a custom cut frame and mat (the majority of the cost), along with foam core, masonite, and random nuts from the hardware store.  Once I finish adding all the features I want to the viewer application, I plan on posting the completed code here as well, so stay tuned!


How Geeks Misunderstand Economics and Marketing

by Nick Tuesday, December 30, 2008 3:53 PM

As high quality technologists (which I assume all my readers are ;) ), most of us are usually fairly specialized in our field.  In other words, we're very good at what we do for a living, and that often comes at a price at not knowing other things, even if they have some importance on our business.  For instance, we may be very good at programming in C#, Java, etc. and can tell you the classes in the BCL by heart, or list off the GoF patterns from memory, but couldn't figure out how to make money selling software if we tried.  I quickly thought of that as I was reading this article in the New York Times on the cost of text messaging vs. what we are charged:

TEXT messaging is a wonderful business to be in: about 2.5 trillion messages will have been sent from cellphones worldwide this year. The public assumes that the wireless carriers’ costs are far higher than they actually are, and profit margins are concealed by a heavy curtain.
Professor Keshav said that once a carrier invests in the centralized storage equipment — storing a terabyte now costs only $100 and is dropping - and the staff to maintain it, its costs are basically covered. "Operating costs are relatively insensitive to volume,” he said. “It doesn’t cost the carrier much more to transmit a hundred million messages than a million."

Once one understands that a text message travels wirelessly as a stowaway within a control channel, one sees the carriers’ pricing plans in an entirely new light. The most profitable plan for the carriers will be the one that collects the most revenue from the customer: unlimited messaging, for which AT&T and Sprint charge $20 a month and T-Mobile, $15.

The entire premise of the article is in essence to say, you the consumer are being ripped off, because text messages cost nearly nothing to transmit, while it costs you the consumer significantly more to actually send them.  There is even a reference to an investigation spurred on by Sen. Herb Kohl.  Clearly, the intent is to suggest that we're being "gouged".  Unfortunately, this perpetuates the myth that the price of a good or service needs to somehow be directly related to the cost of production, and that charging more than some percentage higher than the cost is somehow wrong or illegal.  Worse yet is when these improper assumptions lead to regulation which then hamper the ability of businesses to market in new and innovative ways.  But I'm being too generic here.  Let's look at specifics.

If I write some software package and offer to send it to you on a CD for $50 (plus S&H), is that justified?  After all, it costs less than a dollar (maybe even a quarter) to actually burn a CD these days.  Worse yet, what if I charge you the same for an electronic download which cost even less to distribute?  You and I know that there is nothing wrong with that, because we naturally think of all the time and effort it took to actually write the software itself.  Part of what we charge reimburses us for our initial time, when we weren't making any money on the yet completed software.

Look at a different example, in the gaming industry.  Companies charge $50 - $60 a copy for games on the Xbox 360, PS3 and Wii.  A significant amount of that cost is actually wrapped up in licensing fees that go to the console maker (Microsoft, Sony and Nintendo).  Are those licensing fees too excessive?  At first glance, it may seem so.  However, when you look at the business as a whole, you see that its simply a marketing technique.  That's because the console maker actually take a significant loss on each of the consoles it makes in order to get enough gamers in the market.  They then try to recoup that money through licensing fees on the games themselves.  In other words, the higher cost of the games is used to subsidize the console.  You can't separate the cost of the game from the cost of the console.  If they charge less for games, then the consoles would have to be more expensive.

Many people want to demand "a la carte" pricing from cable companies, but that too would come at a price.  Many channels are simply not watched enough to pay for themselves if they were priced on their own.  They only exist because they can be bundled with more popular channels in a package.  Cable companies are able to offer a wider variety of channels for smaller niche audiences because they charge more money than normal for popular ones.

Similarly, it is unfair to look at the cost of text messaging on its own.  In fact, cell phone companies work similarly to game console manufacturers in that they actually take a hit on the phone itself, in exchange for your cell phone contract.  Text messaging is likewise used a constant overall revenue stream, while the companies take losses in other areas.  Looking at text messaging as a whole ignores other areas of the business that may take a loss, or a much smaller profit.  If you force companies to charge less for text messaging, then other services may be made more expensive in order to make up the difference in profitability.  Worse yet, some services that are offered at a loss may be eliminated because people would be unwilling to pay their true cost, which might cost customers.

Of course, the real problem, once again, is the view that the price charged for a good or service needs to be directly related to the cost in providing it.  However, the reality is that the cost of a service is only limited to the willingness for people to pay for it.  There is nothing wrong with that.  It merely places a value on your desire for a service.  As soon as a company starts charging more than you value the service, you simply stop paying for it.  The actual cost in providing it is only relevant so long as the company can charge enough to stay in business.

Sending Secure Mail

by Nick Wednesday, December 10, 2008 10:36 AM

As part of my current re-evaluation of my computing systems, backup processes, and so forth, I've also started to take serious efforts at securing some of my data.  Along with those efforts, I wanted to make sure that all of you were aware that I do use PGP for sending secure email.  If any of you ever feel the need, you can download my public key from the PGP server.  You can also find a link to my PGP key on the left side of my blog.

Q: What is the Difference Between a GUID and a UUID?

by Nick Wednesday, November 19, 2008 9:48 AM

A: Marketing

News has broken out that NASA has successfully tested a deep space version of the internet:

The US space agency NASA said it successfuly conducted a first test of a deep space communications network modeled on the Internet.

"This is the first step in creating a totally new space communications capability, an interplanetary Internet," Adrian Hooke, NASA's manager of space-networking architecture, technology and standards, said in a statement.

The US space agency said Jet Propulsion Laboratory engineers used software called Disruption-Tolerant Networking, or DTN, to transmit dozens of space images to and from a NASA spacecraft some 20 million miles (32.4 million kilometers) from Earth.

NASA said the software protocol, which must be able to withstand delays, disruptions and disconnections in space, was designed in partnership with Vint Cerf, a vice president at Internet search giant Google.

DTN sends information using a method that differs from the normal Internet's Transmission-Control Protocol/Internet Protocol, or TCP/IP, communication suite, which Cerf co-designed, NASA said.

Like many things in computing, there tends to be stupid "religious arguments" among geeks about certain things.  Windows vs. Linux.  MS SQL vs. Oracle vs. MySQL.  You get the idea.  People will even argue about whether GUID is supposed to be pronounced "Goo-id" or "Gwid".  Now you can answer... neither!  It truly is supposed to be a UUID... a Universally Unique Identifer.

About Me

Nick Schweitzer Nick Schweitzer
Wauwatosa, WI

Contact Me
I'm a Software Consultant in the Milwaukee area. Among various geeky pursuits, I'm also an amateur triathlete, and enjoy rock climbing. I also like to think I'm a political pundit. ... Full Bio

Community Involvement



Flickr Photos
This is a Flickr badge showing public photos and videos from Nick_Schweitzer. Make your own badge here.

Standard Disclaimers

The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2017 Nick Schweitzer