<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-11696452</id><updated>2012-01-06T07:14:39.953-08:00</updated><category term='solr solandra search NoSQL Java'/><title type='text'>codecraft blog</title><subtitle type='html'>by john troxel.  code, software architecture, and rapid development</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-11696452.post-5340399245772141124</id><published>2011-11-29T08:47:00.000-08:00</published><updated>2011-11-29T15:25:47.174-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='solr solandra search NoSQL Java'/><title type='text'>Search as Data Store</title><content type='html'>A while back I came across &lt;a href="http://blog.sematext.com/2011/09/09/the-state-of-solandra-summer-2011/"&gt;Solandra&lt;/a&gt;, and began wondering about using it as a general purpose store for a typical content-heavy webapp.  The idea was based on a pretty vague notion that combining search with NoSQL would be powerful.  What Solandra does is bolts the &lt;a href="http://lucene.apache.org/solr/"&gt;SOLR&lt;/a&gt; search engine onto &lt;a href="http://cassandra.apache.org/"&gt;Cassandra&lt;/a&gt; instances, resulting in a distributed search with all the data persisted in a NoSQL store.&lt;br /&gt;&lt;br /&gt;In poking around, I've found that it is not unheard of to use SOLR as a web backend.  Perhaps the most prominent example would be The Guardian's use of &lt;a href="http://www.lucidimagination.com/blog/2010/04/29/for-the-guardian-solr-is-the-new-database/"&gt;SOLR for their "Content API."&lt;/a&gt;  There was also supposedly a &lt;a href="http://sparse.ly/"&gt;twitter-like example&lt;/a&gt; that &lt;a href="http://blog.sematext.com/2010/02/09/lucandra-a-cassandra-based-lucene-backend/"&gt;"uses the Lucandra store exclusively and does not use any sort of relational or other type of database"&lt;/a&gt;, though the link did not work as I wrote this (Lucandra is the predecessor to Solandra).&lt;br /&gt;&lt;br /&gt;Why not just stuff everything into SOLR?  It is effectively a document store with powerful and fast queries.  Sure it does not support transactions and the data is not normalized in a relational sense.  But do you need those things for content?  What I mean by content is dynamic stuff that might be edited by humans or updated by feeds: articles, comments, tags, product descriptions, locations; data that is viewed a lot but edited infrequently, not super structured or requiring crazy integrity.  With the Cassandra backing, you should at least get durability and eventual consistency on the data that you shove into SOLR (Solandra).&lt;br /&gt;&lt;br /&gt;I guess now I will have to give it a try, see where the trade-offs are in practice between search, NoSQL, and Relational stores on a real content project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-5340399245772141124?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/5340399245772141124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=5340399245772141124' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/5340399245772141124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/5340399245772141124'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2011/11/search-as-data-store.html' title='Search as Data Store'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-426711880791590038</id><published>2011-11-15T15:57:00.000-08:00</published><updated>2011-12-15T15:36:25.901-08:00</updated><title type='text'>Objects in practice:  class basics in Java and Ruby</title><content type='html'>This post looks at basic class and inheritance mechanisms in both Java and Ruby.  I might to decide to expand this into a series, illustrating basic programming building blocks using Java, Ruby, and Scala; we'll see how it goes.&lt;br /&gt;&lt;br /&gt;For this post, we are modeling employees of a software company, something like:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://yuml.me/diagram/scruffy/class/%5BManager%5D%3C%3E-reports%5BEmployee%5D,%20%5BEmployee%5D%5E-%5BManager%5D,%20%5BEmployee%5D%5E-%5BDeveloper%5D" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="152" src="http://yuml.me/diagram/scruffy/class/[Manager]%3C%3E-reports[Employee],%20[Employee]%5E-[Manager],%20[Employee]%5E-[Developer]" width="392" /&gt;&lt;/a&gt;&lt;/div&gt;(via YUML: &lt;br /&gt;&lt;a href="http://yuml.me/diagram/scruffy/class/edit/%5BManager%5D%3C%3E-reports%5BEmployee%5D,%20%5BEmployee%5D%5E-%5BManager%5D,%20%5BEmployee%5D%5E-%5BDeveloper%5D"&gt;edit&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NOTE:&amp;nbsp; &lt;/b&gt;This is NOT a good design--doesn't allow employees to fulfill multiple roles, doesn't account for changes over time--but I'll show better designs in later Howtos.&lt;br /&gt;&lt;br /&gt;So, the general idea is that we want to reuse some behavior and also provide some specialized behavior.  Probably the most simplistic way to do this in OO languages is to set up concrete inheritance and leverage polymorphism.  I'll show how this is done in Java and Ruby, and the complete code can be found at &lt;a href="https://github.com/jtroxel/Polyglot-Howto"&gt;github&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;JAVA&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A simple parent class, provides startDate member and monthsOnJob to subclasses: &lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code class="language-java"&gt;&lt;br /&gt;public class Employee {&lt;br /&gt;  private Date startDate;&lt;br /&gt;&lt;br /&gt;  public Integer monthsOnJob() {&lt;br /&gt;    Integer months = 0;&lt;br /&gt;    // Do the math&lt;br /&gt;    return months;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public String jobDescription() {&lt;br /&gt;    return "New employee"; // Default description, will be overriden by subclasses&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;A simple subclass, adding behavior to the super and overriding the description&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code class="language-java"&gt;&lt;br /&gt;public class Developer extends Employee {&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public String jobDescription() {&lt;br /&gt;    return "Developer: " + listTechnicalSkills(); &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private String listTechnicalSkills() {&lt;br /&gt;    String skillStr = "";&lt;br /&gt;    // TODO get skills from getTechnicalSkills and build string&lt;br /&gt;    return skillStr;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private Collection technicalSkills;&lt;br /&gt;&lt;br /&gt;  public Collection getTechnicalSkills() {&lt;br /&gt;    return technicalSkills;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setTechnicalSkills(Collection technicalSkills) {&lt;br /&gt;    this.technicalSkills = technicalSkills;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Another specialization, Manager has Employees as reports&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code class="language-java"&gt;&lt;br /&gt;public class Manager extends Employee {&lt;br /&gt;  Collection&lt;employee&gt; reports;&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public String jobDescription() {&lt;br /&gt;    return "Suit";&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public Collection&amp;lt;Employee&gt; getReports() {&lt;br /&gt;    return reports;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Ruby&lt;/b&gt;&lt;br /&gt;Now the parent class in Ruby&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code class="language-java"&gt;&lt;br /&gt;class Employee&lt;br /&gt;  attr_accessor :start_date # method that creates accessors&lt;br /&gt;&lt;br /&gt;  def initialize(start)&lt;br /&gt;    @start_date = start&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def months_on_job&lt;br /&gt;    # Math is easy&lt;br /&gt;    (Date.today.year*12 + Date.today.month) - (@start_date.year*12 + @start_date.month)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def job_description&lt;br /&gt;    "New employee"&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;A Ruby Developer class&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code class="language-java"&gt;&lt;br /&gt;class Developer &lt; Employee&lt;br /&gt;&lt;br /&gt;  attr_accessor :technical_skills&lt;br /&gt;&lt;br /&gt;  def initialize(start)&lt;br /&gt;    super(start)&lt;br /&gt;    @technical_skills = []&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def job_description&lt;br /&gt;    ret = "Developer: "&lt;br /&gt;    @technical_skills.each {|skill| ret &lt;&lt; " ${skill"}&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;The Manager&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code class="language-java"&gt;&lt;br /&gt;class Manager &lt; Employee&lt;br /&gt;&lt;br /&gt;  attr_accessor :reports # accessor&lt;br /&gt;  def initialize(start)&lt;br /&gt;    super(start)&lt;br /&gt;    @reports = []&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def job_description&lt;br /&gt;    "Suit"&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-426711880791590038?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/426711880791590038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=426711880791590038' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/426711880791590038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/426711880791590038'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2011/11/class-basics-ruby-and-java.html' title='Objects in practice:  class basics in Java and Ruby'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-2784942348211910231</id><published>2011-10-24T19:59:00.000-07:00</published><updated>2011-10-24T20:01:13.619-07:00</updated><title type='text'>John's Independent Forray v3.0</title><content type='html'>After 3.5 years with Rearden, I decided to go back to freelancing, for the 3rd time.&lt;br /&gt;&lt;br /&gt;This time around I am going by codecraft solutions.&amp;nbsp; I am presently subing with &lt;a href="http://haughtcodeworks.com/"&gt;Marty Haught&lt;/a&gt; and intend to continue for some time.&amp;nbsp; Eventually though I intend to run my own projects too.&lt;br /&gt;&lt;br /&gt;That's the plan, stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-2784942348211910231?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/2784942348211910231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=2784942348211910231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/2784942348211910231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/2784942348211910231'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2011/10/johns-independent-forray-v30.html' title='John&apos;s Independent Forray v3.0'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-4232624978416201793</id><published>2011-02-23T12:49:00.000-08:00</published><updated>2011-02-23T12:50:03.265-08:00</updated><title type='text'>Rearden Commerce hiring initiative</title><content type='html'>&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves/&gt;   &lt;w:trackformatting/&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:donotpromoteqf/&gt;   &lt;w:lidthemeother&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:lidthemeasian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:lidthemecomplexscript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:splitpgbreakandparamark/&gt;    &lt;w:dontvertaligncellwithsp/&gt;    &lt;w:dontbreakconstrainedforcedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;    &lt;w:word11kerningpairs/&gt;    &lt;w:cachedcolbalance/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;   &lt;m:mathpr&gt;    &lt;m:mathfont val="Cambria Math"&gt;    &lt;m:brkbin val="before"&gt;    &lt;m:brkbinsub val="&amp;#45;-"&gt;    &lt;m:smallfrac val="off"&gt;    &lt;m:dispdef/&gt;    &lt;m:lmargin val="0"&gt;    &lt;m:rmargin val="0"&gt;    &lt;m:defjc val="centerGroup"&gt;    &lt;m:wrapindent val="1440"&gt;    &lt;m:intlim val="subSup"&gt;    &lt;m:narylim val="undOvr"&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;   &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;   &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 3"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 4"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 5"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 6"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 7"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 8"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 9"&gt;   &lt;w:lsdexception locked="false" priority="35" qformat="true" name="caption"&gt;   &lt;w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"&gt;   &lt;w:lsdexception locked="false" priority="1" name="Default Paragraph Font"&gt;   &lt;w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"&gt;   &lt;w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"&gt;   &lt;w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"&gt;   &lt;w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Revision"&gt;   &lt;w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"&gt;   &lt;w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"&gt;   &lt;w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"&gt;   &lt;w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"&gt;   &lt;w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"&gt;   &lt;w:lsdexception locked="false" priority="37" name="Bibliography"&gt;   &lt;w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Table Normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-priority:99;  mso-style-qformat:yes;  mso-style-parent:"";  mso-padding-alt:0in 5.4pt 0in 5.4pt;  mso-para-margin:0in;  mso-para-margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"Times New Roman";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10.5pt; font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: black;"&gt;&lt;a href="http://goo.gl/2UePJ"&gt;http://goo.gl/2UePJ&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-4232624978416201793?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/4232624978416201793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=4232624978416201793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/4232624978416201793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/4232624978416201793'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2011/02/rearden-commerce-hiring-initiative.html' title='Rearden Commerce hiring initiative'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-690164788212892921</id><published>2011-01-27T15:08:00.000-08:00</published><updated>2011-01-27T15:13:07.551-08:00</updated><title type='text'>Job: Senior Software Engineer: JVM Webapps and Content - Denver area</title><content type='html'>Work from home in Colorado, for &lt;a href="http://www.reardencommerce.com/about/index.php"&gt;Rearden Commerce&lt;/a&gt; (Foster City CA)&lt;br /&gt;&lt;br /&gt;Senior Software Engineer: JVM Webapps and Content&lt;br /&gt;&lt;br /&gt;Responsibilities:&lt;br /&gt;&lt;br /&gt;Your role will be to develop and maintain  web applications and middleware related to aquiring, managing, and  accessing mission-critical content. The role calls specifically for the  development of user interfaces, but also requires "full-stack" knowledge  and development.  As a senior contributor, you will own the  architecture, design, and implementation of these applications and will  be responsible for delivering new capabilities with high quality. You  will have autonomy and responsibility for the following:&lt;br /&gt;&lt;br /&gt;*  Partnering with product management, user experience developers, QA, and  services delivery to understand business requirements and translate them  into high quality designs&lt;br /&gt;* Developing user interfaces and APIs  using HTML, CSS, JavaScript, and JVM languages and frameworks (Java,  Groovy, Maven, Spring, Grails, GWT, Wicket)&lt;br /&gt;* Developing high-volume batch processing solutions using map-reduce, batch frameworks, NoSQL, and message oriented middleware&lt;br /&gt;* Taking ownership of the quality and usability of the application&lt;br /&gt;* Contributing to a culture of innovation and quality across the engineering organization&lt;br /&gt;&lt;br /&gt;Qualifications:&lt;br /&gt;&lt;br /&gt;* Minimum 5 years of commercial web development experience in Java, preferably on a Linux/UNIX environment&lt;br /&gt;* Strong background with user interface design and development featuring XHTML, JS, CSS and AJAX&lt;br /&gt;* 3+ years HTML/XHTML/CSS/JavaScript/DOM cross-browser development experience&lt;br /&gt;* 3+ years experience developing middleware and back-end code:  SQL, JMS, Java ORM, etc.&lt;br /&gt;* Experience with multiple programming languages including Groovy, Python, Ruby, or Scala.&lt;br /&gt;* Strong object-oriented analysis and design skills&lt;br /&gt;* Experience with design patterns (e.g. MVC, Composite, Factory Method, etc.) and refactoring&lt;br /&gt;* Excellent written and oral communication skills&lt;br /&gt;&lt;br /&gt;* Experience and competence developing in *nix environments and shells&lt;br /&gt;* Able to collaborate and thrive in a fast-paced high-performance environment&lt;br /&gt;* BA/BS in Computer Science or equivalent experience&lt;br /&gt;&lt;br /&gt;Desired Qualifications:&lt;br /&gt;* Experience design tools&lt;br /&gt;* Experience working with Agile Methodologies&lt;br /&gt;* Experience developing UI’s for mobile applications on Android or iPhone devices is a plus&lt;br /&gt;&lt;br /&gt;Respond to jtroxel at yahoo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-690164788212892921?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/690164788212892921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=690164788212892921' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/690164788212892921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/690164788212892921'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2011/01/job-senior-software-engineer-jvm.html' title='Job: Senior Software Engineer: JVM Webapps and Content - Denver area'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-117345896089412353</id><published>2007-03-09T08:49:00.000-08:00</published><updated>2007-12-11T09:43:10.340-08:00</updated><title type='text'>The Holy Grail(s)  UPDATED</title><content type='html'>&lt;span style="font-weight: bold;"&gt;In Which I Claim that Java is NOT Dead, and Groovy will be Bigger than Ruby&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPDATE 12/11/2007:  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-style: italic;"&gt;I have recently started using Ruby and Rails on a Java project.  Does this invalidate my assertions here?  I don't think so, it merely underscores the key application for Groovy:  tight integration with Java source and libraries.  I had the need to do some schema management, for which Rails migrations are the simplest approach I know, and some batch scripting; neither of which intersected with Java at all.  A final factor is that I just know Rails far better at this point.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;As I have talked about in previous posts, Java (EE) has been optimized for Enterprise requirements:  Big applications with heavy-duty scalability, performance, and security, often weaving together many disparate databases and integrating with other applications.  On the other hand, Java has most decidedly NOT been optimized for productivity, maintainability, or developer self-actualization.  Although some frameworks and tools have attempted to address the latter set of requirements, nothing comes close Ruby and Rails.&lt;br /&gt;&lt;br /&gt;For green-field development, small-medium sized projects (and medium can mean easily thousands of users nowadays), I would really, really lean toward Ruby on Rails.  However, what about for projects in organizations that have standardized on Java, or for developers who are already Java ninjas?  Enter Groovy, and Grails.&lt;br /&gt;&lt;br /&gt;The promise of &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;, and &lt;a href="http://grails.codehaus.org/"&gt;Grails &lt;/a&gt;(though I am sure there will be other frameworks), is to bring productivity, maintainability, and, well, &lt;span style="font-style: italic;"&gt;fun&lt;/span&gt; to the Java world.  Because these are Java-based technologies, projects can leverage these capabilities to get to market quickly, and &lt;a href="http://gettingreal.37signals.com/ch04_Scale_Later.php"&gt;Scale Later&lt;/a&gt;, falling back on all those nice big E Enterprise features of the Java EE stack.  That, I think, is the Holy Grail of Java development:  Rapid development early, beefing up later.&lt;br /&gt;&lt;br /&gt;That is why, IMHO, Groovy and Grails might be as big as, if not bigger than, Ruby and Rails.  I expect I will be writing a lot more about this in the future.  Also, look forward to a new blog called GroovyCode, where I intend to capture bits of Groovy coding goodness.&lt;br /&gt;&lt;br /&gt;For your further reading pleasure, I include here an email thread I had with &lt;a href="http://www.davisworld.org/"&gt;Scott Davis&lt;/a&gt;, a Groovy pioneer and operator of &lt;a href="http://aboutgroovy.com/"&gt;aboutGroovy&lt;/a&gt; (as well as all around coding Rock Star) [from Aug. '06]:&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&gt; Thanks for the info, very helpful.  As for the client, it's an&lt;br /&gt;&gt; outside shot right now but I will see where it goes.  I originally&lt;br /&gt;&gt; suggested ROR, but he wasn't "comfortable" with it.  He couldn't&lt;br /&gt;&gt; really state the requirements that he thought were lacking, but I&lt;br /&gt;&gt; think he just feels it is not industrial-strength enough.  In order&lt;br /&gt;&gt; to get his business, then, I proposed a Java solution.&lt;br /&gt;&gt;&lt;br /&gt;Ahh, "industrial-strength". Now he's showing his cards. Grails is&lt;br /&gt;based on "industrial-strength", well-proven technologies like Spring,&lt;br /&gt;Hibernate, et al. I firmly believe that RoR is "industrial-strength"&lt;br /&gt;as well, but it doesn't have the track record that Java does at this&lt;br /&gt;time. +1 Grails.&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&gt;&lt;br /&gt;&gt; Now here comes GOG, seemingly on the cusp of critical mass.  Which&lt;br /&gt;&gt; got me thinking that I could offer ROR productivity, with the&lt;br /&gt;&gt; option to (readily) leverage all the enterprise capabilities of&lt;br /&gt;&gt; Java down the road.  And I can talk about reusing some of the code&lt;br /&gt;&gt; I have, though it might not actually make sense.&lt;br /&gt;&gt;&lt;br /&gt;You've hit on the sweet spot of Grails. I honestly haven't gone into&lt;br /&gt;a Grails app and seen what exactly is salvageable in terms of pulling&lt;br /&gt;out the Spring, Hibernate files and using them in a pure Java&lt;br /&gt;environment, but I can't imagine that it'd be too hard.&lt;br /&gt;&lt;br /&gt;&gt; Well, there.  Probably more than you wanted to know.  Before I let&lt;br /&gt;&gt; you go...  What do you think the productivity (functionality /&lt;br /&gt;&gt; time) advantage of GOG is over Java Webapp development?  Any reason&lt;br /&gt;&gt; it could not scale to, say, 100s of 1000s of users?&lt;br /&gt;RoR folks like to claim 5x-10x increase in time to production over&lt;br /&gt;J2EE. I'm not *even* going to venture into that rats nest for Grails,&lt;br /&gt;especially this early in the game.&lt;br /&gt;&lt;br /&gt;The bootstrapping aspect of Grails is pretty compelling -- download a&lt;br /&gt;single tarball and *poof*, instant app. It, however, is running Jetty&lt;br /&gt;and HSQLDB. I haven't played with hooking it up to an external db, or&lt;br /&gt;running it in another servlet container, but that certainly&lt;br /&gt;diminishes the "out of the box" / time-to-production. Of course, this&lt;br /&gt;is pretty much a one-time cost.&lt;br /&gt;&lt;br /&gt;Creating initial views is pretty easy (grails generate-all), but hand&lt;br /&gt;editing them takes some time and coordination. If you don't like the&lt;br /&gt;default ordering of the fields, for example, you need to hand edit&lt;br /&gt;list.gsp, edit.gsp, view.gsp, new.gsp, etc. If you add a single new&lt;br /&gt;field to the table, there is no clean/automated way to migrate your&lt;br /&gt;views as well. This is an ongoing cost.&lt;br /&gt;&lt;br /&gt;I think the biggest win is letting Grails handle all of the&lt;br /&gt;"plumbing" issues for you -- Spring, Hibernate once again.&lt;br /&gt;Infrastructure like that getting autogenerated is huge.&lt;br /&gt;&lt;br /&gt;&gt; How about ROR by comparison?&lt;br /&gt;Much more mature, and I think at this stage of the game it has a&lt;br /&gt;better coordination/migration story for iteratively adding fields and&lt;br /&gt;keeping your model and view in sync. For green-field development with&lt;br /&gt;no ties to Java, it's a pretty compelling story.&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-117345896089412353?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/117345896089412353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=117345896089412353' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/117345896089412353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/117345896089412353'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2007/03/holy-grails.html' title='The Holy Grail(s)  UPDATED'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-115989532989616349</id><published>2006-10-03T09:33:00.001-07:00</published><updated>2007-03-09T10:28:12.823-08:00</updated><title type='text'>W2I</title><content type='html'>I have recently made my independent business more official, I have a card and everything:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5345/959/1600/bridge-card.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/5345/959/400/bridge-card.jpg" alt="" border="0" /&gt;&lt;/a&gt;I help clients as an independent:  either as a highly productive hands-on contributor, or by acting as their Solution Architect and "General Contractor" for software Design and Development.  Java, Ruby, Groovy...  Architecture, design, project management...  I can help get it done.&lt;br /&gt;&lt;br /&gt;With over 13 years as a Developer and Manager, I know how to get projects done, and who to put on the team.  I can provide the quality skills that full-service shops offer, at independent contractor rates.  With my network of talented professionals, I can get it done on sites and applications from $500 to $50,000.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;For more information on me and what I do, you can browse to &lt;a href="http://architechie.blogspot.com/2006/04/shameless-promotion-4-rapid-affordable.html"&gt;Rapid and Affordable Development&lt;/a&gt; or take a look at my &lt;a href="http://architechie.blogspot.com/2005/08/shameless-promotion-2-johns-resume.html"&gt;Resume&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;- John&lt;br /&gt;&lt;a href="mailto:jtroxel@yahoo.com"&gt;jtroxel@yahoo.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-115989532989616349?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/115989532989616349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=115989532989616349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/115989532989616349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/115989532989616349'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2006/10/w2i_03.html' title='W2I'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-115881157484618498</id><published>2006-09-20T21:05:00.000-07:00</published><updated>2006-11-08T08:38:51.583-08:00</updated><title type='text'>What's So Great About Rails?</title><content type='html'>OK, so now I guess I am becoming a "Rails Guy."  At least, I have been doing some Ruby on Rails programming lately and am generally very impressed.&lt;br /&gt;&lt;br /&gt;It is still Web programming, there are no major paradigm shifts here.  However, Ruby on Rails is an example of how a lot of little things done right can really add up.   Ruby is a fine scripting language, improving upon popular languages like Perl and Python.   And Rails is an example of getting the little details of Web programming right.  Rails is optimized (as I see it) for (1) Productivity and (2) Maintainability.  The following are what I really like:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The clean, simple ActiveRecord ORM layer.&lt;/li&gt;&lt;li&gt;A full-fledged yet simple MVC that is easy to comprehend and get around in.&lt;/li&gt;&lt;li&gt;Sensible defaults and very little configur-bation; "convention over configuration."&lt;/li&gt;&lt;li&gt;A good job of making the most common tasks simple; the 80/20 rule.&lt;/li&gt;&lt;li&gt;"rake migrate" is the coolest way to manage schemas that I have seen.&lt;/li&gt;&lt;/ul&gt;So, is Rails the answer to everything?  Of course not, you won't find sweeping generalizations here.  As always, it depends on *specific* requirements.  Ruby and Rails are geared toward fast and simple development and maintenance.  Java and JEE technologies generally have not prioritize these factors as highly as Enterprise requirements, e.g. massive scalability, security, etc.  And I am not saying that one or the other stack is incapable of solving a kind of problem, rather that it is a matter or priorities, focus, and fit.&lt;br /&gt;&lt;br /&gt;So I do like Rails a lot, I think it is probably the best solution for many small-medium sized webapps.  But it is not necessarily a replacement for Java, especially in the enterprise.   The trick is for decision-makers to weight their needs for big E Enterprise requirements against speed and simplicity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-115881157484618498?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/115881157484618498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=115881157484618498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/115881157484618498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/115881157484618498'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2006/09/whats-so-great-about-rails.html' title='What&apos;s So Great About Rails?'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-115872564348130947</id><published>2006-09-19T20:59:00.000-07:00</published><updated>2006-09-19T21:39:57.843-07:00</updated><title type='text'>Productive Editing and Eclipse</title><content type='html'>I went to a great presentation by Neal Ford last week at the DJUG, entitled the &lt;a href="http://www.nealford.com/downloads/conferences/2006_nfjs_canonical/Neal_Ford-The_Productive_Programmer-slides.pdf"&gt;Productive Programmer&lt;/a&gt;.  Neal is a sharp guy, a good speaker,  and a solid thinker on improving productivity.  Go ahead and CRTL-Enter nealford in your address bar to check out his site (you'll see what I mean).&lt;br /&gt;&lt;br /&gt;The talk was a bit of a wake-up for me.  His premise is that the rise of the IDE has made programmers, well, lazy (my words, I don't think he went so far).  I realized that I have let some old but valuable skills languish in the past few years.  So Neal's talk has inspired me to sharpen the saw back up.  For example, I have made the decision that Ruby will be my scripting power tool moving forward (used to be Perl), and I will not shy away from opportunities to explore automation (even if it is initially just exercise).&lt;br /&gt;&lt;br /&gt;Another point that resonated with me was the idea of the "perfect" editor.  I do think that I am now as productive over all in Eclipse as I used to be in Emacs (with a side trip through NetBeans).  But Neal hit on two things that &lt;span style="font-weight: bold;"&gt;are&lt;/span&gt; missing:  Multiple cut/paste buffers (kill-loop in Emacs) and editor scripting.  Though I am intrigued by the lightweight JEdit, I am determined to stay in Eclipse and make the best of it.  I think that surely these two deficiencies can be addressed.&lt;br /&gt;&lt;br /&gt;On the multiple buffers front, I quickly came up with an answer that works for me:  &lt;a href="http://www.nakka.com/soft/clcl/index_eng.html"&gt;CLCL&lt;/a&gt;.  This tool is actually a utility that caches your Windows clipboard.  So CRTL-C still works like normal, but you can also reach back in time and paste something from 30 cuts ago.  Sounds trivial, but it can change the way you edit.&lt;br /&gt;&lt;br /&gt;As for the scripting integration, I haven't looked very far.  &lt;a href="http://www.jroller.com/page/prane"&gt;Prashant Rane's blog&lt;/a&gt; led me to &lt;a href="http://www.eclipse.org/dash/monkey-help.php?key=installing"&gt;Eclipse Monkey&lt;/a&gt;, which looks interesting--it's Javascript, which I can defnitely code.  I might keep looking, though, for something that provides editor hooks for Ruby, Groovy, or BeanShell.  I'll post again if I find the silver bullet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-115872564348130947?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/115872564348130947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=115872564348130947' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/115872564348130947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/115872564348130947'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2006/09/productive-editing-and-eclipse.html' title='Productive Editing and Eclipse'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-114616307325552295</id><published>2006-04-27T11:36:00.000-07:00</published><updated>2006-09-12T19:47:46.916-07:00</updated><title type='text'>Shameless Promotion 4: Rapid, Affordable Application Development</title><content type='html'>&lt;span style="font-family:verdana;"&gt;I am available to help Clients develop applications cheaply and quickly, applications that help them to reach more customers and reduce costs. I can help clients use the Web to make breakthroughs in marketing, sales, and operations.&lt;br /&gt;&lt;br /&gt;I have built dozens of successful applications for the Web and other environments. I can provide hands-on expertise across the software development lifecycle: from strategy and requirements to architecture and design to development and testing.  &lt;/span&gt;&lt;span style="font-family:verdana;"&gt;I also provide project management and "general contractor" services, so I can bring the right talent to the table for most any web development project.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;The following is a quick summary of the skills and capabilities I provide to help you achieve robust solutions quickly and at affordable rates:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Experience in online communication, eCommerce, and improving efficiencies.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Technical lead, architect, and developer experience on dozens of projects, including complex applications for Sheraton Hotels, Travelocity, Budget Rent-A-Car, and the Veteran's Administration.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Programming experience in Java (5+ years), C (3), VB/ASP (3), Perl (2), and lately Ruby.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Effective, hands-on skills as a software engineer, architect, and business/systems analyst.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;MBA and a Bachelor's in Computer Science.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Extensive network of software and Design professionals for general contracting services.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Very competitive rates, for myself and subcontractors.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;My &lt;/span&gt;&lt;a href="http://architechie.blogspot.com/2005/08/shameless-promotion-2-johns-resume.html"&gt;&lt;span style="font-family:verdana;"&gt;Resume&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; describes my skills in much more detail. I'd love to make your development project a huge success, drop me a line if you are interested.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;- John&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="mailto:jtroxel@yahoo.com"&gt;&lt;span style="font-family:verdana;"&gt;jtroxel@yahoo.com&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-114616307325552295?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/114616307325552295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=114616307325552295' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/114616307325552295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/114616307325552295'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2006/04/shameless-promotion-4-rapid-affordable.html' title='Shameless Promotion 4: Rapid, Affordable Application Development'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-114608638424028365</id><published>2006-04-26T14:00:00.000-07:00</published><updated>2007-05-11T05:40:25.666-07:00</updated><title type='text'>Software Success Factor #1:  Manage for Agility UPDATED</title><content type='html'>The ability of an organization to Manage for Agility is one of the most important success factors for modern software development. This factor encompasses the critical role that Management--or the project Client or Sponsor--plays in Iterative Development. In this post, I will attempt to address what this factor entails and how it is accomplished. I will also briefly recap why this management style is superior. I have yet to complete the &lt;a href="http://architechie.blogspot.com/2006/04/software-success-reference-model.html"&gt;Overview of the Reference Model&lt;/a&gt;, but Agile Management is so important that I wanted to flesh out this success factor first.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;What&lt;/span&gt;&lt;/strong&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_BfzztH3i2hI/RkRjkTHOg6I/AAAAAAAAAAc/HbuZFSUdLvo/s1600-h/AgileManagementOverview.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_BfzztH3i2hI/RkRjkTHOg6I/AAAAAAAAAAc/HbuZFSUdLvo/s400/AgileManagementOverview.jpg" alt="" id="BLOGGER_PHOTO_ID_5063281356328305570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Iterative development is perhaps the key attribute of modern software success, but without management support it is impossible. To manage for agility, leaders must go against many traditional management styles and ingrained practices. It is a natural for successful business people to try to avoid future change through detailed planning and up-front analysis, but changes are inevitable. Trusting the team and the process to produce the best solution, allowing the scope, the design, and even the process to &lt;em&gt;emerge&lt;/em&gt;, is what it means to Manage for Agility.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;How&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;To manage agile projects, sponsors must resist the desire to plan and design the entire project before starting any development. To be agile, management must instead embrace a flexible model that responds to changing requirements and an evolving understanding of the solution. Management must trust the process and the team to produce top quality software, without a relying on a rigid scope.&lt;br /&gt;&lt;br /&gt;Often it is the "commercial Model," contracts, SOWS, etc., that most influences the interaction between management and the project team. To manage for agility, the commercial model must provide for evolving scope and design. Put another way, attempting to fix the scope in agreements up-front is simply at odds with an agile style. When using consultants or contractors, a Time-And-Materials approach allows for the most agility, or the agreement can employ separate SOWs created at the start of each iteration. Another approach offered by Kent Beck is the use of "&lt;a href="http://www.plonesolutions.com/about/OptionalScopeContracts.pdf"&gt;Optional Scope Contracts&lt;/a&gt;."&lt;br /&gt;It is also important to understand that agile does not mean that no planning or requirements are done up front. The project still needs a first cut at the inventory of requirements--e.g. a Scrum backlog or a Use-case survey--that is the source from which iteration requirements are selected, refined, and built. An agile project can also develop a detailed, "pro-forma" project plan, but managers should not feel compelled to stick to the original as the team adjusts to accumulating change.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Why&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;Why should managers buy into this approach, when traditional project management techniques have worked on all kinds of projects, from construction to aerospace engineering? Because software development is fundamentally different from construction or engineering, and treating it like these disciplines magnifies the risk of failure, raises costs, and produces worse software.&lt;br /&gt;Change is unavoidable in Software Development, more so than most any field. &lt;a href="http://www.netobjectives.com/events/download/latest/dpaglenv_ppt.pdf"&gt;Alan Shalloway&lt;/a&gt; made the claim, at a recent &lt;a href="http://www.agiledenver.org/"&gt;Agile Denver&lt;/a&gt; meeting, that software development is not like building a bridge; it is more like building the &lt;em&gt;first&lt;/em&gt; bridge... or the design phase of a bridge project. An analogy is also often drawn between construction and software development. However, many experts claim that &lt;a href="http://www.flashline.com/Content/re/craftscience1.jsp?sid=1108371751587-3565825807-102#5"&gt;software development is essentially &lt;u&gt;&lt;strong&gt;all&lt;/strong&gt;&lt;/u&gt; design&lt;/a&gt; work, and the only step that is really like construction is the compile/build cycle.&lt;br /&gt;The highly successful &lt;a href="http://jeffsutherland.com/scrum/2004/05/early-history-of-scrum-first-scrum.html"&gt;Scrum process is based on proven new-product development&lt;/a&gt; processes used by Japanese companies. Indeed, the Scrum proponents and many others have claimed, accurately I believe, that software development is very like new product development. If we look at software development as roughly analogous to the design and development of a new kind of car, or a new consumer electronics gadget, it becomes clear that the nature of the process is unpredictable and should be managed accordingly. Agile management uses an &lt;a href="http://www.controlchaos.com/download/Living%20on%20the%20Edge.pdf"&gt;empirical&lt;/a&gt; process management approach to produce a better product. One need look no further for evidence than the difference between American cars and Japanese, at least until very recently.&lt;br /&gt;&lt;a href="http://alistair.cockburn.us/crystal/articles/asdboi/asd1businessofinnovation.htm"&gt;Alistair Cockburn expands on the idea&lt;/a&gt; of "responding to change over following a plan:"&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;...traditional process management—by continuous measurement, error identification, and process refinements—strove to drive variations out of processes. This approach assumes that variations are the result of errors. Today, while process problems certainly cause some errors, external environmental changes cause critical variations. Because we cannot eliminate these changes, driving down the cost of responding to them is the only viable strategy. Rather than eliminating rework, the new strategy is to reduce its cost.&lt;/p&gt;&lt;p&gt;[NOTE: I think he means &lt;em&gt;code&lt;/em&gt; rework--Big Up-Front planning and design &lt;em&gt;will&lt;/em&gt; result in more rework of other work products, assuming the effort is not wasted entirely as these products are abandoned.]&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;Business needs, priorities, understanding of user needs, expertise with the&lt;br /&gt;technical platform, market forces, and available technologies... All of these&lt;br /&gt;can and usually do change over the life of a project. Agile management rolls&lt;br /&gt;with these changes and capitalizes on them to make the best software possible.&lt;br /&gt;Smart project sponsors can use agile management to build better software for&lt;br /&gt;less money.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-114608638424028365?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/114608638424028365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=114608638424028365' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/114608638424028365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/114608638424028365'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2006/04/software-success-factor-1-manage-for.html' title='Software Success Factor #1:  Manage for Agility UPDATED'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_BfzztH3i2hI/RkRjkTHOg6I/AAAAAAAAAAc/HbuZFSUdLvo/s72-c/AgileManagementOverview.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-114503323144409346</id><published>2006-04-14T09:45:00.000-07:00</published><updated>2010-12-01T15:12:15.294-08:00</updated><title type='text'>The Software Success Reference Model - Overivew</title><content type='html'>&lt;p&gt;Here, again, is my Reference Model: a 30,000 ft. view of software success. This post will provide an overview of the categories from the model--sort of a &lt;em&gt;taxonomy&lt;/em&gt; of success. See my &lt;a href="http://architechie.blogspot.com/2006/03/software-development-success-reference.html"&gt;previous post&lt;/a&gt; for more information on how I derived this model.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://static.flickr.com/47/128448159_415fc1058e_o_d.gif"&gt;&lt;img src="http://static.flickr.com/47/128448159_415fc1058e_o_d.gif" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Groupings&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;Organization and Project Management&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;Perhaps this should be entitled simply Organization and Management. This grouping deals with factors that are beyond the scope of any project team--organization and management at the highest levels.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Project Team&lt;/strong&gt;&lt;br /&gt;These factors deal more specifically with the project team involved directly with producing the software.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Iterative Development&lt;/strong&gt;&lt;br /&gt;This category contains factors that relate to producing software in an iterative, incremental, adaptive manner.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Productive Culture&lt;/strong&gt;&lt;br /&gt;Factors dealing with the kind of people the Organization employs and how the Organization fosters a culture that promotes productivity.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Productive Practices&lt;/strong&gt;&lt;br /&gt;Specific practices that help the Project Team develop software efficiently.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Software Engineering (for Large Projects)&lt;/strong&gt;&lt;br /&gt;Factors necessary for projects with a large number of developers and/or critical consequences of failure.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Factors&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;strong&gt;Manage for Agility&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;This factor encompasses the critical role that Management--or the Client--plays in Iterative Development. Leadership must be willing to launch a project without detailed plans or specs, and trust the team and the process. Further, project clients must realize that the agile approach is a Good Thing, allowing the team to respond nimbly to a changing world, and producing more relevant software in less time. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Deliver Value Quickly &amp;amp; Often&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Another aspect of Iterative Development, this factor focuses on the ultimate goal of software development: working software. Teams must focus on producing working software from the very first iteration, and keeping implementation as relevant to the needs as possible by avoiding unnecessary interim work products and long time lags.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Continuously Learn &amp;amp; Optimize&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The final component of Iterative Development is the concept of continuous improvement. Iterations afford the team with the opportunity to exercise all lifecycle activities in short bursts. This means they can reflect, learn, and optimize their process and practices with each cycle.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Empower the Project Team&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Also solely in the Management arena, the client of the project must provide the project team with the tools, resources, and support necessary to succeed. As much as possible, the team must be allowed to organize and direct itself however necessary to deliver the requirements.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Enable Open Communication&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-weight: normal;"&gt;Software development is inherently a team design activity.  Communicating ideas and building a shared mental model of the solution are critical.  Organizations must strive to achieve &lt;a href="http://c2.com/cgi/wiki?OsmoticCommunication"&gt;"osmotic" communication&lt;/a&gt;, provide access to experts, and involve users throughout the process.&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Demand Quality&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;Teams must develop a high standard of quality as a norm, and internalize quality validations within the team, rather than "throwing" code "over the wall."&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Use More Realistic Specification(s)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Just as a picture is worth a thousand words, the richer, higher-fidelity one can achieve in software specifications the better.  Teams should use mock-ups, prototypes, and visual models as much as possible, while still constraining specification to whatever is "minimally sufficient" for the current increment.&lt;br /&gt;&lt;/p&gt;&lt;p style="font-weight: bold;"&gt;Use Automation and Tracking Tools&lt;/p&gt;&lt;p&gt;The value of SCM, task &amp;amp; issue tracking, automated tests, etc. is well established.  Just do it.&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;TODO:  &lt;/span&gt;Software Engineering factors&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-weight: normal;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-114503323144409346?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/114503323144409346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=114503323144409346' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/114503323144409346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/114503323144409346'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2006/04/software-success-reference-model.html' title='The Software Success Reference Model - Overivew'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-114133182763526036</id><published>2006-03-02T11:45:00.000-08:00</published><updated>2007-01-05T11:39:41.336-08:00</updated><title type='text'>Software Development Success Reference Model - Background</title><content type='html'>What does it take to run a successful software development project? Success does not come easy, but it can be done. The industry has many success stories, and software development thought leaders have identified the key principles that lead to success. But what are &lt;em&gt;the&lt;/em&gt; critical success factors, and what principles find common ground among the experts?&lt;br /&gt;&lt;br /&gt;About 6 months ago, &lt;a href="http://architechie.blogspot.com/2005/09/main-things-for-software-projects.html"&gt;I started trying to create a set of success factors&lt;/a&gt; that were synthesized from the experts. I have since completely revamped my thoughts. What I ultimately want, for my own purposes, is a "Reference Model" (e.g. the &lt;a href="http://en.wikipedia.org/wiki/OSI_model#Description_of_OSI_layers"&gt;OSI 7-Layer&lt;/a&gt; Model) that provides some structure with which I can I can think and talk about the various factors that lead to success--independent of any specific methodologies. I hope to be able to say things like "Reflection Workshops in Crystal are one technique to Continuously Learn and Optimize," or "XP provides a system for Iterative Development and Proven Practices, focused on smaller Project Teams."&lt;br /&gt;&lt;br /&gt;I have now spent some more time thinking, and included some more popular, respected sources. The following slide is my Reference Model, a 30,000 ft. view of software success.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://static.flickr.com/43/109398457_1a06e7b2e6.jpg"&gt;&lt;img src="http://static.flickr.com/43/109398457_1a06e7b2e6.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In future posts, I will provide more details on the individual success factors and how they relate to the work of industry luminaries. So, how did I arrive at this model? I started by taking the most important, highest-level principles and factors from the following excellent resources:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The Standish Group's &lt;a href="http://www.standishgroup.com/chaos/intro2.php"&gt;CHAOS study&lt;/a&gt; [CH1..9]&lt;/li&gt;&lt;li&gt;The &lt;a href="http://www.amazon.com/gp/product/0201571692/sr=8-1/qid=1141331761/ref=sr_1_1/104-3772356-5388753?%5Fencoding=UTF8"&gt;Unified Process&lt;/a&gt; or &lt;a href="http://www-128.ibm.com/developerworks/rational/library/content/RationalEdge/jan01/WhatIstheRationalUnifiedProcessJan01.pdf"&gt;RUP&lt;/a&gt; [RUP-1..6]&lt;/li&gt;&lt;li&gt;The SCRUM meta-process (&lt;a href="http://www.controlchaos.com/"&gt;web&lt;/a&gt;, &lt;a href="http://www.amazon.com/gp/product/0130676349"&gt;book&lt;/a&gt;) [SC-1..4]&lt;/li&gt;&lt;li&gt;Alistair Cockburn and Crystal methods (&lt;a href="http://alistair.cockburn.us/"&gt;web&lt;/a&gt;, &lt;a href="http://www.amazon.com/gp/product/0201699699"&gt;book&lt;/a&gt;, &lt;a href="http://www.amazon.com/gp/product/0201498340"&gt;book&lt;/a&gt;) [AC-1..7]&lt;/li&gt;&lt;li&gt;eXtreme Programming (&lt;a href="http://www.extremeprogramming.org"&gt;web&lt;/a&gt;, &lt;a href="http://www.xprogramming.com"&gt;web&lt;/a&gt;, &lt;a href="http://www.amazon.com/gp/product/0201616416"&gt;book&lt;/a&gt;) [XP-1..5]&lt;/li&gt;&lt;li&gt;My own experience on dozens of successful projects [JT-1..6]&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There were several steps between extracting the critical success factors from these sources and defining my "nutshell" view, but the following slide captures the start of my reasoning. This is an "affinity diagram" that attempts to consolidate all the factors into logical groupings.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://static.flickr.com/30/109408444_8a6c21482e_o.gif"&gt;&lt;img src="http://static.flickr.com/30/109408444_8a6c21482e_o.gif" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Comments are most welcome.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-114133182763526036?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/114133182763526036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=114133182763526036' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/114133182763526036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/114133182763526036'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2006/03/software-development-success-reference.html' title='Software Development Success Reference Model - Background'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-113700471108233163</id><published>2006-01-11T10:24:00.000-08:00</published><updated>2006-02-10T16:57:28.766-08:00</updated><title type='text'>New Frontiers of Enterprise Java Development</title><content type='html'>I've been thinking lately about trends in enterprise software development, especially in the Java world. Overall, what I see is a change in priority for enterprise software projects: from struggling not to fail completely, to actually excelling and &lt;strong&gt;competing. &lt;/strong&gt;The latest technology and tools, along with modern "Agile" development methods, enable companies to really compete on quality and functionality, efficiency and productivity. Smart development organizations can not only avoid failure, but deliver better software more efficiently.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Background:&lt;/span&gt;&lt;br /&gt;In the mid-90s, the ubiquitous distribution and instant maintenance capabilities of Web-based applications pushed them to the forefront. When applications moved beyond brochure-ware, a significant problem arose: Teams developing Web-apps could not readily achieve the enterprise requirements, or qualities, necessary for success: performance, scalability, security, etc. So, most of the effort and money spent by development teams went to achieving the necessary enterprise qualities.&lt;br /&gt;&lt;br /&gt;Teams also struggled with process in the 90s, and to a large extent still do. The fast and loose style of early Web development did not work for mission critical apps, and traditional Methodologies did not work for Web teams. Furthermore, I think the frenetic rate of business and technical change finally killed the notion of viability of traditional, waterfall processes, at least for shops that "got it. "&lt;br /&gt;&lt;br /&gt;By the late 90s, the major Web application platforms, like J2EE and compliant app. Servers, made it &lt;u&gt;practical&lt;/u&gt; to address Enterprise requirements--although not easy or efficient. In addition, the effects of Moore's Law have made it much cheaper to throw more hardware at a solution, reducing the effort involved to handle the scale of enterprise apps. At the same time, Agile project management approaches began to gain visibility, blending the engineering-like discipline with the creative nature of software development.&lt;br /&gt;&lt;br /&gt;In 2006, I contend, the development tools and frameworks for Web development have largely caught up to the platforms. Creating a robust, scalable, enterprise app no longer necessitates an army of J2EE coders rolling EJBs by hand. Looking forward, ISVs and IT shops just don't have to focus as much on addressing enterprise requirements*. Nor do teams need to struggle with heavy Methodologies--there are new mountains to climb. It is time for Web application development to grow up and act like "real" product development.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Competing with Agile Project Management:&lt;/span&gt;&lt;br /&gt;Today, I think any manager who doesn't at least vaguely acknowledge the benefits of an Iterative or &lt;a href="http://www.agilealliance.com/intro"&gt;Agile&lt;/a&gt; project management approach has been hiding under a rock for several years. Some managers even claim to use these approaches, although few really do it right. Just because a team breaks up the coding for a project into increments, doesn't mean that they are Agile.&lt;br /&gt;&lt;br /&gt;To improve productivity with process, management must get away from the compulsion to scope, define, and plan the entire project up front. Rather, they must accept and embrace two essential facts:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Needs and requirements will change constantly during the project; and&lt;/li&gt;&lt;li&gt;User needs, technological pitfalls, and team capabilities will never be adequately or accurately understood until the team has gone through the complete lifecycle with one or more slices of the working system.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Yes, it's a catch-22 situation: Managers have to accept that reality. Managers must embrace change, accept the &lt;a href="http://www.controlchaos.com/old-site/debate.htm"&gt;empirical&lt;/a&gt; nature of the software development process, and stop trying to do all the planning and specification work up-front. Companies still trying to use linear, silo'd, paper-heavy methods for Web-based apps are dead, whether they realize if or not. To increase productivity, and reduce costs and time-to-market, managers must truly understand and utilize Agile management. I personally think that &lt;a href="http://alistair.cockburn.us/"&gt;Alistair Cockburn&lt;/a&gt;'s work on Agile development is the most comprehensible. &lt;a href="http://www.controlchaos.com/"&gt;Scrum&lt;/a&gt; is perhaps the best overarching management view, and &lt;a href="http://www.extremeprogramming.org/"&gt;XP&lt;/a&gt; provides a system of proven team practices.&lt;/p&gt;Another project management "move" that can greatly reduce development cycle times is rapid prototyping. Simply put, exploring and defining requirements with documents is a relatively poor way of getting the system right. More productive projects user "richer" media for definition and validation, and &lt;em&gt;the&lt;/em&gt; richest vehicle is a working prototype. For example, a team can develop a &lt;a href="http://www.rubyonrails.org/"&gt;Ruby on RAILs&lt;/a&gt; prototype to quickly and cheaply explore and validate the functional requirements. Another powerful option for rapid prototyping and validation is &lt;a href="http://www.gorillalogic.com/"&gt;Gorilla Logic&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The working prototype provides much more comprehensible, complete, and unambiguous information than stacks of documentation, which saves a ton of wasted work downstream. If one accepts that an iteration or increment can be thrown away, then prototyping fits very nicely with Agile methods.&lt;br /&gt;&lt;br /&gt;Though not strictly a project management move, I also think that automation has tremendous potential to make teams more competitive. That will be the subject for another post. For now, I will simply say that I think that &lt;a href="http://xdoclet.sourceforge.net/xdoclet/index.html"&gt;XDoclet&lt;/a&gt; is definitely a tool that teams should look at using and extending... and &lt;a href="http://www.omg.org/mda/"&gt;MDA&lt;/a&gt; tools like &lt;a href="http://www.andromda.org/"&gt;AndroMDA&lt;/a&gt; show some potential as well.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Competing with Richer User Interfaces&lt;/span&gt;&lt;br /&gt;Along with the powerful distribution and update benefits of the Web came with a catch: The capabilities of a browser-based interface, though often visually attractive, are weak. Things like tree browsers, master-detail views, and fine control over interface widgets have generally been painful to achieve. Teams did not have time to work around these issues, and the user experience suffered.&lt;br /&gt;&lt;br /&gt;Now that the technologies are available that help to take care of enterprise issues with much less effort, teams can make there applications better with richer user interfaces. &lt;a href="http://en.wikipedia.org/wiki/Ajax_(programming)"&gt;AJAX&lt;/a&gt;, a technique for making asynchronous HTTP requests in the javascript for a page, seems to be a very hot technology of late. For applications that require a highly graphical look and feel, along with better usability, &lt;a href="http://www.macromedia.com/software/flex/"&gt;Macromedia Flex&lt;/a&gt; is strong player. But the next great client platform, I believe, is &lt;a href="http://wiki.eclipse.org/index.php/Rich_Client_Platform"&gt;Eclipse RCP&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;*NOTE: I also think that tools Ruby on RAILS, PHP, ColdFusion, etc. might now present a viable challenge to J2EE and .NET in the Enterprise space, with the right hardware.&lt;br /&gt;&lt;br /&gt;**NOTE: I really don't have a feel for what is going on in the Microsoft/.NET world. However, to their credit, I think Microsoft has &lt;em&gt;always&lt;/em&gt; focused more on productivity than on Enterprise requirements (e.g. VB). How successful they have been on this front is a matter of debate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-113700471108233163?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/113700471108233163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=113700471108233163' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/113700471108233163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/113700471108233163'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2006/01/new-frontiers-of-enterprise-java.html' title='New Frontiers of Enterprise Java Development'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-113345470290867516</id><published>2005-12-01T08:28:00.000-08:00</published><updated>2006-01-10T08:27:04.806-08:00</updated><title type='text'>Implementing the Value List Page Iterator Pattern</title><content type='html'>UPDATE:  &lt;a href="http://acn.waw.pl/mtl/resources/DistributedRowSetIterator.pdf"&gt;Brad Long's Article is now found here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I have come across a situation that warrants the use of the "Value List Page Iterator" pattern. First off, the official name is the "Value List Handler," previously known as the "Page-by-Page Iterator." The pattern is part of the &lt;a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/ValueListHandler.html"&gt;Core J2EE Patterns from Sun&lt;/a&gt;. I have chosen to use the name "Value List Page Iterator" because the other two names miss the main points: &lt;em&gt;iterating&lt;/em&gt; over a value list grouped into &lt;em&gt;pages&lt;/em&gt;. The context is situations where a query can return more results than can be presented on one screen, the solution is to allow the user to page through results, like with your typical Web search engine.&lt;br /&gt;&lt;br /&gt;The code part of the pattern is simple enough, and the data access is nothing fancy--as long as the query is pretty quick, and/or it is acceptable for the app to keep all the results in memory. In my case, the query takes minutes and can return potentially millions of results. I need something that "slices" the data from the db into manageable chunks. &lt;a href="http://uqconnect.net/~zzblong/pattern.pdf"&gt;Brad Long of Oracle &lt;/a&gt;has written up a pretty &lt;a href="http://uqconnect.net/~zzblong/pattern.pdf"&gt;comprehensive treatment of database slicing&lt;/a&gt; strategies and offers his own variant of the pattern. Brad nails down the best way to do a slicing query, which I have tweaked:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;SELECT *&lt;br /&gt;FROM (SELECT ROWNUM RNUM, INLINE_VIEW.* FROM&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;(&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;your-select&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;your-where&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;and &lt;em&gt;key-or-order-by-field&lt;/em&gt; &gt; &lt;em&gt;lower-boundary&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;[order by &lt;em&gt;order-by-field&lt;/em&gt;]&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;) INLINE_VIEW&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;)&lt;br /&gt;WHERE RNUM &lt; &lt;em&gt;max-range&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;My current problem is that the row-limited (sliced) query takes just as long as the full query. So unless I can figure out some way to effectively cache the query in the database, I am still faced with either sticking all of the results in memory, or taking the performance hit of executing the query multiple times. I am also thinking about a hybrid solution, where I guess at the most likely initial pages and get those at once, then re-execute the query if the user navigates outside the initial results.&lt;br /&gt;&lt;br /&gt;More to come...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-113345470290867516?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/113345470290867516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=113345470290867516' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/113345470290867516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/113345470290867516'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/12/implementing-value-list-page-iterator.html' title='Implementing the Value List Page Iterator Pattern'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-112985253403389889</id><published>2005-10-20T16:54:00.000-07:00</published><updated>2005-10-21T15:41:57.520-07:00</updated><title type='text'>More on Composition versus Inheritance</title><content type='html'>Is there any more basic OO design decision than this? I started off, like many newer OO programmers, writing code with a lot of concrete inheritance. After some painful lessons and more reading, I now lean heavily toward using composition. So OK. How do we nail down exactly when to use which approach?&lt;br /&gt;&lt;a href="http://www.javaworld.com/javaworld/jw-11-1998/jw-11-techniques_p.html"&gt;&lt;br /&gt;Bill Venners writes about this in JavaWorld&lt;/a&gt;. The key criteria to consider is whether the relationship is really an “is-a” relationship, and just &lt;em&gt;how strong&lt;/em&gt; the is-a &lt;em&gt;is&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;Make sure inheritance models the is-a relationship [...]&lt;/p&gt;&lt;p&gt;An important question to ask yourself when you think you have an is-a relationship is whether that is-a relationship will be constant throughout the lifetime of the application and, with luck, the lifecycle of the code. For example, you might think that an Employee is-a Person, when really Employee represents a role that a Person plays part of the time. What if the person becomes unemployed? What if the person is both an Employee and a Supervisor? Such impermanent is-a relationships should usually be modeled with composition.&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;He continues to point out that both code-reuse and polymorphism can be achieved with composition, and should not be a reason to use inheritance without a strong is-a relationship.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://today.java.net/pub/a/today/2005/10/3/interfaceSQ5.html?page=last"&gt;java.net hosts a discussion on the topic&lt;/a&gt;. A common approach is to code using interfaces, and use concrete inheritance in the implementations--in other words, use composition (with interfaces) in your design, use inheritance (for re-use or polymorphism) in the implementation.  The is-a rule would still apply to the implementations, of course.&lt;br /&gt;&lt;p&gt;&lt;a href="http://today.java.net/pub/a/today/2005/10/3/interfaceSQ5.html?page=last"&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-112985253403389889?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/112985253403389889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=112985253403389889' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112985253403389889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112985253403389889'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/10/more-on-composition-versus-inheritance.html' title='More on Composition versus Inheritance'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-112932075496907770</id><published>2005-10-14T12:38:00.000-07:00</published><updated>2010-12-06T08:44:35.087-08:00</updated><title type='text'>OO Design Principles: a Quick Rundown</title><content type='html'>I wanted to collect some good resources on basic OO design principles, with brief summaries of each, so that I have everything in one place. I hope to ultimately distill these into a one-page "crib sheet.'&lt;br /&gt;&lt;br /&gt;Some of the best wisdom in OO design is captured by the Gang of Four. Artima has an &lt;a href="http://www.artima.com/lejava/articles/designprinciples.html"&gt;interview with Erich Gamma&lt;/a&gt; where he discusses the core principles from the intro of Design Patterns:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Program to an Interface, not an Implementation&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Once you depend on interfaces only, you're decoupled from the implementation. That means the implementation can vary, and that's a healthy dependency relationship. &lt;/blockquote&gt;&lt;br /&gt;Rod Johnson expands on this idea in &lt;a href="http://www.theserverside.com/articles/content/RodJohnsonInterview/JohnsonChapter4.pdf"&gt;Chapter 4 of the pre-Spring book&lt;/a&gt;, and provides some very well-phrased guidelines:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;Program to interfaces, not classes. This decouples interfaces from their implementations. Using loose coupling between objects promotes flexibility. &lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;A few of the many advantages of an interface-based approach include: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;The ability to change the implementing class of any application object without affecting calling code. This enables us to parameterize any part of an application without breaking other components.&lt;/li&gt;&lt;li&gt;Total freedom in implementing interfaces. There's no need to commit to an inheritance hierarchy. However, it's still possible to achieve code reuse by using concrete inheritance in interface implementations.&lt;/li&gt;&lt;li&gt;The ability to provide simple test implementations and stub implementations...&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;Turning back to the Gamma interview...&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Favor object composition over class inheritance&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;Composition has a nicer property. The coupling is reduced by just having some smaller things you plug into something bigger... In a subclass you can make assumptions about the internal state of the superclass when the method you override is getting called. When you just plug in some behavior, then it's simpler. That's why you should favor composition. &lt;p&gt;Mr. Johnson expands:&lt;/p&gt;&lt;p&gt;To clarify the distinction, let's consider what we want to achieve by inheritance. Abstract inheritance enables polymorphism: the substitutability of objects with the same interface at run time. This delivers much of the value of object-oriented design... Concrete inheritance enables both polymorphism and more convenient implementation.&lt;/p&gt;...Interface inheritance (that is, the implementation of interfaces, rather than inheritance of functionality from concrete classes) is much more flexible than concrete inheritance.&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.butunclebob.com/ArticleS.UncleBob.PrinciplesOfObjectOrientedDesign"&gt;Robert Martin &lt;/a&gt;is another thought leader on core principles, has defined several core principles including the following: &lt;/p&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;[NOTE: Still under development]&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The Single Responsibility Principle (SRP)&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;There should never be more than a single reason to change a class... Changes to one responsibility may impact other responsibilities.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Open Closed Principle (OCP)&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;A module should be open for extension but closed for modification&lt;/p&gt;&lt;p&gt;Should be able to add behavior without modifying common behavior&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Liskov Substitution Principle (LSV)&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Subclasses should be substitutable for their base classes&lt;/p&gt;&lt;/blockquote&gt;&lt;strong&gt;The Interface Segregation Principle (ISP)&lt;/strong&gt;&lt;blockquote&gt;&lt;p&gt;Interfaces shouldn't have stuff that their clients don't need... Factor interfaces so that clients can use just relevant members&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;The Law of Demeter&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Only talk to your friends who share your concerns... Never call a method on an object that you got from another call or on a global object.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;a href="http://c2.com/cgi/wiki?LawOfDemeter"&gt;http://c2.com/cgi/wiki?LawOfDemeter&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.ccs.neu.edu/home/lieber/LoD.html"&gt;http://www.ccs.neu.edu/home/lieber/LoD.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://c2.com/cgi/wiki?LawOfDemeterRevisited"&gt;http://c2.com/cgi/wiki?LawOfDemeterRevisited&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The Dependency Inversion Principle&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Modules  should depend on abstractions, not concrete modules... Details  [controllers?] should depend on abstractions, not the other way around.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;"Inversion" in contrast to structured, procedural thinking.&lt;/p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-112932075496907770?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/112932075496907770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=112932075496907770' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112932075496907770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112932075496907770'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/10/oo-design-principles-quick-rundown.html' title='OO Design Principles: a Quick Rundown'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-112896017121591390</id><published>2005-10-10T08:58:00.000-07:00</published><updated>2005-10-13T13:57:03.953-07:00</updated><title type='text'>Garbage Collection is still important</title><content type='html'>I think in J2EE, it is easy to get away from the basics of solid Java programming, assuming that the container will take care of the hard stuff for us.  Understanding how GC works, however, can be crucial for J2EE applications, expecially high volume or long running runs. I don't know about you, but I might need to brush up on this stuff.&lt;br /&gt;&lt;br /&gt;Simon Roberts delivered a great primer on the topic to the &lt;a href="http://www.denverjug.org/wiki/Wiki.jsp?page=OOASIG"&gt;DJUG Architecture SIG&lt;/a&gt; last week, we'll try to get &lt;a href="http://www.denverjug.org/meetings/meetings_05.jsp"&gt;slides up on the archive &lt;/a&gt;soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-112896017121591390?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/112896017121591390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=112896017121591390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112896017121591390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112896017121591390'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/10/garbage-collection-is-still-important.html' title='Garbage Collection is still important'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-112748791136228402</id><published>2005-09-23T08:03:00.000-07:00</published><updated>2005-10-13T14:00:15.536-07:00</updated><title type='text'>The Main Things for Software Projects</title><content type='html'>&lt;a href="http://photos1.blogger.com/blogger/5345/959/1600/SWTheMainThing2.gif"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/5345/959/400/SWTheMainThing1.gif" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The preceding is a summary slide from a deck I am using to clarify my own approach to methodology. It is a synthesis of recommendations from the CHAOS report, Alistair Cockburn, and my own experience.&lt;br /&gt;Essentially, I mapped out the lists of "main things," or critical success factors, provided by CHAOS and Mr. Cockburn, and also made my own list. Then I went through an exercise of correlating and consolidating. This is where I ended up.&lt;br /&gt;I think this checklist provides a concise, strategic guide for improving a project's chance of success. More useful still would be individual guides that provide tactical guidance for each of these, probably mapped against key project variables (like Alistair's team size and safety). I'll get right on this in my free time.&lt;br /&gt;I also think it would be interesting to check this list against other similar lists from other modern methodologies like RUP, XP, etc. &lt;a href="http://www.denverjug.org/meetings/files/200506_Rhythm.ppt"&gt;Rhythm&lt;/a&gt;, presented to the DJUG by Brian Boelsterli, looks like an interesting framework that might also have similar factors to consider.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-112748791136228402?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/112748791136228402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=112748791136228402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112748791136228402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112748791136228402'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/09/main-things-for-software-projects.html' title='The Main Things for Software Projects'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-112628150486448551</id><published>2005-09-09T08:58:00.000-07:00</published><updated>2005-10-13T14:10:05.573-07:00</updated><title type='text'>Rapid Prototyping and Development--Options</title><content type='html'>&lt;p&gt;In this post, I continue my analysis of rapid prototyping for Java Web apps. I see a few essential ingredients necessary for rapid prototyping:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Fast and simple development of pages and page flow: must be able to easily create pages, get parameters from a submission, do business stuff, go to the next page, and present dynamic data--without manually touching 12 different files.&lt;/li&gt;&lt;li&gt;Automation of basic CRUD activities: Even in complex apps, so much code fits a basic CRUD template. It is extremely helpful to be able to automate the first cut at this, by specifying model information once in the database, the code, or a neutral spec.&lt;/li&gt;&lt;li&gt;Quick develop/run cycles: If it takes 45 seconds to see a change to the width of a text field, rapid prototyping is in trouble.&lt;/li&gt;&lt;li&gt;Extensibility: Whatever cool automatic stuff is done for us, we need to be able deviate from the happy path and customize stuff.&lt;/li&gt;&lt;li&gt;Anything else I am missing?&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Are there Java technologies that allow developers to skip the enterprise stuff initially, and add it in later with a little refactoring?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;JSPs with code in the pages (or Velocity templates w/out the MVC, etc.): Good for 1 &amp;amp; 3, but ignores 2.&lt;/li&gt;&lt;li&gt;IDE / Graphical tools: E.g. Java Studio Creator (is there a comparable Eclipse plugin?).&lt;/li&gt;&lt;li&gt;Rife framework:&lt;/li&gt;&lt;li&gt;Trails framework:&lt;/li&gt;&lt;li&gt;Model Driven tools: I looked at &lt;a href="http://www.andromda.org/"&gt;AndroMDA &lt;/a&gt;a while back, and I don't remember it striking me as a tool for rapid prototyping. But it is probably worth another look. Since I started this post, I have come across &lt;a href="http://www.gorillalogic.com/"&gt;Gorilla Logic&lt;/a&gt;, which looks very intriguing.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Are non-Java tools, e.g. Ruby/RAILs, that allow for development that is so inexpensive that we are willing to throw the prototype away?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.rubyonrails.com/"&gt;RAILS &lt;/a&gt;claims a 10x productivity advantage over J2EE, and judging by their demo it is at least that. So even if Ruby CGI is insufficient for Enterprise requirements, you can create a throw-away that is worth the effort.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;To Be Continued...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-112628150486448551?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/112628150486448551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=112628150486448551' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112628150486448551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112628150486448551'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/09/rapid-prototyping-and-development_09.html' title='Rapid Prototyping and Development--Options'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-112628091554589426</id><published>2005-09-09T08:29:00.000-07:00</published><updated>2005-09-09T10:38:58.296-07:00</updated><title type='text'>Rapid Prototyping and Development--Questions</title><content type='html'>I've been thinking again about rapid prototyping and RAD tools for Web development. Perhaps it is because I have been working with Enterprise apps for a few years, with their focus on hard-core non-functional requirements (security, scalability), but I don't see much going on anymore. It seems to me that J2EE, and the various Java frameworks, are so focused on robustness and maintainability that rapid prototyping is nearly impossible.&lt;br /&gt;&lt;br /&gt;In the wild and whacky early days of Web development, it seemed that we got the functional requirements right, but then endured hell when our applications didn't perform or missed the mark on non-functional requirements. Why? Because we did very minimal requirements and immediately dived into scripting pages, essentially rapid prototyping. Now, as I see it, the Web world has inverted this situation: we have to do more requirements because it is more expensive to get working code in front of the user, but the technologies are more robust.  I contend that, in general, it has become more difficult to get the functionality right, and that we now have applications that are often over-engineered.&lt;br /&gt;&lt;br /&gt;I'd like to figure out how to re-introduce rapid prototyping into the realm of Java Web development. Here is what I think I need to figure out:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I see a few essential ingredients necessary for rapid prototyping: Fast and simple development of presentation code, automation of basic CRUD activities, and quick develop/run cycles. What else?&lt;/li&gt;&lt;li&gt;Are there Java technologies that allow developers to skip the enterprise stuff initially, and add it in later with a little refactoring?&lt;/li&gt;&lt;li&gt;Are non-Java tools, e.g. Ruby/RAILs, that allow for development that is so inexpensive that we are willing to throw it away?&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-112628091554589426?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/112628091554589426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=112628091554589426' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112628091554589426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112628091554589426'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/09/rapid-prototyping-and-development.html' title='Rapid Prototyping and Development--Questions'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-112413812117510685</id><published>2005-08-15T13:26:00.000-07:00</published><updated>2005-10-21T10:59:44.543-07:00</updated><title type='text'>Java Exception Prescription</title><content type='html'>What are truly the best practices for using Exceptions in Java? Should checked exceptions be the norm? How should the Exception classes be structured? In this posting I attempt to achieve a personal approach to using Exceptions.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime.html"&gt;Handling Exceptions&lt;/a&gt; from the Sun Java Tutorial, stresses the use of checked exceptions:&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;If a client can reasonably be expected to recover from an exception, make it a&lt;br /&gt;checked exception. If a client cannot do anything to recover from the exception,&lt;br /&gt;make it an unchecked exception&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Sun's view is probably the excepted wisdom. But some leading Java guys are rethinking this, like &lt;a href="Alan"&gt;Alan Griffiths&lt;/a&gt;, &lt;a href="http://www.mindview.net/Etc/Discussions/CheckedExceptions"&gt;Bruce Eckle&lt;/a&gt;, and &lt;a href="http://www.theserverside.com/articles/content/RodJohnsonInterview/JohnsonChapter4.pdf"&gt;Rod Johnson&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Code written using checked exceptions tends to exhibit a couple of problems: catch clauses are often stubbed out for expediency, leading to "swallowed" exceptions. Also, all calling code ends up bloating with handling for errors that the caller may not want/need to handle.&lt;/p&gt;&lt;p&gt;Why not let callers catch what they want, otherwise let the error propogate up the chain? Rod defines the following rule of thumb from when &lt;em&gt;to&lt;/em&gt; use a checked exception:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Should all callers handle this problem? Is the exception essentially a second return value for the method? &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;For Example,&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Spending limit exceeded in a processInvoice() method&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;I seems to me right now that this is the way to go.  Basically, &lt;strong&gt;throw checked&lt;/strong&gt; if the &lt;strong&gt;caller can and should do something&lt;/strong&gt; about it, &lt;strong&gt;otherwise throw unchecked&lt;/strong&gt;. &lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-112413812117510685?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/112413812117510685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=112413812117510685' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112413812117510685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112413812117510685'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/08/java-exception-prescription.html' title='Java Exception Prescription'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-112370120154682465</id><published>2005-08-10T12:11:00.000-07:00</published><updated>2005-09-09T09:26:26.586-07:00</updated><title type='text'>Looking at Spring</title><content type='html'>I have found that I can no longer resist the Spring Framework. Having been beguiled by its popularity and intrigued by its principals, I have decided to spend some time checking it out. The following chronicles my findings.&lt;br /&gt;&lt;br /&gt;First, I am really interested in some of the underlying design goals, for which I turn to &lt;a href="http://www.theserverside.com/articles/content/RodJohnsonInterview/JohnsonChapter4.pdf"&gt;Chapter 4 of Rob's book, at the ServerSide&lt;/a&gt;.  Spring aside, this is just a great essay on OO design.&lt;br /&gt;&lt;br /&gt;So far I am impressed.  Dependency Injection is just too sensible, and makes TDD much more practical.&lt;br /&gt;&lt;br /&gt;To Be Continued...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-112370120154682465?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/112370120154682465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=112370120154682465' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112370120154682465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112370120154682465'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/08/looking-at-spring.html' title='Looking at Spring'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-112352328626185356</id><published>2005-08-08T10:39:00.000-07:00</published><updated>2007-03-12T16:45:29.186-07:00</updated><title type='text'>Shameless Promotion 3:  John in a Nutshell</title><content type='html'>&lt;p&gt;I am a software development expert who can contribute directly to successful application development, and also make broader contributions to an organization's success:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;I know how to develop software with maximum value for any timeframe and budget.&lt;/li&gt;&lt;li&gt;I am a versatile professional who can fulfill many roles... roles often requiring several resources.&lt;/li&gt;&lt;li&gt;I am a highly productive contributor, I can get solutions done quickly. &lt;/li&gt;&lt;/ul&gt;I have top notch software development skills--coding expertise in &lt;strong&gt;Java&lt;/strong&gt; and experience in &lt;strong&gt;C&lt;/strong&gt;, &lt;strong&gt;Perl&lt;/strong&gt;, &lt;strong&gt;VB&lt;/strong&gt;, and &lt;span style="font-weight: bold;"&gt;Ruby&lt;/span&gt;; &lt;strong&gt;architecture&lt;/strong&gt;, &lt;strong&gt;analysis&lt;/strong&gt;, and &lt;strong&gt;design&lt;/strong&gt; skills; and competence with a host of acronyms (&lt;strong&gt;UML&lt;/strong&gt;, &lt;strong&gt;J2EE&lt;/strong&gt;, &lt;strong&gt;SOAP&lt;/strong&gt;, &lt;strong&gt;SQL&lt;/strong&gt;, &lt;strong&gt;TDD, Ajax&lt;/strong&gt; etc.)&lt;br /&gt;&lt;br /&gt;Hands-on development is my foundation, but I have also worked hard to hone strong business skills: I have an &lt;strong&gt;MBA&lt;/strong&gt;, several years of line and technical project &lt;strong&gt;management&lt;/strong&gt; experience, and polished communication skills. I have led technical teams of 10 people, departments of around 20, and have countless hours interacting with Clients at all levels.&lt;br /&gt;&lt;br /&gt;Encompassing both my technical and business skill sets is an overarching &lt;strong&gt;expertise in software development&lt;/strong&gt;. This expertise is what enables me to deliver maximum value for any timeframe and budget. My unique combination of skills allows me to add strategic thinking and decision-making on top of a concrete, in-depth understanding of technology. This combination is also what enables me to fulfill so many roles; from developer to architect to resource manager and more.&lt;br /&gt;&lt;br /&gt;My &lt;a href="http://architechie.blogspot.com/2005/08/shameless-promotion-2-johns-resume.html"&gt;Resume&lt;/a&gt; and &lt;a href="http://architechie.blogspot.com/2005/08/shameless-promotion-1-johns-cover.html"&gt;generic Cover Letter&lt;/a&gt; describe my skills in much more detail.&lt;br /&gt;&lt;br /&gt;In terms of full-time positions, my mix of skills probably best matches a Principal Engineer, Architect, or Lead role with a small software company or consultancy. I am also very open to freelance work, where I can deliver on projects of all sizes. On top of software design and development, I can fulfill many of the crucial needs of a successful project:&lt;br /&gt;&lt;blockquote&gt;Planning, staffing, defining team structure and roles, scoping, defining development process and tools, prototyping, and architecture.&lt;/blockquote&gt;&lt;!-- p&gt;If my Savings account balance had more zeros, and if my wife and I were not &lt;a href="http://not-a-real-namespace/http://not-a-real-namespace/http://troxels.blogspot.com"&gt;proud new parents&lt;/a&gt;, I would love to start a company specifically to get new projects up and running with a solid team and foundation. I would likely need help with Bus. Dev. if I ever did move forward, but I digress. --&gt;&lt;br /&gt;As a consultant, I must always keep an eye out for the next gig. I'd love to discuss potential opportunities, whether in the planning stage or thereafter, Lead, freelancer, or other key role. If you are interested in someone like me, drop me a line.&lt;br /&gt;&lt;br /&gt;- John Troxel &lt;p&gt;&lt;/p&gt;&lt;p&gt;Denver, Colorado&lt;/p&gt;&lt;p&gt;&lt;a href="mailto:jtroxel@yahoo.com"&gt;jtroxel@yahoo.com&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-112352328626185356?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/112352328626185356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=112352328626185356' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112352328626185356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112352328626185356'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/08/shameless-promotion-3-john-in-nutshell.html' title='Shameless Promotion 3:  John in a Nutshell'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-112352170449417422</id><published>2005-08-08T10:15:00.000-07:00</published><updated>2011-05-25T11:02:09.287-07:00</updated><title type='text'>Shameless Promotion 2:  John's Resume</title><content type='html'>&lt;div align="left"&gt;John D. Troxel&lt;br /&gt;Wheat Ridge, CO | 303.355.1121 |  &lt;a href="mailto:jtroxel@yahoo.com"&gt;jtroxel@yahoo.com&lt;/a&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;br /&gt;&lt;u&gt;&lt;span style="font-size:130%;"&gt;Objectives&lt;/span&gt;&lt;/u&gt; &lt;/div&gt;&lt;div align="left"&gt;Opportunities to help companies outperform their competition with pragmatic software solutions.&lt;br /&gt;To deliver effective business solutions using my unique software engineering expertise.&lt;br /&gt;To provide the leadership in analysis, architecture, design, and engineering necessary to successfully get software to market.&lt;/div&gt;&lt;p align="left"&gt;&lt;u&gt;&lt;span style="font-size:130%;"&gt;Skills Summary&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;BS Computer Science, MBA / MIS with over 15 years of software development experience, specializing in Web-based applications&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Programming: Java, Javascript, Groovy, Ruby, C, Perl, JSP, Visual Basic,  Rails, Grails, AJAX, STRUTS, Spring, Maven, MySql, Oracle, MS SQL  Server, JBoss, Tomcat&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Software engineering methodologies, processes, and tools: UML, Requirements Analysis and Management, Agile methods, Unified Process (RUP). Object design (OOAD), system and software architecture, Open Source, SCEA, SCJP, Rational Certified Consultant RUP/OOAD&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Technical line and project management, organization design, team mentoring&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;u&gt;&lt;span style="font-size:130%;"&gt;Professional Experience&lt;/span&gt; &lt;/u&gt;&lt;/p&gt;&lt;p&gt;Rearden Commerce, Foster City, California&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Principal Software Engineer -- &lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;strong&gt;March 2011 &lt;/strong&gt;&lt;strong&gt;– Present&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="font-weight: normal;"&gt;Key architect and developer for content integration tools using Spring Batch, Camel, and custom tools.&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;Lead developer for a custom content curation system in Grails.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Senior Software Engineer -- &lt;/strong&gt;&lt;strong&gt;January 2008&lt;/strong&gt;&lt;strong&gt; – March 2011&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Senior contributor to common Ajax and UI components.&lt;/li&gt;&lt;li&gt;Develop Endeca faceted search applications and data-processing tools.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Enhance in-house MVC framework.&lt;/li&gt;&lt;li&gt;Contribute to design and development of new UI framework using Spring MVC.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Freelance Software Developer &amp;amp; Architect -- &lt;/strong&gt;&lt;strong&gt;June 2006&lt;/strong&gt;&lt;strong&gt; – December 2008&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Web2 Impact, LLC, Denver, Colorado&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Lead all development efforts for BuyBak.com--an eCommerce startup providing reverse logistics capabilities--using Java, Struts, Spring, iBatis, Grails, as well as Ruby and MySQL.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Developed the system architecture and design (UML domain model, site map, etc.) for start-up healthcare service.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Developed Ruby on Rails, Javascript, and Java code to create a digital video system inside a Web-based, Ajax-style email system (Zimbra).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Sr. Software Engineer -- March 2005 – June 2006&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;McKesson (System Engineering Services), Denver, Colorado&lt;/p&gt;&lt;p&gt;Java software design and development for mission critical applications.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Development key internal application using Java, Tomcat, XSLT, and AJAX &lt;/li&gt;&lt;li&gt;Development of all Web Service interfaces to the core system using JbossWS&lt;/li&gt;&lt;li&gt;Development of core components using JMX on JBoss&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Sr. Java Developer; Sr. Systems Analyst -- March 2004 – March 2005&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Veteran’s Administration (Express Management Solutions), Denver, Colorado&lt;/p&gt;&lt;p&gt;Major contributor to critical systems development for the Health care Administration Center.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Leading establishment of System Analysis discipline and spearheading analysis of major initiative&lt;/li&gt;&lt;li&gt;Key team contributor for software architecture and programming for Oracle 9i and STRUTS&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Developer; Product Manager -- June 2002 – March 2004&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Grizella Corporation, Lakewood, Colorado&lt;/p&gt;&lt;p&gt;Developer of Web-based products for a Transportation software company. &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Architecture and programming for service-oriented system using Tomcat/Java Servlets/JSP&lt;/li&gt;&lt;li&gt;Developed an e-commerce ordering application with a credit card gateway interface&lt;/li&gt;&lt;li&gt;Created Web application to effectively utilize resources for a major Trucking association&lt;/li&gt;&lt;li&gt;Created a Web UI framework (MVC) for rapid development of Web-based services &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Technical Consultant -- February 2001 – May 2002&lt;/strong&gt;&lt;br /&gt;Experio Solutions, Denver, Colorado&lt;/p&gt;&lt;p&gt;Manager of technical project teams.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Project Manager for a critical process re-engineering of the IT department of a major utility&lt;/li&gt;&lt;li&gt;Developed components and workflows for a business service model using SeeBeyond &lt;/li&gt;&lt;li&gt;Contributed to J2EE and Enterprise Application Integration interest groups&lt;/li&gt;&lt;li&gt;Attended TIBCO training and maintained a Web-based InConcert demo&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Operations Director; Process Improvement Lead -- June 1998 – January 2001&lt;/strong&gt;&lt;br /&gt;iXL, Denver, Colorado&lt;/p&gt;&lt;p&gt;Various Management roles for Denver office of iXL.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Managed departments of up to 18 reports: Technical Services, Quality Services, Requirements Management &lt;/li&gt;&lt;li&gt;Successfully implemented improved Requirements Management and Change Request Management processes as Chair of Denver office best practices taskforce&lt;/li&gt;&lt;li&gt;Defined the corporate methodology framework utilizing RUP principles as key member of Corporate Methodology Team &lt;/li&gt;&lt;li&gt;Provided guidance to teams on program and project best practices&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Technical Director; Technical Lead -- October 1998 – June 2000&lt;/strong&gt;&lt;br /&gt;iXL, Denver, Colorado&lt;/p&gt;&lt;p&gt;Leader of technical development group for a top Internet-based business solutions company.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Managed technical teams of up to 10 developers, from requirements through deployment, for Budget Rent-a-Car, National Processing Corporation, and American Water Works Association&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Lead Architect and Developer for ServletExec/NES/Oracle and IIS/SQL Server/ASP projects&lt;/li&gt;&lt;li&gt;Created and managed Technical Requirements and Architecture documents using Use-case specifications and realizations, sequence diagrams, and Deployment diagrams &lt;/li&gt;&lt;li&gt;Technical Project Management and primary technical interface with high-level Client management and vendor partners&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Director, Engineering Services -- August 1996 – June 1998&lt;/strong&gt;&lt;br /&gt;iXL (Green Room Productions), Sausalito, California &lt;/p&gt;&lt;p&gt;Leader of Web application development for a successful Web development company.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Established and managed the Engineering Services team, that grew to 17 employees &lt;/li&gt;&lt;li&gt;Internet application projects for travel clients including Sheraton Hotels, Walt Disney World, Travelocity, Mountain Travel Sobek, and Abercrombie and Kent&lt;/li&gt;&lt;li&gt;Developed interactive Web applications using Perl, Server-Side JavaScript (SSJS), Oracle, ASP, and MS SQL Server &lt;/li&gt;&lt;li&gt;Led development of Web-based Workflow system, including project, assignment, and hours tracking &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Systems Engineer (Part Time) -- May 1995 – March 1996&lt;/strong&gt;&lt;br /&gt;Visual Movement Corporation, Denver, Colorado&lt;/p&gt;&lt;p&gt;Internship with a software development team specializing in the transportation industry. &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Technology selection and market research, implementation of installation utility in Visual Basic &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Associate Engineer -- June 1991 – August 1994&lt;/strong&gt;&lt;br /&gt;Cooper &amp;amp; Chyan Technology, Inc., Cupertino, California&lt;/p&gt;&lt;p&gt;Integral member of software engineering team for a start-up CAD software company.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Directed the design and content of a successful new GUI for an advanced CAD system&lt;/li&gt;&lt;li&gt;Maintained and enhanced a run-time graphics library using C, Motif, and X-Windows. This library was used to build the GUI listed above&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;u&gt;&lt;span style="font-size:130%;"&gt;Education&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;MBA / MIS. University of Denver (Daniels College of Business) June 1996&lt;br /&gt;· GPA: 3.51 / 4.00&lt;br /&gt;· Member of Information Technology Association and charter member of Toastmasters &lt;/p&gt;&lt;p&gt;B.S. Computer Science. Colorado State University May 1991&lt;br /&gt;· Active member of Sigma Alpha Epsilon Fraternity. Vice President, Alumni Chairman&lt;br /&gt;Certifications&lt;br /&gt;· Sun Certified Enterprise Architect for J2EE, November 2003&lt;br /&gt;· Sun Certified Java Programmer, December 2001&lt;br /&gt;· Rational Certified Consultant in RUP and OOAD, March 2002&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-112352170449417422?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/112352170449417422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=112352170449417422' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112352170449417422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112352170449417422'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/08/shameless-promotion-2-johns-resume.html' title='Shameless Promotion 2:  John&apos;s Resume'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-112352029983602442</id><published>2005-08-08T09:54:00.000-07:00</published><updated>2005-08-08T11:24:26.626-07:00</updated><title type='text'>Shameless Promotion 1:  John's "Cover Letter"</title><content type='html'>I am a professional software engineer and manager, and my expertise in software development can improve the success of software projects. I have over 11 years experience in software development as a leader and a key contributor in several roles.&lt;br /&gt;&lt;p&gt;I am a leader who can code, and a developer who can manage people and projects. I believe I have a truly unique breadth of skills that make me an indispensable asset to software development projects:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Technical lead, architect, and developer on dozens of projects, including large engagements for clients like Sheraton Hotels, Travelocity, Budget Rent-A-Car, and the Veteran's Administration&lt;/li&gt;&lt;li&gt;Sun Certified Architect for J2EE&lt;/li&gt;&lt;li&gt;Programming experience in Java (4 years), C (3), VB/ASP (3), and Perl (2)&lt;/li&gt;&lt;li&gt;Sun Certified Java Programmer&lt;/li&gt;&lt;li&gt;Effective, hands-on skills as a software engineer, architect, and business/systems analyst&lt;/li&gt;&lt;li&gt;Several years of experience as an engineering line manager and as a technical project manager&lt;/li&gt;&lt;li&gt;Rational Certified Consultant in RUP and OOAD&lt;/li&gt;&lt;li&gt;MBA and a Bachelor's in Computer Science&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Please let me know if you would like a current &lt;a href="http://architechie.blogspot.com/2005/08/shameless-promotion-2-johns-resume.html"&gt;resume&lt;/a&gt;, or to discuss how I can help you to succeed. Sincerely,&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;John Troxel&lt;/p&gt;&lt;p&gt;303.667.3280&lt;/p&gt;&lt;p&gt;&lt;a href="mailto:jtroxel@yahoo.com"&gt;jtroxel@yahoo.com&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-112352029983602442?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/112352029983602442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=112352029983602442' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112352029983602442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112352029983602442'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/08/shameless-promotion-1-johns-cover.html' title='Shameless Promotion 1:  John&apos;s &quot;Cover Letter&quot;'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-112256651826015125</id><published>2005-07-28T08:49:00.000-07:00</published><updated>2005-08-11T08:12:02.833-07:00</updated><title type='text'>Unit Testing Thoughts</title><content type='html'>In no particular order and with absolutely no structure, some thoughts on unit testing:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In order to properly unit test, your design must properly seperate concerns. This means that true business logic should be decoupled from specific APIs, conventions, and protocols... and these from eachother. For example, you shouldn't have the following mixed into business logic: SQL statements, JDBC calls, J2EE API objects, etc.&lt;/li&gt;&lt;li&gt;There is a spectrum from "pure" unit testing to complete integration testing, something like:&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ol&gt;&lt;li&gt;(Pure) Unit Tests: Have no dependencies and no side effects: test constructors, accessors, comparisons, algorithms. Generally this consists of a single client, the test class, and a single class under test. Developed by developers for developers.&lt;/li&gt;&lt;li&gt;Partial Integration / Integration Boundary Tests? Tests integration between layers, components, or technologies. Where possible, tests should focus on a single boundary, e.g. data access code &lt;-&gt; Database, SOAP Client code &lt;-&gt; SOAP Service, etc. Code that has dependencies on other APIs should use mock objects or some sort of debug-dummy mode.  For the debug mode strategy, the property could be "injected" by the runtime invironment with a settor or a special constructor.  These tests are also by developers for developers.&lt;/li&gt;&lt;li&gt;Full Integration / System Tests? These test a path through the system that provides verification of some subset of requirements. These tests can be employed by developers, using tools like HTTPUnit. They can also be maintained by testers or properly trained business experts, using functional test automation tools.&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;&lt;p&gt;Many automated tests, including some unit tests, have side effects on the data that can mess up other tests. For example, tests may rely on a pre-condition state of the database to succeed, and manual testing can be maddening if the data is changing underneath you. Either all tests must mutate data completely independent of any other test or user, or the database must be restored to a consistent state before testing (which still might mess up other testers). Some strategies for managing this situation include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Complete database restore, in an isolated database or schema. E.g. SQL DDL scripts, dbUnit scripts, or programmatically. If the developer's database is a different technology or version from production, this introduces the challenge of maintaining a restore capability for two technologies, as well as potential bugs caused by differences in the production database. To test for problems caused by a different technology in production, the team could use a shared database instance specifically for periodic execution of all unit tests. You could also have multiple levels of restore, e.g. a bare bones one for unit testing, one that adds reference data, and one that puts some example data in for manual testing. I like the idea of using Hibernate (or something similar) to abstract the db technology, using HSQL (or similar) locally, and providing utility methods to add in the required data.&lt;/li&gt;&lt;li&gt;Transactions / rollback? This implies that data access code must have mechanisms for using injected transactions, managed by the test code, and/or skipping commits in test mode. Add setAutoCommit, commit, rollback to DAO API?&lt;/li&gt;&lt;li&gt;Have each test clean up it's data. This requires that 1) all data created can be identified or tracked by the test, and 2) that the database allows the proper permissions to delete data.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;To Be Continued...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-112256651826015125?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/112256651826015125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=112256651826015125' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112256651826015125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112256651826015125'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/07/unit-testing-thoughts.html' title='Unit Testing Thoughts'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-112239405576390573</id><published>2005-07-26T08:39:00.000-07:00</published><updated>2005-08-10T13:31:06.056-07:00</updated><title type='text'>Qualifying the "Simplest Thing" rule</title><content type='html'>In XP, and Agile methods, decisions are often made with the criteria of "&lt;a href="http://www.xprogramming.com/Practices/PracSimplest.html"&gt;the simplest thing that could possibly work&lt;/a&gt;." I think this applies not only to code construction and detailed design decisions, but to Architecture as well. Strict use of this rule will almost always result in the most prudent approach, but I do think there are a couple of caveats:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The decision should still be &lt;a href="http://www.artima.com/intv/adapt.html"&gt;reversible&lt;/a&gt;, so that you don't paint yourself into a corner for future changes in the requirements. &lt;/li&gt;&lt;li&gt;The simplicity should be weighed carefully against the flexibility and the cost of changing later. If the simplest solution costs 20% less now, but will likely cost 30% more over time, then it may not be the best choice. You have to decide how likely likely is.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I would stress that even with these caveats, one should still be very careful breaking the rule. If you don't have a strong case for a very real risk of ir-reversibility problems or future costs, you should just stick with the simplest solution.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-112239405576390573?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/112239405576390573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=112239405576390573' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112239405576390573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112239405576390573'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/07/qualifying-simplest-thing-rule.html' title='Qualifying the &quot;Simplest Thing&quot; rule'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-112085556339314437</id><published>2005-07-08T13:26:00.000-07:00</published><updated>2005-07-26T09:15:29.293-07:00</updated><title type='text'>JBoss CMP versus Hibernate</title><content type='html'>UPDATE 07/26/05&lt;br /&gt;I stuck with Hibernate. Very simply put, they both have many of the same benefits--declarative programming, transactions, etc. But EJB introduces a whole layer of overhead realted to remote access. Unless you are doing a true N-tier, highly distributed application, I don't think that overhead is warranted.&lt;br /&gt;=======&lt;br /&gt;&lt;br /&gt;I am starting to look at a persistence technologies for an application I am working on in JBoss 4.0.2. I am currently looking at the (built in) Hibernate in JBoss versus CMP. SO far I am just kicking the tires, gathering info. If you come across this, please feel free to comment.&lt;br /&gt;&lt;br /&gt;Harshad Oak has a &lt;a href="http://indicthreads.com/blogs/view/101/java_persistence_compare.html"&gt;posting on the topic with comments&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Right now, I can't see any reason why not to use Hibernate: I can use pojos, but still get transactions. I don't see the benefit of creating EJBs for every entity we need to persist.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-112085556339314437?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/112085556339314437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=112085556339314437' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112085556339314437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/112085556339314437'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/07/jboss-cmp-versus-hibernate.html' title='JBoss CMP versus Hibernate'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-111533198947293901</id><published>2005-05-05T15:18:00.000-07:00</published><updated>2005-07-08T15:15:13.346-07:00</updated><title type='text'>UML:  Labels versus Stereotypes for Associations and Dependencies</title><content type='html'>I think I am clear on what to use where for Associations: The label is very specific, identifying the association or relationship between the two &lt;em&gt;specific&lt;/em&gt; nodes. A stereotype doesn't normally make sense for associations, since it identifies a &lt;em&gt;kind&lt;/em&gt; of association. Examples I have seem is &amp;lt;&amp;lt;include&amp;gt;&amp;gt; for use cases, and identification of the protocol for component associations.&lt;br /&gt;&lt;br /&gt;For Dependencies: A label often does not make sense, since the relationship is always "depends on." A stereotype further defines the nature of the dependency.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-111533198947293901?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/111533198947293901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=111533198947293901' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/111533198947293901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/111533198947293901'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/05/uml-labels-versus-stereotypes-for.html' title='UML:  Labels versus Stereotypes for Associations and Dependencies'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-111532999701111311</id><published>2005-05-05T14:50:00.000-07:00</published><updated>2005-05-05T15:17:56.546-07:00</updated><title type='text'>Good UML Links</title><content type='html'>I really like Scott Ambler's stuff at: &lt;a href="http://www.agilemodeling.com/style/"&gt;http://www.agilemodeling.com/style/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This looks like a solid overview: &lt;a href="http://www.vico.org/UML_FAQ_jGuru.pdf"&gt;http://www.vico.org/UML_FAQ_jGuru.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Looks interesting: &lt;a href="http://www-inf.int-evry.fr/COURS/UML/semantics/"&gt;http://www-inf.int-evry.fr/COURS/UML/semantics/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And of course: &lt;a href="http://www.uml.org/#UML2.0"&gt;http://www.uml.org/#UML2.0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hmmm: &lt;a href="http://www.holub.com/goodies/uml/"&gt;http://www.holub.com/goodies/uml/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-111532999701111311?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/111532999701111311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=111532999701111311' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/111532999701111311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/111532999701111311'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/05/good-uml-links.html' title='Good UML Links'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-111524088732812036</id><published>2005-05-04T13:49:00.000-07:00</published><updated>2005-07-08T15:19:46.803-07:00</updated><title type='text'>Thoughts on Requirements Terminology</title><content type='html'>It occurred to me a while back that there are two distinct categories of requirements: Those that are deemed necessary and can be categorically verified, and those that are more lofty and more difficult to test.&lt;br /&gt;&lt;br /&gt;I suggest that the first set are called Imperative Requirements, or simply requirements. These are binary in nature, either they make it into the system or they don't--a test case can be written that will pass or fail. Use cases and functional requirements fall into this category, as well as performance, reliability, security, and perhaps other non-functional areas as well.&lt;br /&gt;&lt;br /&gt;The second category, which I'll call Non-Imperative Requirements (or maybe just Qualities), are different. They can not be tested or verified in any straight forward way, but rather are qualities to shoot for. Scalability, maintainability, useability, and ease-of-development, for example, fall into this category. These Qualities are better expressed as goals with &lt;strong&gt;relative&lt;/strong&gt; importance. Those less verifiable, these need not be completely useless. Qualities can be expressed with relative importance weights, and still traced with a correlation matrix.&lt;br /&gt;&lt;br /&gt;In future posts, I plan on fleshing out my idea of a requirements model, especially regarding how requirements should be systematically addressed in architecture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-111524088732812036?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/111524088732812036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=111524088732812036' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/111524088732812036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/111524088732812036'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/05/thoughts-on-requirements-terminology.html' title='Thoughts on Requirements Terminology'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-111411838602916893</id><published>2005-04-21T14:16:00.000-07:00</published><updated>2005-04-21T14:19:46.030-07:00</updated><title type='text'></title><content type='html'>If you ever get a java.lang.NoClassDefFoundError at runtime, and you are certain the class identified is in your classpath, take a look at the inheritence hierarchy.  The java.lang.ClassLoader will identify the child, even if it is a parent who is missing.  At least that is what happened to me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-111411838602916893?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/111411838602916893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=111411838602916893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/111411838602916893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/111411838602916893'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/04/if-you-ever-get-java.html' title=''/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11696452.post-111178871301333480</id><published>2005-03-25T13:59:00.000-08:00</published><updated>2005-03-30T10:33:23.746-08:00</updated><title type='text'>JBoss EJB Security</title><content type='html'>&lt;span style="font-family:verdana;"&gt;In addition to the well-documented steps for securing EJBs, configuring in JBoss has some potential issues. Setting up an authentication policy requires editing some JBoss-specific files:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;conf/login-config.xml:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;application-policy name="policy-name"&amp;gt;&lt;br /&gt;&amp;lt;authentication&amp;gt;&lt;br /&gt;&amp;lt;login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="optional"&amp;gt;&lt;br /&gt;&amp;lt;module-option name="unauthenticatedIdentity"&amp;gt;anonymous&amp;lt;/module-option&amp;gt;&lt;br /&gt;&amp;lt;/login-module&amp;gt;&lt;br /&gt;&amp;lt;/authentication&amp;gt;&lt;br /&gt;&amp;lt;/application-policy&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;META-INF/jboss.xml:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;jboss&amp;gt;&lt;br /&gt;&amp;lt;security-domain&amp;gt;java:/jaas/policy-name&amp;lt;/security-domain&amp;gt;&lt;br /&gt;&lt;/span&gt;...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;If you set up a policy like this, you apparently must establish a method-permission in ejb-jar.xml for &lt;strong&gt;every&lt;/strong&gt; method (or *) of &lt;strong&gt;every&lt;/strong&gt; bean. Misnaming a method, or trying to do a partial wildcard (get*, can't do that), gives an error:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Insufficient method permissions, principal=user, ejbName=Bean, method=method, interface=SERVICE_ENDPOINT, requiredRoles=[], principalRoles=[user-role1, user-role2]&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11696452-111178871301333480?l=www.codecraftblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codecraftblog.com/feeds/111178871301333480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11696452&amp;postID=111178871301333480' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/111178871301333480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11696452/posts/default/111178871301333480'/><link rel='alternate' type='text/html' href='http://www.codecraftblog.com/2005/03/jboss-ejb-security.html' title='JBoss EJB Security'/><author><name>John</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
