<?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>Bikes and Code &#187; Code</title>
	<atom:link href="http://warrentaylor.ca/tag/code/feed/" rel="self" type="application/rss+xml" />
	<link>http://warrentaylor.ca</link>
	<description>Thinking, actions and related topics</description>
	<lastBuildDate>Fri, 25 Jun 2010 22:49:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Number crunching and buses!</title>
		<link>http://warrentaylor.ca/2009/12/04/number-cruching-and-buses/</link>
		<comments>http://warrentaylor.ca/2009/12/04/number-cruching-and-buses/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 05:57:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[transitdata]]></category>

		<guid isPermaLink="false">http://warrentaylor.ca/?p=258</guid>
		<description><![CDATA[A few days ago, Translink announced that they would be releasing their bus, train and seabus route information in a standard format. A list of every bus stop, route, time, etc might not seem overly exciting to most people, but I love datasets. Admittedly, I often don&#8217;t know exactly what to do with datasets, but [...]]]></description>
			<content:encoded><![CDATA[<p>A few days ago, <a href="http://translink.ca">Translink</a> announced that they would be releasing their bus, train and seabus route information in a <a href="http://code.google.com/transit/spec/transit_feed_specification.html">standard format</a>. A list of every bus stop, route, time, etc might not seem overly exciting to most people, but I love datasets. Admittedly, I often don&#8217;t know exactly what to do with datasets, but that&#8217;s hardly the real issue here. Anyhow, this seemed like a promising thing for me to do and I downloaded it, unzipped it and spent a couple of hours prepping a Rails project to serve as a new home for it.</p>
<p>Roughly 500 routes, 8700 stops, 126000 trips and 3.4 million timepoints at those stops. Not a whopping amount of data, but enough to start having some fun. My initial plan was just to be able to plot the stops for a given route onto google maps. That&#8217;s done in it&#8217;s ugly glory at my <a href="http://stopfinder.high-water.ca">stopfinder</a>. If you want to search for a 1 or 2 digit route, put in the leading 0&#8217;s. Sorry, haven&#8217;t done that yet.</p>
<p>My next steps are going to be to publish a number of primitive operations on the data with results in JSON format. Things like &#8216;closest stop to lat,lon&#8217;, &#8216;how to get from stop x to stop y&#8217;, and other similar sorts of things. The idea being that if I can build up a suitable library of common operations on the dataset, any future ideas that do come to mind should be relatively easy to implement.</p>
<p>That and if anyone does want to do some data mining, well, this is an option. I&#8217;ll post any updates, formats and that sort of thing on this site as I work through it. In general, the services will be pretty much simply URL based and will return raw JSON. Nothing special, but fairly easy to parse and work with. I have a relatively irrational dislike of XML which I will probably get over at some point, but it will take someone making a very good argument.</p>
]]></content:encoded>
			<wfw:commentRss>http://warrentaylor.ca/2009/12/04/number-cruching-and-buses/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quality is Job One</title>
		<link>http://warrentaylor.ca/2009/10/12/quality-is-job-one/</link>
		<comments>http://warrentaylor.ca/2009/10/12/quality-is-job-one/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 02:52:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[projectmanagement]]></category>
		<category><![CDATA[qa]]></category>
		<category><![CDATA[softwaredevelopment]]></category>

		<guid isPermaLink="false">http://warrentaylor.ca/?p=247</guid>
		<description><![CDATA[Uh, yeah.
So it is, but actually stating that, or anything along those lines? Way to kill the team, boss! (See Peopleware)
That said, quality assurance, quality control, QA, call it what you want, but it&#8217;s one of the more misunderstood aspects to software development. Oh sure, everyone knows that they need to do more QA or [...]]]></description>
			<content:encoded><![CDATA[<p>Uh, yeah.</p>
<p>So it is, but actually stating that, or anything along those lines? Way to kill the team, boss! (See Peopleware)</p>
<p>That said, quality assurance, quality control, QA, call it what you want, but it&#8217;s one of the more misunderstood aspects to software development. Oh sure, everyone knows that they need to do more QA or better QA, but lip service is about all that is ever paid towards it. I am notably not including in my &#8216;everyone&#8217; those who feel that QA can be completely automated. You guys are wrong and I&#8217;m going to leave it at that. You also may think you don&#8217;t need to do it, see <a title="Top 5 (wrong) reasons you don't have testers" href="http://www.joelonsoftware.com/articles/fog0000000067.html" target="_blank">this article</a> for some classic arguments against that fallacy.</p>
<p>I&#8217;m not going to go into depth about QA, how to do it, best practices or anything along those lines as I&#8217;m fairly unqualified. That said, I&#8217;m not really qualified to talk about anything, but that doesn&#8217;t really stop me.</p>
<p><strong>QA is a processes, not a task</strong></p>
<p>This particular fail case is something I&#8217;ve seen in multiple organizations now. The most obvious symptom of this is when management has decreed that there is a block of a few hours set aside to &#8216;do QA&#8217; on an application with a few hundred known use cases. Another obvious indicator is when other employees are volunteered to do a few hours of QA on top of their normal job. Think you&#8217;re going to get good results from that?</p>
<p>The root cause of this failure is simply not understanding how QA works, so let&#8217;s walk through it a bit. In a very broad sense, the general list of tasks for QA is something like this:</p>
<p>1. Go through the basic cases</p>
<p><span style="background-color: #ffffff;">2. Go through the corner cases</span></p>
<p>3. Go through obscure, known failure cases</p>
<p>4. Exploratory testing</p>
<p>5. Automating 1, 2 and 3.</p>
<p>So, how does this fit into a day of work? Let&#8217;s find out:</p>
<p><span style="background-color: #ffffff;">First off, we&#8217;re going to go through the basic use cases for the application. Then, there is a pile of corner cases that are pretty valid that need to be checked out. Then it&#8217;s time to check all the really obscure, but horribly embarrassing failures that have been seen before. From there we can finally&#8230;What? You changed the code? Okay, first off, we&#8217;re going to go through the basic use cases for the application&#8230;</span></p>
<p>Interruption here! &#8220;Silly tester,&#8221; says the savvy developer, &#8220;You only need to re-test the parts of the system that were changed.&#8221; Nice theory, but wrong in many, many ways. Simply put, if this was the case, testing outside of developers would never be needed. That generally goes well.</p>
<p>Back to the task at hand, do the basic cases, do the corner caWHAT? Changed again? Basic cases&#8230;</p>
<p>The real job of QA starts at step 4, which we haven&#8217;t even seen yet. Exploratory testing is finding the embarrassing defects before they get out into the wild. A good tester at this phase is going to break your application in ways you haven&#8217;t even dreamed of. In ways that only 0.1% of your users would ever try to do. Of course, if 0.1% of your users do it, and you get 10k uniques per day? That&#8217;s 10 people <em>per day</em> that are going to hit this embarrassing bug that how could you possible let into the wild and I&#8217;m taking my business elsewhere right now as I obviously cannot trust you with my data. And if one of those has a blog? Heh. Have fun with that.</p>
<p>So the epic fail with having 16 hours scheduled in to test your quarter million lines of code application? If you&#8217;ve got bug fixing going on at the same time, any of your competent testers will never get past step 1. Any testers that listen to the savvy developer, or worse, <em>are</em> the savvy developer will miss basic cases and you deploy with fundamental breaks.</p>
<p>The purpose of QA is not to have someone say, &#8220;Wonderful developer, your application is perfect!&#8221; If I hear that from a tester, I assume the person isn&#8217;t doing their job very well. QA should hurt your feelings. Assumptions you made should be laid bare and justified or thrown out if incorrect. This is often the last line of defense before your customers see your application, take it seriously.</p>
]]></content:encoded>
			<wfw:commentRss>http://warrentaylor.ca/2009/10/12/quality-is-job-one/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Learnings</title>
		<link>http://warrentaylor.ca/2009/02/26/new-learnings/</link>
		<comments>http://warrentaylor.ca/2009/02/26/new-learnings/#comments</comments>
		<pubDate>Thu, 26 Feb 2009 05:09:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[hadoop]]></category>

		<guid isPermaLink="false">http://warrentaylor.ca/?p=221</guid>
		<description><![CDATA[During the course of interviews I have gone through in recent weeks, a significant portion of my time was spent refreshing my knowledge of basic theoretical computer science type things. The reason was fairly simple in that I wanted to be able to more or less instantly be able to answer any of the basic [...]]]></description>
			<content:encoded><![CDATA[<p>During the course of interviews I have gone through in recent weeks, a significant portion of my time was spent refreshing my knowledge of basic theoretical computer science type things. The reason was fairly simple in that I wanted to be able to more or less instantly be able to answer any of the basic knowledge questions. I could have independently come up with various graph traversal algorithms given a bit of time as I did have them stored deep in my grey matter. That said, it seemed better to freshen up the on the details so those particular nodes in my brain had a bit more weight to them.</p>
<p>So there was lots of refreshing of information, which was notably taking up my brain time which meant to less time learning wholly new things. This is okay, but one of the best things about software development is the constant learning. So when a company mentioned that they were using <a href="http://hadoop.apache.org/" target="_blank">Hadoop</a> and <a href="http://hadoop.apache.org/hbase/" target="_blank">HBase</a>, this was instantly exciting to me as it gave me a perfectly good reason to go and research some new technologies.</p>
<p>If you haven&#8217;t heard of these two projects, and unless you are specifically working with them, you probably haven&#8217;t, Hadoop and HBase are free software implementations of two systems designed by Google, <a href="http://labs.google.com/papers/mapreduce.html" target="_blank">MapReduce</a> and <a href="http://labs.google.com/papers/bigtable.html" target="_blank">BigTable</a> respectively. MapReduce is a framework developed by Google to facilitate processing and working with large datasets across a distributed network. BigTable is essentially a way to store structured data across a distributed network, though it is important to note that this structured in terms of nested hashes, not in a traditional relational manner.</p>
<p>Google had a few motivations for building something like this. They regularly worked with gigantic datasets, their search index itself, search logs and Google Maps tilesets as a few examples. Analyzing these datasets took massive CPU resources and a distributed approach was more or less deemed the only practical way to actually compute solutions. MapReduce takes the classic divide and conquer approach to solving a problem. The problem space is split up and doled out to dozens, hundreds or thousands of computers. This is the map phase. Results from each piece of the calculation is then returned to the master computer which then reduces the results down into some sort of final output.</p>
<p>This approach has been used for solving all sorts of distributed problems, but MapReduce was unique in that it was a framework, usable for a variety of tasks. The hard parts of managing a distributed network for a single calculation are often just that, the management tasks. Deciding which servers get which chunks of data depending on where they are in the network. Deciding if a server has crashed, or if it&#8217;s just slow. How and what, if any, data do you duplicate across multiple nodes to guarantee that you get an answer. These are all concerns that must be addressed when creating a distributed application.</p>
<p>What Google did with MapReduce was abstract away the management tasks so their developers could focus on actually writing the algorithms to solve the problems. Hadoop is a Java version of MapReduce. But I digress.</p>
<p>What was really nice was that in the midst of this review and stress, as looking for meaningful employment is not without some concerns, was an opportunity to read a couple of new papers and learn some new things. So I promptly went and wrote a distributed program to calculate how many lines each character in the collected works of Shakespeare spoke. This was not something that required much computer horsepower, but it was pretty cool to run the thing on two computers and get chunks distributed to each of them.</p>
<p>So that went over well. I am going to post this now as I have been sitting on this for a while and not finishing it up. I need to lower my standards somewhat as, to paraphrase Joel and Jeff, I only have one reader anyway.</p>
]]></content:encoded>
			<wfw:commentRss>http://warrentaylor.ca/2009/02/26/new-learnings/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resolutions &#8211; 2009</title>
		<link>http://warrentaylor.ca/2009/01/21/resolutions-2009/</link>
		<comments>http://warrentaylor.ca/2009/01/21/resolutions-2009/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 17:53:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[project]]></category>

		<guid isPermaLink="false">http://warrentaylor.ca/?p=210</guid>
		<description><![CDATA[I read quite a bit. I read fiction, fantasy and sci-fi mostly, but I am not opposed to a good mind numbing blockbuster either. I read non-fiction, recently the works of Pierre Berton have caught my interest, though I tend to read a fair bit of political philosophy books as well. I read computer books, [...]]]></description>
			<content:encoded><![CDATA[<p>I read quite a bit. I read fiction, fantasy and sci-fi mostly, but I am not opposed to a good mind numbing blockbuster either. I read non-fiction, recently the works of <a href="http://en.wikipedia.org/wiki/Pierre_Berton" target="_blank">Pierre Berton</a> have caught my interest, though I tend to read a fair bit of political philosophy books as well. I read computer books, my desk and surrounding area is littered things I have read and occasionally need to reference or just read a chapter of to refresh my memory. Finally, like most regular Internet users, I read blogs.</p>
<p>It was directly due to the words of a <a href="http://codinghorror.com" target="_blank">couple</a> <a href="http://joelonsoftware.com" target="_blank">of</a> <a href="http://steve-yegge.blogspot.com/" target="_blank">well</a> <a href="http://www.loudthinking.com/" target="_blank">respected</a> bloggers that I started this one. There are multiple reasons. By writing, you exercise the communication part of the brain, which is always good. By putting up a public blog, it becomes easier to control your own Internet presence. As long as your writing is even passable, it is good marketing for yourself. These were just a few of the points that were made. I bought into it and am now going on a couple of months of roughly weekly posts. I believe I can keep this up rather easily.</p>
<p>So, one mission accomplished.</p>
<p>On more than one occasion, one of these people who are well respected in the software development field will mention something about a compiler. Specifically, that every serious programmer should write one at some point in time. This makes sense as a compiler tends to be one of those bits of software that does a good job of covering pretty much everything that a programmer needs to do somewhat regularly. Lots of string manipulation, lots of recursion, lots of knowledge about how a computer actually works, memory management, the list goes on.</p>
<p>I have not yet written a compiler. It is something that I have wanted to do more than once, but never actually sat down and started working on it. I&#8217;ve seen enough mentions in passing recently that I feel it is time for me to complete this particular rite of passage and actually write a compiler. I am capable of it, but I needed the push down the right path to do it.</p>
<p>So it is not going to be a huge project and I&#8217;m not going to sink huge amounts of time into it, but I do have goals for it that should be completed by the end of 2009. I need to define my own language, it should have ifs and whiles, it should evaluate mathmatical expressions correctly. I think I will compile to JVM compatible byte code, though I have not decided on that yet either. That would theoretically allow me to use Java libraries as well, which is appealing. It&#8217;s not going to be object oriented, mainly as this is a learning experience and I don&#8217;t want to bite off more than I can chew so to speak.</p>
<p>I&#8217;m leaning towards Ruby for the project, but am stronger with Java which will make some things significantly easier. I will likely make the final decision once I&#8217;ve read some of the Dragon book and know more about what I am getting into. My intention is to write it all at this point. I don&#8217;t think I will use a parser generator or anything like that, simply as the point of this is to learn how to write a parser/lexer/etc.</p>
<p>So that&#8217;s the plan for 2009, dedicate a couple of hours a week to this project and hopefully be able to run some of my own code in my own language by the end of the year. Who knows if that&#8217;s reasonable, but it should be&#8230; illuminating.</p>
]]></content:encoded>
			<wfw:commentRss>http://warrentaylor.ca/2009/01/21/resolutions-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The customer is always right</title>
		<link>http://warrentaylor.ca/2009/01/06/the-customer-is-always-right/</link>
		<comments>http://warrentaylor.ca/2009/01/06/the-customer-is-always-right/#comments</comments>
		<pubDate>Tue, 06 Jan 2009 14:53:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[business]]></category>

		<guid isPermaLink="false">http://warrentaylor.ca/?p=184</guid>
		<description><![CDATA[I&#8217;m back. Took a bit of a break over the Christmas season and enjoyed not working on software, programming and business for a few days. I did have a few interviews, which is always stressful, so I tried a bit harder to actually enjoy the downtime that I did have.
During one of the interviews a [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m back. Took a bit of a break over the Christmas season and enjoyed not working on software, programming and business for a few days. I did have a few interviews, which is always stressful, so I tried a bit harder to actually enjoy the downtime that I did have.</p>
<p>During one of the interviews a comment was made in passing about programmers not wanting to talk to clients. This is a popular topic for developers to joke about, but I had always treated that as a joke. When it came down to the business of doing business, well, talking to your clients is just to be expected. Ultimately, they are the reason you have a job, so there is something very serious to be said for treating your clients with respect.</p>
<p>This particular ramble is going to go down a couple of paths, I&#8217;m going for breadth more than depth here.</p>
<p>Generally a software developer is writing code for one of two different reasons. You are writing software for a new product that may or may not have clients yet, you may be trying to carve a niche into an existing market or creating a new one. The second and by far the most common reason is that you are contracted to write software that accomplishes some task for another person/organization/demographic/etc.</p>
<p>So what does that make our job as developers? Our clients or employers have problems that they have decided for whatever reason are best solved by computers. We are to analyze that problem and develop a solution. Hopefully that solution makes our clients more money or saves them money by making existing processes more efficient. If the post-mortem shows that the cost/benefit ratio is less than 1, then we have failed. It really is that simple.</p>
<p>Solving a client&#8217;s problem is our job. One of the aspects that makes software development so much fun is that many times our client does not know exactly what they want. This may be a source of entertainment for us, but is a very important thing to keep in mind. The world of programming is one of absolutes, the computer does exactly what we tell it to in a nice and ordered fashion. (Defects being the times when we tell the computer to do the wrong thing) The real world is much less black and white. What this means is that we have to listen to our clients and understand what they are trying to accomplish. If the request is vague, we have to figure this out by asking the proper questions to build a better picture of their business.</p>
<p>This is challenging.</p>
<p>Worse, they may know exactly what they want, but are wrong. I have personally been asked to implement things with very little more than a vague bit of hand waving and comments to the effect of &#8220;We think having something that does <em>x</em> would be nice.&#8221; In this particular case, <em>x</em> was fairly obviously, to a developer of the system who had detailed usage statistics, not what our users needed. They actually needed <em>y. </em>Through some discussion with our clients, our team was able to make the case that <em>x</em> would only help less than 1% of our users, and a particular subset of users who <em>did not and would not spend any money.</em> That probably helped our case somewhat. We ended up implementing a modified <em>y</em> and our customer service requests for a certain class of problem dropped significantly.</p>
<p>What was interesting to me from a personal standpoint was that the same people who were arguing to just implement <em>x</em> were the same ones who did not want to talk to the client. Now, I should clarify, I don&#8217;t mean, the grudging, &#8220;Oh no, small talk and meetings with people I don&#8217;t know&#8221;, the typical <a href="http://en.wikipedia.org/wiki/Introvert" target="_blank">introvert</a> response where you know that you will come out of the meeting drained, though hopefully with the problem solved. In this case I mean attempting to make the case that it was not our job to talk to the client to figure out what they needed.</p>
<p>This did not sit well with me. There is a reason that the principles of the <a href="http://agilemanifesto.org/principles.html" target="_blank">Agile Manifesto</a> have several points which specifically reference and talk about dealing with the customer. These points all touch on dealing with the customer with respect and understanding as they are the experts in their own business. We are experts in software development.</p>
<p>As software developers, our job is to learn from our clients to build systems that improve their business. To do that, we will always need to interact with our clients to determine their needs and meet them.</p>
]]></content:encoded>
			<wfw:commentRss>http://warrentaylor.ca/2009/01/06/the-customer-is-always-right/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A Tech Blogger&#8217;s Right of Passage</title>
		<link>http://warrentaylor.ca/2008/12/21/a-tech-bloggers-right-of-passage/</link>
		<comments>http://warrentaylor.ca/2008/12/21/a-tech-bloggers-right-of-passage/#comments</comments>
		<pubDate>Sun, 21 Dec 2008 15:42:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[reading]]></category>

		<guid isPermaLink="false">http://warrentaylor.ca/?p=173</guid>
		<description><![CDATA[It seems that everyone who writes about programming topics in a blog format eventually writes an article on what books they feel are important to read to improve professionally. This shouldn&#8217;t be surprising really. Generally speaking if someone is going through the trouble of actually writing an article on a topic, it&#8217;s probably safe to [...]]]></description>
			<content:encoded><![CDATA[<p>It seems that everyone who writes about programming topics in a blog format eventually writes an article on what books they feel are important to read to improve professionally. This shouldn&#8217;t be surprising really. Generally speaking if someone is going through the trouble of actually writing an article on a topic, it&#8217;s probably safe to say that they enjoy reading about the topic. Write what you know, etc.</p>
<p>The difficulty is that there are only so many programming books that are truly classics. While I appreciate and enjoy learning from well written Hibernate or book on the Google Web Toolkit, ultimately, any software book that starts to discuss a specific framework will quickly become obsolete. As one of my personal definitions of classic is a book that does not grow old with time, this means that a huge percentage of mass market &#8220;Learn how to gidazzle with widget fooxily&#8221; types of books will never reach the classic status.</p>
<p>Unfortunately, it seems that the dominant type of programming book that is on the shelf in your local bookstore are exactly the ones that will be out of date in a couple of years. This makes me somewhat sad as if the market is for books that quickly go obsolete, the number of people that will write books that go on to be classics will be smaller simply on a basis of supply and demand. I&#8217;m not sure where this leaves us. I like buying technology of the month books as well, so I help this. All in all, it&#8217;s likely not a problem I suppose. I guess I just wish I could actually find <a href="http://www.amazon.ca/gp/product/0932633439?ie=UTF8&amp;tag=bikandcod-20&amp;linkCode=as2&amp;camp=15121&amp;creative=330641&amp;creativeASIN=0932633439">Peopleware</a><img style="border:none !important; margin:0px !important;" src="http://www.assoc-amazon.ca/e/ir?t=bikandcod-20&amp;l=as2&amp;o=15&amp;a=0932633439" border="0" alt="" width="1" height="1" /> or the <a href="http://www.amazon.ca/gp/product/0201835959?ie=UTF8&amp;tag=bikandcod-20&amp;linkCode=as2&amp;camp=15121&amp;creative=330641&amp;creativeASIN=0201835959" target="_blank">Mythical Man Month</a> in print on a shelf somewhere.</p>
<p>So now I reach the real crux of the matter. If you are reading this, then you probably read other blogs by various guys in the software industry and they already have pretty much written about the books that you absolutely should read. More, most of you have probably read some of the books that <a href="http://www.joelonsoftware.com/articles/FogCreekMBACurriculum.html" target="_blank">Joel</a> or <a href="http://www.codinghorror.com/blog/archives/000020.html" target="_blank">Jeff</a> have suggested in the past. So I&#8217;d simply be duplicating content listing the exact same classic books and suggesting that a serious programmer should read them.</p>
<p>So this has all been a debate as to whether or not to do that. You see, I actually enjoy reading reading lists, especially if there is a little blurb about why the book is good. Every once in a while a wholly new book turns up and I will add it to my &#8216;to read&#8217; list and I am the wiser for it. Still, I think I can stand up to it and avoid actually creating a reading list of some form.</p>
<p>That about wraps it up for today, this was more of a random ramble than anything else. Back to actual geek topics soon enough.</p>
]]></content:encoded>
			<wfw:commentRss>http://warrentaylor.ca/2008/12/21/a-tech-bloggers-right-of-passage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Progressive enhancement and AJAX</title>
		<link>http://warrentaylor.ca/2008/12/09/progressive-enhancement-and-ajax/</link>
		<comments>http://warrentaylor.ca/2008/12/09/progressive-enhancement-and-ajax/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 15:07:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[hijax]]></category>
		<category><![CDATA[projectmanagement]]></category>
		<category><![CDATA[softwaredevelopment]]></category>

		<guid isPermaLink="false">http://warrentaylor.ca/?p=148</guid>
		<description><![CDATA[Once upon a time, the world wide web was invented. I&#8217;m not really going to talk about that. Later, something called the Hypertext Markup Language (HTML) was developed. It let you share nicely laid out documents over the web. And it was Awesome.
HTML had some limitations though, it was kind of verbose and you had [...]]]></description>
			<content:encoded><![CDATA[<p>Once upon a time, the world wide web was invented. I&#8217;m not really going to talk about that. Later, something called the <a href="http://en.wikipedia.org/wiki/Html" target="_blank">Hypertext Markup Language (HTML)</a> was developed. It let you share nicely laid out documents over the web. And it was Awesome.</p>
<p>HTML had some limitations though, it was kind of verbose and you had to mix up your content, paragraphs and such, with code that was used to show how the thing should be laid out and look. At more or less the same time, there were two new pushes to make HTML better. <a href="http://en.wikipedia.org/wiki/Javascript" target="_blank">Javascript</a> (1995) was developed to allow a web site designer to make things change on a page. No longer would a web page be a simple static document like a magazine or newspaper article. <a href="http://en.wikipedia.org/wiki/Css" target="_blank">Cascading Style Sheets</a> (CSS &#8211; 1995-1996ish) was created to help a web designer keep the content, the article, online store, etc. distinct and in a different place from the stuff that was responsible for how that content actually looked on the page.</p>
<p>And this was Awesome, except, it wasn&#8217;t. At the time that these developments were happening, the <a href="http://en.wikipedia.org/wiki/Browser_war#The_first_browser_war" target="_blank">First Browser War</a> was underway. Netscape put some Javascript and CSS stuff into their browser. Microsoft put different things into theirs. Bit players in the browser wars did other things. The end result was that if you wanted to make a sufficiently sophisticated web page, you had to create two or three versions of the thing so that it actually worked in multiple browsers. Now, for a long while, this did not actually matter as Internet Explorer 6 held so much market share that you could target IE6 only and get away with it.</p>
<p>That is no longer the case. Arguably, it was never the case, but there were lots of so called &#8216;web developers&#8217; who happily wrote sites that worked in IE6 and IE6 alone. There are several major browsers now. More importantly, there are several major devices now. Blackberries, cell phones and game consoles all have limited support for browsing the web in various forms. It&#8217;s probably a good idea to try to write your web code in such a way it works in as many platforms as possible. More specifically, at least the major platforms that your clients are using.</p>
<p><strong>Approaches</strong></p>
<p>Inevitably, however, some of the fancy dynamic content, crazy layouts or Javascript dancing puppies will not work on some platform that at least some of your customers are using. There are a couple of different strategies for dealing with this scenario: <a href="http://en.wikipedia.org/wiki/Progressive_enhancement" target="_blank">Progressive Enhancement</a> and <a href="http://en.wikipedia.org/wiki/Graceful_degradation" target="_blank">Graceful Degradation</a>. Effectively, the end result of either of these strategies is the same thing. A website that functions properly under just about every browser platform. There is overlap between the two strategies, in that you can safely say a website built via a progressive enhancement strategy will degrade gracefully. That said, there is definitely a difference in the development process when building a web application in either of these manners.</p>
<p>Having worked on projects that focused on graceful degradation, I can offer my opinion that it is a route fraught with problems. My gut feeling is that if you are going this route, you&#8217;re almost better off writing off customers who don&#8217;t have your minimum supported browser.</p>
<p><strong>Progressive Enhancement and HIJAX</strong></p>
<p>I&#8217;m mostly going to talk about progressive enhancement now as my current project has gone that route. I mainly went that way as I was concerned with the smell of the code that I had written or worked on in the past that went the other way around. Taking a full featured, beautiful Web 2.0 application and trying to hack in static HTML support was difficult and led to some fragile functionality in places. Progressive enhancement seemed to solve that problem in that you started with a functional, solid HTML version and then began to add the flashy enhancements.</p>
<p>Google for HIJAX and read some of the blog posts you find, all are pretty short and give you an overview of the approach I am making with this particular application. There isn&#8217;t really a definitive definition of HIJAX, suffice it to say, the point of the thing is what I outlined above. Normal, old fashioned site first, then start writing the flash. The basic philosophy is &#8220;<a href="http://domscripting.com/blog/display/41" target="_blank">Plan for AJAX from the start. Implement AJAX at the end</a>.&#8221;</p>
<p>Of course, there is <a href="http://en.wikipedia.org/wiki/No_Silver_Bullet" target="_blank">no silver bullet</a>.</p>
<p>While I truly do like the development process that follows with HIJAX, I cannot help but feel I have traded one type of code smell with another. Well, in this case, it isn&#8217;t really code smell, it&#8217;s more of a project management smell. The single biggest problem I have with the simple HIJAX philosophy is how simply it discounts the nature of web applications.</p>
<p><strong>Implement AJAX at the end.</strong></p>
<p>This is where it all falls apart. Anyone who has built web application that goes beyond the trivial knows that there is no end. Paul Graham talks about the advantages to web development in <a href="http://www.paulgraham.com/road.html" target="_blank">The Other Road Ahead</a>. He has an entire section dedicated to releases and notes that in a web application, you really don&#8217;t have releases. You have features that you deploy one or two at a time.</p>
<p>So if there is no end, implementing AJAX at the end isn&#8217;t really possible. So the HIJAX philosophy migrates more into a &#8220;Plan for AJAX from the start. Implement AJAX in chunks as you go along.&#8221; This is notably still different from &#8220;Implement AJAX from the start&#8221;, but must be pointed out. The majority of articles and essays on this topic that I have read thus far do not take a high level perspective. They deal with specific implementation issues and provide an outline that works at the feature level. The naive philosophy will not work when applied to an entire project.</p>
<p>This is not to say that it is a lost cause and we should get back to writing rich applications that only work in specific versions of Firefox. Progressive enhancement is the way to go for a general purpose application on the Internet where you do not want to drive away any customers. HIJAX, on the other hand, is a nice buzzword for a simplified philosophy that I think will die out quickly as it becomes apparant that it is just a bit too simple.</p>
]]></content:encoded>
			<wfw:commentRss>http://warrentaylor.ca/2008/12/09/progressive-enhancement-and-ajax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cap deploy</title>
		<link>http://warrentaylor.ca/2008/12/02/cap-deploy/</link>
		<comments>http://warrentaylor.ca/2008/12/02/cap-deploy/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 20:57:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://warrentaylor.ca/?p=139</guid>
		<description><![CDATA[For the past couple of weeks, between post start-up brain resting, job searching and cover letter writing, I have been working on a little scratch the itch project.
You know, the ones that we developers have all the time. &#8220;I really want something that does X, but everything currently out there kind of sucks.&#8221; Though, recently [...]]]></description>
			<content:encoded><![CDATA[<p>For the past couple of weeks, between post start-up brain resting, job searching and cover letter writing, I have been working on a little scratch the itch project.</p>
<p>You know, the ones that we developers have all the time. &#8220;I really want something that does <em>X</em>, but everything currently out there kind of sucks.&#8221; Though, recently I&#8217;ve found most of the things that I want are already out there, but they are a pain to use. I&#8217;m not sure where I read it, most likely either <a href="http://steve-yegge.blogspot.com/" target="_blank">Steve Yegge</a> or <a href="http://joelonsoftware.com" target="_blank">Joel Spolsky</a>, but the general gist of the thing was that you could probably make a decent living taking some decent products out there and simplifying them down so that any grandmother could use them.</p>
<p>At about this time of year, I start to get questions about what sorts of things I would be interested in for Christmas. I generally respond with blank stares as I really can&#8217;t come up with much that I need. That said, throughout the year, I will occasionally stumble across something that might be fun or practical, but I can&#8217;t really justify purchasing it myself. What I needed was a way to list those things somehow and let my family see it online.</p>
<p>I took a crack at doing a wishlist a couple of years ago as a trial Ruby on Rails project, but I was pretty busy with other things at the time and while it was technically functional, it wasn&#8217;t really any easier than what was already out there. This time around, I took a look at some other wishlists on the market and while a few were good, a few were okay, none really satisfied me. This is probably due to the fact that I had been itching for a new programming project for a bit. Anyhow, I took a look at what the other sites offered and started coding. I have just put a closed beta onto a live server for friends and family and should be ready for a wider audience shortly.</p>
<p>Currently it&#8217;s good old fashioned HTML, no rich Javascript features or any fancy AJAX yet. That&#8217;s coming, but my goal is to make the thing work well with a simple UI, then enhance it slowly. My past couple of projects focused on building a rich web user interface first, which was followed by a half hearted attempt to bolt on a simpler version for browsers that do not have full Javascript support. This time, I am taking the opposite approach, to make a user interface that can run on any browser under the sun, then start adding features to make it more dynamic. Is this a good approach? Possibly, possibly not but I am going to go with it this time around. The only way to really learn if a strategy is a good one is to attempt to use it.</p>
<p>So, this is a Ruby on Rails project. I am trying to do things the Rails way as much as possible. I am using an Apache web server to serve static content and load balance between what is currently a cluster of three mongrel servers. This is massive overkill, but was fun to setup. Deployment is done with <a href="http://www.capify.org/" target="_blank">capistrano</a> and I am developing in <a href="http://www.netbeans.org/" target="_blank">Netbeans</a>, which didn&#8217;t crash as much as <a href="http://www.aptana.com/rails/" target="_blank">Aptana RadRails</a>, so I&#8217;m using it. Netbeans is a bit uglier, but what can you do&#8230; Naturally, everything is done in Linux. Subversion for source code and I&#8217;m trying out <a href="http://www.mantisbt.org/" target="_blank">Mantis</a> for bug tracking and such. All in all, configuration overhead probably ate up about two days learning everything and bashing my head against various walls.</p>
<p>Rails has been great to learn so far. I&#8217;m only getting faster at adding new features and cranking out more appropriate testing scenarios, which is good. Not only that, but I can see a lot of things that will improve my Java coding abilities as well. I suppose that&#8217;s why side projects are generally encouraged&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://warrentaylor.ca/2008/12/02/cap-deploy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Book Review: Rails Recipes</title>
		<link>http://warrentaylor.ca/2008/11/24/book-review-rails-recipes/</link>
		<comments>http://warrentaylor.ca/2008/11/24/book-review-rails-recipes/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 16:53:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[gettingbetteratstuff]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://warrentaylor.ca/?p=112</guid>
		<description><![CDATA[A very important part of continually improving as a software developer is reading. I do that a fair bit and following the suggestion buried somewhere deep in Code Complete, I try to read at least a few technical books per year. I generally average one every 1-2 months and will occasionally ruminate on some of [...]]]></description>
			<content:encoded><![CDATA[<p>A very important part of continually improving as a software developer is reading. I do that a fair bit and following the suggestion buried somewhere deep in <a href="http://www.amazon.ca/gp/product/0735619670?ie=UTF8&amp;tag=bikandcod-20&amp;linkCode=as2&amp;camp=15121&amp;creative=330641&amp;creativeASIN=0735619670">Code Complete</a><img style="border:none !important; margin:0px !important;" src="http://www.assoc-amazon.ca/e/ir?t=bikandcod-20&amp;l=as2&amp;o=15&amp;a=0735619670" border="0" alt="" width="1" height="1" />, I try to read at least a few technical books per year. I generally average one every 1-2 months and will occasionally ruminate on some of the better ones.</p>
<p>I took a stab at making a <a href="http://www.rubyonrails.org" target="_blank">Ruby on Rails</a> application a couple of years ago and when the start-up fell apart, I felt that I should use my now existing free time to give it another shot. The technology seemed fairly interesting and while my first crack ended up being relegated to the dust bin of my back up hard drive, it made me want to learn more about the language and framework. The project I have been working on for the past couple of weeks will likely get launched to family and friends in the next week or so and I&#8217;ll likely open it up to the public assuming there aren&#8217;t any real problems.</p>
<p>One thing that I discovered with Ruby on Rails the first time around is that the framework seemed almost sinister in it&#8217;s ability to detect a Java programmer. You&#8217;d go through, doing things, never quite sure what you have to write and what the framework does for you. Eventually, you&#8217;d step on metaphorical toes of Rails and things would silently stop working. Even worse, you&#8217;d get an exception or error from deep in the framework&#8217;s stack. It was as if there was some special code in place to detect common patterns from curious Java developers and would blow up in our faces. Probably not, but that&#8217;s what it felt like.</p>
<p>I picked up <a href="http://www.amazon.ca/gp/product/0977616606?ie=UTF8&amp;tag=bikandcod-20&amp;linkCode=as2&amp;camp=15121&amp;creative=330641&amp;creativeASIN=0977616606">Rails Recipes</a> a couple of weeks ago now and am very glad I did. The book is laid out in a fairly similar manner to the Gang of Four&#8217;s <a href="http://www.amazon.ca/gp/product/0201633612?ie=UTF8&amp;tag=bikandcod-20&amp;linkCode=as2&amp;camp=15121&amp;creative=330641&amp;creativeASIN=0201633612">Design Patterns</a><img style="border:none !important; margin:0px !important;" src="http://www.assoc-amazon.ca/e/ir?t=bikandcod-20&amp;l=as2&amp;o=15&amp;a=0201633612" border="0" alt="" width="1" height="1" />, in that it is really a collection of fairly unrelated strategies to conquer various problems. There are sections on how to improve your Rails testing, how to better use the built in Rails support for the Prototype and script.aculo.us Javascript libraries, common ActiveRecord (Rails data abstraction layer for those who haven&#8217;t used rails), etc.</p>
<p>The book is well written and to the point. I read through most of the recipes which were relevant to me in less than a day. What was really nice was that there were several how to guides for things which appear in many real projects, but are a bit more sophisticated than what usually appears in the Rails tutorials found in the wild on the Internet. Things like self referential many to many relationships are common enough that you have to know that there is support for it built into Rails, but exactly which incantations are required to correctly set it up are not exactly clear.</p>
<p>Rails Recipes is excellent for things like this. Tasks that are common and are a part of the framework, but are just complicated enough that the basic tutorials do not cover them. I had found that there was a large gap in documentation online between the Rails newbie guides and Rails expert solutions. This book fills that gap nicely.</p>
<p>Many books specific to languages and frameworks, once you have advanced beyond a certain proficiency level they cease to be useful. Rails Recipes is not immune to this and while I am not there yet, I can see the day when I look at the topics covered and think, &#8220;How quaint.&#8221; That said, though, I definitely feel that this book will help me get to that point more quickly and efficiently than I would have done alone or with the help of the documentation that is currently published on the Internet.</p>
<p>For me, this was definitely worth the investment. If you are a Rails guru, maybe skim it in a bookstore first before buying, but if you are just getting over the rookie phase and looking for the next logical step to take to improve your abilities, this is a pretty good book to go with.</p>
]]></content:encoded>
			<wfw:commentRss>http://warrentaylor.ca/2008/11/24/book-review-rails-recipes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Hugeness</title>
		<link>http://warrentaylor.ca/2008/11/19/the-hugeness/</link>
		<comments>http://warrentaylor.ca/2008/11/19/the-hugeness/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 16:24:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://warrentaylor.ca/?p=104</guid>
		<description><![CDATA[Most of what I&#8217;m going to ramble about here was covered much more eloquently and in far greater depth in Beyond Java. These are my personal feelings and anecdotes on Java and it&#8217;s history. I should also note that despite what appears to be a moderately negative tone, I still do use Java extensively and [...]]]></description>
			<content:encoded><![CDATA[<p>Most of what I&#8217;m going to ramble about here was covered much more eloquently and in far greater depth in <a href="http://oreilly.com/catalog/9780596100940/" target="_blank">Beyond Java</a>. These are my personal feelings and anecdotes on Java and it&#8217;s history. I should also note that despite what appears to be a moderately negative tone, I still do use Java extensively and used it to build the product of the rather short lived startup I co-founded.</p>
<p>I first encountered Java way back in 1998. This was effectively my first programming language, though I had done some C++ in high school. That wasn&#8217;t formally, mostly self taught and pretty much purely due to laziness. At one of the computer shows in Vancouver, (which might have been Comdex, did that show travel around?) I talked my father into buying me a C++ compiler and toolchain. It was definitely Borland, I&#8217;m fairly certain it was one of the Turbo C++ packages, though I have no idea which version now. Regardless, my main goals were to ease my physics and math homework by writing programs to do various tedious calculations for me. That was more or less a success, I still recall the joy at punching 3 numbers in and getting the solutions to the quadratic equation back. I learned about loops, variables and if statements, but nothing else really. But I digress.</p>
<p>At Carleton University, the first programming course I took was in Java, at this point in time, we&#8217;re talking Java 1.1 for the most part, the entire API was a couple of hundred classes at most. Supposedly it was kind of exciting because it was object oriented, but that was way beyond me for at least a semester. Mostly what I recall from my entrance to the world of programming was my epic battles with the compiler. I hated javac. There was perfectly valid&#8230; things in my file, at least as far I could tell, but javac would tell me that in no uncertain terms that I could not go so far as to call that text &#8216;code&#8217;. Eventually, the program compiled and joy was felt throughout the lands. Immediately thereafter, I would run the program, which would crash with a NullPointerException or some other fun error case. This was before the time of decent debuggers, at least to a novice programmer, so with a liberal smattering of System.out.printlns, eventually I could figure out where I had a mistake. Then change the code, fight with the compiler and the scenario would repeat itself until I could run the test cases provided in the assignment.</p>
<p>All in all, though, Java in those early days was a pretty simple language. You would make an array, do stuff with it and be happy about it. Or, once you started to grok how this object oriented stuff worked, you&#8217;d make a Vector and stuff things inside of it and you would never worry about resizing the array again. I mean, there wasn&#8217;t much to the language, check out the <a href="http://tns-www.lcs.mit.edu/manuals/java-1.1.1/api/packages.html" target="_blank">1.1.1 API I just googled for</a>. There were a couple of weird features for a novice to see, <a href="http://en.wikipedia.org/wiki/Inner_class" target="_blank">anonymous inner classes</a> are a great example, it took me years to really understand how to effectively use those things.</p>
<p>Java 1.2 was introduced in December of my first year and included a number of things, the only ones that actually mattered to me as a fledgling programmer was Swing and the Collections library. Swing because the winter term had a Java graphical user interface (GUI) course and the collections library because I could now cheat and use LinkedList instead of always having to write my own for each assignment. Maybe it wasn&#8217;t every assignment, it just seemed that way, still.</p>
<p>Java 1.3 did not really add anything of use to me and stayed out of my awareness. Java 1.4 added a few more things and I wrote a fair bit of code with that version. Still though, Java was still the same old Java as I had used back when I started with it. There were new libraries, and that was nice, Java was growing with me as I needed to do more with it. There wasn&#8217;t any real new syntax that had to be learned, if you hadn&#8217;t seen regular expressions before, it was a bit of a shock to see Perlish things in Java 1.4 but for those of us who had used them, it was nice to have the power of regular expressions in Java.</p>
<p>By this time I was working in the industry, specifically on a rather interesting Java application that was officially using 1.3 Java when I first showed up on the scene, 1.4 shortly after I started writing code for it. I should  note that I mean interesting in terms of the curse, &#8220;May you live in interesting times&#8221;. Not as in, &#8220;That book is great, some really interesting points.&#8221; The system was the definitive legacy but business critical application, so arbitrarily going to a new Java version wasn&#8217;t going to happen until the powers that be had given it the official green light. At the time I was happily drinking the generics kool-aid, helped in no small part by the .NET team at the company who was gushing about how much the .NET generics implementation had helped them. I pushed for the migration and eventually we had migrated to a 1.5 JVM and all was good.</p>
<p>I learned the new syntax for the generics and for a while it was great, but a few things were beginning to bug me. In the entire time I had worked at this company, I hadn&#8217;t actually seen a ClassCastException in the wild. This appeared to be the main thing that the generics were attempting to fix. The syntax was a bit clumsy and fairly verbose, especially if you had descriptive class names. Making a generic class was an exercise in pain. Enough so that after one serious attempt, I nixed it in favour of a single purpose class that could only take instances of a given interface. Most grievous in my mind was that after going through all of this anguish to get a generic class, as soon as you hit run time, you could not use reflection to actually figure out what *should* be in the container. I remember being shocked when I found this out and needing a coffee break to reassess.</p>
<p>From what I could tell, all of this extra syntax was being entirely tossed out before run time, which meant all that extra typing and &#8217;safety&#8217; was a merely a compile time check. One of the first lessons learned in programming was that just because something compiles does not mean it works. So while getting a bit of extra information at compile time is nice, I couldn&#8217;t help but think the benefits of the check was not worth the cost of the extra time spent typing and managing the syntax. (Side note, no, it&#8217;s not &#8216;just typing&#8217;, it is the most fundamental skill a programmer needs to have and should be taken very seriously. Arguments <a href="http://steve-yegge.blogspot.com/2008/09/programmings-dirtiest-little-secret.html" target="_blank">here</a> and <a href="http://www.codinghorror.com/blog/archives/001188.html" target="_blank">here</a>.)</p>
<p>Regardless, I soldiered on and slowly encountered other 1.5 enhancements that made Java more complex. Annotations, which through a new syntax would allow you to add some extra meaning to a method, class or variable. Enumerations, which I do love using when the previous option was lists of static final integers or strings. That however, was done with a new keyword, &#8216;enum&#8217;, which by some entertaining coincidence was the exact variable name used throughout our codebase for Enumerations. (Enumeration enum = hash.keys(); Eventually I will write more on code quality in that entertaining project.) Never mind the fact that now you have to talk about Enumerations or enumerations, which is always entertaining. Then there is the <a href="http://en.wikipedia.org/wiki/Variadic_function#Variadic_functions_in_C.23_and_Java" target="_blank">varargs</a> syntax, which just feels like a solution in search of a very specific problem. Seriously, I mean, have you ever needed this? Then there is autoboxing, a nice feature, but blurs the lines between objects and the Java primitive types, which can lead to a whole new way for developers to misunderstand what a block of code is doing.</p>
<p>I no longer feel that Java is a good language for a new developer to start programming in. It has it&#8217;s advantages, but those are almost exclusively in the domain of large &#8216;enterprise&#8217; systems now. Some of the changes appear to have been to keep maintenance costs down and to mitigate the damage a low quality programmer can do. Some of the changes appear to have been good ideas, but they were done at the cost of making the syntax more complex and complexity is the enemy of software development.</p>
]]></content:encoded>
			<wfw:commentRss>http://warrentaylor.ca/2008/11/19/the-hugeness/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
