<?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-104488715285175512</id><updated>2011-11-27T19:36:44.605-05:00</updated><category term='ruby'/><category term='Rockbox'/><category term='wiki'/><category term='podcast'/><category term='Microsoft'/><category term='ec2'/><category term='UI design'/><category term='development'/><category term='CORBA'/><category term='jena'/><category term='maven'/><category term='Apple'/><category term='SOA'/><category term='leadership'/><category term='Rspec'/><category term='grails'/><category term='JCAPS'/><category term='WSDL'/><category term='freebase'/><category term='css'/><category term='agile'/><category term='tech news'/><category term='web 2.0'/><category term='rails'/><category term='web service'/><category term='test driven development'/><category term='performance'/><category term='eclipse'/><category term='tv'/><category term='Spring'/><category term='mashup'/><category term='usability'/><category term='database'/><category term='elastic computing'/><category term='javafx'/><category term='del.icio.us'/><category term='mentoring'/><category term='hibernate'/><category term='PodcatherProject'/><category term='jabber'/><category term='xmpp'/><category term='REST'/><category term='silverlight'/><category term='ajax'/><category term='schedules'/><category term='behavior driven development'/><category term='google gears'/><category term='QEDWiki'/><category term='BPEL'/><category term='flex'/><category term='surface computing'/><category term='rcp'/><category term='iPhone'/><category term='change control'/><category term='rails quality'/><category term='groovy'/><category term='innovation'/><category term='accessability'/><category term='development testing'/><category term='OLPC'/><category term='ria'/><category term='requirements'/><category term='management'/><category term='google'/><title type='text'>Explore IT</title><subtitle type='html'>digging into various software development &amp; IT topics
&lt;a href="http://del.icio.us/vincentfazio"&gt;my del.icio.us&lt;/a&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default?start-index=101&amp;max-results=100'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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>106</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-104488715285175512.post-7287623817182517205</id><published>2011-11-19T06:04:00.006-05:00</published><updated>2011-11-19T07:20:33.541-05:00</updated><title type='text'>Thoughts about a different StackOverflow reputation system</title><content type='html'>I love &lt;a href="http://stackoverflow.com/"&gt;StackOverflow&lt;/a&gt;. It's my "go to" place when I run into a tough programming problem.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Reputation on StackOverflow can be a bit intimidating, however.  Even when you have a few thousand reputation points (placing you in the top 20% of all StackOverflow users) - the top users have 100x that many points!  It can make you feel pretty insignificant.  "Catching up" to the leaders doesn't feel like a realistic option.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This week, I listened to &lt;a href="http://www.bbc.co.uk/programmes/b016924x"&gt;a podcast about Cortes' conquest of the Aztec empire&lt;/a&gt;.  During the conversation, the Aztecs were described as a civilization founded on war.  Warriors were celebrated.  They earned their own "reputation" - in the form of feathers and other ornaments - by conquering neighboring peoples.  What I found most interesting, though, was once a warrior earned a badge for conquests on a particular village, they couldn't earn more rep by sacking the same towns again and again.  This forced their warriors to become fighters with diverse skills and experiences as they fought new or stronger opponents.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I thought this example might provide a good alternative to the current StackOverflow reputation model where reputation point gains happen at a constant rate - regardless of the type of answers you provide.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's say that a user has gained 5K reputation points for answering Java questions.  The top user reputation for questions with the Java tag has upwards of 20K reputation.  Is the top user, really 4x more reputable as a Java expert?  I wouldn't think so.  It could be that the top rep user has just been a StackOverflow user longer.  Or maybe they have had the good fortune to provide an answer to a question with a lot of views (and up votes).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I guess my point is, once you've gained a certain amount of reputation answering a particular class of questions, you could be considered an expert in that particular field of study.  You've exhibited you know what you're talking about.  What, really, does additional reputation provide past this point?  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I know earning points is a large part of the appeal for many users so instead of turning off reputation gains outright after reaching a certain plateau, couldn't the rate of growth just slow down a bit?  Instead of earning 10 rep points for all up votes, maybe the point rate would decrease by 1 for each 1000 points earned for answers with a particular tag, bottoming out at 1 point per up vote .  I don't know - I'm just spit-balling here.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another nice side effect of this change would be that users with a diverse set of skills, could still earn reputation quickly.  Once they've hit the expert experience level for answering Java questions, for instance, they could still earn full reputation points for answering SQL questions, or AJAX.  Users with a deep understanding in many, diverse topic areas would rise to the top.  Like the Aztec warriors - to gain the most reputation - users would need to expand their skill sets outside of their comfort zone.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-7287623817182517205?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/7287623817182517205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=7287623817182517205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7287623817182517205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7287623817182517205'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2011/11/thoughts-about-different-stackoverflow.html' title='Thoughts about a different StackOverflow reputation system'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-1120183586379026576</id><published>2009-10-09T15:25:00.004-04:00</published><updated>2009-10-09T16:02:59.911-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='leadership'/><title type='text'>A few quick notes</title><content type='html'>It's been a quiet few months.  I haven't worked on too many things I've felt like writing about.&lt;br /&gt;&lt;br /&gt;That's not to say I haven't been busy.  One thing I've been  reading more about building great teams and delivering more to our customers.  I'm just starting to read  &lt;a style="font-style: italic;" href="http://www.amazon.com/gp/product/0385523866?ie=UTF8&amp;amp;tag=exit0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0385523866"&gt;Creating Magic: 10 Common Sense Leadership Strategies from a Life at Disney&lt;/a&gt;.  Obvious from the title, this book outlines the approach Disney teaches all of it's Cast Members (employees) on how to be great leaders and provide their visitors with great experiences.  I've been wanting to read this for some time and I'll be sure to write more as I work my way through it.&lt;br /&gt;&lt;br /&gt;Some related blog posts I've enjoyed recently are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.joelonsoftware.com/items/2009/09/23.html"&gt;The Duct Tape Programmer&lt;/a&gt; from &lt;a href="http://www.joelonsoftware.com/"&gt;Joel on Software&lt;/a&gt; where he reviews a chapter of the book &lt;a href="http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=exit0d-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;md=10FE9736YVPPT7A0FBG2&amp;amp;asins=1430219483"&gt;Coders at Work&lt;/a&gt;.  The post basically talks about doing the simplest thing possible to get something out the door and into people's hands.  Amen to that!&lt;/li&gt;&lt;li&gt;I've also been enjoying the "&lt;span style="font-style: italic;"&gt;There is no magic, there is only awesome&lt;/span&gt;" series (&lt;a href="http://weblog.jamisbuck.org/2009/9/17/there-is-no-magic-there-is-only-awesome-part-1"&gt;part 1&lt;/a&gt; &amp;amp; &lt;a href="http://weblog.jamisbuck.org/2009/9/25/there-is-no-magic-there-is-only-awesome-part-2"&gt;part 2&lt;/a&gt; &amp;amp; &lt;a href="http://weblog.jamisbuck.org/2009/10/9/there-is-no-magic-there-is-only-awesome-part-3"&gt;part 3&lt;/a&gt;) over at the &lt;a href="http://weblog.jamisbuck.org/"&gt;{ buckblogs :here }&lt;/a&gt;.  The series is about being passionate, opinionated, and continuously pushing yourself to be more complete.  It's a good read.&lt;br /&gt;&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/104488715285175512-1120183586379026576?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/1120183586379026576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=1120183586379026576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/1120183586379026576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/1120183586379026576'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2009/10/few-quick-notes.html' title='A few quick notes'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-3498637945668465029</id><published>2009-07-31T13:21:00.009-04:00</published><updated>2009-07-31T16:04:39.925-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>Professionalism</title><content type='html'>I was inspired by &lt;a href="http://railsconf.blip.tv/file/2089545/#"&gt;this talk&lt;/a&gt; from RailsConf given by Robert "Uncle Bob" Martin.  It's a really entertaining talk and you should check it out if you haven't already.&lt;br /&gt;&lt;br /&gt;During the talk, the topic of professionalism came up and what it means to be a "professional software developer" (maybe 2/3 of the way through).  Professionalism in software development is a topic that's not well defined and certainly has different meanings to different people.&lt;br /&gt;&lt;br /&gt;Can you be considered a pro, for instance, if you don't provide a set of automated tests for your code?  What if you don't use source control?  Do you feel the need to always create a custom build file (make, ant, or maven script) so you can build independent of an IDE?  Do your "professional" standards change depending on if you're creating "prototypes" rather than designing code for production?&lt;br /&gt;&lt;br /&gt;I know which things I strive to do on every project I work on.  But the standards for &lt;span style="font-style: italic;"&gt;the teams&lt;/span&gt; I work with vary wildly.  And this fact alone leads me to question why.  Can't we do better?&lt;br /&gt;&lt;br /&gt;Doesn't every application need some level of testing?  Shouldn't these tests be automated and built into the fabric of every piece of code?  Personally, I don't think the benefits of having an automated test suite can be questioned anymore.  Same with source control.&lt;br /&gt;&lt;br /&gt;Additionally, I feel every project should replace the build file generated by an IDE with one of their own for this simple reason - maintenance.  Have you ever looked at the Ant scripts generated by Netbeans?  It's enormous - and it has to be to support the wide range of functionality Netbeans allows Java projects to do, like generating code for WS clients for instance.  At a minimum, developers should take out all the extraneous (unused) targets and move references to IDE-specific libraries needed to build the project under their own control (treat them just like application dependent libraries).  Without this measure, you're locked into a specific IDE and often a specific version of the IDE.  By taking this simple step, you can upgrade your development tools without fear that the system won't build.&lt;br /&gt;&lt;br /&gt;Excuses not to do the things listed above often fall under the veil of, "We're  developing a prototype.  We need to do it rapidly and we can't slow down to take on the overhead of automated testing or configuration management".  My response is, why not?  Isn't this code going to be "delivered" anyway - if not to a client than just internally for evaluation.  And really, when is the last time a really cool prototype hasn't been immediately folded into the production code.  The overhead to doing these tasks is minimal compared to the time spent repeatedly doing them manually.&lt;br /&gt;&lt;br /&gt;All I'm really saying is there are a basic set of things - source control, testing, and repeatable builds - that are common to any software development effort regardless of scope or technology.  I'm tired of having the conversation about not only how, &lt;span style="font-style: italic;"&gt;but if&lt;/span&gt; we're gong to do these &lt;span style="font-style: italic;"&gt;most basic&lt;/span&gt; &lt;span style="font-style: italic;"&gt;things &lt;/span&gt;on every new project I join.   As a profession, we're better than this (at least we should be).  At this point, it's  wasteful to have these discussions time and time again.  I don't think we can consider ourselves true professionals until we agree to deliver these most basic pieces of functionality for every piece of software we deliver.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-3498637945668465029?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/3498637945668465029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=3498637945668465029' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3498637945668465029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3498637945668465029'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2009/07/professionalism.html' title='Professionalism'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-9190304123866966906</id><published>2009-07-08T10:23:00.009-04:00</published><updated>2009-07-08T13:23:55.457-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech news'/><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><category scheme='http://www.blogger.com/atom/ns#' term='surface computing'/><title type='text'>More stuff to get excited about</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Chrome OS&lt;/span&gt;&lt;br /&gt;I'm excited about &lt;a href="http://googleblog.blogspot.com/2009/07/introducing-google-chrome-os.html"&gt;Google's announcement&lt;/a&gt; to release what sounds like an ultra lightweight OS to basically surf the Internet.  I'm hoping this device will allow me (and others) to breathe new life into old, underpowered laptops, allowing them to essentially work as netbooks.&lt;br /&gt;&lt;br /&gt;This could also open up new and inexpensive opportunities for schools to recycle or prolong the life of expensive computing equipment and expand horizons of their students.  I've been watching the &lt;a href="http://laptop.org/en/"&gt;One Laptop per Child (OLPC)&lt;/a&gt; movement &lt;a href="http://vincentfazio.blogspot.com/search?q=olpc"&gt;for some time&lt;/a&gt; and I see this as another avenue toward their goal.&lt;br /&gt;&lt;br /&gt;I don't share the optimism that this OS will somehow replace Windows.  Sometimes you &lt;span style="font-style: italic;"&gt;need&lt;/span&gt; extra horsepower and functionality.   I edit a lot of photos and create some simple video, but the web tools I've tried to do either task can't hold a candle to the four-year-old version of Photoshop Elements I own.  I'm not sure CPU intensive apps like this will port very well to the web.  It seems the economies of scale afforded by cloud computing may break down when everyone needs 100% of the CPU.  (Though I hope I'm wrong)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;First person UIs revisited&lt;/span&gt;&lt;br /&gt;I just watched &lt;a href="http://www.ted.com/index.php/talks/pattie_maes_demos_the_sixth_sense.html"&gt;this video&lt;/a&gt; of something called Sixth Sense.  Basically it's like Minority Report meets the &lt;a href="http://www.microsoft.com/surface/"&gt;Microsoft Surface Computer&lt;/a&gt; meets Way Cool and Inspector Gadget.  Trust me.  Watch the video....&lt;br /&gt;&lt;br /&gt;It was cool when the guy was using a wall as the surface computer or got real time product information and reviews at the store.  It went to way cool when he used his fingers to frame &lt;span style="font-style: italic;"&gt;and take&lt;/span&gt; a picture.  It went to Inspector Gadget cool when he used his hand as a cell phone and "drew" that watch on his wrist.  The tag cloud on his buddy was also pretty neat.  I can't wait to see how this technology develops.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-9190304123866966906?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/9190304123866966906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=9190304123866966906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/9190304123866966906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/9190304123866966906'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2009/07/more-stuff-to-get-excited-about.html' title='More stuff to get excited about'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-692162493631536664</id><published>2009-06-26T14:31:00.008-04:00</published><updated>2009-07-08T11:16:34.493-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech news'/><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><title type='text'>Interesting Tidbits</title><content type='html'>&lt;a href="http://vincentfazio.blogspot.com/search/label/tech%20news?max-results=100"&gt;It's been a while&lt;/a&gt; since I had a post to talk about some of the new(er) technology I'm just hearing about.  Here are three things that got me excited recently.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;First person user interfaces&lt;/b&gt;&lt;br /&gt;I came across &lt;a href="http://www.lukew.com/ff/entry.asp?841"&gt;this article on First person UIs&lt;/a&gt;.  Basically it works like this: you have a location aware device like a smart phone with GPS and a camera.  You're walking around and you see a historical building, business, or other point of interest (POI).  You point the device's camera at the object and WHAMO - you instantly get a bunch on info about the object.  This can include the name of the POI, how far it is away, a phone number to call, a history, and a bunch of other interesting tidbits.  It will be like having a virtual tour guide in your pocket.  This is very cool!  This concept is also called "augmented reality".&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Google App Engine, Big Table, and more on the Cloud&lt;br /&gt;&lt;/b&gt;I recently watched this talk on &lt;a href="http://code.google.com/events/io/sessions/ThoughtWorksAppEngineJava.html"&gt;Google App Engine&lt;/a&gt;.  &lt;a href="http://vincentfazio.blogspot.com/search/label/ec2?max-results=100"&gt;I've been watching&lt;/a&gt; &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon's EC2&lt;/a&gt; for some time and it was nice to get an overview of Google's cloud service.&lt;br /&gt;&lt;br /&gt;Martin Fowler's overview of &lt;a href="http://labs.google.com/papers/bigtable.html"&gt;BigTable&lt;/a&gt; was also very helpful.  I didn't really understand this data structure beforehand, but his description of it as a nested hash table really gave me a better idea of what it is - and it's usefulness.  Lately I've been creating some in memory representations of data structures like this.  It's nice to know there's a ready made pattern out there for persisting it should I need to.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Erlang &amp;amp; CouchDB&lt;/b&gt;&lt;br /&gt;This week's &lt;a href="http://itc.conversationsnetwork.org/shows/detail4150.html"&gt;StackOverflow podcast&lt;/a&gt; included an interview with &lt;a href="http://damienkatz.net/"&gt;Damien Katz&lt;/a&gt;.  Damien created &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt; and wrote it in &lt;a href="http://erlang.org/"&gt;Erlang&lt;/a&gt;.  Now, I've heard of both of these items (separately) before, but I knew virtually nothing substantial about these technologies before the podcast.&lt;br /&gt;&lt;br /&gt;I'll probably get this all wrong, but Erlang is basically a language for writing distributed, multi-threaded systems.  CouchDB uses Erlang to allow a distributed way for users to store "documents" - where a document is some piece of data with a varying set of attributes.  From what I can gather, it's sort of organized like BigTable.  Two things really got me to thinking during this interview.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Erlang seems like a natural fit for building multi-threaded and distributed systems.  It's becoming more important for application developers to learn to code these types of systems as even entry-level computers have multiple cores now.  A language like Erlang seems like it may be a good fit to help take advantage of these additional resources.&lt;/li&gt;&lt;li&gt;Toward the end of the podcast, they discussed &lt;a href="http://stackoverflow.com/questions/299723/can-i-do-transactions-and-locks-in-couchdb"&gt;a StackOverflow question&lt;/a&gt; dealing with transactions and locks in CouchDB.  Basically, these two mechanisms don't exist in CouchDB - they don't have to.  It's automatically handled by the framework.  This is so cool!  Removing this complexity from my code and allows me (as an application developer) to focus solely on the business logic.  That very nice!  Thank you very much!&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PS&lt;/span&gt;&lt;br /&gt;Check out this great &lt;a href="http://www.infoq.com/presentations/katz-couchdb-and-me"&gt;presentation&lt;/a&gt; from Damien about his passion for what he does.  It's pretty powerful and inspiring!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-692162493631536664?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/692162493631536664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=692162493631536664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/692162493631536664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/692162493631536664'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2009/06/interesting-tidbits.html' title='Interesting Tidbits'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-82466469081114363</id><published>2009-06-16T11:38:00.006-04:00</published><updated>2009-07-08T11:18:11.360-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Maven - Why not?</title><content type='html'>I guess I still get a little surprised when I see code for a Java project and there's not an automated &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; build.  These projects often have an Ant script (many times the default one generated by &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Netbeans&lt;/span&gt; or Eclipse), but seldom a Maven POM file.  I wonder why?  Especially since Maven is so easy to use and really adds value over a vanilla Ant build.  Maven takes an Ant build to a higher level of abstraction to where it's easier to manage and change.&lt;br /&gt;&lt;br /&gt;What I think I like most, is the idea of the Maven repository.  It's a nice way to store and share application dependencies.  In a typical Ant project, dependent &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;JARs&lt;/span&gt; will be stored in source control along side the source code (typically in a lib directory).  This can make initial checkouts of these projects S-L-O-W.  Compounding the problem is when a set of projects use a framework like Spring.  Each project will store it's own set of Spring jars with the source, forcing developers to download the same set of jars multiple times for each project.&lt;br /&gt;&lt;br /&gt;Maven alleviates this problem somewhat with the notion of a JAR repository (actually a shared directory).  For something like Spring, the set of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;JARs&lt;/span&gt; is downloaded once, then shared between all projects needing the jar.  The jar repository eliminates the need to store the jars with the source code for the project and makes project downloads quicker while saving disk space.&lt;br /&gt;&lt;br /&gt;The list of dependencies each project needs is stored in the projects Maven build file (or POM).  The POM lists a projects' JAR dependencies as well as the version of the required JAR.  This creates a very detailed snapshot of all the project dependencies for a given release.&lt;br /&gt;&lt;br /&gt;Once the project is built for release, Maven allows the opportunity to export the release out to the JAR repository for others to grab.  This is a nice way to store and share multiple distributions of your projects - especially internal code libraries which are in turn used by multiple projects.&lt;br /&gt;&lt;br /&gt;Maven has it's own plug-in architecture so it's easy to extend.  One Maven plug-in I want to mention is &lt;a href="http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Appassember&lt;/span&gt;&lt;/a&gt;.  For projects that include an executable "main" class, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Appassembler&lt;/span&gt; will copy all the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_5"&gt;run time&lt;/span&gt; libraries to a distribution folder and also create the scripts to start the programs from the command line.  This is a great feature and removes some of the tedious tasks in creating releases like these.&lt;br /&gt;&lt;br /&gt;I really like Maven and recommend it to everyone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-82466469081114363?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/82466469081114363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=82466469081114363' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/82466469081114363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/82466469081114363'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2009/06/maven-why-not.html' title='Maven - Why not?'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-2686194565246642523</id><published>2009-06-15T14:48:00.007-04:00</published><updated>2009-06-15T15:07:04.136-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='test driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Spring Revisited</title><content type='html'>Recently I retrofitted some code I was working on to utilize &lt;a href="http://www.springsource.org/"&gt;Spring&lt;/a&gt;.  It's been some time since I'd used it and I'd forgotten how much I enjoy coding in this framework.  It really helps me write better, cleaner code.&lt;br /&gt;&lt;br /&gt;As developers, we always strive to create plug-and-play architectures - you know, code to an interface, achieve easily swappable implementations, etc.  That in itself really isn't that hard to do, but Spring really shines in &lt;span style="font-style: italic;"&gt;enforcing &lt;/span&gt;this idea. My original code (for Jena) needed to grab some Resource references from the model and looked something like this...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;{method declaration}&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;OntologyModel model = {get model reference}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;URI resourceUri = new URI("http://www.myCompany.com/MC#myResource1");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Reoruce myResource = model.getResource(resourceUri);&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; {additional business logic}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The equivalent Spring configuration replacement for this code looks like this...&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;pre&gt;&amp;lt;bean id="myResource" class="com.myCompany.Resource" factory-bean="model" factory-method="getResource"&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&amp;lt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;constructor-arg&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&amp;lt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;bean class="java.net.URI"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&amp;lt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;constructor-arg value="http://www.myCompany.com/MC#myResource1"/&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&amp;lt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;/bean&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&amp;lt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;/constructor-arg&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&amp;lt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;/bean&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;The major difference is in the in the&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; {get model reference}&lt;/span&gt;&lt;/span&gt; statement.  In the Java version, I'd normally gain access to the model using a Service Locator or a Singleton.  Whatever design choice was made, would find its way into the implementation as "&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Model.something&lt;/span&gt;&lt;/span&gt;" or "&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;(OntologyModel)Locator.get("model")&lt;/span&gt;&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;With Spring, the framework &lt;span style="font-style: italic;"&gt;wants you to inject the model dependency into the class&lt;/span&gt;.  This forces you to pull up the method local OntologyModel reference to a higher level (either as a method parameter or a member variable).&lt;br /&gt;&lt;br /&gt;This refactoring has a few pleasant side effects.  First of all, it makes the business logic in the method itself a little cleaner - gone is the code clutter to figure out how to get the reference or where it's coming from.  The method is reduced to it's essential business logic.&lt;br /&gt;&lt;br /&gt;Secondly, the fact that this method or class depends on and utilizes OntologyModel is made explicit through it's interface.  This is a good thing (really).  In the past, I've argued that one job of the class is to abstract away (or encapsulate) this dependency or complexity, but I've sort of changed my thinking a little on this.  Sure, you might not want to expose whether your code is using a JDBC or a JMS connection or gets its value over HTTP, but what you want to change in this case is your &lt;span style="font-style: italic;"&gt;level of abstraction&lt;/span&gt;.  Wrap the HTTP/JMS/JDBC connection in another class interface and expose that instead.  It's exactly this functionality which make Spring so appealing to me because now it's trivial to change the Spring configuration between alternative HTTP/JMS/JDBC implementations or stub these out completely for unit testing.  With Spring, not only is this functionality "baked in", but the framework &lt;span style="font-style: italic;"&gt;encourages &lt;/span&gt;this behavior.&lt;br /&gt;&lt;br /&gt;Finally, because the behavior of the code can be changed outside the compiler via classpath configuration files, the same jar can used for unit test, QA, and production.  Not having to rebuild your code for various environments ensures that your build configuration doesn't introduce any unintentional side effects into your code.  I was on a project once where different files were included into a war depending on which region it was destined to run.  When incompatibilities were uncovered between the code running in each region, you needed to check the environment of the physical system, any external configuration file overrides, and the code itself.  If the same code is deployed to each region, you eliminate one of these things you need to check.&lt;br /&gt;&lt;br /&gt;I'm happy to be back using Spring because it helps achieve and enforce the goals I set for myself and my team in developing quality software.  My code is cleaner, more modularized, and easier to extend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-2686194565246642523?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/2686194565246642523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=2686194565246642523' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2686194565246642523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2686194565246642523'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2009/06/spring-revisited.html' title='Spring Revisited'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-499742035814120008</id><published>2009-05-21T08:09:00.008-04:00</published><updated>2009-05-21T11:07:01.551-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jena'/><title type='text'>Jena Lessons - More On the Reasoner</title><content type='html'>Back when I started working with Jena, my first "ontology task" was to iterate through a subset of objects in the model, perform some operations to slightly modify these objects, and then store the objects back into the model.  Sounds simple right?&lt;br /&gt;&lt;br /&gt;In a traditional database application, this program would consist of a &lt;span style="font-family:courier new;"&gt;SELECT&lt;/span&gt; statement, followed by some business logic, and conclude with a SQL &lt;span style="font-family:courier new;"&gt;UPDATE&lt;/span&gt;.  I've probably written code like this hundreds of times.  It's simple and runs quickly.&lt;br /&gt;&lt;br /&gt;On paper, the ontology task seems even easier.  Once opening a Jena &lt;a href="http://jena.sourceforge.net/javadoc/index.html"&gt;ontology model&lt;/a&gt;, you can query for objects (&lt;a href="http://jena.sourceforge.net/javadoc/com/hp/hpl/jena/ontology/OntResource.html"&gt;Resources&lt;/a&gt;) in &lt;a href="http://jena.sourceforge.net/javadoc/com/hp/hpl/jena/rdf/model/Model.html#listResourcesWithProperty%28com.hp.hpl.jena.rdf.model.Property%29"&gt;any&lt;/a&gt; &lt;a href="http://jena.sourceforge.net/javadoc/com/hp/hpl/jena/rdf/model/Model.html#getResource%28java.lang.String%29"&gt;number&lt;/a&gt; &lt;a href="http://jena.sourceforge.net/javadoc/com/hp/hpl/jena/rdf/model/Model.html#listResourcesWithProperty%28com.hp.hpl.jena.rdf.model.Property,%20com.hp.hpl.jena.rdf.model.RDFNode%29"&gt;of&lt;/a&gt; &lt;a href="http://jena.sourceforge.net/javadoc/com/hp/hpl/jena/rdf/model/ModelCon.html#listResourcesWithProperty%28com.hp.hpl.jena.rdf.model.Property,%20boolean%29"&gt;ways&lt;/a&gt; (including a SQL-like &lt;a href="http://www.w3.org/TR/rdf-sparql-query/"&gt;SPARQL&lt;/a&gt; syntax).  From there you simply &lt;a href="http://jena.sourceforge.net/javadoc/com/hp/hpl/jena/rdf/model/Resource.html#addProperty%28com.hp.hpl.jena.rdf.model.Property,%20java.lang.String%29"&gt;create&lt;/a&gt; or modify &lt;a href="http://jena.sourceforge.net/javadoc/com/hp/hpl/jena/rdf/model/Resource.html#getProperty%28com.hp.hpl.jena.rdf.model.Property%29"&gt;properties&lt;/a&gt; on the resource.  Since the ontology model is in memory, the changes happen real time (no need for an &lt;span style="font-family:courier new;"&gt;UPDATE&lt;/span&gt;). And while you could &lt;a href="http://jena.sourceforge.net/javadoc/com/hp/hpl/jena/ontology/OntModel.html#write%28java.io.OutputStream%29"&gt;persist&lt;/a&gt; the changes, there really isn't any need to.&lt;br /&gt;&lt;br /&gt;While this &lt;span style="font-style: italic;"&gt;seems &lt;/span&gt;quite easy, I noticed severe performance problems running this program on even moderately sized data sets.  Not only was the performance bad, but the application was using HUGE amounts of memory.  Much more than I would expect for models of this size.&lt;br /&gt;&lt;br /&gt;I immediately started to search for the cause of these problems and all signs pointed to the Jena Reasoner.  If you remember from &lt;a href="http://vincentfazio.blogspot.com/2009/03/jena-lessons-reasoner.html"&gt;my previous post&lt;/a&gt;, the Reasoner is responsible for inferencing - essentially creating relationships between objects not explicitly defined in the data.  You see, for each update to the model, the Reasoner ran (traversing much of the model) to discover any new relationships that it could find.  As the model became larger and more data changed, the Reasoner process took up more and more of the processing time and system resources.&lt;br /&gt;&lt;br /&gt;What I wanted to do was simply shut off the Reasoner temporarily while I did my batch update, then reactivate it once I was done.  The Jena API provides no support to "turn off" the Reasoner once the model is created.  I knew that there must be some way to do this and &lt;a href="http://stackoverflow.com/questions/654189/toggle-jena-reasoner"&gt;I asked some questions&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Eventually someone suggested that I create a new model with no Reasoner and load my existing "Reasoned" model into it.  I could then batch all my changes into this simplified model with no Reasoner performance hit.  The only trick is to run &lt;span style="font-family:courier new;"&gt;&lt;a href="http://jena.sourceforge.net/javadoc/com/hp/hpl/jena/rdf/model/InfModel.html#rebind%28%29"&gt;model.rebind()&lt;/a&gt;&lt;/span&gt; once the batch changes are complete in order to refresh the main model.&lt;br /&gt;&lt;blockquote&gt;Sidebar: Under the covers, I believe the 2 models are actually sharing the same memory space, but the changes to the "basic model" are happening "'below the radar" of the main model's Reasoner.  The rebind() method tells the main model to rescan its cache to get the updates.&lt;/blockquote&gt;All in all, this process works like a champ and I'd recommend it to anyone having performance problems while batch changing a Jena ontology model.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-499742035814120008?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/499742035814120008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=499742035814120008' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/499742035814120008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/499742035814120008'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2009/05/jena-lessons-more-on-reasoner.html' title='Jena Lessons - More On the Reasoner'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-3945797457679195324</id><published>2009-04-02T13:35:00.004-04:00</published><updated>2009-04-02T15:20:28.042-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mentoring'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Mentoring - Reading List</title><content type='html'>Since outlining a &lt;a href="http://vincentfazio.blogspot.com/2009/03/mentoring-online-technical-resources.html"&gt;brief list of online technical resources&lt;/a&gt; for my rookie coder, I thought it'd be a good idea to also supply a brief reading list of technical books that could have a place on any programmers shelf.  For this list, I wanted to focus on books that provide transferable skills - suggestions of different techniques and ways of thinking than someone might otherwise be exposed to.  This knowledge can be able leveraged  regardless of specific technologies or platforms.&lt;br /&gt;&lt;br /&gt;Here's the list:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0131422464?ie=UTF8&amp;amp;tag=exit0d-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0131422464"&gt;Core J2EE Patterns&lt;/a&gt; – I have an earlier version of this book and it’s a solid J2EE reference. The real benefit in this book is the set of J2EE architectural patterns (which builds on the Gang of Four [GoF] core patterns) and would also apply to server side development in .Net.  Some of the info on JSP or EJB may be a little dated with recent additions to the Java language, but still a great reference.  &lt;a href="http://www.amazon.com/gp/product/0321127420?ie=UTF8&amp;amp;tag=exit0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0321127420"&gt;Patterns of Enterprise Application Architecture&lt;/a&gt; is another great book with a similar theme.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/1934356085?ie=UTF8&amp;amp;tag=exit0d-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=1934356085"&gt;Ruby Pickaxe Book&lt;/a&gt; (called so because of the image on the cover).  I own the previous version of &lt;a href="http://www.amazon.com/gp/product/1934356166?ie=UTF8&amp;amp;tag=exit0d-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=1934356166"&gt;this other book about Rails&lt;/a&gt; and written by the same guys.  The first book will teach you Ruby, and the second will teach you the Rails framework.  I find Ruby and Rails a joy to work in.  My only complaint is that &lt;a href="http://vincentfazio.blogspot.com/search/label/ruby?max-results=100"&gt;I haven’t gotten to use them more&lt;/a&gt;.  I was pleasantly surprised how much more I could get done with this simple language and framework.  At a minimum it’s a great tool for prototyping and learning language features like dynamic programming, active record, closures, and convention over configuration.  Knowing these concepts will help to become a better programmer in any language. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&amp;amp;tag=exit0d-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0735619670"&gt;Code Complete&lt;/a&gt;.  I just started reading this myself and like it so far.  It’s highly recommended by the people I respect in the industry, which is why I gave it a shot.  Of all of the books here, this may be the best fit for a new programming professional.  It provides the foundational knowledge and best practices to create solid software. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0596529260?ie=UTF8&amp;amp;tag=exit0d-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0596529260"&gt;RESTful Web Services&lt;/a&gt; – this book changed the way I approach web service development.  I think it’s a much better way to build services than the traditional WSDL approach.  It's simpler and it reduces a lot of the overhead needed in the traditional approach. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0596529260?ie=UTF8&amp;amp;tag=exit0d-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0596529260"&gt;SQL Tuning&lt;/a&gt; – a fantastic book on SQL tuning.  This book was indispensable for me when I needed to refactor a database and some queries for a web application I was working on.  I highly recommend although it might not apply directly to anything a new programmer might immediately work on.   Still, a great book and I’d definitely put it on my reading list for the future. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/020161622X?ie=UTF8&amp;amp;tag=exit0d-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=020161622X"&gt;Pragmatic Programmer&lt;/a&gt;.  From the same guys who wrote the Ruby books.  This is another book, like Code Complete, teaching principles to write better software.  Also like Code Complete, it’s another great reference for someone new to the field. &lt;/li&gt;&lt;li&gt;I also really like &lt;a href="http://www.amazon.com/gp/product/0201485672?ie=UTF8&amp;amp;tag=exit0d-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0201485672"&gt;Refactoring&lt;/a&gt; and &lt;a href="http://www.amazon.com/gp/product/0321150783?ie=UTF8&amp;amp;tag=exit0d-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=0321150783"&gt;Lean Software Development&lt;/a&gt;, but I recommend putting these on the “To Read” list until after reading some of the other titles and new programmers gain a little more experience.  I actually think the topics in these two books might be some of the most valuable in the long run, but the foundation of the other books (and some experience) is needed to get the full value out of these.&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/104488715285175512-3945797457679195324?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/3945797457679195324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=3945797457679195324' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3945797457679195324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3945797457679195324'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2009/04/mentoring-reading-list.html' title='Mentoring - Reading List'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-8832652232847250813</id><published>2009-03-30T17:30:00.002-04:00</published><updated>2009-03-31T08:43:14.124-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jena'/><title type='text'>Jena Lessons - The Reasoner</title><content type='html'>&lt;a href="http://vincentfazio.blogspot.com/2009/01/new-surroundings.html"&gt;Earlier this year&lt;/a&gt; I started to work with &lt;a href="http://en.wikipedia.org/wiki/Ontology_%28information_science%29"&gt;ontology&lt;/a&gt;, specifically utilizing &lt;a href="http://jena.sourceforge.net/"&gt;Jena&lt;/a&gt; to process and manipulate an ontology model.  I thought it would be good to share some of what I'm learning as I gain experience programming in this environment.&lt;br /&gt;&lt;br /&gt;I thought I'd start with a quick discussion of the &lt;a href="http://jena.sourceforge.net/inference/"&gt;Reasoner&lt;/a&gt;.  First, let me give my 10-cent understanding of ontology and where the Reasoner fits in to all of this.&lt;br /&gt;&lt;br /&gt;For me, it's easiest to think of an ontology as an object store.  There are classes, and the classes can be related to each other in a number of ways.  In an object oriented sense, these relationships can be &lt;a href="http://en.wikipedia.org/wiki/Association_%28object-oriented_programming%29"&gt;associations&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Aggregation_%28object-oriented_programming%29#Aggregation"&gt;aggregations&lt;/a&gt;, or through &lt;a href="http://en.wikipedia.org/wiki/Inheritance_%28object-oriented_programming%29"&gt;inheritance&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Both the class definitions and the instances of these classes are stored in the ontology.  Like a regular Java class, an ontology class definition might include a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;supertype&lt;/span&gt; and some distinguishing properties.  When an instance of the class is created, the instance gets a unique name (a URI), at least 1 statement to identify it's class, and any number of properties belonging to the unique instance.  This "hard data" belonging to the class instance is often referred to as "facts".&lt;br /&gt;&lt;br /&gt;Additional knowledge can be "inferred" from the model by combining the instance information (facts)  with the data contained in the class relationship.  For example, assume we have the following hierarchy&lt;br /&gt;&lt;ul style="list-style-type: square;"&gt;&lt;li&gt;Animal (class)&lt;br /&gt;&lt;/li&gt;&lt;ul style="list-style-type: square;"&gt;&lt;li&gt;Mammal (class)&lt;br /&gt;&lt;/li&gt;&lt;ul style="list-style-type: square;"&gt;&lt;li&gt;Bear (class)&lt;br /&gt;&lt;/li&gt;&lt;ul style="list-style-type: circle;"&gt;&lt;li&gt;Yogi (instance)&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;The model only really "knows" that Yogi is a Bear, but the Reasoner can "infer" with some certainty that Yogi is also a Mammal and an Animal based on the class relationship.  Note that there is no "hard data" in the model asserting these facts.&lt;br /&gt;&lt;br /&gt;It's the Reasoner that creates this inference information.  The example above was intentionally trivial.  It's not hard to imagine how a more sophisticated model can result in more complex inferences and a much deeper understanding of the data and the relationships contained within.&lt;br /&gt;&lt;br /&gt;Powerful stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-8832652232847250813?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/8832652232847250813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=8832652232847250813' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8832652232847250813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8832652232847250813'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2009/03/jena-lessons-reasoner.html' title='Jena Lessons - The Reasoner'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-6449500868971114156</id><published>2009-03-25T08:56:00.006-04:00</published><updated>2009-08-04T08:46:23.568-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mentoring'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Mentoring - Online Technical Resources</title><content type='html'>As I stated in &lt;a href="http://vincentfazio.blogspot.com/2009/02/mentoring-intro.html"&gt;my last mentoring post&lt;/a&gt;, one thing new professionals need to learn is how to stay technically current and continue to grow their skills in the absence of formal training.  Here's a list of some online technical resources and tools I think any new professional would find helpful.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://martinfowler.com/bliki/"&gt;Martin  Fowler's Bliki&lt;/a&gt;.  Martin Fowler  always has interesting things to say about object oriented design, agile  development, and software development in general.  He is a thought leader and  always says smart things.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.infoq.com/"&gt;InfoQ&lt;/a&gt;  This site has a ton of  info about a ton of software development topics.  What I like most about this site is that there are a lot of videos.  I learn better this way.  It’s nice to watch someone explain a topic and see the examples.  Here’s a &lt;a href="http://www.infoq.com/presentations/soa-without-esb"&gt;Martin Fowler presentation on InfoQ&lt;/a&gt; about SOA and ESB.&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/"&gt;StackOverflow&lt;/a&gt;.  This is  basically a Q&amp;amp;A site for software developers.  It’s fairly new and high quality.  If you really get stumped on how to do something or want a wider range of opinions, this is the place to go.  People answer your questions then vote up the best answers.&lt;/li&gt;&lt;li&gt;&lt;a href="https://secure.delicious.com/"&gt;Delicious&lt;/a&gt;, not a technical resource as much as a tool to save and organize the things you find online.  When you find something helpful on the web, save it here so you can find it again later.  It’s also somewhat helpful to search other people’s bookmarks for common tags if you’re not having much luck with a Google keyword search.  Here’s a link to &lt;a href="http://delicious.com/vincentfazio"&gt;my bookmarks.&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;A suggested "book" reading list is coming soon....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-6449500868971114156?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/6449500868971114156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=6449500868971114156' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6449500868971114156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6449500868971114156'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2009/03/mentoring-online-technical-resources.html' title='Mentoring - Online Technical Resources'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-3942960123723428260</id><published>2009-03-20T15:45:00.002-04:00</published><updated>2009-03-20T15:56:20.338-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>Early Adoption?</title><content type='html'>When is the right time to adopt some new technology -  the shiny "silver bullet" solution that's going to meet all your current and future business needs, make your team ultra responsive to your users, and totally allow you to kick butt?&lt;br /&gt;&lt;br /&gt;Before screaming "get it now!  get it now!", consider the following.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;This technology is new, cutting edge stuff.  Not many people are doing it.  Where can you find help and support when you inevitably hit some road blocks?  Will you be forced to troll message boards and user groups for solutions?  Will you be using the technology in a way that hasn't really been anticipated, pushing you out even further from the mainstream and making it even harder to get good support?&lt;/li&gt;&lt;li&gt;Is this a technology you're buying?  If so, how's the company's technical support and reputation?  What success stories can they point to?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Can you "make do" with some existing (better supported, more widely implemented) solution until this new tech gains wider adoption?  Will the ramp up time to figure out this new technology push out your delivery date?  Are your customers OK with that?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;For me, I'm taking on this new technology risk only if it's my &lt;span style="font-style: italic;"&gt;only &lt;/span&gt;option.  It would be my last resort.  While it's kind of cool to be working on cutting edge stuff, there are just too many risks involved.  Too many risks to the business.  Risks that, in the current economic climate, companies are less willing to tolerate.&lt;br /&gt;&lt;br /&gt;Here are some things I'd like to see before implementing a new technology in my business.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I want to hear success stories.  Instances where capabilities of this new technology greatly enhanced some solution.&lt;/li&gt;&lt;li&gt;I want to know that the new tech will make me and my team more productive.  For me, productivity is the be all and end all.  It allows me to respond to business changes more rapidly, and therefore makes the business more productive and responsive.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I like to see at least one book on Amazon.  There's an additional legitimacy and permanence to seeing some topic in print rather than only mentioned in blog posts or online documentation.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Everyone is different and I wouldn't mind hearing other views on this topic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-3942960123723428260?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/3942960123723428260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=3942960123723428260' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3942960123723428260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3942960123723428260'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2009/03/early-adoption.html' title='Early Adoption?'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-9012831342559155139</id><published>2009-03-06T03:27:00.000-05:00</published><updated>2009-08-04T08:46:23.569-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mentoring'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Mentoring - Intro</title><content type='html'>Recently, I was asked to act as a mentor for a junior level developer.  It was a little awkward in as much as I hardly know this person - we've only briefly met, we're not working on the same team, and not even for the same company.  I'm not even sure what to topics to mentor on.&lt;br /&gt;&lt;br /&gt;Remembering back, one of the hardest things for me when I transitioned from a college setting to professional was learning how to stay current and continue to push my skill set forward.  Until graduation, you're continuously being fed information and guided on what to learn.  After, you need to learn to forage for yourself.  Learning how to do this and where to look is where I thought we might begin.&lt;br /&gt;&lt;br /&gt;Like any new relationship, I thought the best place to start was with a brief introduction, then see where I might be able to best help this new professional.  Here's an excerpt of my introductory email:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;(Introductory text..)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Just to give you some insight into my background, I've been professionally developing software for 12 years.  Most of that time has been spent with Java/J2EE and web development and I have worked with many Java frameworks like Spring and Hibernate.  I've also done some database work (both writing SQL and creating schema).  Quality is one of my highest priorities.  I encourage things like test-driven development, development wikis, automated builds, and the proper use of source control.  As I learn more about what you're doing, I'm sure we'll find more instances where my experience will overlap with your work.  If not, I read a lot of technical blogs and books and hopefully I'll be able to point you in the direction of some great resources.&lt;/span&gt;&lt;/blockquote&gt;Like I mentioned, the purpose of this first email was to just break the ice and offer a few topic areas where I might be able to offer guidance.  We'll see where it goes....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-9012831342559155139?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/9012831342559155139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=9012831342559155139' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/9012831342559155139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/9012831342559155139'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2009/02/mentoring-intro.html' title='Mentoring - Intro'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-2480215215613631554</id><published>2009-03-04T13:37:00.009-05:00</published><updated>2009-03-04T15:16:58.656-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='requirements'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='test driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='podcast'/><category scheme='http://www.blogger.com/atom/ns#' term='development testing'/><title type='text'>Technical Debt</title><content type='html'>This topic seems to be pretty popular lately.  First I saw &lt;a href="http://martinfowler.com/bliki/TechnicalDebt.html"&gt;Martin Fowler's comment&lt;/a&gt; on technical debt last week. Then Jeff Atwood brought up the topic in this week's &lt;a href="http://feeds.conversationsnetwork.org/%7Er/channel/itc/%7E5/K4VWghPcqrY/ITC.SO-Episode43-2009.02.24.mp3"&gt;StackOverflow podcast&lt;/a&gt; (@53:30).&lt;br /&gt;&lt;br /&gt;Basically, technical debt is the price you pay down the road for a "less than optimal" design choice today.  I particularly liked Atwood's metaphor that you know you've incurred technical debt when you give a long sigh every time you need to modify some part of the code base. You know that the changes are going to be painful (and expensive) to make.  It's time to refactor.&lt;br /&gt;&lt;br /&gt;A few comments based on my experience.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I've been noticing less technical debt in my own code since starting to follow a test driven development approach more religiously.  Maybe there's something about this approach which makes your code more "real than theoretical" from the start.  It helps you make better decisions without thinking about it too much.  Maybe it's because TDD also keeps you from incurring any unnecessary technical debt from adding unneeded complexity or overbuilding.  Or maybe it's because you're constantly refactoring as you add tests for new features and functionality that the technical debt seems less.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Maybe lost in this discussion is opposite problem, the technical debt incurred by overbuilding early.  I know I've been involved in a few projects where we knew we would need "X" functionality in a later release.  Thinking ahead, we knew the best way to deliver "X" was to use technology "A".  "A" would be more time consuming and expensive upfront, but there would be less technical debt to deal with in the future.  We were planning ahead and we'd be ready!  Problem was, dealing with the extra complexity of "A" put us over budget and behind schedule on the current version.  The entire project was canceled before ever getting to the later version and all the technical debt we had hoped to save was for not.&lt;br /&gt;&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/104488715285175512-2480215215613631554?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/2480215215613631554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=2480215215613631554' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2480215215613631554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2480215215613631554'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2009/03/technical-debt.html' title='Technical Debt'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-2162861017762574554</id><published>2009-02-06T15:50:00.008-05:00</published><updated>2009-02-07T11:30:41.056-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>Value Teamwork</title><content type='html'>&lt;a href="http://www.pbs.org/wgbh/nova/"&gt;Nova's&lt;/a&gt; episode this past week was titled &lt;a href="http://www.pbs.org/wgbh/nova/spyfactory/"&gt;"The Spy Factory"&lt;/a&gt;.  It wasn't quite what I expected, but it was fascinating.&lt;br /&gt;&lt;br /&gt;Basically, it was about the NSA and how it was tracking Al &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Qaeda&lt;/span&gt; members and their movements (in the US), long before the September 11&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;th&lt;/span&gt; attacks.  It also touched on the CIA and how they also tracked Al &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Qaeda&lt;/span&gt; movements into the US.  The CIA approached the NSA to share information (since they couldn't legally conduct a domestic investigation on these potential terrorists) but the NSA refused to share any information.  Once Al &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Qaeda&lt;/span&gt; activity came stateside, it seems neither agency alerted the FBI.  It all seems so foolish.  All of these agencies are supposed to work together for our common safety.  Was their unwillingness to work together driven by ego, politics, the desire to be national heroes, any or all of the above?&lt;br /&gt;&lt;br /&gt;Obviously, this sort of behavior is not limited to government offices.  I've seen this same behavior on teams and in organizations I worked in and with.  It's a shame.  The teams are not as productive as they should be.  The organization suffers and - worst of all - the people we are supposed to be serving suffer.&lt;br /&gt;&lt;br /&gt;Again and again, I question the motives behind this behavior.  What have we been trained or taught that routinely leads to the choice to chase individual recognition rather than group success for the greater good?&lt;br /&gt;&lt;br /&gt;Individual honors and being an "all star" routinely take the place of learning to work together. The emphasis to stand out and get recognized is viewed as the way to get ahead in life.&lt;br /&gt;&lt;br /&gt;The mirror of this point of view is a communal based system, where pay and status are determined by longevity, rather than performance.  I know some people who work in systems like this and it seems at some point, these people lose the desire to excel - the desire to over deliver.  I don't think this is the answer either.&lt;br /&gt;&lt;br /&gt;Where is the middle ground?  How can team successes be rewarded without sacrificing the ingenuity and innovation spurred on and championed by individuals?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-2162861017762574554?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/2162861017762574554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=2162861017762574554' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2162861017762574554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2162861017762574554'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2009/02/value-teamwork.html' title='Value Teamwork'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-2146831141459605109</id><published>2009-02-03T15:28:00.004-05:00</published><updated>2009-02-03T16:03:54.838-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>I Don't Know</title><content type='html'>Why are these three words so hard for some people to mutter?  The fear of being caught without an answer is so scary, that some people will say &lt;span style="font-style: italic;"&gt;anything &lt;/span&gt;to avoid having no answer at all.&lt;br /&gt;&lt;br /&gt;It's a big problem.&lt;br /&gt;&lt;br /&gt;Consider this: you ask a question and you get an answer.  You accept the answer as true because you think, "why would someone mislead me?".  And you're right, they're not intentionally misleading you, but they have an intrinsic need to give you an answer - &lt;span style="font-style: italic;"&gt;any answer&lt;/span&gt; - so that they don't "lose face" or something.&lt;br /&gt;&lt;br /&gt;I just can't wrap my head around this behavior because most likely, you'll take some course of action based on the answer to your question.  But when you start to notice things - things that don't make any sense and couldn't possibly happen if the information you got was correct -you'll spend a lot of effort reevaluating your beliefs and doing your own research.  Eventually (and after some frustration), you'll find something that contradicts the initial information you got (in the form of your original answered question).&lt;br /&gt;&lt;br /&gt;Oh boy.  Now what do you do?  Which answer is right?  You dig deeper to find a third source to corroborate either answer.&lt;br /&gt;&lt;br /&gt;Now the whole point of asking the question in the first place was to try and avoid all this digging but in fact, you're probably now dong more research than you would've done if you've never gotten that initial answer in the first place.&lt;br /&gt;&lt;br /&gt;Eventually, you finally discover that the first person was full of BS.  What's worse, when you try and educate them with the right information they'll sometimes start to argue or rationalize their ignorance.  They've now lost all credibility in your eyes.  You can never again accept what they say at face value and you'll always question the things they say.  &lt;span style="font-style: italic;"&gt;Everyone loses&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Is this behavior a product of our education and training, where refusing to answer a question you don't know is considered "wrong"?  I don't know, but I wish I could stop it.&lt;br /&gt;&lt;br /&gt;It's OK to say "I don't know".  No lost credibility.  No need to raise the BS filter in every future conversation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-2146831141459605109?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/2146831141459605109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=2146831141459605109' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2146831141459605109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2146831141459605109'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2009/02/i-dont-know.html' title='I Don&apos;t Know'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-31874008288316624</id><published>2009-01-24T07:16:00.001-05:00</published><updated>2009-01-24T07:40:28.669-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>New Surroundings</title><content type='html'>I would really like to post more often, but frankly, I've been too busy.  The New Year brought a change of job scenery and I've been really busy getting up to speed and learning a ton of new things.&lt;br /&gt;&lt;br /&gt;That's not to say I haven't been writing at all.  As I come up to speed here, I'm taking the opportunity to capture what I learn in a development wiki. My new team has a wiki instance in place, but it's been lightly used to this point.  I'm a &lt;a href="http://vincentfazio.blogspot.com/search/label/wiki?max-results=100"&gt;huge fan of using wikis for development&lt;/a&gt;.  I like to leverage the wiki as a focal point to capture technical ideas and documentation for the team.  Most people seem eager to contribute, so I hope it takes off. &lt;div style="margin-left: 40px; font-style: italic;"&gt;One point here, we're using the wiki included with &lt;a href="http://www.microsoft.com/Sharepoint/default.mspx"&gt;SharePoint&lt;/a&gt;.   It's not nearly as hard to edit as &lt;a href="http://www.mediawiki.org/wiki/MediaWiki"&gt;MediaWiki&lt;/a&gt; (the Wikipedia wiki engine), but I still prefer &lt;a href="http://moinmoin.wikiwikiweb.de/"&gt;MoinMoin&lt;/a&gt; (used by many Apache projects). &lt;/div&gt;&lt;br /&gt;The heart of the software being built here relies on &lt;a href="http://en.wikipedia.org/wiki/Ontology_%28information_science%29"&gt;Ontology&lt;/a&gt;, and leveraging the data stored in that ontology.  Ontology has always been a kind of slippery concept for me to grasp and while I've worked at another place which also did some ontology-related work, this seems "different"somehow.   I'm sure it has to do with my limited understanding of this concept.  I won't be involved directly in defining any ontologies (nor was I before).  Like before, my job will be to create tools to help users sift through the ontology and find meaningful data and relationships so that they can, in turn, make better decisions more efficiently.&lt;br /&gt;&lt;br /&gt;The tool used here to create the ontology is &lt;a href="http://www.topquadrant.com/topbraid/composer/tbc-me.html"&gt;Top Braid Composer&lt;/a&gt;.  We're accessing the data using &lt;a href="http://www.w3.org/TR/rdf-sparql-query/"&gt;Sparql&lt;/a&gt;, which is sort of like SQL for ontologies.  And we can connect to the ontology model directly through Java using the &lt;a href="http://jena.sourceforge.net/"&gt;Jena&lt;/a&gt; library.  At this point, I'm just starting to learn to use these tools.&lt;br /&gt;&lt;br /&gt;The UI is being developed in &lt;a href="http://www.adobe.com/products/flex/"&gt;Flex&lt;/a&gt;.  I've been &lt;a href="http://vincentfazio.blogspot.com/2008/02/podcast-prototyping.html"&gt;wanting to do some Flex development&lt;/a&gt; for quite some time and am eager to start contributing.  The team has chosen the &lt;a href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm"&gt;Cairngorm&lt;/a&gt; micro architecture to help enforce best practices in the Flex framework.&lt;br /&gt;&lt;br /&gt;Other than that, version control is &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; and we're now starting to use &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; for automated builds.&lt;br /&gt;&lt;br /&gt;All in all, it seems like a solid environment to get things done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-31874008288316624?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/31874008288316624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=31874008288316624' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/31874008288316624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/31874008288316624'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2009/01/new-surroundings.html' title='New Surroundings'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-6052716997507417300</id><published>2009-01-04T18:38:00.005-05:00</published><updated>2009-01-05T12:43:08.250-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Happy 2009!</title><content type='html'>As the work calendar turns to 2009, it's natural to reflect on the past year.  Professionally, 2008 was a very frustrating year.  Part of it had to do with the tools I was using, part of it had to do with the project I was working on, and a lot of my frustration was that I felt like I wasn't being heard.&lt;br /&gt;&lt;br /&gt;Instead of rehashing some of the difficulties I've experienced over the past year, I invite you to read some of my &lt;a href="http://vincentfazio.blogspot.com/2008/07/process-over-technology.html"&gt;previous posts&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So, how do I hope to course correct in 2009?&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Do More&lt;/b&gt;&lt;br /&gt;Many times in 2008, I found myself waiting for others to complete some part of their work so I could do mine.  Other times, we hit &lt;a href="http://vincentfazio.blogspot.com/2008/04/silver-bullet-syndrome.html"&gt;limitations&lt;/a&gt; of the development platform we were working on and waited for management approval for how we should proceed.&lt;br /&gt;&lt;br /&gt;In these instances I often had an alternative in mind for how to proceed, but didn't.  I instead hung back and tried to let others do their jobs, make their own decisions, and get consensus on an approach.&lt;br /&gt;&lt;br /&gt;I regret this approach.&lt;br /&gt;&lt;br /&gt;I wish I had been a little more proactive in these instances and at least started to work on prototypes for my alternative solutions.  I have a feeling that these "prototypes" would've eventually become the solutions we needed.  Too often these issues got lost in a myriad of meetings or priorities got shuffled and in time, nothing got done.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Communicate Better&lt;br /&gt;&lt;/b&gt;I went into 2008 hoping to make a big impact on the organization I was with.  The team was new to java and I hoped to start a java users group.  I saw where improvements could be made in &lt;a href="http://vincentfazio.blogspot.com/2008/05/unit-test-saga.html"&gt;testing&lt;/a&gt; and &lt;a href="http://vincentfazio.blogspot.com/2008/03/change-control-gone-wrong.html"&gt;change control&lt;/a&gt;, and made suggestions.  Early on, I felt that we might have  problems with our application architecture and I voiced my concerns.&lt;br /&gt;&lt;br /&gt;My communication style was basically make some suggestions, answer whatever questions I could, then wait for followup.  My big mistake was waiting.  I needed to be more proactive and follow up on my own.  I needed to be more assertive and urgent.&lt;br /&gt;&lt;br /&gt;Part of the reason I write this silly blog is so I could learn to communicate my thoughts a little more effectively.  I feel it has been a great tool in that respect, but if no one reads it, what good does it really do aside from some academic exercise?&lt;br /&gt;&lt;br /&gt;I've heard that &lt;a title="How to Win Friends &amp;amp; Influence People" href="http://www.amazon.com/How-Win-Friends-Influence-People/dp/0671027034/ref=wl_it_dp?ie=UTF8&amp;amp;coliid=I3A7CRK2QZCZU3&amp;amp;colid=XZSZE5F291LT" id="jdtg"&gt;How to Win Friends &amp;amp; Influence People&lt;/a&gt; and &lt;a title="Secrets of Consulting: A Guide to Giving and Getting Advice Successfully" href="http://www.amazon.com/Secrets-Consulting-Giving-Getting-Successfully/dp/0932633013/ref=wl_it_dp?ie=UTF8&amp;amp;coliid=IKX6BWK2FGKWA&amp;amp;colid=XZSZE5F291LT" id="lkx0"&gt;Secrets of Consulting: A Guide to Giving and Getting Advice Successfully&lt;/a&gt; are both great books that can help me get my message across better.  I'm going to read both of them early this year.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Act Positively&lt;/b&gt;&lt;br /&gt;All too often I've heard myself say, &lt;i&gt;"XYZ is not working.  Here's what I think we should do..."&lt;/i&gt;  This is a negative way to approach a problem.  People will naturally become defensive when hearing this language and may stop listening before you even get to pose the solution.&lt;br /&gt;&lt;br /&gt;I've been doing a lot of reading on Disney the past few months.  I wanted to learn more about how they go about executing these enormously large projects, with so many people, so effectively.&lt;br /&gt;&lt;br /&gt;One of the tricks they do is always ask "&lt;span style="font-style: italic;"&gt;what if&lt;/span&gt;" and "&lt;span style="font-style: italic;"&gt;why not&lt;/span&gt;".  They always say "&lt;span style="font-style: italic;"&gt;Yes, if...&lt;/span&gt;" instead of "&lt;span style="font-style: italic;"&gt;No, because...&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;This approach enables communication and invites exploration of better ways to do things.  It removes any negativity and ego from the conversation.&lt;br /&gt;&lt;br /&gt;This is my #1 goal for 2009.&lt;br /&gt;&lt;br /&gt;Happy New Year!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-6052716997507417300?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/6052716997507417300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=6052716997507417300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6052716997507417300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6052716997507417300'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2009/01/happy-2009.html' title='Happy 2009!'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-7135402622783608936</id><published>2008-12-15T11:56:00.014-05:00</published><updated>2008-12-15T14:43:20.356-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>Performance Tuning JCAPS - Part 2</title><content type='html'>It's been close to 2 months since my first&lt;a href="http://vincentfazio.blogspot.com/2008/10/performance-tuning-jcaps.html"&gt; Performance Tuning JCAPS&lt;/a&gt; post.  Since then, we've noticed our servers running out of TCP connections under heavy load.  Researching this problem, we learned that the &lt;a href="http://vincentfazio.blogspot.com/2008/11/right-tool-for-job.html"&gt;JCAPS' JMS server makes heavy use of TCP in implementing Request/Reply queues&lt;/a&gt;.   We approached Sun for guidance and they assured us that they've had success implementing high throughput applications using the JMS request reply solution... but how?&lt;br /&gt;&lt;br /&gt;It appears a multi-step solution is needed.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;First, running out of TCP connections in a scenario like ours is a JCAPS bug addressed in an ESR (110348) and rolled into &lt;a href="http://wikis.sun.com/display/JavaCAPS/Java+CAPS+5.1.3+Update+Release+3"&gt;JCAPS 5.1.3 Update Release 3&lt;/a&gt;.  We installed this update and noticed a marked improvement.  Running my simple 75 user simulated test, transactions took 2521 ms to round trip (compared to the previous time of 20128ms).  While this is great improvement, an average of 2.5 seconds is still really slow for this simple transaction.&lt;/li&gt;&lt;li&gt;We reported our findings to Sun and they responded with 3 additional suggestions to try.&lt;ul&gt;&lt;li&gt;The first suggestion was to turn on the socket pooling in the JMS server.  This is accomplished by setting the JMS URL to&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;code&gt;stcms://hostname:18007?com.stc.jms.socketpooling=true&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;in the eDesigner's Environment Explorer setting for this logical host.&lt;/li&gt;&lt;li&gt;The second suggestion was to change the registry setting for &lt;a href="http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/regentry/58811.mspx?mfr=true"&gt;&lt;code&gt;TcpTimedWaitDelay&lt;/code&gt;&lt;/a&gt; to 30.  This setting controls time a TCP resource is made available to the system again after the connection is closed.&lt;/li&gt;&lt;li&gt;the final suggestion was to change the registry setting for &lt;a href="http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/regentry/58791.mspx?mfr=true"&gt;&lt;code&gt;MaxUserPort&lt;/code&gt;&lt;/a&gt; to 65534, making more TCP port numbers available.&lt;/li&gt;&lt;/ul&gt;The combination of these changes led to an amazing upgrade in performance to 110 ms for the previously run 75 user test - or as I like to say "pretty darn quick".&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;So, what's my opinion on all this?  Obviously I'm really happy with the results, but the steps leading to the solution is what has me scratching my head a little.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ESRs are unnecessarily hard to implement.  First you need to determine the prerequisites and corequisites to install with these patches.  Sometimes these are listed in the ESR documentation, but often times they aren't and a call to Sun is needed to sort it all out.&lt;br /&gt;Then once you have all the ESR you need, the repository, integration server, and eDesinger all need the patches before you recompile and redeploy the code.  Needless to say, this is pretty time consuming.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I did not see any reference to this JMS server URL change in any documentation.  It seems that the URL is the only place you can change this setting.  There is not administrative console to make this change.  Bummer, since it seems pretty important.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;As for the registry settings, environment changes are often the first thing forgotten and the last remembered when upgrading to a new server.  I don't like making changes that affect my applications which aren't checked into some sort of source control.&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/104488715285175512-7135402622783608936?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/7135402622783608936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=7135402622783608936' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7135402622783608936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7135402622783608936'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/12/performance-tuning-jcaps-part-2.html' title='Performance Tuning JCAPS - Part 2'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-104488715285175512.post-3892014572865163908</id><published>2008-12-06T18:17:00.001-05:00</published><updated>2008-12-06T18:20:51.465-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Side Effects May Include...</title><content type='html'>Software development is complex.  A lot of communication is needed to coordinate with users and between teams to synchronize efforts.  On large teams developing distributed systems, effective communication is exponentially harder.  In addition to the users and development teams, you also need to deal with system admins, DBAs, network, and change control specialists. &lt;br /&gt;&lt;br /&gt;In many environments, this later group of people (the system admins, DBAs, etc.) do not get involved with the project until late stages.  The development team might have free reign over development databases for instance, but when the code migrates to a certification environment things are suddenly very different.  Teams move from surroundings where they have total control of machine settings, databases, and resources to an environment where they have none.&lt;br /&gt;&lt;br /&gt;Often, during the migration to a test or production environment things are often "forgotten".  Things that often don't make it into an application's change control system.... database schema updates, new environment settings, property file changes.  If these changes are not documented for migration to production, it's a disaster resulting in an embarrassing mad scramble to remember and apply these changes on deployment day.  No one feels good after backing out a bad production roll out of a system.&lt;br /&gt;&lt;br /&gt;The knee jerk reaction when something like this goes wrong is to add more process - more forms, more user sign offs, an increase in role based access to systems.  This seldom however fixes the problem - it just adds more overhead to getting the problem fixed once these problems rear their ugly heads again.&lt;br /&gt;&lt;br /&gt;What's really needed is a better process through automation, not more process.  Automate testing of the system.  Create batch files to apply schema updates, change environment variables, deploy the application, and test in a single step.  Use this script in your test environment and run &lt;i&gt;the same script&lt;/i&gt; when you migrate to production.&lt;br /&gt;&lt;br /&gt;All the time we try to sell the business on automating their processes through the programs we write.  It always baffles me that, as software developers, we seldom take our own advice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-3892014572865163908?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/3892014572865163908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=3892014572865163908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3892014572865163908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3892014572865163908'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/12/side-effects-may-include.html' title='Side Effects May Include...'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-1611350511200098719</id><published>2008-12-03T15:38:00.002-05:00</published><updated>2008-12-13T07:35:59.198-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><title type='text'>Secret Sauce</title><content type='html'>Good things always have that "secret sauce" - the element that sets it apart from the pack and makes it better than anything else.  The "secret sauce" takes something ordinary and makes it extraordinary.  It's a Mac vs. a laptop.  Disney World vs. a theme park.  A Big Mac vs. a hamburger.&lt;br /&gt;&lt;br /&gt;When I hear company execs talk about what sets their companies apart, it seems there's no real "secret" to the sauce after all.  It boils down to hard work and a commitment to your customers.  A commitment to a better user experience.  A commitment to treating every guest interaction "special".  A commitment to a good hamburger every time.  There's not a magic switch you can flip... it's a commitment to excellence through hard work.  Looking for a shortcut to this kind of success is a waste of time.&lt;br /&gt;&lt;br /&gt;All too often I've seen software development teams look for magic switches rather than commit to the hard work of fixing the underlying problem.  For instance, attempting to fix database problems through caching when the real problem is in the underlying schema.  Changing the graphics on a website, while ignoring usability problems.  Refusing to correct a broken architecture by continuing to throw more server resources to the application.&lt;br /&gt;&lt;br /&gt;I've never seen one of these approaches work long term, and the time spent exploring these workarounds took time and resources away from fixing the actual underlying problem and long term success.&lt;br /&gt;&lt;br /&gt;In each instance, the commitment to fixing the problem was abandoned in favor of the quick and inexpensive band aid to hide the flaws.&lt;br /&gt;&lt;br /&gt;It's why these products struggle to achieve success while the Mac, Disney World, and the Big Mac continue shine as examples of truly great products.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-1611350511200098719?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/1611350511200098719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=1611350511200098719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/1611350511200098719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/1611350511200098719'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/12/secret-sauce.html' title='Secret Sauce'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-399426547708868869</id><published>2008-11-26T10:43:00.009-05:00</published><updated>2008-11-26T13:19:58.115-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>Right Tool for the Job</title><content type='html'>Business transactions can vary widely in their definitions, but they can basically be classified into two types - those where I need an immediate response so I can continue with my work and those where I'm going to tell you what to do and trust that you'll get it done while I move on to something else.  These classifications are otherwise known respectively as &lt;i&gt;synchronous &lt;/i&gt;and &lt;i&gt;asynchronous &lt;/i&gt;transactions.&lt;br /&gt;&lt;br /&gt;When designing an architecture for solving business problems, it's helpful to figure out which type of problem you're solving and then pick an appropriate technology to support it.  For example, HTTP might be a good choice for synchronous applications since it is request/reply by nature.  JMS might be a better fit for asynchronous solutions since these structures are typically one way.&lt;br /&gt;&lt;br /&gt;Blurring the lines is the JCAPS offering of a request/reply mechanism for JMS messaging - called appropriately enough, &lt;i&gt;JMS RequestReply&lt;/i&gt;.  A colleague called this mechanism "synchronous by asynchronous" and I think that's an appropriate description.&lt;br /&gt;&lt;br /&gt;In JCAPS, when a RequestReply queue is used,  a dynamic connection (actually a TCP socket) is created for each RequestReply request.  When the reply is generated, it is placed on the dynamic queue using the JCAPS Message &lt;span style="font-family:Courier New;"&gt;sendto&lt;/span&gt; method.&lt;br /&gt;&lt;br /&gt;On the surface this seems pretty cool... now I have 2 ways to skin the synchronous cat.&lt;br /&gt;&lt;br /&gt;But what's the cost of creating that dynamic JMS connection?&lt;br /&gt;&lt;br /&gt;I've created a simple tester that tests some number of simultaneous clients, each submitting 100 transaction requests.  Comparing the JCAPS RequestReply mechanism with HTTP response times.  Here's the data (all times are milliseconds):&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;table style="width: 332px; height: 138px;" class="zeroBorder" id="xu60" border="0" cellpadding="3" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="33%"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="text-align: center;" width="33%"&gt;&lt;b&gt;JMS RequestReply&lt;br /&gt;    &lt;/b&gt;&lt;/td&gt;&lt;td style="text-align: right;" width="33%"&gt;&lt;b&gt;HTTP&lt;br /&gt;    &lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: center;" width="33%"&gt;&lt;b&gt;1 User       &lt;/b&gt;&lt;/td&gt;&lt;td style="text-align: right;" width="33%"&gt;5 ms&lt;br /&gt;&lt;/td&gt;&lt;td style="text-align: right;" width="33%"&gt;0 ms&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: center;" width="33%"&gt;&lt;b&gt;25 Users&lt;br /&gt;    &lt;/b&gt;&lt;/td&gt;&lt;td style="text-align: right;" width="33%"&gt;639 ms&lt;br /&gt;&lt;/td&gt;&lt;td style="text-align: right;" width="33%"&gt;2 ms&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: center;" width="33%"&gt;&lt;b&gt;50 Users&lt;br /&gt;    &lt;/b&gt;&lt;/td&gt;&lt;td style="text-align: right;" width="33%"&gt;4791 ms&lt;br /&gt;&lt;/td&gt;&lt;td style="text-align: right;" width="33%"&gt;11 ms&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: center;" width="33%"&gt;&lt;b&gt;75 Users&lt;br /&gt;    &lt;/b&gt;&lt;/td&gt;&lt;td style="text-align: right;" width="33%"&gt;20128 ms&lt;br /&gt;&lt;/td&gt;&lt;td style="text-align: right;" width="33%"&gt;654 ms&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The RequestReply response time degrades much faster than the HTTP response time.  Using JMS in this way is not a good fit for these synchronous transactions.  It's a square peg in a round hole.&lt;br /&gt;&lt;br /&gt;In this instance JMS (or at least JMS RequestReply) does not seem like the right tool for the job.  And further, just because a tool might add some functionality that allows you to do something you couldn't do otherwise, it doesn't mean you should.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-399426547708868869?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/399426547708868869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=399426547708868869' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/399426547708868869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/399426547708868869'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/11/right-tool-for-job.html' title='Right Tool for the Job'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-1084258456798944492</id><published>2008-10-28T13:05:00.003-04:00</published><updated>2008-10-28T13:16:50.775-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>Performance Tuning JCAPS</title><content type='html'>We're getting close to (finally) deploying our JCAPS rewrite to production.  Our final task is to load test and "tune" the application - making sure it will handle the expected production transaction load.&lt;br /&gt;&lt;br /&gt;Prior to executing the load test, we added logging statements to report on the amount of processing time spent in each JCD (or processing unit for those non-JCAPpers out there).  Using this info, we can determine the slow running processes and optimize them.  For this optimization we could follow a traditional approach and profile the code, or we could take an easier route and configure JCAPS to throw more resources at the bottlenecks.  This second option is done in the JCAPS connectivity map by increasing the maximum number of threads allocated to run the process.  Clicking the input line to the JCD to open the properties, you can set the "Server session pool size" in the Advanced tab (NOTE: this setting is only for JCDs listening to JMS queues or topics).&lt;br /&gt;&lt;br /&gt;I'm not sure how I feel about this really.  On one hand, it's pretty cool to have this level of control.  On the other hand, I'm wondering why I even have to deal with this.  I mean, I don't ever need to set the maximum number of requests a web service can handle.  The server automatically scales to the number of requests it receives until it runs out of resources.&lt;br /&gt;&lt;br /&gt;I'm wondering why JCAPS JMS services cannot follow a similar approach as load becomes heavy?  Maybe something similar to a database connection pool that could grow and reuse JMS listeners would provide an extensible solution?&lt;br /&gt;&lt;br /&gt;Another question I have is why the architect of this application chose JMS over HTTP for the SOA medium between these services?  We have no requirement for guaranteed delivery.  This is a real time system, so there's no need to queue up messages if a certain component cannot respond for a while (those transactions will simply timeout).  To me, JMS does not seem like the right fit for this application.&lt;br /&gt;&lt;br /&gt;I'd be interested to hear other thoughts on this architecture choice.  Is it possible I'm missing something?  The people who made these decisions are no longer around to ask...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-1084258456798944492?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/1084258456798944492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=1084258456798944492' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/1084258456798944492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/1084258456798944492'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/10/performance-tuning-jcaps.html' title='Performance Tuning JCAPS'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-2753493387199341370</id><published>2008-10-16T10:31:00.008-04:00</published><updated>2008-10-16T11:53:11.985-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>Contractors (ugh)</title><content type='html'>Contractors - programming contractors, general home contractors like builders, plumbers or electricians, and even mechanics - have bad reputations.  While everyone needs these skilled professionals to complete work where they have little expertise, there an inherent distrust in these relationships.  Distrust - where total trust is needed.&lt;br /&gt;&lt;br /&gt;Many times it's unwarranted because contractors are as honest and hard working as anyone else.  So why is it so?  I think a number or relatively minor, easily correctable behaviors lead to this perception.&lt;br /&gt;&lt;br /&gt;Personally, I have changed mechanics more than I care to comment on.  Not because I felt they were &lt;span style="font-style: italic;"&gt;screwing &lt;/span&gt;me necessarily, but mostly because they didn't explain the work they were performing to my satisfaction.  This led me to doubt their abilities.  The doubt and distrust lead me to look for another mechanic who I have more confidence in.  It's too bad.  I hate shopping around for new mechanics.&lt;br /&gt;&lt;br /&gt;At home, we recently added a room to our house.  We've all heard horror stories in dealing with these general contractors, so we were pretty picky when it came to selecting one.  We checked references, drove by recent jobs, and talked to as many people as we could for recommendations.  We selected a good builder and are really happy with the work, but he tried to &lt;span style="font-style: italic;"&gt;insist&lt;/span&gt; on final payment &lt;span style="font-style: italic;"&gt;a few days &lt;/span&gt;before the job was complete.  This soured the whole experience.  Not only that, but he cost himself the opportunity for future work with me or a recommendation to my friends.  This was totally unnecessary, stupid, and shortsighted on his part.&lt;br /&gt;&lt;br /&gt;At work, one of the other contractors I'm working with went above and beyond the customer specs to create a tool they're finding indispensable for debugging and monitoring the system we built.  Now - he's refusing to deliver the source code for this tool.  How do you think the customer is reacting to this? (HINT: not good)  Even if he had started this tool before he walked in the door at the customer site and didn't charge the customer for any of the enhancements - it's pretty clear that he worked on the changes at the customers site.  The customer's perception is that they paid for at least some of the work.  They believe they deserve the source so they can maintain and enhance this tool they've become dependent on.  If I were the client, I'd feel the same way. I'm not affiliated with this person in any way other than we are both contractors, but this situation is starting to affect my relationship with the client.&lt;br /&gt;&lt;br /&gt;It's tough to know how to react in these situations, but as a contractor myself, I feel it's important to at least recognize these trends and not let them interfere with my client relationships.  As a contractor, try to:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Explain all work to be done to the customer's satisfaction.&lt;/li&gt;&lt;li&gt;Don't make trivial demands on the customer (like early payment).  It sours the customer experience and may cost you future work.&lt;/li&gt;&lt;li&gt;Happily deliver whats expected.  I'm sure there are situation where customers expectations are too high, but part of the job is setting expectations at the right level.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Remember, even if you're working for a company directly the business is your client.  This advice pertains to you as well.  Hopefully it helps replace a lot of the doubt and distrust with confidence and assurance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-2753493387199341370?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/2753493387199341370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=2753493387199341370' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2753493387199341370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2753493387199341370'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/10/contractors-ugh.html' title='Contractors (ugh)'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-107936342245763674</id><published>2008-10-14T13:22:00.008-04:00</published><updated>2009-08-04T09:15:52.863-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='requirements'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='test driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='behavior driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='schedules'/><category scheme='http://www.blogger.com/atom/ns#' term='management'/><category scheme='http://www.blogger.com/atom/ns#' term='change control'/><category scheme='http://www.blogger.com/atom/ns#' term='development testing'/><title type='text'>Ideal Software Development</title><content type='html'>&lt;div&gt;               I'm the type of person who constantly looks for ways to improve.  No matter how well things go, I'm always striving to "plus" an experience - smooth out the rougher edges to make the next time even better.  Sometimes the need to do this drives me a little nuts.  It drives my wife really nuts!&lt;br /&gt;&lt;br /&gt;When things don't go well, this task can be a little overwhelming (and depressing).  There are so many areas for improvement, it's hard to know where to begin.&lt;br /&gt;&lt;br /&gt;I've spent the last year or so, reexamining my software development experience - looking for trends in the tools and ideas that helped the teams I was on to be highly productive (and conversely where the lack of some practices led to a lack of productivity and frustration).  Combined with many of the things I've read by &lt;a href="http://www.joelonsoftware.com/" rel="nofollow"&gt;Spolsky&lt;/a&gt;, &lt;a href="http://martinfowler.com/bliki/" rel="nofollow"&gt;Fowler&lt;/a&gt;, and the &lt;a href="http://www.amazon.com/exec/obidos/search-handle-url/ref=ntt_athr_dp_sr_1?_encoding=UTF8&amp;amp;search-type=ss&amp;amp;index=books&amp;amp;field-author=Mary%20Poppendieck" rel="nofollow"&gt;Poppendiecks&lt;/a&gt;.  I've created a list of criteria I'd consider essential in an ideal software development environment.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Talk to the target users of your systems to determine the &lt;b&gt;requirements &lt;/b&gt;of the system you are building.  Watch them work and try to identify areas to automate - focus on the mundane or frustrating tasks they perform on a daily basis.  In a B2B environment, understand the business purpose behind the transactions and the manual interactions they replace.  If you can't find or don't have access to your target users, create an idealized version of the people you hope to help and share that vision with your team.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;br /&gt;In either case, &lt;i&gt;learn as much about the business and the people you want to help as possible.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Document what you learn and prioritize needs (I prefer a wiki as a low friction method to do this).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Create a &lt;b&gt;schedule &lt;/b&gt;based on the requirements gathered while learning about the business.  My initial schedule typically looks like a list of the customer needs I've identified sorted by priority.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;br /&gt;Try and break these tasks down into subtasks that can be completed in a week or less.  This will allow you to work in 1-2 week iterations and you'll instantly know whether you are ahead or behind schedule.&lt;br /&gt;&lt;br /&gt;Update the schedule as iterations are completed.  I've had good experiences using something as simple as a wiki to track scheduled tasks.&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Practice "test first" development&lt;/b&gt;.  This practice has boosted my productivity more so than any other in this list.  The benefits are many.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;br /&gt;First, test first development requires you to think about your requirements in detail - by defining the code scope needed to implement those requirements.  The tests document the "real" (implemented) requirements for your system.  It gives you a place to start.&lt;br /&gt;&lt;br /&gt;Secondly, it's the easiest way to know that you're finished (when all the tests pass... you're done).  This prevents overbuilding (adding extra source code that may be viewed as robust, but doesn't actually meet any requirement).  This "extra" code makes maintenance more complex and expensive.&lt;br /&gt;&lt;br /&gt;Finally, the tests give maintainers of the code some assurance that their future changes are not breaking any existing functionality.  Again reducing maintenance costs.&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Create an &lt;b&gt;automated build&lt;/b&gt;.  What this means is that you can check out and build any version of the system from source control in a single step (this also implies that you're using &lt;b&gt;source control&lt;/b&gt;).  Nothing is more frustrating than checking out some source code to work on and not being able to compile it.  Sometimes it's because there's no "make file".  Sometimes dependent libraries are missing (or you can't identify the correct version).  Sometimes it's because someone checked in "broken" code.  Either way it's annoying and nothing is worse for productivity than having to track these issues down.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Manage software releases&lt;/b&gt;.  Create some method to tag releases (don't all source control systems have a way to do this?) and embed this tag somewhere in your delivered source code.  This way, when a customer reports a problem (&lt;b&gt;bug&lt;/b&gt;) with the software, &lt;i&gt;they can tell you which version of the software they have &lt;/i&gt;and you can check out that exact version in an attempt to recreate and fix the problem.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Use a&lt;b&gt; bug database&lt;/b&gt;.  Track all known issues with your software.  Work bug fixes into your &lt;b&gt;schedule &lt;/b&gt;based on their priority in relation to new features.  Again, this can be as quick and simple as a wiki page to track issues and linked to the schedule.  Remember, criteria to recreate bugs become additional tests.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;                  &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Ironically, I have experience with all of the items on my list but no single team followed all these practices.  The most effective teams I've worked on met most of these criteria.  The least productive place I worked had no desire to adopt any of these practices (and was a total disaster).&lt;br /&gt;&lt;br /&gt;Also of note is that none of this criteria is tied to any specific technology. Java or .Net - SOA or traditional linear development -  open or closed source these practices will make your teams more productive.&lt;br /&gt;&lt;br /&gt;The bottom line is getting things done, working efficiently, and delivering value to the business - that sounds ideal to me!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-107936342245763674?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/107936342245763674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=107936342245763674' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/107936342245763674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/107936342245763674'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/10/ideal-software-development.html' title='Ideal Software Development'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-6514726614780491478</id><published>2008-10-09T14:39:00.008-04:00</published><updated>2008-10-09T15:50:01.299-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech news'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='tv'/><category scheme='http://www.blogger.com/atom/ns#' term='podcast'/><title type='text'>Random Thoughts</title><content type='html'>I haven't been doing too much development as I wait (and wait and wait) for our acceptance testing to complete.  Here's a quick rundown of what I've been thinking about while waiting for that to complete....&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I've been reading and participating in some of the discussions on &lt;a href="http://stackoverflow.com/"&gt;StackOverflow&lt;/a&gt;.  It's a great way to get a pulse on what others are thinking about and working on.  I've also been able to pick up some things I never knew existed before.  I've taken part in &lt;a href="http://www.linkedin.com/answers"&gt;other question and answer type sites&lt;/a&gt; before and I had my doubts how helpful this would really be... I've been pleasantly surprised.&lt;/li&gt;&lt;li&gt;I listened to these &lt;a href="http://itc.conversationsnetwork.org/shows/detail3819.html"&gt;great&lt;/a&gt; &lt;a href="http://itc.conversationsnetwork.org/shows/detail3825.html"&gt;podcasts &lt;/a&gt;on alternative energy.  Grass as fuel??  Pretty cool.  I've been thinking about maybe getting some solar panels for my house.  I would never have thought that the Northeast would be a good place for these until I saw a cool episode of &lt;a href="http://www.pbs.org/wgbh/nova/solar/program.html"&gt;Nova&lt;/a&gt; sometime back where someone in Mass. had some installed on their house.  Now maybe I'll also look into one of these pellet furnaces.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.se-radio.net/"&gt;Software Engineering Radio&lt;/a&gt; always covers great topics that I wouldn't otherwise have time to look into (&lt;a href="http://www.se-radio.net/podcast/2008-08/episode-106-introduction-aop"&gt;AOP&lt;/a&gt;, &lt;a href="http://www.se-radio.net/podcast/2008-08/episode-108-simon-peyton-jones-functional-programming-and-haskell"&gt;Functional Programming&lt;/a&gt;, etc.).   One of their more recent episodes covered the topic of &lt;a href="http://www.se-radio.net/podcast/2008-09/episode-110-roles-software-engineering-i"&gt;Roles in Software Engineering&lt;/a&gt;.  One of the skills they identified for a good Technical Lead (Architect) is the ability to identify the simplicity in complexity.  Amen.  For me, there is no greater complement someone can give to my work than to say how simple a solution looks.  It takes more effort and skill than many people realize to achieve this.&lt;/li&gt;&lt;li&gt;I've been thinking more and more about what I would view as an ideal development environment.  More on this in a future post...&lt;br /&gt;&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/104488715285175512-6514726614780491478?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/6514726614780491478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=6514726614780491478' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6514726614780491478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6514726614780491478'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/10/random-thoughts.html' title='Random Thoughts'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-1355213313126421881</id><published>2008-09-16T14:14:00.010-04:00</published><updated>2008-10-12T19:33:37.864-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development testing'/><title type='text'>"Nobody knows the trouble I've seen..."</title><content type='html'>I haven't had a lot to write about this month.  I'm in the middle of this seemingly endless, painful cycle where the more we regression test, the more unimplemented requirements we uncover.  That's right, &lt;span style="font-style: italic;"&gt;regression &lt;/span&gt;&lt;span style="font-style: italic;"&gt;testing is defining our requirement set&lt;/span&gt;.  It's a symptom of this &lt;a href="http://vincentfazio.blogspot.com/2008/07/process-over-technology.html"&gt;big rewrite&lt;/a&gt; I'm working on.  The system has been around so long, that no one can remember every intricacy in the existing application.  Regression testing is the only way to uncover the missing functionality.  It's a nightmare!&lt;br /&gt;&lt;br /&gt;Compounding the problem is the difficulty in regression testing.  There is a "certification" environment that is supposed to be an exact replica of production.  But when we try to run production requests through our new application, the results are different.  Our business users review these inconsistencies and often tell us that our responses are actually better than the production version.  This is a good news/bad news type of thing.  While it's good to be better, in this instance it'd actually be better to be just as bad.  Now, instead of an automated test scenario where we could bulk test thousands of requests and responses to &lt;span class="dicColor"&gt;programmatically&lt;i&gt; &lt;/i&gt;&lt;/span&gt;identify inconsistencies, we need to hand check almost every message.&lt;br /&gt;&lt;br /&gt;I see long days ahead...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-1355213313126421881?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/1355213313126421881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=1355213313126421881' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/1355213313126421881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/1355213313126421881'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/09/nobody-knows-trouble-ive-seen.html' title='&quot;Nobody knows the trouble I&apos;ve seen...&quot;'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-7229484081203494899</id><published>2008-09-03T15:34:00.004-04:00</published><updated>2008-09-03T15:46:49.327-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='test driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='podcast'/><title type='text'>Cheating on Tests</title><content type='html'>I just listened to &lt;a href="http://itc.conversationsnetwork.org/shows/detail3759.html#"&gt;Kent Beck's presentation&lt;/a&gt; from this year's RailsConf for the second time (something I almost never do).   One of the gems I loved about his presentation was when he described test driven development as "cheating" (at the 27:08 mark).&lt;br /&gt;&lt;br /&gt;Exactly!  I feel a little foolish for not thinking about it about this way before.  It is cheating!   How many times in school did I wish I had the answers to tests &lt;span style="font-style: italic;"&gt;before&lt;/span&gt; I took them?  Or wished I even knew the questions?  Answer: Every time.&lt;br /&gt;&lt;br /&gt;Why?  Because it would've been so easy!  Imagine all the time I would've saved, with assurance that my work would always be correct and complete.&lt;br /&gt;&lt;br /&gt;Extending this idea to software development should be a no brainer - figure out what the software should do ahead of time (and write tests for it).  This way you know exactly what to code, when you are done, and that your solution is complete and correct.  It's so easy (it feels like cheating).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-7229484081203494899?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/7229484081203494899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=7229484081203494899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7229484081203494899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7229484081203494899'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/09/cheating-on-tests.html' title='Cheating on Tests'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-6353106491524038626</id><published>2008-08-28T15:11:00.004-04:00</published><updated>2008-08-28T15:19:46.697-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='requirements'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='schedules'/><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>Schedules</title><content type='html'>I'm usually not in charge of scheduling.  I've contributed to schedules, but someone else -  usually someone from management - drives schedule creation.&lt;br /&gt;&lt;br /&gt;I also can't remember a situation where the schedule actually worked.  What I mean by this is, a lot of time was spent to create schedules for 2-3 months into the future - then not really revisited (adjusted) for a month or more.  By this time something invariably happens (priorities change, initial tasks take longer than expected, vacations/time off weren't accounted for, etc.). This throws the entire thing out of whack and quickly makes it obsolete.  A month or more will pass, then the whole process starts again with the creation of another schedule.&lt;br /&gt;&lt;br /&gt;For the project I'm currently on we've spent a lot of time creating 2 schedules from scratch and are currently creating a third.  The first two have been complete failures and I have low expectations for the third.  It's frustrating to spend a lot of time and effort on something you just know has near zero percent chance of success.  So, what's gone wrong and what can be done better?&lt;br /&gt;&lt;ul id="sv_a1"&gt;&lt;li id="sv_a2"&gt;There's poor coordination between departments.  Communicating and agreeing on priorities are a problem.  We rely on another team to define our business requirements and acceptance test completed functionality. The big mistake is that, to this point, this other team has not been involved in the schedule creation process.  Our dates slip when requirement definition and testing are not the highest priority for that other team.  It's not their fault that their priorities are different than ours. &lt;br /&gt; &lt;/li&gt;&lt;/ul&gt; &lt;div id="hemb0" style="margin-left: 40px;"&gt;&lt;br /&gt;Better coordination is needed to get this team on board and committed to working with us to meet our deadlines.  We cannot succeed without this.  It seems too simple to keep getting wrong, yet it continues to happen.&lt;br /&gt;&lt;/div&gt; &lt;div id="hemb3"&gt; &lt;ul id="hemb4"&gt;&lt;li id="f5352"&gt;Our schedule is too vague.  Many of the tasks are scheduled with monthly granularity.  This is &lt;i id="i050"&gt;way&lt;/i&gt; to long.  When a task is running long you don't find out for a month (when it's already past due).  I've been doing &lt;a title="some" href="http://www.joelonsoftware.com/articles/fog0000000245.html" id="nvez"&gt;some&lt;/a&gt; &lt;a title="reading" href="http://www.joelonsoftware.com/items/2007/10/26.html" id="i65h"&gt;reading&lt;/a&gt;, and &lt;i id="g4ho"&gt;hours&lt;/i&gt; rather than weeks or months seem like a better breakdown for schedule tasks.  This level of refinement provides a closer to real time status on the overall progress (and potential delays).  It allows for a faster reaction to problem areas.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;It doesn't seem that hard to me - get everyone on the same page and do a better job defining the steps to complete a task.  As I get more involved defining this third schedule, those are the goals I'm setting for myself.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-6353106491524038626?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/6353106491524038626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=6353106491524038626' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6353106491524038626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6353106491524038626'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/08/schedules.html' title='Schedules'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-9193049625149406875</id><published>2008-08-12T08:43:00.005-04:00</published><updated>2008-08-12T08:56:45.598-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='requirements'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>Yes!</title><content type='html'>&lt;a href="http://steve-yegge.blogspot.com/"&gt;Steve Yegge&lt;/a&gt; has this great &lt;a href="http://steve-yegge.blogspot.com/2008/08/business-requirements-are-bullshit.html"&gt;post&lt;/a&gt; today about business requirements and building software that you'd&lt;span style="font-style: italic;"&gt; personally use&lt;/span&gt; in a domain that you actually &lt;span style="font-style: italic;"&gt;know&lt;/span&gt;.  Great stuff!&lt;br /&gt;&lt;br /&gt;I need to figure out a way to print wallet size copies to hand out at requirement meetings.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-9193049625149406875?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/9193049625149406875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=9193049625149406875' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/9193049625149406875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/9193049625149406875'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/08/yes.html' title='Yes!'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-9150182364214424915</id><published>2008-07-30T15:21:00.002-04:00</published><updated>2008-07-31T10:35:56.744-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='BPEL'/><title type='text'>Second Thoughts on SOA Architecture</title><content type='html'>When I first joined this SOA team, I questioned the architecture we were implementing.  The application flow is basically linear and uses JMS to pass messages between the various functional components.  The components themselves were not designed generic enough to be shared by multiple applications.  &lt;a title="Like I stated earlier" href="http://vincentfazio.blogspot.com/2008/07/head-scratcher.html" id="s4im"&gt;Like I mentioned earlier&lt;/a&gt;, the main driver for rewriting this application was for speed.&lt;br /&gt;&lt;br /&gt;The whole thing seemed very unSOA-like to me.  Since none of the components were reusable outside this application, why not code the entire project in a "traditional" way?  This approach would improve performance, replacing the overhead of multiple marshal/unmarshal operations needed for JMS with direct function calls.&lt;br /&gt;&lt;br /&gt;My perspective changed (a little) recently when we needed to add new functionality to the system.  We could have modified one of the existing components to implement the new feature.  Functionally, it made sense to keep this related logic together in a single module.&lt;br /&gt;&lt;br /&gt;The main problem with this approach is that we would need to retest the component to ensure we didn't break anything that was already working (and fully tested).  Interestingly, this is where the SOA approach worked to our advantage.  An alternative implementation would involve simply creating a new, stand-alone component and inserting it into the proper place in the flow - eliminating the risk in modifying already working code.&lt;br /&gt;&lt;br /&gt;The second approach plays to the main strength of SOA - it's inherently extensible.  Stand-alone services can be combined, inserted, or deleted without affecting the overall stability/reliability of the individual components - all the while gaining the ability to quickly change the composite application's behavior.  While reusability would definitely increase the ROI of developing these components, it shouldn't be looked at as the &lt;i id="tdx5"&gt;only&lt;/i&gt; benefit of SOA.&lt;br /&gt;&lt;br /&gt;*****&lt;br /&gt;&lt;br /&gt;A "traditional" application can also be designed in this modular fashion, also allowing new functionality to be plugged in through an additional method call.  Here you could realize the speed &lt;i id="scvr"&gt;and&lt;/i&gt; the extensible benefits described above.  The downside in this approach is the complexity integrating new functionality &lt;span style="font-style: italic;"&gt;if it happens to be written in a different language than the main application&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Here again, the loose coupling, inherent in SOA architectures works to your advantage.  As long as the new ".Net" service can talk via HTTP, MQ or some other messaging standard - this new functionality can be easily integrated into your Java-based or BPEL composite application (and is more attractive than trying to figure out &lt;a title="JNI" href="http://en.wikipedia.org/wiki/Java_Native_Interface" id="d3av"&gt;JNI&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-9150182364214424915?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/9150182364214424915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=9150182364214424915' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/9150182364214424915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/9150182364214424915'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/07/second-thoughts-on-soa-architecture.html' title='Second Thoughts on SOA Architecture'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-3463980101119437498</id><published>2008-07-25T15:47:00.006-04:00</published><updated>2008-07-26T15:32:56.731-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><category scheme='http://www.blogger.com/atom/ns#' term='WSDL'/><title type='text'>Top Down or Bottom Up</title><content type='html'>&lt;div id="z03d3"&gt;&lt;div id="q.0u1"&gt;  When developing Java RPC-style web services, I'm torn whether to follow a top-down or bottom-up approach.&lt;br /&gt;&lt;br /&gt;Using the bottom-up approach, you create your Java classes first and use the &lt;span id="otfq"  style="font-family:Courier New;"&gt;@&lt;/span&gt;&lt;span id="p48b"  style="font-family:Courier New;"&gt;WebService&lt;/span&gt; and &lt;span id="otfq1"  style="font-family:Courier New;"&gt;@&lt;/span&gt;&lt;span id="p48b0"  style="font-family:Courier New;"&gt;WebMethod&lt;/span&gt; annotations to specify that this is your web service interface.  The WSDL for the service is generated &lt;i id="frtw"&gt;automatically &lt;/i&gt;during the build (pretty nice).  This approach has it's advantages in that you never have to leave Java to create the WSDL.  Creating a WSDL file is not trivial and using this approach means you never need to think about the WSDL's &lt;span id="a1l:"  style="font-family:Courier New;"&gt;&amp;lt;service&amp;gt;&lt;/span&gt;, &lt;span id="a1l:0"  style="font-family:Courier New;"&gt;&amp;lt;binding&amp;gt;&lt;/span&gt;, or &lt;span id="a1l:1"  style="font-family:Courier New;"&gt;&amp;lt;portType&amp;gt;&lt;/span&gt; elements and how they're linked together.&lt;br /&gt;&lt;br /&gt;Conversely, a top-down approach means you create your WSDL first, then use a utility (either your IDE or a command line program) to generate the Java skeleton.  Using this approach you need modify the generated Java stubs to call your business logic.  If the interface (the WSDL) changes, you'll need to regenerate the classes, recreating your business calls.&lt;br /&gt;&lt;br /&gt;On the surface, it appears the bottom up approach is the way to go.  Changes to the web service API are effortless - you only need to update the Java class opposed to updating the WSDL &lt;i id="bcfs"&gt;and&lt;/i&gt; the Java program.  So... what's the downside?&lt;br /&gt;&lt;br /&gt;Expressiveness.  Your web service is defined by it's API.  It let's callers know exactly what's required as input and exactly what will be returned.  Take a look as the following snippet from an XML schema I'm using to pass values back from a web service I created.&lt;br /&gt;&lt;pre&gt;&amp;lt;xsd:complexType name="my_type"&amp;gt;&lt;br /&gt;  &amp;lt;xsd:sequence&amp;gt;&lt;br /&gt;     &amp;lt;xsd:choice&amp;gt;&lt;br /&gt;        &amp;lt;xsd:element name="error_message" type="xsd:string"/&amp;gt;&lt;br /&gt;        &amp;lt;xsd:element name="values" type="xsd:float" minOccurs="1" maxOccurs="unbounded"/&amp;gt;&lt;br /&gt;     &amp;lt;/xsd:choice&amp;gt;&lt;br /&gt;  &amp;lt;/xsd:sequence&amp;gt;&lt;br /&gt;&amp;lt;/xsd:complexType&amp;gt;&lt;br /&gt;&lt;/pre&gt;This tells the caller, "I'm going to either give you an error message back or an array of floats.  If I pass an array of floats, it will have at least 1 entry".&lt;br /&gt;&lt;br /&gt;I'm not exactly sure how to best express this using Java classes.  First of all, what's the best way to express the &lt;span id="xcpp"  style="font-family:Courier New;"&gt;&amp;lt;choice&amp;gt;&lt;/span&gt; element in a Java class?  There is no union data structure like there is in C++.  Secondly, is there a Java collection that says "I must have at least 1 element"?  Not that I know of.&lt;br /&gt;&lt;br /&gt;Now there may be a way to generate the above XSD segment using the WSDL annotation tools, but I'm betting it's not trivial.&lt;br /&gt;&lt;br /&gt;Assuming that I'm right, and creating the Java classes to generate the above XSD is not trivial.   Let's create a simplified (almost equivalent) Java class and take a look at the WSDL generated from NetBeans for a web method return.  Here are the class members for a Java class named MyType (in the class I also created the appropriate getters and setters).&lt;br /&gt;&lt;pre&gt;   private String error_message;&lt;br /&gt;  private List&amp;lt;Float&amp;gt; values;&lt;br /&gt;&lt;/pre&gt;This type is returned by a &lt;span id="tgf:"  style="font-family:Courier New;"&gt;@WebService @WebMethod&lt;/span&gt; defined in a Java class.  And here is the corresponding XML schema defs generated by NetBeans.&lt;br /&gt;&lt;pre&gt;&amp;lt;xs:complexType name="myType"&amp;gt;&lt;br /&gt;  &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;     &amp;lt;xs:element name="errorMessage" type="xs:string" minOccurs="0"&amp;gt;&amp;lt;/xs:element&amp;gt;&lt;br /&gt;     &amp;lt;xs:element name="values" type="xs:float" nillable="true" minOccurs="0" maxOccurs="unbounded"&amp;gt;&amp;lt;/xs:element&amp;gt;&lt;br /&gt;  &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;&amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;&lt;/pre&gt;While this schema is similar to the one above, it's less expressive in some important ways. In this case, the caller doesn't really know what to expect the service to return. It looks as if it could return nothing or both values (which isn't true). This ambiguity will cause clients of the service to overbuild - adding unnecessary logic to their systems to handle the empty message or the instance when both values are populated (neither of which will ever happen).&lt;br /&gt;&lt;br /&gt;Since the API is the most important part of the web service - after all &lt;i id="nnkc"&gt;it's the contact between the provider and the client&lt;/i&gt; - I usually lean toward the top-down approach to building services.  It's a little more involved for the provider, but by being more verbose and exact in it's usage it's more usable by the client - and that's the important part. &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-3463980101119437498?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/3463980101119437498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=3463980101119437498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3463980101119437498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3463980101119437498'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/07/top-down-or-bottom-up_25.html' title='Top Down or Bottom Up'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-1607035728219568300</id><published>2008-07-23T15:44:00.004-04:00</published><updated>2008-07-23T15:52:21.902-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>JCAPS 6 Impressions</title><content type='html'>I've started to use &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;JCAPS&lt;/span&gt; 6 a little of over the past month and thought I'd share some of my initial impressions.&lt;br /&gt;&lt;ul id="vtxw"&gt;&lt;li id="vtxw0"&gt;Finally a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;JCAPS&lt;/span&gt; editor I can use!  I found the previous version of the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;JCAPS&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;IDE&lt;/span&gt; hard to develop with.  It was based on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Netbeans&lt;/span&gt; 3 and didn't have a lot of the features I had grown accustomed to using (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;refactoring&lt;/span&gt; tools and a local history to name two).  It was just plain old, clunky, and slow.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div id="vtxw3" style="margin-left: 40px;"&gt;The new version is based on the latest &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Netbeans&lt;/span&gt; and all the goodness is back.  And it's fast.&lt;br /&gt;&lt;/div&gt;&lt;ul id="abi:0"&gt;&lt;li id="abi:1"&gt;No more repository.  Well, almost.  &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;JCAPS&lt;/span&gt; 6 has a few different modes to work in - repository based or non-repository.  A repository based project allows &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;JCAPS&lt;/span&gt; developers to work in essentially the same way they did with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;JCAPS&lt;/span&gt; 5 - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;JCDs&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;OTDs&lt;/span&gt;, connectivity maps, deployment profiles and yes - the repository.  It's also the way to migrate legacy &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;JCAPS&lt;/span&gt; project to the new platform - through a simple export and import between the repositories.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div id="b:cc0"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="b:cc2"&gt;&lt;div id="b:cc3" style="margin-left: 40px;"&gt;I haven't used the repository portion of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;JCAPS&lt;/span&gt; 6 much, but some coworkers have and report it works as expected (with an improved interface).&lt;/div&gt;&lt;/div&gt;&lt;div id="pe2m1"&gt;&lt;ul id="pe2m2"&gt;&lt;li id="pe2m3"&gt;For non-repository &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;JCAPS&lt;/span&gt; projects, development is very similar to regular J2&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;EE&lt;/span&gt; development - with particular focus on the &lt;a title="Java Connector Architecture (JCA)" href="http://en.wikipedia.org/wiki/Java_EE_Connector_Architecture" id="r:8y"&gt;Java Connector Architecture (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;JCA&lt;/span&gt;)&lt;/a&gt; and &lt;a title="Java Business Integration (JBI)" href="http://en.wikipedia.org/wiki/Java_Business_Integration" id="i-7:"&gt;Java Business Integration (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;JBI&lt;/span&gt;)&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div id="c.j0" style="margin-left: 40px;"&gt;&lt;br /&gt;I wasn't familiar with either the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;JCA&lt;/span&gt; or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;JBI&lt;/span&gt; before &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;JCAPS&lt;/span&gt; 6 so here is my 10-cent definition of each (NOTE: the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;Wikipedia&lt;/span&gt; links above provide more thorough - and probably more correct - definitions):&lt;br /&gt;&lt;/div&gt;&lt;div id="jq-d0" style="margin-left: 40px;"&gt;&lt;ul id="jq-d1"&gt;&lt;li id="jq-d2"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;JCA&lt;/span&gt; is an abstraction layer for connecting to third party services like databases and legacy systems.  I think of it like generic &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;JDBC&lt;/span&gt; that can do more.&lt;br /&gt;&lt;/li&gt;&lt;li id="spks"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;JBI&lt;/span&gt; provides a standard way for various portions of your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;SOA&lt;/span&gt; to talk to one another (it's the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;ESB&lt;/span&gt;).  I see this as an abstraction so you don't really need to know if your composite application is talking to a web service, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;JMS&lt;/span&gt;, an &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;EJB&lt;/span&gt;, or &lt;i id="vopn"&gt;possibly &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;JCA&lt;/span&gt; component&lt;/i&gt;s.  &lt;a href="http://en.wikipedia.org/wiki/OpenESB"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;OpenESB&lt;/span&gt;&lt;/a&gt; is the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;JBI&lt;/span&gt; implementation used by &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;JCAPS&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The value add for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;JCAPS&lt;/span&gt; is to provide more (and better) &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;JCA&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;JBI&lt;/span&gt; components than are available using the "free" &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;Netbeans&lt;/span&gt;.  Thus helping to make developers on it's platform more effective.&lt;br /&gt;&lt;/div&gt;&lt;div id="n7ki"&gt;&lt;br /&gt;So, while my dive into &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;JCAPS&lt;/span&gt; 6 hasn't been especially deep to this point, so far I like what I'm seeing...&lt;br /&gt;&lt;/div&gt;&lt;div id="n7ki2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-1607035728219568300?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/1607035728219568300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=1607035728219568300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/1607035728219568300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/1607035728219568300'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/07/jcaps-6-impressions.html' title='JCAPS 6 Impressions'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-2652211254513751156</id><published>2008-07-21T16:23:00.004-04:00</published><updated>2008-07-21T16:32:12.570-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Process Over Technology</title><content type='html'>As the struggles continue with the application rewrite I'm currently involved with, I've read and reread these articles by &lt;a title="Joel Spolsky" href="http://www.joelonsoftware.com/articles/fog0000000069.html" id="tpg1"&gt;Joel &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Spolsky&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a title="James Shore" href="http://jamesshore.com/Blog/How-to-Survive-a-Rewrite.html" id="ez-n"&gt;James Shore&lt;/a&gt;, and &lt;a title="Chad Fowler" href="http://chadfowler.com/2006/12/27/the-big-rewrite" id="jt.n"&gt;Chad Fowler&lt;/a&gt; on why this path generally leads to failure.  After I finish reading &lt;a title="articles like these" href="http://onstartups.com/home/tabid/3339/bid/2596/Why-You-Should-Almost-Never-Rewrite-Your-Software.aspx" id="i3im"&gt;articles like these&lt;/a&gt; I often ask myself: since many of the industry thought leaders think these projects are a bad idea, why are they still so common?  I mean, Joel's article was written in 2000.  Eight years later (an eternity in technology) that article is still extremely relevant, but it's lesson has failed to penetrate mainstream thought.&lt;br /&gt;&lt;br /&gt;There's not enough industry focus on how best to approach legacy system enhancements.  Many software development articles that garner the most attention focus on quality improvements delivered through &lt;i id="szbg"&gt;innovations in technology &lt;/i&gt;- new programming languages, frameworks, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;APIs&lt;/span&gt;&lt;/span&gt;, architectures, and hardware.  While that &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;stuff's&lt;/span&gt;&lt;/span&gt; definitely important, they're relatively little help to application developers looking to extend the life of existing systems.&lt;br /&gt;&lt;br /&gt;&lt;a title="Martin Fowler's Refactoring" href="http://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Technology/dp/0201485672/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1216670567&amp;amp;sr=8-1" id="ika."&gt;Martin Fowler's &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Refactoring&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; book is the best example I've read for extending the life of existing software.  This book - and articles like those in the opening paragraph - are timeless because they describe &lt;i id="nafi"&gt;thought patterns &lt;/i&gt;for maintaining applications.  Their lessons are applicable regardless of any specific technology or language. &lt;br /&gt;&lt;br /&gt;In a recent &lt;a title="StackOverflow podcast" href="http://blog.stackoverflow.com/2008/07/podcast-12/" id="za3t"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;StackOverflow&lt;/span&gt;&lt;/span&gt; podcast&lt;/a&gt; Joel &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Spolsky&lt;/span&gt; and Jeff Atwood discuss a recommended reading list for developers (Jeff had a &lt;a title="previous post" href="http://www.codinghorror.com/blog/archives/001108.html" id="jgrb"&gt;previous post&lt;/a&gt; on the subject).  In looking through their lists, I'm not seeing any "Teach Yourself Perl in 8 Hours" or "Ruby for Dummies".  Specific technology is not the focus here.  These recommendations teach software professionals how to &lt;i id="ubgg"&gt;think &lt;/i&gt;- improving quality, efficiently, and allowing them to deliver greater value.&lt;br /&gt;&lt;br /&gt;I'm starting to believe that there are an increasing number of developers who are starting to think more like this (or at least I'm meeting more of them) - focused on improving processes rather than relying on technology innovations for increased software quality.  I hope this mindset spreads to more of the development teams I'm working with.... before the next big rewrite.  This thing is painful.&lt;br /&gt;&lt;br /&gt;*****&lt;br /&gt;&lt;br /&gt;Jeff Atwood also had a recent post on &lt;a title="Dealing With Bad Apples" href="http://www.codinghorror.com/blog/archives/001154.html" id="a7gt"&gt;Dealing With Bad Apples&lt;/a&gt;.  He has a similar take to my &lt;a title="Observations in Poor Management" href="http://vincentfazio.blogspot.com/2008/05/poor-management-observations.html" id="i09l"&gt;Observations in Poor Management&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-2652211254513751156?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/2652211254513751156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=2652211254513751156' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2652211254513751156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2652211254513751156'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/07/process-over-technology.html' title='Process Over Technology'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-4244399026575763919</id><published>2008-07-15T15:50:00.002-04:00</published><updated>2008-07-15T15:53:36.571-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='BPEL'/><title type='text'>Head Scratcher</title><content type='html'>I wish I was on board at the very beginning of the project I'm working on.  Maybe it would shed some light on the direction the client is currently taking.&lt;br /&gt; &lt;br /&gt; This project is a rewrite of an existing, poorly performing, data processing system.  The rewrite is being done in two parts.  Phase 1 replaces the front half of the system - responsible for receiving messages, routing the transactions to the appropriate business logic, then finally, transmitting a response.  Analysis (performed before I got here) identified this logic as the application bottleneck.  This portion of the application was rewritten in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;JCAPS&lt;/span&gt; and it's currently being tested (I haven't seen any performance data for the rewrite yet).&lt;br /&gt; &lt;br /&gt; The second phase of the project replaces the business logic, currently written in C++, with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;BPEL&lt;/span&gt;.  Let me say that again... the second phase of this project replaces &lt;i id="t:n9"&gt;compiled &lt;/i&gt;&lt;i id="fb1g"&gt;C++&lt;/i&gt; with &lt;i id="t:n90"&gt;interpreted &lt;/i&gt;&lt;i id="fb1g0"&gt;XML&lt;/i&gt;.  For speed.&lt;br /&gt; &lt;br /&gt; Anyone else confused?&lt;br /&gt; &lt;br /&gt; Now maybe implementing the business logic in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;BPEL&lt;/span&gt; will make future enhancements to the business logic easier, and that's the reason for choosing &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;BPEL&lt;/span&gt;.  &lt;a title="Maybe" href="http://vincentfazio.blogspot.com/2008/06/more-nonsense.html" id="qi4r"&gt;Maybe&lt;/a&gt;.  But at what cost to the performance of the system?  My gut tells me that &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;BPEL&lt;/span&gt; is going to be a dog.  I hope not.  I haven't been able to locate any &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;BPEL&lt;/span&gt; benchmarks and how it compares with Java or C++.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-4244399026575763919?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/4244399026575763919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=4244399026575763919' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/4244399026575763919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/4244399026575763919'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/07/head-scratcher.html' title='Head Scratcher'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-7904289402412496019</id><published>2008-07-11T16:08:00.001-04:00</published><updated>2008-07-11T16:12:13.469-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Documenting Requirements</title><content type='html'>Almost every place I've worked struggles (in varying degrees) documenting business requirements.  Maybe not the initial requirements, but the new requirements/enhancements that emerge as releases are delivered.  They usually stem from a conversation that starts out, "I really like this, but it would be &lt;i id="i44u"&gt;really cool&lt;/i&gt; if it could also do this other thing I had not thought of until now."&lt;br /&gt;&lt;br /&gt;This is a bigger than normal issue at the place I'm currently working.  Mostly it's because new requirements are not captured in the same documents as the original specification.  Instead, a new document is created and placed into a shared folder on the network (or sometimes a series of different folders).  Over time, there are a lot of distributed requirement documents and it's really difficult to figure out what the system is supposed to do (and where to look for this information).  Please, &lt;b id="kbej"&gt;place all your application requirements in a single coherent "document"!&lt;/b&gt; Make it stupid easy for people to figure out how the application is supposed to work.  Right now the ramp up time to learn this application is ridiculously long and the poor state of these requirement documents are a big reason why.&lt;br /&gt;&lt;br /&gt;&lt;a title="I've used wiki's in the past to capture requirements" href="http://vincentfazio.blogspot.com/2007/05/wiki-communication.html" id="z9ik"&gt;I've used wiki's in the past to capture requirements&lt;/a&gt; and I think it worked out pretty well.  My practice there was to create a new wiki page for each feature request and then link to that page from the 'overall specification' and 'version release notes' wiki pages.  The one thing I've often wished for is a better way to link these pages to the source code changes.  I made a practice of creating a bug ticket for each enhancement then cross-linking the ticket to the wiki page, and then using the bug ticket number in the code check-in comment.  This process is cumbersome and somewhat difficult to work through in reverse - like finding all the code commits for a given ticket.  I'd like it if this functionality were baked into source control systems (maybe it is and I don't know).&lt;br /&gt;&lt;br /&gt;The second big problem with documentation on my current team is requirements ownership.  The developers are reluctant to update the business requirement documents (I don't know why).  The business team is extremely busy and updating these requirement documents is their lowest priority.  It doesn't take a genius to see what's going to happen here.... developers start working on features &lt;i id="gu.d"&gt;before&lt;/i&gt; the requirements are documented and undocumented features are implemented.  &lt;br /&gt;&lt;br /&gt;Now, while the difficulty in finding the requirements in the first place was a big problem, having undocumented features in your application is a &lt;i id="hp8k"&gt;HUGE&lt;/i&gt; problem!  This practice basically invalidates any documentation you do happen to find.  All of a sudden you have no idea if previous requirements have verbally changed or which documented requirements override the verbal requirements that someone vaguely remembers.  You have to be disciplined enough to &lt;b id="u0bs"&gt;document your requirements before implementing them!&lt;/b&gt;  There is no excuse for not doing this.  None.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-7904289402412496019?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/7904289402412496019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=7904289402412496019' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7904289402412496019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7904289402412496019'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/07/documenting-requirements.html' title='Documenting Requirements'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-773400216059958077</id><published>2008-07-10T16:30:00.002-04:00</published><updated>2008-07-15T15:56:34.157-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='BPEL'/><title type='text'>Recent SOA questions/thoughts</title><content type='html'>We've had some interesting SOA desing questions lately.  Here's a quick rundown with my thoughts...&lt;br /&gt;&lt;ul id="htx10"&gt;&lt;li id="htx11"&gt;&lt;i id="r_4m"&gt;Is it a good idea to wrap DB calls in a web service?&lt;/i&gt; &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div id="qi310" style="margin-left: 40px;"&gt;Some argue that this is a waste for internal applications.  That these services don't provide any business value - query results are simply regurgitated back to the caller. &lt;br /&gt;&lt;br /&gt;While I agree that these calls don't add much business value, the benefit lies in abstracting the DB calls from the caller.  In simplest terms, wrapping access means that callers need not concern themselves with managing database connections.  Additional changes/enhancements to the schema can now be handled in a single place rather than mandated enhancements to DB clients - even the DB implementation, location, and authentication updates are transparent to users.  To me, services like this - services that simplify interactions - are a big part of what SOA is all about.&lt;br /&gt;&lt;/div&gt;&lt;div id="qi314"&gt;&lt;ul id="qi315"&gt;&lt;li id="htx12"&gt;&lt;i id="lh92"&gt;As SOA systems evolve/extend, is it a better idea to plug in new functionality or extend existing components?  For instance, let's say there is an SOA application whose flow consists of calling component A followed by component B (A -&gt; B).  New functionality needs to be added to the system.  You can either modify one of the existing components to add the new capabilities (A' -&gt; B) or you can create a new component and plug it in (A -&gt; C -&gt; B).&lt;/i&gt;  &lt;/li&gt;&lt;/ul&gt;&lt;div id="lh920" style="margin-left: 40px;"&gt;If the new capability is functionally similar to either A or B, this may muddy the waters.  Regardless of the situation, I favor the plug in approach.  Again, I feel this is one of the big benefits of SOA - the ability to add functionality to a system without changing and retesting existing code.  It feels simpler and cleaner.  Smaller, highly specialized components are easier to debug and maintain than larger components.  They're also more likely to be reused.  I feel pretty strongly about this.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id="lh922"&gt;&lt;ul id="lh923"&gt;&lt;li id="jn8j"&gt;&lt;i id="z03d0"&gt;One of the things I still struggle with is when is it better to code your SOA interactions through a business process vs "regular" web service code. &lt;/i&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div id="z03d2" style="margin-left: 40px;"&gt;My current thinking is that if all you doing is calling services and mapping values, then a business process approach is acceptable.  I'd still rather code these interactions in something other than BPEL, but it may only be because I'm more comfortable with that approach.  I've just started to code a rather large business process in BPEL and I'm finding it to be OK.  The big benefit comes in the ability to visualize the process via BPN.  This makes it easy to review the flow with business users.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-773400216059958077?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/773400216059958077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=773400216059958077' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/773400216059958077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/773400216059958077'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/07/recent-soa-questionsthoughts.html' title='Recent SOA questions/thoughts'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-4500054838330512959</id><published>2008-07-02T09:37:00.004-04:00</published><updated>2008-07-02T13:57:17.860-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='test driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Something old, something new</title><content type='html'>In another discussion recently about &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;SOA&lt;/span&gt;, it still surprises me a little that people, technical people, don't get that there's not much new here.  For years it's been standard practice to separate functionality into functions, classes, and modules.  The idea has always been that these smaller, highly specialized components are easier to share and maintain than monolithic blocks of code.&lt;br /&gt;&lt;br /&gt;Functionally, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;SOA&lt;/span&gt; is not much different. The goals are the same - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;reusability&lt;/span&gt; and easy maintenance.  The biggest difference - in the case of a web service &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;SOA&lt;/span&gt; - is that the shared library included in your application is replaced with an HTTP call.  If you're already supporting message-oriented applications using &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;MQ&lt;/span&gt; or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;JMS&lt;/span&gt;, these messages are now HTTP requests.  The process of decomposing the application into reusable services is essentially the same.&lt;br /&gt;&lt;br /&gt;The real point here is, if you already have a modularized architecture and you're having problems with application crashes, a switch to "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;SOA&lt;/span&gt; technology" is not going to help you.  My first guess is that (lack of) testing is the problem.  These problems will not go away in your big "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;SOA&lt;/span&gt;" rewrite unless you figure out a way to test better.  Or you could be having problems scaling your infrastructure.  If anything, a switch to a web service solution will &lt;span style="font-style: italic;"&gt;increase &lt;/span&gt;the number of messages being passed around your network.&lt;br /&gt;&lt;br /&gt;My advice, instead of following the knee-jerk reaction that your technology is old and needs a major upgrade, write tests first to determine:&lt;br /&gt;&lt;ol id="qb2g0"&gt;&lt;li id="qb2g1"&gt;the functionality (behavior) of your application is tested (start by testing the "problem" areas of your app. first) &lt;/li&gt;&lt;li id="qb2g2"&gt;your infrastructure can handle the current transaction load.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;******&lt;br /&gt;&lt;br /&gt;If you're reading this and haven't read &lt;a href="http://chadfowler.com/"&gt;Chad Fowler's&lt;/a&gt; &lt;a href="http://chadfowler.com/2006/12/27/the-big-rewrite"&gt;Big Rewrite&lt;/a&gt; series, you should check it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-4500054838330512959?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/4500054838330512959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=4500054838330512959' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/4500054838330512959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/4500054838330512959'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/07/something-old-something-new.html' title='Something old, something new'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-5637040506090375449</id><published>2008-06-13T11:05:00.010-04:00</published><updated>2008-06-13T12:19:57.271-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Targeted Content</title><content type='html'>I'm fascinated by all the context sensitive/targeted media that is making it's way into the mainstream.&lt;br /&gt;&lt;br /&gt;The other day I was reading an email from my wife having to do with &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;bringing&lt;/span&gt; some milk home and something about a recent trip we had taken.  The Google ads on this page were some that you'd expect - one on how to save gas, another for a baking product.  The one that really surprised me was an ad for silica gel?!?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Silica_gel"&gt;Silica gel&lt;/a&gt; is a moisture absorber and usually found in the little packets that say "Do Not Eat" included when you buy a new pair of sneakers and many other products.  This was intriguing to me because there was no mention of anything related to this in the body of the message.  However, my wife works for a company that produces these products and sent the email from her work address.  Not only was &lt;a href="https://www.google.com/adsense"&gt;AdSense&lt;/a&gt; was smart enough to pick up on the from address and trace it back to an actual company, it knew what the company produces, &lt;span style="font-style: italic;"&gt;and&lt;/span&gt; suggested an appropriate ad to match their product (it was actually an ad for a competitor).  That's pretty cool!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-5637040506090375449?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/5637040506090375449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=5637040506090375449' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5637040506090375449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5637040506090375449'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/06/targeted-content.html' title='Targeted Content'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-8165683309258828266</id><published>2008-06-06T08:15:00.003-04:00</published><updated>2008-06-06T08:28:44.294-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>Cognitive Dissonance?</title><content type='html'>In this week's &lt;a href="http://itc.conversationsnetwork.org/shows/detail3697.html"&gt;StackOverflow podcast&lt;/a&gt;, Joel Spolsky describes &lt;a href="http://en.wikipedia.org/wiki/Cognitive_dissonance"&gt;cognitive dissonance&lt;/a&gt; - and it may help explain the the JCAPS love fest at my current client.  This conversation happens around the 11-minute mark.&lt;br /&gt;&lt;br /&gt;I knew there had to be a name for &lt;a href="http://vincentfazio.blogspot.com/2008/04/silver-bullet-syndrome.html"&gt;this&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-8165683309258828266?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/8165683309258828266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=8165683309258828266' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8165683309258828266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8165683309258828266'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/06/cognitive-dissonance.html' title='Cognitive Dissonance?'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-5373518412448448457</id><published>2008-06-04T07:55:00.009-04:00</published><updated>2008-06-04T11:08:16.047-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='management'/><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>More Nonsense</title><content type='html'>I know I need to let this go, but I can't stop thinking about the nonsense of this &lt;a href="http://vincentfazio.blogspot.com/2008/06/jcaps-nonsense-at-least-here.html"&gt;BPMN -&gt; JCAPS -&gt; .Net&lt;/a&gt;&lt;a href="http://vincentfazio.blogspot.com/2008/06/jcaps-nonsense-at-least-here.html"&gt; web service architecture&lt;/a&gt; proposed by management at the client I'm working with.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The main reason for the base web services to be implemented in .Net rather than directly in JCAPS is that this organization has 10x as many .Net developers as it has Java/JCAPS developers.  The thinking is that this ratio will make it easier to find available bodies to maintain and enhance these services.  While this makes sense, any guess on how many people know BPMN?  A small handful... all of them contractors.  There's not even a BPMN modeling tool in place at the company.  Yet they're convinced this is the way to go.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Is it reasonable to expect business users to create BPMN models?  While I realize the GUI interface makes it less like "coding", I think that it'd be helpful to have a basic understanding of boolean logic, parallelism, and exception processing in creating the business models.  While I've seen some amazing Excel applications created by business users, the assumption that these people will be able to create high availability, high throughput applications is a bit of a reach for me.&lt;/li&gt;&lt;li&gt;All the excitement over BPM reminds me of the EJB "revolution" - when the mantra at many companies was "EJB everywhere" and EJBs were the architectural style du jour.  EJBs were (poorly) implemented in many places where they weren't a good fit.   Many of these applications had scalability and performance problems.  I'm wondering if this BPM "revolution" will produce similar results.  (Is there a reason it's called Business &lt;span style="font-style: italic;"&gt;Model&lt;/span&gt; Notation rather than Business &lt;span style="font-style: italic;"&gt;Application&lt;/span&gt; Notation?)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In a system like this, it's important to think about how service enhancements are rolled out.  No one is talking about how these services will be maintained, released, or tested.  Will there be a period of backward compatibility for service clients?  How will that be handled?  This lack of foresight  is another reason I feel this company is &lt;a href="http://vincentfazio.blogspot.com/2008/03/soa-readyness.html"&gt;not ready for SOA&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;On numerous occasions I've approached the client to discuss these things with little success.   I can't get them to recognize that many of their problems result from their (lack of) process rather than problems with their technology.  I wish I knew of a better way to get through to them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-5373518412448448457?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/5373518412448448457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=5373518412448448457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5373518412448448457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5373518412448448457'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/06/more-nonsense.html' title='More Nonsense'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-4858078456469388834</id><published>2008-06-03T16:10:00.004-04:00</published><updated>2008-07-15T15:56:34.159-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='management'/><category scheme='http://www.blogger.com/atom/ns#' term='BPEL'/><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>JCAPS = Nonsense (at least here)</title><content type='html'>Come hell or high water - this company is hell bent on including JCAPS as part of it's enterprise architecture, even though it doesn't plan to use &lt;span style="font-style: italic;"&gt;any&lt;/span&gt; of the features that might set it apart from it competitors or open source alternatives.&lt;br /&gt;&lt;br /&gt;The long-term plan here is for the business users to use a BPMN-compliant tool (not the one from JCAPS) to create the business processes.&lt;br /&gt;&lt;br /&gt;These processes will integrate web service calls, creating a sort of business mashup of these services.  The services will be written in .Net, not JCAPS.&lt;br /&gt;&lt;br /&gt;The only place JCAPS enters the equation is as the platform to run the BPEL generated from the BPMN.  Make any sense?  Not to me.  Isn't a BPEL engine included in Glassfish?  I'm sure this is just one of several free or low cost alternatives to execute BPEL.&lt;br /&gt;&lt;br /&gt;What I can't figure out is this company's infatuation with JCAPS.  Given the &lt;a href="http://vincentfazio.blogspot.com/2008/04/silver-bullet-syndrome.html"&gt;shortcomings&lt;/a&gt; they've encountered already, why they are so intent on looking for more places to implement this technology stack?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-4858078456469388834?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/4858078456469388834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=4858078456469388834' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/4858078456469388834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/4858078456469388834'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/06/jcaps-nonsense-at-least-here.html' title='JCAPS = Nonsense (at least here)'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-7228908790606982500</id><published>2008-05-30T08:51:00.007-04:00</published><updated>2008-05-30T15:54:59.735-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><category scheme='http://www.blogger.com/atom/ns#' term='management'/><category scheme='http://www.blogger.com/atom/ns#' term='podcast'/><title type='text'>Observations in Poor Management</title><content type='html'>Yesterday two people at the place I'm working gave notice that they'll be leaving the company.  There has been a lot of turnover in the six months I've been here.  Based on what I've seen, I'm not really surprised.  Still, there always seems to be some head scratching by management and some longer tenured employees on why these people are leaving.  Here's some of what I've seen.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I've already mentioned the poor &lt;a href="http://vincentfazio.blogspot.com/2008/04/silver-bullet-syndrome.html"&gt;tooling&lt;/a&gt; and &lt;a href="http://vincentfazio.blogspot.com/2008/03/change-control-gone-wrong.html"&gt;processes&lt;/a&gt; in place here - starting with Lotus Notes - so I won't rehash that here other than to mention the tooling shortfall has been brought to management's  attention many times with no real action.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Some people I sit near are in a constant state of emergency.  Their production systems break &lt;span style="font-style: italic;"&gt;daily&lt;/span&gt; (even nights and weekends) because the company's trading partners send messages that don't conform to their messaging API.  Instead of rejecting these transactions, management's approach is to ignore the problem, asking employees to massage these messages (often manually) into a compliant form.  This was going on before I started and I don't understand why the company doesn't choose to reject these messages.  Come on!  Force the trading partner to update their transmissions instead of putting these poor people through this daily hell!&lt;/li&gt;&lt;li&gt;One person I sit near has &lt;span style="font-style: italic;"&gt;openly&lt;/span&gt; been searching for a new job the last month.  Not that I blame him, but I've never witnessed such an open job search in the workplace before.  He routinely leaves during the day for interviews and constantly takes calls.  I wouldn't be so offended if his work hasn't suffered, leaving the rest of the team to pick up the slack.  Management is aware of both the job search and the lack of productivity which is causing delays, but I've seen no response to this behavior.  I can sense the rest of the team starting to wonder why they are working so hard.&lt;/li&gt;&lt;li&gt;Another team has an opening they desperately need to fill.  There's a qualified person on different team who wants to apply for the position.  Sounds like the perfect fit right?  Not so fast.  The company wrote the opening as contract-to-hire, and would force the employee to quit and reapply for the contact position!  Make any sense?  Not to me.  When I asked about this, I got some jibber jabber about head counts,  and management blah, blah, blah.  Give me a break!  Do what's right for the organization, the team and the individual here before you wind up losing  more members of the overworked team or a qualified individual.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Mismanagement in this company is a problem.  Management needs to put decent set of productivity tools in place,  it needs to do a better job helping to foster innovation, and it needs to be more responsive and sympathetic to it's employees struggles - otherwise the brain drain will continue - and at greater pace.&lt;br /&gt;&lt;br /&gt;*****&lt;br /&gt;&lt;br /&gt;Quick addition to my post last month about "&lt;a href="http://vincentfazio.blogspot.com/2008/04/silver-bullet-syndrome.html"&gt;Silver Bullet Syndrome&lt;/a&gt;".  I was listening to a &lt;a href="http://www.pragprog.com/podcasts/"&gt;Pragmatic Podcast&lt;/a&gt; this morning where &lt;a href="http://www.pragprog.com/podcasts/show/2"&gt;Michael Nygard&lt;/a&gt; commented that he's sometimes suspicious of vendor solutions.  Stating that they are developed by the "same" people as in house programmers with similar time constraints and pressures.  The result is often a framework that exhibits similar problems to custom solutions.&lt;br /&gt;&lt;br /&gt;He went on to say there are instances where a framework is indeed a better choice (connection pooling, caching, authentication, concurrency, etc).  Often these components are battle tested implementations of well known and common &lt;span style="font-style: italic;"&gt;technology&lt;/span&gt; problems that vary very little between organizations.&lt;br /&gt;&lt;br /&gt;Well said.&lt;br /&gt;&lt;br /&gt;My point was that... less often do well authored libraries or frameworks exist to address &lt;span style="font-style: italic;"&gt;business&lt;/span&gt; problems, since these can vary greatly by organization.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-7228908790606982500?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/7228908790606982500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=7228908790606982500' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7228908790606982500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7228908790606982500'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/05/poor-management-observations.html' title='Observations in Poor Management'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-8698579649922239992</id><published>2008-05-22T08:00:00.005-04:00</published><updated>2008-05-22T09:10:58.203-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='podcast'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Links to Some Useful Resources</title><content type='html'>I've been a fan of &lt;a href="http://www.joelonsoftware.com/"&gt;Joel on Software&lt;/a&gt; for some time.  Recently Joel (Spolsky) started a new enterprise, &lt;a href="http://stackoverflow.com/"&gt;stackoverflow.com&lt;/a&gt;, with Jeff Atwood.  They've been releasing some entertaining and informative &lt;a href="http://blog.stackoverflow.com/index.php?feed=podcast"&gt;podcasts&lt;/a&gt; as part of this new endeavor.&lt;br /&gt;&lt;br /&gt;Good Stuff.  Who knew you could wash your electronics??&lt;br /&gt;&lt;br /&gt;*****&lt;br /&gt;&lt;br /&gt;Joel has written a few books.  One I haven't read yet is titled &lt;a href="http://www.amazon.com/Smart-Gets-Things-Done-Technical/dp/1590598385/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1211460074&amp;amp;sr=8-1"&gt;Smart and Gets Things Done: Joel Spolsky's Concise Guide to Finding the Best Technical Talent&lt;/a&gt;.  While I'm sure this book is helpful, what I really need is a book that can help locate progressive companies which &lt;span style="font-style: italic;"&gt;allow&lt;/span&gt; employees to work smartly and get things done.&lt;br /&gt;&lt;br /&gt;I don't know if it's endemic to the region I live or it's more widespread than I imagine, but none of the companies I encounter here are doing anything close to Agile development, few are working with Ruby, most are afraid of open source, none have heard of REST web services, and most are reactive problem solvers rather than proactive.&lt;br /&gt;&lt;br /&gt;They all look first to OTS software solutions, rather than empowering their people to be creative and take ownership of the company's business problems.  They're looking for application babysitters rather than application developers.&lt;br /&gt;&lt;br /&gt;I've noticed that many of these companies use Lotus Notes for their email.  Does anyone outside of western New York use this horrible system?  This has become a litmus test for me to gauge the companies I speak with.  The way I look at it is: if you can't even get email right, how can you be expected to make good technical decisions in other areas?&lt;br /&gt;&lt;br /&gt;*****&lt;br /&gt;&lt;br /&gt;It's been a while since I've done some hard core database programming, but I listened to a &lt;a href="http://www.webdevradio.com/index.php?id=74"&gt;podcast&lt;/a&gt; from &lt;a href="http://www.webdevradio.com/"&gt;WebDevRadio&lt;/a&gt; yesterday that blew me away.  &lt;a href="http://doughboy.wordpress.com/"&gt;Brian Moon&lt;/a&gt; talked about MySQL scaling and many performance enhancements.  This was a great conversation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-8698579649922239992?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/8698579649922239992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=8698579649922239992' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8698579649922239992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8698579649922239992'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/05/links-to-some-useful-resources.html' title='Links to Some Useful Resources'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-655424264771809970</id><published>2008-05-21T11:32:00.000-04:00</published><updated>2008-05-21T11:39:48.201-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='test driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='behavior driven development'/><title type='text'>Unit Test Saga</title><content type='html'>It's been almost a month since I last posted!  I think it's partially due to the fact that I haven't had much interesting work to talk about.  Mostly I've been frustrated in trying to convince my teammates why automated unit testing is important (and how to better use our horrible source control system).  Most of the objections are the familiar "we'll be writing more test code than application code", "how can we test what we haven't written yet", "it takes too long", etc.  I think I've finally convinced them of the benefits though, and we're starting to write automated tests!  I'm hoping I can now introduce Test Driven Development and convince them to start writing their tests before the code.&lt;br /&gt; &lt;br /&gt; I came across a &lt;a href="http://www.netobjectives.com/blogs/overcoming-impediments-to-tdd-test-driven-development"&gt;podcast&lt;/a&gt; last week from &lt;a href="http://www.netobjectives.com/"&gt;Net Objectives&lt;/a&gt; that does a much better job of explaining the benefits of Test Driven Development than I ever could.  I thought it was great and I hope it's useful to others as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-655424264771809970?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/655424264771809970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=655424264771809970' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/655424264771809970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/655424264771809970'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/05/unit-test-saga.html' title='Unit Test Saga'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-4760644008962588616</id><published>2008-04-25T13:33:00.003-04:00</published><updated>2008-04-25T13:47:03.936-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>Silver Bullet Syndrome</title><content type='html'>I've noticed a trend in my current organization which I'm sure is common to many companies.  I'm having a hard time defining it, but let's call it "Silver Bullet Syndrome"... where when faced with some business problem, companies immediately look for an off the self (OTS) technology solution - many times without understanding the full scope of the problem.  The OTS solution is viewed as a "Silver Bullet" and will immediately solve all of the organization's woes.&lt;br /&gt;&lt;br /&gt;Now I'm not saying all off the shelf software is bad, but often times these business problems are not generic enough to be addressed by a general solution.  The lack of flexibility of many OTS solutions compounds the problem, forcing companies to modify business processes or requirements to meet the capabilities of the tool instead of the other way around.&lt;br /&gt;&lt;br /&gt;Once the tool is in place however, another problem manifests itself.  This often starts with a management mandate like, "OK now that we have our shiny new Silver Bullet 2.0 and &lt;span id="ciij"&gt;have &lt;i id="c0hk"&gt;paid $$$ &lt;/i&gt;&lt;/span&gt;for it, let's get the biggest bang for our buck by using it everywhere!".  What I've seen is that the limitations and compromises encountered when solving the original problem are now limitations and compromises of multiple business processes - making the entire organization less effective.&lt;br /&gt;&lt;br /&gt;In my current situation JCAPS is playing the Silver Bullet role.  JCAPS was initially purchased for it's &lt;a title="single customer view" href="http://www.sun.com/products/soa/single_customer.jsp" id="jzgo"&gt;single customer view&lt;/a&gt; capabilities.  Even though they've had continuous problems with that implementation, the organization moved forward with a JCAPS-based business automation project.  Looking at the suite, someone noticed the JCAPS Business Activity Monitoring (eBAM) functionality and now wants to use this for system level reporting on the system. &lt;br /&gt;&lt;br /&gt;Some examples to drive home the point on how the company has modified it's business to meet the capabilities of the tool: &lt;ul id="rcd-"&gt;&lt;li id="ocxy"&gt;This organization is traditionally .NET and has a large staff of .NET developers and infrastucture.  It has little expertise or experience supporting Java enterprise applications.&lt;/li&gt;&lt;li id="ocxy"&gt;While some of the EDI messages this organization supports are included in the JCAPS OTDs, some are not.  JCAPS does not provide the capability to customize these modules, forcing the company to develop "home grown" solutions anyway (reducing the benefit of the tool). &lt;/li&gt;&lt;li id="ocxy"&gt;The system reporting that the company wants is a mixture of tables and charts reporting on the performance of the system.  The eBAM module only supports specific chart types (bar, pie, light) and no tables.  Furthermore, eBam only works with Oracle or an internal proprietary database.  Not a good fit for a company which mainly uses Sybase tables.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Currently the project is behind schedule (and I'm guessing over budget).   I believe this company would have a better chance for long term success if the organization focused on using it's tech knowledge to create some custom solutions that meet their exact business needs (and they could support),  instead of looking for a "Silver Bullet".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-4760644008962588616?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/4760644008962588616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=4760644008962588616' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/4760644008962588616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/4760644008962588616'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/04/silver-bullet-syndrome.html' title='Silver Bullet Syndrome'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-4681427055114381342</id><published>2008-03-25T14:31:00.007-04:00</published><updated>2008-03-25T16:03:03.165-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>SOA Readyness</title><content type='html'>I'm wondering if my company is ready for &lt;a href="http://en.wikipedia.org/wiki/Service-oriented_architecture"&gt;SOA&lt;/a&gt;.  Right now the various business units in the company support many pieces of custom built technology which provide essentially the same functionality.  Consolidating this functionality into a common, shared set of services is what SOA is all about right?  Not only will the footprint of what we need to support be smaller, but we'll be able to meet future business needs faster (getting a jump start by reusing these prebuilt, prepackaged, pretested functionality).  Isn't SOA a no brainer in this instance?  I'm not so sure.&lt;br /&gt;&lt;br /&gt;Building successful SOA components (even ones designed for internal use) need a product development approach.  Code before SOA is essentially "set it and forget it".  Failures in a particular component have a relatively small impact.  In a SOA solution, things like scalability, stability, support, and release management are much more important.  The significance of these traits increase proportionately with the number of clients to a particular component.  All of a sudden you go from a situation where a software bug might affect a single business unit, to the point where the same bug could affect the entire enterprise.&lt;br /&gt;&lt;br /&gt;I've &lt;a href="http://vincentfazio.blogspot.com/2008/03/change-control-gone-wrong.html"&gt;already discussed&lt;/a&gt; the company's poor release management procedure.  Its system is not conducive to concurrent development.  This is needed to support released SOA components while the next version is in development.  Strike one.&lt;br /&gt;&lt;br /&gt;Currently, there are no test suites or sets of regression tests for this company's systems.  Sadly, there is little desire to build any.  Regression testing is important because as we enhance the services, we need to ensure we're not breaking any existing functionality.  Creating a custom set of tests for each change to a service wastes time and is itself error prone.  Without a good set of tests, the stability and support-ability of the service is in serious question.  Strike two.&lt;br /&gt;&lt;br /&gt;Scalability is always a concern, but since this code will now be responsible for handling more transactions (since it likely supports more than 1 client) any problems with scale will appear sooner and affect more business units.  Strikes one and two affect our ability to effectively address these performance problems.  Strike three.&lt;br /&gt;&lt;br /&gt;It seems like SOA in this environment is a disaster waiting to happen.  Until the release and testing issues are addressed, I do not see how it can succeed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-4681427055114381342?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/4681427055114381342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=4681427055114381342' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/4681427055114381342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/4681427055114381342'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/03/soa-readyness.html' title='SOA Readyness'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-7038648510603109445</id><published>2008-03-20T16:09:00.002-04:00</published><updated>2008-03-20T16:14:02.575-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='change control'/><title type='text'>Change Control Gone Wrong</title><content type='html'>Change Control &amp;amp; Release Management are two of the most fundamental elements in software engineering.  You write code.  You release code to the world.  All the while, track changes to the code in case something goes horribly wrong and you need to revert to a previous version.  It's pretty simple.&lt;br /&gt;&lt;br /&gt;Modern change control systems like &lt;span class="misspell" suggestions="CBS,CV,CS,C'S,COS"&gt;CVS&lt;/span&gt; provide additional functionality.  When checking in changes, you can include comments to describe the changes.  Tagging the repository ties various versions of source files together (i.e. for a release).  Branching involves splitting the repository so parallel development can take place (i.e. to support bug fixes to a release while the next version of development continues on the trunk).  Changes on the branch can be merged into the trunk, eliminating the need to apply fixes twice. &lt;br /&gt;&lt;br /&gt;These features are fairly standard in most of the change systems software development teams use today.  The point of this post is to ask why some organizations are reluctant to use these features?&lt;br /&gt;&lt;br /&gt;The process where I currently work is this... Write the code (the method of version control varies by team).  While the company has purchased a version control system for production releases, it wasn't available for development teams to use until recently.  Even still, the development and production version control systems are completely separate.&lt;br /&gt;&lt;br /&gt;What this means is, once the code is ready for promotion, the code is exported from the development version system and imported into the production system via copy/paste to a directory.  When an enhancement to the production release needs to be made, the process is for the production code to be imported back into the development system where the changes are made.&lt;br /&gt;&lt;br /&gt;I have a few problems with this.  First of all, the version history and comments describing the development changes are lost during this import/export process.  This information can provide assistance to the development staff in understanding what changes were made, by whom, and why.&lt;br /&gt;&lt;br /&gt;Secondly, you lose the ability to merge production fixes automatically to next-release code currently in development.&lt;br /&gt;&lt;br /&gt;Understand that the version system this company purchased has the ability to tag, merge, branch and do all the things described above yet they decide not to - instead relying an archaic system of manually copying files around to various directories.  This nullifies any value provided by the version system!  Why not just copy the release code to tape?  All I can guess is, for some reason the company doesn't trust the tool that it bought.&lt;br /&gt;&lt;br /&gt;The dirty secret in all of this is, the company's process is a total waste of time and resources.  The development team is never going to use the supplied "production code" when a release needs enhancement.  The development team is going have a tagged version of the release in the development version system to branch on.  It will automatically merge any changes to the trunk when done. &lt;br /&gt;&lt;br /&gt;For some reason, the necessity of this charade really bothers me.  Getting something so simple wrong, leads me to question how this company can make good decisions when the issues are more complex.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-7038648510603109445?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/7038648510603109445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=7038648510603109445' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7038648510603109445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7038648510603109445'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/03/change-control-gone-wrong.html' title='Change Control Gone Wrong'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-759673405186589041</id><published>2008-03-07T14:42:00.005-05:00</published><updated>2008-03-07T15:42:53.091-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='test driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>JCAPS Unit Testing - Part 3</title><content type='html'>&lt;a href="http://vincentfazio.blogspot.com/2008/03/jcaps-unit-testing-part-2.html"&gt;Now&lt;/a&gt; that we can test &lt;span style="font-family:courier new;"&gt;jcdTargets&lt;/span&gt; from a &lt;span style="font-family:courier new;"&gt;jcdUnitTester&lt;/span&gt;, the final step is to use a combination of JUnit and HTTPUnit to execute and verify the tests.  Basically we turn &lt;span style="font-family:courier new;"&gt;jcdUnitTester&lt;/span&gt; into a simple &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;RESTful Web Service&lt;/a&gt; where we post the tests.&lt;br /&gt;&lt;br /&gt;The first set of changes are to  &lt;span style="font-family:courier new;"&gt;jcdUnitTester&lt;/span&gt;.  My first pass at &lt;span style="font-family:courier new;"&gt;jcdUnitTester&lt;/span&gt; hard coded the test into the JCD.  Since we'd like to change the message per test, it'd be better to pass this in as parameter on the HTTP Request.  Use the &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;getRequest().getParameterInfo().getWebParameterList()&lt;/span&gt;&lt;/span&gt; method of JCAPS' &lt;span style="font-family:courier new;"&gt;HttpServer&lt;/span&gt; class to get these values.&lt;br /&gt;&lt;br /&gt;Other values we'll need, in addition to the test itself, is the queue/topic name where the test will be placed and the queue/topic where &lt;span style="font-family:courier new;"&gt;jcdUnitTester&lt;/span&gt; will listen for the response.  Use the same technique described in the &lt;a href="http://vincentfazio.blogspot.com/2008/03/jcaps-unit-testing-part-2.html"&gt;previous post&lt;/a&gt; to set the &lt;span style="font-family:courier new;"&gt;replyTo&lt;/span&gt; field in the JMS message.&lt;br /&gt;&lt;br /&gt;This should be the minimum set of values we'll want to send to &lt;span style="font-family:courier new;"&gt;jcdUnitTester&lt;/span&gt;.  Some other optional things I've found useful are parameters for debug level and any needed topic message selectors.&lt;br /&gt;&lt;br /&gt;The final thing to create is the JUnit test themselves.  Nothing to fancy here.  I've used standard JUnit conventions (like the @Test annotation) to identify my test methods.  The test methods use &lt;a href="http://httpunit.sourceforge.net/"&gt;HtppUnit&lt;/a&gt;'s &lt;a style="font-family: courier new;" href="http://jxquick.sourceforge.net/javadoc/com/meterware/httpunit/PostMethodWebRequest.html"&gt;PostMethodWebRequest&lt;/a&gt; (set to &lt;span style="font-family:courier new;"&gt;jcdUnitTester&lt;/span&gt;'s URL) and &lt;span style="font-family:courier new;"&gt;setParameter()&lt;/span&gt; to set the request parameters.&lt;br /&gt;&lt;br /&gt;Once the response returns, &lt;a style="font-family: courier new;" href="http://httpunit.sourceforge.net/doc/api/com/meterware/httpunit/WebResponse.html"&gt;WebResponse&lt;/a&gt;'s &lt;span style="font-family:courier new;"&gt;getText()&lt;/span&gt; method should hopefully provide the string that matches your expected result.  Otherwise, you have a bug...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-759673405186589041?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/759673405186589041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=759673405186589041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/759673405186589041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/759673405186589041'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/03/jcaps-unit-testing-part-3.html' title='JCAPS Unit Testing - Part 3'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-6789453843387521060</id><published>2008-03-06T15:52:00.007-05:00</published><updated>2008-03-07T14:45:21.285-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='test driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>JCAPS Unit Testing - Part 2</title><content type='html'>&lt;a href="http://vincentfazio.blogspot.com/2008/03/jcaps-unit-testing-part-1.html"&gt;Last time&lt;/a&gt; I explained how to trigger a JCAPS JCD from a web browser.   This entry will hopefully clarify some of the items in that post, before building on that functionality to execute &lt;a href="http://www.junit.org/"&gt;JUnit&lt;/a&gt; tests using &lt;a href="http://httpunit.sourceforge.net/"&gt;HTTPUnit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;First, the JCD created to listen for HTTP requests (let's call it &lt;span style="font-family:courier new;"&gt;jcdUnitTester&lt;/span&gt;) will drop messages on a queue or topic where the JCD we want to test is listening (call it the &lt;span style="font-family:courier new;"&gt;jcdTarget&lt;/span&gt;).  The &lt;span style="font-family:courier new;"&gt;jcdTarget&lt;/span&gt; normally processes the incoming message, then passes the result to the next process via a queue, topic, or some other transport mechanism (call it &lt;span style="font-family:courier new;"&gt;targetResponse&lt;/span&gt;).  For &lt;span style="font-family:courier new;"&gt;jcdUnitTester&lt;/span&gt; to return the message to browser in the HTTP response, &lt;span style="font-family:courier new;"&gt;jcdUnitTester&lt;/span&gt; must be listening on &lt;span style="font-family:courier new;"&gt;targetResponse&lt;/span&gt; (creating a loop between &lt;span style="font-family:courier new;"&gt;jcdUnitTester&lt;/span&gt;  and   &lt;span style="font-family:courier new;"&gt;jcdTarget.&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;In my code, most of my &lt;span style="font-family:courier new;"&gt;jcdTarget&lt;/span&gt;s  involved JCDs sending  responses back on a topic or queue.  To make the JMS &lt;span style="font-family:courier new;"&gt;jcdTarget&lt;/span&gt;s dynamic, I've taken advantage of the JMS eGate class's &lt;span style="font-family:courier new;"&gt;sendTo&lt;/span&gt; method.  The &lt;span style="font-family:courier new;"&gt;targetResponse&lt;/span&gt; is obtained from the class's &lt;span style="font-family:courier new;"&gt;getMessageProperties().getReplyTo() &lt;/span&gt;method. To set this value, &lt;span style="font-family:courier new;"&gt;jcdUnitTester&lt;/span&gt; and other classes sending messages to &lt;span style="font-family:courier new;"&gt;jcdTarget&lt;/span&gt; use &lt;span style="font-family:courier new;"&gt;getMessageProperties().setReplyTo()&lt;/span&gt;.  This convention is what makes it possible for &lt;span style="font-family:courier new;"&gt;jcdUnitTester&lt;/span&gt; to test individual &lt;span style="font-family:courier new;"&gt;jcdTarget&lt;/span&gt;s in an otherwise tightly integrated environment.&lt;br /&gt;&lt;br /&gt;*****&lt;br /&gt;&lt;br /&gt;One other hint, by default JCAPS will not place messages on the queue for consumption until the JCD exits.   This will not work for &lt;span style="font-family:courier new;"&gt;jcdUnitTester&lt;/span&gt; since it needs to send the message to trigger the &lt;span style="font-family:courier new;"&gt;jcdTarget&lt;/span&gt; then wait for the response.   To overcome this, I've set the JMS queue/topic  properties to "Transacted" and "Nonpersistent" instead of "XA" and "Persistent".   I'm sure there are other ways and settings that will achieve the same result, but these have worked for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-6789453843387521060?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/6789453843387521060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=6789453843387521060' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6789453843387521060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6789453843387521060'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/03/jcaps-unit-testing-part-2.html' title='JCAPS Unit Testing - Part 2'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-6173354266353739654</id><published>2008-03-03T11:21:00.011-05:00</published><updated>2008-03-06T16:09:31.729-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='test driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>JCAPS Unit Testing - Part 1</title><content type='html'>Since starting with JCAPS last November, I've looked for a better, automated way to test my code.  During JCAPS training, the test exercises are kicked off by placing files into a "hot folder" monitored by a File eWay.  It's very cumbersome to monitor the directory after placing the file - constantly refreshing the window, wondering why the file is not being picked up - or what is taking so long.  In my company's environment, the JCAPS development server ran on a shared machine that was cumbersome to access - adding to the difficulty in dropping this file.  Since most of our components listened on JMS queues or topics, dropping messages directly to these queues would've been an option, but these were not accessible outside the machine.&lt;br /&gt;&lt;br /&gt;I knew there had to be a simpler, more elegant way to trigger our tests.  What I needed was a way to drop a JMS message into the system and trigger my JCD.  What I wanted was a servlet-like mechanism that I could trigger at will from a web browser to drop the test message into the system, then get the resulting message and return it to the browser.&lt;br /&gt;&lt;br /&gt;I started to experiment with the HTTP Server eWay.  One of the properties of the HTTP Server External Configuration (from the Connectivity Map) was servlet-url.  The plan was connect to this URL to trigger the test.  On paper it sounds great, but there are some tricks.&lt;br /&gt;&lt;br /&gt;First, you need to know which port on the JCAPS Integration Server accepts HTTP requests.  By default, the generic HTTP port is one more than the Integration Server Admin port (or +4 for the HTTPS port).  For example, if the Integration Admin port is 18000, the HTTP listener typically runs on port 18001 (18004 for HTTPS).  You can verify these values on your systems using the JCAPS Domain Manager.&lt;br /&gt;&lt;br /&gt;Second, reaching the servlet is not as simple as typing http://localhost:18001/servlet-url.  For some reason JCAPS also requires the deployment profile name, the string "_servlet_", and the servlet-url twice (sperated by a "/").  The URL should look something like this, &lt;span style="font-style: italic;font-size:78%;" &gt;http://localhost:18001/deploymentName_servlet_servlet-url/servlet-url&lt;/span&gt;.  It took me a while to discover this, but once I did it works like a charm.&lt;br /&gt;&lt;br /&gt;That's it!  Now you can execute a JCAPS JCD from the browser.  Using &lt;span style="font-style: italic;"&gt;input.getResponse().setText()&lt;/span&gt; and&lt;span style="font-style: italic;"&gt; input.sendResponse() &lt;/span&gt;you can send information back to the user.&lt;br /&gt;&lt;br /&gt;Next, I'll describe how I integrated this approach with JUnit to remotely unit test my deployed JCAPS modules.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-6173354266353739654?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/6173354266353739654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=6173354266353739654' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6173354266353739654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6173354266353739654'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/03/jcaps-unit-testing-part-1.html' title='JCAPS Unit Testing - Part 1'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-7133225508275033725</id><published>2008-02-29T11:03:00.006-05:00</published><updated>2008-02-29T14:22:29.334-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='test driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='PodcatherProject'/><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>Crazy Lately</title><content type='html'>Things have been really hairy at work lately.   I haven't had much chance to write.  Here's what I've been up to.&lt;br /&gt;&lt;h4&gt;JCAPS&lt;br /&gt;&lt;/h4&gt;One of my goals this year has been to make JCAPS more usable.  A tall order indeed.   I'm going to hit on the details of some of these items in later posts, but here's a bullet list of some of the issues I've been working through.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;My organization uses some non-standard &lt;a href="http://en.wikipedia.org/wiki/X12"&gt;x12 EDI&lt;/a&gt; messages.  The way to get JCAPS to process these messages is by creating an OTD from an &lt;a href="http://www.edidev.com/SEF.htm"&gt;SEF&lt;/a&gt; file.  I had no luck finding someone to help me create such a file and there are &lt;a href="http://del.icio.us/vincentfazio/edi"&gt;surprisingly few&lt;/a&gt; Java libraries that support these x12 messages.  I wound up writing my own parser.  It works pretty well and can be extended to support other message types.&lt;/li&gt;&lt;li&gt;I've developed an approach that provides an automated way to test my JCAPS collaborations using JUnit.  I'll describe this approach in future posts.&lt;/li&gt;&lt;li&gt;The company I'm working for has a change control process that is completely foreign to me.  I'm even questioning&lt;span style="font-style: italic;"&gt; &lt;/span&gt;if it is an actual change control process.  I'll describe this approach in a future post, what I perceive to be it's shortcomings, and describe how I think it should work.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;Podcatcher&lt;br /&gt;&lt;/h4&gt;Lately, my free time has been pretty busy as well.  I haven't made any progress on the podcatcher lately.   I have decided to code the podcatcher in Java, using the prebuilt Netbeans plugins to create the user interface.  Once I get something working, I'm going to pick up a copy of&lt;a href="http://www.amazon.com/Filthy-Rich-Clients-Developing-Applications/dp/0132413930"&gt; Filthy Rich Clients&lt;/a&gt; to dress up the interface.  From a purely academic standpoint, I wanted to use Ruby and Air to get experience with these technologies.     On the other hand, I want the tool to be usable.   I think that given the unknowns and "newness" in creating a client-side UI in either Ruby or Air technologies, the Java approach is a safer bet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-7133225508275033725?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/7133225508275033725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=7133225508275033725' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7133225508275033725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7133225508275033725'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/02/crazy-lately.html' title='Crazy Lately'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-5301003677639511398</id><published>2008-02-16T06:55:00.005-05:00</published><updated>2008-02-16T07:24:42.825-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='PodcatherProject'/><title type='text'>Heavy Air</title><content type='html'>I downloaded some of the &lt;a href="http://labs.adobe.com/technologies/air/samples/"&gt;Air samples&lt;/a&gt; and the first thing it wants to do is &lt;span style="font-style: italic;"&gt;install&lt;/span&gt; the application on my machine.  I expected an &lt;a href="http://labs.adobe.com/technologies/air/"&gt;Air&lt;/a&gt; application would be fairly lightweight (like a client-side Java application), and as long as I had the Air runtime on my machine the application would run - no administrative rights required.  Not so.  And too bad. &lt;br /&gt;&lt;br /&gt;Installing Eclipse is simply an unzip.  There is no need to add entries to the registry or provide administrative rights.  It's simple and that's the way it should be.&lt;br /&gt;&lt;br /&gt;I wonder why Adobe didn't follow this model?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-5301003677639511398?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/5301003677639511398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=5301003677639511398' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5301003677639511398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5301003677639511398'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/02/heavy-air.html' title='Heavy Air'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-7878197933778081746</id><published>2008-02-09T12:44:00.000-05:00</published><updated>2008-02-09T16:44:46.155-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='rcp'/><category scheme='http://www.blogger.com/atom/ns#' term='test driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='ria'/><category scheme='http://www.blogger.com/atom/ns#' term='PodcatherProject'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='behavior driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='Rspec'/><title type='text'>Podcatcher Prototyping</title><content type='html'>I started this &lt;a href="http://vincentfazio.blogspot.com/search/label/PodcatherProject?max-results=100"&gt;podcast project&lt;/a&gt; so I could learn some things I haven't had time to experiment with in my "real" job.  Things like playing more with Ruby, trying out Behavior-Driven Development, and experimenting with Agile practices (plus  I really wanted a better podcatcher program and I needed something to do over the winter).  While I haven't produced much real code yet, I've created some simple prototypes and wanted to comment on some things I've been looking at.&lt;br /&gt;&lt;h3&gt;Reading an RSS feed&lt;/h3&gt;My first prototype was a very simple Ruby program to read and parse an RSS feed.  I had found some code &lt;a href="http://www.rubyrss.com/"&gt;here&lt;/a&gt; using the &lt;a href="http://www.ruby-doc.org/stdlib/libdoc/rss/rdoc/index.html"&gt;standard Ruby RSS Parser&lt;/a&gt; so that's where I started.  At first I thought it was broken, but after about &lt;span style="font-style: italic;"&gt;a minute and a half &lt;/span&gt;it returned.  This wasn't going to cut it, so I started to look for alternatives and quickly found the &lt;a href="http://code.google.com/p/feed-normalizer/"&gt;feed-normalizer&lt;/a&gt; gem.  Some quick coding and the total time to access the RSS feed was reduced to about 10 seconds.  Not bad, but I still wanted better.&lt;br /&gt;&lt;br /&gt;I was using &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt; and knew that it used the &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; (1.0.2) interpreter by default.  I switched the NetBeans interpreter to the "&lt;a href="http://www.ruby-lang.org/en/"&gt;standard&lt;/a&gt;" 1.8.6 release and reran my tests.  Both tests came back in about the same time - a little under 6 seconds.  Interesting.&lt;br /&gt;&lt;br /&gt;While researching RSS, I came across &lt;a href="http://fishbowl.pastiche.org/2002/10/21/http_conditional_get_for_rss_hackers"&gt;this article&lt;/a&gt; describing &lt;span style="font-style: italic;"&gt;conditional get&lt;/span&gt;.  Neither of these Ruby libraries appear to support conditional get, but I found a Java library called &lt;a href="https://rome.dev.java.net/"&gt;Rome&lt;/a&gt; which does.  Because of my &lt;a href="http://vincentfazio.blogspot.com/2008/01/podcatcher-sprint-1.html"&gt;UI concerns&lt;/a&gt; (more on that later) I was curious how a Java implementation of this functionality would compare to what I was seeing from Ruby.  The Rome prototype accessed the feed in less than 5 seconds, with the conditional get taking a few tenths of a second.  Now I had a decision to make, stick with the plan to use Ruby or switch over to Java?&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Behavior-Driven Development&lt;/h3&gt;I was first turned on to the idea of &lt;a href="http://behaviour-driven.org/"&gt;behavior-driven development&lt;/a&gt; (BDD) back in &lt;a href="http://vincentfazio.blogspot.com/2007/10/behavior-driven-development.html"&gt;October&lt;/a&gt;.  My initial plan was to use &lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt; with Ruby, but what BDD frameworks are available for Java??  As it turns out, there are several and I decided to try out &lt;a href="http://jbehave.org/"&gt;JBehave&lt;/a&gt; and &lt;a href="http://code.google.com/p/instinct/"&gt;Instinct&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;JBehave uses a  "Given -&gt; When -&gt; Then" format to specify it's tests which looks very similar to the way RSpec does things.  It does have a &lt;a href="http://www.junit.org/"&gt;JUnit&lt;/a&gt; like test runner, but I couldn't get it to work from inside NetBeans (I used the Ant target instead).  The Ant task didn't produce the green/red visual that I like with JUnit, but the tests did run.  It looks as if the most recent release of this library was 12/2006 so I'm not sure how active this project is.&lt;br /&gt;&lt;br /&gt;Instinct looks very much like JUnit.  It uses annotations to define "specifications" rather than "tests" and "expects" instead of "asserts".  Problem was, I couldn't get the example code's maven build to work from inside NetBeans.  The most recent least was 12/2007, but it was for version 0.1.6 making stability and maturity a question mark.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;User Interface&lt;/h3&gt;Because I wanted this podcather to be something I'd use, the user interface is something I've been thinking about as well.  I've previously created an &lt;a href="http://vincentfazio.blogspot.com/2007/05/eclipse-rcp.html"&gt;Eclipse RCP&lt;/a&gt; client application so I knew I could build the UI I wanted there.  I wasn't sure I could build a "good enough" interface in Ruby using it's Tk bindings. As luck would have it a &lt;a href="http://www.railsenvy.com/2008/1/16/rails-envy-podcast-episode-014-1-16-2008"&gt;recent RailsEnvy podcast&lt;/a&gt; reminded me of &lt;a href="http://code.whytheluckystiff.net/shoes/"&gt;Shoes&lt;/a&gt;, an alternative windowing toolkit for Ruby.  Like Instinct, it's still fairly early in development and I'm a little concerned about it's stability.&lt;br /&gt;&lt;br /&gt;Still undecided, I decided to take another look at &lt;a href="http://labs.adobe.com/technologies/air/"&gt;Adobe Air&lt;/a&gt;.  &lt;a href="http://vincentfazio.blogspot.com/search/label/flex?max-results=100"&gt;A while back&lt;/a&gt;, I looked into &lt;a href="http://labs.adobe.com/technologies/flex/"&gt;Flex&lt;/a&gt; as a framework to create Rich Internet Applications.  What drew me to Flex, was how easy it was to create beautiful, interactive, user interfaces.  Because Flex applications run in Adobe's Flash player (which is on virtually all browsers), these applications are very portable.  Air brings that portability to the desktop, providing a runtime for applications to run in regardless of the operating system (similar to a Java virtual machine).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;What's Next&lt;/h3&gt;Today I downloaded the Air plug-in for Eclipse and I'm going to spend some time playing with that.  If it's as nice as I hope it is, I'll figure out what technologies it integrates with (Java or Ruby) and move on from there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-7878197933778081746?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/7878197933778081746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=7878197933778081746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7878197933778081746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7878197933778081746'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/02/podcast-prototyping.html' title='Podcatcher Prototyping'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-2188423033696229600</id><published>2008-01-29T08:25:00.001-05:00</published><updated>2008-01-29T09:31:16.883-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>JCAPS Training Notes</title><content type='html'>The JCAPS training I attended (&lt;a style="font-style: italic;" href="http://www.sun.com/training/catalog/courses/SB-CAP-0502.xml"&gt;Foundations of Java CAPS II&lt;/a&gt;) was excellent.   We screamed through the course material in 3 days and had discussions on other JCAPS topics the other 2 days.  Here were my impressions.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I enjoyed learning about the &lt;a href="http://developers.sun.com/javacaps/product_list.html#2"&gt;eInsight Business Process Manager&lt;/a&gt;.  The tools and steps involved in creating a business process are very similar to those used to create a JCD.  There are a lot of interesting constructs like correlation and the "flow" element, which easily enable parallel processing.   One frequent topic of discussion, was when to use an business process (eInsight) rather than a JCD.   There's a certain flexibility to creating a business process, gained at the cost of speed.  Since you can do virtually everything in a JCD that can be done by a business process, we questioned when each was a better fit.  We didn't reach a consensus and I'm sure we'll be talking about this again.&lt;/li&gt;&lt;li&gt;We explored the shortcomings of the repository and the best way to manage releases.  In the short term we are going to rely on branching, which is kind of a pain because the entire repository must be branched.  Longer term we are waiting for the 5.2 release, which will allow us to move to a different repository version.&lt;/li&gt;&lt;li&gt;Speaking of Java Caps 5.2, it should be released later this year with a beta version coming at the end of this quarter (1Q2008).  eDesigner should see the biggest changes.  As I understand it, it'll be based on the Netbeans 6.0 release.  I'm hoping that the JCAPS functionality will be provided as a plugin to this IDE, keeping intact all other Netbeans functionality.  This should allow a more natural way to create subprojects (JARS or 3rd party libraries) which can then be easily integrated into JCDs and other JCAPS components.&lt;/li&gt;&lt;li&gt;We took a quick look at &lt;a href="http://developers.sun.com/javacaps/product_list.html#8"&gt;eView&lt;/a&gt; which is an interesting utility providing the logic to form a single customer view from information silos.  We've been facing some performance and maintenance problems in this area so it was nice to get some insight.&lt;/li&gt;&lt;li&gt;Unit Testing is still a bit of a question mark.  The instructor pointed us toward JUnit and JMeter, but I'm having a hard time figuring how to call JCDs from these tools.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Overall,  a great week learning!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-2188423033696229600?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/2188423033696229600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=2188423033696229600' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2188423033696229600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2188423033696229600'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/01/jcaps-training-notes.html' title='JCAPS Training Notes'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-5444979443340040108</id><published>2008-01-20T12:19:00.000-05:00</published><updated>2008-01-20T13:50:31.626-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='rcp'/><category scheme='http://www.blogger.com/atom/ns#' term='PodcatherProject'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='behavior driven development'/><title type='text'>Podcatcher - Sprint 1</title><content type='html'>I've made embarrassingly little progress on my podcatcher so far.  My plan was to entirely read &lt;a href="http://www.amazon.com/Lean-Software-Development-Agile-Toolkit/dp/0321150783/ref=pd_bbs_sr_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1199111572&amp;amp;sr=8-2"&gt;&lt;span class="sans" style="font-style: italic;"&gt;Lean Software Development&lt;/span&gt;&lt;/a&gt; before getting started, but it's taking me a while to get through the book - in a good way.  I seldom read more than 5 or 7 pages before I find myself reflecting on current or past projects.  This knowledge could've saved me time on previous work by making the most important &amp;amp; well defined features a priority - delaying discussion and decisions on the "nice to have" features until later.  Some of these ideas I've &lt;a href="http://vincentfazio.blogspot.com/2007/05/accidentally-agile.html"&gt;stumbled on by accident&lt;/a&gt; or heard about from others, but it's great to have them validated and expanded into this set of lean thinking tools.  I'm sure this is a book I'll reread many times in the coming years.&lt;br /&gt;&lt;br /&gt;Anyway, I want to revisit my requirements list for the podcatcher, prioritize the features, and define the features for my first sprint.  Here are the requirements for the podcatcher from a previous post, roughly ordered by importance.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Subscribe to podcasts via RSS.&lt;/li&gt;&lt;li&gt;Download only show descriptions (if this is not the default).  Otherwise add functionality to download the entire show.  Make this configurable by show.&lt;/li&gt;&lt;li&gt;Delete podcasts (including descriptions).&lt;/li&gt;&lt;li&gt;Build user interface&lt;/li&gt;&lt;li&gt;Import OPML files from iTunes.&lt;/li&gt;&lt;li&gt;Ability to set the genre (or other metadata) for the shows.&lt;/li&gt;&lt;li&gt;Enable playlist creation&lt;/li&gt;&lt;li&gt;Allow the creation of a "favorites list" with user notes or labels and a URL to the show.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The overall goal is to have the podcatcher "live" on the MP3 player or other removable drive so keeping the footprint of the application small will be very important.  I'll be monitoring this very closely.&lt;br /&gt;&lt;br /&gt;One other note,  the user interface is something I've been thinking a lot about lately.  I'd like the look and feel to be a native as possible to where the application is running.  I know Ruby has a Tk extension bundled with it and I've found some other options, but none look as robust as the Eclipse RCP platform I've worked with previously.  I really want to code this in Ruby, so an option may be to use JRuby, with Eclipse for the final solution.  I'm going to keep looking and will try out a bunch of options to see which is the best fit for what I want.&lt;br /&gt;&lt;br /&gt;Here's what I hope to accomplish in the next week or two, in the first sprint&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Download, install, and start to learn &lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt;.  RSPec is a behavior driven development framework that I'm hoping to use to describe and test the behavior of the podcather.&lt;/li&gt;&lt;li&gt;Define behaviors for downloading podcasts via RSS.&lt;/li&gt;&lt;li&gt;Code these behaviors.&lt;br /&gt;&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/104488715285175512-5444979443340040108?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/5444979443340040108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=5444979443340040108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5444979443340040108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5444979443340040108'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/01/podcatcher-sprint-1.html' title='Podcatcher - Sprint 1'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-4596099573951432842</id><published>2008-01-18T18:35:00.002-05:00</published><updated>2008-01-18T19:29:31.809-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>Is Orchestration the new Web 2.0?</title><content type='html'>In recent &lt;a href="http://en.wikipedia.org/wiki/Service-oriented_architecture"&gt;SOA&lt;/a&gt; discussions with people at work, the topic of &lt;a href="http://en.wikipedia.org/wiki/Orchestration_%28computers%29"&gt;orchestration&lt;/a&gt; often comes up.  The problem is, like &lt;a href="http://en.wikipedia.org/wiki/Web_2.0#Defining_.22Web_2.0.22"&gt;Web 2.0&lt;/a&gt; before it, the meaning of what an orchestration (or orchestration layer) is differs depending on who you're talking with.&lt;br /&gt;&lt;br /&gt;In my view, an orchestration simply refers to the process of integrating disparate applications.  This idea is obviously not new.  It's just a new name for an &lt;a href="http://en.wikipedia.org/wiki/Remote_procedure_call"&gt;RPC&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Enterprise_service_bus"&gt;ESB-layer&lt;/a&gt; but relies on HTTP for communication instead of CORBA or something like &lt;a href="http://en.wikipedia.org/wiki/Java_Message_Service"&gt;JMS&lt;/a&gt;.   This view is supported on Orchestration's Wikipedia entry which describes an orchestration as&lt;br /&gt;&lt;blockquote&gt;the process of coordinating an exchange of information through web service interactions.&lt;/blockquote&gt;Speaking of the Enterprise Service Bus, it seems there is some confusion whether the "orchestration" lives at the same layer of the ESB or at a layer above the ESB and helps to coordinate ESB communications.  I fall into the first camp, believing that "orchestration" is just a new way to do ESB.  Wikipedia to the rescue again &lt;blockquote&gt;the ESB is the piece of software that lies between the business applications and enables communication among them&lt;/blockquote&gt;Because of the confusion in defining these terms, it has been hard for the organization I'm with to gain much traction in implementing their SOA solutions.  I'm sure we're not alone...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-4596099573951432842?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/4596099573951432842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=4596099573951432842' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/4596099573951432842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/4596099573951432842'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/01/is-orchestration-new-web-20.html' title='Is Orchestration the new Web 2.0?'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-2831028241435257049</id><published>2008-01-16T20:15:00.000-05:00</published><updated>2008-01-16T20:17:12.111-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><title type='text'>Web Service Discussion</title><content type='html'>Again and again the topic comes up at work about fine vs. coarse grained web services.  Is anyone else talking about this?  I guess I don't understand what the big debate is about.&lt;br /&gt;&lt;br /&gt;I think of a fine grained service as implementing a very specific, atomic operation.  Course grained services implement larger, multistep operations... possibly consuming other services.&lt;br /&gt;&lt;br /&gt;The way I look at it is this:  a business has some piece of functionality it wants to make available for others to use (the service).  It shouldn't matter if the steps performed by the service &lt;span style="font-style: italic;"&gt;can&lt;/span&gt; be broken into smaller components.  If no one can use these intermediate (finer-grained) components, the energy spent defining, building, and maintaining this (unused) functionality is wasted.  My position is that it's better to wait.   Should the need to reuse some of the functionality arise, &lt;span style="font-style: italic;"&gt;then&lt;/span&gt; refactor the common functionality into a smaller, reusable service.&lt;br /&gt;&lt;br /&gt;Am I thinking about this wrong?  What am I missing?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-2831028241435257049?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/2831028241435257049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=2831028241435257049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2831028241435257049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2831028241435257049'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/01/web-service-discussion.html' title='Web Service Discussion'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-8762784974818062847</id><published>2008-01-14T08:18:00.000-05:00</published><updated>2008-07-15T15:56:34.161-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><category scheme='http://www.blogger.com/atom/ns#' term='BPEL'/><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>JCAPS Training II</title><content type='html'>I'm back at JCAPS training this week. This time the focus is on the &lt;a href="http://developers.sun.com/javacaps/product_list.html#2"&gt;eInsight Business Process Manager&lt;/a&gt;.   eInsight is the JCAPS architecture layer used to combine web services.  The services are connected using &lt;a href="http://en.wikipedia.org/wiki/BPEL"&gt;BPEL&lt;/a&gt; which is an XML-based language to define business processes.  The &lt;a href="http://www.netbeans.org/features/soa/index.html"&gt;latest version of NetBeans&lt;/a&gt; also includes a BPEL tool, and I'm anxious to see how they compare.&lt;br /&gt;&lt;br /&gt;We have some time scheduled at the end of the formal training to explore some of the JCAPS problems we've been experiencing.  In addition to the problems I've already outlined with the &lt;a href="http://vincentfazio.blogspot.com/2007/11/more-jcaps-impressions.html"&gt;repository&lt;/a&gt;.  I'm hoping we can also explore the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Lately, we've seen some weird behavior where things that were previously working stopped.  The errors in the logs don't seem to make any sense.  At first we thought it might be due to some code that was copied to a different location, but I've seen this problem where no code was copied.  The only remedy we've found is to recreate both the connectivity map and the deployment profile. &lt;/li&gt;&lt;li&gt;I'm having a hard time following "good" programming practices in out JCAPS architecture.  Most of our code resides in JCDs.  Some of which do a lot of processing.  The JCDs don't readily lend themselves to a very modular architecture.  Class hierarchies are not possible, making it hard to implement many design patterns.  I'd also like to leverage something like &lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt; or &lt;a href="http://www.junit.org/"&gt;JUnit&lt;/a&gt;, but can't figure out how to integrate these into the tool.&lt;/li&gt;&lt;li&gt;Any debugging or profiling tips we can pick up.  Right now, we rely on the logs and it's tedious.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;In any event, the BPEL training should be useful.  If the instructor can shed any light on the problems we've been having, that will be a bonus.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-8762784974818062847?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/8762784974818062847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=8762784974818062847' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8762784974818062847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8762784974818062847'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/01/jcaps-training-ii.html' title='JCAPS Training II'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-3887724398009344194</id><published>2008-01-06T19:43:00.000-05:00</published><updated>2008-01-20T12:28:21.444-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='PodcatherProject'/><title type='text'>Podcatcher - Requirements</title><content type='html'>One of the &lt;a href="http://vincentfazio.blogspot.com/2007/12/2008-resolutions.html"&gt;goals&lt;/a&gt; I set for myself in the New Year was to gain experience with Lean/Agile software development.  My test project will be a fairly simple podcatcher to manage the podcasts I listen to.  Here is the initial set of requirements for this tool...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Subscribe to podcasts (obviously).  All of my current subscriptions are &lt;a href="http://en.wikipedia.org/wiki/RSS_%28file_format%29"&gt;RSS&lt;/a&gt;, so I'll focus on this first.   Once I have something functioning, I'll add support for &lt;a href="http://en.wikipedia.org/wiki/Atom_%28standard%29"&gt;Atom&lt;/a&gt; feeds.   It will also support importing OPML files.  This is the format exported by iTunes.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I currently use iTunes to manage my podcasts and the default is to retrieve the latest podcasts on startup.  This is OK if you generally listen to all episodes you subscribe to, but for some subscriptions, I like to pick and choose the shows I want to listen to.  I know this behavior is generally configurable in iTunes, but I'm not sure this can be individually configured per show.   The default behavior for my podcatcher will be to download only show descriptions, with the option to automatically grab the latest shows.  This will be configurable by show.&lt;/li&gt;&lt;li&gt;Ability to set the genre (or other metadata) for the shows.  This will provide a greater ability to automatically group shows I'd like to listen to.&lt;/li&gt;&lt;li&gt;Playlist creation - a manual way to group shows together for listening.&lt;/li&gt;&lt;li&gt;Allow the creation of a "favorites list" with user notes or labels about the show.  This will offer a way to bookmark the URL of favorite episodes along with some notes and tag information.  If you want to relisten to an episode at a later time, the episode can be easily downloaded again.&lt;/li&gt;&lt;li&gt;I'd like the podcather to "live" on the player (or any portable storage device).  I've switched computers a lot lately and each time I import my OPML file into iTunes, I've needed to manually check for new episodes not downloaded by another iTunes installation.  Also, since I've never had an iPod, syncing with the player has always been a manual process.  By living directly on the mp3 player, these synchronization issues won't be an issue.  Even when switching mp3 players, the podcatcher software can be simply copied between players.  This requirement requires that the software footprint be as small as possible.&lt;/li&gt;&lt;li&gt;And finally, delete podcasts (including descriptions).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I guess that's it.   On the surface this looks like fairly simple and straightforward project with a useful set of features.  I think the next "Lean" thing to do is to prioritize these requirements and set the minimum criteria set needed to meet these requirements, but  I'm going to start reading to verify this approach.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-3887724398009344194?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/3887724398009344194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=3887724398009344194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3887724398009344194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3887724398009344194'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2008/01/podcatcher-requirements.html' title='Podcatcher - Requirements'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-5916670615059041505</id><published>2007-12-31T07:38:00.000-05:00</published><updated>2008-01-20T12:30:11.734-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='PodcatherProject'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='behavior driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>2008 Resolutions</title><content type='html'>Making resolutions is tradition on New Year's Eve.... evaluate areas you'd like to improve (or new skills you'd like to acquire), and set goals to improve in those areas.   Here are two work-related resolutions I'm going to focus on entering 2008.&lt;br /&gt;&lt;h4&gt;Make JCAPS Usable&lt;br /&gt;&lt;/h4&gt;If you've been following my posts, you're aware that I've been frustrated with Sun's JCAPS product.    The tool is simply not ready for prime time and it's hurting my productivity.   In addition to &lt;a href="http://vincentfazio.blogspot.com/search/label/JCAPS?max-results=100"&gt;the problems I've already outlined&lt;/a&gt;, developing in JCAPS' eDesigner makes me "feel dirty".  You need to go outside to tool to create modules of shared code (jars).  This limitation makes it hard to implement classes that follow even the simplest design patterns or integrate with third party frameworks, like &lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt;.  I feel myself falling into bad coding habits.&lt;br /&gt;&lt;br /&gt;I'd like to find a compromise.  What I'd like to do, is move my code out of the JCAPS JCD and into a separate web service that runs directly on the shared JCAPS application server.  The JCD would call this module to do all the heavy lifting, then return to the JCAPS JCD.  JCAPS would be used primarily for mapping TCP, MQ, or FTP requests to the web service.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Practice Agile Development&lt;/h4&gt;The past year introduced me to many new technologies and ways of thinking.  Two I've been most excited about are &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;Agile Software Development&lt;/a&gt;.   Since I'm currently not using either in my "real work", I'm going to use these tools to create a relatively simple and lightweight &lt;a href="http://en.wikipedia.org/wiki/Podcasting#Receiving_and_using_podcasts"&gt;podcatcher&lt;/a&gt;.  I'll outline my requirements, approach, and progress in the weeks to follow.  I'll be using the Poppendieck's &lt;a href="http://www.amazon.com/Lean-Software-Development-Agile-Toolkit/dp/0321150783/ref=pd_bbs_sr_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1199111572&amp;amp;sr=8-2"&gt;&lt;span class="sans" style="font-style: italic;"&gt;Lean Software Development: An Agile Toolkit&lt;/span&gt;&lt;/a&gt; as my guide to an Agile approach and the &lt;a href="http://rspec.info/"&gt;Rspec&lt;/a&gt; framework to define and test the behavior of the application.  It should be fun and give me some great experience!&lt;br /&gt;&lt;br /&gt;Happy New Year!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-5916670615059041505?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/5916670615059041505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=5916670615059041505' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5916670615059041505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5916670615059041505'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/12/2008-resolutions.html' title='2008 Resolutions'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-6845577077524166949</id><published>2007-12-04T10:40:00.000-05:00</published><updated>2007-12-04T12:00:47.564-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rockbox'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Vista Woes</title><content type='html'>I recently purchased a new laptop preloaded with Vista (Home Premium).  Given the choice I'd have preferred to stay with XP, but I had more than enough hardware to support it, so I thought "what the heck".  Now I feel like I'm in one of those &lt;a href="http://www.apple.com/getamac/ads/"&gt;Mac commercials&lt;/a&gt;.  Here are some of the issues I'm facing.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;When I first booted up Vista, I made the mistake of setting what I intended to be my personal user ("Vinnie") as the Administrator.  I was told this is not a good idea for security reasons so I renamed the Administrator account to "Admin" and created a new "regular" user reusing the "Vinnie" account name.  On the surface everything appeared OK until I wanted to find the files associated with my account.  There are user folders for "Vinnie" and "Vinnie2".  The "Vinnie" folder corresponds to my Administrator account.  The "Vinnie2" folder corresponds to my "regular" account.  When I renamed my Administrator account, why didn't Vista also rename the user files associated with this user?!?  Dumb and annoying.  I made a mistake, shouldn't the software be able to help me recover?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I have a fairly popular Sansa mp3 player.  When I connect it to Vista, I cannot manage all the music on the player.  Many of the folders and files are not visible for some reason.  I can see all the files if I reconnect the player to an XP machine.  I can also access the files in Vista if I manually type in the folder and file names .  What gives?  In frustration, I accidentally "bricked" my player trying to resolve this issue.  I'm hoping I can get the player back in working order with &lt;a href="http://www.google.com/url?sa=t&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fwww.rockbox.org%2F&amp;amp;ei=8X1VR5DYPJL2gATEpIT2CA&amp;amp;usg=AFQjCNFtCPEUyZtNPgyfkuQyrPyqgUOwfg&amp;amp;sig2=wBy6BCw3zsMejKpeN_35VQ"&gt;Rockbox&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;On XP, I used Photoshop Elements to categorize my photos.  Since Vista has a "&lt;a href="http://windowshelp.microsoft.com/Windows/en-US/Help/bf416877-c83f-4476-a3da-8ec98dcf5f101033.mspx"&gt;Compatibility Mode&lt;/a&gt;" I was hopeful this wouldn't be a problem.  (Insert manual buzzer here) Wrong!&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;I sill haven't been able to read in my Photoshop catalog on Vista (again it reads in with no problem on a XP machine with a clean Photoshop install)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The application has many odd display artifacts and Adobe Update causes the entire application to crash.&lt;/li&gt;&lt;li&gt;Every time I start the application I get a message telling me that I do not have Administrator privileges and some functionality will not work correctly.  There is no way to disable this message, and running as Administrator poses additional annoyances (see below).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;You can set up applications to run with Administrator privileges.  Unfortunately every time you start the application you need to provide the Administrator credentials.  Shouldn't there be a way to say: &lt;blockquote style="font-style: italic;"&gt;"Hey this application will not run how it's supposed to without Administrator privileges.  I know this is not the ideal way to run, but there's no other way.  I trust this program, so don't ask me for the cotton picking password everytime I need to run this app!"&lt;/blockquote&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;I've also noticed that when I need to provide Admin access to install an Application, those credentials carry over to when I start the Application, placing any user information into the "Administrator" user folder instead of my "regular" user folder.  Am I now running as the Administrator?  Shouldn't the Administrator credentials only be needed approve the application install?  What a joke!  (This behavior goes away if I log out, then log in again.)&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;Apple is winning over the "average PC user", because their products &lt;span style="font-weight: bold; font-style: italic;"&gt;simply work&lt;/span&gt;.  I never hear an Apple (or iPod or iPhone) user complain of the problems I'm facing with my Vista PC or mp3 player, or cell phone.  And again, it's why they can charge a premium for their products.   For Apple it's not about the number of functions, it about the functionality.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-6845577077524166949?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/6845577077524166949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=6845577077524166949' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6845577077524166949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6845577077524166949'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/12/vista-woes.html' title='Vista Woes'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-5452818662083846338</id><published>2007-11-21T07:50:00.000-05:00</published><updated>2007-11-21T08:47:06.408-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>More JCAPS Impressions</title><content type='html'>I haven't had much chance to post since starting my new position.  Getting up to speed in my new role has kept me busy.   I have been using JCAPS though and thought I'd post a quick update on my impressions.&lt;br /&gt;&lt;br /&gt;Basically the good is still the good, but my team and I are experiencing more pain points, mostly due to the poor repository integrated into the tool.   Here's a quick list of things I'd like to see improved.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I've gotten in the habit of diff'ing my changes against the repository version to  ensure I'm only checking in changes I've intended.  JCAPS does not allow you to do this.  There's also no easy way to diff changes between different repository versions.  You need to be creative, and go outside to tool for this functionality.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There's no easy way to find all the files you have checked out of the repository.  You need to manually keep track of the files you've touched.   I've become accustomed to relying on my development tools to keep track of this for me, so this is a pain.&lt;/li&gt;&lt;li&gt;We're having a hard time coming up with a good maintenance plan.  The repository does offer tagging and branching, but these terms in a JCAPS repository seem to mean different things than they do in CVS.  When you tag a set of files for a JCAPS release, there does not seem to be way to grab all these files as a single unit.  In JCAPS, a tag is more of an informational item, like a comment.  Branching seems to be more like CVS tagging and branching combined (versioning a set of files together and setting up an alternative development path).  Missing is the ability to merge into the trunk.&lt;/li&gt;&lt;li&gt;Aside from the repository, we've been having problems with things as simple as generating javadocs from the the JCAPS Designer.  Again, we're forced to go outside the tool to get this functionality.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The more I use JCAPS, the more my wish list for new features grows.  I'm hoping the next version of JCAPS will address these problems, but I've been unable to find much information about the upcoming enhancements or a release date.  At this point I'm finding JCAPS helpful for quickly laying the interface plumbing (connections to a DB, web service, queue, etc) between applications (or application components),  but painful for almost everyhting else.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-5452818662083846338?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/5452818662083846338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=5452818662083846338' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5452818662083846338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5452818662083846338'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/11/more-jcaps-impressions.html' title='More JCAPS Impressions'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-1773587503107742195</id><published>2007-10-31T20:24:00.000-04:00</published><updated>2007-11-01T09:11:00.045-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>JCAPS Training</title><content type='html'>I've been in JCAPS training all week, and so far my exposure to the product has produced mixed feelings ....&lt;br /&gt;&lt;h4&gt;the good....&lt;/h4&gt;JCAPS is definitely meant for enterprise-class application development.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The architecture makes connecting to files, messaging queues, and databases trivial.  It's scary easy.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Things like monitoring and deploying to multiple environments are baked in.  Again, it's nice to not have to worry about developing or searching for tools to manage these tasks.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The JCAPS tools also produce some nice pseudo-documentation (diagrams and high level descriptions depicting what the application is doing and how things are connected).   Some may think this is a little cheesy, but I like the idea of getting a high level picture of what is going on without having to surf through multiple source and configuration files.  Having some built in transparency is nice (especially in large systems).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;the bad....&lt;/h4&gt;Is also the &lt;span style="font-style: italic;"&gt;UGLY&lt;/span&gt;...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The JCAPS is built on NetBeans 3, which is nothing like the version 6 release I'd been working.  I feel like I've taken a bad trip back in time.  I haven't been able to find a lot of the cool tools I've gotten accustomed to using (i.e. debugging &amp;amp; refactoring tools).  The good news is that tighter integration with a more current version of NetBeans is supposed to come with JCAPS 6.  I can't wait.&lt;/li&gt;&lt;li&gt;To produce some of the cool diagrams I mentioned earlier, you need to follow some "conventions" in your code.  Most of the time this means using fully qualified class names in method declarations (the tool will not recognize &lt;span style="font-family:courier new;"&gt;import&lt;/span&gt; statements).  This makes the code overly verbose.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;JCAPS provides some web-based management tools.  These only work in Internet Explorer :-(   The   JCAPS Enterprise Designer only runs on Windows.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;JCAPS uses an internal (antiquated) version control system.  There's no way to plug it into an existing CVS or Subversion repository.   Again, I'm told this functionality should be coming soon.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;Impressions so far...&lt;/h4&gt;JCAPS is a framework that helps make creation and maintenance of enterprise applications very easy.  At this point in time the tooling is poor, but upcoming releases should address this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-1773587503107742195?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/1773587503107742195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=1773587503107742195' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/1773587503107742195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/1773587503107742195'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/10/jcaps-training.html' title='JCAPS Training'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-3932661851705041772</id><published>2007-10-23T09:52:00.000-04:00</published><updated>2008-07-15T15:57:01.228-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='QEDWiki'/><category scheme='http://www.blogger.com/atom/ns#' term='BPEL'/><category scheme='http://www.blogger.com/atom/ns#' term='mashup'/><category scheme='http://www.blogger.com/atom/ns#' term='JCAPS'/><title type='text'>JCAPS</title><content type='html'>In the midst of a job change, I've been spending most of the last few weeks handing my work off to others and writing some final documentation.  With that almost complete, I'm turning my attention to my new position where I'll be working to integrate systems together in a &lt;a href="http://en.wikipedia.org/wiki/Service-oriented_architecture"&gt;Service Oriented Architecture&lt;/a&gt; (SOA).&lt;br /&gt;&lt;br /&gt;While I have SOA experience (creating &amp;amp; integrating web services as well as CORBA modules) my new company has chosen the &lt;a href="http://www.sun.com/software/javaenterprisesystem/javacaps/index.jsp"&gt;Java Composite Application Suite&lt;/a&gt; (JCAPS)  as it's SOA platform.  It's (by far) the most comprehensive SOA solution I've had opportunity to work with.  I'm really excited to get started.  Here are some things I really like about the &lt;a href="http://developers.sun.com/javacaps/images/SJC_ProductStack.jpg"&gt;architecture&lt;/a&gt; and questions I have.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The system is built on an application server and includes things like messaging, as well as consolidated user management and role based access built in.  This is a big change from my current situation where I've needed to integrate (and implement) a lot of this functionality myself.&lt;/li&gt;&lt;li&gt;The next layer of the architecture handles integration.  Integration with internal services, external services, and legacy systems.  This layer also handles the task of single sign-on for users to the various system components.&lt;/li&gt;&lt;li&gt;The next layer is called the &lt;span style="font-style: italic;"&gt; eInsight Business Process Manager.&lt;/span&gt;  It's the part I'm most excited to learn more about.  This layer leverages languages like &lt;a href="http://en.wikipedia.org/wiki/Business_Process_Execution_Language"&gt;BPEL&lt;/a&gt; to allow business leaders to create, model, test, and deploy their own business processes.  Delivered via the integrated portal server, I'm envisioning something similar to IBM's &lt;a href="http://services.alphaworks.ibm.com/qedwiki/"&gt;QEDWiki&lt;/a&gt;.   It's been a while since I've worked with portal technology so I'm curious as to whether the JCAPS portlets can deliver a similar experience to QEDWiki's integrated components (&lt;a href="http://www.youtube.com/watch?v=fzHpL71x9ik"&gt;wired widgets&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;As I learn more about the JCAPS platform, I'll be sure to post more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-3932661851705041772?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/3932661851705041772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=3932661851705041772' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3932661851705041772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3932661851705041772'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/10/jcaps.html' title='JCAPS'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-4863985406815787946</id><published>2007-10-10T15:48:00.000-04:00</published><updated>2007-10-10T15:56:22.729-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><category scheme='http://www.blogger.com/atom/ns#' term='mashup'/><title type='text'>Epcot</title><content type='html'>&lt;blockquote&gt;NOTE: I realize this post might be a little "out there" for a Tech Blog, but I've been fascinated with Disney since visiting there last Spring.  How they provide such a quality experience to so many people is an inspiration.   Please indulge me... &lt;/blockquote&gt;On October 1st, Disney's Epcot celebrated it's 25th anniversary.  From the beginning, Epcot's goal was to provide people a place to explore the future and the world around them.  While learning a little history about Epcot and the various pavilions, I've noticed a few themes common with those I've been exploring.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Mickey Mashup??&lt;/h4&gt;In it's original form, the Journey Into Imagination featured Dreamfinder, an interesting character whose goal is&lt;blockquote&gt;collecting the stuff dreams are made of.... sounds, colors, ideas... anything that sparks the imagination.  And I store these sparks... and recombine them into new ideas and inspirations.&lt;a href="http://www.youtube.com/watch?v=r2vWdbjv5T8"&gt;1&lt;/a&gt;&lt;/blockquote&gt;When I heard Dreamfinder describe his ambition, I immediately thought of web services and how these "sparks" of information are also combined together in the form of a &lt;a href="http://en.wikipedia.org/wiki/Mashup_%28web_application_hybrid%29"&gt;mashup&lt;/a&gt; to provide new and interesting insights and understanding to the information we have.   It's the reason I'm so excited about this technology.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Agile Disney??&lt;/h4&gt;In the early days of Disneyland, I've heard that Walt Disney himself would sometimes stroll the park asking guests how they were enjoying the park or  ideas of what new attractions they might like to see in the park.  Today, Disney makes extensive use of surveys and taps into a very active online community.  Keeping in constant touch with it's guests, Disney is not only able to gauge what it's public wants, but what it's willing to pay for.  This is similar to the Agile principle of staying in touch with your users to determine and prioritize feature requests.&lt;br /&gt;&lt;br /&gt;Some other agile thoughts I've been able to pick up on are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Not overbuilding.  By not building attractions which would generate little public interest, Disney saves a lot of time, money, and valuable real estate.&lt;/li&gt;&lt;li&gt;Continuous improvement.  Disney is always looking for ways to improve it's current attractions.  Often this means making tough decisions to upgrade to replace popular attractions (Horizons is an example of an attraction that is missed by many Epcot fans, but was replaced by Mission Space which is widely popular)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;When it opened in 1982, Epcot introduced the wider public to the power and potential of computers, helped pioneer the "live via satellite" news coverage that is prevalent today, and gave a broader look into the future of transportation and exploration (space and sea).  Today Epcot still strives to educate the public on the cutting edge of conservation, technology, and world awareness.  Amazing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-4863985406815787946?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/4863985406815787946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=4863985406815787946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/4863985406815787946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/4863985406815787946'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/10/epcot.html' title='Epcot'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-6621521447729726824</id><published>2007-10-09T12:18:00.000-04:00</published><updated>2007-10-09T13:40:02.721-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='test driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='behavior driven development'/><category scheme='http://www.blogger.com/atom/ns#' term='Rspec'/><title type='text'>Behavior Driven Development</title><content type='html'>If you haven't seen some of the &lt;a href="http://www.railsenvy.com/tags/Commercials"&gt;Rails vs. _____ &lt;/a&gt; (Java, ColdFusion, .Net)  links, I made available in the "&lt;a href="http://www.google.com/reader/shared/user/05005885855996675774/state/com.google/broadcast"&gt;Related Articles&lt;/a&gt;" section, you should check them out.  They're really clever.  The guys over at&lt;a href="http://www.railsenvy.com/"&gt; RailsEnvy&lt;/a&gt; do a great job with these.&lt;br /&gt;&lt;br /&gt;They've also released a &lt;a href="http://www.railsenvy.com/2007/10/4/how-i-learned-to-love-testing-presentation"&gt;presentation about testing&lt;/a&gt;, introducing me to &lt;a href="http://en.wikipedia.org/wiki/Behavior_driven_development"&gt;Behavior Driven Development&lt;/a&gt; which is like &lt;a href="http://en.wikipedia.org/wiki/Test_Driven_Development"&gt;Test Driven Development&lt;/a&gt;, but with purpose.  Instead of testing individual functions, Behavior Driven Development tests specific user actions and the result of these actions.   The result of creating these behavior driven tests is a specification for how your application will perform... with a final application behaving in this manner after all tests pass.  For Ruby, there is a framework called &lt;a href="http://rspec.rubyforge.org/"&gt;RSpec&lt;/a&gt; which can help facilitate this process.&lt;br /&gt;&lt;br /&gt;For a while I've wanted to adopt a more test driven approach to my development.  There are a lot of benefits: you only build what you need (don't overbuild), you know what you've built works (and can easily prove it), and you can test that future enhancements will not break any existing code.   Unfortunately while I have started this process a number of times, I have not been diligent or disciplined enough to make it a habit... believing that the realities of deadlines didn't allow me the "luxury" of creating more automated tests.  Hopefully with new inspiration from this presentation (and with the help of RSpec), I can finally make it stick.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-6621521447729726824?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/6621521447729726824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=6621521447729726824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6621521447729726824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6621521447729726824'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/10/behavior-driven-development.html' title='Behavior Driven Development'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-8883816737596331048</id><published>2007-10-08T09:39:00.000-04:00</published><updated>2007-10-14T08:39:11.086-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Grails, Groovy, &amp; some other stuff</title><content type='html'>As the name suggests &lt;a href="http://www.webdevradio.com/"&gt;WebDevRadio&lt;/a&gt; is a web development podcast.  I'm a big fan of this show.  It always delivers an interesting perspective, and the discussions often relate to a technology I'm also exploring.&lt;br /&gt;&lt;br /&gt;In a recent episode, the host &lt;a href="http://fosterburgess.com/wp/"&gt;Michael Kimsal&lt;/a&gt; interviewed &lt;a href="http://jasonrudolph.com/"&gt;Jason Rudolph&lt;/a&gt; about Jason's new book &lt;a href="http://www.infoq.com/minibooks/grails"&gt;&lt;span style="font-style: italic;"&gt;Getting Started with Grails&lt;/span&gt;&lt;/a&gt;.  I've written before about Ruby and Rails and using something like JRuby to leverage Java's stability and scalability in a production environment.  &lt;a href="http://grails.codehaus.org/"&gt;Grails&lt;/a&gt; (and &lt;a href="http://grails.codehaus.org/"&gt;Groovy&lt;/a&gt;) is an interesting alternative to the Rails/Ruby/JRuby I'd been thinking about.  Like Ruby, Groovy is an interpreted language but with some constructs that make it easier for Java developers to transition over.  Also, since it's written for the JVM, it gets all the Java maturity "for free" and naturally integrates with existing Java modules (No need for something like JRuby).&lt;br /&gt;&lt;br /&gt;Grails brings the Rails goodness to the Groovy platform... including a lot of the tools (scaffolding, included persistence layer, etc.) and concepts (convention over configuration) that make it easy to quickly get something up and running in Rails.  I'm going to spend some more time checking it out.&lt;br /&gt;&lt;br /&gt;This was a great conversation.  They also touched on:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.nofluffjuststuff.com/"&gt;No Fluff, Just Stuff&lt;/a&gt;.  These sound like great conferences to learn and explore new and cutting edge ideas and technology&lt;/li&gt;&lt;li&gt;&lt;a href="http://streamlinedframework.org/"&gt;Streamlined Framework&lt;/a&gt;.  This framework adds some productivity enhancements to Rails and ActiveRecord.&lt;/li&gt;&lt;li&gt;&lt;a href="http://lucene.apache.org/solr/"&gt;Solr&lt;/a&gt;.  As I understand it, Solr adds a web service front-end to &lt;a href="http://lucene.apache.org/"&gt;Lucene&lt;/a&gt;.  I had done some previous work with Lucene and this podcast series had introduced me to Solar.  Should I ever need to revisit that work, I'm going to keep this project in mind.&lt;br /&gt;&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/104488715285175512-8883816737596331048?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/8883816737596331048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=8883816737596331048' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8883816737596331048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8883816737596331048'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/10/grails-groovy-some-other-stuff.html' title='Grails, Groovy, &amp; some other stuff'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-8800316171909675690</id><published>2007-10-03T08:44:00.000-04:00</published><updated>2007-10-03T10:05:50.823-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><title type='text'>Restlet</title><content type='html'>In my last post, I described I was implementing a SOAP web service controller between my Ruby chat bot and a CORBA component my company is developing.  The WDSL for this service was straightforward, and with help from the Eclipse Web Service wizard, it was complete in no time.&lt;br /&gt;&lt;br /&gt;I had some downtime before the CORBA module I needed to connect with was complete, so I began to look into re-implementing my controller as a REST web service.   A little digging led me to &lt;a href="http://www.restlet.org/"&gt;Restlet&lt;/a&gt;.  Restlet is a lightweight framework for developing REST web services in Java.  I've seldom had an easier time integrating a new Java package and getting something up and running.&lt;br /&gt;&lt;br /&gt;Restlet comes bundled with it's own HTTP server, but I opted to deploy a WAR file to our existing Tomcat installation.  There are three basic steps needed to get this to work.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Creating a &lt;a href="http://www.restlet.org/documentation/1.0/api/org/restlet/resource/Resource.html"&gt;Resource&lt;/a&gt; is the first step.   The Resource is the brains of your service.  It captures request parameters (from the URL or encoded in the body), then takes the appropriate action dictated by the HTTP method (GET, PUT, POST, or DELETE).   The Resource can allow the user to specify a preferred format for for the response (html, text, xml, etc.) and it determines which HTTP response code to return to the caller.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The next step in implementing a Restlet application is to create a &lt;a href="http://www.restlet.org/documentation/1.0/api/org/restlet/Application.html"&gt;Restlet Application&lt;/a&gt; class.  This class must implement the &lt;span style="font-family:courier new;"&gt;createRoot&lt;/span&gt; method.  This method maps incoming requests to your Restlet resources (similar to JSF &lt;span style="font-family:courier new;"&gt;navigation_rule&lt;/span&gt; or Ruby's &lt;span style="font-family: courier new;"&gt;routes.rb&lt;/span&gt; file) .&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The final step in creating the REST service is &lt;a href="http://www.restlet.org/documentation/1.0/faq#02"&gt;link your Application to Restlet servlet&lt;/a&gt; in your &lt;span style="font-family:courier new;"&gt; web.xml&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Testing this service was kind of fun.  At first I used a web browser to submit various requests, but I finally integrated this with my Chat bot using the &lt;a href="http://rubyforge.org/projects/rest-open-uri/"&gt;&lt;span style="font-family:courier new;"&gt;rest-open-uri&lt;/span&gt;&lt;/a&gt; Ruby gem described in &lt;a href="http://www.oreilly.com/catalog/9780596529260/"&gt;&lt;span style="font-style: italic;"&gt;RESTful Web Services&lt;/span&gt;&lt;/a&gt; (which is a great book).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-8800316171909675690?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/8800316171909675690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=8800316171909675690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8800316171909675690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8800316171909675690'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/10/restlet.html' title='Restlet'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-6346593011075209012</id><published>2007-09-14T10:40:00.000-04:00</published><updated>2007-09-14T12:25:57.627-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='jabber'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='xmpp'/><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><title type='text'>Ruby, XMPP, and Soap Web Services</title><content type='html'>I've spent a lot of time away from the office lately and haven't had much of a chance to post.  Here's a quick update on what I've been thinking about.&lt;br /&gt;&lt;br /&gt;First off, the Ruby XMPP-bot I had started is complete.  This was insanely easy to implement in Ruby.  The only snag I ran into was in creating a new chat room with the bot.  The 0.3.1 release of &lt;a href="http://home.gna.org/xmpp4r/"&gt;XMPP4R&lt;/a&gt; seems to hang when creating a new room.  After some &lt;a href="http://www.mail-archive.com/xmpp4r-devel@gna.org/msg00330.html"&gt;research&lt;/a&gt;, it was apparent that others experienced this problem and had already submitted a patch.  Cool.&lt;br /&gt;&lt;br /&gt;My next job is to connect the bot to an application my company developed.  Communication to this module has been done previously using CORBA.  Unfortunately (or not), I have not been able to find an acceptable Ruby CORBA module (&lt;a href="http://sourceforge.net/projects/rinn/"&gt;Rinn&lt;/a&gt; looks like it's dead and &lt;a href="http://www.theaceorb.nl/en/rclm.html"&gt;R2CORBA&lt;/a&gt; does not appear mature enough).  Recently many of our legacy CORBA API's have been replaced with Web Service API's and I'm going to take this approach with this module.&lt;br /&gt;&lt;br /&gt;While researching for a Ruby SOAP library, I came across &lt;a href="http://www.innovationontherun.com/using-ruby-soap-and-apache-to-implement-sso-for-salesforcecom/"&gt;this post&lt;/a&gt; describing an integration with &lt;a href="http://www.salesforce.com/"&gt;SalesForce.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've heard a lot about SalesForce.com and knew it was a &lt;a href="http://en.wikipedia.org/wiki/Customer_relationship_management"&gt;CRM&lt;/a&gt; solution, but never took an in depth look at all it offered.  In addition to all the customer, sales, and marketing tools, SalesForce.com includes integration with many popular third party applications (like Outlook), single sign-on capability for corporate users, and a variety of other utilities.  This allows users to seamlessly interact with the SalesForce suite, using their existing work flow rather than being forced to adopt the "SalesForce Way".&lt;br /&gt;&lt;br /&gt;What I was most impressed with however, was SalesForce's &lt;a href="http://www.salesforce.com/developer/"&gt;developer tools&lt;/a&gt; (web service API) and it's &lt;a href="http://www.salesforce.com/products/appexchange-applications/"&gt;AppExchange&lt;/a&gt;.  AppExchange allows third-parties to extend SalesForce functionality though custom application plugins.  The developer API allows businesses to roll their own solutions when needed.  By acknowledging that they'd never be able fill every business need, and accepting help from it's community to do so, SalesForce has rapidly become the hottest business application around.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-6346593011075209012?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/6346593011075209012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=6346593011075209012' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6346593011075209012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6346593011075209012'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/09/ruby-xmpp-and-soap-web-services.html' title='Ruby, XMPP, and Soap Web Services'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-3421013871531285341</id><published>2007-09-04T09:37:00.000-04:00</published><updated>2007-09-04T10:36:38.485-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='QEDWiki'/><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><category scheme='http://www.blogger.com/atom/ns#' term='mashup'/><title type='text'>QEDWiki</title><content type='html'>I've been hearing a lot of buzz about QEDWiki, which is being developed at IBM.   &lt;a href="http://services.alphaworks.ibm.com/qedwiki/"&gt;QEDWiki&lt;/a&gt; is a basically a wiki that can host simple web components.   At first glance, QEDWiki  looks like a typical portal, displaying aggregated information from around the web in widgets.  Think dashboards like &lt;a href="http://www.pageflakes.com/"&gt;PageFlakes&lt;/a&gt; or &lt;a href="http://my.yahoo.com/"&gt;My Yahoo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I soon learned that QEDWiki is something completely different.  My perception changed when I &lt;a href="https://www14.software.ibm.com/webapp/iwm/web/preLogin.do?source=dw-c-wcsdp&amp;S_PKG=082307&amp;amp;S_TACT=105AGX19&amp;S_CMP=EDU"&gt;saw&lt;/a&gt; these widgets linked together, creating what IBM calls "situational applications".   A "situational application" is a simple applications created on the fly using information provided through a web service.&lt;br /&gt;&lt;br /&gt;These applications can be created by business users, for business users - without the support of a development team - very much like the advanced Excel applications created and shared today by business teams.  I see something like QEDWiki taking the place of these apps with Service Oriented Architectures (SOA) playing the role of the Excel "sheets".&lt;br /&gt;&lt;br /&gt;Because QEDWiki is build on a wiki framework, multiple users can collaborate and enhance individual pages - and even individual widgets.  To facilitate sharing widgets, IBM has also developed &lt;a href="http://services.alphaworks.ibm.com/mashuphub/"&gt;Mashup Hub&lt;/a&gt; to categorize and store these reusable components.&lt;br /&gt;&lt;br /&gt;I'm interested to see how this technology matures and if it's indeed leveraged by business users.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-3421013871531285341?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/3421013871531285341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=3421013871531285341' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3421013871531285341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3421013871531285341'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/09/qedwiki.html' title='QEDWiki'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-8869162783987629970</id><published>2007-08-31T08:51:00.001-04:00</published><updated>2007-08-31T10:58:35.685-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='jabber'/><category scheme='http://www.blogger.com/atom/ns#' term='xmpp'/><title type='text'>Ruby Jabber</title><content type='html'>The Hibernate tweaks I made a few weeks ago made our application "fast enough" for now.   So I'm back off of Rails and I've started work on a XMPP (Jabber) bot to monitor chat channels.  For those unfamiliar, &lt;a href="http://en.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol"&gt;XMPP&lt;/a&gt; is an open protocol for instant messaging.&lt;br /&gt;&lt;br /&gt;I've just gotten started and, again with Ruby,  my progress has been quick and easy.  After installing the &lt;a href="http://www.igniterealtime.org/projects/openfire/index.jsp"&gt;Openfire&lt;/a&gt; XMPP server and &lt;a href="http://home.gna.org/xmpp4r/"&gt;XMPP4R&lt;/a&gt; Ruby Gem, I was off and running.   With help from &lt;a href="http://devblog.famundo.com/articles/category/xmpp4r-jabber"&gt;someone &lt;/a&gt;who's done this before, I was able to communicate with the server very easily.  I'll be sure to post progress and I get deeper into this.&lt;br /&gt;&lt;br /&gt;By the way, if anyone's been following my Rails progress, I'm sure I'll be back to finish this at some point.  &lt;a href="http://vincentfazio.blogspot.com/2007/06/masking-problem.html"&gt;As I've written before&lt;/a&gt;, the database design is flawed and will not scale well.  We've just bought a little more time before these issues bubble up again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-8869162783987629970?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/8869162783987629970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=8869162783987629970' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8869162783987629970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8869162783987629970'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/08/ruby-jabber.html' title='Ruby Jabber'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-613278911657153702</id><published>2007-08-29T08:22:00.000-04:00</published><updated>2007-08-29T11:20:16.349-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech news'/><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='OLPC'/><title type='text'>OLPC and Free Wireless</title><content type='html'>I was glad to hear mention of &lt;a href="http://laptop.org/"&gt;OLPC&lt;/a&gt; (One Laptop Per Child) in a &lt;a href="http://osc.gigavox.com/shows/detail1868.html"&gt;podcast&lt;/a&gt; I  listened to early this week.  OLPC (a.k.a. the $100 laptop) is an organization whose goal is to provide inexpensive laptops to children for education.&lt;br /&gt;&lt;br /&gt;Integrated collaboration is one of the key features offered in these laptops.  The belief that information and ideas are meant to be freely and openly shared is a core principal of open source software... and it's revolutionized the software industry.  Allowing children to learn the value of this openness firsthand, will hopefully lead to a more open and collaborative environment in other fields (government for one) when these children enter the workforce as adults.&lt;br /&gt;&lt;br /&gt;To help foster these ideals away from school, children will need access to the Internet at home.  Fast and cheap, widespread Internet penetration needs to improve.  In the neighborhood I live there is one broadband provider and it's rather expensive - making it out of reach for many lower income families.  I'm sure my neighborhood is not unique.  Another &lt;a href="http://www.itconversations.com/shows/detail1875.html"&gt;podcast&lt;/a&gt; talked about Google and it's success installing a free Wi-Fi network in Mountain View, California.&lt;br /&gt;&lt;br /&gt;The barrier to both OLPC and more free Wi-Fi Internet access in the US is, of course, Government.  OLPC will only sell laptops to governments (state or federal) and installing free Wi-Fi (even when Google is footing the bill) requires cutting a lot of red tape.  In the upcoming Presidential election, I'm looking for a candidate to address these issues and propose a plan to keep our kids on the cutting edge of innovation and education.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-613278911657153702?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/613278911657153702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=613278911657153702' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/613278911657153702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/613278911657153702'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/08/olpc-and-free-wireless.html' title='OLPC and Free Wireless'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-7377036651654218537</id><published>2007-08-20T08:48:00.000-04:00</published><updated>2007-08-20T09:44:55.262-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Back Riding Rails</title><content type='html'>Thankfully, I'm done working with Hibernate for a while and I'm back on Rails.&lt;br /&gt;&lt;br /&gt;Since I posted on  &lt;a href="http://vincentfazio.blogspot.com/2007/08/frails-with-include.html"&gt;FRail :include&lt;/a&gt;, it seems there has been a lot of plugin development to add this functionality.  While all of these plugins help to address the problem, I'm having a hard time finding one to address my specific scenario.&lt;br /&gt;&lt;br /&gt;I think I've explained my situation before, but here it is again in a nutshell.  The company I work for aggregates a lot of data.  The goal of my application is to allow users to sift out the information they don't need, discovering nuggets of truly useful knowledge.  The approach we're taking is to have users to start from something they're interested in, and use that object to find other objects with similar attributes and characteristics.  What I really need from Rails is a robust way to join a lot of tables together and specify search criteria.&lt;br /&gt;&lt;br /&gt;I've decided to roll my own solution for now.  What I'm developing in Rails will take in one or more "objects of interest", and use it's attributes to search the DB.  Right now, I'm manually creating the join strings in order to get something done quickly.  Eventually, I'm hoping to develop a more robust solution (or one of the ":include" solutions evolves to match my needs more closely).&lt;br /&gt;&lt;br /&gt;Surprisingly, this solution has not taken as long to implement as I originally thought it would.  That's the joy of Ruby on Rails!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-7377036651654218537?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/7377036651654218537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=7377036651654218537' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7377036651654218537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7377036651654218537'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/08/back-riding-rails.html' title='Back Riding Rails'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-8839104681198474770</id><published>2007-08-16T08:18:00.000-04:00</published><updated>2007-08-16T09:04:00.879-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech news'/><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><category scheme='http://www.blogger.com/atom/ns#' term='tv'/><title type='text'>TV Innovations</title><content type='html'>I love TV.  Granted there's a lot of garbage content, but there's also a lot of great content.  Since the VCR, it's been possible (although clumsy) to time-shift your TV programs - watching the programs you want, when you want.  Things like TiVo and DVR provide a cleaner interface to this functionality while adding useful new features like "pause live TV".&lt;br /&gt;&lt;br /&gt;The problem with these technologies  is that you need to know the programs you want to watch &lt;span style="font-style: italic;"&gt;in advance&lt;/span&gt;.  If you've just discovered a new series and want to watch previously aired shows, you''ll need to wait for the TV network to rebroadcast (or for the episode to be released on DVD or iTunes).&lt;br /&gt;&lt;br /&gt;Enter &lt;a href="http://www.movenetworks.com/"&gt;Move&lt;/a&gt; and &lt;a href="http://www.joost.com/"&gt;Joost&lt;/a&gt;.  These new products offer the promise of time-shifted, on-demand TV, offered over the Internet.  Both these products allow the owners of the content (networks) to control distribution, so there's no YouTube-like copyright worries.  Joost works more like a file sharing system (think Napster or LimeWire), while Move relies on a smart client to keep the video streaming.  Move provides HD streaming right now for ABC and FOX, with Joost's offering currently in beta (I'm eagerly waiting for my invitation).&lt;br /&gt;&lt;br /&gt;As this technology evolves, I'd look for local governments and organizations to provide video of their meetings over a similar feed.  This could, for instance, help parents "attend" school board meeting they would've otherwise missed because of a conflict with their child's soccer game.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-8839104681198474770?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/8839104681198474770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=8839104681198474770' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8839104681198474770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8839104681198474770'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/08/tv-innovations.html' title='TV Innovations'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-5120704410144716818</id><published>2007-08-13T10:29:00.001-04:00</published><updated>2007-08-15T08:54:52.760-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Hibernating</title><content type='html'>Migrating my application from Hibernate to Rails has taken longer than I expected.  An important client has expressed performance concerns with their release, so I spent the last week looking for ways to tweak the current Hibernate implementation.  It has been very frustrating.&lt;br /&gt;&lt;br /&gt;I don't like to cast blame or plead ignorance, but prior to this exercise, my experience with Hibernate has been limited.  The module containing our Hibernate calls was authored by someone else and I've been mostly a client of this module.  It wasn't until I looked at our query log in detail did I notice how poorly this module was written and how confusing Hibernate is.&lt;br /&gt;&lt;br /&gt;When seeing the large amount of queries in the log (often for data not needed in the current view), my first thought was, "we must have a problem in our models... something is causing Hibernate to eagerly fetch related data we have no immediate need for."&lt;br /&gt;&lt;br /&gt;I went through our models and, indeed, I did find some simple changes where "set" declarations did not have the "lazy" flag set to true.&lt;br /&gt;&lt;br /&gt;I had to dig a little deeper to uncover our "many-to-one" relationship problems.  Hibernate's "many-to-one" declaration does not allow for a "lazy" parameter... at least not where the relationship is declared.  Instead, the "lazy" option needs to be declared in the "class" declaration of the related object?!?!  That seems a little backward to me.  Confusing things more,  declaring "outer-join" in  the "many-to-one" relationship  does not tell Hibernate to use an "OUTER JOIN" instead of an "INNER JOIN".  No, instead it directs Hibernate to ignore the "lazy" class declaration and eagerly fetch the "many-to-one" relationship!?!?  For some reason, we actually had this in our model definition.&lt;br /&gt;&lt;br /&gt;The initial performance gain I saw was unbelievable!  The application had never run so fast.   This was despite the fact we have some structural problems with our database (missing indexes, non-normalized data, etc.),  causing full table scans for some queries.&lt;br /&gt;&lt;br /&gt;The world was right again... until one page access caused the dreaded  "&lt;span style="font-style: italic;"&gt;org.hibernate.LazyInitializationException: failed to lazily initialize a collection - no session or session was closed&lt;/span&gt;".  We needed data for one of the relationships that I had set to "lazy".&lt;br /&gt;&lt;br /&gt;We had seen this error before, and thought we had licked it.  We created a ServletRequestListener that opened and closed the Hibernate session for the request. It seemed to fix the problems we were having at that time.&lt;br /&gt;&lt;br /&gt;I started a long session of debugging and it looks as if the shared session is being used for all requests.  Also interesting is that, while I changed a number of relationships to lazy, only a single one is failing.&lt;br /&gt;&lt;br /&gt;So far, I have not been able figure out what is causing the exception for this particular relationship.  The original author of this code doesn't have a clue what the problem can be.  My only guess is that there is some code in the Hibernate tree attempting to access this nested data using a different session.  I'm going to continue to scour the Internet for any clues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-5120704410144716818?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/5120704410144716818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=5120704410144716818' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5120704410144716818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5120704410144716818'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/08/hibernating.html' title='Hibernating'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-3855610128065128955</id><published>2007-08-08T08:43:00.000-04:00</published><updated>2007-08-15T08:45:54.167-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><title type='text'>Times of Change</title><content type='html'>Last night, &lt;a href="http://www.pbs.org/wgbh/nova/santos/"&gt;Nova&lt;/a&gt; featured the life and contributions of &lt;a href="http://en.wikipedia.org/wiki/Alberto_Santos-Dumont"&gt;Alberto Santos-Dumont&lt;/a&gt;, an early inventor of airplanes and dirigibles.  In addition to Santos and the Wrights, the early 1900s brought forth other great inventions from Edison and Tesla, and marked the rise of the automobile... things that are cornerstones of our lives today.&lt;br /&gt;&lt;br /&gt;I've always looked back at this time period in wonder and amazement.  In a short period of time, the world was turned upside down.  The way people travel, communicate, and got their news was forever changed.&lt;br /&gt;&lt;br /&gt;I'm happy to be, 100 years later, living in a period similar of similar innovation.  The proliferation of Internet has revolutionized the way people meet, shop, and communicate.  Innovations like social media and RSS allow individuals to take a more active role in media they consume (not only what, but when).  And it seems we're finally making strides identifying clean, renewable energy sources.&lt;br /&gt;&lt;br /&gt;It's my hope that the contributions we're making today will still be relevant in 100 years.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-3855610128065128955?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/3855610128065128955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=3855610128065128955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3855610128065128955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3855610128065128955'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/08/times-of-change.html' title='Times of Change'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-8632667601126097397</id><published>2007-08-06T07:54:00.000-04:00</published><updated>2007-12-04T11:58:47.332-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><category scheme='http://www.blogger.com/atom/ns#' term='rails quality'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Technology Shakedown</title><content type='html'>David Berlind recently started a new podcast series entitled "&lt;a href="http://updates.zdnet.com/tags/Technology+Shakedown.html"&gt;Technology Shakedown&lt;/a&gt;".  In it, he exposes technology that isn't as good as it could be.  He talks about products that work great 80% of the time, but provides major headaches the other 20% - when the average user can't figure out why the product is misbehaving and must spend time concocting convoluted workarounds.  A much better description can be found &lt;a href="http://blogs.zdnet.com/Berlind/?p=696"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Apple has rebuilt it's business capitalizing on the shortfalls of mediocre technology products.  A superior experience is the reason people will shell out $150 for an iPod compared to $30 for a generic MP3 player.  And it's the same reason Apple can charge a premium for a Mac compared to the average Windows computer.  People love Apple because their products simply work the way they're supposed to - making their users lives more productive and enjoyable.  Why more product managers don't comprehend this is beyond me.&lt;br /&gt;&lt;br /&gt;*****&lt;br /&gt;&lt;br /&gt;The discovery of this series dovetails nicely with my post yesterday about Rails.  It not that I don't appreciate all the  functionality Rails provides, but I'm finding myself tinkering with aspects of the codebase that should work out of the box - and it's hurting my productivity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-8632667601126097397?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/8632667601126097397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=8632667601126097397' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8632667601126097397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8632667601126097397'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/08/technology-shakedown.html' title='Technology Shakedown'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-5283096829361996810</id><published>2007-08-05T10:40:00.000-04:00</published><updated>2007-08-15T08:45:54.171-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>FRail :include</title><content type='html'>I really like developing with Rails, but I've been frustrated the last few days by some things Rails should do quite easily, yet doesn't.  I've already written &lt;a href="http://vincentfazio.blogspot.com/2007/07/rails-progress.html"&gt;here&lt;/a&gt; and &lt;a href="http://vincentfazio.blogspot.com/2007/07/rails-progress.html"&gt;here&lt;/a&gt; about some of my struggles with Rails &lt;span style="font-style: italic;"&gt;:include&lt;/span&gt; clause.  Here's one more...&lt;br /&gt;&lt;br /&gt;Let's say you have a has-and-belongs-to-many relationship.   If you :include this relationship in a find query, Rails will automatically create the join clause &lt;span style="font-style: italic;"&gt;including &lt;/span&gt;the lookup table!  That's cool.&lt;br /&gt;&lt;br /&gt;Unfortunately, it looks as if only the &lt;span style="font-style: italic;"&gt;:include&lt;/span&gt; clause provides this piece of functionality.  Why isn't the same functionality provided via the &lt;span style="font-style: italic;"&gt;:join&lt;/span&gt; clause or through a general purpose module?  This doesn't make any sense to me!&lt;br /&gt;&lt;br /&gt;I'm working on a database application where I don't need to display a lot of data, but the data displayed is heavily filtered by it's connections to other information in the database.  I need to join a lot of tables to perform the filtering operation and using &lt;span style="font-style: italic;"&gt;:include&lt;/span&gt; would be the most elegant way to express my queries.  But to :include all the data from the join tables in the response kills the performance of my application (because &lt;span style="font-style: italic;"&gt;:select&lt;/span&gt; is ignored).&lt;br /&gt;&lt;br /&gt;Oh well.  It's back to hand coding queries for me.  &lt;a href="http://dev.rubyonrails.org/ticket/7147"&gt;At least until the powers that be agree this is much needed functionality&lt;/a&gt; (or someone creates a cool plugin I can use).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-5283096829361996810?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/5283096829361996810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=5283096829361996810' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5283096829361996810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5283096829361996810'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/08/frails-with-include.html' title='FRail :include'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-5120167083018880733</id><published>2007-08-02T10:05:00.000-04:00</published><updated>2007-08-15T08:45:54.175-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='tech news'/><category scheme='http://www.blogger.com/atom/ns#' term='freebase'/><category scheme='http://www.blogger.com/atom/ns#' term='mashup'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Freebase</title><content type='html'>I wanted post a quick note about new technology I heard about today via &lt;a href="http://www.itconversations.com/shows/detail1879.html"&gt;podcast&lt;/a&gt;.  The technology is &lt;a href="http://www.freebase.com/"&gt;freebase&lt;/a&gt; created by &lt;a href="http://www.metaweb.com/"&gt;Metaweb&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As you might guess from the name, &lt;span style="font-style: italic;"&gt;freebase&lt;/span&gt; is a free database for the web containing all sorts of information contributed by users.  In other words, it's a huge Wikipedia-style database that anyone can contribute or query to find interesting (and possibly little known) information and relationships between seemingly unrelated objects.&lt;br /&gt;&lt;br /&gt;For instance, assuming the information is in the database, I could query to find "all wooden roller coasters in the northeast longer than 5200 feet."  That's pretty cool.   Assuming I found some results, I could whittle down the set further, looking for which roller coasters have been ridden by Rock Stars or with lower height restrictions (so I could ride with my daughter).&lt;br /&gt;&lt;br /&gt;Because the data can be contributed by the average person, the breadth and depth of the information to search for will grow quickly (and hopefully be of high quality). &lt;br /&gt;&lt;br /&gt;The concept is great!  Freebase is in pre-Alpha right now and I've signed up for an account to try it out.  Once I get in, I'll let you know what I think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-5120167083018880733?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/5120167083018880733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=5120167083018880733' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5120167083018880733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5120167083018880733'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/08/freebase.html' title='Freebase'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-3080554066498069767</id><published>2007-07-30T15:36:00.000-04:00</published><updated>2007-08-15T08:45:54.165-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><title type='text'>wRESTling with REST</title><content type='html'>I'm still struggling with the decision to create a REST or traditional web service.  Over the weekend I started reading &lt;a href="http://www.oreilly.com/catalog/9780596529260/"&gt;&lt;span style="font-style: italic;"&gt;RESTful Web Services&lt;/span&gt;&lt;/a&gt; and I'm now thinking that a RESTful approach is very doable.    Here are my thoughts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;REST resources are inherently stateless and shareable.  All the information needed to reconstruct the view of a resource exists in the URI.  Although I listed this a a "pro" before reading the book, I'm more convinced of the benefits now.&lt;/li&gt;&lt;li&gt;I had a concern about long query criteria in the URI, but I'm thinking of adopting the Ruby-like approach of referring to ids.  The &lt;span style="font-style: italic;"&gt;RESTful&lt;/span&gt; authors prefer a more human readable URI (as it is self documenting), but many of my filter criteria cannot be accessed through unique strings.&lt;/li&gt;&lt;li&gt;I believe I was trying to do too much at the beginning (not keeping it simple).   My object relationships are complex, with most objects linked to several related (non-subordinate) lists of objects.  I wanted to have a single interface with options to include specific subsets of data as well as page through the results.&lt;br /&gt;&lt;br /&gt;As I thought more about this, I began to think that these subsets should actually be separate URI requests.  Clients will probably make more requests to the service for data, but underneath, my Ruby controllers were making multiple requests to the database anyway.  Here I'm hoping that the additional overhead of multiple GET requests will be balanced by the simplicity and usability of the interface (and no SOAP overhead).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;As I become more familiar with the concepts of REST, I'm getting more comfortable thinking of my objects in terms of URIs and resources opposed to RPC calls and parameters.  It's kind of similar to the shift in thought from procedural programming to object oriented design.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-3080554066498069767?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/3080554066498069767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=3080554066498069767' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3080554066498069767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3080554066498069767'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/07/wrestling-with-rest.html' title='wRESTling with REST'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-5478598211654386627</id><published>2007-07-27T10:22:00.000-04:00</published><updated>2007-08-15T08:45:54.176-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><title type='text'>Should I REST?</title><content type='html'>Now that the models are complete, I want to expose access to them as a web service.   I'm thinking REST is the way to go.  A RESTful approach seems simple.  It appears to solve pesky "back button" problems and session timeout issues, but I have one big question:  How to fit all the information I need into the URL?&lt;br /&gt;&lt;br /&gt;The application I'm working on has A LOT of data.  The main objective of the application is to allow filtering of this data down to a useful, manageable set.  It wouldn't be uncommon for a user to ask for something like:&lt;pre&gt;   Give me everything connected to Item1, Item2 and Item3,&lt;br /&gt;   Hide anything that has to do with Item4 or Item5&lt;br /&gt;   In addition, give me anything that mentions Items 6, 7, or 8&lt;br /&gt;   and is new to the system in the past month.&lt;br /&gt;&lt;/pre&gt;To put all this information in the URL is a scary proposition.&lt;br /&gt;&lt;br /&gt;In it's previous life as a Java web application, all this search criteria was built incrementally and stored in a user's session.  Since the client of this service could be servicing many clients of it's own, this isn't a valid approach.&lt;br /&gt;&lt;br /&gt;I don't want to return all the information for each object either.  Allowing clients to specify the information they need, as well as pagination, is required.&lt;br /&gt;&lt;br /&gt;Writing an "Old School" SOAP/XML web service may be the best answer.  I'm already familiar with creating this type of service and all the criteria/request information can easily be captured in a WSDL definition.&lt;br /&gt;&lt;br /&gt;I'm thinking, however, that other people must've encountered similar challenges in designing their RESTful web services.  I'm picking up a copy of &lt;a href="http://www.oreilly.com/catalog/9780596529260/"&gt;RESTful Web Services&lt;/a&gt; to try and find the answers and best practices to these questions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-5478598211654386627?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/5478598211654386627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=5478598211654386627' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5478598211654386627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5478598211654386627'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/07/should-i-rest.html' title='Should I REST?'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-8718845217617648727</id><published>2007-07-20T14:28:00.000-04:00</published><updated>2007-08-15T08:45:54.171-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Rails Progress</title><content type='html'>All my models are implemented in Rails and I wanted to give a quick update on how things are going.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;For now, I'm been using the rails views and controllers to test my code (automated tests coming soon).  This has worked out great for me.  Since my application only allows users to view and filter database records, I don't have a lot of validation checks, but I wanted to get a feel for the performance of pages need to display a lot of data from various tables.  One page I tested performs 35 queries (including all the counts and show field commands) and takes about 5 seconds using the Webrick server (from NetBeans so I believe JRuby is being used).  The development log lists the time spent in the database as less than 1 second.  I'm sure performance could be better, but this is a big improvement over what we had before and the database I'm using contains more records.&lt;/li&gt;&lt;li&gt;I'm still noticing that when you ":include" more than one model in a "find" command, more than 1 query is performed.  The authors don't mention this in &lt;a href="http://www.pragmaticprogrammer.com/titles/rails/"&gt;&lt;span style="font-style: italic;"&gt;Agile Web Development with Rails&lt;/span&gt;&lt;/a&gt; so I'm wondering if I have something wrong or if this is a performance enhancement???  Here is a snippet...&lt;pre&gt;     @mp_events = Model.find :all,&lt;br /&gt;    :include =&gt; [{:model_data1 =&gt; &lt;br /&gt;                [:nested_data1, :nested_data2]}, &lt;br /&gt;                :model_data2],&lt;br /&gt;    :conditions =&gt; query&lt;/pre&gt;Something cool about this statement, "nested_data1" and "nested_data2" eager load data connected to Model through "model_data1".  This works great!  I found the information about nested includes &lt;a href="http://snippets.dzone.com/posts/show/2089"&gt;here&lt;/a&gt;.  This author claims a single query as well.  I'm wondering if my extra "conditions" clause triggers Ruby to produce the extra query.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;One bummer about ":include" is that it does not seem to work with the nested ":select" option.  I wanted to total a few of the columns where data was grouped and couldn't get it to work.  I resorted to "find_by_sql".&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;We're now talking about exposing access to these models through a web service.  I also need to test more queries with more complex criteria.  I'll continue to post interesting tidbits as I encounter them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-8718845217617648727?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/8718845217617648727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=8718845217617648727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8718845217617648727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8718845217617648727'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/07/rails-progress.html' title='Rails Progress'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-2790024069465459600</id><published>2007-07-10T13:21:00.000-04:00</published><updated>2007-08-15T08:45:54.166-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Good Migrations</title><content type='html'>I was out last week, but finally got my schema in a Rails friendly format and the scaffolding utility is working great!  I thought I'd hit on some of the pain points I experienced during this process and how I worked through them.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MySql stinks when you need to change the schema of a database containing data.  To make things easy, I've been working with an empty database and using the MySQL administrator to capture the SQL.  The plan was to run this SQL against existing databases to upgrade them.  This process doesn't work like I'd hoped.&lt;br /&gt;&lt;br /&gt;For some columns, the SQL query fails when I try to change a column name (like changing the primary key name to the Rails default 'id').  There are no foreign key constraints on this field and it does not fail on every table where the column name must change.  I can't figure out why MySQL bombs on these specific statements.  Maybe it's because these table have large row counts (~1M rows)???  Luckily, I won't be creating models for these tables (they are not used in my application), so I'll ignore upgrading these for now.&lt;br /&gt;&lt;br /&gt;I've run into similar problems with other update scripts (but these don't fail consistently).  I had thought these other statements encountered some sort of race condition, but I'm not sure.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;After I updated the schema I went back to &lt;a href="http://fabforce.net/dbdesigner4/"&gt;DBDesigner&lt;/a&gt; to update the schema diagram.  This tool does not look at foreign key constraints to visualize relationships (it builds relationships based on column names.  Since I now have 33 'id' columns, it gets very confused).  I grabbed the alpha release of MySQL Workbench, but found it painful to use.&lt;br /&gt;&lt;br /&gt;Eventually, I found &lt;a href="http://schemaspy.sourceforge.net/"&gt;SchemaSpy&lt;/a&gt; which uses &lt;a href="http://www.graphviz.org/"&gt;Graphviz&lt;/a&gt; to create some great looking diagrams.  What I like most is that it allows you to drill down to specific tables for a localized view of how things are connected - leaving the rest of the clutter behind.  Also, it was very easy to setup and use!!  Awesome tool!!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Finally, I used the Rake &lt;span style="font-family:courier new;"&gt;db:schema:dump&lt;/span&gt; utility to create a &lt;span style="font-family:courier new;"&gt;schema.rb&lt;/span&gt; file.  I'll be able to use this as version 1 of my migration file.  Like everything else I'm finding in Rails, this utility saved me a lot of time!&lt;br /&gt;&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/104488715285175512-2790024069465459600?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/2790024069465459600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=2790024069465459600' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2790024069465459600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2790024069465459600'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/07/good-migrations.html' title='Good Migrations'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-7152610640974903850</id><published>2007-06-29T08:21:00.000-04:00</published><updated>2007-08-15T08:45:54.168-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>More Rails Progress</title><content type='html'>I've been playing with Rails over the past few days and want to quickly express my experience so far.&lt;br /&gt;&lt;br /&gt;Creating joins, lookup tables, tuning, grouping, sorting, and setting limits are all easy.  You can do something like: &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;pre&gt;Actor.sum(:appearances,&lt;br /&gt;:joins =&gt; "INNER JOIN appearances_show_lookup asl&lt;br /&gt;           ON asl.appearances_id&lt;br /&gt;             = appearances.appearances_id",&lt;br /&gt;:group=&gt;'asl.appearances_id',&lt;br /&gt;:order=&gt;'sum(appearances) DESC', :limit=&gt;10)&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;which translates into&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;pre&gt;SELECT m.appearances_id, sum(appearances)&lt;br /&gt;FROM appearances m&lt;br /&gt;INNER JOIN appearances_show_lookup md&lt;br /&gt;  ON md.appearances_id=m.appearances_id&lt;br /&gt;GROUP BY m.appearances_id&lt;br /&gt;ORDER BY sum(appearances) DESC&lt;br /&gt;LIMIT 10;&lt;/pre&gt;&lt;/span&gt;or...&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;pre&gt;Actor.find(:all,include=&gt;:appearances_type,&lt;br /&gt;:conditions=&gt;"appearances_type.name='guest'",&lt;br /&gt;:limit=&gt;10)&lt;/pre&gt;&lt;/span&gt;to&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;pre&gt;SELECT *&lt;br /&gt;FROM appearances&lt;br /&gt;LEFT OUTER JOIN appearances_type&lt;br /&gt;  ON appearances_type.appearances_type_id =&lt;br /&gt;     appearances.appearances_type_id&lt;br /&gt;WHERE (appearances_type.name='guest')&lt;br /&gt;LIMIT 10&lt;/pre&gt;&lt;/span&gt;or expand it to 3 tables...&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;pre&gt;Actor.find(:all,&lt;br /&gt;:include=&gt;[:appearances_type, :show_scores],&lt;br /&gt;:conditions=&gt;"appearances_type.name='guest'",&lt;br /&gt;:limit=&gt;10,&lt;br /&gt;:group=&gt;'appearances.appearances_id' )&lt;/pre&gt;&lt;/span&gt;to&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;pre&gt;SELECT DISTINCT appearances.appearances_id&lt;br /&gt;FROM appearances&lt;br /&gt;LEFT OUTER JOIN appearances_type&lt;br /&gt;  ON appearances_type.appearances_type_id&lt;br /&gt;    = appearances.appearances_type_id&lt;br /&gt;LEFT OUTER JOIN appearances_show_lookup&lt;br /&gt;  ON appearances_show_lookup.appearances_id&lt;br /&gt;    = appearances.appearances_id&lt;br /&gt;WHERE (appearances_type.name='guest')  LIMIT 10&lt;br /&gt;&lt;br /&gt;SELECT *&lt;br /&gt;FROM appearances&lt;br /&gt;LEFT OUTER JOIN appearances_type&lt;br /&gt;  ON appearances_type.appearances_type_id&lt;br /&gt;    = appearances.appearances_type_id&lt;br /&gt;LEFT OUTER JOIN appearances_show_lookup&lt;br /&gt;  ON appearances_show_lookup.appearances_id&lt;br /&gt;    = appearances.appearances_id&lt;br /&gt;WHERE (appearances_type.name='guest')&lt;br /&gt;AND appearances.appearances_id&lt;br /&gt;    IN ('5', '6', '7', '8', '9', '10',&lt;br /&gt;        '11', '12', '13', '14')&lt;br /&gt;GROUP BY appearances.appearances_id&lt;/pre&gt;&lt;/span&gt;Since this final Ruby/Rails code actually   produces 2 queries (and I'd prefer an inner join to an outer join as the default), I'm going to opt to create my own queries using &lt;span style="font-family:courier new;"&gt;find_by_sql&lt;/span&gt; like this...&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;pre&gt;Actor.find_by_sql "&lt;br /&gt;  SELECT m.*,&lt;br /&gt;    SUM(md.appearances) appearances,&lt;br /&gt;    mt.name type_name&lt;br /&gt;  FROM appearances m&lt;br /&gt;    INNER JOIN appearances_type mt&lt;br /&gt;    ON m.appearances_type_id&lt;br /&gt;      = mt.appearances_type_id&lt;br /&gt;    INNER JOIN appearances_show_lookup md&lt;br /&gt;    ON md.appearances_id&lt;br /&gt;      = m.appearances_id&lt;br /&gt;  WHERE mt.nominal = false&lt;br /&gt;  GROUP by m.appearances_id&lt;br /&gt;  ORDER BY appearances desc&lt;br /&gt;  LIMIT 10"&lt;/pre&gt;&lt;/span&gt;and produces identical SQL.&lt;br /&gt;&lt;br /&gt;Even though you can override defaults for table names, primary keys and the like, I can't get the scaffolding scripts to work unless I set them to the Rails defaults (opinionated software!).  I'm going to try and use the Rails Migrations tool for these updates.  I'll be sure to provide updates on my progress.&lt;br /&gt;&lt;br /&gt;Like many others, I love what I've experienced in Rails so far.  It's a breath of fresh air from my previous Hibernate and Java experience.  I love the ability to make a change then instantly test it using the Ruby console.   It's really great!  Now my concerns are shifting to performance and scalability.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-7152610640974903850?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/7152610640974903850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=7152610640974903850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7152610640974903850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/7152610640974903850'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/06/more-rails-progress.html' title='More Rails Progress'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-2969831419758808994</id><published>2007-06-26T13:36:00.001-04:00</published><updated>2007-08-15T08:45:54.169-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Rails Progress</title><content type='html'>I picked up a copy of &lt;a href="http://www.pragmaticprogrammer.com/titles/fr_r4j/"&gt;&lt;span style="font-style: italic;"&gt;Rails for Java Developers&lt;/span&gt; by Stuart Halloway and Justin Gehtland&lt;/a&gt; and am playing around more with Rails.  The book is really good, but I really need a migration guide from Hibernate to Rails (or an existing web application to Rails).   I'm looking for more information on creating Rails models that can be accessed through a complex set of filters and associations.  The things I need to know are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;How to create something like a 8 table Rails join?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;How best to represent lookup tables?&lt;/li&gt;&lt;li&gt;What options are available to tune the queries?  Can I capture the Rails query  before it's sent to the DB for debugging (outside the MySQL log)?&lt;/li&gt;&lt;li&gt;How do I specify things like limit, paging, group by, sum, distinct, etc?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I'm going to reread the ActiveRecord chapter of this book again.  I also have a copy of&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.pragmaticprogrammer.com/titles/rails/"&gt;Agile Web Development with Rails&lt;/a&gt; on the way.&lt;br /&gt;&lt;br /&gt;Many articles I'm finding on the Internet draw the same conclusions - if your schema and object dependencies are not too complex Rails is the way to go... otherwise use Hibernate.   Some of these articles are a little dated though (2005).&lt;br /&gt;&lt;br /&gt;I did learn about some cool features built into Rails that I'd like to use, so I'm not giving up hope yet.  These include&lt;br /&gt;&lt;ul&gt;&lt;li&gt;schema versioning (and rollback)&lt;/li&gt;&lt;li&gt;migration support between various database implementations (is this available in Hibernate?)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I hope to have an answer to some of these questions soon.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;More Info&lt;/h4&gt;&lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=RailsHibernate"&gt;Hibernate vs. Rails: The Persistence Showdown&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ibm.com/developerworks/web/library/wa-rubyonrails/"&gt;Ruby on Rails and J2EE: Is there room for both?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.onlamp.com/pub/a/onlamp/2006/12/14/revisiting-ruby-on-rails-revisited.html"&gt;Rolling with Ruby on Rails Revisited&lt;/a&gt; (&lt;a href="http://www.onlamp.com/pub/a/onlamp/2007/01/05/revisiting-ruby-on-rails-revisited-2.html"&gt;Part 2&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-2969831419758808994?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/2969831419758808994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=2969831419758808994' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2969831419758808994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2969831419758808994'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/06/rails-progress.html' title='Rails Progress'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-9139583575222489199</id><published>2007-06-22T10:19:00.000-04:00</published><updated>2007-08-15T08:48:12.544-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>JRuby</title><content type='html'>The database cleanup is finally complete!  Now I need to rewrite our web app's data access code.  When we first created the database layer, we used the Hibernate framework.  Since then Hibernate3 has been released and an upgrade is scheduled as part of this work.  We did have some pain points with Hibernate, however.  For instance, when I started evaluating our DB code, I noticed some DB queries that we don't explicitly create.  Whether these were the result of a poor object-relational model, lazy instantiation, or some other Hibernate functionality is unknown at this time.  I've found Hibernate (or at least how we're using Hibernate) complicated to debug.  I'm going to take some time and look at Ruby and Rails as an alternative.&lt;br /&gt;&lt;br /&gt;I've mentioned before that I've wanted to learn Ruby for a while and this seems like a good excuse.  There is a Ruby library for Java called &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt;.  The plan is to learn the JRuby Rails extensions and find out the effort to incorporate this framework into our existing Java APIs.  I'll continue to post progress...&lt;br /&gt;&lt;h4&gt;Discussion&lt;/h4&gt;Has anyone else explored JRuby as a replacement for Hibernate?  How does the performance compare?  What about ease of use?&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;More Info&lt;/h4&gt;&lt;a href="http://en.wikipedia.org/wiki/JRuby"&gt;JRuby on Wikipedia&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-9139583575222489199?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/9139583575222489199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=9139583575222489199' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/9139583575222489199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/9139583575222489199'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/06/jruby.html' title='JRuby'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-3827849879574958083</id><published>2007-06-19T07:54:00.001-04:00</published><updated>2007-08-15T08:45:54.165-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='ria'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Standards</title><content type='html'>I just listened to an &lt;a href="http://blogs.zdnet.com/Berlind/?p=518"&gt;interview &lt;/a&gt;with &lt;a href="http://www.w3.org/People/Berners-Lee/"&gt;Tim Berners-Lee&lt;/a&gt;, inventor of the World Wide Web.  While most of the interview focused the &lt;a href="http://en.wikipedia.org/wiki/Semantic_Web"&gt;Semantec Web&lt;/a&gt;, what I found most interesting, were his thoughts on Rich Internet Applications.  Of course he thinks this is an exciting development, but with various technologies (Flash, JavaFX, Silverlight) competing in this space, he feels that standardization would help speed its adoption.  He points to how standardizing HTML in an open and royalty-free way helped to speed the adoption of the Web.&lt;br /&gt;&lt;br /&gt;Standardizing this technology would be a great step.  Right now, these technologies run as a plugin on the browser.  Once standardized, browsers could build this functionality right in, making adoption seamless.  Open-sourcing the technology is not enough.  The biggest problem with standardization is that it takes so long.&lt;br /&gt;&lt;br /&gt;It's a good thought, hopefully it will gain some traction.&lt;br /&gt;&lt;br /&gt;******&lt;br /&gt;&lt;br /&gt;More news on the DB front.  The more I delve into the database schema and the data stored in the tables, the deeper the problems run.  Examining the data more closely, I'm uncovering more normalization problems that I hadn't noticed in my initial review of the schema.  This is a mess!&lt;br /&gt;&lt;br /&gt;We're using &lt;a href="http://fabforce.net/dbdesigner4/"&gt;DBDesigner&lt;/a&gt; to diagram our schema.  While the tool provides great looking diagrams, the pain is organizing the tables manually to see all the relationships.  Does anyone know of other tools to diagram a schema where this is not an issue?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-3827849879574958083?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/3827849879574958083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=3827849879574958083' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3827849879574958083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3827849879574958083'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/06/standards.html' title='Standards'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-8849677906930223965</id><published>2007-06-15T09:17:00.000-04:00</published><updated>2007-12-04T12:02:24.423-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>It's All About Software (and Passion)</title><content type='html'>Just to touch on Apple and Microsoft again... I've &lt;a href="http://d5.allthingsd.com/20070530/steve-jobs-and-bill-gates-together-part-1-of-7/"&gt;watched &lt;/a&gt;the conversation between Steve Jobs and Bill Gates from this year's D5 conference a number of times.  The thing that keeps amazing me is that these guys, earlier than almost anyone else, got that it's all about the software.  They realized that we had this great, new technology... but it was way too hard for the average person to use.&lt;br /&gt;&lt;br /&gt;Gates referred to a speech that Jobs gave years ago where he said, "We build the products that we want to use ourselves."  I always hear successful people say that the key to success is being passionate about what you're doing and what you're producing.  Microsoft and Apple are two examples where this approach has obviously worked.  I'm convinced these giants are more similar than different.&lt;br /&gt;&lt;br /&gt;It would be foolish not to apply these ideals into our own software projects.  To have a successful project we need to become our target users.  Think like they think.  Learn their passions and pain points, then build solutions that alleviate the pain and fuel their passion.&lt;br /&gt;&lt;br /&gt;I've found that when I'm passionate about something, my desire is to make it perfect.  This is where an Agile approach pays off.  From the beginning, you take an approach that you'll endlessly be tweaking and improving (evolving) what you have, always making it a better extension of yourself and your goals.&lt;br /&gt;&lt;br /&gt;As we've learned from Microsoft and Apple, the result is a group of users who are passionate about our software.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-8849677906930223965?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/8849677906930223965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=8849677906930223965' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8849677906930223965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8849677906930223965'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/06/its-all-about-software-and-passion.html' title='It&apos;s All About Software (and Passion)'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-8059404065759265582</id><published>2007-06-13T09:58:00.000-04:00</published><updated>2007-08-15T08:48:37.174-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Masking the Problem</title><content type='html'>From my past posts, you may have guessed that I'm in the middle of optimizing a web application that accesses a database.    Our studies have shown that a combination of missing indexes, unnormalized data, and inefficient queries are the root cause for this application's poor performance.   The optimal solution involves reorganizing the database schema and rewriting our database access layer.  &lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;Side Note:&lt;/span&gt;  The books &lt;a href="http://www.oreilly.com/catalog/sqltuning/"&gt;&lt;span style="font-style: italic;"&gt;SQL Tuning&lt;/span&gt; by Dan Tow&lt;/a&gt;, &lt;a href="http://www.apress.com/book/bookDisplay.html?bID=433"&gt;&lt;span style="font-style: italic;"&gt;Pro MySQL &lt;/span&gt;by Michael Kruckenberg and Jay Pipes&lt;/a&gt;, and &lt;a href="http://www.manning.com/bauer/"&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;Hibernate in Action&lt;/span&gt; by &lt;span style="font-size:100%;"&gt;Christian Bauer and Gavin King&lt;/span&gt;&lt;/a&gt; have been instrumental in helping to identify solutions to these problems.&lt;/blockquote&gt;&lt;br /&gt;During a meeting to discuss these changes, another suggestion was made to help performance.  There are certain instances where we could save few trips to the database (per request) by reusing session information that is unlikely to change (whether this data should actually be in the session or not is a subject for another post).   This enhancement requires that we check the database for updates (using a new query) , and reuse the session information if the database has not changed since the previous request.&lt;br /&gt;&lt;br /&gt;On the surface this looks like a reasonable approach, but I don't like making these types of changes as a first step to improve performance.  First of all, it violates the 80/20 rule (or 90/10 or whatever) because the time saved by this enhancement is small in relation to all the processing we're doing per request.    Secondly, enhancements like these mask the real problem  - that we have a bad database design and we a doing a poor job accessing it.   Finally, I'm a big believer in the KISS principle and when something goes wrong with application caching, my experience has been that this added complexity is difficult to debug.&lt;br /&gt;&lt;br /&gt;Don't get me wrong, I feel that optimizations like caching are necessary in web applications, I just feel they shouldn't be explored until other, more obvious, issues have been addressed.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Discussion&lt;/h4&gt;What is your approach to identifying and tackling performance problems?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-8059404065759265582?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/8059404065759265582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=8059404065759265582' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8059404065759265582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/8059404065759265582'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/06/masking-problem.html' title='Masking the Problem'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-5004342851394915590</id><published>2007-06-11T08:33:00.000-04:00</published><updated>2007-08-15T08:45:54.170-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='tech news'/><category scheme='http://www.blogger.com/atom/ns#' term='accessability'/><category scheme='http://www.blogger.com/atom/ns#' term='OLPC'/><title type='text'>OLPC</title><content type='html'>One Laptop Per Child (&lt;a href="http://laptop.org/"&gt;OLPC&lt;/a&gt;) is a movement to create inexpensive, full featured laptops to be used by children for education.  The design of this machine is geared at promoting creativity and collaboration.  Each system features wireless capabilities for students to connect and communicate with  teachers and other students.  The user interface centers on activities that children participate in to learn.  This differs from a traditional UI which focuses on tasks and applications.  The laptop is enclosed in a durable case with a kid friendly handle.  It also includes many power saving features, including the ability to charge the battery using human power (like turning a crank or pulling a string).  This is an important consideration for areas with little or no access to power.&lt;br /&gt;&lt;br /&gt;The price of the hardware is very low (around $100).  In addition, much of the software for this system is being developed in an cost friendly, open source model.  I'm excited about the possibilities this  accessibility will bring to an educational system strapped for financial resources.  Costs associated with keeping textbooks up to date should dramatically decrease once these are distributed in electronic form.  Some science and math experiments can be simulated, saving costs associated with these activities.&lt;br /&gt;&lt;br /&gt;Since I started playing around on my parent's Apple IIe, one of the things I loved most about programming that it allows me to be creative, at a low cost and space requirement.  Programs like OLPC, will help provide these opportunities to the next generation of children.  With tools like &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; and &lt;a href="http://hacketyhack.net/"&gt;Hackety Hack&lt;/a&gt; at their disposal these kids will be able to create greater things than I ever thought possible.&lt;br /&gt;&lt;h4&gt;Discussion&lt;/h4&gt;What other programs, like OLPC are being developed?  Has your community, either in the US or worldwide, started to work with these organizations?  (I have written to my congressman - Charles Schumer - but have not gotten a response yet.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-5004342851394915590?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/5004342851394915590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=5004342851394915590' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5004342851394915590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5004342851394915590'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/06/olpc.html' title='OLPC'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-203357878031051705</id><published>2007-06-05T09:20:00.000-04:00</published><updated>2007-08-16T09:05:41.574-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='tech news'/><category scheme='http://www.blogger.com/atom/ns#' term='ria'/><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='google gears'/><title type='text'>Gearing Up</title><content type='html'>I've previously written about &lt;a href="http://agilegrappler.blogspot.com/2007/05/rich-internet-applications-ria.html"&gt;Rich Internet Applications&lt;/a&gt; and how they bring desktop-like functionality to web applications.  The knock on this technology has always been "how do I work if I don't have an Internet connection?"   Last week, Google announced &lt;a href="http://code.google.com/apis/gears/"&gt;Google Gears&lt;/a&gt;, a framework designed to address this problem.&lt;br /&gt;&lt;br /&gt;Google Gears provides 3 modules developers can used to make their web applications available offline.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;LocalServer&lt;/span&gt; allows web applications the ability to store, then serve, web content locally when a user does not have an Internet connection.  These resources can be updated when the user is reconnected to the Net.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Database&lt;/span&gt; provides persistent storage to the application when working offline.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;WorkerPool &lt;/span&gt;allows long running operations to be "chunked", and run in the background without blocking the browser.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;It's likely Google developed this technology to widen the appeal and availability of it's &lt;a href="http://www.blogger.com/docs.google.com/"&gt;Google Docs &amp; Spreadsheats&lt;/a&gt; offering.  Making this utility open source and free to use will hopefully lead to a quick and widespread adoption.&lt;br /&gt;&lt;br /&gt;I'm excited to see how the first applications make use of this technology and if the distinction between online  and offline is truly seamless.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;More Info&lt;/h4&gt;Wikipedia entries for &lt;a href="http://en.wikipedia.org/wiki/Google_Gears"&gt;Google Gears&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Google_Docs_&amp;amp;_Spreadsheets"&gt;Google Docs &amp;amp; Spreadsheets&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-203357878031051705?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/203357878031051705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=203357878031051705' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/203357878031051705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/203357878031051705'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/06/gearing-up.html' title='Gearing Up'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-52889294612564634</id><published>2007-06-04T08:24:00.000-04:00</published><updated>2007-08-15T08:49:09.523-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>Performance Testing</title><content type='html'>I just upgraded my Eclipse IDE and installed the latest &lt;a href="http://www.eclipse.org/tptp/"&gt;Test and Performance Tools Platform (TPTP)&lt;/a&gt; release.  The only tricky part of the installation was installing the Agent Controller (available from from the TPTP &lt;a href="http://www.eclipse.org/tptp/home/downloads/"&gt;download site&lt;/a&gt;).  This is a separate install from the TPTP plugin and must be placed on your PATH.&lt;br /&gt;&lt;br /&gt;TPTP application profiling is easy.  Simply start your application in profiling mode, then start the profiler before you access application functionality you want to benchmark.  I'm currently using the tool to identify memory and execution time bottlenecks.  The TPTP utility makes it easy to sort on key statistics (like the memory footprint for an object class, or the total time spent executing various methods).&lt;br /&gt;&lt;br /&gt;I find the method invocation information especially useful.  Not only does the tool provide information on which calls are taking the longest, but it also provides details for who called the method and what supporting methods are called (along with the time spent in each).  This makes it extremely easy to drill down in the application to find to true cause of the slowdown.&lt;br /&gt;&lt;h4&gt;Discussion&lt;/h4&gt;I've read that the profiling tool included with NetBeans is very good.  Has anyone used this?  How does it compare?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-52889294612564634?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/52889294612564634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=52889294612564634' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/52889294612564634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/52889294612564634'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/06/performance-testing.html' title='Performance Testing'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-6251627528552948922</id><published>2007-06-01T08:37:00.000-04:00</published><updated>2007-12-04T12:02:24.424-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech news'/><category scheme='http://www.blogger.com/atom/ns#' term='UI design'/><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><category scheme='http://www.blogger.com/atom/ns#' term='surface computing'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>New Age Appliances</title><content type='html'>I'm pretty excited about the latest consumer tech products I've seen from Apple and Microsoft.  Although they seem to target slightly different segments, both have new offerings which push user interface and interaction to a new level.&lt;br /&gt;&lt;h4&gt;iPhone&lt;/h4&gt;Early this year, I watched the &lt;a href="http://events.apple.com.edgesuite.net/j47d52oo/event/"&gt;Macworld video&lt;/a&gt; where Steve Jobs introduced the iPhone.  I was blown away.  It was easy to see the new possibilities offered by this device.  I mean, the phone I have now offers many advanced features that are clumsy and frustrating to use (web access, email, text messaging, etc) .  The iPhone makes these tasks intuitive (and it looks fun).  As the average user gets a hold of this, I'm guessing we'll see a spike in web traffic as mobile computing goes mainstream (sort of like what the iPod did for digital music).  It will forever change the way people interact with the Internet and our products.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Microsoft Surface Computing&lt;/h4&gt;Yesterday I watched a &lt;a href="http://on10.net/Blogs/larry/first-look-microsoft-surfacing-computing/"&gt;video&lt;/a&gt; demoing Microsoft Surface Computing.  I don't know if I'd want one of these in my home, but the retail possibilities were unbelievable.  Having a system that can recognize objects from the physical world (credit card, phone, camera, *wine glass*) and appropriately interact with these objects is astonishing.  I can't wait until one of these devices make it to a retail outlet near me... or I could plan a trip to Vegas. &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Common Ground&lt;/h4&gt;Technology-wise, both products leverage similar technology - multi-touch displays and stunning user interfaces.  Where they both excel, though, is in delivering an incredible user experience - and that's what will make them successful.  &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Discussion&lt;/h4&gt;What new technology or user experiences have you excited?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-6251627528552948922?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/6251627528552948922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=6251627528552948922' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6251627528552948922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6251627528552948922'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/06/new-age-appliances.html' title='New Age Appliances'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-5105082957139805848</id><published>2007-05-30T08:46:00.000-04:00</published><updated>2007-08-15T08:45:54.167-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='del.icio.us'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Not a DBA (Part 2) and Some Quick Hits</title><content type='html'>Since my last post, I picked up a copy of &lt;a href="http://www.oreilly.com/catalog/sqltuning/"&gt;&lt;span style="font-style: italic;"&gt;SQL Tuning&lt;/span&gt; by Dan Tow&lt;/a&gt;.  This is exactly the resource I've been looking for.  Dan Tow has developed a process of diagramming queries, and then using these diagrams to determine an optimized query plan.  I'm only half finished with the book, and I'm amazed by the results I'm already seeing.  This book has given me a new perspective (and confidence) to solve the problems I described.&lt;br /&gt;&lt;br /&gt;I'll post more on my progress in a future post.&lt;br /&gt;&lt;h4&gt;Ruby&lt;/h4&gt;For a while now, I've wanted to learn &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; (and &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt;).  I'm impressed with how much you can do with this language in a &lt;a href="http://www.rubyonrails.org/screencasts"&gt;few lines of code&lt;/a&gt;.  If nothing else, it will provide a quick and easy way to mock up prototypes.&lt;br /&gt;&lt;br /&gt;Last week, I downloaded &lt;a href="http://hacketyhack.net/"&gt;Hackety Hack&lt;/a&gt;, which is a lightweight Ruby IDE.  I've completed the Hackety Hack tutorial and can't wait to create more complex examples.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;del.icio.us&lt;/h4&gt;I've started to (finally) place my bookmarks into &lt;a href="http://del.icio.us/vincentfazio"&gt;del.icio.us&lt;/a&gt;.  I thought I'd link to it from here to make it easy to see the things I've been looking at.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-5105082957139805848?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/5105082957139805848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=5105082957139805848' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5105082957139805848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/5105082957139805848'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/05/not-dba-part-2-and-some-quick-hits.html' title='Not a DBA (Part 2) and Some Quick Hits'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-2496777597594647183</id><published>2007-05-25T08:35:00.000-04:00</published><updated>2007-08-15T08:45:54.173-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Not a DBA</title><content type='html'>I don't consider myself an expert in database design or administration, but like many web programmers, my applications often rely on fast and efficient interaction with a database.  I am fairly comfortable normalizing a schema and identifying fields to index, but I sometimes struggle creating efficient queries... especially when multiple table joins are needed.&lt;br /&gt;&lt;br /&gt;I'm looking for suggestions on how I can improve in this area.&lt;br /&gt;&lt;h4&gt;Dynamically Joining Tables&lt;/h4&gt;Currently, I'm working with a database containing multiple sets of interconnected objects.  Let's assume they are television shows, actors in the shows, and times the shows are on.  The goal is to allow users to apply a set of filters to find the shows that interest them.  Some simple use scenarios include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Find all shows where ActorA appears.&lt;/li&gt;&lt;li&gt;Find all shows on between 10AM and 12 PM.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Some harder scenarios include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Which show or actor appears most frequently.&lt;/li&gt;&lt;li&gt;Which shows are on between 10AM and 12 PM, staring ActorA, but not ActorB.&lt;/li&gt;&lt;li&gt;Which shows are on between 10AM and 12 PM, or star ActorC.&lt;/li&gt;&lt;li&gt;Which shows star ActorA and ActorC, but not ActorB or ActorD. &lt;/li&gt;&lt;/ul&gt;As you can see from these examples, users can combine filter criteria (actors, times, etc) in a variety of different ways to find the information they need.  My team has created a query system that relies on inner queries to search for this information.  Performance is not that good. I know that sometimes the order nested queries execute can yield better performance.  We're struggling to find the algorithm that will provide the right mixture.&lt;br /&gt;&lt;br /&gt;We're also exploring other ideas like&lt;br /&gt;&lt;ul&gt;&lt;li&gt;utilizing views to try and simplify things.  I'm concerned we're just pushing down the complexity to another level.&lt;/li&gt;&lt;li&gt;creating stored procedures to perform the filtering logic.  Again, will we find performance gains by pushing the complexity down a level?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;Discussion&lt;/h4&gt;I'm sure this problem is not unique.  What techniques have others employed to find performance gains (query optimization, views, stored procedures, something else).&lt;br /&gt;&lt;br /&gt;How do you verify that the gains are real?  Do you solely look at query plans?  If not, how do you keep the query cache from skewing the results?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-2496777597594647183?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/2496777597594647183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=2496777597594647183' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2496777597594647183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/2496777597594647183'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/05/not-dba.html' title='Not a DBA'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-877107438446916931</id><published>2007-05-23T11:06:00.000-04:00</published><updated>2007-08-15T08:45:54.168-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rcp'/><category scheme='http://www.blogger.com/atom/ns#' term='UI design'/><category scheme='http://www.blogger.com/atom/ns#' term='ria'/><title type='text'>Eclipse RCP</title><content type='html'>My work had focused on web application development for so long, I had to pause when I was asked to develop a desktop application.  I had little idea where to begin.  I started searching for application frameworks that met the following criteria:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I could write the application in Java&lt;/li&gt;&lt;li&gt;The resulting application would be cross platform with a native look and feel.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The framework was mature, easy to use, and widely adopted.&lt;/li&gt;&lt;/ol&gt;I quickly narrowed the field down to 2 choices &lt;a href="http://wiki.eclipse.org/index.php/Rich_Client_Platform"&gt;Eclipse RCP&lt;/a&gt; and &lt;a href="http://platform.netbeans.org/index.html"&gt;NetBeans&lt;/a&gt;.  Both met the criteria I was looking for.  Either would have been a reasonable choice, and I chose Eclipse.  First of all, I was comfortable developing in the Eclipse IDE.  Second, Eclipse had a larger installed base and an avid community following, with over 1200 commercial plugins available.&lt;br /&gt;&lt;br /&gt;I was happy with my choice.  Since I had been coding with &lt;a href="http://agilegrappler.blogspot.com/2007/05/javaserver-faces.html"&gt;JSF&lt;/a&gt; for some time, the leap to an event based system was not that large.  The Forms plugin allowed me to easily create an attractive interface.&lt;br /&gt;&lt;br /&gt;More importantly, my clients loved the product.  The system was designed to dynamically configure distributed application components.  Allowing users to drag and drop these components to create the architecture, made the process easy and intuitive.  Real time statistics delivered via web services added to the usefulness of this simple tool.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Discussion&lt;/h4&gt;Does the combination of&lt;ol&gt;&lt;li&gt;Rich Internet Application technology&lt;/li&gt;&lt;li&gt;widespread availability of high-speed wireless Internet connections (and mobile devices)&lt;/li&gt;&lt;li&gt;Cheap mult-core processors&lt;/li&gt;&lt;/ol&gt; spell the end of desktop applications?&lt;br /&gt;&lt;br /&gt;I believe so.  It's hard to imagine a desktop application anymore that does not need to interface with information on the network.  This technology combination will allow new web apps to service more users faster and cheaper - without giving up usability features that, until recently, were only available on the desktop.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-877107438446916931?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/877107438446916931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=877107438446916931' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/877107438446916931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/877107438446916931'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/05/eclipse-rcp.html' title='Eclipse RCP'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-1120377882893007188</id><published>2007-05-21T08:54:00.000-04:00</published><updated>2007-08-15T08:45:54.173-04:00</updated><title type='text'>JavaServer Faces</title><content type='html'>I made the switch to &lt;a href="http://java.sun.com/javaee/javaserverfaces/"&gt;JSF&lt;/a&gt; in late Spring, 2005.  My team had just adopted the use of &lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt; and &lt;a href="http://www.hibernate.org/"&gt;Hibernate&lt;/a&gt; - and loved using them.  We had just started a new web development effort and knew we'd also need a flexible and easy to use UI framework.&lt;br /&gt;&lt;br /&gt;I was a big &lt;a href="http://struts.apache.org/"&gt;Struts&lt;/a&gt; fan, but often got frustrated with &lt;a href="http://java.sun.com/products/jsp/"&gt;JSP&lt;/a&gt; and how much code seemed to be needed in my pages (foreach, if, etc).  In addition to providing very modular web UI components, JSF provided many other features I liked and had gotten used to: a scoped managed bean facility and configurable page navigation were two biggies.  I also liked how JSF abstracted the idea of a request into an Action, with a corresponding series of listeners that could be called to "set the stage".&lt;br /&gt;&lt;br /&gt;The one thing I really missed was the ability to dynamically arrange page fragments, like I had done using &lt;a href="http://struts.apache.org/1.x/struts-tiles/"&gt;Tiles&lt;/a&gt;.  There were some Tiles/JSF jars that others had written, but I could not get them to work correctly.  Eventually I just wrote my own.  Amazingly, it was not that hard to do.&lt;br /&gt;&lt;br /&gt;JSF was great for me.  It is one of those technology innovations that sometimes seem to rise to the surface right when you need something new.  Unfortunately (or not), with new web UI developments like Ruby and RIAs, it's lifespan will probably be rather short.&lt;br /&gt;&lt;h4&gt;Discussion&lt;/h4&gt;Have you used JSF?  What was you experience like?&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;More Info&lt;/h4&gt;&lt;a href="http://myfaces.apache.org/"&gt;MyFaces&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-1120377882893007188?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/1120377882893007188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=1120377882893007188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/1120377882893007188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/1120377882893007188'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/05/javaserver-faces.html' title='JavaServer Faces'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-3676586508803054681</id><published>2007-05-18T11:50:00.000-04:00</published><updated>2007-08-16T09:06:24.735-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='tech news'/><category scheme='http://www.blogger.com/atom/ns#' term='UI design'/><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Props</title><content type='html'>It's Friday and I don't feel like writing anything I have to think about too much.  I thought I'd start a list of some of the online resources I regularly use for news and inspiration.  I hope to add to this list as I go.  Props to these great innovators!&lt;br /&gt;&lt;h4&gt;Kayak&lt;/h4&gt;&lt;a href="http://www.kayak.com/"&gt;Kayak&lt;/a&gt; is a travel search engine.  Kayak makes excellent use of AJAX, adding results as they are discovered, and allowing users to tweak results (times, airlines, stops, etc) without a page refresh.&lt;br /&gt;&lt;br /&gt;I love how natural this application is to use.  I also appreciate how willing they are to share the &lt;a href="http://www.kayak.com/help/tech.html"&gt;technology&lt;/a&gt; they're using and other&lt;a href="http://www.kayak.com/labs/"&gt; cool stuff&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;CSS Zen Garden&lt;/h4&gt;This &lt;a href="http://www.csszengarden.com/"&gt;site&lt;/a&gt; really cemented, for me, just how powerful and flexible CSS can be.  I can spend hours browsing designs and learning new techniques.  I do not have an extensive background in design and this site has really helped me refine my user interfaces.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Amazon&lt;/h4&gt;I'm always impressed with the great innovations &lt;a href="http://www.amazon.com/"&gt;Amazon&lt;/a&gt; has developed for users browsing books... recommendations, reviews, ratings, wishlists, etc.  I don't know if they were the first website to make extensive use of user contributed content, but they've done the best job of it in my opinion.  I'm a big Amazon fan.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;ZdNet&lt;/h4&gt;I turn to &lt;a href="http://www.zdnet.com/"&gt;ZDNet&lt;/a&gt; for most of my news about the technology industry.  I especially enjoy the "&lt;a href="http://blogs.zdnet.com/BTL/"&gt;Between the Lines&lt;/a&gt;" features and podcasts.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Discussion&lt;/h4&gt;Thanks to all these great sources for the knowledge and help they provide.  What sources to you regularly turn to as a reference or for ideas?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-3676586508803054681?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/3676586508803054681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=3676586508803054681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3676586508803054681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/3676586508803054681'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/05/props.html' title='Props'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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-104488715285175512.post-6931064185541529497</id><published>2007-05-17T10:16:00.000-04:00</published><updated>2007-05-18T14:06:49.031-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='CORBA'/><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><category scheme='http://www.blogger.com/atom/ns#' term='WSDL'/><category scheme='http://www.blogger.com/atom/ns#' term='mashup'/><title type='text'>Web Services</title><content type='html'>I'm a big fan of &lt;a href="http://en.wikipedia.org/wiki/Web_service"&gt;Web Services&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Service_oriented_architecture"&gt;Service Oriented Architectures&lt;/a&gt; (SOA).  I've developed a handful of web services for my company to use internally and there are a few reasons I enjoy working with this technology.&lt;br /&gt;&lt;h4&gt;Ease&lt;/h4&gt;What I think I like best, is how easy it is to create a web service.  I use Eclipse and this IDE provides a web service wizard (I'm sure other tools have something similar).  All you need to do is create the &lt;a href="http://en.wikipedia.org/wiki/WSDL"&gt;WSDL&lt;/a&gt; and most of the heavy lifting is done for you (opening and closing connections, serializing the object to the wire, etc).  Hook the generated code into your business objects and it's ready to go.   Since Web Services use HTTP, installing your WAR file on the web server is the final step.  No other setup is needed.&lt;br /&gt;&lt;br /&gt;I did not find &lt;a href="http://en.wikipedia.org/wiki/CORBA"&gt;CORBA&lt;/a&gt; as easy to use.  In CORBA, you need to communicate what ports you want to use, optionally set up a CORBA name service, etc.  If there was a port conflict on one of the machines you were using, you needed to reconfigure a bunch of nodes.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Lego-like&lt;/h4&gt;To me, Service Oriented Architectures epitomize the type of modules we're all taught to build in school.  We all strive to build reusable, scalable code, with open interfaces, that can be used in several types of applications.  The goal was always to have a set of these modules which can be combined in different ways to create cool things (like Lego blocks).&lt;br /&gt;&lt;br /&gt;Prior to SOA, sharing a module's functionality meant sharing jar files.  Updates were hard to deploy and track.  Since SOA lives on the web, updates are instant and painless (as long as the API does not change).  It seems like the ideal distribution method.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Unlimited Possibilities&lt;/h4&gt;Because of this Lego-like architecture and because the functionality is available over the web, people are combining these services in many interesting ways.  These combinations are commonly referred to as &lt;a href="http://en.wikipedia.org/wiki/Mashup_%28web_application_hybrid%29"&gt;mashups&lt;/a&gt;.  The first mashup I saw plotted data obtained from a local law enforcement web site onto a Google map - providing a visual representation of high crime areas.  These unexpected and useful combinations are what help make SOAs exciting.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Discussion&lt;/h4&gt;Which mashups have helped get you excited about this technology?&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;More Info&lt;/h4&gt;&lt;a href="http://www.w3schools.com/wsdl/default.asp"&gt;WSDL Tutorial (W3C Schools)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tech.groups.yahoo.com/group/webservicesprogramming/"&gt;Web Services Programming (Yahoo Group)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/104488715285175512-6931064185541529497?l=vincentfazio.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vincentfazio.blogspot.com/feeds/6931064185541529497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=104488715285175512&amp;postID=6931064185541529497' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6931064185541529497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/104488715285175512/posts/default/6931064185541529497'/><link rel='alternate' type='text/html' href='http://vincentfazio.blogspot.com/2007/05/web-services.html' title='Web Services'/><author><name>Vincent Fazio</name><uri>http://www.blogger.com/profile/13931830315907352076</uri><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></feed>
