CS 458 - Week 5 Lecture 2 - 2017-09-21 ------------------------------- Mythical Man-Month - Chapter 3 ------------------------------- * brute-force scale up (for programming really large systems) tends to be: * costly * slow * inefficient * to produce systems that are not conceptually integrated * Harlan Mill's suggestion: why not structure teams of "surgical-style" teams, rather than designing teams where all are "hacking away"? ... ------------------------------- Jalote Chapter 2 - continued ------------------------------- Iterative Development software development process model, continued; ------------------------------- * TWO variations on this model are discussed in Jalote Ch. 2: * iterative enhancement * iterative delivery * in BOTH of these, software is developed AND DELIVERED in *increments* -- each delivery is a working system the client can use, BUT each delivery adds some functional capability * see how this addresses the "all or nothing" issue of Waterfall and Prototyping? * and it can also address the requirements bloating potential tendency of Waterfall * what, then, is the difference between iterative enhancement and iterative delivery? * iterative ENHANCEMENT * 1st step: creating a simple initial implementation for a SUBSET of the overall problem; this IS a deliverable, though (unlike a prototype) * subset needs to contain some key aspects of the problem that are easy to understand and implement, and which form a USEFUL and USABLE system NOT a thowaway, though, note! * create a PROJECT CONTROL LIST that contains, in (currently-understood) order, the tasks still needed to be done for the final implementation * can indicate how far along the project is at a given time * each step after that? * remove the next task from the list * design the implementation for the selected task (design phase) * code and test the implementation (implementation phase) * perform an analysis of the partial resulting system (analysis phase) ...and update the project control list as a result; * potential advantages: * better allows for changing requirements (reordering the project control list is not as big a deal as changing the requirements would be in Waterfall) * don't have the all-or-nothing risk * potential disadvantages: * since the requirements for future iterations are not known yet, will the design of the system in progress be robust enough? * what if changes have to be made to the existing system at some point to accommodate future requirements? ...might require extra legwork, discarding earlier work, etc. * each iteration, being deliverable, does have an expectation of being well-designed, robust, usable * how about iterative DELIVERY? * let's DEVELOP iteratively... * do the requirements and architecture design in a standard waterfall or prototyping aproach -- thus, if you will, finalizing the requirements early in the software life cycle -- * but then design and build and deliver the planned software in iterations * the building of the system -- one of the most time- and effort-consuming tasks -- is done iteratively, even though most the requirements are specified up-fron * potential advantages: * with requirements known up-front, you can hopefully write robust software for each iteration (with less throwing away of work from previous iterations) * but client doesn't have the worry of an all-or-nothing single delivery at the end -- and they get software they can start using earlier * (and if you are wrong about the requirements being done, feedback can be obtained letting you know this earlier, and in a less costly fashion, than would be possible with waterfall or prototyping) * potential disadvantages: * trying to nail down the requirements "too early" might blunt some of the benefit of having multiple iterations * (and there's the effort involved in coming up with those complete requirements up front...) ------------------------------- Rational Unified Process (RUP) ------------------------------- * created in 1996 * iterative, architecture-centric, use-case driven * 6 best practices: (Wikipedia on RUP) * develop software iteratively (risk-driven) * manage requirements * use component-based architecture * visually model the software (often via UML) * continuously verify software quality * control changes to the software * RUP is intended to be very FLEXIBLE, a framework for your project that can result in a process close to waterfall or close to agile or many possibilities in between * In RUP, a project is executed in a sequence of four phases: * we'll call this sequence of 4 phases a CYCLE * 1. inception 2. elaboration 3. construction 4. transition ...ends in a defined milestone, that's a deliverable product * inception - launching the current cycle * elaboration - address the major technical risks of the cycle * construction - moving from the executable architecture from the elaboration phase to a beta version ready for evaluation * transition - ends with the cycle release milestone -- get it to the users, ensure that it is working, evaluate to prepare for the next cycle ...release and evaluation; * one point here is RUP is trying to separate these phases from the TASKS traditionally performed in developing software; ...you could have MULTIPLE of these traditional tasks, in different levels of intensity, in the different phases; * that is, subprocesses of requirements, design, coding, testing, etc., are considered as active throughout the cycles of a project, although the intensity of each can vary from phase to phase within different cycles ------------------------------- Timeboxing ------------------------------- * to speed up development, employ parallelism between different iterations * does this mean working on different to-be-deliverable iterations at the SAME time? YES * really, uses the idea of PIPELINING * ...carefully set up, for a project suitable for such an approach! * basic unit of development: a time box, of FIXED duration * you decide what can be developed in this fixed duration, NOT "given these desired features, how long do we need?" * the time box is divided into a sequence of EQUAL-LENGTH stages * there is a dedicated team for each of those stages * each STAGE performs a clearly-defined task for the time box iteration, and produces a clearly-defined output; and, such that each stage is of the same duration (if 4 stages in a time box, set up so each stage takes 1/4 of the time of the time box; if 3 stages in a time box, set up so each stage takes 1/3 of the time of the time box) * and note: the people working on a stage work on *that* stage for different iterations of the time box, over and over; this does mean a BIGGER team of people, (more people for getting releases/iterations to the user more quickly) * takes the same amount of time for each iteration/deliverable, BUT using more people working in a pipelined-parallel fashion to get more frequent releases of those iterations to the users ...uses additional workforce to reduce delivery time; * (see the figures in Jalote Ch. 2 -- they illustrate this approach nicely;) * can be well-suited for projects with: * a LARGE number of features * needed in a SHORT time * around a STABLE architecture using STABLE technologies