<?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>Conceptric &#187; Software Engineering</title>
	<atom:link href="http://www.conceptric.co.uk/tag/software-engineering/feed" rel="self" type="application/rss+xml" />
	<link>http://www.conceptric.co.uk</link>
	<description>Ideas and Applications</description>
	<lastBuildDate>Thu, 11 Feb 2010 20:51:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Working with Git and Subversion</title>
		<link>http://www.conceptric.co.uk/working-with-git-and-subversion.htm</link>
		<comments>http://www.conceptric.co.uk/working-with-git-and-subversion.htm#comments</comments>
		<pubDate>Wed, 10 Jun 2009 11:58:35 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[processes]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://www.conceptric.co.uk/?p=191</guid>
		<description><![CDATA[I've got a local copy of the Subversion repository under Git, so I thought I should talk about my workflow.]]></description>
			<content:encoded><![CDATA[<p>Last time I <a href="http://www.conceptric.co.uk/importing-a-remote-subversion-repository-with-git.htm">created a local Git repository</a>, in which I could have several <code>svn/</code> prefixed branches and one <code>master</code> which is linked to the remote <code>trunk</code>.</p>
<h3>The Git work environment.</h3>
<p>Working with Git is quite different to using Subversion. The actual contents of the project directory change to reflect the currently active branch: the directory contains a whole repository, not a checked out copy. Don&#8217;t get alarmed when files start disappearing only to reappear again when you switch branch.</p>
<p>I also noticed that I interacted with the version control less frequently when editing, delete, and create files. The interaction is saved until you&#8217;re ready to commit, making the process feel more seamless. I occasionally used to get into trouble by deleting files via the <abbr title="Operating System">OS</abbr>, rather that using the Subversion command.</p>
<p>For the majority of the time, I&#8217;ll use the <a href="http://www.kernel.org/pub/software/scm/git/docs/">Git commands</a>, as I&#8217;m working in a Git repository. The <code>git svn</code> functionality is only needed as a Git interface with Subversion. </p>
<h3>Getting ready to work.</h3>
<p>I like the <code>master</code> branch to always reflects the current <code>trunk</code> until I choose to update it, so all my commits are made from other working branches.</p>
<p>I start by checking out a branch based on <code>master</code> to use as a base from which to work. I&#8217;ve imaginatively called it <code>basework</code> in this example, and as a branch of <code>master</code> it is linked to the same remote branch: <code>trunk</code>.</p>
<p><code class="terminal oddlines">git branch -a</code> </p>
<p>should display all your branches in the repository.</p>
<p><samp class="stdout">jkw@mac> git branch -a<br />
* basework<br />
  master<br />
  svn/trunk<br />
jkw@mac><br />
</samp></p>
<p>I work in increments based on stories, that&#8217;s another post, so I actually create a story branch from <code>basework</code>, that can be merge back into this parent upon completing the story. This helps cope with changes in the remote codebase.</p>
<h3>Creating my working branches.</h3>
<p>It&#8217;s a good idea to check that <code>basework</code> is up to date with the remote Subversion <code>trunk</code> before branching:</p>
<p><code class="terminal oddlines">git svn rebase</code></p>
<p>This will either update the local repository with the remote changes, or tell you that the current branch is already up to date. </p>
<p>I&#8217;m now in a position to create my story branch:</p>
<p><code class="terminal oddlines">git checkout -b inwork</code></p>
<p>The <code>-b</code> option is used to create a new branch and then switch to it. Without this option the same command is used to move between branches. </p>
<p>This same process was used to create <code>basework</code>.</p>
<p>I have my working repository structure, and I&#8217;m currently working on my story branch, see the asterisk.</p>
<p><samp class="stdout">jkw@mac> git branch -a<br />
  basework<br />
* inwork<br />
  master<br />
  svn/trunk<br />
jkw@mac><br />
</samp></p>
<h3>The local commit.</h3>
<p>You can see details of the changes to the local working branch using the <code>git status</code> command:</p>
<p><samp class="stdout">jkw@mac> git status<br />
# On branch inwork<br />
nothing to commit (working directory clean)<br />
james@cybermac1> git st<br />
# On branch inwork<br />
# Changed but not updated:<br />
#   (use &#8220;git add/rm <file>&#8230;&#8221; to update what will be committed)<br />
#   (use &#8220;git checkout &#8212; <file>&#8230;&#8221; to discard changes in working directory)<br />
#<br />
#	modified:   footer.php<br />
#	deleted:    images/feed-icon-64.png<br />
#	modified:   style.css<br />
#<br />
# Untracked files:<br />
#   (use &#8220;git add <file>&#8230;&#8221; to include in what will be committed)<br />
#<br />
#	includes/category-1.inc.php<br />
no changes added to commit (use &#8220;git add&#8221; and/or &#8220;git commit -a&#8221;)<br />
jkw@mac><br />
</samp></p>
<p>To add the new file show in the example to those being tracked:</p>
<p><code class="terminal oddlines">git add includes/category-1.inc.php</code></p>
<p>If I wanted to add all of the untracked files, I could use the <code>-A</code> option instead of individually naming them.</p>
<p>Now all the files are staged, the time comes to commit them to the local Git repository:</p>
<p><code class="terminal oddlines">git commit -a <em>-m "A message to describe the changes."</em></code> </p>
<p>Leaving the <code>-m</code> option off will cause Git to request comments using whichever editor is defined in your configuration files.</p>
<p>I now the story is complete, and all the changes committed to the <code>inwork</code> branch, it&#8217;s time to commit them to Subversion.</p>
<h3>The remote commit.</h3>
<p>I start the remote commit process by switching to the <code>basework</code> branch:</p>
<p><code class="terminal oddlines">git checkout basework</code></p>
<p>Next I check that the remote codebase hasn&#8217;t changed, or update the changes:</p>
<p><code class="terminal oddlines">git svn rebase</code></p>
<p>I&#8217;ll merge <code>inwork</code> into <code>basework</code>:</p>
<p><code class="terminal oddlines">git merge inwork</code></p>
<p>I use my text editor to manually fix conflicts that arise. Git tells you where to find them by marking up the code. This is followed by another local commit, at which point the merge is complete.</p>
<p>Now I can try a dry run of the remote commit:</p>
<p><code class="terminal oddlines">git svn dcommit -n</code> </p>
<p>It&#8217;s the <code>-n</code> option that makes this a dry run: nothing has been committed yet. It shows you the local versions to be bulk committed if you choose to go ahead. To actually perform the commit, remove the <code>-n</code>, and re-run the command, it may take a while if you&#8217;ve been busy.</p>
<h3>Verifying the remote commit.</h3>
<p>This is where leaving the <code>master</code> branch untouched pays off. <code>basework</code> has been committed to the remote <code>trunk</code>, whilst <code>master</code> still reflects the pre-commit <code>trunk</code>. </p>
<p>I switch to <code>master</code>, which should contain none of my new work, and update it from the remote <code>trunk</code>:</p>
<p><code class="terminal oddlines">git svn rebase</code> </p>
<p>It should have changed to match <code>basework</code>, and if so the previous commit worked.</p>
<h3>Cleaning up.</h3>
<p>I&#8217;ve verified the commit: I have <code>master</code> and <code>basework</code> branches that are identical, so <code>inwork</code> is no longer needed, I&#8217;ll delete it:</p>
<p><code class="terminal oddlines">git branch -d inwork</code> </p>
<p>Deleting a child branch of a different parent is a little dangerous, so if you&#8217;re not in <code>basework</code> you&#8217;ll get a warning. Either switch to <code>basework</code> and try again, or re-running the command with the <code>-D</code> option.</p>
<p>If I&#8217;ve finished work on this project, I&#8217;d delete the <code>basework</code> branch too, but if I&#8217;m going to continue, I&#8217;d use it to create another working branch, and I&#8217;ve gone full circle.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/working-with-git-and-subversion.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>When frameworks are too friendly</title>
		<link>http://www.conceptric.co.uk/when-frameworks-are-too-friendly.htm</link>
		<comments>http://www.conceptric.co.uk/when-frameworks-are-too-friendly.htm#comments</comments>
		<pubDate>Thu, 29 Jan 2009 16:50:43 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Everything]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[content management system]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[skills]]></category>

		<guid isPermaLink="false">http://www.conceptric.co.uk/?p=141</guid>
		<description><![CDATA[High quality Content Management Systems and development frameworks are everywhere, but are they all trying to be too friendly and flexible?
]]></description>
			<content:encoded><![CDATA[<p><a href="http://drupal.org/project/Modules">Drupal modules</a> and <a href="http://wordpress.org/extend/plugins/">WordPress plugins</a> offer a huge range of functionality that&#8217;s easily integrated. <a href="http://codeigniter.com/">CodeIgniter</a> provides a clear program structure with plenty of utility functions within easy reach. </p>
<h3>Positive experiences.</h3>
<p>The most frequently touted benefit frameworks have to offer is minimising the time taken to code and deploy a software solution. Given my interest in Agility, this is an attraction, reducing the time to market.</p>
<p>Another solid development practice is code reuse in the form of software components, and frameworks have a place amongst them. This approach offers the reliability and security inherent in widely used and tested code. Remember to choose popular software though, or this benefit disappears.</p>
<h3>On the downside.</h3>
<p>Applications developed using frameworks have to carry significant excess baggage in the form of unused features. This raises two main issues: your codebase will be unnecessarily large, and underused blocks of code are a breeding ground for hidden exploits and errors.</p>
<p>Frameworks are designed to function in a specific way, some with more flexibility than others. This much you&#8217;d expect, after all it&#8217;s the essence of a framework, but what if it doesn&#8217;t provide everything you need? For example, I&#8217;ve spent hours trying to integrate <a href="http://www.simpletest.org/">SimpleTest</a>, a <a href="http://en.wikipedia.org/wiki/Unit_testing">unit testing</a> suite, to produce satisfactory results with CodeIgniter. My unit tests run well for my own libraries, but I&#8217;m still unhappy with the test coverage imposed by CodeIgniter&#8217;s <abbr title="Model-View-Controller">MVC</abbr> implementation.</p>
<p>Finally, they say practice makes perfect, but does reliance on any framework reduce developer skill? This isn&#8217;t a problem if everything is pre-packaged in your chosen tool, but what if a client wants something that isn&#8217;t included?</p>
<h3>Too good to ignore.</h3>
<p>That said, I&#8217;ve found all of these software very useful and there are far too many advantages to ignore them. But I often find myself fighting these same tools, frustrated at they&#8217;re eagerness to help me do something in a way I don&#8217;t want it done. I guess the key is to understand which is the right tool for the current job: the ultimate skill for a developer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/when-frameworks-are-too-friendly.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why I like to be Agile</title>
		<link>http://www.conceptric.co.uk/why-i-like-to-be-agile.htm</link>
		<comments>http://www.conceptric.co.uk/why-i-like-to-be-agile.htm#comments</comments>
		<pubDate>Fri, 07 Nov 2008 20:25:11 +0000</pubDate>
		<dc:creator>James Whinfrey</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Computing]]></category>
		<category><![CDATA[Posts]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[projects]]></category>

		<guid isPermaLink="false">http://www.conceptric.co.uk/?p=109</guid>
		<description><![CDATA[I've practised traditional project management techniques in Heavy Engineering, studied their use in Software Engineering, and found problems throughout. Why am I so interested in Agile techniques?]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s face the reality that no matter how clear the project goals seemed at inception, they rarely look the same by the end. I&#8217;ve worked on projects where the whole scope of the project changed between the initial planning phase and the start of the technical work. What&#8217;s more the timescale tends to shift on a daily basis and your management keep &#8216;borrowing&#8217; your resources for other vital work. This is the primary reason why I now prefer a more responsive approach; essential in a unstable world! </p>
<p>The Agile approach is more adaptable with respect to three key project variables; only the last of which, in my experience, is considered flexible in the waterfall world of engineering.</p>
<ul>
<li>Scope.</li>
<li>Time.</li>
<li>Resources.</li>
</ul>
<h3>Scope contraction.</h3>
<p>Scope flexibility is something of a taboo subject. Scope is something that is added to in both a controlled manner &#8212; providing additional revenue &#8212; or uncontrolled creep. But the point of any project is delivering something that achieves the customers business goals. This is not necessarily the product that they, or the development team, initially envisaged. </p>
<p>One uncomfortably overspent project lead to the realisation that I could have achieved the business objective well under budget by actually drastically reducing the scope. It wouldn&#8217;t have delivered exactly what the customer expected, but it would easily have achieved their goal. </p>
<p>Which is more important, expectation or results? If you have a customer representative on the team it&#8217;s much easier to explain your rationale, and the chances are they&#8217;ll like the idea of results with less work as much as you do.</p>
<h3>Timescales.</h3>
<p>If you have a customer that doesn&#8217;t mind when you deliver, you&#8217;re a rare and lucky project manager, though you&#8217;ll never actually finish anything; deadlines do provide focus. So set plenty of deadlines, that&#8217;s what iterations and releases are about. </p>
<p>Try to answer the most pressing question as quickly as possible. Leave refinements and those ever present scope changes to the next iteration, it&#8217;s probably only a few days away. </p>
<p>This rapid cycle provides useful results, whilst allowing the flexibility to quickly change direction without that wasteful churn: just tidy this up a bit then I&#8217;ll be with you.</p>
<h3>And the resources?</h3>
<p>I&#8217;m afraid the project manager has to earn their money too. Line management will always have the urge to reassign any of your key people they feel aren&#8217;t being fully employed. It&#8217;s important to emphasise that the productivity of any team depends on preventing this happening.</p>
<p>Agile teams don&#8217;t strictly segregate workload on the basis of job descriptions, that&#8217;s why you need versatile individuals. Unfortunately, these are exactly the type of individuals that those managers will want to steal away. Removing the demarcation of tasks will help ensure everyone is kept busy and that work is conducted using the minimum number of people.</p>
<h3>Better than the Waterfall.</h3>
<p>I&#8217;ve found actual project goals shift too frequently for effective use of the Waterfall approach to project management. Using iterations within this framework always felt unnatural; how do you decide how may there will be and when will you actually deliver something?</p>
<p>An Agile approach perversely leaves me feeling more in control by worrying less about control. There are a huge array of Agile software development techniques, many of which can be adapted to other engineering disciplines. </p>
<p>For Software Engineering, I would recommend reading <a href="http://www.amazon.co.uk/Art-Agile-Development-James-Shore/dp/0596527675/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1226088721&#038;sr=8-1"><cite>The Art of Agile Development</cite></a>. The <a href="http://www.agilealliance.org/home">Agile Alliance</a> promote the use of Agile techniques, so take a look at the <a href="http://www.agilemanifesto.org/"><cite>Manifesto for Agile Software Development</cite></a> upon which it&#8217;s all based.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.conceptric.co.uk/why-i-like-to-be-agile.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
