\documentclass[10pt,a4paper]{article} % Packages \usepackage{fancyhdr} % For header and footer \usepackage{multicol} % Allows multicols in tables \usepackage{tabularx} % Intelligent column widths \usepackage{tabulary} % Used in header and footer \usepackage{hhline} % Border under tables \usepackage{graphicx} % For images \usepackage{xcolor} % For hex colours %\usepackage[utf8x]{inputenc} % For unicode character support \usepackage[T1]{fontenc} % Without this we get weird character replacements \usepackage{colortbl} % For coloured tables \usepackage{setspace} % For line height \usepackage{lastpage} % Needed for total page number \usepackage{seqsplit} % Splits long words. %\usepackage{opensans} % Can't make this work so far. Shame. Would be lovely. \usepackage[normalem]{ulem} % For underlining links % Most of the following are not required for the majority % of cheat sheets but are needed for some symbol support. \usepackage{amsmath} % Symbols \usepackage{MnSymbol} % Symbols \usepackage{wasysym} % Symbols %\usepackage[english,german,french,spanish,italian]{babel} % Languages % Document Info \author{brownie5} \pdfinfo{ /Title (seng-301.pdf) /Creator (Cheatography) /Author (brownie5) /Subject (SENG 301 Cheat Sheet) } % Lengths and widths \addtolength{\textwidth}{6cm} \addtolength{\textheight}{-1cm} \addtolength{\hoffset}{-3cm} \addtolength{\voffset}{-2cm} \setlength{\tabcolsep}{0.2cm} % Space between columns \setlength{\headsep}{-12pt} % Reduce space between header and content \setlength{\headheight}{85pt} % If less, LaTeX automatically increases it \renewcommand{\footrulewidth}{0pt} % Remove footer line \renewcommand{\headrulewidth}{0pt} % Remove header line \renewcommand{\seqinsert}{\ifmmode\allowbreak\else\-\fi} % Hyphens in seqsplit % This two commands together give roughly % the right line height in the tables \renewcommand{\arraystretch}{1.3} \onehalfspacing % Commands \newcommand{\SetRowColor}[1]{\noalign{\gdef\RowColorName{#1}}\rowcolor{\RowColorName}} % Shortcut for row colour \newcommand{\mymulticolumn}[3]{\multicolumn{#1}{>{\columncolor{\RowColorName}}#2}{#3}} % For coloured multi-cols \newcolumntype{x}[1]{>{\raggedright}p{#1}} % New column types for ragged-right paragraph columns \newcommand{\tn}{\tabularnewline} % Required as custom column type in use % Font and Colours \definecolor{HeadBackground}{HTML}{333333} \definecolor{FootBackground}{HTML}{666666} \definecolor{TextColor}{HTML}{333333} \definecolor{DarkBackground}{HTML}{BABABA} \definecolor{LightBackground}{HTML}{F6F6F6} \renewcommand{\familydefault}{\sfdefault} \color{TextColor} % Header and Footer \pagestyle{fancy} \fancyhead{} % Set header to blank \fancyfoot{} % Set footer to blank \fancyhead[L]{ \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{C} \SetRowColor{DarkBackground} \vspace{-7pt} {\parbox{\dimexpr\textwidth-2\fboxsep\relax}{\noindent \hspace*{-6pt}\includegraphics[width=5.8cm]{/web/www.cheatography.com/public/images/cheatography_logo.pdf}} } \end{tabulary} \columnbreak \begin{tabulary}{11cm}{L} \vspace{-2pt}\large{\bf{\textcolor{DarkBackground}{\textrm{SENG 301 Cheat Sheet}}}} \\ \normalsize{by \textcolor{DarkBackground}{brownie5} via \textcolor{DarkBackground}{\uline{cheatography.com/27396/cs/7936/}}} \end{tabulary} \end{multicols}} \fancyfoot[L]{ \footnotesize \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{LL} \SetRowColor{FootBackground} \mymulticolumn{2}{p{5.377cm}}{\bf\textcolor{white}{Cheatographer}} \\ \vspace{-2pt}brownie5 \\ \uline{cheatography.com/brownie5} \\ \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Cheat Sheet}} \\ \vspace{-2pt}Published 20th April, 2016.\\ Updated 12th May, 2016.\\ Page {\thepage} of \pageref{LastPage}. \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Sponsor}} \\ \SetRowColor{white} \vspace{-5pt} %\includegraphics[width=48px,height=48px]{dave.jpeg} Measure your website readability!\\ www.readability-score.com \end{tabulary} \end{multicols}} \begin{document} \raggedright \raggedcolumns % Set font size to small. Switch to any value % from this page to resize cheat sheet text: % www.emerson.emory.edu/services/latex/latex_169.html \footnotesize % Small font. \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Intro}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{What is software engineering?} \tn \mymulticolumn{1}{x{17.67cm}}{\hspace*{6 px}\rule{2px}{6px}\hspace*{6 px}Engineer = capable of designing a system; Programmer = hired to produce code; Developer = design and architect software + documents; Software engineer = thinks of the end product, bridges the gap between customers and programmers} \tn % Row Count 6 (+ 6) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Requirements Engineering} \tn \mymulticolumn{1}{x{17.67cm}}{\hspace*{6 px}\rule{2px}{6px}\hspace*{6 px}Domain Analysis; Problem Definition; Requirements Gathering; Requirements Analysis; Requirements Specification} \tn % Row Count 10 (+ 4) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Requirements Engineering Details} \tn \mymulticolumn{1}{x{17.67cm}}{\hspace*{6 px}\rule{2px}{6px}\hspace*{6 px}Design = User Interface Design, Define Subsystems; Modeling = Use Cases, Structural (Formal) Modelling, Dynamic Behavioural Modelling} \tn % Row Count 14 (+ 4) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Quality Assurance} \tn \mymulticolumn{1}{x{17.67cm}}{\hspace*{6 px}\rule{2px}{6px}\hspace*{6 px}Review and Inspection; Testing; Deployment; Configuration Management; Process Management = Cost Estimation, Planning} \tn % Row Count 18 (+ 4) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{x{8.635 cm} x{8.635 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{17.67cm}}{\bf\textcolor{white}{Incremental vs Iterative}} \tn % Row 0 \SetRowColor{LightBackground} Incremental & Iterative \tn % Row Count 1 (+ 1) % Row 1 \SetRowColor{white} 1. The requirements are divided into different builds & 1. Does not start with a full specification \tn % Row Count 4 (+ 3) % Row 2 \SetRowColor{LightBackground} 2. Needs a clear and complete definition of the whole system from the start & 2. Building and improving the product step by step \tn % Row Count 8 (+ 4) % Row 3 \SetRowColor{white} 3. Customers can respond to each build (but a build may not represent the whole system) & 3. We can get reliable user feedback \tn % Row Count 13 (+ 5) % Row 4 \SetRowColor{LightBackground} 4. Incremental fundamentally means {\bf{add onto}} and helps you to improve your {\bf{process}} & 4. Good for big projects \tn % Row Count 18 (+ 5) % Row 5 \SetRowColor{white} & 5. Only major reqs. can be defined, details may evolve over time \tn % Row Count 22 (+ 4) % Row 6 \SetRowColor{LightBackground} & 6. Iterative fundamentally means {\bf{redo}} and helps you to improve you {\bf{product}} \tn % Row Count 27 (+ 5) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Story Cards}} \tn \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{{\bf{Title}} = Should be a verb description (Ex. View a product location) \newline % Row Count 2 (+ 2) {\bf{Goal}} = "As a \{type of user\}, I want to \{perform some action\} so that I can \{achieve some goal\}"% Row Count 4 (+ 2) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Story Maps}} \tn \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Story Maps add narrative structure to a backlog \newline % Row Count 1 (+ 1) -Top Level: Main features. Also know as a project backbone \newline % Row Count 3 (+ 2) -Second Level: important tasks or related stories. Also known as a walking skeleton. \newline % Row Count 5 (+ 2) -Additional tasks are added to flesh out interactions% Row Count 7 (+ 2) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Prototyping}} \tn \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{{\bf{Types of Prototypes:}} \newline % Row Count 1 (+ 1) {\emph{Throwaway}} = Example is a paper one. Will be used only for evaluation; {\emph{Incremental}} = created a separate components; {\emph{Evolutionary}} = refined to become actual product \newline % Row Count 5 (+ 4) {\bf{Prototype Fidelity:}} \newline % Row Count 6 (+ 1) {\emph{Low}} = Omit details (Rough, no code, easy to trash) - Paper, Storyboard, Wizard of OZ (evaluation) {\emph{High}} = Looks like a polished product (looks of product, comment on aesthetics, GUI powerpoint etc are used) \newline % Row Count 11 (+ 5) {\bf{Prototyping can help answer:}} \newline % Row Count 12 (+ 1) - Crowded UI, Knobs versu slider for controlling volume, Navigation = Transparent or solid menu?% Row Count 14 (+ 2) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{White Box/Black Box Testing}} \tn \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{{\bf{White}} = AKA glass box, structural; Tester know the source code and can debug at runtime = Developer's perspective \newline % Row Count 3 (+ 3) {\bf{Unit Testing}} = Do discrete parts of my system work as expected? \newline % Row Count 5 (+ 2) - Does an individual method work as expected? \newline % Row Count 6 (+ 1) - Necessary calls to other methods should be mocked out where possible \newline % Row Count 8 (+ 2) -Always white box \newline % Row Count 9 (+ 1) {\bf{Black}} = Tester gives inputs and observe outputs (No code, only focus on reqs., interacts with UI only) = User's perspective \newline % Row Count 12 (+ 3) {\bf{Acceptance Testing}} = Is the system working from the customer's perspective? (AKA. System testing) \newline % Row Count 15 (+ 3) - Interacts with system through GUI \newline % Row Count 16 (+ 1) - Focused in feature \newline % Row Count 17 (+ 1) Usually black box% Row Count 18 (+ 1) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{White = Did we build the system right? \newline Black = Did we build the right system?} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Agile vs TDD}} \tn \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{{\bf{TDD}} = focused on how code gets written (for work cycles of individuals or small groups of developers exclusively) \newline % Row Count 3 (+ 3) {\bf{Agile}} = Overall development process (focuses on project management and groups of developers, as opposed to specifically how a given developer writes code)% Row Count 7 (+ 4) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Polymorphism}} \tn \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{A property of OO software by which an abstract operation may be performed in different ways, typically in different classes.% Row Count 3 (+ 3) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Inheritance}} \tn \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Implicit possession by a subclass of features defined in a subclass. Features include variables and methods% Row Count 3 (+ 3) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{x{5.5264 cm} x{11.7436 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{17.67cm}}{\bf\textcolor{white}{Abstract Classes and Abstract Operations}} \tn % Row 0 \SetRowColor{LightBackground} Abstract Operations & No method for that operation exists in the class \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} Abstract Class & Cannot have any instances \tn % Row Count 4 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{17.67cm}}{- A class that has one or more abstract more abstract methods must be declared abstract. \newline - Any class, except a leaf class, can be declared abstract \newline - Label with \textless{}abstract\textgreater{}} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Sturctural Modelling}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{{\bf{Generalization:}} Specializing a superclass into subclasses. Avoid unnecessary generalizations} \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{{\bf{Dependency:}} Used for extremely weak relationships between classes. Ex. A class makes use of a library} \tn % Row Count 5 (+ 3) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{{\bf{Aggregation:}} Represents "part-whole" relationships. The whole side is called the aggregate. Aggregations are read as "is part of"} \tn % Row Count 8 (+ 3) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{{\bf{Composition:}} Are strong forms of aggregation. If the aggregate is destroyed, then the parts are also destroyed.} \tn % Row Count 11 (+ 3) \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{{\bf{Aggregation}} = An association is an aggregation if: the parts 'are part of' the aggregate. The aggregate 'is composed of' the parts. When something owns or controls the aggregate, then they also own and control the parts} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Evolvability}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{"The ability to be evolved" - to adapt in response to change in its environment, requirement and technologies that may have impact on software structural and/or functional enhancements, while taking architectural integrity into consideration} \tn % Row Count 5 (+ 5) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Potential to respond to the pressure to change with minimal modifications} \tn % Row Count 7 (+ 2) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Ex. Bug fixes, enhancements, refactoring, porting} \tn % Row Count 8 (+ 1) \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Complexity inherently increases unless work is done to maintain or reduce it} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Design Principe 1: Divide and Conquer}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Doing something big is normally harder than breaking things up} \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Separate people can work on each part.} \tn % Row Count 3 (+ 1) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{An individual software engineer can specialize} \tn % Row Count 4 (+ 1) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Easier to understand, individual small components} \tn % Row Count 5 (+ 1) % Row 4 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Parts can be replaced or changed without replacing or changing other parts} \tn % Row Count 7 (+ 2) % Row 5 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Ways of dividing: distributed systems = clients and servers; systems = subsystems; subsystem = one or more packages; package = classes; class = methods} \tn % Row Count 11 (+ 4) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Design Principle 3: Reduce coupling}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Occurs when there are interdependencies between one module and another} \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{When interdependencies exist, changes in one place will require changes somewhere else} \tn % Row Count 4 (+ 2) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Network of interdependencies makes it hard to see at a glance how some components work} \tn % Row Count 6 (+ 2) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Coupling implies that if you want to reuse one module, you have import the coupled ones too} \tn % Row Count 8 (+ 2) % Row 4 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Types (high coupling to low): - Content: one module to another - Common: two modules share global data, - External : two modules share data format, protocol, - Control - one module controls the flow of another through the argument it passes, - Stamp: Modules share a data structure but each only use a part of it, - Data: modules share data (through parameter passing), - Message: communication between modules via message passing} \tn % Row Count 17 (+ 9) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Adapter}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Context = Building an inheritance hierarchy and want to incorporate it into an existing class; the reused class is also often already part of its own inheritance heirarchy} \tn % Row Count 4 (+ 4) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Motivation = how to obtain the power of polymorphism when reusing a class whose methods have the same function but not the same signature as the other methods in the hierarchy?} \tn % Row Count 8 (+ 4) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Pros = allows you to reuse code that doesn't quite match the method signature you were expecting and you can't modify, decouples clients from internal structure} \tn % Row Count 12 (+ 4) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Cons = changes the interfaces to the functionality you want to use, overuse allows for many redundant classes} \tn % Row Count 15 (+ 3) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Singleton}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Intent = ensure a class only has one instance and provides a global point of access to it} \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Motivation = It's important for some classes to have exactly one instance. We want to use a single log object to keep track of when multiple threads are taking certain actions and it's important that the timing is shown correctly} \tn % Row Count 7 (+ 5) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Pros = Ensures only one instance is created} \tn % Row Count 8 (+ 1) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Cons = Better ways of doing this, usually used wrong and is dangerous (security)} \tn % Row Count 10 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Observer}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Context = When an association is created between two classes, the code for the class becomes inseparable, reuse of one class means reuse of the other} \tn % Row Count 3 (+ 3) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Motivation = how do you reduce the interconnection between classes, especially between classes that belong to different modules or subsystems?} \tn % Row Count 6 (+ 3) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Antipatterns = Connect an observer directly to an observable so that both have reference to each other, - Make the observes subclasses of the observable} \tn % Row Count 10 (+ 4) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Pros = Limits the amount of information accessed by different classes, ensures that events are handled} \tn % Row Count 13 (+ 3) % Row 4 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Cons = Many modern programming languages have a better, built in event system} \tn % Row Count 15 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Software Architecture}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Process of designing the global organization of a software system including:} \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{- Dividing software into subsystems - Deciding how these will interact - Determining their interfaces: the architecture is the core of the design so all software engineers must understand it. Architecture will often constrain the overall efficiency, reusability and maintainability of the system} \tn % Row Count 8 (+ 6) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Importance: To enable everyone to better understand the system, To allow people to work on individual pieces of the system in isolation, prepare for extension of the system, facilitate reuse and reusability} \tn % Row Count 13 (+ 5) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Architecture in different views:} \tn % Row Count 14 (+ 1) % Row 4 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{- Logical breakdown into subsystems, - Interfaces among the subsystems, - Dynamics of the interaction among components at run time, - Data will be shared among subsystems, - Components will exist at run time and the machines or devices on which they will be located, -} \tn % Row Count 20 (+ 6) % Row 5 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Ensuring maintainability and reliability = architectural model is stable} \tn % Row Count 22 (+ 2) % Row 6 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{- Stable = means new features can be easily added with only small changes to the architecture} \tn % Row Count 24 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Developing an architectural model}} \tn \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{{\bf{Start by sketching an outline:}} \newline % Row Count 1 (+ 1) - Based on the principal reqs. and use cases \newline % Row Count 2 (+ 1) - Determine the main components that will be needed \newline % Row Count 4 (+ 2) - Chose among the various architectural patterns \newline % Row Count 5 (+ 1) - Suggestion: Have several teams independently develop a first draft of the archi. and merge together the best ideas. \newline % Row Count 8 (+ 3) {\bf{Refine the architecture:}} \newline % Row Count 9 (+ 1) - Identify the mains ways in which the components will interact and the interfaces between them \newline % Row Count 11 (+ 2) - Decide how each piece of data and functionality will be distributed among the various components \newline % Row Count 13 (+ 2) - Determine if you can re-use an existing framework, if you can build a framework. \newline % Row Count 15 (+ 2) *{\bf{Mature the architecture}} \newline % Row Count 16 (+ 1) - All UML diagrams = useful for describing aspects of the archi. model% Row Count 18 (+ 2) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Architecture using UML diagrams particular = Package, subsystem, component, deployment} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Model View Controller (MVC)}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Intent = an architectural pattern used to help separate the user interface layer from other parts of the system} \tn % Row Count 3 (+ 3) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Motivation = I have a program which interacts with advanced user (through command line) and novice users (through a GUI)} \tn % Row Count 6 (+ 3) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Model = Manages behaviour data, responds to requests about its state (view), responds to state change commands (controller)} \tn % Row Count 9 (+ 3) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{View - Manages display of information} \tn % Row Count 10 (+ 1) % Row 4 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Controller = Interprets user input, changes model and view} \tn % Row Count 12 (+ 2) % Row 5 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Pros = Separation of concerns, increased usability, readability, reusability and testability} \tn % Row Count 14 (+ 2) % Row 6 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Cons = none worth mentioning} \tn % Row Count 15 (+ 1) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Refactoring}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Improving the design of an already written code} \tn % Row Count 1 (+ 1) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{The process of changing a software system while not altering the external behaviour of the code} \tn % Row Count 3 (+ 2) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{A disciplined way to clean up code that minimize the introduction of bugs} \tn % Row Count 5 (+ 2) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Code Smell = surface indication that corresponds to a deeper problem in the system (Duplicated code, Feature Envy, Middle Man, Temporary Fields)} \tn % Row Count 8 (+ 3) % Row 4 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Refactoring Techniques = Extract method, Move method, Pull Up method, Remove middle man, Extract Class, Inline = put body in caller's method and remove the self method} \tn % Row Count 12 (+ 4) % Row 5 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Duplicated code (same expression in two methods of same class or subclasses/similar code/does same thing, different algorithm) = Extract method, Pull up method/field} \tn % Row Count 16 (+ 4) % Row 6 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Feature Envy (likes other classes than it's own) = Move method, Extract method} \tn % Row Count 18 (+ 2) % Row 7 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Middle man (delegates task to others) = Remove middle man} \tn % Row Count 20 (+ 2) % Row 8 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Temp. field (empty unless needed) = Extract class} \tn % Row Count 21 (+ 1) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Requirements Activities}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Eliciting Requirements; Modeling and Analyzing Requirements; Communicating Requirements; Agreeing Requirements; Evolving Requirements} \tn % Row Count 3 (+ 3) \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{{\bf{Elicitation}} = Surveys, analysing existing documents, brainstorming, model driven techniques, observation or card sorting \newline {\bf{Modelling}} = Data, Enterprise, Behavioural, Domain or non-functional reqs. \newline {\bf{Communicating}} = Effective communication among different stakeholders \newline {\bf{Agreeing}} = Verification and validation, requirement conflicts, requirement risks, stakeholder conflicts \newline {\bf{Evolving}} = Managing change, adding reqs, reqs. scrubbing, fixing errors, managing documentation} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Overriding}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{1. SubClassA inherits a method M from A} \tn % Row Count 1 (+ 1) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{2. SubClassA implements method M' such that the signatures of M and M' are indistiguishable} \tn % Row Count 3 (+ 2) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{3. M' is said to {\bf{override}} M} \tn % Row Count 4 (+ 1) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{x{8.635 cm} x{8.635 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{17.67cm}}{\bf\textcolor{white}{Dependency vs. Association}} \tn % Row 0 \SetRowColor{LightBackground} Dependencies only involve using other classes & Associations involve maintaining references to other classes \tn % Row Count 3 (+ 3) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{x{8.635 cm} x{8.635 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{17.67cm}}{\bf\textcolor{white}{Aggregation vs Composition}} \tn % Row 0 \SetRowColor{LightBackground} Aggregate parts continue to exist if the aggregation is destoryed and can be used in multiple aggregations & Composite parts are specific to their composition and will be destroyed with the composition \tn % Row Count 6 (+ 6) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{x{8.635 cm} x{8.635 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{17.67cm}}{\bf\textcolor{white}{Sequence vs. Communication}} \tn % Row 0 \SetRowColor{LightBackground} {\bf{Sequence}} = good for explicit ordering of interactions (Interaction model for use case = use case make time ordering explicit) & {\bf{Communication}} = Adding details to class diagrams (validates a class diagram and derives an interaction from a class diagram) \tn % Row Count 7 (+ 7) % Row 1 \SetRowColor{white} \mymulticolumn{2}{x{17.67cm}}{Adds detail to messages (Communication has less space)} \tn % Row Count 9 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{x{9.1531 cm} x{8.1169 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{17.67cm}}{\bf\textcolor{white}{Maintainability vs. Evolvability}} \tn % Row 0 \SetRowColor{LightBackground} Maintainability = actual effort required to locate and fix a fault in the program within its operating environment & Evolvability = potential to respond \tn % Row Count 6 (+ 6) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{x{4.3175 cm} x{12.9525 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{17.67cm}}{\bf\textcolor{white}{Evolvability Charcteristics}} \tn % Row 0 \SetRowColor{LightBackground} Integrity & Capability of the software system to maintain architectural coherence while accommodating changes \tn % Row Count 4 (+ 4) % Row 1 \SetRowColor{white} \seqsplit{Changeability} & Capability of the system to enable a specified modification to be implemented. \tn % Row Count 7 (+ 3) % Row 2 \SetRowColor{LightBackground} \seqsplit{Portability} & Capability of the software system to be transferred from one environment to another \tn % Row Count 10 (+ 3) % Row 3 \SetRowColor{white} \seqsplit{Extensibility} & Capability of the software system to enable the implementation of extensions to expand or enhance the system (new capabilities and features) with minimal impact to the existing systems \tn % Row Count 17 (+ 7) % Row 4 \SetRowColor{LightBackground} \seqsplit{Testability} & Capability of the software system to enable modified software to be validated \tn % Row Count 20 (+ 3) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Design Patterns}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{The recurring aspects of designs} \tn % Row Count 1 (+ 1) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Pattern = outline of a reusable solution to a general solution encountered in a particular context} \tn % Row Count 3 (+ 2) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Name = unique name for each pattern to ease communication} \tn % Row Count 5 (+ 2) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Intent = Description of the goal of the pattern} \tn % Row Count 6 (+ 1) % Row 4 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Motivation = short scenario illustrating the context in which the pattern can be used} \tn % Row Count 8 (+ 2) % Row 5 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Structure = Class and/or interaction diagrams graphically illustrating the solution} \tn % Row Count 10 (+ 2) % Row 6 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Consequences = Description of the side-effects and results of the pattern} \tn % Row Count 12 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{p{1.727 cm} p{1.727 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{17.67cm}}{\bf\textcolor{white}{Concurrent Engineering}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{2}{x{17.67cm}}{Divide and Conquer} \tn % Row Count 1 (+ 1) % Row 1 \SetRowColor{white} \mymulticolumn{2}{x{17.67cm}}{Teams work on separate components: Follow their own approach} \tn % Row Count 3 (+ 2) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{2}{x{17.67cm}}{Main Risk: Components don't integrate properly} \tn % Row Count 4 (+ 1) % Row 3 \SetRowColor{white} \mymulticolumn{2}{x{17.67cm}}{Design break each other} \tn % Row Count 5 (+ 1) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{x{8.635 cm} x{8.635 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{17.67cm}}{\bf\textcolor{white}{Common Agile Practice}} \tn % Row 0 \SetRowColor{LightBackground} Refactoring: Incrementally improving the code & Sustainable Pace: No overtime, people work when rested \tn % Row Count 3 (+ 3) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{17.67cm}}{No sustainable pace because: \newline -Teams do not have an option to make their own decision \newline -Allocating people on multiple projects \newline -Team's inability to say "No"} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{x{8.635 cm} x{8.635 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{17.67cm}}{\bf\textcolor{white}{Agile vs. Spiral}} \tn % Row 0 \SetRowColor{LightBackground} Agile & Spiral \tn % Row Count 1 (+ 1) % Row 1 \SetRowColor{white} Iterations are shorter (1 to 4 weeks) & Iterations are longer (4 to 6 months) \tn % Row Count 3 (+ 2) % Row 2 \SetRowColor{LightBackground} Not good for low rates of requirements change (cost of collaboration) & Suitable for large scale development (due to risk analysis) \tn % Row Count 7 (+ 4) % Row 3 \SetRowColor{white} Is good for low-risk and less critical systems & More emphasis on documentation and process \tn % Row Count 10 (+ 3) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{17.67cm}}{Both are incremental and iterative} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{x{8.635 cm} x{8.635 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{17.67cm}}{\bf\textcolor{white}{Parts of a Use Case}} \tn % Row 0 \SetRowColor{LightBackground} Name = What is this use case about? & Needs to be descriptive so people can use it. The most important part \tn % Row Count 4 (+ 4) % Row 1 \SetRowColor{white} Actors = Who is going to use this use case? & Focus on types of people \tn % Row Count 7 (+ 3) % Row 2 \SetRowColor{LightBackground} Postconditions = What is the result of this interaction & Focus on what has been accomplished \tn % Row Count 10 (+ 3) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{17.67cm}}{{\bf{Name:}} Add announcement to a single course \newline {\bf{Actor:}} Instructors, TAs \newline {\bf{Postconditions:}} New announcement is added to main Blackboard page for all users. New announcement is emailed to student users.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Integration Testing}} \tn \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Do various parts of the system work together? \newline % Row Count 1 (+ 1) - Do \seqsplit{subsystems/classes/methods} work as expected with other \seqsplit{subsystems/classes/methods} in the system? \newline % Row Count 4 (+ 3) -Do parts of my system work with external dependencies? (database, web services) \newline % Row Count 6 (+ 2) -Usually white box% Row Count 7 (+ 1) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{TDD}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Specification and not validation (one view), Is a programming technique (another view), Is a way of managing fear during programming, Enables you to take small steps when writing software} \tn % Row Count 4 (+ 4) \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Writing the test beforehand makes developers think from a user's perspective when coding leading to a usable API} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{x{4.1175 cm} x{4.1175 cm} x{4.1175 cm} x{4.1175 cm} } \SetRowColor{DarkBackground} \mymulticolumn{4}{x{17.67cm}}{\bf\textcolor{white}{Static vs Dynamic Testing}} \tn % Row 0 \SetRowColor{LightBackground} Static & Dynamic & \seqsplit{Validation} & \seqsplit{Verification} \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} Objective = Finding errors in early stages of the \seqsplit{development} cycle & Objective = Checks the \seqsplit{functional} behaviour of the system & Check that the software product meets the \seqsplit{customer's} actual needs & Whether the system is \seqsplit{well-engineered}? Error free? \tn % Row Count 9 (+ 7) % Row 2 \SetRowColor{LightBackground} Are we building the product right? & Are we building the right product? & Dynamic & Static \tn % Row Count 13 (+ 4) % Row 3 \SetRowColor{white} \seqsplit{Activities} = Reviews, \seqsplit{Walkthroughs}, \seqsplit{Inspection} & Testing - The product meets the user's needs = the product fulfills its intended use & & \tn % Row Count 22 (+ 9) % Row 4 \SetRowColor{LightBackground} \mymulticolumn{4}{x{17.67cm}}{The product is built according to the reqs.} \tn % Row Count 23 (+ 1) \hhline{>{\arrayrulecolor{DarkBackground}}----} \SetRowColor{LightBackground} \mymulticolumn{4}{x{17.67cm}}{Checking whether the software is of high quality will not ensure that the system is useful. So {\bf{Trust but verify, verify but also validate}}.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}----} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{x{5.5264 cm} x{11.7436 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{17.67cm}}{\bf\textcolor{white}{Testing Practices}} \tn % Row 0 \SetRowColor{LightBackground} Exploratory Testing & Simultaneously learning about the software under test while designing and executing tests \tn % Row Count 4 (+ 4) % Row 1 \SetRowColor{white} & Uses feedback from the last test to inform the next \tn % Row Count 6 (+ 2) % Row 2 \SetRowColor{LightBackground} Brute Force Testing & Testing using every possible input parameters \tn % Row Count 8 (+ 2) % Row 3 \SetRowColor{white} Equivalence Classes & Divide possible inputs into equivalence classes based on how the system should react to them \tn % Row Count 12 (+ 4) % Row 4 \SetRowColor{LightBackground} & Input in same equivalence class = same system code trigger \tn % Row Count 15 (+ 3) % Row 5 \SetRowColor{white} & Only one test per equivalence class \tn % Row Count 17 (+ 2) % Row 6 \SetRowColor{LightBackground} & Testers require knowledge: how system works (internally and in detail), how to create input to trigger all code paths \tn % Row Count 22 (+ 5) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{17.67cm}}{{\bf{Exploratory}} = Is a core testing practice for Agile teams \newline {\bf{Brute}} = impossible as you cannot test the whole system \newline - There is always a limited time for testing and need to focus on testing inputs that will give us the most return on investment} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Race Conditions}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{A race occurs when two threads are using the same resources and the order of operations is important} \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Critical races can be prevented by locking data so they cannot be accessed by other threads} \tn % Row Count 4 (+ 2) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Ex. A keyword like {\emph{synchronized}}} \tn % Row Count 5 (+ 1) \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{{\bf{Testing Strategies}} \newline - Hard to test critical races \newline - Use mocking to control the order} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Why Object Orientation?}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{OO is primarily a software programming paradigm} \tn % Row Count 1 (+ 1) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{OO systems make use of abstraction in order to help make software less complex} \tn % Row Count 3 (+ 2) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{OO systems combine procedural and data abstractions = {\bf{organizing procedural abstractions in the context of data abstractions}}} \tn % Row Count 6 (+ 3) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{OO paradigm is an approach which all computations (abstractions) are performed in the context of objects.} \tn % Row Count 9 (+ 3) % Row 4 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{OO analysis = which objects are more important for the users (no programming consideration)} \tn % Row Count 11 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Procedural = The entire system in organized into a set of procedures. One main procedure calls the others. (Performs calculations with simple data) \newline \newline Data = Idea to group together the pieces of data that describe some entity, so that programmers can manipulate the data as a unit} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{x{4.6629 cm} x{12.6071 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{17.67cm}}{\bf\textcolor{white}{Instance Variables}} \tn % Row 0 \SetRowColor{LightBackground} Attribute & A simple piece of data used to represent the properties of an object \tn % Row Count 3 (+ 3) % Row 1 \SetRowColor{white} \seqsplit{Association} & Represents the relationship between instances of one class and instances of another \tn % Row Count 6 (+ 3) % Row 2 \SetRowColor{LightBackground} Static Variable & A variable whose value is shared by all instances of a class \tn % Row Count 9 (+ 3) % Row 3 \SetRowColor{white} Method in OO & Procedure, function or routine in other programming paradogms \tn % Row Count 12 (+ 3) % Row 4 \SetRowColor{LightBackground} Methods & Procedural abstractions used to implement the behaviour of a class \tn % Row Count 15 (+ 3) % Row 5 \SetRowColor{white} Operation & Used to discuss and specify a type of behaviour, independently of any code the implements that behaviour (higher level abstraction) \tn % Row Count 20 (+ 5) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Interface}} \tn \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Has neither instance variables nor concrete methods. \newline % Row Count 2 (+ 2) It is a named list of abstract operations \newline % Row Count 3 (+ 1) Every single method declared in an Interface will have to be implemented in the subclass% Row Count 5 (+ 2) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{UML Diagrams}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{{\bf{Interaction Diagrams:}} A set of diagrams to model the dynamic aspects of the system. To visualize how the system runs. Often built from a use case and class diagram to illustrate how a set of objects accomplish the required interactions with an actor.} \tn % Row Count 6 (+ 6) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{{\bf{Sequence Diagrams:}} An interaction diagram that focuses on the sequence of messages exchanged by a set of objects performing a certain task} \tn % Row Count 9 (+ 3) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{{\bf{Communication Diagrams:}} Emphasize how objects collaborate to realize an interaction} \tn % Row Count 11 (+ 2) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{{\bf{State Diagrams}} At any given point in time, the system is in precisely one state and will remain in the state until an event occurs to change state. Is a directed graph, nodes are states, edges are transitions. Have timeouts to automatically change states} \tn % Row Count 17 (+ 6) \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{{\bf{Interaction Diagrams Show (Interaction)}} = the steps of the use case, the steps of a piece of functionality. Composed of instances of classes, actors and messages. \newline {\bf{Sequence Diagrams:}} Can represent conditional logic and loops and show explicit destruction of objects. \newline {\bf{Communication Diagram:}} Annotations of object diagrams. Shows link between objects that communicate} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{UML Modelling}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{UML (Unified Modelling Language) = graphical language for modelling OO software. 1980s - 1990s = first OO development processes} \tn % Row Count 3 (+ 3) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Types of UML diagrams = Class, objects, interaction, use case, state, activity, component and deployment} \tn % Row Count 6 (+ 3) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Class and object = describe class + methods, relationship between classes} \tn % Row Count 8 (+ 2) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Interaction = How object interact, how system behaves} \tn % Row Count 10 (+ 2) % Row 4 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Use Case = what users can do, feature are related} \tn % Row Count 11 (+ 1) % Row 5 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{State + activity = how system behaves internally} \tn % Row Count 12 (+ 1) % Row 6 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Component + Deployment = how the various components of the system are arranged logically and physically} \tn % Row Count 15 (+ 3) \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Main symbols = Classes, Associations, Attributes, Operations, Generalizations (groups classes into inheritance hierarchies) \newline - Associations can be labelled to make explicit associations (are bi-directional by default, can add an arrow) = many to one, many to many, one to one/one to itself (one to one can sometimes be unnecessary, look carefully!)} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Design Principle 2: Increase Cohesion}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Subsystem or module has high cohesion when related things are kept together and everything else out} \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Measures the organization of the system, makes it easier to understand and change} \tn % Row Count 4 (+ 2) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Types = functional, layer, communicational, sequential, procedural, temporal, utility} \tn % Row Count 6 (+ 2) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Functional = code that computes a particular results is kept together (easy read, replaceable and reused)} \tn % Row Count 9 (+ 3) % Row 4 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Procedural = keeps procedures together (does not necessarily provide input to the next)} \tn % Row Count 11 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Functional = updating a database, creating a new file or interaction with a user is not functionally cohesive \newline Procedural = Each individual should have high cohesion in addition to organizing code in objects} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Facade}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Intent = to simplify the interface to a complicated subsystem} \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Motivation = I have several parts of a subsystem that is getting quite complicated and I would like to simplify the process for using the subsystem.} \tn % Row Count 5 (+ 3) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Pros = increases readability and testability, reduces coupling} \tn % Row Count 7 (+ 2) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Cons = if your subsystem changes, your facade will need to be updated as well} \tn % Row Count 9 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{x{6.3899 cm} x{10.8801 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{17.67cm}}{\bf\textcolor{white}{Requirements}} \tn % Row 0 \SetRowColor{LightBackground} Problem & General Goals (Scheduling a room for a course) \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} Requirement & All of the things that a system needs to do!; Things you system should (or should not) do; Features your system must provide; Things your users will expect \tn % Row Count 9 (+ 7) % Row 2 \SetRowColor{LightBackground} Functional Requirements & Inputs the system should accept; Outputs the system should produce; Data the system should store that other systems might use; Computations the system should perform (Not algorithms); Timing and sync. of the above (Not response time but the ordering of events) \tn % Row Count 20 (+ 11) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{17.67cm}}{Functional Requirements: Could relate to interactions with a person or with another system} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{x{4.4902 cm} x{12.7798 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{17.67cm}}{\bf\textcolor{white}{Functional vs. Non-functional}} \tn % Row 0 \SetRowColor{LightBackground} \seqsplit{Functional} & What is the system doing? For example: Should be able to make two slides \tn % Row Count 3 (+ 3) % Row 1 \SetRowColor{white} Non \seqsplit{Functional} & How is the system doing a thing? For Ex. A created slide should be displayed in 1 second \tn % Row Count 7 (+ 4) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{p{1.727 cm} p{1.727 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{17.67cm}}{\bf\textcolor{white}{Non - Functional}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{2}{x{17.67cm}}{Response Time, Throughput, Resource Usage, Reliability, Availability, Failure Recovery, Maintainability, Modularity, Security, Testability, Learnability, Usability, Price, Extensibility, Reusability} \tn % Row Count 4 (+ 4) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{17.67cm}}{Non functional requirements may be more critical than functional requirements, if these are not met, the system is useless! Usually cannot be implemented in a single module of a program.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Planning}} \tn \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{{\emph{Planning}} = Process of deciding: What activities will be performed, when activities should be started/completed. \newline % Row Count 3 (+ 3) {\emph{Project Planning}} = Scope of system as a whole, what order features will be done \newline % Row Count 5 (+ 2) {\emph{Iteration Planning:}} Which features will be included in the next deliverable? \newline % Row Count 7 (+ 2) {\bf{Parts of Planning}} \newline % Row Count 8 (+ 1) Which features are most valuable or risky? \newline % Row Count 9 (+ 1) Which features will make it into the project or iteration? \newline % Row Count 11 (+ 2) How much effort will each feature take? \newline % Row Count 12 (+ 1) Does a given feature depend on other features? \newline % Row Count 13 (+ 1) Based on all this: in which order will features be implemented? \newline % Row Count 15 (+ 2) Generally the high priority tasks should be picked first for an iteration% Row Count 17 (+ 2) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Base the amount of work in an iteration on the velocity of your team \newline 70\% tasks in the iteration should be must-haves leaving room for uncertainty (based on worst + average case estimates)} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Tracking}} \tn \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Process of determining: when and what tasks got completed. \newline % Row Count 2 (+ 2) Tracking + planning = extent to which a project in on schedule/cost can be monitored.% Row Count 4 (+ 2) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{x{7.9442 cm} x{9.3258 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{17.67cm}}{\bf\textcolor{white}{TDD Techniques}} \tn % Row 0 \SetRowColor{LightBackground} Triangulation (Playing Difficult): & Referring to how we're using multiple bearings to pinpoint the implementation towards the proper implementation \tn % Row Count 6 (+ 6) % Row 1 \SetRowColor{white} Using a test double & As alternative and suitable implementations of an interface or class that we don't want to use in a test \tn % Row Count 11 (+ 5) % Row 2 \SetRowColor{LightBackground} & This is because it's too slow, or not available or depends something not available or is just too difficult to instantiate \tn % Row Count 17 (+ 6) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Objects}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Object = a chunk of structured data in a running software system} \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Represents anything with which you can associate properties and behaviour} \tn % Row Count 4 (+ 2) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Properties characterize the object - describing it's current state} \tn % Row Count 6 (+ 2) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Behaviour = the way an object acts and reacts to the possible changing of its state} \tn % Row Count 8 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Classes}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Class = a software module that represents and defines a set of similar objects.} \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Object with same properties + behaviour = instances of one class} \tn % Row Count 4 (+ 2) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{Class contains all of the code that relates to its objects. This includes data for implementing properties and procedures (AKA methods) for implementing behaviour} \tn % Row Count 8 (+ 4) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{Instance Variables = Each class declares a list of variables corresponding to data that will be present in each instance} \tn % Row Count 11 (+ 3) \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{{\bf{Naming Classes}} \newline Noun or noun phrase \newline Singular \newline Capitalization Style: Pascal Case \newline No Space: PartTimeEmployee \newline Do not use underscore (\_) \newline Neither too general nor too specific (city should be municipality) \newline Avoid reflecting the internals of the system ("Record, Table, Data, Structure, or Information")} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Interface vs Abstract}} \tn \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{- In Java, a class only derive from one other class = no multiple inheritance in Java (inherit only one abstract class) \newline % Row Count 3 (+ 3) - But a class can implement multiple interfaces. \newline % Row Count 4 (+ 1) - Abstract classes = meant for inheritance to form a strong relationship between two classes. Can have some implementation code. \newline % Row Count 7 (+ 3) - Interface = no method definition/only method headings \newline % Row Count 9 (+ 2) {\bf{When to use?}} \newline % Row Count 10 (+ 1) {\emph{Abstract}} = Inheritance (Gives a base class), having non-public members, to add new methods later on \newline % Row Count 13 (+ 3) {\emph{Interface}} = The API will not change for a while, similar to multiple inheritance, has all public members% Row Count 16 (+ 3) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{Communication Diagram Details}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{1. The classes of the two objects have an association between them (same direction = unidirectional)} \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{2. The receiving object is stored in a local variable of the sending method. Object created in the sending method or some computation returns an object (\textless{}\textless{}local\textgreater{}\textgreater{} or {[}L{]})} \tn % Row Count 6 (+ 4) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{3. A reference to the receiving object has been received as a parameter of the sending method. (\textless{}\textless{}parameter\textgreater{}\textgreater{} or {[}P{]})} \tn % Row Count 9 (+ 3) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{4. The receiving object is global. When reference to an object is obtained using a static method. (\textless{}\textless{}global\textgreater{}\textgreater{} or {[}G{]})} \tn % Row Count 12 (+ 3) % Row 4 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{5. The objects communicate over a network. (\textless{}\textless{}network\textgreater{}\textgreater{})} \tn % Row Count 14 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{API}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{API = application programming interface} \tn % Row Count 1 (+ 1) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{An API is provided by a piece of software - abstracts away the implementation of the software} \tn % Row Count 3 (+ 2) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{An API is used by other pieces of software. Two pieces interact via API (API acts a contract between them)} \tn % Row Count 6 (+ 3) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{17.67cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{17.67cm}}{\bf\textcolor{white}{The Process of Design}} \tn \SetRowColor{white} \mymulticolumn{1}{x{17.67cm}}{{\bf{Design}} = problem solving process to find and describe a way: \newline % Row Count 2 (+ 2) - to implement the system's functional reqs. \newline % Row Count 3 (+ 1) - respect the constraints imposed by non-functional reqs. (budget, deadlines..) \newline % Row Count 5 (+ 2) - adhere to general principles of good quality \newline % Row Count 6 (+ 1) {\bf{Design Issues}} = sub problems of the overall design. Each issue has several alternative solutions. The designer makes a design decision to resolve each issue. This involves choosing what he or she consider to be the best option from among the alternatives. \newline % Row Count 12 (+ 6) {\bf{Good design}} = increasing profit with reduced cost, ensure conformation to the reqs., accelerating development, increasing usability, efficiency, reliability, maintainability and reusability% Row Count 16 (+ 4) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \SetRowColor{LightBackground} \mymulticolumn{1}{x{17.67cm}}{They use knowledge of the reqs., the design created so far, the tech. available, software design principles and 'best practices' and past experiences.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \end{document}