~~SLIDESHOW~~
====== Principles of Software Engineering ======
Mithat Konar\\
July 24, 2012
===== Adapted from =====
[[http://www.pearsonhighered.com/pearsonhigheredus/educator/product/products_detail.page?isbn=0133056996|{{:century:fundamentals-swe-cover.jpg?150 |}}]]Ghezzi, Carlo, Mehdi Jazayeri, and Dino Mandrioli. "[[http://www.pearsonhighered.com/pearsonhigheredus/educator/product/products_detail.page?isbn=0133056996|Software Engineering Principles]]." In //Fundamentals of Software Engineering//. 2nd ed. Upper Saddle River, N.J.: Prentice Hall, 2003. 41-66.
===== Introduction =====
* Motivation
* Most real-world problems are:
* Complex, difficult to decompose
* Involve a number of developers and other shareholders
* Evolve over time
* Software engineering attempts to provide developers with strategies to manage this.
* //"How do you build big projects?"//
===== Introduction =====
* //Product//: "What it is," and "The code you write."
* //Process//: How you got there
* Both are important
===== Introduction =====
{{:century:priciples_hierarchy.png?450 |From Ghezzeri, et al. (footnote 1)}}
\\
↑\\
changes rapidly\\
changes slowly\\
↓
===== The principles =====
* Rigor and formality
* Separation of concerns
* Modularity
* Abstraction
* Anticipation of change
* Generality
* Incremantality
===== The principles =====
* **Rigor and formality**
* Separation of concerns
* Modularity
* Abstraction
* Anticipation of change
* Generality
* Incremantality
===== Rigor and formality =====
* **rigor**: the quality or state of being very exact, careful, or strict.[[http://www.learnersdictionary.com/search/rigor|2]]
* **formality**: the highest degree of rigor
* Often based on mathematical/logical laws
* Different projects/parts require more or less rigor/formality
* High criticality -> high rigor/formality
* Tools include natural language, formal languages
===== Rigor and formality =====
* Impacts software qualities of:
* reliability
* verifiability
* maintainability
* reusability
* portability
* understandability
* interoperability
* reusability
===== The principles =====
* Rigor and formality
* **Separation of concerns**
* Modularity
* Abstraction
* Anticipation of change
* Generality
* Incremantality
===== Separation of concerns =====
* Features and responsibilities should overlap as little as possible
* Minimizes interdependence
* Increases resusabilty
* Can be applied to product and process
* Example: //A lamp is not a toaster.//
* Changing a light bulb doesn't break toasting.
* If you need a lamp someplace, you don't have to get a toaster as well.
===== Separation of concerns =====
* Another example: the Web
* "Web 1.0": content, presentation, behavior comingled in same HTML codeClick me!
* "Web 2.0+":
* Content/semantics: XHTML
* Presentation: CSS
* Behavior: Javascript
* [[separation of concerns example|example code]]
===== The principles =====
* Rigor and formality
* Separation of concerns
* **Modularity**
* Abstraction
* Anticipation of change
* Generality
* Incremantality
===== Modularity =====
* Division of the system into smaller //modules//
* //Decomposition//: recursively subdividing the system
* "Divide and conquer"
* //top-down//
* //Composition//: building up from completed parts
* Legos
* //bottom up//
===== Modularity =====
* Benefits:
* Facilitates **separation of concerns**
* Supports **anticipation of change**
* Enhances quality of //understandability//
===== The principles =====
* Rigor and formality
* Separation of concerns
* Modularity
* **Abstraction**
* Anticipation of change
* Generality
* Incremantality
===== Abstraction =====
* In general use: considering something "apart from application to or association with a particular instance."[[http://www.merriam-webster.com/dictionary/abstracting?show=0&t=1343046707|3]]
* In S/W Engineering: wrapping a concept such that it:
* Expresses the concept only in terms of what is relevant
* Shields the user from everything that's not relevant
* (i.e., building models)
* Examples:
* //What is a ball?//
* Functions
===== Abstraction =====
* Humans are powerful abstractors.
* Abstraction is at the heart of computing.
* Applied to:
* Hardware
* Programming languages
* Program design
* Programming process
* ...
===== The principles =====
* Rigor and formality
* Separation of concerns
* Modularity
* Abstraction
* **Anticipation of change**
* Generality
* Incremantality
===== Anticipation of change =====
* Almost all development projects change
* while the project is being developed,
* after release.
* Process and code should be designed to support evolution.
===== The principles =====
* Rigor and formality
* Separation of concerns
* Modularity
* Abstraction
* Anticipation of change
* **Generality**
* Incremantality
===== Generality =====
* Often, a problem you work on is a more specific version of a more general problem.
* Work with solution based on more general problem
* If you need to invent an oxcart wheel:
* Invent a wheel and then use that to build the oxcart wheel.
* Don't re-invent the wheel in the first place.
* General problem might be easier to solve (or not).
* Supports quality of reuse
===== The principles =====
* Rigor and formality
* Separation of concerns
* Modularity
* Abstraction
* Anticipation of change
* Generality
* **Incremantality**
===== Incremantality =====
*//A journey of a thousand miles begins with a single step.// ---Lao-tzu mistranslation[[http://www.quotationspage.com/quote/24004.html|4]]
* Development proceeds in a stepwise fashion (i.e., in //increments//).
* "Iterative refinement"
* Deliver subsets of a system early to get early feedback
* Deliver prototype of the system and incrementally add effort to turn it into product
* Implement functionality, then tune performance
* Supports **anticipation of change**
* Example: [[http://adium.im|Adium]]'s [[https://bitbucket.org/adium/adium/changesets|commit history]]
===== Concluding remarks =====
* Different methodologies emphasize different combinations of principles.
* Conflicts among principles may arise.
* Software engineering is:
* a new field and subject to change.
* made by humans for humans.
* Your contemplations and contributions are crucial.
===== Endnotes =====
1Ghezzi, Carlo, Mehdi Jazayeri, and Dino Mandrioli. "[[http://www.pearsonhighered.com/pearsonhigheredus/educator/product/products_detail.page?isbn=0133056996|Software Engineering Principles]]." In //Fundamentals of Software Engineering//. 2nd ed. Upper Saddle River, N.J.: Prentice Hall, 2003. 42.
2"Merriam-Webster's Learner's Dictionary." Merriam-Webster's Learner's Dictionary. http://www.learnersdictionary.com/search/rigor (accessed July 23, 2012).
===== Endnotes =====
3"Abstracting - Definition and More from the Free Merriam-Webster Dictionary." Dictionary and Thesaurus - Merriam-Webster Online. http://www.merriam-webster.com/dictionary/abstracting?show=0&t=1343046707 (accessed July 23, 2012).\\
4"Quote Details: Lao-tzu: A journey of a... - The Quotations Page." Quotes and Famous Sayings - The Quotations Page. http://www.quotationspage.com/quote/24004.html (accessed July 23, 2012).
===== ~ =====
Copyright ©2012 Mithat Konar