<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Programmers Unlimited</title>
	<atom:link href="http://programmersunlimited.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://programmersunlimited.wordpress.com</link>
	<description>Knowledge is power</description>
	<lastBuildDate>Thu, 16 May 2013 17:18:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='programmersunlimited.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Programmers Unlimited</title>
		<link>http://programmersunlimited.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://programmersunlimited.wordpress.com/osd.xml" title="Programmers Unlimited" />
	<atom:link rel='hub' href='http://programmersunlimited.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Learn Ruby &amp; Rails in 2.5 hours, for FREE!</title>
		<link>http://programmersunlimited.wordpress.com/2013/05/15/learn-ruby-rails-in-2-5-hours-for-free/</link>
		<comments>http://programmersunlimited.wordpress.com/2013/05/15/learn-ruby-rails-in-2-5-hours-for-free/#comments</comments>
		<pubDate>Wed, 15 May 2013 23:14:11 +0000</pubDate>
		<dc:creator>programmersunlimited</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[RoR]]></category>
		<category><![CDATA[VB]]></category>
		<category><![CDATA[Pluralsight]]></category>

		<guid isPermaLink="false">http://programmersunlimited.wordpress.com/?p=580</guid>
		<description><![CDATA[I&#8217;ve been pretty busy in recent months, but I&#8217;ve finally released my Ruby on Rails course. This course is geared at existing .NET developers who want to see what Ruby &#38; Rails is like, but don&#8217;t want to invest the time to learn either. In this course, we go through just enough ruby to get [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=580&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://pluralsight.com/training/Courses/TableOfContents/ruby-rails-dotnet"><img class="alignleft" style="border:5px solid black;" alt="" src="http://s.pluralsight.com/mn/img/cs/lg/ruby-v1.png" width="125" height="125" border="0" /></a>I&#8217;ve been pretty busy in recent months, but I&#8217;ve finally released my Ruby on Rails course. This course is geared at existing .NET developers who want to see what Ruby &amp; Rails is like, but don&#8217;t want to invest the time to learn either. In this course, we go through just enough ruby to get you going and build a Rails applications as quickly as possible, with as little effort as we can get away with. You&#8217;ll leanr just enough to get yourself into trouble.</p>
<p>The best part is, I&#8217;ll let you check it out for free! For those who currently do not have a subscription to <a title="Ruby on Rails for .NET Developers" href="http://pluralsight.com/training/Courses/TableOfContents/ruby-rails-dotnet">Pluralsight</a>, I&#8217;ll give you a 1-week subscription so you can check out my Ruby on Rails course. Send me an email with your name, twitter and what you normally develop with and I&#8217;ll send back a subscription.</p>
<p>Send email to <a href="mailto:programmersunlimited@gmail.com">programmersunlimited@gmail.com</a></p>
<p>Supplies are limited though!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/programmersunlimited.wordpress.com/580/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/programmersunlimited.wordpress.com/580/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=580&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://programmersunlimited.wordpress.com/2013/05/15/learn-ruby-rails-in-2-5-hours-for-free/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c9e4d72e0a29be3bf43a6c8e0cbd656d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">programmersunlimited</media:title>
		</media:content>

		<media:content url="http://s.pluralsight.com/mn/img/cs/lg/ruby-v1.png" medium="image" />
	</item>
		<item>
		<title>Tips for working from home</title>
		<link>http://programmersunlimited.wordpress.com/2012/10/08/tips-for-working-from-home/</link>
		<comments>http://programmersunlimited.wordpress.com/2012/10/08/tips-for-working-from-home/#comments</comments>
		<pubDate>Mon, 08 Oct 2012 00:16:44 +0000</pubDate>
		<dc:creator>programmersunlimited</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://programmersunlimited.wordpress.com/?p=573</guid>
		<description><![CDATA[Last week was my first week at my new gig. I work from home full time now. I always hear developers saying they would love to work from home. Granted, it does have its advantages but it isn&#8217;t always as great as it seems to be. It isn&#8217;t like taking a day off from the [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=573&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Last week was my first week at my new gig. I work from home full time now. I always hear developers saying they would love to work from home. Granted, it does have its advantages but it isn&#8217;t always as great as it seems to be. It isn&#8217;t like taking a day off from the office to telecommute (usually I play xbox on these days). Working from home full time requires discipline. Not yet sure if I have it, but it seems to be going ok.</p>
<p>The following are a few tips I found that make things easier for me to work from home and stay disciplined.</p>
<h2>Leave for work (Mentally)</h2>
<p>When you work from home you have to separate your home life from work life. Even though your office/cubicle is now located in your home, you still have to check out of home mode when you start your shift. Kids, the wife and/or girlfriends should be made aware that even though you are physically accessible  you should be treated as if you&#8217;re not actually there. It can be hard, but eventually they will get it.</p>
<p>On the flip side, you must also remember that even though the xbox is only a few feet away in the other room, you&#8217;re at work and not at home. The exception to this is the kitchen :D</p>
<h2>Leave for work (Physically)</h2>
<p>Working from home doesn&#8217;t have to mean working from home. I recommend renting a small office space somewhere so that it&#8217;s easier to separate home and work life. This is especially beneficial to those with small homes or potentially disruptive households.</p>
<p>I have a pretty big house so space isn&#8217;t an issue for me. If you are lucky enough to have a spare bedroom or a den or any room that you can go into and close the door, then move your desk and computer in there and make it your office. Being able to physically isolate yourself will help keep you on track and less distracted.</p>
<p>Additional benefit is if you have kids and you also have to communicate with clients and/or co-workers. You can have a quiet place to conduct business.</p>
<h2>Make your space comfortable</h2>
<p>Just because you have a space of your own doesn&#8217;t mean it&#8217;s comfortable. You have to be in that space for 8 hours a day. Personally, I painted my office &#8220;Billiard Green&#8221; (a nice dark green), setup some soft lighting and rearranged my desk so I could see the entire room (not facing a wall). I moved all of my clutter into the closet and out of the way. I like low light settings so painting the walls a dark color and adding soft light options made a huge difference. It makes the room a place I want to be in.</p>
<p>Get a nice chair, get a nice desk, get some pictures or art or some of those fancy motivational posters and make your work space a place you want to spend all day in.</p>
<h2>Stay in one place</h2>
<p>This goes along with my previous tip. Make sure your space is comfortable so that you&#8217;re not tempted to go and work in your cozy bed or on the big Lazy Boy recliner in the living room. Stay in your space and don&#8217;t wander. If you need to &#8220;get out of the office&#8221; then go down to Starbucks and work there for a bit.</p>
<h2>Dress code</h2>
<p>WHAT?! Yeah, follow a dress code. Everyone jokes about working from home in their underwear. To help keep you focused and in the work mindset, dress like you would normally going into an office. I don&#8217;t allow shoes on the carpet, but I make an exception when I&#8217;m &#8220;at work&#8221;. I wear business casual clothes (or sometimes shorts), and I also wear my shoes. It&#8217;s really a mind trick. Make yourself feel comfortable, don&#8217;t wear a dress shirt and tie (unless you want to), but also don&#8217;t work in your boxers.</p>
<h2>Keep a regular schedule</h2>
<p>Just because you&#8217;re at home doesn&#8217;t mean you can&#8217;t/shouldn&#8217;t take breaks. Be sure to take regular breaks. Maybe two 15 minute breaks and an hour lunch or come up with a schedule that works for you.</p>
<p>When working from home it can be quite easy to fall into the habit of working more than you should. Overtime is fine if you have to get something done, but you should start at a regular time and end at a regular time as if you were in an actual office. No reason to over do it.</p>
<h2>Tools &amp; Communication</h2>
<p>Be sure you have to proper tools to do your job. If you need to fax then get a fax machine or a digital fax solution. You don&#8217;t want to disrupt your day because you have to run down to Staples to send a fax.</p>
<p>Unless you&#8217;re stuffing and licking envelopes, you probably will need to communicate via the internet. Make sure that you have quality service. I actually have been fighting with this. I got cable service when we moved in (don&#8217;t remember why). Since we only used it for web browsing and Netflix, if it went down it wasn&#8217;t a big deal. Well last week I had to work from Starbucks because it went down. It would also go down periodically throughout the day too. It makes for a very annoying work experience, especially since people need to communicate with me and it&#8217;s how I do my job. I called and ordered fiber internet and made sure it comes with a 99.99% up time. I also ordered phone service so that I had a land line. Cell service in my area is unreliable. I want to make sure I can do my job and get in touch with people when I need to.</p>
<h2>Quality-of-Service</h2>
<p>Being in a house with other people who also like to use the internet can cause some problems when they&#8217;re eating all of the bandwidth. Most routers support some level of QoS (Quality of Service). QoS basically tells the router that packets going to a certain address are &#8220;more important&#8221; and they get a higher priority. On my router I give my xbox highest priority (online gaming, Netflix) followed by my workstation. That way my Skype call gets priority over someone else watching YouTube.</p>
<h2>Conclusion</h2>
<p>These are the tips I have. Basically it boils down to making yourself comfortable but professional, and distraction free. When you go to work, go to work and forget that you&#8217;re home.</p>
<p>What tips do you have? What helps you work from home?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/programmersunlimited.wordpress.com/573/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/programmersunlimited.wordpress.com/573/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=573&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://programmersunlimited.wordpress.com/2012/10/08/tips-for-working-from-home/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c9e4d72e0a29be3bf43a6c8e0cbd656d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">programmersunlimited</media:title>
		</media:content>
	</item>
		<item>
		<title>Dear employers&#8230;</title>
		<link>http://programmersunlimited.wordpress.com/2012/10/04/dear-employers/</link>
		<comments>http://programmersunlimited.wordpress.com/2012/10/04/dear-employers/#comments</comments>
		<pubDate>Thu, 04 Oct 2012 23:53:08 +0000</pubDate>
		<dc:creator>programmersunlimited</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://programmersunlimited.wordpress.com/?p=570</guid>
		<description><![CDATA[It&#8217;s the year twenty thousand and twelve. It&#8217;s 62 years since 1950 and 22 years since 1990. Get with the program! Technology has exploded and advanced and so have mindsets. My generation and those who come after me are not ok with working conditions like previous generations were. We are skilled and talented and when [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=570&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>It&#8217;s the year twenty thousand and twelve. It&#8217;s 62 years since 1950 and 22 years since 1990. Get with the program! Technology has exploded and advanced and so have mindsets. My generation and those who come after me are not ok with working conditions like previous generations were. We are skilled and talented and when you let us be, we&#8217;re highly productive too! But as employers, especially those of you who are big corporations that have been around since forever, have yet to realize that you are holding yourselves back by trying to put boundaries around us and treat us like employees of yesteryear.</p>
<p>What the heck am I talking about? Change, man! Technology grows at unprecedented speeds and it isn&#8217;t just some fancy word that will be gone tomorrow. It&#8217;s here and it&#8217;s how you will compete and survive. Learn to use it! Learn to use it properly! Spend the money where it needs to be spent, don&#8217;t cheap out! This includes getting (and keeping) good talent. Once you get the skill sets you need, let them do their job! Stay out of the damn way and don&#8217;t let the bureaucracy hinder progress and productivity.</p>
<p>Now, you must also understand that once you get your talented people and they are all working happily, that you must try to keep them. It isn&#8217;t like it used to be where lower employees kissed up to management to make sure they kept their jobs. We have skills that are sought after and the roles are reversed. We treat employment like the stock market and your company is simply something we hold as long as it suits our goals. When it starts to go sour, we&#8217;ll dump it and pickup another one that looks promising. We&#8217;ll keep doing this until we find the one that will take us where we want to go. We&#8217;re ambitious and we don&#8217;t want to spend 40 years doing the same thing over and over again. We don&#8217;t want to pay dues to earn a retirement.</p>
<p>We want to work for fast moving start ups and we want to work hard to help it succeed. Want to know why? Because there&#8217;s usually freedom, growth and excitement! They want talent and they find it, use it appropriately and reward it accordingly. What are your employees excited about?</p>
<p>Now, I know you&#8217;re still confused. So I&#8217;ll sum it up: You should do everything you can to make sure your employees are happy and their needs are met. You think that you can throw money at us and we&#8217;ll settle down. That doesn&#8217;t work anymore. If it does work, it&#8217;s only a band-aid. We want to work from home (or Starbucks), we want to be comfortable while we work (clothes, music, work space), we want flexible work schedules. There&#8217;s no reason why we can&#8217;t have any of these. It doesn&#8217;t hurt productivity at all.</p>
<p>Realize that we&#8217;re all different in our own ways and you can&#8217;t force us into changing just because you have a CEO that&#8217;s 80 years old and he still thinks it&#8217;s the 50&#8242;s. Learn to utilize us in the way you need without restricting us to a point where you get nothing.</p>
<p>Do I speak for everyone? Nope. There are those who want to do the bare minimum and not make waves. There are those who will do what ever you want to make sure they get their pay check. Is that what you really want though? Something to think about.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/programmersunlimited.wordpress.com/570/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/programmersunlimited.wordpress.com/570/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=570&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://programmersunlimited.wordpress.com/2012/10/04/dear-employers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c9e4d72e0a29be3bf43a6c8e0cbd656d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">programmersunlimited</media:title>
		</media:content>
	</item>
		<item>
		<title>Standards &amp; Best Practices &#8211; Creating Consistency</title>
		<link>http://programmersunlimited.wordpress.com/2012/09/04/standards-best-practices-creating-consistency/</link>
		<comments>http://programmersunlimited.wordpress.com/2012/09/04/standards-best-practices-creating-consistency/#comments</comments>
		<pubDate>Tue, 04 Sep 2012 17:48:23 +0000</pubDate>
		<dc:creator>programmersunlimited</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Standards]]></category>

		<guid isPermaLink="false">http://programmersunlimited.wordpress.com/?p=549</guid>
		<description><![CDATA[Disclaimer: You and your team may not suffer from the issues described here. If not, hats off to you! The following recommendations are just that, recommendations. They are techniques I&#8217;ve used and they worked. Use them as I describe or as a template to for you own solutions. It isn&#8217;t about being right or wrong, [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=549&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><em><strong>Disclaimer</strong>: You and your team may not suffer from the issues described here. If not, hats off to you! The following recommendations are just that, recommendations. They are techniques I&#8217;ve used and they worked. Use them as I describe or as a template to for you own solutions. It isn&#8217;t about being right or wrong, but being consistent. If you have a well functioning team, I&#8217;d love to hear about how you do it so please write me.</em></p>
<p>This is the first post in a series of unknown length. Even though I do have a structured document that I deliver to my teams, I don&#8217;t plan on following any specific path with these posts. The topics will most likely jump from post to post as I see fit.</p>
<p>In this post I want to talk about consistency. Every company I&#8217;ve been to has had this same exact problem. Development teams are fragmented (e.g. skill level, understanding of concepts/technologies).  The two biggest issues I see with dev teams have are with vocabulary and tooling. Everyone has their own definition of what a &#8216;Model&#8217; is and each one has their own favorite ORM.</p>
<h2>Vocabulary</h2>
<p>This might seem silly. It might sound outright stupid but it&#8217;s a common problem and it&#8217;s also a productivity killer and cause of code related problems. Even I have been a victim of this. I was discussing a problem and potential solution with a team member. We were going in a loop and getting no where except frustrated. I was about to just give up and walk away when I realized something. He was talking about the same thing I was, except he was using a different term. I asked him to define his term and the definition he gave me was the same definition for the term I was using. Had we both used the same term with the same meaning behind it, we would have come to an agreement and saved 30 minutes of frustration. The argument may as well have been,</p>
<p>&#8220;I agree!&#8221;<br />
&#8220;No, I agree!&#8221;<br />
&#8220;Nuh uh, I agree!&#8221;</p>
<p>Another issue with vocabulary is management!!! They love to use words they think they understand but really don&#8217;t. This leads to confusion all around, with us and them. It&#8217;s a lose-lose situation.</p>
<h3>How to standardize</h3>
<p>Create a list of terms and their definitions. Pass it around to the team and have them review it, discuss it and make changes/additions based on feedback. The key here is not for technical accuracy, only to bring everyone up to the same understanding so that there is no longer a language barrier. Once everyone agrees on which terms mean what, stick to them!</p>
<p>You will need two (or more) lists:</p>
<p>1. Generic development terms. For example, the list might include technology stack specific terms like Model, View Model, Entity, etc. Be sure to define acronyms as well, &#8220;DTO, MVC, MVP&#8221;. Make the judgement based on your team, but don&#8217;t assume that just because you&#8217;re all seniors that everyone understands what a DTO is.</p>
<p>One big problem I deal with when it comes to management is that they don&#8217;t use the correct terms for the deployment process. They consider QA the same as Dev, and UAT the same as Staging. It causes so much confusion all around for all teams.</p>
<p>2. Project specific terms. For example, if you&#8217;re building an invoicing system, you will want to define terms like Quote, Order, Purchase Order and so forth. Building this list of much like building a Domain Specific Language. It&#8217;s especially important when there are industry specific terms that might not be known to everyone.</p>
<p>Recently I was talking to my team about a project. We were talking about a Coupon. The problem was a coupon can be digital and/or paper based. But no one was in agreement on if a digital coupon and a paper coupon should be treated as a single coupon with different states or if they should be treated as different types. Some treated as a state and others as a distinct type and the end result was a nightmare. Workflows were not compatible, nor was persistence. Had &#8220;Coupon&#8221; been defined before hand, we could have avoided arguments and code rewrites.</p>
<p>Be sure you define not only what a term CAN be but also what a term CAN NOT be.</p>
<p>Standardizing common and uncommon terms will improve communication and can be shared with management and stake holders alike. It also makes developer on-boarding easier.</p>
<h2>Tooling</h2>
<p>No matter what problem you&#8217;re trying to solve, there will be no lack of tooling. Developer A loves Entity Framework while Developer B came from a Java background and prefers nHibernate. Who is right and who is wrong? Neither! All tools have their pros and cons and I&#8217;ve seen projects fall on their face because the original developer wanted to use tool X and he was the only one who knew how to use it so the next developer comes in and says, &#8220;We have to rewrite! He used tool X and he was an idiot!&#8221;. Projects are bound to be late or fail in this scenario.</p>
<p>How many times have you gotten into an argument with a developer about which tool to use? It&#8217;s ridiculous! It&#8217;s one of the worst arguments you can have. It&#8217;s just a pissing match.</p>
<h3>How to standardize</h3>
<p>Define the type of projects that your company will work on (e.g. web, mobile, desktop, reporting, etc). Then for each problem area, create a category (e.g. Web front end, web back end, data access, caching), then list the tools that will be used to solve each problem area. Sometimes you&#8217;ll end up with two or more tools that fit the need and that&#8217;s fine. Be sure to specify which tool to use when.</p>
<p>Pass the list around, get team consensus and work out any disagreements. Of course, someone will have to be the final word to prevent the infinite loop of X vs Y. Once the list is completed, enforce it!</p>
<p>Getting everyone on board with the tooling will reduce or eliminate the pointless arguments and will again help developer on-boarding. It also provides additional benefits to management because they can use it as part of the requirements when hiring new developers. My current company like to know what developers are using and the licensing involved along with costs.</p>
<h2>Conclusion</h2>
<p>The goal here is to start standardizing areas where developers like to squabble among each other to no end. Vocabulary and tooling are just the start. Standardization of processes (e.g., source control, deployment, documentation) would be the next step in getting consistency among the team(s).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/programmersunlimited.wordpress.com/549/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/programmersunlimited.wordpress.com/549/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=549&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://programmersunlimited.wordpress.com/2012/09/04/standards-best-practices-creating-consistency/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c9e4d72e0a29be3bf43a6c8e0cbd656d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">programmersunlimited</media:title>
		</media:content>
	</item>
		<item>
		<title>Alternative to Captcha</title>
		<link>http://programmersunlimited.wordpress.com/2012/08/29/alternative-to-captcha/</link>
		<comments>http://programmersunlimited.wordpress.com/2012/08/29/alternative-to-captcha/#comments</comments>
		<pubDate>Wed, 29 Aug 2012 17:11:32 +0000</pubDate>
		<dc:creator>programmersunlimited</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[forms]]></category>
		<category><![CDATA[validation]]></category>

		<guid isPermaLink="false">http://programmersunlimited.wordpress.com/?p=536</guid>
		<description><![CDATA[In a recent meeting with stake holders, they were concerned about bots auto filling a registration form. The obvious answer that came up was to add a Captcha. The response was something along the lines of a groan + gurgling sound, or in real words, a disapproval. Captchas are more often than not complicated and they are always a [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=536&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>In a recent meeting with stake holders, they were concerned about bots auto filling a registration form. The obvious answer that came up was to add a <a title="What is a Captcha" href="http://en.wikipedia.org/wiki/CAPTCHA">Captcha</a>. The response was something along the lines of a groan + gurgling sound, or in real words, a disapproval. Captchas are more often than not complicated and they are always a PITA!</p>
<p>A long time ago I had to solve this problem and came up with an alternative to using a captcha. So I suggested my solution and it was well received.</p>
<p>The idea is that we want to protect from bots automatically filling out a form and submitting data but also to not bother the user with squiggles and unreadable images. Especially since the target audience is less than tech savvy and most will be older users.</p>
<p>It&#8217;s common for bots find fields with common names such as FirstName, Phone, Email, etc. by parsing the HTML or some how working with the DOM. There is no reason that we as developers have to use those names when building our forms though.</p>
<p>The idea is to add a field armed with a common ID such as &#8216;FirstName&#8217;, but it won&#8217;t be used for input. In fact, it isn&#8217;t even shown to the user. Theoretically, a bot auto populating the form will enter a value thinking it&#8217;s a FirstName field. On form submission, we can test the field for a value and if it has one, then obviously the form wasn&#8217;t filled out by a user.</p>
<p>Example form:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;form&gt;
        &lt;input name=&quot;FirstName&quot; style=&quot;display: none&quot; /&gt;
        First Name: &lt;input name=&quot;XYZ&quot; /&gt;
        Last Name: &lt;input name=&quot;LastName&quot; /&gt;
        &lt;button type=&quot;submit&quot; &gt;&lt;/button&gt;
 &lt;/form&gt;
</pre>
<p>You can modify this a bit to fit your needs of course. This was just a simple example. Now user aren&#8217;t bothered with captchas and it will prevent [most] automated form submissions.</p>
<p><strong>Cons:</strong></p>
<ul>
<li>Not all bots work in the way described</li>
<li>Can be worked around without too much effort</li>
<li>Legitimate automated form population tools may fill in the field causing a false positive</li>
<li>May cause issues with screen readers</li>
</ul>
<p>A modification to this is the check the field value on the client side and if necessary, require explicit verification (which should include a friendly message to the user). This helps the false positives from preventing legitimate users from continuing.</p>
<p>It isn&#8217;t fool proof, but it is an easy alternative to confusing captchas. Other alternatives include asking the user a question and requiring them to enter an answer such as, &#8220;What is 2+2&#8243;.</p>
<p>The point here is to think in terms of automation and how it would work against you, then simply side stepping it instead of building a giant fortress wall.</p>
<p>What do you think? Do you have any captcha alternatives that you&#8217;ve used? What are they, how do they work and what was the success rate?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/programmersunlimited.wordpress.com/536/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/programmersunlimited.wordpress.com/536/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=536&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://programmersunlimited.wordpress.com/2012/08/29/alternative-to-captcha/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c9e4d72e0a29be3bf43a6c8e0cbd656d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">programmersunlimited</media:title>
		</media:content>
	</item>
		<item>
		<title>Building extensible applications with MEF</title>
		<link>http://programmersunlimited.wordpress.com/2012/08/02/building-extensible-applications-with-mef/</link>
		<comments>http://programmersunlimited.wordpress.com/2012/08/02/building-extensible-applications-with-mef/#comments</comments>
		<pubDate>Thu, 02 Aug 2012 17:51:27 +0000</pubDate>
		<dc:creator>programmersunlimited</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[MEF]]></category>

		<guid isPermaLink="false">http://programmersunlimited.wordpress.com/?p=532</guid>
		<description><![CDATA[My new course on Managed Extensibility Framework has been released. If you want to learn MEF, give it a try. Don&#8217;t have a Pluralsight subscription? Let me know and I&#8217;ll help you out. BTW: I&#8217;d appreciate any feedback you have. If it sucks, let me know (but include a reason).  If you don&#8217;t tell me it [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=532&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>My new course on Managed Extensibility Framework has been released. If you want to learn MEF, give it a try. Don&#8217;t have a Pluralsight subscription? Let me know and I&#8217;ll help you out.</p>
<p>BTW: I&#8217;d appreciate any feedback you have. If it sucks, let me know (but include a reason).  If you don&#8217;t tell me it sucks, then it&#8217;s your fault I keep sucking :D</p>
<p><img class="alignleft" title="Learn MEF" src="http://s.pluralsight.com/mn/img/cs/lg/software-practices-v2.png" alt="Learn MEF" width="125" height="125" /><a href="http://www.pluralsight-training.net/microsoft/Courses/TableOfContents/mef"><strong>Building Extensible Applications with MEF</strong></a><br />
Managed Extensibility Framework is Microsoft&#8217;s answer to the extensibility problem. This course dives into MEF, its mechanics and how MEF can be used to build flexible, pluggable applications.</p>
<p><a href="http://www.pluralsight-training.net/microsoft/Courses/TableOfContents/mef">http://www.pluralsight-training.net/microsoft/Courses/TableOfContents/mef</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/programmersunlimited.wordpress.com/532/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/programmersunlimited.wordpress.com/532/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=532&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://programmersunlimited.wordpress.com/2012/08/02/building-extensible-applications-with-mef/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c9e4d72e0a29be3bf43a6c8e0cbd656d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">programmersunlimited</media:title>
		</media:content>

		<media:content url="http://s.pluralsight.com/mn/img/cs/lg/software-practices-v2.png" medium="image">
			<media:title type="html">Learn MEF</media:title>
		</media:content>
	</item>
		<item>
		<title>Development Standards &amp; Best Practices &#8211; Introduction</title>
		<link>http://programmersunlimited.wordpress.com/2012/08/01/development-standards-best-practices-introduction/</link>
		<comments>http://programmersunlimited.wordpress.com/2012/08/01/development-standards-best-practices-introduction/#comments</comments>
		<pubDate>Wed, 01 Aug 2012 15:32:32 +0000</pubDate>
		<dc:creator>programmersunlimited</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://programmersunlimited.wordpress.com/?p=527</guid>
		<description><![CDATA[In the last three companies in which I&#8217;ve held position, I&#8217;ve not once seen any consistency across the development team. Each time I&#8217;ve started a new position, I came with the presumption that the &#8220;team&#8221; was on track and had their stuff together and I was always ready to learn something new. Nope. Teams have [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=527&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>In the last three companies in which I&#8217;ve held position, I&#8217;ve not once seen any consistency across the development team. Each time I&#8217;ve started a new position, I came with the presumption that the &#8220;team&#8221; was on track and had their stuff together and I was always ready to learn something new. Nope. Teams have been disorganized, fragmented and mismanaged. Apparently this is a common theme. I&#8217;ve actually only seen one team (small, five people) who actually had their stuff together, but that was because they were employing a radical technique (which I found intriguing btw).</p>
<p>My current position is no different. It&#8217;s like the wild west and everyone has their own homemade guns and law books. Thankfully there is awareness by upper management that something had to be done to rein in on these cowboys. So when I came on, I proposed standards and best practices policies and training. They were all for it and I had my management buy-in!</p>
<p>Development is like driving. Everyone has their own style of driving; some drive fast and some drive slow. Some don&#8217;t use their friggin&#8217; blinkers and some do. But, as drivers, we all have a set of rules we have to follow that were set forth by an authority. When you get in your car and head to work, you know that you have to drive on a certain side of the road. You know that you have to stop at a stop sign and speed up when the light turns yellow (just kidding). We all follow these rules and it makes for a consistent driving experience that allows everyone to arrive at their destination safely and consistently.</p>
<p>When you go to another city/state/province/whatever, you don&#8217;t have to relearn any rules. You know that you have to still drive on a specific side of the road. As developers, the on-boarding process can be excruciating trying to learn how other developers work, think and write code. Usually it&#8217;s painful because you either have to lower your standards to work with less skilled developers or you realize that you&#8217;ve been writing junk this whole time.</p>
<p>What I&#8217;ve proposed for the dev teams here is a set of standards that apply to a wide range of topics. Some of them are industry best practices or at least de facto best practices. Some common sense, and some are just the way I think would be best for this environment. After a three hour training session, the material was actually well received and it opened some eyes. Some developers were excited to be learning and some were the equivalent of grumpy old men who refuse to learn how to work an iPod. But it doesn&#8217;t matter. Everyone had a chance to give input and shape the way things are done.</p>
<p>Because of the acceptance of the material by this diverse team and the realization that so many other dev teams suffer from the same ailments, I&#8217;m going to be doing a blog series on the material I created for standards and best practices. I&#8217;ll cover topics ranging from code, check-in policies and how to divide the team up into specific roles.</p>
<p>I&#8217;m probably going to be ridiculed on somethings, but that&#8217;s ok because I&#8217;m always willing to learn. You can choose to accept the material or ignore it. But at least it&#8217;s out there for teams to get a hold of. It&#8217;s working here so it can work somewhere else.</p>
<p>If your team is super awesome, I&#8217;d love to talk with you/them and get input and insight to how things are ran there. Otherwise, use the content in the forth coming posts as a template.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/programmersunlimited.wordpress.com/527/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/programmersunlimited.wordpress.com/527/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=527&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://programmersunlimited.wordpress.com/2012/08/01/development-standards-best-practices-introduction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c9e4d72e0a29be3bf43a6c8e0cbd656d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">programmersunlimited</media:title>
		</media:content>
	</item>
		<item>
		<title>Introducing ConnectionString Manager</title>
		<link>http://programmersunlimited.wordpress.com/2012/05/16/introducing-connectionstring-manager/</link>
		<comments>http://programmersunlimited.wordpress.com/2012/05/16/introducing-connectionstring-manager/#comments</comments>
		<pubDate>Wed, 16 May 2012 03:45:53 +0000</pubDate>
		<dc:creator>programmersunlimited</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">https://programmersunlimited.wordpress.com/?p=522</guid>
		<description><![CDATA[I have just release my latest Visual Studio Extension, ConnectionString Manager. Find it in the Visual Studio Gallery. http://visualstudiogallery.msdn.microsoft.com/78c6d440-7a65-4ce3-af99-7e8f8e0676dc What is it? ConnectionString Manager is a tool that allows developers to manage all connection strings in a solution from a centralized location. Features There are quite a few features that I’ve added to this extension [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=522&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I have just release my latest Visual Studio Extension, <a href="http://visualstudiogallery.msdn.microsoft.com/78c6d440-7a65-4ce3-af99-7e8f8e0676dc">ConnectionString Manager</a>. Find it in the Visual Studio Gallery. <a href="http://visualstudiogallery.msdn.microsoft.com/78c6d440-7a65-4ce3-af99-7e8f8e0676dc">http://visualstudiogallery.msdn.microsoft.com/78c6d440-7a65-4ce3-af99-7e8f8e0676dc</a></p>
<h1>What is it?</h1>
<p><a href="http://visualstudiogallery.msdn.microsoft.com/78c6d440-7a65-4ce3-af99-7e8f8e0676dc">ConnectionString Manager</a> is a tool that allows developers to manage all connection strings in a solution from a centralized location.</p>
<h1>Features</h1>
<p>There are quite a few features that I’ve added to this extension</p>
<p><strong><span style="text-decoration:underline;">Quickly View all connection strings in a solution</span></strong><br />
When the extension is ran, it scans the entire solution and extracts all connection strings from the configuration files and displays the project, config file, connection name, connection string and the connectivity status.</p>
<p><a href="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="ConnectionStringManager" src="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_thumb.jpg?w=644&#038;h=345" alt="ConnectionStringManager" width="644" height="345" border="0" /></a></p>
<p><strong><span style="text-decoration:underline;">Test one or all connection strings</span></strong><br />
Quickly validate connection strings with a single click, without leaving Visual Studio. Testing can be done from almost any dialog.</p>
<p><a href="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_test.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="ConnectionStringManager_Test" src="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_test_thumb.jpg?w=644&#038;h=345" alt="ConnectionStringManager_Test" width="644" height="345" border="0" /></a></p>
<p><strong><span style="text-decoration:underline;">Quick open</span><br />
</strong>Quickly open the host configuration file for any connection string. No more hunting through solutions and projects to find the configs.</p>
<p><a href="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_quickopen.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="ConnectionStringManager_QuickOpen" src="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_quickopen_thumb.jpg?w=644&#038;h=268" alt="ConnectionStringManager_QuickOpen" width="644" height="268" border="0" /></a></p>
<p><strong><span style="text-decoration:underline;">Add, Edit, Remove connection strings</span></strong><br />
Add, edit and remove connections strings all from a centralized utility window. No more hunting for and jumping between config files to make edits.</p>
<p><a href="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_edit.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="ConnectionStringManager_Edit" src="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_edit_thumb.jpg?w=644&#038;h=345" alt="ConnectionStringManager_Edit" width="644" height="345" border="0" /></a></p>
<p><span style="text-decoration:underline;"><strong>Save connections for later</strong><br />
</span>With the saved connections feature, you can store common connection strings for use in other projects.</p>
<p><a href="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_saveforlater.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="ConnectionStringManager_SaveForLater" src="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_saveforlater_thumb.jpg?w=644&#038;h=345" alt="ConnectionStringManager_SaveForLater" width="644" height="345" border="0" /></a></p>
<p><span style="text-decoration:underline;"><strong>Swap connection strings</strong><br />
</span>Quickly change a connection string to a saved connection string quickly with the quick list</p>
<p><a href="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_swap.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="ConnectionStringManager_Swap" src="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_swap_thumb.jpg?w=644&#038;h=345" alt="ConnectionStringManager_Swap" width="644" height="345" border="0" /></a></p>
<p><strong><span style="text-decoration:underline;">Add multiple connection strings to multiple configs at once</span></strong><br />
New and saved connections can be added to many configuration files with just a few clicks. No more copy &amp; paste. Enter the new connection string data and/or select one or more saved connections, then choose which configs to write them to.</p>
<p><a href="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_addmultiple.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="ConnectionStringManager_AddMultiple" src="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_addmultiple_thumb.jpg?w=458&#038;h=484" alt="ConnectionStringManager_AddMultiple" width="458" height="484" border="0" /></a></p>
<h1>Why did I build this?</h1>
<p>Working on a medium sized project with a small team and an old version of TFS, we had some issues with connection strings being changed in the configs and no one knowing about it until runtime. We also have split config files to deal with. I decided to write this tool to reduce the time it takes to correct and test the connection strings since it had to be done over multiple projects.</p>
<p>I’d love to get your feedback on this extension. It’s free to everyone.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/programmersunlimited.wordpress.com/522/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/programmersunlimited.wordpress.com/522/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=522&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://programmersunlimited.wordpress.com/2012/05/16/introducing-connectionstring-manager/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c9e4d72e0a29be3bf43a6c8e0cbd656d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">programmersunlimited</media:title>
		</media:content>

		<media:content url="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_thumb.jpg" medium="image">
			<media:title type="html">ConnectionStringManager</media:title>
		</media:content>

		<media:content url="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_test_thumb.jpg" medium="image">
			<media:title type="html">ConnectionStringManager_Test</media:title>
		</media:content>

		<media:content url="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_quickopen_thumb.jpg" medium="image">
			<media:title type="html">ConnectionStringManager_QuickOpen</media:title>
		</media:content>

		<media:content url="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_edit_thumb.jpg" medium="image">
			<media:title type="html">ConnectionStringManager_Edit</media:title>
		</media:content>

		<media:content url="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_saveforlater_thumb.jpg" medium="image">
			<media:title type="html">ConnectionStringManager_SaveForLater</media:title>
		</media:content>

		<media:content url="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_swap_thumb.jpg" medium="image">
			<media:title type="html">ConnectionStringManager_Swap</media:title>
		</media:content>

		<media:content url="http://programmersunlimited.files.wordpress.com/2012/05/connectionstringmanager_addmultiple_thumb.jpg" medium="image">
			<media:title type="html">ConnectionStringManager_AddMultiple</media:title>
		</media:content>
	</item>
		<item>
		<title>Reducing latency with message queues</title>
		<link>http://programmersunlimited.wordpress.com/2012/04/11/reducing-latency-with-message-queues/</link>
		<comments>http://programmersunlimited.wordpress.com/2012/04/11/reducing-latency-with-message-queues/#comments</comments>
		<pubDate>Wed, 11 Apr 2012 19:48:55 +0000</pubDate>
		<dc:creator>programmersunlimited</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">https://programmersunlimited.wordpress.com/?p=492</guid>
		<description><![CDATA[While working for an internet marketing company I was tasked with reviewing an application for performance optimization opportunities. The goal was to reduce the latency of each web request. The application was nothing more than a tracking web site that was used to track clicks from PPC (pay-per-click) advertisements (e.x, AdWords). When a user clicked [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=492&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>While working for an internet marketing company I was tasked with reviewing an application for performance optimization opportunities. The goal was to reduce the latency of each web request. The application was nothing more than a tracking web site that was used to track clicks from PPC (pay-per-click) advertisements (e.x, AdWords). When a user clicked on an ad, they would be sent to the web app and then redirected to the final destination URL.</p>
<h2>Problem?</h2>
<p>It’s the same old story. The system started out fast and as time went on (read: as more data/traffic came in) the latency increased for each request. After adding five additional servers for load balancing, the latency didn’t improve.</p>
<p>The definition of slow was 80-100ms. The target was 20ms. After investigation, I found that the web app was writing the details of each request to a database. Not just any database though, the only database the company had. The same database that every other application relied on.</p>
<p>The concept of scalability was lacking.</p>
<p>Continuing my investigation, I ask the usual questions about the data that was being logged, how it’s used, how often and of course, how fresh does it have to be? The answers made it very clear on how I could meet the goal of 20ms. The data was stored in a table where it would be processed every hour by some other process, but only data from the previous hour would be handled. In summary the data did not need to be delivered in real time. It just needed to eventually get delivered.</p>
<h2>Solution!</h2>
<p>Since there was no way that I could optimize the database, or calls to it, I went ahead and decided to optimize the architecture of the web app instead.</p>
<p><a href="http://programmersunlimited.files.wordpress.com/2012/04/msgarch.jpg"><img title="MSGArch" src="http://programmersunlimited.files.wordpress.com/2012/04/msgarch.jpg?w=627&#038;h=114" alt="" width="627" height="114" /></a></p>
<p>Instead of sending the request details to the database one-by-one, they would now go into a message queue. MSMQ to be exact. Sending messages to a local queue is extremely fast and is very simple to implement.</p>
<pre class="brush: csharp; title: ; notranslate">
using System.Messaging;

namespace MSMQExample
{
    class Program
    {
        static void Main(string[] args)
        {
            var msg = new Message();
            msg.Body = &quot;Hello!&quot;;

            var queue = new MessageQueue(&quot;.\\Private$\\requestdata&quot;);
            queue.Send(msg);
        }
    }
}
</pre>
<p>To get the data into the database I built a worker application that would dequeue the messages and then perform a bulk insert into the database. Bulk inserts allow for a very large number of rows to be inserted in milliseconds compared to individual inserts.</p>
<p>Now each request to the web app would enqueue the request details and then redirect the user to their final destination. On a set schedule (every 15 minutes), the worker application would process the queued items and perform the database insert.</p>
<p>The end result? ~19ms. The web app was no longer hindered by the database and doing bulk inserts every 15 minutes eliminated unnecessary load on the database.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/programmersunlimited.wordpress.com/492/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/programmersunlimited.wordpress.com/492/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=492&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://programmersunlimited.wordpress.com/2012/04/11/reducing-latency-with-message-queues/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c9e4d72e0a29be3bf43a6c8e0cbd656d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">programmersunlimited</media:title>
		</media:content>

		<media:content url="http://programmersunlimited.files.wordpress.com/2012/04/msgarch.jpg" medium="image">
			<media:title type="html">MSGArch</media:title>
		</media:content>
	</item>
		<item>
		<title>Website optimization via static content</title>
		<link>http://programmersunlimited.wordpress.com/2012/03/23/website-optimization-via-static-content/</link>
		<comments>http://programmersunlimited.wordpress.com/2012/03/23/website-optimization-via-static-content/#comments</comments>
		<pubDate>Fri, 23 Mar 2012 22:03:27 +0000</pubDate>
		<dc:creator>programmersunlimited</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">https://programmersunlimited.wordpress.com/?p=459</guid>
		<description><![CDATA[Continuing my path along optimization posts, I thought I would write about a trick that I use to optimize website performance and help scalability by reducing resource consumption. I recently read a post about continuous cache warming techniques for Rails. Even though the author specifically states you shouldn’t use the techniques in production, I know [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=459&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Continuing my path along optimization posts, I thought I would write about a trick that I use to optimize website performance and help scalability by reducing resource consumption.</p>
<p>I recently read a post about continuous cache warming techniques for Rails. Even though the author specifically states you shouldn’t use the techniques in production, I know that there are developers who do. Sometimes we do crazy things for performance reasons. Cache warming is priming the cache; artificially hitting a resource to put it in cache or reset it’s expiration. But this is unnecessary and It defeats the purpose of cache expiration and can unnecessarily consume memory.</p>
<h2>Before we start&#8230;</h2>
<p>I really want to stress that while I&#8217;m discussing a specific technique, I want you to think about the concept behind it as it can be applied to other areas in different ways, not just web pages.</p>
<h2>The problem</h2>
<p>The problem is content, or at least the generation of content. Web pages can contain many different areas that are dynamically assembled when the page is requested. Often times when I&#8217;m evaluating a poorly performing web site I see areas of content that are generated far too often (sometimes on each request) while using resources like calls to a database to accomplish the task. I always have to ask the question, how often does the data change and how fresh does it actually have to be?</p>
<p>Examples of these types of areas are</p>
<ul>
<li>Latest comments</li>
<li>Poll results</li>
<li>Statistics</li>
<li>Trending topics</li>
</ul>
<p>Let’s evaluate the <a href="http://www.iedotnetug.org">Inland Empire .NET Users Group</a> website home page as an example.</p>
<p><a href="http://programmersunlimited.files.wordpress.com/2012/03/iednugsite.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="iednugsite" src="http://programmersunlimited.files.wordpress.com/2012/03/iednugsite_thumb.jpg?w=640&#038;h=421" alt="iednugsite" width="640" height="421" border="0" /></a></p>
<p>We’ll focus on only two areas of this page. The first area (red box) is the main content. This describes the next event and gives speaker details and other information. The second area (green box) shows a leaderboard for the Most Valuable Member program (yes, I’m currently leading at the time of this post).</p>
<p>Both areas get their data from a data store. On each page load both areas must make at least one request to query the data store and get the information to be displayed. So each page request will make multiple calls to the data store? Probably not. Mechanisms like page caching will prevent this by serving the previously rendered output of a page (or widget) from memory for each subsequent request thus by-passing any need to render the content again.</p>
<p>But what does this really mean? It could mean different things to different sites. With page caching, the rendered output will go into memory which is a limited resource. It also means that the request must still go through the ASP.NET pipeline. At some point the cache will be cleared. Either by expiration, need for more memory or from the app pool recycling. This means the page will need to be rendered again on the next request. For a page that changes very frequently this might be the desired process. Our example site changes once or twice a month so it isn&#8217;t optimal.</p>
<h2>Solution?</h2>
<p>A technique I use involves the file system. Yep, I generate actual .html files. Let’s take the leader board area of the example page. It’s nothing more than an unordered list in the end. It changes once a month. Why would I want to make calls to the database more than once a month when the results will be 100% the same? Why would I want to store a snippet of simple HTML in my limited memory when that content isn&#8217;t being requested? Why would I want a request for the leaderboard HTML to go through the ASP.NET pipeline? I don’t want to do any of those things for a piece of content that will more than likely be the same as the last time it was requested.</p>
<p>Caching the leaderboard HTML to an actual .html file accomplishes a few things. First, it saves the rendered html for later use so there is no need to rebuild it (i.e., no unnecessary calls to the data store). Second, it stores the rendered content outside of the memory. We&#8217;re safe from cache expiration and app pool recycles. Third, the content becomes a static resource which means it will be served by IIS using the StaticResource handler, which is blazingly fast, instead of going through the ASP.NET pipeline. Your setup may vary.</p>
<h2>When to build content</h2>
<p>The majority of the time I use schedules tasks to regenerate the content at set schedules based on the content and how fresh it has to be. Other times I will need a trigger to kick off the process. For triggers I tend to use message queues. The goal is to move the work outside of the web application, especially if the generation of content takes abnormal amounts of time.</p>
<p>I’m purposely being generic by not going into how to implement the technique because there are numerous ways and it depends on you, your team and you’re project. I’ve used server side includes and JQuery requests for calling content (and async loading) and T4 to generate content. I like to use scheduled tasks or cron jobs (when possible) to kick off scheduled builds and message queues like MSMQ for triggering a build.</p>
<h2>Is it right for me?</h2>
<p>Maybe. There are some things to consider first. Is the time to implement this technique worth the result? Bandwidth can be another concern. Depending on how the static HTML is requested (e.g., JQuery GET), you may run into bandwidth issues if the browser isn&#8217;t serving the request from cache. Another issue is content that changes based on parameters. You may not have access to the server to setup a scheduled job or a message based trigger system. Disk space can also become an issue.</p>
<p>Let me know your thoughts.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/programmersunlimited.wordpress.com/459/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/programmersunlimited.wordpress.com/459/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=programmersunlimited.wordpress.com&#038;blog=14241067&#038;post=459&#038;subd=programmersunlimited&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://programmersunlimited.wordpress.com/2012/03/23/website-optimization-via-static-content/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c9e4d72e0a29be3bf43a6c8e0cbd656d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">programmersunlimited</media:title>
		</media:content>

		<media:content url="http://programmersunlimited.files.wordpress.com/2012/03/iednugsite_thumb.jpg" medium="image">
			<media:title type="html">iednugsite</media:title>
		</media:content>
	</item>
	</channel>
</rss>
