<?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>coder . cl &#187; projects</title>
	<atom:link href="http://coder.cl/category/projects/feed/" rel="self" type="application/rss+xml" />
	<link>http://coder.cl</link>
	<description>web developer &#38; system programmer</description>
	<lastBuildDate>Sat, 04 Feb 2012 12:07:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>change management process</title>
		<link>http://coder.cl/2012/01/change-management-process/</link>
		<comments>http://coder.cl/2012/01/change-management-process/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 15:48:08 +0000</pubDate>
		<dc:creator>Daniel Molina Wegener</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=2201</guid>
		<description><![CDATA[Managing changes is really important in software development projects. Each change should be handled carefully and must not be seen as part of the original development process. Instead, you should measure and control each change in the original requirements, even if you are using agile or cascade methodologies. You cannot accept all changes that the [...]]]></description>
			<content:encoded><![CDATA[<p>Managing changes is really important in software development projects. Each change should be handled carefully and must not be seen as part of the original development process. Instead, you should measure and control each change in the original requirements, even if you are using agile or cascade methodologies. You cannot accept all changes that the customer proposes without the proper management process. Is not that easy to handle changes in requirements like changing a comment in the code. Instead of accepting changes and delivering software without the proper management process, you should be able to handle those requirements using a standard method to manage those requirement changes.</p>
<p><span id="more-2201"></span></p>
<p>An example of requirement change management process is as follows:</p>
<ol>
<li>Log the changes.</li>
<li>Perform an impact analysis on the work products.</li>
<li>Estimate the effort needed for the change requests.</li>
<li>Reestimate the delivery schedule.</li>
<li>Perform a cumulative cost impact analysis.</li>
<li>Review the impact with senior management if thresholds are exceeded.</li>
<li>Obtain customer sign-off.</li>
<li>Rework work products.</li>
</ol>
<p>So, you should record each change in the project documentation, on the product backlog on agile projects and the project specification in structured projects. If you do not record all changes that are made to any software piece, there is not log or evidence that were made changes to the project, and you are loosing the core project specification. Any change requires analysis of all changes that are applied to the software piece. If you do not perform analysis, you are delivering software pieces without the proper structure and logical basis, even if you are working with prototypes. And finally, all changes should be measured and estimate the effort required to complete them, without an estimation of those efforts, you will not be able to handle the change set cost, deriving in a project with a higher cost than it was measured originally. Even if you are using agile or structured methodologies, you should measure changes and <i>manage</i> them.</p>
<p>So, if you are working with project managers that are not reestimating the delivery schedule with requirement changes, you are really wasting your time on that company. You can find about this topic on any modern project management book, and you will agree with the idea that a requirement change implies a change in the delivery schedule.</p>
<p>If you think in software pieces like products or physical products, for example like building houses, if you have some UML diagrams, like class diagrams and sequence diagrams, which are specifying how the application should work, if you receive changes over those diagrams and specifications, is the same thing as changing a house plane, you need to rebuild and refactor everything, and it has a very high cost. The same applies to those applications implementing work flows, if they are implemented using precarious <tt>if</tt> statements, instead of using <i>state machines</i>, any change to the work flow will lead you very hard changes on the code. So you should measure and control each change, so you must do <i>management</i>.</p>
<br/><hr height="1px" width="50%" />
<div style='text-align: center !important;'><b>Copyright © 2012 Daniel Molina Wegener</b><br/><b>Atribución-No Comercial-Sin Derivadas 2.0 Chile</b><br/><a target='_new' rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/cl/"><img alt="Creative Commons License" style="border-width:0" src="http://coder.cl.qfl.wpcdn.arcostream.com/cc88x31.png" /></a></div>
<br/><hr height="1px" width="100%" />
<p><small>© Daniel Molina Wegener for <a href="http://coder.cl">coder . cl</a>, 2012. | <a href="http://coder.cl/2012/01/change-management-process/">Permalink</a> | <a href="http://coder.cl/2012/01/change-management-process/#comments">No comment</a><br/>Post tags: <br/></small></p>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-6234432850133541";
/* main-feed */
google_ad_slot = "0763600725";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2012/01/change-management-process/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>tips on successful bug reports</title>
		<link>http://coder.cl/2011/12/tips-on-successful-bug-reports/</link>
		<comments>http://coder.cl/2011/12/tips-on-successful-bug-reports/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 11:16:59 +0000</pubDate>
		<dc:creator>Daniel Molina Wegener</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=2127</guid>
		<description><![CDATA[Communication is key element for successful projects. So, you should report bugs properly to eliminate them and you should be very careful describing them. There are some mandatory elements that should be supplied on bug reports, using some templates that provide enough information to let the developer know how to handle its solution and let [...]]]></description>
			<content:encoded><![CDATA[<p>Communication is key element for successful projects. So, you should report bugs properly to eliminate them and you should be very careful describing them. There are some mandatory elements that should be supplied on bug reports, using some templates that provide enough information to let the developer know how to handle its solution and let him to know how to omit new bug creation. A good bug report should clearly display the right information, and we can classify them in three types, as <i>functionality bugs</i>, <i>programming bugs</i> and <i>technical bugs</i>.</p>
<p><span id="more-2127"></span></p>
<p>Each bug type has its own format &mdash; I think &mdash; and they should provide the proper information to the development team to be corrected. So, those reports that are saying &laquo;does not works&raquo;, simply should be avoided. The less information that you provide, the less clear is the bug report.</p>
<p><br/></p>
<h3>functionality bugs</h3>
<p>They are related to those bugs that do not produce error screens, core dumps, or application crashes. They are only related to those bugs that allows the application to work, but they have the wrong implementation, disallowing the application to work properly. So, the information that should be supplied on those reports should be as follows.</p>
<ol>
<li><i>Bug Title</i>, not more than 250 chars describing the bug.</li>
<li><i>Bug Description</i>, an extended explanation of the bug.</li>
<li><i>Location</i>, where it is produced (screen or URL).</li>
<li><i>Bug Solution</i>, how it should be solved (not technically speaking, but with a proposed solution).</li>
<li><i>Steps to Reproduce</i>, how you should reproduce the bug in your environment.</li>
<li><i>Related Media</i>, screenshots, videos, audio and related stuff that could allow the developer to have a clear idea about the bug.</li>
</ol>
<p>As they at a very high level, they do not require technical details. So, this kind of bugs should be very well described to eliminate them. Also if you can attach a flowchart or similar diagram to let the developer to know how it should be fixed, or any diagram allowing a good understanding of the bug, it is a very good approach on how to fix it.</p>
<p><br/></p>
<h3>programming bugs</h3>
<p>Well, if you the code has a bug, probably it will produce a visible error, that shall be reported and fixed quickly. So, you must provide enough information about them. When you are reporting bugs, you should have in mind at least three points: &laquo;how happens?&raquo;, &laquo;when happens?&raquo; and &laquo;where happens?&raquo;. That should be enough to allow the developer to solve the fourth point which is &laquo;what happens?&raquo;. So, you should provide the following information.</p>
<ol>
<li><i>Bug Title</i>, not more than 250 chars describing the bug.</li>
<li><i>Bug Description</i>, an extended explanation of the bug.</li>
<li><i>Location</i>, where it is produced (screen or URL).</li>
<li><i>Backtrace &amp; Technical Error</i>, what is displayed on the screen or logs with a backtrace or similar kind of technical report.</li>
<li><i>Bug Solution</i>, how it should be solved (not technically speaking, but with a proposed solution).</li>
<li><i>Steps to Reproduce</i>, how you should reproduce the bug in your environment.</li>
<li><i>Related Media</i>, screenshots, videos, audio and related stuff that could allow the developer to have a clear idea about the bug.</li>
</ol>
<p><br/></p>
<h3>technical bugs</h3>
<p>It is related mainly to configuration issues, for example date formats and similar ones. And it should contain the same information as the <i>programming bug</i>, but it is different because it does not cause application crashes and stops the application work. But it is a bug and it should be solved. So, probably the priority of them is lesser than programming bugs. Just remember to always provide enough information to classify and reach the bug on testing.</p>
<br/><hr height="1px" width="50%" />
<div style='text-align: center !important;'><b>Copyright © 2011 Daniel Molina Wegener</b><br/><b>Atribución-No Comercial-Sin Derivadas 2.0 Chile</b><br/><a target='_new' rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/cl/"><img alt="Creative Commons License" style="border-width:0" src="http://coder.cl.qfl.wpcdn.arcostream.com/cc88x31.png" /></a></div>
<br/><hr height="1px" width="100%" />
<p><small>© Daniel Molina Wegener for <a href="http://coder.cl">coder . cl</a>, 2011. | <a href="http://coder.cl/2011/12/tips-on-successful-bug-reports/">Permalink</a> | <a href="http://coder.cl/2011/12/tips-on-successful-bug-reports/#comments">2 comments</a><br/>Post tags: <br/></small></p>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-6234432850133541";
/* main-feed */
google_ad_slot = "0763600725";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2011/12/tips-on-successful-bug-reports/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>the language of choice</title>
		<link>http://coder.cl/2011/12/the-language-of-choice/</link>
		<comments>http://coder.cl/2011/12/the-language-of-choice/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 20:06:03 +0000</pubDate>
		<dc:creator>Daniel Molina Wegener</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=2102</guid>
		<description><![CDATA[&#171;What is your preferred language?&#187; is a good question I think. From its paradigm to how it should be indented is a good approach to select a language based on the preferences of your programmers. Few days ago I have launched a public poll related to what is the preference in programming language between the [...]]]></description>
			<content:encoded><![CDATA[<p><i>&laquo;What is your preferred language?&raquo;</i> is a good question I think. From its paradigm to how it should be indented is a good approach to select a language based on the preferences of your programmers. Few days ago I have launched a public poll related to what is the preference in programming language between the people that I meet in social networks. I am very glad to see up to <i>150</i> responses to the poll and I am very glad to see that most users have a preference for strictness, rather than fully freedom. So, here are the results of that poll.</p>
<p><span id="more-2102"></span></p>
<p></p>
<h3>programming paradigm</h3>
<p>Well, seems that a large amount of users are preferring the well known object oriented paradigm. That means that they prefer to code objects and large statement sequences to solve small problems. A small group prefers other multi-paradigm languages, like Python, Ruby and JavaScript. So, the <i>67.07%</i> prefers the object oriented paradigm and the <i>21.95%</i> prefers multi-paradigm languages, the remaining <i>10.97%</i> prefers functional and procedural paradigms. The problem is the fact that object oriented languages are loosing its purity and are becoming multi-paradigm languages. For example Java has included anonymous functions, like C Sharp does. Also you must remember that Ruby, Python and JavaScript have defined <i>functions</i> as first class inhabitants, so they are multi-paradigm languages.</p>
<div class="figure">
<a href='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2011/12/paradigm.png.jpg' title='Preferred Programming Paradigm' target="_blank"><img src='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2011/12/paradigm.png.jpg' border='0' alt='Preferred Programming Paradigm' /></a></p>
<div>Preferred Programming Paradigm</div>
</div>
<p>So, I assume that the big percentage that likes object oriented over multi-paradigm languages, do not wants to use anonymous functions and closures on his code, among other features that makes programming more friendly. Is hard to understand that, but I can deal with it. Seems they are very purists. But also you must remember that there are various frameworks using the multi-paradigm approach, rather than being purely object oriented, like jQuery, which uses closures and higher-order functions as its main abstraction. On the statically-typed languages like Java and C Sharp, we have some multi-paradigm approaches too, like LinQ.</p>
<p><br/></p>
<h3>type system</h3>
<p>Seems that everyone loves the dynamic typing system. A system that allows you to add integers and numeric strings getting an integer as result seems to be cool for many people. Personally, I prefer static typing and strong static typing, because they allow me to introduce less bugs than dynamic typing. So, languages like Ruby, Python and PHP have a preferred type system than Java, C and C++, where both of them have a static typing system, and C Sharp now has a hybrid system, where you can change the type dynamically using <tt>var</tt>. Static typing allows to <tt>cast</tt> variables, strong static typing not.</p>
<div class="figure">
<a href='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2011/12/typing.png.jpg' title='Preferred Type System' target="_blank"><img src='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2011/12/typing.png.jpg' border='0' alt='Preferred Type System' /></a></p>
<div>Preferred Type System</div>
</div>
<p>For example Haskell provides a strong static-typing system, and due to its functional paradigm and its variable immutability, you cannot cast variables, and rather than type casting you should do explicit type conversion using its core functional abstraction. Remember that functional languages usually are state-less languages, so there you cannot change the variables along the execution, and they cannot handle any type casting operation. That is why there are many <i>lift</i> operations in some abstractions like Monoids, where you must use a <i>lifting</i> function on the <tt>map()</tt> operation. So, <i>57.14%</i> preferring a dynamic type system is a large amount of developers I think.</p>
<p><br/></p>
<h3>compilation type</h3>
<p>I am figuring that people prefers much more native compilation rather other types of compilation. For example the sensation of having slow performance on Java applications because they have a heavy disc usage while they are loading libraries for its virtual machine. So, they prefer to compile natively using machine byte-code rather than using virtual machine byte-code. But the difference is not too much between have the option to compile the virtual machine byte-code as native byte-code.</p>
<div class="figure">
<a href='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2011/12/compile.png.jpg' title='Preferred Compilation' target="_blank"><img src='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2011/12/compile.png.jpg' border='0' alt='Preferred Compilation' /></a></p>
<div>Preferred Compilation</div>
</div>
<p>So, having the optional compilation with all options seems to be cool too. For example languages driven by LLVM will probably allow both VM and native byte-code compilation. An example is Haskell, where you can use in-memory compilation &mdash; which is done by the command line interpreter and its REPL shell &mdash; and its LLVM byte-code compilation, which is commonly used to distribute its binaries. Also, seems that .NET driven applications can be compiled using native byte-code too. I hope that Java will have a similar option in the future, that would be really nice. Also Python provides on-memory compilation on its REPL.</p>
<p><br/></p>
<h3>syntax sugar</h3>
<p>Well, seems that predefined operator interfaces like Python has, is the preferred language feature, without custom operator like C++ and Haskell have. For example if you want to overload the <tt>+</tt> operator in your class, you should implement the <tt>__add__()</tt> method in your class, without having the option to create a new custom operator as <tt>+++</tt>, that can be defined with a very friendly syntax in both C++ and Haskell. The next group prefers language defined shortcuts, instead of operator overloading and custom operator creation.</p>
<div class="figure">
<a href='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2011/12/sugar.png.jpg' title='Preferred Syntax Sugar' target="_blank"><img src='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2011/12/sugar.png.jpg' border='0' alt='Preferred Syntax Sugar' /></a></p>
<div>Preferred Syntax Sugar</div>
</div>
<p>The problem of those languages without custom operator and operator overloading, is the fact that they cannot be used to define combinatorial operations with a friendly syntax, so you are forced to use method and function calls instead of doing combinatorial operations. Sometimes using combinators is cool, and you can make wonderful stuff using them, like deriving the <i>Y-Combinator</i> to implement recursion without using recursive calls &mdash; but this is more like an academic example rather than practical one. At least Python allows you to define your own operator, allowing the implementation of your own combinatorial operations.</p>
<p><br/></p>
<h3>indentation</h3>
<p>I am very glad to see that a large number of developers prefers to being strict as Python requests, rather than getting freedom about the language indentation. Python requests you that you must indent the code properly, using equal distance between the gap and the code on each block, so if you have a wrong indentation, the code will not compile. Being strict on indentation is cool I think.</p>
<div class="figure">
<a href='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2011/12/indentation.png.jpg' title='Preferred Indentation' target="_blank"><img src='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2011/12/indentation.png.jpg' border='0' alt='Preferred Indentation' /></a></p>
<div>Preferred Indentation</div>
</div>
<p>Others prefers to indent the code under normative, which is not bad, but can lead to indentation errors, but it is fine. I do not understand people that wants to code without normative, where disallows programmers to create more legible code. So, probably they prefer languages where there are not style checkers to use, like PHP. Is very nice to see that most programmers prefers strictness regarding well indented code and ordered code, making it more legible and more friendly to read.</p>
<p><br/></p>
<h3>naming normative</h3>
<p>So, a big number of developers prefers to use the camel case naming convention, seems to be more legible than others. But some languages like Python have defined capitalized case for classes and underscores for methods. Otherwise, languages like PHP do not have well meet coding standards, and seems that every project has its own naming convention.</p>
<div class="figure">
<a href='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2011/12/normative.png.jpg' title='Preferred Normative' target="_blank"><img src='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2011/12/normative.png.jpg' border='0' alt='Preferred Normative' /></a></p>
<div>Preferred Normative</div>
</div>
<p>This is probably a big problem on code legibility, but not at all. Is betters to have people that agree with standard usage rather than avoiding them. Well, camelCase is widely used, I agree with it, but I do not have any problem on switching between coding conventions between my projects and the languages that I use. You should ensure that your projects will use a well defined naming convention, so you can introduce more easily new developers in your team.</p>
<p><br/></p>
<h3>community</h3>
<p>Is nice to see that most developers agree with the idea of having open communities rather than close ones. That allows permanent contributions to the language development, allowing the creation of user groups, mailing lists and help forums. That increases the language usage as much as I know. As examples of large communities you have the PHP community, with only disadvantage of allowing multiple standards on code indentation and naming conventions, making PHP programming less attractive than other languages.</p>
<div class="figure">
<a href='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2011/12/community.png.jpg' title='Preferred Community' target="_blank"><img src='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2011/12/community.png.jpg' border='0' alt='Preferred Community' /></a></p>
<div>Preferred Community</div>
</div>
<p>Finally, I agree with the idea of having an open community with clear rules, rather than complete freedom. This ensures certain quality standards around the language and the people that participates on the development process.</p>
<p><br/></p>
<h3>language of choice</h3>
<p>Finally, the language that most people prefers &mdash; at least on those that have answered the poll &mdash; is Python, among other options like Java and Ruby. So, it seems to consistent with previous answers on the poll. Also seems that PHP is loosing its popularity between developers, because it had less than <i>10%</i> as preferred language. So, most people is preferring Python, Java and Ruby, very close to the <i>20%</i>.</p>
<div class="figure">
<a href='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2011/12/language-of-choice.png.jpg' title='Language of Choice' target="_blank"><img src='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2011/12/language-of-choice.png.jpg' border='0' alt='Language of Choice' /></a></p>
<div>Language of Choice</div>
</div>
<p>So, I can conclude an ideal language should be like Python on its indentation strictness and syntax sugar, but using camelCase and having a community like PHP, running over a virtual machine that allows native compilation. The closest language that I know running under those conditions is Jython, which is Python running over the JVM and JRuby on the Ruby side, where both have a dynamic type system &mdash; which is treated as static type system in background. I hope that you will enjoy the poll results as me.</p>
<br/><hr height="1px" width="50%" />
<div style='text-align: center !important;'><b>Copyright © 2011 Daniel Molina Wegener</b><br/><b>Atribución-No Comercial-Sin Derivadas 2.0 Chile</b><br/><a target='_new' rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/cl/"><img alt="Creative Commons License" style="border-width:0" src="http://coder.cl.qfl.wpcdn.arcostream.com/cc88x31.png" /></a></div>
<br/><hr height="1px" width="100%" />
<p><small>© Daniel Molina Wegener for <a href="http://coder.cl">coder . cl</a>, 2011. | <a href="http://coder.cl/2011/12/the-language-of-choice/">Permalink</a> | <a href="http://coder.cl/2011/12/the-language-of-choice/#comments">2 comments</a><br/>Post tags: <br/></small></p>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-6234432850133541";
/* main-feed */
google_ad_slot = "0763600725";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2011/12/the-language-of-choice/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>the ugly side of software economics</title>
		<link>http://coder.cl/2011/12/the-ugly-side-of-software-economics/</link>
		<comments>http://coder.cl/2011/12/the-ugly-side-of-software-economics/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 12:17:37 +0000</pubDate>
		<dc:creator>Daniel Molina Wegener</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=2076</guid>
		<description><![CDATA[The fact that many project managers are guided by the cheapest price and requiring &#171;low profile&#187; developers is generating a good percentage of software pieces that can be honoured with the most hilarious posts in The Daily WTF. Also some hiring head hunters which are not able to handle technical resumes because they have no [...]]]></description>
			<content:encoded><![CDATA[<p>The fact that many project managers are guided by the cheapest price and requiring <i>&laquo;low profile&raquo;</i> developers is generating a good percentage of software pieces that can be honoured with the most hilarious posts in <a href='http://thedailywtf.com/' title='The Daily WTF'><i>The Daily WTF</i></a>. Also some hiring head hunters which are not able to handle technical resumes because they have no idea about software development, is subject of some <a href='http://coder.cl/2011/03/how-do-you-read-a-resume/' title='how do you read a resume?'>gags</a>. No matter how good is a developer, if he does not place numerous times that cool technology which is subject of the job position posted on that prestigious newspaper, he will not be selected and probably that is not a <a href='http://coder.cl/2011/11/where-to-apply-for-a-job/' title='where to apply for a job?'>good company</a> where to work.</p>
<p><span id="more-2076"></span></p>
<p>The typical behaviour is about placing a job position ad somewhere in the network or newspapers. Then those project managers receive the resume of various contractors, and they choose the one that is looking with both experience and cheaper price. Those managers will prefer the developer <strong>B</strong>, who names the cool technology based on the language <strong>L</strong> various times on its resume and has worked on big companies, rather than selecting the developer <strong>A</strong>, who has participation on developing the language <strong>L</strong>, who has a verified <i><a href='http://github.com/' title='github.com social coding'>github</a></i> account and well commented commits and who has made talks related to the language <strong>L</strong>, but he did not place the cool technology various times on its resume and have not worked on big companies. A bad decision I think.</p>
<p>As result of his decision, the developer or contractor <strong>B</strong> will charge few payments to the manager leaving the project half done, with various bugs. Then the manager realises that he must contract the developer <strong>A</strong>, because he just noticed that he can fix the project, and he will probably not find another available developer that is good enough to finish the project.</p>
<p>The developer <strong>A</strong> with much more experience will not receive the payment as he deserves, getting bored quickly. Casually, PHP and .NET technologies are overfilled of those types of projects. I have received many times project proposals, I have sent the project bid, and then I got back the denial to build that project due to the cost, but with the non surprising notice that the same manager few weeks or months late is contacting me again to fix the project that the cheaper developer was not able to complete, with a very tight schedule due to the previous developer failures. Among the lack of ethics and respect, he does not want to pay the real cost of the project. So, I will not handle those <i>&laquo;please fix my project&raquo;</i> proposals any more. If you will not be doing the project with me from the start, do not contact me. I am really bored of dirty, messy and buggy code generated on that kind of projects.</p>
<p>So, you should request assistance each time you will hire a contractor that will code for you, assistance on filtering resumes and selecting resumes if you lack the proper knowledge to understand a technical resume. Just to choose the right contractor. Take care when you are <a href='http://coder.cl/2011/03/how-do-you-read-a-resume/' title='how do you read a resume?'>reading a resume</a>. Try to request sample source code, ask if the contractor is good enough to write articles &mdash; for example in a blog &mdash; or magazines, watch he has some recommendations and similar stuff, but overall, request assistance to evaluate his resume if it is very technical for you.</p>
<br/><hr height="1px" width="50%" />
<div style='text-align: center !important;'><b>Copyright © 2011 Daniel Molina Wegener</b><br/><b>Atribución-No Comercial-Sin Derivadas 2.0 Chile</b><br/><a target='_new' rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/cl/"><img alt="Creative Commons License" style="border-width:0" src="http://coder.cl.qfl.wpcdn.arcostream.com/cc88x31.png" /></a></div>
<br/><hr height="1px" width="100%" />
<p><small>© Daniel Molina Wegener for <a href="http://coder.cl">coder . cl</a>, 2011. | <a href="http://coder.cl/2011/12/the-ugly-side-of-software-economics/">Permalink</a> | <a href="http://coder.cl/2011/12/the-ugly-side-of-software-economics/#comments">No comment</a><br/>Post tags: <br/></small></p>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-6234432850133541";
/* main-feed */
google_ad_slot = "0763600725";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2011/12/the-ugly-side-of-software-economics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>when to add unit tests?</title>
		<link>http://coder.cl/2011/12/when-to-add-unit-tests/</link>
		<comments>http://coder.cl/2011/12/when-to-add-unit-tests/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 17:42:59 +0000</pubDate>
		<dc:creator>Daniel Molina Wegener</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=2072</guid>
		<description><![CDATA[When to add unit tests?. All depends on how are defined the requirements. If the requirements are well defined, you can add tests on every step in the development, doing evolutionary tests. But if you are working with dynamic methodologies like agile ones, you should add tests only once a requirement is correctly defined, otherwise [...]]]></description>
			<content:encoded><![CDATA[<p>When to add unit tests?. All depends on how are defined the requirements. If the requirements are well defined, you can add tests on every step in the development, doing evolutionary tests. But if you are working with dynamic methodologies like agile ones, you should add tests only once a requirement is correctly defined, otherwise you will be adding unit tests twice. So, each requirement should have its unit test suite as companion to check that the added feature is working properly.</p>
<p><span id="more-2072"></span></p>
<p>Unit tests are made to check that functionalities and source code is working. So, each time you develop a new functionality, you should add unit tests, but only once the requirements are defined. If you make hard changes, like changing the domain model, you will probably lost all your unit tests. Just as an example of the impact that has a change of that magnitude.</p>
<p>So, doing evolutionary unit tests with agile methodologies, requires that the backlog is successfully complete on each sprint to allow you to create the proper unit test, for both functionalities and low level functions when they require special algorithms. A well defined requirement should be covered by passing tests that are covering both the correct system operation and possible failures, like introducing invalid input. That is evolutionary unit testing, so you can prove that your code is working. Without well defined requirements you cannot add unit tests.</p>
<p>Unit tests are not only about working feature, you should add all possible failures to ensure the application robustness and for the application health. That is not only a <i>&laquo;must do&raquo;</i> in unit testing, it also covers the system safety. For example if your system requires a numeric string input to be parsed as integer type, you should ensure that it will work fine if it retrieves a corrupted string without numeric characters, so you should add unit tests covering that case, and design a strategy on that possible failure. But you cannot add a good unit test without a well defined requirement.</p>
<p>So, with a well defined backlog and requirements, you will be able to add consistent unit tests according to that functionalities, rather than adding individual tests without a precise target to cover. Once the unit tests meets the requirement and the functionality is fully working, you can add automated functional tests to cover user side tests, using for example Selenium IDE to work with them, where a functional test is made to tests functionalities, rather than components like does unit tests.</p>
<br/><hr height="1px" width="50%" />
<div style='text-align: center !important;'><b>Copyright © 2011 Daniel Molina Wegener</b><br/><b>Atribución-No Comercial-Sin Derivadas 2.0 Chile</b><br/><a target='_new' rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/cl/"><img alt="Creative Commons License" style="border-width:0" src="http://coder.cl.qfl.wpcdn.arcostream.com/cc88x31.png" /></a></div>
<br/><hr height="1px" width="100%" />
<p><small>© Daniel Molina Wegener for <a href="http://coder.cl">coder . cl</a>, 2011. | <a href="http://coder.cl/2011/12/when-to-add-unit-tests/">Permalink</a> | <a href="http://coder.cl/2011/12/when-to-add-unit-tests/#comments">No comment</a><br/>Post tags: <br/></small></p>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-6234432850133541";
/* main-feed */
google_ad_slot = "0763600725";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2011/12/when-to-add-unit-tests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  coder.cl/category/projects/feed/ ) in 0.38309 seconds, on Feb 7th, 2012 at 2:29 am UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Feb 7th, 2012 at 3:29 am UTC -->
