<?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>Tue, 15 May 2012 10:46:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>my software design principles</title>
		<link>http://coder.cl/2012/05/my-software-design-principles/</link>
		<comments>http://coder.cl/2012/05/my-software-design-principles/#comments</comments>
		<pubDate>Sat, 05 May 2012 12:35:17 +0000</pubDate>
		<dc:creator>dmw</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=2448</guid>
		<description><![CDATA[Most modern applications are providing APIs. That allows you to integrate those applications providing APIs with third party applications and create a real cloud computing environment. From an architectural perspective, we should have at least to have in mind the architectural pattern to be used, design patterns to be implemented, the protocol to use and [...]]]></description>
			<content:encoded><![CDATA[<p>Most modern applications are providing APIs. That allows you to integrate those applications providing APIs with third party applications and create a real <i>cloud</i> computing environment. From an architectural perspective, we should have at least to have in mind the architectural pattern to be used, design patterns to be implemented, the protocol to use and the data format to expose the API. The architectural pattern should be simple, the design pattern efficient, the protocol lightweight and the data format flexible for your requirements. With a good API design, it should be stable enough to support changes along the time dynamically.</p>
<p><span id="more-2448"></span></p>
<p>The architectural pattern should be simple. Most people is thinking on the MVC architectural pattern as the most proper architectural for any application. But really the MVC pattern was designed with very old basis and mostly with the idea of generalizing the user interface of desktop applications. Currently, Web Applications are build on top of many technologies, not RDBMS engines only, so you should start using the proper architectural pattern, where technology diversity should follow the maximum cohesion principle, rather than coupling application components.</p>
<p>We have as key principle of design <i>&laquo;minimum coupling, maximum cohesion&raquo;</i>, but I would like to add <i>&laquo;proper generalization&raquo;</i>. So, finally we should have <i>&laquo;minimum coupling, maximum cohesion &amp; proper generalization&raquo;</i> as design basis. If we observe, generalizations are older than software, we can stage that the term comes from Maths, where a generalization is a concept that can be applied to multiple problems and solve them using that concept. Cohesion is the principle of independent components that can work together, and coupling is a design which cannot separate its components. One of the best and classical examples of maximum cohesion on its design is Unix, where there are many small tools that can work together without coupling its functionalities.</p>
<p>A good generalization comes with from a good model, and any good generalization usually is able to solve multiple problems at once. Object Oriented programming provides a rich interface for abstractions, where the generalization is one of the most powerful ones, but in words of real generalization, I can proudly say that Monads are one of the best abstractions and mostly generalization that I ever seen.</p>
<ul>
<li>Haskell Programmer: Hey Java programmer, you know how just about everything is represented by a class?</li>
<li>Java Programmer: Yea&#8230;</li>
<li>HP: Even stuff no business being a class</li>
<li>JP: Well, it is our fundamental abstraction for anything larger than a function. It may be clumsy, but it can be used to implement any other design pattern we need.</li>
<li>HP: Well Monads serve the same role for us.</li>
<li>JP: Nulls?</li>
<li>HP: Maybe Monad</li>
<li>JP: I/O?</li>
<li>HP: IO Monad</li>
<li>JP: Exceptions and error handling?</li>
<li>HP: We have several ways, but mostly Maybe Monad</li>
<li>JP: List comprehension?</li>
<li>HP: Again, Monads</li>
<li>JP: Mutable data structures?</li>
<li>HP: That would be the State Monad<sub><a href="#note_2">[2]</a></sub></li>
</ul>
<p>With the proper generalization you can make your design to be consistent, robust and reliable. But you must leave the generalization concept just as <i>hierarchy</i> problem. It should be stated globally as <i>computational</i> problem rather than design problem only. A generalization as computation can be applied to multiple problems, where applying computational generalizations we can find mapping functions that can be globally used. This can be reached combining the IPO model and Object Oriented models properly, working together.</p>
<p>Software design is not easy. An UML class model is not enough, where it can only display <i>structures</i>, probably with a sequence models and communication models you can reach a good IPO design, but not without the proper knowledge about the implementation. So, any <i>analyst</i> who does not <a href='http://programming-motherfucker.com/' title='Programming, Motherfucker!, Do you speak it?'>knows how to program</a>, is just wasting your <a href='http://www.lnds.net/blog/2012/04/programa-ctm.html' title='¡Programa CTM!'>money and time</a>, with the obvious further reimplementation and redesign of the software product.</p>
<p>And you should start adding the proper generalizations as computations to your design, working together with your hierarchical generalizations, so they can bring you the proper quality along the time.</p>
<p style="font-size:10pt;"><a name="note_2">[2]</a> This is an excerpt from a discussion on a programming forum.</p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2012. |
<a href="http://coder.cl/2012/05/my-software-design-principles/">Permalink</a> |
<a href="http://coder.cl/2012/05/my-software-design-principles/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2012/05/my-software-design-principles/&title=my software design principles">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2012/05/my-software-design-principles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>freelance project handling rules</title>
		<link>http://coder.cl/2012/04/freelance-project-handling-rules/</link>
		<comments>http://coder.cl/2012/04/freelance-project-handling-rules/#comments</comments>
		<pubDate>Sat, 21 Apr 2012 15:38:03 +0000</pubDate>
		<dc:creator>dmw</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[rants]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=2400</guid>
		<description><![CDATA[As you know I work as freelance programmer, I have handled many kinds of projects, you can see the list of technologies which I am offering on my services page and some sample products which can tell of what I am capable to do on my products page. As you can see, I have left [...]]]></description>
			<content:encoded><![CDATA[<p>As you know I work as freelance programmer, I have handled many kinds of projects, you can see the list of technologies which I am offering on my <a href='http://coder.cl/services/' title='coder.cl: services'>services page</a> and some sample products which can tell of what I am capable to do on my <a href='http://coder.cl/products/' title='coder.cl: products'>products page</a>. As you can see, I have left some technologies, like PHP, due to the poor budget on many of those projects and messy code that I have seen on them. Since PHP lacks some tools like static analyzers and style checkers, most PHP projects cannot ensure good quality.</p>
<p><span id="more-2400"></span></p>
<p>My set of rules on handling projects and jobs related to programming are mainly related to payment methods, rates, methodologies and <i>who</i> is hiring me. So, non serious proposals are not handled by me. If you come telling me that you need <i>a web page</i>, just forget hiring me, I will not attend you, because I develop <i>applications</i>, not web pages.</p>
<dl>
<dt>refuse fixed price projects</dt>
<dd>Every software project without a well defined specification and clear requirements, is subject of changes, handling fixed price project is subject of spending unpaid work hours. So, my rates are monthly and hourly, depending on how is agreed the payment method. Fixed price projects which does not have a very consistent specification and requirements, will not be handled.</dd>
<dt>refuse projects with the wrong technology</dt>
<dd>As PHP projects, they will be refused. I cannot handle projects that cannot be properly integrated with other tools and languages that do not have strictly necessary tools like static analyzers and style checkers. PHP, Node JS and similar ones which has that kind of lacks, will not be accepted.</dd>
<dt>refuse projects where I did not made the estimation</dt>
<dd>Every software where I did not have made the estimation will be refused, I cannot handle projects where the estimation is not subject of concise methodologies like PERT. So, your compromise is not my compromise if you have made the estimation.</dd>
<dt>refuse projects without version control</dt>
<dt>
<dd>Every project where you are not using version control, will be refused. I cannot stay sending tarballs with my code, creating messy products, everything should be properly branched and tagged on each milestone.</dd>
</dt>
<dt>refuse projects without issue tracking</dt>
<dt>
<dd>Every project should be using issue tracking software, agile or not, but I need that kind of tools to track each development stage, where everything should be clearly specified.</dd>
</dt>
<dt>refuse projects without continuous integration</dt>
<dt>
<dd>I cannot work with projects where you are not properly checking the code. The code should stay clean from its origin, with the proper style and avoiding common errors.</dd>
</dt>
<dt>do not work with novice programmers</dt>
<dt>
<dd>I do not work with novice programmers which are not capable to read a specification and they are not able to handle some basic stuff, like server configuration, command line tools, server administration, and the proper knowledge of the environment where are you working. If you want me as tutor or mentor, just hire me as tutor or mentor, it is a separate job.</dd>
</dt>
</dl>
<p>You must have all those points in mind before hiring me or calling me for a project proposal. Those rules were created due to some failed project &mdash; two to be more precise.</p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2012. |
<a href="http://coder.cl/2012/04/freelance-project-handling-rules/">Permalink</a> |
<a href="http://coder.cl/2012/04/freelance-project-handling-rules/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2012/04/freelance-project-handling-rules/&title=freelance project handling rules">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2012/04/freelance-project-handling-rules/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>all skills comes with interests</title>
		<link>http://coder.cl/2012/04/all-skills-comes-with-interests/</link>
		<comments>http://coder.cl/2012/04/all-skills-comes-with-interests/#comments</comments>
		<pubDate>Sun, 15 Apr 2012 20:40:18 +0000</pubDate>
		<dc:creator>dmw</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[rants]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=2388</guid>
		<description><![CDATA[As you know I was working for various medium companies along my career, until I have become a freelancer. In one of those companies, where most programming contracts were made to Informatics Engineers as Software Engineers as role. You expect at least from a Software Engineers the capacity of doing research on almost any topic [...]]]></description>
			<content:encoded><![CDATA[<p>As you know I was working for various medium companies along my career, until I have become a freelancer. In one of those companies, where most programming contracts were made to Informatics Engineers as Software Engineers as role. You expect at least from a Software Engineers the capacity of doing research on almost any topic related to the given programming task and a very good quality solution to the given problem. That was not the case always, as it happens on many areas, not only in software development. Today I will present a story illustrating how something what is done without interest will make you waste your time and money.</p>
<p><span id="more-2388"></span></p>
<p>The most common job position in the last decade in software development is the Web Development. Almost everyone wants a Web Application, something that can run on a browser, without doing too much effort porting an application to desktop applications and similar stuff. So, most software development contracts are based on the Web. If you study something related to Informatics Engineering or Computer Science related topics, you cannot expect that they will prepare you for an immediate job position, and even you cannot expect that you will finish studying that career knowing <i>everything</i> related to it. Studying a career has the intention to get the basic knowledge on certain subject, enough to understand books that will bring you the proper expertise on that subject. Then you can do an MSc and you will be an expert on a small subset of topics covered by your career, also you can do a PhD, and you will be an expert <i>discovering new stuff</i> on a very specific subject of interest. You can read this wonderful article entitled <a href='http://matt.might.net/articles/phd-school-in-pictures/' title='The illustrated guide to a Ph.D.'><i>&laquo;The illustrated guide to a Ph.D.&raquo;</i></a> and you will see what I am referring to.</p>
<p>But if you do your stuff without interests, you will not learn, and you cannot drag any guilty to your environment about not learning enough to reach a good level. Everything is subject of interests, getting a graduate level on any career is not subject of decorating your room with a nice diploma, or showing a good <i>position</i> in your resume.</p>
<p>So, if you decide to get employed as <i>Software Engineer</i> on a <i>Web Developer</i> role, at least I am expecting from you that you will be able to read the <a href='http://www.ietf.org/rfc/rfc2616.txt' title='Hypertext Transfer Protocol &mdash; HTTP/1.1'>Hypertext Transfer Protocol Specification</a> and solve almost anything related to that protocol. A small team in one of those companies was working with a very specific service, mounted over HTTP/1.0 over a standard Apache Tomcat server. Rather than using SOAP or similar protocols, the service was working with HTTP POST parameters, and returning XML as content response. But they were stuck two days trying to solve a small problem. The HTTP client library that they were using was keeping the connections open and not closed, leaving many HTTP connections open on subsequent requests. If you know a little about browsers, probably you know that they are using &mdash; almost all of them &mdash; Keep-Alive connections. So, if you want to research what makes an HTTP client to use Keep-Alive connections, you should start searching for <i>keep-alive</i> and <i>negotiation</i> keywords over the document.</p>
<blockquote><p>
An HTTP/1.1 server MAY assume that a HTTP/1.1 client intends to maintain a persistent connection unless a Connection header including the connection-token &#8220;close&#8221; was sent in the request. If the server chooses to close the connection immediately after sending the response, it SHOULD send a Connection header including the connection-token close. [Hypertext Transfer Protocol -- HTTP/1.1, Section 8.1.2.1 Negotiation, first paragraph]
</p></blockquote>
<p>So, the right header to search for is <tt>Connection</tt>, which controls the HTTP/1.1 behaviour during the protocol negotiation. This is not CURL, which uses a <i>closing</i> connection negotiation due to its nature, which is not the nature of a <i>common</i> HTTP client which uses the standard specification.</p>
<blockquote><p>
HTTP/1.1 defines the &#8220;close&#8221; connection option for the sender to signal that the connection will be closed after completion of the response. [Hypertext Transfer Protocol -- HTTP/1.1, Section 14.10 Connection]
</p></blockquote>
<p>Finally, took me two hours to solve the problem reading the HTTP client library documentation and the HTTP/1.0 specification. The previous hack of destroying the client instance to avoid open connections was removed and the client library started its works using the proper standard behaviour. So, everything is subject of interest. The server was working with the right behaviour, not as some team members were thinking about <i>bugs</i> on the server. All those headaches were subject of a lack of interest on the issues to be solved. I just imagined how many lines of code were dropped and inserted trying to reach the proper solution guessing which API call would close the connection, trying to use many API calls, and just one extra line of code has solved the problem.</p>
<pre name="code" class="brush:java;">

httpRequest.setHeader("Connection", "close");
</pre>
<p>Getting confused if you are under pressure is natural, I accept that. Also I accept that here in Chile being a programmer &mdash; now called <i>Software Engineer</i> &mdash; is not one of the most coolest job positions on the market. It will never will be well paid as manager position. But the lack of interest is not subject of where did you have studied. Probably making a complex career which requires reasoning, reading and effort, is something boring with pressure and not well paid job positions is causing that lack of interest, where most <i>Software Engineers</i> do not work on that job position for a long time. And this problem is not subject to be treated on a classroom, they just will bring you the basis. Reading and enhancing skills is your own responsibility.</p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2012. |
<a href="http://coder.cl/2012/04/all-skills-comes-with-interests/">Permalink</a> |
<a href="http://coder.cl/2012/04/all-skills-comes-with-interests/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2012/04/all-skills-comes-with-interests/&title=all skills comes with interests">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2012/04/all-skills-comes-with-interests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>problem solving by segmentation</title>
		<link>http://coder.cl/2012/04/problem-solving-by-segmentation/</link>
		<comments>http://coder.cl/2012/04/problem-solving-by-segmentation/#comments</comments>
		<pubDate>Sat, 07 Apr 2012 01:21:52 +0000</pubDate>
		<dc:creator>dmw</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=2362</guid>
		<description><![CDATA[My approach on problem solving is very similar to the divide and conquer approach. Almost all problems on programming have three main layers to be solved properly: retrieval or accessing data, processing data, and result output. Most problems can use that perspective to be solved faster than viewing them as a single procedure or function. [...]]]></description>
			<content:encoded><![CDATA[<p>My approach on problem solving is very similar to the <i>divide and conquer</i> approach. Almost all problems on programming have three main layers to be solved properly: retrieval or accessing data, processing data, and result output. Most problems can use that perspective to be solved faster than viewing them as a single procedure or function. So, you can have the same approach as single view of most problems, where if you think a little, you can see most problems as <i>functions</i>, and you can group complex problems in <i>composite functions</i>.</p>
<p><span id="more-2362"></span></p>
<p>So, big problems can have a <i>composite function</i> view, from a single function that calculates the average age of a role in a company, a function to calculate the average salary for that role in a company, to the function that creates a nice visualization of roles and salaries in a company. Almost everything have an <i>IPO+S</i> model, or <i>Input &rarr; Processing &rarr; Output</i> structure, so you can divide most problems on those three <i>layers</i>, and each one can be handled properly to create the best implementation through the proper analysis.</p>
<div class="figure">
<a href="http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2012/04/ipo-mode.png" title="IPO+S Model" target="_blank"><img src="http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2012/04/ipo-mode.png" border="0" alt="IPO+S Model"/></a></p>
<div>IPO+S Model</div>
</div>
<p>So, IPO+S as generalization of a problem representation can allow you to observe the problem with three different layers and you can state various activities for each layer. Where on a pure IPO model without storage, for example a function implementation that remains <i>pure</i>, apparently does not have storage.</p>
<p>Also creating the proper constraints on each layer, such as input validation, output representation, and processing implementation are a good approach for a final design. Probably thinking on <i>&laquo;What is the input?&raquo;</i>, <i>&laquo;How to process the input?&raquo;</i>, <i>&laquo;How to structure the output?&raquo;</i>, are the basic questions for any problem segmentation, that can be used almost on any problem, also as function composition.</p>
<p>On the last example we have an average role age function <i>f(x)</i>, an average role salary function <i>g(x)</i> and a visualization function <i>h(x, y)</i>, then we have a composite function <i>h(f(x), g(x))</i>, and a segmented problem, that can be nicely defined in a composite IPO. You can apply this approach to more complex models, like well known <i>UML Sequence Diagram</i>, where we can see more details about the IPO sub-models which are participating on the final solution for a very specific problem. Also, we can add an arbitrary number of questions to our initial questions, like <i>&laquo;How to validate the input?&raquo;</i>, <i>&laquo;How to store the intermediate output?&raquo;</i>, <i>&laquo;How to process the intermediate to place on the output structure?&raquo;</i>. Finally, we have very nice question to do: <i>&laquo;What are the right algorithms to solve the problem&raquo;</i>, what can be defined in the Processing task.</p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2012. |
<a href="http://coder.cl/2012/04/problem-solving-by-segmentation/">Permalink</a> |
<a href="http://coder.cl/2012/04/problem-solving-by-segmentation/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2012/04/problem-solving-by-segmentation/&title=problem solving by segmentation">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2012/04/problem-solving-by-segmentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>programmers are not resources</title>
		<link>http://coder.cl/2012/03/programmers-are-not-resources/</link>
		<comments>http://coder.cl/2012/03/programmers-are-not-resources/#comments</comments>
		<pubDate>Tue, 27 Mar 2012 15:49:35 +0000</pubDate>
		<dc:creator>dmw</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[rants]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=2353</guid>
		<description><![CDATA[How many times do hear the word resource to refer to some co-worker, or even yourself in your daily routine? A resource strictly is a &#171;source or supply from which benefit is produced&#187;. If you are called resource in your daily work, probably you do not have more value for your employer than the server [...]]]></description>
			<content:encoded><![CDATA[<p>How many times do hear the word <i>resource</i> to refer to some co-worker, or even yourself in your daily routine? A resource strictly is a <i>&laquo;source or supply from which benefit is produced&raquo;</i>. If you are called resource in your daily work, probably you do not have more value for your employer than the server where the web application that you are developing is running. If your employer calls you resource, rather than co-worker or even employee, of course he will use the <a href='http://www.dodgycoder.net/2012/03/every-software-project-ive-worked-on.html' title='Every software project I’ve worked on has used the "Spanish Theory" of project management, and its likely yours have too'>Spanish Theory</a> to get the maximum benefit from your work.</p>
<p><span id="more-2353"></span></p>
<p>I think that there are two important elements that are making the project value being much higher than the original value on any software development project, where both the customer and the employer wants to reduce the cost of producing that software. The first one is the amount of changes made on the software piece, and the second one is the amount of bugs introduced in the software piece. Among other stuff which is not being applied on many software projects like <i>change management</i> and <i>impact analysis</i>. Where the impact analysis is reduced to a mere functional feature opinion in most cases and change management is reduced to overtime work hours to meet the project schedule. Also the number of bugs on any software project can be directly associated with the number of changes that suffers that project.</p>
<p>The customer once gets the project budget, usually he does not want to change the budget if it is increasing the project cost, mainly if he is using the Spanish Theory to manage the project. So, management on those cases is reduced to some kind of political speaking skills rather than well measured and driven project, with the leading word <i>&laquo;compromise&raquo;</i> in most managers speeches and project leaders speeches. But you must be blind to avoid looking at that <i>&laquo;compromise&raquo;</i> as non-reciprocal one.</p>
<blockquote>
<p>Historians long ago formed an abstraction about different theories of value: The Spanish Theory, for one, held that only a fixed amount of value existed on earth, and therefore the path to the accumulation of wealth was to learn to extract it more efficiently from the soil or from people&#8217;s backs.</p>
<p>Then there was the English Theory that held that value could be created through ingenuity and technology. So the English had an Industrial Revolution, while the Spanish spun their wheels trying to exploit the land and the Indians in the New World. They moved huge quantities of gold across the ocean, and all they got for their effort was enormous inflation (too much gold money chasing too few usable goods).</p>
<p>The Spanish Theory of Value is alive and well among managers everywhere. You see that whenever they talk about productivity. Productivity ought to mean achieving more in an hour of work, but all too often it has come to mean extracting more for an hour of pay. There is a large difference. The Spanish Theory managers  dream of attaining new productivity levels through the simple mechanism of unpaid overtime. They divide whatever work is done in a week by forty hours, not by the eighty or ninety hours that the worker actually put in.</p>
<p>[Tom Demarco, Timothy Lister. &laquo;Peopleware: Productive Projects and Teams (Second Edition)&raquo;]</p>
</blockquote>
<p>So, you must think twice when using the word resource to refer to your employees as replaceable mechanical nuts in your money-making-software-production-machine, because someone with experience knows that many of them are not replaceable and they are not mere mechanical nuts to be called resources. Have a look on successful companies &mdash; mainly how they treat their employees and they retain their employees &mdash; and ask also if the term to refer to them is <i>resource</i>. Every time that I listen the word <i>resource</i> to refer to co-workers, I only see blind people&hellip;</p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2012. |
<a href="http://coder.cl/2012/03/programmers-are-not-resources/">Permalink</a> |
<a href="http://coder.cl/2012/03/programmers-are-not-resources/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2012/03/programmers-are-not-resources/&title=programmers are not resources">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2012/03/programmers-are-not-resources/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>memory usage in haskell</title>
		<link>http://coder.cl/2012/03/memory-usage-in-haskell/</link>
		<comments>http://coder.cl/2012/03/memory-usage-in-haskell/#comments</comments>
		<pubDate>Wed, 21 Mar 2012 21:17:07 +0000</pubDate>
		<dc:creator>dmw</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[logrev]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=2341</guid>
		<description><![CDATA[As you I am a Haskell programmer. I have started a FOSS project called Apache Log Reviser, or logrev as short name. I have been playing with code optimizations in Haskell on that project. So, I want to share some experience and considerations regarding its memory usage, mainly on what is related to lazy evaluations [...]]]></description>
			<content:encoded><![CDATA[<p>As you I am a Haskell programmer. I have started a FOSS project called <a href='https://github.com/dmw/ApacheLogRev' title='Apache Log Reviser' target="_blank">Apache Log Reviser</a>, or <a href='https://github.com/dmw/ApacheLogRev' title='Apache Log Reviser' target="_blank">logrev</a> as short name. I have been playing with code optimizations in Haskell on that project. So, I want to share some experience and considerations regarding its memory usage, mainly on what is related to lazy evaluations and non-strict bindings. Where lazy evaluations should be used every time you need to read or write data with delayed behaviour, for example reading large lists or even lazy lists, and non-strict bindings should be used every time you need to request data to be placed on memory for immediate reading or writing.</p>
<p><span id="more-2341"></span></p>
<p>I have replaced the main file processing loop &mdash; the one that is collecting data from log lines &mdash; forcing lazy evaluations and non-strict bindings where they are required. The resulting code after the optimization is as follows.</p>
<pre name="code" class="brush:haskell;">

foldLogLines :: LogRevStatsMap
                -&gt; LogRevOptions
                -&gt; [String]
                -&gt; LogRevStatsMap
foldLogLines ms _ [] = ms
foldLogLines ms o ~ls = fll ms ls
                        where fll rs [] = rs
                              fll rs (x : ~xs) = let
                                lm = parseLogLine x
                                ns = lm `seq` o `seq` procLogMachine o rs lm
                                in seq ns $ fll ns xs
</pre>
<p>Again I am using <tt>seq</tt> for non-strict bindings but now I made the lines argument pattern entirely lazy, including the constructs inside the closure which brings even more laziness to the folding functions. The original optimization was just an implementation of a left folding functions, now it works using the same left folding function using a closure which uses lazy reads of the given list of strings &mdash; or log lines. As you remember the first chart obtained was using about ~33MB of memory, as follows.</p>
<div class="figure">
<a href="http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2012/03/initial-logrev-profiling.png" title="ApacheLogRev with Initial Optimization" target="_blank"><img src="http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2012/03/initial-logrev-profiling.png" border="0" alt="ApacheLogRev with Initial Optimization"/></a></p>
<div>ApacheLogRev with Initial Optimization</div>
</div>
<p><center>&lambda;<sup>&lambda;</sup>&lambda;</center></p>
<p>With the second optimization, the resulting memory usage has been reduced to ~13MB. Despite the <tt>readFile</tt> and <tt>lines</tt> functions are lazy, we must implement function with the same lazy behaviour, and we must use non-strict bindings only where we need immediate access to the data. Also, you should know that <tt>let</tt> and <tt>where</tt> statements have non-strict bindings for their variables, so they are placed immediately on the heap, unless you declare them lazy explicitly. The resulting profiling chart of the second optimization is as follows.</p>
<div class="figure">
<a href="http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2012/03/lazy-logrev-profiling.png" title="ApacheLogRev with Lazy Reading" target="_blank"><img src="http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2012/03/lazy-logrev-profiling.png" border="0" alt="ApacheLogRev with Lazy Reading"/></a></p>
<div>ApacheLogRev with Lazy Reading</div>
</div>
<p>Finally I have concluded that we must not underestimate the power of lazy evaluations and Haskell patterns. Once they are used properly, you gain very good performance and optimal memory usage. Enjoy Haskell as programming language.</p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2012. |
<a href="http://coder.cl/2012/03/memory-usage-in-haskell/">Permalink</a> |
<a href="http://coder.cl/2012/03/memory-usage-in-haskell/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2012/03/memory-usage-in-haskell/&title=memory usage in haskell">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2012/03/memory-usage-in-haskell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>a good start on logrev</title>
		<link>http://coder.cl/2012/03/a-good-start-on-logrev/</link>
		<comments>http://coder.cl/2012/03/a-good-start-on-logrev/#comments</comments>
		<pubDate>Sat, 17 Mar 2012 12:43:36 +0000</pubDate>
		<dc:creator>dmw</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[logrev]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[projects]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=2328</guid>
		<description><![CDATA[As you know ApacheLogRev or logrev as short name, is my first Haskell FOSS project &#8212; I have other FOSS projects written in C and Python &#8212; and I want to share some experiences about logrev while I was developing some features that it should have in the future, because it is still under development [...]]]></description>
			<content:encoded><![CDATA[<p>As you know ApacheLogRev or <i>logrev</i> as short name, is my first Haskell FOSS project &mdash; I have other FOSS projects written in C and Python &mdash; and I want to share some experiences about logrev while I was developing some features that it should have in the future, because it is still under development and it is not finished yet. Basically, it is using the Parsec combinator based parser. One of the best advantages of this parser builder is the fact that it is generating parsers on run time, rather than creating fixed parsers using BNF grammars which are subject of static context free processing, rather than creating dynamic parsers.</p>
<p><span id="more-2328"></span></p>
<p>Parsec allows you to create a parser dynamically on runtime, rather than compiling a parser specification and grammar specification on compile time as being done with <i>flex</i> and <i>bison</i>. As combinatorial construct, seems that can write a dynamic compiler generated in run time, instead of having a compiler built as static component which cannot be modified in run time &mdash; with some exception that are not covered by <i>flex</i> and <i>bison</i>, like any C++ compiler, which is capable to understand a small subset of syntax sugar enabled features like templates and operators.</p>
<p>I have created a DSL called <i>Log Reviser Specification</i> or <i>LSR</i> as short name which allows you to create log processing statements defining variables, processing functions and specify a reports based on the collected data. You can see the LSR parser on the <a href='https://github.com/dmw/ApacheLogRev/blob/master/src/Proc/LRS/Parser.hs' title='ApacheLogRev Repository' target="_blank">github repository</a> and a <a href='https://github.com/dmw/ApacheLogRev/blob/master/main.lrs' title='Sample LSR File for Apache Access Log' target="_blank">sample LSR</a> file on the same repository.</p>
<p><center>&lambda; <sup>&lambda;</sup> &lambda;</center></p>
<p>The problem of memory leaks &mdash; which is present on <strong>all</strong> languages, without exception &mdash; had come to my mind once the program was not able to parse a huge file without crashing. The fact that every language can be subject of memory leaks, is so real as the fact that you cannot abuse of recursion in procedural and object oriented languages. So, I have started profiling the application. With the initial revision, I got <tt>LogLine</tt> data type being instantiated many times without deallocation, with many instances which were kept in memory due to the lazy evaluation behaviour which is natural in Haskell. Tracing its memory usage, I got the following chart.</p>
<div class="figure">
<a href="http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2012/03/logrev-profile-chart-mm.png" title="ApacheLogRev with Memory Leaks" target="_blank"><img src="http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2012/03/logrev-profile-chart-mm.png" border="0" alt="ApacheLogRev with Memory Leaks"/></a></p>
<div>ApacheLogRev with Memory Leaks</div>
</div>
<p>The program execution was keeping a peak of LogLine instances on memory without being released due to Haskell lazy evaluation. So, now I am using <a href='http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:seq' title='seq :: a -&gt; b -&gt; b'>seq</a> and <a href='http://hackage.haskell.org/packages/archive/deepseq/1.3.0.0/doc/html/Control-DeepSeq.html#v:deepseq' title='deepseq :: NFData a =&gt; a -&gt; b -&gt; b'>deepseq</a> to reduce the amount lazy evaluations made in Haskell.</p>
<pre name="code" class="brush:haskell;">

instance NFData LogLine where
  rnf a = a `seq` ()

parseLogLine :: String -&gt; Maybe LogLine
parseLogLine s = let
  r = parse logLine &quot;[Invalid]&quot; s
  in case r of
          Left  _   -&gt; Nothing
          Right itm -&gt; itm `deepseq` Just itm

foldLogLines :: [LogRevStatsAction]
                -&gt; LogRevOptions
                -&gt; [String]
                -&gt; [LogRevStatsAction]
foldLogLines [] _ [] = []
foldLogLines ms _ [] = ms
foldLogLines ms o (x : xs) = let
  lm :: Maybe LogLine
  ns :: [LogRevStatsAction]
  lm = x `seq` parseLogLine x
  ns = lm `seq` o `seq` procLogMachine o ms lm
  in foldLogLines ns o xs
</pre>
<p>I have replaced the initial folding function &mdash; where it was using <tt>fmap</tt> and <tt>hGetLine</tt> &mdash; with the lazy evaluation function <tt>hGetContents</tt> for file descriptor reading and strict function for result processing <tt>foldLogLines</tt>. So, for file reading currently I am using lazy reads, but strict evaluation for line processing, allowing large file processing with very good results, thanks to the <i>left folded</i> strict evaluation of the lazy file reading. So we can appreciate the difference in the following chart.</p>
<div class="figure">
<a href="http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2012/03/logrev-profile-chart-nm.png" title="ApacheLogRev without Memory Leaks" target="_blank"><img src="http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2012/03/logrev-profile-chart-nm.png" border="0" alt="ApacheLogRev without Memory Leaks"/></a></p>
<div>ApacheLogRev without Memory Leaks</div>
</div>
<p><center>&lambda; <sup>&lambda;</sup> &lambda;</center></p>
<p>So, the garbage collector is really being used without keeping references on memory and instances linked to past results thanks to the tail call implementation in GHC, where we get an initial peak of memory usage which is being reduced along the execution. Also, if you have reached the <a href='http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/OutOfMemoryError.html' title='OutOfMemoryError'>Java OutOfMemoryError</a>, <a href='http://msdn.microsoft.com/en-us/library/system.outofmemoryexception.aspx' title='OutOfMemoryException'>.NET OutOfMemoryException</a>, <i>&laquo;PHP Allowed Memory Size Exhausted Fatal Error&raquo;</i>, and similar ones in your favorite language, and your solution is to increase the memory limits, <strong>your are doing it wrong</strong>. The fact that you have memory leaks in your code and you must correct the memory leaks rather than increasing the memory limits, just is telling me that you do not have any idea about memory management. Despite many languages now are using garbage collectors.</p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2012. |
<a href="http://coder.cl/2012/03/a-good-start-on-logrev/">Permalink</a> |
<a href="http://coder.cl/2012/03/a-good-start-on-logrev/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2012/03/a-good-start-on-logrev/&title=a good start on logrev">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2012/03/a-good-start-on-logrev/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>the logrev design</title>
		<link>http://coder.cl/2012/03/the-logrev-design/</link>
		<comments>http://coder.cl/2012/03/the-logrev-design/#comments</comments>
		<pubDate>Sun, 04 Mar 2012 23:38:09 +0000</pubDate>
		<dc:creator>dmw</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[logrev]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[projects]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=2318</guid>
		<description><![CDATA[On March 2th, the past Friday, I have released the initial code for a new FOSS project. The current code is hosted at github. LogRev is a log reviser tool, it extracts statistics from &#8212; currently &#8212; the Apache Access Logs. The initial design only supports few grouping queries but how it was coded will [...]]]></description>
			<content:encoded><![CDATA[<p>On March 2th, the past Friday, I have released the initial code for a new FOSS project. The current code is hosted at <a href='https://github.com/dmw/ApacheLogRev' title='Apache Log Reviser'>github</a>. LogRev is a log reviser tool, it extracts statistics from &mdash; currently &mdash; the Apache Access Logs. The initial design only supports few grouping queries but how it was coded will allow some interesting features that I will explain in this article. I hope that you will enjoy the design of this tool.</p>
<p><span id="more-2318"></span></p>
<p>Well, the first idea is to have a dynamic parser, a configurable tokenizer and information extractor that will allow you to make some queries related to any application log. Currently it uses <a href='http://www.haskell.org/haskellwiki/Parsec' title='Parsec'>Parsec</a> as combinatoric static parser for one kind of log entry &mdash; Apache Access Logs as was explained on the previous paragraph &mdash; and due to the <i>nature</i> of a combinatoric parser, will allow the creation of dynamically placed combinatoric tokenizers allowing the dynamic parsing of various kinds of entries. This is why this project was implemented in Haskell rather than using other language, despite Parsec is implemented in various languages like C++.</p>
<p>So, we have a dynamic parser that will be configured from a <a href='http://en.wikipedia.org/wiki/Domain-specific_language' title='Domain-Specific Language'>DSL</a>, where I&#8217;m very close to finish its specification, followed by an Action Stack, where the action stack represents the dynamic placement of sequentially executed combinators to extract the statistics information that you want, with both, predefined data collector combinators and pluggable modular data collectors, where the data collectors will be specified on the DSL for this tool, and probably I will call it <strong>LRS</strong> or <i>Log Revision Specification</i>.</p>
<p>Finally there is the <i>output method</i>, where it currently is supporting graphic charts and plain text as output. On the future, it will support other kind of output, also specified in LSR.</p>
<div class="figure">
<a href="http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2012/03/logrev-design.png" title="Simple LogRev Design" target="_blank"><img src="http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2012/03/logrev-design.png" border="0" alt="Simple LogRev Design"/></a></p>
<div>Simple LogRev Design</div>
</div>
<p>Due to size of server logs, where many of them are really huge, or many times we need to process large amount of data, I have decided to use Haskell as the main language, because it supports very well the usage of combinators due to its type system and supported abstractions, also Haskell supports very well byte code compilation making the code faster enough to 5000 lines of log lines in 1 second, generating the plain text output for two reports, the status report and the country report.</p>
<pre name="code" class="brush:bash;">
08:00 [dmw@www:3 logrev-sample]$ wc -l main.log
5000 main.log
08:00 [dmw@www:3 logrev-sample]$ logrev --input=./main.log --output=report
Processing: ./main.log

Status:
       200:       4834    9426271      96.68      96.10
       206:          3     107131       0.06       1.09
       301:          4        733       0.08       0.01
       302:         18       7568       0.36       0.08
       403:         68      11391       1.36       0.12
       404:         73     252012       1.46       2.57

Country:
       AUS:          5      32936       0.10       0.34
       CHL:       4516    6933671      90.32      70.69
       CHN:         90     910020       1.80       9.28
       DEU:          4      28591       0.08       0.29
       ESP:        203     174777       4.06       1.78
       RUS:         45     477554       0.90       4.87
       UKR:          4        518       0.08       0.01
       USA:        133    1217649       2.66      12.41

real    0m1.104s
user    0m0.964s
sys     0m0.092s
08:01 [dmw@www:3 logrev-sample]$ ls -l *.png
-rw-rw-r-- 1 dmw dmw 13085 2012-03-05 08:01 report_country.png
-rw-rw-r-- 1 dmw dmw 12031 2012-03-05 08:01 report_status.png
</pre>
<p>Also the graphic chart output is very nice, thanks the <a href='http://dockerz.net/twd/HaskellCharts' title='Haskell Charts'>Haskell Charts</a> hackage. And here you have sample output.</p>
<div class="figure">
<a href="https://github.com/dmw/ApacheLogRev/raw/master/report_country.png" title="Country Sample Chart" target="_blank"><img src="https://github.com/dmw/ApacheLogRev/raw/master/report_country.png" border="0" alt="Country Sample Chart"/></a></p>
<div>Country Sample Chart</div>
</div>
<div class="figure">
<a href="https://github.com/dmw/ApacheLogRev/raw/master/report_status.png" title="Status Sample Chart" target="_blank"><img src="https://github.com/dmw/ApacheLogRev/raw/master/report_status.png" border="0" alt="Status Sample Chart"/></a></p>
<div>Status Sample Chart</div>
</div>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2012. |
<a href="http://coder.cl/2012/03/the-logrev-design/">Permalink</a> |
<a href="http://coder.cl/2012/03/the-logrev-design/#comments">One comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2012/03/the-logrev-design/&title=the logrev design">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2012/03/the-logrev-design/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>effective communication in development</title>
		<link>http://coder.cl/2012/02/effective-communication-in-development/</link>
		<comments>http://coder.cl/2012/02/effective-communication-in-development/#comments</comments>
		<pubDate>Sat, 25 Feb 2012 22:47:14 +0000</pubDate>
		<dc:creator>dmw</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=2279</guid>
		<description><![CDATA[Communications is one of the most important elements on any development project. Project specification, customer relationship, project documentation, and almost all elements on a development project are involved in good communications to make it a successful project. How the project manager controls the project and their developers, and how the account manager delivers the product [...]]]></description>
			<content:encoded><![CDATA[<p>Communications is one of the most important elements on any development project. Project specification, customer relationship, project documentation, and almost all elements on a development project are involved in good communications to make it a successful project. How the project manager controls the project and their developers, and how the account manager delivers the product to the customer can make your project a successful project only if you have good communication basis.</p>
<p><span id="more-2279"></span></p>
<p>On my case, I do not use face meetings, instead of that I can communicate my perspective to my customers only using video conferencing software, without the need of doing a meeting on a coffee shop or a meeting room, and similar places. I just need an Internet connection and my customers are happy, all of them. Usually on the past I have worked with people interfacing the final customer, without me to receive the requirements and even to negotiate milestones and salary. I think that it was the worst mistake that I have made, due to the lack of technical understanding of many of those project managers. Today I only have direct customers, and I do not allow people in the middle.</p>
<div class="figure">
<a href='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2012/02/proyectos.jpg' title='Software Projects' target="_bank"><img src="http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2012/02/proyectos.jpg" border='0' alt='Software Projects' /></a></p>
<div>Software Projects</div>
</div>
<p>As freelancer I cannot allow past mistakes like project managers that are not able to handle <a href='http://coder.cl/2012/01/change-management-process/' title='change management process'>requirement changes</a> properly, making my workday a heavy duty with many overtime hours, that usually were not paid due to the lack of knowledge of change management process, a mistake that I see every day with many people working in the wrong company. I feel lucky because I know very well that I cannot make a gift from my job. So, there are some project managers that still are thinking that some changes on the requirements should not be charged to the customer. Apparently their project management basis are too old to be used today.</p>
<p>The best part of my work as freelancer, is the fact that those customers that do not want to pay for their changes, usually scream at the other side of the phone or video conferencing software that I am charging too much money and they finally seek another provider. The fact most of them are back to me once they see their solution half implemented and overfilled with bugs, requesting a lot of corrections and new features and disposed to pay my price usually make me laugh. Some of them are reading my blog frequently, so they are welcome.</p>
<p>Without people in the middle handling requirements, my customers are very happy and they enjoy the software that I develop. That is because they have exactly what they want, no matter how complex is it. I can work with many languages &mdash; I can write code in more than 5 languages because I am continuously improving my skills &mdash; so I do not have problems implementing complex software. So, I am capable to speak in non-technical terms to my customers and handle every requirement that they want. But I have left some markets. For example I have left the PHP market, usually I do not offer PHP developments, because most customers requiring PHP development are thinking on PHP as the new Visual Basic of programming languages, easy to handle, getting quick results faster than with other platforms, so it <i>&laquo;should be cheaper&raquo;</i>. But they have no idea about software development.</p>
<p>Well, someone that wants to spend only USD $60 per month to host a <i>dynamic web</i> page, rather than creating an application, is not able to think on a real application and what does it really needs. And usually I do not handle those projects. Dynamic web pages are a subject of the past, now you should be able to construct applications using third party APIs and doing real programming tasks. You cannot make a custom Google using Joomla. So, the scope of those projects are not generating any interest from me.</p>
<p>I really enjoy some that ask technical questions on the interview. The same applies once I am asking technical questions to some programmer, I really enjoy when they are capable to answer with a very good perspective on the technical issue that is being discussed. But I can explain the stuff good enough to make the customer understand what I am talking about.</p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2012. |
<a href="http://coder.cl/2012/02/effective-communication-in-development/">Permalink</a> |
<a href="http://coder.cl/2012/02/effective-communication-in-development/#comments">2 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2012/02/effective-communication-in-development/&title=effective communication in development">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2012/02/effective-communication-in-development/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>where can I work?</title>
		<link>http://coder.cl/2012/02/where-can-i-work/</link>
		<comments>http://coder.cl/2012/02/where-can-i-work/#comments</comments>
		<pubDate>Fri, 24 Feb 2012 12:22:04 +0000</pubDate>
		<dc:creator>dmw</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=2275</guid>
		<description><![CDATA[Passionate programmers are always seeking a good place to work, with good and nice programming languages and very good expectations. &#171;Where can I work?&#187; Is one the biggest questions that someone can ask to himself. There are big companies almost everywhere, great corporations where you can build up your career. But you should be able [...]]]></description>
			<content:encoded><![CDATA[<p>Passionate programmers are always seeking a good place to work, with good and nice programming languages and very good expectations. <i>&laquo;Where can I work?&raquo;</i> Is one the biggest questions that someone can ask to himself. There are big companies almost everywhere, great corporations where you can build up your career. But you should be able &mdash; as developer &mdash; to see your environment. Big companies, like retail ones, are not hiring developers directly, with some big exceptions like Amazon, but it is a foreign company, so most of those big companies are using outsourcing and externalizing their development services.</p>
<p><span id="more-2275"></span></p>
<p>There are various types of companies, I think that the biggest market is owned by outsourcing companies. But on outsourcing companies you will not grow enough to reach a management position or software architect position, because those companies using outsourcing services have their own architects and managers. Probably you can grow at least as lead developer, but usually those big companies using outsourcing services will not offer any stable position to you due to the contract that was signed by both parts of the sold service.</p>
<p>On that kind of companies, the fact that their programming language usage is restricted only to those languages supported by other well known companies, so that number languages is very limited, and probably you will only find Java, C# NET, Visual Basic NET, ABAP4, Cobol, and on very strange cases standard C under POSIX or SUSv2/3 platforms. Big corporations do no like those languages that are considered academic like OCaml or Haskell &mdash; but this is only an ignorant point of view because those languages commonly have a Scientific usage, so they are not really academic languages, because you can see distributed models &mdash; including job queues &mdash; implemented over those languages. Probably other big companies are using languages like PHP but for small tasks, rather than <i>enterprise applications</i>, and rarely other languages like Erlang.</p>
<p>Some languages like Python and Ruby, are really productive due to its syntax and multi-paradigm approach. We have various of those cool languages running over the Java Virtual Machine and NET runtime, for example on the Java side we have Jython, JRuby, Scala, Clojure among other languages that can make your development tasks really effective. On the NET side we have IronPython, IronRuby, F# and similar languages. The problem is the fact that there are very few companies using those variants, and those companies commonly use the basic implementation of standard C# NET and standard Java. The reason is simple, the lack of interest from developers to learn new languages are making the usage of any other language impossible due to the lack of developers supporting that language. For example there are some companies leaving all their C language programs and changing them by Java programs due to the lack of developers supporting the C language.</p>
<p><i>&laquo;What is the kind of problems handled on those companies?&raquo;</i>. Another good question. The fact that depending on which language will be used in your projects, will determine the kind of problems that you will be solving. If you are an algorithm lover, you are lost as Java or NET developer. Most applications are Web Based applications consuming a SOA architecture, so you will have the job of consuming those services and you will probably never see the real logic of those problems that are solved by those services, because they rely on a Cobol or ABAP4 backends very far from you. So, your real job will be data insertion and extraction with technology related to XML and JSON, where both are hard to understand if you are not able to handle data structures like trees once you need to process an XML tree or a JSON tree recursively. Remember that you cannot use parallel programming or similar stuff on application containers, because that problem is already solved and most problems are reduced to problems with <img src='http://s.wordpress.com/latex.php?latex=P&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='P' title='P' class='latex' /> time and <img src='http://s.wordpress.com/latex.php?latex=O%28n%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n)' title='O(n)' class='latex' /> complexity.</p>
<p>Due to the lack of risk assumption, those companies will never use a product which is not supported by another well known company, so, probably you will never see Apache Hadoop and some cool MapReduce implementation, and even you will not see a cool implementation of a MapReduce task in a cloud based environment like Amazon Elastic MapReduce, because most data managed by those companies is <i>private</i>.</p>
<p>So, the remaining companies are medium and small companies if you do not want to participate of that mechanic process and you want to use almost all your knowledge to solve problems. There are companies which are stuck on Web Development. Those companies are building dynamic web sites based on FOSS projects like content managers or blogs. That is not an option if you really want to develop applications and apply your knowledge. So, leave those jobs for people that well paid mechanic tasks, and non-well paid but lazy tasks. The next question is <i>&laquo;where are present algorithmic problems&raquo;?</i> and <i>&laquo;where can I work&raquo;?</i>. Well, the answer seems to be easy to solve. Algorithmic problems are present on those companies making <i>products</i>, a company that sell products &mdash; no matter if those products are desktop or SaaS products &mdash; they always need a good and creative programmer to solve hard problems.</p>
<p>Medium and small sized companies are using Message Queues, Job Queues and similar software, including architectures like OpenMP for parallel solutions. Every day we have more data to process, we have integration with social networks, third party services among too much stuff should be handled by <i>real applications</i>, not simple content managers. So we must take advantage of that software that can allow us to solve real problems in less time than linear processing, so we usually implement parallel or distributed processing reducing the computing time. I think that the best example are startups, once a startup grows and its processing requirement grow and they become useful applications for their customers, the amount of data requires a bigger processing capacity.</p>
<p>Also there are some good medium companies selling FOSS technologies allowing that kind of processing to their customers, which are usually big companies. They are doing a good job I think because they are introducing relatively new technology into their business process, allowing parallel and distributed processing, shortening processing time and getting early results due to their applications implementation. So, take advantage of the interview and ask for some technology of your interest, if the company rely on plain C# or Java, your job will probably be a boring job&hellip;</p>
<p><br/></p>
<h3>some illustrating anti-examples</h3>
<p><i>case A, the <img src='http://s.wordpress.com/latex.php?latex=O%28n%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n^2)' title='O(n^2)' class='latex' /> implementer</i>: on one of those big companies I&#8217;ve seen an algorithm implementation with <img src='http://s.wordpress.com/latex.php?latex=O%28n%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n^2)' title='O(n^2)' class='latex' /> complexity searching a value on a string cube due to searching algorithm used &mdash; with a very basic approach on searching algorithms and lack of knowledge on newer algorithms. So, seems to be common for some programmers to get stuck on that knowledge that was acquired when they were studying.</p>
<p><i>case B, the cpu can do it architect</i>: there was a software architect solving a <img src='http://s.wordpress.com/latex.php?latex=O%28n%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n)' title='O(n)' class='latex' /> algorithm in linear time. That&#8217;s OK, but for a very small <img src='http://s.wordpress.com/latex.php?latex=n&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='n' title='n' class='latex' />, once that <img src='http://s.wordpress.com/latex.php?latex=n&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='n' title='n' class='latex' /> has grown, the process got stuck for hours. So, no parallel programming or distributed computing was used to solve that problem. They cannot use relatively new technology like MapReduce because it is not still supported by any big corporations yet, and probably there was not enough knowledge to apply.</p>
<p><br/></p>
<h3>some illustrating good examples</h3>
<p><i>case A, the mapreduce architect</i>: on one of those service oriented companies they have decided to create a product, very specific for a customer, their architect was capable to solve a hard problem using Apache Hadoop and non linear time algorithms, the resulting solution was fast enough to be integrated with web services with almost real time responses, but with asynchronous requests due to the problem complexity, and they have a good account manager capable to sell Apache Hadoop as part of their product, both with good knowledge of distributed and parallel solutions.</p>
<p><i>case B, the polyglot programmer</i>: there was application build on top of FOSS technologies, and the architect have designed a good application, and a big problem was required to be solved, a new hardware provide has sent a new device and they were requiring add support for that device on Linux. They were luck, because most of their programmers were polyglot programmers knowing C as part of their known programming languages. They do not missed their customer and they were able to make a new business bringing support for that new PKI device.</p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2012. |
<a href="http://coder.cl/2012/02/where-can-i-work/">Permalink</a> |
<a href="http://coder.cl/2012/02/where-can-i-work/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2012/02/where-can-i-work/&title=where can I work?">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2012/02/where-can-i-work/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for ( 2e96b290f6c5ccd2bc6830557c0aba6e coder.cl/category/projects/feed/ ) in 0.51256 seconds, on May 18th, 2012 at 12:15 pm UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on May 25th, 2012 at 12:15 pm UTC -->
