<?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>Daniel Ford</title>
	<atom:link href="http://www.forddaniel.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.forddaniel.com</link>
	<description>Random Blather</description>
	<lastBuildDate>Fri, 16 Jul 2010 20:58:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>A testing strategy for multiple inheritance in EMF generated code.</title>
		<link>http://www.forddaniel.com/2010/07/a-testing-strategy-for-multiple-inheritance-in-emf-generated-code/</link>
		<comments>http://www.forddaniel.com/2010/07/a-testing-strategy-for-multiple-inheritance-in-emf-generated-code/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 20:55:42 +0000</pubDate>
		<dc:creator>Daniel Ford</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.forddaniel.com/?p=61</guid>
		<description><![CDATA[I recently became a comittter on the Open Health Tools Model-Driven Health Tools project (MDHT) https://mdht.projects.openhealthtools.org/ The project is leveraging the Eclipse Modeling Project, specifically, UML2 and EMF, to produce implementations of the HL7 standard. My first contribution to the project is an extensive set of JUnit 4 test cases that exercise OCL constraints specified [...]]]></description>
			<content:encoded><![CDATA[<p>I recently became a comittter on the Open Health Tools Model-Driven Health Tools project (MDHT) https://mdht.projects.openhealthtools.org/ The project is leveraging the Eclipse Modeling Project, specifically, UML2 and EMF, to produce implementations of the HL7 standard.</p>
<p>My first contribution to the project is an extensive set of JUnit 4 test cases that exercise OCL constraints specified for objects in the  model.  Most of the tests are fairly simple, basically setting up configurations where validation is expected to fail or it is expected to pass, and verifying the expected outcome.  To my great satisfaction I was able to catch dozens of real errors, mostly things like typos in the OCL, but also errors in which OCL statements were improperly processed during code generation and ended up mangled in the result (a surprise).  The tests even tripped across errors in OCL processing  itself when particular invalid objects were erroneously validated as correct (another surprise).</p>
<p>The real story, however, was the design challenge needed to create the tests.  We don&#8217;t usually think of test cases as being particularly hard to create, and they usually aren&#8217;t, but in this case I had a particular problem.  It turns out that the HL7 standard has a few interesting attributes, one of which is that it is possible to define new types of &#8220;documents&#8221; by referencing an arbitrary collection of parent &#8220;templates.&#8221;  The practical result of this is unconstrained multiple inheritance.  This is something that the EMF can handle, but it makes testing a potential nightmare.</p>
<p>The main problem is that the classes to be tested could and did have somewhat arbitrary collections of things to be validated, but because Java doesn&#8217;t support multiple inheritance, it isn&#8217;t possible to simply mimic the EMF supported multiple inheritance hierarchy to create the matching collection of tests.  To complicate things, many of the tests are very similar, often only varying on just the particular field participating in validation and the exact OCL expression.  These two attributes combined to create the potential for massive redundancy in the test cases.</p>
<p>What to do?</p>
<p>The strategy came up with was to create a collection of independent test case &#8220;templates&#8221; that could be customized using EMF reflection to test the exact combination of field and validation.  These templates were implemented as abstract (static inner) classes.  Anonymous instances of these template test case classes were then created as appropriate to put the right set of tests together to match what was inherited in the EMF generated code of the class under test.  These anonymous instances were initialized with details like the name of a feature to customize the template.  The collection of anonymous test case definitions were then grouped together for a particular class being tested by defining them in a static initializer of an array defined in the JUnit 4 test case.  That class then only had one &#8220;test&#8221; which had the simple job of running through the collection of anonymous test templates, triggering each one along the way to do its thing.</p>
<p>The end result worked nicely, arbitrary tests could be combined to adapt to the whims of document design allowed by the HL7 standard, and they could be specified in a simple and consistent pattern.  A potential explosion in test redundancy was avoided by using the Template design pattern and exploiting the capabilities of the Eclipse Modeling Framework to do reflective accesses.  The only downside of this approach seems to be that the count of tests performed by JUnit seriously under reports the actual number of tests performed as each JUnit test can actually trigger the execution of dozens of test templates.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.forddaniel.com/2010/07/a-testing-strategy-for-multiple-inheritance-in-emf-generated-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Book Review: &#8220;OSGi and Equinox Creating Highly Modular Java Systems&#8221;</title>
		<link>http://www.forddaniel.com/2010/06/book-review-osgi-and-equinox-creating-highly-modular-java-systems/</link>
		<comments>http://www.forddaniel.com/2010/06/book-review-osgi-and-equinox-creating-highly-modular-java-systems/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 19:00:41 +0000</pubDate>
		<dc:creator>Daniel Ford</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Book Review]]></category>
		<category><![CDATA[Equinox]]></category>
		<category><![CDATA[OSGi]]></category>

		<guid isPermaLink="false">http://www.forddaniel.com/?p=54</guid>
		<description><![CDATA[OSGi and Equinox Creating Highly Modular Java Systems Jeff McAffer, Paul VanderLei, Simon Archer Addison Wesley, 2010 Summary: This is a well executed and detailed explanation of how to develop modular Java systems and applications using OSGi and Equinox.  It uses the development of an easy to follow example application, called Toast, as the vehicle [...]]]></description>
			<content:encoded><![CDATA[<p>OSGi and Equinox Creating Highly Modular Java Systems<br />
Jeff McAffer, Paul VanderLei, Simon Archer<br />
Addison Wesley, 2010</p>
<p>Summary: This is a well executed and detailed explanation of how to develop modular Java systems and applications using OSGi and Equinox.  It uses the development of an easy to follow example application, called Toast, as the vehicle to explain OSGi theory and practice using Equninox.  One of the main themes of the book is the whys and hows of OSGi Declarative Services.  In general, it is a good book for OSGi beginners, but familiarity with Eclipse is a perquisite.  Advanced developers will find it to be a good resource and example of OSGi best practices.</p>
<p>I read the book in two passes, the first while I was on an extended business trip this Spring where it became my &#8220;on the road&#8221; late night reading.  The second pass was at my desk with my laptop and the book propped up on a book stand while I did the examples.  I like to read technical books this way as the first pass allows me to concentrate on understanding the material without being bogged down by the examples. It also gives me an overall view of the material that is quite useful when I do starting focusing on the example code.  The second pass is deliberately set at a slow pace so that I can type in the examples myself and linger over how they work, your mileage my vary.</p>
<p>I found that this book lent itself quite nicely to that style.  The writing was clear and well edited; you could tell that it had been through many revisions to get it to its current polished state.  The step-by-step instructions for the examples was at the right level for me, with enough detail to get things to work without being overly long. For instance, I find that I quickly get the concept of the example, but then I like to be given the details of what to name things and exactly what else to do, so that I can concentrate on the example and keep things moving along.</p>
<p>Another bonus that comes with the book is an Eclipse plug-in that can be installed from the web which includes the source code of all of the examples organized by chapter.  It manifests itself as a special view in Eclipse that lists all of the example code.  One can use this view to populate the workspace with the example code from any chapter, or, to compare the current workspace contents to the book&#8217;s example.  I found this last feature to be a great help as there were several times where things were not working and I was stuck for a solution.  By simply comparing my manually entered version of the example code with the chapter&#8217;s reference version, I quickly found the small differences that were causing problems and was quickly on my way.  This ability is the next best thing to having the authors look over your shoulder and tell you what you did wrong.</p>
<p>I did run into a few issues with the book.  There were several times where the steps provided to produce the example code were not complete.  These were minor things like a missing dependency specification or in one case a default value produced by a wizard that needed to be explicitly set to something else.  Mostly, these were no problem to correct.</p>
<p>I have a few suggestions for a second edition.  It would be nice to have a better explanation or &#8220;tour&#8221; of the Equinox bundles and their contents; the book currently glosses over their organization.  Another addition would be some positioning or contrast between Equinox and other OSGi implementations.  This wouldn&#8217;t need to be long or extremely detailed, but it would be nice to know a bit more about the trade-offs between various implementations and why Equinox is such a good choice.</p>
<p>Basically, I wasn&#8217;t disappointed, this is a good book that delivers on what it promises.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.forddaniel.com/2010/06/book-review-osgi-and-equinox-creating-highly-modular-java-systems/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Shrimp Git.</title>
		<link>http://www.forddaniel.com/2010/06/shrimp-git/</link>
		<comments>http://www.forddaniel.com/2010/06/shrimp-git/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 20:43:10 +0000</pubDate>
		<dc:creator>Daniel Ford</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Git]]></category>

		<guid isPermaLink="false">http://www.forddaniel.com/?p=41</guid>
		<description><![CDATA[One of the occupational hazards of being a programmer is the constant need to learn new things or else risk falling hopelessly behind, or so it would seem.  One of the more annoying aspects of this process is that it always seems like the new &#8220;new thing&#8221; you&#8217;ve got to learn has been around for [...]]]></description>
			<content:encoded><![CDATA[<p>One of the occupational hazards of being a programmer is the constant need to learn new things or else risk falling hopelessly behind, or so it would seem.  One of the more annoying aspects of this process is that it always seems like the new &#8220;new thing&#8221; you&#8217;ve got to learn has been around for quite a while, and that everybody else is already an expert.  It&#8217;s the feeling that you&#8217;ve stumbled across a really great party, but that you&#8217;re arriving a bit late and now you have to park way down the street, and then when you finally do get in the door you discover that all the shrimp dip is gone.  I&#8217;ve decided that this is normal.  One has only so many hours in the day to learn stuff, we can&#8217;t possibly keep up with absolutely everything; the infinite supply of shrimp dip will always elude us.</p>
<p>But we can try.</p>
<p>The current focus of my self-education efforts is <a title="Git" href="http://git-scm.com/">Git</a> and I think I&#8217;m making some progress.  Or, at least, I&#8217;m at the point of understanding enough things that I can reflect back on my ignorance and look at the path I took to my current state.  Of course, I&#8217;m absolutely certain someone will read this posting and confirm that I&#8217;m deluding myself. Anyway, I&#8217;ve always been fascinated by the &#8220;Ah. Ha!&#8221; moment, which is the point where something just clicks and I suddenly just &#8220;get it,&#8221; whatever it is that &#8220;it&#8221; is.  I always wonder why someone didn&#8217;t just tell me the &#8220;Ah ha!&#8221;  stuff first.  I certainly got that feeling learning Git.  I&#8217;ll try to explain my version of the &#8220;Ah ha!&#8221; stuff below, maybe it will work for you.</p>
<p>Most explanations of Git that I&#8217;ve encountered begin with some true, but not very enlightening statements.</p>
<ul>
<li>&#8220;It&#8217;s distributed.&#8221;</li>
</ul>
<ul>
<li>&#8220;Everyone has their own copy of the repository.&#8221;</li>
</ul>
<ul>
<li>&#8220;It&#8217;s a graph.&#8221;</li>
</ul>
<ul>
<li>&#8220;It is easy to branch, people do it all the time.&#8221;</li>
</ul>
<p>These initial descriptions of Git are well meaning and actually do accurately summarize many of its main characteristics, but they seem to lead away from giving the student the &#8220;Ah. Ha!&#8221; moment they need, or at least they did for me.</p>
<p>To someone only familiar with CVS and Subversion, which is probably the case for most people trying to learn Git, these initial descriptions seem like rather undesirable characteristics for a revision control system, they may even sound like a recipe for complete chaos.  They certainly raised a bunch of immediate questions in my mind.  For instance, wouldn&#8217;t it be hard to coordinate and manage the different distributed instances?  Also, how could everyone have their own copy and why would that be a good idea, how would you synchronize all the different copies?  And, what about back-up?  What happens if you lose one of distributed copies of the  repository, wouldn&#8217;t you lose part of your code base?  And, finally, what&#8217;s with the branching thing anyway, that just sounds like an extra complication?</p>
<p>To figure this out I read <a title="&quot;Pro Git&quot;" href="http://progit.org/book/">&#8220;Pro Git,&#8221; </a>by Scott Chacon, which I thought was pretty good, and other material I could find online.  The moment things became clear, though, was when I realized the significance of the role played by the <a title="SHA-1" href="http://en.wikipedia.org/wiki/SHA-1">SHA-1</a> cryptographic check sum that Git computes for each set of changes committed to a copy of the repository.</p>
<p>So, here&#8217;s where I had my &#8220;Ah. Ha!&#8221; moment.  Centralized repository systems like CVS and Subversion produce change set identifiers, version or revision numbers, that are relative to, and only valid within the context of, a single centralized repository instance.  And, the relationships between change sets are implicitly expressed by the value of the identifier (i.e., revision 999 comes &#8220;after&#8221; revision 998).  Here it is:  <strong>In Git, the use of the SHA-1  cryptographic check sum allows these two characteristics to be different. </strong><strong>The check sum plays the role of an absolute, not relative, identifier.  In essence, it is the absolute address of a change set in the virtual address space of change sets, as defined by the SHA-1 computation.</strong></p>
<p>Git it?!</p>
<p><strong>Ah!:</strong> The use of the SHA-1 cryptographic check sum allows Git to produce<br />
unique revision numbers without the need to consult an external<br />
(centralized) authority.  This means that there is no need to be<br />
in communication with anything to commit.  The computation of the<br />
check sum can be performed independently, offline, but because all<br />
implementations of Git perform exactly the same computation, this<br />
is not a problem.  Independently committed change sets can come<br />
together at any time in the future with no clashes.</p>
<p><strong>Ha!:</strong> Git explicitly links change sets by storing the check sum of the<br />
previous change set (i.e., the &#8220;parent&#8221; or &#8220;parents&#8221;) in the current change<br />
set, and using this value in the computation of the current check<br />
sum.  This produces a unique, explicit, chain of linked change sets that can<br />
be followed back to the original state of the system.  This means<br />
that arbitrary sequences of change sets, created by many<br />
independent programmers, can be committed to their own instances<br />
of a Git repository and then later, if desired, shared and<br />
integrated with other related Git repositories by finding common<br />
ancestors.</p>
<p>Now we&#8217;re talking &#8220;Shrimp dip.&#8221;</p>
<p>With an understanding of these two points, the idea that Git is &#8220;distributed&#8221; starts to make some sense.  There could be two instances of a Git repository on two different computers, and two different programmers could commit to their respective different repository instances without consulting each other.  Later, the change sets from the different commits could be exchanged between the two repository instances and would be available to both programmers and could be merged as appropriate, or not.  And, of course, there&#8217;s nothing special about having just two instances, there could be an arbitrary number of instances &#8220;distributed&#8221; across many different computers.  I must say that this isn&#8217;t what I thought when I first read &#8220;distributed,&#8221; instead, I envisioned a repository that stored different portions of its contents in a, mostly, non-redundant manner on many different machines.  Now, I understand it means that it stores mostly redundant copies of its contents on different machines, with the differences being propagated, occasionally, as necessary.</p>
<p>The idea that everyone would have their own copy of the repository also doesn&#8217;t seem so strange, it is  completely obvious, of course they would, how else would it work?  However, I have to admit that it took me a moment to realize that this flexibility doesn&#8217;t imply that all of the Git repository instances are equally &#8220;valid&#8221; with respect to creating the contents of an eventual system release.  There is still the need for a single Git repository instance to serve as a curated, backed up, collection point for contributions from copies (&#8220;clones&#8221; in Git-speak).</p>
<p>Finally, the ideas that Git repositories form a graph and that branching is easy and happens all the time,  become obvious.  The change sets form the nodes of a graph which are linked together using the check sums as pointers.  Branching is simply a function of how the different commits point to common ancestors.</p>
<p>Now, it&#8217;s time for some more dip.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.forddaniel.com/2010/06/shrimp-git/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Git on Windows</title>
		<link>http://www.forddaniel.com/2010/05/git-on-windows/</link>
		<comments>http://www.forddaniel.com/2010/05/git-on-windows/#comments</comments>
		<pubDate>Tue, 25 May 2010 14:02:45 +0000</pubDate>
		<dc:creator>Daniel Ford</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Git]]></category>

		<guid isPermaLink="false">http://www.forddaniel.com/?p=34</guid>
		<description><![CDATA[I decided I need to come up to speed on Git and began the process of creating a Git repository on a windows server. It seemed like it should be pretty &#8220;easy&#8221; and I didn&#8217;t have any real problems finding a windows version of Git http://code.google.com/p/msysgit/ nor finding an ssh server http://mobassh.mobatek.net/en/ for Windows. Everything [...]]]></description>
			<content:encoded><![CDATA[<p>I decided I need to come up to speed on Git and began the process of creating a Git repository on a windows server.  It seemed like it should be pretty &#8220;easy&#8221; and I didn&#8217;t have any real problems finding a windows version of Git <a href="http://code.google.com/p/msysgit/">http://code.google.com/p/msysgit/</a> nor finding an ssh server <a href="http://mobassh.mobatek.net/en/">http://mobassh.mobatek.net/en/</a> for Windows.  Everything installed nicely, and when I tried to clone my first repository from the server to my laptop, I was prompted for my password on the server and successfully authenticated, but instead of things just working, I got a strange error about being unable to find &#8220;<code>git-upload-pack</code>&#8220;.</p>
<p>I figured out that the problem was that the <code>PATH</code> wasn&#8217;t being set correctly when the Git Gui client was attempting to connect.  That seemed simple enough to remedy so I fired up putty on my laptop, connected into the server and did an &#8220;<code>echo $PATH</code>&#8221; to see what the path looked like.  Sure enough, it was missing the &#8220;<code>Git/bin</code>&#8221; and &#8221;<code>Git/libexec/git-core</code>&#8221; directories, the later being the home of the missing &#8220;<code>git-upload-pack</code>.&#8221;  I updated my &#8220;<code>~/.bashrc</code>&#8221; file to add the directories to the path and optimistically expected things to just work.</p>
<p>Yeah, right.</p>
<p>I used putty to log back into the server to examine the path and discovered to my surprise that my additions were not there.  I eventually figured out that I should have been updating &#8220;<code>~/.bash_profile</code>&#8221; and not &#8220;<code>~./bashrc</code>&#8220;.  I also fixed a typo in my addition.  So I ended up with the following in my &#8220;<code>~/.bash_profile</code>&#8220;:</p>
<p><code>export PATH=$PATH:/cygdrive/c/Progra~1/Git/libexec/git-core:/cygdrive/c/Progra~1/Git/bin</code></p>
<p>And, sure enough, when I logged back in with putty and examined the path, they were on it, and &#8220;<code>which git-upload-pack</code>&#8221; returned exactly what it should.  At last, I was done, everything should just work, I fired up the Git-Gui on my laptop, give it the correct URL&#8217;s to clone the test repository on the server&#8230;and got exactly the same error that it was unable to find &#8220;<code>git-upload-pack</code>&#8220;.</p>
<p>An hour, or so, of bumbling around lead me to comparing the path returned from:</p>
<p><code>ssh myid@mygitserver echo \$PATH</code></p>
<p>with that obtained from putty&#8230;they were different.  It turns out that the ssh session started by the Git Gui used &#8220;<code>~/.bashrc</code>&#8221; while that started by putty used &#8220;<code>~/.bash_profile</code>.&#8221;</p>
<p>The real problem was that I had gotten my first <code>PATH</code> fix wrong when I used &#8220;<code>~/.bashrc</code>&#8221; and had assumed that the problem was that I had the wrong file rather than simply having a typo in the path.  That error was masked later when I discovered that I could change putty&#8217;s <code>PATH</code> from &#8220;<code>~/.bash_profile</code>&#8221;  and I just assumed that that was the correct file to use.  Once I put the correct path into &#8220;<code>~/.bashrc</code>&#8221; &#8220;everything&#8221; started working.</p>
<p>Now, it&#8217;s time for my plunge into the wonderful world of Git, I expect everything to just work.</p>
<p>Yeah, right.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.forddaniel.com/2010/05/git-on-windows/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Immigration Documents</title>
		<link>http://www.forddaniel.com/2010/03/immigration-documents/</link>
		<comments>http://www.forddaniel.com/2010/03/immigration-documents/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 18:58:50 +0000</pubDate>
		<dc:creator>Daniel Ford</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Software Engineering]]></category>

		<guid isPermaLink="false">http://www.forddaniel.com/?p=31</guid>
		<description><![CDATA[I was recently reminded of the disconnect between organizational image and organizational reality. In software development organizations one often sees a professed focus on productivity and quality. Sometimes this is bolstered by the sincere adoption of some kind of &#8220;development philosophy&#8221; that has some spiffy name like &#8220;agile,&#8221; &#8220;srum,&#8221; &#8220;pair,&#8221; or &#8220;test driven.&#8221; Each approach [...]]]></description>
			<content:encoded><![CDATA[<p>I was recently reminded of the disconnect between organizational image and organizational reality.  In software development organizations one often sees a professed focus on productivity and quality.  Sometimes this is bolstered by the sincere adoption of some kind of &#8220;development philosophy&#8221; that has some spiffy name like &#8220;agile,&#8221; &#8220;srum,&#8221; &#8220;pair,&#8221; or &#8220;test driven.&#8221;   Each approach has some value and the best developers and organizations adopt what works.  The problem however, is that many stop there and don&#8217;t really think about what would truly make their efforts more effective and productive.</p>
<p>One practice that I&#8217;ve encountered, and have tried in practice, is to make it as easy as possible for a new person to join a software development project.  This is a simple practice that can payoff big by getting new people to be productive as soon as possible.  For open source projects, it&#8217;s pretty much a requirement for attracting other developers, because if it is hard to join a project, they&#8217;ll simply move on to something else (and you&#8217;ll never know).   The surest way to do this is to codify the project&#8217;s tacit knowledge in an &#8220;immigration&#8221; document.  This is a manual or wiki that you give to a new person that explains EVERYTHING about the project other than its design (and maybe a bit of that too).  For instance, simple things like the names of the other developers, their contact information and the parts of the project that are their responsibility should be included.   Also, a complete inventory of the tools in use, their versions, where to get them and how to install and configure them is incredibly useful to a newcomer.   Administrative trivia is also essential; things like how to obtain an account, where the repositories are, the names of servers and where they&#8217;re located, and anything else that &#8220;everyone&#8221; just knows.  A &#8220;starting out&#8221; check list is also a big help.  This is step-by-step list of tasks for a new person to execute, the basic idea is to get them to be instantly productive by setting up their environment without any kind of drag on the rest of the team.  The most important component of the immigration document, however, is an accurate, up-to-date explanation of the project&#8217;s build process.  Why?  Well, first, it means that the project actually has a build process!  Second, it gives the broadest, least ambiguous, picture of the system being developed.  The build process is also a reflection of a capabilities and professionalism of the organization that created it and it sets expectations for the project newcomer, and you want those expectations to be set to the max from day one.  </p>
<p>This last point actually cuts both ways, if you&#8217;re a developer interviewing with a company and they get to the point where they say &#8220;Do you have any questions for us?&#8221;  You should sit up and start digging for information about their build process.  If it involves some guy running between two ancient PC&#8217;s with a couple of floppy disks, don&#8217;t expect to show up on the first day to a desk, a chair,  a computer and the necessary accounts already set up; you shouldn&#8217;t expect an immigration document either. However, if the process is completely automatic, look knowingly impressed, throw them a compliment, and then ask to see a copy of their immigration document.  If you get one, say &#8220;Wow! Where do I sign up?&#8221;  If you get a blank stare, be nice and explain, interviewers love candidates that that can teach them something.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.forddaniel.com/2010/03/immigration-documents/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>STEM Version 1.0 released</title>
		<link>http://www.forddaniel.com/2010/02/stem-version-1-0-released/</link>
		<comments>http://www.forddaniel.com/2010/02/stem-version-1-0-released/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 13:45:07 +0000</pubDate>
		<dc:creator>Daniel Ford</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[STEM Eclipse]]></category>

		<guid isPermaLink="false">http://www.forddaniel.com/2010/02/stem-version-1-0-released/</guid>
		<description><![CDATA[After many years of effort, Version 1.0 of STEM was approved for release by Eclipse.]]></description>
			<content:encoded><![CDATA[<p>After many years of effort, Version 1.0 of <a href="http://www.eclipse.org/stem">STEM</a> was approved for release by Eclipse.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.forddaniel.com/2010/02/stem-version-1-0-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
