Slashdot Mirror


Estimating Software Development Costs?

Stu Lalison asks: "I'm an MBA student (but I'm not evil, I promise!) and am working on a business plan that involves having some custom software written for a handheld computer. I've done some research into estimating the costs involved in software production, but when estimating the time involved in writing the software, it usually says 'judge on past projects.' I'm not a programmer, so I don't have any past projects to judge on. I'm wondering if the Slashdot community can give me some ballpark figures on how long it takes a professional programmer to code different parts of a program. I've identified 3 needs of my application: a front-end user interface, a database w/ search function (of about 10 megabytes of data), and integration of both of these into a (currently existing) commercial mapping application. It seems like these aren't huge tasks, but getting (even a rough) handle on their actual complexity will help me greatly. Also, how much development time would be required to port an application like this from, say, a Palm OS device to a 3G handset? Thanks in advance!"

14 of 53 comments (clear)

  1. This is why we don't like MBAs. by Lauritz · · Score: 4, Informative

    Read "The Mythical Man-Month" by Fred Brooks. It's short, you can read it in a day/couple of days.

    And no, we do not think that MBAs are evil. They are just illinformed about what programmers do, and still like to take the dissisions that programmers should take. As you've just demonstrated. (No, asking slashdot, giving so little information that it is a joke, is not "letting the programmers deside")

    1. Re:This is why we don't like MBAs. by squiggleslash · · Score: 3, Funny
      Read "The Mythical Man-Month" by Fred Brooks. It's short, you can read it in a day/couple of days.
      I'd prefer to get a team of eight people together to read it so we can get it done in an hour or two...
      --
      You are not alone. This is not normal. None of this is normal.
  2. Bad Voodoo by Kiaser+Zohsay · · Score: 3, Interesting

    Software Estimation is fscking black art. If all you're doing is wiring together pre-built components for a database browser, then function points or some of the other metrics can get you pretty close. But any time you are solving problems that have not been solved before, like on a new platform (handheld), then the software isn't done until the problems are solved. And you may not know for sure that the problems are solved until the second or third release.

    As a programmer, I have long been troubled by the fact that the primary guages for success or failure on software projects are the schedule and the budget, the two items that programmers have the least amount of influence over.

    --
    I am not your blowing wind, I am the lightning.
  3. Expertise by Koos+Baster · · Score: 4, Informative

    I've identified 3 needs of my application: a front-end user interface, a database w/ search function (of about 10 megabytes of data), and integration of both of these into a (currently existing) commercial mapping application.

    Obviously, your descriptions lacks details to make even a vague estimate of costs. So here are some general guidelines and things to consider.

    If the 3 needs you specify are filled in independently, your project is bound to fail. That is: if front-end and database are built independently, the integration need is bound to be the most expensive. Only way to reduce integration costs is having a damn good specification of what you're looking for and some damn good project manager with a damn good team of coders, that can cooperate. (That, or a one-man-team that's proven to be up to the job.)

    Porting efforts tend to depend on the size of the code base, and the ability to find a skilled porter. To a lesser extent it also depends on quality of the code and documentation. But I'd say size is the major issue here, keep things small.

    Well, anyway. My advice would be: get someone that can give a good estimate, 'judged on past projects.' If that's not possible or not satisfactory, just determine market value, based on offers of different (sub-)contractors.

    Oh. And there is no such thing as a scientific formal analysis that yields code size/cost/time based on a problem description. Nothing in software engineering (or elsewhere) has an accuracy that's within a factor 5, so consider these techniques useless. If you don't have the expertise, go look for people that have.

    --
    The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in: we're computer professionals, we cause accidents -- Nathaniel Borenstein

  4. Cost Estimate by the+eric+conspiracy · · Score: 3, Insightful

    it usually says 'judge on past projects.'

    There is the clue to your answer. Hire someone who has done this sort of thing to give you an estimate.

    Or you might try to go to a contractor and see if they will give you an estimate.

  5. Quick guidelines by /dev/niall · · Score: 5, Informative
    1) You need a detailed functional specification. Just what the application should do, not how or with what technologies.


    2) You need a detailed implementation specification, which should probably be written by someone with technical experience and at least some knowledge of the application's intended use. The person(s) who write this should be able to estimate how long it will take to complete.


    3) You need to double the amount of time the folks from #2 give you as an estimate. If you didn't spend a lot of effort on #1, you should probably triple the estimate as you will be adding features that will render most of #2 obsolete.

    --
    --
    1. Re:Quick guidelines by oliverthered · · Score: 4, Informative

      Ok, you can improve on that.
      1: Against each element assign a Risk.
      2: Using the risks and the estimates and calculate the 95 percentile for a normal probability and quote this.

      I can't remember the maths at hte moment (it's been a while). but something like

      A takes 2 weeks, 1.5 with a fair wind and 4 if where in the shit.
      B takes etc......

      plug the numbers in and you get a probability curve for when the work will be done by.

      Pick the 95% change of getting the work done and use that.

      --
      thank God the internet isn't a human right.
    2. Re:Quick guidelines by Maple+Syrup · · Score: 3, Insightful

      Regarding #3:

      "You need to double the amount of time the folks from #2 give you as an estimate".

      IMHO, you need to double the amount of time and convert to the next-higher units. Because what you think is a "1 hour job" really will take you two days, and the "One week of coding" really will take you two months.

      DAMHIK

  6. Rough Estimation by eric2hill · · Score: 3, Informative

    If you train well (i.e. can read a manual and learn, not go DUH), then estimate what it will take to build it then double that number.

    Database - About 2 weeks with populated test data.

    GUI - About 6 weeks.

    Interface to other system - About 6 weeks.

    That's 14 weeks, so double it to 28 weeks. Your project will take about 7 months to complete with one developer.

    --
    LOAD "SIG",8,1
    LOADING...
    READY.
    RUN
    1. Re:Rough Estimation by Bitsy+Boffin · · Score: 4, Insightful

      I hope the poster doesn't take your answer seriously. There is nowhere near enough information given to make ANY sort of judgement on how long it is going to take to do anything let alone finish it. We don't even know what the system is supposed to DO (asides probably something to do with mapping).

      How do you know what the system you are interfacing with looks like, what protocols you're going to have to use, maybe you have to invent them, maybe you're gonna have to figure out some communication method between them.

      Perhaps there is a framework for buiulding the GUI already there meaning programming takes 2 weeks, or maybe you have to do everything from scratch and programming is going to take a year.

      As for the database, you don't know anything about the data - can't even begin to imagine where you got 2 weeks from.

      --
      NZ Electronics Enthusiasts: Check out my Trade Me Listings
    2. Re:Rough Estimation by eric2hill · · Score: 3, Interesting

      My point was NOT to simply guess on the time, but to give an example of how you take a project estimate and double it.

      You're right that the poster doesn't supply NEARLY enough information, but on the other hand, I think that 7 months is about right given the sketchy details provided.

      I'm currently working on a project to build a customer relationship database that is replicated to salespeoples' computers. The spec was for 6 weeks of development time, and I'm going to have it done inside of 5 weeks.

      Good software doesn't have to take years to build, or piles of money. You just need to choose the right tools for the job, plan a good specification about what the application needs to do, and IMPLEMENT the frigging thing. A lot of people now-a-days try to over-architect the app before any code gets written. I believe that properly designed code can be refactored as it's being built, getting the product out the door quickly, and implementing new (changed/additional/etc) features in later versions.

      --
      LOAD "SIG",8,1
      LOADING...
      READY.
      RUN
  7. Rules of Thumb by garyebickford · · Score: 3, Informative

    I learned a couple of useful rules of thumb regarding SW project planning. One was told to me by a documentation person who worked for Bolt, Baranek and Newman (sp?) when they were designing the first Arpanet: "Take the estimates from the engineering group, double it and convert to the next higher units." - e.g., if the estimate is five weeks, make it 10 months.

    The other is similar, IIRC from a UCLA project: "double it and add six months"

    Everyone already knows the "90% rule of software" - the first 90% of the work takes the first 90% of the time; the last 10% of the work takes the second 90% of the time." I would add that the last 1% of the work will take the third 90% of the time. This is very, very true.

    Many Open Source projects either demonstrate this or never get the 2nd and 3rd parts done - because these are the parts where the errors in the UI definition are found and fixed, often requiring complete rewrites; and the final tweaking is even harder. Like any art, the closer to perfection you want to get, the more work it is to get there. It takes just as much (or more) time to polish the last eensy bit of shine as it did to rough out the piece.

    I have found the following:
    1. Larger projects are easier to get right, for two reasons.
    a) they must be broken down to smaller units and thus are usually more completely defined.
    b) If you're reasonably good at such things, the uncertainty of the estimate on each unit is about even, so while some units go over, others go under. In a large project this can be a wash.
    2. In practice, using good large-team software engineering methods, about 1/2 of the total effort expended is in the initial design - which is also where some 80% of the bugs are created and must be found. Only about 10-15% of the effort is in coding, and perhaps 30% in SW QA, which must start in the design phase.

    These factors are ignored at your peril. Many programmers are used to conceiving something and cranking out a working rendition overnight. However, turning that piece of basically-running code into something that will robustly handle all possible idiot inputs and attempts at cracking will require triple that time at least.

    3. In general, if you can break problems down to a tree of trivial projects, you can thumbnail the estimates for each of those fairly easily. If a piece involves work you're not familiar with, you can ask others who are familiar with that piece and plug it in or further break it down. Units of one to 3 days are about right (or 4-24 hrs.)

    4. Making it smooth and glossy so that people actually want to use it will require much more. The original piece of code can only be described as a 'proof of concept'. This is like the difference between a Ford Model T (with hand spark advance) and a recent automobile. There's a lot of engineering between those.

    5. Look into "Extreme Programming" - this appears to be a very good way to manage projects the way they really work, though I haven't actually run a project this way.

    Having said all this, I've been pretty successful in projects up to about 10 people with myself and about 1.5 additional staff spending a total of (in one example) about a month breaking down a client-server system based on a well-understood set of algorithms to a very detailed project tree, with nodes that amounted to a few person-days a piece. This worked out to a project estimate of six person years. Of course, management screamed, but we got sign-off, and while many things changed due to company problems the parts we were allowed to build according to plan worked out very close to the original estimate. In fact, the parts they tried to short-circuit and ship early were finally fixed in about the original timeframe, with much customer unhappiness in the meantime.

    I left the company shortly after.

    --
    It's easier to be a result of the past, but more fun to be a cause of the future! http://www.spacefinancegroup.com/
  8. Here's one (meta-) answer by Lumpish+Scholar · · Score: 5, Informative

    Joel Spolsky on "Painless Software Schedules"

    Yeah, it's a lot of hard work. Deal with it.

    --
    Stupid job ads, weird spam, occasional insight at
  9. A few guidelines by Anonymous+Brave+Guy · · Score: 3, Informative

    First of all, realise that you are asking for a quick-and-easy way to produce information that normally requires several years of solid experience in the relevant industry to estimate with any accuracy. You cannot possibly do this alone if you don't have a background in programming as well.

    With that very necessary caveat, here are a few guidelines that might be of use. After discussing the reasoning behind them, I'll come back to address the questions in the original post.

    It can take very different amounts of time to get the same work done, depending on a few key variables:

    1. How good is the spec?
    2. How much does the spec change during development?
    3. How good are your team members?
    4. How good is the controlling process?

    These sound fairly nebulous, but there are some key points in each case that make all the difference.

    1. How good is the spec?

    First of all, you must have good specifications of the requirements. Start with something written in terms of the problem domain: what data will be in the database and how it will be used, what you want to be able to do with the UI, etc. Then have people who understand both the basics of the problem domain and the details of software development produce specs in software development terms based on your original requirements. Depending on the size of your project, this might be as simple as a database schema or two and a description of what the UI will look like. Around this point, someone experienced will be able to estimate how long the remainder of the project would take a typical team.

    If you don't have a good requirements spec up-front, then clearly you won't produce very accurate technical specs from it, and the error in your estimates will be commensurately higher.

    2. How much does the spec change during development?

    This is a killer. Requirements often will change during the development of a project, either because the client's needs evolve over the lifetime of the work, or because you realise that the original plan was flawed and have to adapt. However, it takes significantly longer to adapt to changing requirements than it does to get it right, at least mostly, up-front. If your requirements are concrete at the start, and the most you're likely to need to change is a few details to adapt to things not working out as you first envisaged, your project will move fairly efficiently. If you constantly change things under your developers' feet (which is common if your original spec wasn't very good, for a start) then you need to double or treble the expected lifetime of the project.

    3. How good are your team members?

    Individually, a good developer can get an order of magnitude more work done than a mediocre one. If you get several good guys together on your team, and they're also team players and not prima donnas, you can estimate a much faster completion than you would from an average team. Of course, you'll have to pay these people significantly better, but they'll be more than worth it.

    Incidentally, when you're forming a team, do get someone technically competent to gauge whether they know what they're talking about. A non-programmer is simply not qualified to do this, no matter how many clever books they've read or how many buzzwords were in their management magazine last week. Screwing this up is a great way to multiply the lifetime of your project by ten.

    4. How good is the controlling process?

    In a good, lightweight process, working with good people and good specs, you'll find that your team spends around 30-40% of its time planning and designing, a similar amount or a bit longer on testing and putting it all together, perhaps 10% on actually implementing the designs, and a few percent on overheads, mostly communication within the team to keep things organised.

    In a bad process, you can ramp those overheads way up, easily wasting 50-75% of your developers' time on unhelpful paperwork and needless communications. Again, it pays to have a good project manager/management team, or to employ someone with good organisation skills if it's a one-person job.

    So, there you have it. A good team, working fairly uninterrupted from good requirements specs and with a good co-ordinating process, will probably put together your software 50x faster than a team of poorly-trained code monkeys who are constantly messed around and following a heavyweight process that doesn't respond well to change. Of course, this doesn't really much happen; if you aren't smart enough to use good people and let them get on with their job, your project will join the vast majority: it will fail and be cancelled.

    Back to the original questions...

    With all of that in mind, it's hard to give specifics without knowing a lot more about your particular job, but I can give you an idea of what a typical, small-scale database application might be like.

    UI work often makes up 50% or more of a project. Databases require some careful thought up-front, but tend to be fairly straightforward. Integration with an existing system is a bit of a minefield; as ever, if you've got clear specs to match against (and the existing system actually follows them, which is far from guaranteed!) it's fairly easy, but if you have to work things out for yourself due to lack of accurate information, this can be a big risk.

    It sounds as though this project is fairly small scale. Assuming you have average developers, a small database would probably take a man-week or two to design and implement. A UI to provide basic input, searching and reporting functionality for a database of that size probably takes 2-3x as long as making the database itself. If you're only doing a simple transfer of data to another application, that might be done in a matter of days, but if you're talking to a big custom database app using non-standard protocols and detailed interfaces, it could take several weeks.

    All in all, you're probably looking at 3-6 man-months to design and implement a typical application of the sort I imagine you're dealing with. Of course, then there are the overheads, particularly up-front requirements capture and the testing and QA time, so overall you're probably looking at 1-2 man-years of development from start to finish. Clearly this has to be a very random figure without a lot more details, but it's about par for the course designing small custom database apps with a decent team and decent tools.

    As to your final question about porting: this really depends very much on how different the platforms are. If you know ahead of time that porting is likely to be a requirement, you can invest a little time during development to save a lot of time reengineering things later. Using portable tools and programming languages makes a huge difference here, and having people on the team with experience of the idiosyncrasies of each platform to be used helps a lot, too.

    If you've done this well and your project requirements are amenable to porting, you might port successfully in 2-3 man-months. At the other end of the spectrum, sometimes things are so different that it really is faster to rewrite from scratch, though obviously you'll have gained a lot of insight the first time around so you'll generally get the second implementation done significantly faster than the original.

    --
    If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.