Archive for August, 2007

10 Ways To Insure Project Failure

Captain Bligh - A great navigator but a bad project managerIf you want your next software development project to fail, and not just a small way but in big, spectacular, way, here are some sure fire steps for you to follow:

1. Set Unrealistic Goals

Your management says the project has to be done in 2 months. You know it can’t be done in any less than 6 and it’s probably more like 9 months. But, hey, they want it in 2 and you’re in no position to challenge them so why not just go ahead and agree to it. Your team won’t mind. After all, if they agree to work 80 hours a week they should be able to pull it off. Besides, you’ve just gotten the purchase of a brand new code generation tool approved. This will save loads of time in the project.

2. Staff Up Quickly

You need people on your team ASAP. Hire the first warm bodies your pal at Programmers-R-Us sends over for an interview. Your project has a tight schedule so you need somebody, anybody, on-board and ready to code. Don’t bother with having your team participate in the interview process or be too picky. If you do, you might lose the good candidates to other companies.

3. The More Documentation The Better

Require your team to document everything. You need a scribe to take down the minutes of each and every meeting and publish them afterwards. Every form must be filled out according to a mandated template taken from an antiquated mainframe methodology you learned in school or a NASA software development handbook you bought on eBay. Insist developers write out weekly, or even daily, status reports. You can never have too much data about a project. Ignore the whiners on your team who complain about being overloaded with useless work. They just don’t understand the benefits of good documentation.

4. You Can Always Make Up a Schedule Slip Later in the Project

If your project is falling behind it is always safe to assume that you can make up the difference later. People were just goofing off or getting into the project at first. Everybody knows that as the project progresses everyone gets more comfortable and productive. Just like in a distance race, everyone stores up enough energy for a big sprint at the end. Count on having a strong finish for your project.

5. Relax Your Standards To Shorten the Schedule

OK, so it looks like the document everything plan is not going to work out so well. The obvious answer is to do the opposite, scrap all documentation including any end user instructions or help files. That extra work can be done after the project is completed. Also, cut out fluff like integration and user testing, well managed source control and test systems and your other standard coding processes and procedures that just get in the way. Quality isn’t important, only completing the project on time is important.

6. Micromanage

If left to their own devices team members will goof off. It is your job to stay on them 24/7. If traffic is bad one morning, make a point of calling late team members on their cell phone every 2 minutes to gauge the progress of their commute. Who knows, they actually may be lounging at Starbucks rather than sitting in their car behind a jackknifed semi. Call them in the evening at home as well, particularly if they have the audacity to leave early, to discuss fine points of the project for 30 minutes or so. Use time management software to track each developer’s time in and out of the office and exactly what they’re working on throughout the day. Also, you should swing by every team member’s cubical 2 or more times a day to ask them about their progress. Feel free to offer your sage suggestions about whatever they’re working on. This lets them know how much you care.

7. Call a Daily Project Status Meetings

You should have at least one daily meeting to take the pulse of the project. This is best scheduled either first thing in the morning or very late in the afternoon. This helps insure everyone is arriving on time and not leaving early. Better yet, schedule a meeting for both times for a win-win situation. Every point of the schedule and the day’s work should be discussed in detail during these meetings. You have the room and the team’s attention for a full hour so why not use it to the fullest?

8. Threaten Team Members to Motivate Them

If your team is falling behind the problem is that you aren’t motivating them enough. You’re allowing them to goof off and fall behind! Put your project back on track by putting their feet to the fire. Let them know that if they don’t dedicate themselves wholly to the project they’ll be finding a new job. Question their competence as programmers and mention how anyone who doesn’t perform up to standards will be fired so as to spur them on to greater acheivement. You will be amazed at how motivated your team is after you take this approach.

9. Bring In More Programmers

That Brooks guy’s ideas might have applied way back in 70’s at IBM but they don’t apply in modern, Web 2.0, times. Screw the ‘Mythical Man Month’. Bringing in more programmers means more people coding and thus more getting done faster, simple as that. You could even have them work shifts using the same computers to save office space and equipment costs. You can easily find or invent a buzz word to describe what you’re doing to sell it to the team and your management. What a brilliant coup that would be!

10. Set Your Plan in Stone

Never, ever, back down on your vision of the project schedule or plan. You said 2 months with the new tool and you meant it. You know you have awesome estimation and project management skills. Don’t entertain any complaints about your choices in meetings. Anyone questioning your decision is being insubordinate and disrespectful and probably just looking for a way to slack off. How dare they question your competence and authority?

Special Bonus Idea

If you need good political cover for implementing these steps toward failure you need to tie them to a popular development and project management buzzword like Scrum, Agile, or Extreme Programming. All of these methods offer excellent cover to you both during and after the project. This shows your managers that you’re on top of the latest software development project management trends while your team are a bunch of disloyal whiners who can’t stand to have their cheese moved. Furthermore, when the project fails you will be recognized as a company expert of the method since you know what doesn’t work. Does it matter that you just ‘cargo culted’ these methods? No, not at all. You’re well on your way to being the next ‘pointy haired boss’ or Bill Lumbergh.

Share This Article: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Reddit
  • StumbleUpon
  • Technorati
  • DotNetKicks
  • DZone

6 comments August 19th, 2007

Site News for 8/13/07 through 8/18/07

Site NewsHere’s the site news for the week of 8/13/07 through 8/18/07. I thought it would be a good idea to do these posts most weekends to let you know what’s going on and where things are headed on this site.

Contact Me Page

I added a Contact Me page today using the Contact Form ][ plug-in by Chip Cuccio. You can use it to send me a message if you like although I prefer that you post a comment on particular articles so that everyone can benefit from the discussion.

Most Popular Posts

Here are the most popular individual posts from this week:

Advertising

I’m probably going to be experimenting around with some more advertising placement options and offers over this weekend. I try to seek a good balance on ad placements and I try to find good and useful offers so if you have any comments or suggestions on this, please let me know.

Earlier this week I added a free service, AdGridWork, way down at the bottom of the sidebar. They offer a way to promote your site for free and show ads for related sites on your site. They’re probably worth checking out if you have a site to promote yourself.

Coming Up Next Week

Next week I’m going to conclude my discussion of the System.IO.Path Namespace and I’m planning to write some articles on the generics, most likely on the Stack and Queue types since I’ve been using them recently. Also, since I’m doing a lot of work with Windows Services right now, I’m probably going to be posting more tips and tricks articles for them over the next week or so.

I’m also going to try to finish up an article on Code Walk-Throughs I’ve been working on and Iv’e got a few other development team articles in the works.

If there is a topic that you would like for me to cover or if you have anything that I didn’t cover well enough or accurately, please leave me a comment and let me know. Check back often to see what I’m going to talk about or just subscribe to my RSS feed to have it delivered to you.

Share This Article: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Reddit
  • StumbleUpon
  • Technorati
  • DotNetKicks
  • DZone

Add comment August 18th, 2007

Exploring the System.IO.Path Namespace - Part I

exploring System.IO.PathIn my series on the My.Computer.FileSystem namespace I had overlooked some of the powerful file name parsing capabilities made available in the System.IO.Path namespace. The .NET Framework is quite vast and it’s easy to stick with what we encounter and use first rather than exploring other areas. Plus, it’s easy to forget parts of the Framework that you may not use everyday. Therefore, I thought it would be a good idea to explore the functions in this namespace for both my own knowledge and yours.

ChangeExtension

This function replaces the current extension on a path/file string with the one specified. For example, if you had a raw data file and your program generated a matching report that needed to have the same file name, this function makes this process easy as seen here:

ReturnValue = IO.Path.ChangeExtension(RawDataFile, "rpt")

This function doesn’t create a new file or directory, it only serves as a path/file string parser. Also, it only affects the last extension so if you had a path/file with the value “C:\reports\stores.07.08.17.dat” the resulting value would be “C:\reports\stores.07.08.17.rpt”. Also use care to avoid placing invalid file/path characters into either parameter in order to avoid generating an exception.

Combine

This function is similar to the CombinePath function found in the My.Computer.FileSystem that I mentioned in my previous article. It takes two path parts and combines them into a single, well formatted, path string as shown here:

ReturnValue = IO.Path.Combine("c:\docs\customers\", "smith.doc")

ReturnValue is: c:\docs\customers\smith.doc

As I mentioned before, this function seems rather redundant with String.Concat although it adds the ability deal with periods or extra or lacking backslashes. It also has the same quirk as seen here:

ReturnValue = IO.Path.Combine("c:\docs\customers\", "\smith\smith2.doc")

This returns

\smith\smith2.doc

and not

c:\docs\customers\smith\smith2.doc

Like you might expect.

This function produces slightly different results than the My.Computer.FileSystem under some conditions. I’m not sure why this happens but you should be aware of this. Like the My function, I don’t think this function is as reliable as a plain old String.Concat is so I don’t see it as something I would use in one of my programs.

GetDirectoryName

As you would expect, GetDirectoryName returns the path portion of a file/path string. For example, this call

ReturnValue = IO.Path.GetDirectoryName("c:\docs\customers\smith.doc")

would return

c:\docs\customers

One thing to remember is that it does not return a trailing backslash so you’ll need to remember to include it in any string concatinations you do with the result.

GetExtension

This function is yet another file/path string parsing function and it returns just the extension as seen here:

ReturnValue = IO.Path.GetDirectoryName("c:\docs\customers\smith.doc")

ReturnValue is: ".doc"

ReturnValue = IO.Path.GetDirectoryName("c:\docs\customers\smith")

Return Value is: ""

ReturnValue = IO.Path.GetDirectoryName("c:\docs\customers\")

ReturnValue is: ""

If there is no extension or if there is no file name, a blank string is returned. Also, notice that the returned value includes the leading period, something to take into account for concatinations.

GetFileName

Another file/path parsing function, this one returns both the base file name and extension with no path information:

ReturnValue = IO.Path.GetFileName("c:\docs\customers\smith.doc")

ReturnValue is: "smith.doc"

ReturnValue = IO.Path.GetFileName("c:\docs\customers")

ReturnValue is: "customers"

ReturnValue = IO.Path.GetFileName("c:\docs\customers\")

ReturnValue is: ""

Be careful with this function though because it will return the final part of a path as a file name if there is no trailing backslash to indicate a path.

GetFileNameWithoutExtension

Yes, it’s another obvious file/path parser, this time returning the file name with no extension.

ReturnValue = IO.Path.GetFileName("c:\docs\customers\smith.doc")

ReturnValue is: "smith"

ReturnValue = IO.Path.GetFileName("c:\docs\customers")

ReturnValue is: "customers"

ReturnValue = IO.Path.GetFileName("c:\docs\customers\")

ReturnValue is: ""

As with GetFileName, it will assume the last part of the path is a file name if there is not a trailing backslash.

GetFullPath

This function returns the qualified file/path string. This function can be handy if you need to convert a relative path to an absolute, qualified path, as seen here:

ReturnValue = IO.Path.GetFileName("..\docs\customers\smith.doc")

ReturnValue is: "C:\Program Files\My Report Program\docs\customers\smith.doc"

Note that the appended physical path will be based on the current application’s location.

GetPathRoot

This function returns the root directory of a file/path string as shown here:

ReturnValue = IO.Path.GetPathRoot("C:\docs\customers\smith.doc")

ReturnValue is: "C:\"

ReturnValue = IO.Path.GetPathRoot("\\myserver\archive\smith\smith2.doc")

ReturnValue is: "\\myserver\archive"

As you can see, the backslash isn’t included in the parsing of a URI path string while it is for a local or mapped drive.

I hope this was a useful review of the System.IO.Path functions for you. I’ll post Part II in a few days where we’ll cover some of the other functions in this namespace. If you have a question or thoughts on this namespace, please feel free to leave a comment.

Share This Article: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Reddit
  • StumbleUpon
  • Technorati
  • DotNetKicks
  • DZone

Add comment August 17th, 2007

How To Uninstall a Failed Windows Service Installation

Pulling Out HairI’ve been doing a lot of work with Windows Services in VB.NET recently and, as a result, I’ve ran into a number of little tricks and traps in this area. I’m going to post these short, hopefully helpful, tips as I come across them.

One of these traps can happen when a service gets installed but gets stuck where you can’t completely uninstall it or install a new version. This can be caused by errors in your code, errors on the install itself, copying over an incorrect DLL or EXE manually, or other such things. When this happens it can be quite frustrating.

Here’s what you’ll see if you encounter this problem. When you try to reinstall the service, you’ll get a dialog that says, “The specified service already exists”, even if you’ve gone through the uninstall either from within Visual Studio or from the Add/Remove Programs control panel applet.

The Specified Service Already Exists Dialog

The program’s executables have been deleted from the installation folder but you’ll see your service app in the Computer Management Service console. You can’t seem to get rid of it. If you try to uninstall, you’ll see this message saying you can’t do it.

Only Valid If Currently Installed Dialog

I’ve seen forum posts where people resorted to renaming their service after encountering this error. Some manually edited their registry to get rid of it. Still others wrote a quickie program or script using WMI to kill it. But, there is a much easier way to deal with it.

There is a command line utility in Windows called SC, short for service controller, that allows you to control Windows Services manually. One of the available commands is “delete”. This command deletes references to the specified service in the registry. Here’s the command syntax:

sc delete NameOfYourBadServiceGoesHere

Once you run this from the command window, the failed installation is cleared from the registry and you’re ready to do a clean install of your service program. Of course, you need to be careful about using this command in production environments. Also, you should have gone through the uninstall process first to remove the executables before executing this command.

Let me know if you found this tip helpful or if you have any other ideas or questions about it by leaving me a comment.

Share This Article: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Reddit
  • StumbleUpon
  • Technorati
  • DotNetKicks
  • DZone

11 comments August 16th, 2007

Link Round-Up for 8/16/07

LinksHere are some links to some useful articles, links and blog posts I came across this week that relate to VB.NET and software development teams.

First of all, there were a few articles I ran across about bad managers. If you have a bad boss you may wonder why he or she hasn’t been fired due to their antics, this Reuters article, Bad bosses get promoted, not punished?, offers some insight based on a survey. It seems that making your subordinates miserable or even sick helps some bosses get ahead. I don’t know if they full survey results will be made available online or not, I couldn’t find them right off, but it would be interesting to see the details of this study.

Along the same lines Ramon Padilla at TechRepublic has this article, Seven traits of fearful managers, that raises some good points about what can cause a manager to become fearful and, thus, an ineffective leader. A lot of his points tie in well with my series on Marine Corps leadership and some of my other articles that discuss toxic workplaces.

Also in the article he brings up this very important personal finance tip:

The workplace, as is the world, is a very unpredictable place and hardly ever fair. Never get so settled in a position that you become complacent. Always plan for your next move. Put away some money in an “emergency cache” that can fund six months of unemployment. It may take you awhile to build it, but having it gives you the peace of mind that your world hasn’t completely fallen apart should you find yourself out of work. That peace of mind also works to reduce anxiety about being let go.

I highly recommend this strategy for anyone working in IT, manager or non-manager. Employment in the IT workplace is usually very unstable and complacency coupled with lack of savings is quite risky. Having this safety cushion, even if it isn’t a full six months at first, will reduce your job stress and anxiety significantly.

Over at CodeBetter, Jeremy Miller has this article, On Software Teams, where he gives his view on development teams. I found myself agreeing with his points a lot, particularly the main one, “Happy developers are productive developers.” He has several other good software team articles in his blog as well so check them out too if you get a chance. They’re linked at the end of the article above.

On the VB.NET front, check out this video interview with Lisa Feigenbaum, a Program Manager on the Visual Basic Editor, over at Channel9: Visual Basic Intellisense Improvements in VS 2008. If you’re wondering what improvements you’ll see in Visual Studio 2008’s rendition of VB.NET, you’ll want to watch this video. It looks like a good job so far. I just hope it isn’t too Vista-ized. If you want to keep up with what’s going on inside the VB.NET development team, check out their blog: The Visual Basic Team.

That’s it for this week. If you see a good VB.NET or general programming article or web site let me know about it by leaving a comment.

Share This Article: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Reddit
  • StumbleUpon
  • Technorati
  • DotNetKicks
  • DZone

Add comment August 16th, 2007

Next Posts Previous Posts


Most Popular Articles

Highest Rated Articles

Categories

Most Recent Articles

Feeds

 Subscribe in a reader

To subscribe by e-mail
Enter your address here

Delivered by FeedBurner

VB Opportunities

Archives