Principles, Processes, and Architectural Design
COIT20258 - Professional Software Development
Software Engineering is an engineering discipline concerned with all aspects of software production from the early stages of system specification through to maintaining the system after it has gone into use.
It encompasses the application of systematic, disciplined, and quantifiable approaches to the development, operation, and maintenance of software systems.
These activities represent the universal framework for software development, regardless of the specific methodology employed.
The process of establishing the services that a customer requires from a system and the constraints under which it operates and is developed.
Sequential development phases with distinct deliverables. Suitable for projects with well-understood, stable requirements and minimal expected changes.
Iterative approach with frequent releases allowing rapid feedback incorporation and accommodation of changing customer requirements.
Reuse-oriented methodology leveraging existing components and Commercial Off-The-Shelf (COTS) systems for rapid deployment.
| Characteristic | Plan-Driven Approach | Agile Methodology |
|---|---|---|
| Planning Strategy | Comprehensive upfront planning | Incremental, adaptive planning |
| Documentation Focus | Extensive documentation | Working software prioritization |
| Change Management | Controlled change processes | Embracing iterative changes |
| Stakeholder Engagement | Formal contract negotiations | Collaborative partnerships |
Prioritizing human collaboration and communication over rigid processes and tooling frameworks
Delivering functional software solutions rather than focusing exclusively on comprehensive documentation
Establishing partnerships with stakeholders instead of adversarial contract negotiations
Adapting to evolving requirements rather than rigidly adhering to predetermined plans
Continuous stakeholder participation throughout the development lifecycle for requirement prioritization and system evaluation
Software development in manageable increments with customer specification of requirements for each iteration
Recognition and exploitation of team capabilities, enabling self-organization without prescriptive methodologies
Anticipating requirement evolution and designing systems with inherent adaptability
Emphasis on simplicity in both software architecture and development processes
An agile framework emphasizing iterative development with time-boxed sprints typically lasting 2-4 weeks, enabling rapid feedback and continuous improvement.
Each role maintains distinct responsibilities within the collaborative framework, ensuring efficient project progression and stakeholder alignment.
A systematic approach to discovering, analyzing, documenting, and managing system requirements throughout the development lifecycle.
High-level statements in natural language describing services the system provides and operational constraints, written from the customer perspective.
Detailed technical specifications of system functions, services, and operational constraints that define implementation parameters.
| Requirement Category | FURPS Classification | Implementation Examples |
|---|---|---|
| Functional | Functions | Business logic, data processing, user interactions |
| Non-Functional | Usability | User interface design, accessibility standards |
| Reliability | System availability, fault tolerance mechanisms | |
| Performance | Response time constraints, throughput specifications | |
| Security | Authentication protocols, data encryption standards |
Architectural design is concerned with understanding how a software system should be organized and designing the overall structure that facilitates system functionality and quality attributes.
Localizing critical operations, minimizing inter-component communication, utilizing coarse-grained architectural components
Implementing layered security models with critical assets positioned in protected inner architectural layers
Isolating safety-critical functionality within small, well-defined subsystems for enhanced reliability
Incorporating redundant components and fault tolerance mechanisms to ensure system resilience
Utilizing fine-grained, modular components that facilitate system evolution and component replacement
System abstractions represented as objects or classes, focusing on functional requirements and system behavior
Runtime system composition showing interacting processes and concurrency aspects
Software decomposition for development teams, showing module organization and dependencies
Hardware mapping and software component distribution across processing nodes
The +1 represents Use Cases and Scenarios that integrate and validate all architectural perspectives.
Fundamental Principle: Each architectural layer provides services exclusively to the layer immediately above it, creating clear separation of concerns.
Distributed computing model organizing functionality into discrete services delivered by autonomous server components across network infrastructure.
A systematic approach to software design emphasizing object abstraction and encapsulation principles for maintainable system architectures.
Systematic examination of nouns and noun phrases within requirements documentation to identify potential object classes
Identification of tangible real-world entities and concepts within the application domain
Object identification based on participation in system behaviors and interaction patterns
Derivation of objects, attributes, and methods from use case scenarios and interaction sequences
Static system architecture representation including class relationships, subsystem organization, and component dependencies
Runtime behavior representation showing object interactions, sequence diagrams, and state transition mechanisms
Successful software engineering requires systematic integration of requirements analysis, architectural design principles, and implementation methodologies within appropriate process frameworks.