<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ahmed Boutaraa</title>
    <description>The latest articles on DEV Community by Ahmed Boutaraa (@sidahmeders).</description>
    <link>https://dev.to/sidahmeders</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F561810%2F77b6bf86-7207-4e9a-a9f7-7edb834fba7b.jpeg</url>
      <title>DEV Community: Ahmed Boutaraa</title>
      <link>https://dev.to/sidahmeders</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sidahmeders"/>
    <language>en</language>
    <item>
      <title>14 Systems Quality Attributes</title>
      <dc:creator>Ahmed Boutaraa</dc:creator>
      <pubDate>Sun, 24 Jan 2021 12:44:40 +0000</pubDate>
      <link>https://dev.to/sidahmeders/14-systems-quality-attributes-5df2</link>
      <guid>https://dev.to/sidahmeders/14-systems-quality-attributes-5df2</guid>
      <description>&lt;p&gt;A Quality Attribute (QA) is a measurable or testable property of a system that is used to indicate how well the system satisfies the needs of its stakeholders. You can think of a quality attribute as measuring the "goodness" of a product along some dimension of interest to a stakeholder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Availability&lt;/strong&gt; refers to the ability of the system to be available for use, especially after a fault occurs. The fault must be recognized (or prevented) and then the system must respond in some fashion. The response desired will depend on the criticality of the application and the type of fault and can range from “ignore it” to “keep on going as if it didn’t occur.” Tactics for availability are categorized into detect faults, recover from faults and prevent faults. Detection tactics depend, essentially, on detecting signs of life from various components. Recovery tactics are some combination of retrying an operation or maintaining redundant data or computations. Prevention tactics depend either on removing elements from service or utilizing mechanisms to limit the scope of faults.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interoperability&lt;/strong&gt; refers to the ability of systems to usefully exchange information. These systems may have been constructed with the intention of exchanging information, they may be existing systems that are desired to exchange information, or they may provide general services without knowing the details of the systems that wish to utilize those services. The general scenario for interoperability provides the details of these different cases. In any interoperability case, the goal is to intentionally exchange information or reject the request to exchange information. Achieving interoperability involves the relevant systems locating each other and then managing the interfaces so that they can exchange information&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modifiability&lt;/strong&gt; deals with change and the cost in time or money of making a change, including the extent to which this modification affects other functions or quality attributes. Changes can be made by developers, installers, or end-users, and these changes need to be prepared for. There is a cost of preparing for change as well as a cost of making a change. The modifiability tactics are designed to prepare for subsequent changes. Tactics to reduce the cost of making a change include making modules smaller, increasing cohesion, and reducing coupling. Deferring binding will also reduce the cost of making a change. Reducing coupling is a standard category of tactics that includes encapsulating, using an intermediary, restricting dependencies, co-locating related responsibilities, refactoring, and abstracting common services. Increasing cohesion is another standard tactic that involves separating responsibilities that do not serve the same purpose. Defer binding is a category of tactics that affect build time, load time, initialization time, or runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt; is about the management of system resources in the face of particular types of demand to achieve acceptable timing behavior. Performance can be measured in terms of throughput and latency for both interactive and embedded real-time systems, although throughput is usually more important in interactive systems, and latency is more important in embedded systems. Performance can be improved by reducing demand or by managing resources more appropriately. Reducing demand will have the side effect of reducing fidelity or refusing to service some requests. Managing resources more appropriately can be done through scheduling, replication, or just increasing the resources available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt; Attacks against a system can be characterized as attacks against the confidentiality, integrity, or availability of a system or its data. Confidentiality means keeping data away from those who should not have access while granting access to those who should. Integrity means that there are no unauthorized modifications to or deletion of data, and availability means that the system is accessible to those who are entitled to use it. The emphasis on distinguishing various classes of actors in the characterization leads to many of the tactics used to achieve security. Identifying, authenticating, and authorizing actors are tactics intended to determine which users or systems are entitled to what kind of access to a system. An assumption is made that no security tactic is foolproof and that systems will be compromised. Hence, tactics exist to detect an attack, limit the spread of any attack, and react and recover from an attack. Recovering from an attack involves many of the same tactics as availability and, in general, involves returning the system to a consistent state prior to any attack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testabily&lt;/strong&gt; Ensuring that a system is easily testable has payoffs both in terms of the cost of testing and the reliability of the system. A vehicle often used to execute the tests is the test harness. Test harnesses are software systems that encapsulate test resources such as test cases and test infrastructure so that it is easy to reapply tests across iterations and it is easy to apply the test infrastructure to new increments of the system. Another vehicle is the creation of test cases prior to the development of a component so that developers know which tests their component must pass. Controlling and observing the system state is a major class of testability tactics. Providing the ability to do fault injection, to record system state at key portions of the system, to isolate the system from its environment, and to abstract various resources are all different tactics to support the control and observation of a system and its components. Complex systems are difficult to test because of the large state space in which their computations take place, and because of the larger number of interconnections among the elements of the system. Consequently, keeping the system simple is another class of tactics that supports testability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usability&lt;/strong&gt; is concerned with how easy it is for the user to accomplish the desired task and the kind of user support the system provides. Over the years, a focus on usability has shown itself to be one of the cheapest and easiest ways to improve a system’s quality or precisely user’s perception of quality.&lt;br&gt;
To be able to predict user or system responses, the system must keep an explicit model of the user, the system, and the task. There is a strong relationship between supporting the user interface design process and supporting modifiability; this relation is promoted by patterns that enforce the separation of the user interface from the rest of the system, such as the MVC pattern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Variability&lt;/strong&gt; is a special form of modifiability. It refers to the ability of a system and its supporting artifacts such as requirements, test plans, and configuration specifications to support the production of a set of variants that differ from each other in a preplanned fashion. Variability is an especially important quality attribute in a software product line, where it means the ability of a core asset to adapt to usages in the different product contexts that are within the product line scope. The goal of variability in a software product line is to make it easy to build and maintain products in the product line over a period of time. Scenarios for variability will deal with the binding time of the variation and the people's time to achieve it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Portability&lt;/strong&gt; is also a special form of modifiability. Portability refers to the ease with which software that was built to run on one platform can be changed to run on a different platform. Portability is achieved by minimizing platform dependencies in the software, isolating dependencies to well-identified locations, and writing the software to run on a “virtual machine” (such as a Java Virtual Machine) that encapsulates all the platform dependencies within. Scenarios describing portability deal with moving software to a new platform by expending no more than a certain level of effort or by counting the number of places in the software that would have to change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Development distributability&lt;/strong&gt; is the quality of designing the software to support distributed software development. Many systems these days are developed using globally distributed teams. One problem that must be overcome when developing with distributed teams in coordinating their activities. The system should be designed so that coordination among teams is minimized. This minimal coordination needs to be achieved both for the code and for the data model. Teams working on modules that communicate with each other may need to negotiate the interfaces of those modules. When a module is used by many other modules, each developed by a different team, communication and negotiation become more complex and burdensome. Similar considerations apply to the data model. Scenarios for development distributability will deal with the compatibility of the communication structures and data model of the system being developed and the coordination mechanisms of the organizations doing the development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scalability&lt;/strong&gt; Two kinds of scalability are horizontal scalability and vertical scalability. Horizontal scalability (scaling out) refers to adding more resources to logical units, such as adding another server to a cluster of servers. Vertical scalability (scaling-up) refers to adding more resources to a physical unit, such as adding more memory to a single computer. The problem that arises with either type of scaling is how to effectively utilize the additional resources. Being effective means that the additional resources result in a measurable improvement of some system quality, did not require undue effort to add, and did not disrupt operations. In cloud environments, horizontal scalability is called elasticity. Elasticity is a property that enables a customer to add or remove virtual machines from the resource pool. These virtual machines are hosted on a large collection of upwards of 10,000 physical machines that are managed by the cloud provider. Scalability scenarios will deal with the impact of adding or removing resources, and the measures will reflect associated availability and the load assigned to existing and new resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployability&lt;/strong&gt; is concerned with how an executable arrives at a host platform and how it is subsequently invoked. Some of the issues involved in deploying software are: How does it arrive at its host (push, where updates are sent to users unbidden or pull, where users must explicitly request updates)? How is it integrated into an existing system? Can this be done while the existing system is executing? Mobile systems have their own problems in terms of how they are updated, because of concerns about bandwidth. Deployment scenarios will deal with the type of update (push or pull), the form of the update (medium, such as DVD or Internet download, and packagings, such as an executable, app, or plug-in), the resulting integration into an existing system, the efficiency of executing the process, and the associated risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mobility&lt;/strong&gt; deals with the problems of movement and affordances of a platform (e.g., size, type of display, type of input devices, availability and volume of bandwidth, and battery life). Issues in mobility include battery management, reconnecting after a period of disconnection, and the number of different user interfaces necessary to support multiple platforms. Scenarios will deal with specifying the desired effects of mobility or the various affordances. Scenarios may also deal with variability, where the same software is deployed on multiple (perhaps radically different) platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitorability&lt;/strong&gt; deals with the ability of the operations staff to monitor the system while it is executing. Items such as queue lengths, average transaction processing time, and the health of various components should be visible to the operations staff so that they can take corrective action in case of potential problems. Scenarios will deal with a potential problem and its visibility to the operator and potential corrective action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quality Attributes are features that facilitate the measurement of performance of a software product or system and can help you understand your requirement for a given scenario and what to expect from each team of operation. QA is meant to give the organizations and enterprises a broader and high-level overview of the system and what optimation and constraints they should consider before moving with any implementation.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Software Testing</title>
      <dc:creator>Ahmed Boutaraa</dc:creator>
      <pubDate>Sat, 23 Jan 2021 18:32:33 +0000</pubDate>
      <link>https://dev.to/sidahmeders/software-testing-44mb</link>
      <guid>https://dev.to/sidahmeders/software-testing-44mb</guid>
      <description>&lt;p&gt;testing range from testing small, individual pieces in isolation to an entire system. in this article I will briefly talk about the three phases of testing and why testing is an essential part of any successful company or product. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unit testing (U/T)&lt;/strong&gt; refers to tests run on specific pieces of software. U/T is usually a part of the job of implementing those pieces. In fact, unit tests are typically written by developers themselves. When the tests are written before developing the unit, this practice is known as test-driven development. Certifying that a unit has passed its unit tests is a precondition for the delivery of that unit to integration activities. Unit tests test the software in a standalone fashion, often relying on stubs (small part of a larger piece) to play the role of other units with which the tested unit interacts, as those other units may not yet be available. Unit tests won’t usually catch errors dealing with the interaction between elements that comes later but unit tests provide confidence that each of the system’s building blocks is exhibiting as much correctness as is possible on its own. A unit corresponds to an element in one of the modules or system. In object-oriented software, a unit might correspond to a class. In a layered system, a unit might correspond to a layer or a part of a layer. Most often a unit corresponds to an element at the leaf of a module decomposition tree.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integration testing (I/T)&lt;/strong&gt; is the process of testing individual units or components together as a whole. units/components are combined and tested as a group. for example, if we are building a new car from a bunch of components, how can we tell that this car is going to work as expected when all pieces are put together. well, this when doing our I/T and we make sure that these new pieces can work well together in an isolated environment.&lt;br&gt;
another example is how long does an end-to-end synchronization of a local database with a global database take? What happens if faults are injected into the system? What happens when a process fails? All of these conditions can be tested at integration time. Integration testing is also the time to test what happens when the system runs for an extended period. You could monitor resource usage during the testing and look for resources that are consumed but not freed. Does your pool of free database connections decrease over time? Then maybe database connections should be managed more aggressively. Does the thread pool show signs of degradation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Acceptance testing (A/T)&lt;/strong&gt; A/T is a kind of system testing that is performed by users,&lt;br&gt;
often in the setting in which the system will run. in our car example, this will be testing the car on the road and making sure it won't crash or fail as a whole.&lt;br&gt;
Two special cases of A/T are alpha and beta testing. In both of these, users are given free rein to use the system however they like, as opposed to testing that occurs under a preplanned regimen of a specific suite of tests. Alpha testing usually occurs in-house, whereas beta testing makes the system available to a select set of end-users under a “User beware”. A/T involves stressing the system’s quality attribute behavior by running it at extremely heavy loads, subjecting it to security attacks, depriving it of resources at critical times, and so forth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;so as you can see testing will turn out to be a very crucial step for making sure your product is ready, safe, and defect-free before the delivery to the client, which guarantees the quality of the software or product. It makes the product more reliable and easy to use and it brings people to trust in you and your company.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>what is UML and do we need it in Software Architecture?</title>
      <dc:creator>Ahmed Boutaraa</dc:creator>
      <pubDate>Tue, 19 Jan 2021 00:28:05 +0000</pubDate>
      <link>https://dev.to/sidahmeders/what-is-uml-and-do-we-need-it-3g9o</link>
      <guid>https://dev.to/sidahmeders/what-is-uml-and-do-we-need-it-3g9o</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Unified Modeling Language&lt;/strong&gt; or &lt;strong&gt;UML&lt;/strong&gt; in short it is Language used in systems and software development for specifying, visualizing, constructing, and documenting the artifacts and views of software systems and other non-software systems. we look at a system from many different viewpoints. Software development will have many stakeholders playing a part. for example:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Analysts&lt;/strong&gt;, &lt;strong&gt;Designers&lt;/strong&gt;, &lt;strong&gt;Coders&lt;/strong&gt;, &lt;strong&gt;Testers&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Customers&lt;/strong&gt;, &lt;strong&gt;Managers&lt;/strong&gt;, &lt;strong&gt;Executives&lt;/strong&gt;, &lt;strong&gt;Company-owners&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Investors&lt;/strong&gt;, &lt;strong&gt;Sponsors&lt;/strong&gt;, &lt;strong&gt;End-users&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All of these people are interested in different aspects of the system, and each of them require a different level of detail. For example, a coder needs to understand the design of the system and be able to convert the design to a low level code. By contrast, a technical writer is interested in the behavior of the system as a whole, and needs to understand how the product functions. The UML attempts to provide a language so expressive that all stakeholders can benefit from at least one UML diagram. and there a lot of diagrams that I am not gonna go through but I will give a list of reference of 14 UML Diagram Types:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structure Diagrams&lt;/strong&gt;. &lt;em&gt;Class Diagram&lt;/em&gt;. &lt;em&gt;Component Diagram&lt;/em&gt;. &lt;em&gt;Deployment Diagram&lt;/em&gt;. &lt;em&gt;Object Diagram&lt;/em&gt;. &lt;em&gt;Package Diagram&lt;/em&gt;. &lt;em&gt;Profile Diagram&lt;/em&gt;. &lt;em&gt;Composite Structure Diagram&lt;/em&gt;.&lt;br&gt;
&lt;strong&gt;Behavioral Diagrams&lt;/strong&gt;. &lt;em&gt;Use Case Diagram&lt;/em&gt;. &lt;em&gt;Activity Diagram&lt;/em&gt;. &lt;em&gt;State Machine Diagram&lt;/em&gt;. &lt;em&gt;Sequence Diagram&lt;/em&gt;. &lt;em&gt;Communication Diagram&lt;/em&gt;. &lt;em&gt;Interaction Overview Diagram&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;For Example One of the most vexing realities about architecture-based software development is the gulf between architectural and implementation ontologies, the set of concepts and terms inherent in an area. &lt;/p&gt;

&lt;p&gt;Ask an &lt;strong&gt;&lt;em&gt;architect&lt;/em&gt;&lt;/strong&gt; what concepts they work with all day, and you’re likely to hear things like &lt;strong&gt;modules&lt;/strong&gt;, &lt;strong&gt;components&lt;/strong&gt;, &lt;strong&gt;connectors&lt;/strong&gt;, &lt;strong&gt;stakeholders&lt;/strong&gt;, &lt;strong&gt;evaluation&lt;/strong&gt;, &lt;strong&gt;analysis&lt;/strong&gt;, &lt;strong&gt;documentation&lt;/strong&gt;, &lt;strong&gt;views&lt;/strong&gt;, &lt;strong&gt;modeling&lt;/strong&gt;, &lt;strong&gt;quality attributes&lt;/strong&gt;, &lt;strong&gt;business goals&lt;/strong&gt;, and &lt;strong&gt;technology roadmaps&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ask an &lt;strong&gt;&lt;em&gt;implementer&lt;/em&gt;&lt;/strong&gt; the same question, and you likely won’t hear any of those words. Instead, you’ll hear about &lt;strong&gt;objects&lt;/strong&gt;, &lt;strong&gt;methods&lt;/strong&gt;, &lt;strong&gt;algorithms&lt;/strong&gt;, &lt;strong&gt;data structures&lt;/strong&gt;, &lt;strong&gt;variables&lt;/strong&gt;, &lt;strong&gt;debugging&lt;/strong&gt;, &lt;strong&gt;statements&lt;/strong&gt;, &lt;strong&gt;code comments&lt;/strong&gt;, &lt;strong&gt;compilers&lt;/strong&gt;, &lt;strong&gt;generics&lt;/strong&gt;, &lt;strong&gt;operator overloading&lt;/strong&gt;, &lt;strong&gt;pointers&lt;/strong&gt;, and &lt;strong&gt;build scripts&lt;/strong&gt;. This is a gap in language that reflects a gap in concepts. This gap is, in turn, reflected in the languages of the tools that each community uses. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UML&lt;/strong&gt; started out as a way to model object-oriented designs that could be quickly converted to code—that is, &lt;strong&gt;UML&lt;/strong&gt; is conceptually &lt;em&gt;“close”&lt;/em&gt; to code. Today it is a &lt;em&gt;de facto architecture&lt;/em&gt; description language, and likely the most popular one.&lt;br&gt;
Architecture is an abstraction of implementation is almost its whole point: architecture lets us achieve intellectual control over a system without having to capture, let alone master, all of the countless and myriad truths about its implementation. And here comes the gap again: All of those truths about its implementation are what coders produce for a living, without which the system remains but an idea. Architects, on the other hand, dismiss all of that reality by&lt;br&gt;
announcing that they are not interested in implementation “details.”&lt;br&gt;
&lt;em&gt;Can’t we all get along?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The good news is that even though architecture and implementation speak different languages, they aren’t languages from different planets. Concepts in one ontology usually correspond pretty well to concepts in another. Frameworks are an area where the languages enjoy a fair amount of overlap. So are interfaces. These constructs live on the cusp of the two domains and provide hope that we might one day speak the same language.&lt;/p&gt;

</description>
      <category>uml</category>
      <category>software</category>
      <category>architecture</category>
      <category>systems</category>
    </item>
    <item>
      <title>Notations for Software &amp; Systems Architecture Documentation</title>
      <dc:creator>Ahmed Boutaraa</dc:creator>
      <pubDate>Mon, 18 Jan 2021 14:57:27 +0000</pubDate>
      <link>https://dev.to/sidahmeders/notations-for-architecture-software-documentation-28oc</link>
      <guid>https://dev.to/sidahmeders/notations-for-architecture-software-documentation-28oc</guid>
      <description>&lt;p&gt;Writing architectural documentation is much like other types of writing. You must understand the uses to which the writing is to be put and the audience for the writing. Architectural documentation serves as a means for communication among various stakeholders, not only up the management chain and down to the developers but also across to peers.&lt;br&gt;
Architecture is a complicated artifact, best expressed by focusing on particular perspectives depending on the message to be communicated. These perspectives are called views, and you must choose the views to document, must choose the notation to document these views, and must choose a set of views that is both minimal and adequate. This may involve combining various views that have a large overlap. You must document not only the structure of the architecture but also the behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Notations for documenting views differ considerably in their degree of formality. Roughly speaking, there are three main categories of notation:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Informal notations&lt;/strong&gt;. Views are depicted (often graphically) using general-purpose diagramming and editing tools and visual conventions are chosen for the system at hand. The semantics of the description is characterized by natural language, and they cannot be formally analyzed. In our experience, the most common tool for informal notations is "PowerPoint".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semiformal notations&lt;/strong&gt;. Views are expressed in a standardized notation that prescribes graphical elements and rules of construction, but it does not provide a complete semantic treatment of the meaning of those elements. Rudimentary analysis can be applied to determine if a description satisfies syntactic properties. "UML" is a semiformal notation in this sense.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Formal notations&lt;/strong&gt;. Views are described in a notation that has precise (usually mathematically based) semantics. Formal analysis of both syntax and semantics is possible. There are a variety of formal notations for software architecture available. Generally referred to as "architecture description languages (ADLs)", they typically provide both a graphical vocabulary and an underlying semantics for architecture representation. In some cases, these notations are specialized to particular architectural views. In others, they allow many views or even provide the ability to formally define new views. The usefulness of ADLs lies in their ability to support automation through associated tools: automation to provide a useful analysis of the architecture or assist in code generation. In practice, the use of such notations is rare.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Schmucks and Jerks&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
One day A compiler guru. He was recounting some of his favorite war stories from his long career. One of these stories is a good example of the way as software engineers and an architect you should document your code. this guru was talking about the time that he was chasing down a very nasty and subtle bug in the code of a compiler that he was maintaining. After a long and exasperating search, he finally located and eventually fixed the bug. But the search itself had gotten him so worked up, and he was so infuriated at the irresponsible thought and programming that led to the bug, that he decided to do a bit more detective work and figure out who was the jerk responsible for that bug. By going back through the revision history, he found the culprit. It was him. He was the jerk. It turns out that he was the one who—eight years earlier—had written that offending piece of code. The trouble was, he had no recollection of writing the code and no recollection of the rationale for writing it the way he had done. Perhaps there was a good reason to do so at the time, but if so it was lost now. That is why we document. The documentation helps the poor schmuck who has to maintain your code in the future, and that schmuck might very well be you!&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Determining which form of notation to use involves making several tradeoffs. Typically, more formal notations take more time and effort to create and understand, but they repay this effort in reduced ambiguity and more opportunities for analysis. Conversely, more informal notations are easier to create, but they provide fewer guarantees. Regardless of the level of formality, always remember that different notations are better (or worse) for expressing different kinds of information. Formality aside, no UML class diagram will help you reason about schedulability, nor will a sequence chart tell you very much about the system’s likelihood of being delivered on time. You should choose your notations and representation languages always keeping in mind the important issues you need to capture and reason about.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>software</category>
      <category>development</category>
      <category>engineering</category>
    </item>
  </channel>
</rss>
