<?xml version="1.0"?>
<News hasArchived="true" page="7953" pageCount="10837" pageSize="10" timestamp="Thu, 24 Sep 2026 08:43:39 -0400" url="https://my3.my.umbc.edu/posts.xml?mode=activity&amp;page=7953&amp;range=2">
<NewsItem contentIssues="true" id="41058" important="false" status="posted" url="https://my3.my.umbc.edu/posts/41058">
<Title>SOLID: Part 3 - Liskov Substitution &amp; Interface Segregation Principles</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>The <a href="http://net.tutsplus.com/tutorials/php/solid-part-1-the-single-responsibility-principle/" rel="nofollow external" class="bo">Single Responsibility (SRP)</a>, <a href="http://net.tutsplus.com/tutorials/php/solid-part-2-the-openclosed-principle/" rel="nofollow external" class="bo">Open/Closed (OCP)</a>, <em>Liskov Substitution, Interface Segregation,</em> and Dependency Inversion. Five agile principles that should guide you every time you write code.</p>
    <p></p>
    <p>Because both the Liskov Substitution Principle (LSP) and the Interface Segregation Principle (ISP) are quite easy to define and exemplify, in this lesson we will talk about both of them.</p>
    <hr>
    <h2>Liskov Substitution Principle (LSP)</h2>
    <blockquote>
    <p>Child classes should never break the parent class' type definitions.</p>
    </blockquote>
    <p>The concept of this principle was introduced by Barbara Liskov in a 1987 conference keynote and later published in a paper together with Jannette Wing in 1994. Their original definition is as follows:</p>
    <blockquote>
    <p>Let q(x) be a property provable about objects x of type T. Then q(y) should be provable for objects y of type S where S is a subtype of T.</p>
    </blockquote>
    <p>Later on, with the publication of the SOLID principles by <a href="http://www.8thlight.com/our-team/robert-martin" rel="nofollow external" class="bo">Robert C. Martin</a> in his book <a href="http://www.amazon.com/Software-Development-Principles-Patterns-Practices/dp/0135974445/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1378755964&amp;sr=1-1&amp;keywords=robert+c+martin" rel="nofollow external" class="bo">Agile Software Development, Principles, Patterns, and Practices</a> and then republished in the C# version of the book <a href="http://www.amazon.com/Agile-Principles-Patterns-Practices-C/dp/0131857258" rel="nofollow external" class="bo">Agile Principles, Patterns, and Practices in C#</a>, the definition became known as the Liskov Substitution Principle. </p>
    <p>This leads us to the definition given by Robert C. Martin:</p>
    <blockquote><p>Subtypes must be substitutable for their base types.</p></blockquote>
    <p>As simple as that, a subclass should override the parent class' methods in a way that does not break functionality from a client's point of view. Here is a simple example to demonstrate the concept.</p>
    <pre>class Vehicle {&#x000A;    &#x000A;    	function startEngine() {&#x000A;    		// Default engine start functionality&#x000A;    	}&#x000A;    &#x000A;    	function accelerate() {&#x000A;    		// Default acceleration functionality&#x000A;    	}&#x000A;    }</pre>
    <p>Given a class <code>Vehicle</code> - it may be abstract - and two implementations:</p>
    <pre>class Car extends Vehicle {&#x000A;    &#x000A;    	function startEngine() {&#x000A;    		$this-&gt;engageIgnition();&#x000A;    		parent::startEngine();&#x000A;    	}&#x000A;    &#x000A;    	private function engageIgnition() {&#x000A;    		// Ignition procedure&#x000A;    	}&#x000A;    &#x000A;    }&#x000A;    &#x000A;    class ElectricBus extends Vehicle {&#x000A;    &#x000A;    	function accelerate() {&#x000A;    		$this-&gt;increaseVoltage();&#x000A;    		$this-&gt;connectIndividualEngines();&#x000A;    	}&#x000A;    &#x000A;    	private function increaseVoltage() {&#x000A;    		// Electric logic&#x000A;    	}&#x000A;    &#x000A;    	private function connectIndividualEngines() {&#x000A;    		// Connection logic&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>A client class should be able to use either of them, if it can use <code>Vehicle</code>.</p>
    <pre>class Driver {&#x000A;    	function go(Vehicle $v) {&#x000A;    		$v-&gt;startEngine();&#x000A;    		$v-&gt;accelerate();&#x000A;    	}&#x000A;    }</pre>
    <p>Which leads us to a simple implementation of the Template Method Design Pattern as we used it in the OCP tutorial.</p>
    
    <img src="http://cdn.tutsplus.com/net/uploads/2014/01/template_method1.png" alt="template_method" width="600" height="294" style="max-width: 100%; height: auto;"><br>
    
    <p>Based on our previous experience with the Open/Closed Principle, we can conclude that Liskov's Substitution Principle is in strong relation with OCP. In fact, "a violation of LSP is a latent violation of OCP" (Robert C. Martin), and the Template Method Design Pattern is a classic example of respecting and implementing LSP, which in turn is one of the solutions to respect OCP also.</p>
    <hr>
    <h2>The Classic Example of LSP Violation</h2>
    <p>To illustrate this completely, we will go with a classic example because it is highly significant and easily understandable.</p>
    <pre>class Rectangle {&#x000A;    &#x000A;    	private $topLeft;&#x000A;    	private $width;&#x000A;    	private $height;&#x000A;    &#x000A;    	public function setHeight($height) {&#x000A;    		$this-&gt;height = $height;&#x000A;    	}&#x000A;    &#x000A;    	public function getHeight() {&#x000A;    		return $this-&gt;height;&#x000A;    	}&#x000A;    &#x000A;    	public function setWidth($width) {&#x000A;    		$this-&gt;width = $width;&#x000A;    	}&#x000A;    &#x000A;    	public function getWidth() {&#x000A;    		return $this-&gt;width;&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>We start with a basic geometrical shape, a <code>Rectangle</code>. It is just a simple data object with setters and getters for <code>width</code> and <code>height</code>. Imagine that our application is working and it is already deployed to several clients. Now they need a new feature. They need to be able to manipulate squares.</p>
    <p>In real life, in geometry, a square is a particular form of rectangle. So we could try to implement a <code>Square</code> class that extends a <code>Rectangle</code> class. It is frequently said that a child class <em>is a</em> parent class, and this expression also conforms to LSP, at least at first sight.</p>
    
    <img src="http://cdn.tutsplus.com/net/uploads/2014/01/SquareRect.png" alt="SquareRect" width="178" height="259" style="max-width: 100%; height: auto;"><br>
    
    <p>But is a <code>Square</code> really a <code>Rectangle</code> in programming?</p>
    <pre>class Square extends Rectangle {&#x000A;    &#x000A;    	public function setHeight($value) {&#x000A;    		$this-&gt;width = $value;&#x000A;    		$this-&gt;height = $value;&#x000A;    	}&#x000A;    &#x000A;    	public function setWidth($value) {&#x000A;    		$this-&gt;width = $value;&#x000A;    		$this-&gt;height = $value;&#x000A;    	}&#x000A;    }</pre>
    <p>A square is a rectangle with equal width and height, and we could do a strange implementation like in the above example. We could overwrite both setters to set the height as well as the width. But how would that affect client code?</p>
    <pre>class Client {&#x000A;    &#x000A;    	function areaVerifier(Rectangle $r) {&#x000A;    		$r-&gt;setWidth(5);&#x000A;    		$r-&gt;setHeight(4);&#x000A;    &#x000A;    		if($r-&gt;area() != 20) {&#x000A;    			throw new Exception('Bad area!');&#x000A;    		}&#x000A;    &#x000A;    		return true;&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>It is conceivable to have a client class that verifies the rectangle's area and throws an exception if it is wrong.</p>
    <pre>function area() {&#x000A;    	return $this-&gt;width * $this-&gt;height;&#x000A;    }</pre>
    <p>Of course we added the above method to our <code>Rectangle</code> class to provide the area.</p>
    <pre>class LspTest extends PHPUnit_Framework_TestCase {&#x000A;    &#x000A;    	function testRectangleArea() {&#x000A;    		$r = new Rectangle();&#x000A;    		$c = new Client();&#x000A;    		$this-&gt;assertTrue($c-&gt;areaVerifier($r));&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>And we created a simple test by sending an empty rectangle object to area verifier and the test passes. If our <code>Square</code> class is correctly defined, sending it to the Client's <code>areaVerifier()</code> should not break its functionality. After all, a <code>Square</code> is a <code>Rectangle</code> in all mathematical sense. But is our class?</p>
    <pre>function testSquareArea() {&#x000A;    	$r = new Square();&#x000A;    	$c = new Client();&#x000A;    	$this-&gt;assertTrue($c-&gt;areaVerifier($r));&#x000A;    }</pre>
    <p>Testing it is very easy and it breaks big time. An exception is thrown to us when we run the test above.</p>
    <pre>PHPUnit 3.7.28 by Sebastian Bergmann.&#x000A;    &#x000A;    Exception : Bad area!&#x000A;    #0 /paht/: /.../.../LspTest.php(18): Client-&gt;areaVerifier(Object(Square))&#x000A;    #1 [internal function]: LspTest-&gt;testSquareArea()</pre>
    <p>So, our <code>Square</code> class is not a <code>Rectangle</code> after all. It breaks the laws of geometry. It fails and it violates the Liskov Substitution Principle.</p>
    <p>I especially love this example because it not only violates LSP, it also demonstrates that object oriented programming is not about mapping real life to objects. Each object in our program must be an abstraction over a concept. If we try to map one-to-one real objects to programmed objects, we will almost always fail.</p>
    <hr>
    <h2>The Interface Segregation Principle</h2>
    <p>The Single Responsibility Principle is about actors and high level architecture. The Open/Closed Principle is about class design and feature extensions. The Liskov Substitution Principle is about subtyping and inheritance. The Interface Segregation Principle (ISP) is about business logic to clients communication.</p>
    <p>In all modular applications there must be some kind of interface that the client can rely on. These may be actual Interface typed entities or other classic objects implementing design patterns like Facades. It doesn't matter which solution is used. It always has the same scope: to communicate to the client code on how to use the module. These interfaces can reside between different modules in the same application or project, or between one project as a third party library serving another project. Again, it doesn't matter. Communication is communication and clients are clients, regardless of the actual individuals writing the code.</p>
    <p>So, how should we define these interfaces? We could think about our module and expose all the functionalities we want it to offer.</p>
    
    <img src="http://cdn.tutsplus.com/net/uploads/2014/01/hugeInterface.png" alt="hugeInterface" width="277" height="580" style="max-width: 100%; height: auto;"><br>
    
    <p>This looks like a good start, a great way to define what we want to implement in our module. Or is it? A start like this will lead to one of two possible implementations:</p>
    <ul>
    <li>A huge <code>Car</code> or <code>Bus</code> class implementing all the methods on the <code>Vehicle</code> interface. Only the sheer dimensions of such classes should tell us to avoid them at all costs.</li>
    <li>Or, many small classes like <code>LightsControl</code>, <code>SpeedControl</code>, or <code>RadioCD</code> which are all implementing the whole interface but actually providing something useful only for the parts they implement.</li>
    </ul>
    <p>It is obvious that neither solution is acceptable to implement our business logic.</p>
    
    <img src="http://cdn.tutsplus.com/net/uploads/2014/01/specializedImplementationInterface.png" alt="specializedImplementationInterface" width="600" height="413" style="max-width: 100%; height: auto;"><br>
    
    <p>We could take another approach. Break the interface into pieces, specialized to each implementation. This would help to use small classes that care about their own interface. The objects implementing the interfaces will be used by the different type of vehicles, like car in the image above. The car will use the implementations but will depend on the interfaces. So a schema like the one below may be even more expressive.</p>
    
    <img src="http://cdn.tutsplus.com/net/uploads/2014/01/carUsingInterface.png" alt="carUsingInterface" width="600" height="423" style="max-width: 100%; height: auto;"><br>
    
    <p>But this fundamentally changes our perception of the architecture. The <code>Car</code> becomes the client instead of the implementation. We still want to provide to our clients ways to use our whole module, that being a type of vehicle.</p>
    
    <img src="http://cdn.tutsplus.com/net/uploads/2014/01/oneInterfaceManyClients.png" alt="oneInterfaceManyClients" width="600" height="339" style="max-width: 100%; height: auto;"><br>
    
    <p>Assume we solved the implementation problem and we have a stable business logic. The easiest thing to do is to provide a single interface with all the implementations and let the clients, in our case <code>BusStation</code>, <code>HighWay</code>, <code>Driver</code> and so on, to use whatever thew want from the interface's implementation. Basically, this shifts the behavior selection responsibility to the clients. You can find this kind of solution in many older applications.</p>
    <blockquote><p>The interface-segregation principle (ISP) states that no client should be forced to depend on methods it does not use.</p></blockquote>
    <p>However, this solution has its problems. Now all the clients depend on all the methods. Why should a <code>BusStation</code> depend on the state of lights of the bus, or on the radio channels selected by the driver? It should not. But what if it does? Does it matter? Well, if we think about the Single Responsibility Principle, it is a sister concept to this one. If <code>BusStation</code> depends on many individual implementations, not even used by it, it may require changes if any of the individual small implementations change. This is especially true for compiled languages, but we can still see the effect of the <code>LightControl</code> change impacting <code>BusStation</code>. These things should never happen.</p>
    <p>Interfaces belong to their clients and not to the implementations. Thus, we should always design them in a way to best suite our clients. Some times we can, some times we can not exactly know our clients. But when we can, we should break our interfaces in many smaller ones, so they better satisfy the exact needs of our clients.</p>
    
    <img src="http://cdn.tutsplus.com/net/uploads/2014/01/segregatedInterfaces.png" alt="segregatedInterfaces" width="600" height="406" style="max-width: 100%; height: auto;"><br>
    
    <p>Of course, this will lead to some degree of duplication. But remember! Interfaces are just plain function name definitions. There is no implementation of any kind of logic in them. So the duplications is small and manageable.</p>
    <p>Then, we have the great advantage of clients depending only and only on what they actually need and use. In some cases, clients may use and need several interfaces, that is OK, as long as they use all the methods from all the interfaces they depend on.</p>
    <p>Another nice trick is that in our business logic, a single class can implement several interfaces if needed. So we can provide a single implementation for all the common methods between the interfaces. The segregated interfaces will also force us to think of our code more from the client's point of view, which will in turn lead to loose coupling and easy testing. So, not only have we made our code better to our clients, we also made it easier for ourselves to understand, test and implement.</p>
    <hr>
    <h2>Final Thoughts</h2>
    <p>LSP taught us why reality can not be represented as a one-to-one relation with programmed objects and how subtypes should respect their parents. We also put it in light of the other principles that we already knew.</p>
    <p>ISP teaches us to respect our clients more than we thought necessary. Respecting their needs will make our code better and our lives as programmers easier.</p>
    <p>Thank you for your time.</p>
    </div>
]]>
</Body>
<Summary>The Single Responsibility (SRP), Open/Closed (OCP), Liskov Substitution, Interface Segregation, and Dependency Inversion. Five agile principles that should guide you every time you write code....</Summary>
<Website>http://code.tutsplus.com/tutorials/solid-part-3-liskov-substitution-interface-segregation-principles--net-36710</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/41058/guest@my.umbc.edu/1480b231ed7bda298cde25c7a442059a/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>wed</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Fri, 24 Jan 2014 14:37:33 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="40580" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40580">
<Title>SOLID: Part 3 &#8211; Liskov Substitution &amp; Interface Segregation Principles</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <a href="http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=36710&amp;c=1064257056" rel="nofollow external" class="bo"><img src="http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=36710&amp;c=1064257056" alt="" style="max-width: 100%; height: auto;"></a><p>The <a href="http://net.tutsplus.com/tutorials/php/solid-part-1-the-single-responsibility-principle/" rel="nofollow external" class="bo">Single Responsibility (SRP)</a>, <a href="http://net.tutsplus.com/tutorials/php/solid-part-2-the-openclosed-principle/" rel="nofollow external" class="bo">Open/Closed (OCP)</a>, <em>Liskov Substitution, Interface Segregation,</em> and Dependency Inversion. Five agile principles that should guide you every time you write code.</p>
    <p></p>
    <p>Because both the Liskov Substitution Principle (LSP) and the Interface Segregation Principle (ISP) are quite easy to define and exemplify, in this lesson we will talk about both of them.</p>
    <hr>
    <h2>Liskov Substitution Principle (LSP)</h2>
    <blockquote><p>Child classes should never break the parent class’ type definitions.</p></blockquote>
    <p>The concept of this principle was introduced by Barbara Liskov in a 1987 conference keynote and later published in a paper together with Jannette Wing in 1994. Their original definition is as follows:</p>
    <blockquote><p>Let q(x) be a property provable about objects x of type T. Then q(y) should be provable for objects y of type S where S is a subtype of T.</p></blockquote>
    <p>Later on, with the publication of the SOLID principles by <a href="http://www.8thlight.com/our-team/robert-martin" rel="nofollow external" class="bo">Robert C. Martin</a> in his book <a href="http://www.amazon.com/Software-Development-Principles-Patterns-Practices/dp/0135974445/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1378755964&amp;sr=1-1&amp;keywords=robert+c+martin" rel="nofollow external" class="bo">Agile Software Development, Principles, Patterns, and Practices</a> and then republished in the C# version of the book <a href="http://www.amazon.com/Agile-Principles-Patterns-Practices-C/dp/0131857258" rel="nofollow external" class="bo">Agile Principles, Patterns, and Practices in C#</a>, the definition became known as the Liskov Substitution Principle.</p>
    <p>This leads us to the definition given by Robert C. Martin:</p>
    <blockquote><p>Subtypes must be substitutable for their base types.</p></blockquote>
    <p>As simple as that, a subclass should override the parent class’ methods in a way that does not break functionality from a client’s point of view. Here is a simple example to demonstrate the concept.</p>
    <pre>class Vehicle {&#x000A;    &#x000A;    	function startEngine() {&#x000A;    		// Default engine start functionality&#x000A;    	}&#x000A;    &#x000A;    	function accelerate() {&#x000A;    		// Default acceleration functionality&#x000A;    	}&#x000A;    }</pre>
    <p>Given a class <code>Vehicle</code> – it may be abstract – and two implementations:</p>
    <pre>class Car extends Vehicle {&#x000A;    &#x000A;    	function startEngine() {&#x000A;    		$this-&gt;engageIgnition();&#x000A;    		parent::startEngine();&#x000A;    	}&#x000A;    &#x000A;    	private function engageIgnition() {&#x000A;    		// Ignition procedure&#x000A;    	}&#x000A;    &#x000A;    }&#x000A;    &#x000A;    class ElectricBus extends Vehicle {&#x000A;    &#x000A;    	function accelerate() {&#x000A;    		$this-&gt;increaseVoltage();&#x000A;    		$this-&gt;connectIndividualEngines();&#x000A;    	}&#x000A;    &#x000A;    	private function increaseVoltage() {&#x000A;    		// Electric logic&#x000A;    	}&#x000A;    &#x000A;    	private function connectIndividualEngines() {&#x000A;    		// Connection logic&#x000A;    	}&#x000A;    &#x000A;    } </pre>
    <p>A client class should be able to use either of them, if it can use <code>Vehicle</code>.</p>
    <pre>class Driver {&#x000A;    	function go(Vehicle $v) {&#x000A;    		$v-&gt;startEngine();&#x000A;    		$v-&gt;accelerate();&#x000A;    	}&#x000A;    } </pre>
    <p>Which leads us to a simple implementation of the Template Method Design Pattern as we used it in the OCP tutorial.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2014/01/template_method1.png" alt="template_method" width="600" height="294" style="max-width: 100%; height: auto;"><br> <p>Based on our previous experience with the Open/Closed Principle, we can conclude that Liskov’s Substitution Principle is in strong relation with OCP. In fact, “a violation of LSP is a latent violation of OCP” (Robert C. Martin), and the Template Method Design Pattern is a classic example of respecting and implementing LSP, which in turn is one of the solutions to respect OCP also.</p>
    <hr>
    <h2>The Classic Example of LSP Violation</h2>
    <p>To illustrate this completely, we will go with a classic example because it is highly significant and easily understandable.</p>
    <pre>class Rectangle {&#x000A;    &#x000A;    	private $topLeft;&#x000A;    	private $width;&#x000A;    	private $height;&#x000A;    &#x000A;    	public function setHeight($height) {&#x000A;    		$this-&gt;height = $height;&#x000A;    	}&#x000A;    &#x000A;    	public function getHeight() {&#x000A;    		return $this-&gt;height;&#x000A;    	}&#x000A;    &#x000A;    	public function setWidth($width) {&#x000A;    		$this-&gt;width = $width;&#x000A;    	}&#x000A;    &#x000A;    	public function getWidth() {&#x000A;    		return $this-&gt;width;&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>We start with a basic geometrical shape, a <code>Rectangle</code>. It is just a simple data object with setters and getters for <code>width</code> and <code>height</code>. Imagine that our application is working and it is already deployed to several clients. Now they need a new feature. They need to be able to manipulate squares.</p>
    <p>In real life, in geometry, a square is a particular form of rectangle. So we could try to implement a <code>Square</code> class that extends a <code>Rectangle</code> class. It is frequently said that a child class <em>is a</em> parent class, and this expression also conforms to LSP, at least at first sight.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2014/01/SquareRect.png" alt="SquareRect" width="178" height="259" style="max-width: 100%; height: auto;"><br> <p>But is a <code>Square</code> really a <code>Rectangle</code> in programming?</p>
    <pre>class Square extends Rectangle {&#x000A;    &#x000A;    	public function setHeight($value) {&#x000A;    		$this-&gt;width = $value;&#x000A;    		$this-&gt;height = $value;&#x000A;    	}&#x000A;    &#x000A;    	public function setWidth($value) {&#x000A;    		$this-&gt;width = $value;&#x000A;    		$this-&gt;height = $value;&#x000A;    	}&#x000A;    } </pre>
    <p>A square is a rectangle with equal width and height, and we could do a strange implementation like in the above example. We could overwrite both setters to set the height as well as the width. But how would that affect client code?</p>
    <pre>class Client {&#x000A;    &#x000A;    	function areaVerifier(Rectangle $r) {&#x000A;    		$r-&gt;setWidth(5);&#x000A;    		$r-&gt;setHeight(4);&#x000A;    &#x000A;    		if($r-&gt;area() != 20) {&#x000A;    			throw new Exception('Bad area!');&#x000A;    		}&#x000A;    &#x000A;    		return true;&#x000A;    	}&#x000A;    &#x000A;    } </pre>
    <p>It is conceivable to have a client class that verifies the rectangle’s area and throws an exception if it is wrong.</p>
    <pre>function area() {&#x000A;    	return $this-&gt;width * $this-&gt;height;&#x000A;    }</pre>
    <p>Of course we added the above method to our <code>Rectangle</code> class to provide the area.</p>
    <pre>class LspTest extends PHPUnit_Framework_TestCase {&#x000A;    &#x000A;    	function testRectangleArea() {&#x000A;    		$r = new Rectangle();&#x000A;    		$c = new Client();&#x000A;    		$this-&gt;assertTrue($c-&gt;areaVerifier($r));&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>And we created a simple test by sending an empty rectangle object to area verifier and the test passes. If our <code>Square</code> class is correctly defined, sending it to the Client’s <code>areaVerifier()</code> should not break its functionality. After all, a <code>Square</code> is a <code>Rectangle</code> in all mathematical sense. But is our class?</p>
    <pre>function testSquareArea() {&#x000A;    	$r = new Square();&#x000A;    	$c = new Client();&#x000A;    	$this-&gt;assertTrue($c-&gt;areaVerifier($r));&#x000A;    }</pre>
    <p>Testing it is very easy and it breaks big time. An exception is thrown to us when we run the test above.</p>
    <pre>PHPUnit 3.7.28 by Sebastian Bergmann.&#x000A;    &#x000A;    Exception : Bad area!&#x000A;    #0 /paht/: /.../.../LspTest.php(18): Client-&gt;areaVerifier(Object(Square))&#x000A;    #1 [internal function]: LspTest-&gt;testSquareArea()</pre>
    <p>So, our <code>Square</code> class is not a <code>Rectangle</code> after all. It breaks the laws of geometry. It fails and it violates the Liskov Substitution Principle.</p>
    <p>I especially love this example because it not only violates LSP, it also demonstrates that object oriented programming is not about mapping real life to objects. Each object in our program must be an abstraction over a concept. If we try to map one-to-one real objects to programmed objects, we will almost always fail.</p>
    <hr>
    <h2>The Interface Segregation Principle</h2>
    <p>The Single Responsibility Principle is about actors and high level architecture. The Open/Closed Principle is about class design and feature extensions. The Liskov Substitution Principle is about subtyping and inheritance. The Interface Segregation Principle (ISP) is about business logic to clients communication.</p>
    <p>In all modular applications there must be some kind of interface that the client can rely on. These may be actual Interface typed entities or other classic objects implementing design patterns like Facades. It doesn’t matter which solution is used. It always has the same scope: to communicate to the client code on how to use the module. These interfaces can reside between different modules in the same application or project, or between one project as a third party library serving another project. Again, it doesn’t matter. Communication is communication and clients are clients, regardless of the actual individuals writing the code.</p>
    <p>So, how should we define these interfaces? We could think about our module and expose all the functionalities we want it to offer.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2014/01/hugeInterface.png" alt="hugeInterface" width="277" height="580" style="max-width: 100%; height: auto;"><br> <p>This looks like a good start, a great way to define what we want to implement in our module. Or is it? A start like this will lead to one of two possible implementations:</p>
    <ul>
    <li>A huge <code>Car</code> or <code>Bus</code> class implementing all the methods on the <code>Vehicle</code> interface. Only the sheer dimensions of such classes should tell us to avoid them at all costs.</li>
    <li>Or, many small classes like <code>LightsControl</code>, <code>SpeedControl</code>, or <code>RadioCD</code> which are all implementing the whole interface but actually providing something useful only for the parts they implement.</li>
    </ul>
    <p>It is obvious that neither solution is acceptable to implement our business logic.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2014/01/specializedImplementationInterface.png" alt="specializedImplementationInterface" width="600" height="413" style="max-width: 100%; height: auto;"><br> <p>We could take another approach. Break the interface into pieces, specialized to each implementation. This would help to use small classes that care about their own interface. The objects implementing the interfaces will be used by the different type of vehicles, like car in the image above. The car will use the implementations but will depend on the interfaces. So a schema like the one below may be even more expressive.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2014/01/carUsingInterface.png" alt="carUsingInterface" width="600" height="423" style="max-width: 100%; height: auto;"><br> <p>But this fundamentally changes our perception of the architecture. The <code>Car</code> becomes the client instead of the implementation. We still want to provide to our clients ways to use our whole module, that being a type of vehicle.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2014/01/oneInterfaceManyClients.png" alt="oneInterfaceManyClients" width="600" height="339" style="max-width: 100%; height: auto;"><br> <p>Assume we solved the implementation problem and we have a stable business logic. The easiest thing to do is to provide a single interface with all the implementations and let the clients, in our case <code>BusStation</code>, <code>HighWay</code>, <code>Driver</code> and so on, to use whatever thew want from the interface’s implementation. Basically, this shifts the behavior selection responsibility to the clients. You can find this kind of solution in many older applications.</p>
    <blockquote><p>The interface-segregation principle (ISP) states that no client should be forced to depend on methods it does not use.</p></blockquote>
    <p>However, this solution has its problems. Now all the clients depend on all the methods. Why should a <code>BusStation</code> depend on the state of lights of the bus, or on the radio channels selected by the driver? It should not. But what if it does? Does it matter? Well, if we think about the Single Responsibility Principle, it is a sister concept to this one. If <code>BusStation</code> depends on many individual implementations, not even used by it, it may require changes if any of the individual small implementations change. This is especially true for compiled languages, but we can still see the effect of the <code>LightControl</code> change impacting <code>BusStation</code>. These things should never happen.</p>
    <p>Interfaces belong to their clients and not to the implementations. Thus, we should always design them in a way to best suite our clients. Some times we can, some times we can not exactly know our clients. But when we can, we should break our interfaces in many smaller ones, so they better satisfy the exact needs of our clients.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2014/01/segregatedInterfaces.png" alt="segregatedInterfaces" width="600" height="406" style="max-width: 100%; height: auto;"><br> <p>Of course, this will lead to some degree of duplication. But remember! Interfaces are just plain function name definitions. There is no implementation of any kind of logic in them. So the duplications is small and manageable.</p>
    <p>Then, we have the great advantage of clients depending only and only on what they actually need and use. In some cases, clients may use and need several interfaces, that is OK, as long as they use all the methods from all the interfaces they depend on.</p>
    <p>Another nice trick is that in our business logic, a single class can implement several interfaces if needed. So we can provide a single implementation for all the common methods between the interfaces. The segregated interfaces will also force us to think of our code more from the client’s point of view, which will in turn lead to loose coupling and easy testing. So, not only have we made our code better to our clients, we also made it easier for ourselves to understand, test and implement.</p>
    <hr>
    <h2>Final Thoughts</h2>
    <p>LSP taught us why reality can not be represented as a one-to-one relation with programmed objects and how subtypes should respect their parents. We also put it in light of the other principles that we already knew.</p>
    <p>ISP teaches us to respect our clients more than we thought necessary. Respecting their needs will make our code better and our lives as programmers easier.</p>
    <p>Thank you for your time.</p>
    </div>
]]>
</Body>
<Summary>The Single Responsibility (SRP), Open/Closed (OCP), Liskov Substitution, Interface Segregation, and Dependency Inversion. Five agile principles that should guide you every time you write code....</Summary>
<Website>http://feedproxy.google.com/~r/nettuts/~3/EG-a84vyjV8/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40580/guest@my.umbc.edu/208d129ae38e1f11e39180ca71e42cdf/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>interface-segregation-principles</Tag>
<Tag>javascript</Tag>
<Tag>liskov-substitution</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>solid-principles</Tag>
<Tag>sql</Tag>
<Tag>tutorials</Tag>
<Tag>wed</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Fri, 24 Jan 2014 14:37:33 -0500</PostedAt>
<EditAt>Fri, 24 Jan 2014 14:37:33 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="40578" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40578">
<Title>UMBC spring semester group fitness schedule is now available</Title>
<Tagline>UMBC spring semester group fitness schedule is now available</Tagline>
<Body>
<![CDATA[
    <div class="html-content">The UMBC Recreation Department is pleased to announce that the 2014 spring semester group fitness schedule is now available. We are very excited about some new classes and new class times that are being offered to UMBC students, faculty/staff and RAC members!<br><br>You can find the 2014 spring semester group fitness schedule under the Documents tab or on the bottom right side of the Fitness and Wellness group page!<br>
    </div>
]]>
</Body>
<Summary>The UMBC Recreation Department is pleased to announce that the 2014 spring semester group fitness schedule is now available. We are very excited about some new classes and new class times that are...</Summary>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40578/guest@my.umbc.edu/8471292298e03346f45263863b0e9afb/api/pixel</TrackingUrl>
<Group token="fitness-at-therac">Fitness and Wellness</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/fitness-at-therac</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/161/ddb53d2daaf1e43c35a2cf744997d6b0/xsmall.png?1661190221</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/161/ddb53d2daaf1e43c35a2cf744997d6b0/original.png?1661190221</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/161/ddb53d2daaf1e43c35a2cf744997d6b0/xxlarge.png?1661190221</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/161/ddb53d2daaf1e43c35a2cf744997d6b0/xlarge.png?1661190221</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/161/ddb53d2daaf1e43c35a2cf744997d6b0/large.png?1661190221</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/161/ddb53d2daaf1e43c35a2cf744997d6b0/medium.png?1661190221</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/161/ddb53d2daaf1e43c35a2cf744997d6b0/small.png?1661190221</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/161/ddb53d2daaf1e43c35a2cf744997d6b0/xsmall.png?1661190221</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/161/ddb53d2daaf1e43c35a2cf744997d6b0/xxsmall.png?1661190221</AvatarUrl>
<Sponsor>UMBC Group Fitness and Wellness</Sponsor>
<PawCount>32</PawCount>
<CommentCount>12</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Fri, 24 Jan 2014 14:05:30 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="40577" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40577">
<Title>Seven Must-Read Stories (Week Ending January 24, 2014)</Title>
<Body>
<![CDATA[
    <div class="html-content"><p>Another chance to catch the most interesting, and important, articles from the previous week on <em>MIT Technology Review</em>.</p></div>
]]>
</Body>
<Summary>Another chance to catch the most interesting, and important, articles from the previous week on MIT Technology Review.</Summary>
<Website>http://www.technologyreview.com/view/523631/seven-must-read-stories-week-ending-january-24-2014/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40577/guest@my.umbc.edu/0dbcfcf7a7abded094e7cb2c84ea1342/api/pixel</TrackingUrl>
<Tag>development</Tag>
<Tag>internet</Tag>
<Tag>mit</Tag>
<Tag>technology</Tag>
<Tag>web</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Fri, 24 Jan 2014 13:25:00 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="40576" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40576">
<Title>Bits Blog: The 30-Year-Old Macintosh and a Lost Conversation With Steve Jobs</Title>
<Body>
<![CDATA[
    <div class="html-content">To celebrate the 30 year anniversary or the Mac, Steven Levy, the author of a book on the computer, is releasing an unseen and raw interview with Steve Jobs, the founder of Apple.<br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2014%2F01%2F24%2Fthe-30-year-old-macintosh-and-a-lost-conversation-with-steve-jobs%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+The+30-Year-Old+Macintosh+and+a+Lost+Conversation+With+Steve+Jobs" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2014%2F01%2F24%2Fthe-30-year-old-macintosh-and-a-lost-conversation-with-steve-jobs%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+The+30-Year-Old+Macintosh+and+a+Lost+Conversation+With+Steve+Jobs" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2014%2F01%2F24%2Fthe-30-year-old-macintosh-and-a-lost-conversation-with-steve-jobs%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+The+30-Year-Old+Macintosh+and+a+Lost+Conversation+With+Steve+Jobs" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2014%2F01%2F24%2Fthe-30-year-old-macintosh-and-a-lost-conversation-with-steve-jobs%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+The+30-Year-Old+Macintosh+and+a+Lost+Conversation+With+Steve+Jobs" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2014%2F01%2F24%2Fthe-30-year-old-macintosh-and-a-lost-conversation-with-steve-jobs%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+The+30-Year-Old+Macintosh+and+a+Lost+Conversation+With+Steve+Jobs" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    <br><br><a href="http://da.feedsportal.com/r/186529594678/u/0/f/640387/c/34625/s/3650db5b/sc/21/rc/1/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186529594678/u/0/f/640387/c/34625/s/3650db5b/sc/21/rc/1/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/186529594678/u/0/f/640387/c/34625/s/3650db5b/sc/21/rc/2/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186529594678/u/0/f/640387/c/34625/s/3650db5b/sc/21/rc/2/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/186529594678/u/0/f/640387/c/34625/s/3650db5b/sc/21/rc/3/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186529594678/u/0/f/640387/c/34625/s/3650db5b/sc/21/rc/3/rc.img" style="max-width: 100%; height: auto;"></a><br><br><a href="http://da.feedsportal.com/r/186529594678/u/0/f/640387/c/34625/s/3650db5b/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186529594678/u/0/f/640387/c/34625/s/3650db5b/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>To celebrate the 30 year anniversary or the Mac, Steven Levy, the author of a book on the computer, is releasing an unseen and raw interview with Steve Jobs, the founder of Apple.      </Summary>
<Website>http://bits.blogs.nytimes.com/2014/01/24/the-30-year-old-macintosh-and-a-lost-conversation-with-steve-jobs/?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40576/guest@my.umbc.edu/02f5bb0116a5a95246c3a771dad84c5f/api/pixel</TrackingUrl>
<Tag>1984-book</Tag>
<Tag>apple-inc</Tag>
<Tag>apple-inc-aapl-nasdaq</Tag>
<Tag>books-and-literature</Tag>
<Tag>computers-and-the-internet</Tag>
<Tag>devices</Tag>
<Tag>edison-thomas-a</Tag>
<Tag>internet</Tag>
<Tag>jobs-steven-p</Tag>
<Tag>levy-steven</Tag>
<Tag>new</Tag>
<Tag>rolling-stone</Tag>
<Tag>steve-jobs-book</Tag>
<Tag>technology</Tag>
<Tag>time-magazine</Tag>
<Tag>york</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Fri, 24 Jan 2014 12:21:37 -0500</PostedAt>
<EditAt>Mon, 27 Jan 2014 14:02:52 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="109861" important="false" status="posted" url="https://my3.my.umbc.edu/posts/109861">
<Title>Dawn Biehler, Geography and Environmental Systems, on WHYY Philadelphia</Title>
<Body>
<![CDATA[
    <div class="html-content">Entomologists believe bed bugs have started making a comeback in places like Philadelphia in recent years. A report that aired on WHYY in Philadelphia January 17 examines the city’s battle with bedbugs and how it has evolved. Dawn Biehler, assistant professor of geography and environmental systems, was interviewed for the story and commented on the history of bedbugs in the United States and how they appeared consistently up until the 40s and 50s. “It was almost kind of an accepted condition of urban life that every once in a while, you were going to get bedbugs,” Biehler said. “Some people had …</div>
]]>
</Body>
<Summary>Entomologists believe bed bugs have started making a comeback in places like Philadelphia in recent years. A report that aired on WHYY in Philadelphia January 17 examines the city’s battle with...</Summary>
<Website>https://news.umbc.edu/dawn-biehler-geography-and-environmental-systems-on-whyy-philadelphia/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/109861/guest@my.umbc.edu/b56a0e7c2f41e63d625bd2effc7106ff/api/pixel</TrackingUrl>
<Tag>cahss</Tag>
<Tag>ges</Tag>
<Tag>policy-and-society</Tag>
<Tag>research</Tag>
<Group token="umbc-news">UMBC News</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xsmall.png?1632921809</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/original.png?1632921809</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xxlarge.png?1632921809</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xlarge.png?1632921809</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/large.png?1632921809</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/medium.png?1632921809</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/small.png?1632921809</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xsmall.png?1632921809</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/001/944/2c79aeea85b1abb37f8cf9fbcdc382b0/xxsmall.png?1632921809</AvatarUrl>
<Sponsor>UMBC News</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Fri, 24 Jan 2014 11:23:55 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="40575" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40575">
<Title>Q&amp;A: Sharing an Android Tablet</Title>
<Body>
<![CDATA[
    <div class="html-content">Separating apps and settings on an Android device, and adding photos to email on an iPhone.<br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.nytimes.com%2F2014%2F01%2F24%2Ftechnology%2Fpersonaltech%2Fsharing-an-android-tablet.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Q%26A%3A+Sharing+an+Android+Tablet" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fwww.nytimes.com%2F2014%2F01%2F24%2Ftechnology%2Fpersonaltech%2Fsharing-an-android-tablet.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Q%26A%3A+Sharing+an+Android+Tablet" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fwww.nytimes.com%2F2014%2F01%2F24%2Ftechnology%2Fpersonaltech%2Fsharing-an-android-tablet.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Q%26A%3A+Sharing+an+Android+Tablet" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fwww.nytimes.com%2F2014%2F01%2F24%2Ftechnology%2Fpersonaltech%2Fsharing-an-android-tablet.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Q%26A%3A+Sharing+an+Android+Tablet" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fwww.nytimes.com%2F2014%2F01%2F24%2Ftechnology%2Fpersonaltech%2Fsharing-an-android-tablet.html%3Fpartner%3Drss%26emc%3Drss&amp;t=Q%26A%3A+Sharing+an+Android+Tablet" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    <br><br><a href="http://da.feedsportal.com/r/186529631069/u/0/f/640387/c/34625/s/364f7fee/sc/5/rc/1/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186529631069/u/0/f/640387/c/34625/s/364f7fee/sc/5/rc/1/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/186529631069/u/0/f/640387/c/34625/s/364f7fee/sc/5/rc/2/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186529631069/u/0/f/640387/c/34625/s/364f7fee/sc/5/rc/2/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/186529631069/u/0/f/640387/c/34625/s/364f7fee/sc/5/rc/3/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186529631069/u/0/f/640387/c/34625/s/364f7fee/sc/5/rc/3/rc.img" style="max-width: 100%; height: auto;"></a><br><br><a href="http://da.feedsportal.com/r/186529631069/u/0/f/640387/c/34625/s/364f7fee/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186529631069/u/0/f/640387/c/34625/s/364f7fee/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>Separating apps and settings on an Android device, and adding photos to email on an iPhone.      </Summary>
<Website>http://www.nytimes.com/2014/01/24/technology/personaltech/sharing-an-android-tablet.html?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40575/guest@my.umbc.edu/e1e35e885a15ecafe905ed357315f99e/api/pixel</TrackingUrl>
<Tag>android-operating-system</Tag>
<Tag>google-inc-goog-nasdaq</Tag>
<Tag>iphone</Tag>
<Tag>new</Tag>
<Tag>tablet-computers</Tag>
<Tag>technology</Tag>
<Tag>york</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Fri, 24 Jan 2014 10:22:55 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="40574" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40574">
<Title>DB Networks featured in article</Title>
<Tagline>Penetration testing: Accurate or abused?</Tagline>
<Body>
<![CDATA[
    <div class="html-content">
    <h5>Penetration testing: Accurate or abused?</h5>
    <em>by Steve Hunt - COO at DB Networks - Thursday, 23 January 2014.</em><br><br>According to a recent Ponemon study, since 2010 cybercrime costs have 
    climbed 78% and the time required to recover from a breach has increased
     130%. On average, U.S. businesses fall victim to two successful attacks
     per week where their perimeter security defenses have been breached.<br>
    
    <br>
    Penetration testing (pen testing), also known as ‘ethical hacking,’ is 
    an important and key step in reducing the risks of a security breach 
    because it helps provide IT staff with an accurate view of the 
    information system from an attackers point of view.<br>
    
    <br>
    The pen test process results in an active analysis of the system for any
     potential vulnerabilities that could result from poor or improper 
    system configuration, from both known and unknown hardware or software 
    flaws, or operational weaknesses in process or technical 
    countermeasures. In other words, through pen testing, IT teams find the 
    holes and vulnerabilities and quickly work to fix these areas to prevent
     attacks.<br><br>Read more at <a href="http://www.net-security.org/article.php?id=1940">http://www.net-security.org/article.php?id=1940</a><br>
    </div>
]]>
</Body>
<Summary>Penetration testing: Accurate or abused? by Steve Hunt - COO at DB Networks - Thursday, 23 January 2014.  According to a recent Ponemon study, since 2010 cybercrime costs have  climbed 78% and the...</Summary>
<Website>http://www.net-security.org/article.php?id=1940</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40574/guest@my.umbc.edu/e057ec04f20554aaacc60060bc630360/api/pixel</TrackingUrl>
<Group token="bwtech">bwtech@UMBC Research and Technology Park</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/bwtech</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/xsmall.png?1760034935</AvatarUrl>
<AvatarUrl size="original">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/original.png?1760034935</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/xxlarge.png?1760034935</AvatarUrl>
<AvatarUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/xlarge.png?1760034935</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/large.png?1760034935</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/medium.png?1760034935</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/small.png?1760034935</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/xsmall.png?1760034935</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/xxsmall.png?1760034935</AvatarUrl>
<Sponsor>bwtech@UMBC</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Fri, 24 Jan 2014 09:08:29 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="40573" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40573">
<Title>DB Networks Helps Prevent High-Profile Customer Data</Title>
<Tagline>Breaches With Network Behavioral Analysis and . . .</Tagline>
<Body>
<![CDATA[
    <div class="html-content">
    <h6>DB Networks Helps Prevent High-Profile Customer Data Breaches With Network Behavioral Analysis and Continuous Monitoring of Databases</h6>
    <p><br></p>
    <div>
     <p>SAN DIEGO, CA--(Marketwired - Jan 23, 2014) -  DB Networks, an innovator of <a href="http://www.dbnetworks.com/technology/index.htm" rel="nofollow external" class="bo">behavioral analysis in database security</a>, today announced that it delivers the behavioral analysis and continuous monitoring of databases at the core of the network that can help organizations avoid high-profile breaches, such as those publicized at Target and Neiman Marcus, which result in the loss of customer data and the retailers' reputations.</p>
            <p>While details are still being gathered, the findings of the high-profile breach at Target revealed that hackers stole not only 40 million credit cards but also breached database records with personally identifiable information (PII) of at least 70 million customers, including names, mailing addresses, telephone numbers and email addresses. While not uncommon, the revelation of other similar breaches over the holidays has brought the protection of customer data to the forefront. Details common across breaches such as these include the loss of customers' PII over a period of time, sometimes as a result of a database exploit. The largest known breach at a U.S. retailer was in 2007 at TJX Cos Inc., where more than 90 million credit cards were stolen over approximately 18 months.</p>
    <br>
    </div>
    <div>
    <br>Read more:  <a href="http://www.digitaljournal.com/pr/1697272#ixzz2rKBUmAyu" rel="nofollow external" class="bo">http://www.digitaljournal.com/pr/1697272#ixzz2rKBUmAyu</a><br>
    </div>
    </div>
]]>
</Body>
<Summary>DB Networks Helps Prevent High-Profile Customer Data Breaches With Network Behavioral Analysis and Continuous Monitoring of Databases        SAN DIEGO, CA--(Marketwired - Jan 23, 2014) -  DB...</Summary>
<Website>http://www.digitaljournal.com/pr/1697272</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40573/guest@my.umbc.edu/be0de74899c5c288281ed133b4a6ba84/api/pixel</TrackingUrl>
<Group token="bwtech">bwtech@UMBC Research and Technology Park</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/bwtech</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/xsmall.png?1760034935</AvatarUrl>
<AvatarUrl size="original">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/original.png?1760034935</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/xxlarge.png?1760034935</AvatarUrl>
<AvatarUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/xlarge.png?1760034935</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/large.png?1760034935</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/medium.png?1760034935</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/small.png?1760034935</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/xsmall.png?1760034935</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/410/afff9420ec03574fa84c6bb85b54a3e3/xxsmall.png?1760034935</AvatarUrl>
<Sponsor>bwtech@UMBC</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Fri, 24 Jan 2014 09:03:49 -0500</PostedAt>
<EditAt>Fri, 24 Jan 2014 09:06:40 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="40572" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40572">
<Title>Why You Should Use Continuous Integration and Continuous Deployment</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>Having a bad development workflow will cost you a lot. It can make your senior engineers be productive like juniors, or even worse push them to leave the company. A great workflow can make push your good developers to be great and your best to be exceptional.</p>
    <p>Getting this workflow in order is one of the most critical steps any business and team can take.</p>
    <p>Two best practices that have gained a lot of traction over the last years are Continuous Integration and Continuous Deployment. </p>
    <p><strong>Continuous Integration</strong> is the practice of testing each change done to your codebase automatically and as early as possible. But this paves the way for the more important process: Continuous Deployment.</p>
    <p><strong>Continuous Deployment</strong> follows your tests to push your changes to either a staging or production system. This makes sure a version of your code is always accessible.</p>
    <p>First, let us have a look at Continuous Integration. I’ll show you how to get started with testing. Later we will talk about Continuous Deployment which is the next logical step and will increase efficiency of your development team tremendously.</p>
    <h3>Continuous Integration</h3>
    <p>Every step in your development workflow that can be automated should be. You need this automation to be able to focus all your time on building your product and providing value to your customers. Testing is one of those steps where automation is key.</p>
    <p>Automated testing allows you to implement new features quickly, as you can always prove that your most important features still work as you expect. This gives you the confidence to experiment.</p>
    <h4>How to start testing software</h4>
    <p>When starting testing your software it’s important to view the app from a user’s perspective. Let’s have a look: </p>
    <ul>
    <li>What are the typical workflows?</li>
    <li>What features do users go through often?</li>
    <li>What steps do users go through often?</li>
    </ul>
    <p>Get started with Selenium, PhantomJS or other frontend testing tools to make sure your application works as expected from the users perspective. Move from testing the user interface to testing lower level code, not the other way around.</p>
    <p>Often teams struggle with defining those first important test cases. We’ve come up with a guide on <a href="http://blog.codeship.io/2013/03/15/testing-top-to-bottom.html" rel="nofollow external" class="bo">how to start testing</a>, so take a look and see if this works for your team as well.</p>
    <p>Tools you can use to start testing your frontend:</p>
    <ul>
    <li><a href="http://pivotal.github.io/jasmine/" rel="nofollow external" class="bo">Jasmine (JavaScript)</a></li>
    <li><a href="http://www.seleniumhq.org/" rel="nofollow external" class="bo">Selenium (Frontend Testing)</a></li>
    <li><a href="http://casperjs.org/" rel="nofollow external" class="bo">CasperJS (Frontend Testing)</a></li>
    <li>
    <a href="http://cukes.info/" rel="nofollow external" class="bo">Cucumber</a> or <a href="https://github.com/gabrielfalcao/lettuce" rel="nofollow external" class="bo">Lettuce</a> (Behaviour Driven Testing for Ruby and Python)</li>
    </ul>
    <p>Now that we have a strong base of tests let’s go into lower levels and start with Unit-Testing. We want to make sure that the workflows are fine and that our UI works. With every change!</p>
    <p>You have the tools, you know how to do it. Now the most important thing is: Get started with testing! It pays off immediately, not just from a software development perspective. You can read about the <a href="http://blog.codeship.io/2013/04/11/a-business-case-for-continuous-integration.html" rel="nofollow external" class="bo">business advantages of Continuous Integration</a> in this blog post by Joe Green.</p>
    <h4>Continuously running your tests</h4>
    <p>It’s too easy for us as developers to say that a specific change won’t break something and later realise it did break the app. Often we are simply too lazy to really run all of our tests. This is where an automated system that runs or tests whenever we do any changes continuously can help us from falling into the trap.</p>
    <p>Oftentimes teams work on 2 week or even longer sprints. At the beginning of the sprint a developer pushes some changes that breaks a test. The team doesn’t have continuous integration, so nobody detects the error for a week. At the end of the sprint, before deploying to production, the lead developer runs all tests on a test machine to make sure everything is fine. And only at this point does the team detect the failed test. Now going back and determining which change broke the test is hard and takes a long time, totally unnecessarily. The failing test could have been detected only minutes after it was pushed, but as there was no automated system in place the team wasted precious time late in the sprint, instead of fixing it early on.</p>
    <p>The longer the sprint, the more costly this cycle becomes. This workflow doesn’t help the team, the single developer and especially not the company. Relying on automation to tell us early on when something goes wrong needs to be at the core of your development workflow.</p>
    <p>Continuous Integration is the first, but very important step in Continuous Deployment.</p>
    <p>Have a look at Martin Fowler’s in-depth article about Continuous Integration to <a href="http://martinfowler.com/articles/continuousIntegration.html" rel="nofollow external" class="bo">learn more about it</a>.</p>
    <h3>Continuous Deployment</h3>
    <p>Code rots. It should always run somewhere. There are a lot of changes that can break your app without you realizing it. Think about external dependencies being updated, API’s changed, server packages installed… The list goes on. Often we do not have the ability to control every part of our infrastructure. We rely on other products and companies to maintain parts of our stack.</p>
    <p>This is where Continuous Deployment shows all of it’s power. Whenever your main code branch passes the tests it should immediately be deployed to at least a staging environment. Even better if you can go to production immediately. With the master branch running at least on staging you can always have your QA or development team take a look or even use this last version. This shortens the cycle until you find an error or usability problem tremendously.<br>
    It moves finding those problems very early into the lifecycle, where it is cheap to fix them, instead of late where you often can’t fix them any more.</p>
    <h4>Configuring a deployment pipeline</h4>
    <p>Deployment pipelines describe how a change in your application moves through your infrastructure into production. It lays out all necessary automated and manual steps. Every step that can be automated should be, to make the deployments as productive as possible.</p>
    <p>Having this predefined workflow pipeline in place will make sure you follow all the necessary procedures when you have to ship a fix quickly. A small mistake could mean a downtime, so relying on automation is crucial for this.</p>
    <p>The ability to ship, get feedback from your customers and iterate on your product quickly is a major competitive advantage. Intercom wrote a blog about why <a href="http://insideintercom.io/shipping-is-your-companys-heartbeat/" rel="nofollow external" class="bo">shipping is your companies heartbeat.</a> Especially when building the first iterations of your product the importance of shipping quickly and regularly can’t be overstated.</p>
    <p>Today, as the costs for creating and publishing software shrunk dramatically, it is vitally important to get your product to your customers quickly. Your competition has the same cheap and productive tools available. Getting the most out of your workflow and push your productivity to the next level is how you can differentiate. Continuous deployment can help you make this happen.</p>
    <h4>Getting started</h4>
    <p>We’ve identified several steps that can help you get started with continuous deployment. These steps have come out of interviews with dozens of companies and constant feedback from the thousands of developers using our product.</p>
    <h5>Test everything, but in a smart way</h5>
    <p>Automation is the key to pushing your productivity. Testing a vital step to automate all your quality control. Whenever you want to change your product you need to be able to quickly and automatically assess that everything still works. Getting to this point assures you can iterate and innovate quickly without having to worry about breaking things. It allows to push much farther than you were ever able before.</p>
    <p>Tests are first and foremost a tool to keep your users happy. You don’t put effort into testing to make your development team happy or fulfill some vague workflow, but to be sure that you don’t break stuff your customers use. And additionally also to be able to implement the next features they want and pay you for. So start testing with the user in mind. Start testing the Frontend and interactions there first, before moving to lower level tests. Remember we test to make our users happy, not just to create better software.</p>
    <p><a href="http://blog.codeship.io/2013/04/16/tests-make-software.html" rel="nofollow external" class="bo">Tests make software</a> as Clemens laid out in his blog post.</p>
    <h5>Example</h5>
    <p>This script tests that when entering <strong>good day</strong> into google translate it is properly translated from german into english.</p>
    <p><br>
    With CasperJS you can start testing your front-end quickly and move to more complex scenarios later.</p>
    <h5>Automate Deployment</h5>
    <p>Every step in your deployment has to be automated. There can’t be any manual steps involved, as you will fail to do them once, which will kill your application. As you are aware you automatically start deploying less often. This creates a vicious cycle where the less you deploy the worse your deployment infrastructure becomes. Continuous Deployment works because of automation, so make sure you invest enough time here.</p>
    <h5>Automate Rollback</h5>
    <p>Automating rollbacks is critical when pushing regularly. Otherwise you will always fear to push more. Rollback includes your application code but also your database. Regular backups are an absolute must. Try to restore them regularly as well, otherwise you will never be sure if it really works until you desperately need them.</p>
    <h5>Deploy to Staging</h5>
    <p>Automatically push your master branch into a staging application. The staging application is your first line of defense, so you can easily review any changes going into production. This can even include automated tests, so you know your staging server works fine.</p>
    <h5>Use your staging environment</h5>
    <p>Using your own product is incredibly helpful to determine problems in your application. While using your production server is fine, using your own staging system is even better. It makes sure that you immediately detect errors that might take down your application, as you team always uses the latest available codebase.</p>
    <h5>Automatically deploy to production</h5>
    <p>Finally deploy continuously to your production environment. This workflow will dramatically change the way your whole organization thinks about releasing software. It is not just a little faster deployment, but needs to be planned and included in your daily work and planning. It’s been an important part in the innovation of some of the largest tech companies in the world and you should give it a trie too.</p>
    <h3>Conclusions</h3>
    <p>Finding new ways to become more productive is important for every software team. Getting slower, especially in comparison to your competition, could easily harm or even kill your company and product. You want to be able to push quickly and regularly to your customers, so they get the best product possible. Continuous Deployment can get you a long way there.</p>
    <p>If any questions come up or if there is anything else we can help let us know either here in the comments or send us a tweet to <a href="https://www.twitter.com/codeship" rel="nofollow external" class="bo">@codeship</a>. We’ve also recently released a <strong>free ebook</strong> that walks you through our development workflows and can help you dive deeper into Continuous Deployment. <a href="http://ebooks.codeship.io/efficiency-in-development-workflows-by-codeship" rel="nofollow external" class="bo">You can grab the book here.</a></p>
    <p>Ship long and prosper!</p>
    <h3>Relevant links and further information</h3>
    <ul>
    <li><a href="http://martinfowler.com/articles/continuousIntegration.html" rel="nofollow external" class="bo">Introduction to Continuous Integration by Martin Fowler</a></li>
    <li><a href="http://www.startuplessonslearned.com/2009/06/why-continuous-deployment.html" rel="nofollow external" class="bo">Why Continuous Deployment by Eric Ries</a></li>
    <li><a href="http://continuousdelivery.com/" rel="nofollow external" class="bo">Continuous Delivery by Jez Humble</a></li>
    <li><a href="http://blog.codeship.io/2013/04/11/a-business-case-for-continuous-integration.html" rel="nofollow external" class="bo">A Business Case for Continuous Integration</a></li>
    <li><a href="http://blog.codeship.io/2013/03/15/Testing-top-to-bottom.html" rel="nofollow external" class="bo">How To Start With Testing From Top To Bottom</a></li>
    <li><a href="http://blog.codeship.io/2013/03/07/Smoke-Testing-with-Casperjs.html" rel="nofollow external" class="bo">Start Testing Your Website With CasperJS</a></li>
    <li><a href="https://www.codeship.io" rel="nofollow external" class="bo">The Codeship: A hosted Continuous Integration and Continuous Deployment Platform</a></li>
    <li><a href="http://blog.codeship.io" rel="nofollow external" class="bo">The Codeship Blog about Continuous Deployment, Continuous Integration and Software Testing</a></li>
    <li><a href="http://ebooks.codeship.io/efficiency-in-development-workflows-by-codeship" rel="nofollow external" class="bo">Codeship’s Free Ebook: Efficiency in Development Workflows</a></li>
    </ul>
    <p>The post <a href="http://blog.teamtreehouse.com/use-continuous-integration-continuous-deployment" rel="nofollow external" class="bo">Why You Should Use Continuous Integration and Continuous Deployment</a> appeared first on <a href="http://blog.teamtreehouse.com" rel="nofollow external" class="bo">Treehouse Blog</a>.</p>
    </div>
]]>
</Body>
<Summary>Having a bad development workflow will cost you a lot. It can make your senior engineers be productive like juniors, or even worse push them to leave the company. A great workflow can make push...</Summary>
<Website>http://feedproxy.google.com/~r/teamtreehouse/~3/GmTqGI5uWs0/use-continuous-integration-continuous-deployment</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40572/guest@my.umbc.edu/1f7fde43c56f2f1c03c5d816e897dddc/api/pixel</TrackingUrl>
<Tag>android</Tag>
<Tag>code</Tag>
<Tag>css</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>ios</Tag>
<Tag>javascript</Tag>
<Tag>responsive</Tag>
<Tag>web</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Fri, 24 Jan 2014 09:00:49 -0500</PostedAt>
<EditAt>Fri, 24 Jan 2014 09:00:49 -0500</EditAt>
</NewsItem>

</News>
