Community Voices

Dr. Dobb's Bloggers

Goal Oriented Development

June 11, 2008

Goal Oriented Development
By Adam G. Carstensen
 
Anyone who has spent a serious amount of time doing software development knows that there are the same old pitfalls which almost always keep creeping up.  The project seems to be running along smoothly, but as you reach the end of your time frame, the development process seems to slow and it appears that there will not be enough time for everything that was planned.  Corners are cut and the final product just doesn’t measure up to the intent or worst case, the project isn’t completed on time and you need to explain yourself, while begging for more time or money.
 
There are a number of factors which lead to this occurrence, and chances are that if they happen to you once, they’ll probably happen again because it’s simply too embarrassing to attribute to poor planning and oftentimes, excuses are found or fabricated for any possible shortcoming.
 
Luckily for you and me, this fate doesn’t have to fall upon us in project after project, and it’s actually very simple.
 
The most important thing to note is that some developers are better or worse at certain tasks, some are faster or slower, and some are burdened with additional work.  These things can be accounted for on a case by case basis, but it doesn’t change the need for good planning.
 
There are several methods for managing long running software development projects, but I’m only going to outline what I find to be the best for my own development style, and I’m sure these easy steps will help many other managers / developers.
 
Milestones and Speed Bumps (Goal Oriented Approach)
 
Milestones are just imaginary markers along the road of software development.  The principle is very simple and everyone creates these in their mind when they are planning anything from getting ready for work to landing a 747.
 
Speed bumps are problems which can occur during any portion of development.  If you are writing a section which will utilize a new technology that you’re not familiar with, or if Holidays is coming, these are speed bumps which MUST be accounted for, or else you will fall short of your development goals.
 
Common Speed Bumps:
Gaining / Loosing Employees
Office Expansion
Upgrade of Software/Hardware Baselines
Pregnancy / Childbirth
Conferences
Holidays
Unknown Technology (New or Old)
Security & Stability Testing (Penetration Testing / Compatibility Testing)
Client Forest/Domain Configuration Settings
 
Human beings are goal oriented creatures – busy work rarely appeals to anyone, but working towards an end allows us to break almost immeasurable tasks into small pieces that can easily be consumed.  Take advantage of this, and instead of having everything pile up at the end of a project, ensure that almost all of your goals are accomplished LONG before the end of your time table.
 
An example of one of my development timetables is added below to show how I separate my projects into milestones.  The project this timetable was used for was the development of a Help Desk System (Trouble Ticket Issuance and Configuration Control).
 
Milestone 1 – Business Analysis
Milestone 2 – Requirements Gathering
            2.1 – Scope
            2.2 – Specifics
Milestone 3 – Software Planning
            3.1 – Platform
            3.2 – DB
            3.3 – Sketches
            3.4 – Workflow
            3.5 – Prototype
            3.6 – Approval
Milestone 4 – Infrastructure
            4.1 – Web Server
            4.2 – Admin Console Delivery System
Milestone 5 – Database Design and Development
            5.1 – Table Schema
            5.2 – General Stored Procedures
            5.3 – Code Table Values
Milestone 6 – Web Interface
            6.1 – Login Page
            6.2 – Home Page
                        6.2.1 – My Tickets
                        6.2.2 – New Tickets
                        6.2.3 – Admin Page
                                    6.2.3.1 – Update Tickets
                                                6.2.3.1.1 – Assign Engineer
                                                6.2.3.1.2 – Assign Priority
                                                6.2.3.1.3 – Assign Status
                                    6.2.3.2 – Automated Status Updates via Email.
                                    6.2.3.3 – Node Coloring.
                                    6.2.3.4 – Categories and Subcategories.
            6.3 – All Tickets
                        6.3.1 – Color Coding
                        6.3.2 – Categories
Milestone 7 – Refactor and Refine code
Milestone 8 – Replace Placeholder Graphics
Milestone 9 – Internal Testing and Bug Finding
Milestone 10 – Bug Fixing
            10.1 – 6.1
            10.2 – 6.2
            10.3 – 6.3
            10.4 – 7.1
            10.5 – 7.2
            10.6 – 7.3
Milestone 11 – UI Polish
Milestone 12 – Documentation
 
Throughout the course of development, I knew that I would run into 2 HUGE speed bumps – Christmas break and AJAX. 
 
I decided to use AJAX because the customer requested its use and because I wanted to deliver something that would be visually impressive and extendable.  I enjoy a “hands-on” learning environment, so I was up for a bit of a challenge. 
 
I also know that in the week before Christmas I get VERY LAZY (It’s the cookies) and no one from my team is reliable or even present most of the time.  I need better henchmen.
 
Seriously though, Christmas time isn’t just a few days off; productivity will grind to a halt almost everywhere a week before and a week after Christmas.  Even if you are incredibly motivated – most others won’t be.  Accept it, and plan for it.
 
I was given a 2 month development window for the new Help Desk software, and I decided that in my 8 weeks, 2 of them were essentially worthless because of Christmas, and that I had to break my 12 Milestones up into 6 weeks time.  This gives me the added benefit of any work done during the break being “gravy” on top of my time table.
 
Milestones 1-3 involve Requirement Gathering and Software Planning – two things that I had under my heel because I had already contracted for the customer for a number of years and understood much of what they wanted.  Still – I dedicated a full week to tracking down ALL of the key players, getting their input, pitching ideas, revising ideas, pitching ideas, revising ideas, ignoring input, and generally bothering everyone involved until I had a well rounded view of what my customer (more like 30 customers) wanted.
 
Our fourth milestone is a tricky one – and is something that managers will often overlook only to be done in late in the game: Infrastructure.
 
If you are being contracted to provide the entire solution, it may include Servers, but most times the customer will already have an IT infrastructure in place that you simply need to cut a piece of.
 
Regardless of who is providing the hardware - specific configurations and settings will need to be made by the customer to allow its entry into the Domain/Forest/Workgroup.
 
Find out what your server name(s) will be, how much space you’re allotted, how much bandwidth, blocked ports, network availability, GPOs that might interfere with your software, policies regarding third party software, and any other information related to your specific project.  If you run into trouble, the wheels are already turning very early in the game, and hopefully by the time you get to deployment, these issues will be resolved.
 
The amount of time needed for Milestone 5 (Database Design and Development) grows and shrinks directly proportionate to the complexity of your database needs.  “That’s true of basically everything though!”  Yes - however is doubly true for database development.  The time needed to repair one small error, omitted field, silly use of in-between tables, or any other database design errors will grow exponentially with the size and complexity of the database schema and most importantly the stored procedures which are used.
 
Take extra time when you’re creating your database to run through EVERY planned function of the application to ensure that you didn’t miss anything.  You will hate it at the time, but it pays huge dividends in the end when you’re not hacking up your original DB schema because of poor planning.
 
I typically plow through the DB development quickly because I’ve had a lot of experience working with relational databases (and this project was really quite simple), but dedicate as much time as you need (within reason) to getting it perfect and then move on.
 
Fill in your code tables, and make sure that you include your default values in a clear and concise manner – I always include „Unknown” and „Other” (if applicable) first to ensure they get primary keys 1 and 2.  If you create and fill your code tables before you start working on the software, you will be able to immediately create enumerators and ensure that you don’t run into any data mismatches.  Each developer is different but I find this helps to prevent errors that I might otherwise get if I just slop everything together.
 
By the time I got to work on the webpage I had already gone through the layout and workflow of the site numerous times during the requirements gathering, software planning, and database development portions, and I’ve decided to change things a little from my initial plan.  I contacted the customer, suggested my changes, they agreed and I got to work on developing the website. 
 
Don’t get frustrated if you come up with a great idea and the customer shoots it down.  Chances are, they aren’t as technically minded as you and just don’t want the plan to change after all of the key players have already agreed.  If the development absolutely can’t continue without change, call another meeting with everyone involved and explain the problems, how they came to pass, and how they were overlooked originally.  If you can provide an adequate explanation, and take ownership of the problem it will usually reflect well upon you and the company you represent, instead of screaming incompetence.
 
At this point I had approximately 4 weeks left on my development time table (not counting the 2 weeks of worthless Christmas time), and I’ve only just created the Solution which I will use for the project.
 
Now, I knew what pages I would need, the basic components, the functionality, and I knew that I would spend a decent amount of time on fluff and filler to make the site feel complete, but I still had one huge speed bump – I’m an IDIOT!  I don’t know anything about AJAX – I thought it was a cleaning product, but apparently it’s a content delivery system.  Who knew?  So to the internet I went, I was going to give myself 1 week to learn everything I needed in order to create my site, so I had to really put my ear to the grinding stone.  Fast forward a week, I’m still an idiot, but I know a little bit more about how to develop a site using AJAX, but not enough.  I don’t like my situation.  I couldn’t learn enough to be comfortable delivering a truly professional site.  Now I’m in an awkward position – my customer wants AJAX, I said I could probably deliver (never promise anything, you’re not 100% sure about), and now that it’s coming down to the wire – I’m relatively sure that I can’t.
 
What to do, what to do.  Lie?  Dog ate my laptop?  No, that’s not any good – ask for more time / money to study?  The customer isn’t paying for my education, they pay for a product – a product they can get elsewhere if they need.  So what can I do?  Well I have two options – I can struggle with the AJAX and try to pull something out of the magical land in my pants, or I can study some more until I feel well grounded.
 
Each one of my options has plusses and minuses.  I simply have to weigh my options to decide which is the best for my situation.
 
Carry On:
            PRO - Immediately start developing
            CON - Development will be slowed
            PRO - Will get “hands on learning”
            CON - Code will surely be a mess
            CON - Performance will surely be affected
            CON - Documentation will be lacking - most things aren’t fully understood.
            CON - Development will be interrupted by Christmas break.
 
Study More:
            CON – Development will be delayed.
            PRO – Development might be quicker.
            CON – Development might not improve much.
            CON – I might still have many problems after studying more.
            PRO – I should have a decent theoretical knowledge of the software.
            PRO – Documentation will be fuller and more reliable.
            PRO – Performance may increase.
            CON – Performance may also not improve much.
            PRO – Development will not be interrupted by Christmas break.
           
Well, both of my options look relatively bad, but I do know that I gave myself two weeks of extra time because of Christmas – which is fast approaching now.  I won’t get much development done while I’m on vacation, and it’ll take me a while to get back into my code anyways, so I decided to get back to the books.
 
I took a trip to my local library and picked up a few books on beginners AJAX, and settled in for my two weeks of relaxation and light reading.
 
It so happened that I had a nice “Bones Moment” with a few days of my vacation (that I mostly spent eating and playing computer games – I’m so bad) remaining, and things started to just make sense.
 
Had I not agreed to attempt development with technology I didn’t know, I would already be mostly done with the site, but sometimes we need to push ourselves to grow - sometimes we need to fail to remember that we’re not Superman, and sometimes we have to work extra hours to make up for playing Super Smash Bros for two weeks straight.  It happens.
 
I got back to work with a real time table of 4 weeks remaining, and I’m only just starting my development.  I have only 6 full milestones remaining, but one of those is huge – development.  However, when you take a large undertaking and break it into small pieces, the list may seem endless, but the speed that you’ll start crossing things off will motivate you to push through, and I find my productivity increases, because I’m not “all over the place”, but instead my efforts are focused.
 
I wasn’t sure how much time I wanted to allocate to the development of the site, so I broke it down into its individual parts and assigned timeframes to each small piece.  Add them all up, and you should have your total development time – it won’t be perfect, but it will be more accurate than guessing at the entire project in one go.
 
2h        Login Page
            1h            SQL Authentication
            1h            Roles
 
15.5h   Home Page
            4h            My Tickets
                        2h            Layout
                        1h            Color Coding
                        1h            Categories
            4h            New Tickets
            7.5h            Admin Page
                        1.5h            Layout
                        1.5h            Update Tickets
                                    30m            Assign Engineer
                                    30m            Assign Priority
                                    30m            Assign Status
                        30m            Automated Status Updates via Email.
                        2h            Node Coloring.
                        2h            Categories and Subcategories.
 
1.5h     All Tickets
            30m            Layout (Copy from My Tickets, but different SP Used)
            30m            Color Coding
            30m            Categories
 
So now after all of my calculations, I assume everything will take approximately 19 hours or straight hard programming.  I have to calculate in lunches, meetings, phone calls, emergencies, helping other engineers with their own problems, and bathroom breaks – and between all of those things I probably only get 50% of my time at the keyboard.  It goes up and down, but that’s pretty much average.  So I double my calculation to get a rough estimate of the real development time – 38 hours – pretty much a full week.
 
While I put that up on my whiteboard, I notice I have a lot of work remaining after development, but only three weeks to do it.  It’s probably best if I come up with a breakdown of my remaining time and hold myself to it.
 
After development I’ll have the following milestones remaining:
 
Milestone 7 – Refactor and Refine code
Milestone 8 – Replace Placeholder Graphics
Milestone 9 – Internal Testing and Bug Finding
Milestone 10 – Bug Fixing
            10.1 – 6.1
            10.2 – 6.2
            10.3 – 6.3
            10.4 – 7.1
            10.5 – 7.2
            10.6 – 7.3
Milestone 11 – UI Polish
Milestone 12 – Documentation
 
Sadly, I’m not perfect.  I make silly mistakes in my development and write kludgey code when I’m rushed.  I know this, so I can plan for it - I need to dedicate myself at least the first half of a day to going through my work and polishing up my less impressive sections.  Also this helps to decrease the amount of time needed for bug fixing.  Normally WAY more than ½ a day will be dedicated to this, but the sample project I am using was very small.
 
Milestone 7 – 4 hours (Re-factor and Refine Code)
 
Placeholder graphics are important to use when you’re writing code – nothing is more destructive to productivity than interrupting your coding to go off on a random tangent (making pretty pictures).  According to my sketches, my project will need 3 images:
Company Logo
Help Icon
Company Security Warning Image
 
Of these images, I only have to create the Help Icon (probably just a question mark, or light bulb of some sort), and something to tie the companies current Security Warning Image to the help desk – possibly a complete re-creation, but also possibly just a different border / background.
 
Luckily I have been making silly drawings on my computer since I was a kid – so even though I don’t have formal training, I can whip something up in pretty short order.
 
Milestone 8 – 4 hours (Replace Placeholder Graphics)
 
So now I have 14 business days to fit in internal testing, bug fixing, UI polish, and documentation.
 
I have a horrible track record of getting users to come test products, so I don’t even try anymore.  My best suggestion is to get another engineer - one who can be very critical of your work to come test for bugs.  Make sure they understand that they aren’t looking for design differences or best practices – just bugs.  Give them a cookie every time they find one you didn’t know about, and document it well; steps to recreate it, screenshots of the error messages, and current user permission levels.
 
Have them walk through each of your development milestones, and search for bugs specific for each section.  In larger companies, test cases and real test plans will be used, but still the result should be basically the same.
 
For projects with development times under a month, give your tester ½ the time to test your application as it took you to write it – this general rule of thumb will ensure that they have enough time to work through all of the workflows and business processes.  Obviously, there will always be bugs found later, but if your tester can work through all of the workflows without having a deep understanding of the business, then someone with a more refined understanding of how things should work will be able to reach the same end – even without technical know-how.
 
If your projects have development times longer than a month, giving the tester more time will not necessarily produce better results, but instead - true test plans with test cases and scenarios should be developed.

I gave myself 5 days to develop, so testing should take approximately 20 hours.
 
Milestone 9 – 20 hours (Internal Testing and Bug Finding)
 
The same amount of time dedicated to testing should be dedicated to bug fixing – ½ of your original development time.
 
Milestone 10 – 20 hours Milestone (Bug Fixing)
 
The two remaining milestones – 11 (UI Polish) and 12 (Documentation) should be relatively quick – but at this point we have 9 days remaining to Polish, Document, ensure that any Infrastructure problems are resolved, and fix any remaining bugs.
 
As a general rule, I dedicate ¼ of development time to UI polish, and ½ of my development time to documentation.
 
Milestone 11 – 10 hours (UI Polish)
 
Milestone 12 – 20 hours (Documentation)
 
I finished with approximately 1.5 weeks remaining because my bug fixing phase went relatively well and only a few minor fixes were required.
 
In the end, I took that extra time to work on some extra features the customer had indicated they would like, but not need – and that extra work is always much appreciated.  It may not pay directly, but developing a product that’s above the expectations of your customers will guarantee that they continue to solicit your services in the future.
 
If I had not worked up a relatively accurate time table before I dove into the work, I probably would have still been able to deliver my product on time, but I can almost guarantee that I wouldn’t have fit in any extra features, and the polish wouldn’t be nearly as well done.
 
This was just one example of using Milestones to measure and plan your software development.  Naturally, larger development teams will require a more “textbook” development lifecycle, there will be test cases and scenarios, piles and piles of red tape and lots of disgruntled employees, but the principle can still be applied – break the project down into it’s base components, and then complete them one by one until you have a product that’s really ready to deliver!

 

Related Reading


More Insights






Currently we allow the following HTML tags in comments:

Single tags

These tags can be used alone and don't need an ending tag.

<br> Defines a single line break

<hr> Defines a horizontal line

Matching tags

These require an ending tag - e.g. <i>italic text</i>

<a> Defines an anchor

<b> Defines bold text

<big> Defines big text

<blockquote> Defines a long quotation

<caption> Defines a table caption

<cite> Defines a citation

<code> Defines computer code text

<em> Defines emphasized text

<fieldset> Defines a border around elements in a form

<h1> This is heading 1

<h2> This is heading 2

<h3> This is heading 3

<h4> This is heading 4

<h5> This is heading 5

<h6> This is heading 6

<i> Defines italic text

<p> Defines a paragraph

<pre> Defines preformatted text

<q> Defines a short quotation

<samp> Defines sample computer code text

<small> Defines small text

<span> Defines a section in a document

<s> Defines strikethrough text

<strike> Defines strikethrough text

<strong> Defines strong text

<sub> Defines subscripted text

<sup> Defines superscripted text

<u> Defines underlined text

Dr. Dobb's encourages readers to engage in spirited, healthy debate, including taking us to task. However, Dr. Dobb's moderates all comments posted to our site, and reserves the right to modify or remove any content that it determines to be derogatory, offensive, inflammatory, vulgar, irrelevant/off-topic, racist or obvious marketing or spam. Dr. Dobb's further reserves the right to disable the profile of any commenter participating in said activities.

 
Disqus Tips To upload an avatar photo, first complete your Disqus profile. | View the list of supported HTML tags you can use to style comments. | Please read our commenting policy.
 


Video