<?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>Crossbrowser</title>
	
	<link>http://www.crossbrowser.net</link>
	<description>Web engineering and software development</description>
	<lastBuildDate>Thu, 03 May 2012 01:09:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/crossbrowser" /><feedburner:info uri="crossbrowser" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>crossbrowser</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Crowdsourced brute-forcing: how Fez was a coop game for a couple of hours</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/gyMSeh3MrKo/</link>
		<comments>http://www.crossbrowser.net/528/crowdsourced-brute-forcing-how-fez-was-a-coop-game-for-a-couple-of-hours/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 01:12:46 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[brute-force]]></category>
		<category><![CDATA[crowdsourcing]]></category>
		<category><![CDATA[fez]]></category>
		<category><![CDATA[heroku]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=528</guid>
		<description><![CDATA[Leveraging the power of the community using Rails and Heroku to crowdsource the brute-forcing of a puzzle in Fez.]]></description>
			<content:encoded><![CDATA[<p>On April 13, 2012 the long awaited indie game <a title="Official Fez website" href="http://polytroncorporation.com/fez">Fez</a> was finally released after 5 years of troublesome development. The goal of the game is to explore the environment, solve puzzles and collect cubes in order to unlock doors. The game is a 2d side-scroller living in a 3d environment. It is better viewed then explained:</p>
<p><iframe src="http://player.vimeo.com/video/40269839" width="648" height="365" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
<p><span id="more-528"></span></p>
<p>The main goal is to collect the 32 golden cubes, but the more perseverant gamers can also try to collect 32 anti-cubes and more by solving much more difficult puzzles. The gaming community collaborated on the more difficult ones, but the last one had yet to be solved a few days after all the others had been solved.</p>
<h3>The last puzzle</h3>
<p>If you are already familiar with the story surrounding the last puzzle, jump to the next section.</p>
<p>The main theory for the last puzzle was that players had to stand at a very specific spot in the game and input a sequence of button presses. The standard sequences in the game are 8 inputs long and use up to 7 different buttons. Needless to say, no one wanted to try <strong>2<span> </span>097<span> </span>152</strong> different combinations, hence why players tried to make sense of some of the remaining mysteries in the game.</p>
<p>After a few days of unsuccessful attempts at breaking the code, the community realized that joining hands and brute-forcing the sequences together was a viable alternative. Fortunately a player who had found the solution started dropping hints to dramatically reduce the set of possible solutions to a more manageable 78 125 combinations  (the sequence was 7-inputs long for example and only used 5 inputs). Some people created a shared spreadsheet on Google Docs to split the work of trying the thousands of sequences, I went a different way.</p>
<p>Ars Technica wrote a good <a title="Practically impossible: The quest to decipher Fez's cryptic final puzzle" href="http://arstechnica.com/gaming/news/2012/04/why-it-took-almost-a-week-for-the-world-to-completely-finish-fez.ars">article about the whole thing</a> with more details.</p>
<h3>Rails, Heroku and Bootstrap: a success story</h3>
<p>I was not too fond of the spreadsheet, not because it was a bad idea, but it just seemed a crude way of splitting the work even though it was practical and easy to set-up. On Tuesday evening (the 17th) I decided I would build a web application that would present visitors 10 sequences to try, they could then report their results, either the solution was found or not. The user would then be presented 10 more sequences to try and so on until the solution was found.</p>
<p>To generate the sequences in an optimal order I used a <a title="Wikipedia entry on the De Bruijn sequence" href="http://en.wikipedia.org/wiki/De_Bruijn_sequence#Algorithm">De Bruijn sequence algorithm</a> (thanks to <a title="Question on codegolf.stackexchange.com leading me to the De Bruijn sequence" href="http://codegolf.stackexchange.com/questions/5552/generate-a-list-of-all-possible-input-combinations-in-an-optimal-order-for-entry">Peter Taylor for telling me about it</a>).</p>
<blockquote><p>A <strong>De Bruijn sequence</strong> [...] is a cyclic sequence of a given alphabet <em>A</em> with size <em>k</em> for which every possible subsequence of length <em>n</em> in <em>A</em> appears as a sequence of consecutive characters exactly once.</p></blockquote>
<p>This was perfect for the problem at hand since the sequences could be entered in any order, only the last 7 button presses were checked to see if the sequence was right. So for every 10 sequences displayed to a user, only 19 button presses had to be entered.</p>
<p>No more than a couple hours were needed to build a rudimentary version of the app. I unit tested the basic algorithms to make sure they behaved correctly and launched the app on heroku only a few hours after I had started working on it. I then shared the link (<a title="The crowdsourced brute-forcing app" href="http://fez-monolith.heroku.com/">fez-monolith.heroku.com</a>) on a <a title="Gamefaqs thread for players working on the last puzzle" href="http://www.gamefaqs.com/boards/961239-fez/62566926">Gamefaqs thread</a> where some players had gathered to work on the puzzle.</p>
<h3>Trolls, false positives and false negatives</h3>
<p>As soon as the app went live I was already working on the next version where people could confirm or deny sequences marked as being right. This turned out to be very important because trolls were already trying to negate the work of others by entering false information like marking untested sequences as invalid or marking invalid sequences right.</p>
<p>The solution for false positives was quite easy, people could just confirm or deny them, they would then disappear from the list of potential solutions. However, false negatives were harder to detect, the only way was to have more than one person try each sequence. Unfortunately for the community, the correct sequence was marked as invalid relatively early in the life of the app.</p>
<h3>Causes of false negatives and why mysql != postgresql</h3>
<p>Each false negative was the result of one of these 3 problems:</p>
<ul>
<li>trolls purposefully marking any sequence as being invalid</li>
<li>users not inputting the sequences correctly</li>
<li>my lack of experience with postgresql</li>
</ul>
<p>Postgresql? To understand, take a look at the following code used to retrieve 10 supposedly consecutive sequences (which had been created in order in the database):<br />
<code><br />
# Get a random set of X consecutive sequences<br />
@sequences = Sequence.where("id &gt;= ?", random_sequence_id).limit(nb_sequences)<br />
</code><br />
What&#8217;s wrong? There&#8217;s no ordering in the retrieval of the sequences. On my development machine this wasn&#8217;t a problem because I was using MySQL which was returning the sequences in the expected order. Postgresql on the other hand, which was required on Heroku did not always return the sequences in order. This probably caused some users to input the sequences using the suggested method (the first sequence fully then only the last input of each following sequence). Someone reported the issue that I could only fix much later in the day after my normal day job. This was entirely my fault for not knowing that a SQL query is non-deterministic without and order by clause.</p>
<h3>Some stats and conclusion</h3>
<p>Time between when the app went live to when the solution was found: ~18h</p>
<p>Number of contributors: more than 1300</p>
<p>Number of trolls: 123 people found a correct sequence, 20 of them found quite a few</p>
<p>Number of tested sequences: 66227/78125 (84.771%)</p>
<p>Number of false positives: 515</p>
<p>The solution had been marked as negative about 5 hours after the app went live either by someone trying to ruin the efforts of the others, because of an error from the player inputting the sequence of due to an error in the code.</p>
<p>Overall I am very satisfied of the project, it was shared by many on Twitter and on various forums as well as on <a title="Kotaku article about the last puzzle and the community trying to find the solution" href="http://kotaku.com/5903095/ridiculously-obscure-black-monolith-in-fez-rallies-gamers-to-a-group-effort">Kotaku</a>. I managed to set-up a very useful application in a matter of hours using Rails, Heroku and Bootstrap. The <a title="Crowdsourced brute-forcing for the last puzzle in Fez" href="http://fez-monolith.heroku.com/">current website</a> will remain live as I see no reason to take it down, I have put it in a frozen state to preserve its state at the time the sequence was found.</p>
<p>The <a title="GitHub page for the web application" href="https://github.com/mbillard/fez_monolith">code of the app is available on GitHub</a>.</p>
<div id="attachment_542" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-542" title="Fez_heart_room" src="http://www.crossbrowser.net/wp-content/uploads/2012/04/Fez_heart_room-300x262.png" alt="Picture of Gomes in the room with the completed heart" width="300" height="262" /><p class="wp-caption-text">Gomez with the completed heart</p></div>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/gyMSeh3MrKo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/528/crowdsourced-brute-forcing-how-fez-was-a-coop-game-for-a-couple-of-hours/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/528/crowdsourced-brute-forcing-how-fez-was-a-coop-game-for-a-couple-of-hours/</feedburner:origLink></item>
		<item>
		<title>Keys to a productive environment</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/_daSNjZ6amA/</link>
		<comments>http://www.crossbrowser.net/520/keys-to-a-productive-environment/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 20:03:27 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[environment]]></category>
		<category><![CDATA[equipment]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=520</guid>
		<description><![CDATA[Ever notice how some teams can churn out code at an incredible pace while other teams struggle to release features on a regular basis? Sometimes a star programmer can make the rest of the team look very good, but more often than not, a productive team is the result of good teamwork in a good [...]]]></description>
			<content:encoded><![CDATA[<p>Ever notice how some teams can churn out code at an incredible pace while other teams struggle to release features on a regular basis? Sometimes a star programmer can make the rest of the team look very good, but more often than not, a productive team is the result of good teamwork in a good environment. A productive environment also helps you get more out of your programmers thus giving you a better return on your investment.</p>
<p>So here&#8217;s a list of key points to look out for and ways to improve each of them.</p>
<h3>Communication</h3>
<p>At one point or another, developers will have questions that need answering by another developer or by a management person. The goal is to enable the discussion to happen without interrupting anyone. There are several communication channels available in a work environment and each one has benefits and disadvantages. The developers should have access to each channel which are emails, instant messaging, group discussions, audio conversations (phone or <a title="Skype" href="http://www.skype.com">Skype</a>) and face-to-face interactions.<span id="more-520"></span></p>
<p>Phone calls and face-to-face interactions should be used only for emergencies or when the receiver is not responding. Make sure to create a culture where emails and instant messages are answered in a timely manner (a couple hours at most for emails, under an hour for instant messages). If the person did not hear back after a reasonable amount of time, he will escalate the issue and use more direct approaches that might disrupt the creative flow of the other person.</p>
<p>In order to facilitate communications, make sure each member of your team can use the email client of its choice (I&#8217;m in love with Gmail for its threaded conversations, but being able to choose between <a title="Gmail: Email from Google" href="http://mail.google.com">Gmail</a>, <a title="Mozilla Thunderbird" href="https://www.mozilla.org/en-US/thunderbird/features/">Thunderbird</a>, Outlook, etc. is better). Give them a way to send instant messages to each other or have group discussions (Gmail does both, <a title="Private group chat and IM, business and team collaboration - HipChat" href="https://www.hipchat.com/">HipChat</a> and <a title="Team collaboration with real time chat" href="http://campfirenow.com/">Campfire</a> do them better, my vote goes to HipChat for its user experience).</p>
<p><a href="http://techcrunch.com/2011/04/22/y-u-no-have-lame-billboard-hipchat/"><img class="aligncenter size-medium wp-image-521" title="hipchat" src="http://www.crossbrowser.net/wp-content/uploads/2011/06/hipchat-300x207.png" alt="Ad board with a message saying &quot;Y U NO USE HIPCHAT?&quot; referring to the &quot;Y U NO&quot; meme" width="300" height="207" /></a></p>
<p>Finally, once you have the right tools, make sure everyone in the team understands the importance of communication and that the junior members know who to contact when they&#8217;re having issues.</p>
<h3>Make projects fun to work on</h3>
<p>Not all projects are as interesting as others. There are, however, ways of making a boring project more interesting. It might be an interesting challenge, the opportunity to try a new technology or a new way of doing things. Developers work a lot more on projects they find interesting or meaningful so make sure there are incentives other than money on projects and make sure the developers understand the reason behind doing a project. There&#8217;s nothing worse than working on a project you think is useless.</p>
<h3>Don&#8217;t leave broken windows unrepaired</h3>
<blockquote><p>Consider a building with a few broken windows. If the windows are not  repaired, the tendency is for vandals to break a few more windows.  Eventually, they may even break into the building, and if it&#8217;s  unoccupied, perhaps become squatters or light fires inside.</p>
<p><a title="Broken windows theory" href="http://en.wikipedia.org/wiki/Broken_windows_theory">source</a></p></blockquote>
<blockquote><p>[...] one unrepaired broken window is a signal that no one cares, and so breaking more windows costs nothing.</p>
<p><a title="The Broken Window Theory" href="http://www.codinghorror.com/blog/2005/06/the-broken-window-theory.html">source</a></p></blockquote>
<p>An aging code base is usually full of broken windows and so are the various processes in place. Broken windows can take many forms, they can be a bug that no one took the time to fix, they can be a broken build in the source control, they can be a process that is prone to errors, etc. Do not leave known bugs unattended, build a culture where breaking the build is unacceptable (even though it will happen from time to time, make sure the developer feels guilty about it), automate as many parts of processes as possible and reduce the possibility for errors.</p>
<p>Finding a broken window kills the motivation of the team and reduces the quality of the work. Once people start finding bugs left all over the place, they won&#8217;t bother fixing their own little bugs-that-should-never-happen (but happen all the time in production).</p>
<h3>Reduce friction</h3>
<p>In the same vein as the broken windows, friction points are annoying and make the work less enjoyable. Friction points can be code without enough comments or features with little or no documentation, making it difficult to change or work with a piece of code. It can be a process that is run often but that is not yet automated. It can be timesheets or timekeeping tasks. The goal is not to remove the task causing the friction, but to make it as easy as possible to accomplish. Time keeping is useful, but taking half an hour on Friday to fill it is not. There are other ways to keep track of time spent working on projects, use them (most project management applications, <a title="Freckle Time Tracking: Save Time... Earn More" href="http://letsfreckle.com/">Freckle</a>, <a title="Toggl - Time tracking that works" href="https://www.toggl.com/">Toggl</a>, etc.).</p>
<h3>Provide your team with the appropriate tools and equipment</h3>
<p>Give that developer the second screen he asks for, buy that new programmer a decent computer, don&#8217;t sweat for the purchase of $50 worth of software. A couple hundred dollars worth of purchases could help individual developers and team improve their productivity which will more than cover the expense. Give them the tools and resources that will make them as efficient as possible. Give them access to a decent source control option (decentralized version control systems such as <a title="Fast Version Control System" href="http://git-scm.com/">Git</a> and <a title="Source Control Management" href="http://mercurial.selenic.com/">Mercurial</a> will change the way you develop), please get away from source safe or team foundation server. Provide them a way to track tasks and projects (and have your project manager track them and ensure the work is getting done at a reasonable pace).</p>
<p>Finally, give them quiet working conditions with as little distractions as possible, a large desk with a decent chair to sit on and let them choose the rest of their equipment (keyboard, mouse, headset, etc.), developers are picky. They should be able to focus on their work without being interrupted.</p>
<p><a title="Post about 37signals' new office and the reasoning behind the decisions" href="http://37signals.com/svn/posts/2339-the-new-office-the-idea-and-the-floor-plan">37signals</a> and Fog Creek (read both <a title="Post about Fog Creek's new office" href="http://www.joelonsoftware.com/articles/BionicOffice.html">Bionic Office</a> and <a title="Another post about Fog Creek's new office" href="http://www.joelonsoftware.com/items/2008/12/29.html">The new Fog Creek office</a>) have both created amazing work environments and as a result, <strong>they can hire the best developers</strong> and each company are extremely successful.</p>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/_daSNjZ6amA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/520/keys-to-a-productive-environment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/520/keys-to-a-productive-environment/</feedburner:origLink></item>
		<item>
		<title>Survvit: my weekend project</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/Dq0K9YbvTRs/</link>
		<comments>http://www.crossbrowser.net/513/survvit-my-weekend-project/#comments</comments>
		<pubDate>Thu, 19 May 2011 20:11:10 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Out of Scope]]></category>
		<category><![CDATA[aptana]]></category>
		<category><![CDATA[heroku]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[Survvit]]></category>
		<category><![CDATA[token]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=513</guid>
		<description><![CDATA[A couple of weekends ago, I decided to build a simple app using Ruby on Rails, just to learn more about the framework. For the project, I decided to build a simple survey application that people could use to send custom surveys to people they know. The twist here is that you don&#8217;t choose a [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-514" title="Rails logo" src="http://www.crossbrowser.net/wp-content/uploads/2011/05/rails.png" alt="Rails logo" width="87" height="111" />A couple of weekends ago, I decided to build a simple app using <a title="Ruby on Rails" href="http://rubyonrails.org/">Ruby on Rails</a>, just to learn more about the framework. For the project, I decided to build a simple survey application that people could use to send custom surveys to people they know. The twist here is that you don&#8217;t choose a single option as your answer, but you upvote and downvote options just as <a title="reddit" href="http://www.reddit.com/">Reddit</a> does with the submitted links, hence the Reddit inspired name, <a title="Survvit" href="http://www.survvit.com">Survvit</a>. This enables less popular option to sink and only the most popular or less controversial option to win. The inspiration came from work where we were trying to come up with names for our new servers.</p>
<h3>Things I learned</h3>
<h4>Token generation</h4>
<p>I wanted people to be able to generate semi-private surveys without bothering with registration and authentication. So the surveys are semi-private because anyone with the URL can access the survey and answer it, but the URLs are not guessable because I developed a token generator that generates a random string of characters. This is in no way something new, but I&#8217;m glad I learned how to implement it.<span id="more-513"></span></p>
<h4>Stupid authentication</h4>
<p>A big annoyance of mine when it comes to creating a new project is that I don&#8217;t want to deal with authentication. I&#8217;d rather build a whole project and then plug in some authentication mechanism once the rest of the application is solid. However, a lot of my projects require user accounts to be useful. With this project, I only needed admin access for myself in order to do some cleanup from time to time. So for this implementation, the username and password are hardcoded in the application itself (the password is hashed just to be sure).</p>
<h4>Front-end development with Ruby on Rails and MVC</h4>
<p>I learned a lot about front-end development with Ruby on Rails, it&#8217;s not always intuitive but overall it&#8217;s a pretty straightforward process. I learned how to make use of partials and yields to keep true to the DRY principle as much as possible. I was also new to the whole MVC thing, I didn&#8217;t have to chance to try it at work with ASP.NET, and was pleasantly surprised with the simplicity and how much easier it is to use (in comparison with ASP.NET WebForms).</p>
<h4>Heroku</h4>
<p><a title="Heroku" href="http://www.heroku.com/">Heroku</a> is great for hosting small projects (probably good for bigger project too, I just didn&#8217;t try it). It&#8217;s free if you need a single worker thread and a small database (my case) and is extremely easy to set-up. I definitely recommend this if you want to try your hand at small Ruby on Rails projects.</p>
<h4>IDE</h4>
<p>For this project, I used <a title="Aptana Studio 3" href="http://aptana.com/products/studio3">Aptana Studio 3</a>, it&#8217;s a decent IDE, but it&#8217;s definitely not as crisp and responsive as I would like. Coming from a .Net development environment, I&#8217;m used to working with IDEs, but I haven&#8217;t found a solid one for Windows yet. There were a couple that looked promising, but I didn&#8217;t want to spend money as I don&#8217;t develop with Ruby on Rails very often. I&#8217;m thinking Notepad++ with a decent shell would be a decent alternative.</p>
<h3>Wrap-up</h3>
<p>Overall, I&#8217;m quite satisfied with how the project turned out, I had very little prior experience with Ruby on Rails, yet I managed to code a working, though incomplete, application in a dozen of hours. The biggest drawback for Ruby on Rails for me at the moment is the lack of a decent IDE on Windows and my lack of experience. Hopefully, as I get better with Rails, I&#8217;ll find a comfortable working environment and I&#8217;ll be able to churn out code without having to constantly look for documentation.</p>
<p>PS: Heroku seems to be having issue with my application, this is unfortunate as everything was working perfectly until a couple of weeks ago.</p>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/Dq0K9YbvTRs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/513/survvit-my-weekend-project/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/513/survvit-my-weekend-project/</feedburner:origLink></item>
		<item>
		<title>Introducing CSharpSharp</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/tmWWo54gqlU/</link>
		<comments>http://www.crossbrowser.net/504/introducing-csharpsharp/#comments</comments>
		<pubDate>Sun, 10 Apr 2011 20:28:09 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Tools of the Trade]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[CSharpSharp]]></category>
		<category><![CDATA[extension methods]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=504</guid>
		<description><![CDATA[Ever since C# 3.0 was released, I&#8217;ve been thinking about the possibilities opened by the extension methods. Extension methods allow developers to extend existing classes by providing them with additional methods. The beauty of this is that we can now create beautiful code APIs on existing classes without compromising its internal design. For example, an [...]]]></description>
			<content:encoded><![CDATA[<p>Ever since C# 3.0 was released, I&#8217;ve been thinking about the possibilities opened by the extension methods. Extension methods allow developers to extend existing classes by providing them with additional methods. The beauty of this is that we can now create beautiful code APIs on existing classes without compromising its internal design. For example, an integer doesn&#8217;t care about dates and time values, but it might be useful to specify values such as 1 year, 3 months, etc. Without extension libraries, you&#8217;d have to use the TimeSpan constructor like this:</p>
<pre>var oneYear = new TimeSpan(1, 0, 0, 0, 0, 0);
var threeMonths = new TimeSpan(0, 3, 0, 0, 0, 0);</pre>
<p>Not exactly pretty isn&#8217;t it? With extension classes, this can now become:</p>
<pre>var oneYear = 1.Years();
var threeMonths = 3.Months();</pre>
<p>Much better.<span id="more-504"></span></p>
<p>I&#8217;m a strong believer into offering a developer friendly API when developing my own applications. Now that we have extension methods, I can bring the same level of quality to existing code. That&#8217;s why I created <a title="CSharpSharp project homepage" href="http://code.google.com/p/csharpsharp/"><strong>CSharpSharp</strong></a>.</p>
<h3>What is it?</h3>
<p>CSharpSharp is a collection of extension methods and other classes grouped together in order to improve the API of the core of C#. The above example is only one of many other improvements I&#8217;ve implemented into the CSharpSharp libraries. The library is still relatively small, but I have plenty of other features ready to be added. The library is free to use for any project. I also plan on opening the source code depending on the feedback and reception in the developer community.</p>
<p>For more information, visit <a title="CSharpSharp project homepage" href="http://code.google.com/p/csharpsharp/">the project page</a>, you&#8217;ll also find a link to download the library (libraries actually, there&#8217;s one specific for the Web).</p>
<p>If you would like to contribute to the project, I&#8217;m not looking for developer contributions right now, but I&#8217;m open to suggestions regarding new features.</p>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/tmWWo54gqlU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/504/introducing-csharpsharp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/504/introducing-csharpsharp/</feedburner:origLink></item>
		<item>
		<title>How to track your inactive domains</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/vvXIAaUuRsw/</link>
		<comments>http://www.crossbrowser.net/494/how-to-track-your-inactive-domains/#comments</comments>
		<pubDate>Wed, 30 Mar 2011 11:12:57 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=494</guid>
		<description><![CDATA[I have a confession to make: I&#8217;m addicted to purchasing domain names. Whenever I get an idea for a project, I can&#8217;t stop thinking about how to name it and when I find a good enough name, I have to purchase the domain for it. The result? About a dozen of domains doing nothing. I [...]]]></description>
			<content:encoded><![CDATA[<p>I have a confession to make: I&#8217;m addicted to purchasing domain names. Whenever I get an idea for a project, I can&#8217;t stop thinking about how to name it and when I find a good enough name, I have to purchase the domain for it. The result? About a dozen of domains doing nothing. I could just release them, but I feel like some of those can actually be worth something to someone (they do to me) and I have not necessarily given up on creating something with them.</p>
<p>So instead of letting them sit on an ad page for GoDaddy that gives me absolutely no benefit, I created a simple &#8220;domains for sale&#8221; website (hosted on a subdomain on one of my existing domains, I&#8217;m crazy enough to buy another domain for that) and I forward each of them there (the subdomain in question is <a title="My domains for sale" href="http://domainsforsale.mbillard.com/">domainsforsale.mbillard.com</a>). I created the website with Ruby on Rails, because I could create something simple quickly and because I could make use of the excellent <a title="Heroku: Ruby Cloud Platform as a Service" href="http://heroku.com/">heroku hosting</a> which is free for websites with low performance requirements.<span id="more-494"></span></p>
<div id="attachment_495" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-495" title="Screenshot of my &quot;domains for sale&quot; website" src="http://www.crossbrowser.net/wp-content/uploads/2011/03/domainsforsale-300x216.png" alt="" width="300" height="216" /><p class="wp-caption-text">By simple, I mean simple</p></div>
<p>What really makes this work though is that each of the domains forward to this page with the name of the domain as a parameter (ex: &#8230;domainsforsale.mbillard.com/?domain=[domain name]). Combined with a <a title="Web analytics by Google" href="https://www.google.com/analytics">Google Analytics</a> profile, I can now track which domains are accessed and how often they are. This helps me know more about which domains might actually be worth something. Clearly stating that a domain is for sale also helps users looking to purchase one of those domains because the contact information is right there, users don&#8217;t have to go search in a whois databases.</p>
<p>If you have inactive domains that you would be willing to sell, there&#8217;s no reason not to do this.</p>
<p>Note: There&#8217;s also an administration section not shown here that I use for managing the domains (in case I sell or buy one).</p>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/vvXIAaUuRsw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/494/how-to-track-your-inactive-domains/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/494/how-to-track-your-inactive-domains/</feedburner:origLink></item>
		<item>
		<title>Stuck with bad code? Wrap it up</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/VGwxVG1jnO0/</link>
		<comments>http://www.crossbrowser.net/477/stuck-with-bad-code-wrap-it-up/#comments</comments>
		<pubDate>Wed, 30 Mar 2011 10:46:04 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=477</guid>
		<description><![CDATA[I recently had to work with a library that was very difficult to understand and use. The documentation was poor, there were not many samples online to help me do what I needed to do and nothing was predictable. That means I had to resort to trial-and-error for tweaks and to search online for pretty [...]]]></description>
			<content:encoded><![CDATA[<p>I recently had to work with a library that was very difficult to understand and use. The documentation was poor, there were not many samples online to help me do what I needed to do and nothing was predictable. That means I had to resort to trial-and-error for tweaks and to search online for pretty much every new feature I wanted to implement with the library. Maybe I was pushing the library to its limit of what it could do, but what I was doing should not have been this complicated.</p>
<p>For me, code usability is just as important for programmers as is usability of a UI. Less usability means less usage of your product/library which means less feedback and eventually less profit. But what can we do when we&#8217;re stuck with a bad library? One option is to look for alternatives, but sometimes there aren&#8217;t other viable options or they&#8217;re just as bad or worse. The solution? Wrap up the bad code inside your own component and make it easy to use.<span id="more-477"></span></p>
<p>I spent a few days writing a wrapper library that had the API that I wanted. Then I plugged the existing library inside of it and the result was a library with an API tailored to my needs (and my organization&#8217;s needs), that removed risks of errors, reduced code duplication, and really improved the quality of the applications we were building. Any bug could be fixed only once, in my library, and pushed simply by updating the library in the application. It&#8217;s also a lot more fun to use since I have hidden all the complexity and smoothed out the rough edges.</p>
<p>This isn&#8217;t anything new, if you want a great example of how much good wrapping up badly designed code can do, take a look at all the JavaScript libraries like <a title="jQuery homepage" href="http://jquery.com/">jQuery</a>. The creation of jQuery has enabled developers all over the world to create applications with powerful client-side behaviors faster and better than ever. jQuery let&#8217;s developers write less code with less bugs and faster than without it.</p>
<p>So if you ever find yourself stuck with a bad piece of software, wrap it up.</p>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/VGwxVG1jnO0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/477/stuck-with-bad-code-wrap-it-up/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/477/stuck-with-bad-code-wrap-it-up/</feedburner:origLink></item>
		<item>
		<title>Afraid of the Cloud</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/syopgDaGEjs/</link>
		<comments>http://www.crossbrowser.net/485/afraid-of-the-cloud/#comments</comments>
		<pubDate>Sun, 13 Feb 2011 22:18:52 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Living in the Cloud]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[privacy]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[service]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=485</guid>
		<description><![CDATA[Nowadays, you can manage a software company almost entirely with online services. Whether you want to manage projects, emails, repositories, bugs, or anything else, you&#8217;ve got plenty of options. Most of the time, in addition to being time savers, using Cloud services also help you save quite a bit of money. Can we, however, really [...]]]></description>
			<content:encoded><![CDATA[<p>Nowadays, you can manage a software company almost entirely with online services. Whether you want to manage projects, emails, repositories, bugs, or anything else, you&#8217;ve got plenty of options. Most of the time, in addition to being time savers, using Cloud services also help you save quite a bit of money. Can we, however, really trust those providers with our data? By hosting it yourself, you only have to trust your employees; by hosting it elsewhere, you have to trust all those other companies and their employees that you know nothing about.</p>
<p>This is a really hot topic at my job. I believe that Cloud-based solutions can really benefit a small company,  but sometimes I wonder if I’m being too naive. On the other side, I  don’t think all the fears of having your data stolen are really founded  and that most of the time, it’s just paranoia kicking in. Even if  the content was stolen, would it really be such a big deal most of the  time? I will try to list the pros and cons of each option to help understand the issue. I do not aim to reach a conclusive decision, as I do not believe there&#8217;s a single right answer.<span id="more-485"></span></p>
<h3>Using Cloud services</h3>
<p>Putting your data online makes it vulnerable from two angles: the employees at the company hosting the content can access it easily or hackers can steal it directly by breaking through the defenses of the service provider. It does not matter if the hackers were aiming for your data or for someone else&#8217;s (for example, the recent <a title="SourceForge's report of the attack" href="http://sourceforge.net/blog/sourceforge-attack-full-report/">Sourceforge attack</a>), your data was compromised nonetheless. The security of your data is entirely in the hands of other people. The upside of using Cloud services is that you don&#8217;t have to manage the IT infrastructure required to handle whatever type of data you have. You don&#8217;t need to buy any hardware or to hire staff to keep it running and secure. For a small corporation, these two expenses are far from being negligible. Cloud services also often offer better options than self-hosted ones.</p>
<h3>Using self-hosted solutions</h3>
<p>Hosting your content yourself means that you&#8217;re in control, you know who accesses the data and you know how it&#8217;s managed. You only have to worry about your own employees (which I hope you trust more than any other employees) and from attacks directed straight at you. You don&#8217;t have to worry about Google being hacked, about BitBucket or GitHub leaking their users&#8217; data, etc. The downside is, as stated above, that you need to purchase the infrastructure yourself and to hire the staff to maintain it. Furthermore, the security is unlikely to be stronger than what the service providers offer unless you truly invest in security yourself. As this <a title="&quot;Cloud Security: Are people’s concerns justified?&quot;" href="http://www.gfi.com/blog/cloud-security-peoples-concerns-justified/">article about Cloud security</a> puts it:</p>
<blockquote><p>[...] Cloud-based solution vendors not only have the latest technology, the  latest firewalls, the best datacenters and the highest levels of  redundancy possible but they will apply multiple layers of defense  in-depth that your average business (a Fortune 500 company may be an  exception) can never have.</p></blockquote>
<p>I am personally sold to Cloud-based solutions, the simplicity of use, the relatively low-cost and the debatable higher security makes it an easy decision for me. I&#8217;m not suggesting that jumping in the first service provider that offers a valuable service is a good idea; I think that learning more about the company hosting your content is a necessary precaution, but if other companies are using it, are satisfied with it and there are no horror stories about the vendor, consider me sold.</p>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/syopgDaGEjs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/485/afraid-of-the-cloud/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/485/afraid-of-the-cloud/</feedburner:origLink></item>
		<item>
		<title>Things you should know when interviewing for a programming job</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/_sB6PN30_n0/</link>
		<comments>http://www.crossbrowser.net/479/things-you-should-know-when-interviewing-for-a-programming-job/#comments</comments>
		<pubDate>Wed, 09 Feb 2011 01:14:00 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Self Improvement Tips]]></category>
		<category><![CDATA[interviews]]></category>
		<category><![CDATA[jobs]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=479</guid>
		<description><![CDATA[I was browsing through the Programmers stack exchange Q&#38;A website yesterday and I stumbled upon a question about the fairness or unfairness of some interview questions that the candidate was asked to answer. Basically, the candidate was asked to answer questions out of his field of competence and felt cheated by the interview. In all [...]]]></description>
			<content:encoded><![CDATA[<p>I was browsing through the Programmers stack exchange Q&amp;A website yesterday and I stumbled upon a <a title="Software Developer Interview Question - Fair or Unfair" href="http://programmers.stackexchange.com/q/45181/220">question about the fairness or unfairness of some interview questions that the candidate was asked to answer</a>. Basically, the candidate was asked to answer questions out of his field of competence and felt cheated by the interview. In all fairness, he was a recent graduate and probably didn&#8217;t have that much experience interviewing.</p>
<p>In his question, he mentioned that he wanted to write the company to tell them about the unfairness of the questions. Fortunately, the Programmers community responded well and told him that this was not the right thing to do, however a few people did agree with him. Since he might not be the only one feeling that way, I decided to write a few (non-technical) things that every programmer should know when applying for a programming job.<span id="more-479"></span></p>
<h3>You don&#8217;t have to answer all the questions</h3>
<p>It&#8217;s a common trick by interviewers to ask a question that the candidate will not be able to answer. Sometimes it&#8217;s some kind of annoying &#8220;MBA&#8221; question like &#8220;Why are manhole covers round?&#8221; (here&#8217;s <a title="Answer to &quot;Why are manhole covers round?&quot;" href="http://ask-leo.com/so_just_why_are_manhole_covers_round.html">the answer </a>if you really want to know), but sometimes it&#8217;s just a highly technical question that <strong>you are not expected to be able to answer</strong>. What the interviewers want to know is <strong>how you deal with problems that you don&#8217;t have the answer for</strong>, because that&#8217;s going to happen a lot in the work environment. If you get one of these questions, walk them through your thought process, tell them how you would find the information (ask a specialist, a colleague, on <a title="Stack Overflow Q&amp;A website for programmers" href="http://stackoverflow.com/">Stack Overflow</a>, etc.). Sometimes they might want you to guess how many of one thing there is in a certain region (ex: how many gyms in New York). They want to know how good you are at estimating values, because you don&#8217;t always have time to go find the information and a rough estimate might be sufficient. I dislike this kind of question, but you should be prepared to answer it nonetheless.</p>
<p>No matter what the question is, just answer to the best of your knowledge. If the question is out of your field of expertise (front-end, back-end, databases, algorithms, etc.), maybe they need someone able to work in multiple fields, or maybe they are just testing you. Just don&#8217;t complain to them about it or you just lost all hope of getting that job; they&#8217;d rather hire someone that will try to find the solution than someone who will complain about the problem.</p>
<h3>The interview goes both ways</h3>
<p>If you&#8217;re a decently skilled candidate, chances are that companies will be in competition with each other to get you. Many companies get it and offer great working conditions and plenty of incentives to try to convince you that they are the place where you want to work; those companies get the highly competent and motivated programmers. However, many others don&#8217;t understand that and just want to fill positions; those companies get the unmotivated programmers who just want a salary.</p>
<p>So when you&#8217;re in an interview, you should ask them about the working conditions: what kind of machine you&#8217;ll be working with, which tools (source control, bug/task tracking, communications, etc.), is there a dress-code, will you work in a cubicle alone all-day or can you talk to your coworkers, &#8230; They need to provide you with a good work environment so that you can do your best job. You&#8217;re going to be there for half of your day, 5 days a week for a long time, you better make sure you&#8217;re gonna enjoy the time spent there.</p>
<h3>Never talk about the salary first</h3>
<p>This one&#8217;s pretty obvious, but never mention it first even if they haven&#8217;t talked about it and they ask you if you have any questions for them. Use those questions to ask about the work environment or what a typical day at work will look like. Asking about the pay means one thing to them: you&#8217;re in it for the money, not because you love the job. Also, when they do ask you about how much money you want, give them a range or a baseline (ex: I had X at my previous job, so I expect at least X or from my research people doing this job receive between Y and Z, so I&#8217;d expect something in that range). Let them come up with a number.</p>
<h3>Practice makes perfect</h3>
<p>Like most (all?) things, practicing helps you get better. If you&#8217;re not confident in your interviewing skills, set up some interviews with companies that don&#8217;t interest you all that much. You won&#8217;t have as much pressure to get the job and it will help boost your confidence.</p>
<p>That&#8217;s all I got for now, good luck!</p>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/_sB6PN30_n0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/479/things-you-should-know-when-interviewing-for-a-programming-job/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/479/things-you-should-know-when-interviewing-for-a-programming-job/</feedburner:origLink></item>
		<item>
		<title>Does your project have a style guide?</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/YwRN2u2HAKA/</link>
		<comments>http://www.crossbrowser.net/471/does-your-project-have-a-style-guide/#comments</comments>
		<pubDate>Sun, 19 Dec 2010 13:43:14 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Web Engineering]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=471</guid>
		<description><![CDATA[Style guides aren&#8217;t new, the printing industry has been using them for a long time, but we don&#8217;t see them nearly often enough on web projects. Just as a coding guide is useful for programmers, a style guide is useful for front-end developers. A style guide is useful for all projects, but it really shines [...]]]></description>
			<content:encoded><![CDATA[<p>Style guides aren&#8217;t new, the printing industry has been using them for a long time, but we don&#8217;t see them nearly often enough on web projects.<strong> Just as a coding guide is useful for programmers, a style guide is useful for front-end developers.</strong> A style guide is useful for all projects, but it really shines on large projects with many front-end developers or projects that you will be coming back to regularly.</p>
<p>A style guide can help:</p>
<ul>
<li>A group of developers produce consistent looking user interfaces</li>
<li>Bringing in new developers that much faster without having to mentor them as much</li>
<li>Developers focus on content rather than thinking about how to display the information</li>
</ul>
<h3><span id="more-471"></span>What&#8217;s in a style guide</h3>
<h4>Fonts</h4>
<p>Which fonts (or preferably font stacks) to use in which situations. Headers, sub-headers, text, notifications, etc. should all be mentioned. The list of fonts should be complete and no other fonts should be used without adding it to the style guide first.</p>
<h4>Colors</h4>
<p>What colors can be used and in which situations once again. Just as with fonts, the list should be complete.</p>
<h4>How to display the different UI elements</h4>
<p>Hhow should error messages be displayed? how about the notifications, instructions, tables, links, all headers, etc. Don&#8217;t hesitate to specify how each element can be displayed with minimal input from the developer (by using reusable components or partial views or whatever mechanism your web framework supports). You could even specify the styling that should be used or better yet, simply the CSS class.</p>
<h4>Images</h4>
<p>Which images should be used and when. If I need an image that isn&#8217;t provided yet, where do I find more from the same pack (and the new ones should be added to the style guide). How screenshots or other images should be included in the design. When should a thumbnail be used, what are the maximum dimensions and file size, etc.</p>
<p>Of course, a lot more can be included in the style guide, the goal is to leave as little room for thinking as possible. The style guide is a living document and can be modified to accommodate a new situation, but this should be a rare occurrence and big deal.</p>
<h3>How to create a style guide</h3>
<p>The style guide should be the responsibility of the UI lead (or a group of leads). He&#8217;s in charge of the design direction for the project so he should be the one putting the constraints. If someone disagrees with the style guide, the lead should know about it and a revision to the style guide should be considered. If it&#8217;s simply a case of a missing design specification, it can easily be added to the style guide.</p>
<p>There are a number of ways of creating a style guide, some use images, some use only a wiki-like text guide, but the most useful and accurate style guides will be coded in HTML and use the same stylesheet(s) as the project. The guide should be very visual, with at least one example for each situation. Headers should look like headers in the project and the same colors, fonts and images should be used. The style guide should be consistent with the UI and look like a page from the website being built. Don&#8217;t be scared of adding code snippets (CSS or HTML), it will make everyone&#8217;s job later much more simple.</p>
<p>Multiple style guides can be used, but they should never overlap each other, otherwise they risk contradicting each other and you will forget to update both. They should share the same stylesheets (the secondary guides can use specific stylesheets just for them). However, keep in mind that the less style guides you have, the easier it is to follow them.</p>
<p>So, next time you embark on a new project, make sure to create a style guide or ask for one to be created for you.</p>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/YwRN2u2HAKA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/471/does-your-project-have-a-style-guide/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/471/does-your-project-have-a-style-guide/</feedburner:origLink></item>
		<item>
		<title>An introduction to web development frameworks</title>
		<link>http://feedproxy.google.com/~r/crossbrowser/~3/YaWtKlSgTks/</link>
		<comments>http://www.crossbrowser.net/449/choosing-a-web-development-framework/#comments</comments>
		<pubDate>Mon, 08 Nov 2010 05:10:24 +0000</pubDate>
		<dc:creator>Michel Billard</dc:creator>
				<category><![CDATA[Web Engineering]]></category>
		<category><![CDATA[Asp.Net]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[web framework]]></category>

		<guid isPermaLink="false">http://www.crossbrowser.net/?p=449</guid>
		<description><![CDATA[Last week I wrote an introductory guide about how to develop web applications. I kept it short and simple on purpose because an in-depth description of the topic would fit in a book. I&#8217;d rather give an overview and then selectively dig in each step as I see fit. Today, I will discuss about an [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I wrote an introductory guide about <a title="How to develop web applications" href="http://www.crossbrowser.net/436/how-to-develop-web-applications/">how to develop web applications</a>. I kept it short and simple on purpose because an in-depth description of the topic would fit in a book. I&#8217;d rather give an overview and then selectively dig in each step as I see fit.</p>
<p>Today, I will discuss about an important decision in the life of a web application developer, choosing a web development framework. It is important to note that choosing a framework is more about finding<strong> one that you&#8217;re comfortable with</strong> rather than finding the best. All the  popular ones  are good in their own way and are used to run  all sorts of web apps.<span id="more-449"></span></p>
<h3>Thoughts on choosing the right web framework</h3>
<p><em>Disclaimer: I haven&#8217;t developed with all of the frameworks in existence so I&#8217;ll just be giving my general impressions based on my research and understanding of the frameworks. If you disagree with anything, please leave a comment so that everyone can benefit from your experience and knowledge.</em></p>
<h4>The frameworks</h4>
<p>In my previous post, I mentioned 4 main frameworks (ignoring the multitude of PHP frameworks) and I forgot an important one: <a title="Link to the official JSP website" href="http://java.sun.com/products/jsp/">JSP</a> (edit: actually not a framework, <a title="Struts homepage" href="http://struts.apache.org/">Struts</a> would be a  popular Java framework). I&#8217;m very unfamiliar with it so I won&#8217;t talk about it, just know that it is based on Java and that it exists.</p>
<h5>ASP.NET</h5>
<p>Microsoft&#8217;s flavor is a pretty solid, although costly, option. By using <a title="ASP.NET homepage" href="http://www.asp.net/">ASP.NET</a>, you&#8217;ll be working with the very powerful C# language (or VB.NET if you prefer). The IDE of choice, Visual Studio, is one of the best code editors out there, but you&#8217;ll have to shell out quit a bit of money if you want to use the more powerful features of the professional versions. Without surprise, you&#8217;ll have to work in Windows and ASP.NET works best with the rest of the Microsoft stack, namely Microsoft SQL Server and IIS, both of which will take a hefty toll on your wallet. At the finish line, you end up with a reliable set of tools on which you can build a powerful and stable application.</p>
<p>There are two main ways of developing web applications with ASP.NET, you have the choice of using the tried and true WebForms or the newer MVC architecture based on <a title="REST article on Wikipedia" href="http://en.wikipedia.org/wiki/Representational_State_Transfer">RESTful </a>principles (which is often the norm in the newer frameworks). If you are just starting web development I suggest that you go straight to MVC.</p>
<p>If the costs of developing with ASP.NET scare you, don&#8217;t worry, <a title="BizSpark homepage" href="http://www.microsoft.com/bizspark/">Microsoft&#8217;s BizSpark program</a> can help you. You can also take a look at the <a title="Mono project homepage" href="http://www.mono-project.com/Main_Page">Mono project</a>, an open-source .NET development framework.</p>
<blockquote><p><strong>Mono</strong> is a software platform designed to allow developers to easily create cross platform applications.  Sponsored by <a title="http://www.novell.com/" rel="nofollow" href="http://www.novell.com/">Novell</a> (<em>http://www.novell.com/</em>), Mono is an open source implementation of Microsoft&#8217;s .NET Framework based on the <a title="ECMA" href="http://www.mono-project.com/ECMA">ECMA</a> standards for <a title="CSharp Compiler" href="http://www.mono-project.com/CSharp_Compiler">C#</a> and the <a title="Mono:Runtime" href="http://www.mono-project.com/Mono:Runtime">Common Language Runtime</a>.   A growing family of solutions and an active and enthusiastic  contributing community is helping position Mono to become the leading  choice for development of Linux applications.</p></blockquote>
<h5>PHP</h5>
<p>PHP is without a doubt the most popular programming language for the web. All web hosting companies support it and there&#8217;s a ton of resources and tutorials available online. However, many people stay away from PHP because the language has been a mess for a long time, only recently receiving some much needed attention to its internal structure. Fortunately, there are plenty of frameworks available that hide most of the horrors of PHP. The most popular ones are <a title="CodeIgniter homepage" href="http://codeigniter.com/">CodeIgniter</a>, <a title="Kohana homepage" href="http://kohanaframework.org/">Kohana</a>, <a title="CakePHP homepage" href="http://cakephp.org/">CakePHP</a>, <a title="symfony homepage" href="http://www.symfony-project.org/">symfony</a>, <a title="Zend Framework homepage" href="http://framework.zend.com/">Zend framework</a>, etc. I am not familiar with them, but if you&#8217;re interested in knowing more, I suggest that you read <a title="What PHP framework would you choose for a new application and why?" href="http://stackoverflow.com/q/2648/810">this discussion on StackOverflow about choosing a PHP framework</a>. Most of the PHP frameworks use the MVC architecture and adheres to the RESTful principles.</p>
<h5>Python/Django</h5>
<p><img class="size-full wp-image-450 alignright" title="python-logo" src="http://www.crossbrowser.net/wp-content/uploads/2010/11/python-logo.png" alt="python logo" width="211" height="71" /></p>
<p>A powerful combination and, unlike PHP, there&#8217;s no question about which framework to use, your only option is <a title="Django homepage" href="http://www.djangoproject.com/">Django</a>. If you&#8217;re in love with Python, there&#8217;s no doubt that this duo is for you, Django is a popular option and a solid offering once again. Furthermore, Python lovers benefit from a wonderful hosting option in <a title="What is Google App Engine?" href="http://code.google.com/appengine/docs/whatisgoogleappengine.html">Google&#8217;s App Engine</a> which offers cheap hosting (free until certain very large limits are reached). Needless to say, with Google&#8217;s support behind Python, it&#8217;s hard to go wrong with this option. Once again, this framework follows the RESTful concepts.</p>
<h5>Ruby on Rails</h5>
<p><img class="alignright size-full wp-image-451" title="rails-logo" src="http://www.crossbrowser.net/wp-content/uploads/2010/11/rails-logo.png" alt="Ruby on Rails logo" width="87" height="111" /></p>
<p>Finally, the last contender in our list, <a title="Ruby on Rails homepage" href="http://rubyonrails.org/">Ruby on Rails</a>. Rails abstracts a lot of the implementation work by providing a large array of generators (a common sight in other frameworks) and by simplifying the database work a lot by making heaving use of the <a title="ActiveRecord documentation" href="http://ar.rubyonrails.org/">ActiveRecord pattern</a>. People tend to either love or hate this combination (Ruby is a scripting language) mostly because it seems to rely on &#8220;magic&#8221; in the sense that a lot of things happen behind the scenes without the developer knowing it. For example, Rails makes use of a pluralizer so that if you have a class name <strong>Person</strong>, you can access the instances by calling the <strong>People </strong>class. It&#8217;s all based on logic, but you have to trust Rails and some people just want to be in control of everything. Overall, Ruby on Rails is also a powerful and solid framework with a huge community behind it. Many people also consider it the fastest framework to develop with, taking you from the conception of an idea to an actual working app faster than any other framework. Rails favors MVC applications following the RESTful guidelines.</p>
<h4>Still confused?</h4>
<p>I&#8217;ve tried my best to describe the particularities of each framework, I strongly encourage you to do your own research. Always keep in mind that there&#8217;s no wrong answer, they&#8217;re all capable of helping you build your web application. Keep in mind that this list is far from being a complete list, <a title="Comparison of web application frameworks" href="http://en.wikipedia.org/wiki/Comparison_of_web_application_frameworks">here&#8217;s a more exhaustive list of web development frameworks</a>.</p>
<p>Once you&#8217;ve chosen your framework, check the tutorials on their respective homepage and try them. As with anything new, you&#8217;ll only become proficient with the tools after having used them a lot.</p>
<img src="http://feeds.feedburner.com/~r/crossbrowser/~4/YaWtKlSgTks" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.crossbrowser.net/449/choosing-a-web-development-framework/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://www.crossbrowser.net/449/choosing-a-web-development-framework/</feedburner:origLink></item>
	</channel>
</rss><!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->

