<?xml version="1.0" encoding="UTF-8"?>
<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/" version="2.0">

<channel>
	<title>Web Demon</title>
	
	<link>http://www.webdemon.net/blog</link>
	<description>Web Development</description>
	<lastBuildDate>Thu, 30 Apr 2009 09:23:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/webdemon" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="webdemon" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Object Oriented JavaScript</title>
		<link>http://www.webdemon.net/blog/object-oriented-javascript/</link>
		<comments>http://www.webdemon.net/blog/object-oriented-javascript/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 14:21:06 +0000</pubDate>
		<dc:creator>Elliot</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Prototype]]></category>

		<guid isPermaLink="false">http://www.webdemon.net/blog/?p=233</guid>
		<description><![CDATA[Getting started with JavaScript is no problem. As a hobbyist I remember my delight at being able to hack together some code so that whenever a button was clicked it would change the background colour of my page and make cool &#8220;windows style&#8221; dialog boxes appear on screen. The very nature of JavaScript allowed me [...]]]></description>
			<content:encoded><![CDATA[<p>Getting started with JavaScript is no problem. As a hobbyist I remember my delight at being able to hack together some code so that whenever a button was clicked it would change the background colour of my page and make cool &#8220;windows style&#8221; dialog boxes appear on screen. The very nature of JavaScript allowed me to accomplish such things with relative ease and with limited programming knowledge; the language itself is accessible and forgiving (not having to explicitly declare a variable before using it for example) and other than having to be enclosed within &lt;script&gt;&lt;/script&gt; tags in the HTML, no code structuring is required or enforced.</p>
<p>Unfortunately it is this inherent flexibility of JavaScript that actually promotes the unmanageable and unscaleable approaches to client side coding we see in many of the web applications on the net today. The majority of JavaScript I have come across personally has been written in such a way as to get something working as quickly as possible, without any consideration for good code design practices.  This isn&#8217;t necessarily because the developer writing the code was in any way lazy or under pressure to get something working, but because the language allows things to be done this way (and maybe because the developer didn&#8217;t know that there were alternatives).</p>
<p>With the emergence of frameworks such as <a href="http://jquery.com" target="_blank">jQuery</a>, <a href="http://www.mootools.net" target="_blank">MooTools</a>, <a href="http://www.prototypejs.org" target="_blank">Prototype</a>, <a href="http://extjs.com" target="_blank">ExtJS</a>, <a href="http://dojotoolkit.org" target="_blank">Dojo</a>, <a href="http://www.asp.net/ajax/" target="_blank">ASP.Net AJAX</a> etc and with a lot more focus being placed on UX, JavaScript is steadily being perceived in a different light. Developers, specifically, are realising that JavaScript can be used and structured effectively, that it doesn&#8217;t have to be a mess of cross-browser compatible syntax, that OOP principles can be applied, and scalable solutions can be created without cramming everything into in-line global functions.</p>
<p>Some pretty awful things can still be done in JavaScript without trying too hard. I won&#8217;t attempt to tell you what you shouldn&#8217;t be doing though, instead I&#8217;m going to give some examples of the good things that can be done in JavaScript, specifically how to declare and use objects in JavaScript and how to employ good OOP techniques to create maintainable, reusable and easy to understand code.</p>
<h2>Object Literal</h2>
<pre class="brush: javascript">
var monkey = {
  name: &quot;Bubbles&quot;,
  favouriteFood: &quot;Bananas&quot;,
  makeSound: function() {
    alert(&quot;OohOohAahAah!&quot;);
  }
}

monkey.makeSound();
</pre>
<h3>Pros</h3>
<ul>
<li>Simple: Easy to read, write and understand.</li>
<li>JSON (a subset of the Object Literal) is commonly used to represent structured data (as an alternative to XML) in AJAX applications.</li>
</ul>
<h3>Cons</h3>
<ul>
<li>Exists as a single instance, further instances cannot be created.</li>
<li>Does not support encapsulation.</li>
<li>Does not support inheritance.</li>
</ul>
<h2>Object Instantiation</h2>
<pre class="brush: javascript">
function monkey(a) {
  this.name = a;
  this.makeSound = function() {
    alert(&quot;OohOohAahAah!&quot;);
  }
}

var bubbles = new monkey(&quot;Bubbles&quot;);
bubbles.makeSound();
</pre>
<p>When a function is called with the &#8220;new&#8221; operator it serves as a constructor to instantiate a new JavaScript Object type. The &#8220;this&#8221; keyword refers to the Object instance that the constructor created. By prefixing a property or function name with &#8220;this.&#8221; makes it a public member and callable by the object&#8217;s consumer.</p>
<h3>Encapsulation</h3>
<pre class="brush: javascript">
function monkey(a) {
  var favouriteSound = &quot;OohOohAahAah!&quot;;
  this.name = a;
  this.makeSound = function() {
    alert(favouriteSound);
  }
}

var bubbles= new monkey(&quot;Bubbles&quot;);
bubbles.makeSound();
</pre>
<p>Taking advantage of JavaScript closures; the variable favouriteSound has been &#8220;hidden&#8221; within the object and can be considered a private attribute of the monkey object that has not been publicly exposed using the &#8220;this&#8221; keyword. Calling myMonkey.favouriteSound returns null/undefined.</p>
<pre class="brush: javascript">
function monkey(a) {
  var favouriteSound = &quot;OohOohAahAah!&quot;;

  this.getFavouriteSound = function() {
    return favouriteSound;
  }

  this.setFavouriteSound = function(sound) {
    favouriteSound = sound;
  }

  this.name = a;

  this.makeSound = function() {
    alert(favouriteSound);
  }
}

var bubbles= new monkey(&quot;Bubbles&quot;);
bubbles.setFavouriteSound = &quot;Good evening.&quot;;
bubbles.makeSound();
</pre>
<p>Public getters and setters for local variables can also be simulated.</p>
<h3>Inheritance</h3>
<pre class="brush: javascript">
function monkey(a) {
  this.name = a;
  this.makeSound = function() {
    alert(&quot;OohOohAahAah!&quot;);
  }
}

function human(a) {
  var base = new monkey(a);
  base.makeSound = function() {
    alert(&quot;Get back to work!&quot;);
  }

  return base;
}

var karl = new human(&quot;Karl&quot;);
karl.makeSound();
</pre>
<p>When a new human object is instantiated a monkey object is returned, with makeSound redefined to suit the human specialisation.</p>
<pre class="brush: javascript">
function human(a) {
  var base = new monkey(a);
  var makeSound2 = base.makeSound;
  base.makeSound = function() {
    alert(&quot;Get back to work!&quot;);
    makeSound2();
  }

  return base;
}
</pre>
<p>A call to the overridden makeSound function can still be made if needed by creating a reference to it in the human constructor.</p>
<h3>Pros</h3>
<ul>
<li>As &#8220;natural&#8221; as it gets for traditional OOP programmers.</li>
<li>Supports encapsulation.</li>
<li>Supports inheritance.</li>
</ul>
<h3>Cons</h3>
<ul>
<li>Consumes relatively large amounts of memory when multiple instances of an object are created.</li>
</ul>
<h2>Prototyping</h2>
<pre class="brush: javascript">
function monkey(a) {
  this.name = a;
}

monkey.prototype.makeSound = function() {
  alert(&quot;OohOohAahAah!&quot;);
} 

var bubbles = new monkey(&quot;Bubbles&quot;);
bubbles.makeSound();
</pre>
<p>The prototype property essentially allows an object&#8217;s functionality to be extended.</p>
<pre class="brush: javascript">
function monkey(a) {
  this.name = a;
}

var bubbles = new monkey(&quot;Bubbles&quot;);
var clyde = new monkey(&quot;Clyde&quot;);

monkey.prototype.makeSound = function() {
  alert(&quot;OohOohAahAah!&quot;);
}

bubbles.makeSound();
clyde.makeSound();
</pre>
<p>An object can be extended even after it has been instantiated.</p>
<h3>Encapsulation</h3>
<pre class="brush: javascript">
function monkey(a) {
  this._favouriteSound = &quot;OohOohAahAah!&quot;;
  this.name = a;
}

monkey.prototype.makeSound = function() {
  alert(this._favouriteSound);
} 

var bubbles = new monkey(&quot;Bubbles&quot;);
myMonkey.makeSound();
</pre>
<p>Although not true encapsulation, the common convention is that members starting with an underscore should be considered private.</p>
<h3>Inheritance</h3>
<pre class="brush: javascript">
function monkey(a) {
  this.name = a;
}

monkey.prototype.makeSound = function() {
  alert(&quot;OohOohAahAah!&quot;);
}

human.prototype = new monkey;
human.prototype.constructor = human; 

function human(a) {
  monkey.call(this, a);
}

human.prototype.makeSound = function() {
  alert(&quot;Get back to work!&quot;);
} 

var karl = new human(&quot;Karl&quot;);
karl.makeSound();
</pre>
<p>Using the prototype property human is extended with all of monkey&#8217;s behaviour, with makeSound redefined to suit the human specialisation.</p>
<pre class="brush: javascript">
human.prototype.makeSound = function() {
  alert(&quot;Get back to work!&quot;);
  monkey.prototype.makeSound.call(this);
}
</pre>
<p>A call to the overridden makeSound function can still be made if needed.</p>
<h3>Pros</h3>
<ul>
<li>Supports encapsulation.</li>
<li>The official way to implement inheritance.</li>
<li>Allows multiple objects&#8217; functionality to be altered after they have been instantiated. Useful for extending closed libraries.</li>
<li>Memory efficient when multiple instances of an object are created.</li>
</ul>
<h3>Cons</h3>
<ul>
<li>Syntax looks crazy to traditional OOP programmers.</li>
</ul>
<h2>Is Object Oriented JavaScript really worth it?</h2>
<p>It depends. Personally if all I need to do is apply a jQuery slide animation to a widget then I&#8217;ll just wrap a simple function inside a $() so it runs when the DOM is ready. If the widget is slightly more complex however, and is reliant upon user interaction with another element on the page, or perhaps displays some dynamic content based upon where on the page it is positioned, then I&#8217;ll consider modelling the behaviour using objects.</p>
<p>If an application evolves to a state where widgets need to interface with each other, a drag and drop shopping cart for example, and business rules also need to be enforced such as voucher discounts, purchase limits etc then the solution should be structured in such a way that it is robust, maintainable and easy to understand &#8211; OOP without a doubt facilitates a large share of this.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webdemon.net/blog/object-oriented-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Converting px to em</title>
		<link>http://www.webdemon.net/blog/converting-px-to-em/</link>
		<comments>http://www.webdemon.net/blog/converting-px-to-em/#comments</comments>
		<pubDate>Mon, 16 Mar 2009 18:46:10 +0000</pubDate>
		<dc:creator>Elliot</dc:creator>
				<category><![CDATA[HTML and CSS]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[em]]></category>
		<category><![CDATA[font-size]]></category>
		<category><![CDATA[line-height]]></category>
		<category><![CDATA[px]]></category>
		<category><![CDATA[XHTML]]></category>

		<guid isPermaLink="false">http://blog.webdemon.info/?p=48</guid>
		<description><![CDATA[An em is a unit of measurement in the field of typography, equal to the point size of the current font. This unit is not defined in terms of any specific typeface, and thus is the same for all fonts at a given point size. So, 1 em in a 16 point typeface is 16 [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>An em is a unit of measurement in the field of typography, equal to the point size of the current font. This unit is not defined in terms of any specific typeface, and thus is the same for all fonts at a given point size. So, 1 em in a 16 point typeface is 16 points.</p></blockquote>
<p>The web standards and accessibility perfectionists among you will no doubt be avid em advocates, whereas the CSS newcomers among you may not have known the em existed or how to use it. There are valid arguments for and against using the em, here&#8217;s a list of its pros and cons:</p>
<h2>Pros</h2>
<ul>
<li>Text-resize accessibility support in IE6 &amp; IE7.</li>
<li>Can create <a href="http://www.alistapart.com/articles/elastic/" target="_blank">elastic</a> layouts (although this may now be considered redundant due to modern browsers&#8217; zoom feature).</li>
<li>Promotes <a href="http://www.designbygrid.com/" target="_blank">DBG (Design by Grid)</a> and <a href="http://www.webtypography.net/" target="_blank">typographic excellence.</a></li>
<li>The overall font-size of a website can be changed by altering a stylesheet in a single place e.g. Changing the font size of an element will in turn relatively re-size any text that appears in the element&#8217;s children. This could also be considered a con!</li>
</ul>
<h2>Cons</h2>
<ul>
<li>Calculation needed.</li>
<li>CSS maintenance can be more difficult on larger scale projects with multiple developers of varying CSS expertise.</li>
<li>The overall font-size of a website can be changed by altering a stylesheet in a single place e.g. Changing the font size of an element will in turn relatively re-size any text that appears in the element&#8217;s children. This could also be considered a pro!</li>
</ul>
<p>I&#8217;m not going to try and convince you to use ems, but it definitely helps to be aware of them and know how they work. All too often have I seen a developer copy and paste CSS from one stylesheet to another in the hope that they can mimmick the look and feel of a particular widget, only to find that their website&#8217;s fonts have been blown all out of proportion! This is a tell tale sign that relative font sizes are being used somewhere, and this usually means ems.</p>
<h2>The em is a relative font size</h2>
<p>The value of an em will always be relative to a base size. This is why a paragraph of text on one website will not look the same as on another website even if both paragraphs are defined as having a font size of 1em.</p>
<h3>Example 1</h3>
<pre class="brush: html">
&lt;html&gt;
&lt;head&gt;
  &lt;style type=&quot;text/css&quot;&gt;
    body {font-size:10px;}
    .widget-1 {font-size:1em;}
    .widget-2 {font-size:2em;}
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div class=&quot;widget-1&quot;&gt;Widget 1&lt;/div&gt;
  &lt;div class=&quot;widget-2&quot;&gt;Widget 2&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<ul>
<li>Widget 1 would have a screen font size of 10px (10 x 1).</li>
<li> Widget 2 would have a screen font size of 20px (10 x 2).</li>
</ul>
<h3>Example 2</h3>
<pre class="brush: html">
&lt;html&gt;
&lt;head&gt;
  &lt;style type=&quot;text/css&quot;&gt;
    body {font-size:10px; line-height:1.5em;}
    .parent {font-size:2em;}
    .child {font-size:1.5em;}
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div class=&quot;parent&quot;&gt;
    &lt;div class=&quot;child&quot;&gt;Child&lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<ul>
<li>The parent&#8217;s screen font size would be 20px (10 x 2) with a line height of 30px (20 x 1.5).</li>
<li>The child&#8217;s screen font size would be 30px (10 x 2 x 1.5) also with a line height of 30px.</li>
</ul>
<h2>The calculation</h2>
<p>In the following example we want to write some additional CSS to ensure that the child element has a font size of 10px:</p>
<pre class="brush: html">
&lt;html&gt;
&lt;head&gt;
  &lt;style type=&quot;text/css&quot;&gt;
    body {font-size:16px;}
    .parent {font-size:0.75em;}
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div class=&quot;parent&quot;&gt;
    &lt;div class=&quot;child&quot;&gt;Child&lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>First of all you need to know the font size of the parent element:</p>
<pre class="brush: plain">
16 x 0.75 = 12px
</pre>
<p>Using this we can then calculate the equivalent em value of 1px:</p>
<pre class="brush: plain">
1/12 = 0.083em
</pre>
<p>Now we know the em value of 1px we can then multiply this by the actual pixel value we want:</p>
<pre class="brush: plain">
0.083 x 10 = 0.83em
</pre>
<p>So the full calculation looks like:</p>
<pre class="brush: plain">
(1/12) x 10 = 0.83em
</pre>
<p>Which can be simplied to:</p>
<pre class="brush: plain">
10/12 = 0.83em
</pre>
<p>So all you really need to know is:</p>
<pre class="brush: plain">
Child font size/Parent font size = em value
</pre>
<p>And the resulting CSS and HTML is:</p>
<pre class="brush: html">
&lt;html&gt;
&lt;head&gt;
  &lt;style type=&quot;text/css&quot;&gt;
    body {font-size:16px;}
    .parent {font-size:0.75em;}
    .child {font-size:0.83em;}
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div class=&quot;parent&quot;&gt;
    &lt;div class=&quot;child&quot;&gt;Child&lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>It&#8217;s quite simple really. The only time it can get complicated is when you want to add a child element, with a specific font size, to a hierarchy of nested elements. Typically you would have to individually calculate the font size at each level. Utilising a tool such as <a href="https://addons.mozilla.org/en-US/firefox/addon/1843" target="_blank">Firebug</a> will aid you greatly in these situations as it allows you to select any element on the page and check its font size in pixels, regardless of whether or not is was defined using ems in the stylesheet. You could also try this handy <a href="http://riddle.pl/emcalc/" target="_blank">em calculator</a>.</p>
<h2>In &#8220;real life&#8221;</h2>
<p>Typically if ems are being used to define font sizes on a website you will not find any declarations being made in px, even on root elements like html or body. This allows everything to be relative and scalable and provide accessible content resizing via a browser&#8217;s text re-size option.</p>
<p>The good news is that modern browsers provide a consistent baseline font size of 16px. So if you wanted a default font size of 12px for your website you can define the body style as:</p>
<pre class="brush: css">
body {font-size:0.75em;}
</pre>
<p>The bad news is that IE6 and IE7 are bugged and do not correctly re-size text when the body&#8217;s font size is defined using ems (the resizing is very exaggerated and will shrink and grow text to unreadable proportions). The workaround to this bug is to define the body&#8217;s font size using a percentage:</p>
<pre class="brush: css">
body {font-size:75%;}
</pre>
<p>This works because 75% of 16px is 12px. If you wanted a default font size of 11px you would use 69%. Percentages are obviously another relative unit, and are used extensively for building liquid layouts. Generally if you want to relatively scale your fonts you should stick to the em though, as it provides the best support for implementing consistent spacing and line heights.</p>
<h2>Example websites built using ems</h2>
<p>Take a look at the following sites that use ems for examples of how to structure your stylesheets.</p>
<ul>
<li><span style="color: #551a8b;"><a href="http://www.bbc.co.uk/" target="_blank">http://www.bbc.co.uk</a><br />
</span></li>
<li><span style="color: #551a8b;"><a href="http://www.uswitch.com" target="_blank">http://www.uswitch.com</a></span></li>
<li><span style="color: #551a8b;"><a href="http://www.alistapart.com/" target="_blank">http://www.alistapart.com</a><br />
</span></li>
<li><a href="http://www.csszengarden.com/?cssfile=/063/063.css" target="_blank">http://www.csszengarden.com/?cssfile=/063/063.css</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.webdemon.net/blog/converting-px-to-em/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Web Development</title>
		<link>http://www.webdemon.net/blog/web-development/</link>
		<comments>http://www.webdemon.net/blog/web-development/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 14:21:15 +0000</pubDate>
		<dc:creator>Elliot</dc:creator>
				<category><![CDATA[Craftsmanship]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://blog.webdemon.info/?p=20</guid>
		<description><![CDATA[Building websites is something I&#8217;ve always been into (once Transformers and Street Fighter could no longer do it for me). Initially it was a hobby and then somewhere along the line I made a conscious decision that web development is what I was going to do for a living. It followed suit that once I knew [...]]]></description>
			<content:encoded><![CDATA[<p>Building websites is something I&#8217;ve always been into (once Transformers and Street Fighter could no longer do it for me). Initially it was a hobby and then somewhere along the line I made a conscious decision that web development is what I was going to do for a living. It followed suit that once I knew what I wanted to do, I would want to be good at doing it too.</p>
<p>Regardless of how much I <em>think</em> I know now however, I&#8217;m still trying to overcome the initial feeling of unworthiness from starting up my own web development blog. I did get some sound advice though from one of the developers I&#8217;m working with right now, who told me to write my posts as if I&#8217;m my own audience (essentially as if I&#8217;m talking to myself), because ultimately I should be using my blog to consolidate my own thoughts and further my own understanding of the subject matter. If this means I can help a few fellow devs increase their understanding of the job along the way then great. If these fellow devs subsequently find holes in my posts then even better! We learn from our mistakes.</p>
<p>The main methodologies, processes and technologies I&#8217;ll aim to cover will include:</p>
<ul>
<li>XHTML &amp; CSS</li>
<li>JavaScript</li>
<li>C# .Net</li>
<li>Agile (XP)</li>
<li>S.O.L.I.D</li>
<li>DDD</li>
<li>TDD</li>
<li>DBC (Design by Contract)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.webdemon.net/blog/web-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sensei (??)</title>
		<link>http://www.webdemon.net/blog/sensei/</link>
		<comments>http://www.webdemon.net/blog/sensei/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 20:24:39 +0000</pubDate>
		<dc:creator>Elliot</dc:creator>
				<category><![CDATA[Craftsmanship]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://blog.webdemon.info/?p=1</guid>
		<description><![CDATA[Sensei (??) is a Japanese title used to refer to or address teachers, professors, professionals such as lawyers and doctors, politicians, clergymen, and other figures of authority. The word is also used to show respect to someone who has achieved a certain level of mastery in an art form or some other skill.
Nope, I&#8217;m not [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Sensei (??) is a Japanese title used to refer to or address teachers, professors, professionals such as lawyers and doctors, politicians, clergymen, and other figures of authority. The word is also used to show respect to someone who has achieved a certain level of mastery in an art form or some other skill.</p></blockquote>
<p>Nope, I&#8217;m <em>not</em> a sensei.</p>
<p>In actuality I am an apprentice, and you wouldn&#8217;t believe how long it took me to realise this. It must have been 1 part ignorance and 2 parts pride that was blinding me from the truth; that I wasn&#8217;t as good at my job as I thought I was. It hurt to say it to myself and I&#8217;m glad that at the time of my realisation there were enough talented people around me to inspire me to get better.</p>
<p>In hindsight I can see that the majority of my colleagues were also in the same boat. We didn&#8217;t know that a level of ability much greater than our own could even exist. We were Web Developers, we knew C#, T-SQL, we&#8217;d been hacking HTML since we were at school and we were earning £30k salaries. It was great! We were the elite and at the top of our game. But, for some reason, the business was crumbling around us. It couldn&#8217;t have been our fault, we were the only good thing going for it, it must&#8217;ve been bad management&#8230;</p>
<p>These days I have a greater sense of humility. I also have a much greater appreciation for my craft.</p>
<p>It is inherently difficult for a professional to actually acknowledge that he or she is an apprentice. I&#8217;ve met and worked with developers who are much better versed in the profession than I, themselves self-confessed apprentices. Admitting that I am an apprentice is no longer a problem for me because it only inspires me to learn more. And with a decade or more of learning and growing I doubt I will still be satisfied about how &#8220;good&#8221; I am at what I do. Sometimes the amount of knowledge I feel I need to accumulate can be overwhelming, but I cannot see this line of work ever becoming stale and this is what makes me want to keep doing what I&#8217;m doing.</p>
<p>This blog is for the apprentice web developers out there.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.webdemon.net/blog/sensei/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
