SEN 507 - Software Engineering Practices and Software Modeling Practices Topics
SEN 507 - Software Engineering Practices and Software Modeling Practices Topics
Practices topics:
» SOFTWARE ENGINEERING PRACTICE
» CORE PRINCIPLES
» COMMUNICATION PRACTICES
» PLANNING PRACTICES
» MODELING PRACTICE
» CONSTRUCTION PRACTICE
SOFTWARE ENGINEERING PRACTICE
In this part of “software engineering; a practitioner’s approach” you’ll learn about the
principles, concepts, and methods that comprise software engineering practice. These
questions are addressed in the chapters that follows:
Once these questions are answered you’ll be better prepared to apply software
engineering practice.
In a book that explores the lives and thoughts of software engineers, Ellen Ullman
depicts a slice of life as she relates the thoughts of practitioner under pressure.
I have no idea what time it is. There are no windows in this office and no clock, only
the blinking red LED display of a microwave, which flashes 12.00, 12.00, 12.00,
12.00. Joel and I have been programming for days. We have a bug, a stubborn demon
of a bug, so the red pulse no-time feels right, like a read-out of our brains, which have
somehow synchronized themselves at the same blink rate…..
What are we working on?..... The details escape me just now. We may be helping
poor sick people or tuning a set of low- level routines to verify bits on a distributed
database protocol- I don’t care. I should care very much why and for whom and for
what purpose I am writing software. But just now: no. I have passed through a
membrane where that real world and its uses no longer matter. I am a software
engineer…..
A dark image of software engineering practice to be sure, but upon reflection, many of
the readers of this book will be able to relate to it.
People who create computer software practice the art of craft or discipline that is
software engineering. But what it software engineering “practice”? In a generic sense,
practice is a collection of concepts, principles, methods, and tools that a software
engineer calls upon on a daily basis. Practice allows managers to manage software
projects and software engineers to build computer programs. Practice populates a
software process model with the necessary technical and management how-to get the
job done. Practice transforms a haphazard unfocused approach into something that is
more organized, more effective and more likely to achieve success. Some writers
argue for one of these terms to the exclusion of the others. In reality, software
engineering is all three.
What is it? Practice is a broad array of concepts, principles, methods, and tools that
you must consider as software planned and developed. It represents the details-the
technical considerations and how to—that are below the surface of the software
process: the things that you’ll need to actually build high-quality computer software.
In a classic book, How to Solve It, written before modern computes existed, gorge
Polya outlined the essence of problem solving, and consequently, the essence of
software engineering practice:
In the context of software engineering, these common sense steps lead to a series of
essential questions.
CORE PRINCIPLES
The dictionary defines the word principle as “an important underlying law or
assumption required in a system of thought.” Throughout this book we discuss
principles at many different levels of abstraction. Some focus on software engineering
as a whole, others consider a specific generic framework activity (e.g., customer
communication), and still others focus on software engineering actions (e.g.,
architectural design) or technical tasks (e.g., write a usage scenario). Regardless of
their level of focus, principles help us establish a mind set for software engineering
practice. They are important for that reason.
David Hooker has proposed seven core principles that focus on software engineering
practice as a whole. They are reproduced below.
If every software engineer and every software tam simply followed hooker’s seven
principles, many of the difficulties we experience in building complex computer based
systems would be eliminated.
COMMUNICATION PRACTICES
Before customer requirements can be analyzed, modeled, or specified they must be
gathered through a communication (also called requirements elicitation) activity. A
customer has a problem that may be amenable to a computer- based solution. A
developer responds to the customer’s request for help. Communication has begun. But
the road from communication to understanding is often full of potholes.
Effective communication (among technical peers, with the customer and other
stakeholders, and with project managers) is among the most challenging activities that
confront software engineer. In this context, we discuss communication principles that
apply equally to all forms of communication that occur within a software project.
Principle #8: (a) Once you agree to something, move on; (b) If you can’t agree to
something, move on; (c) If a feature or function is unclear and cannot be clarified
at the moment move on. Communication, like any software engineering activity,
takes time. Rather than iterating endlessly, the people who participate should
recognize that many topics require discussion (see principle #2) and that “moving on”
is sometimes the best way to achieve communication agility.
Principle #9: Negotiation is not a contest or a game. It works best when both
parties win.
There are many instances in which the software engineer and the customer must
negotiate functions and features, priorities, and delivery dates. If the team has
collaborated well, all parties have a common goal. Therefore, negotiation will demand
compromise from all parties.
2. Meet with primary customer to address “context free questions” that define.
• Business need and business values.
• End-users’ characteristics / needs.
• Required user- visible outputs.
• Business constraints.
3. Develop a one- page written statement of project scope that is subject to revision.
6. Develop a brief written description (e.g., a set of lists) of scenarios, output/ inputs,
features/ functions and risks.
7. Iterate with customer- defined priorities to each user scenario, feature, function, and
behavior.
8. Assign customer- defined priorities to each user scenario, feature, function, and
behavior.
9. Review all information gathered during the communication activity with the
customer and other stakeholder and armed as required.
Software engineers communicate with many different stakeholders, but customers and
end-users have the most significant impact on the technical work that follows. In some
cases the customer and the end-user are one and the same, but for many projects, the
customer and the end-user different people, working for different managers in
different business organizations.
A customer is the person or group who: (1) originally requested the software to be
built; (2) defines overall business objectives for the software; (3) provides basic
product requirements; and (4) coordinates funding for the project. In a product or
system business, the customer is often the marketing department. In an IT
environment, the customer might be a business component or department.
And end-user is the person or group who: (1) will actually use software that is built to
achieve some business purpose, and (2) will define operational details of the software
so that the business purpose can be achieved.
PLANNING PRACTICES
The communication activity helps a software team to define its overall goals and
objectives (subject, of course, to change as time passes). However, understanding
these goals and objectives is not the same as defining a plan for getting there. The
planning activity encompasses a set of management and technical practices that
enable the software tam to define a road map as it travels towards its strategic goal
and technical objectives.
Dwight D. Eisenhower: “In preparing for battle I have always found that plants are
useless, but planning is indispensable.”
There are many different planning philosophies. Some people are “minimalists,
“arguing that change often obviates the need for a detailed plan. Others are
“traditionalists,” arguing that the plan provides an effective road map, and the more
detail it has, the less likely the team will become lost. Still others are “agilists,”
arguing that quick “planning game” may be necessary, but that the road map will
emerge as “real work” on the software begins.
What to do? On many projects, over planning is time consuming and fruitless (too
many things change), but under planning is a recipe for chaos. Like most things in
life, planning should be conducted in moderation, enough to provide useful guidance
for the team- no more, no less.
Regardless of the rigor with which planning is conducted, the following principles
always apply.
Principle #1: Understand the scope of the project. It’s impossible to use a road map
if you don’t know where you’re going. Scope provides the software.
Principle #3: Recognize that planning is iterative. As work begins, it is very likely
that things will change. As a consequence, the plan must be adjusted to accommodate
these changes. In addition, iterative and incremental process models dictate re-
planning based on feedback received from users.
Principle #5: Consider risk as you define the plan. If the team has defined risks that
have high impact and high probability, contingency planning is necessary.
Principle #6: Be realistic. People don’t work 100 percent every day. Noise always
enters into any human communication. Omission and ambiguity are facts of life.
Change will occur. Even the best software engineers make mistakes. These and other
realities should be considered as a project plan is established.
Principle #7: Adjust granularity as you define the plan. Granularity refers to the
level of detail that is introduced as a project plan is developed. A “fine granularity”
plan provides significant work detail that is planned over relatively short time
increments.
Principle #8: Define how you intend to ensure quality. The plan should identify
how the software team intends to ensure quality. If formal technical reviews are to be
conducted, they should be scheduled.
Principle #9: Describe how you intend to accommodate change. Even the best
planning can be obviated by uncontrolled change. The software team should identify
how changes are to be accommodated as software engineering work proceeds.
Principle #10: Track the plan frequently and make adjustments are
required. Software project falls behind schedule one day at a time. Therefore, it
makes sense to track progress on a daily basis, looking for a problem areas and
situation in which scheduled work does not confirm to actual work conducted. When
slippage is encountered, the plan is adjusted accordingly.
Why is the system being developed? All parties should assess the validity of
business reasons for the software work. Stated in another way, does the business
purpose justify the expenditure of people, time, and money?
What will be done? Identify the functionality to be built, and by implication, the task
required to get the job done.
Where they are organizationally located? Not all roles and responsibilities reside
within the software tam itself. The customer, users, and other stakeholders also have
responsibilities.
How will the job be done technically and managerially? Once product scope is
established, a management and technical strategy for the project must be defined.
The answers to the above questions are important regardless of the size of complexity
of a software project. But how does the planning process begin?
Tom De Marco: “we think that software developers are missing a vital truth: most
organizations don’t know what they do. They think they know, but they don’t know.”
Two classes of models are crated: Analysis models and design models. Analysis
models represent the customer requirements by depicting the software in three
different domains: the information domain, the functional domain, and the behavioral
domain. Design models represent characteristics of the software that help practitioners
to construct it effectively.
Principle #2: The functions that the software performs must be defined. Software
functions provide direct benefit to visible end-user. Some functions transform data
that flow into the system; in other cases, functions effect some level of control over
internal software processing or external system elements.
Principle #4: The models that depict information, function, and behavior must be
partitioned in a manner that uncovers detail in a layered fashion. Analysis
modeling is the first step in software engineering problem solving. It allows the
practitioner to understand the problem better and establishes a basis for the solution
(design). Complex problems are difficult to solve in their entirety. For this reason, we
use a divide and conquer strategy. A large, complex problem is divided into sub-
problems until each sub- problem is relatively easy to understand. This concept is
called partitioning, and it is a key strategy in analysis modeling.
Principle #5: The analysis task should move from essential information toward
implementation detail. Analysis modeling begins by describing the problem from the
end-user’s perspective. The “essence” of a problem is described without any
consideration of how a solution will be implemented.
Principle #1: Design should be traceable to the analysis model. The analysis model
describes the information domain of the problem, uses visible functions, system
behavior, and a set of analysis classes that package business objects with the methods
that service them. The design model translates this information into an architecture, a
set of subsystems that implement major functions, and a set of component- level
designs that realize analysis classes.
Principle #4: Interfaces (both internal and external) must be designed with
care. The manner in which data flow between the components of a system has much
to do with processing efficiency, error propagation, and design simplicity, A well
designed interface integration easier and assists the tester in validating components
functions.
Principle #5: User interface design should be tuned the needs of the end-
user. However, in every case, it should be stress free and easy to use. The user
interface is the visible manifestation of the software. A poor interface design often
leads to the perception that the software is “bad”.
Principle #7: Components should be loosely coupled to one another and to the
external environment. Coupling is achieved in many ways-via component inter-face,
by messaging and through global data. As the level of coupling increases, the
likelihood of error propagation also increases and the overall maintainability of the
software decreases. Therefore, component coupling should be kept as low as is
reasonably possible.
Principle #9: The design should be developed iteratively. With each iteration, the
designer should strive for greater simplicity. Like most of the creative activities,
design occurs iteratively. The first iteration works to refine the design and correct
errors, but later iterations should strive to make the design as simple as is possible.
CONSTRUCTION PRACTICE
The construction activity encompasses a set of coding and testing task that lead
operational software that is ready for delivery to the customer or end-user. In modern
software engineering work, coding may be: (1) the direct creation of programming
language source code; (2) the automatic generation of source code using an
intermediate design-like representation of the component to be built; (3) the automatic
generation of executable code using a fourth generation programming language.
Validation principles: After you’ve completed your first coding pass, be sure you:
1. Build architectural infrastructure,
Review the architectural design.
Code and test the components that enable architectural infrastructure.
Acquire reusable architectural patterns.
Test the infrastructure to ensure interface integrity.
Testing Principles:
In a classic book on software testing, Glen Myers states a number of rules that can
serve well as testing objectives:
These objectives imply a dramatic change in viewpoint for some software developers.
They move counts to the commonly held view that a successful test is one in which no
errors are found. Our objective is to design tests that systematically uncover different
classes of errors and to do with a minimum amount of time and effort. These errors
can be corrected subsequently.
Davis suggests a set of testing principles that have been adapted for use in this book:
Principle #2: Tests should be planned long before testing begins. Test planning
can began as soon as the analysis model is complete. Detailed definition of test cases
can begin as soon as the design model has been solidified. Therefore, all tests can be
planned and designed before any code has been generated.
Principle #3: The pare to principle applies to software testing. Stated simply, the
Pareto principle implies that 80 percent of all errors uncovered during testing will
likely be traceable to 20 percent of all program components. The problem, of course,
is to isolate these suspect components and to thoroughly test them.
Principle #4: Testing should begin “in the small” and progress toward testing “in
the large”. The first tests planned and executed generally focus on individual
components. As testing progresses, focus shifts in an attempt to find error in
integrated clusters of components and ultimately in the entire system.
Principle #5: Exhaustive testing is not possible. The number of path permutations
for even a moderately sized program is exceptionally large. For this reason, it is
impossible to execute every combination of paths during testing. It is possible,
however, to adequately cover program logic and to ensure that all conditions in the
component- level design have been exercised.
Deployment
The deployment activity encompasses three actions delivery, support, and feedback.
Because modern software process models are evolutionary in nature, deployment
happens not once, but a number of times as software moves towards completion. Each
delivery cycle provides the customer and end-users with an operational software
increment that provides usable functions and features. The delivery of a software
increment represents an important milestone for any software project. A number of
key principles should be followed as the team prepares to deliver an increment:
Principle #5: Buggy software should be fixed first, delivered later. Under time
pressure, some software organizations deliver low-quality increments with a warning
to the customer that bugs “will be fixed in the next release”. This is a mistake. There’s
a saying in the software business: “Customer will forget you delivered a high- quality
product a few days late, but they will never the problems that a low-quality product
caused them. The software reminds them everyday.”
Summary
1. The various principles that are discussed in this chapter are the guidelines for a
better software engineering practices.
2. If every software engineering and software team follows the Hooker’s seven
principles, then many of the difficulties in building the complex system can be solved.
3. The planning activity encompasses a set of management and technical practices that
enable the software team to define a road map as it travels towards its strategic goal
and tactical objectives.
medicine, education, entertainment and society at large. Software engineers are those
that their efforts will be used for good, software engineers must commit themselves to
that commitment, software engineers shall adhere to the following Code of Ethics and
Professional Practice.
The Code contains eight Principles related to the behavior of and decisions made by
supervisors and policy makers, as well as trainees and students of the profession. The
and organizations participate and the primary obligations within these relationships.
The Clauses of each Principle are illustrations of some of the obligations included in
these relationships. These obligations are founded in the software engineer’s humanity,
in special care owed to people affected by the work of software engineers, and the
unique elements of the practice of software engineering. The Code prescribes these as
It is not intended that the individual parts of the Code be used in isolation to justify
errors of omission or commission. The list of Principles and Clauses is not exhaustive.
The Clauses should not be read as separating the acceptable from the unacceptable in
professional conduct in all practical situations. The Code is not a simple ethical
tension with each other or with standards from other sources. These situations require
the software engineer to use ethical judgment to act in a manner, which is most
consistent with the spirit of the Code of Ethics and Professional Practice, given the
circumstances.
principles, rather than blind reliance on detailed regulations. These Principles should
examine if they and their colleagues are treating other human beings with due respect;
41
to consider how the public, if reasonably well informed, would view their decisions; to
analyze how the least empowered will be affected by their decisions; and to consider
whether their acts would be judged worthy of the ideal professional working as a
software engineer. In all these judgments concern for the health, safety and welfare of
the public is primary; that is, the "Public Interest" is central to this Code.
The dynamic and demanding context of software engineering requires a code that is
adaptable and relevant to new situations as they occur. However, even in this
generality, the Code provides support for software engineers and managers of software
engineers who need to take positive action in a specific case by documenting the ethical
stance of the profession. The Code provides an ethical foundation to which individuals
within teams and the team as a whole can appeal. The Code helps to define those actions
engineers.
The Code is not simply for adjudicating the nature of questionable acts; it also has an
important educational function. As this Code expresses the consensus of the profession
on ethical issues, it is a means to educate both the public and aspiring professionals
PRINCIPLES
Principle 1: PUBLIC
Software engineers shall act consistently with the public interest. In particular, software
1.02. Moderate the interests of the software engineer, the employer, the client and the
1.03. Approve software only if they have a well-founded belief that it is safe, meets
specifications, passes appropriate tests, and does not diminish quality of life, diminish
privacy or harm the environment. The ultimate effect of the work should be to the
public good.
1.04. Disclose to appropriate persons or authorities any actual or potential danger to the
user, the public, or the environment, that they reasonably believe to be associated with
1.05. Cooperate in efforts to address matters of grave public concern caused by software,
1.06. Be fair and avoid deception in all statements, particularly public ones, concerning
42
disadvantage and other factors that can diminish access to the benefits of software.
Software engineers shall act in a manner that is in the best interests of their client and
employer, consistent with the public interest. In particular, software engineers shall, as
appropriate:
2.01. Provide service in their areas of competence, being honest and forthright about
2.02. Not knowingly use software that is obtained or retained either illegally or
unethically.
2.03. Use the property of a client or employer only in ways properly authorized, and
2.05. Keep private any confidential information gained in their professional work, where
such confidentiality is consistent with the public interest and consistent with the law.
2.06. Identify, document, collect evidence and report to the client or the employer
promptly if, in their opinion, a project is likely to fail, to prove too expensive, to violate
2.07. Identify, document, and report significant issues of social concern, of which they
2.08. Accept no outside work detrimental to the work they perform for their primary
employer.
2.09. Promote no interest adverse to their employer or client, unless a higher ethical
concern is being compromised; in that case, inform the employer or another appropriate
Principle 3: PRODUCT
Software engineers shall ensure that their products and related modifications meet the
appropriate:
43
3.01. Strive for high quality, acceptable cost and a reasonable schedule, ensuring
significant tradeoffs are clear to and accepted by the employer and the client, and are
3.02. Ensure proper and achievable goals and objectives for any project on which they
work or propose.
3.03. Identify, define and address ethical, economic, cultural, legal and environmental
3.04. Ensure that they are qualified for any project on which they work or propose to
3.05. Ensure an appropriate method is used for any project on which they work or
propose to work.
3.06. Work to follow professional standards, when available, that are most appropriate
for the task at hand, departing from these only when ethically or technically justified.
3.07. Strive to fully understand the specifications for software on which they work.
3.08. Ensure that specifications for software on which they work have been well
documented, satisfy the users’ requirements and have the appropriate approvals.
3.09. Ensure realistic quantitative estimates of cost, scheduling, personnel, quality and
outcomes on any project on which they work or propose to work and provide an
3.10. Ensure adequate testing, debugging, and review of software and related
3.12. Work to develop software and related documents that respect the privacy of those
3.13. Be careful to use only accurate data derived by ethical and lawful means, and use it
3.14. Maintain the integrity of data, being sensitive to outdated or flawed occurrences.
3.15 Treat all forms of software maintenance with the same professionalism as new
development.
Principle 4: JUDGMENT
44
4.01. Temper all technical judgments by the need to support and maintain human
values.
4.02 Only endorse documents either prepared under their supervision or within their
4.04. Not engage in deceptive financial practices such as bribery, double billing, or other
4.05. Disclose to all concerned parties those conflicts of interest that cannot reasonably
be avoided or escaped.
professional body concerned with software related issues, in which they, their employers
Principle 5: MANAGEMENT
Software engineering managers and leaders shall subscribe to and promote an ethical
5.01 Ensure good management for any project on which they work, including effective
5.02. Ensure that software engineers are informed of standards before being held to
them.
5.03. Ensure that software engineers know the employer's policies and procedures for
confidential to others.
5.04. Assign work only after taking into account appropriate contributions of education
and experience tempered with a desire to further that education and experience.
5.05. Ensure realistic quantitative estimates of cost, scheduling, personnel, quality and
outcomes on any project on which they work or propose to work, and provide an
5.06. Attract potential software engineers only by full and accurate description of the
conditions of employment.
5.08. Not unjustly prevent someone from taking a position for which that person is
suitably qualified.
45
5.09. Ensure that there is a fair agreement concerning ownership of any software,
has contributed.
5.10. Provide for due process in hearing charges of violation of an employer's policy or
of this Code.
5.11. Not ask a software engineer to do anything inconsistent with this Code.
5.12. Not punish anyone for expressing ethical concerns about a project.
Principle 6: PROFESSION
Software engineers shall advance the integrity and reputation of the profession
appropriate:
this Code.
6.05. Not promote their own interest at the expense of the profession, client or
employer.
6.06. Obey all laws governing their work, unless, in exceptional circumstances, such
6.07. Be accurate in stating the characteristics of software on which they work, avoiding
not only false claims but also claims that might reasonably be supposed to be
6.08. Take responsibility for detecting, correcting, and reporting errors in software and
6.09. Ensure that clients, employers, and supervisors know of the software engineer's
6.10. Avoid associations with businesses and organizations which are in conflict with
this code.
6.11. Recognize that violations of this Code are inconsistent with being a professional
software engineer.
46
6.12. Express concerns to the people involved when significant violations of this Code
6.13. Report significant violations of this Code to appropriate authorities when it is clear
counter-productive or dangerous.
Principle 7: COLLEAGUES
7.03. Credit fully the work of others and refrain from taking undue credit.
7.04. Review the work of others in an objective, candid, and properly-documented way.
7.06. Assist colleagues in being fully aware of current standard work practices including
policies and procedures for protecting passwords, files and other confidential
7.07. Not unfairly intervene in the career of any colleague; however, concern for the
employer, the client or public interest may compel software engineers, in good faith, to
7.08. In situations outside of their own areas of competence, call upon the opinions of
Principle 8: SELF
Software engineers shall participate in lifelong learning regarding the practice of their
profession and shall promote an ethical approach to the practice of the profession. In
development, maintenance and testing of software and related documents, together with
8.02. Improve their ability to create safe, reliable, and useful quality software at
documentation.
47
8.04. Improve their understanding of the software and related documents on which they
8.05. Improve their knowledge of relevant standards and the law governing the
8.06 Improve their knowledge of this Code, its interpretation, and its application to
their work.
8.07 Not give unfair treatment to anyone because of any irrelevant prejudices.
8.08. Not influence others to undertake any action that involves a breach of this Code.
8.09. Recognize that personal violations of this Code are inconsistent with being a
This Code was developed by the ACM/IEEE-CS joint task force on Software
Executive Committee: Donald Gotterbarn (Chair), Keith Miller and Simon Rogerson;
Members: Steve Barber, Peter Barnes, Ilene Burnstein, Michael Davis, Amr El-Kadi, N.
Ben Fairweather, Milton Fulghum, N. Jayaram, Tom Jewett, Mark Kanko, Ernie
Douglas Phillips, Peter Ron Prinzivalli, Patrick Sullivan, John Weckert, Vivian Weil, S.
This Code may be published without permission as long as it is not changed in any way
and it carries the copyright notice. Copyright (c) 1999 by the Association for
Computing Machinery, Inc. and the Institute for Electrical and Electronics Engineers,