<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Chris Allen, software developer</title>
	
	<link>http://cysemic.com</link>
	<description>cysemic.com</description>
	<lastBuildDate>Wed, 09 Nov 2011 15:58:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/cysemic" /><feedburner:info uri="cysemic" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly></feedburner:browserFriendly><item>
		<title>Twitter</title>
		<link>http://cysemic.com/2010/06/twitter/</link>
		<comments>http://cysemic.com/2010/06/twitter/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 16:44:35 +0000</pubDate>
		<dc:creator>Chris Allen</dc:creator>
				<category><![CDATA[general]]></category>

		<guid isPermaLink="false">http://cysemic.com/2010/06/twitter/</guid>
		<description><![CDATA[I created a Twitter account specifically for Cysemic-related updates, @cysemic. I will still retweet the updates to it over on @crallen. Hopefully soon I will find a good way to make the Cysemic stream automated. In other news, I am in the process of moving code samples over to Github, and embedding them here. It [...]]]></description>
			<content:encoded><![CDATA[<p>I created a Twitter account specifically for Cysemic-related updates, <a href="http://twitter.com/cysemic">@cysemic</a>. I will still retweet the updates to it over on <a href="http://twitter.com/crallen">@crallen</a>.  Hopefully soon I will find a good way to make the Cysemic stream automated.</p>
<p>In other news, I am in the process of moving code samples over to <a href="http://gist.github.com">Github</a>, and embedding them here. It is a lot quicker and easier to do it this way than to use the Syntax Highlighter. Nothing against the highlighter, it&#8217;s just not the tool I need.</p>
]]></content:encoded>
			<wfw:commentRss>http://cysemic.com/2010/06/twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reset TeamCity build number nightly</title>
		<link>http://cysemic.com/2010/06/reset-teamcity-build-number-nightly/</link>
		<comments>http://cysemic.com/2010/06/reset-teamcity-build-number-nightly/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 16:07:25 +0000</pubDate>
		<dc:creator>Chris Allen</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[teamcity]]></category>

		<guid isPermaLink="false">http://cysemic.com/?p=432</guid>
		<description><![CDATA[Recently I&#8217;ve spent some time at work getting our build environment automated and setting up continuous integration using JetBrains TeamCity, which I would recommend to anyone doing the same. We use the TeamCity build number as our revision number, and since our build numbers depend on dates, we needed a good way to reset the [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I&#8217;ve spent some time at work getting our build environment automated and setting up continuous integration using JetBrains TeamCity, which I would recommend to anyone doing the same. We use the TeamCity build number as our revision number, and since our build numbers depend on dates, we needed a good way to reset the revision number nightly.</p>
<p>Turns out this was super simple to do. The following Ruby script takes care of resetting the build number.  On Windows, I found the build numbers for projects under %USERPROFILE%\.BuildServer\config\<Bulid Name>.<br />
<script src="http://gist.github.com/446976.js"></script></p>
<p>To get it to run nightly, I simply set up a scheduled task using Windows&#8217;s built in Task Scheduler application.  The task runs the following batch file:<br />
<script src="http://gist.github.com/446986.js"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://cysemic.com/2010/06/reset-teamcity-build-number-nightly/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comfort zones</title>
		<link>http://cysemic.com/2010/03/comfort-zones/</link>
		<comments>http://cysemic.com/2010/03/comfort-zones/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 17:54:19 +0000</pubDate>
		<dc:creator>Chris Allen</dc:creator>
				<category><![CDATA[learning]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[overgrown tweets]]></category>

		<guid isPermaLink="false">http://cysemic.com/2010/03/comfort-zones/</guid>
		<description><![CDATA[One thing I learned early on is that in order to continue to learn and grow it is necessary to step outside your established “comfort zone.” That actually can have various meanings, depending on the person and the situation. For example, it may simply mean that you need to step outside of a frame of [...]]]></description>
			<content:encoded><![CDATA[<p>One thing I learned early on is that in order to continue to learn and grow it is necessary to step outside your established “comfort zone.” That actually can have various meanings, depending on the person and the situation. For example, it may simply mean that you need to step outside of a frame of mind that is familiar to you and think about something in a slightly different way. Or, it could mean that in order to gain an understanding of a new concept, you realize that you are no longer the “master” or “senior developer” but instead a “newbie” or “junior” once again. In some situations your comfort zone may have more to do with where you live and who you&#8217;re surrounded by, and in order to really see things begin to move forward again, you feel that you need to change the status quo.</p>
<p>That concludes my too-long-for-Twitter musings for now <img src='http://cysemic.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://cysemic.com/2010/03/comfort-zones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JQuery textbox watermark revisited: making it a plugin</title>
		<link>http://cysemic.com/2010/03/jquery-textbox-watermark-revisited-making-it-a-plugin/</link>
		<comments>http://cysemic.com/2010/03/jquery-textbox-watermark-revisited-making-it-a-plugin/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 15:04:26 +0000</pubDate>
		<dc:creator>Chris Allen</dc:creator>
				<category><![CDATA[web design]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://cysemic.com/?p=395</guid>
		<description><![CDATA[In a previous post I talked about how you can do a textbox watermark very easily using JQuery. I’m long overdue in showing how you can take that same JQuery code and make it into a simple plugin. So why would we make it a plugin? A JQuery plugin gives you the chance to encapsulate [...]]]></description>
			<content:encoded><![CDATA[<p>In a <a href="http://cysemic.com/2008/12/very-simple-textbox-watermark-using-jquery/">previous post</a> I talked about how you can do a textbox watermark very easily using JQuery. I’m long overdue in showing how you can take that same JQuery code and make it into a simple plugin.</p>
<p>So why would we make it a plugin? A JQuery plugin gives you the chance to encapsulate JQuery functionality into a single, pluggable module which can then be activated by calling a single method (with optional settings passed to it). If you’ve used things like the <a href="http://bassistance.de/jquery-plugins/jquery-plugin-validation/">JQuery Validation</a> library, you’ve seen a bit of the power of plugins. They are not hard to write, and the <a href="http://docs.jquery.com/Plugins/Authoring">official documentation</a> on the JQuery site gives you enough information to get started.</p>
<p>We will start off with the same basic HTML text box that we had in the previous post:</p>
<pre class="brush: html;">&lt;input type="text" id="textBox1" /&gt;</pre>
<p>And some simple CSS to go with it:</p>
<pre class="brush: css;">.watermark { color: #CCC; font-style: italic; }</pre>
<p>So, just to recap what we want to do: when our focus is off of the textbox, and the textbox is empty, we want to display the default text, which is &#8220;type here&#8230;&#8221; in a light gray color. When the focus is on the textbox and the default text is displayed, we want to clear the box and the styling. If they type something in the box and then click elsewhere, we want to keep the new text and not reactivate the watermark style.</p>
<p>Using the previous JQuery code I posted as a base, here is the plugin code with comments to explain how it works:</p>
<pre class="brush: js; wrap-lines: false;">(function($) {
	// Create a plugin with the name 'watermark'
	$.fn.watermark = function() {
		// Loop through the elements in the selector that we call the plug-in on
		this.each(function() {
			// Apply defaults to the box
			$(this).addClass("watermark").val("type here...");

			// Apply our focus and blur events
			// When we click on the field, we expect it to clear the field and remove the watermark
			$(this).focus(function() {
				$(this).filter(function() {
					// Check to see if we have a blank field or the default text
					return $(this).val() === "" || $(this).val() === "type here...";
				}).val("").removeClass("watermark");
			});

			// When we click off of the field, we expect it to replace the watermark,
			// unless we have entered text
			$(this).blur(function() {
				$(this).filter(function() {
					// Check to see if the field is blank
					return $(this).val() === "";
				}).addClass("watermark").val("type here...");
			});
		});
	};
})(jQuery);</pre>
<p>To apply the plugin to our text box above we can now simply do this:</p>
<pre class="brush: js;">$(function() {
	$("#textBox1").watermark();
});</pre>
<h4>Making it better</h4>
<p>What we&#8217;ve done so far is fine if you&#8217;re only concerned with a specific case, but what if we wanted to use this same plugin for different default text scenarios, or with different CSS classes? As it turns out, this is not hard to do.</p>
<p>We&#8217;re going to add two simple options to our plugin, but leave our defaults as they currently are:</p>
<pre class="brush: js; wrap-lines: false;">(function($) {
	// Create a plugin with the name 'watermark'
	$.fn.watermark = function(settings) {
		// Defaults
		var config = {
			watermarkClass: 'watermark',
			defaultText: 'type here...'
		};

		// merge the passed in settings with our default config
		if(settings) $.extend(config, settings);

		// Loop through the elements in the selector that we call the plug-in on
		this.each(function() {
			// Apply defaults to the box
			$(this).addClass(config.watermarkClass).val(config.defaultText);

			// Apply our focus and blur events
			// When we click on the field, we expect it to clear the field and remove the watermark
			$(this).focus(function() {
				$(this).filter(function() {
					// Check to see if we have a blank field or the default text
					return $(this).val() === "" || $(this).val() === config.defaultText;
				}).val("").removeClass(config.watermarkClass);
			});

			// When we click off of the field, we expect it to replace the watermark,
			// unless we have entered text
			$(this).blur(function() {
				$(this).filter(function() {
					// Check to see if the field is blank
					return $(this).val() === "";
				}).addClass(config.watermarkClass).val(config.defaultText);
			});
		});
	};
})(jQuery);</pre>
<p>Now, we can customize how we use the plugin:</p>
<pre class="brush: js;">$(function() {
	$("#textBox1").watermark({
		watermarkClass: 'grayText',
		defaultText: 'search'
	});
});</pre>
<h4>Files</h4>
<ul>
<li><a href="http://cysemic.com/blog/wp-content/uploads/2010/03/watermarks.zip">Sample</a> (watermarks.zip)</li>
</ul>
<h4>Useful links</h4>
<ul>
<li><a href="http://docs.jquery.com/Plugins/Authoring">Plugins/Authoring</a> (jquery.com)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://cysemic.com/2010/03/jquery-textbox-watermark-revisited-making-it-a-plugin/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Getting Cucumber, RSpec, and Mongoid to play nice</title>
		<link>http://cysemic.com/2010/03/getting-cucumber-rspec-and-mongoid-to-play-nice/</link>
		<comments>http://cysemic.com/2010/03/getting-cucumber-rspec-and-mongoid-to-play-nice/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 12:11:53 +0000</pubDate>
		<dc:creator>Chris Allen</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[mongoid]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rspec]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://cysemic.com/?p=373</guid>
		<description><![CDATA[Out of the box, Cucumber is setup to work with Active Record and uses the database_cleaner gem to ensure that the database is clean on each run. database_cleaner does support a few object mappers, but Mongoid is not one of them. It is fairly simple, however, to get a Cucumber and RSpec setup that works [...]]]></description>
			<content:encoded><![CDATA[<p>Out of the box, Cucumber is setup to work with Active Record and uses the database_cleaner gem to ensure that the database is clean on each run. database_cleaner does support a few object mappers, but Mongoid is not one of them. It is fairly simple, however, to get a Cucumber and RSpec setup that works with Mongoid, and ensures your test database is clean on each run.</p>
<p>First, if you need help getting Mongoid setup, I recommend you take a look at the documentation on the <a href="http://mongoid.org">Mongoid website</a>. That will get you up and running. Before making any other changes, go ahead and run the rspec and cucumber generators for Rails to get the necessary files. Once that is done, make sure that if you’re not using Active Record (and since you’re using Mongoid and MongoDB I’m assuming you’re not unless you have a second database), you exclude it in your config/environment.rb:</p>
<h5>config/environment.rb</h5>
<pre class="brush: rails">RAILS_GEM_VERSION = '2.3.5' unless defined? RAILS_GEM_VERSION
require File.join(File.dirname(__FILE__), 'boot')

Rails::Initializer.run do |config|
  config.gem &quot;cucumber&quot;
  config.gem &quot;mongoid&quot;

  config.frameworks -= [ :active_record ]
end</pre>
<p></p>
<p>Next we will configure RSpec to clean our database before each spec is run. We can do this by configuring RSpec as follows:</p>
<h5>spec/spec_helper.rb</h5>
<pre class="brush: rails; wrap-lines: false;">ENV["RAILS_ENV"] ||= 'test'
require File.expand_path(File.join(File.dirname(__FILE__),'..','config','environment'))
require 'spec/autorun'
require 'spec/rails'
require 'mongoid'

Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each {|f| require f}

Spec::Runner.configure do |config|
  config.before(:each) do
    Mongoid.master.collections.each(&#038;:drop)
  end
end</pre>
<p></p>
<p>And, finally, we need to configure Cucumber. I will admit, I had to play around with this for a while to get the correct setup. At one point, I had a situation where my database was only being cleaned correctly every other run. This actually turned out to not be a problem with my configuration, but with my scenarios (I am still somewhat of a Cucumber noob). In a fashion similar to that of our RSpec configuration above, we will simply tell Cucumber to wipe out the collections before each scenario runs:</p>
<h5>features/support/env.rb</h5>
<pre class="brush: rails; wrap-lines: false;">ENV["RAILS_ENV"] ||= "cucumber"
require File.expand_path(File.dirname(__FILE__) + '/../../config/environment')

require 'cucumber/formatter/unicode'
require 'cucumber/rails/world'
require 'cucumber/web/tableish'
require 'webrat'
require 'webrat/core/matchers'
require 'spec/expectations'
require 'mongoid'

Webrat.configure do |config|
  config.mode = :rails
  config.open_error_files = false
end

Cucumber::Rails::World.use_transactional_fixtures = false

Before do
  Mongoid.master.collections.each(&#038;:drop)
end</pre>
<p>I am using “before” hooks on both RSpec and Cucumber. My reasoning behind this is to ensure that when something is running, it starts off with a clean slate. I could easily do an “after” and just have each one clean up after itself, but this way, if I just want to run a single spec or scenario and inspect the data in my test database afterwards, I have that option.</p>
<p>So far learning Cucumber and RSpec has been a great experience and both have really made Behavior Driven Development (BDD) click.</p>
<h4>Useful links</h4>
<ul>
<li><a href="http://mongoid.org">Mongoid website</a></li>
<li><a href="http://github.com/bmabey/database_cleaner">database_cleaner on Github</a></li>
<li><a href="http://cukes.info">Cucumber website</a></li>
<li><a href="http://rspec.info/">RSpec website</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://cysemic.com/2010/03/getting-cucumber-rspec-and-mongoid-to-play-nice/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>How my true desire for improvement began</title>
		<link>http://cysemic.com/2009/07/how-my-true-desire-for-improvement-began/</link>
		<comments>http://cysemic.com/2009/07/how-my-true-desire-for-improvement-began/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 00:44:00 +0000</pubDate>
		<dc:creator>Chris Allen</dc:creator>
				<category><![CDATA[life]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://cysemic.com/2009/07/how-my-true-desire-for-improvement-began/</guid>
		<description><![CDATA[When I started to call myself a software developer, back in 2006, the title was a loose fit at best – I was very green, and I knew this, but I did my best not to let it discourage me too much.  One of my strongest assets has always been my ability to learn and adapt based on observation and practice, and to do so quickly.  Usually the process begins when I know there is a better way to do something, and set out in search of it.  When I find something of interest, I start to read into it, and usually that becomes the rabbit hole that sets me off on an adventure.]]></description>
			<content:encoded><![CDATA[<p>When I started to call myself a software developer, back in 2006, the title was a loose fit at best – I was very green, and I knew this, but I did my best not to let it discourage me too much.&#160; One of my strongest assets has always been my ability to learn and adapt based on observation and practice, and to do so quickly.&#160; Usually the process begins when I know there is a better way to do something, and set out in search of it.&#160; When I find something of interest, I start to read into it, and usually that becomes the rabbit hole that sets me off on an adventure.</p>
<p>When I started doing research on NHibernate in late 2007 after being discouraged with traditional data access and drag-and-drop designers, I never would have expected the adventure it led me on.</p>
<p>It all started when I began to look at a proprietary code generator and how it worked, and the massive amounts of code it spit out based on the database schema.&#160; For a couple of weeks I made my best attempt to dig in and find out as much as I could without having access to the actual source code for the generator, to see how the data access was done.&#160; After all, very little had to be done on the part of the developers using the tool – all that had to be done was make the modifications to the schema and run the tool.</p>
<p>Why did I feel like I needed to understand this data access?&#160; Well, for one, just to make my life easier using the tool and understanding how it worked.&#160; Secondly, I wanted to see if there was anything I could adapt and use for my own applications, just in the way of general data access strategy.&#160; I became frustrated, and soon gave up on using anything that this application was generating because it seemed too complex for just data access.&#160; I wanted something better.</p>
<p>I still remember the first blog posts I read about NHibernate.&#160; titled “A Journey with Domain Driven Design (and NHibernate)” over on <a href="http://flux88.com">Ben Scheirman’s blog</a>.&#160; Many of the entries in the series were dated back in 2006, but they were still applicable enough for me to get my feet wet using NHibernate.&#160; I printed out hard copies of the whole article series and read them several times, wrote many several applications, and started to get the hang of things.&#160; The POCO (Plain-Old-CLR-Objects) and Persistence Ignorance approach to data access really resonated with me, and I wanted more.&#160; After reading through the series, however, I got many more ideas in my head, and became very thirsty for knowledge.</p>
<p>Through the article I became exposed to Test Driven Development (TDD) and Domain Driven Design (DDD).&#160; The more I read, the more I wanted to learn.&#160; When I came across the ALT.NET groups, practices, and ideas, I found that there were many others out there who shared some of the same frustrations I had with the Microsoft-centric nature of .NET development.&#160; I was able to learn things like Dependency Injection/Inversion of Control and the SOLID Principles.&#160; I am not just plugging buzzwords for the sake of plugging, all of these things I have learned in the last almost two years have made me a much better software developer.</p>
<p>Even better is that there are a lot of really smart developers out there who have done lots of work in the public arena to get these ideas circulating, and are very much the developers who I admire.&#160; They make me, as a software developer who is still early in my career, want to work harder to achieve the same excellence.&#160; Some of them are listed in my Blogroll, although looking at it now I realize I still have more to add.</p>
<p>I really do feel that we never stop learning, regardless of what career path we choose.&#160; I know I have not and never will.&#160; I am happy to say that I have continued to venture outside my comfort zone, trying new languages and new platforms for software development.&#160; My craft is to develop great software, and maybe learn a thing or two while doing it to make the next project that much better.</p>
]]></content:encoded>
			<wfw:commentRss>http://cysemic.com/2009/07/how-my-true-desire-for-improvement-began/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Learn how to apply, not how to copy/paste</title>
		<link>http://cysemic.com/2009/03/learn-how-to-apply-not-how-to-copypaste/</link>
		<comments>http://cysemic.com/2009/03/learn-how-to-apply-not-how-to-copypaste/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 13:40:21 +0000</pubDate>
		<dc:creator>Chris Allen</dc:creator>
				<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://cysemic.com/?p=310</guid>
		<description><![CDATA[When I’m learning something new, usually I just start out by reading about it.  Many times I will go look at the code that someone else has written, generally with open source projects, and attempt to follow it.  What I’m looking for is an understanding of how the concepts work, not just identifying them so that I can reproduce.  This may lengthen my initial time investment somewhat, but it pays off in the end.]]></description>
			<content:encoded><![CDATA[<p>When I’m learning something new, usually I just start out by reading about it.&#160; Many times I will go look at the code that someone else has written, generally with open source projects, and attempt to follow it.&#160; What I’m looking for is an understanding of how the concepts work, not just identifying them so that I can reproduce.&#160; This may lengthen my initial time investment somewhat, but it pays off in the end.</p>
<p>Code samples are just that: samples.&#160; They are usually not representative of real world applications, and in many situations they are not intended to be in the first place.&#160; Likewise, code snippets of different strategies or techniques in particular areas of the application are often not pulled out of a real world application either.&#160; The point I’m trying to make here is, before you copy and paste code into a real application, make sure you understand what’s going on with that code. If something were to go wrong or not work the way you intended, you need to know how to fix it.</p>
<p>I saw this a lot when I was in school.&#160; There were people in the Computer Science courses who could not see the programming language as just a tool used to write software.&#160; To them, it seemed to carry some sort of mysticism, the likes of which was not to be disturbed.&#160; So what did they do?&#160; Copy code out of the book, and hope to tweak it until they got it working.</p>
<p>Most of my understanding of software and programming languages comes from taking a concept that I’ve read about and writing my own scenario with it.&#160; When doing so, I am given the opportunity to explore the code, see what each piece does, and modify the behavior in ways to get different results.&#160; I experiment.&#160; When I experiment, I feel a greater sense of accomplishment than had I just read a book or blog post about a subject.&#160; In fact, reading normally gives me the itch to write code these days.</p>
<p>During my reading, I often come across comments on blogs or messages in a mailing list of people asking the authors directly for code that addresses particular situations.&#160; I never respond to these people, because it’s never my place; they’re not asking me directly.&#160; I always think though that these developers who need code samples for every particular situation must not be learning how to apply what they are reading.&#160; After all, the example that the author showed explains how to approach it, why not just take the example and learn from it?</p>
<p>Does learning to apply have any other benefits?&#160; Well, I, for one, like to do most of my development without having to Google every time I see something unexpected.&#160; If I can’t figure it out based on what I already know, or if the code just smells bad, then I will ultimately resort to this, as there is obviously something I do not know and need to learn.&#160; Learning is an endless cycle, and I would not have it any other way.</p>
]]></content:encoded>
			<wfw:commentRss>http://cysemic.com/2009/03/learn-how-to-apply-not-how-to-copypaste/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reflections on myself as a software developer</title>
		<link>http://cysemic.com/2009/02/reflections-on-myself-as-a-software-developer/</link>
		<comments>http://cysemic.com/2009/02/reflections-on-myself-as-a-software-developer/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 15:49:21 +0000</pubDate>
		<dc:creator>Chris Allen</dc:creator>
				<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://cysemic.com/2009/02/reflections-on-myself-as-a-software-developer/</guid>
		<description><![CDATA[About a month ago, I felt myself entering one of those periods in my life where I had to face my self-doubt and challenge my complacency.  It wasn’t the first time I’ve been challenged with this, and by far will not be the last.  Each time I am reminded how important it is to be passionate about what it is I do and how vital it is to keep learning, because new learning and constant challenge breathes life into what can quickly become a monotonous and stagnant career.]]></description>
			<content:encoded><![CDATA[<p>About a month ago, I felt myself entering one of those periods in my life where I had to face my self-doubt and challenge my complacency.&#160; It wasn’t the first time I’ve been challenged with this, and by far will not be the last.&#160; Each time I am reminded how important it is to be passionate about what it is I do and how vital it is to keep learning, because new learning and constant challenge breathes life into what can quickly become a monotonous and stagnant career.</p>
<p>In the past, I have been asked why I try to learn so many things in my time away from my day job, and why I don’t put <em>all</em> that extra time into what I do at my day job.&#160; Here is the answer: that is the one way road to becoming burnt out or complacent.&#160; The constant challenge of learning new technologies and practices keeps me on my toes, and also opens my eyes to what software developers outside my shop are doing.&#160; This constant evolution of my skill set also makes me hold my code and the code of others to a higher standard.</p>
<p>I am a .NET developer now, but that does not necessarily mean that’s all I will ever be.&#160; I am a Software Developer first, my focus in .NET is merely the current “tool for the job.”&#160; If I was told tomorrow that everything was being converted to Ruby on Rails, I’d jump on it in a heartbeat.&#160; I cannot, and will not, limit myself.&#160; That being said, as a .NET developer, I do not limit myself to just what Microsoft says or what tools Microsoft releases.&#160; I use the best tools for the job, when I have a choice in the matter.&#160; If I were a Java developer, my perspective on this would not be any different: not all of the tools come from Sun, and the ones that do may not necessarily be the best for the task at hand.</p>
<p>I do a lot of work in my personal time, some evenings I come home from a day of programming to do more programming.&#160; Some of it goes unfinished, but I still learn from it.&#160; Some of them are not meant to be “finished,” as they are just conceptual projects to help me learn and understand something new.&#160; To be perfectly honest, I would rather be doing some of my personal projects for clients, so there would actually be some sort of deployment strategy involved, and so my work would actually mean something.&#160; As I am still a young developer, this is an area I’m not too terribly experienced with, but would like to be.</p>
<p>This year my focus is on networking, and getting out to participate in workshops, conferences, and the like as much as possible.&#160; This has been my weak area so far, because I don’t live in one of the bigger cities and have access to a much smaller pool of developers (in fact, I hardly know more than those in my own office).&#160; This is definitely something I’m looking to change, and learn all sorts of new things in the process.</p>
]]></content:encoded>
			<wfw:commentRss>http://cysemic.com/2009/02/reflections-on-myself-as-a-software-developer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bob Martin Presentation on Agile, Professionalism, and Software Craftsmanship</title>
		<link>http://cysemic.com/2009/02/bob-martin-presentation-on-agile-professionalism-and-software-craftsmanship/</link>
		<comments>http://cysemic.com/2009/02/bob-martin-presentation-on-agile-professionalism-and-software-craftsmanship/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 13:10:20 +0000</pubDate>
		<dc:creator>Chris Allen</dc:creator>
				<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://cysemic.com/2009/02/bob-martin-presentation-on-agile-professionalism-and-software-craftsmanship/</guid>
		<description><![CDATA[<a href="http://devlicio.us/blogs/sergio_pereira/default.aspx">Sergio Pereira</a> recently posted two videos of a presentation that Bob Martin (a.k.a. “Uncle Bob”) did at the February meeting of the Chicago ALT.NET group.&#160; It is a very interesting and informative presentation, and highly recommend it if the above topics interest you at all.]]></description>
			<content:encoded><![CDATA[<p><a href="http://devlicio.us/blogs/sergio_pereira/default.aspx">Sergio Pereira</a> recently posted two videos of a presentation that Bob Martin (a.k.a. “Uncle Bob”) did at the February meeting of the Chicago ALT.NET group.&#160; It is a very interesting and informative presentation, and highly recommend it if the above topics interest you at all.</p>
<p>One part I particularly liked is the talk about software craftsmanship with respect to a martial arts-style system, where you have masters, or black belts, who train their students, and when those students become black belts, they go off and some may further develop and create their own style, which then gets taught to more students.&#160; The idea really resonates with me, but so does the idea of software craftsmanship in general, and I would very much like to see the industry move in that direction.</p>
<p>Presentation: <a href="http://devlicio.us/blogs/sergio_pereira/archive/2009/02/14/video-xp-after-10-years-why-are-we-still-talking-about-it.aspx">Video &#8211; XP: After 10 years, why are we still talking about it?</a></p>
<p>Q&amp;A: <a href="http://devlicio.us/blogs/sergio_pereira/archive/2009/02/14/video-uncle-bob-q-amp-a-at-chicago-alt-net.aspx">Video &#8211; Uncle Bob Q&amp;A at Chicago ALT.NET</a></p>
]]></content:encoded>
			<wfw:commentRss>http://cysemic.com/2009/02/bob-martin-presentation-on-agile-professionalism-and-software-craftsmanship/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>We don’t support the (insert name) browser</title>
		<link>http://cysemic.com/2009/02/we-dont-support-the-insert-name-browser/</link>
		<comments>http://cysemic.com/2009/02/we-dont-support-the-insert-name-browser/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 17:55:35 +0000</pubDate>
		<dc:creator>Chris Allen</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[web design]]></category>

		<guid isPermaLink="false">http://cysemic.com/2009/02/we-dont-support-the-insert-name-browser/</guid>
		<description><![CDATA[There are lots of web browsers out there now, which makes browser support a daunting task for any web developer or designer.  It doesn’t help the fact that even though there are standards, each browser has its own quirks as to how it interprets those standards.  Add to this the recent surge in mobile web use, and things get even more complicated, as you have mobile browsers that can support most web conventions (i.e. the iPhone) and older or smaller phones which cannot.  It may be permissible, for now, to say you cannot support all mobile browsing situations, but rarely is there a good excuse for not taking the time to assure quality in a variety of desktop browsers.]]></description>
			<content:encoded><![CDATA[<p>There are lots of web browsers out there now, which makes browser support a daunting task for any web developer or designer.&#160; It doesn’t help the fact that even though there are standards, each browser has its own quirks as to how it interprets those standards.&#160; Add to this the recent surge in mobile web use, and things get even more complicated, as you have mobile browsers that can support most web conventions (i.e. the iPhone) and older or smaller phones which cannot.&#160; It may be permissible, for now, to say you cannot support all mobile browsing situations, but rarely is there a good excuse for not taking the time to assure quality in a variety of desktop browsers.</p>
<p>By adhering to the standards, you can get a website that is compatible for most situations.&#160; There will likely be a few places where it is not, and more than likely the offending browser will be Internet Explorer.&#160; There have been situations where I have spent hours just trying to work out a small kink in a design because of IE’s lack of full support for established standards.&#160; Nevertheless, with some time and testing, all of this can be worked out if the design is good and the designer is familiar with browser quirks.&#160; Not taking the time to test multiple browsers and versions is a sign of one or more of the following things: laziness, rushed to delivery, or poor quality assurance testing.</p>
<p>Laziness, or perhaps more appropriately, apathy about whether or not a site or application is cross-browser compatible, is probably the worst excuse for lack of cross-browser compatibility.&#160; This is when the designer or developer of the application only tested it in, say, Internet Explorer, and didn’t care whether or not it worked in any other browser.&#160; When people ask for support and are asked what browser they are using, if the answer is not Internet Explorer, they are met with the response “Oh, I’m sorry, we only support Internet Explorer.”&#160; I don’t really find that to be acceptable today.&#160; It is not difficult to install Mozilla Firefox or Google Chrome, at least the latest versions of them, and test the site.&#160; At least know where the issues are!&#160; And do not even get me started on the IT guys who will not let you install Firefox on a network computer because it is “insecure” (yes, I have actually encountered one).</p>
<p>There are some products that are rushed to delivery without the attention to testing that needs to happen.&#160; Really, with these types of products and/or sites, the UI being cross-browser friendly is probably the least of their concerns, because there’s probably a lot more going wrong.&#160; Tied together with this is the constant rush to get new features out the door and paying little attention to what’s happening with the UI.&#160; As things are added, manipulated, or taken away, the chances of every little thing on the page working across different browsers decrease dramatically, especially if they were rushed, not tested, and thrown out into the world.&#160; If the product is actually going so far as to throw errors in certain browsers, then you really have issues.&#160; I have come across components from a certain vendor that would blow up when you viewed them in Google Chrome or Safari.&#160; While this component vendor should have tested their product for cross-browser compatibility a bit better, so should the company using the component for their own product which produces the same error when viewed in those browsers.</p>
<p>Poor, or complete lack of, quality assurance testing means that any cross-browser issues that would have been caught will not be.&#160; Even if there is not a QA “team” in place, some testing can be done by the designers and/or developers working on the project.&#160; UI issues are generally pretty obvious, and testers with keen eyes can identify differences as small as one pixel.&#160; In some respects, this is very similar to my explanation for laziness above, when it comes to the person designing or developing the project of checking their work in different browsers.&#160; Having a team in place for testing means that additional eyes are looking over stuff that the designer or developer has been staring at for hours on end, which can be very beneficial.&#160; Alas, not all companies can afford this luxury.</p>
<p>Cross-browser compatibility testing has become an important part of user experience testing, and it is not one that should be taken lightly.&#160; The more popular the site or web application is, the more types of traffic it should be designed to accommodate.&#160; One area I see this growing even more is in mobile web browsing, especially since mobile web browsers tend to have tighter restrictions as to what content they can actually display, and display correctly.&#160; Many sites already have separate mobile versions, and it may be that this is the best way to address that particular issue.&#160; All in all, the number of browsers that we need to support is not getting any smaller, so our workload is only growing.</p>
]]></content:encoded>
			<wfw:commentRss>http://cysemic.com/2009/02/we-dont-support-the-insert-name-browser/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss><!-- Dynamic page generated in 0.766 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-01-24 14:45:24 -->

