On this page there are two topics: Pick a strategy that will pay off, and carefully choose an implementation strategy that is likely to work.
In most case we can not make a good choice of the best projects, or the best way to do a project without breaking it down into components and estimating the costs and benefits of different ways of developing or obtaining the components. This leads to cost-benefit analysis. Choosing the best development strategy and system architecture is often the key to a successful project. There many ways to implement one logical solution to a problem.
Physical Designs
Here is a table showing how different parts of the above Logical Design
have been implemented at various times. It is not a complete list
of the many attempts I've tried over the years... but it illustrates how a
physical architectures can implement a given logical system. I've also
omitted the various media and forms that "Syllabus etc" have taken through
the years.
Table
| Grades | Work | Grade Work | Submit Work | Return Work | Read Grades | Fix Errors |
|---|---|---|---|---|---|---|
| Paper | Paper | Pen, Paper | Manual | Manual | Ask the teacher | Manual |
| Paper | Paper | Pen, Paper,Calculator | Manual | Manual | Ask the teacher | Manual |
| Paper | Paper | Pen, Paper+Pascal Program | Manual | Manual | Ask the teacher | Manual |
| Hypercard Stack | Paper | Pen, Paper & Mac | Manual | Manual | Ask the teacher | Manual |
| UNIX Files | Paper | Pen, Paper & awk | Manual | Manual | Ask the teacher | Manual |
| Spread Sheet | Paper | Pen, Paper & PC | Manual | Manual | Ask the teacher | Manual |
| Spread Sheet | UNIX, vi & PC | Ask the teacher | Manual | |||
| Spread Sheet | Paper | Pen, Paper & PC | Manual | Manual | Web Pages | Manual |
| Spread Sheet | Paper | Pen, Paper in class | Manual | Manual | Web+PHP |
. . . . . . . . . ( end of section Example -- My Grading System) <<Contents | End>>
No Programming is good programming
Notice: In this class we don't want or need to work out how to code a
program -- it is better to find a way of not coding it at all!
Classic Processes
There are a lot of competing methods for changing systems and
one size does not fit all
situations. As a result I will not be following the traditional
list of phases and deliverables in these notes. For example it is traditional to
show you a diagram that shows six phases:
Some methods completely omit the Analysis above -- they go directly to an essential model (logical model) of what needs to change.
Some methods focus on one small fix at a time.... This is called evolutionary development or incremental development. When done well it handles changing or risky situations well (but not efficiently). However be aware that these are what cyberneticians call "Hill Climbing" algorithms. These tend to get stuck on top of "Hills" -- local optima -- where any small change makes the system worse. Under these circumstances the only thing to do is launch a big project to find a new part of the "systems landscape".
A compromise method focusses on just the parts of the system that need fixing before doing any modeling.
Selecting Strategies, system architectures and Initiating Projects
. . . . . . . . . ( end of section Background) <<Contents | End>>
Selecting Strategies and Architectures
In medium to large sized enterprises there will be a committee called a Steering Group who are tasked to select the projects that have time and money invested in them. They typically start with a list of Systems Requests from stakeholders. They have to resolve the political forces to classify projects (typically) in these categories list below:
The decision is based on ranking projects in terms of feasibility, efficiency, stability, security, needs, Cost/Benefit analysis(next), etc..
New Feature or Bug
Some development tools insist that you classify change requests into
either "Feature Requests" or "Bugs". You can argue that to a user, a
missing feature is a bug. So I don't think you should waste much time
on whether the request is a new feature or a bug. Instead get the
users to prioritize the requests and spend time estimating how much work
is needed to carry out the change. Then negotiate with the user about
which changes will be done next.
How do you overcome user resistance to change
The classic strategies include:
In a
Service Oriented
system the assembling of parts is done on the fly, as the software runs.
Different components can advertise their services on the Internet.
At any time a different set of components cooperate as parts of
the current system.
But this is a new technology.
Pattern -- Target risks early
Choose strategies that resolve unknowns, test new technology, test user
interfaces early ----- and often!
The first step is to have a pretty firm schedule for each strategy you are comparing.
Benefits typically follow a "Sigmoid" curve
Typically costs follow a Bathtub curve
Tangible costs and benefits have an obvious monetary value. A classic example would be computer equipment. An intangible costs and benefits tend to be hard to quantify. The classic intangible benefit is "goodwill". You can't touch it but the fact the customers have had good experiences with a company in the past has a value to the enterprise.
You start cost/benefit analysis by documenting all the benefits and costs for a project. If there are different projects you do a different list for each and compare the values at the end. Given a list of benefits and costs then there are two or three traditional ways of evaluating a project. Most of these can be calculated using simple spreadsheets. I'll show them (mostly) as tables in this document.
Here is an example of a small company that might invest in replacing their van by a new one:
We summarize this data in a table like this:
Table
| Time | Cost | Cumulative Cost | Benefit | Cumulative Benefit |
|---|---|---|---|---|
| Year 0 | 20000 | 20000 | 1200 | 1200 |
| Year 1 | 0 | 20000 | 1200 | 2400 |
| Year 2 | 0 | 20000 | 1200 | 3600 |
| Year 3 | 0 | 20000 | 1200 | 4800 |
| Year 5 | 0 | 20000 | 11200 | 16000 |
| Total | 20000 | - | 16000 | - |
If a project is worth tackling then there should come a time when the cumulative benefits outweigh the cumulative costs. This is called the Break Even point.
It is simple to calculate the break-even point and return-on-investment from a table like the one above. We can see that in this project there is no time in the 5 year plan when the benefits pay back the cost. Perhaps the project should run longer, or a cheaper way to pay for the van should be found.
The return-on-investment is calculated as
And in this example project the ROI is negative -- -20%.
A more sophisticated calculation is to find the cash-flow for each period. Where
Table
| Time | Cost | Benefit | Cash-flow |
|---|---|---|---|
| Year 0 | 20000 | 1200 | -18800 |
| Year 1 | 0 | 1200 | 1200 |
| Year 2 | 0 | 1200 | 1200 |
| Year 3 | 0 | 1200 | 1200 |
| Year 5 | 0 | 11200 | 11200 |
The above tables do not allow for the fact that money that arrives (or departs) in the future is not as valuable as today's money. Here is the key concept: the Present Value of Future Money. This is the money now you would give up now to get the given money in the future.
In the above calculation benefits and costs that will occur in the future are of less value than the money flowing in the present. There is even a well known formula to convert 2 birds in the bush into a bird in the hand. Money that is in the bank accumulates interest and so gains value as time goes one. So, if the interest rate is 6% then if you invested $100 now, then it would become say $106 in a years time. So $106 in one year is actually worth $100 today! Further, money that comes in or is spent in the future should be decreased in value to allow for the risk of it not happening. This is calculated using a current interest rate. It thus balances the value of a dollar in the bank today vs two dollars in the future. You can also discount risks by increasing the interest rate above the bank rate...
Example -- with a discount rate of 6% per year then $1 is worth different
amounts if it arrives or leaves in the future:
Table
| Years | PV (rounded to nearest cent) |
|---|---|
| 0 | 100 cents |
| 1 | 94 cents |
| 2 | 89 cents |
| 3 | 84 cents |
| 4 | 79 cents |
| 5 | 75 cents |
| 6 | 70 cents |
| 7 | 66 cents |
| 8 | 63 cents |
There is a formula that (called the present value (PV)) discounts the amount depending on how far in the future(t) the cash flow(c) is for a given rate (r) --
(No need to memorize this.... you'll find it in most spreadsheets).
For example, in the above example and assuming an interest rate of 6%
per year, the cost benefit analysis would be:
Table
| Time | Cost | Benefit | Cash-flow | Discount | Present Value(PV) |
|---|---|---|---|---|---|
| Year 0 | 20000 | 1200 | -18800 | 1 | -18800 |
| Year 1 | 0 | 1200 | 1200 | 1.06 | 1132 |
| Year 2 | 0 | 1200 | 1200 | 1.12 | 1068 |
| Year 3 | 0 | 1200 | 1200 | 1.19 | 1008 |
| Year 5 | 0 | 11200 | 11200 | 1.26 | 8871 |
| NPV | - | - | - | - | -6721 |
Conclusion: Definitely rethink this project... for example, lease a van rather than buy it, perhaps. Or, perhaps keep the van longer ( but the resell benefit will decrease..).
Here is a summary of the procedure for cost-benefit discounted cash-flow calcultaions.
| Time | Cost | Benefit | Cash-flow | Discount | PV |
|---|---|---|---|---|---|
| 0 | c0 | b0 | c0-b0 | 1 | c0-b0 |
| ... | |||||
| t | c | b | b-c | d | (b-c)/d |
| t+1 | c' | b' | b'-c' | d'=d*(1+r/100) | (b'-c')/d' |
| ... | |||||
| NPV | - | - | - | - | SUM(column above) |
The above calculations should be done for every alternative. In theory the one with the best cost/benefit is chosen. If not then at least you know what the more expensive choice may have cost the enterprise.
You can also use the above table to calculate a Discounted ROI and discounted Break-Even figures that will be more pessimistic than the original.
Summary -- Procedure -- Cost-Benefit Analysis
Notice the preliminary report develops easily
from a less complex "Project Scope" document -- if you did one.
Initiating Projects
Once your Business Case has been accepted and the project approved you will have a lot of things to do to "kick off" the project. Here is a quick check list:
Here are some useful tools when modeling designs:
What is an Artifact
This is the current jargon for anything you produce while developing a
system -- including diagrams, documents, ... and code.
A very useful thing to say: "What I hear is ..." and then describe objectively and fairly what you've seen happening in the meeting: "Jim say A, but Joan says B."
Stand Up Meetings
This is a technique from the "Scrum" agile development method. A standup
meeting is very simple, informal and short. First: nobody sits down!
Second: Management keeps quiet. Third the developers, in turn,
report their progress and where they are blocked. There can be some
discussion of what to do.... management listens to find ways to
remove blocks.
Technique -- JAD Workshop
Technique -- Walk through
(Walk-through): a group meeting that looks for errors in an artifact that is lead by one of the producers of the artifact.
Process:
Notes:
. . . . . . . . . ( end of section Tool -- Meetings) <<Contents | End>>
. . . . . . . . . ( end of section Initiating Projects) <<Contents | End>>
What are the most important IT steps to help a company survive its critical first years.
What an excellent question -- and I wish I was competent to give a definitive
answer.
(1) you need a product or service, a way to advertise it, a way to deliver it, control systems, a way to scale up, ..., In other words: you need a Business Plan.
(2) A classic rule of thumb is that you must have enough money or credit to operate for 3 years without a profit!
Many years ago I looked into starting a business developing and selling games for the new "Personal Computers" that were coming on the market. When I analyzed the business model, I realized that piracy would be a gigantic drain on the company... in fact I'd have to spend more time and effort defending my intellectual property than developing (and playing) games. So, I decided to work for the UK Civil Service instead... and wrote a few games as a hobby.
When I started up a consulting company in the 1980s the two legal requirements were a bank account and an accounting system. This is for a California Sole Proprietorship. The bank account was easy. And I figured out that the old fashioned accounting system would be good enough. I used an old paper based accounting procedure based on a couple of books: a journal of credits and debits, a paste book of receipts and invoices, and a list of assets.
Some of following will be needed for any new company.
. . . . . . . . . ( end of section Development Strategies) <<Contents | End>>
The commonest techniques are the Walk-through and Inspection above.
The key thought is: (1) figure out what you are doing.
(2) Document it.
(3) Enforce it.
(4) Control it.
(5) Improve it.
What is the Defined level of Capability Maturity Model CMM
Prior to the defined level things are done in a routine way
but the procedures are folk law and not fully documented.
Black box tests are derived from the specification of the system under test not the finished code. They can be worked out before the code is written. The place to look for tests are the functional requirements. So system level tests should be derived from the scenarios and use cases for the system. Each test should be a particular scenario of the use case... and every scenario needs to be tested at least once.
White box tests
are written after examining the code and aim to exercise
every part of the code at least once.
Here is a list of the minimum set of white-box tests:
Performance testing.
Here you input a particular load
to the system under test and see how fast it handles it. For example
you use a script to input 25 requests in a second to a PHP script and see
how long it takes to complete them.
Are benchmarks used at all?
Yes. This is Performance testing.
Who invented test driven development TDD
I think it was Kent Beck as part of the XP package.
How does TDD work
Demo in class of C++ test driven development of a class.
Basically you need to accept that you are going to have a lot of errors
to fix because initially the tests won't even compile. But one test
at a time you change the code until it compiles, and then change it
until
all the tests produce the correct result.
How can you devise a test before you actually produce the product.
The first step is to figure out how to automate tests. This may involve
some form of scripting -- shell or other tools. Then all you have to do is
write the tests as data and/or programs.
I also demonstrated the 'make' tool and Makefiles -- these make it
easy to automate testing on UNIX.
How does a unit test find out if a component is working up to its specification?
The test is a program that executes the methods of the component and looks
at the results of the execution.
In class I demonstrated using the C/C++ 'assert' function from the <cassert> library. This is an excellent tool for writing programs that do unit tests. For example [ ttest.cpp ] tests the class Counter [ counter.cpp ] to see if it works as specified.
Notice that the tests are a very good way to document typical ways to use the component.
In Java there is JUnit...
. . . . . . . . . ( end of section Testing) <<Contents | End>>
Documentation = Producing Artifacts
Garbage In; Garbage Out.is still true. So clean the data: review it, use programs to look for odd and bad data.
One thing to watch out for is different character codes. In my experience the 3 or 4 different code sequences used to indicate "end of line" is the most problematic. MacOS, UNIX, and MSWindows use different conventions.
Also watch out for the ASCII vs UNICODE vs EBCDIC(OLD) differences.
However most systems provide tools to convert codes, or you can write one or pervert an existing tool. For example, my MS WordPerfect automatically converts UNIX text to Windows text.
. . . . . . . . . ( end of section Data Conversion) <<Contents | End>>
Installation plans and change over
| Name | Strategy | Cost | Risk | |
|---|---|---|---|---|
| Cut Over or Big Bang | The legacy system is shut down and the new system starts up and replaces it. | Lowest | Highest | 1 |
| Pilot Operation | A part of the enterprise uses the new system while the rest uses the old one. Once the bugs are removed the old is replaced by the new in the whole organization. | Medium | Medium | 2 |
| Phased Operations | Parts of the legacy system are replaced by new parts. | Medium | Medium | 3 |
| Parallel Operation | The legacy system is left running and the new one introduced. In time the old system is shutdown. | Highest | Lowest | 4 |
| - | Low Cost | Medium Cost | High Cost |
|---|---|---|---|
| Low Risk | - | - | 4 |
| Medium Risk | - | 2,3 | - |
| High Risk | 1 | - | - |
. . . . . . . . . ( end of section Installation plans and change over) <<Contents | End>>
Project Evaluation and Post Mortem
. . . . . . . . . ( end of section Implementation) <<Contents | End>>
Online Exercises
Story -- What caused the dot.com bust
A "dot.com" is one of a large number of firms that appear in the 1990's
and vanished in the 2000's that used the Internet as an enabling
tool. They all had a web pressence in the ".com" (commercial) domain of the
Internet. Hence the name "dot" "com".
A lot of software companies suddenly failed ... but what mistakes did
they make: Technical or Nontechnical?
See
[ 506732.506734 ]
Cost Benefit on the Wikipedia
[ Cost-benefit ]
[ Rate_of_return_on_investment ]
[ Net_present_value ]
More on Meetings
[ meetings.txt ]
from "Software Development Magazine".
Where is most outsourced work going
The standard answer is "India" for IT. I went in search of data and found
[ ? ]
as a place to monitor news about outsourcing.
CMM and ISO on the Wikipedia
[ Capability_Maturity_Model ]
[ ISO9000 ]
Test data that you convert
[ dont_ignore_you.html ]
(intro) and
[ 193402922;jsessionid=P4NXOU45CUCFWQSNDLPSKHSCJUNN2JVN ]
(Scott Ambler's analysis).
. . . . . . . . . ( end of section Online Exercises) <<Contents | End>>
Further Resources
. . . . . . . . . ( end of section Strategic Thinking) <<Contents | End>>
Abbreviations
Also see [ glossary.html ] for more special abbreviations and phrases.