Add courses from Spring & Summer 2024

This commit is contained in:
2024-09-20 14:15:17 +03:00
parent 9fbe846cb6
commit 1b53bd225e
16 changed files with 239 additions and 0 deletions

View File

@@ -0,0 +1,23 @@
[[Software and system architectures]]
1. **Why do you think architecture is important? Why do people make architecture descriptions?**
In software engineering, architecture is essential because it allows stakeholders to communicate effectively by providing a common abstraction of the system, it makes early design decisions easier by allowing the structure of the system to be analysed. It also offers a transferable abstraction—a compact, easily comprehensible model that shows how components interact and can be reused for multiple projects. This maintains consistency in design quality, permits early detection of any problems, and guarantees that all stakeholders have a common understanding on the project.
To properly explain and record a software system's architecture choices and organisational structure, we need architecture descriptions. These explanations make sure that all stakeholders in the project have a common understanding of the system. They support the identification of risks, the assessment of feasibility, and the fulfilment of functional and non-functional needs. Architecture descriptions also bring regulatory compliance and standards into the organisation, which act as a blueprint for
development, and make maintenance and future improvements easier.
2. **Why is architecture an organisational concept?**
Architecture serves as an organisational concept by providing a structured framework that guides the planning, decision-making, and communication processes within a project or organisation. With architecture, stakeholders can better communicate the project's objectives and make critical decisions. The blueprint and architectural documents act as references, translating complex ideas into comprehensible plans and ensuring that everyone is on the same page. This systematic approach helps align different teams and activities towards a common goal, facilitating efficient cross-team collaboration and coherent software development.
3. **What are your expectations of this course?**
In this course, I want to learn how to create good software architectures that provides a comprehensive understanding on the system. In addition, I would like to be able to assess the quality of current designs and determine whether modifications are necessary.

View File

@@ -0,0 +1,21 @@
[[Software and system architectures]]
1. **Why are quality attributes often more important to architecture than functional requirements?**
Quality attributes are crucial in software architecture, impacting usability, performance, reliability, and security. While functional requirements define what the system should do, quality attributes, like security and scalability, go beyond functionality. They may not be visible to end-users but have significant impact when they fail, such as crashes during peak loads or security breaches. Legacy systems often suffer from poor quality attributes, causing ongoing issues. Balancing these attributes is essential, requiring architects to prioritise based on business goals to ensure effective software systems
(Davis, 2021).
2. **What is the difference between constraints and principles?**
Constraints are limitations or restrictions placed on a system, project, or process, often imposed by external factors such as resources, time, or regulations. For example, a constraint in software development could be a deadline imposed by the client or limited resources allocated for a project.
Principles are fundamental guidelines or beliefs that inform decision-making and behaviour. They are commonly held values or standards that guide actions and decisions. Examples of principles in software development include the SOLID principles (Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion), which promote code maintainability and extensibility, or the DRY (Don't Repeat Yourself) principle, which advocates for
reducing redundancy in code.
3. **Do you consider scenarios are a good way to describe quality attributes? Why yes or no?**
Scenarios are a useful tool for describing quality attributes. Scenarios illustrates the practicality of these attributes by providing cases or real-world scenarios, such as system crashes under significant load or security breaches resulting in data theft. They help in understanding of abstract concepts, showing their importance and impact on software systems. Scenarios may also show how quality attributes interact with each other and emphasise the need of balance and prioritising.
***References***
Davis, T. (2021). _Quality Attributes in Software Architecture_. [online] 3Pillar Global. Available at: https://www.3pillarglobal.com/insights/the-importance-of-quality-attributes-in-software-architecture/.

View File

@@ -0,0 +1,15 @@
[[Software and system architectures]]
1. **What is the difference between a view and a viewpoint? Why are both needed?**
In architectural representation, a "view" refers to the graphical depiction of specific architectural structures or elements. Views offer concrete visualisations of design concepts, allowing architects and stakeholders to visualise the proposed structures. On the other hand, a "viewpoint" encompasses the conventions and templates used to construct and interpret these views effectively. Viewpoints ensure consistency and clarity across these representations by establishing standardised methods and conventions.
While a view is the end result, a viewpoint serves as the guiding principle or methodology behind its creation. Both are essential in architectural communication.
2. **Why is the context view important?**
It is important to recognise the significance of the context view when working with systems analysis and design. Despite its apparent simplicity, it is not always understood by all stakeholders, which might end up in miscommunications. This can also lead to incorrect assumptions about the constraints, external entities, and system scope. Furthermore, the context view reveals integration, which is essential to modern systems. Each portion of a system is interconnected with all the other components of it, with business partner systems, with other systems, and with local and global platforms. Understanding the interdependence through the context view enables a thorough comprehension of the operation of the system and its wider consequences within its ecosystem.
3. **What is a container and what purpose does it serve?**
A container refers to a self-contained functional entity that can be deployed independently. It is a package bundling all the necessary components and dependencies within its own execution environment. Unlike a monolithic architecture where components are tightly integrated, a container allows for more flexibility by carrying individual components inside them. Components are functional elements operate within the same process and environment, ensuring efficient resource utilisation and streamlined deployment.

View File

@@ -0,0 +1,20 @@
[[Software and system architectures]]
1. **What does the deployment view clarify and for which audience is it useful?**
The deployment view offers insight into how the system is deployed and functions within its environmentt, making it especially valuable for developers and system administrators. It illustrates the physical deployment of software components onto hardware nodes, detailing aspects like network topology, server configurations, and communication protocols. By utilizing UML diagrams like Component and Package diagrams, the deployment view helps developers understand how different software modules interact and are organized within the system, facilitating efficient development, debugging, and maintenance processes. Additionally, it aids system administrators in effectively managing and maintaining the deployed system infrastructure, ensuring smooth operation and scalability (Olamendy, 2011).
2. **What architectural views seem to be more important in the course project? Why?**
I believe the following are more important:
- Context View: Describing the system's interaction with external entities, ensuring that stakeholders understand how users and external systems interact with the SSI solution. This is important for outlining the boundaries and dependencies of the system, which help in gaining trust and clarity.
- Functional View: Defining the system's primary functionalities, such as user authentication through facial recognition and decentralised identity verification via blockchain. This helps stakeholders understand the core capabilities of the system and how these functionalities meet their needs and expectations.
- Development View: Detailing the system's architecture from a development perspective. This helps the development team to understand the modular structure, development standards, and integration points, ensuring a coherent and maintainable codebase.
3. **Why do also development tools make some of your architectural decisions?**
Development tools often play a significant role in shaping architectural decisions due to their influence on the development process. When selecting tools such as programming languages, frameworks, and libraries, developers must consider their compatibility with the overall architecture of the system. For instance, the choice of a database management system might dictate the data storage and retrieval mechanisms. Thus, development tools introduce certain constraints into the project, pushing developers towards specific architectural choices that align with the capabilities and limitations of the selected tools.
***References***
Olamendy, J.C. (2011). _Deployment diagram_. [online] JC Olamendys Thoughts. Available at: https://johnolamendy.wordpress.com/tag/deployment-diagram/ [Accessed 27 May 2024].

View File

@@ -0,0 +1,13 @@
[[Software and system architectures]]
1. **How can you use prototypes in the course project?**
Prototypes can be used to demonstrate the feasibility and functionality of the proposed system to various stakeholders. For examples, prototypes can shows preview of the user experience to citizens, showcasing how different recognition functions seamlessly integrate to offer secure and convenient identity management. It can also gives the development team insight into the technical aspects of the architecture through prototypes, enabling them to refine algorithms and optimise system performance.
2. **Why is architecture design needed also in agile projects?**
In a agile software project, where the focus is on iterative development and adaptability, architecture design plays a crucial role. It provides a blueprint for the system's structure, ensuring that the software components work harmoniously together. This is important since as agile projects often involve frequent changes and additions, and without a solid architectural foundation, the system risks becoming fragmented and difficult to maintain. Additionally, architecture design aids in anticipating future needs and scalability, allowing the software to grow and evolve alongside the project's requirements. Furthermore, it promotes communication and collaboration among team members, as it serves as a common reference point for discussing and understanding the system's design.
3. **Do you think technical debt is a useful concept in software architecture? Why yes or no?**
Technical debt is a useful concept in software architecture because it provides a guideline for trade-offs made during the development process. Intentional technical debt, such as when the design is intentionally complex to meet a tight deadline, allows teams to prioritise time-to-market over perfection. This strategic decision acknowledges that addressing all aspects of software quality might delay the product's release, potentially causing loss of competitive advantage. On the other hand, unintentional technical debt arises from implementing non-optimal solutions or neglecting crucial software processes, like documentation, which can impede future development and maintenance. Recognising and managing these types of technical debt are essential for maintaining the software's health over time, particularly as systems age and technological advancements introduce new challenges.

View File

@@ -0,0 +1,12 @@
[[Software and system architectures]]
1. **Define the dimensions integration and standardisation. How do they relate to the operating model of an enterprise?**
Standardisation in an enterprise's operating model refers to making business processes and IT systems consistent across different units, ensuring tasks are carried out similarly regardless of location or executor. This boosts efficiency but may limit innovation and require replacement of existing systems, which can be costly and politically difficult. Integration, on the other hand, involves connecting organisational efforts through shared data, improving coordination and customer service. However, achieving integration demands standard data definitions, agreements, and understanding, making it a complex and costly process. Both dimensions are crucial for optimising operations but come with their own challenges.
2. **What kind of things are achieved through EA maturity?**
According to Ross et al. (2006), enterprise architecture (EA) maturity encompasses four progressive stages: Business Silos, Standardised Technology, Optimised Core, and Business Modularity. In the initial stage of Business Silos, organisations focus on addressing local business needs, resulting in fragmented IT solutions and high operating costs. Advancing to the Standardised Technology stage, companies consolidate IT investments and establish enterprise-wide standards, leading to reduced complexity and costs in managing technology infrastructure. Moving to the Optimised Core stage, organisations prioritise data integration and centralise IT governance, facilitating strategic alignment between IT and business objectives. Finally, in the Business Modularity stage, the emphasis shifts towards achieving strategic agility through modular and reusable IT components, fostering innovation and scalability across the organisation. EA maturity enables organisations to optimise operational efficiency, enhance strategic agility, and reduce IT management costs through progressive stages of organisational learning and IT alignment with business goals.
***References***
Ross, J.W., Weill, P. and Robertson, D. (2006). _Enterprise Architecture as Strategy: Creating a Foundation for Business Execution_. Boston, Massachusetts: Harvard Business Review Press.

View File

@@ -0,0 +1,19 @@
[[Software and system architectures]]
1. **What internal (i.e. inside the company and its enterprise systems or other) integrations can you identify?**
- Facial Recognition Service: Integration with AI/ML models for facial recognition to authenticate users during onboarding and access.
- Smart Contracts: Implementing smart contracts to automate identity verification and credential issuance processes.
- Identity Wallet: Integration with a mobile app that acts as a user's identity wallet, storing their eID on their phone securely.
- CRM System: Integration with the companys Customer Relationship Management (CRM) system to manage user interactions, support requests, and feedback.
- CI/CD Integration: Continuous Integration/Continuous Deployment (CI/CD) pipelines to automate the development, testing, and deployment of the system, ensuring rapid and reliable delivery of updates and features.
- API Gateway: An API gateway to facilitate secure and standardised access to various public services, ensuring that users can use their SSI for seamless access to multiple services.
2. **What external integrations can you identify? What other possible platforms could the system integrate to?**
- e-Government Systems: Integration with various government portals to allow users to access services such as healthcare, education, taxation, and social welfare using their decentralised identity.
- Banks and Payment Services: Integration with banks and payment service providers to facilitate the Know-Your-Customer processes, enabling users to open accounts and make transactions using their SSI.
- Electronic Health Records: Integration with health record systems to enable secure access and sharing of medical records with authorised healthcare providers.
- University Portals: Integration with university and school portals for managing student records, admissions, and alumni services.
- Utility Providers: Integration with utility service providers for identity verification during account setup and billing.

View File

@@ -0,0 +1,50 @@
[[Software Maintenance]]
1. **Understand the architecture of any software system.**
Here is the architecture diagram for my personal portfolio website, which uses various AWS services, GitHub, and GitHub Actions:
![[architecture.drawio.png]]
The architecture's design makes maintainability easier through some key aspects. By separating static content delivery (via Route53 and CloudFront) from dynamic API functionality (via API Gateway and Lambda), it allows for straight-forward management and troubleshooting. This modular approach, where each component has a specific role, also makes it easier to update or replace individual components without affecting the entire system. Furthermore, automated deployment with GitHub Actions ensures consistent and repeatable processes, reducing human error and simplifying updates and rollbacks. On top of that, the use of managed AWS services offers high availability and scalability with minimal maintenance effort. Security and compliance are supported by IAM for authentication and ACM for encryption, offloading these critical tasks from developers. Additionally, comprehensive monitoring and logging via CloudWatch provide clear insights into application performance, providing quick issue identification and resolution.
However, the complexity of integrating multiple AWS services and GitHub Actions requires specialised knowledge. Managing dependencies and configurations across these services adds another layer of difficulty, increasing the risk of misconfigurations and deployment issues.
2. **Understand the object-oriented structure of any software system.**
Here is an UML of "The World of Lutemons" from the course CT60A2411 Object oriented Programming, which I took 3 years ago:
![[203955536-f6e4401f-5e8b-43c8-ac2d-b1e251032f4e.png]]
### Attribute Changes
Introducing new attributes in a class will make updates necessary for methods within the class that manage or use these attributes. For instance, if a new attribute such as `trainingLevel` is added to the `TrainingArea` class, methods within `TrainingArea` would need to be updated to manage this attribute. Furthermore, any associated classes that interact with `TrainingArea`, such as `Storage`, would also need to be updated to handle the new attribute.
Removing an attribute will break any methods that reference it within the class and in any associated classes. For example, if the `health` attribute is removed from the `Lutemon` class, all methods within `Lutemon` and other classes such as `Battlefield` or `Home` that reference `health` would need to be updated to remove or replace those references.
Altering the data type of an attribute affects all methods that use this attribute, as well as interactions with other classes. For instance, if the `id` attribute in the `Battlefield` class is changed from `int` to `String`, all methods in `Battlefield` and any associated classes that interact with `id` will need to be updated to ensure type compatibility.
### Method Changes
Adding a new method in a class might require associated classes to be updated to use this new functionality. For example, if a new combat-related method like `specialAttack()` is added to the `Lutemon` class, classes managing battles, such as `Battlefield`, would need changes to incorporate the new method.
Removing methods impacts any associated classes that call the removed method. If the `healLutemon()` method is removed from the `Home` class, all instances where `healLutemon()` is called in other classes, such as `Storage` or `Battlefield`, will need to be updated to remove or replace those method calls.
Changing a methods parameters or return type impacts all associated classes that call this method. If the `getLutemon(int id)` method in the `Storage` class is modified to `getLutemon(String id)`, all classes that call `getLutemon()` must be updated to match the new signature.
### Inheritance and Polymorphism
If a superclass is modified, such as adding or removing attributes or methods, all subclasses need to be updated. For instance, if new attributes are added to the `Lutemon` class, subclasses like `Black`, `Orange`, `Green`, `Pink`, and `White` will be impacted and must be updated accordingly.
When methods that are overridden in subclasses are changed in the superclass, all subclasses must update their overriding methods accordingly. If the `attack()` method in `Lutemon` changes its parameters, all subclasses like `Black`, `Orange`, `Green`, `Pink`, and `White` need to update their overridden `attack()` methods to reflect these changes.
### Relationships and Associations
Changing the nature of an association impacts how classes interact with each other. For instance, modifying the relationship between `Storage` and areas like `TrainingArea`, `Battlefield`, and `Home` from one-to-many to one-to-one would require changes in how these areas manage `Lutemons`. This would affect methods for adding, removing, and managing `Lutemons` in these associated classes.
Classes that depend on another classs attributes or methods will be directly affected by any changes. If methods in the `Storage` class are modified, such as changing the parameters of `addLutemon()`, all areas and classes interacting with `Storage`, including `TrainingArea`, `Battlefield`, and `Home`, will need to be updated to ensure compatibility with the new parameters.
### Encapsulation and Interfaces
Changing the visibility of attributes or methods (e.g., making private attributes public) can expose new parts of the class, affecting how other classes interact with it. This can lead to increased dependencies and potential misuse. For instance, making the `training` attribute in `TrainingArea` public could lead to direct manipulation of `training` by other classes, potentially causing unexpected behavior.
If a class interacts with an interface, changes to the interface, such as adding or removing methods, require all implementing classes to be updated to conform to the new interface structure. For instance, if `Lutemon` classes implement an interface for combat actions and the interface is modified to include a new method, all `Lutemon` subclasses must be updated to implement the new method.

View File

@@ -0,0 +1,22 @@
[[Software Maintenance]]
___
>**Use the following information to determine the function point, productivity, documentation, and cost per function for a software program with various Processing Factors 5, 1, 0, 4, 3, 5, 4, 3, 4, 5, 2, 3, 4, 2.  The average number of External Inputs was 22, the average number of External Outputs was 45, the average number of External Inquiries was 6, the average number of Internal Logic Files was 5, and the average number of External Logic Files was 2. Effort: 37 Per Month. 250 pages were devoted to the technical documentation for the software, 120 pages to user-related materials, and $7520 was the monthly budget and cost.**
- $\text{Sum of Processing Factors} = 5+1+0+4+3+5+4+3+4+5+2+3+4+2 = 45$
- $\text{External Inputs} = 22 \times 4 = 88$
- $\text{External Outputs} = 45 \times 5 = 225$
- $\text{External Inquiries} = 6 \times 4 = 24$
- $\text{Internal Logic Files} = 5 \times 10 = 50$
- $\text{External Logic Files} = 2 \times 7 = 14$
- $\text{Effort} = 37\text{/month}$
- $\text{Monthly Budget and Cost} = 7520$
$$\text{Unadjusted Function Point (UFP)} = 88 + 225 + 24 + 50 + 14 = 401$$
$$\text{Complexity Adjustment Factor (CAF)} = 0.65 + 0.01 \times 14 \times 45 = 6.95$$
$$\text{Function Point (FP)} = \text{UFP} \times \text{CAF} = 2786.95$$
$$\text{Productivity} = \frac{\text{FP}}{Effort} = \frac{2786.95}{37} ≈ 75.32 \quad \text{(FP/month)}$$
$$\text{Total Documentation} = 250+120 = 370 \quad \text{(pages)}$$
$$\text{Cost per Function} = \frac{\text{Total cost}}{\text{FP}} = \frac{7520}{2786.95} ≈ 2.70 \quad \text{(\$/FP)}$$
>**What is the importance of maintenance in software development life cycle?**
Maintenance plays a crucial role within the Software Development Life Cycle by significantly improving its quality and reliability over time. In real-life scenarios, software often encounters unforeseen bugs and vulnerabilities post-development and testing phases. Maintenance serves to identify and fix them, thereby enhancing software quality, improving user satisfaction, and reducing support costs, all while prolonging the software's lifespan. Furthermore, maintenance helps to adapts software to evolving business or technical demands resulting from changes in the markets, technologies, or regulations. Updates, upgrades, or new features ensure that software remains up-to-date with evolving requirements, effectively supporting business objectives. Through continuous monitoring and updating, maintenance helps to address system failures, security breaches, or performance deterioration, thereby mitigating associated risks such as downtime or data loss. This proactive approach to maintenance underscores its crucial role in sustaining software systems and ensuring their continued functionality and relevance within the dynamic modern world.

View File

@@ -0,0 +1,23 @@
[[Software Maintenance]]
___
>**Explain the RTS Techniques for Procedural Programs using a Table. Highlight advantage and limitations and other key factors for comparison.**
| Techniques | Key factors | Advantages | Limitations |
| --------------------------- | ------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------ |
| Dataflow analysis-based | Based on dataflow and structural coverage criteria | Precise identification of affected def-use pairs | Low on safety, imprecise |
| Slicing-based | Based on slicing of programs or dependence graph models | Can handle inter-procedural dependencies | Low on safety, imprecise, computationally inefficient compared to Dataflow-based |
| Module level firewall-based | Based on analyzing dependencies among modules | More efficient as only modified modules are analysed | Low on safety, highly imprecise |
| Modified code entity-based | Level of granularity can be adapted | Safe, and the most efficient technique | Highly imprecise |
| Textual differencing-based | Based on textual differencing of C programs | Safe, and easy to implement a prototype | Imprecise, and difficult to adapt to other languages, inefficient for large programs |
| Graph walk-based | Based on analysis of control flow models | Safe, and the most precise technique | Less efficient than Module level firewall-based and Modified code entity-based |
>**Explain the RTS Techniques for Object-Oriented Programs using a Table. Highlight advantage and limitations and other key factors for comparison.**
| Techniques | Key factors | Advantages | Limitations |
| ------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Firewall-based | Based on dependencies among modules | Computationally efficient | Unsafe and imprecise, need to be extended to handle certain object-oriented features |
| Program model-based | Based on dependencies among class elements or control flow models | Safe, and more precise than Firewall-based, suitable for multiple classes and programs | Computationally inefficient compared to Firewall-based, does not consider some common object-oriented constructs, expensive for large programs with small changes |
| Design model-based | Based on different UML design models, assuming traceability between models, source code, and test cases | More efficient than Program model-based, suitable large programs, high level of abstraction, independent of the implementation | Not safe, less precise than Program model-based |
| Specification-based | Based on requirement models, assuming traceability from the specifications to test cases | More efficient than Program model-based, suitable for systems with large test suites, platform-independent | Not safe, less precise than Program model-based |
### References
Biswas, S., Mall, R., Satpathy, M., & Sukumaran, S. (2011). Regression Test Selection Techniques: A Survey. _Informatica (Slovenia), 35_, 289-321.

View File

@@ -0,0 +1,21 @@
[[Software Maintenance]]
___
>**Explain why a software system that is used in a real-world environment must change or become progressively less useful.**
Software systems need to adapt and evolve to stay useful over time. This is primarily because user needs and requirements are constantly changing. As businesses expand and markets shift, new features and capabilities become necessary to keep the software effective and relevant. Without updates, the software risks becoming outdated and less satisfying for users.
Technological advancements also drive the need for software changes. New hardware, operating systems, and programming techniques emerge regularly, which can render older software incompatible or less efficient. Updating software helps it take advantage of these advancements and maintain optimal performance.
Security is another critical factor. New threats and vulnerabilities are continuously discovered, making outdated software more susceptible to attacks. Regular updates and patches are essential to protect against these risks and ensure data security and system integrity.
Regulatory and compliance requirements also change over time, necessitating software modifications to meet current laws and standards. Additionally, competition in the market pushes businesses to continually improve their software. Competitors may offer more advanced or user-friendly solutions, prompting the need for enhancements to retain and attract customers.
>**What are the principal factors that affect the costs of system reengineering?**
Several key factors influence the costs associated with system reengineering. One important factor is the quality of the existing software. Systems with well-documented code, a modular design, and minimal technical debt are generally less expensive to reengineer compared to those with poor documentation, a monolithic structure, and extensive technical debt. High-quality software allows for easier analysis, modification, and testing, thereby reducing reengineering costs.
The availability of advanced tools for reengineering is another significant factor. Tools for code analysis, refactoring, and automated testing can significantly reduce the effort and time required for reengineering. These tools facilitate more efficient processes and can handle complex tasks that would be labor-intensive if done manually.
Data conversion needs also impact reengineering costs. When a system requires large volumes of data to be converted to new formats or integrated with new systems, the reengineering process becomes more complex and expensive. This requires careful planning, validation, and migration strategies to ensure data integrity and consistency.
The expertise of the staff involved in reengineering is crucial as well. Skilled professionals with experience in the specific technologies and methodologies used in the reengineering process can execute tasks more efficiently and effectively. A lack of such expertise can lead to longer project durations, higher labor costs, and increased risk of errors.