Lecture 3 - Working Products

advertisement
Working Products
Lecture 3
CIS 6101 – Software Processes and
Metrics
Introduction
• A working product at all times should be the ultimate goal for
every software team.
• If far away, it’ll take time to get product back to a working state.
• Working Product does not mean product is feature-complete
or that all features are done.
• Idea is to show product to customer (maybe for use) with the
minimum possible number of unexplainable errors.
• Such working products are said to be ‘essentially shippable,’
because the product could be shipped after a short period of
verification testing and stabilization.
37
2
Working Product vs Working Software
• Working Product is meant to include not only the
working software but also:
– explicit deliverables such as documentation,
supporting infrastructure / web-site info and
– implicit deliverables such as expectation that there
has been testing before the customer sees the
product.
• Working Software is thus only a part of the
working product.
37
3
Working Product Every Day (1/2)
• A working product is an underpinning of agile software development.
• Agile development demands ability to get continual customer feedback.
– Only way is to keep customers interested and provide working software on a
regular basis.
– Says to customers that ‘this’ is a product they can rely upon.
• Working product gives the team an incredible amount of flexibility
– to change directions and ability
– to take / ship current version of software w/critical features the market
demands.
• Gives ‘power’ to development team from
– Feeling in control, and using that control to respond to changing situations.
37
4
Working Product Every Day (2/2)
• By having a working product every day and
fixing defects as you go :
– allows teams to focus on the customers,
– reduces the buildup of technical debt in the
product, because chances are very high that
problems are caught as soon as possible.
37
5
Working Products and Quality
• To keep a product in a working state, teams need
to focus on the quality of everything they do!
• When product is in a non-working state and
changes are being made to it, technical debt is
accumulating – a debt to be repaid later..
• Cost of fixing errors increases with time
• As well as increased probability multiple
problems will show up in the final product
37
6
Putting Things into Perspective
• To the team: What does it mean to ‘ship’
product every day to customers?
– Ship means provide daily updates or a complete
new version of the software to install.
• Here are some issues:
• And these are VERY REAL ISSUES if you desire
to ‘ship’ proucts to customer every day…
37
7
Issues Shipping Every Day (1 of 4)
• Quality Assurance and Testing become critical
– Ship every day?
• One person cannot do all testing  automate as much
testing as possible
•  testing is threaded throughout development; integral
to the process. Not an afterthought…
• Implies designing product and features for testability now
as opposed to testing later. Need people available.
– Discuss: How do you design for testing???
37
8
Issues Shipping Every Day (2 of 4)
• Is your documentation and web site going to
be ready to reflect the new changes every day?
– Need to work out automated way of updating web
site while ensuring documentation
• can be loaded off the Internet and not just the local hard
drive (i.e., updated live)
37
9
Issues Shipping Every Day (3 of 4)
• Must have your act together:
• What happens when customer finds problem?
– How to report to you?
– How to prioritize for urgent fixes?
– How to minimize chances defect is fixed reliably w/o
breaking something else?
• When customer reports problem,
37
– How to let customer know status of fix?
– Let them know status of defect on line and when to
expect fixes?
10
Issues Shipping Every Day (4 of 4)
• How to develop features that take a long time?
– Wrong answer: wait until feature is complete and integrate
– Find way to integrate features in piecemeal while ensuring
product still works while telling users what to expect every day.
• E.g. old A, C, D transactions. Let them try out the Add first….
– Get input from customers on the new features as they progress.
• What if critical feature breaks in a daily release?
– Customers must be able to easily report problem to you and
back up to the previous day’s version while they wait for a fix.
– Now you need to demonstrate responsiveness to your
customers, because this is costing them money and time.
37
11
Goal of Exercise – Ship Frequently
• Ship product to customers as frequently as possible.
• Shipping encourages teams to minimize their overhead
while maximizing productivity so they can ship frequently
and implement the features the customers need.
• Shipping often is the ultimate goal.
• May be only possible to ship once a week or once a month
• Avoid only being able to ship a couple of times a year.
• Important to ship and get your software installed and used
on real problems as frequently as possible.
37
12
Examples – Several Update Very
Frequently
• Eclipse – a reliable update mechanism is built
into the software so that updates can be made
at any time.
• Renderware is a commercial game engine
produced by Criterion that ships weekly
• Norton Anti-Virus is updated whenever a new
virus has been detected on the Internet
• Microsoft regularly provides updates to
Windows and Office tools. Its updates work.
37
13
Counter Examples: Mission-Critical
Apps
• Not too practical for mission-critical systems
where systems must be installed only after
considerable caution.
• But most systems are NOT mission-critical.
37
14
Practices for Working Products
• 1. No Broken Windows (read on your own)
•  2. Be uncompromising about Defects!
•  3. Barely Sufficient Documentation
37
15
Practice 1 – No Broken Windows
• Easy to make changes in a sloppy, haphazard way.
• Once one sloppy change has been made, others will follow.
• Never start the decay.
• Clean up bad code immediately.
• Ugly workarounds cause problems and are a symptom that
the product is most likely not in a working state.
37
16
Practice 2 – Be Uncompromising about Defects
• Avoid a defect backlog! (List of Open Defects)
• Defect backlogs burden teams with repetitive
searching, sorting, categorizing tasks
– Huge maintenance / management tasks here too!
– Takes away from productive work.
• A defect backlog makes it more difficult to find
defects that MUST be fixed.
37
17
Practice 2 – Defect Backlog – continued (2 of 3)
• A defect backlog is a strong indicator
– new features are being developed on top of defective
code.
• Longer the backlog:
– greater probability backlog may never be eradicated.
– greater probability defects shipped to customers.
– greater time between defect introduced and fixed.
the greater the cost to fix it.
• Why do you think this is so?
37
18
Practice 2 – Defect Backlog – Continued (3 of 3)
• Be ruthless.
– Decide to quickly fix it or mark that you won’t.
– Once decided to fix, do so as quickly as possible.
• Fix regressions immediately!
– Do before any other changes are made to product.
• Fix all known defects in a new feature before
moving on to work on the next feature.
37
19
Practice 3: “Barely Sufficient” Documentation (1 of 3)
• So teams can concentrate on a working product,
produce a minimal amount of time writing documents
that are not part of the product, such as requirements
and design documents.
– Note: Talking about minimizing ‘internal documentation.’)
– External documentation such as help and feature
documentation is required by customers and should be
considered as features.
• Barely Sufficient Documentation is a feature of agile
development.
37
20
Practice 3: “Barely Sufficient” Documentation (2 of 3)
• Sometimes documentation is required before a
project can move on
• But this imposes a linearity in development
which is unhealthy and unrealistic.
• Focus on what matters the most: working
products.
• Customers often don’t really know what they
want until they see it.
37
21
Practice 3: “Barely Sufficient” Documentation (3 of 3)
• Examples of Barely Sufficient documentation:
– Use of index cards for feature description
• To describe essential facts
• Gives something tangible for hands to discuss.
– Collection of feature cards
• Should be adequate documentation of requirements.
– Design software collaboratively in front of a
whiteboard. Great discussions!
– Alternatively, use a sketchbook.
– Put design details like relationships and code
rationale w/source code (where it can easily be kept
up to date) and extract them when using a tool such
as JavaDoc.
37
22
Dangers of Excessive Documentation
• In a heavyweight development process, every
feature had to be documented – every
requirement, functional specifications, design
documents, written test plans… bookshelves
where kept.
• Review meetings held for each document.
• Progress was very slow – revising, reviewing…
37
23
Practices for Working Products
•  4. Continuous Integration
•  5. Nightly Builds
•  6. Prototypes
37
24
Practice 4: Continuous Integration
• Continuously integrate changes together.
• Frequent integration ensures modules fit, and
product continues to work with the changes.
• Developers should integrate their work every
day or many times a day.
• Naturally, your team needs automated testing
to help catch integration problems.
37
25
Practice 5: Nightly Builds
• Completely build your software one or more times per
day including as many automated tests as possible to
catch integration problems early.
• Should be an installable product image always ready.
• If build fails, fix first thing in morning!
• No further integration until fix is done!!
• Builds should be fast;
– if not, something is wrong with the structure of the
product; module dependencies, modules too large; worst
of all, duplicated or unnecessary code
37
26
Practice 6 – Prototyping
• Prototype solutions to risky problems
– helps increase chance of having a working product.
• Prototyping is an inexpensive way to try out
new ideas so that successful implementation is
more likely later.
37
27
Practice 6 – Prototyping the ‘True Prototype’
– The True Prototype
– Here we test an implementation is used to understand a
problem before it is implemented for real.
– Prototype to get understanding of the risk
• Perhaps prototype a solution to a problem to gain greater
confidence you understand the problem.
• Great for trying out risky features!
– You also have an implementation to borrow from, even if
it is only ideas, when implementing the complete solution.
– Doesn’t have to be software
• Can be a paper prototype, white board, w sticky notes for
buttons / pull-down menus..
37
28
Practice 6 – Prototyping the ‘True Prototype’
• A prototype is a quick and dirty implementation
that explores key target areas of a problem.
– Should not be production ready nor complete
implementation of desired solutions.
– Use as a reference only when implementing the
complete solution to a problem.
– Might even be implemented in a scripting language
such as Python or Ruby to save time.
– But recognize that they are a point of reference only
when implementing the complete solution to a
problem.
• Downside – show to customers to demonstrate
progress; they feel product appears done – even
though some of what they see may be hardcoded!
37
29
Practices for Working Products
• 7. Don’t neglect Performance
• 8. Zero Tolerance for Memory and Resource
Leaks
•  9. Coding Standards and Guidelines
37
30
Practice 7 – Don’t Neglect Performance
• Passionate feelings:
– Some: strive for code clarity more than
performance; then optimize the one to three
percent of code that needs it.
– Others: code for performance first, because if you
don’t, you code will always be slow.
– Code clarity should be first, but not at the
expense of performance.
– You must be concerned with performance and
with clarity, with a strong bias toward the latter.
37
31
Practice 8: Zero Tolerance for Memory
and Resource Leaks
• If your environment (language, environment) does experience leaks,
have zero tolerance!
• Resource leaks lead to unpredictable behavior such as program crashes,
that can be exploited by hackers to compromise your customer’s
computers.
• Unfortunately, some lower level APIs that your application may use may
leak memory. What does it mean to ‘leak memory?’
– You might free allocated resources if you can; sometimes you cannot.
• Sometimes in large applications when they stop it may take time for the OS to
recover the available memory.
• Lots of issues here.
• Try to avoid memory leaks as much as you can.
• Some APIs hook up to your application to start and stop leak detection.
– Note: no memory leak is acceptable. Not true that only the big ones count.
– A leak can put up a fence around the application’s primary memory such
that the system cannot reuse that memory. Not good.
37
32
Practice 9 – Coding Standards and
Guidelines
• What is good code and what coding practices team
members like / dislike.
• Get team members to agree on practices / conventions;
consistent coding conventions that make code easier to
read / understand.
• Useful for others who join the team, as these will likely
not be updated.
– USAF: AFDSDC 300-8; The Software Development Process.
– AFM 300-4, Data Elements and Codes.
37
33
Practice 10 – Adopt Standards
• Don’t reinvent the wheel.
• Reuse as much as possible via ‘value-added.’
• One plum nowadays is Open Source. Lots of software
available.
• What Open Source is doing is significant.
• Solutions can be offered.
• Look at IBM: Eclipse IDE is open source project, but Ibm
also uses Eclipse as a foundation for its own commercial
products and allows third parties to develop their own
commercial products on top of Eclipse. Being a free IDE has
created a large community of developers who are
comfortable with Eclipse and are also potential buyers of
IBM’s other tools.
37
34
Practices for Working Products
•  11. Internationalize from the Start
•  12. Isolate Platform Dependencies
37
35
Practice 11 – Internationalize from Day One.
• Get into the habit of ensuring your products are
internationalized.
• No extra overhead once you learn what is required.
• Most growth is expected outside of English-speaking
nations.
• Implication is obvious. Think globally!
37
36
Practice 12 – Isolate Platform Dependencies
• If your code must support multiple platforms, a clean
separation between
– platform-specific code and
– all the other code
– is essential to have software that can be easily kept in a
working state.
• Examples dependencies:
– operating systems, graphic subsystems, runtime
environments, libraries, and user interface toolkits.
• Isolate platform dependencies via an abstract interface,
such as a Façade design pattern) to that the majority of
the software is isolated from the platform-dependent
code.
37
37
Download