UOPeople Software Engineering 1 Flashcards
What is software engineering?
Software engineering is a discipline for solving business problems by designing and developing software-based systems. As with any engineering activity, a software engineer starts with problem definition and applies tools of the trade to
obtain a problem solution.
The purpose of software engineering is to develop software-based systems that let customers
achieve business goals
Why is SE difficult?
Expertise
If you are a civil engineer building bridges then all you need to know is about bridges. Unlike
this, if you are developing software you need to know about software domain (because that is
what you are building) and you need to know about the problem domain (because that is what
you are building a solution for).
formality
A further problem is that software is a formal domain, where the inputs and goal states are well defined. Unlike software, the real world is informal with ill-defined inputs and goal states.
Change
software engineering is primarily about modeling the physical world by finding good abstractions, but the complexity of the physical world, being infinitely complex, cannot be captured in its entirety by our abstractions, therefore our abstractions are only approximations of the physical world.
The informal domain of reality tends to increase disorder. Whatever order was captured by our abstractions, tends to get dispersed into disorder. Our (approximate) abstractions necessarily become invalid with passing time and we need to start afresh.
What are the most basic steps of the SE process?
Plan
Design
Implement
Evaluate
Waterfall process
Requirements Design Implementation Testing Operation and Maintainance
SLDC: Waterfall
Requirements Design Implementation Testing Operation and Maintainance
Advantages and disadvantages of the waterfall approach?
Advantages
.
There is a psychological attraction to the waterfall model: it is a linear process that leads to a
conclusion by following a defined sequence of steps
Disadvantages
Given that Software design is unlike the design and development of other products, a process that follows a linear order of understanding the problem, designing a solution, implementing and deploying the solution, does not produce best results.
Difference between Software and other types of products?
Unlike most other products, software is intangible and hard to visualize. Most people experience software through what it does: what inputs it takes and what it generates as
outputs
Software is probably the most complex artifact—a large software product consists of so many bits and pieces as well as their relationships, every single one having an important role—one flipped bit can change the entire sense of a program
Software is probably the most flexible artifact—it can be easily and radically modified at any stage of the development process, so it can quickly respond to changes in customer requirements (or, at least it is so perceived)
Architecture: Client/Server
Segregates the system into two applications, where the client makes requests to the server. In many cases, the server is a database with application logic represented as stored procedures.
Architecture: Component-Based Architecture
Decomposes application design into reusable functional or logical components that expose well-defined communication interfaces.
Architecture: Domain-Driven Design
An object-oriented architectural style focused on modeling a business domain and defining business objects based on entities within the business domain.
Architecture: Layered Architecture
Partitions the concerns of the application into stacked groups (layers).
Architecture: Message Bus
An architecture style that prescribes the use of a software system that can receive and send messages using one or more communication channels, so that applications can interact without needing to know specific details about each other.
Architecture: N-Tier / 3 - Tier
Segregates functionality into separate segments in much the same way as the layered style, but with each segment being a tier located on a physically separate computer.
Architecture: Object-Orientated
A design paradigm based on division of responsibilities for an application or system into individual reusable and self-sufficient objects, each containing the data and the behavior relevant to the object.
Service-Oriented Architecture
Refers to applications that expose and consume functionality as a service using contracts and messages.
What is the simplest form of a Client/Server Architectural Style?
The simplest form of client/server system involves a server application that is accessed directly by multiple clients, referred to as a 2-Tier architectural style.
Common variations of a Client/Server architectural style
Client-Queue-Client systems. This approach allows clients to communicate with other clients through a server-based queue. Clients can read data from and send data to a server that acts simply as a queue to store the data. This allows clients to distribute and synchronize files and information. This is sometimes known as a passive queue architecture.
Peer-to-Peer (P2P) applications. Developed from the Client-Queue-Client style, the P2P style allows the client and server to swap their roles in order to distribute and synchronize files and information across multiple clients. It extends the client/server style through multiple responses to requests, shared data, resource discovery, and resilience to removal of peers.
Application servers. A specialized architectural style where the server hosts and executes applications and services that a thin client accesses through a browser or specialized client installed software. An example is a client executing an application that runs on the server
Main benefits of the client/server architectural style
Higher security. All data is stored on the server, which generally offers greater control of security than client machines.
Centralized data access. Because data is stored only on the server, access and updates to the data are far easier to administer than in other architectural styles.
Ease of maintenance. The roles and responsibilities of a computing system are distributed among several servers that are known to each other through a network. This ensures that a client remains unaware and unaffected by a server repair, upgrade, or relocation.
When to consider Client/Server Architectural Styles?
Consider the client/server architectural style if…
your application is server based and will support many clients,
you are creating Web-based applications exposed through a Web browser,
you are implementing business processes that will be used by people throughout the organization,
or you are creating services for other applications to consume.
The client/server architectural style is also suitable, like many networked styles, when you want to centralize data storage, backup, and management functions, or when your application must support different client types and different devices.
Drawbacks of the Client/Server Architecture pattern
The traditional 2-Tier client/server architectural style has numerous disadvantages, including the tendency for application data and business logic to be closely combined on the server, which can negatively impact system extensibility and scalability, and its dependence on a central server, which can negatively impact system reliability.
To address these issues, the client-server architectural style has evolved into the more general 3-Tier (or N-Tier) architectural style, , which overcomes some of the disadvantages inherent in the 2-Tier client-server architecture and provides additional benefits.
Major difference between Object -Orientated Design and a Component-BAsed Architectural style?
CBA provides a higher level of abstraction than object-oriented design principles and does not focus on issues such as communication protocols and shared state.
OOD objects, even though separated into different classes, are compiled into and run as a monolithic app, Whereas CBA components are run as separate functional units or components, often on different servers or machines
Key principles of Component-Based Architeture
Reusable. Components are usually designed to be reused in different scenarios in different applications. However, some components may be designed for a specific task.
Replaceable. Components may be readily substituted with other similar components.
Not context-specific. Components are designed to operate in different environments and contexts. Specific information, such as state data, should be passed to the component instead of being included in or accessed by the component.
Extensible. A component can be extended from existing components to provide new behavior.
Encapsulated. Components expose interfaces that allow the caller to use its functionality, and do not reveal details of the internal processes or any internal variables or state.
Independent. Components are designed to have minimal dependencies on other components. Therefore components can be deployed into any appropriate environment without affecting other components or systems.
Key benefits of a component-based archtitecture
Ease of deployment. As new compatible versions become available, you can replace existing versions with no impact on the other components or the system as a whole.
Reduced cost. The use of third-party components allows you to spread the cost of development and maintenance.
Ease of development. Components implement well-known interfaces to provide defined functionality, allowing development without impacting other parts of the system.
Reusable. The use of reusable components means that they can be used to spread the development and maintenance cost across several applications or systems.
Mitigation of technical complexity. Components mitigate complexity through the use of a component container and its services. Example component services include component activation, lifetime management, method queuing, eventing, and transactions.
Key benefits of Domain Driven Design
Communication. All parties within a development team can use the domain model and the entities it defines to communicate business knowledge and requirements using a common business domain language, without requiring technical jargon.
Extensible. The domain model is often modular and flexible, making it easy to update and extend as conditions and requirements change.
Testable. The domain model objects are loosely coupled and cohesive, allowing them to be more easily tested.