<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Coding Minutes Blogs | Tech Articles, Roadmaps, Interview Tips]]></title><description><![CDATA[Get A-Z resources about Computer Science! Learn Data Structures in C/C++, Java, Python, Web Development, Machine Learning and more. Get Career Roadmaps, Interview Tips and crack your dream companies.]]></description><link>https://blog.codingminutes.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1658320967657/DZOIOUxj0.png</url><title>Coding Minutes Blogs | Tech Articles, Roadmaps, Interview Tips</title><link>https://blog.codingminutes.com</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 17 May 2026 15:27:03 GMT</lastBuildDate><atom:link href="https://blog.codingminutes.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Dependability Properties]]></title><description><![CDATA[Computer system failures are a common issue, with computers crashing or malfunctioning unexpectedly. This often leads to mistrust in personal computers. The dependability of a computer system refers to its trustworthiness, indicating the user's confi...]]></description><link>https://blog.codingminutes.com/dependability-properties</link><guid isPermaLink="true">https://blog.codingminutes.com/dependability-properties</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[Developer]]></category><category><![CDATA[coding]]></category><category><![CDATA[#codenewbies]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Sat, 01 Jun 2024 18:30:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712809380871/ce9d9b7c-493a-4a26-a40d-762abb63f4de.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Computer system failures are a common issue, with computers crashing or malfunctioning unexpectedly. This often leads to mistrust in personal computers. The dependability of a computer system refers to its trustworthiness, indicating the user's confidence in its expected operation without failure during normal use. Dependability cannot be quantified numerically.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710680589058/d4914001-230d-4668-8acc-2dec2fec51c8.png" alt class="image--center mx-auto" /></p>
<p>There are four principal dimensions of dependability, as shown</p>
<ol>
<li><p><strong>Availability:-</strong> the availability of a system is the probability that it will be up and running and able to deliver useful services to users at any given time.</p>
</li>
<li><p><strong>Reliability:-</strong> the reliability of a system is the probability, over a given period, that the system will correctly deliver services as expected by the user.</p>
</li>
<li><p><strong>Safety:-</strong> the safety of a system is a judgment of how likely it is that the system will cause damage to people or its environment.</p>
</li>
<li><p><strong>Security:-</strong> Informally, the security of a system is a judgment of how likely it is that the system can resist accidental or deliberate intrusions.</p>
</li>
</ol>
<p>As well as these four main dependability properties, you may also think of other system properties as dependability properties:</p>
<ol>
<li><p><strong>Repairability System:-</strong> failures are inevitable, but the disruption caused by failure can be minimized if the system can be repaired quickly. For that to happen, it must be possible to diagnose the problem, access the component that has failed, and make changes to fix that component. Repairability in software is enhanced when the organization using the system has access to the source code and has the skills to make changes to it. Open source software makes this easier but the reuse of components can make it more difficult.</p>
</li>
<li><p><strong>Maintainability:-</strong> As systems are used, new requirements emerge and it is important to maintain the usefulness of a system by changing it to accommodate these new requirements. Maintainable software is software that can be adapted economically to cope with new requirements, and where there is a low probability that making changes will introduce new errors into the system.</p>
</li>
<li><p><strong>Survivability:-</strong> A very important attribute of Internet-based systems is survivability. Survivability is the ability of a system to continue to deliver service whilst under attack and, potentially, whilst part of the system is disabled. Work on survivability focuses on identifying key system components and ensuring that they can deliver a minimal service.</p>
</li>
<li><p><strong>Error tolerance:-</strong> This property can be considered as part of usability and reflects the extent to which the system has been designed so that user input errors are avoided and tolerated. When user errors occur, the system should, as far as possible, detect these errors and either fix them automatically or request the user to reinput their data.</p>
</li>
</ol>
<p>In addition, you should usually assume that your software is not perfect and that software failures may occur. Your system should therefore include recovery mechanisms that make it possible to restore normal system service as quickly as possible.</p>
]]></content:encoded></item><item><title><![CDATA[Software Dependability]]></title><description><![CDATA[With the increasing integration of computer systems into various aspects of our lives, the repercussions of system and software failures are growing. Failures, such as server software malfunction in e-commerce or errors in embedded control systems in...]]></description><link>https://blog.codingminutes.com/software-dependability</link><guid isPermaLink="true">https://blog.codingminutes.com/software-dependability</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[Developer]]></category><category><![CDATA[coding]]></category><category><![CDATA[#codenewbies]]></category><category><![CDATA[engineering]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Fri, 31 May 2024 18:30:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712809240093/52491312-b095-4ecf-a6c8-91321a2d8e58.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>With the increasing integration of computer systems into various aspects of our lives, the repercussions of system and software failures are growing. Failures, such as server software malfunction in e-commerce or errors in embedded control systems in vehicles, can lead to significant financial losses and safety hazards. Malware infections in company PCs not only require costly cleanup operations but also pose risks to sensitive information. Given the criticality of software-intensive systems, trustworthiness is paramount, encompassing attributes like availability, reliability, safety, and security. Laprie (1995) proposed the term 'dependability' to encapsulate these interconnected properties, recognizing their interdependence.</p>
<p>The dependability of systems is now usually more important than their detailed functionality for the following reasons:</p>
<ol>
<li><p><strong>System failures affect a large number of people:-</strong> Many systems include functionality that is rarely used. If this functionality were left out of the system, only a small number of users would be affected. System failures, which affect the availability of a system, potentially affect all users of the system. Failure may mean that normal business is impossible.</p>
</li>
<li><p><strong>Users often reject systems that are unreliable, unsafe, or insecure:-</strong> If users find that a system is unreliable or insecure, they will refuse to use it. Furthermore, they may also refuse to buy or use other products from the same company that produced the unreliable system, because they believe that these products are also likely to be unreliable or insecure.</p>
</li>
<li><p><strong>System failure costs may be enormous:-</strong> For some applications, such as a reactor control system or an aircraft navigation system, the cost of system failure is orders of magnitude greater than the cost of the control system.</p>
</li>
<li><p><strong>Undependable systems may cause information loss:-</strong> Data is very expensive to collect and maintain; it is usually worth much more than the computer system on which it is processed. The cost of recovering lost or corrupt data is usually very high.</p>
</li>
</ol>
<p>The software executes in an operational environment that includes the hardware on which the software executes, the human users of that software, and organizational or business processes where the software is used. When designing a dependable system, you, therefore, have to consider:</p>
<ol>
<li><p><strong>Hardware failure:-</strong> System hardware may fail because of mistakes in its design because components fail as a result of manufacturing errors, or because the components have reached the end of their natural life.</p>
</li>
<li><p><strong>Software failure:-</strong> System software may fail because of mistakes in its specification, design, or implementation.</p>
</li>
<li><p><strong>Operational failure:-</strong> Human users may fail to use or operate the system correctly. As hardware and software have become more reliable, failures in operation are now, perhaps, the largest single cause of system failures.</p>
</li>
</ol>
<p>Failures in software-intensive systems are often interconnected. For instance, a hardware failure can lead to stress on system operators, resulting in mistakes that further exacerbate software failures. This creates a cycle of increased workload and stress. Therefore, designers must adopt a holistic approach, considering hardware, software, and operational processes together. Separately designed components without accounting for potential weaknesses in other parts increase the likelihood of errors at system interfaces.</p>
]]></content:encoded></item><item><title><![CDATA[User Testing]]></title><description><![CDATA[User or customer testing is a crucial stage in the testing process where users or customers provide input and feedback on the system being tested.
It can involve formal testing of a system commissioned from an external supplier or an informal process...]]></description><link>https://blog.codingminutes.com/user-testing</link><guid isPermaLink="true">https://blog.codingminutes.com/user-testing</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[coding]]></category><category><![CDATA[#codenewbies]]></category><category><![CDATA[Developer]]></category><category><![CDATA[engineering]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Thu, 30 May 2024 18:30:28 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712809126919/8e2397be-bf99-468c-aa91-53f92db6370a.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>User or customer testing is a crucial stage in the testing process where users or customers provide input and feedback on the system being tested.</p>
<p>It can involve formal testing of a system commissioned from an external supplier or an informal process where users experiment with new software to assess its suitability. Even after comprehensive system and release testing, user testing remains essential due to its impact on reliability, performance, usability, and robustness.</p>
<p>The user's working environment significantly influences the system's functionality, which developers may not replicate accurately in their testing environments.</p>
<p>Developers' testing environments are often artificial and cannot simulate real-world scenarios. For instance, a system designed for hospital use must be tested in a clinical environment, considering factors like patient emergencies and interactions with relatives, which cannot be replicated in a developer's setting.</p>
<p>In practice, there are three different types of user testing:</p>
<ol>
<li><p>Alpha testing:- where users of the software work with the development team to test the software at the developer’s site.</p>
</li>
<li><p>Beta testing:- where a release of the software is made available to users to allow them to experiment and to raise problems that they discover with the system developers.</p>
</li>
<li><p>Acceptance testing:- where customers test a system to decide whether or not it is ready to be accepted by the system developers and deployed in the customer environment.</p>
</li>
</ol>
<p>Acceptance testing is an inherent part of custom systems development. It takes place after release testing. It involves a customer formally testing a system to decide whether or not it should be accepted by the system developer. Acceptance implies that payment should be made to the system.</p>
<p>There are six stages in the acceptance testing process:-</p>
<ol>
<li><p><strong>Define acceptance criteria:-</strong> This stage should, ideally, take place early in the process before the contract for the system is signed. The acceptance criteria should be part of the system contract and be agreed between the customer and the developer. In practice, however, it can be difficult to define criteria so early in the process. Detailed requirements may not be available and there may be significant requirements change during the development process.</p>
</li>
<li><p><strong>Plan acceptance testing:-</strong> This involves deciding on the resources, time, and budget for acceptance testing and establishing a testing schedule. The acceptance test plan should also discuss the required coverage of the requirements and the order in which system features are tested. It should define risks to the testing process, such as system crashes and inadequate performance, and discuss how these risks can be mitigated.</p>
</li>
<li><p><strong>Derive acceptance tests:-</strong> Once acceptance criteria have been established, tests have to be designed to check whether or not a system is acceptable. Acceptance tests should aim to test both the functional and non-functional characteristics of the system. They should, ideally, provide complete coverage of the system requirements. In practice, it is difficult to establish completely objective acceptance criteria. There is often scope for argument about whether or not a test shows that a criterion has definitely been met.</p>
</li>
<li><p><strong>Run acceptance tests:-</strong> The agreed acceptance tests are executed on the system. Ideally, this should take place in the actual environment where the system will be used, but this may be disruptive and impractical. Therefore, a user testing environment may have to be set up to run these tests. It is difficult to automate this process as part of the acceptance tests may involve testing the interactions between end-users and the system. Some training of end-users may be required.</p>
</li>
<li><p><strong>Negotiate test results:-</strong> It is very unlikely that all of the defined acceptance tests will pass and that there will be no problems with the system. If this is the case, then acceptance testing is complete and the system can be handed over. More commonly, some problems will be discovered. In such cases, the developer and the customer have to negotiate to decide if the system is good enough to be put into use. They must also agree on the developer’s response to identified problems.</p>
</li>
<li><p><strong>Reject/accept system:-</strong> This stage involves a meeting between the developers and the customer to decide whether or not the system should be accepted. If the system is not good enough for use, then further development is required to fix the identified problems. Once complete, the acceptance testing phase is repeated.</p>
</li>
</ol>
<p>User or customer testing is a vital stage in the testing process where users provide feedback on the system. This feedback is essential for assessing reliability, performance, usability, and robustness. Developers often cannot replicate the real-world working environment, which makes user testing crucial even after comprehensive system testing.</p>
]]></content:encoded></item><item><title><![CDATA[Release Testing]]></title><description><![CDATA[Release testing is the process of testing a particular release of a system that is intended for use outside of the development team. Normally, the system release is for customers and users. In a complex project, however, the release could be for othe...]]></description><link>https://blog.codingminutes.com/release-testing</link><guid isPermaLink="true">https://blog.codingminutes.com/release-testing</guid><category><![CDATA[software development]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[coding]]></category><category><![CDATA[#codenewbies]]></category><category><![CDATA[Developer]]></category><category><![CDATA[engineering]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Wed, 29 May 2024 18:30:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712809028020/56e382be-3d1e-4e99-97e8-1d38e876b2d8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Release testing is the process of testing a particular release of a system that is intended for use outside of the development team. Normally, the system release is for customers and users. In a complex project, however, the release could be for other teams that are developing related systems. For software products, the release could be for product management who then prepare it for sale. There are two important distinctions between release testing and system testing during the development process:</p>
<ol>
<li><p>A separate team that has not been involved in the system development should be responsible for release testing.</p>
</li>
<li><p>System testing by the development team should focus on discovering bugs in the system (defect testing). The objective of release testing is to check that the system meets its requirements and is good enough for external use (validation testing).</p>
</li>
</ol>
<p>The primary objective of release testing is to assure the system supplier that the software is ready for use and can be released as a product or delivered to the customer. Release testing demonstrates that the system meets specified functionality, performance, and dependability requirements, ensuring it operates reliably under normal conditions. It encompasses all system requirements, not just those of end-users.</p>
<p>Typically, release testing adopts a black-box approach, deriving tests from the system specification. This method treats the system as a black box, focusing solely on its inputs and outputs, without considering the software's internal implementation details. This approach is also known as functional testing, emphasizing the assessment of functionality rather than software implementation.</p>
<p>In good requirements engineering practice, requirements should be testable, meaning that a test can be designed to verify each requirement. Requirements-based testing follows a systematic approach to test case design, where tests are derived for each requirement. Unlike defect testing, requirements-based testing focuses on validation, aiming to demonstrate that the system has correctly implemented its requirements.</p>
<p>Release testing is further categorized into two types:-</p>
<ol>
<li><p>Scenario testing.</p>
</li>
<li><p>Performance testing.</p>
</li>
<li><p>Requirement based testing</p>
</li>
</ol>
<p>Now let us understand about each of them in detail-</p>
<ol>
<li><strong>Scenario testing:-</strong></li>
</ol>
<ul>
<li><p>Scenario testing is an approach to release testing where you devise typical scenarios of use and use these to develop test cases for the system.</p>
</li>
<li><p>A scenario is a story that describes one way in which the system might be used.</p>
</li>
<li><p>Scenarios should be realistic and real system users should be able to relate to them.</p>
</li>
</ul>
<ol start="2">
<li><strong>Performance testing-</strong></li>
</ol>
<ul>
<li><p>Performance testing is the testing designed to ensure that the system can process its intended load. This usually involves running a series of tests where you increase the load until the system performance becomes unacceptable.</p>
</li>
<li><p>Performance testing is concerned with both, demonstrating that the system meets its requirements and discovering problems and defects in the system.</p>
</li>
<li><p>To test whether performance requirements are being achieved, you may have to construct an operational profile.</p>
</li>
<li><p>An operational profile is a set of tests that reflect the actual mix of work that will be handled by the system.</p>
</li>
<li><p>Therefore, if 90% of the transactions in a system are of type A; 5% of type B; and the remainder of types C, D, and E, then you have to design the operational profile so that the vast majority of tests are of type A.</p>
</li>
</ul>
<ol start="3">
<li><p>Requirement based testing:-</p>
<ul>
<li><p>Good requirements engineering practice emphasizes that requirements should be testable.</p>
</li>
<li><p>Testability ensures that a test can be designed for each requirement, facilitating validation.</p>
</li>
<li><p>Requirements-based testing is a systematic approach to test case design.</p>
</li>
<li><p>It involves considering each requirement and deriving a set of tests for them.</p>
</li>
<li><p>Requirements-based testing focuses on validation rather than defect testing.</p>
</li>
<li><p>It aims to demonstrate that the system properly implements its requirements.</p>
</li>
<li><p>Multiple related tests need to be developed to ensure requirements satisfaction.</p>
</li>
<li><p>Each test case corresponds to a specific aspect of the requirement being tested.</p>
</li>
<li><p>Testing a requirement involves creating multiple test cases to ensure comprehensive coverage.</p>
</li>
<li><p>It ensures that different scenarios and conditions are considered to validate the requirement thoroughly.</p>
</li>
</ul>
</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[Test Driven Developement]]></title><description><![CDATA[Test-driven development (TDD) is a programming methodology where testing and code development are interleaved. It involves incrementally developing code alongside corresponding tests, ensuring that each increment of code passes its respective test be...]]></description><link>https://blog.codingminutes.com/test-driven-developement</link><guid isPermaLink="true">https://blog.codingminutes.com/test-driven-developement</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[Developer]]></category><category><![CDATA[coding]]></category><category><![CDATA[#codenewbies]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Tue, 28 May 2024 18:30:23 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712808617568/b2eda360-3df6-4fe5-9d67-a6167fcdf36b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Test-driven development (TDD) is a programming methodology where testing and code development are interleaved. It involves incrementally developing code alongside corresponding tests, ensuring that each increment of code passes its respective test before proceeding to the next increment. Originally associated with agile methods like Extreme Programming, TDD can also be applied within plan-driven development processes.</p>
<p>Fig -</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710679723503/8c046d16-997c-415c-ba1f-2d93fadbf6b8.png" alt class="image--center mx-auto" /></p>
<p>The fundamental TDD process is shown in Figure. The steps in the process are as follows:</p>
<ol>
<li><p>You start by identifying the increment of functionality that is required. This should normally be small and implementable in a few lines of code.</p>
</li>
<li><p>You write a test for this functionality and implement this as an automated test. This means that the test can be executed and will report whether or not it has passed or failed.</p>
</li>
<li><p>You then run the test, along with all other tests that have been implemented. Initially, you have not implemented the functionality so the new test will fail. This is deliberate as it shows that the test adds something to the test set.</p>
</li>
<li><p>You then implement the functionality and re-run the test. This may involve refactoring existing code to improve it and adding new code to what’s already there.</p>
</li>
<li><p>Once all tests run successfully, you move on to implementing the next chunk of functionality.</p>
</li>
</ol>
<p>The benefits of test-driven development are:</p>
<ol>
<li><p>Code coverage:- In principle, every code segment that you write should have at least one associated test. Therefore, you can be confident that all of the code in the system has actually been executed. Code is tested as it is written so defects are discovered early in the development process.</p>
</li>
<li><p>Regression testing:- A test suite is developed incrementally as a program is developed. You can always run regression tests to check that changes to the program have not introduced new bugs.</p>
</li>
<li><p>Simplified debugging:- When a test fails, it should be obvious where the problem lies. The newly written code needs to be checked and modified. You do not need to use debugging tools to locate the problem. Reports of the use of test-driven development suggest that it is hardly ever necessary to use an automated debugger in test-driven development (Martin, 2007).</p>
</li>
<li><p>System documentation:- The tests themselves act as a form of documentation that describes what the code should be doing. Reading the tests can make it easier to understand the code.</p>
</li>
</ol>
<p>Test-driven development (TDD) offers significant benefits by reducing the costs associated with regression testing. Regression testing, which verifies that system changes haven't introduced new bugs, can be costly and impractical when done manually. Automated testing, integral to TDD, dramatically decreases these costs by swiftly rerunning existing tests after system changes.</p>
<p>TDD ensures that all existing tests pass before new functionality is added, providing confidence in the code's integrity. While TDD is most effective in new software development with well-tested components or libraries, it may not be suitable for multi-threaded systems due to potential interleaving issues. Despite its effectiveness, TDD still requires system testing to validate the system against stakeholder requirements, ensuring performance, reliability, and correctness.</p>
<p>TDD has been successful in small to medium-sized projects, with many programmers finding it a more productive approach, though its impact on code quality has yielded mixed results in trials. However, there is no evidence to suggest that TDD leads to poorer quality code.</p>
]]></content:encoded></item><item><title><![CDATA[Component and System Testing]]></title><description><![CDATA[Component testing-
Component testing is a level of software testing that focuses on verifying the functionality, performance, and behaviour of individual software components or modules. A software component is a self-contained unit of software that p...]]></description><link>https://blog.codingminutes.com/component-and-system-testing</link><guid isPermaLink="true">https://blog.codingminutes.com/component-and-system-testing</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[coding]]></category><category><![CDATA[#codenewbies]]></category><category><![CDATA[Developer]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Mon, 27 May 2024 18:30:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712808253918/1410b098-c24b-4c18-8d55-8e2045d108db.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-component-testing">Component testing-</h3>
<p>Component testing is a level of software testing that focuses on verifying the functionality, performance, and behaviour of individual software components or modules. A software component is a self-contained unit of software that performs a specific function or task within a larger system. Component testing involves testing each component in isolation from the rest of the system to ensure that it behaves as expected and meets its specified requirements. This testing is typically performed after unit testing (testing of individual functions or methods) and before integration testing (testing the interaction between components or modules).</p>
<p>There are different types of interfaces between program components and, consequently, different types of interface errors that can occur:</p>
<ol>
<li><p>Parameter interfaces: These are interfaces in which data or sometimes function references are passed from one component to another. Methods in an object have a parameter interface.</p>
</li>
<li><p>Shared memory interfaces: These are interfaces in which a block of memory is shared between components. Data is placed in the memory by one subsystem and retrieved from there by other subsystems. This type of interface is often used in embedded systems, where sensors create data that is retrieved and processed by other system components.</p>
</li>
<li><p>Procedural interfaces: These are interfaces in which one component encapsulates a set of procedures that can be called by other components. Objects and reusable components have this form of interface.</p>
</li>
<li><p>Message-passing interfaces: These are interfaces in which one component requests a service from another component by passing a message to it. A return message includes the results of executing the service. Some object-oriented systems have this form of interface, as do client–server systems.</p>
</li>
</ol>
<p>Testing for interface defects is difficult because some interface faults may only manifest themselves under unusual conditions. For example, suppose an object implements a queue as a fixed-length data structure. A calling object may assume that the queue is implemented as an infinite data structure and may not check for queue overflow when an item is entered. This condition can only be detected during testing by designing test cases that force the queue to overflow and cause that overflow to corrupt the object behaviour in some detectable way.</p>
<p>Interface errors are one of the most common forms of errors in complex systems (Lutz, 1993). These errors fall into three classes:</p>
<ol>
<li><p>Interface misuse: A calling component calls some other component and makes an error in the use of its interface. This type of error is common with parameter interfaces, where parameters may be of the wrong type or be passed in the wrong order, or the wrong number of parameters may be passed.</p>
</li>
<li><p>Interface misunderstanding: A calling component misunderstands the specification of the interface of the called component and makes assumptions about its behavior. The called component does not behave as expected, which then causes unexpected behavior in the calling component. For example, a binary search method may be called with a parameter that is an unordered array. The search would then fail.</p>
</li>
<li><p>Timing errors: These occur in real-time systems that use a shared memory or a message-passing interface. The producer of data and the consumer of data may operate at different speeds. Unless particular care is taken in the interface design, the consumer can access out-of-date information because the producer of the information has not updated the shared interface information.</p>
</li>
</ol>
<p>Some general guidelines for interface testing are:</p>
<ol>
<li><p>Examine the code to be tested and explicitly list each call to an external component. Design a set of tests in which the values of the parameters to the external components are at the extreme ends of their ranges. These extreme values are most likely to reveal interface inconsistencies.</p>
</li>
<li><p>Where pointers are passed across an interface, always test the interface with null pointer parameters.</p>
</li>
<li><p>Where a component is called through a procedural interface, design tests that deliberately cause the component to fail. Differing failure assumptions are one of the most common specification misunderstandings.</p>
</li>
<li><p>Use stress testing in message-passing systems. This means that you should design tests that generate many more messages than are likely to occur in practice. This is an effective way of revealing timing problems.</p>
</li>
<li><p>Where several components interact through shared memory, design tests that vary the order in which these components are activated. These tests may reveal implicit assumptions made by the programmer about the order in which the shared data is produced and consumed.</p>
</li>
</ol>
<p>Overall, component testing plays a crucial role in the software development lifecycle by helping to ensure the quality, reliability, and effectiveness of individual software components before they are integrated into the larger system.</p>
<h3 id="heading-system-testing">System testing-</h3>
<p>System testing during development involves integrating components to create a version of the system and then testing the integrated system. System testing checks that components are compatible, interact correctly, and transfer the right data at the right time across their interfaces. It obviously overlaps with component testing but there are two important differences:</p>
<ol>
<li><p>During system testing, reusable components that have been separately developed and off-the-shelf systems may be integrated with newly developed components. The complete system is then tested.</p>
</li>
<li><p>Components developed by different team members or groups may be integrated at this stage. System testing is a collective rather than an individual process. In some companies, system testing may involve a separate testing team with no involvement from designers and programmers.</p>
</li>
</ol>
<p>When you combine components to build a system, you get new behaviours that might be planned or unplanned. Planned behaviours, like restricting information updates to authorized users, need testing. Unplanned behaviours should also be tested to ensure the system behaves correctly. System testing focuses on how components interact, revealing bugs and misunderstandings. Using case-based testing is effective because it forces interactions, and sequence diagrams help identify operations for testing. For instance, in a weather station system, when a request is made for data collection, a series of methods are executed to respond.</p>
<p>In system testing, it's common to focus on individual features, which typically work well in isolation. However, problems often arise when less commonly used features are combined without proper testing. For example, using footnotes with a multicolumn layout in a word processor may lead to incorrect text layout.</p>
<p>Automated system testing is more challenging than unit or component testing because predicting and encoding outputs can be difficult, especially for complex or large outputs. While automated unit testing relies on comparing predicted outputs with actual results, system testing may require examining outputs for credibility without being able to create them in advance.</p>
<p>Advantages of System Testing:</p>
<ol>
<li><p>Comprehensive Evaluation: System testing assesses the entire software system, ensuring that all components work together as intended and meet the specified requirements.</p>
</li>
<li><p>Realistic User Experience: Testing the system as a whole provides a more realistic simulation of user interactions, helping to identify issues that may only arise in real-world usage scenarios.</p>
</li>
<li><p>Identifying Integration Issues: System testing reveals any integration problems between individual components or modules, ensuring seamless operation of the entire system.</p>
</li>
<li><p>Verification of System Functionality: It verifies that the software system performs all intended functions correctly and meets user expectations, enhancing overall reliability and quality.</p>
</li>
<li><p>Validation of Non-functional Requirements: System testing validates non-functional requirements such as performance, reliability, scalability, and security, ensuring that the system meets these criteria.</p>
</li>
</ol>
<p>Disadvantages of System Testing:</p>
<ol>
<li><p>Complexity: System testing can be complex and time-consuming, especially for large and intricate software systems, leading to higher testing costs and longer timeframes.</p>
</li>
<li><p>Dependency on Environment: The success of system testing may depend on specific environments, configurations, or external dependencies, making it challenging to replicate consistent testing conditions.</p>
</li>
<li><p>Limited Coverage: Despite efforts to cover all aspects of the system, it may not be possible to test every possible scenario exhaustively, leading to potential gaps in test coverage and overlooking certain issues.</p>
</li>
<li><p>Late Detection of Defects: System testing typically occurs after unit after unit and integration testing, which means that defects discovered at this stage may require more effort and resources to rectify, potentially delaying the project schedule.</p>
</li>
<li><p>Difficulty in Debugging: Identifying the root cause of issues found during system testing can be challenging due to the complexity of interactions between various components, making debugging and resolution more time-consuming.</p>
</li>
</ol>
<p>This is all about the component testing and system testing.</p>
]]></content:encoded></item><item><title><![CDATA[Development Testing]]></title><description><![CDATA[Development testing includes all testing activities that are carried out by the team developing the system. The tester of the software is usually the programmer who developed that software, although this is not always the case.
For critical systems, ...]]></description><link>https://blog.codingminutes.com/development-testing</link><guid isPermaLink="true">https://blog.codingminutes.com/development-testing</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[Developer]]></category><category><![CDATA[engineering]]></category><category><![CDATA[coding]]></category><category><![CDATA[#codenewbies]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Sun, 26 May 2024 18:30:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712808042676/402facd1-a709-4ef9-b2f5-44a680fa62dc.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Development testing includes all testing activities that are carried out by the team developing the system. The tester of the software is usually the programmer who developed that software, although this is not always the case.</p>
<p>For critical systems, a more formal process may be used, with a separate testing group within the development team. They are responsible for developing tests and maintaining detailed records of test results. During development, testing may be carried out at three levels of granularity:</p>
<ol>
<li><p>Unit testing:- where individual program units or object classes are tested. Unit testing should focus on testing the functionality of objects or methods.</p>
</li>
<li><p>Component testing:- where several individual units are integrated to create composite components. Component testing should focus on testing component interfaces.</p>
</li>
<li><p>System testing:- where some or all of the components in a system are integrated and the system is tested as a whole. System testing should focus on testing component interactions.</p>
</li>
</ol>
<p>Development testing is primarily a defect testing process, where the aim of testing is to discover bugs in the software. It is therefore usually interleaved with debugging— the process of locating problems with the code and changing the program to fix these problems.</p>
<p>Now let us understand each of these in detail.-</p>
<h3 id="heading-unit-testing"><strong>Unit testing:-</strong></h3>
<p>Unit testing is a crucial process in software development, involving the testing of program components such as methods or object classes to ensure their proper functioning.</p>
<p>When testing individual functions or methods, it's essential to design tests that involve calling routines with different input parameters, utilizing approaches discussed in test case design.</p>
<p>On the other hand, when testing object classes, thorough tests should cover all features, including testing all operations associated with the object, setting and checking the value of all attributes, and simulating all possible states and state changes.</p>
<p>In cases of inheritance, testing becomes more complex as inherited operations may rely on assumptions not valid in subclasses, necessitating testing in all relevant contexts.</p>
<p>Unit testing further involves of:-</p>
<ol>
<li><p>State testing.</p>
</li>
<li><p>Automated testing.</p>
</li>
</ol>
<p>Now let us understand each of them in detail.</p>
<ol>
<li><p><strong>State testing</strong> involves using a state model to identify and test state transition sequences, ensuring comprehensive coverage of the object's behaviour.</p>
</li>
<li><p><strong>Automating unit testing</strong> using frameworks, the process allowing for quick execution of tests after program changes. Automated tests typically comprise setup, call, and assertion parts, facilitating efficient testing of the system's functionality.</p>
</li>
</ol>
<p>An automated test has three parts:</p>
<ol>
<li><p>A setup part, where you initialize the system with the test case, namely the inputs and expected outputs.</p>
</li>
<li><p>A call part is where you call the object or method to be tested.</p>
</li>
<li><p>An assertion part where you compare the result of the call with the expected result. If the assertion evaluates to true, the test has been successful; if false, then it has failed.</p>
</li>
</ol>
<p>When testing an object, there may be dependencies on external objects that are either unavailable or could slow down the testing process, such as when the object interacts with a database, necessitating time-consuming setup procedures. To address this, mock objects can be employed.</p>
<p>Mock objects mimic the behaviour of external dependencies, offering a lightweight alternative. For instance, a mock object emulating a database might contain a minimal dataset organized in an array, enabling swift access without the overhead of disk operations. Similarly, mock objects can simulate uncommon scenarios, like specific times of day, bypassing the need for real-time data, and thereby enhancing testing efficiency and flexibility.</p>
<p>Now let us learn about the choosing unit test cases-</p>
<p>Testing is expensive and time-consuming, so it is important that you choose effective unit test cases. Effectiveness, in this case, means two things:</p>
<ol>
<li><p>The test cases should show that, when used as expected, the component that you are testing does what it is supposed to do.</p>
</li>
<li><p>If there are defects in the component, these should be revealed by test cases.</p>
</li>
</ol>
<p>You should therefore write two kinds of test cases. The first of these should reflect the normal operation of a program and should show that the component works. For example, if you are testing a component that creates and initializes a new patient record, then your test case should show that the record exists in a database and that its fields have been set as specified.</p>
<p>The other kind of test case should be based on testing experience of where common problems arise. It should use abnormal inputs to check that these are properly processed and do not crash the component.</p>
<p>I discuss two possible strategies here that can be effective in helping you choose test cases. These are:</p>
<ol>
<li><p><strong>Partition testing</strong>, where you identify groups of inputs that have common characteristics and should be processed in the same way. You should choose tests from within each of these groups.</p>
</li>
<li><p><strong>Guideline-based testing</strong>, where you use testing guidelines to choose test cases. These guidelines reflect previous experience with the kinds of errors that programmers often make when developing components.</p>
</li>
</ol>
<ul>
<li><p>Equivalence partitioning, also known as equivalence classes or domains, is a systematic approach to test case design based on grouping input and output data into classes with similar characteristics. Programs typically behave similarly for all members of a class, so test cases are designed to cover these partitions. Input and output equivalence partitions are identified, with the program expected to handle all members of an input partition consistently.</p>
</li>
<li><p>Test cases are selected from these partitions, focusing on boundary cases and values close to the partition midpoint. Failure to consider boundary values may lead to program failures. Partitions are identified using program specifications, user documentation, and experience.</p>
</li>
<li><p>Black-box testing, which relies solely on system specifications, is complemented by white-box testing, which involves examining the program's code for additional tests, such as exception handling. This holistic testing approach ensures comprehensive coverage of various scenarios, improving the reliability of the software.</p>
</li>
<li><p>Equivalence partitioning is an effective approach to testing because it helps account for errors that programmers often make when processing inputs at the edges of partitions. You can also use testing guidelines to help choose test cases.</p>
</li>
</ul>
<p>Guidelines encapsulate knowledge of what kinds of test cases are effective for discovering errors. For example, when you are testing programs with sequences, arrays, or lists, guidelines that could help reveal defects include:</p>
<ol>
<li><p>Test software with sequences that have only a single value. Programmers naturally think of sequences as made up of several values and sometimes they embed this assumption in their programs. Consequently, if presented with a single value sequence, a program may not work properly.</p>
</li>
<li><p>Use different sequences of different sizes in different tests. This decreases the chances that a program with defects will accidentally produce a correct output because of some accidental characteristics of the input.</p>
</li>
<li><p>Derive tests so that the first, middle, and last elements of the sequence are accessed. This approach reveals problems at partition boundaries.</p>
</li>
</ol>
<p>We will learn about component testing and system testing in our next blogs.</p>
]]></content:encoded></item><item><title><![CDATA[Software Testing]]></title><description><![CDATA[Software testing is a comprehensive process that involves evaluating a software application or system to ensure it meets specified requirements and functions correctly. It's a critical phase of the software development lifecycle (SDLC) that helps ide...]]></description><link>https://blog.codingminutes.com/software-testing</link><guid isPermaLink="true">https://blog.codingminutes.com/software-testing</guid><category><![CDATA[DBMS]]></category><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Sat, 25 May 2024 18:30:22 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1714641229030/fbac98d7-6285-4144-bfa6-bcea50d3e5f0.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Software testing is a comprehensive process that involves evaluating a software application or system to ensure it meets specified requirements and functions correctly. It's a critical phase of the software development lifecycle (SDLC) that helps identify defects, errors, or bugs before the software is released to end-users.</p>
<p>Testing is intended to show that a program does what it is intended to do and to discover program defects before it is put into use. When you test software, you run the program using fake or simulated information. Then, you carefully look at the results of this test to see if there are any mistakes, or weird things happening, or if the program isn't working as it should in some aspects.</p>
<p>There are two main reasons for doing this testing:</p>
<p>To Show It Works Right: First, we want to prove to the person who made the software (the developer) and the person who wants to use it (the customer) that the software does what it's supposed to do. If the software was made specifically for someone, like a custom-made tool, then there should be a test for each thing the software is supposed to do, as written down in a document called the requirements.</p>
<p>If it's a software product that lots of people will use, like an app, then there should be tests for every feature it has, and also for different combinations of these features that will be in the final product.</p>
<p>To Find Mistakes: The second reason is to catch any situations where the software doesn't behave the way it should. These mistakes are called defects, and finding them is called defect testing. It's all about spotting when the software does something wrong, like crashing unexpectedly, not working well with other programs, doing math incorrectly, or messing up data.</p>
<p>So, in simple terms, software testing is like giving the software a test to see if it works correctly and if it doesn't, figuring out what's wrong with it so it can be fixed.</p>
<p>While validation testing seeks to confirm that the system behaves as expected, defect testing aims to identify flaws or errors in the system's behaviour. However, it's essential to recognize that testing cannot guarantee the absence of defects entirely. As Edsger Dijkstra famously stated, "Testing can only show the presence of errors, not their absence."</p>
<p>Moreover, software testing is just one component of a broader process known as verification and validation (V&amp;V). Barry Boehm, a pioneer of software engineering, succinctly expressed the difference between them (Boehm, 1979):</p>
<p>‘Validation: Are we building the right product?’</p>
<p>‘Verification: Are we building the product right?’</p>
<p>Verification and validation processes ensure that the software being developed meets its specifications and satisfies the expectations of the stakeholders. Verification focuses on confirming that the software meets its functional and non-functional requirements, while validation ensures that it meets the customer's expectations and goes beyond just conforming to specifications.</p>
<p>Since requirements specifications may not always accurately represent the users' true needs, validation becomes crucial. Ultimately, the goal of verification and validation is to establish confidence that the software is "fit for purpose," meaning it's suitable for its intended use. The level of confidence required depends on factors such as the system's purpose, user expectations, and the current market environment. Now let us learn about these in detail-</p>
<ol>
<li><p>Software purpose: The more critical the software, the more important that it is reliable. For example, the level of confidence required for software used to control a safety-critical system is much higher than that required for a prototype that has been developed to demonstrate new product ideas.</p>
</li>
<li><p>User expectations: Because of their experiences with buggy, unreliable software, many users have low expectations of software quality. They are not surprised when their software fails. When a new system is installed, users may tolerate failures because the benefits of use outweigh the costs of failure recovery. In these situations, you may not need to devote as much time to testing the software. However, as software matures, users expect it to become more reliable so more thorough testing of later versions may be required.</p>
</li>
<li><p>Marketing environment: When a system is marketed, the sellers of the system must take into account competing products, the price that customers are willing to pay for a system, and the required schedule for delivering that system. In a competitive environment, a software company may decide to release a program before it has been fully tested and debugged because it wants to be the first in the market. If a software product is very cheap, users may be willing to tolerate a lower level of reliability.</p>
</li>
</ol>
<p>Inspections mostly focus on the source code of a system but any readable representation of the software, such as its requirements or a design model, can be inspected.</p>
<p>Figure-</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1714641389014/bea723d4-4860-4a89-90a7-02b024f6e6b4.png" alt class="image--center mx-auto" /></p>
<ol>
<li><p>Requirements Specification: This is the initial stage where the requirements for the software system are gathered, documented, and analyzed. It involves understanding the needs and expectations of the stakeholders.</p>
</li>
<li><p>Software Architecture: Once the requirements are clear, the software architecture is designed. This involves defining the overall structure of the software system, including components, modules, and their interactions.</p>
</li>
<li><p>UML Design Models: In this step, Unified Modeling Language (UML) diagrams are created to visually represent the software architecture and design. UML diagrams can include various types such as class diagrams, sequence diagrams, and activity diagrams.</p>
</li>
<li><p>Database Schemas: Database schemas are designed to define the structure, organization, and relationships of the data that will be stored in the software system's database. This step ensures that the database can efficiently store and retrieve data as required by the system.</p>
</li>
<li><p>Program: Once the design and architecture are finalized, the actual coding or programming of the software system takes place. Programmers write code according to the specifications and design provided in earlier stages.</p>
</li>
<li><p>System Prototype: After the initial programming phase, a prototype or early version of the software system is developed. This prototype is used to demonstrate key features and functionalities to stakeholders for feedback and validation.</p>
</li>
<li><p>Testing: Finally, the software system undergoes testing to ensure that it meets the specified requirements and functions correctly. Testing involves various techniques such as unit testing, integration testing, and acceptance testing to identify and fix defects or bugs in the system.</p>
</li>
</ol>
<p>By following these steps, you can ensure a systematic approach to developing and testing software systems, ultimately leading to a successful and reliable product.</p>
<p>When you inspect a system, you use knowledge of the system, its application domain, and programming or modelling language to discover errors. There are three advantages of software inspection over testing:</p>
<p>During testing, errors can mask (hide) other errors. When an error leads to unexpected outputs, you can never be sure if later output anomalies are due to a new error or are side effects of the original error. Because inspection is a static process, you don’t have to be concerned with interactions between errors. Consequently, a single inspection session can discover many errors in a system.</p>
<p>Incomplete versions of a system can be inspected without additional costs. If a program is incomplete, then you need to develop specialized test harnesses to test the available parts. This adds to the system development costs.</p>
<p>As well as searching for program defects, an inspection can also consider broader quality attributes of a program, such as compliance with standards, portability, and maintainability. You can look for inefficiencies, inappropriate algorithms, and poor programming style that could make the system difficult to maintain and update.</p>
<p>Typically, a commercial software system has to go through three stages of testing:</p>
<ol>
<li><p>Development testing:- where the system is tested during development to discover bugs and defects. System designers and programmers are likely to be involved in the testing process.</p>
</li>
<li><p>Release testing:- where a separate testing team tests a complete version of the system before it is released to users. Release testing aims to check that the system meets the requirements of system stakeholders.</p>
</li>
<li><p>User testing:- where users or potential users of a system test the system in their environment. For software products, the ‘user’ may be an internal marketing group that decides if the software can be marketed, released, and sold. Acceptance testing is one type of user testing where the customer formally tests a system to decide if it should be accepted by the system supplier or if further development is required.</p>
</li>
</ol>
<p>Now let us understand each of them in detail in our coming blogs.</p>
]]></content:encoded></item><item><title><![CDATA[Open-source Development]]></title><description><![CDATA[Open source development involves publishing the source code of a software system and inviting volunteers to participate in the development process. Rooted in the Free Software Foundation, advocating for open availability of source code for examinatio...]]></description><link>https://blog.codingminutes.com/open-source-development</link><guid isPermaLink="true">https://blog.codingminutes.com/open-source-development</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[Developer]]></category><category><![CDATA[coding]]></category><category><![CDATA[#codenewbies]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Fri, 24 May 2024 18:30:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712807578469/cfa9342b-b676-4d1d-bb40-bf5b44582e9e.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Open source development involves publishing the source code of a software system and inviting volunteers to participate in the development process. Rooted in the Free Software Foundation, advocating for open availability of source code for examination and modification.</p>
<p>Open-source software recruits a large population of volunteer developers via the Internet, with many users also contributing. Contributors can report and fix bugs, and propose new features, but successful projects often rely on a core group of developers.</p>
<p>Open-source software is usually cheap or free to acquire; documentation and support may incur costs. Mature open-source systems are known for their reliability due to a large user base capable of fixing problems promptly.</p>
<p>For a company involved in software development, two open-source issues have to be considered:</p>
<ol>
<li><p>Should the product that is being developed make use of open-source components?</p>
</li>
<li><p>Should an open-source approach be used for the software’s development?</p>
</li>
</ol>
<p>The answers to these questions depend on the type of software that is being developed and the background and experience of the development team. If you are developing a software product for sale, then time to market and reduced costs are critical. If you are developing in a domain in which there are high-quality open-source systems available, you can save time and money by using these systems. However, if you are developing software for a specific set of organizational requirements, then using open-source components may not be an option. You may have to integrate your software with existing systems that are incompatible with available open-source systems. Even then, however, it could be quicker and cheaper to modify the open-source system rather than redevelop the functionality that you need.</p>
<ul>
<li><p>If developing a product for sale, leveraging existing high-quality open-source systems can save time and costs.</p>
</li>
<li><p>For specific organizational requirements, integration with incompatible systems might require modifying open-source systems.</p>
</li>
<li><p>Some companies adopt an open-source development model not reliant on selling software but on selling support.</p>
</li>
<li><p>Open source is more applicable for general software products rather than specific organizational applications.</p>
</li>
<li><p>Concerns include revealing confidential business knowledge to competitors.</p>
</li>
<li><p>Small companies may find open sourcing reassuring for customers' long-term support.</p>
</li>
<li><p>Open-sourcing a system doesn't guarantee community involvement.</p>
</li>
<li><p>Most successful open-source products are platform products rather than specialized application systems.</p>
</li>
</ul>
<p>Example:</p>
<ul>
<li><p>Linux operating system, widely used in servers and desktop environments.</p>
</li>
<li><p>Other notable examples include Java, Apache web server, and the MySQL database management system.</p>
</li>
<li><p>Major industry players like IBM and Sun support the open-source movement.</p>
</li>
</ul>
<p>In summary, open-source development offers cost benefits, reliability, and a collaborative community, but its suitability depends on the nature of the software, business goals, and the development team's expertise.</p>
<p>Open source licensing:-</p>
<p>The fundamental principle of open-source development is that source code should be freely available, but this does not mean that anyone can do as they wish with that code. Legally, the developer of the code (either a company or an individual) still owns the code. They can place restrictions on how it is used by including legally binding conditions in an open-source software license (St. Laurent, 2004). Some open-source developers believe that if an open-source component is used to develop a new system, then that system should also be open-source. Others are willing to allow their code to be used without this restriction. The developed systems may be proprietary and sold as closed-source systems. Most open-source licenses are derived from one of three general models:</p>
<ol>
<li><p>The GNU General Public License (GPL). This is a so-called ‘reciprocal’ license that, simplistically, means that if you use open-source software that is licensed under the GPL license, then you must make that software open source.</p>
</li>
<li><p>The GNU Lesser General Public License (LGPL). This is a variant of the GPL license where you can write components that link to open-source code without having to publish the source of these components. However, if you change the licensed component, then you must publish this as open source.</p>
</li>
<li><p>The Berkeley Standard Distribution (BSD) License. This is a non-reciprocal license, which means you are not obliged to republish any changes or modifications made to open-source code. You can include the code in proprietary systems that are sold. If you use open-source components, you must acknowledge the original creator of the code.</p>
</li>
</ol>
<p>Licensing issues are important because if you use open-source software as part of a software product, then you may be obliged by the terms of the license to make your product open-source. If you are trying to sell your software, you may wish to keep it secret. This means that you may wish to avoid using GPL-licensed open-source software in its development.</p>
<p>The companies managing projects that use open source should:</p>
<ol>
<li><p>Establish a system for maintaining information about open-source components that are downloaded and used. You have to keep a copy of the license for each component that was valid at the time the component was used. Licenses may change so you need to know the conditions that you have agreed to.</p>
</li>
<li><p>Be aware of the different types of licenses and understand how a component is licensed before it is used. You may decide to use a component in one system but not in another because you plan to use these systems in different ways.</p>
</li>
<li><p>Be aware of evolution pathways for components. You need to know a bit about the open-source project where components are developed to understand how they might change in the future.</p>
</li>
<li><p>Educate people about open source. It’s not enough to have procedures in place to ensure compliance with license conditions. You also need to educate developers about open-source and open-source licensing.</p>
</li>
<li><p>Have auditing systems in place. Developers, under tight deadlines, might be tempted to break the terms of a license. If possible, you should have software in place to detect and stop this.</p>
</li>
<li><p>Participate in the open-source community. If you rely on open-source products, you should participate in the community and help support their development.</p>
</li>
</ol>
<p>The business model of software is changing. It is becoming increasingly difficult to build a business by selling specialized software systems. Many companies prefer to make their software open source and then sell support and consultancy to software users. This trend is likely to accelerate, with the increasing use of open-source software and with more and more software available in this form.</p>
]]></content:encoded></item><item><title><![CDATA[Implementation  Issues]]></title><description><![CDATA[Software engineering includes all of the activities involved in software development from the initial requirements of the system through to maintenance and management of the deployed system. A critical stage of this process is, of course, system impl...]]></description><link>https://blog.codingminutes.com/implementation-issues</link><guid isPermaLink="true">https://blog.codingminutes.com/implementation-issues</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Developer]]></category><category><![CDATA[coding]]></category><category><![CDATA[#codenewbies]]></category><category><![CDATA[engineering]]></category><category><![CDATA[Testing]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Thu, 23 May 2024 18:30:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712807433745/cf4746c6-0122-4554-a2ae-50a59c54305d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Software engineering includes all of the activities involved in software development from the initial requirements of the system through to maintenance and management of the deployed system. A critical stage of this process is, of course, system implementation.</p>
<p>Implementation may involve developing programs in high- or low-level programming languages or tailoring and adapting generic, off-the-shelf systems to meet the specific requirements of an organization.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710671865532/60d527d2-1a04-44dd-8b5a-a8a0d471fac0.png" alt class="image--center mx-auto" /></p>
<p>Aspects of implementation that are particularly important to software engineering are:</p>
<ol>
<li><p>Reuse:- Most modern software is constructed by reusing existing components or systems. When you are developing software, you should make as much use as possible of existing code.</p>
</li>
<li><p>Configuration management:- During the development process, many different versions of each software component are created. If you don’t keep track of these versions in a configuration management system, you are liable to include the wrong versions of these components in your system.</p>
</li>
<li><p>Host-target development:- Production software does not usually execute on the same computer as the software development environment. Rather, you develop it on one computer (the host system) and execute it on a separate computer (the target system). The host and target systems are sometimes of the same type but, often they are completely different.</p>
</li>
</ol>
<p>Now let us understand about each of them in detail:-</p>
<h3 id="heading-reuse">Reuse:-</h3>
<p>Most new software is defined from scratch by writing all code in a high-level programming language. The only significant reuse of software uses is the reuse of functions and objects in programming language libraries.</p>
<ul>
<li><p>However, cost and schedule pressure meant that this approach became increasingly enviable, especially for commercial and internet-based systems.</p>
</li>
<li><p>Software reuse is possible at several different levels-</p>
<ol>
<li><p>The abstraction level:-</p>
<p> At this level, you don’t reuse the software directly but rather use knowledge of successful abstractions in the design of our software. Design patterns and architectural patterns are ways of representing abstract knowledge for reuse.</p>
</li>
<li><p>The object level:-</p>
<p> At this level, you directly reuse objects from a library rather than writing the code yourself. To implement this type of library discover if the object and methods offer the functionality that you need. For example, if you need to process mail messages in a Java program you may use objects and methods from a Java-mail library.</p>
</li>
<li><p>The component level:-</p>
<p> Components are collections of object classes that operate together to provide related functions and services. You often have to adapt and extend the component by adding some code on your own. An example of component-level reuse is where you build your user interface using a framework. This is a set of general object classes that implement event handling, display management, etc. You add connections to the data to be displayed and write code to define specific display details such as screen layout and colours.</p>
</li>
<li><p>The system level:-</p>
<p> At this level, you reuse entire application systems. This involves some kind of configuration of these systems. This may be done by adding and modifying the code or by using the system’s interface. Most commercial systems are now built in this way where generic COTS (commercial off-the-shelf) systems are adapted and reused. Sometimes this approach may involve reusing several different systems and integrating these to create a new system.</p>
</li>
</ol>
</li>
<li><p>By reusing existing software, you can develop new systems more quickly, with fewer development risks and also lower costs. As the reused software has been tested in other applications, it should be more reliable than new software. However, there are costs associated with reuse:</p>
<ol>
<li><p>The costs of the time spent in looking for software to reuse and assessing whether or not it meets your needs.</p>
</li>
<li><p>You may have to test the software to make sure that it will work in your environment, especially if this is different from its development environment.</p>
</li>
<li><p>Where applicable, the costs of buying the reusable software. For large off-the-shelf systems, these costs can be very high.</p>
</li>
<li><p>The costs of adapting and configuring the reusable software components or systems to reflect the requirements of the system that you are developing.</p>
</li>
</ol>
</li>
<li><p>The costs of integrating reusable software elements (if you are using software from different sources) and with the new code that you have developed. Integrating reusable software from different providers can be difficult and expensive because the providers may make conflicting assumptions about how their respective software will be reused.</p>
</li>
</ul>
<h3 id="heading-configuration-management">Configuration management:-</h3>
<p>Configuration management is the name given to the general process of managing a changing software system. Configuration management aims to support the system integration process so that all developers can access the project code and documents in a controlled way, find out what changes have been made, and compile and link components to create a system. There are, therefore, three fundamental configuration management activities:</p>
<ol>
<li><p>Version management:- where support is provided to keep track of the different versions of software components. Version management systems include facilities to coordinate development by several programmers. They stop one developer from overwriting code that has been submitted to the system by someone else.</p>
</li>
<li><p>System integration:- where support is provided to help developers define what versions of components are used to create each version of a system. This description is then used to build a system automatically by compiling and linking the required components.</p>
</li>
<li><p>Problem tracking:- where support is provided to allow users to report bugs and other problems, and to allow all developers to see who is working on these problems and when they are fixed.</p>
</li>
</ol>
<p>Software configuration management tools support various activities in software development. Alternatively, integrated development environments can use separate tools like Subversion for version management, GNU build system for system integration, and Bugzilla for bug tracking.</p>
<h3 id="heading-host-target-development">Host target development:-</h3>
<p>Most software development is based on a host-target model. Software is developed on one computer (the host) but runs on a separate machine (the target). More generally, we can talk about a development platform and an execution platform. A platform is more than just hardware. It includes the installed operating system plus other supporting software such as a database management system or, for development platforms, an interactive development environment.</p>
<p>A software development platform should provide a range of tools to support software engineering processes. These may include:-</p>
<ul>
<li><p>An integrated compiler and syntax-directed editing system that allows you to create, edit, and compile code.</p>
</li>
<li><p>A language debugging system.</p>
</li>
<li><p>Graphical editing tools, such as tools to edit UML models.</p>
</li>
<li><p>Testing tools, such as JUnit (Massol, 2003) can automatically run a set of tests on a new version of a program.</p>
</li>
<li><p>Project support tools that help you organize the code for different development projects.</p>
</li>
</ul>
<p>Software development tools are often grouped to create an integrated development environment (IDE). An IDE is a set of software tools that supports different aspects of software development, within some common framework and user interface. Generally, IDEs are created to support development in a specific programming language such as Java. The language IDE may be developed specially or may be an instantiation of a general-purpose IDE, with specific language-support tools.</p>
<p>For distributed systems, you need to decide on the specific platforms where the components will be deployed. Issues that you have to consider in making this decision are:</p>
<ol>
<li><p>The hardware and software requirements of a component:- If a component is designed for a specific hardware architecture or relies on some other software system, it must be deployed on a platform that provides the required hardware and software support.</p>
</li>
<li><p>The availability requirements of the system:-High-availability systems may require components to be deployed on more than one platform. This means that, in the event of platform failure, an alternative implementation of the component is available.</p>
</li>
<li><p>Component communications:- If there is a high level of communications traffic between components, it usually makes sense to deploy them on the same platform or on platforms that are physically close to one other. This reduces communications latency, the delay between the time a message is sent by one component and received by another.</p>
</li>
</ol>
<p>You can document your decisions on hardware and software deployment using UML deployment diagrams, which show how software components are distributed across hardware platforms. If you are developing an embedded system, you may have to take into account target characteristics, such as its physical size, power capabilities, the need for real-time responses to sensor events, the physical characteristics of actuators, and its real-time operating system.</p>
]]></content:encoded></item><item><title><![CDATA[Design Patterns]]></title><description><![CDATA[Design patterns were derived from ideas put forward by Christopher Alexander, who suggested that certain common patterns of building design were inherently pleasing and effective.
The pattern is a description of the problem and the essence of its sol...]]></description><link>https://blog.codingminutes.com/design-patterns</link><guid isPermaLink="true">https://blog.codingminutes.com/design-patterns</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[coding]]></category><category><![CDATA[#codenewbies]]></category><category><![CDATA[Developer]]></category><category><![CDATA[engineering]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Wed, 22 May 2024 18:30:35 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712807295296/96475454-d903-4e97-9fe8-eaba84dbb7ac.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Design patterns were derived from ideas put forward by Christopher Alexander, who suggested that certain common patterns of building design were inherently pleasing and effective.</p>
<p>The pattern is a description of the problem and the essence of its solution, so that the solution may be reused in different settings. The pattern is not a detailed specification. Rather, you can think of it as a description of accumulated wisdom and experience, a well-tried solution to a common problem.</p>
<p>Gamma and his co-authors break down the problem description into motivation and applicability.</p>
<p>The four essential elements of design patterns were defined by the ‘Gang of Four’ in their patterns book:</p>
<ol>
<li><p>A name that is a meaningful reference to the pattern.</p>
</li>
<li><p>A description of the problem area that explains when the pattern may be applied.</p>
</li>
<li><p>A solution description of the parts of the design solution, their relationships, and their responsibilities. This is not a concrete design description. It is a template for a design solution that can be instantiated in different ways. This is often expressed graphically and shows the relationships between the objects and object classes in the solution.</p>
</li>
<li><p>A statement of the consequences—the results and trade-offs—of applying the pattern. This can help designers understand whether or not a pattern can be used in a particular situation.</p>
</li>
</ol>
<p>To use patterns in your design, you need to recognize that any design problem you are facing may have an associated pattern that can be applied. Examples of such problems, documented in the ‘Gang of Four’s original patterns book, include:</p>
<ol>
<li><p>Tell several objects that the state of some other object has changed.</p>
</li>
<li><p>Tidy up the interfaces to several related objects that have often been developed incrementally.</p>
</li>
<li><p>Provide a standard way of accessing the elements in a collection, irrespective of how that collection is implemented.</p>
</li>
<li><p>Allow for the possibility of extending the functionality of an existing class at run-time.</p>
</li>
</ol>
<p>Patterns are a great idea but you need experience in software design to use them effectively. You have to recognize situations where a pattern can be applied. Inexperienced programmers, even if they have read the pattern books, will always find it hard to decide whether they can reuse a pattern or need to develop a special-purpose solution.</p>
]]></content:encoded></item><item><title><![CDATA[Design and Implementation]]></title><description><![CDATA[Software design and implementation represent a crucial stage in the software engineering process.
In simpler systems, these activities often encompass the entirety of software engineering, merging with other processes. However, for larger systems, th...]]></description><link>https://blog.codingminutes.com/design-and-implementation</link><guid isPermaLink="true">https://blog.codingminutes.com/design-and-implementation</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[engineering]]></category><category><![CDATA[coding]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Tue, 21 May 2024 18:30:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712807168129/171fbbd3-ef05-49fb-b2d2-bab7d53e3ac8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Software design and implementation represent a crucial stage in the software engineering process.</p>
<p>In simpler systems, these activities often encompass the entirety of software engineering, merging with other processes. However, for larger systems, they are just part of a broader set of processes including requirements engineering, verification, and validation.</p>
<p>Software design and implementation activities are typically interleaved, with the design informing the implementation and vice versa.</p>
<p>Object-Oriented Design using UML</p>
<ul>
<li><p>Comprised of interacting objects with private state and operations.</p>
</li>
<li><p>Object-oriented design involves designing object classes and their relationships, defining objects and interactions.</p>
</li>
<li><p>Easier to change compared to functional approaches.</p>
</li>
<li><p>Objects encapsulate both data and operations, allowing for standalone modification without affecting other system objects.</p>
</li>
<li><p>Clear mapping between real-world entities and controlling objects improves understandability and maintainability.</p>
</li>
</ul>
<p>To develop a system design from concept to detailed, object-oriented design there are several things that you need to do:-</p>
<ul>
<li><p>Understanding and defining the system's context and external interactions.</p>
</li>
<li><p>Designing the system architecture.</p>
</li>
<li><p>Identifying principal objects.</p>
</li>
<li><p>Developing design models.</p>
</li>
<li><p>Specifying interfaces.</p>
</li>
</ul>
<p>This UML consists of several factors like -</p>
<ol>
<li><p>System context and interactions.</p>
</li>
<li><p>Architectural design.</p>
</li>
<li><p>Object class identification.</p>
</li>
<li><p>Design models.</p>
</li>
<li><p>Interface specification.</p>
</li>
</ol>
<p>Now let us understand about each of them in detail-</p>
<ol>
<li><p><strong>System context and interaction:-</strong></p>
<p> The first stage in any software design process is to develop an understanding of the relationships between the software that is being designed and its external environment. This is essential for deciding how to provide the required system functionality and how to structure the system to communicate with its environment.</p>
<ul>
<li><p>Key to developing software design.</p>
</li>
<li><p>Essential for determining system functionality and structure.</p>
</li>
<li><p>Establishes system boundaries.</p>
</li>
</ul>
</li>
</ol>
<p>    System context models and interaction models present complementary views of the relationships between a system and its environment:</p>
<ol>
<li><p>A system context model is a structural model that demonstrates the other systems in the environment of the system being developed.</p>
</li>
<li><p>An interaction model is a dynamic model that shows how the system interacts with its environment as it is used.</p>
</li>
</ol>
<ol start="2">
<li><p><strong>Architectural design:-</strong></p>
<p> Once the interactions between the software system and the system’s environment have been defined, you use this information as a basis for designing the system architecture.</p>
<ul>
<li><p>Defined interactions between the software system and environment.</p>
</li>
<li><p>Combines with general architectural principles and domain knowledge.</p>
</li>
</ul>
</li>
</ol>
<p>    The high-level architectural design for the weather station software is shown in Figure. The weather station is composed of independent subsystems that communicate by broadcasting messages on a common infrastructure, shown as the Communication link in Figure. Each subsystem listens for messages on that infrastructure and picks up the messages that are intended for them. This is another commonly used architectural style.</p>
<p>    For example, when the communications subsystem receives a control command, such as shutdown, the command is picked up by each of the other subsystems, which then shut themselves down in the correct way. The key benefit of this architecture is that it is easy to support different configurations of subsystems because the sender of a message does not need to address the message to a particular subsystem</p>
<ol start="3">
<li><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710670166990/09638e85-c83b-4a40-9cb2-8b6cb186ab8f.png" alt class="image--center mx-auto" /></p>
<p> <strong>Object class identification:-</strong></p>
<p> By this stage in the design process, you should have some ideas about the essential objects in the system that you are designing. As your understanding of the design develops, you refine these ideas about the system objects. The use case description helps to identify objects and operations in the system.</p>
<p> At this stage in the design process, you should focus on the objects themselves, without thinking about how these might be implemented. Once you have identified the objects, you then refine the object design. You look for common features and then design the inheritance hierarchy for the system. For example, you may identify an Instrument superclass, which defines the common features of all instruments, such as an identifier, and get and test operations. You may also add new attributes and operations to the superclass, such as an attribute that maintains the frequency of data collection.</p>
</li>
<li><p><strong>Design models:-</strong></p>
<p> Design or system models show the objects or object classes in a system. They also show the associations and relationships between these entities. These models are the bridge between the system requirements and the implementation of a system.</p>
<p> An important step in the design process, therefore, is to decide on the design models that you need and the level of detail required in these models. This depends on the type of system that is being developed. You design a sequential data-processing system in a different way from an embedded real-time system, so you will need different design models.</p>
<p> When you use the UML to develop a design, you will normally develop two kinds of design models:</p>
<ol>
<li><p>Structural models:- describe the static structure of the system using object classes and their relationships. Important relationships that may be documented at this stage are generalization (inheritance) relationships, uses/used-by relationships, and composition relationships.</p>
</li>
<li><p>Dynamic models:- describe the dynamic structure of the system and show the interactions between the system objects. Interactions that may be documented include the sequence of service requests made by objects and the state changes that are triggered by these object interactions.</p>
</li>
</ol>
</li>
</ol>
<p>    In the early stages of the design process, I think three models are particularly useful for adding detail to use case and architectural models:</p>
<p>    Subsystem models:- which show logical groupings of objects into coherent subsystems. These are represented using a form of class diagram with each subsystem shown as a package with enclosed objects. Subsystem models are static (structural) models.</p>
<ol start="5">
<li><p>Sequence models:- which show the sequence of object interactions. These are represented using a UML sequence or a collaboration diagram. Sequence models are dynamic models.</p>
</li>
<li><p>State machine model:- which shows how individual objects change their state in response to events. These are represented in the UML using state diagrams. State machine models are dynamic models.</p>
</li>
<li><p>Interface specification:- An important part of any design process is the specification of the interfaces between the components in the design. You need to specify interfaces so that objects and subsystems can be designed in parallel. Once an interface has been specified, the developers of other objects may assume that the interface will be implemented. Interface design is concerned with specifying the detail of the interface to an object or to a group of objects.</p>
</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[Application Architecture]]></title><description><![CDATA[Application systems are intended to meet a business or organizational need. These commonalities have led to the development of software architectures that describe the structure and organization of particular types of software systems. Application ar...]]></description><link>https://blog.codingminutes.com/application-architecture</link><guid isPermaLink="true">https://blog.codingminutes.com/application-architecture</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[coding]]></category><category><![CDATA[Developer]]></category><category><![CDATA[engineering]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Mon, 20 May 2024 18:30:37 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712807046029/867a6f77-3ad0-47aa-9d09-7b639ce13b7d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Application systems are intended to meet a business or organizational need. These commonalities have led to the development of software architectures that describe the structure and organization of particular types of software systems. Application architectures encapsulate the principal characteristics of a class of systems.</p>
<p>The application architecture may be re-implemented when developing new systems but, for many business systems, application reuse is possible without reimplementation. We see this in the growth of Enterprise Resource Planning (ERP) systems from companies such as SAP and Oracle, and vertical software packages (COTS) for specialized applications in different areas of business.</p>
<p>As a software designer, you can use models of application architectures in a number of ways:</p>
<ol>
<li><p>As a starting point for the architectural design process. If you are unfamiliar with the type of application that you are developing, you can base your initial design on a generic application architecture. Of course, this will have to be specialized for the specific system being developed, but it is a good starting point for design.</p>
</li>
<li><p>As a design checklist If you have developed an architectural design for an application system, you can compare this with the generic application architecture. You can check that your design is consistent with the generic architecture.</p>
</li>
<li><p>As a way of organizing the work of the development team The application architectures identify stable structural features of the system architectures and in many cases, it is possible to develop these in parallel. You can assign work to group members to implement different components within the architecture.</p>
</li>
<li><p>As a means of assessing components for reuse If you have components you might be able to reuse, you can compare these with the generic structures to see whether there are comparable components in the application architecture.</p>
</li>
<li><p>As a vocabulary for talking about types of applications If you are discussing a specific application or trying to compare applications of the same types, then you can use the concepts identified in the generic architecture to talk about the applications.</p>
</li>
</ol>
<p>There are many types of application system and, in some cases, they may seem to be very different. However, many of these superficially dissimilar applications actually have much in common, and thus can be represented by a single abstract application architecture. I illustrate this here by describing the following architectures of two types of applications:</p>
<ol>
<li><p><strong>Transaction processing applications</strong> -Transaction processing applications are database-centered applications that process user requests for information and update the information in a database.</p>
</li>
<li><p><strong>Language processing systems</strong>-Language processing systems are systems in which the user’s intentions are expressed in a formal language (such as Java). The language processing system processes this language into an internal format and then interprets this internal representation. The best-known language processing systems are compilers.</p>
</li>
</ol>
<p>Now let us understand about each of them in detail -</p>
<ol>
<li><p><strong>Transaction Processing Systems (TP Systems):</strong></p>
<ul>
<li><p>Transaction Processing (TP) systems are designed to handle user requests related to information retrieval from a database or requests for updating a database.</p>
</li>
<li><p>A key concept in TP systems is the idea of a database transaction, which is a sequence of operations treated as a single atomic unit.</p>
</li>
<li><p>The completion of all operations within a transaction is essential before database changes become permanent. This ensures the consistency of the database even in the event of failures during transaction processing.</p>
</li>
</ul>
</li>
</ol>
<p>    <strong>User Perspective on Transactions:</strong></p>
<p>    From a user's perspective, a transaction in any coherent sequence of operations that fulfils a specific goal, such as searching for flight times from London to Paris. If a user transaction doesn't necessitate changes to the database, it may not be treated as a technical database transaction.</p>
<p>    <strong>Example of a Transaction:</strong></p>
<p>    An illustrative example of a transaction is a customer's request to withdraw money from a bank account using an ATM. This involves tasks like accessing the customer's account details, checking the balance, adjusting the balance based on the withdrawal amount, and instructing the ATM to dispense cash. Until all these steps are completed, the transaction is considered incomplete, and the customer accounts database remains unchanged.</p>
<p><strong>Architectural Structure of Transaction Processing Systems:</strong></p>
<p>Transaction processing systems are typically interactive and handle asynchronous user requests. The architectural structure of TP applications involves several components:</p>
<ol>
<li><p><strong>I/O Processing Component:</strong> Users make requests through this component, initiating the transaction.</p>
</li>
<li><p><strong>Application Logic:</strong> The request is processed by application-specific logic.</p>
</li>
<li><p><strong>Transaction Manager:</strong> Usually embedded in the database management system, the transaction manager ensures the proper completion of the transaction. It signals to the application that processing has finished.</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710667358903/a019dded-e503-46ce-8c46-e663aa6fa090.png" alt class="image--center mx-auto" /></p>
<p><strong>Architecture of Transaction Processing Systems:</strong></p>
<p>TP systems can be organized using a 'pipe and filter' architecture, where different components handle input, processing, and output. For instance, consider a banking system allowing customers to query accounts and withdraw cash from an ATM. The system comprises two cooperating software components—the ATM software and the account processing software in the bank's database server. Input and output components are implemented in the ATM, while the processing component resides in the bank's database server.</p>
<p>Transaction Processing Systems play a crucial role in managing database transactions, ensuring their atomicity, and handling user requests in an organized and reliable manner. The 'pipe and filter' architecture is a common approach to organizing the components involved in transaction processing.</p>
<p>1.1 Information Systems:</p>
<ul>
<li><p>All systems involving interaction with a shared database can be considered transaction-based information systems.</p>
</li>
<li><p>Information systems facilitate controlled access to extensive information, such as library catalogues, flight timetables, or patient records in a hospital.</p>
</li>
<li><p>Increasingly, information systems are web-based, and accessed through web browsers.</p>
</li>
<li><p>The top layer supports the user interface, while the bottom layer represents the system database.</p>
</li>
<li><p>Layers include the user communications layer (handling input/output from the user interface) and the information retrieval layer (with application-specific logic for database access and updates).</p>
</li>
<li><p>This model can map directly onto servers in Internet-based systems.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710667740014/3e2f02f6-9c86-4b2d-a025-5f1085501357.png" alt class="image--center mx-auto" /></p>
<p><strong>Example Architecture (MHC-PMS):</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710668191428/1053ad86-1e07-4f9d-8e5f-a7d29d72ebb7.png" alt class="image--center mx-auto" /></p>
<p>Layers in the model include:</p>
<ol>
<li><p>Top Layer: Implements the user interface (implemented via a web browser).</p>
</li>
<li><p>Second Layer: Provides user interface functionality, including login, role checking, form/menu management, and data validation.</p>
</li>
<li><p>Third Layer: Implements system functionality, including security, patient information management, data import/export, and report generation.</p>
</li>
<li><p>Bottom Layer: Utilizes a commercial database management system, providing transaction management and persistent data storage.</p>
</li>
</ol>
<p><strong>Web-Based Information and Resource Management Systems:</strong></p>
<ul>
<li><p>Modern information and resource management systems are typically web-based, utilizing web browsers for user interfaces.</p>
</li>
<li><p>E-commerce systems, for example, accept electronic orders and coordinate the delivery of goods or services.</p>
</li>
<li><p>Application-specific layers in e-commerce systems may include features like a 'shopping cart' for users to collect items and pay for them in a single transaction.</p>
</li>
</ul>
<p><strong>Server Organization in Web-Based Systems:</strong></p>
<ul>
<li><p>Systems are often implemented as multi-tier client-server architectures.</p>
<p>  Components include:</p>
<ol>
<li><p>Web Server: Manages user communications, with the user interface implemented via a web browser.</p>
</li>
<li><p>Application Server: Implements application-specific logic, information storage, and retrieval.</p>
</li>
<li><p>Database Server: Facilitates data movement to and from the database and manages transaction management.</p>
</li>
</ol>
</li>
</ul>
<p>    Multiple servers enable high throughput, handling hundreds of transactions per minute, and scalability by adding servers as demand increases.</p>
<ol>
<li><p><strong>Language Processing Systems:-</strong></p>
<ul>
<li><p>Language processing systems translate natural or artificial languages into another representation, and in the case of programming languages, may also execute the resulting code.</p>
</li>
<li><p>Compilers in software engineering translate artificial programming languages into machine code.</p>
</li>
</ul>
</li>
</ol>
<p>The architecture of a Language Processing System for Programming Languages:</p>
<ol>
<li><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710668846791/412f3ad9-2412-4029-92bb-dbbb9f7de038.png" alt class="image--center mx-auto" /></p>
<p> <strong>Source Language Instructions:</strong> Define the program to be executed.</p>
</li>
<li><p><strong>Translator:</strong> Converts source language instructions into instructions for an abstract machine.</p>
</li>
<li><p><strong>Abstract Machine:</strong> Represents the machine that will execute the instructions.</p>
</li>
<li><p><strong>Interpreter:</strong> Fetches and executes instructions using data from the environment.</p>
</li>
<li><p><strong>Output:</strong> The result of interpreting instructions on the input data.</p>
</li>
</ol>
<p>Compiler Architecture in General Programming Environments :</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710669531433/86f609e2-0190-4ff3-8e72-f906b99c4597.png" alt class="image--center mx-auto" /></p>
<p>Components:</p>
<ol>
<li><p><strong>Lexical Analyzer:</strong> Converts input language tokens to an internal form.</p>
</li>
<li><p><strong>Symbol Table:</strong> Holds information about names of entities (variables, classes, objects) used in the text being translated.</p>
</li>
<li><p><strong>Syntax Analyzer:</strong> Checks syntax using a defined grammar and builds a syntax tree.</p>
</li>
<li><p><strong>Syntax Tree:</strong> Internal structure representing the compiled program.</p>
</li>
<li><p><strong>Semantic Analyzer:</strong> Checks semantic correctness using information from the syntax tree and symbol table.</p>
</li>
<li><p><strong>Code Generator:</strong> Walks the syntax tree and generates abstract machine code.</p>
</li>
</ol>
<p>Other components may analyze and transform the syntax tree to improve efficiency and remove redundancy from generated machine code.</p>
<p>Alternative Architectural Patterns (Garlan and Shaw, 1993):</p>
<ul>
<li><p>Composite of a repository and a pipe and filter model.</p>
</li>
<li><p>In a compiler architecture, the symbol table serves as a repository for shared data.</p>
</li>
<li><p>Phases of lexical, syntactic, and semantic analysis are organized sequentially and communicate through the shared symbol table.</p>
</li>
</ul>
<p>Repository-Based Architecture-</p>
<ul>
<li><p>Suitable for integrated programming support tools.</p>
</li>
<li><p>Symbol table and syntax tree act as a central information repository.</p>
</li>
<li><p>Tools or tool fragments communicate through the repository.</p>
</li>
<li><p>Grammar definition and output format definition are placed in the repository.</p>
</li>
<li><p>Enables immediate reflection of changes from one component to others.</p>
</li>
</ul>
<p>The choice of architectural pattern depends on the context, with repository-based architecture being more suitable for integrated systems where immediate reflection of changes is crucial.</p>
]]></content:encoded></item><item><title><![CDATA[Architecture Patterns]]></title><description><![CDATA[An architecture pattern is a high-level strategy or template, with an organized and structured description of good design practice, which has been tried and tested in different environments for successful structure and behaviour of system software.
T...]]></description><link>https://blog.codingminutes.com/architecture-patterns</link><guid isPermaLink="true">https://blog.codingminutes.com/architecture-patterns</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[coding]]></category><category><![CDATA[Developer]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Sun, 19 May 2024 18:30:07 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712806883742/a01ebea8-5423-4cfb-a070-9046dcafa5fc.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>An architecture pattern is a high-level strategy or template, with an organized and structured description of good design practice, which has been tried and tested in different environments for successful structure and behaviour of system software.</p>
<p>These patterns provide proven solutions to recurring design problems and serve as a blueprint for creating robust, scalable and maintainable architecture. An architecture pattern expresses a fundamental structural organization or schema for a software system.</p>
<p>It provides a set of predefined subsystems, specifies their responsibilities and includes rules and guidelines for organizing the relationship between them.</p>
<p>There are different architectural patterns such as -</p>
<ol>
<li><p>Layered pattern architecture.</p>
</li>
<li><p>Repository pattern architecture.</p>
</li>
<li><p>Client-server pattern architecture.</p>
</li>
<li><p>Pipe-filter pattern architecture.</p>
</li>
<li><p>Model-view-controller.</p>
</li>
</ol>
<p>Now let us understand about each of them in detail-</p>
<ol>
<li><p><strong>Layered pattern architecture-</strong></p>
<p> Layered pattern architecture organises the software system into distinct, horizontal layers, each representing a specific level of abstraction or functionality. Each layer only interacts directly with the layer immediately and above it.</p>
<p> Each layer has unique tasks to do and all layers are independent of one another since each layer is independent, one can modify the code without affecting others.</p>
<p> This pattern is the most commonly used pattern for designing the majority of software. This layer is also known as a 4-tier architecture.</p>
<p> These 4 layers are -</p>
<ol>
<li><p><strong>Presentation layer</strong>- the user interface where we enter the data on an application. This layer helps users with its easy user interface and easy communication with the software.</p>
</li>
<li><p><strong>Business layer</strong>- this layer is responsible for executing business logic as per requests. This layer deals with the user interface management authentication and authorization.</p>
</li>
<li><p><strong>Application layer</strong>- this layer acts as a medium for communication between the presentation and data layer. This layer deals with the core business logic and application functionality system utilities.</p>
</li>
<li><p><strong>Data layer</strong>- this layer has database connectivity for managing the flow of the data. This layer mainly deals with the system support of the software.</p>
</li>
</ol>
</li>
</ol>
<p>    <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710647050206/8be01a56-f21f-48cc-8996-bdb35267cc0a.png" alt class="image--center mx-auto" /></p>
<p>    Advantage - allow replacement of entire layer as long as the interface is maintained. Redundant facilities can be provided in each layer to increase the dependability of the system.</p>
<p>    Limitation - In practice providing a clean separation between layers is often difficult and a high level may have to interact directly with a lower-level layer rather them through the layer immediately below it. Also, performance can be a problem because of multiple levels of interpretation of a service request as it is processed at each layer.</p>
<ol start="2">
<li><p><strong>Repository architecture-</strong></p>
<p> In repository architecture, the majority of systems that use large amounts of data are organized around a shared database or repository. This model is therefore suited to applications in which data is generated by one component and used by another. Organizing tools around a repository is an efficient way to share large amounts of data. There is no need to transmit data explicitly from one component to another. However, components must operate around an agreed repository data model.</p>
<p> All data in a system is managed in a central repository that is accessible to all system components. Components do not interact directly, only through the repository.</p>
<p> You should use this pattern when you have a system in which large volumes of information are generated that have to be stored for a long time.</p>
<p> You may also use it in data-driven systems where the inclusion of data in the repository triggers an action or tool.</p>
<p> In the example of an IDE where the components use a repository of system design information. Each software tool generates information which is then available for use by other tools.</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710648187931/4b191540-81e5-4cd6-a8ae-bd37b0ae2df8.png" alt class="image--center mx-auto" /></p>
<ol>
<li><p>Client-server architecture-</p>
<p> In a client–server architecture, the functionality of the system is organized into services, with each service delivered from a separate server. Clients are users of these services and access servers to make use of them.</p>
<p> Used when data in a shared database has to be accessed from a range of locations. Because servers can be replicated, may also be used when the load on a system is variable.</p>
<p> A system that follows the client–server pattern is organized as a set of services and associated servers, and clients that access and use the services. The major components of this model are:</p>
<ol>
<li><p>A set of servers that offer services to other components. Examples of servers include print servers that offer printing services, file servers that offer file management services, and compile servers, that offer programming language compilation services.</p>
</li>
<li><p>A set of clients that call on the services offered by servers. There will normally be several instances of a client program executing concurrently on different computers.</p>
</li>
<li><p>A network that allows the clients to access these services. Most client–server systems are implemented as distributed systems, connected using Internet protocols.</p>
</li>
</ol>
</li>
</ol>
<p>    Client–server architectures are usually thought of as distributed systems architectures but the logical model of independent services running on separate servers can be implemented on a single computer. Again, an important benefit is separation and independence. Services and servers can be changed without affecting other parts of the system</p>
<p>In the example of a film and video/DVD library organized as a client–server system.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710649358192/0506ab33-8763-4b14-bca4-35b6d3fd624c.png" alt class="image--center mx-auto" /></p>
<ol>
<li><p>Pipe and filter architecture-</p>
<p> In this architecture pattern, the processing of the data in a system is organized so that each processing component (filter) is discrete and carries out one type of data transformation. The data flows (as in a pipe) from one component to another for processing.</p>
<p> Commonly used in data processing applications (both batch- and transaction-based) where inputs are processed in separate stages to generate related outputs.</p>
<p> This is a model of the run-time organization of a system where functional transformations process their inputs and produce outputs.</p>
<p> The name ‘pipe and filter’ comes from the original Unix system where it was possible to link processes using ‘pipes’. These passed a text stream from one process to another.</p>
<p> Variants of this pattern have been in use since computers were first used for automatic data processing. When transformations are sequential with data processed in batches, this pipe and filter architectural model becomes a batch sequential model, a common architecture for data processing systems.</p>
<p> An example of a pipe and filter model is the billing system is a billing system</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710650235641/5cfe1a34-c127-40c1-87b7-04c78f2365e3.png" alt class="image--center mx-auto" /></p>
<p> -</p>
</li>
</ol>
<ol>
<li><p>Model view controller-</p>
<p> MVC is one of the most frequently used industry-standard web development frameworks to create scalable and extensive projects.</p>
<p> The model view controller is an architecture pattern that separates an application into three logical components.</p>
<p> This model view controller is used when there are multiple ways to view and interact with data and also used when the future requirements for interaction and presentation of data are unknown.</p>
<p> Each of these components is built to handle specific development aspects of an application. These three components are -</p>
<ol>
<li><p>Model.</p>
</li>
<li><p>View.</p>
</li>
<li><p>Controller.</p>
</li>
</ol>
</li>
</ol>
<p>    Let us understand about each of them in detail-</p>
<ol>
<li><p>Model:- this represents the application data and business logic. It encapsulates the data and behaviour of the application, responding to requests for information or changes in state.</p>
<ul>
<li><p>It manages the system data and associated operations on that data.</p>
</li>
<li><p>It enforces business rules and logic.</p>
</li>
<li><p>It notifies the observer about state changes.</p>
</li>
<li><p>It manages data access and storage.</p>
</li>
</ul>
</li>
<li><p>View:- The view component defines and manages how the data is presented to the user. It represents the user interface and presentation layer. It displays data to the user and user input forwarding it to the controller for processing responsibilities.</p>
<ul>
<li><p>It presents information to the user on the data from the model.</p>
</li>
<li><p>It captures user input and forwards it to the controller.</p>
</li>
<li><p>It updates its display in response to changes in the model.</p>
</li>
</ul>
</li>
<li><p>Controller:- The controller component manages user interaction and passes this information to the view and model, by acting as an intermediary between them.</p>
<ul>
<li><p>It receives user input from the view.</p>
</li>
<li><p>It interacts with the model to perform necessary actions or updates.</p>
</li>
<li><p>It updates the view based on model changes.</p>
</li>
</ul>
</li>
</ol>
<p>    Advantages of Model View Controller-</p>
<ol>
<li><p>Multiple developers can work simultaneously on the model, controller and view.</p>
</li>
<li><p>MVC enables logic grouping of related actions on a controller together, the view for a specific model is also grouped.</p>
</li>
<li><p>Models can have multiple views. The overall components of an application are easily manageable and are less dependent on each other for the proper functioning of the application.</p>
</li>
<li><p>It supports asynchronous techniques.</p>
</li>
<li><p>The modification does not affect the entire model.</p>
</li>
</ol>
<p>    Disadvantages of Model View Controller-</p>
<ol>
<li><p>The framework navigation can be complex because it introduces a new layer of abstraction and requires the user to adapt to the decomposition criteria of MVC.</p>
</li>
<li><p>Knowledge of multiple technologies because the norm developers using MVC need to be skilled in multiple technologies.</p>
</li>
</ol>
<p>This is all about the architecture patterns in software engineering.</p>
]]></content:encoded></item><item><title><![CDATA[Architectural Design]]></title><description><![CDATA[Architectural design is concerned with understanding how software systems should be organized and designed, focusing on the overall structure of the system.

It is generally used to represent the entire architecture that is useful and meaningful to o...]]></description><link>https://blog.codingminutes.com/architectural-design</link><guid isPermaLink="true">https://blog.codingminutes.com/architectural-design</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[Developer]]></category><category><![CDATA[engineering]]></category><category><![CDATA[coding]]></category><category><![CDATA[time]]></category><category><![CDATA[#codenewbies]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Sat, 18 May 2024 18:30:30 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712806776131/1371fd19-9074-4935-a761-05e50da52e82.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<ul>
<li><p>Architectural design is concerned with understanding how software systems should be organized and designed, focusing on the overall structure of the system.</p>
</li>
<li><p>It is generally used to represent the entire architecture that is useful and meaningful to one or more stakeholders in the system.</p>
</li>
<li><p>They help stakeholders understand and communicate the architecture so that they can verify that the system addresses their concerns.</p>
</li>
<li><p>Architectural views or viewpoints are a set of representations of an architecture that cover stakeholders' issues. They also represent the functional and non-functional requirements of the application. These views collectively provide a comprehensive understanding of the system.</p>
</li>
</ul>
<p>Three advantages of explicitly designing and documenting software architecture:</p>
<ol>
<li><p><strong>Stakeholder communication</strong>: The architecture is a high-level presentation of the system that may be used as a focus for discussion by a range of different stakeholders.</p>
</li>
<li><p><strong>System analysis</strong>: Making the system architecture explicit at an early stage in system development requires some analysis. Architectural design decisions have a profound effect on whether or not the system can meet critical requirements such as performance, reliability, and maintainability.</p>
</li>
<li><p><strong>Large-scale reuse</strong>: A model of a system architecture is a compact, manageable description of how a system is organized and how the components interoperate. The system architecture is often the same for systems with similar requirements and so can support large-scale software reuse.</p>
</li>
</ol>
<p><strong>Architecture Design:-</strong></p>
<p>Architecture design is a creative process where you design a system organization that will satisfy the functional and non-functional requirements of a system. Because it is a creative process, the activities within the process depend on the type of system being developed, the background and experience of the system architect, and the specific requirements for the system.</p>
<p>During architecture design, decision questions need to be considered addressing:</p>
<ol>
<li><p>Is there a generic application architecture that can act as a template for the system being designed?</p>
</li>
<li><p>How will the system be distributed across a number of cores or processors?</p>
</li>
<li><p>What architectural patterns or styles might be used?</p>
</li>
<li><p>What will be the fundamental approach used to structure the system?</p>
</li>
<li><p>How will the structural components in the system be decomposed into subcomponents?</p>
</li>
<li><p>What strategy will be used to control the operation of the components in the system?</p>
</li>
<li><p>What architectural organization is best for delivering the non-functional requirements of the system?</p>
</li>
<li><p>How will the architectural design be evaluated?</p>
</li>
<li><p>How should the architecture of the system be documented?</p>
</li>
</ol>
<p>Because of the close relationship between non-functional requirements and software architecture, the particular architectural style and structure that you choose for a system should depend on the non-functional system requirements:</p>
<ol>
<li><p><strong>Performance</strong>: If performance is a critical requirement, the architecture should be designed to localize critical operations within a small number of components, with these components all deployed on the same computer rather than distributed across the network. This may mean using a few relatively large components rather than small, fine-grain components, which reduces the number of component communications. You may also consider run-time system organizations that allow the system to be replicated and executed on different processors.</p>
</li>
<li><p><strong>Security</strong>: If security is a critical requirement, a layered structure for the architecture should be used, with the most critical assets protected in the innermost layers, with a high level of security validation applied to these layers.</p>
</li>
<li><p><strong>Safety</strong>: If safety is a critical requirement, the architecture should be designed so that safety-related operations are all located in either a single component or in a small number of components. This reduces the costs and problems of safety validation and makes it possible to provide related protection systems that can safely shut down the system in the event of failure.</p>
</li>
<li><p><strong>Availability</strong>: If availability is a critical requirement, the architecture should be designed to include redundant components so that it is possible to replace and update components without stopping the system. I describe two fault-tolerant system architectures for high-availability systems.</p>
</li>
<li><p><strong>Maintainability</strong>: If maintainability is a critical requirement, the system architecture should be designed using fine-grain, self-contained components that may readily be changed. Producers of data should be separated from consumers, and shared data structures should be avoided.</p>
</li>
</ol>
<p><strong>Architectural View</strong></p>
<ul>
<li><p>An architectural view is generally used to represent the entire architecture that is useful and meaningful to one or more stakeholders in the system. It is a representation of the software system architecture that is relevant to one or more stakeholders.</p>
</li>
<li><p>Architectural views help stakeholders understand and communicate the architecture so that they can verify that the system will address their concerns.</p>
</li>
<li><p>Architectural views or viewpoints are a set of presentations of an architecture that cover stakeholder issues. They also represent functional and non-functional requirements of software applications.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710643720516/e65ce12e-2e31-4dc6-9fb5-c230e30c61f8.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-4-1-architectural-view-model"><strong>4 + 1 Architectural View Model</strong></h3>
<p>The plus one refers to the scenario or use case view that completes the four standard views. The 4 + 1 model is a framework for organizing architectural views introduced, which contains five concurrent views to address various perspectives of the system.</p>
<p>These five architectural view models are:</p>
<ol>
<li><p>Logical view</p>
</li>
<li><p>Development view</p>
</li>
<li><p>Process view</p>
</li>
<li><p>Physical view</p>
</li>
<li><p>Scenario or use case view</p>
</li>
</ol>
<p>Now let us understand the 4+1 architectural view model in detail:</p>
<ol>
<li><p><strong>Logical View</strong>: It is concerned with functional requirements, presenting the high-level components or modules of the system and their interaction. It helps developers understand the system's logical structure and its functional decomposition. UML diagrams used in this view to represent logical view include class diagrams, sequence diagrams, and communication diagrams.</p>
</li>
<li><p><strong>Development View</strong>: This view focuses on the organization and structure of the software system during the development process. It provides insights into how the software is structured for development, including the organization of the code, modules, libraries, and development tools. The development view helps developers understand the architecture and design decisions that impact the development and maintenance of the software.</p>
</li>
<li><p><strong>Process View</strong>: This view primarily focuses on the dynamic aspect of the software system, illustrating how different components or modules interact at runtime. Representation of the system's processes, their interaction, and the flow of data between them are represented by the process view. This is helpful for understanding the performance, scalability, and resource utilization aspects of the system.</p>
</li>
<li><p><strong>Physical View</strong>: This view focuses on mapping software components and modules to the hardware components of the system. It provides a representation of the physical distribution of software across different nodes or processors, considering factors such as performance, scalability, and physical constraints.</p>
</li>
<li><p><strong>Use Case/Scenario View</strong>: This view complements the other four views and provides a representation of the system from the perspective of its end users and external actors. Use cases help to capture the functional requirements of the system by describing various scenarios or use cases in which the system interacts with its users or other systems.</p>
</li>
</ol>
<p><strong>Advantages of the 4+1 model:</strong></p>
<ol>
<li><p><strong>Comprehensive representation</strong>: It provides a well-rounded and comprehensive view of the software architecture, addressing the concerns of different stakeholders.</p>
</li>
<li><p><strong>Modularity</strong>: Each view can be developed and modified independently, promoting modularity and maintenance.</p>
</li>
<li><p><strong>Flexibility</strong>: It allows for flexibility in addressing different concerns without cluttering a single view.</p>
</li>
<li><p><strong>Communication</strong>: Enhances communication among stakeholders with different backgrounds and interests.</p>
</li>
</ol>
<p>By using the 4+1 model, architecture can effectively communicate and manage the complexity of the software system throughout the development process.</p>
]]></content:encoded></item><item><title><![CDATA[Modern Driven Engineering]]></title><description><![CDATA[Model-driven engineering is an approach to software development where models, rather than programs, are the principal output of the development process. The programs that execute on hardware and software platforms are often generated automatically fr...]]></description><link>https://blog.codingminutes.com/modern-driven-engineering</link><guid isPermaLink="true">https://blog.codingminutes.com/modern-driven-engineering</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[coding]]></category><category><![CDATA[Developer]]></category><category><![CDATA[engineering]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Fri, 17 May 2024 18:30:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712806665184/984a2b9a-0181-46a3-abd3-6011bb594b1e.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Model-driven engineering is an approach to software development where models, rather than programs, are the principal output of the development process. The programs that execute on hardware and software platforms are often generated automatically from these models.</p>
<p>Module-Driven Architecture-</p>
<p>Model-driven architecture is a focused approach to software design and implementation.</p>
<p>There are three types of model-driven architecture models:</p>
<ol>
<li><p>Computational Independent Model or Domain Model.</p>
</li>
<li><p>Platform Independent Model.</p>
</li>
<li><p>Platform-Specific Model.</p>
</li>
</ol>
<p>Now let us understand each of these model-driven architectures briefly:</p>
<ol>
<li><p><strong>Computational Independent Model:-</strong> This models the important domain abstractions used in the system. The computational independent model is also called the domain model. It is the highest level of abstraction in the approach and allows for modelling system requirements. CIM describes system conceptuality and can be transferred into a platform-independent model. The purpose of CIM is to capture the requirements and essential functionality of the system in a way that is understandable to stakeholders who may not have technical expertise.</p>
</li>
<li><p><strong>Platform Independent Models:-</strong> PIM is an intermediate level of abstraction, which comes after CIM. PIM is a design model that describes the internal structure of a model without regard to the hosting platform. The PIM is independent of the specific technological platform used to implement it. PIM is usually described using UML models that show the static system structure and how it responds to external and internal events.</p>
</li>
<li><p><strong>Platform-Specific Model:-</strong> PSM is the lowest level of abstraction in MDA and is closest to the implementation level. In model-driven engineering, a platform-specific model adds details to the platform-independent model about the use of a specific platform or platform. The platform-specific model describes the functionalities defined in the PIM for specific implementation technology.</p>
</li>
</ol>
<p><strong>Executable UML:-</strong></p>
<p>Executable UML allows us to add information to graphical models about the ways in which operations defined in a model are implemented. A subset of UML 2 is called executable UML or XUML.</p>
<p>To create an executable subset of UML, the number of model types has therefore been dramatically reduced to 3 key model types:</p>
<ol>
<li><p><strong>Domain models:-</strong> identify the principal concerns in the system. These are defined using UML class diagrams that include objects, attributes, and associations.</p>
</li>
<li><p><strong>Class models:-</strong> in which classes are defined along with their attributes and operations.</p>
</li>
<li><p><strong>State models:-</strong> in which a state diagram is associated with each class and is used to describe the lifecycle of the class.</p>
</li>
</ol>
<p>This is all about model-driven engineering in system modelling.</p>
]]></content:encoded></item><item><title><![CDATA[Behavioral Models]]></title><description><![CDATA[Behavioral Models in System Modeling:

Behavioural models represent the dynamic behaviour of a system as it executes, showing how the system responds to stimuli from its environment.

These models illustrate what actions the system performs or is exp...]]></description><link>https://blog.codingminutes.com/behavioral-models</link><guid isPermaLink="true">https://blog.codingminutes.com/behavioral-models</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[coding]]></category><category><![CDATA[Developer]]></category><category><![CDATA[engineering]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Thu, 16 May 2024 18:30:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712806544375/69cbb147-7ef2-44fd-9434-8e2418b4fe3d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Behavioral Models in System Modeling:</strong></p>
<ul>
<li><p>Behavioural models represent the dynamic behaviour of a system as it executes, showing how the system responds to stimuli from its environment.</p>
</li>
<li><p>These models illustrate what actions the system performs or is expected to perform in response to external stimuli, helping stakeholders understand system behaviour.</p>
</li>
<li><p><strong>Types of Stimuli:</strong></p>
<ul>
<li><p><strong>Data:</strong> Refers to incoming data that needs to be processed by the system. This could include user input, sensor data, or messages from other systems. A user enters information into a form on a website, triggering the system to process and store the data in a database.</p>
</li>
<li><p><strong>Events:</strong> Events are occurrences that trigger processing within the system. These could be user actions, system events, or signals from external sources. Events may or may not have associated data. A button click by a user initiates a process to submit a form, or a sensor detects motion, triggering a security system to activate.</p>
</li>
</ul>
</li>
<li><p><strong>Representation:</strong> Behavioral models can be represented using various techniques such as sequence diagrams, state diagrams, activity diagrams, or use case diagrams, depending on the aspect of the system behaviour being modelled.</p>
</li>
<li><p><strong>Importance:</strong> Behavioral models help stakeholders understand how the system functions in real-world scenarios, aiding in requirements analysis, system design, and validation.</p>
</li>
<li><p><strong>Analysis:</strong> These models facilitate analysis of system behaviour, allowing stakeholders to identify potential issues, validate requirements, and refine system functionality.</p>
</li>
<li><p><strong>Dynamic Nature:</strong> Unlike structural models which depict the static structure of a system, behavioural models capture the dynamic aspects, showing the flow of control and data as the system executes.</p>
</li>
</ul>
<ol>
<li><p><strong>Data-Driven Modeling:</strong></p>
<p> Data-driven modelling refers to modelling techniques used to represent systems that primarily process data, with the system's behaviour driven by the input data rather than external events.</p>
<p> Many business systems operate as data-processing systems, where the flow of data drives the system's operation. These systems are controlled by the data input to the system, with minimal reliance on external events for processing.</p>
<p> <strong>Characteristics:</strong></p>
<ol>
<li><p><strong>Data Input Control:</strong> Data-driven systems are controlled by the input data provided to the system. The processing and behaviour of the system are determined by the data received.</p>
</li>
<li><p><strong>Limited External Event Processing:</strong> Unlike event-driven systems that respond to external events, data-driven systems focus more on processing input data and generating associated outputs.</p>
</li>
<li><p><strong>Sequence of Actions:</strong> Data-driven models depict the sequence of actions involved in processing input data and generating corresponding outputs. They illustrate how data flows through the system and the transformations it undergoes.</p>
</li>
<li><p><strong>End-to-end Processing:</strong> These models are particularly useful during requirements analysis, as they can illustrate the end-to-end processing flow within the system, from input data to output generation.</p>
</li>
<li><p><strong>Requirements Analysis:</strong> Data-driven models are valuable tools during the analysis of system requirements. They help stakeholders understand how data is processed within the system and how it influences system behaviour.</p>
</li>
<li><p><strong>System Understanding:</strong> These models aid in understanding the internal workings of the system, highlighting the sequence of actions and transformations performed on input data.</p>
<p> <strong>Example:</strong> In a banking system, a data-driven model could illustrate the sequence of actions involved in processing a customer's transaction, starting from the input of transaction details, through validation and authorization, to the generation of transaction records and updates to account balances.</p>
</li>
</ol>
</li>
</ol>
<p>    Data-driven modelling is a valuable approach for representing systems where data processing is central to system operation. These models help stakeholders understand how data flows through the system and how it influences system behaviour, making them essential for requirements analysis and system understanding.</p>
<ol start="2">
<li><p><strong>Event-Driven Modeling:</strong></p>
<p> Event-driven modelling is a modelling technique used to represent systems that primarily respond to external and internal events, with minimal emphasis on data processing.</p>
<ul>
<li><p><strong>Characteristics:</strong></p>
<ol>
<li><p>Real-time systems, such as landline phone switching systems, often operate as event-driven systems. Example**:** In a landline phone switching system, events like 'receiver off hook' trigger the generation of a dial tone.</p>
</li>
<li><p><strong>Response to Events:</strong> Event-driven models illustrate how a system responds to both external and internal events.</p>
</li>
<li><p><strong>Focus on Events:</strong> These models highlight the interactions and transitions triggered by events within the system.</p>
</li>
<li><p><strong>Finite Number of States:</strong> Event-driven modelling assumes that the system has a finite number of states, and events may cause transitions between these states.</p>
</li>
<li><p><strong>Stimulus-Response Relationship:</strong> Events act as stimuli that prompt the system to transition from one state to another, altering its behaviour or output.</p>
</li>
<li><p><strong>Real-Time Systems Analysis:</strong> Event-driven modelling is particularly useful for analyzing real-time systems, where timely responses to events are critical.</p>
</li>
<li><p><strong>System Understanding:</strong> These models aid in understanding how events influence the behaviour and state transitions within the system.</p>
<p> <strong>Example:</strong> In an automated traffic light system, events such as the detection of vehicles at an intersection trigger state transitions within the system, leading to changes in traffic light signals.</p>
</li>
</ol>
</li>
</ul>
</li>
</ol>
<p>    Event-driven modelling is essential for representing systems that primarily respond to events, with minimal emphasis on data processing. These models help stakeholders understand how events influence system behaviour and state transitions, making them valuable for analyzing real-time systems and ensuring timely responses to events.</p>
<p>Behavioural models play a crucial role in system modelling by depicting the dynamic behaviour of the system in response to stimuli from its environment. They help stakeholders understand system functionality, validate requirements, and refine system behaviour to meet user needs and expectations.</p>
]]></content:encoded></item><item><title><![CDATA[Structure Model]]></title><description><![CDATA[Structural models in software engineering are used to represent the organization of a system in terms of its components and the relationships between them. These models provide a visual depiction of the system's structure, helping stakeholders unders...]]></description><link>https://blog.codingminutes.com/structure-model</link><guid isPermaLink="true">https://blog.codingminutes.com/structure-model</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[coding]]></category><category><![CDATA[engineering]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Wed, 15 May 2024 18:30:29 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712806434253/bc31dfd2-2df5-4e7d-b538-7e2426ba5203.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Structural models in software engineering are used to represent the organization of a system in terms of its components and the relationships between them. These models provide a visual depiction of the system's structure, helping stakeholders understand how different parts of the system are organized and how they interact with each other.</p>
<p>Structural models can be categorized into static models and dynamic models, each serving a specific purpose in the software development process:-</p>
<ol>
<li><p><strong>Static Models:</strong> Static models illustrate the structure of the system design at a fixed point in time. They capture the components of the system and their relationships without considering the system's behaviour during execution. Static models are typically created during the early stages of system development and are used to establish the overall architecture and design of the system.</p>
</li>
<li><p><strong>Dynamic Models:</strong> Dynamic models, on the other hand, depict the organization of the system when it is executing or in motion. These models capture the behaviour of the system over time, showing how components interact and exchange information during runtime. Dynamic models are particularly useful for understanding system behaviour, identifying potential issues, and optimizing performance.</p>
</li>
</ol>
<p>Structural models are created during the system design phase to help stakeholders discuss, analyze, and refine the system architecture. They serve as valuable documentation artefacts, providing a clear and concise representation of the system's structure and behaviour. By using structural models, software engineers can better understand the system's complexities and make informed design decisions to meet the project's requirements and objectives.</p>
<p>The structural model is further classified into three types:-</p>
<ol>
<li><p>Class diagram.</p>
</li>
<li><p>Generalization.</p>
</li>
<li><p>Aggregation.</p>
</li>
</ol>
<p>Now let us discuss the several parts of the structural models:-</p>
<ol>
<li><h3 id="heading-class-diagrams">Class diagrams:-</h3>
<p> These are fundamental tools used in object-oriented software development to represent the structure and relationships of classes within a system. They provide a visual blueprint of the classes in a system and the associations between them, aiding developers in understanding the organization and behaviour of the system.</p>
<p> <strong>Object Classes and Real-World Entities:</strong> During the early stages of software engineering, objects represent real-world entities or concepts when developing models such as class diagrams. These objects are mapped to classes in the system model, with each class representing a general definition of one type of system object. For example, a Patient class represents the concept of a patient in the real world, encapsulating attributes such as name, age, and medical history, along with behaviours like scheduling appointments and receiving treatments.</p>
<p> <strong>Benefits of Class Diagrams:</strong></p>
<ol>
<li><p><strong>Abstraction:</strong> Class diagrams help in abstracting the essential components and relationships of a system, allowing developers to focus on high-level design concepts.</p>
</li>
<li><p><strong>Visualization:</strong> They provide a visual representation of the system's structure, making it easier for stakeholders to understand and discuss the system's architecture and design.</p>
</li>
<li><p><strong>Communication:</strong> Class diagrams serve as effective communication tools between developers, designers, and stakeholders, facilitating discussions about system requirements and design decisions.</p>
</li>
<li><p><strong>Modularity:</strong> They support modular design by organizing classes into logical groupings and defining clear relationships between them, promoting code reusability and maintainability.</p>
</li>
<li><p><strong>Analysis:</strong> Class diagrams aid in analyzing the system's complexity by identifying dependencies between classes and potential design flaws or inefficiencies.</p>
</li>
</ol>
</li>
</ol>
<p>    Class diagrams are integral to the object-oriented design process, providing a structured approach to modelling the classes and associations within a software system. They enable developers to conceptualize, design, and communicate the architecture of the system effectively.</p>
<ol start="2">
<li><h3 id="heading-generalization"><strong>Generalization:-</strong></h3>
<ul>
<li><p>Generalization is a common technique used to simplify and manage complexity in everyday life.</p>
</li>
<li><p>Rather than learning the detailed characteristics of every individual entity, we categorize them into more general classes or categories, such as animals, cars, or houses.</p>
</li>
<li><p>By learning the characteristics of these classes, we can infer common traits shared by different members of these classes. For example, squirrels and rats are both rodents, sharing common characteristics.</p>
</li>
</ul>
</li>
</ol>
<p>    <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710642187983/ae35b33d-d9fe-4300-a1d0-a895e342a3f4.png" alt class="image--center mx-auto" /></p>
<p>    <strong>Generalization in System Modeling:</strong></p>
<ul>
<li><p>In system modelling, it's often beneficial to examine the classes within a system to identify opportunities for generalization.</p>
</li>
<li><p>By employing generalization, if changes are proposed, developers don't need to inspect all classes individually to determine if they're affected by the change.</p>
</li>
</ul>
<p>    <strong>Implementation of Generalization in Object-Oriented Languages:</strong></p>
<ul>
<li><p>Object-oriented languages like Java implement generalization through class inheritance mechanisms.</p>
</li>
<li><p>Inheritance allows classes to inherit attributes and operations from their parent classes, facilitating the reuse of code and promoting a hierarchical structure.</p>
</li>
</ul>
<p>    <strong>Attributes and Operations in Generalization:</strong></p>
<ul>
<li><p>In a generalization hierarchy, higher-level classes (superclasses) define attributes and operations that are common to all subclasses.</p>
</li>
<li><p>Lower-level classes (subclasses) inherit these attributes and operations from their superclasses.</p>
</li>
<li><p>Subclasses can then add more specific attributes and operations to refine their behaviour.</p>
</li>
</ul>
<p>    Generalization is a powerful technique for managing complexity in both everyday life and software engineering. By categorizing entities into more general classes and using inheritance mechanisms in object-oriented programming languages, developers can simplify system design, promote code reuse, and facilitate the maintenance of software systems.</p>
<ol start="3">
<li><h3 id="heading-aggregation"><strong>Aggregation:-</strong></h3>
<p> System modelling is a relationship between two classes where one class is a part or component of another class. It represents a "whole-part" relationship, indicating that one class (the whole) is composed of or contains one or more instances of another class (the part). Aggregation is often depicted in UML (Unified Modeling Language) diagrams, such as class diagrams, to illustrate the structure and composition of a system.</p>
<p> Key points about aggregation in system modelling include:</p>
<ol>
<li><p><strong>Whole-Part Relationship:</strong> Aggregation represents a relationship where one class (the whole) contains or is composed of other classes (the parts). The parts are typically dependent on the whole and cannot exist independently.</p>
</li>
<li><p><strong>Directionality:</strong> In aggregation, the direction of the relationship is typically from the whole to the part. This means that the whole class has a reference to the part class, indicating ownership or containment.</p>
</li>
<li><p><strong>Multiplicity:</strong> Aggregation relationships can have multiplicity, indicating how many instances of the part class are associated with a single instance of the whole class. Multiplicity can be one-to-one, one-to-many, or many-to-many, depending on the requirements of the system.</p>
</li>
<li><p><strong>Representation:</strong> In UML diagrams, aggregation is represented by a hollow diamond shape on the side of the whole class and a solid line connecting it to the part class. The diamond shape is placed near the whole class and the line connects to the part class.</p>
</li>
<li><p><strong>Example:</strong> An example of aggregation in system modelling could be a Car class containing instances of Wheel, Engine, and Body classes. The Car class represents the whole, while the Wheel, Engine, and Body classes represent the parts. The Car class has an aggregation relationship with the Wheel, Engine, and Body classes, indicating that it is composed of these parts.</p>
</li>
<li><p><strong>Ownership:</strong> Aggregation implies a form of ownership, where the whole class is responsible for managing the lifecycle of the part class instances. This means that when the whole class is destroyed or goes out of scope, the part class instances may also be affected.</p>
</li>
</ol>
</li>
</ol>
<p>    Overall, aggregation in system modelling is a powerful concept for representing complex relationships between classes, particularly when modelling systems composed of interconnected components or parts. It helps to visualize the structure of the system and understand how its components are organized and interconnected.</p>
<p>This is all about the Structural model. We will learn about the Behavioural model in our next blog.</p>
]]></content:encoded></item><item><title><![CDATA[Interaction model]]></title><description><![CDATA[This interaction model shows the user interaction, which involves user input and output interaction between the system being developed and other systems, or interaction between the components of the system. Modelling user interaction is important, as...]]></description><link>https://blog.codingminutes.com/interaction-model</link><guid isPermaLink="true">https://blog.codingminutes.com/interaction-model</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[coding]]></category><category><![CDATA[Deep Learning]]></category><category><![CDATA[engineering]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Tue, 14 May 2024 18:30:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712806283302/a34c72e6-ecaf-4c08-a5c2-ef641af43c84.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This interaction model shows the user interaction, which involves user input and output interaction between the system being developed and other systems, or interaction between the components of the system. Modelling user interaction is important, as it helps to identify user requirements, and highlights the communication problems that may arise.</p>
<p>Interaction modelling is further classified into two types :</p>
<ol>
<li><p>Use case diagram.</p>
</li>
<li><p>Sequence diagram.</p>
</li>
</ol>
<p>Now let us understand in detail about both of these modelling terms:-</p>
<h3 id="heading-use-case-modelling">Use case modelling:</h3>
<p>This is mostly used to model the interaction between a system and an external actor.</p>
<ol>
<li><p>Use case diagrams are visual representations that depict the interaction between an actor and a system. They show various use cases of functionality that the system provides.</p>
</li>
<li><p>The components of the use case diagram are:</p>
<ol>
<li><p>Actor: represents an external entity interacting with the system.</p>
</li>
<li><p>Use case: Represent specific functionality or task the system performs.</p>
</li>
<li><p>Relationship: Shows connection. Between actor and use case.</p>
</li>
</ol>
</li>
<li><p>An association colony is represented by a line connecting an actor to a use case.  It signifies the communication or Interaction between the actor and the use case.</p>
<ol>
<li><p>Included relationship: It signifies that a use case includes the functionality of another use case, providing a modular and irreducible design.</p>
</li>
<li><p>Extended relationship : It determines that a use case be extended by another use case under specific conditions.</p>
</li>
</ol>
</li>
</ol>
<p>    <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710640386542/5b6806a1-304d-4792-91e2-6c441eaf1524.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-2-sequence-diagram">2. Sequence diagram:-</h3>
<p>A sequence diagram is a type of interaction diagram in software engineering that illustrates the interactions between objects or components within a system over time. It depicts the flow of messages or calls between these objects, showing the order in which they occur. It visually represents the interaction and order of messages between different objects or components within a system over some time.</p>
<p>Here's a detailed description of the components and usage of a sequence diagram:</p>
<ol>
<li><p><strong>Objects (Lifelines)</strong>:</p>
<ul>
<li><p>Objects, also known as lifelines, represent instances of classes, components, or entities within the system.</p>
</li>
<li><p>Each object is depicted as a vertical line (lifeline) on the diagram.</p>
</li>
<li><p>Objects are labelled with their names or identifiers.</p>
</li>
<li><p>Lifelines represent the lifespan of an object during the sequence of interactions.</p>
</li>
</ul>
</li>
<li><p><strong>Messages</strong>:</p>
<ul>
<li><p>Messages are depicted as horizontal arrows between lifelines, representing communication or interactions between objects.</p>
</li>
<li><p>Messages can be synchronous or asynchronous:</p>
<ul>
<li><p>Synchronous messages indicate that the sender waits for a response from the receiver before proceeding.</p>
</li>
<li><p>Asynchronous messages indicate that the sender continues execution without waiting for a response.</p>
</li>
</ul>
</li>
<li><p>Messages may also include parameters or return values, which are shown along with the arrow.</p>
</li>
</ul>
</li>
<li><p><strong>Activation Bar</strong>:</p>
<ul>
<li><p>An activation bar is a vertical dashed line drawn on the lifeline to represent the period during which an object is performing an operation.</p>
</li>
<li><p>It shows when an object is active and processing a message.</p>
</li>
<li><p>The length of the activation bar indicates the duration of the object's activity.</p>
</li>
</ul>
</li>
<li><p><strong>Return Messages</strong>:</p>
<ul>
<li><p>Return messages are depicted as arrows with a dashed line indicating the return path from the calling object back to the calling object.</p>
</li>
<li><p>They represent the flow of control back to the caller after the called operation is completed.</p>
</li>
</ul>
</li>
<li><p><strong>Self-Message</strong>:</p>
<ul>
<li><p>A self-message is a message that an object sends to itself.</p>
</li>
<li><p>It is depicted as an arrow that loops back to the same lifeline.</p>
</li>
<li><p>Self-messages are used to represent internal processing or recursive calls within an object.</p>
</li>
</ul>
</li>
<li><p><strong>Combined Fragments</strong>:</p>
<ul>
<li><p>Combined fragments allow you to represent conditional or repetitive behaviour within a sequence diagram.</p>
</li>
<li><p>Examples include loops (represented by a rectangular box with a loop notation), alternative paths (represented by a diamond-shaped box with conditions), and parallel execution (represented by parallel vertical lines).</p>
</li>
</ul>
</li>
<li><p><strong>Notes and Comments</strong>:</p>
<ul>
<li>Sequence diagrams may include annotations, notes, or comments to provide additional information or clarify certain aspects of the interactions.</li>
</ul>
</li>
</ol>
<p>Now let us discuss the advantages and disadvantages of using sequence diagrams in software engineering:</p>
<p><strong>Advantages:</strong></p>
<ol>
<li><p><strong>Visual Representation:</strong> Sequence diagrams provide a visual representation of the interactions between objects or components in a system, making it easier for stakeholders to understand the system's behaviour.</p>
</li>
<li><p><strong>Clarity:</strong> They offer a clear and concise way to depict the flow of messages and interactions between objects over time, helping to identify potential issues or misunderstandings in the system's design.</p>
</li>
<li><p><strong>Communication:</strong> Sequence diagrams serve as effective communication tools between software developers, designers, and stakeholders, facilitating discussions about system behaviour and requirements.</p>
</li>
<li><p><strong>Analysis:</strong> They aid in analyzing the dynamic behaviour of a system, enabling developers to identify bottlenecks, optimize performance, and refine the design.</p>
</li>
<li><p><strong>Testing:</strong> Sequence diagrams can be used as a basis for designing test cases, ensuring comprehensive coverage of the system's functionality and interactions.</p>
</li>
<li><p><strong>Documentation:</strong> They serve as valuable documentation artifacts, capturing the essential aspects of system behaviour for future reference, maintenance, and enhancement.</p>
</li>
</ol>
<p><strong>Disadvantages:</strong></p>
<ol>
<li><p><strong>Complexity:</strong> Sequence diagrams can become complex and difficult to interpret, especially in systems with numerous objects and interactions, leading to potential confusion or misinterpretation.</p>
</li>
<li><p><strong>Limited Scope:</strong> They may not capture all aspects of system behaviour, especially non-functional requirements such as performance, scalability, or security concerns.</p>
</li>
<li><p><strong>Static Representation:</strong> Sequence diagrams primarily represent static snapshots of system interactions at a particular point in time, which may not fully capture the dynamic nature of certain systems or processes.</p>
</li>
<li><p><strong>Maintenance:</strong> Keeping sequence diagrams up-to-date with changes in system requirements or design can be challenging, especially in rapidly evolving software projects.</p>
</li>
<li><p><strong>Abstraction:</strong> Sequence diagrams may require a certain level of abstraction, which can lead to oversimplification or omission of important details, potentially resulting in incomplete or inaccurate representations of system behaviour.</p>
</li>
<li><p><strong>Tool Dependency:</strong> Creating and editing sequence diagrams often requires specialized modelling tools, which may not be readily available or accessible to all stakeholders involved in the software development process.</p>
</li>
</ol>
<p>Despite these disadvantages, sequence diagrams remain valuable tools for visualizing and understanding the interactions within a software system, provided they are used appropriately and in conjunction with other modelling techniques and documentation practices.</p>
<p>Sequence diagrams are valuable tools for understanding the dynamic behaviour of a system, particularly in scenarios involving multiple objects and complex interactions. They aid in designing, analyzing, and communicating the sequence of interactions between objects during the execution of a system's functionality.</p>
]]></content:encoded></item><item><title><![CDATA[System Modelling]]></title><description><![CDATA[System modelling is the process of developing an abstract model of a system, with each model presenting a different view or perspective of that system. System modelling has generally come to mean representing the system using some kind of graphical n...]]></description><link>https://blog.codingminutes.com/system-modelling</link><guid isPermaLink="true">https://blog.codingminutes.com/system-modelling</guid><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Software Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[coding]]></category><category><![CDATA[engineering]]></category><category><![CDATA[pratikkhose]]></category><dc:creator><![CDATA[Pratik Khose]]></dc:creator><pubDate>Mon, 13 May 2024 18:30:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712806181381/532a94e5-7258-4c19-bc66-1684abc8b8b7.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>System modelling is the process of developing an abstract model of a system, with each model presenting a different view or perspective of that system. System modelling has generally come to mean representing the system using some kind of graphical notation, which is now almost always based on notation in the unified modelling language(UML).</p>
<p>These models are used during the requirement engineering process to help derive the requirement for a system, during the design process to describe the system to engineers implementing the system and after implementation to document the system’s structure and operation.</p>
<p>You may develop different models to represent the system from different perspectives. These perspectives are:-</p>
<ol>
<li><p>An external perspective:- where you model the context or environment of the system.</p>
</li>
<li><p>An interaction perspective:- where you model the interactions between a system and its environment or between the components of a system.</p>
</li>
<li><p>A structural perspective:- where you model the organization of a system or the structure of the data that is processed by the system.</p>
</li>
<li><p>A behavioural perspective:- where you model the dynamic behaviour of the system and how it responds to events.</p>
</li>
</ol>
<p>Five diagram types that could represent the essentials of a system are:-</p>
<ol>
<li><p>Activity diagrams, which show the activities involved in a process or data processing.</p>
</li>
<li><p>Use case diagrams, which show the interactions between a system and its environment.</p>
</li>
<li><p>Sequence diagrams show interactions between actors and the system and between system components.</p>
</li>
<li><p>Class diagrams, show the object classes in the system and the associations between these classes.</p>
</li>
<li><p>State diagrams, which show how the system reacts to internal and external events.</p>
</li>
</ol>
<p>Key components of system modelling are :</p>
<ol>
<li><p>Structure: It describes the organisation and arrangement of components within the system, which includes entities, components and relationships.</p>
</li>
<li><p>Behaviour: it illustrates how the system operates and responds to inputs and events It captures the dynamic aspect of the system.</p>
</li>
<li><p>Interaction: depicts the flow of information, data and control among the system components. It describes the communication and collaboration between different parts of the system</p>
</li>
<li><p>Data:-  defines the data entities' attributes and their relationships. It specifies how the data is stored, processed and accessed within the system.</p>
</li>
</ol>
<p>The importance of system models are:-</p>
<ol>
<li><p>Clarity and communication: help stakeholders, including designers, developers and users to visualise and communicate the system structure and behaviour more efficiently.</p>
</li>
<li><p>Analysis and design: facilitate analysis of the system requirements and aid in the design process by providing the foundation for decision-making.</p>
</li>
<li><p>Documentation: serves as documentation that can be referred to through the development lifecycle, aiding in understanding, maintenance and future enhancement.</p>
</li>
<li><p>Verification and validation: Assist in verifying that the system meets specified requirements and invalidating its behaviour against user expectations.</p>
</li>
<li><p>Risk management: enables the identification and assessment of potential risk by providing a comprehensive view of the system components and interactions.</p>
</li>
</ol>
<p>The assistive model is a crucial tool in the field of system engineering and software development, providing a structural representation of a system to enhance understanding of communication and decision-making through the software development lifecycle.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710639843567/e590b54d-f39e-471f-accf-2a2c58778fd6.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-context-model">Context model</h3>
<p>In software engineering, a context mode is a diagram that represents the environment in which the assistant team or a subject operates to help to understand the boundaries and interaction between the system and its environment.</p>
<p>Context models are used to illustrate the operational context of a system. They show what lies outside the system's boundaries.</p>
<p>The context model provides the environment in which the object of our interest exists Context model captures how external objects interact within the environment, be it by exchanging data, physical objects or funds.</p>
<p>Now let us understand the components of the context model</p>
<ol>
<li><p>System: represents the software system under consideration This is the central focus of the context model. It represents the software, hardware or process of the software being developed.</p>
</li>
<li><p>External entities: entities outside the system that interact with it These can include users, other software systems, hardware devices or any external factor that influences the system.</p>
</li>
<li><p>Interactions: these are the arrow lines connecting the system and the external entities. This helps in symbolizing the flow of information or data control in the system.  Each arrow represents a form of interaction, such as input, output or event triggers.</p>
</li>
<li><p>Boundaries: the restriction that separates the system from external entities It visually defines what is inside the system and what is outside the system. System boundaries are established and differentiate between internal entities and external entities.</p>
</li>
</ol>
<p>Characteristics or purpose of context model:-</p>
<ol>
<li><p>Clarity and communication</p>
</li>
<li><p>Scope definition</p>
</li>
<li><p>Requirement analysis</p>
</li>
<li><p>Risk definition</p>
</li>
</ol>
<p>This is all about the content model, we will learn about the other models in further blogs.</p>
]]></content:encoded></item></channel></rss>