<?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>Filip Sajdak</title>
	<atom:link href="http://filip.sajdak.eu/feed/" rel="self" type="application/rss+xml" />
	<link>http://filip.sajdak.eu</link>
	<description>Scrum Master, Agile Coach, C++ developer</description>
	<lastBuildDate>Mon, 13 Feb 2012 00:40:50 +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>New training: Google Test &#8211; First and easy but real test</title>
		<link>http://filip.sajdak.eu/2012/02/13/new-training-google-test-first-and-easy-but-real-test/</link>
		<comments>http://filip.sajdak.eu/2012/02/13/new-training-google-test-first-and-easy-but-real-test/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 00:34:09 +0000</pubDate>
		<dc:creator>Filip Sajdak</dc:creator>
				<category><![CDATA[Bez kategorii]]></category>

		<guid isPermaLink="false">http://filip.sajdak.eu/?p=297</guid>
		<description><![CDATA[Today I have published next training from Agile C++ Developer series: Google Test &#8211; First and easy but real tests. This training is for Google Test beginners and average users. Have a nice read.]]></description>
			<content:encoded><![CDATA[<p>Today I have published next training from Agile C++ Developer series: <a title="Google Test - First and easy but real tests" href="http://sajdak.eu/trainings/agile-cpp-developer/google-test/first-and-easy-but-real-test/">Google Test &#8211; First and easy but real tests</a>.</p>
<p>This training is for Google Test beginners and average users.</p>
<p>Have a nice read.</p>
]]></content:encoded>
			<wfw:commentRss>http://filip.sajdak.eu/2012/02/13/new-training-google-test-first-and-easy-but-real-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New training: Google Test &#8211; Introduction to asserts and expects</title>
		<link>http://filip.sajdak.eu/2012/01/20/new-training-google-test-introduction-to-asserts-and-expects/</link>
		<comments>http://filip.sajdak.eu/2012/01/20/new-training-google-test-introduction-to-asserts-and-expects/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 22:22:26 +0000</pubDate>
		<dc:creator>Filip Sajdak</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[googletest]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[gtest]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://filip.sajdak.eu/?p=289</guid>
		<description><![CDATA[Today I have published first training from Agile C++ Developer series: Google Test &#8211; Introduction to asserts and expects. This is my first approach to this kind of training so every comments will be valuable. This training is for Google Test beginners. Have a nice read.]]></description>
			<content:encoded><![CDATA[<p>Today I have published first training from Agile C++ Developer series: <a href="http://sajdak.eu/trainings/agile-c-developer/google-test/introduction-to-asserts-and-expects/">Google Test &#8211; Introduction to asserts and expects</a>. This is my first approach to this kind of training so every comments will be valuable.</p>
<p>This training is for Google Test beginners.</p>
<p>Have a nice read.</p>
]]></content:encoded>
			<wfw:commentRss>http://filip.sajdak.eu/2012/01/20/new-training-google-test-introduction-to-asserts-and-expects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to open file in testable way?</title>
		<link>http://filip.sajdak.eu/2011/02/01/how-to-open-file-in-testable-way/</link>
		<comments>http://filip.sajdak.eu/2011/02/01/how-to-open-file-in-testable-way/#comments</comments>
		<pubDate>Tue, 01 Feb 2011 21:47:06 +0000</pubDate>
		<dc:creator>Filip Sajdak</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://filip.sajdak.eu/?p=239</guid>
		<description><![CDATA[<!--:en-->One of the most common problems in Test-Driven Development are parts of code which need to make some calls to your system environment. In general you is such situation you are forced to use some global functions which are really hard to test or mock. So lets look on some code and lets try to make it more testable.<!--:-->]]></description>
			<content:encoded><![CDATA[<p><!--:en-->One of the most common problems in Test-Driven Development are parts of code which need to make some calls to your system environment. In general in such situation you are forced to use some global functions which are really hard to test or mock. So lets look on some code and lets try to make it more testable.</p>
<pre><code class="cpp">#include &lt;fstream&gt;
#include &lt;string&gt;

double calculate(const std::string&amp; filepath) const
{
    std::ifstream file(filepath);
    double sum = 0;
    while (file.good())
    {
        double number;
        file &gt;&gt; number;
        sum += number;
    }
    return sum;
}
</code></pre>
<p>This is very easy piece of code &#8211; a function which calculates sum of doubles from given file. Code is easy but writing tests for it is rather hard&#8230; or maybe even impossible (well it is possible to test it using some preprocessor magic but this is my last resort).</p>
<p>We can split this code into some sections:</p>
<pre><code class="cpp">#include &lt;fstream&gt;
#include &lt;string&gt;

double calculate(const std::string&amp; filepath) const
{
    // open file stream
    std::ifstream file(filepath);

    // load numbers from stream and calculate sum
    double sum = 0;
    while (file.good())
    {
        double number;
        file &gt;&gt; number;
        sum += number;
    }

    // return result, file is closed in destructor
    return sum;
}
</code></pre>
<p>We know that <code class="cpp">std::ifstream</code> inherit from <code class="cpp">std::istream</code> class. So we could rewrite this code as:</p>
<pre><code class="cpp">#include &lt;fstream&gt;
#include &lt;string&gt;

double calculate(const std::string&amp; filepath) const
{
    // open file stream
    std::auto_ptr&lt;std::istream&gt; stream(new std::ifstream(filepath));

    double sum = 0;
    // load numbers from stream and calculate sum
    while (stream->good())
    {
        double number;
        (*stream) &gt;&gt; number;
        sum += number;
    }
    // return result, auto_ptr destructor destroy istream object
    // which destroys ifstream (virtual destructor)
    return sum;
}
</code></pre>
<p>We almost make our code free of calls to <code class="cpp">std::ifstream</code>. The only thing left is creation of <code class="cpp">std::ifstream</code> object. But we could refactor it to:</p>
<pre><code class="cpp">#include &lt;fstream&gt;
#include &lt;string&gt;

class FileSystem
{
public:
    virtual std::auto_ptr&lt;std::istream&gt; open(const std::string&amp; filePath) const
    {
        return std::auto_ptr&lt;std::istream&gt;(new std::ifstream(filepath));
    }
};

class Calculator
{
public:
    Calculator(FileSystem* filesystem) : filesystem(filesystem) {}

    double calculate(const std::string&amp; filepath) const
    {
        // open file stream
        std::auto_ptr&lt;std::istream&gt; stream = filesystem->open(filepath);

        double sum = 0;
        // load numbers from stream and calculate sum
        while (stream->good())
        {
            double number;
            (*stream) &gt;&gt; number;
            sum += number;
        }
        // return result, auto_ptr destructor destroy istream object
        // which destroys ifstream (virtual destructor)
        return sum;
    }

private:
    FileSystem* filesystem;
};
</code></pre>
<p>It is much better now! Code for calculate is free of global/static function calls so it is testable. The only think we have to do (to test calculate method) is to inject double of FileSystem (using polymorphism &#8211; then FileSystem::open method need to be virtual, or by making calculate method template &#8211; then dynamic polymorphism is not needed).</p>
<p>Of course we need to inject FileSystem in our production code but this is not as bad as someone may think. In my opinion it force programmer to think about design of his/her code instead of using global/static function calls where ever someone need to.</p>
<p>Above technique is called <a href="http://en.wikipedia.org/wiki/Dependency_Injection">Dependency Injection (DI)</a> and it is worth learning because it solves great number of problems when you have to make your code testable.</p>
<p>I hope you enjoy this reading&#8230; even if not I am waiting for your comments. </p>
<p>Happy testing!<!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://filip.sajdak.eu/2011/02/01/how-to-open-file-in-testable-way/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How to test main()?</title>
		<link>http://filip.sajdak.eu/2011/01/30/how-to-test-main/</link>
		<comments>http://filip.sajdak.eu/2011/01/30/how-to-test-main/#comments</comments>
		<pubDate>Sun, 30 Jan 2011 15:36:37 +0000</pubDate>
		<dc:creator>Filip Sajdak</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://filip.sajdak.eu/?p=208</guid>
		<description><![CDATA[<!--:en-->When you are doing Test-Driven Development you try to test what ever you wrote. Better you write tests before you write any line of code. But finally when you have your brand new functions and classes (all 100% covered by tests) you have to integrate it in some working software. In the very end (or begining) you have to write main(int, char**) function. How do you test it using Unit Tests?
<!--:-->]]></description>
			<content:encoded><![CDATA[<p><!--:en-->When you are doing Test-Driven Development you try to test whatever you wrote. It is even better! You write tests before you write any line of code. But eventually when you have your brand new functions and classes (all 100% covered by tests) you have to integrate it in some working software. In the very end you have to write main(int, char**) function. How do you test it using Unit Tests?</p>
<p>Imagine that you have such easy (well known) application:</p>
<pre><code class="cpp">#include &lt;iostream&gt;

int main(int argc, char** argv)
{
    std::cout &lt;&lt; "Hello World!" &lt;&lt; std::endl;
    std::cout &lt;&lt; "Number of arguments: " &lt;&lt; argc &lt;&lt; std::endl;
}
</code></pre>
<p>How would you test it using UnitTests? The easiest answer is that you cannot test it because there are no seam points which allow testing. It&#8217;s all true but I would like to show you that main() is testable&#8230; maybe not directly but you may transform above code with only little effort to something testable. For example you can do something like this:</p>
<pre><code class="cpp">#include &lt;iostream&gt;

class Main
{
public:
    static int main(int argc, char** argv)
    {
        std::cout &lt;&lt; "Hello World!" &lt;&lt; std::endl;
        std::cout &lt;&lt; "Number of arguments: " &lt;&lt; argc &lt;&lt; std::endl;
        return 0;
    }
};

int main(int argc, char** argv)
{
    return Main::main(argc, argv);
}
</code></pre>
<p>It is much better now, isn&#8217;t it! At least we can call our main function in our tests! Unfortunately there are still some problems which will make testing of this a little pain. Our brand new Main::main function calls global objects which are always trouble for Unit Tests. But this also could be solved!</p>
<pre><code class="cpp">#include &lt;iostream&gt;

class Main
{
public:
    Main(std::ostream&amp; output) : output(output) {}

    int main(int argc, char** argv)
    {
        output &lt;&lt; "Hello World!" &lt;&lt; std::endl;
        output &lt;&lt; "Number of arguments: " &lt;&lt; argc &lt;&lt; std::endl;
        return 0;
    }

private:
    std::ostream&amp; output;
};

int main(int argc, char** argv)
{
    Main app_main(std::cout);
    return app_main.main(argc, argv);
}
</code></pre>
<p>What we achieve is class Main which can be freely instantiate in any test we want. We could inject any kind of std::ostream to it (ie. std::stringstream) and test what was written to it. We may also manipulate with two arguments to check correct and invalid argument values. All of this is possible right now.</p>
<p>For those worrying about performance &#8211; modern compilers should compile our new code to the same binary as it would do for our previous version,  so don&#8217;t worry!</p>
<p>Happy testing!<!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://filip.sajdak.eu/2011/01/30/how-to-test-main/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Funny little nasty bug</title>
		<link>http://filip.sajdak.eu/2011/01/30/funny-little-nasty-bug/</link>
		<comments>http://filip.sajdak.eu/2011/01/30/funny-little-nasty-bug/#comments</comments>
		<pubDate>Sun, 30 Jan 2011 13:52:47 +0000</pubDate>
		<dc:creator>Filip Sajdak</dc:creator>
				<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://filip.sajdak.eu/?p=215</guid>
		<description><![CDATA[<!--:en-->Some time ago I was writing some piece of code in which there was a part where I have to concatenate strings differently depending on some flag. Easy thing. So I wrote some few lines of code and to my great surprise it does not work.<!--:-->]]></description>
			<content:encoded><![CDATA[<p>Some time ago I was writing some piece of code in which there was a part where I have to concatenate strings differently depending on some flag. Easy thing. So I wrote some few lines of code and to my great surprise it does not work.</p>
<p>I wrote something like this:</p>
<pre>&lt;code class=&quot;cpp&quot;&gt;bool flag;
/* ... some code setting flag ... */
std::string out = &quot;path&quot;;
out += &quot;/&quot; + flag ? &quot;X&quot; : &quot;Y&quot;;&lt;/code&gt;</pre>
<p>What I was trying to achieve is rather obvious but if you think that out string contains &#8220;path/X&#8221; or &#8220;path/Y&#8221; you are wrong! True is result was always &#8220;pathX&#8221;.</p>
<p>The reason for that is simple. Compiler (because of <a title="Operator precedence" href="http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence" target="_blank">operator precedence</a>) treats above code as:</p>
<pre>&lt;code class=&quot;cpp&quot;&gt;out += (&quot;/&quot; + flag) ? &quot;X&quot; : &quot;Y&quot;;&lt;/code&gt;</pre>
<p>instead of</p>
<pre>&lt;code class=&quot;cpp&quot;&gt;out += &quot;/&quot; + (flag ? &quot;X&quot; : &quot;Y&quot;);&lt;/code&gt;</pre>
<p>When I look at this bug right now it look easy, but I spend few minutes on few lines of code to catch it.</p>
]]></content:encoded>
			<wfw:commentRss>http://filip.sajdak.eu/2011/01/30/funny-little-nasty-bug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>QPomodoro version 0.4.1 released!</title>
		<link>http://filip.sajdak.eu/2010/06/24/qpomodoro-version-0-4-1-released/</link>
		<comments>http://filip.sajdak.eu/2010/06/24/qpomodoro-version-0-4-1-released/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 07:23:58 +0000</pubDate>
		<dc:creator>Filip Sajdak</dc:creator>
				<category><![CDATA[Pomodoro]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Time Managment]]></category>

		<guid isPermaLink="false">http://filip.sajdak.eu/?p=179</guid>
		<description><![CDATA[QPomodoro is tool which will help you in using The Pomodoro Technique™ in  your daily work . It is based on work done by Sakari Hyoty written for Nokia N900.  Current version was mainly developed on Windows and maybe it will not work properly on Nokia N900 or Linux (it will be done soon). New [...]]]></description>
			<content:encoded><![CDATA[<p>QPomodoro is tool which will help you in using <a href="http://www.pomodorotechnique.com/">The Pomodoro Technique<em>™</em></a> in  your daily work . It is based on <a href="http://www.shyoty.com/pomodoro/">work done by Sakari Hyoty</a> written for Nokia N900.  Current version was mainly developed on Windows and maybe it will not work properly on Nokia N900 or Linux (it will be done soon).</p>
<h2>New features:</h2>
<ul>
<li>QPomodoro has tray icon &#8211; application can be hidden in the tray.</li>
<li>Time is displayed as window title so it is visible on task bar</li>
<li>Tasks can be edited &#8211; name or estimate can be changed</li>
<li>Order of tasks can be changed &#8211; task are movable using Drag &amp; Drop</li>
<li>Window icon is changed to &#8220;Pomodoro&#8221;</li>
<li>On Windows added application icon.</li>
</ul>
<p>New version can be downloaded from here: <a href="http://filip.sajdak.eu/wp-content/uploads/2010/06/Pomodoro-0.4.1.zip">QPomodoro-0.4.1.zip</a></p>
<p>Source code can be cloned from <a href="http://gitorious.org/qpomodoro">here</a></p>
]]></content:encoded>
			<wfw:commentRss>http://filip.sajdak.eu/2010/06/24/qpomodoro-version-0-4-1-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Positive Psychology and Team Performance</title>
		<link>http://filip.sajdak.eu/2010/03/19/positive-psychology-and-team-performance/</link>
		<comments>http://filip.sajdak.eu/2010/03/19/positive-psychology-and-team-performance/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 20:52:08 +0000</pubDate>
		<dc:creator>Filip Sajdak</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://filip.sajdak.eu/?p=160</guid>
		<description><![CDATA[I found very interesting video on Scrum Alliance web page. Lyssa Adkins (Certified Scrum Trainer, Project Management Professional  and Six Sigma Green Belt) presents scientific data about how positive psychology can improve your team. This is not wishful thinking but real science! Lyssa presents it clearly in her presentation (which is very good by the [...]]]></description>
			<content:encoded><![CDATA[<p>I found very interesting video on Scrum Alliance web page. Lyssa Adkins (Certified Scrum Trainer, Project Management Professional  and  Six Sigma Green Belt) presents scientific data about how positive psychology can improve your team. This is not wishful thinking but real science! Lyssa presents it clearly in her presentation (which is very good by the way) so take a look:</p>
<p style="text-align: center">
<p><a href="http://www.youtube.com/watch?v=mX7W8yIW-jU">YouTube &#8211; Positive  Psychology and Team Performance</a>.</p>
<p>If you are interested in who is Lyssa and what is she doing you can go to her web page: http://www.coachingagileteams.com .</p>
]]></content:encoded>
			<wfw:commentRss>http://filip.sajdak.eu/2010/03/19/positive-psychology-and-team-performance/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Scrum Team as black box</title>
		<link>http://filip.sajdak.eu/2010/03/16/scrum-team-as-black-box/</link>
		<comments>http://filip.sajdak.eu/2010/03/16/scrum-team-as-black-box/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 20:20:43 +0000</pubDate>
		<dc:creator>Filip Sajdak</dc:creator>
				<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://filip.sajdak.eu/?p=155</guid>
		<description><![CDATA[I was presenting Scrum as Agile method for project development on University of Technology in Wroclaw. During coffee break one of the students came to me and ask me a question about the Scrum Team, Product Owner and Scrum Master. During short discussion I compare Scrum Team to black box and I found it very interesting.]]></description>
			<content:encoded><![CDATA[<p>I was presenting Scrum as Agile method for project development on University of Technology in Wroclaw. During coffee break one of the students came to me and ask me a question about the Scrum Team, Product Owner and Scrum Master. During short discussion I compare Scrum Team to black box and I found it very interesting.</p>
<p>I don&#8217;t know why I use this comparison. Maybe just because during my studies on this university I spend lot of time working with black boxes (while I was studying robotics). Black box is something which has an input and output. You can&#8217;t tell what is going on inside that box but you can change input and check output. So, now imagine that (from Product Owner perspective) Scrum Team is like black box. Product Owner just gives Product Backlog Items and waits for the output. He or she doesn&#8217;t know (or at least should not care) what is going on inside the team. What is she or he interested in is just the output (which are Product Backlog Items done in the way Definition Of Done describes it).</p>
<p>What is more interesting on this black box there is a big red button which is called &#8220;Sprint reset&#8221; which can be used to reset team iteration. You can do it as you can do with your PC with the same result &#8211; everything which is in progress will be lost.</p>
<p>I found this picture very interesting and descriptive, what do you think about it? From my studies I know that we can connect controller (and also observer) with feedback loop to it which will allow you to control it with more precision. I am curious if this can be used to describe Scrum process&#8230; I have to think about it <img src='http://filip.sajdak.eu/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://filip.sajdak.eu/2010/03/16/scrum-team-as-black-box/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Picture-driven programming</title>
		<link>http://filip.sajdak.eu/2010/01/29/picture-driven-programming/</link>
		<comments>http://filip.sajdak.eu/2010/01/29/picture-driven-programming/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 14:32:32 +0000</pubDate>
		<dc:creator>Filip Sajdak</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Sikuli]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://filip.sajdak.eu/?p=141</guid>
		<description><![CDATA[Today I found something interesting&#8230; it is called Sikuli and it is used for picture-driven programming. I know that it sounds silly but it is not! First thing is that guys from MIT are authors of this tool (language or programming style). The second thing is that it allows you (with little knowledge of python [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left">Today I found something interesting&#8230; it is called Sikuli and it is used for picture-driven programming. I know that it sounds silly but it is not! First thing is that guys from MIT are authors of this tool (language or programming style). The second thing is that it allows you (with little knowledge of python programming) to automate anything of your actions in Graphic User Interface &#8211; including operation with your operating system. The idea is: &#8220;If something is visible to user it can be programmed using sikuli!&#8221;.</p>
<p style="text-align: left">I know that my description is rather poor and it doesn&#8217;t give you proper image of this tool&#8230; just take a look:</p>
<p style="text-align: center">
<p style="text-align: left">You can find more on <a href="http://sikuli.org">http://sikuli.org</a></p>
<p style="text-align: left">Have a fun (as I have) playing with this tool.</p>
]]></content:encoded>
			<wfw:commentRss>http://filip.sajdak.eu/2010/01/29/picture-driven-programming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Two ways of changing the system</title>
		<link>http://filip.sajdak.eu/2010/01/29/two-ways-of-changing-the-system/</link>
		<comments>http://filip.sajdak.eu/2010/01/29/two-ways-of-changing-the-system/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 14:22:04 +0000</pubDate>
		<dc:creator>Filip Sajdak</dc:creator>
				<category><![CDATA[Cites]]></category>
		<category><![CDATA[cite]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://filip.sajdak.eu/?p=138</guid>
		<description><![CDATA[Changes in a system can be made in two primary ways. I like to call them &#8220;Edit and Pray&#8221; and &#8220;Cover and Modify&#8221;. Unfortunately, &#8220;Edit and Pray&#8221; is pretty much the industry standard. Working Effectively with Legacy Code by Michael C. Feathers]]></description>
			<content:encoded><![CDATA[<blockquote><p>Changes in a system can be made in two primary ways. I like to call them &#8220;Edit and Pray&#8221; and &#8220;Cover and Modify&#8221;. Unfortunately, &#8220;Edit and Pray&#8221; is pretty much the industry standard.</p></blockquote>
<p style="text-align: right"><em>Working Effectively with Legacy Code</em> by Michael C. Feathers<br />
<em> </em></p>
]]></content:encoded>
			<wfw:commentRss>http://filip.sajdak.eu/2010/01/29/two-ways-of-changing-the-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

