<?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/"
	>

<channel>
	<title>RubyLearning Blog &#187; James Schorr</title>
	<atom:link href="http://rubylearning.com/blog/author/jamesschorr/feed/" rel="self" type="application/rss+xml" />
	<link>http://rubylearning.com/blog</link>
	<description>Helping Ruby Programmers become Awesome</description>
	<lastBuildDate>Tue, 24 Apr 2012 22:15:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>How Can We Develop For Tomorrow&#8217;s Needs?</title>
		<link>http://rubylearning.com/blog/2011/07/27/how-can-we-develop-for-tomorrows-needs/</link>
		<comments>http://rubylearning.com/blog/2011/07/27/how-can-we-develop-for-tomorrows-needs/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 02:42:31 +0000</pubDate>
		<dc:creator>James Schorr</dc:creator>
				<category><![CDATA[Beginners]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby Masters]]></category>
		<category><![CDATA[James M. Schorr]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://rubylearning.com/blog/?p=5838</guid>
		<description><![CDATA[How Can We Develop For Tomorrow&#8217;s Needs? This guest post is by James Schorr, who has been in IT for over 14 years and been developing software for over 11 years. He is the owner of an IT consulting company, Enspiren IT Consulting, LLC.  He lives with his lovely wife, Tara, and their children in [...]<p><a href="http://www.launchbit.com/az/113-209/"><img width="468" height="60" src="http://www.launchbit.com/az-images/113-209/" /></a><br />
<small>(Powered by <a href="http://www.launchbit.com/lb/113-209/">LaunchBit</a>)</small></p>
]]></description>
			<content:encoded><![CDATA[<p></p>
<div class="topsy_widget_data topsy_theme_brick-red" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Frubylearning.com%252Fblog%252F2011%252F07%252F27%252Fhow-can-we-develop-for-tomorrows-needs%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22How%20Can%20We%20Develop%20For%20Tomorrow%27s%20Needs%3F%22%20%7D);"></div>
<div>
<h3>How Can We Develop For Tomorrow&#8217;s Needs?</h3>
<p class="update">This guest post is by <strong>James Schorr</strong>, who has been in IT for over 14 years and been developing software for over 11 years. He is the owner of an IT consulting company, <a href="https://enspirenconsulting.com" target="_blank">Enspiren IT Consulting, LLC</a>.  He lives with his lovely wife, Tara, and their children in Kansas City, Missouri. James spends a lot of time writing code in many languages and a passion for Ruby on Rails in particular. He loves to play chess online at FICS (his handle is kerudzo) and to take his family on nature hikes. His professional profile is on <a href="http://www.linkedin.com/in/jamesschorr">LinkedIn</a>.</p>
<p class="block"><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;'  class="alignright" src="http://rubylearning.com/images/James_Schorr.png" alt="James M. Schorr" width="125" height="125" /> <span class="drop_cap">T</span>he average developer is often forced to get code out the door as quickly as possible, primarily due to unrealistic deadlines and budgets. As a result, the quality and future expandability of software is greatly harmed. Software is now used in medical machinery, our vehicles, power plants, stock markets, aircraft, weapons, etc&#8230; As software becomes more and more critical in our lives, the need to think long-term is becoming increasingly critical.</p>
<p>Obviously, the quickest way is almost always not the best way. I hope to give some practical steps to those involved in software development that will help in the development of stable, long-lasting software. A proper strategy session involving the below steps can help save a lot of wasted time and money.</p>
<p>Quality, future-resilient software is tough to define, but reveals itself when it does what it’s supposed to without unpleasant surprises, handles unpredictable user input and system issues in gracious, non-devastating ways, and, in general, makes the user’s life easier. The tough part is that user’s needs and systems change. How do we engineer for tomorrow’s needs?</p>
<p>The keys to successfully developing long-term software are:</p>
<p><strong>Establishing the Purpose</strong>: What is the point of the software? Do the needs that it are anticipated to be met look as though they will be the same core needs in the foreseeable future? In other words, will the main needs be met by this software and can we easily build out from there? If not, we need to keep the anticipated future needs in mind as we &#8220;scope&#8221; out the architecture of the project and provide &#8220;space&#8221; for them.</p>
<p><strong>Choosing the &#8220;Stack&#8221;</strong>: (what technologies, languages, etc&#8230; will be used). The stack should be chosen carefully, based upon:</p>
<ul>
<li><strong>proven stability</strong>. For example, it may be &#8220;cool&#8221; but unwise to write the software in the latest-and-greatest language. I&#8217;ve seen instances where a language/framework is chosen strictly due to its current popularity. This is typically a recipe for disaster, as those who go (and enjoy) that route typically move on to the next greatest thing, leaving code behind for non-fad-following developers to handle.</li>
<li><strong>current in-house knowledge</strong>. For instance, maybe our developers love and know Ruby, should we really force them to write an app in VB? Or perhaps it is a Microsoft-shop, are time and funds available to facilitate the learning-on-the-fly of non-MS technologies? I don’t believe that it is ever appropriate to write mission critical software using a language/framework that is unfamiliar to the developers. There are times, however, where the software is so mission-critical and matches a language’s abilities to the point where it makes sense to pull in new talent. It can be argued that software can be written in almost any language, that the language itself doesn’t matter much. But sometimes it really does, both in terms of expressiveness and developer satisfaction (note: I still contend that a happy developer is a good developer, or at least becoming one).</li>
<li><strong>infrastructure requirements</strong>. Do we have the hardware and network necessary to <em>decently</em> support the software and its anticipated usage? Disk space, memory requirements, OS, network speed, etc&#8230; All of these matter, a lot. It&#8217;s best to always plan for 2-3x the anticipated usage. For instance, for a web app, if we anticipate 1k users, let&#8217;s build for 2-3k users, with built-in monitoring of the resources being used and a plan of how to scale up quickly when we hit a &#8220;soft&#8221; threshold.</li>
</ul>
<p><strong>Planning</strong>:</p>
<ul>
<li><strong>Architectural Drawing</strong>: I&#8217;m a big fan of having at least the &#8220;skeleton&#8221; of the project drawn out, particularly on a white-board (I’m a bit old-school, I know). It doesn&#8217;t have to be a fancy diagram or complicated UML diagram, just a simple drawing; the more understandable, the better. This high-level overview provides guidance when we&#8217;re deep into code, as we can look up and see if we’re on track (as it&#8217;s all too easy to go down a code &#8220;rabbit trail&#8221; if we&#8217;re not careful). It is counterproductive, however, to draw out every little detail, as this will stifle creativity and overwhelm us while we’re writing code (we just won’t look at the diagram then).</li>
<li><strong>Establish Deadlines</strong>: we do need to know the deadlines. It&#8217;s best, in my opinion, to have several small deadlines with a semi-flexible final deadline. This helps us keep on track and measure our progress little by little. As we hit the small deadlines, our confidence builds, which then improves our productivity and, in general, our code quality.</li>
<li><strong>Using Available Expertise Wisely</strong>: does it make sense to assign Bob, the awesome Python programmer, to doing CSS and Bill, the great designer, to slinging code? Obviously not (I have seen some managers try this, though), we may lose both team members or end up with Google copy-and-paste code and animated GIFs in our Project. Cross-training is a nice and potentially valuable concept, but it should be done outside of a software project with its accompanying deadlines. Future minor features might provide a better opportunity ground for cross-training. If Bob&#8217;s swamped, maybe we need to find him some decent help. <img src='http://rubylearning.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li><strong>Determine the Deployment Strategy</strong>(for both during and after the Project):
<ul>
<li>code should be checked into our version control system prior to any deployments.</li>
<li>maybe we should only deploy code after business hours after alerting such-and-such a group. If our project has any possibility of negatively impacting others, notification is not only kind, but often necessary, especially for large changes.</li>
<li>a rollback strategy must <em>always</em> be in place. This strategy must be easily understandable with simple steps, so that little, if any interpretation by support staff, needs to be done in the &#8220;heat of the moment&#8221; support calls. Even if our developers are top-notch, until code gets into Production, we <em>cannot</em> be 100% sure that it will not need to be rolled back. This is why major companies often have to release an update quickly after a major release. Some things just can&#8217;t be easily discovered until they’re released into &#8220;the wild&#8221;.</li>
</ul>
</li>
</ul>
<p><strong>Building with Expansion in Mind</strong>:</p>
<ul>
<li>One of the wonderful aspects of developing software is also its most dangerous aspect: flexibility. A feature or component can often be written in different ways. There typically are only one or two best ways, though. It can be very difficult to determine, unless one steps back from the project and thinks it through. Well-known software principles help a great deal with this, but come up short if they are not &#8220;placed up against&#8221; the anticipated needs of the future (in other words, if we don&#8217;t understand where we&#8217;re going, our code will still be awful even if we follow DRY, OOP, GOF, etc&#8230;). As much as possible, this needs to be done not by the developer but by someone outside the code, so to speak, perhaps a technical team lead, etc&#8230;</li>
<li>When adding core features, we need to at least take a few moments to think through possible future implications of what we’re doing. For example, our Component A is currently parsing JSON from website B using C credentials. Component D depends upon Component A’s data. Wouldn&#8217;t it make sense to have these in an encrypted setting field somewhere to make it easy to change in the future? If Component A&#8217;s data was slightly different, would Component B &#8220;blow up&#8221;? Maybe we can abstract all of this a bit?</li>
<li>Avoiding Spaghetti-Code: proper design and a commitment to sticking to the design in the future helps to prevent our code from such entanglement. In other words, we need to commit to never, ever quickly throwing code in to the project, as this leads to &#8220;spaghetti-code&#8221;. Of course, there may be the exceedingly rare occasions, where we may need to do such a stop-gap measure due to an emergency, but we must then learn from our mistake and commit to re-engineering that portion of the code properly.</li>
</ul>
<p><strong>Data Safety</strong>:</p>
<ul>
<li>As we depend more and more upon data, it&#8217;s becoming increasingly important that we do our best to have automated backups, which are then checked frequently by a <em>person</em>. This cannot be emphasized heavily enough. All too often, properly designed backups can stop working without anyone noticing until it is too late.</li>
<li>If encryption is used:
<ul>
<li>the encryption keys need to be stored off-site in at least 2 secure places. Imagine if we lost our server(s), our office burned down, our VPS provider goes offline, etc&#8230;- even if we had backups, could we get to the raw data if needed? No one wants to start over from scratch.</li>
<li>Does the encryption depend upon a certain cipher? If so, what is the game plan for when that cipher is cracked someday? How easy will it be for us to move to a new cipher?</li>
</ul>
</li>
<li>Does our data depend upon a specific version? For instance, maybe database X version Y can open the data but no other versions can. Do we have a backup of that version to access the data if needed? Better yet, this reveals a key flaw in our design. Our data should not be heavily dependent upon any software version.</li>
<li>Would our data be understandable if a new developer 10 years from now is assigned to work with it? For instance, if a column for a user’s API Key is called usrscr_ak12, we may understand it, but it&#8217;s not future-proof (a better term may be &#8220;future-resilient&#8221;, since nothing is truly future-proof). Such obfuscation attempts provide little security, as if someone can get that far (to the data), we&#8217;ve lost the security &#8220;battle&#8221; anyhow. Data should be clearly understood by those who can access it.</li>
<li>Can our data be exported easily when the software that we&#8217;re lovingly developing now someday gets decommissioned? All software will eventually get replaced by something better. How easily can our data be decoupled from our application?</li>
</ul>
<p><strong>Pin-pointing Possible &#8220;Dominoes&#8221;</strong> in our project and code-base (e.g. if A happens, does it affect B, which then affects C, etc&#8230;, these can be like dominoes). Amazon&#8217;s recent AWS issues in 2011 revealed the criticality of this step. The more time that we spend anticipating what can go wrong, the more we can establish quick steps to both prevent such issues and to mitigate possible damage. At the bare minimum, the possible &#8220;dominoes&#8221; and recommended quick steps need to be written down somewhere. This can greatly help to expedite future troubleshooting.</p>
<ul>
<li><strong>Our Software</strong>: We must try to anticipate, as much as possible, what the interdependencies are in our project and its surrounding infrastructure. These dependencies should be in written form and re-reviewed as further functionality is added to the software in the future (e.g. ITIL Change Management).</li>
<li><strong>Dependent Software</strong>: What software or systems will depend upon our software? When our system goes down, will other software be slamming our system asking for a response?</li>
<li><strong>Dependent Systems</strong>: if we saturate our network, is our software designed to &#8220;back-off&#8221; and retry after an appropriate, randomized delay?</li>
</ul>
<p>Obviously, none of the above can be done overnight. If even some of the above is done, however, the chance of our software having a longer-lasting, positive impact will be greater. I recommend that the start of each project have at least a 3-5 days dedicated to going through these steps. Gathering input from the teams of people who are responsible for various components (e.g. clients/end users, network, sysadmins, developers of other dependent software, etc&#8230;) will be invaluable. The payoff will be great.</p>
<p class="update"><em>I hope you found this article valuable. Feel free to ask questions and give feedback in the comments section of this post.</em> Also, do check out James&#8217; other article: &#8220;<a href="http://rubylearning.com/blog/2010/10/18/do-you-enjoy-your-code-quality/">Do You Enjoy Your Code Quality?</a>&#8221; on RubyLearning. Thanks!</p>
</div>
<p>Technorati Tags: <a href="http://technorati.com/tag/Programming" rel="tag">Programming</a>, <a href="http://technorati.com/tag/James+M.+Schorr" rel="tag"> James M. Schorr</a></p>
Posted by <b>James Schorr</b><p><a href="http://www.launchbit.com/az/113-209/"><img width="468" height="60" src="http://www.launchbit.com/az-images/113-209/" /></a><br />
<small>(Powered by <a href="http://www.launchbit.com/lb/113-209/">LaunchBit</a>)</small></p>

]]></content:encoded>
			<wfw:commentRss>http://rubylearning.com/blog/2011/07/27/how-can-we-develop-for-tomorrows-needs/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Do You Enjoy Your Code Quality?</title>
		<link>http://rubylearning.com/blog/2010/10/18/do-you-enjoy-your-code-quality/</link>
		<comments>http://rubylearning.com/blog/2010/10/18/do-you-enjoy-your-code-quality/#comments</comments>
		<pubDate>Sun, 17 Oct 2010 23:55:56 +0000</pubDate>
		<dc:creator>James Schorr</dc:creator>
				<category><![CDATA[Beginners]]></category>
		<category><![CDATA[Popular]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby Masters]]></category>
		<category><![CDATA[Code Quality]]></category>
		<category><![CDATA[James M. Schorr]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://rubylearning.com/blog/?p=5022</guid>
		<description><![CDATA[Do You Enjoy Your Code Quality? This guest post is by James Schorr, who has been in IT for over 14 years and been developing software for over 11 years. He is the owner of an IT consulting company, Enspiren IT Consulting, LLC.  He lives with his lovely wife, Tara, and their children in Kansas City, Missouri. [...]<p><a href="http://www.launchbit.com/az/113-209/"><img width="468" height="60" src="http://www.launchbit.com/az-images/113-209/" /></a><br />
<small>(Powered by <a href="http://www.launchbit.com/lb/113-209/">LaunchBit</a>)</small></p>
]]></description>
			<content:encoded><![CDATA[<p></p>
<div class="topsy_widget_data topsy_theme_brick-red" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Frubylearning.com%252Fblog%252F2010%252F10%252F18%252Fdo-you-enjoy-your-code-quality%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Do%20You%20Enjoy%20Your%20Code%20Quality%3F%22%20%7D);"></div>
<div>
<h3>Do You Enjoy Your Code Quality?</h3>
<p class="update">This guest post is by <strong>James Schorr</strong>, who has been in IT for over 14 years and been developing software for over 11 years. He is the owner of an IT consulting company, <a href="https://enspirenconsulting.com" target="_blank">Enspiren IT Consulting, LLC</a>.  He lives with his lovely wife, Tara, and their children in Kansas City, Missouri. James spends a lot of time writing code in many languages and a passion for Ruby on Rails in particular. He loves to play chess online at FICS (his handle is kerudzo) and to take his family on nature hikes. His professional profile is on <a href="http://www.linkedin.com/in/jamesschorr">LinkedIn</a>.</p>
<p class="block"><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;'  class="alignright" src="http://rubylearning.com/images/James_Schorr.png" alt="James M. Schorr" width="125" height="125" /> <span class="drop_cap">T</span>here&#8217;s something innately satisfying about programming; or, at least, there should be. It&#8217;s a creative act in and of itself that has incredible power and potential to affect change. Craftsmanship, in and of itself, typically attracts those who like to think outside the box and those who like to create. In this way, it really is more of an art than anything else and can produce a great deal of satisfaction and delight.</p>
<p>Compare the carpenter that hand-crafts a beautiful cabinet to a factory worker who pushes buttons to cause a machine to form identical cabinets over and over again. While both can experience a measure of satisfaction in their work, only the carpenter enjoys long-term satisfaction. The goal of this article is to enable you to improve code quality and, thus, transform the mundane into the beautiful. No matter where you&#8217;re at on the spectrum, beginner to advanced, there is always room for improvement. As the code quality improves, your ability to delight in it and enjoy what you&#8217;re doing does as well.</p>
<p>I have a number of applications in Production and have learned a lot over the years about the code quality, systems, and programming in general. I&#8217;ve also been regularly called on to carefully check a tremendous amount of others&#8217; source code in my consulting business and earlier jobs. Here are some practical, real-world ways to improve your code quality and development habits in general. I have learned the hard way on a few of these. Some may only apply to the non-employee developer, but almost all are pretty universal:</p>
<h3>Pre-Development</h3>
<ul>
<li>Gather the requirements and &#8220;stories&#8221; from the client. I like the idea of stories better because it&#8217;s more in line with how the non-developer thinks. In other words, &#8220;I want A to happen as a B when I do C&#8221;. Make sure that those you’re meeting with are told to come prepared with as much information as possible, especially from the end users of the planned application.</li>
<li>Question every need and distill them down by asking &#8220;Why?&#8221; In general, the requirements of users are based on what they know the possibilities are and what they&#8217;ve used before. You, however, may quickly see that a need is better met a different way, or even cause issues if fulfilled.</li>
<li>Clarify what is necessary and &#8220;nice-to-have&#8221;, as this has a direct impact on the timeline and budget.</li>
<li>Refuse to reproduce lousy software. In other words, turn down work, if necessary, that will need you to reproduce some other system that wasn&#8217;t designed well unless you&#8217;re given the freedom to do it right. It&#8217;s just not worth it, both for you or the users. How do you recognize lousy software? Look at the UI, speed, security, and stability; would you want to use it?</li>
<li>Reject unrealistic timelines nicely, &#8220;Yes, I could do this in 3 months, but you won&#8217;t get the quality that you deserve. To do this right, we need 5 months.&#8221; Stick to your deadlines if possible. Ask yourself, &#8220;Do I want to work 17-20 hours a day to hit an unrealistic deadline?&#8221; Been there, done that, lesson learned.</li>
<li>Accept the least amount of features for functionality for the first version. It&#8217;s far more important to have a stable foundation than a ton of features. Slate other features for future releases after the foundation is laid properly. You can expect future needs (and should), but only include the minimums for the first version or iteration.</li>
<li>Realize that just because we &#8220;can&#8221; doesn&#8217;t mean that we &#8220;should&#8221;. Anything&#8217;s possible, but not everything&#8217;s advisable. This is a tough one, especially in the pre-development excitement, brainstorming phase. For instance, yes we could pull in a Google map for every row, but should we? How long will the requests take as the data set size increases?</li>
<li>If you don&#8217;t know the answer to &#8220;Why&#8221; for a feature and &#8220;What&#8221; it will impact, don&#8217;t even start answering &#8220;How&#8221;.</li>
<li>Ensure that you&#8217;re using a great version control system (I&#8217;m partial to GIT) and a hosted code repository if necessary. Backups are essential as well.</li>
<li>Block off large amounts of undivided time to work on the project. For instance, it&#8217;s not a good day to write code if you have to leave every few minutes.</li>
</ul>
<h3>Development</h3>
<ul>
<li>Spend as much time as possible understanding the real-world and data needs of the client before writing <em>any</em> code. This is absolutely <em>critical</em> to make sure that your application is designed from the ground as a stable, relevant application. Don&#8217;t move forward until you think that you have a pretty good grasp of the needs; get help if you need to.</li>
<li>Out-engineer user-error as much as possible. In other words, never trust that the user will do what you expect, especially when entering data. For instance, about 4 years ago, I was reviewing a proposed payroll-entry system software for a Fortune-500 company. The software trusted the user to enter the number of their dependents properly for tax deduction purposes. When I questioned the developer, &#8220;What if someone enters a negative number?&#8221;, his face grew pale. We found that an employee would end up with a raise, instead of a deduction! Ouch.</li>
<li>Don&#8217;t reinvent the wheel. For instance, it makes no sense to develop your own login system for Ruby on Rails when there are great ones already out there that have run through a gauntlet in the real-world.</li>
<li>Don&#8217;t implement <em>anything</em> unless you understand, as much as time allows, what you&#8217;re &#8220;plugging in&#8221;. Read the issues reported, read through the source code, and familiarize yourself with how it works. Don&#8217;t choose something merely because 3 people recommended it in some forum. I&#8217;ve seen this often: a developer quickly slaps in a 3rd party open source app or gem and a few months later, there&#8217;s an issue that they do not know how to resolve. Usually it&#8217;s because they thought they&#8217;d found a quick fix, without thinking about any future issues. Perhaps the worst example that I&#8217;ve seen is hot-linking to Javascript code on a website somewhere, in blind trust that the link will stay live.</li>
<li>Be open to including other languages and technologies where appropriate. For instance, just because your app is written in Ruby, if a Perl or Python is better suited for a certain backend feature, it may be good to use it. Even if you don&#8217;t integrate it, reading through it can help you see a better way to solve an issue at hand.</li>
<li>Don&#8217;t do in code what your database can already do, as this will cut down the speed quite a bit. For instance, why use <tt>Date</tt> in Ruby in a SQL query on a MySQL-backed application when MySQL&#8217;s <tt>CURRENT_DATE()</tt> will work fine (and faster)? In other words, know the capabilities of the technologies that you&#8217;re using.</li>
<li>Avoid including &#8220;experimental&#8221; or &#8220;cutting-edge&#8221; features in your project if possible. While fun, the risk of issues just isn&#8217;t worth it unless your project is just a learning exercise.</li>
<li>Communicate what you need to keep the client in the loop. That being said, too much communication about every little snag and solution will only frustrate them.</li>
</ul>
<h3>Post-Development</h3>
<ul>
<li>Review your code for speed, stability, security, and usability.</li>
<li>Have someone else review it or discuss it with them.</li>
<li>Have non-technical people do real-world testing on your product. You&#8217;d be surprised at how many things you think are intuitive and easy that really aren&#8217;t to an average user.</li>
<li>Never, ever, ever stop learning, even if it&#8217;s unrelated to your current development language of choice.</li>
<li>Don&#8217;t be afraid to ask for help. Even the best developers can gain a lot of insight and knowledge from reading others&#8217; code and interacting with others.</li>
<li>Revisit old code and see what you would&#8217;ve done differently. Often, you&#8217;ll find yourself encouraged as you see how better your code is now than then.</li>
</ul>
<h3>Enjoying Your Development:</h3>
<ul>
<li>How do you work best? In quiet, with music, with lots of lighting, dim lighting, etc&#8230;? A happy developer is much more likely to produce quality. Spend some time setting up your work environment the way that you&#8217;re most comfortable with. It&#8217;s amazing how mood-based programming can be. Improve your mood and you&#8217;ll improve your code.</li>
<li>What tool(s) do you like to use? As much as possible, insist on those tools, &#8220;Yes, I can write this app in TextEdit or Notepad, but I can do it better with this $79 tool X.&#8221;</li>
<li>Give yourself time to think and rest. There are some days where I just can&#8217;t write code well; other days where it’s just flowing. This is due to how your brain functions. You need sleep and a change of pace and scenery now and then. Schedule breaks if you must and realize that some days are going to be tough. On tough days, learn something new.</li>
<li>Walk away for a while. It&#8217;s easy to get &#8220;tunnel vision&#8221; and think that you&#8217;re close to solving a problem and to think that more effort will solve it. While true at times, I find that it&#8217;s best to walk away from the issue at hand for a while and do something completely different. For example, I tried once for 7 hours to power-through a complicated area of code and just couldn&#8217;t get it right. I finally stopped working on code that day, came back the next day to it, and solved it in 16 minutes. You would be surprised at the ideas or solutions that will spring into your mind as you are thinking about or doing other things.</li>
<li>Set realistic deadlines. For instance, before telling your client or boss that this will be done next Friday, add a week. You never know what issues you might hit and will find yourself, more often than not, very grateful for the extra time to get it done right. If you end early, you&#8217;re a hero!</li>
<li>Remember, you&#8217;re a person, not a robot. In other words, you deserve time to eat, sleep, get away, etc&#8230; When necessary, remind others nicely.</li>
<li>Know your limits and enforce them. In other words, &#8220;No, I can&#8217;t and won&#8217;t recreate Gmail.&#8221;</li>
</ul>
<p>As the work quality improves, it will stand out and you will be called upon more and more to help others, do other projects, etc&#8230; As your level of expertise grows, help others by tactfully pointing out improvements, respecting them, and encouraging them. In doing so, you will find yourself enjoying the quality of your work.</p>
<p><em>I hope you found this article valuable. Feel free to ask questions and give feedback in the comments section of this post. Thanks!</em></p>
</div>
<p>Technorati Tags: <a href="http://technorati.com/tag/Programming" rel="tag">Programming</a>, <a href="http://technorati.com/tag/James+M.+Schorr" rel="tag"> James M. Schorr</a>, <a href="http://technorati.com/tag/Code+Quality" rel="tag"> Code Quality</a></p>
Posted by <b>James Schorr</b><p><a href="http://www.launchbit.com/az/113-209/"><img width="468" height="60" src="http://www.launchbit.com/az-images/113-209/" /></a><br />
<small>(Powered by <a href="http://www.launchbit.com/lb/113-209/">LaunchBit</a>)</small></p>

]]></content:encoded>
			<wfw:commentRss>http://rubylearning.com/blog/2010/10/18/do-you-enjoy-your-code-quality/feed/</wfw:commentRss>
		<slash:comments>156</slash:comments>
		</item>
	</channel>
</rss>

