<?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>The Developer Day</title>
	<atom:link href="http://www.thedeveloperday.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thedeveloperday.com</link>
	<description>Staying Curious</description>
	<lastBuildDate>Fri, 09 Mar 2012 19:59:43 +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>Making QCon better</title>
		<link>http://www.thedeveloperday.com/making-qcon-better/</link>
		<comments>http://www.thedeveloperday.com/making-qcon-better/#comments</comments>
		<pubDate>Fri, 09 Mar 2012 19:54:55 +0000</pubDate>
		<dc:creator>Žilvinas Šaltys</dc:creator>
				<category><![CDATA[Rant]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[qcon]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://www.thedeveloperday.com/?p=776</guid>
		<description><![CDATA[This post is my rant on how to make QCon a better conference or any developer conference for that matter. I&#8217;ve attended it for my first time in 2012 and was expecting a great deal since it&#8217;s probably the best there is with opening keynotes from people like Martin Fowler. Quality Over Quantity In my [...]]]></description>
			<content:encoded><![CDATA[<p>This post is my rant on how to make QCon a better conference or any developer conference for that matter. I&#8217;ve attended it for my first time in 2012 and was expecting a great deal since it&#8217;s probably the best there is with opening keynotes from people like Martin Fowler.</p>
<h2>Quality Over Quantity</h2>
<p>In my eyes it&#8217;s much better to have 1 day worth of talks with exclusive speakers than three days with lots of very average content with average presenters. QCon had 3 days, 7 parallel lanes and 6 presentations in each one of them. That&#8217;s 18 presentations in total for one visitor to see. Or over a hundred presentations in total. However it seems to me from following twitter that only ~10 of them were very well accepted. Some were so good that there was not even a spot to stand.</p>
<p>This leads me to suggest that the conference should be more strict who can attend these massive conferences. I would suggest that it only accepts speakers who have spoken in smaller conferences at least 5 times. There could be selective early bird invites to review the talks before they get accepted. Maybe you could get a discount if you agree to do so. The author would obviously have to make a recording of his talk.</p>
<h2>Talk Titles Descriptions</h2>
<p>So many times I have felt fooled and lured by a catchy title just to try to stay awake during the talk. I guess there&#8217;s nothing wrong to have a catchy title. However I would suggest that each accepted speaker has an introductory video on who he is and what he&#8217;s going to speak about. That way you can get a feel of a person before you go see him. Also if the above suggestions have been followed then links to his previous speeches in video should be included so viewers could review how good the speaker is.</p>
<p>Another great addition would be to mark how advanced the talk is. Just add a simple tag: introduction, advanced, expert. However I would argue that QCon should not have any introductions to topics like NoSQL.</p>
<h2>Hack Fest Anyone?</h2>
<p>My colleague suggested a somewhat crazy idea. To organize a hackfest so that people could do some coding together, solve some challenges, get to know each other, compete, get EXCITED. Have you seen the movie Social Network where devs were competing for a job at facebook and had to hack a linux box while drinking vodka shots during the challenge. Something in that direction maybe?</p>
<h2>A conference for everyone</h2>
<p>This is an experimental thought also suggested by my colleague. There&#8217;s a pattern that developers love talks which talk about organizational changes. It&#8217;s weird but they applaud more the talks on how to have a great team, great processes rather than a new tool. However when they go back to their organization it&#8217;s very difficult to apply these ideas at your workplace because most of the time you&#8217;ll be met with outright scepticism and denial. What if your product managers, your QA&#8217;s, your sysadmins and maybe even your CEO would find it worthwhile to go to such a conference. How awesome would it have been if all these different roles could haven seen the Github talk together with you? Or would you be interested to hear from CEO&#8217;s who were developers once and how they became who they are and what they&#8217;ve learned along the way.</p>
<h2>Sponsor Giveaways</h2>
<p>Always organise giveaways at the end of the conference in one big go rather than at random times during the conference. This will keep people from going home and staying in the main hall, getting a few beers, maybe meeting someone and it will also make it more convenient for the visitors.</p>
<h2>Don&#8217;t kill the messenger</h2>
<p>This whole rant might make me sound like an ungrateful bastard but it&#8217;s not like that. I do appreciate people trying and doing what they do. The QCon that is right now is still infinitely better than no QCon at all. However as everything else it can be even greater.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedeveloperday.com/making-qcon-better/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My top 5 QCon London 2012 talks</title>
		<link>http://www.thedeveloperday.com/my-top-5-qcon-london-2012-talks/</link>
		<comments>http://www.thedeveloperday.com/my-top-5-qcon-london-2012-talks/#comments</comments>
		<pubDate>Fri, 09 Mar 2012 19:15:25 +0000</pubDate>
		<dc:creator>Žilvinas Šaltys</dc:creator>
				<category><![CDATA[Rant]]></category>
		<category><![CDATA[Reviews]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[infoq]]></category>
		<category><![CDATA[qcon]]></category>

		<guid isPermaLink="false">http://www.thedeveloperday.com/?p=771</guid>
		<description><![CDATA[I was attending the conference for the first time and wanted to share my top list of talks. There might have been other good ones but I didn&#8217;t get a chance to see them therefore can&#8217;t comment on them. All of these talks will be released on InfoQ in the next 6 months for your [...]]]></description>
			<content:encoded><![CDATA[<p>I was attending the conference for the first time and wanted to share my top list of talks. There might have been other good ones but I didn&#8217;t get a chance to see them therefore can&#8217;t comment on them. All of these talks will be released on <a href="http://www.infoq.com">InfoQ</a> in the next 6 months for your viewing.</p>
<h2>#1 Lock-free Algorithms for Ultimate Performance</h2>
<p><em>by Martin Thompson and Michael Barker.</em> <a href="http://qconlondon.com/london-2012/presentation/Lock-free%20Algorithms%20for%20Ultimate%20Performance">Talk</a> <a href="http://qconlondon.com/dl/qcon-london-2012/slides/MartinThompson_and_MichaelBarker_LockFreeAlgorithmsForUltimatePerformance.pdf">Download slides</a></p>
<p>This has to be my favourite talk. These guys know they&#8217;re hardware well. They showed how it&#8217;s possible to create lock free algorithms which run in nanoseconds if you apply some mechanical sympathy to your code. </p>
<h2>#2 Decisions, decisions</h2>
<p><em>by Dan North</em> <a href="http://qconlondon.com/london-2012/presentation/Decisions,%20decisions">Talk</a> <a href="http://qconlondon.com/dl/qcon-london-2012/slides/DanNorth_DecisionsDecisions.pdf">Download slides</a></p>
<p>A really entertaining, insightful and somewhat shocking talk. Not an unusual talk by Dan North in anyway. He talks about decisions (obviously) and that each one of them is a trade-off. Sometimes we forget to weigh these trade-off&#8217;s.</p>
<h2>#3 How GitHub Works</h2>
<p><em>by Zach Holman</em> <a href="http://qconlondon.com/london-2012/presentation/How%20GitHub%20Works">Talk</a> <a href="http://qconlondon.com/london-2012/schedule/friday.jsp">Slides</a> will be available later.</p>
<p>A great talk and visually beautiful  as well. Even has some singing in it! Zach is a wonderful presenter and explains how github does what it does so well. Their approach is very unusual and alien from the one we see in the corporate world yet it works so well.</p>
<h2>#4 Developers Have a Mental Disorder</h2>
<p><em> by Greg Young</em> <a href="http://qconlondon.com/london-2012/presentation/Developers%20Have%20a%20Mental%20Disorder">Talk</a> This guy does not need slides!</p>
<p>A non technical talk by a very technical person. It was Greg&#8217;s comeback to the QCon stage and a great one. He delivers a speech on many of the disorders developers carry with them in their work. The best one so far being: <strong>solving problems no one has</strong>.</p>
<h2>#5 Concurrent Programming Using The Disruptor</h2>
<p><em>by Trisha Gee</em> <a href="http://qconlondon.com/london-2012/presentation/Concurrent%20Programming%20Using%20The%20Disruptor">Talk</a> <a href="http://qconlondon.com/dl/qcon-london-2012/slides/TrishaGee_ConcurrentProgrammingUsingTheDisruptor.pdf">Download slides</a></p>
<p>It would be enough to say this talk was delivered by a beautiful lady packed with a room of geeks but it deserves more praise. It&#8217;s a quite technical talk on an innovative and great piece of software or rather a framework: The Disruptor a concurrent programming framework. If you&#8217;e unfamiliar with it or even more so unfamiliar with concurrent programming you might find it interesting.</p>
<h2>Special Mention &#8211; Scalable Internet Architectures</h2>
<p><em>by Theo Schlossnagle</em> <a href="http://qconlondon.com/london-2012/presentation/Scalable%20Internet%20Architectures">Talk</a> <a href="http://qconlondon.com/london-2012/schedule/friday.jsp">Slides</a> will be available later.</p>
<p>Haven&#8217;t attended this one myself but have heard that it was great. Managed to only see a few minutes of it where the author said: &#8220;Don&#8217;t be a fucking idiot!&#8221;. This sentence alone makes a talk good.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedeveloperday.com/my-top-5-qcon-london-2012-talks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Continuous Delivery / Ninja Deployments</title>
		<link>http://www.thedeveloperday.com/continuous-delivery-ninja-deployments/</link>
		<comments>http://www.thedeveloperday.com/continuous-delivery-ninja-deployments/#comments</comments>
		<pubDate>Tue, 28 Feb 2012 14:49:46 +0000</pubDate>
		<dc:creator>Žilvinas Šaltys</dc:creator>
				<category><![CDATA[Rant]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[merging]]></category>

		<guid isPermaLink="false">http://www.thedeveloperday.com/?p=759</guid>
		<description><![CDATA[Recently I&#8217;ve attended the PHPUK 2012 conference where I went to see a talk &#8220;To a thousand servers and beyond: scaling a massive PHP application&#8221; by Nikolay Bachiyski. The talk itself was more about how wordpress.com scales to serve it&#8217;s massive load but what got me interested to write this blog post is how wordpress.com [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I&#8217;ve attended the <a href="http://www.phpconference.co.uk/conference/php-uk-conference-2012" title="phpuk 2012 conference" target="_blank">PHPUK 2012 conference</a> where I went to see a talk  &#8220;<a href="http://www.phpconference.co.uk/talk/thousand-servers-and-beyond-scaling-massive-php-application" target="_blank">To a thousand servers and beyond: scaling a massive PHP application</a>&#8221; by <strong>Nikolay Bachiyski</strong>. The talk itself was more about how wordpress.com scales to serve it&#8217;s <strong>massive load</strong> but what got me interested to write this blog post is how wordpress.com does <strong>deployments</strong>.</p>
<p>There are two parts about WordPress. One is the blog that you can download and host on your own servers. The other is where you can create an account on wordpress.com and set up a blog on their own servers. These two are developed and released separately. What we&#8217;ve found out from the talk is that about <strong>50 developers</strong> have access to wordpress.com codebase and can make changes and they do about <strong>100 commits</strong> to trunk a day.</p>
<p>Now the interesting part is that every commit to trunk is an actual deployment to the live platform. And it&#8217;s super crazy fast. It takes <strong>8 seconds</strong> for them to deploy WordPress.com to <strong>3 datacenters</strong>. Note 100 commits equates to <strong>100 deploys a day</strong>. And they don&#8217;t have a QA team, a testable environment or a stage environment. Crazy if you ask me but apparently it works for them. They serve <strong>hundreds of billions of pageviews</strong> and manage to keep the platform stable.</p>
<p>When asked Nikolay explained that it&#8217;s a much better strategy for them than going into 2 weeks of merging nightmares where all new changes are merged into a stable branch.  I think that merge nightmares is as extreme as ninja deployments from trunk. I do believe in a balanced approach and think we&#8217;ve managed to achieve it at AOL with our own projects. </p>
<h2>A Different Approach</h2>
<p>We use an internally made tool which tracks on top of SVN all the changes made to different branches and allows to easily move those changesets from one branch to another. With every project repository we have three branches: <strong>trunk</strong>, <strong>testable</strong> and <strong>stable</strong>. Once a developer wants to make a new commit he would commit with a comment like this: &#8220;#123 > comment message&#8221; and this will assign a commit to a specific ticket number in our ticket system and do the commit. If a dev needs to make 10 commits he would do all of them against the same ticket number. Once he&#8217;s done he uses the internal tool to mark the set of changesets he made as <strong>resolved</strong>.</p>
<p>This is where the QA&#8217;s can now take all of those changesets and try and merge them into a testable branch when they feel they&#8217;re ready to test. They again do it via our internal tool. The smart thing here is that the tool detects all possible conflicts by dry running the merge and warning you which tickets conflict with which tickets. 95% of the time if conflicts happen is because people try to merge newer changesets first rather than merging older changesets first. Even then a lot of times it&#8217;s possible to merge ingnoring the conflict which does not cause any trouble later on.</p>
<p>We try to maintain discipline and push things in the order they were developed. Still conflicts do happen. It&#8217;s unavoidable. But for that we have a separate tole: <strong>a release manager</strong>. Who is responsible for solving these merge conflicts and usually they&#8217;re very minor, they quickly catch a dev responsible for the changeset and work it out. The release manager is also the guy who controls what goes into stable and then deploys to live with a click of a button.</p>
<p>Before we had this tool we lived in the <strong>nightmare merge world</strong>. But no more. We&#8217;re actually managing to <strong>deliver continuously</strong> deploying few times a day. It also allows our QA&#8217;s to have a <strong>controlled environment</strong> with only the changes they want. Yes it takes an extra role but that&#8217;s a minor cost for us considering the other two extremes. I believe this is a much more <strong>balanced approach</strong> that can and does make both the business owners happy and the developers less suicidal.</p>
<p><em>p.s The tool described is developed by one of our developers and last time I checked he seriously considered to make it opensource but want&#8217;s to polish it a bit further first.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedeveloperday.com/continuous-delivery-ninja-deployments/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Dumping Memcache Keys</title>
		<link>http://www.thedeveloperday.com/dumping-memcache-keys/</link>
		<comments>http://www.thedeveloperday.com/dumping-memcache-keys/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 21:25:16 +0000</pubDate>
		<dc:creator>Žilvinas Šaltys</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[memcache]]></category>

		<guid isPermaLink="false">http://www.thedeveloperday.com/?p=746</guid>
		<description><![CDATA[Sometimes it&#8217;s useful to be able to quickly peek what keys memcache is storing and how old are they. A good use case for example could be to check whether something is cached or not or that they expire as they should. At first I found a way to dump memcache keys through telnet. However [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes it&#8217;s useful to be able to quickly peek what keys memcache is storing and how old are they. A good use case for example could be to check whether something is cached or not or that they expire as they should.</p>
<p>At first I found a way to <a href="http://www.darkcoding.net/software/memcached-list-all-keys/" title="memcache keys telnet" target="_blank">dump memcache keys through telnet</a>. However if a memcache instance is fairly large and has a lot of slabs and thousands of keys it becomes impractical to do it manually.</p>
<p>I wrote a simple utility that helps me find keys across all memcache slabs.</p>
<pre name="code" class="php:nogutter">
#!/usr/bin/php
< ?php
$host = "127.0.0.1";
$port = 11211;
$lookupKey = "";
$limit = 10000;

$time = time();

foreach ($argv as $key => $arg) {
    switch ($arg) {
        case '-h':
            $host = $argv[$key + 1];
            break;
        case '-p':
            $port = $argv[$key + 1];
            break;
        case '-s':
            $lookupKey = $argv[$key + 1];
            break;
        case '-l':
            $limit = $argv[$key + 1];
    }
}

$memcache = memcache_connect($host, $port);

$list = array();
$allSlabs = $memcache->getExtendedStats('slabs');
$items = $memcache->getExtendedStats('items');

foreach ($allSlabs as $server => $slabs) {
    foreach ($slabs as $slabId => $slabMeta) {
        if (!is_numeric($slabId)) {
            continue;
        }

        $cdump = $memcache->getExtendedStats('cachedump', (int)$slabId, $limit);

        foreach ($cdump as $server => $entries) {
            if (!$entries) {
                continue;
            }

            foreach($entries as $eName => $eData) {
                $list[$eName] = array(
                    'key' => $eName,
                    'slabId' => $slabId,
                    'size' => $eData[0],
                    'age' => $eData[1]
                );
            }
        }
    }
}

ksort($list);

if (!empty($lookupKey)) {
     echo "Searching for keys that contain: '{$lookupKey}'\n";
     foreach ($list as $row) {
        if (strpos($row['key'], $lookupKey) !== FALSE) {
            echo "Key: {$row['key']}, size: {$row['size']}b, age: ", ($time - $row['age']), "s, slab id: {$row['slabId']}\n";
        }
     }
} else {
    echo "Printing out all keys\n";
    foreach ($list as $row) {
        echo "Key: {$row['key']}, size: {$row['size']}b, age: ", ($time - $row['age']), "s, slab id: {$row['slabId']}\n";
    }
}
</pre>
<p>This script accepts 4 parameters:</p>
<blockquote style="background: #444; color: #fff; padding-left: 2px;"><p>
-h host<br />
-p port<br />
-s partial search string<br />
-l a limit of how many keys to dump from a single slab (default 10,000)
</p></blockquote>
<p>The easiest way to use it:</p>
<blockquote style="background: #444; color: #fff; padding-left: 2px;"><p>
./membrowser.php -s uk<br />
Searching for keys that contain: &#8216;uk&#8217;<br />
Key: 1_uk_xml, size: 3178b, age: 1728s, slab id: 17<br />
Key: 2_uk_xml, size: 3178b, age: 1725s, slab id: 17<br />
Key: 3_uk_xml, size: 3178b, age: 1721s, slab id: 17
</p></blockquote>
<p>Download <a href="http://www.thedeveloperday.com/uploads/membrowser.phps">memcache keys dump script</a>.</p>
<p>P.S some of the code I&#8217;ve copied from <a href="http://100days.de/serendipity/archives/55-Dumping-MemcacheD-Content-Keys-with-PHP.html" target="_blank">100days.de blog post</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedeveloperday.com/dumping-memcache-keys/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Optimizing MySQL on Ubuntu 10.10 Maverick</title>
		<link>http://www.thedeveloperday.com/optimizing-mysql-on-ubuntu-10-10-maverick/</link>
		<comments>http://www.thedeveloperday.com/optimizing-mysql-on-ubuntu-10-10-maverick/#comments</comments>
		<pubDate>Thu, 25 Nov 2010 02:06:37 +0000</pubDate>
		<dc:creator>Žilvinas Šaltys</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Optimization]]></category>
		<category><![CDATA[innodb]]></category>
		<category><![CDATA[MyISAM]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[Tuning]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.thedeveloperday.com/?p=722</guid>
		<description><![CDATA[Since Ubuntu 9.04 Jaunty Jackalope Ubuntu ships with EXT4 as the default file system. Surprisingly it makes MySQL writes extremely slow. This post is targeted to developers who work on Linux using MySQL and who would like to optimize MySQL performance. Disk Performance Tuning First start by tuning your disk performance. To do that you&#8217;ll [...]]]></description>
			<content:encoded><![CDATA[<p>Since <strong>Ubuntu 9.04 Jaunty Jackalope</strong> Ubuntu ships with EXT4 as the default file system. Surprisingly it makes <strong>MySQL</strong> writes extremely slow. This post is targeted to developers who work on <strong>Linux</strong> using MySQL and who would like to optimize MySQL performance.</p>
<h2>Disk Performance Tuning</h2>
<p>First start by tuning your <strong>disk performance</strong>. To do that you&#8217;ll have to sacrifice <strong>data consistency</strong> over data write speed. First start by enabling <strong>journal_data_writeback</strong> on your partition. This will allow to write to disk before updating the EXT4 journal. If your box crashes before updating the journal you might loose new data or some deleted data might reappear.</p>
<blockquote style="background: #444; color: #fff; padding-left: 2px;"><p>
sudo tune2fs -o journal_data_writeback /dev/sda1 (use the right partition)
</p></blockquote>
<p>Next step is editing your <strong>/etc/fstab</strong> to change ext4 mounting options. My fstab file looks something like this:</p>
<blockquote style="background: #444; color: #fff; padding-left: 2px;"><p>
UUID=irrelevant / ext4 errors=remount-ro,noatime,nodiratime,data=writeback,barrier=0,nobh,commit=100,nouser_xattr 0 1
</p></blockquote>
<p>There&#8217;s a few non default options added to improve write performance over consistency. Journal data writeback is enabled by <strong>data=writeback</strong>. The main option which is slowing down MySQL is <strong>barrier=0</strong>. You could actually change this single option and MySQL write performance would increase dramatically. Disabling this option makes your <strong>new</strong> data less safe when a system crash happens. Option <strong>nobh</strong> tries to avoid associating buffer heads and offers a minor performance improvement. Another option <strong>commit=100</strong> says that all your updates are written to disk every 100 seconds. The default is 5 seconds. If your machine crashes you&#8217;re likely to loose 100 seconds of updates. Large commit values like 100 provide big performance improvements. And the last option <strong>nouser_xattr</strong> disables extended options on your filesystem and provides a minor <strong>performance boost</strong>.</p>
<p>Double check your /etc/fstab syntax and reboot.</p>
<h2>Tuning MySQL configuration</h2>
<p>MySQL configuration settings depend on what database engines you&#8217;re using. The most common ones are <strong>MyISAM</strong> and <strong>InnoDB</strong>. I will assume that you use both.</p>
<p><strong>Warning!</strong> Some of the configuration changes will or might make your database inaccessible. Therefore backup all your databases by dumping them to SQL to a safe location. Make sure to include triggers and stored procedures. Double check that you will be able to reimport your backups and only then proceed further. Some options will make your InnoDB database stop working. I&#8217;ll mark those. Also backup your MySQL configuration. Just in case.</p>
<p>MySQL settings depend on how much memory you have. I will assume a normal working station will have 4GB of RAM. Open your MySQL configuration file which on Ubuntu is located at /etc/mysql/my.cnf and set the following options.</p>
<p><em>transaction-isolation = READ-COMMITTED</em></p>
<p>As a developer you will probably not have transactions running in parallel. If you don&#8217;t care about transactions and still use InnoDB set the isolation level to READ-COMMITED. This will make your transactions only see committed data but won&#8217;t prevent phantom rows. Setting it to READ-COMMITED will also improve performance.</p>
<p><em>key_buffer = 512M</em></p>
<p>By far the most important option for MyISAM. MyISAM indexes are cached using in the key buffer. It&#8217;s usually a good bet to set it from 25% to 40% of memory available. As a developer you might not need that much but do not leave it at a default.</p>
<p><em>query_cache_size  = 256M</em></p>
<p>Caches query results. Especially useful if your applications don&#8217;t have caching.</p>
<p><em>innodb_buffer_pool_size = 1024M</em> (<strong>requires a backup and an import</strong>)</p>
<p>InnoDB buffer pool size is the most important option for InnoDB. If your whole database is InnoDB you can try and fit your whole database in memory. If you don&#8217;t have that much memory you can generally set 70% &#8211; 80% of memory available. On a development box you will probably want to have extra RAM for things like Gnome or your IDE.</p>
<p><em>innodb_additional_mem_pool_size = 32M</em><br />
<em>innodb_log_buffer_size = 4M</em><br />
<em>innodb_log_file_size = 128M</em></p>
<p><em>innodb_flush_log_at_trx_commit	= 2</em></p>
<p>This option tells InnoDB to only flush log data every two seconds. On development machines you can set this even higher because the only risk is losing transactions during a system crash. If your development machine crashes you probably won&#8217;t care about lost transactions. Experiment!</p>
<p><em>innodb_flush_method	= O_DIRECT</em></p>
<p>This options tells InnoDB to skip filesystem cache and write straight to disk since InnoDB already has it&#8217;s own cache &#8211; the buffer pool. You save yourself some RAM.</p>
<p><em>table_cache  = 1024</em></p>
<p>Caches open tables. Might not be very useful on a single dev box but useful in general on any database server.</p>
<p><em>myisam_use_mmap = 1</em></p>
<p><a href="http://www.mysqlperformanceblog.com/2006/05/26/myisam-mmap-feature-51/">Mmap is a new MyISAM feature</a> available with MySQL 5.1. Should improve MyISAM write/read performance ~6%.</p>
<p>To sum up all the settings on a 4GB work environment:</p>
<blockquote style="background: #444; color: #fff; padding-left: 2px;"><p>
<em>transaction-isolation = READ-COMMITTED</em><br />
<em>key_buffer = 512M</em><br />
<em>query_cache_size  = 256M</em><br />
<em>innodb_buffer_pool_size = 1024M</em><br />
<em>innodb_additional_mem_pool_size = 32M</em><br />
<em>innodb_log_buffer_size = 4M</em><br />
<em>innodb_log_file_size = 128M</em><br />
<em>innodb_flush_log_at_trx_commit	= 2</em><br />
<em>innodb_flush_method	= O_DIRECT</em><br />
<em>table_cache  = 1024</em><br />
<em>myisam_use_mmap = 1</em>
</p></blockquote>
<h2>Buy an SSD disk</h2>
<p>This is by far the best upgrade you can do. <strong>SSD</strong> does not have any moving mechanical parts therefore doing a random read or write is as fast as doing a sequential read or write. My work laptop <strong>Lenovo T400</strong> can push 3.5 MB with <strong>random writes</strong>, 35 MB with <strong>sequential writes</strong>, 2.6MB with <strong>random reads</strong> and 38MB with <strong>sequential reads</strong> per second. The same test with an SSD disk can push 220MB <strong>random writes</strong> and 330MB <strong>random reads</strong> with similar numbers for sequential reads and writes. So for IO access you can expect 10 &#8211; 100 times performance difference.</p>
<h2>Summary</h2>
<p>It&#8217;s easy to squeeze some extra performance out of your development environment by sacrificing data safety. In my case these changes made our database integration test suites run a lot quicker. So far I haven&#8217;t experienced any downsides from the above settings though you have to accept that one day it most likely will. Most of the database settings I&#8217;ve mentioned are those considered most when tuning production database servers. My final advice is take everything you read here with a pinch of salt as I am by far not an expert in these matters and everything listed here is gathered from various resources online.</p>
<h2>Resources</h2>
<p><a href="http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/">InnoDB performance optimization basics</a><br />
<a href="http://www.mysqlperformanceblog.com/2006/09/29/what-to-tune-in-mysql-server-after-installation/">Tunning MySQL server after installation</a><br />
<a href="http://www.mysqlperformanceblog.com/2006/05/26/myisam-mmap-feature-51/">MyISAM MMAP feature</a><br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/set-transaction.html">MySQL transaction isolation levels</a><br />
<a href="http://www.mysqlperformanceblog.com/2010/02/28/why-you-should-ignore-mysqls-key-cache-hit-ratio/">Why you should ignore key cache hit ratio</a><br />
<a href="http://pclinuxos2007.blogspot.com/2009/06/tweaks-to-boot-ext4-filesystem.html">Tweaks to boost EXT4 performance</a><br />
|<a href="http://www.tomshardware.com/reviews/samsung-470-sandforce-best-ssd,2783-14.html">SSD Benchmarks</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedeveloperday.com/optimizing-mysql-on-ubuntu-10-10-maverick/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>CQRS Resources</title>
		<link>http://www.thedeveloperday.com/cqrs-resources/</link>
		<comments>http://www.thedeveloperday.com/cqrs-resources/#comments</comments>
		<pubDate>Wed, 21 Jul 2010 21:36:50 +0000</pubDate>
		<dc:creator>Žilvinas Šaltys</dc:creator>
				<category><![CDATA[DDD]]></category>
		<category><![CDATA[Domain Model]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[cqrs]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[resources]]></category>

		<guid isPermaLink="false">http://www.thedeveloperday.com/?p=648</guid>
		<description><![CDATA[In the past I wrote about what CQRS is and now I am adding a list of available CQRS resources known to me. If you come by any other CQRS resources online please post a comment with your link. Thank you. Video Presentations / Interviews Greg Young on Unshackle Your Domain Udi Dahan on CQRS, [...]]]></description>
			<content:encoded><![CDATA[<p>In the past I wrote about <a href="http://www.thedeveloperday.com/what-is-cqrs/">what CQRS is</a> and now I am adding a list of available CQRS resources known to me. If you come by any other CQRS resources online please post a comment with your link. Thank you.</p>
<h2>Video Presentations / Interviews</h2>
<p><a href="http://www.infoq.com/presentations/greg-young-unshackle-qcon08">Greg Young on Unshackle Your Domain</a><br />
<a href="http://www.infoq.com/interviews/dahan-cqrs-ddd-nservicebus">Udi Dahan on CQRS, DDD, NServiceBus</a><br />
<a href="http://skillsmatter.com/podcast/design-architecture/architectural-innovation-cqrs">Udi Dahan on CQRS and Domain Models</a><br />
<a href="http://skillsmatter.com/podcast/design-architecture/architectural-innovation-eventing-event-sourcing">Greg Young on Architectural Innovation, Eventing and Event Sourcing</a><br />
<a href="http://skillsmatter.com/podcast/agile-testing/greg-young-cqrs-event-sourcing-the-business-perspective">Greg Young on CQRS and Event Sourcing: The Business Perspective</a><br />
<a href="http://skillsmatter.com/podcast/open-source-dot-net/udi-dahan-command-query-responsibility-segregation/rl-311">Udi Dahan on CQRS</a><br />
<a href="http://skillsmatter.com/podcast/design-architecture/udi-dahan-cqrs-race-conditions-and-sagas">Udi Dahan on CQRS, Race Conditions, Sagas</a><br />
<a href="http://skillsmatter.com/podcast/design-architecture/qa">Udi Dahan on CQRS, Event Sourcing</a><br />
<a href="http://www.youtube.com/watch?v=KXqrBySgX-s&#038;feature=youtu.be">CQRS/DDD by Greg Young at Professional.NET 2011 in Vienna</a><br />
<a href="http://www.youtube.com/watch?v=CnvO_nlvrps&#038;feature=youtu.be">Practical CQRS by Rinat Abdullin</a></p>
<h2>Articles / Blogs / Blog Posts</h2>
<p><a href="http://codebetter.com/gregyoung/">Greg Young&#8217;s Blog</a> &#8211; a lot of posts on CQRS and related topics.<br />
<a href="http://thinkbeforecoding.com/">Think Before Coding</a> &#8211; blog posts on CQRS and related topics<br />
<a href="http://www.udidahan.com/2010/05/07/cqrs-isnt-the-answer-its-just-one-of-the-questions/">CQRS isn&#8217;t the answer</a> by Udi Dahan.<br />
<a href="http://www.udidahan.com/2009/12/09/clarified-cqrs/">Clarified CQRS</a> by Udi Dahan<br />
<a href="http://elegantcode.com/2009/11/11/cqrs-la-greg-young/">CQRS a la Greg Young</a> by Mark Nijhof<br />
<a href="http://richarddingwall.name/2010/06/15/brownfield-cqrs-part-1-commands/">Brownfield CQRS</a> by Richard Dingwall.<br />
<a href="http://julienletrouit.com/?p=22">Transitioning from DDD lite</a> by Julien Letrouit<br />
<a href="http://jonathan-oliver.blogspot.com/2009/10/dddd-why-i-love-cqrs.html">Why I Love CQRS</a><br />
<a href="http://abdullin.com/cqrs">CQRS on Cloud</a> by Rinat Abdullin</p>
<h2>Frameworks, Code Examples</h2>
<p><a href="http://github.com/MarkNijhof/Fohjin">C# CQRS Example</a> by Mark Nijhof<br />
<a href="http://agrcqrs.codeplex.com/">C# CQRS Framework</a><br />
<a href="http://code.google.com/p/axonframework/">JAVA Axon Framework</a><br />
<a href="http://code.google.com/p/lokad-cqrs/">Lokad CQRS Framework</a><br />
<a href="http://ncqrs.org/">NCQRS Framework</a><br />
<a href="http://thecqrskitchen.codeplex.com/">Kitchen Example</a></p>
<h2>Other</h2>
<p><a href="http://groups.google.com/group/dddcqrs">CQRS mailing list</a><br />
<a href="http://tech.groups.yahoo.com/group/domaindrivendesign/">DDD Mailing List</a> &#8211; Usually lot&#8217;s of conversations on CQRS</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedeveloperday.com/cqrs-resources/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>What is CQRS?</title>
		<link>http://www.thedeveloperday.com/what-is-cqrs/</link>
		<comments>http://www.thedeveloperday.com/what-is-cqrs/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 23:50:06 +0000</pubDate>
		<dc:creator>Žilvinas Šaltys</dc:creator>
				<category><![CDATA[DDD]]></category>
		<category><![CDATA[Patterns]]></category>
		<category><![CDATA[cqrs]]></category>
		<category><![CDATA[Domain Model]]></category>
		<category><![CDATA[models]]></category>

		<guid isPermaLink="false">http://www.thedeveloperday.com/?p=649</guid>
		<description><![CDATA[CQRS is a software architecture pattern which stands for Command Query Responsibility Segregation. The author of the pattern name CQRS is Greg Young who first described it in his blog: I am going to throw out a quick pattern name for this and call it Command and Query Responsibility Segregation or CQRS as we are [...]]]></description>
			<content:encoded><![CDATA[<p><strong>CQRS</strong> is a software architecture pattern which stands for <strong>Command Query Responsibility Segregation</strong>. The author of the pattern name <strong>CQRS</strong> is <a href="http://codebetter.com/blogs/gregyoung/">Greg Young</a> who first <a href="http://codebetter.com/blogs/gregyoung/archive/2009/08/13/command-query-separation.aspx">described it in his blog</a>:</p>
<blockquote style="background: #444; color: #fff; padding-left: 2px;"><p>I<em> am going to throw out a quick pattern name for this and call it <strong>Command and Query Responsibility Segregation</strong> or <strong>CQRS</strong> as we are in fact simply taking what would usually be one object and splitting its responsibilities into two objects.</em></p></blockquote>
<p>At the time of writing <strong>CQRS</strong> does not have an official definition. It&#8217;s difficult to define <strong>CQRS</strong> with a definition that would be both simple and useful. To describe <strong>CQRS</strong> at an object level I&#8217;ve came up with a definition which is just a reworded sentence from <a href="http://codebetter.com/blogs/gregyoung/archive/2010/02/16/cqrs-task-based-uis-event-sourcing-agh.aspx">Greg Young&#8217;s blog post</a>:</p>
<blockquote style="background: #444; color: #fff; padding-left: 2px;"><p><em><strong>Command Query Responsibility Segregation</strong> or <strong>CQRS</strong> is the creation of two objects where there was previously one. The separation occurs based upon whether the methods are a command or a query.</em></p></blockquote>
<p><strong>CQRS </strong>can also be defined at a higher level. Greg Young was kind to provide a definition:</p>
<blockquote style="background: #444; color: #fff; padding-left: 2px;"><p><strong><em>Command Query Responsibility Segregation</em><span style="font-weight: normal;"> or</span><em> CQRS</em></strong> is the recognition that there are differing architectural properties when looking at the paths for reads and writes of a system. <strong><em>CQRS</em></strong> allows the specialization of the paths to better provide an optimal solution.</p></blockquote>
<p><strong>CQRS</strong> pattern is similar to <a href="http://en.wikipedia.org/wiki/Command-query_separation">CQS by Meyer</a> but is also different. <strong>CQS</strong> separates command methods that change state from query methods that read state. <strong>CQRS</strong> goes further and separates the command methods that change state and query methods that read into two different objects.</p>
<h2>Benefits of CQRS</h2>
<ul>
<li>The most simple benefit of <strong>CQRS</strong> is that it simplifies read and write models by separating them. Write model no longer contains queries and developers can directly focus on domain model behaviours. What otherwise could have been a repository with hundreds of different read methods mixed with different <strong>lazy loading</strong>, <strong>pre-fetch</strong> and <strong>paging strategies</strong> can now be hidden away in a separate read model.</li>
<li>
<div id="_mcePaste">Another reason is <a href="http://sourcemaking.com/refactoring/divergent-change">Divergent Change</a>. Divergent change occurs when one class is commonly changed in different ways for different reasons. You might be modifying queries more often than commands which might not only break your read queries but your commands as well. By having them separated you minimise the risks of both being broken.</div>
</li>
<li>The <strong>single most important benefit</strong> of <strong>CQRS</strong> is that by separating read and write models you can make different choices on different models. For example you may optimize your write model for write performance and your read system for read performance.</li>
<li>Another nice feature of <strong>CQRS</strong> is the available option to easily distribute work across separate teams. For example the read part of a web e-shop application can be outsourced to less expensive developers offshore.</li>
<li><a href="http://codebetter.com/blogs/gregyoung/archive/2010/02/20/why-use-event-sourcing.aspx">Event sourcing</a> is a different pattern which <a href="http://codebetter.com/blogs/gregyoung/archive/2010/02/13/cqrs-and-event-sourcing.aspx">shares a strong symbiotic relation</a> with <strong>CQRS</strong>. Once your system reaches an architectural level where you may need multiple data models it might and probably will introduce <strong>synchronization issues</strong>. It is then impossible to say which model is incorrect. In an <strong>event centric</strong> system where commands are translated into events by the <strong>domain model</strong> these events can be used as the primary data model. This not only solves data synchronization issues, but also significantly improves testing by allowing to test for &#8220;<strong>what didn&#8217;t happen</strong>&#8221; and opens easy doors for integration with other systems since other systems can now listen to the events published by the domain model.</li>
<li><strong>Eventual Consistency</strong>. In very simple terms Eventual Consistency can be defined as simply just caching. In event centric systems it is possible to delay the handling of published domain model events and handle them in a different thread or a process. This will make write and read data models inconsistent but it might significantly improve the performance of your <strong>commands</strong>.</li>
</ul>
<h2>In Conclusion</h2>
<p><strong>CQRS </strong>is a very interesting pattern. By some it may even be considered to be the silver bullet. <strong>It isn&#8217;t</strong>. Like all patterns <strong>CQRS </strong>has <strong>tradeoffs</strong>. It may be difficult to sell <strong>CQRS </strong>to management since it&#8217;s not a well known classic approach to <strong>software architecture</strong>. Less known tools, technologies. As an example in the PHP world there are currently no mature service buses such as <a href="http://nservicebus.com/">NServiceBus</a> in the .NET world. It is almost impossible or more often than not worth the Return of Investment to migrate legacy apps to <strong>CQRS</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedeveloperday.com/what-is-cqrs/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Expert Python Programming Book Review</title>
		<link>http://www.thedeveloperday.com/expert-python-programming-book-review/</link>
		<comments>http://www.thedeveloperday.com/expert-python-programming-book-review/#comments</comments>
		<pubDate>Sat, 26 Jun 2010 18:26:00 +0000</pubDate>
		<dc:creator>Žilvinas Šaltys</dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://www.thedeveloperday.com/?p=670</guid>
		<description><![CDATA[I&#8217;ve finished reading Expert Python Programming written by Tarek Ziade. This book is written for Python developers who wish to go further in mastering Python. Expert Python Programming covers a range of topics such as generators, meta programming, naming standards, packaging, continuous integration, writing documentation, test driven development, optimizations and design patterns. Even non Python [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.thedeveloperday.com/wp-content/uploads/2010/02/python-book.png"><img class="size-full wp-image-554 alignleft" style="margin-right: 20px; margin-bottom: 20px;" title="python-book" src="http://www.thedeveloperday.com/wp-content/uploads/2010/02/python-book.png" alt="Expert Python Programming Book" width="100" height="123" /></a>I&#8217;ve finished reading <a href="http://www.packtpub.com/expert-python-programming/book/mid/030310dzyab8?utm_source=thedeveloperday.com&amp;utm_medium=affiliate&amp;utm_content=blog&amp;utm_campaign=mdb_002637">Expert Python Programming</a> written by <a href="http://tarekziade.wordpress.com/">Tarek Ziade</a>. This book is written for <a href="http://www.python.org">Python</a> developers who wish to go further in mastering Python. Expert Python Programming covers a range of topics such as generators, meta programming, naming standards, packaging, <a href="http://en.wikipedia.org/wiki/Continuous_integration">continuous integration</a>, writing documentation, <a href="http://en.wikipedia.org/wiki/Test-driven_development">test driven development</a>, optimizations and <a href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)">design patterns</a>. Even non Python developers will find this book useful since it covers best practices which are well suited to other programming languages.</p>
<p>There&#8217;s a <a href="https://www.packtpub.com/sites/default/files/sample_chapters/expert-python-programming-sample-chapter-chapter-10-documenting-your-project.pdf">sample chapter available</a> which covers the topic of documentation. We all know how frustrating it is to write documentation. It&#8217;s boring, often it feels pointless and it tends to get out of date. The 7 rules of technical writing presented in the book changed my mind. It&#8217;s actually one of my personal favourite chapters in the book.</p>
<p>The <strong>first chapter</strong> of the book is very friendly and covers installation of many Python flavours, packaging tools such as EasyInstall and setuptools, prompt customization and choices of editors.</p>
<p>While the first chapter is very easy going the second chapters dives deep into syntactic intricacies of Python with it&#8217;s iterators, generators, decorators and context providers. If the <strong>second chapter</strong> won&#8217;t make your head spin then the <strong>third one</strong> on class level Python best practices certainly will. Author of the book does a great job at explaining the pitfalls of multiple inheritance, inconsistent <strong>super</strong> usage, Python&#8217;s method resolution order and finally meta programming which allows to change classes&#8217; and objects&#8217; definitions <em>on the fly</em>.</p>
<p>The rest of the book is a lot less confusing but nonetheless rewarding. <strong>Chapter four</strong> gives some very good advice on naming standards, building API&#8217;s and tools that ease might help along the way. <strong>Chapter five</strong> explains how to create python packages, distribute and deploy them.</p>
<p>What I really like in every book is examples. One example can explain more than a thousand words could. The examples in the second and third chapters are very valuable and help greatly to understand the concepts explained. The book goes even further and provides a complete example of a small application called <em>Atomisator</em>. This example is implemented following the best practices of previous five chapters.</p>
<p>Chapters <strong>eight</strong> and <strong>nine</strong> will be very interesting to team leads which explain distributed version control systems such as Mercurial, continuous integration and managing software in an iterative way.</p>
<p>Another very important topic on <strong>Test Driven Development</strong> or <strong>TDD</strong> is presented in <strong>chapter eleven</strong>. I cannot emphasize enough how valuable test driven development is. Though even today it&#8217;s not a widely adopted practice and not a well understood one either. This book will try to convince you why you should be doing <strong>TDD</strong> and if you&#8217;re already convinced it will present you with tools that you can use to do <strong>TDD</strong>. I was very interested to find out about the available unit testing framework alternatives. Further an interesting idea on <strong>doc testing</strong> is described which while seems a little exotic may be a very efficient way to keep your documentation up to date.</p>
<p>Reading further there&#8217;s a great chapter on optimization which describes general principles of <strong>optimization</strong> and various <strong>profiling techniques</strong>. Measuring performance may prove difficult on different hardware such as local development machines and stage servers. I was very intrigued to find out about <strong>pystones</strong> and the general concept behind it which helps to deal with the problem described.</p>
<p>Together with optimization techniques, various profiler tools which you never knew of, the book describes some generic optimization solutions available. Some are well known such as the <a href="http://en.wikipedia.org/wiki/Big_O_notation">Big-O notation</a>, some are less known such as <a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity">Cyclomatic Complexity</a>. I think this book explains the concepts behind <strong>multi threading</strong>, <strong>multi processing</strong> and caching very well. Making an informed decision whether to use threads or multi processes for your Python application may as well mean if it&#8217;s going to be successful or not.</p>
<p>And finally the last chapter talks of design patterns. While it&#8217;s not the most mind blowing chapter of the book it provides some very interesting details why Python doesn&#8217;t have interfaces or how certain <a href="http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612">GoF</a> patterns can be implemented in a Python specific way.</p>
<h2>Conclusion</h2>
<p>Should you read this book? My answer is yes. Especially if Python earns your bread and butter. Not only you will know the syntactic intricacies of python it will introduce you to many must know concepts of software development. Even if you&#8217;re not a day to day Python developer but you do write an occasional Python script or application by all means read the book and read the first six chapters. I will go even further and recommend this book to non Python developers. Simply because it explains concepts that every developer should understand. And as an extra it is always interesting to learn new ideas and to see how things can be done differently.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedeveloperday.com/expert-python-programming-book-review/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DDD Resources / Papers / Presentations</title>
		<link>http://www.thedeveloperday.com/ddd-resources-papers-presentations/</link>
		<comments>http://www.thedeveloperday.com/ddd-resources-papers-presentations/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 21:53:41 +0000</pubDate>
		<dc:creator>Žilvinas Šaltys</dc:creator>
				<category><![CDATA[DDD]]></category>
		<category><![CDATA[Model]]></category>
		<category><![CDATA[Patterns]]></category>
		<category><![CDATA[Domain Model]]></category>
		<category><![CDATA[presentations]]></category>
		<category><![CDATA[resources]]></category>

		<guid isPermaLink="false">http://www.thedeveloperday.com/?p=630</guid>
		<description><![CDATA[Recently I wrote about what Domain Driven Design is which only scratches the surface of DDD. I&#8217;ve decided to put a list of DDD resources available. If you come by any other DDD resources online please post a comment with your link. Books / Papers Domain-Driven Design: Tackling Complexity in the Heart of Software DDD [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I wrote about <a href="http://www.thedeveloperday.com/what-is-ddd-or-domain-driven-design/">what Domain Driven Design is</a> which only scratches the surface of DDD. I&#8217;ve decided to put a list of DDD resources available. If you come by any other DDD resources online please post a comment with your link.</p>
<h2>Books / Papers</h2>
<ul>
<li><a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215">Domain-Driven Design: Tackling Complexity in the Heart of Software</a></li>
<li><a href="http://domaindrivendesign.org/sites/default/files/discussion/PatternSummariesUnderCreativeCommons.doc">DDD Pattern Summaries (Free)</a></li>
<li><a href="http://www.infoq.com/minibooks/domain-driven-design-quickly">Domain Driven Design Quickly (Free E-book)</a></li>
<li><a href="http://thinkddd.com/assets/2/Domain_Driven_Design_-_Step_by_Step.pdf">Domain Driven Design Step by Step (Free E-book)</a></li>
<li><a href="http://domaindrivendesign.org/library/vernon_2011">Effective Aggregate Design by Vaughn Vernon</a></li>
</ul>
<h2>Presentations / Videos / Interviews</h2>
<ul>
<li><a href="http://www.infoq.com/presentations/RESTful-SOA-DDD">Vaughn Vernon on RESTful SOA or Domain-Driven Design &#8211; A compromise?</a></li>
<li><a href="http://streaming.ndc2010.no/tcs/?id=F552E0B6-C036-4A8D-BEEA-64E4B1B005CE">Greg Young on 5 Reasons Why DDD Projects Fail</a></li>
<li><a href="http://www.infoq.com/interviews/eric-evans-ddd-interview">Eric Evans on the State of DDD</a></li>
<li><a href="http://www.infoq.com/interviews/greg-young-ddd">Greg Young on State Transitions in Domain-Driven Design</a></li>
<li><a href="http://www.infoq.com/interviews/domain-driven-design-eric-evans">Eric Evans on Domain Driven Design</a></li>
<li><a href="http://www.infoq.com/presentations/ddd-eric-evans">Eric Evans on What he&#8217;s learned about DDD since the book</a></li>
<li><a href="http://skillsmatter.com/podcast/design-architecture/keynoteddd-emerging-themes-2010/zx-983">Eric Evans on DDD Emerging Themes</a></li>
<li><a href="http://skillsmatter.com/podcast/design-architecture/folding-together-ddd-agile/zx-983">Eric Evans on Folding together DDD &#038; Agile</a></li>
<li><a href="http://www.infoq.com/presentations/strategic-design-evans">Eric Evans on Strategic Design</a></li>
<li><a href="http://www.infoq.com/presentations/model-to-work-evans">Eric Evans on Putting The Model to Work</a></li>
<li><a href="http://www.infoq.com/presentations/DDD-Entities-Repositories-Jimmy-Nilsson">Jimmy Nilsson on Is Domain-Driven Design More than Entities and Repositories?</a></li>
<li><a href="http://www.infoq.com/presentations/bdd-and-ddd">Dan North on BDD &#038; DDD</a></li>
</ul>
<h2>Websites and Blogs</h2>
<ul>
<li><a href="http://domaindrivendesign.org/">DDD Community</a></li>
<li><a href="http://domaindrivendesign.org/forum">DDD Forum</a></li>
<li><a href="http://tech.groups.yahoo.com/group/domaindrivendesign/">DDD Mailing List</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.thedeveloperday.com/ddd-resources-papers-presentations/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>What is DDD or Domain Driven Design?</title>
		<link>http://www.thedeveloperday.com/what-is-ddd-or-domain-driven-design/</link>
		<comments>http://www.thedeveloperday.com/what-is-ddd-or-domain-driven-design/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 08:27:54 +0000</pubDate>
		<dc:creator>Žilvinas Šaltys</dc:creator>
				<category><![CDATA[Model]]></category>
		<category><![CDATA[Patterns]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[Domain Model]]></category>

		<guid isPermaLink="false">http://www.thedeveloperday.com/?p=623</guid>
		<description><![CDATA[Domain Driven Design can be described as a philosophy based on domain modelling. More accurately it may be be described as a very large body of patterns and pattern language in its own right. The term Domain Driven Design or DDD was coined by Eric Evans the author of the book Domain-Driven Design: Tackling Complexity [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Domain Driven Design</strong> can be described as a philosophy based on domain modelling. More accurately it may be be described as a very large body of patterns and <strong>pattern language</strong> in its own right. The term Domain Driven Design or DDD was coined by Eric Evans the author of the book <a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215">Domain-Driven Design: Tackling Complexity in the Heart of Software</a> also known in the DDD community as the &#8220;blue book&#8221;.</p>
<h2>Understanding the DDD philosophy</h2>
<p>The Domain Driven Design philosophy states:</p>
<ul>
<li>Most software projects should focus on <strong>business domain</strong></li>
<li>Complex domain designs should be based on a model</li>
</ul>
<p>To understand the meaning of these statements one has to understand the meaning of <strong>domain</strong> and <strong>model</strong>.</p>
<p><em><strong>Domain</strong> is a sphere of knowledge, influence or activity. The subject area to which the user applies a program is the domain of the software.</em> In other terms if you work for a bank then banking is your domain.</p>
<p><em><strong>Model</strong> is a system of abstractions that describes selected aspects of a domain and can be used to solve problems related to that domain.</em> For example a map is a model designed to solve a specific problem. A treasure map shows how to find a treasure, a political map shows the borders of countries. A model is a simplification. It is an interpretation of reality that focuses on the problem at hand and ignores the extraneous detail.</p>
<p>Models are designed to be useful to solve domain specific problems. For example in the past the universe was viewed in a geocentric way where the universe revolves around Earth. Heliocentric model is another astronomical model in which the Earth and planets revolve around a stationary Sun at the centre of the universe. Even though geocentric model is not realistic it is a valid model in it&#8217;s own right designed to solve a problem &#8211; the human desire to be in the centre of everything. It&#8217;s not a useful model when it&#8217;s used to compare planet movements.</p>
<p>Domain Driven Design advocates designing software systems to reflect the domain model in a very literal way, so that the mapping is obvious, also <strong>revising the model continuously</strong> and modifying it to be implemented more naturally in software. To tie the implementation to a model well requires tools and languages that support a modelling paradigm, such as object-oriented programming.</p>
<p>A well mapped implementation of a model usually expresses an object model that incorporates both behaviour and data. A decomposed domain model consists of common building blocks: <strong>entities, aggregates, value objects, services and factories.</strong></p>
<h2>Essential Principles of DDD</h2>
<p>The greatest value of a domain model is that it provides a ubiquitous language that ties domain experts and technologists together. <em><strong>Ubiquitous language</strong> is a language structured around the domain model and used by all team members to connect all activities of the team with the software.</em> It&#8217;s a shared, versatile language between team members and domain experts. A well designed model speaks to the developers through the ubiquitous language. It&#8217;s important to understand that a change in the model is a change in the language and vice versa.</p>
<p>When multiple models are in play on a large project it&#8217;s beneficial to define bounded contexts where these models apply. <em>A <strong>bounded context</strong> is a linguistic boundary marking the applicability of distinct models.</em> Usually a subsystem or work owned by another team. For example in a typical e-shop web application a sales reporting application could be defined as a separate bounded context.</p>
<p>Every domain consists of subdomains. For example a very common subdomain is billing. Such a subdomain is usually not the <strong>driving part</strong> of the domain and therefore not as important. It is harsh reality that not all parts of the design are going to be equally refined therefore priorities must be set. DDD suggests distilling the <strong>core domain</strong> by distinguishing it from other generic subdomains and applying the top talent to work on it.</p>
<h2>Conclusion</h2>
<p>DDD helps projects to develop a strong internal language, define clear <strong>context boundaries</strong>, and focus on the <strong>core domain</strong>. Domain Driven Design brings structure and cohesion into domain modelling which are much appreciated features of any software project in existence. The blue book has been released six years ago and since then it influenced many developers. Yet I feel it hasn&#8217;t reached it&#8217;s momentum. One can only hope it will reach widespread adoption.</p>
<p>Update: I&#8217;ve added a list of available <a href="http://www.thedeveloperday.com/ddd-resources-papers-presentations/">DDD resources</a> such as papers and video presentations.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedeveloperday.com/what-is-ddd-or-domain-driven-design/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

