• • • • • • • Software engineering is a discipline that encompasses aspects of software production, from early system specification to maintain the system after it has been deployed, it involves the appropriate use of theories and methods to solve problems while considering organisational and financial constraints The main analogy used to describe the scale of software projects is based on building structures in the real world, it ranges from individual work tasks like a dog house to small team projects like houses, and complex operating systems with extensive requirements set out The Ariane 5 failure was caused by a software failure due to an arithmetic overflow condition, reuses software from the prior Ariane 4 did not account for the Ariane 5s faster landing speed, leading to system shutdowns and incorrect compensation, such that is ultimately led to the destruction of the Ariane 5 rocket. The process of engineering software differs from hardware engineering in that software is mutable, i.e., liable to change, and can be updated with very little cost, in contrast to hardware which requires substantial investment to change, this mutability allows continuous improvement in software but also introduces unique challenges Elements involved in engineering include: o software specification – these are the requirements engineering process of understanding and defining what services are required from the system and identifying the constraints on the systems operation and development. SRS, software requirements specification is a technical document describing the software’s functionality, features, design, limitations and goals. It is a blueprint or roadmap for software being built, it outlines how an application should operate and how the product development team should build it. o Design o Validation – software validation is the process of the evaluation of software during or at the end of the development process to determine whether it satisfies the specified requirements, as per the software specification o Verification – verification falls under the same wing as validation, it determines whether the software satisfies the expected requirements, ensuring that software is bug free, it is equivalent to software testing, which is checking the products of a given development phase against the conditions imposed at the start of the phase The software cris refers to the difficulty of writing correct, understandable and verifiable computer programs, excavated exacerbated by rapid increases in computer power and the complexity of the programs being tackled Software engineering is important because society increasingly relies on software systems that need to be produced reliably, economically, and quickly, Proper engineering techniques inherently cost less and are in the long term more effective as such o Bug free nature of well made software as a result of good strategical implementation of the software development process, from following specification, to good testing and validation throughout the process of development, leads to building a product that is while more expensive to build that simply muddying out something that may work in the long term, costs less to operate and causes less problems with say possibly incompatible software developers who do not well understand what code is doing due to bad choices during the development process, good design avoids needing checking in the first place, and good design leads to choices made that make • • • • • • • it easier for future software developers to understand what the software does at the code level Software engineering is important because our modern society increasingly relies on software systems that need to be produced reliably, economically, and quickly; proper engineering techniques are more effective in the long term, which is the focus on software development for meeting the requirements of the customer, as such the business who needs the software to operate their e.g., social media platform Despite the various methodologies employed to tackle the software crisis, there is unfortunately no single solution for all the cases, such that software projects are large, complicated, and prone to problems User requirements are statements in natural language describing user expectations of the system o Good requirements are valid, consistent, complete, realistic and verifiable, a requirements document is an official statement of all the requirements being set out by say the business who needs the software Functional requirements are specific statements of what the system should do, defining its functions, while non-functional requirements are global statements on the system’s overall qualities The unified modelling language, abbreviated as UML, is a general multi purpose modelling language intended for software intensive systems. It contains two categories of diagrams, covering the structural/static diagrams and the behavioural dynamic/timing diagrams o SysMl is an extension of UML for systems engineering, introducing new types of diagrams such as requirements diagrams The language of requirements is crucial for clear communication and avoidance of misunderstandings/confusion. It often includes domain specific terminology and may be supported by diagrams, tables and mathematical notations Requirements engineering is a systematic process involving: o Feasibility studies – this assesses the potential for success of the proposed plan or project by defining its expected costs and projected benefits in detail, where it is a good idea to have a contingency plan ▪ This is a typical term used in business o Requirements elicitation ▪ The requirements gathering, asking what are the requirements of the project, what if this, what if that etc. This is asking questions and getting responses, this step requires stakeholders to answer in their part of what is done and why o Requirements analysis ▪ This is more the step taken by organising answers to the first part, in such, finding which solutions are optimal, what are the trade offs with various possible implementations, in this part they may be the odd question but it isn’t the main point as this is about seeing which solution may be better under various constraints, e.g., finding which is the fastest or cheapest, this is more about how is something to be done and why des that way make more sense than another ▪ Another way to think about this is that the elicitation needs to com before the analysis, as otherwise, we are analysing nothing, which may not be useful ▪ • • • • So in conclusion of this, first we elicit questions, usually from stakeholders, and the answers are developed via requirements analysis, another way of thinking about it is elicitation being the process of finding out what the customers and potential customers say they think they want, as such producing a wishlist of sorts, then distilling thw wishlist to produce a list of actual requirements together with dependencies between them, involving saying some things on the wishlist are out of scope for one reason or an other, the analysis is an assessment of the requirements set out in usually natural English by customers/potential customers, analysing these set out requirements and coming to a conclusion on what to do in effect ▪ Requirements are typically expressed in the language of another domain and need to be obviously understood by all stakeholders, commonly supported by diagrams tables and mathematical notations • Various tools and methods are employed in this process including images, as mentioned before plain English, UML diagrams, propositional logic, and formal specification languages, such that they are used to specify the language of requirements The principles of modelling involve making the right model choice for the right job at different levels of abstraction, ensuring all abstraction levels are tied to reality, and maintain independent yet consistent views on the same system Diagram types o The behavioural diagrams in UML depict the dynamic behaviour of the system, with the inclusion of how it operates, interacts and changes, they include activity, sequence, tate machine and use case diagrams o Activity diagrams show graphical representations of step wise workflows, while sequence diagrams illustrate how processes operate with one another in a time sequence o State machine diagrams describe the different states of a system and transitions between them, while use case diagrams provide a high level representation of user interaction with them Information hiding in software engineering is the principle of hiding internal details of components and showing only the necessary information to the outside world, thus reducing system complexity and increasing robustness of a system A class in object oriented design serves as a blueprint in defining them structure/attributes and behaviour/methods of objects, it encapsulates data and operations, allowing for instantiation and creation of objects o Attributes in a class represent the data stored by instances and they convey the state or characteristics of an object instance, such as pages, or title in a class called Book o Operations of a class, also called methods, define the actions that can be performed on or by objects of that class, they manipulate attributes or perform specific tasks o Encapsulation is a concept in which the internal state of an object is hidden, and only a prescribed group of functions, that being the public methods, are accessible from outside the class, while private methods are hidden and accessible from only within the class ▪ Such that public methods within a class are the only methods able to access these private attributes, provided again that they are within the same class. o • • • • • • • Visibility modifiers such as public, private and protected, control the accessibility of class members, where as mentioned, public members are accessible from the outside class, while private is only accessible from within the class UML class diagrams o A UML class diagram is a structural diagram showing classes in a system and their relationships, this includes information about class attributes, operations, and visibility, o Static and non-static members in a class differ int hat the static members belong to a class itself and are shared by all instances, while non static belongs to the instance/object of that class. o UML class diagrams can be translated into java code by converting the attributes and operations into instance variables and methods, respectively in the java class ▪ An example of a class and its instances are book as a general template, with instances like the hobbit or captain underpants or something o UML class diagram consist of rectangles divided into three sections ▪ Top: class name ▪ Middle: attributes with + - ~ # access modifiers for public, private, package private and protected respectively ▪ Bottom: Operations (methods) with the same access modifiers o When an attribute or method is static in a class, as mentioned, this means that it belongs to the class as a whole, such that it is shared by all instances, in UML, we represent this by underlining these members, members referring to both the attributes and methods Constructors in object-oriented design are special operations that are used to create a new instance of a class, initialising the new object’s properties and setting its initial state. UML class diagrams, when converted into java code, involve attributes becoming instance variables, operations becoming methods and visibility indicators transforming into java access modifiers Software reuse in object oriented design employs the reuse of existing software or knowledge to build new software, facilitated by encapsulation, inheritance and polymorphism o Polymorphism describes the concept that you can access objects of different types through some interface o Encapsulation in object oriented sign involves the bundling date with methods that manipulate it, restricting direct access to some object components for information hiding A class versus an instance of a class is a distinction between a blueprint defining type and specific realisations of that type with concrete attribute values UML class diagrams depict constructors as operations without a return type responsible for initialising new instances of a class The significance of encapsulation lies ion grouping data and operations without a return type responsible for initialising new instances of a class • • • • • • • Constructors o Constructors play a vital role in grouping data and operations, hiding details from the rest of the system, and allowing interaction by means of using public methods, establishing a clear interface o Constructors play a vital role in object-oriented design such that they create new instances of a class, initialising object attributes and setting up necessary states or connections The inherent difference between static and non-static members in classes is that the static members are shared across all instances, while non static members are again, unique to each instance of the class o UML underpins static members by underlining them, distinguishing them from instance members Translating UML class diagrams into java involves the attributes becoming instance variables, operations becoming methods and visibility indicators becoming java access modifiers Attributes in Java derivative from UML class diagrams are translated into instance, preserving their visibility and type A class diagram exercise scenario for a student may for example involve a student class with attribute such as name, student number, programme of study, along with the methods for setting and getting these attributes, and the behaviours like attending class or doing assignments The facebook illusion and teams in general o This in software engineering refers to the misconception that a single person, such as well, Facebook founder Mark Zuckerberg, can program large, complex systems, like Facebook ALONE, this puts emphasis on the need for group-based software engineering o The properties of a good team in software engineering include the active contribution from all members, a clear division of labour, and a good understanding of the individual responsibilities, also requiring good communication, complementing the weaknesses of a group, and effective leadership Typical roles in a software engineering team include the customer interface manager, design manager, implementation manager, test manager and the planning and quality managers all of these imply their own roles o A customer interface manager manages the teams relationship with customers, they clarify the requirements, ensures responsiveness to customer requests and confirms understanding of the requirements o A design manager coordinates design documentation, ensures that standards are met, and guides the team in UML and design methodology, while ensuring high quality, well documented designs o The implementation manager tasks include ensuring the quality of the implementation, addressing programmer strengths, maintaining design clarity, adherence to coding standards, and integrating code into the entire system o The role of a test manager involves overseeing the quality of the teams testing, ensuring that timely test plans, comprehensive testing of all classes and methods, and enduring team members understand the testing strategies, they essentially ensure that the testing process is eloquent o • • • • • A planning ands quality manager is responsible for the role of team planning, reporting plan status, meeting frequency, minutes protocol, version control usage, code inspection, documentation quality and meeting the quality standard Meeting minutes o Minutes of meeting provide structure, continuity, memory aid, and progress monitoring, including the topics discussed, decisions made, progress since the last meeting and action items for the next meeting o The structure of the minutes of meeting is typically inclusive of three parts, that being the ▪ Topics and decisions ▪ Progress made since the last meeting ▪ A to do list of goals assigned to individuals o The importance of continuity and memory in minutes of meetings lies in helping attendees remember discussions from the last meeting, ensuring a clear understanding of ongoing topics and tasks, and the provision of continuity over time o Minutes of meetings aid the project progress by containing a to do list of goals assigned to individuals, allowing structured monitoring of project progress and breaking down larger tasks into manageable units o The typical contents of meeting minutes include ▪ The date and time of the meeting ▪ The people attending the meeting ▪ Topics discussed during the meeting ▪ Action items for the next meeting ▪ Any special items that are specific to the context of the meeting o The recommended length for minutes meetings is concise, fitting onto a double sided page of A4 for a one hour meeting, in such capturing the main points and decisions without a straight transcription of everything said ▪ Simply, it is an extrapolation of points made during the meeting such that revisiting the meeting minutes document is an easy process that makes it easy to understand what commitments were made, what progress was tracked and the such In class design, the responsibilities involve maintain the knowledge through object attributes and performing actions through behaviours/operations, representing the class’s purpose and services o Identifying classes and responsibility is done by examining the nouns and verbs in the requirements specification, ensuring all system responsibilities are identified through system walkthrough and use case diagrams o Responsibilities assigned to classes are identified by examining the context in which the responsibility was found, using requirements specifications and class definitions, and distributing responsibilities evenly across the system Guidelines for class responsibility include stating the responsibilities as generally as possible, keeping related information together, and maintaining information with related operations shared among related objects Class responsibilities are crucial in representing the purpose of the class and defining the services it provides within he system The difference between a class and an instance of a class is that the class is a blueprint defining a type, including its data and behaviour, while an instance/object is a concrete realisation with specific attribute values • • • • • • • • • • • • UML class diagrams depict constructors as operations without a return type, responsible for initialising new instances of a class Encapsulation in object-oriented design involves the budling of data and operations together, hiding details from the rest of the system, and allowing interaction through public methods, establishing a clear interface Constructors play a vital role in object-oriented design by creating new instances of a class, initialising object attributes, and setting up necessary state or connections The difference between static and non-static members in classes is that static members are shared across all instances, associated with the class itself, while non static members are unique to each instance UML indicates static members by underlying them in class diagrams, signifying their association with the class itself rather than the instance # In class design, responsibilities involve maintaining the knowledge through object attributes and performing actions through behaviours/operations, representing the class’s purpose and services Identifying classes and responsibilities is done by examining nouns and verbs in the requirements specification, enduring all system responsibilities are identified through the system walkthroughs and use case diagrams Responsibilities assigned to classes are identified by examining the context in which the responsibility was found, using requirements specifications and class definitions, and distributing responsibilities evenly across the system Guidelines for class responsibility include stating responsibilities as generally as possible, as such, wee keep the relate information together, and maintain information with related operations shared among related objects Shared responsibilities, as defined in class design, refers to the responsibilities that need to be divided among several classes due to their compound nature, this often is done through relationships between classes, such as composition, aggregation or hierarchy, in other words, certain tasks of behaviours are complex and involve multiple classes working together to achieve a common goal o On the other hand, unassigned responsibilities occur when a class is missing to handle certain responsibilities or when a responsibility could be assigned to more than one class, resolving unassigned responsibilities may require adding new classes or reassigning responsibilities through walk throughs, ensuring a comprehensive coverage of tasks in the system CRC cards, or class responsibility collaborator cards play a crucial role in class design, they help specify the responsibilities, including attributes and behaviours of a class and outline its collaborations with other classes. CRC cards provide a tangible and visual representation, aiding in the conceptualization and refinement of class designs The design approach in class design involves a systematic process, it begins with thinking about the data and operations that belong together, identifying candidate classes, CRC cards are then created, reflecting on the design to divide or merge responsibilities effectively. This process is followed by initialising a UML design to specify responsibilities effectively, this process is followed by then after designing or merging the responsibility as needed, initiating • • • • • • a UML design to specify the responsibilities and collaborations formally in the widely recognised UML format A class hierarchy is a structured organisation of classes based on inheritance o Inheritance establishes a relationship where subclasses inherit features from their parent classes, reducing redundancy of e.g., code and improving organisation ▪ And this implicitly makes designs more readable o Class hierarchy is a key concept in object oriented design, it provides a clear structure for organising and reusing code In the realm of object oriented programming, inheritance is a fundamental mechanism wherein a new class/subclass is derived from an existing class/superclass, this allows the class to inherit feature such as methods and attributes from the superclass while having the flexibility to add new features or modify preexisting ones. Superclass and subclass are terms used to define the relationship between classes in an inheritance hierarchy, a superclass is a general class from which other classes are derive from it. o Super classes provide a common set of attributes and methods o Subclasses by contrast are derivatives from super classes that are more specific than the superclass, inheriting its features and potentially adding to them or overriding them to serve a derived but special function Abstract classes and methods add another layer of complexity to class design, wherein abstract classes cannot be instantiated, and they often contain abstract methods, which are declared without an implementation o Abstract classes cannot have instances, they serve as an abstraction to be built upon through subclasses per se o The purpose of these abstract classes is to define a template for future subclasses, by having these abstract methods, we can ensure that the subclasses implement certain behaviours, promoting a consistent structure and behaviour among all the subclasses o Abstract classes serve as a foundation for creating related classes with shared characteristics ▪ This actually makes it easier to design and program them in the first place, say for instance we want to have a School design with students, but these students may have different permutations depending on their level of study, such that there are different levels of students with varying operations on their information, such that all students have common attribute such as name, age, home address etc, but need different function to extrapolate information about their specific level of study. We implement a hierarchical design such that we have an abstract student class covering these common attributes and behaviours pertaining to them, then the specific classes that inherit from it, subclasses, will have the same attributes as the student superclass but their own attributes and behaviours In the unified modelling language/UML, the representation of inheritance involves a hollow arrow pointing from the subclass to the superclass, this symbolizes a generalisationspecialisation relationship between classes. UML diagrams are essential in visually capturing the structure and relationships between classes, aiding in system comprehension The substitution principle, a key concept in object oriented programming, allows a subclass instance to be used wherever an instance of its superclass is expected, thus promoting • • • • • • flexibility and reuse. As objects of a derived class can seamlessly replace objects of their base classes without the need to affect the functionality of the program. Refining a class hierarchy involves the optimisation of the organisation of classes, this includes, but is not limited to moving common responsibilities as high up as possible in the hierarchy, eliminating nonfunctional or redundant unneeded classes, and ensuring that subclasses add or modify functionality MEANINGFULLY. o A well refined class hierarchy contributes more to a more maintainable and scalable system, scalability is an important aspect in the software development process that enables prior designed software to be easily transferable/mutable Interfaces in object oriented programming are contracts that define a set of abstract methods, implementing classes must provide concrete implementations of these methods, the interfaces enforce certain behaviours and allow for multiple inheritance of types, enhancing the flexibility in designing complex systems o Implementing interfaces in java is done through the use of the implements keyword, such that classes that implement an interface must provide concrete implementations of all the abstract methods defined in the interface, this ensures that classes adhering to the interface fulfil specific behaviours. Multiple inheritance of interface refers to a class that implements multiple interfaces, this allows the class to inherit the abstract methods of all the interfaces that it implements, multiple inheritance promotes greater flexibility and code reuse, as a class can exhibit multiple behaviours defined by different interfaces Comparing abstract classes and interfaces in java reveals the distinctions in their usage, such that o Abstract classes can have both abstract classes, without a body, and methods with an implementation, it is employed when classes share a common structure and behaviour o An interface on the other hand can only have abstract methods without implementations, serving the purpose of implementing the same method signatures across different classes, thus it INTERFACES The characteristics of methods o Those characteristics of the methods in interfaces differ from those in abstract classes, such that in interfaces, all the method are implicitly abstract and public, while in contrast, abstract classes can have abstract methods but can also provide specific implementations unique to the abstract class ▪ Think of it such that abstract classes can be superclasses or subclasses of other classes o Interfaces act as contracts for behaviours, while the abstract classes can offer common implementations shared with subclasses Choosing between an abstract class and an interface depends on the design goals o An abstract class is suitable when code needs to be shared among several closely related classes o Interfaces are preferred when various implementations share method signatures but not necessarily the same method implementation, or when specifying behaviour for disparate classes ▪ Method signatures are the combination of the method name and the parameter list in say java, it is used to distinguish methods/operations with • • • • • the same name but different parameters that go into it, so an operation may be different in behaviour depending on the parameters it takes ▪ Disparate as in different, not being able to be compared, such as explained by the above with the method signatures/interfaces The role of interfaces in enforcing a contract is significant, such that interfaces define a contract that a class agrees to perform, any class that implements the interface commits to providing specific behaviours/methods declared by the interface, this as such ensures consistency in how different classes can be used with the system Default methods in interfaces introduce a level of flexibility in interface evolution, these methods have a default implementation, enabling interfaces to evolve without breaking the classes that implement them. New methods can be added to the interfaces with default implementations, allowing for strong backwards compatibility Marker interfaces, although empty with no methods or fields, serve a specified/specific purpose, they indicate to the JVM/java virtual machine or other frameworks that the class implementing the interface will exhibit some special behaviour or requires a special processing, marker interfaces provide a way to communicate additional information about c a class’s intended usage Some more superclass subclass abstract inheritance shit o Super classes, also known as the parent or base class, is a general class that provides common attributes and behaviours that inherit from it, it occupies a higher level in the inheritance hierarchy and serves as a template for more specific classes o Subclasses on the other hand, are classes that can add new attributes and methods, or modify the inherited ones to create more specific functionality, subclasses represent more specialized types within the hierarchy o The difference between abstract and concrete classes lies in their instantiability. Abstract classes cannot be instantiated and often contain abstract methods which are intended to be implemented by subclasses. Concrete classes on the other hand are regular classes that can be instantiated, providing complete implementations of their methods. The purpose of an abstract class is to provide a common definition of a base class that multiple subclasses can share, it may include abstract methods without implementations expecting the subclasses to provide specific implementations, abstract classes contribute to code organisation and reuse Collaborations o Collaborations in object-oriented programming represents the relationships where one object/client utilises the services/responsibilities of another object/server to fulfil its own responsibilities. o Collaborations are one-way interactions designed to achieve specific goals and are crucial for defining object relationships. o Identifying collaborations involves examining the dependencies among responsibilities, collaborations become apparent when a class needs to use another class to fulfil its responsibilities, either by accessing data or by invocation of methods. Recognising these relationships is essential for designing effective and interconnected classes o In collaborations, the client is the class that requests a service, while the server is the class that provides the service, the server fulfils its own responsibilities by offering services to the client, this distinction helps understanding the flow of control and information within the system o • • • • • • • • • • Collaborations are typically implemented in code through public method calls between classes. In this interaction, the client class calls methods of the server class to access its services, effectively fulfilling its responsibilities, code implementation of collaborations is foundational to object-oriented programming. Compositions o Composition, as a class relationship is a strong form of association, it implies that the part, per se, cannot exist independently of the ‘whole’, the ‘part’ cannot exist without the ‘whole’, it is made up/composed from the whole. o UML diagrams denote this by a filled diamond and this signifies ownership, if the whole is destroyed, the parts composed of it/owned by it will also be destroyed, emphasizing a close and dependent relationship Aggregation o Aggregation is another class relationship, it is a weaker form compared to composition, it is represented by an unfilled diamond in UML, aggregation indicates that a whole-part relationship, in such case, the parts are able to exist independently of the whole, an aggregation implies a looser association between the classes Inheritance o Is a kind of Aggregation o Is made up of Composition o Owns a The above relationships contribute to modelling the structure and interactions of different components in a system. Each type of relationship serves a specific purpose in designing effective and modular systems. UML class diagrams in general play a significant role in showing the relationship between classes, these diagrams visually represent associations such as aggregation, composition and inheritance o UML diagrams aid in understanding the structure of a system and the interactions between its various components Collaborations, when translated into code, are typically realised through public methods calls o This means that one object calls the methods of another object to utilise its services, this implementation is foundational to object-oriented programming, facilitating effective communication between classes Storyboards in system design are sequences of sketches that illustrate a scenario or user interaction with the system o This draws inspiration from the film industry o Storyboards provide a visual representation of the flow and design of the user interface; they offer a tangible way to conceptualise and communicate the user experience o Task analysis, a core component of storyboarding, ensures that important tasks are covered in the storyboard, they provide insights about user classes and tasks, they identify the key usability aspects and help better understand the domain ▪ Task analysis contributes to creating user-centric and effective system designs UML activity diagrams are essential tools in software modelling, offering a visual representation of a process or system’s workflow, such done using standardised symbols, • • • depicting the sequence of actions and decision points, such providing a dynamic view of the system’s behaviour over time o UML activity diagrams contribute significantly to the system's modelling by capturing a modelling processes, decision points, concurrency, and synchronization. They offer insights into how different components interact with each other over time, aiding in understanding complex system behaviours. Transitioning to coding practices, coding conventions play a crucial role in maintaining code readability and consistency o Coding conventions encompass guidelines for layout, including rules for indentation, naming conventions, and overall code structure. o Adherence to coding conventions enhances collaboration, reduces bugs and promotes uniformity o The significance of coding conventions lies in facilitating easier code reading, understanding and maintenance. By promoting a consistent coding style, conventions help identify bugs, maintain code structure and ensure a seamless collaborative development process o Common elements in coding conventions include rules for indentations, spaces vs tabs for example, bracing styles for classes and methods, and guidelines for maximum line length and method length ▪ These elements collectively contribute to a standardizes and maintainable codebase o In the context of version control, check style emerges as a valuable tool, it is an automated tool designed to ensure that code adheres to specified coding standards, by enforcing rules that are specific to different projects or teams ▪ Check style saves time in ode reviews and aids in maintenance of coding standards consistently o The order rules within a java source file and the recommended order of modifiers further contribute to coding conventions ▪ Following these rules ensures a structured and organised codebase, enhancing code readability and maintainability Version control systems / VCS are pivotal in managing changes to code, especially in team environments, they record changes over time, allowing devs to recall specific versions later on. Two notable VCS are subversion/SVN and Git, they differ in their approach, SVN being centralised, and Git being distributed o Branches in VCS, like those present in Git, allow for the development of parallel versions that diverge from the main line, merging, a critical aspect of version control systems/VCS consolidates the changes from different branches back into the main branch, ensuring a coherent project history o Understanding and handling conflicts, situations where changes in different branches are incompatible with each other, is crucial in version control ▪ Conflicts will require manual intervention to reconcile differences and maintain the integrity of the merged version o Git’s approach to distributed development allows each developer to have a full copy of the project history, promoting independent work on local branches and seamless integration of changes back into the main repository. In the realm of documentation, Javadoc, a documentation tool available in Java plays a significant role in that it generates API documentation for comments in the source code, • • • • • • • • providing a clear and consistent format for documenting classes, interfaces, methods and fields o Javadoc comments follow a specific structure, beginning with /** and ending with */, and includes @tags for parameters, return values and exceptions o They contribute to the overall understanding of code by developers and assist in automatic generation of documentation The prior flashcards touch upon GUI development in java, specifically the evolution from AWT/Abstract Window Toolkit API to Swing and JavaFX o JavaFX, with its advanced features like CSS styling, offers a modern approach to GUI development o The structure of a JavaFX application involves extending the Application class, overriding the start method and creating a stage and a scene o JavaFX uses layout panes for effective layout management, ensuring responsive and organised displays, FXML, an XML based language, separates the GUI structure from application logic, simplifying the GUI design and improving code maintainability o Canvas in JavaFX provides a platform for drawing images using various features like circles, lines, and rectangles, it involves accessing the graphics context to set stroke and fill colours and draw shapes Shifting focus to software engineering, the flashcards introduce the concept of the software crisis, a period marked by challenges in developing large complex software systems, the waterfall model, such being a sequential design process, is discussed as an approach to software development with distinct phases such as requirements, design, implementation, testing and maintenance The waterfall model o The waterfall model’s advantage include providing a clear, structured approach, but it has its drawbacks o It proves to be rather inflexible to changes and makes it challenging to backgtrack to previous stages, making it unsuitable for projects with uncertain or rapidly changing requirements Effort distribution in software engineering involves balancing tasks among requirements engineering, design and testing, this allocation ensures a comprehensive approach to software development Software maintenance encompasses corrective, adaptive, perfective and preventive maintenance, addressing diverse needs post deployment, Boehms spiral model offers an iterative approach with a focus on risk analysis, proving beneficial for large, complex and high risk projects The global spready of teams and resources marks a shift in software development, teams are now dispersed worldwide, utilising components from various sources, including open source parts and web services Modern trends in software engineering highlight the rise of agile methods, a transition from creating to utilizing software, the impact of open source software and increased diversity in development methods Ethical practices and professional standards are crucial in software engineering, emphasizing public interest, client and employer priorities, high professional standards, and maintaining integrity, with ethical leadership while supporting colleagues and continuous learning is advocated • • • • • • • • • • • • • • • Core principles in software engineering includes a well managed development process, dependability, performance, effective specification and requirements management and the ruse of stable developed software The V model in software engineering emphasizes the verification and validation at each and every stage of development, ensuring a clear path for checking the project throughout its evolution The incremental model involves dividing a clear path for checking the product throughout its evolution o Each increment builds on the previous one, allowing partial implementation to be delivered and tested early on in the development cycle Agile methodologies focus on iterative and incremental development, fostering collab oration between cross functional teams. The agile manifesto prioritises individuals, working software, customer collaboration and responsiveness to change Agile methods have advantages such as client involvement, adaptability, collaboration and suitability for smaller teams, however the challenges include the difficulty in the process of scaling up for large projects, and managing the changing requirements Extreme programming / XP is known for its extreme approach to iterative development and frequent new versions, Incremental delivery faces challenges in identifying common facilities needed by all increments and managing system visibility and structure Rapid software development emphasizes the speedy delivery through techniques like prototyping, iterative development, and the use of software tools Lightweight agile methods, such as incremental development and delivery, extreme programming / XP, rapid programming and scrum offer flexible approach es to software development Incremental development and delivery involves designing, implementing and testing the product incrementally until completion, it allows for early delivery, improves risk management and simplifies complex projects The process of prototyping involves creating preliminary versions of software to explore design options and understand user needs, benefits of this process include improved usability, a closer match to user needs, enhanced design quality and reduced development effort. User stories in agile development describe software features from an end user perspective, aiding in understanding and prioritising requirements Scrum, an agile framework, manages iterative development through sprints, daily stand ups, sprint planning reviews and retrospectives, the scrum master facilitates the process and ensures adherence to agile practices Exceptions in java are objects representing errors or unexpected conditions, they disrupt the programs normal flow and are handled using try catch blocks o Designing custom exceptions in java involves extending existing exception classes to provide more meaningful error information o The throw early, catch late principle encourages throwing exceptions as soon as an error is detected and catching them at a higher level for proper handling o Squelching exceptions by using empty catch blocks can hide errors, leading to further issues, it is recommended to handle or propagate exceptions properly In summary, these flashcards cover a wide range of software engineering concepts, methodologies and best practices, from traditional models such as the waterfall model to • • • • • • • • • • • • • • modern agile methods, along with their ethical considerations, and specific java programming principles. The comprehensive nature of these topics reflects the diverse landscape of software development. Creating custom exceptions in Java is a straightforward process, by extending an existing exception class and adding a constructor to pass the error message, developers can tailor exceptions to specific error conditions The decision of whether to catch or propagate exceptions in java involves a best practice debate, it is recommended to catch exceptions when they can be meaningfully handled and to let them propagate otherwise o An example illustrates a scenario in java programming where this decision-making process is crucial based on the ability to effectively handle errors Java categorises exceptions into two types, those being o Checked exceptions, which must be caught or declared o Unchecked exceptions, these are runtime exceptions and errors, which are not required to be caught or declared In depth custom exception design involves defining new exception classes for specific error conditions, these classes should extend either runtime exception or exception, depending on whether they are checked or unchecked (declared or not declared for runtime exceptions and errors). Moving into the design principles of software engineering Subsystems are groups of classes that collaborate to perform specific functions, they serve as abstractions to simplify complex systems, enhancing communication and system understanding The purpose of subsystems is to simplify communication between classes, making the application easier to understand and modify Collaboration graphs visualise the flow of information between classes and subsystems, managing system complexity effectively. The subsystems design process involves analysing class hierarchies and collaborations to identify subsystems to be used, contributing to a well structured application, subsystems support contracts, redefining external class collaborations to subsystem-level interactions Identifying a subsystem involves looking for groups of classes with strong dependencies, common goals, or functionalities that can be logically grouped, subsystem cards specify subsystem contracts and how they are delegated to classes within the subsystem To simplify collaborations with subsystems, we must focus on minimising the external class interactions and contracts, this improves encapsulation and simplifies the design for better maintainability Minimising collaborations of a class involves reducing direct interactions with other classes, simplifying design and enhancing maintainability, similarly, minimising delegations aims to reduce the chain of method calls among classes, enhancing clarity and reducing dependencies An example of an inventory system illustrates the complexity that can arise with interdependencies among classes, through the use of subsystem design, the system can be streamlined into fewer, more streamlined steps. Nested subsystems are suggested when a subsystem has too many contracts, further dividing it into smaller, more manageable parts, checking the design involves reviewing subsystem design to reduce complexity, improve maintainability and ensure functionality • Integration testing is a crucial level of software testing where individual units are combined and tested as a group to expose faults in their interaction’s, it ensures that combined parts of an application function correctly, especially in complex systems o Common issues in integration testing include mismatched data types, incorrect data formats, timing issues, and communication errors between modules, stubs and drivers are used to simulate missing components and isolate the part of the system that is being tested o Top down integration testing starts from the top of the system hierarchy and progresses downwards, integrating modules step by step using stubs for lower modules. o Bottom up integration testing begins with testing the lower level modules and gradually integrates them into the higher level module s by making the use of drivers for the higher modules o Integration testing may pose challenges such as complexity, time consumption and requiring a thorough understanding of system interactions, frequent errors include mismatched parameters, units of measurement differences and out of range method arguments o A case study of the (planet) Mars Climate Orbiter emphasizes the importance of PROPER integration testing ▪ A failure in integration due to units of measurement mismatch led to an extremely costly mission failure o Stubs and drivers play a vital role in integration testing by simulating missing components ▪ Stubs mimic already called components ▪ While drivers mimic calling components o In summary, integration testing focuses on testing interfaces between components, fixing communication errors that occur when integrating different parts of a system, it comes after unit testing and before testing the entirety of the system, ensuring that the parts work well together/integrate nicely and setting the stage for the next phase of testing the whole system