<?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>Green Moon Software, LLC</title>
	<atom:link href="http://www.greenmoonsoftware.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.greenmoonsoftware.com</link>
	<description>CUSTOM FIT BUILD AND TEST AUTOMATION</description>
	<lastBuildDate>Fri, 27 Jun 2014 03:36:41 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	
	<item>
		<title>Hash Password with PBKDF2 and HMAC SHA</title>
		<link>http://www.greenmoonsoftware.com/2014/06/hash-password-with-pbkdf2-and-hmac-sha/</link>
		<comments>http://www.greenmoonsoftware.com/2014/06/hash-password-with-pbkdf2-and-hmac-sha/#comments</comments>
		<pubDate>Thu, 19 Jun 2014 02:06:07 +0000</pubDate>
		<dc:creator><![CDATA[Robert Greathouse]]></dc:creator>
				<category><![CDATA[Quick Tip]]></category>

		<guid isPermaLink="false">http://www.greenmoonsoftware.com/?p=626</guid>
		<description><![CDATA[This is an example showing a proper hashing algorithm for hashing passwords for storage. Make sure that you store the salt for the password as well. Otherwise, there is no way to get it back. You can tweak the iterations and keylength variables as needed. As future CPU (and GPUs) get faster, you will have [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>This is an example showing a proper hashing algorithm for hashing passwords for storage. Make sure that you store the salt for the password as well. Otherwise, there is no way to get it back. You can tweak the iterations and keylength variables as needed. As future CPU (and GPUs) get faster, you will have to change the iterations.</p>
<pre class="brush: groovy; title: ; notranslate">
import javax.crypto.SecretKeyFactory
import javax.crypto.spec.PBEKeySpec
import java.security.SecureRandom

def salt = salt()
def hash = hash('password', salt)

println hash

private salt() {
    final Random r = new SecureRandom();
    byte[] salt = new byte[500];
    r.nextBytes(salt);
    return salt
}

private String hash(String password, byte[] salt) {
    char[] passwordChars = password.toCharArray();

    def iterations = 5000
    def keyLength = 192
    PBEKeySpec spec = new PBEKeySpec(
            passwordChars,
            salt,
            iterations,
            keyLength
    );
    SecretKeyFactory key = SecretKeyFactory.getInstance(&quot;PBKDF2WithHmacSHA1&quot;);
    byte[] hashedPassword = key.generateSecret(spec).getEncoded();
    return String.format(&quot;%x&quot;, new BigInteger(hashedPassword));
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.greenmoonsoftware.com/2014/06/hash-password-with-pbkdf2-and-hmac-sha/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java 8 Elvis Operator</title>
		<link>http://www.greenmoonsoftware.com/2014/05/java-8-elvis-operator/</link>
		<comments>http://www.greenmoonsoftware.com/2014/05/java-8-elvis-operator/#comments</comments>
		<pubDate>Fri, 02 May 2014 18:57:37 +0000</pubDate>
		<dc:creator><![CDATA[Robert Greathouse]]></dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Intro]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.greenmoonsoftware.com/?p=585</guid>
		<description><![CDATA[DISCLAIMER: This post contains a rant. Reader discretion is advised. Null pointers are the bane of software developers. The nefarious NullPointerException or NoReferenceException is know to all java or C# developers. At worst, they are a minor inconvenience. At worst, they can cost companies a lot of money. So when I heard about a new [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><em>DISCLAIMER: This post contains a rant. Reader discretion is advised.</em></p>
<p>Null pointers are the bane of software developers. The nefarious NullPointerException or NoReferenceException is know to all java or C# developers. At worst, they are a minor inconvenience. At worst, they can cost companies a lot of money. So when I heard about a new feature in Java 8 that was supposed to help mitigate these bugs, I was excited.</p>
<blockquote class="twitter-tweet tw-align-center" lang="en"><p>Imagine a world where we didn&#39;t have to check for &quot;null&quot;.</p>
<p>&mdash; Robert G Greathouse (@greathr_) <a href="https://twitter.com/greathr_/statuses/451445635711901699">April 2, 2014</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<p>The feature is called &#8220;Optional&#8221;. There are a lot of existing examples in other languages of how nulls can be easily handled. Indeed, the <a href="http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html">documentation</a> even cites some of the examples.<br />
<img src="http://i2.wp.com/www.greenmoonsoftware.com/wp-content/uploads/2014/05/Elvis-Simpson-.jpg" alt="Elvis Simpson" class="alignright" data-recalc-dims="1" /></p>
<blockquote cite="http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html"><p>
<strong>What Alternatives to Null Are There?</strong><br />
Languages such as Groovy have a safe navigation operator represented by &#8220;?.&#8221; to safely navigate through potential null references. (Note that it is soon to be included in C#, too, and it was proposed for Java SE 7 but didn&#8217;t make it into that release.) It works as follows:</p>
<p>String version = computer?.getSoundcard()?.getUSB()?.getVersion();</p>
<p>In this case, the variable version will be assigned to null if computer is null, or getSoundcard() returns null, or getUSB() returns null. You don&#8217;t need to write complex nested conditions to check for null.</p>
<p>In addition, Groovy also includes the Elvis operator &#8220;?:&#8221; (if you look at it sideways, you&#8217;ll recognize Elvis&#8217; famous hair), which can be used for simple cases when a default value is needed. In the following, if the expression that uses the safe navigation operator returns null, the default value &#8220;UNKNOWN&#8221; is returned; otherwise, the available version tag is returned.</p>
<p>String version = computer?.getSoundcard()?.getUSB()?.getVersion() ?: &#8220;UNKNOWN&#8221;;</p>
<p>[snip]</p>
<p>OK, we diverged a bit and all this sounds fairly abstract. You might now wonder, &#8220;so, what about Java SE 8?&#8221;
</p></blockquote>
<p>After reading that section, I was momentarily excited. The &#8220;?&#8221; and &#8220;?:&#8221; operators in groovy are godsends. But, my enthusiasm was quickly halted. To use this new feature, variables have to be wrapped in Optional objects. For instance:</p>
<pre class="brush: java; title: ; notranslate">
public Optional&lt;Book&gt; findBook(String isbn) {
   Book b = //look up book in some repository that may return &quot;null&quot; for not found
   return Optional.ofNullable(b);
}
</pre>
<p>So what does the equivalent Elvis operator &#8220;?:&#8221; look like in Java 8?</p>
<pre class="brush: java; title: ; notranslate">
String name = computer.flatMap(Computer::getSoundcard)
                          .flatMap(Soundcard::getUSB)
                          .map(USB::getVersion)
                          .orElse(&quot;UNKNOWN&quot;);
</pre>
<p>What happened here? How can you tease me with the easy to use syntax and then throw this up? What the heck is flatMap and map? All I&#8217;m trying to do is get the version of the usb connected to the soundcard on my computer.</p>
<p>I can see where there are other use cases for Optional as I read through the rest of the documentation page. But I have to wonder if those other features could have somehow been tacked onto the language in a different manner. I fully admit that I am not a language creator, nor have any experience in it. But in APIs that I write, I try to hide away the ugly and leave a nice, easy-to-use front end. The above does not appear to hide the ugly.</p>
<p>To be fair, I have not had any practical experience with the new features in Java 8. So it is possible I do not fully understand how this particular feature will fit in with the new additions. I will keep an open mind and attempt to use the Optional feature when it makes sense. I tend to write mostly in groovy thesedays, so I will happily keep using the &#8220;?&#8221; an &#8220;?:&#8221; operators.</p>
<p>Thanks for reading my rant.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.greenmoonsoftware.com/2014/05/java-8-elvis-operator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Best Confidence Builder is Experience</title>
		<link>http://www.greenmoonsoftware.com/2014/05/the-best-confidence-builder-is-experience/</link>
		<comments>http://www.greenmoonsoftware.com/2014/05/the-best-confidence-builder-is-experience/#comments</comments>
		<pubDate>Thu, 01 May 2014 19:03:18 +0000</pubDate>
		<dc:creator><![CDATA[Robert Greathouse]]></dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Theory]]></category>

		<guid isPermaLink="false">http://www.greenmoonsoftware.com/?p=572</guid>
		<description><![CDATA[What stops a lot of people from trying something new? Fear of failure and lack of confidence are two that come to my mind. Failure and &#8220;failing fast&#8221; has been a popular topic in the recent years. However, I do not see a lot of articles about confidence. To me, being confident in oneself eliminates [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>What stops a lot of people from trying something new? Fear of failure and lack of confidence are two that come to my mind. Failure and &#8220;failing fast&#8221; has been a popular topic in the recent years. However, I do not see a lot of articles about confidence. To me, being confident in oneself eliminates a lot of fears.</p>
<p>How does one build confidence? Through experience. Experience is not something that you have when you are born (obviously). It it gathered over time. Often through repeating the same thing. Drills are one way to gather experience. Drills build muscle memory. When I was training for my pilot certificate, I had lessons that only practiced take-off and landings. These lessons were three to four times a week and included up to 10 landings per session. My instructor kept hammering the fundamentals until they became second nature.</p>
<p>The best way to gather experience in software development is to write software. Often times, though, simply writing software on-the-job only gets you experience using the tools, languages, and ideologies that your company has approved. If you are still writing software the same way you were a one, two, five years ago, it might be time to expand your toolbox.</p>
<p>A common suggestion is to commit to open source projects. I personally have no experience with that due to a lack of ambition of my part. It feels like it would require a lot of prerequisites. I would have to find a project needing help, read through the developer guidelines, find an issue that I can fix, submit a pull-request, and so forth. To me personally, that seems like a lot of work. If I am coding for fun, it should be fun.</p>
<p>Therefore, I suggest writing software that scratches your own itch. If there is a problem that you wish a computer could solve for you, try writing it yourself. I have written 20+ software projects for my personal use. Most of them have been thrown away after a while, but what I learned while writing them has stayed with me. I have found that writing a &#8220;real&#8221; product while learning a new language or framework is ideal. Having a real product with real features keeps me interested in continuing development. I get bored writing a TODO app simply to learn a new language.</p>
<p>Once you have a good baseline confidence in yourself, you should not be afraid of attempting anything. This transcends software development. Every aspect of life is better when you are confident in yourself.</p>
<p><em>The title of this post came from the <a href="http://starwars.wikia.com/wiki/Rookies">Star Wars: The Clone Wars Season 1 Episode 5</a> moral</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.greenmoonsoftware.com/2014/05/the-best-confidence-builder-is-experience/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Groovy Database Resource Handling</title>
		<link>http://www.greenmoonsoftware.com/2014/04/groovy-database-resource-handling/</link>
		<comments>http://www.greenmoonsoftware.com/2014/04/groovy-database-resource-handling/#comments</comments>
		<pubDate>Tue, 29 Apr 2014 18:24:02 +0000</pubDate>
		<dc:creator><![CDATA[Robert Greathouse]]></dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[Groovy]]></category>

		<guid isPermaLink="false">http://www.greenmoonsoftware.com/?p=563</guid>
		<description><![CDATA[I am a big fan of using SQL in java and C# software. I typically dislike the usage of ORM frameworks like Hibernate. I feel that ORMs tend to hide a lot of of issues. They also tend to have a higher learning curve. I am not sure that the ROI on deeply learning an [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I am a big fan of using SQL in java and C# software. I typically dislike the usage of ORM frameworks like Hibernate. I feel that ORMs tend to hide a lot of of issues. They also tend to have a higher learning curve. I am not sure that the ROI on deeply learning an ORM is sufficient enough to use. However, there are a lot of pitfalls that come with being so close to the SQL. The largest of which is proper resource handling. If database connections are not closed properly, the application will soon become starved of available connections.</p>
<p>This post contains a simple example of using Groovy Categories to help manage the resource management of database connections. There are a lot more robust solutions (ie: <a href="http://www.grails.org/GORM+-+StandAlone+Gorm" title="GORM">GORM</a>), but sometimes you only need a quick implementation.</p>
<p>To accomplish our goal, we will be using a static closure defined below. The OpenDatabase class is merely a container for the closure. I think the final implementation of the code reads nicely because of the name.<br />
<strong>OpenDatabase.groovy</strong></p>
<pre class="brush: groovy; title: ; notranslate">
import groovy.sql.Sql

class OpenDatabase {
    def static with = { DbConnection conn, Closure closure -&gt;
        Sql sql
        try {
            sql = conn.getConnection()

            if (closure) {
                closure(sql)
            }
        }
        finally {
            sql.close()
        }
    }
}
</pre>
<p>The DbConnection class is a simple interface for creating the groovy.sql.Sql object.</p>
<p><strong>DbConnection.groovy</strong></p>
<pre class="brush: groovy; title: ; notranslate">
import groovy.sql.Sql;

public interface DbConnection {
	Sql getConnection();
}
</pre>
<p>Below is the sample usage of these two classes.</p>
<pre class="brush: groovy; title: ; notranslate">
OpenDatabase.with(dbConnector) { sql -&gt;
         sql.execute(&quot;insert into BLAH...&quot;)
}
</pre>
<p>The database connection will be closed after closure exits. Simple, easy resource handling. The groovy way.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.greenmoonsoftware.com/2014/04/groovy-database-resource-handling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code Archaeology</title>
		<link>http://www.greenmoonsoftware.com/2014/04/code-archaeology/</link>
		<comments>http://www.greenmoonsoftware.com/2014/04/code-archaeology/#comments</comments>
		<pubDate>Tue, 22 Apr 2014 18:37:24 +0000</pubDate>
		<dc:creator><![CDATA[Robert Greathouse]]></dc:creator>
				<category><![CDATA[Intro]]></category>

		<guid isPermaLink="false">http://www.greenmoonsoftware.com/?p=552</guid>
		<description><![CDATA[I love sitting down to review a new codebase. Depending on the age of the codebase, it can be a little like archaeology. There are often distinct sections that have not been touched in many, many years. Sometimes you can almost see rings around the codebase similar to the rings on a tree. One section [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I love sitting down to review a new codebase. Depending on the age of the codebase, it can be a little like archaeology. There are often distinct sections that have not been touched in many, many years. Sometimes you can almost see rings around the codebase similar to the rings on a tree. One section might be written in one framework, but another section is implemented in a different, newer framework. The following describes how I spend the first hour with some new code.<br />
<img src="http://i2.wp.com/www.greenmoonsoftware.com/wp-content/uploads/2014/04/science_archaeologist.gif" alt="Archaeologist" class="alignright" data-recalc-dims="1" /><br />
<strong>First Impressions</strong><br />
The very first thing I typically notice is the style of the syntax. Does the code use the correct industry standard for the given language? Or is this C# project written in the Java style (or vice-versa)? If I see non-standard syntax, I tend to assume that the code was written by novices*. First impressions come quick and are hard to change.</p>
<p>A lot of projects have a &#8220;utilities&#8221; package or namespace. These packages contain tweaks and helper functions to aid with the rough edges of the language. Prior to Java 8, how many java projects have special classes to handle date/time manipulations? These packages provide some insight on the level of knowledge the original developers had of the language. It is often enjoyable to see how others have solved similar problems. Sometimes they solve it in a similar way I have seen. However, often times it is solved in a completely different manner. Seeing those differences helps me grow and evolve.</p>
<p><strong>Digging Deeper</strong><br />
After getting the initial peek, I look at the dependencies. What external frameworks are being utilized? This gives me a some landmarks to visit. I research any dependency that I do not immediately recognize to determine the approximate age and level of support.</p>
<p><strong>Audibles</strong><br />
A common sore spot in application development is accessing databases. In my experience, database access has been the largest performance bottleneck in most applications. In addition, incorrect handling of connections can cause memory leaks and bring an application down. I look to ensure proper connection handling as well as review the usage of ORM or other database mapping frameworks.</p>
<p>If the application is a web application, I will look at the general configuration. Whether that is the web.xml in Java or the global.asax in dotNET. I am looking for the general entry point for most requests. I follow up with reviewing how the chosen web framework has been implemented. Are the defacto standards followed?</p>
<p><strong>Conclusion</strong><br />
I tend to learn something new regardless of the age of the software, the original developer&#8217;s experience, or the chosen language. Often I will see a language feature that I never knew existed or a method on a class that I have never seen. I enjoy reading code almost as much as I enjoy writing it.</p>
<p>* The original developers may have only been novices in the chosen language. They could very well have had many years of software development.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.greenmoonsoftware.com/2014/04/code-archaeology/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Product vs. Project</title>
		<link>http://www.greenmoonsoftware.com/2014/02/product-vs-project/</link>
		<comments>http://www.greenmoonsoftware.com/2014/02/product-vs-project/#comments</comments>
		<pubDate>Mon, 10 Feb 2014 02:49:31 +0000</pubDate>
		<dc:creator><![CDATA[Robert Greathouse]]></dc:creator>
				<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://www.greenmoonsoftware.com/?p=541</guid>
		<description><![CDATA[There are many ways for a business to release software. Two common approaches are projects and products. They sound similar but are vastly different. Project releases are often big-bang, all-or-nothing style of releases. Projects can often take months or even years to release. The software tasks are typically tracked with gantt charts and is often [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>There are many ways for a business to release software. Two common approaches are projects and products. They sound similar but are vastly different.</p>
<p>Project releases are often big-bang, all-or-nothing style of releases. Projects can often take months or even years to release. The software tasks are typically tracked with gantt charts and is often managed in a waterfall-style. The schedule is typically considered the most important component in this model. In addition, projects typically require vast amounts of documents prior to the first line of code being written. These documents include requirements, high-level design, detailed design, use cases, test scripts, and countless others. Project releases are often used by &#8220;enterprises&#8221; to release software. </p>
<p>Most of the projects I have worked on have failed. Those projects that were successful typically failed within a year. When a project completes, the organization will move their human resources to a new project leaving noone to maintain the software. Software is rarely <em>done</em>. Projects seem to encourage software developers to take shortcuts to make the due date.</p>
<p>Product releases on the other hand, typically do not have a finite end date. Software is released in feature and bug fix increments. A software roadmap help guide the development effort. These roadmaps provide a general idea of when features will be implemented. Since there is no end date, the software developers can evolve the codebase. This helps create a clean, maintainable source tree. Developers typically take more pride in their work. They know that the shortcuts they take today will affect them in the near future. The most important component is this model is working software.</p>
<p>In my experience, software managed in the project model feel heavy and slow. Whereas, the product model seems a lot lighter and quicker. I prefer to work on products and not projects. What type of release model do you prefer?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.greenmoonsoftware.com/2014/02/product-vs-project/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Legacy is a Four-Letter Word</title>
		<link>http://www.greenmoonsoftware.com/2014/01/legacy-is-a-four-letter-word/</link>
		<comments>http://www.greenmoonsoftware.com/2014/01/legacy-is-a-four-letter-word/#comments</comments>
		<pubDate>Sun, 12 Jan 2014 04:22:29 +0000</pubDate>
		<dc:creator><![CDATA[Robert]]></dc:creator>
				<category><![CDATA[Culture]]></category>

		<guid isPermaLink="false">http://www.greenmoonsoftware.com/?p=522</guid>
		<description><![CDATA[The term &#8220;legacy&#8221; has mixed meanings in software development and I am personally trying to remove it from my vocabulary. It often has a bad connotation. Many developers use it to describe code that they did not write and do not like. It is often used to describe code that may not have used the [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>The term &#8220;legacy&#8221; has mixed meanings in software development and I am personally trying to remove it from my vocabulary. It often has a bad connotation. Many developers use it to describe code that they did not write and do not like. It is often used to describe code that may not have used the best developmental practices. Software developers may also take offense to their code being called <em>legacy</em>.</p>
<p>Youthful software developers tend to dislike <em>legacy</em> code. I was once one of those developers. I thought I could easily rewrite a section, feature, or even a whole program in less time than it would take to make minor changes to it. I finally learned my lesson after many, many, m-a-n-y failures (and one success*).</p>
<p>Now, instead of using the term &#8220;legacy&#8221;, I try to substitute with &#8220;existing&#8221;. I don&#8217;t shy away from <em>existing</em> code. I embrace the fact that the code has many battle scars. Those scars are years of bugs that have presumably been killed. The intrinsic evolution of features and nuances that make the product what it is today. I no longer have a craving to slash and burn code to simply start with a greenfield.</p>
<p>I prefer working on an <em>existing</em> codebase. I love fixing issues that the client has had for many years. I enjoy incrementally making software better one refactor at a time. It is also a lot quicker to see the software I&#8217;m writing get in the hands of end-users and make a real impact.</p>
<p>I would like to tell all of the developers that think they are stuck on a <em>legacy</em> project:</p>
<blockquote><p>
Contrary to the term, things aren&#8217;t always greener on a greenfield project.
</p></blockquote>
<p>We should all simply enjoy the code we get to write. I know I love writing every line that I can. If you focus on keeping things clean and concise, your <em>legacy</em> will be appreciated by those who follow.</p>
<p><span style="font-size: x-small;"><br />
* I actually did rewrite an entire program in one day. However, I was scared out of my mind when the Vice President of Information Technology actually called me on my brazen promise. I ended up working late into the night. I learned a valuable lesson about having a big mouth. That was also the last time I made any more &#8220;bold rewrite&#8221; statements.<br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.greenmoonsoftware.com/2014/01/legacy-is-a-four-letter-word/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Professional Insurance</title>
		<link>http://www.greenmoonsoftware.com/2013/10/professional-insurance/</link>
		<comments>http://www.greenmoonsoftware.com/2013/10/professional-insurance/#comments</comments>
		<pubDate>Sun, 13 Oct 2013 19:02:51 +0000</pubDate>
		<dc:creator><![CDATA[Robert Greathouse]]></dc:creator>
				<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://www.greenmoonsoftware.com/?p=504</guid>
		<description><![CDATA[DISCLAIMER: I am not am employee of techinsurance.com nor did techinsurance.com ask that I write a review. I am merely a very satisfied customer. I recently quit my day job to work full-time as an independent contractor. One of the hurdles of going alone is purchasing insurance for a business. I am required to carry [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><em style="font-size: small;">DISCLAIMER: I am not am employee of techinsurance.com nor did techinsurance.com ask that I write a review. I am merely a very satisfied customer.</em></p>
<p>I recently quit my day job to work full-time as an independent contractor. One of the hurdles of going alone is purchasing insurance for a business. I am required to carry Commercial Liability insurance and Professional Liability insurance including Errors and Omissions (often abbreviated as &#8220;E&#038;O&#8221;).</p>
<p>I started with the insurance company that I use for my home and auto. The application was long and confusing. After I submitted it, I had to wait 6 business days to hear the bad news. They were unable to cover me. I must have answered some of the questions incorrectly. I recently moved and have not found a local agent. Therefore, it was difficult to ask my agent questions regarding the application. I am mostly to blame for that.</p>
<p>I now had 2 weeks to scramble and find insurance prior to the start date of my new contract. I immediately setup meetings with two local agents. I feared that the underwriting process would take too long and I would not be insured by the start date. </p>
<p>I learned about <a href="http://www.techinsurance.com/">techinsurance.com</a> from a fellow contractor less than one week prior to my start date. I had not heard back from either of the two local agents so I was really stressed and worried.</p>
<p><a href="http://www.techinsurance.com/"><img src="http://i1.wp.com/www.greenmoonsoftware.com/wp-content/uploads/2013/10/techinsurance.png?resize=300%2C200" alt="techinsurance" class="alignright" data-recalc-dims="1" /></a><br />
I filled out the techinsurance.com online application form that night. It was straightforward and easy to understand. Their website says that they are often able to give real-time quotes. However, they were not able to for me. The following morning, I received an email with quotes from several reputable insurance companies. I was also assigned a licensed agent to work with me through the process.</p>
<p>The quotes given to me from techinsurance.com were effective immediately. No more waiting 6-8 business days for underwriting. I was relieved to know that I would have insurance for my first day. Not only that, the quotes were good rates. The E&#038;O insurance is half what a fellow contractor is paying. However, one of the local agents had a lower quote on the Commercial Liability. I mix and matched the plans and came out with a great annual premium for all of the insurance required.</p>
<p>I am very impressed with techinsurance.com. The assigned agent, the quick quote process, and the easy purchase experience is what made it great. I would highly recommend them to any professional that needs commercial and professional liability insurance.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.greenmoonsoftware.com/2013/10/professional-insurance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Let&#8217;s Talk About Salaries</title>
		<link>http://www.greenmoonsoftware.com/2013/10/lets-talk-about-salaries/</link>
		<comments>http://www.greenmoonsoftware.com/2013/10/lets-talk-about-salaries/#comments</comments>
		<pubDate>Mon, 07 Oct 2013 04:01:54 +0000</pubDate>
		<dc:creator><![CDATA[Robert Greathouse]]></dc:creator>
				<category><![CDATA[Culture]]></category>

		<guid isPermaLink="false">http://www.greenmoonsoftware.com/?p=498</guid>
		<description><![CDATA[In my career, I have always disliked talking about salaries. I hated salary negotiations. I have never asked for a raise. I had never told anyone my actual salary besides close family, HR, or recruiting managers. Why is that and has it hurt me? Let&#8217;s be honest. Software developers typically make a pretty decent living. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>In my career, I have always disliked talking about salaries. I hated salary negotiations. I have never asked for a raise. I had never told anyone my actual salary besides close family, HR, or recruiting managers. Why is that and has it hurt me?</p>
<p>Let&#8217;s be honest. Software developers typically make a pretty decent living. Three years ago, my wife quit her day job to stay home with our kids. I have made enough to provide for my family with my sole income. I feel like I have been compensated well enough. So what is the purpose of this post?<br />
<a href="http://i2.wp.com/www.greenmoonsoftware.com/wp-content/uploads/2013/10/salary.jpg"><img src="http://i2.wp.com/www.greenmoonsoftware.com/wp-content/uploads/2013/10/salary.jpg?resize=300%2C300" alt="salary" class="alignright" data-recalc-dims="1" /></a><br />
I would love to remove the taboo that exists around salary discussions. Who benefits from keeping salary information scarce? The employers. I have seen some contracts and NDAs that explicitly disallow employees from discussing current salaries and bill rates. If developers do not talk to one another, the employer has a lot more leeway to steamroll naive or timid developers (like myself). </p>
<p>I would love for every developer to have the confidence to know what their skills are worth while negotiating a salary increase. There are websites like http://www.glassdoor.com/Salaries/index.htm that attempt to provide a range. However, these are often off or give a wide range of salaries.</p>
<p>So what are some options for determining how much you are worth as a developer?<br />
As previously mentioned, you could try using online salary range calculators. You could job hop and find what other companies are paying. Or you could simply ask your fellow developers.</p>
<p>For me, I am no longer going to be timid when it comes to compensation discussions. I will have asked my fellow developers, I will have done my research, and I will come prepared to any future negotiations. I hope you are open to the discussions.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.greenmoonsoftware.com/2013/10/lets-talk-about-salaries/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Some Thoughts on Pair Programming</title>
		<link>http://www.greenmoonsoftware.com/2013/08/some-thoughts-on-pair-programming/</link>
		<comments>http://www.greenmoonsoftware.com/2013/08/some-thoughts-on-pair-programming/#comments</comments>
		<pubDate>Sat, 24 Aug 2013 13:34:00 +0000</pubDate>
		<dc:creator><![CDATA[Robert Greathouse]]></dc:creator>
				<category><![CDATA[Theory]]></category>

		<guid isPermaLink="false">http://www.greenmoonsoftware.com/?p=490</guid>
		<description><![CDATA[Two programmers, one computer. To management, it sounds like waste. To agile mentors, it sounds like the answer. What does it sound like to developers? The answer (as with most things) is &#8220;depends&#8221;. I have only been pair programming for a little over a year. Prior to that, the majority of my career has been [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Two programmers, one computer. To management, it sounds like waste. To agile mentors, it sounds like the answer. What does it sound like to developers? The answer (as with most things) is &#8220;depends&#8221;.</p>
<p>I have only been pair programming for a little over a year. Prior to that, the majority of my career has been spent alone in a cube or office.<br />
<a href="http://i2.wp.com/www.greenmoonsoftware.com/wp-content/uploads/2013/08/pair-of-pears-md.png"><img src="http://i2.wp.com/www.greenmoonsoftware.com/wp-content/uploads/2013/08/pair-of-pears-md.png" alt="Pair of Pears" class="alignright" data-recalc-dims="1" /></a><br />
In 2001 when I started in my first job, we did something like pair programming. Obviously, it was not called that at the time. It also did not look like today&#8217;s pair programming. It consisted of me sitting next to a more senior developer while s/he wrote code. I would help dictate requirements and help transpose. It was still two eyes on one screen. This style of work helped me get learn the system, but it didn&#8217;t really help me learn to program.</p>
<p>Fast-forward to today. I am in a position that pairs 100% of the time. We switch pairs after every 2 week iteration. One developer usually takes the keyboard in the morning, and the other takes over in the afternoon. We sit at large tables with a single monitor between us. We each have our own laptops and simply switch the video cable for the monitor. This allows us to setup our own computer to suit our unique needs (ie: plugins, keybindings, etc). It also allows us the ability to turn away and check emails or text messages on occasion.</p>
<p>After working in this environment, I have seen how well it works to get new hires integrated with the software. I have seen how it helps fresh graduates start learning the &#8220;right way&#8221;<sup>[1]</sup>. I think about all of the missed opportunities from my past career with regret.</p>
<p>In addition to the two benefits described above, it is also beneficial on new features or working around critical components. Two sets of eyes are better than one. </p>
<p>However, pair programming is not a silver bullet. I feel it does not work for every company or situation. Production support is one such situation. Often times tracking down bugs is a hunting mission. Lots of different paths have to be explored to find the bug. Pairing will only get in the way here.</p>
<p>Simple feature enhancements usually do not require a pair. These features are fairly simple and straight-forward. They do not touch critical components. Pairing on these types of features is a waste of time.</p>
<p>In conclusion, I am not advocating NOT pair programming. I advocate to use it in the correct situations and not just simply applied as a constant practice. I highly recommend doing pull requests prior to integrating any code into the main branch. This will allow a second set of eyes to review code. I also highly recommend writing tests. In my opinion, these add up to more quality than 100% pair programming.</p>
<p><sup>[1]</sup> Obviously, there is no one &#8220;right way&#8221; for everything. But there is usually a lot of predisposed teaching that needs to be undone to most fresh graduates.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.greenmoonsoftware.com/2013/08/some-thoughts-on-pair-programming/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
