<?xml version="1.0"?>
<News hasArchived="true" page="7974" pageCount="10843" pageSize="10" timestamp="Sat, 26 Sep 2026 18:07:44 -0400" url="https://my3.my.umbc.edu/posts.xml?mode=activity&amp;page=7974&amp;range=2">
<NewsItem contentIssues="true" id="41061" important="false" status="posted" url="https://my3.my.umbc.edu/posts/41061">
<Title>SOLID: Part 2 - The Open/Closed Principle</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><a href="http://net.tutsplus.com/tutorials/php/solid-part-1-the-single-responsibility-principle/" rel="nofollow external" class="bo">Single Responsibility (SRP)</a>, Open/Closed (OCP), Liskov's Substitution, Interface Segregation, and Dependency Inversion. Five agile principles that should guide you every time you need to write code.</p>
    <p></p>
    <hr>
    <h2>Definition</h2>
    <blockquote>
    <p>Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.</p>
    </blockquote>
    <p>The Open/Closed Principle, OCP in short, is credited to <a href="http://en.wikipedia.org/wiki/Bertrand_Meyer" rel="nofollow external" class="bo">Bertrand Mayer</a>, a French programmer, who first published it in his book n <a href="http://www.amazon.com/Object-Oriented-Software-Construction-CD-ROM-Edition/dp/0136291554" rel="nofollow external" class="bo">Object-Oriented Software Construction</a> in 1988.</p>
    <p>The principle rose in popularity in the early 2000s when it became one of the SOLID principles defined 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 later 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>.</p>
    <p>What we are basically talking about here is to design our modules, classes and functions in a way that when a new functionality is needed, we should not modify our existing code but rather write new code that will be used by existing code. This sounds a little bit strange, especially if we are working in languages like Java, C, C++ or C# where it applies not only to the source code itself but to the binary also. We want to create new features in ways that will not require us to redeploy existing binaries, executables or DLLs.</p>
    <hr>
    <h2>OCP in the SOLID Context</h2>
    <p>As we progress with these tutorials, we can put each new principle in the context of the already discussed ones. We already discussed 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> that stated that a module should have only one reason to change. If we think about OCP and SRP, we can observe that they are complementary. Code specifically designed with SRP in mind will be close to OCP principles or easy to make it respect those principles. When we have code that has a single reason to change, introducing a new feature will create a secondary reason for that change. So both SRP and OCP would be violated. In the same way, if we have code that should only change when its main function changes and should remain unchanged when a new feature is added to it, thus respecting OCP, will mostly respect SRP also.</p>
    <p>This does not mean that SRP always leads to OCP or vice versa, but in most cases if one of them is respected, achieving the second one is quite simple.</p>
    <hr>
    <h2>The Obvious Example of OCP Violation</h2>
    <p>From a purely technical point of view, the Open/Closed Principle is very simple. A simple relationship between two classes, like the one below violates the OCP.</p>
    
    <img src="http://cdn.tutsplus.com/net/uploads/2014/01/violate1.png" alt="violate1" width="600" height="109" style="max-width: 100%; height: auto;"><br>
    
    <p>The <code>User</code> class uses the <code>Logic</code> class directly. If we need to implement a second <code>Logic</code> class in a way that will allow us to use both the current one and the new one, the existing <code>Logic</code> class will need to be changed. <code>User</code> is directly tied to the implementation of <code>Logic</code>, there is no way for us to provide a new <code>Logic</code> without affecting the current one. And when we are talking about statically typed languages, it is very possible that the <code>User</code> class will also require changes. If we are talking about compiled languages, most certainly both the <code>User</code> executable and the <code>Logic</code> executable or dynamic library will require recompilation and redeployment to our clients, a process we want to avoid whenever possible.</p>
    <hr>
    <h2>Show Me the Code</h2>
    <p>Based only on the schema above, one can deduce that any class directly using another class would actually violate the Open/Closed Principle. And that is right, strictly speaking. I found it quite interesting to find the limits, the moment when you draw the line and decide that it is more difficult to respect OCP than modify existing code, or the architectural cost does not justify the cost of changing existing code.</p>
    <p>Let's say we want to write a class that can provide progress as a percent for a file that is downloaded through our application. We will have two main classes, a <code>Progress</code> and a <code>File</code>, and I imagine we will want to use them like in the test below.</p>
    <pre>function testItCanGetTheProgressOfAFileAsAPercent() {&#x000A;    	$file = new File();&#x000A;    	$file-&gt;length = 200;&#x000A;    	$file-&gt;sent = 100;&#x000A;    &#x000A;    	$progress = new Progress($file);&#x000A;    &#x000A;    	$this-&gt;assertEquals(50, $progress-&gt;getAsPercent());&#x000A;    }</pre>
    <p>In this test we are a user of <code>Progress</code>. We want to obtain a value as a percent, regardless of the actual file size. We use <code>File</code> as the source of information for our <code>Progress</code>. A file has a length in bytes and a field called <code>sent</code> representing the amount of data sent to the one doing the download. We do not care about how these values are updated in the application. We can assume there is some magical logic doing it for us, so in a test we can set them explicitly.</p>
    <pre>class File {&#x000A;    	public $length;&#x000A;    	public $sent;&#x000A;    }</pre>
    <p>The <code>File</code> class is just a simple data object containing the two fields. Of course in real life, it would probably contain other information and behavior also, like file name, path, relative path, current directory, type, permissions and so on.</p>
    <pre>class Progress {&#x000A;    &#x000A;    	private $file;&#x000A;    &#x000A;    	function __construct(File $file) {&#x000A;    		$this-&gt;file = $file;&#x000A;    	}&#x000A;    &#x000A;    	function getAsPercent() {&#x000A;    		return $this-&gt;file-&gt;sent * 100 / $this-&gt;file-&gt;length;&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p><code>Progress</code> is simply a class taking a <code>File</code> in its constructor. For clarity, we specified the type of the variable in the constructor's parameters. There is a single useful method on <code>Progress</code>, <code>getAsPercent()</code>, which will take the values sent and length from <code>File</code> and transform them into a percent. Simple, and it works.</p>
    <pre>Testing started at 5:39 PM ...&#x000A;    PHPUnit 3.7.28 by Sebastian Bergmann.&#x000A;    .&#x000A;    Time: 15 ms, Memory: 2.50Mb&#x000A;    OK (1 test, 1 assertion)</pre>
    <p>This code seems to be right, however it violates the Open/Closed Principle. But why? And How?</p>
    <hr>
    <h2>Changing Requirements</h2>
    <p>Every application that is expected to evolve in time will need new features. One new feature for our application could be to allow streaming of music, instead of just downloading files. <code>File</code>'s length is represented in bytes, the music's duration in seconds. We want to offer a nice progress bar to our listeners, but can we reuse the one we already have?</p>
    <p>No, we can not. Our progress is bound to <code>File</code>. It understands only files, even though it could be applied to music content also. But in order to do that we have to modify it, we have to make <code>Progress</code> know about <code>Music</code> and <code>File</code>. If our design would respect OCP, we would not need to touch <code>File</code> or <code>Progress</code>. We could just simply reuse the existing <code>Progress</code> and apply it to <code>Music</code>.</p>
    <hr>
    <h2>Solution 1: Take Advantage of the Dynamic Nature of PHP</h2>
    <p>Dynamically typed languages have the advantages of guessing the types of objects at runtime. This allows us to remove the typehint from <code>Progress</code>' constructor and the code will still work.</p>
    <pre>class Progress {&#x000A;    &#x000A;    	private $file;&#x000A;    &#x000A;    	function __construct($file) {&#x000A;    		$this-&gt;file = $file;&#x000A;    	}&#x000A;    &#x000A;    	function getAsPercent() {&#x000A;    		return $this-&gt;file-&gt;sent * 100 / $this-&gt;file-&gt;length;&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>Now we can throw anything at <code>Progress</code>. And by anything, I mean literally anything:</p>
    <pre>class Music {&#x000A;    &#x000A;    	public $length;&#x000A;    	public $sent;&#x000A;    &#x000A;    	public $artist;&#x000A;    	public $album;&#x000A;    	public $releaseDate;&#x000A;    &#x000A;    	function getAlbumCoverFile() {&#x000A;    		return 'Images/Covers/' . $this-&gt;artist . '/' . $this-&gt;album . '.png';&#x000A;    	}&#x000A;    }</pre>
    <p>And a <code>Music</code> class like the one above will work just fine. We can test it easily with a very similar test to <code>File</code>.</p>
    <pre>function testItCanGetTheProgressOfAMusicStreamAsAPercent() {&#x000A;    	$music = new Music();&#x000A;    	$music-&gt;length = 200;&#x000A;    	$music-&gt;sent = 100;&#x000A;    &#x000A;    	$progress = new Progress($music);&#x000A;    &#x000A;    	$this-&gt;assertEquals(50, $progress-&gt;getAsPercent());&#x000A;    }</pre>
    <p>So basically, any measurable content can be used with the <code>Progress</code> class. Maybe we should express this in code by changing the variable's name also:</p>
    <pre>class Progress {&#x000A;    &#x000A;    	private $measurableContent;&#x000A;    &#x000A;    	function __construct($measurableContent) {&#x000A;    		$this-&gt;measurableContent = $measurableContent;&#x000A;    	}&#x000A;    &#x000A;    	function getAsPercent() {&#x000A;    		return $this-&gt;measurableContent-&gt;sent * 100 / $this-&gt;measurableContent-&gt;length;&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>Good, but we have a huge problem with this approach. When we had <code>File</code> specified as a typehint, we were positive about what our class can handle. It was explicit and if something else came in, a nice error told us so.</p>
    <pre>Argument 1 passed to Progress::__construct()&#x000A;    must be an instance of File,&#x000A;    instance of Music given.</pre>
    <p>But without the typehint, we must rely on the fact that whatever comes in will have two public variables of some exact names like "<code>length</code>" and "<code>sent</code>". Otherwise we will have a refused bequest.</p>
    <blockquote><p>Refused bequest: a class that overrides a method of a base class in such a way that the contract of the base class is not honored by the derived class. ~Source Wikipedia.</p></blockquote>
    <p>This is one of the <em>code smells</em> presented in much more detail in the <a href="https://tutsplus.com/course/detecting-code-smells/" rel="nofollow external" class="bo">Detecting Code Smells</a> premium course. In short, we do not want to end up trying to call methods or access fields on objects that do not conform to our contract. When we had a typehint, the contract was specified by it. The fields and methods of the <code>File</code> class. Now that we have nothing, we can send in anything, even a string and it would result in an ugly error.</p>
    <pre>function testItFailsWithAParameterThatDoesNotRespectTheImplicitContract() {&#x000A;    	$progress = new Progress('some string');&#x000A;    	$this-&gt;assertEquals(50, $progress-&gt;getAsPercent());&#x000A;    }</pre>
    <p>A test like this, where we send in a simple string, will produce a refused bequest:</p>
    <pre>Trying to get property of non-object.</pre>
    <p>While the end result is the same in both cases, meaning the code breaks, the first one produced a nice message. This one, however, is very obscure. There is no way of knowing what the variable is - a string in our case - and what properties were looked for and not found. It is difficult to debug and to solve the problem. A programmer needs to open the <code>Progress</code> class and read it and understand it. The contract, in this case, when we do not explicitly specify the typehint, is defined by the behavior of <code>Progress</code>. It is an implicit contract, known only to <code>Progress</code>. In our example, it is defined by the access to the two fields, <code>sent</code> and <code>length</code>, in the <code>getAsPercent()</code> method. In real life the implicit contract can be very complex and hard to discover by just looking for a few seconds at the class.</p>
    <p>This solution is recommended only if none of the other suggestions below can easily be implemented or if they would inflict serious architectural changes that do not justify the effort.</p>
    <hr>
    <h2>Solution 2: Use the Strategy Design Pattern</h2>
    <p>This is the most common and probably the most appropriate solution to respect OCP. It is simple and effective.</p>
    
    <img src="http://cdn.tutsplus.com/net/uploads/2014/01/strategy.png" alt="strategy" width="600" height="294" style="max-width: 100%; height: auto;"><br>
    
    <p>The Strategy Pattern simply introduces the use of an interface. An interface is a special type of entity in Object Oriented Programming (OOP) which defines a contract between a client and a server class. Both classes will adhere to the contract to ensure the expected behavior. There may be several, unrelated, server classes that respect the same contract thus being capable of serving the same client class.</p>
    <pre>interface Measurable {&#x000A;    	function getLength();&#x000A;    	function getSent();&#x000A;    }</pre>
    <p>In an interface we can define only behavior. That is why instead of directly using public variables we will have to think about using getters and setters. Adapting the other classes will not be difficult at this point. Our IDE can do most of the job.</p>
    <pre>function testItCanGetTheProgressOfAFileAsAPercent() {&#x000A;    	$file = new File();&#x000A;    	$file-&gt;setLength(200);&#x000A;    	$file-&gt;setSent(100);&#x000A;    &#x000A;    	$progress = new Progress($file);&#x000A;    &#x000A;    	$this-&gt;assertEquals(50, $progress-&gt;getAsPercent());&#x000A;    }</pre>
    <p>As usual, we start with our tests. We will need to use setters to set the values. If considered mandatory, these setters may also be defined in the <code>Measurable</code> interface. However, be careful what you put there. The interface is to define the contract between the client class <code>Progress</code> and the different server classes like <code>File</code> and <code>Music</code>. Does <code>Progress</code> need to set the values? Probably not. So the setters are highly unlikely to be needed to be defined in the interface. Also, if you would define the setters there, you would force all of the server classes to implement setters. For some of them, it may be logical to have setters, but others may behave totally differently. What if we want to use our <code>Progress</code> class to show the temperature of our oven? The <code>OvenTemperature</code> class may be initialized with the values in the constructor, or obtain the information from a third class. Who knows? To have setters on that class would be odd.</p>
    <pre>class File implements Measurable {&#x000A;    &#x000A;    	private $length;&#x000A;    	private $sent;&#x000A;    &#x000A;    	public $filename;&#x000A;    	public $owner;&#x000A;    &#x000A;    	function setLength($length) {&#x000A;    		$this-&gt;length = $length;&#x000A;    	}&#x000A;    &#x000A;    	function getLength() {&#x000A;    		return $this-&gt;length;&#x000A;    	}&#x000A;    &#x000A;    	function setSent($sent) {&#x000A;    		$this-&gt;sent = $sent;&#x000A;    	}&#x000A;    &#x000A;    	function getSent() {&#x000A;    		return $this-&gt;sent;&#x000A;    	}&#x000A;    &#x000A;    	function getRelativePath() {&#x000A;    		return dirname($this-&gt;filename);&#x000A;    	}&#x000A;    &#x000A;    	function getFullPath() {&#x000A;    		return realpath($this-&gt;getRelativePath());&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>The <code>File</code> class is modified slightly to accommodate the requirements above. It now implements the <code>Measurable</code> interface and has setters and getters for the fields we are interested in. <code>Music</code> is very similar, you can check its content in the attached source code. We are almost done.</p>
    <pre>class Progress {&#x000A;    &#x000A;    	private $measurableContent;&#x000A;    &#x000A;    	function __construct(Measurable $measurableContent) {&#x000A;    		$this-&gt;measurableContent = $measurableContent;&#x000A;    	}&#x000A;    &#x000A;    	function getAsPercent() {&#x000A;    		return $this-&gt;measurableContent-&gt;getSent() * 100 / $this-&gt;measurableContent-&gt;getLength();&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p><code>Progress</code> also needed a small update. We can now specify a type, using typehinting, in the constructor. The expected type is <code>Measurable</code>. Now we have an explicit contract. <code>Progress</code> can be sure the accessed methods will be always present because they are defined in the <code>Measurable</code> interface. <code>File</code> and <code>Music</code> can also be sure they can provide all that is needed for <code>Progress</code> by simply implementing all the methods on the interface, a requirement when a class implements an interface.</p>
    <p>This design pattern is explained in greater detail in the <a href="https://tutsplus.com/course/agile-design-patterns/" rel="nofollow external" class="bo">Agile Design Patterns</a> course.</p>
    <h3>A Note on Interface Naming</h3>
    <p>People tend to name interfaces with a capital <code>I</code> in front of them, or with the word "<code>Interface</code>" attached at the end, like <code>IFile</code> or <code>FileInterface</code>. This is an old-style notation imposed by some outdated standards. We are so much past the Hungarian notations or the need to specify the type of a variable or object in its name in order to easier identify it. IDEs identify anything in a split second for us. This allows us to concentrate on what we actually want to abstract.</p>
    <p>Interfaces belong to their clients. Yes. When you want to name an interface you must think of the client and forget about the implementation. When we named our interface Measurable we did so thinking about Progress. If I would be a progress, what would I need to be able to provide the percent? The answer is simple, something we can measure. Thus the name Measurable. </p>
    <p>Another reason is that the implementation can be from various domains. In our case, there are files and music. But we may very well reuse our <code>Progress</code> in a racing simulator. In that case, the measured classes would be Speed, Fuel, etc. Nice, isn't it?</p>
    <hr>
    <h2>Solution 3: Use the Template Method Design Pattern</h2>
    <p>The Template Method design pattern is very similar to the strategy, but instead of an interface it uses an abstract class. It is recommended to use a Template Method pattern when we have a client very specific to our application, with reduced reusability and when the server classes have common behavior.</p>
    
    <img src="http://cdn.tutsplus.com/net/uploads/2014/01/template_method.png" alt="template_method" width="600" height="294" style="max-width: 100%; height: auto;"><br>
    
    <p>This design pattern is explained in greater detail in the <a href="https://tutsplus.com/course/agile-design-patterns/" rel="nofollow external" class="bo">Agile Design Patterns</a> course.</p>
    <hr>
    <h2>A Higher Level View</h2>
    <p>So, how is all of this affecting our high level architecture?</p>
    
    <img src="http://cdn.tutsplus.com/net/uploads/2014/01/HighLevelDesign.png" alt="HighLevelDesign" width="600" height="388" style="max-width: 100%; height: auto;"><br>
    
    <p>If the image above represents the current architecture of our application, adding a new module with five new classes (the blue ones) should affect our design in a moderate way (red class).</p>
    
    <img src="http://cdn.tutsplus.com/net/uploads/2014/01/HighLevelDesignWithNewClasses.png" alt="HighLevelDesignWithNewClasses" width="600" height="410" style="max-width: 100%; height: auto;"><br>
    
    <p>In most systems you can't expect absolutely no effect on the existing code when new classes are introduced. However, respecting the Open/Closed Principle will considerably reduce the classes and modules that require constant change. </p>
    <p>As with any other principle, try not to think about everything from before. If you do so, you will end up with an interface for each of your classes. Such a design will be hard to maintain and understand. Usually the safest way to go is to think about the possibilities and if you can determine whether there will be other types of server classes. Many times you can easily imagine a new feature or you can find one on the project's backlog that will produce another server class. In those cases, add the interface from the beginning. If you can not determine, or if you are unsure - most of the time - simply omit it. Let the next programmer, or maybe even yourself, to add the interface when you need a second implementation.</p>
    <hr>
    <h2>Final Thoughts</h2>
    <p>If you follow your discipline and add interfaces as soon as a second server is needed, modifications will be few and easy. Remember, if code required changes once, there is a high possibility it will require change again. When that possibility turns into reality, OCP will save you a lot of time and effort.</p>
    <p>Thank you for reading.</p>
    </div>
]]>
</Body>
<Summary>Single Responsibility (SRP), Open/Closed (OCP), Liskov's Substitution, Interface Segregation, and Dependency Inversion. Five agile principles that should guide you every time you need to write...</Summary>
<Website>http://code.tutsplus.com/tutorials/solid-part-2-the-openclosed-principle--net-36600</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/41061/guest@my.umbc.edu/f9300d4c40535be5b4b15d4a8e211ca1/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>Mon, 20 Jan 2014 15:09:07 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="40415" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40415">
<Title>SOLID: Part 2 &#8211; The Open/Closed Principle</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <a href="http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=36600&amp;c=1857671581" rel="nofollow external" class="bo"><img src="http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=36600&amp;c=1857671581" alt="" style="max-width: 100%; height: auto;"></a><p><a href="http://net.tutsplus.com/tutorials/php/solid-part-1-the-single-responsibility-principle/" rel="nofollow external" class="bo">Single Responsibility (SRP)</a>, Open/Closed (OCP), Liskov’s Substitution, Interface Segregation, and Dependency Inversion. Five agile principles that should guide you every time you need to write code.</p>
    <p></p>
    <hr>
    <h2>Definition</h2>
    <blockquote><p>Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.</p></blockquote>
    <p>The Open/Closed Principle, OCP in short, is credited to <a href="http://en.wikipedia.org/wiki/Bertrand_Meyer" rel="nofollow external" class="bo">Bertrand Mayer</a>, a French programmer, who first published it in his book n <a href="http://www.amazon.com/Object-Oriented-Software-Construction-CD-ROM-Edition/dp/0136291554" rel="nofollow external" class="bo">Object-Oriented Software Construction</a> in 1988.</p>
    <p>The principle rose in popularity in the early 2000s when it became one of the SOLID principles defined 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 later 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>.</p>
    <p>What we are basically talking about here is to design our modules, classes and functions in a way that when a new functionality is needed, we should not modify our existing code but rather write new code that will be used by existing code. This sounds a little bit strange, especially if we are working in languages like Java, C, C++ or C# where it applies not only to the source code itself but to the binary also. We want to create new features in ways that will not require us to redeploy existing binaries, executables or DLLs.</p>
    <hr>
    <h2>OCP in the SOLID Context</h2>
    <p>As we progress with these tutorials, we can put each new principle in the context of the already discussed ones. We already discussed 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> that stated that a module should have only one reason to change. If we think about OCP and SRP, we can observe that they are complementary. Code specifically designed with SRP in mind will be close to OCP principles or easy to make it respect those principles. When we have code that has a single reason to change, introducing a new feature will create a secondary reason for that change. So both SRP and OCP would be violated. In the same way, if we have code that should only change when its main function changes and should remain unchanged when a new feature is added to it, thus respecting OCP, will mostly respect SRP also.</p>
    <p>This does not mean that SRP always leads to OCP or vice versa, but in most cases if one of them is respected, achieving the second one is quite simple.</p>
    <hr>
    <h2>The Obvious Example of OCP Violation</h2>
    <p>From a purely technical point of view, the Open/Closed Principle is very simple. A simple relationship between two classes, like the one below violates the OCP.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2014/01/violate1.png" alt="violate1" width="600" height="109" style="max-width: 100%; height: auto;"><br> <p>The <code>User</code> class uses the <code>Logic</code> class directly. If we need to implement a second <code>Logic</code> class in a way that will allow us to use both the current one and the new one, the existing <code>Logic</code> class will need to be changed. <code>User</code> is directly tied to the implementation of <code>Logic</code>, there is no way for us to provide a new <code>Logic</code> without affecting the current one. And when we are talking about statically typed languages, it is very possible that the <code>User</code> class will also require changes. If we are talking about compiled languages, most certainly both the <code>User</code> executable and the <code>Logic</code> executable or dynamic library will require recompilation and redeployment to our clients, a process we want to avoid whenever possible.</p>
    <hr>
    <h2>Show Me the Code</h2>
    <p>Based only on the schema above, one can deduce that any class directly using another class would actually violate the Open/Closed Principle. And that is right, strictly speaking. I found it quite interesting to find the limits, the moment when you draw the line and decide that it is more difficult to respect OCP than modify existing code, or the architectural cost does not justify the cost of changing existing code.</p>
    <p>Let’s say we want to write a class that can provide progress as a percent for a file that is downloaded through our application. We will have two main classes, a <code>Progress</code> and a <code>File</code>, and I imagine we will want to use them like in the test below.</p>
    <pre>function testItCanGetTheProgressOfAFileAsAPercent() {&#x000A;    	$file = new File();&#x000A;    	$file-&gt;length = 200;&#x000A;    	$file-&gt;sent = 100;&#x000A;    &#x000A;    	$progress = new Progress($file);&#x000A;    &#x000A;    	$this-&gt;assertEquals(50, $progress-&gt;getAsPercent());&#x000A;    }</pre>
    <p>In this test we are a user of <code>Progress</code>. We want to obtain a value as a percent, regardless of the actual file size. We use <code>File</code> as the source of information for our <code>Progress</code>. A file has a length in bytes and a field called <code>sent</code> representing the amount of data sent to the one doing the download. We do not care about how these values are updated in the application. We can assume there is some magical logic doing it for us, so in a test we can set them explicitly.</p>
    <pre>class File {&#x000A;    	public $length;&#x000A;    	public $sent;&#x000A;    }</pre>
    <p>The <code>File</code> class is just a simple data object containing the two fields. Of course in real life, it would probably contain other information and behavior also, like file name, path, relative path, current directory, type, permissions and so on.</p>
    <pre>class Progress {&#x000A;    &#x000A;    	private $file;&#x000A;    &#x000A;    	function __construct(File $file) {&#x000A;    		$this-&gt;file = $file;&#x000A;    	}&#x000A;    &#x000A;    	function getAsPercent() {&#x000A;    		return $this-&gt;file-&gt;sent * 100 / $this-&gt;file-&gt;length;&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p><code>Progress</code> is simply a class taking a <code>File</code> in its constructor. For clarity, we specified the type of the variable in the constructor’s parameters. There is a single useful method on <code>Progress</code>, <code>getAsPercent()</code>, which will take the values sent and length from <code>File</code> and transform them into a percent. Simple, and it works.</p>
    <pre>Testing started at 5:39 PM ...&#x000A;    PHPUnit 3.7.28 by Sebastian Bergmann.&#x000A;    .&#x000A;    Time: 15 ms, Memory: 2.50Mb&#x000A;    OK (1 test, 1 assertion)</pre>
    <p>This code seems to be right, however it violates the Open/Closed Principle. But why? And How?</p>
    <hr>
    <h2>Changing Requirements</h2>
    <p>Every application that is expected to evolve in time will need new features. One new feature for our application could be to allow streaming of music, instead of just downloading files. <code>File</code>‘s length is represented in bytes, the music’s duration in seconds. We want to offer a nice progress bar to our listeners, but can we reuse the one we already have?</p>
    <p>No, we can not. Our progress is bound to <code>File</code>. It understands only files, even though it could be applied to music content also. But in order to do that we have to modify it, we have to make <code>Progress</code> know about <code>Music</code> and <code>File</code>. If our design would respect OCP, we would not need to touch <code>File</code> or <code>Progress</code>. We could just simply reuse the existing <code>Progress</code> and apply it to <code>Music</code>.</p>
    <hr>
    <h2>Solution 1: Take Advantage of the Dynamic Nature of PHP</h2>
    <p>Dynamically typed languages have the advantages of guessing the types of objects at runtime. This allows us to remove the typehint from <code>Progress</code>‘ constructor and the code will still work.</p>
    <pre>class Progress {&#x000A;    &#x000A;    	private $file;&#x000A;    &#x000A;    	function __construct($file) {&#x000A;    		$this-&gt;file = $file;&#x000A;    	}&#x000A;    &#x000A;    	function getAsPercent() {&#x000A;    		return $this-&gt;file-&gt;sent * 100 / $this-&gt;file-&gt;length;&#x000A;    	}&#x000A;    &#x000A;    } </pre>
    <p>Now we can throw anything at <code>Progress</code>. And by anything, I mean literally anything:</p>
    <pre>class Music {&#x000A;    &#x000A;    	public $length;&#x000A;    	public $sent;&#x000A;    &#x000A;    	public $artist;&#x000A;    	public $album;&#x000A;    	public $releaseDate;&#x000A;    &#x000A;    	function getAlbumCoverFile() {&#x000A;    		return 'Images/Covers/' . $this-&gt;artist . '/' . $this-&gt;album . '.png';&#x000A;    	}&#x000A;    } </pre>
    <p>And a <code>Music</code> class like the one above will work just fine. We can test it easily with a very similar test to <code>File</code>.</p>
    <pre>function testItCanGetTheProgressOfAMusicStreamAsAPercent() {&#x000A;    	$music = new Music();&#x000A;    	$music-&gt;length = 200;&#x000A;    	$music-&gt;sent = 100;&#x000A;    &#x000A;    	$progress = new Progress($music);&#x000A;    &#x000A;    	$this-&gt;assertEquals(50, $progress-&gt;getAsPercent());&#x000A;    }</pre>
    <p>So basically, any measurable content can be used with the <code>Progress</code> class. Maybe we should express this in code by changing the variable’s name also:</p>
    <pre>class Progress {&#x000A;    &#x000A;    	private $measurableContent;&#x000A;    &#x000A;    	function __construct($measurableContent) {&#x000A;    		$this-&gt;measurableContent = $measurableContent;&#x000A;    	}&#x000A;    &#x000A;    	function getAsPercent() {&#x000A;    		return $this-&gt;measurableContent-&gt;sent * 100 / $this-&gt;measurableContent-&gt;length;&#x000A;    	}&#x000A;    &#x000A;    } </pre>
    <p>Good, but we have a huge problem with this approach. When we had <code>File</code> specified as a typehint, we were positive about what our class can handle. It was explicit and if something else came in, a nice error told us so.</p>
    <pre>Argument 1 passed to Progress::__construct()&#x000A;    must be an instance of File,&#x000A;    instance of Music given.</pre>
    <p>But without the typehint, we must rely on the fact that whatever comes in will have two public variables of some exact names like “<code>length</code>” and “<code>sent</code>“. Otherwise we will have a refused bequest.</p>
    <blockquote><p>Refused bequest: a class that overrides a method of a base class in such a way that the contract of the base class is not honored by the derived class. ~Source Wikipedia.</p></blockquote>
    <p>This is one of the <em>code smells</em> presented in much more detail in the <a href="https://tutsplus.com/course/detecting-code-smells/" rel="nofollow external" class="bo">Detecting Code Smells</a> premium course. In short, we do not want to end up trying to call methods or access fields on objects that do not conform to our contract. When we had a typehint, the contract was specified by it. The fields and methods of the <code>File</code> class. Now that we have nothing, we can send in anything, even a string and it would result in an ugly error.</p>
    <pre>function testItFailsWithAParameterThatDoesNotRespectTheImplicitContract() {&#x000A;    	$progress = new Progress('some string');&#x000A;    	$this-&gt;assertEquals(50, $progress-&gt;getAsPercent());&#x000A;    }</pre>
    <p>A test like this, where we send in a simple string, will produce a refused bequest:</p>
    <pre>Trying to get property of non-object.</pre>
    <p>While the end result is the same in both cases, meaning the code breaks, the first one produced a nice message. This one, however, is very obscure. There is no way of knowing what the variable is – a string in our case – and what properties were looked for and not found. It is difficult to debug and to solve the problem. A programmer needs to open the <code>Progress</code> class and read it and understand it. The contract, in this case, when we do not explicitly specify the typehint, is defined by the behavior of <code>Progress</code>. It is an implicit contract, known only to <code>Progress</code>. In our example, it is defined by the access to the two fields, <code>sent</code> and <code>length</code>, in the <code>getAsPercent()</code> method. In real life the implicit contract can be very complex and hard to discover by just looking for a few seconds at the class.</p>
    <p>This solution is recommended only if none of the other suggestions below can easily be implemented or if they would inflict serious architectural changes that do not justify the effort.</p>
    <hr>
    <h2>Solution 2: Use the Strategy Design Pattern</h2>
    <p>This is the most common and probably the most appropriate solution to respect OCP. It is simple and effective.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2014/01/strategy.png" alt="strategy" width="600" height="294" style="max-width: 100%; height: auto;"><br> <p>The Strategy Pattern simply introduces the use of an interface. An interface is a special type of entity in Object Oriented Programming (OOP) which defines a contract between a client and a server class. Both classes will adhere to the contract to ensure the expected behavior. There may be several, unrelated, server classes that respect the same contract thus being capable of serving the same client class.</p>
    <pre>interface Measurable {&#x000A;    	function getLength();&#x000A;    	function getSent();&#x000A;    }</pre>
    <p>In an interface we can define only behavior. That is why instead of directly using public variables we will have to think about using getters and setters. Adapting the other classes will not be difficult at this point. Our IDE can do most of the job.</p>
    <pre>function testItCanGetTheProgressOfAFileAsAPercent() {&#x000A;    	$file = new File();&#x000A;    	$file-&gt;setLength(200);&#x000A;    	$file-&gt;setSent(100);&#x000A;    &#x000A;    	$progress = new Progress($file);&#x000A;    &#x000A;    	$this-&gt;assertEquals(50, $progress-&gt;getAsPercent());&#x000A;    }</pre>
    <p>As usual, we start with our tests. We will need to use setters to set the values. If considered mandatory, these setters may also be defined in the <code>Measurable</code> interface. However, be careful what you put there. The interface is to define the contract between the client class <code>Progress</code> and the different server classes like <code>File</code> and <code>Music</code>. Does <code>Progress</code> need to set the values? Probably not. So the setters are highly unlikely to be needed to be defined in the interface. Also, if you would define the setters there, you would force all of the server classes to implement setters. For some of them, it may be logical to have setters, but others may behave totally differently. What if we want to use our <code>Progress</code> class to show the temperature of our oven? The <code>OvenTemperature</code> class may be initialized with the values in the constructor, or obtain the information from a third class. Who knows? To have setters on that class would be odd.</p>
    <pre>class File implements Measurable {&#x000A;    &#x000A;    	private $length;&#x000A;    	private $sent;&#x000A;    &#x000A;    	public $filename;&#x000A;    	public $owner;&#x000A;    &#x000A;    	function setLength($length) {&#x000A;    		$this-&gt;length = $length;&#x000A;    	}&#x000A;    &#x000A;    	function getLength() {&#x000A;    		return $this-&gt;length;&#x000A;    	}&#x000A;    &#x000A;    	function setSent($sent) {&#x000A;    		$this-&gt;sent = $sent;&#x000A;    	}&#x000A;    &#x000A;    	function getSent() {&#x000A;    		return $this-&gt;sent;&#x000A;    	}&#x000A;    &#x000A;    	function getRelativePath() {&#x000A;    		return dirname($this-&gt;filename);&#x000A;    	}&#x000A;    &#x000A;    	function getFullPath() {&#x000A;    		return realpath($this-&gt;getRelativePath());&#x000A;    	}&#x000A;    &#x000A;    }</pre>
    <p>The <code>File</code> class is modified slightly to accommodate the requirements above. It now implements the <code>Measurable</code> interface and has setters and getters for the fields we are interested in. <code>Music</code> is very similar, you can check its content in the attached source code. We are almost done.</p>
    <pre>class Progress {&#x000A;    &#x000A;    	private $measurableContent;&#x000A;    &#x000A;    	function __construct(Measurable $measurableContent) {&#x000A;    		$this-&gt;measurableContent = $measurableContent;&#x000A;    	}&#x000A;    &#x000A;    	function getAsPercent() {&#x000A;    		return $this-&gt;measurableContent-&gt;getSent() * 100 / $this-&gt;measurableContent-&gt;getLength();&#x000A;    	}&#x000A;    &#x000A;    } </pre>
    <p><code>Progress</code> also needed a small update. We can now specify a type, using typehinting, in the constructor. The expected type is <code>Measurable</code>. Now we have an explicit contract. <code>Progress</code> can be sure the accessed methods will be always present because they are defined in the <code>Measurable</code> interface. <code>File</code> and <code>Music</code> can also be sure they can provide all that is needed for <code>Progress</code> by simply implementing all the methods on the interface, a requirement when a class implements an interface.</p>
    <p>This design pattern is explained in greater detail in the <a href="https://tutsplus.com/course/agile-design-patterns/" rel="nofollow external" class="bo">Agile Design Patterns</a> course.</p>
    <h3>A Note on Interface Naming</h3>
    <p>People tend to name interfaces with a capital <code>I</code> in front of them, or with the word “<code>Interface</code>” attached at the end, like <code>IFile</code> or <code>FileInterface</code>. This is an old-style notation imposed by some outdated standards. We are so much past the Hungarian notations or the need to specify the type of a variable or object in its name in order to easier identify it. IDEs identify anything in a split second for us. This allows us to concentrate on what we actually want to abstract.</p>
    <p>Interfaces belong to their clients. Yes. When you want to name an interface you must think of the client and forget about the implementation. When we named our interface Measurable we did so thinking about Progress. If I would be a progress, what would I need to be able to provide the percent? The answer is simple, something we can measure. Thus the name Measurable.</p>
    <p>Another reason is that the implementation can be from various domains. In our case, there are files and music. But we may very well reuse our <code>Progress</code> in a racing simulator. In that case, the measured classes would be Speed, Fuel, etc. Nice, isn’t it?</p>
    <hr>
    <h2>Solution 3: Use the Template Method Design Pattern</h2>
    <p>The Template Method design pattern is very similar to the strategy, but instead of an interface it uses an abstract class. It is recommended to use a Template Method pattern when we have a client very specific to our application, with reduced reusability and when the server classes have common behavior.</p>  <img src="http://cdn.tutsplus.com/net/uploads/2014/01/template_method.png" alt="template_method" width="600" height="294" style="max-width: 100%; height: auto;"><br> <p>This design pattern is explained in greater detail in the <a href="https://tutsplus.com/course/agile-design-patterns/" rel="nofollow external" class="bo">Agile Design Patterns</a> course.</p>
    <hr>
    <h2>A Higher Level View</h2>
    <p>So, how is all of this affecting our high level architecture?</p>  <img src="http://cdn.tutsplus.com/net/uploads/2014/01/HighLevelDesign.png" alt="HighLevelDesign" width="600" height="388" style="max-width: 100%; height: auto;"><br> <p>If the image above represents the current architecture of our application, adding a new module with five new classes (the blue ones) should affect our design in a moderate way (red class).</p>  <img src="http://cdn.tutsplus.com/net/uploads/2014/01/HighLevelDesignWithNewClasses.png" alt="HighLevelDesignWithNewClasses" width="600" height="410" style="max-width: 100%; height: auto;"><br> <p>In most systems you can’t expect absolutely no effect on the existing code when new classes are introduced. However, respecting the Open/Closed Principle will considerably reduce the classes and modules that require constant change.</p>
    <p>As with any other principle, try not to think about everything from before. If you do so, you will end up with an interface for each of your classes. Such a design will be hard to maintain and understand. Usually the safest way to go is to think about the possibilities and if you can determine whether there will be other types of server classes. Many times you can easily imagine a new feature or you can find one on the project’s backlog that will produce another server class. In those cases, add the interface from the beginning. If you can not determine, or if you are unsure – most of the time – simply omit it. Let the next programmer, or maybe even yourself, to add the interface when you need a second implementation.</p>
    <hr>
    <h2>Final Thoughts</h2>
    <p>If you follow your discipline and add interfaces as soon as a second server is needed, modifications will be few and easy. Remember, if code required changes once, there is a high possibility it will require change again. When that possibility turns into reality, OCP will save you a lot of time and effort.</p>
    <p>Thank you for reading.</p>
    </div>
]]>
</Body>
<Summary>Single Responsibility (SRP), Open/Closed (OCP), Liskov’s Substitution, Interface Segregation, and Dependency Inversion. Five agile principles that should guide you every time you need to write...</Summary>
<Website>http://feedproxy.google.com/~r/nettuts/~3/aH8si1mNSHI/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40415/guest@my.umbc.edu/c801f99c8563903d1c1241dd81e3f632/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>open-closed-principle</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>Mon, 20 Jan 2014 15:09:07 -0500</PostedAt>
<EditAt>Mon, 20 Jan 2014 15:09:07 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="122871" important="false" status="posted" url="https://my3.my.umbc.edu/posts/122871">
<Title>Celebrating MLK Day</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>As we celebrate Martin Luther King Jr. Day, check out UMBC’s online exhibit “<a href="http://www.umbc.edu/cadvc/foralltheworld/index.php" rel="nofollow external" class="bo">For All the World to See,</a>” which focuses on the civil rights movement.</p>
    <blockquote><p>For All the World to See: Visual Culture and the Struggle for Civil Rights is organized by the Center for Art, Design and Visual Culture, University of Maryland, Baltimore County in partnership with the Smithsonian National Museum of African American History and Culture. Through a host of media—including photographs, television and film, magazines, newspapers, posters, books, and pamphlets—the project explores the historic role of visual culture in shaping, influencing, and transforming the fight for racial equality and justice in the United States from the late-1940s to the mid-1970s. <em>For All the World to See</em> includes a traveling exhibition, website, online film festival, and richly illustrated companion book.</p></blockquote>
    <p>If you’re in Texas, the exhibit will be coming your way on January 28. Be sure to <a href="http://www.umbc.edu/blogs/foralltheworld/" rel="nofollow external" class="bo">see if it’s making a stop in a town near you</a>!</p>
    <p><em>For more information, <a href="http://umbcmagazine.wordpress.com/umbc-magazine-fall-2012/staging-the-struggle-2/" rel="nofollow external" class="bo">read our story about the exhibit</a> from an issue of the UMBC Magazine.</em></p>
    </div>
]]>
</Body>
<Summary>As we celebrate Martin Luther King Jr. Day, check out UMBC’s online exhibit “For All the World to See,” which focuses on the civil rights movement.    For All the World to See: Visual Culture and...</Summary>
<Website>https://umbc.edu/stories/celebrating-mlk-day/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/122871/guest@my.umbc.edu/483aeb825a19999918ae2518539da59f/api/pixel</TrackingUrl>
<Tag>alumni</Tag>
<Tag>civil-rights</Tag>
<Tag>civil-rights-movement</Tag>
<Tag>for-all-the-world-to-see</Tag>
<Tag>martin-luther-king</Tag>
<Tag>martin-luther-king-jr</Tag>
<Tag>mlk</Tag>
<Tag>mlk-day</Tag>
<Tag>umbc</Tag>
<Tag>university-of-maryland-baltimore-county</Tag>
<Group token="umbc-news-magazine">UMBC News &amp;amp; Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news-magazine</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/original.png?1748556657</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/large.png?1748556657</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/medium.png?1748556657</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/small.png?1748556657</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxsmall.png?1748556657</AvatarUrl>
<Sponsor>UMBC News &amp; Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 20 Jan 2014 14:00:43 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="40413" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40413">
<Title>Bits Blog: 3-D Printing Moves Closer to the Mainstream</Title>
<Body>
<![CDATA[
    <div class="html-content">Yes, 3-D printers are quickly adding the features that could take them past the bleeding edge of tech buyers.<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%2F20%2F3-d-printing-moves-closer-toward-the-mainstream%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+3-D+Printing+Moves+Closer+to+the+Mainstream" 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%2F20%2F3-d-printing-moves-closer-toward-the-mainstream%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+3-D+Printing+Moves+Closer+to+the+Mainstream" 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%2F20%2F3-d-printing-moves-closer-toward-the-mainstream%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+3-D+Printing+Moves+Closer+to+the+Mainstream" 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%2F20%2F3-d-printing-moves-closer-toward-the-mainstream%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+3-D+Printing+Moves+Closer+to+the+Mainstream" 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%2F20%2F3-d-printing-moves-closer-toward-the-mainstream%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+3-D+Printing+Moves+Closer+to+the+Mainstream" 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/186529212186/u/0/f/640387/c/34625/s/3621609a/sc/22/rc/1/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186529212186/u/0/f/640387/c/34625/s/3621609a/sc/22/rc/1/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/186529212186/u/0/f/640387/c/34625/s/3621609a/sc/22/rc/2/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186529212186/u/0/f/640387/c/34625/s/3621609a/sc/22/rc/2/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/186529212186/u/0/f/640387/c/34625/s/3621609a/sc/22/rc/3/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186529212186/u/0/f/640387/c/34625/s/3621609a/sc/22/rc/3/rc.img" style="max-width: 100%; height: auto;"></a><br><br><a href="http://da.feedsportal.com/r/186529212186/u/0/f/640387/c/34625/s/3621609a/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186529212186/u/0/f/640387/c/34625/s/3621609a/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>Yes, 3-D printers are quickly adding the features that could take them past the bleeding edge of tech buyers.      </Summary>
<Website>http://bits.blogs.nytimes.com/2014/01/20/3-d-printing-moves-closer-toward-the-mainstream/?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40413/guest@my.umbc.edu/d65b4a86b0c50d64d1ee2df6899a7580/api/pixel</TrackingUrl>
<Tag>3-d-printers</Tag>
<Tag>ces-2014</Tag>
<Tag>computer-printers</Tag>
<Tag>copyrights-and-copyright-violations</Tag>
<Tag>internet</Tag>
<Tag>new</Tag>
<Tag>shapeways</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>Mon, 20 Jan 2014 09:33:19 -0500</PostedAt>
<EditAt>Tue, 21 Jan 2014 16:52:41 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="40412" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40412">
<Title>Tim Finin appointed co-editor of CACM Viewpoints</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><img src="http://www.csee.umbc.edu/wp-content/uploads/2014/01/cacm2.png" alt="" width="700" height="308" style="max-width: 100%; height: auto;"></p>
    <p>CSEE professor <a href="http://umbc.edu/~finin/" rel="nofollow external" class="bo">Tim Finin</a> has been appointed as a co-editor of the Viewpoints section of the Communications of the ACM, the monthly magazine of the Association for Computing Machinery.  <a href="http://cacm.acm.org/" rel="nofollow external" class="bo">ACM</a> was founded in 1947 and is the world’s largest educational and scientific computing society with the mission of providing resources that advance computing as a science and a profession.</p>
    <p>The <a href="http://cacm.acm.org/" rel="nofollow external" class="bo">Communications of the ACM</a> was started in 1957 and is sent to all ACM members (currently over 100,000) and is considered “the leading print and online publication for the computing and information technology fields”. CACM’s Viewpoints section is publishes short articles expressing opinions and views that pertain to issues of broad interest to the computing community, covering a wide range of topics, including scientific, technical, educational and social. Each month a handful of articles are published from those contributed by a set of distinguished ACM columnists and submitted by ACM members and computing professionals.</p>
    </div>
]]>
</Body>
<Summary>CSEE professor Tim Finin has been appointed as a co-editor of the Viewpoints section of the Communications of the ACM, the monthly magazine of the Association for Computing Machinery.  ACM was...</Summary>
<Website>http://www.csee.umbc.edu/2014/01/tim-finin-appointed-co-editor-of-cacm-viewpoints/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40412/guest@my.umbc.edu/f8899a07c79406155490499376970ca7/api/pixel</TrackingUrl>
<Tag>faculty-and-staff</Tag>
<Tag>news</Tag>
<Group token="csee">Computer Science and Electrical Engineering</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/csee</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/xsmall.png?1314043393</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/original.png?1314043393</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/xxlarge.png?1314043393</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/xlarge.png?1314043393</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/large.png?1314043393</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/medium.png?1314043393</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/small.png?1314043393</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/xsmall.png?1314043393</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/099/d117dca133c64bf78a4b7696dd007189/xxsmall.png?1314043393</AvatarUrl>
<Sponsor>Computer Science and Electrical Engineering</Sponsor>
<PawCount>2</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 20 Jan 2014 09:23:19 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="40410" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40410">
<Title>Celebrating MLK Day</Title>
<Body>
<![CDATA[
    <div class="html-content">As we celebrate Martin Luther King Jr. Day, check out UMBC’s online exhibit “For All the World to See,” which focuses on the civil rights movement. For All the World to See: Visual Culture and the Struggle for Civil Rights … <a href="http://umbcalumni.wordpress.com/2014/01/20/celebrating-mlk-day/" rel="nofollow external" class="bo">Continue reading <span>→</span></a>
    </div>
]]>
</Body>
<Summary>As we celebrate Martin Luther King Jr. Day, check out UMBC’s online exhibit “For All the World to See,” which focuses on the civil rights movement. For All the World to See: Visual Culture and the...</Summary>
<Website>http://umbcalumni.wordpress.com/2014/01/20/celebrating-mlk-day/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40410/guest@my.umbc.edu/ef55ce64cae2f5e198aa84c08dbf058e/api/pixel</TrackingUrl>
<Tag>civil-rights</Tag>
<Tag>civil-rights-movement</Tag>
<Tag>for-all-the-world-to-see</Tag>
<Tag>martin-luther-king</Tag>
<Tag>martin-luther-king-jr</Tag>
<Tag>mlk</Tag>
<Tag>mlk-day</Tag>
<Tag>news-and-updates</Tag>
<Tag>umbc</Tag>
<Tag>university-of-maryland-baltimore-county</Tag>
<Group token="retired-20">UMBC Alumni</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-20</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xsmall.png?1280681147</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/original.png?1280681147</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xxlarge.png?1280681147</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xlarge.png?1280681147</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/large.png?1280681147</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/medium.png?1280681147</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/small.png?1280681147</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xsmall.png?1280681147</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/020/08fe2621d8e716b02ec0da35256a998d/xxsmall.png?1280681147</AvatarUrl>
<Sponsor>UMBC Alumni</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 20 Jan 2014 09:00:43 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="106882" important="false" status="posted" url="https://my3.my.umbc.edu/posts/106882">
<Title>Celebrating MLK Day</Title>
<Body>
<![CDATA[
    <div class="html-content">As we celebrate Martin Luther King Jr. Day, check out UMBC’s online exhibit “For All the World to See,” which …</div>
]]>
</Body>
<Summary>As we celebrate Martin Luther King Jr. Day, check out UMBC’s online exhibit “For All the World to See,” which …</Summary>
<Website>https://magazine.umbc.edu/celebrating-mlk-day/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/106882/guest@my.umbc.edu/f8637db1b6a4afad1bacd115c4084ae2/api/pixel</TrackingUrl>
<Tag>alumni</Tag>
<Tag>civil-rights</Tag>
<Tag>civil-rights-movement</Tag>
<Tag>for-all-the-world-to-see</Tag>
<Tag>martin-luther-king</Tag>
<Tag>martin-luther-king-jr</Tag>
<Tag>mlk</Tag>
<Tag>mlk-day</Tag>
<Tag>umbc</Tag>
<Tag>university-of-maryland-baltimore-county</Tag>
<Group token="retired-1945">UMBC Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-1945</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/images/avatars/group/8/xsmall.png?1790092142</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/images/avatars/group/8/original.png?1790092142</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets1-my.umbc.edu/images/avatars/group/8/xxlarge.png?1790092142</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/images/avatars/group/8/xlarge.png?1790092142</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/images/avatars/group/8/large.png?1790092142</AvatarUrl>
<AvatarUrl size="medium">https://assets2-my.umbc.edu/images/avatars/group/8/medium.png?1790092142</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/images/avatars/group/8/small.png?1790092142</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/images/avatars/group/8/xsmall.png?1790092142</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/images/avatars/group/8/xxsmall.png?1790092142</AvatarUrl>
<Sponsor>UMBC Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 20 Jan 2014 09:00:43 -0500</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="40408" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40408">
<Title>Dealing With Workaholism On Web Teams</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <table width="650">
    <tbody>
    <tr>
    <td>
    <div>
    <img src="http://statisches.auslieferung.commindo-media-ressourcen.de/advertisement.gif" alt="" style="max-width: 100%; height: auto;"><br><a href="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=target&amp;collection=smashing-rss&amp;position=1" rel="nofollow external" class="bo"><img src="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=image&amp;collection=smashing-rss&amp;position=1" alt="" style="max-width: 100%; height: auto;"></a> <a href="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=target&amp;collection=smashing-rss&amp;position=2" rel="nofollow external" class="bo"><img src="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=image&amp;collection=smashing-rss&amp;position=2" alt="" style="max-width: 100%; height: auto;"></a> <a href="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=target&amp;collection=smashing-rss&amp;position=3" rel="nofollow external" class="bo"><img src="http://auslieferung.commindo-media-ressourcen.de/random.php?mode=image&amp;collection=smashing-rss&amp;position=3" alt="" style="max-width: 100%; height: auto;"></a>
    </div>
    </td>
    </tr>
    </tbody>
    </table>
    <p>Workaholism is often confused with hard work. Some people who work on the Web seem not only to disregard its dangers, but to actively promote it. They see it as a badge of honor—but is it really? On the contrary, it’s a serious issue that can damage Web teams.</p>
    <p>Before we get started, <a href="http://www.psychologytoday.com/blog/wired-success/201203/workaholism-and-the-myth-hard-work" rel="nofollow external" class="bo">let’s make one thing clear</a>: A “workaholic” is someone who is <a href="http://www.psychologytoday.com/blog/the-workaholics/201112/understanding-the-dynamics-workaholism" rel="nofollow external" class="bo">addicted</a> to work, someone who is out of balance and out of control. Their addiction can make them work for 12, 14 or even more hours a day, every day. No weekends, no vacations, just work. Soon, they neglect their family, friends, health, sometimes damaging them all irrevocably.</p>
    <p>In contrast, people who simply “work hard” do not expose themselves to such dangers. Putting in a few extra hours to meet a critical deadline doesn’t usually result in workaholism, provided that those sprints are rare and justified.</p>
    <h3>On Good Web Teams</h3>
    <p>Running a modern Web business can be demanding. As a result, some business owners stretch their employees as far as they can. What they fail to realize is that working 40 hours per week is enough. Any more and both the <a href="http://www.inc.com/jessica-stillman/why-working-more-than-40-hours-a-week-is-useless.html" rel="nofollow external" class="bo">employees and the business could be harmed</a>, startups included.</p>
    <p>Productivity depends <em>not only</em> on working hours, but <a href="http://calnewport.com/blog/2007/07/26/the-straight-a-gospels-pseudo-work-does-not-equal-work/" rel="nofollow external" class="bo">on intensity of work</a>. Here’s a magic equation:</p>
    <blockquote>
    <p>work accomplished = time spent × intensity of focus</p>
    </blockquote>
    <p>Pushing people to work more hours is a <em>superficial</em> solution, not a <em>viable</em> one.</p>
    <p>Good teams, winning teams, are fragile ecosystems. Members communicate with each other through different media (face to face, instant messages, email, project management software), and the communication is often asynchronous (thus, accommodating both early birds and night owls, as well as people in other time zones). Once a team finds its pace, that rhythm must be protected.</p>
    <p>Members of this fragile ecosystem are connected by invisible bonds of respect and care. <strong>Teams are made up of humans.</strong> You can see this in action on a sports team: When an opponent attacks a member of the team, the rest rush to protect their teammate. That’s team spirit.</p>
    <p>Workaholics have a much more extreme approach to work. They work far more than 40 hours per week, they disrupt the rhythm of the team, and they disregard the invisible bonds of care and respect. Just <em>one</em> of them is enough to damage the health of a good team.</p>
    <h3>How Does Someone Become A Workaholic?</h3>
    <p>Think of the movies that feature a lonely computer programmer, coding non-stop day and night. The character is familiar. But can computers themselves stimulate workaholism? They are, after all, absorbing and entertaining at once. Losing control seems to be a greater danger for us than for other professionals. However, a <a href="http://www.psychologytoday.com/articles/200605/field-guide-the-workaholic" rel="nofollow external" class="bo">job can’t turn someone into a workaholic</a>. Workaholics tend to be rigid, perfectionist and born achievers.</p>
    <p><a href="http://www.flickr.com/photos/upto6only/5893812038/sizes/l/" rel="nofollow external" class="bo"><img alt="workaholic" src="http://media.smashingmagazine.com/wp-content/uploads/2014/01/workaholic-opt.jpg" width="500" height="667" style="max-width: 100%; height: auto;"></a><br><em>“He would waste no hour.” (Image: <a href="http://www.flickr.com/photos/upto6only/" rel="nofollow external" class="bo">Iana Peralta</a>)</em></p>
    <p>Workaholics have a characteristic that distinguishes them from people who just love their work: <a href="http://www.careercast.com/career-news/truth-about-workaholics" rel="nofollow external" class="bo">personal</a> <a href="http://voices.yahoo.com/how-overcome-being-workaholic-8450819.html?cat=5" rel="nofollow external" class="bo">insecurity</a>. Personal insecurity is associated with neuroticism, another inherent characteristic of workaholics, according to the study “<a href="http://folk.uib.no/pspsm/documents/B-M-P-2006.pdf" rel="nofollow external" class="bo">Personality Correlates of Workaholism</a>” (PDF). Peter E. Mudrack, in his chapter “<a href="http://books.google.com/books?id=nqWvpJ3WKSQC&amp;lpg=PA108&amp;ots=eb4hcoWca4&amp;dq=Mudrack,+E.+(2006).+Understanding+workaholism&amp;lr=&amp;pg=PA108&amp;redir_esc=y#v=onepage&amp;q&amp;f=false" rel="nofollow external" class="bo">Understanding Workaholism: The Case for Behavioral Tendencies</a>” for the book <em>Research Companion to Working Time and Work Addiction</em>, connects workaholism to feelings of low self-worth and insecurity.</p>
    <p><strong>Insecurity comes in many guises:</strong> low self-esteem, antagonism, authoritarianism, severe fear of failure, perfectionism. The actions of workaholics express an urgent need to prove to themselves and to others that they’re better than everyone else in the room. Deep down, they hurt. Some feel like a failure in their personal life and use their job to escape from a bad relationship or to <a href="http://www.nytimes.com/2007/10/21/jobs/21career.html?_r=0" rel="nofollow external" class="bo">make up for an absence in their personal life</a>.</p>
    <p>Sometimes people become workaholics for less complicated reasons. A big loan or a personal debt are tangible problems. If someone is in desperate need of money, they’ll work as much as they can to get it. Supporting a large family is also a huge burden. Such situations are oppressive and make some people abandon their principles and become workaholics.</p>
    <p>In some ways, workaholism is a symptom of modern society. We live in a culture where productivity is paramount and the <a href="http://samvak.tripod.com/leisure.html" rel="nofollow external" class="bo">boundaries between leisure and work are no longer clear</a>. We’re raising a generation of people who not only love their work but put it at the center of their lives. The entrepreneurial lifestyle is held up as the model of how to work on the Web. Slowly, gradually, we are changing our fundamental values and criteria for success.</p>
    <h4>Are You a Workaholic?</h4>
    <p>Most workaholics wouldn’t admit that they’re one to themselves, let alone to anyone else. If you’re worried that you might be one, ask yourself a few simple questions:</p>
    <ul>
    <li>“Do I work far more than 40 hours per week?”</li>
    <li>“Do I feel a continual urge to prove that I’m the best among my colleagues?”</li>
    <li>“Do I recognize signs of intense insecurity in myself about work?”</li>
    <li>“Are my personal and work lives balanced?”</li>
    </ul>
    <p>There’s even an <a href="http://edition.cnn.com/interactive/2011/05/living/workaholic.test/" rel="nofollow external" class="bo">online quiz</a> that could help you. It’s simple and short.</p>
    <p>You could bury your head in the sand and pretend that everything is OK. But if you suspect that you’re a workaholic, then doing something about it is critical. And if you still think workaholism is cool, please keep on reading.</p>
    <h3>The Attractiveness Of Workaholics</h3>
    <p>Yes, some employers love workaholics. But why are workaholics so appealing?</p>
    <ul>
    <li>They work longer hours than the rest of the team.</li>
    <li>They don’t mind taking work home.</li>
    <li>Outworking everyone else makes them seem like they care. Always taking on responsibility and being at work all of the time make them look valuable. And carrying on under any circumstance makes them a fighter.</li>
    </ul>
    <p>They know what employers want, and they’re eager to give it.</p>
    <p>Let’s take a look at two archetypal workaholics.</p>
    <h4>1. The Committed Lead Programmer</h4>
    <p>Upon conducting extensive research, an experienced lead programmer comes up with a number of different database implementations to apply to a Web project. He decides to test each one thoroughly to find the best one. This doesn’t impinge on anyone’s time except his own. He <strong>decides to take the job home</strong> and works day and night to accomplish the task. He knows it won’t be easy, but he’s committed. All he wants is to be appreciated for his dedication and work.</p>
    <p>Pretty compelling, right? A meticulous Web worker who sacrifices his personal time to advance the project.</p>
    <h4>2. The Project Manager With Mettle</h4>
    <p>In a casual company meeting, a project manager promises stakeholders a sophisticated implementation of a service on an incredibly tight schedule. He’s not afraid to take responsibility for the project, and he promises to check every single aspect of it personally. If that requires him to <strong>push the team as far as he can</strong>, then so be it.</p>
    <p>Stakeholders leave the meeting impressed by his loyalty and determination. At last, they have found someone they can count on.</p>
    <p>The characters above are just a couple of the types of workaholics in our industry. There are many: the superstar designer who’s willing to present multiple design directions; the perfectionist developer who insists on flawless code, even sacrificing his summer vacations. The list goes on.</p>
    <p>Such people look much more attractive than their coworkers who stick to eight-hour workdays. They have charisma, they work hard, and they should be praised, if not promoted.</p>
    <p><a href="http://www.flickr.com/photos/fboyd/3793181882/" rel="nofollow external" class="bo"><img alt="office-night" src="http://media.smashingmagazine.com/wp-content/uploads/2014/01/office-night-opt.jpg" width="500" height="500" style="max-width: 100%; height: auto;"></a><br><em>“Office hours” are sometimes relative. (Image: <a href="http://www.flickr.com/photos/fboyd/3793181882/" rel="nofollow external" class="bo">Florian Boyd</a>)</em></p>
    <h3>The Fake Glow Of Workaholism</h3>
    <p>The glow of this perfectionism is false. These practices are only temporarily fruitful, and they can eventually result in disaster. The reason is that workaholism is a shortsighted strategy, one that encourages people to express the worst parts of their personality.</p>
    <p>Why is it shortsighted? Because the committed programmer cited above is unconsciously hurting his team’s spirit. As <a href="http://scottberkun.com/essays/47-teams-and-stars/" rel="nofollow external" class="bo">Scott Berkun notes</a>:</p>
    <blockquote>
    <p>“Simply outworking other people can have a negative effect on others: that 5× improvement may create a -2× impact on everyone else: if the star demoralizes others and goes out of his way to embarrasses them with his talent, morale and productivity are sure to drop.”</p>
    </blockquote>
    <p>Furthermore, even the most productive employees can’t keep working with such intensity for long. They will eventually wear out, as will their ability to think clearly. They will no longer be able to contribute to the team or make sound decisions. A successful team needs steady performance from its members more than heroic efforts. A member who temporarily outworks the rest of the team soon becomes an obstacle because they can’t work as part of the team, despite their best intentions.</p>
    <p>And <strong>why does workaholism lead people to show the dark side of their personality?</strong> Let’s return to our second character type. The project manager who would do anything to keep his promise will end up creating too much tension by pushing the team members to their limit. Even if he pushes himself more, he will not inspire anyone; he will merely be a foolish dictator — not a member of the team, but an opponent.</p>
    <p>When a team struggles to cope with an impossible project and infighting occurs, the incredible pressure will reduce the overall quality of the work. In such an environment, the manager could very easily get someone out of their way by derailing them, <a href="https://medium.com/about-work/65d4740f7a2f" rel="nofollow external" class="bo">as Shanley explains</a>:</p>
    <blockquote>
    <p>“Any disagreement or critique is transformed into a symptom of pathology on the part of the dissenter. Managers may imply that the individual is unstable, emotionally disturbed, or has a mental disorder. Commonly, this includes overtly stating or implying that the dissenter is “too emotional,” should “take some time off,” “has an anger problem,” is “hostile,” is “overly aggressive,” “takes things too seriously/personally” or “has a problem with authority.””</p>
    </blockquote>
    <p>In the best case scenario, the workaholic will end up exhausted, needing weeks or even months to recover. In the worst case scenario, the team will derail and the members will be dispirited.</p>
    <h3>Workaholic Companies</h3>
    <p>Too many workaholic companies are out there, and it’s pretty easy for an employer to create one. All the employer has to do is push people to work beyond their limit and punish the ones who don’t. Big companies such as McKinsey have <a href="http://money.cnn.com/magazines/fortune/fortune_archive/1993/11/01/78550/index.htm" rel="nofollow external" class="bo">have sought out such people</a>, according to CNN.</p>
    <p>Workaholic companies are machines that burn people out. They don’t care about creating teams. They exploit the enthusiasm of young people and dry them up. One indicator of a workaholic company is that its contractors rarely stay with it for more than a few years.</p>
    <p>There are other ways to identify workaholic companies. A few people proudly call themselves workaholics, but most people don’t boast about it, and spotting one from the outside can be hard. However, they can be identified. Before entering a new work environment, <strong>search for the “local heroes”</strong> — the people who urge everyone else to work more, who can’t have a good laugh during working hours or who constantly talk about “the good of the company.” Can you find the individuals who, beyond a doubt, elicit unpleasant feelings from the rest of the team? They are the ones to watch out for.</p>
    <p>Go on. Don’t be afraid to ask straight questions of potential employers during interviews. They may respond vaguely, but try to get crystal clear answers. Some employers expect you to be as dedicated as them, to put yourself in their shoes. Or they will tell you that the company is now your home and that you should do whatever it takes to make it thrive. If you hear these words, run away!</p>
    <p>Remember that you work for money, but money alone is not enough. A job is also about <a href="http://www.cvrdallas.com/hughes-view.html" rel="nofollow external" class="bo">being satisfied</a>, which comes from an effective management style, good use of the team’s various skills and a pleasant atmosphere. A workaholic company needs you more than you need it. You deserve better.</p>
    <p><a href="https://medium.com/about-work/65d4740f7a2f" rel="nofollow external" class="bo"><img alt="Working With Workaholics" src="http://media.smashingmagazine.com/wp-content/uploads/2014/01/working-with-workaholics.png" width="500" height="382" style="max-width: 100%; height: auto;"></a><br><em>Workaholics tend to lose track of time — voluntarily or involuntarily. (Image credit: “<a href="https://medium.com/about-work/65d4740f7a2f" rel="nofollow external" class="bo">Microaggression and Management</a>“.)</em></p>
    <h3>Working With Workaholics</h3>
    <p>An environment where workaholism is the norm soon gets frustrating. You will quickly find yourself with two choices: follow the others or stand your ground and work according to your own conscience.</p>
    <p>The first option is an admission of defeat. You’re saying, “I won’t try to change the situation here because, if I do so, my job will be at risk.” While no one would blame you for taking this route, you will wither day by day, dying a slow death.</p>
    <p>The second option brings its own problems. You must <strong>be prepared to fight for your right to work normally</strong>. Remain calm, patient and diligent, while questioning everything. You could raise the following questions:</p>
    <ul>
    <li>How is performance measured?</li>
    <li>Why are deadlines so harsh?</li>
    <li>Who is ultimately responsible, and what happens when things go wrong?</li>
    <li>What are the procedures for making complaints?</li>
    <li>What is the past and future of the company?</li>
    </ul>
    <p>If you do find yourself in a workaholic company, the first thing to do is keep sane and keep working. Try to find out why things have gone wrong. Ask questions in front of others so that they feel empowered to ask questions, too. Workaholism affects everyone, but not everyone feels free to speak up. If you never talk about it, no one will help you.</p>
    <p>If the culture of the company as a whole promotes workaholism, then your employer might not be happy with you for pointing it out. Your employer might think that someone who works eight hours a day doesn’t work enough and will tempt others to work less. It’s not going to be easy, but it is worth the effort. If you can demonstrate that workaholism is destructive, then you’ll gradually change the culture of the company, a huge win.</p>
    <h3>Fighting Workaholism</h3>
    <p>Modern businesses need <em>strong teams</em>, not <em>overworked individuals</em>. They need healthy environments, with people who care as much for their teammates as they do for their products.</p>
    <p>Fighting workaholism is not easy, but it <em>can</em> be done. How?</p>
    <ul>
    <li>Be eager to reject workaholism. Every. Single. Day.</li>
    <li>Learn to recognize workaholics.</li>
    <li>Avoid workaholic companies. You won’t regret it.</li>
    <li>If you are at a workaholic company now, end your workday at a reasonable time, or suffer the consequences.</li>
    <li>Spread the word.</li>
    </ul>
    <p>Employers are responsible for workaholism, but if Web workers reject workaholic companies, then those employers would have to change their ways.</p>
    <p>Perhaps you’re saying, “What if I’m the employer?”</p>
    <p>It’s simple, really. By now, you must have realized that promoting workaholism won’t take you far. So, <strong>stand up, leave your desk and see if any workaholics are destroying your fragile ecosystem.</strong> Help them to bring balance back to their life. And if that doesn’t work, then do as the smart folks say: <a href="http://37signals.com/svn/posts/902-fire-the-workaholics" rel="nofollow external" class="bo">fire the workaholic</a>!</p>
    <p><em>(al, il)</em></p>
    <hr>
    <p><small>© Yiannis Konstantakopoulos for <a href="http://www.smashingmagazine.com" rel="nofollow external" class="bo">Smashing Magazine</a>, 2014.</small></p>
    </div>
]]>
</Body>
<Summary>        Workaholism is often confused with hard work. Some people who work on the Web seem not only to disregard its dangers, but to actively promote it. They see it as a badge of honor—but is it...</Summary>
<Website>http://www.smashingmagazine.com/2014/01/20/dealing-with-workaholism-on-web-teams/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40408/guest@my.umbc.edu/8de393d0a3c0fc6c1fc8b5885e2a8d67/api/pixel</TrackingUrl>
<Tag>community</Tag>
<Tag>css</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>opinion-column</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>web</Tag>
<Tag>web-design</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>Mon, 20 Jan 2014 06:04:10 -0500</PostedAt>
<EditAt>Mon, 20 Jan 2014 06:04:10 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="40407" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40407">
<Title>3 reasons we should stop using navigation bars</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><img alt="thumbnail" src="http://netdna.webdesignerdepot.com/uploads/2014/01/thumbnail6.jpg" width="200" height="160" style="max-width: 100%; height: auto;">If you’re anything like me, you spend a lot of time studying other designers’ work. I like to look at projects for the experience and the interactions created for the users.</p> <p>Obviously, as more techniques come about, the changes in web design take place and newer, better things arrive. We’ve experienced the life of the splash page, the introduction header, parallax scrolling and so many other things that have affected the web experience. However, those things were mainly aesthetic and didn’t really change the way we create websites.</p> <p>Lately, I’ve been thumbing through some websites and have seen a new change. One I think I like, but am not sure. A change that I could see really reinventing the way we even think about designing websites. It would cause us to be smarter and think more intuitively about our audience. And that couldn’t be a bad thing. This technique is something that’s not unique to the world of responsive and mobile design. However, for some tablets and desktops, it’s a new variety of navigation.</p> <p>We aren’t getting rid of menus all together, we are just hiding them until they are called for. Could this be something that takes off?</p> <p> </p> <h1>How important are navigation bars?</h1> <p>The navigation bar was born right along with the Internet. Designers believe that placing all the menu content in clear view on a page just makes sense. And it’s hard to argue. If you come to a website for the first time, you want to know what’s available and where to go. It seems to have cemented itself as an important part of web design. Wireframing toolkits and programs include navigation bars, just like they include dummy text and buttons.</p> <p>Navigation bars are presented in many different ways. Lately, sticky navbars have become very popular. Unlike the proposed effort, this nav bar is always present on the page. However, sticky bars are usually used in sites with heavy parallax scrolling (another huge trend). This can end up being a bit distracting, especially when it takes up a horizontal area at the top of a page.</p> <p>It’s hard to argue the effectiveness of navigation bars. As a matter of fact, I won’t. They are effective and are the norm in web design right now. But, is there a better way to present our menus that could possibly change the entire way we think about web design? I believe so, and this way to change web design is to get rid of the navigation bar all together. But why?</p> <p> </p> <h1>3 reasons to stop using navigation bars</h1> <h2>1. Fewer distractions</h2> <p>This is something I’ve touched on previously, but with the absence of navigation bars, there’s obviously fewer distractions. Navigation bars have become a place to store all the content you can’t fit on your website. On top of that, we put every single page we’ve imagined and come up with on the navigation bar. Some are junky and cluttered. Some have telephone numbers and search boxes. Some are just big and only have three small links on them. Some have drop-down menus that span the entire height of a website. What’s the point?</p> <p>In the past few years we’ve come to notice that web design was becoming a little too cluttered, thus the resurgence of the ever-popular minimalist design. But instead of really fixing the problem of clutter, we’ve just stripped our web designs of the exciting stuff. In addition, the focus on the menu and the sitemap have really cost us the most important parts of the website. Immediately when we start designing, we are taught to think of the sitemap and how everything is going to connect. Imagine if we spent that time thinking about what the audience wants and how they’re going to use it. </p> <h2>2. Customer Focus</h2> <p>At one point, I posed the question of whether or not flat design has made our web sites too simple. I’ve also asked other community members if they think minimalism is killing our creativity. I’ll spare you the lengthy read and summarize by saying this: we’ve traded in spectacular design for subtle web experiences. What do I mean? We’d rather have a simple blog with a white background, as long as the posts auto-scroll. We’d rather use a monotone or two-tone color scheme and make the highlight color something totally expected. Because we think that’s cool.</p> <p>Now, I must admit that we must be weary of over-designing. It’s something I don’t recommend at all. But it seems like we just stopped designing all together. And the things we find to be <em>good</em> design are really only things other designers can notice and enjoy. It took me about 5 years to learn the lesson that what a designer may think will look good isn’t always what the customer thinks looks good.</p> <p>In order to be successful with this, we have to focus on the customer/audience like never before. We have to try to figure out exactly what they want to see and how they want to see it. Navigation bars have kind of been like a guided process before, but since they’re the norm we’re just slapping it on a site as one-size-fits-all. The focus on the customer creates a greater connection with them and lends itself to experience driven designs like never seen before.</p> <h2>3. Experience driven designs</h2> <p>Let’s build a bridge. This bridge connects what we want them to see along with how we want them to see it. The length of the bridge varies depending on how far away the two are from each other, but there must be a bridge nonetheless. We obviously want to have the smoothest bridge possible so the transfer of information can be as smooth as possible. By ridding ourselves of the navigation bar, we’ve created a platform to have a fully immersive brand design that should cater directly to the customer.</p> <p>This allows us to now create experiences. Yes, we’ll probably have to get away from the world of strict minimalism. However, this gets web design back to what it should be; a space on the web dedicated to the relationship between a brand and its customer. These experiences should make visitors more away of the brand while also creating an interesting way to do so. Rather than just clicking a link and being taken to a whole new page, now there’s an opportunity to really create something. There’s an opportunity to take all the cool new advances in HTML and CSS3 (aside from just scrolling) and create something magical and mindblowing.</p> <p> </p> <h1>Conclusion</h1> <p>Without that pesky bar at the top of our pages, it really frees up a whole new world of thought. I’m sure you’re thinking, well if you move and it’s hidden, then there’s really no difference. But we are essentially taking away the very thing that moves viewers from page to page. How does one design a website like that? How does one manoeuver around a website like that? It seems impossible and as if removing a bar couldn’t have such a large impact, but I beg to differ. You can check any scrolling site that makes no large use of navigation.</p> <p>Is this the next thing in the world of web design? Can you imagine going to a website that has no visible menu, but knowing where you want to go? It seems like a mighty interesting challenge; one many will take. Of course, the first problem would be for sites that are heavy on pages: Does your flyout menu contain tons of links or do you just learn to condense all the content? No navigation bars could really change the way of web design, but only the future can tell if this will be a new trend.</p> <p> </p> <p><em><strong>Have you built a site without a traditional navigation bar? Do you think navigation bars are essential in website design? Let us know in the comments.</strong></em></p> <p><em>Featured image/thumbnail, <a href="http://www.shutterstock.com/pic-57506431/stock-photo-milestone-against-blue-sky.html" rel="nofollow external" class="bo">navigation image</a> via Shutterstock.</em></p> <p><br><br> </p>
    <table width="100%"> <tbody>
    <tr> <td> <a href="http://www.mightydeals.com/deal/gt3themes-bootstrap-templates.html?ref=inwidget" rel="nofollow external" class="bo"><strong>Bundle of One-Page Parallax Bootstrap 3.0 Templates – only $17!</strong></a> </td> <td> <a href="http://www.mightydeals.com/?ref=inwidget" rel="nofollow external" class="bo"><br> <img src="http://mightydeals.com/web/images/widget-logo.png" height="40" width="90" alt="3 reasons we should stop using navigation bars" style="max-width: 100%; height: auto;"><br> </a> </td> </tr> </tbody>
    </table> <p><br> </p> <a href="http://www.webdesignerdepot.com/2014/01/3-reasons-we-should-stop-using-navigation-bars/" rel="nofollow external" class="bo">Source</a> <br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.webdesignerdepot.com%2F2014%2F01%2F3-reasons-we-should-stop-using-navigation-bars%2F&amp;t=3+reasons+we+should+stop+using+navigation+bars" 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.webdesignerdepot.com%2F2014%2F01%2F3-reasons-we-should-stop-using-navigation-bars%2F&amp;t=3+reasons+we+should+stop+using+navigation+bars" 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.webdesignerdepot.com%2F2014%2F01%2F3-reasons-we-should-stop-using-navigation-bars%2F&amp;t=3+reasons+we+should+stop+using+navigation+bars" 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.webdesignerdepot.com%2F2014%2F01%2F3-reasons-we-should-stop-using-navigation-bars%2F&amp;t=3+reasons+we+should+stop+using+navigation+bars" 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.webdesignerdepot.com%2F2014%2F01%2F3-reasons-we-should-stop-using-navigation-bars%2F&amp;t=3+reasons+we+should+stop+using+navigation+bars" 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/186529183581/u/49/f/661066/c/35285/s/361d6d96/sc/4/rc/1/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186529183581/u/49/f/661066/c/35285/s/361d6d96/sc/4/rc/1/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/186529183581/u/49/f/661066/c/35285/s/361d6d96/sc/4/rc/2/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186529183581/u/49/f/661066/c/35285/s/361d6d96/sc/4/rc/2/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/186529183581/u/49/f/661066/c/35285/s/361d6d96/sc/4/rc/3/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186529183581/u/49/f/661066/c/35285/s/361d6d96/sc/4/rc/3/rc.img" style="max-width: 100%; height: auto;"></a><br><br><a href="http://da.feedsportal.com/r/186529183581/u/49/f/661066/c/35285/s/361d6d96/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/186529183581/u/49/f/661066/c/35285/s/361d6d96/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>If you’re anything like me, you spend a lot of time studying other designers’ work. I like to look at projects for the experience and the interactions created for the users.   Obviously, as more...</Summary>
<Website>http://rss.feedsportal.com/c/35285/f/661066/s/361d6d96/sc/4/l/0L0Swebdesignerdepot0N0C20A140C0A10C30Ereasons0Ewe0Eshould0Estop0Eusing0Enavigation0Ebars0C/story01.htm</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40407/guest@my.umbc.edu/3cfc7ed5fce06e7cfba11075606e57ac/api/pixel</TrackingUrl>
<Tag>art</Tag>
<Tag>css</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>html5</Tag>
<Tag>illustrator</Tag>
<Tag>javascript</Tag>
<Tag>mobile-navigation</Tag>
<Tag>mysql</Tag>
<Tag>nav-bars</Tag>
<Tag>navigation</Tag>
<Tag>navigation-bars</Tag>
<Tag>navigation-best-practices</Tag>
<Tag>oracle</Tag>
<Tag>photoshop</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>web-design</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>Mon, 20 Jan 2014 03:15:24 -0500</PostedAt>
<EditAt>Mon, 20 Jan 2014 03:15:24 -0500</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="40405" important="false" status="posted" url="https://my3.my.umbc.edu/posts/40405">
<Title>The Rise and Fall of Basketball Diplomacy</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>               <img alt="" width="259" height="194" style="max-width: 100%; height: auto;"></p>
    <p>Sports, we like to believe, remains the one true unifier. If we can’t bridge differences in politics, religion, or nationality, we can at least enjoy the pure spirit of competition together.</p>
    <p>Or in the case of Dennis Rodman, his over use of this spirit might have<a href="http://sports.yahoo.com/news/apnewsbreak-rodman-checks-rehab-center-001552085--nba.html;_ylt=AwrSyCReBdxS43IAhjb_wgt." rel="nofollow external" class="bo"> sent him into rehab.</a>            </p>
    <p>           This follows h<a href="http://www.thewire.com/global/2014/01/dennis-rodman-and-team-leave-north-korea/356936/" rel="nofollow external" class="bo">is recent stab at diplomacy via a basketball match between ex-NBA ballers and the North Korean national squad that failed in bizarre fashion.</a> The Hermit Kingdom and the USA, suffice it to say, are as opposed to each other as ever.</p>
    <p>               If anything, Rodman may have unwittingly hurt his own cause. <a href="http://www.thewire.com/global/2014/01/dennis-rodman-loses-it-during-cnn-interview-pyongyang/356764/" rel="nofollow external" class="bo">He drew ire from many by implying during a CNN interview that Kenneth Bae, a longtime American prisoner in North Korea, deserved his imprisonment</a>.</p>
    <p>               To be fair, it may not have all been Rodman’s fault that things went awry. <a href="http://edition.cnn.com/2013/12/31/world/asia/north-korea-kim-jong-un-speech/" rel="nofollow external" class="bo">It doesn’t help when the dictator you’re trying to help orders his own uncle’s execution</a> and the company financing your trip suddenly distances itself from the project.</p>
    <p>               Ill-conceived it may have been, at least Rodman took a shot at making the world a bit safer, right? That has to account for something.</p>
    <p>               And who knows: perhaps this really has nothing to do with peace with a hostile regime? <a href="http://blog.foreignpolicy.com/posts/2014/01/08/a_theory_for_why_rodman_loves_kim_theyre_both_miserable_loners#sthash.BP8MdLaL.J98QN7XZ.dpbs" rel="nofollow external" class="bo">Maybe this is really just a tale of two odd-balls finding unlikely camaraderie–with one another</a>.</p>
    </div>
]]>
</Body>
<Summary>                  Sports, we like to believe, remains the one true unifier. If we can’t bridge differences in politics, religion, or nationality, we can at least enjoy the pure spirit of...</Summary>
<Website>http://usdemocrazy.net/the-rise-and-fall-of-basketball-diplomacy/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/40405/guest@my.umbc.edu/8bbf69fadf900cb35b99f491e43b5465/api/pixel</TrackingUrl>
<Tag>current</Tag>
<Tag>democracy</Tag>
<Tag>news</Tag>
<Tag>politics</Tag>
<Tag>uncategorized</Tag>
<Tag>us</Tag>
<Tag>usdemocrazy</Tag>
<Group token="retired-12">USDemocrazy</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-12</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/012/f0935e4cd5920aa6c7c996a5ee53a70f/xsmall.png?1279120129</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/012/f0935e4cd5920aa6c7c996a5ee53a70f/original.jpg?1279120129</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/012/f0935e4cd5920aa6c7c996a5ee53a70f/xxlarge.png?1279120129</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/012/f0935e4cd5920aa6c7c996a5ee53a70f/xlarge.png?1279120129</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/012/f0935e4cd5920aa6c7c996a5ee53a70f/large.png?1279120129</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/012/f0935e4cd5920aa6c7c996a5ee53a70f/medium.png?1279120129</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/012/f0935e4cd5920aa6c7c996a5ee53a70f/small.png?1279120129</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/012/f0935e4cd5920aa6c7c996a5ee53a70f/xsmall.png?1279120129</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/012/f0935e4cd5920aa6c7c996a5ee53a70f/xxsmall.png?1279120129</AvatarUrl>
<Sponsor>USDemocrazy</Sponsor>
<PawCount>11</PawCount>
<CommentCount>1</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 20 Jan 2014 00:28:09 -0500</PostedAt>
</NewsItem>

</News>
