<?xml version="1.0" encoding="UTF-8"?>
<!-- name="generator" content="blojsom v3.2" -->
<rdf:RDF xmlns:wfw="http://wellformedweb.org/CommentAPI/"
         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:dc="http://purl.org/dc/elements/1.1/"
         xmlns="http://purl.org/rss/1.0/">

	<channel rdf:about="http://blog.bwtaylor.com">
		<title>/dev/spout</title>
		<link>http://blog.bwtaylor.com/</link>
		<description>My opinions on various topics</description>
		<dc:publisher>bryan</dc:publisher>
		<dc:creator>bryan_w_taylor@yahoo.com</dc:creator>
		<dc:date>2008-06-16T01:03:50-05:00</dc:date>
		<dc:language>en</dc:language>

        <items>
        <rdf:Seq>
                                <rdf:li rdf:resource="http://blog.bwtaylor.com/2008/06/16/loose_coupling" />
                                <rdf:li rdf:resource="http://blog.bwtaylor.com/2008/05/13/rest_neuters_web_services" />
                                <rdf:li rdf:resource="http://blog.bwtaylor.com/2008/04/13/restful_service_descriptions" />
                                <rdf:li rdf:resource="http://blog.bwtaylor.com/2008/03/24/tilkov_rest_doubts" />
                                <rdf:li rdf:resource="http://blog.bwtaylor.com/2008/03/24/software_architecture" />
                                <rdf:li rdf:resource="http://blog.bwtaylor.com/2008/03/20/uniform_interface" />
                                <rdf:li rdf:resource="http://blog.bwtaylor.com/2008/02/18/hibernate_interceptor_gotchas" />
                                <rdf:li rdf:resource="http://blog.bwtaylor.com/2008/02/12/distributed_version_control" />
                                <rdf:li rdf:resource="http://blog.bwtaylor.com/2008/01/26/ant_maven_gant_pros_cons" />
                                <rdf:li rdf:resource="http://blog.bwtaylor.com/2008/01/21/unbiased_language_popularity" />
                                <rdf:li rdf:resource="http://blog.bwtaylor.com/2007/11/19/fedora8_issues" />
                                <rdf:li rdf:resource="http://blog.bwtaylor.com/2007/11/15/lightning_gcal" />
                                <rdf:li rdf:resource="http://blog.bwtaylor.com/2007/11/11/road_maps_are_important" />
                                <rdf:li rdf:resource="http://blog.bwtaylor.com/2007/10/28/css_2007" />
                                <rdf:li rdf:resource="http://blog.bwtaylor.com/2007/09/23/ruby_meet_erlang" />
                </rdf:Seq>
        </items>
    </channel>

            <item rdf:about="http://blog.bwtaylor.com/2008/06/16/loose_coupling">
	    <title>What is Loose Coupling?</title>
	    <link>http://blog.bwtaylor.com/2008/06/16/loose_coupling</link>
        <description>I see many people throwing the term &quot;loose coupling&quot; around without understanding it. Many use the term without reference. Worse, there seems to be a sophomoric misinterpretation of it which can be summarized as &quot;tight coupling is always bad&quot;. &lt;p/&gt;&lt;p/&gt;

Despite the fact that speak about loose coupling, there are precious few good descriptions of exactly what it is. Fortunately, &lt;a href=&quot;http://en.wikipedia.org/wiki/Loose_coupling&quot;&gt;Wikipedia&lt;/a&gt; (as of the writing of this blog) gets the definition right, defining loose coupling as &quot;an approach where integration interfaces are developed with minimal assumptions between the sending/receiving parties, thus reducing the risk that a change in one application/module will force a change in another application/module&quot;. The  words I emphasize are &quot;minimal&quot; and &quot;risk&quot;.  The word minimal cannot be replaced with &quot;no&quot;. Also, loose coupling is is about mitigating risks of change, and you must not gloss over this. Even Wikipedia could  explain these points more.&lt;p/&gt;

To really understand loose coupling, we must first acknowledge that as designers, we are essentially gambling on the types of changes our system will be asked to adapt to in the future. We form a hypothesis about cost and likelihood of changes to various design elements, and we split them into two classes: stable or fluid. We expect that the stable elements are unlikely enough to change over time that as an economics question we&#39;re better off assuming they won&#39;t, while the fluid elements we draw the opposite conclusion. Sometimes designers make these hypothesis explicitly, while others make them implicitly. Different designers can look at the same problem and draw different hypotheses about change, as predicting future requirements is not an exact science. Once we write code based on our hypothesis, we often say that the fluid elements are implementation details, while the stable elements are part of the design contract or interface. &lt;p/&gt;

Here&#39;s my definition of &quot;loose coupling&quot;. Concrete integrated elements are &quot;loosely coupled&quot; with respect to a hypothesis about the risks of change, when the stable elements under the hypothesis are relied on by the interface design contracts, so that the hypothesized changeable elements are expressed only in the implementation details.  We typically introduce tight coupling of stable elements purposefully so as to tolerate specific kinds of fluidity among the implementation details. The notion that tight coupling is always bad, is nonsense. Tight coupling to a few things that won&#39;t change is generally good.&lt;p/&gt;

To illustrate our definitions, let&#39;s consider an example. What does coding to interfaces in Java achieve? We introduce an interface so that we can switch out the implementation behavior. We are relying on the methods of the interface and their arguments and return types not changing. If we expect to actually have multiple implementations, this is clearly a good idea. If we never get a second implementation, we just engaged in over engineering, as we spent time creating two artifacts (the interface and it&#39;s lone implementation) for a benefit that never materialized.&lt;p/&gt;

Consider another example: when we use a SOAP web service interface, we couple to the HTTP protocal and XML standards, the SOAP and WSDL standards and schemas, as well as a homegrown XML Schema for our domain, and the operations and faults defined in the WSDL. In return, for all this tight coupling, we can remove any dependence on any platform or language specific constructs, let alone any specific implementation classes. It&#39;s usually a pretty good bet that things like HTTP, XML, SOAP, and WSDL change very little over time, though I look forward to WSDL 2.0. It&#39;s predecessor was a little over-engineered, offering too much flexibility at the expense of complexity.&lt;p/&gt;

Every time we create a solution, we gamble. Over time, our change hypothesis is repeatedly tested as our code is maintained and implements new requirements. We can compared, with the benefit of hindsight, the kinds of changes we&#39;ve actually performed with how we predicted. There are four possibilities...
&lt;ul&gt;
&lt;li&gt;predicted change, observed change. Good.&lt;/li&gt;
&lt;li&gt;predicted change, observed stable. This is the &quot;over-engineering&quot; mistake&lt;/li&gt;
&lt;li&gt;predicted stable, observed stable. Good.&lt;/li&gt;
&lt;li&gt;predicted stable, observed change. This is the &quot;tight coupling&quot; mistake.&lt;/li&gt;
&lt;/ul&gt;

There are costs associated with each mistake, and when you place your bets you have to weigh the likelihood and the expense of the above possibilities. The cost of having to make changes across tightly coupled elements are well known. The change is invasive, it may take a lot of work to determine everything in the dependency chain, it&#39;s easy to miss dependencies, it&#39;s harder to assure quality, and deployment are harder, etc... . On the other hand, the costs of over-engineering are bad too: code bloat, complexity, slower development, etc... . &lt;p/&gt;&lt;p/&gt;

Let&#39;s examine ordinary class encapsulation using the approach of this article. Encapsulation is a loose coupling technique applied to class design in an object oriented language. Classes define a public contract to their collaborators via their publicly declared methods. Regardless of whether the class implements a formal interface or is directly called by client code, the method arguments and return types will be depended upon. In fact, using an interface INCREASES the coupling to these, as the interface itself, all of it&#39;s implementations, and any client who called one of these methods (which is a larger set because of the abstraction) all must be modified if the method signature changes. We should weigh the odds and impacts and choose to expose methods with arguments and return types where your hypothesis is they are stable. So if we expect to always have Customers who have names that are Strings, by all means have customer.getName() return a String. On the other hand, if this might change, introduce a CustomerName object and/or interface to encapsulate the implementation details of names and expose this rather than String. Is this approach always better? No, it depends on your assessment of the future, and you simply can&#39;t make universally sweeping statements that one is better than the other.&lt;p/&gt;

As I mentioned, different designers can look at the same problem and assess the risks differently. There are two styles that seem to emerge, and which camp you are in seems to depend on how you weigh the pain of complexity against the pain of refactoring. Some people will not introduce loose coupling until it&#39;s clear there is a need for changes to implementation details. These people say things like &quot;the simplest thing that works&quot; and &quot;you aren&#39;t going to need it&quot;. Others take their best guess based on the available knowledge and their experience and place their bets, sometimes introducing abstractions early. I liken these to the different styles of poker player: some people play tight and some play loose. Neither is &quot;correct&quot; in any objective sense. We&#39;ve all seen bad examples of taking either too far: the guy who uses several design patterns to avoid relying on the fact that customer.name is a String, or the guy who simply refuses to code to interfaces and has methods that return HashMap instead of Map and so on.  Either extreme can be bad. Hopefully now that we understand what loose coupling really is, the reader won&#39;t make either mistake.&lt;p/&gt;
</description>
	    <dc:date>2008-06-16T01:03:50-05:00</dc:date>
	                                <wfw:comment>http://blog.bwtaylor.com/blojsom/commentapi/spout/java/2008/06/16/loose_coupling</wfw:comment>
            <wfw:commentRss>http://blog.bwtaylor.com/2008/06/16/loose_coupling?page=comments&amp;flavor=rss2</wfw:commentRss>
            </item>
            <item rdf:about="http://blog.bwtaylor.com/2008/05/13/rest_neuters_web_services">
	    <title>How REST will neuter Web Services</title>
	    <link>http://blog.bwtaylor.com/2008/05/13/rest_neuters_web_services</link>
        <description>I normally like to blog about things that are, and leave tea leave reading to others. Not today. I&#39;ve been thinking more about a specific example of solving a problem in the RESTful way, and the solution seems like one that is likely to play out in many different arenas. So here&#39;s my attempt to predict the what will happen as RESTful thinking penetrates into some of the harder aspects of software engineerings... &lt;p/&gt;

Basically, I think REST is going to neuter web services. Not destroy - just neuter. Instead, the Great Irony is that as RESTful patterns for solving problems of enterprise development are discovered, used, and socialized, the net effect will be to unleash a great revival of custom, not-HTTP, non-RESTful protocols. What!?! you say. Read on. &lt;p/&gt;

The particular problem I referred to above is a basic one in event driven architectures. The problem statement is this: How do you create a channel for messages where messages are queued, but consumers have unique ownership of messages they dequeue. This is basically the asynchronous form of a message based load balancer, used to drive (among many other things) highly horizontally scalable &quot;master/worker&quot; solutions. James Strachan has a &lt;a href=&quot;http://activemq.apache.org/restful-queue.html&quot;&gt;RESTful solution&lt;/a&gt; to the queue problem. I&#39;ve studied it. I recommend you study it, and read the thread at rest-discuss. &lt;p/&gt;

This blog is not about the solution per se, but more about who&#39;s looking for such solutions, and what they are going to do with them. ActiveMQ is a framework that created a use case specific protocol (Openwire) for messaging that works really well. They want to add RESTful HTTP to their stack of messaging protocols, which also includes STOMP and XMPP, and hopefully one day soon, AMQP. It makes a lot of sense why they would want to enable HTTP as a transport for messaging, but notice that the effect is to make it easier to use ActiveMQ, which is inevitably going to get Openwire solutions in place, for one simple reason: IT&#39;S  A LOT BETTER AT MESSAGING. &lt;p/&gt;

There&#39;s a really excellent &lt;a href=&quot;http://tech.groups.yahoo.com/group/rest-discuss/message/8995&quot;&gt;comment&lt;/a&gt; in the rest-discuss thread about REST, compared to custom protocols, by Alan Dean. He&#39;s just collecting comments from Roy Fielding. The first notes that REST&#39;s statelessness requirement involves a tradeoff against custom protocols that may degrade performance, since custom protocols can reduce networking costs by leaving data on the server. The third quote notes that abiding by the uniform interface also involves a tradeoff because generic interface methods generally won&#39;t be as efficient as those tailored to a specific problem. &lt;p/&gt;

Now think of all those WS-* specs out there. Each one was somebody trying to solve a problem that comes up in complex systems. Instead of having another REST vs SOAP debate, how about a different question: why web services at all? Why NOT problem specific protocols like Openwire or AMQP? The standard answer is that these involve sacrifices in interoperability. Unless clients also speak Openwire, they can&#39;t get your information. While many clients may choose to do so, those that don&#39;t are excluded. This is not good. &lt;p/&gt;

But this is why REST is so appealing. It&#39;s the ultimate least common denominator solution. EVERYBODY speaks HTTP. It&#39;s even really good at some things, if you use it in the RESTful way. And if you leverage &quot;hypermedia as the engine of application state&quot; and idempotency, even hard things are possible (like building concurrency safe queues). But look at WHO is going to solve the hard problems. It&#39;s going to be custom protocol creators who are trying to overcome the interoperability objection to their &quot;best&quot; solution. It&#39;s guys like James Strachan who want to get ActiveMQ out there for messaging. Instead of a bunch of WS-* goop, REST will see its solutions come more as solution patterns that interact with a specific implementation toolkit that solves the problem for you. These implementations will also have custom protocols tailored to the problem. I predict most people will use these, secure in the knowledge that somebody who can&#39;t speak the language can always drop down to the super-portable RESTful API. &lt;p/&gt;

In fact, if you use languages that have good client libraries, why wouldn&#39;t you use Openwire over REST for it? Especially when the framework provider is going to hand you juicy client libraries to go with server binaries that &quot;just work&quot;. The guys who have to use the RESTful mechanisms are the ones that write in languages that don&#39;t get big communities creating client libraries for every protocol under the sun. Your Erlang, Lua, or whatever client may have to interact via RESTful HTTP with the server. System admins and monitoring systems will poke at production servers to make sure they&#39;re alive using the RESTful APIs. Generic things will be done via REST.&lt;p/&gt;

So this is why I say REST will neuter web services. The super accessibility REST provides (better than SOAP solutions) is one half of a tradeoff. The other side is solving the problem with a highly tailored protocol solution that performs and scales.  Folks that want the latter will bundle the former with it as a hedge. The end result, I predict, will be that more problems will be solved using tailored solutions which previously would have been unpalatable because they aren&#39;t universally accessible. SOAP won&#39;t beat either solution, but it won&#39;t lose to REST, it will lose to custom protocols that aren&#39;t truly viable until they add a RESTful interoperability API.&lt;p/&gt;
</description>
	    <dc:date>2008-05-13T01:24:23-05:00</dc:date>
	                                <wfw:comment>http://blog.bwtaylor.com/blojsom/commentapi/spout/internet/2008/05/13/rest_neuters_web_services</wfw:comment>
            <wfw:commentRss>http://blog.bwtaylor.com/2008/05/13/rest_neuters_web_services?page=comments&amp;flavor=rss2</wfw:commentRss>
            </item>
            <item rdf:about="http://blog.bwtaylor.com/2008/04/13/restful_service_descriptions">
	    <title>RESTful Service Descriptions</title>
	    <link>http://blog.bwtaylor.com/2008/04/13/restful_service_descriptions</link>
        <description>Over several blogs recently I&#39;ve looked at RESTful approaches to enterprise integration, somewhat critically. Despite my conclusion that REST inside the firewall is almost crippled by the lack of service descriptions, I do in fact believe that solutions are imminent. Moreover, once these solutions exist and are socialized, I believe it will be game changing within the enterprise. The solutions will not come from the REST community, who (mostly) stubbornly refuse to admit there is an issue. The solution will come anyway, so let&#39;s look at where it stands.&lt;p/&gt;

Let&#39;s start with what a service description must accomplish in a resource oriented enterprise setting. Let&#39;s suppose that we stick some RESTful services inside the enterprise ecosystem of a typical enterprise. What do we need to actually describe about them. Well, several things:
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Where the URI &quot;entry points&quot; are.&lt;/b&gt; Where do you start?  If you have resources representing a customer, where EXACTLY are they. If I want to look up customers, do I start at http://myco.com/customers or at http://myco.com/accounts? If you think this is silly because somebody could just tell you, then I say two things: first, even a small company probably has 2000 different entities of interest. URI&#39;s are never supposed to change in a perfect world. In the real world, they change all the time, especially for dev and test environments inside the firewall. On the internet you probably use a search engine, read blogs, or get emailed a link. Google doesn&#39;t typically index inside the firewall, so this doesn&#39;t help. The other options don&#39;t scale.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Metadata about parameters&lt;/b&gt; OK, so you know where to go to ask for a filtered set of your favorite entity. What parameters can you put into the URL, which are mandatory, what are their datatypes, and what are the allowable values? Once you know the entry point above, you can do a GET request and get back some nice document with links galore to things of interest (as in &quot;hypermedia as the engine of application state&quot;). Great, how do you specify the start date and end date? Do you have to specify the account name? If so, what&#39;s the parameter called? Can you specify the maximum record size to return? etc...&lt;/li&gt;
&lt;li&gt;&lt;b&gt;What media types are used&lt;/b&gt; Can I get purchase orders in JSON? XML? as an ATOM feed? Pretty simple question. You can get this via HTTP HEAD and/or by setting the accepts request header. Sounds like we don&#39;t need this in the service description, right. Well, you often have to do gap analysis before you have physical access to a service. You need to figure out things like: When they come on line with purchase orders next month, will they support JSON or do we need to submit a change request? If you have their latest service description, you know the answer. If that document changes, you can ask questions about why things where added or removed because you have something tangible to compare to.  &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Which HTTP operations can you access&lt;/b&gt; In theory, this is what HTTP OPTIONS should answer. In reality, who knows what the answer to HTTP OPTIONS looks like. It should probably be the relevent service description document. So rather than replacing it, HTTP OPTIONS becomes a way of retrieving it.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;What validity constraints exist on the media types&lt;/b&gt; If you are using XML, what schema, DTD, relax-NG description applies? This is a big open issue. For the same reasons as above telling me to &quot;get one and look&quot; doesn&#39;t work. More fundamentally, you cannot infer a global constraint by looking at instances that happen to obey it. This problem has been mentioned by several people: &lt;a href=&quot;http://www.stucharlton.com/blog/archives/000186.html&quot;&gt;stu&lt;/a&gt;, &lt;a href=&quot;http://www.innoq.com/blog/st/2008/02/decentralizing_media_types.html&quot;&gt;Stefan Tilkov&lt;/a&gt;, &lt;a href=&quot;http://macstrac.blogspot.com/2007/11/atompub-services-and-auto-detecting.html&quot;&gt;James Strachan&lt;/a&gt;, and &lt;a href=&quot;http://netzooid.com/blog/2008/02/07/why-a-restful-idl-is-an-oxymoron-and-what-we-really-need-instead/&quot;&gt;Dan Diephouse&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;p/&gt;

The spec that seems to be able to deliver on all this without adding a bunch of extra useless weight seems to be &lt;a href=&quot;https://wadl.dev.java.net/&quot;&gt;WADL&lt;/a&gt;. Here&#39;s a nice quick &lt;a href=&quot;http://weblogs.java.net/blog/mhadley/archive/2007/12/wadling_in_jers.html&quot;&gt;example &lt;/a&gt; of WADL as used in Jersey (the JSR-311 reference implementation) to give you a sense of it. It&#39;s difficult to see how anyone could object to this: it&#39;s simple, lightweight, does the above and little else, and is comprehensible. Your eyes will not melt if you try to read it or its spec. Jersey returns the WADL doc when you do an HTTP OPTIONS on the resource. That&#39;s sweet! I&#39;m really hoping this gets more attention. I note WADL is coming out of the Java community, not the REST community.&lt;/p&gt;

Another exciting development is to clothe your RESTful web services in the Atom Publishing Protocol (AtomPub). AtomPub is a RESTful application protocol for CRUD operatoins on resources that produce Atom Feeds. To see the power, look at how ActiveMQ is proposing to implement a &lt;a href=&quot;http://activemq.apache.org/restful-queue.html&quot;&gt;RESTful Queue&lt;/a&gt;. This is a nontrivial problem. If you don&#39;t see why, follow the link to the discussion at rest-discuss and read the thread. &lt;p/&gt;

The use of AtomPub and Atom directly for publishing to web services (as opposed to the typical use case of HTML based blogs) is an idea that&#39;s been getting a lot more attention lately. Unfortunately, as James Strachan points out, it doesn&#39;t let you easily associate an XML schema when you use the application+xml media type. But it could, with a minor modification. Maybe this problem should be solved at the HTTP level, by introducing the URI to appropriate metadata (such as the XML schema) as a media type parameter. Either way, it&#39;s possible that we&#39;ll see an application protocol (like AtomPub) wrapping up RESTful web services and filling the gaps within it&#39;s constructs.&lt;p/&gt;

Finally, there&#39;s WSDL 2.0. which will also support REST. At the moment WADL&#39;s simplicity and implementation lead seem to make it more interesting to me, but WSDL 2.0 will have to be supported by all the next gen SOAP stacks, so we&#39;re likely to see these going dual architectural style and supporting REST too.&lt;p/&gt;
</description>
	    <dc:date>2008-04-13T02:48:59-05:00</dc:date>
	                                <wfw:comment>http://blog.bwtaylor.com/blojsom/commentapi/spout/internet/2008/04/13/restful_service_descriptions</wfw:comment>
            <wfw:commentRss>http://blog.bwtaylor.com/2008/04/13/restful_service_descriptions?page=comments&amp;flavor=rss2</wfw:commentRss>
            </item>
            <item rdf:about="http://blog.bwtaylor.com/2008/03/24/tilkov_rest_doubts">
	    <title>Tilkov on Doubts About REST</title>
	    <link>http://blog.bwtaylor.com/2008/03/24/tilkov_rest_doubts</link>
        <description>In a recent InfoQ &lt;a href=&quot;http://www.infoq.com/articles/tilkov-rest-doubts&quot;&gt;piece&lt;/a&gt; Stefan Tilkov attempts to address doubts about REST. I offer my reactions to his 10 items. &lt;p/&gt;

&lt;ol&gt;
&lt;li&gt;&lt;b&gt;REST may be usable for CRUD, but not for “real” business logic&lt;/b&gt;&lt;/li&gt; I agree with Tilkov, that REST actually doesn&#39;t map cleanly to CRUD, and I agree that if your only goal is to wrap resource access with business rules, REST can work just fine. I think Tilkov would have made a stronger point if he discussed the paradigm of &quot;hypertext as the engine of application state&quot; as part of workflow business rules. This highlights the fact that security often needs to be a maintained statefully, but this is another question.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;There is no formal contract/no description language&lt;/b&gt;&lt;/li&gt;Tilkov gives three answers. First that you can RESTfully access constrained XML documents. That&#39;s a weak answer because there&#39;s no way to know or discover beforehand what the XML schema at a given URL will be. And if it changes, there&#39;s nothing to confront the service provider with to say &quot;look, you don&#39;t comply with your contract&quot;. Second, he says you don&#39;t need contracts as you&#39;d have to read documentation anyway. That&#39;s laughable. All those WSDLs we use daily for SOAP, we don&#39;t need. OK. The third answer is WADL and WSDL 2.0. This, of course, disproves the previous two answers, except that they are both extremely young and need to mature. You can&#39;t answer the first two ways and the third way simultaneously! The problem with WADL and WSDL2 is that most REST advocates believe the other two answers and aren&#39;t creating tooling around these standards. They have this unreasonable fear that embracing contracts will take them on the path towards WS-* hell.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Who would actually want to expose so much of their application’s implementation internals&lt;/b&gt;&lt;/li&gt;This one is batted down pretty handily. With REST you still control what is exposed and what is not.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;REST works with HTTP only, it’s not transport protocol independent&lt;/b&gt;&lt;/li&gt;
I don&#39;t buy this answer. The talk about HTTP vs TCP is downright strawman-ish. You actually are starting to see things like SOAP over JMS occasionally, and when AMQP delivers true platform independence, I expect messaging based SOAP will take off. &lt;/li&gt;
&lt;li&gt;&lt;b&gt;There is no practical, clear &amp; consistent guidance on how to design RESTful applications&lt;/b&gt;&lt;/li&gt;
This is a cultural thing with the REST community. Somebody should write a REST Cookbook. There are too many arguments about how this or that is not RESTful with no base of examples that are RESTful. Atom is not enough. Tilkov&#39;s strawman comparison to WSDL/SOAP is weak. There are plenty of books that take you step-by-step on how to design a SOAP service. They don&#39;t have to agree: &quot;best&quot; practices can be written in stone when the space stops evolving.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;REST does not support transactions&lt;/b&gt;&lt;/li&gt;
It&#39;s agreed that distributed transactions often (even usually) aren&#39;t needed. But I shouldn&#39;t have my web services architecture decide this for me. There ARE cases where architects want to use these. Global consistent data is very important is many inventory or financial systems. It&#39;s also often needed for reliable messaging as discussed in the next bullet. That said, if I need transactions, I usually switch from SOAP to JMS to avoid the WS-* yuckies.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;REST is unreliable&lt;/b&gt;&lt;/li&gt;
Well, I actually think WS-ReliableMessaging is weak. It&#39;s support by various SOAP stacks is spotty. When I want reliability, I usually move to JMS, often dumping SOAP in the process. WS-Death-* is SOAP&#39;s weakness. That said, idempotency is not a solution, come on. These require the client to rely on behavior from the server to verify the message is received. You need contracts to do that in an automatic way. The other solutions are an attempt to start creating WS-* equivalents. Technically it could work, but these are curiosities, not standards with widespread adoption. Really, the moment you have contracts (see #2) you have a mechanism where you don&#39;t need human intervention at design time.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;No pub/sub support&lt;/b&gt;&lt;/li&gt;
This one is bunk. He gives Atom as proof. With some standards, there could easily be ways to POST or PUT a callback url, too, for peer to peer interactions. Also see the next question. Contracts to allow discovery would be nice (see #2).
&lt;li&gt;&lt;b&gt;No asynchronous interactions&lt;/b&gt;&lt;/li&gt;
He should mention Comet. But POST or PUT of a callback URL could work for peer-to-peer interactions, or simply hand the client of the URL to poll. His idea to use response code 202 is a little weird. Contracts to simply declare support for a particular standard would be nice.
&lt;li&gt;&lt;b&gt;Lack of tools&lt;/b&gt;&lt;/li&gt;
He&#39;s right that if you use XML formats, you have all the same tools. HTTP is otherwise pretty universally embraced. However, full access to all the HTTP methods besides GET and POST is occasionally problematic. REST lags far behind when it comes to service contracts, of course. In fact, I predict it will be the SOAP stacks that first close this gap for REST when they embrace WSDL 2.0. There need to be better client side tools for operating on particular contract standards, too. For example pub/sub is easy if your client knows how to post its callback URL because it sees a standard pub/sub mechanism is declared. Tooling means making these standards and making clients that use them transparently. REST can hopefully skip some of the WS-* hell, but it can&#39;t skip all of it.&lt;p/&gt;&lt;p/&gt;

In summary, I still think REST contracts need to mature (but it looks like progress is starting). Once this happens, standards and tooling can deal with the rest. It&#39;s not clear how REST can avoid the WS-* debacle that SOAP went through. But many of the ten doubts really have been dispelled.

</description>
	    <dc:date>2008-03-24T03:36:22-05:00</dc:date>
	                                <wfw:comment>http://blog.bwtaylor.com/blojsom/commentapi/spout/internet/2008/03/24/tilkov_rest_doubts</wfw:comment>
            <wfw:commentRss>http://blog.bwtaylor.com/2008/03/24/tilkov_rest_doubts?page=comments&amp;flavor=rss2</wfw:commentRss>
            </item>
            <item rdf:about="http://blog.bwtaylor.com/2008/03/24/software_architecture">
	    <title>What is Software Architecture?</title>
	    <link>http://blog.bwtaylor.com/2008/03/24/software_architecture</link>
        <description>In reacting to my recent blog discussing the &lt;a href=&quot;http://blog.bwtaylor.com/2008/03/20/uniform_interface&quot;&gt;Uniform Interface&lt;/a&gt; as used in ROA via its reliance on  REST, Roy Fielding posted a blog &lt;a href=&quot;http://roy.gbiv.com/untangled/2008/on-software-architecture&quot;&gt;On software architecture&lt;/a&gt;. In it, Fielding states his opinion that people &quot;don’t understand the differences between software architecture and implementation, let alone between architectural styles and software architecture.&quot; I&#39;m not sure if that was directed at me specifically or not (I suspect it was), but I think it&#39;s unreasonable to introduce nuanced abstractions and then complain if people don&#39;t adopt them. Like any term of art, the meaning of &quot;software architecture&quot; is open to debate and individuals can propose their definitions and the community of practitioners will socialize what they find useful. But since the point was raised, I&#39;m going to chime in and ask the question &quot;what is software architecture&quot; and I&#39;m going to sketch my own answer. I don&#39;t see much value in abstractions above this, as there is too much vagueness at the this level alone.&lt;p/&gt;&lt;p/&gt;

My job title has &quot;software architect&quot; in it, so I do think I&#39;m entitled to an opinion on what such terms mean. In an enterprise, an architect spends his time deciding what aspects of software and system design should be standardized across the organization and what things should be left to the judgment of individual implementations. Our goal, like that of anyone else in the business, is to deliver value to the company as efficiently as possible. When we decide to standardize, we have to spell out what is and isn&#39;t allowed, and we need to defend the value proposition associated with making rules over tolerating divergent solutions. I view an architecture as a set of principles, where a principle is a function that maps the space of designs into a binary space of &quot;yes/encouraged/allowed/true/conformant/good&quot; vs &quot;no/discouraged/rejected/false/nonconformant/bad&quot;. When I use or hear discussion of architectural &quot;constraints&quot;, I think in terms of such functions. &lt;p/&gt;

A business considers an architecture to be &quot;good&quot; if it leads to lower IT costs over time, balancing well between actually shipping working solution with a shorter-is-better look at development time. Since this is evaluated &quot;over time&quot; you have to include maintainability, adaptability, and so on. What makes an architecture &quot;good&quot; is dynamically changing: it depends on the habits and knowledge of the individuals in the organization, and it depends on the extent to which consensus has emerged. These things aren&#39;t perfectly knowable, and architectural leadership is as much about communicating and guiding as it is about deciding. I think my concepts here of software architecture align a lot with those of Martin Fowler, as described in his essay &lt;a href=&quot;http://martinfowler.com/ieeeSoftware/whoNeedsArchitect.pdf&quot;&gt;Who Needs an Architect?&lt;/a&gt;. &lt;p/&gt;

There is a classic debate between academics and applied practitioners as to the value of standalone theory. I&#39;m an unapologetic applied practitioner. When we introduce nuances like the difference bewteen &quot;architectural style&quot; and &quot;software architecture&quot;, I ask &quot;who are you trying to communicate to?&quot; When most people don&#39;t understand the distinction I wonder whose fault Dr. Fielding thinks that is and what we should do about it. At a minimum, I think it&#39;s fair to ask &quot;why introduce a second level of abstraction?&quot; Can&#39;t I reformulate a REST equivalent as a set of architectural principles in the sense I give above and take any proposed concrete design and say which, if any, of those principles it violates? Isn&#39;t the real problem here that we named the abstraction without having a few concrete architectures to justify it? &lt;p/&gt;

The use of language as a means to develop common understanding is an important step in the evolution of software architecture. Common understanding hopefully leads to communication about common experiences, and this in turn leads to consensus on what is or isn&#39;t a best practice worth standardizing upon. When I adopt language, I do so with this end in mind. I tried to sidestep the double abstraction by writing about ROA and not really about REST other than how it&#39;s used within ROA. I did this because over the past year or so, there has been an ongoing discussion  influenced by Sam Ruby&#39;s book &lt;a href=&quot;http://www.crummy.com/writing/RESTful-Web-Services/&quot;&gt;RESTful Web Services&lt;/a&gt;. Part of my job is to critically examine all sides of archictural trends. I, along with my fellow architects, need to guide my company on how and when to adopt architectural principles. In order to do that, I need a name for the set of practices we should consider adopting. All I can say is that continued confusion over terminology and concepts is not a good selling point for REST or ROA or whatever I should call the thing  we could adopt is.&lt;p/&gt;

I note the Roy appears to lump me in as an &quot;SOA advocate&quot;. I suppose it looks that way, but I&#39;d like to make it clear that this is &quot;for now&quot; only. Again, what&#39;s &quot;best&quot; is a influenced heavily by human factors such as understanding, consensus, industry support, and so on. I&#39;m no SOAP fanboy: there&#39;s a whole lot to dislike about SOAP and the lack of simpler solutions for SOA wastes endless sums of money across the IT industry. In my view the race is on to see if SOAP can simplify before some particular REST approach matures enough to displace it. I would not be surprised at all if specs like WADL or WSDL 2.0 help move a RESTful web services approach forward. But lots of REST advocates seem to have a philosophical opposition to these and my message to them is unambiguous: within the enterprise, REST won&#39;t matter without these. If nothing changes REST will continue be used to solve the problems of web communities. Solutions like Atom where a critical mass of people with a common problem collaborate on standards and tools will be the only arena where REST impacts. Inside the enterprise where programmers toil one or two at a time under deadlines to integrate the backends of systems in environments where politics exist, SOAP will be what people like me conclude we need to use. Again, I said &quot;if nothing changes&quot;. I hope it will, and when it does you&#39;ll read about it here. Dr. Fielding reads this as &quot;criticisms of [his] work&quot;. That&#39;s a glass half-empty view. A gap is an opportunity to improve, and closing this one would make it more useful in the space I happen to work in. That space is a big one, but it&#39;s not the only one. I wouldn&#39;t be discussing REST at all if it didn&#39;t solve some problem well. Please note that my Atom feed for this blog works great and is joyously RESTful.&lt;p/&gt;

Finally, I&#39;d like to point out that Dr. Fielding essentially restated my main point when he says &quot;REST constraints do not constrain Web architecture — they constrain RESTful architectures (including those found within the Web architecture) that voluntarily wish to be so constrained.&quot; It seems really odd  to recognize the value of a set of  voluntary constraints without immediately asking how to declare that you have volunteered, so that interacting parties can rely upon it. This of course, is exactly what a contract is. It would be nicer still, and downright useful, if there was an objective way to test that a site that declared itself to have some particular RESTful architecture actually did. In other words, its also useful to audit compliance to the contract.&lt;p/&gt;
</description>
	    <dc:date>2008-03-24T00:56:54-05:00</dc:date>
	                                <wfw:comment>http://blog.bwtaylor.com/blojsom/commentapi/spout/internet/2008/03/24/software_architecture</wfw:comment>
            <wfw:commentRss>http://blog.bwtaylor.com/2008/03/24/software_architecture?page=comments&amp;flavor=rss2</wfw:commentRss>
            </item>
            <item rdf:about="http://blog.bwtaylor.com/2008/03/20/uniform_interface">
	    <title>ROA vs SOA: The Uniform Interface</title>
	    <link>http://blog.bwtaylor.com/2008/03/20/uniform_interface</link>
        <description>Here&#39;s part 3 in my series comparing Service Oriented and Resource Oriented architectures. If follows part 1: &lt;a href=&quot;http://blog.bwtaylor.com/2007/09/05/Comparing-ROA-and-SOA&quot;&gt;Comparing ROA and SOA&lt;/a&gt; and part 2:   &lt;a href=&quot;http://blog.bwtaylor.com/2007/09/06/ROA_SOA_Contracts&quot;&gt;ROA and SOA and Service Contracts&lt;/a&gt;. This article will focus on the second major difference  between ROA and SOA from part 1: REST&#39;s uniform interface vs SOAP&#39;s rich operation sets (the other two being contracts and data/metadata differentiation).  REST relies on the HTTP uniform interface, and prefers to do so with minimal overloading (ie don&#39;t put requested operations as parameters), whereas SOAP provides a rich set of domain specific operations, and requires an invocation POST to specify which operation from an endpoint specific set that is contractually specified. &lt;p/&gt;&lt;p/&gt;

My conclusion is: REST was supposed to define a set of  architectural constraints, but nobody is constrained by the uniform interface and many don&#39;t implement it or worse violate it. To identify those resources agreeing to abide is a contractual determination, not an architectural one. &lt;p/&gt;

Let&#39;s review what a uniform interface is, and then what the ROA uniform interface is. As a simpleton definition, a uniform interface means that for all things capable of responding to a request, the language to invoke the request is the same (aka uniform). This means the language is a system invariant as opposed to something that must be specified per target. This is important because it means that intermediaries can attach to the system and the semantics of any observed requests are transparent to the intermediary. This explaination is my own spin and interpretation. Consulting the &lt;a href=&quot;http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_1_5&quot;&gt;authoritative source&lt;/a&gt; is (to me, YMMV) like reading a political speech: it says much that is often repeated by adherents but uses too many nebulously defined terms that at the end of the day don&#39;t convey any precise meaning. The uniform interface, as described by Fielding, is defined by four interface architectural constraints: identification of resources via a URI, manipulation of resources through representations, self-descriptive messages, and hypermedia as the engine of application state. Fielding later explains: &quot;REST enables intermediate processing by constraining messages to be self-descriptive: interaction is stateless between requests, standard methods and media types are used to indicate semantics and exchange information, and responses explicitly indicate cacheability.&quot;

Generally, I agree there is tremendous value in having a standard set of  operations with externally known, target-independent semantics. The idea in ROA is that all resources in the system can receive GET, POST, PUT, and DELETE. Unfortunately, very few people actually implement these faithfully, and there are other HTTP operations like TRACE, HEAD, OPTIONS, and CONNECT which are even less faithfully implemented. Almost all of the internet fails to implement the uniform interface. Browsers don&#39;t actually support PUT and DELETE, by the way. Lot&#39;s of resources even violate the normal meanings. As one example, ActiveMQ&#39;s is a message broker that allows HTTP GET to destructively dequeue a message. Is this &quot;bad&quot;? or useful? &lt;p/&gt;

I hate to come back to the contract question again, but how exactly do I declare that I do faithfully use the full uniform contract of ROA. How do I shout from the rooftops that my GETs are safe? I suppose somebody could publish an atom feed of all &quot;know uniform&quot; sites. The sad irony is that were such a way invented, it would express nothing more than that specific targets obey a particular interface (the uniform one). This is the problem with trying to avoid contracts - it doesn&#39;t work. The sad reality is that the uniform interface is not uniformly adopted. It&#39;d be nice if it were, but alas, this is a pipe dream. It&#39;d be nice if people wouldn&#39;t spam me, too.&lt;p/&gt;

Let&#39;s pretend that everybody gets religion and tries to follow the &quot;spirit of the web&quot;. ActiveMQ only dequeues on DELETE. Even, then, there&#39;s the problem that POST doesn&#39;t actually have a standard meaning that can be predicted in a resource independent way. It&#39;s the operation with side effects, right? If that&#39;s all we can say about it, that&#39;s lame. It&#39;s also false: there&#39;s no guarantee that POST must have side effects on any particular invocation. The REST crowd cries with horror at the &quot;abuse of the web&quot; that occurs when somebody creates a SOAP interface and does a POST with an operation parameter of getPurchaseOrder to return a purchase order document. The offender is often lectured about the &lt;a href=&quot;http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3&quot;&gt;HTTP Spec, section 9.3 and 9.5&lt;/a&gt; and the &lt;a href=&quot;http://www.w3.org/DesignIssues/Axioms.html&quot;&gt;Axioms of The Web&lt;/a&gt;, and then referred to &lt;a href=&quot;http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm&quot;&gt;The REST Bible&lt;/a&gt;. Tim Berners Lee and Roy Fielding&#39;s contributions to the sciences and useful arts deserve respect, but only because they try to explain their points without the sophistry of &lt;a href=&quot;http://www.changeminds.org/disciplines/argument/fallacies/appeal_authority.htm&quot;&gt;appeal to authority&lt;/a&gt;, something lost on most REST advocates. Back to the point: there is nothing in the HTTP spec section 9.3 or 9.5 that implies you cannot embed a &quot;GET equivalent&quot; inside a POST, as SOAP often does. One of the (many) enumerated functions POST was intended to cover is that of &quot;providing a block of data, such as the result of submitting a form, to a data-handling process&quot; and &quot; The actual function performed by the POST method is determined by the server ...&quot;. To the Turing machine at the other end of your POST there is no meaningful distinction between such an allowable data block and one that invokes &quot;operations&quot; via a string identifier.&lt;p/&gt;

When you look at TBL&#39;s document above, you do find this &lt;a href=&quot;http://www.w3.org/DesignIssues/Axioms.html#GET2&quot;&gt;axiom&lt;/a&gt; that appears to forbid the practice. His argument for the axiom is that &quot;The introduction of any other method apart from GET which has no side effects is also incorrect, because the results of such an operation effectively form a separate address space, which violates the universality.&quot; The axiom of universality in two parts states &quot;Any resource anywhere can be given a URI&quot; and &quot;Any resource of significance should be given a URI.&quot; Keep in mind that resources in the semantic web can be &quot;...anything - real objects, abstract concepts.&quot; The idea here is that since you are &quot;obviously&quot; just getting a resource, you should give it a URI and GET it. &lt;p/&gt;
 
Unfortunately, to denounce getPurchaseOrder relies on your desires as client rather than what I as the implementer have agreed to. How exactly how are you concluding from the name only, that &quot;getPurchaseOrder&quot; has no side effect? The WSDL doesn&#39;t specify that this is true and one of the SOA principles &quot;autonomy&quot; says the other details are encapsulated in a single point of control. Unless I explicitly gave you a commitment (and I didn&#39;t), you really you have no such guarantee. How do you know that my getPurchaseOrder implementation doesn&#39;t increment a counter somewhere as a side affect. How do you know it doesn&#39;t assign a random sales engineer&#39;s name from a rotating pool on each request? You want getPurchaseOrder to be side effect free, but that desire is all you have. Here&#39;s the problem: functionality changes over time. I may not be willing to commit to getPurchaseOrder being side effect free for now and all times. Even if it is truly side effect free, that&#39;s just for today. Will it stay that way? Maybe it wasn&#39;t put in a GET so that I can have the flexibility to change the operation&#39;s side effects next year when we get serious about Sarbanes-Oxley. The rule has to be that the operation is guaranteed to NEVER have side effects. The &quot;axioms of the web&quot; really don&#39;t contradict embedding GET in POST if the side-effect free guarantee isn&#39;t established. And that is 100% up to me as implementer to determine. You as client can never verify the call is side effect free, as I  don&#39;t have to tell you everything I do when I receive your call, and you can never observe &quot;all resources&quot; because of the open world assumption on the web.&lt;p/&gt;

In summary, I wish the uniform interface of REST was actually adhered to by all HTTP resources. Even if it was, there is nothing nonconformant with SOAP. I think I could defend the proposition that SOAP is RESTful. Finally,in the real world, adherence to the uniform interface is not uniform, so there is no escaping the need for contracts to declare target specific interfaces. &lt;p/&gt;
</description>
	    <dc:date>2008-03-20T22:58:13-05:00</dc:date>
	                                <wfw:comment>http://blog.bwtaylor.com/blojsom/commentapi/spout/internet/2008/03/20/uniform_interface</wfw:comment>
            <wfw:commentRss>http://blog.bwtaylor.com/2008/03/20/uniform_interface?page=comments&amp;flavor=rss2</wfw:commentRss>
            </item>
            <item rdf:about="http://blog.bwtaylor.com/2008/02/18/hibernate_interceptor_gotchas">
	    <title>Hibernate Interceptor Gotchas</title>
	    <link>http://blog.bwtaylor.com/2008/02/18/hibernate_interceptor_gotchas</link>
        <description>I&#39;m trying to implement a Hibernate Interceptor to track user edits to an entity. I call this an EditInterceptor and it is similar to the AuditInterceptor that many people have described. I found implementing a Hibernate Interceptor in practice to have many &quot;gotchas&quot;. These include:
&lt;p/&gt;
&lt;b&gt;Problem 1&lt;/b&gt;: Doing work in onSave() you discover the database id may not have been created yet (as the SQL insert hasn&#39;t occurred yet). Similarly, onFlushDirty() and onDelete() occur before the database has actually changed.&lt;br/&gt;
Solution: Process items in onFlush() using Interceptor instance collections to pass them from onSave(), onFlushDirty(), and/or onDelete().
&lt;p/&gt; 
&lt;b&gt;Problem 2&lt;/b&gt;: You cannot modify objects in the session you are working with while it is flushing.&lt;br/&gt;
Solution: Create a second session in postFlush using the same jdbc connection.
&lt;p/&gt; 
&lt;b&gt;Problem 3&lt;/b&gt;: When implementing the solution to #2, you discover that session.connection() is deprecated, but that no alternative has been provided yet. Note that the Hibernate team doesn&#39;t practice &lt;a href=&quot;http://java.sun.com/j2se/1.5.0/docs/guide/javadoc/deprecation/deprecation.html&quot;&gt;proper use of deprecation&lt;/a&gt; here, as pointed out in the comments to &lt;a href=&quot;http://opensource.atlassian.com/projects/hibernate/browse/HHH-2603&quot;&gt;HHH-2603&lt;/a&gt;&lt;br/&gt;
Solution: Use it anyway, and add  @SuppressWarnings(&quot;deprecation&quot;). Note that cloning a session from the same jdbc connection this way is safe, even if there are problems with using session.connection() to do ad hoc jdbc mischief.
&lt;p/&gt; 
&lt;b&gt;Problem 4&lt;/b&gt;: You&#39;re using Spring&#39;s Hibernate support and realize the Interceptor instance collections from Problem 1 aren&#39;t thread safe.&lt;br/&gt;
Solution: Wrap them in a thread local. See &lt;a href=&quot;http://www.jroller.com/ksevindik/entry/experiences_with_audit_logging_through&quot;&gt;this example&lt;/a&gt;.
&lt;p/&gt; 
&lt;b&gt;Problem 5&lt;/b&gt;: Your updates are getting processed multiple times and you realize onFlushDirty is called multiple times, and read the &lt;a href=&quot;http://tinyurl.com/3cnlt3&quot;&gt;javadocs&lt;/a&gt; and discover flush() doesn&#39;t always conclude with SQL syncronization to the database and that onFlushDirty() is still called in these cases.&lt;br/&gt;
Solution: Use a Set to collect changed entities and be sure to initialize this set in afterTransactionBegin().&lt;p/&gt;
&lt;b&gt;Problem 6&lt;/b&gt;: You realize that in onFlushDirty, because of mulitple flushes as described above, that previousState and currentState are changing from call to call as you hit different points where hibernate automatically flushes. You need the true original state and the true final state.&lt;br/&gt;
Solution: Use a ThreadLocal map that associates an entity with the first previousState seen for it. Clear this map when a transaction starts and after you flush. Clear the updates in preFlush() and as usual process them in postFlush(), but when you calculate the update in onFlushDirty() do it relative to the originalState from the map, instead of previousState, which is only used to seed the map if it doesn&#39;t have a value for the entity.&lt;p/&gt;
</description>
	    <dc:date>2008-02-18T23:15:35-06:00</dc:date>
	                                <wfw:comment>http://blog.bwtaylor.com/blojsom/commentapi/spout/java/2008/02/18/hibernate_interceptor_gotchas</wfw:comment>
            <wfw:commentRss>http://blog.bwtaylor.com/2008/02/18/hibernate_interceptor_gotchas?page=comments&amp;flavor=rss2</wfw:commentRss>
            </item>
            <item rdf:about="http://blog.bwtaylor.com/2008/02/12/distributed_version_control">
	    <title>The Need for Distributed Version Control in the Enterprise</title>
	    <link>http://blog.bwtaylor.com/2008/02/12/distributed_version_control</link>
        <description>I&#39;m looking at software configuration management tools again. My last three projects at work have all used subversion. This was a big improvement over CVS,  but I&#39;m growing tired of dealing with needing to push everything back through a central server to share it with others (or to share it between my computers). I&#39;m also finding that the pains of branching and merging really limit the pace of change. These are the problems that some of the new SCM tools like git and mercurial were created to solve. I&#39;m convinced that enterprises need distributed version control.&lt;p/&gt;
&lt;p/&gt;

It seems many people think tools like git an mercurial are only appropriate for large open source projects, and aren&#39;t necessarily relevant to the enterprise. I submit that enterprise development teams need the new tools just as much, if for slightly different reasons. Basically, as enterprise developers, we need to write code in a feature oriented way and then group completed features together into releases. There are two approaches to dealing with how to allocate features to releases: you either decide the features in a release up front and work until you are done, or you decide the time frame for a release and pull in the completed features to it and push incomplete ones to the next release. My thesis here today is that the latter method is better, but it really stresses your ability to manage branching and merging, and that tools like git and mercurial are simply better at managing this.&lt;p/&gt;

The big problem in software development (as everyone knows) is that nobody can figure out how to estimate the duration of a task very well. If you think you have a solution to this problem, slap yourself, because you don&#39;t. The variability in estimating means that doing the &quot;feature scoped&quot; method incurs heavy waste as all features in a release go out at the pace of the slowest one. So most developers finish their tasks well before the slowest and then have degraded productivity until the next release. These problems get worse the more features are in a branch. &lt;p/&gt;

The degraded productivity goes away if developers can push and pull features between releases. In fact, the cost of estimating wrongly drops if we can juggle features easily, because now aren&#39;t holding a bunch of working features when we estimate wrong.  &lt;p/&gt;

But you can start to see how all these problems rely on nimbleness in source control tools. Branching, merging, and conflict resolution have to be easy, quick, and simple. At any given time you might have a released branch, a branch under QA/test, and usually several different release branches in development: the next few minor releases and also the next major release. A feature&#39;s code can be juggled around among the unreleased versions. For example, if we find a bug, we want to apply the fix to all in process development branches. We create a branch just for this bug, maybe, and merge it&#39;s changes into all the other branches. Often we juggle a feature out of one branch and into another because it isn&#39;t ready in time. Whenever we create multiple development branches, we have to merge the earlier ones into the latter ones a lot.&lt;p/&gt;

The fact is that merging is extremely painful in subversion for several reasons. First, subversion doesn&#39;t really think in terms of branches. The directories in your /branches folder are really nothing more than ordinary directories.  Worse, subversion doesn&#39;t help you at all in terms of keep in track of completed merge operations. Keeping track of merged revisions manually simply doesn&#39;t scale - the process becomes error prone, and anyone who has done a lot of branching and merging in subversion has stories to tell on the theme of &quot;oops&quot;.

In fact, if branching was really cheap it might be better to create a branch per feature. This would let release managers wait until the last possible moment to merge changes: they&#39;d look in the ticket tracking system, see which ones are &quot;ready for merge&quot; and pull them in, or better yet have the feature developer do it, resolving conflicts first. Many of us are used to doing this with patch files, but the problem there is an ordinary diff can&#39;t understand directory structures and how things in different places really are different versions of &quot;the same&quot; thing. And there&#39;s also the problem of the directory structure itself. &lt;p/&gt;

As the number of branches goes up, there will be a natural desire for peer-to-peer merging capabilities. Your peer has a bug? Pull his branch. If two people collaborate on a feature, why make them talk to a middleman to share changes? Especially when those changes may be broken or half-baked? Ever been annoyed by doing a subversion update and getting a bunch of changes you didn&#39;t want yet? Worse, ever seen one that broke everything? What if you only pull in things you want, when you are ready and know it&#39;s coming? What if half the time you don&#39;t even have to do that because the other guy is pulling your stuff first? Now distributed SCM seems a lot more reasonable. What if you have multiple computers (home/work or PC/laptop or both). Wouldn&#39;t it be nice to share changes with yourself, even if they don&#39;t even compile at the moment? Do it in one step instead of two. Oh, and now you and your coworker can collaborate outside of the office. So go to a cafe and get some work done together.  &lt;p/&gt;

It looks like Git and Mercurial both have a compelling improvement to offer enterprise development shops. Git is slightly faster and has a more comprehensive command set, but Mercurial&#39;s commands will be more familiar to SVN/CVS users and Mercurial has good windows support. Lots of big projects are using these tools: Linux uses Git, Java uses Mercurial. We&#39;re starting to see more medium and small shops use these too. Which is better? They&#39;re both good, and there&#39;s a tradeoff of power vs simplicity and speed vs portability. Pick the first option in either tradeoff and you should look at Git, pick the second and you should use Mercurial. 


</description>
	    <dc:date>2008-02-12T03:02:49-06:00</dc:date>
	                                <wfw:comment>http://blog.bwtaylor.com/blojsom/commentapi/spout/internet/2008/02/12/distributed_version_control</wfw:comment>
            <wfw:commentRss>http://blog.bwtaylor.com/2008/02/12/distributed_version_control?page=comments&amp;flavor=rss2</wfw:commentRss>
            </item>
            <item rdf:about="http://blog.bwtaylor.com/2008/01/26/ant_maven_gant_pros_cons">
	    <title>Pros and Cons of Ant, Maven, Gant</title>
	    <link>http://blog.bwtaylor.com/2008/01/26/ant_maven_gant_pros_cons</link>
        <description>I&#39;ve been thinking about java build tools again. My projects have always ended up using ant and wondering about Maven. There&#39;s certainly some innovative ideas in Maven, but there&#39;s also some things that scare me. It&#39;s funny that Maven&#39;s reliance on &quot;convention over configuration&quot; easily predates the Ruby on Rails fad, but the latter gets all the credit for inventing it. There&#39;s a reason for that. Anyway, the new kid on the block is &lt;a href=&quot;http://gant.codehaus.org/&quot;&gt;Gant&lt;/a&gt;, and the way that it&#39;s being used in &lt;a href=&quot;http://grails.org/doc/1.0.x/guide/4.%20The%20Command%20Line.html&quot;&gt;Grails&lt;/a&gt; seems really interesting. Gant is a marriage of groovy with ant, which addresses some of the things that frustrate me about ant. Grails adds usability via the RoR style of simple, standard command line syntax. OK, so here&#39;s my pros and cons of Ant, Maven2, and Gant.&lt;p/&gt;

First I take a look at the old workhorse...

&lt;ul&gt;Ant
&lt;li&gt;Pros&lt;ul&gt;
&lt;li&gt;Everybody knows it&lt;/li&gt;
&lt;li&gt;Everybody supports it. Ant tasks exist for everything. &lt;/li&gt;
&lt;li&gt;Extensible. Writing macros and tasks yourself is easy. &lt;/li&gt;
&lt;li&gt;Flexible, properties configuration&lt;/li&gt;
&lt;li&gt;Well documented, even by 3rd party tools&lt;/li&gt;
&lt;li&gt;Low tech and hackable: no hidden magic or voodoo. &lt;/li&gt;
&lt;li&gt;Path structures and wildcards are simple, yet powerful&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Cons&lt;ul&gt;
&lt;li&gt;Everybody know it, including people who shouldn&#39;t touch a build. Ever.&lt;/li&gt;
&lt;li&gt;No standards - few conventions and idioms. Everybody does it different.&lt;/li&gt;
&lt;li&gt;Everybody does it different, even from their previous project.&lt;/li&gt;
&lt;li&gt;XML does not facilitate reuse. &lt;/li&gt;
&lt;li&gt;Limited expressiveness. I have to use ant-contrib to say &quot;if&quot;!?!?! or for &amp;lt;ac:propertycopy name=&quot;username&quot; from=&quot;db.${db.server}.username&quot;&amp;gt;&lt;/li&gt;
&lt;li&gt;XML Sprawl. As XML goes, not that verbose, but nothing is by convention&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;

&lt;p/&gt;

Then it&#39;s chief rival, and the more ambitious alternative...

&lt;ul&gt;Maven 2
&lt;li&gt;Pros&lt;ul&gt;
&lt;li&gt;Standardized build lifecycle&lt;/li&gt;
&lt;li&gt;Drop-in reuse of build tools&lt;/li&gt;
&lt;li&gt;Dependency management&lt;/li&gt;
&lt;li&gt;Internal repositories facilitate enterprise code sharing&lt;/li&gt;
&lt;li&gt;Archetype concept allows speed starting project by flavor&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Cons&lt;ul&gt;
&lt;li&gt;Hierarchical projects clash with Eclipse (&lt;a href=&quot;https://bugs.eclipse.org/bugs/show_bug.cgi?id=35973&quot;&gt;Bug 35973&lt;/a&gt; is 3rd overall with 144 votes today.)&lt;/li&gt;
&lt;li&gt;Extending isn&#39;t simple. mojo, schmojo. &lt;/li&gt;
&lt;li&gt;Many mundane tasks are truly cumbersome.&lt;/li&gt;
&lt;li&gt;Archetypes are a great idea ruined by horrible syntax. This is &lt;a href=&quot;http://graemerocher.blogspot.com/2008/01/why-grails-doesnt-use-maven.html&quot;&gt;why grails doesn&#39;t use Maven&lt;/a&gt;.
&lt;li&gt;Brittle builds. Some say &lt;a href=&quot;http://fishbowl.pastiche.org/2007/12/20/maven_broken_by_design&quot;&gt;broken by design&lt;/a&gt;. I attended a talk once by a maven project guy. His demo didn&#39;t work.&lt;/li&gt;
&lt;li&gt;Repository metadata quality. This is &lt;a href=&quot;http://raibledesigns.com/rd/entry/re_why_grails_doesn_t&quot;&gt;Matt Raible&#39;s #1 Complaint&lt;/a&gt;. Maintaining transitive dependencies is hard and brittle.&lt;/li&gt;
&lt;li&gt;Verbose XML syntax in POMs&lt;/li&gt;
&lt;li&gt;Plugin avialability lags behind Ant&lt;/li&gt;
&lt;li&gt;Endless downloading of jars. Go to lunch while maven &quot;downloads the internet&quot;.&lt;/li&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;/ul&gt;

Finally, the newcomer with respect for its elders...

&lt;ul&gt;Gant, Groovy, and/or Grails
&lt;li&gt;Pros&lt;ul&gt;
&lt;li&gt;Ultra-expressiveness of groovy. No more wrestling to do mundane things&lt;/li&gt;
&lt;li&gt;No more programming in XML.&lt;/li&gt;
&lt;li&gt;Smooth adoption path: first use ant&#39;s groovy task, then AntBuilder in groovy, then Gant, then wrap in a grail-like runner and scaffolding&lt;/li&gt;
&lt;li&gt;Grails scaffolding is simple, powerful, and immediately useful. &lt;/li&gt;
&lt;li&gt;Leverage the ubiquity of 3rd party ant tasks. Steal the best part of Rails but backed by ant&#39;s mountain of 3rd party tasks&lt;/li&gt;
&lt;li&gt;Build logic expressed in groovy classes should facilitate reuse&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Cons&lt;ul&gt;
&lt;li&gt;Very young technology&lt;/li&gt;
&lt;li&gt;Groovy is just starting to penetrate the masses. Gant still largely unknown.&lt;/li&gt;
&lt;li&gt;Ok, I admit the only grails-like runner is Grails for now&lt;/li&gt;
&lt;li&gt;Documentation is poor. Really poor.&lt;/li&gt;
&lt;li&gt;Tooling is weak. IDE&#39;s don&#39;t support Gant or Grails style lauchers&lt;/li&gt;
&lt;li&gt;No standard build lifecycle if you use ant+groovy or gant without grails&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
</description>
	    <dc:date>2008-01-26T02:11:04-06:00</dc:date>
	        </item>
            <item rdf:about="http://blog.bwtaylor.com/2008/01/21/unbiased_language_popularity">
	    <title>Java on the Decline? Think Again</title>
	    <link>http://blog.bwtaylor.com/2008/01/21/unbiased_language_popularity</link>
        <description>It seems that everywhere I look people are taking pot shots at Java, declaring it passe and acting like it&#39;s on it&#39;s death bed. What a nice thing it is to see &lt;a href=&quot;http://www.tiobe.com/tpci.htm&quot;&gt;unbiased measurement of language popularity&lt;/a&gt; from Tiobe. That link is to the January 2008 Programming Community Index. &lt;p/&gt;

Here&#39;s what their unbiased measurements actually show: &lt;ul&gt;
&lt;li&gt;Java is the most popular language, capturing 20.8% of the popularity&lt;/li&gt;
&lt;li&gt;That lead increased over second place C (now at 13.9%) by 3.6% over a year ago&lt;/li&gt;
&lt;li&gt;Java&#39;s absolute popularity increased from a year ago by 1.7% &lt;/li&gt;
&lt;li&gt;Ruby&#39;s popularity is 2.3% ranking it 11th&lt;/li&gt;
&lt;li&gt;Python was the biggest gainer over the last year, growing 2.0%, giving it 6th place&lt;/li&gt;
&lt;li&gt;Python overtook long time rival Perl for the first time this year&lt;/li&gt;
&lt;li&gt;Visual Basic (now 3rd) was the second biggest gainer, Java was 3rd&lt;/li&gt;
&lt;li&gt;Ruby&#39;s popularity actually fell 0.17% over the last year&lt;/li&gt;
&lt;li&gt;Perl, ranking 7th, is still more than twice as popular that Ruby&lt;/li&gt;
&lt;li&gt;C lost the most ground at -1.89%&lt;/li&gt;
&lt;li&gt;C++ lost the second most ground at -1.7%&lt;/li&gt;
&lt;li&gt;C++ fell to 5th, as it was overtaken by both Visual Basic and PHP&lt;/li&gt;
&lt;li&gt;PHP gained 1.25% in popularity over the year&lt;/li&gt;
&lt;li&gt;Java is more popular than VB and C# combined (aka .net) which total 15.7%&lt;/li&gt;
&lt;li&gt;Delphi at 3.3% surged ahead of both Javascript and Ruby.&lt;/li&gt;
&lt;li&gt;Lua ranks 16th, up from 46th&lt;/li&gt;
&lt;li&gt;Groovy ranks 31st&lt;/li&gt;
&lt;/ul&gt;

If these numbers surprise you, maybe you need to be more skeptical when you read blogs. 
</description>
	    <dc:date>2008-01-21T01:04:49-06:00</dc:date>
	        </item>
            <item rdf:about="http://blog.bwtaylor.com/2007/11/19/fedora8_issues">
	    <title>Fedora 8 Upgrade: Not so Smooth</title>
	    <link>http://blog.bwtaylor.com/2007/11/19/fedora8_issues</link>
        <description>&lt;p&gt;I&#39;m a fan of Fedora, so I was happy to see Fedora 8 hit the streets. I&#39;ve tried to move to it on two different boxes: one at work, and one at home. My efforts at work succeeded with one issue (the java one below). At home, though, I&#39;ve met some serious difficulties. I&#39;m installing onto a Dell E510, which is pretty common. From the volume of &quot;me too&#39;s&quot; on the Fedora bug tracker, I gather these issues are widespread.&lt;/p&gt;

&lt;p&gt;I&#39;ve encountered three problems total:
&lt;ul&gt;
&lt;li&gt; ISOLINUX hangs during boot after loading initrd.img with the message &quot;Ready.&quot; See &lt;a href=&quot;https://bugzilla.redhat.com/show_bug.cgi?id=239585&quot;&gt;bug 239585&lt;/a&gt;&lt;/li&gt;
&lt;li&gt; Anaconda hangs in some upgrades when dependency resolution reaches 26% (or 99% for some people). See &lt;a href=&quot;https://bugzilla.redhat.com/show_bug.cgi?id=372011&quot;&gt;bug 372011&lt;/a&gt;&lt;/li&gt;&lt;/li&gt;
&lt;li&gt; Existing Sun JRE&#39;s have some awt problem with libX11 in Fedora 8, where GUI&#39;s fail with &quot;xcb_xlib.c:50: xcb_xlib_unlock: Assertion &#39;c-&gt;xlib.lock&#39; failed.&quot;. See Java bug &lt;a href=&quot;http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6532373&quot;&gt;6532373&lt;/a&gt; and Fedora bug &lt;a href=&quot;https://bugzilla.redhat.com/show_bug.cgi?id=254144&quot;&gt;254144&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;I&#39;ve never heard a good explanation for the first problem. I was able to solve it by hitting tab at the Fedora installer menu and adding &quot;edd=skipmbr&quot; to the linux command line. Others have reported using other options like &quot;acpi=off&quot; and a few more others, but these didn&#39;t help me. &lt;/p&gt;

&lt;p&gt;The second issue has me stopped. This appears to be a bug in yum, and you hit it depending on what packages you are upgrading. I got lucky at work and unlucky at home. There appears to be an installation update at that some people are reporting success with available &lt;a href=&quot;http://katzj.fedorapeople.org/updates-f8-yumloop.img&quot;&gt;here&lt;/a&gt;. Unfortuantely, using these updates requires either accessing them via the network during the install or mounting a drive with the image on it. My box doesn&#39;t have a floppy and I don&#39;t use dhcp and my attempts to configure the installer with my networking config haven&#39;t gone swimmingly. So I&#39;m stuck. I could probably get this working with some research into using &lt;a href=&quot;http://fedoraproject.org/wiki/Anaconda/Updates&quot;&gt;Anaconda updates&lt;/a&gt;, but this exceeds my activation energy level at the moment. &lt;/p&gt;

&lt;p&gt;The java issue occurs if Java finds the Xinerama extension, at which point it does something broken with locking and triggers the error. People have figured out they can work around it by faking out java into not finding this extension by using a sed script to replace the text it looks for in the binary library: 
sed -i &#39;s/XINERAMA/FAKEEXTN/g&#39; $JAVA_HOME/jre/lib/i386/xawt/libmawt.so &lt;/p&gt;

&lt;p&gt;All in all, this is the most painful upgrade I&#39;ve had yet with Fedora, which I&#39;ve been with full time at home and work since Fedora 4. I&#39;ve had some issues with sound cards and SE Linux, but nothing that basically prevented me from using it. My advice to people is to wait until this stuff is all worked out, unless you enjoy troubleshooting for the sport of it. A good page to look at for the quick facts is the &lt;a href=&quot;http://fedoraproject.org/wiki/Bugs/F8Common&quot;&gt;Fedora 8 Common Bugs&lt;/a&gt; page.&lt;/p&gt;
</description>
	    <dc:date>2007-11-19T18:51:53-06:00</dc:date>
	                                <wfw:comment>http://blog.bwtaylor.com/blojsom/commentapi/spout/linux/2007/11/19/fedora8_issues</wfw:comment>
            <wfw:commentRss>http://blog.bwtaylor.com/2007/11/19/fedora8_issues?page=comments&amp;flavor=rss2</wfw:commentRss>
            </item>
            <item rdf:about="http://blog.bwtaylor.com/2007/11/15/lightning_gcal">
	    <title>GCal &amp; Lightning/Thunderbird</title>
	    <link>http://blog.bwtaylor.com/2007/11/15/lightning_gcal</link>
        <description>&lt;p&gt;I&#39;m the kind of guy who adopted linux as my primary desktop years ago. I&#39;ve been lucky enough to use it at work exclusively for almost two years, and I&#39;ve used it at home exclusively for five or six years. Windows actually feels really strange to me now. One issue that has been a big pain at work was calendar support. Finally I think I&#39;ve found something that makes me happy: I&#39;m using Thunderbird with Lightning and the Provider for Google Calendar. A good write up on setting this up is &lt;a href=&quot;http://bfish.xaedalus.net/?p=239&quot;&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Finally I think I have a good setup that meets all my needs. First of all, my Calendar has to live in my email program, so I can get meeting invitations and hit &quot;accept&quot; and it&#39;s on my calendar. There are a lot of email programs for linux that I don&#39;t like, so this was a limiting factor for a while. I need one with good support for multiple mailboxes and lots of features. I also want to be able to get to my calendar from anywhere. I use a VPN at home a lot to read my email as I somewhat dislike webmail. I want to not care which box I&#39;m &quot;accepting&quot; the meeting message on. Also, I want to have a browser bookmark to my calendar or be able to navigate to it from somebody else&#39;s browser if I don&#39;t have my computer. &lt;/p&gt;

&lt;p&gt;I actually think this combination has advantages over Outlook (besides being open source and working on any operating system).  GCal and Lighning finally solve my calendar issue, so I can cross one of my biggest annoyances off my list. Now if I could just get an open source driver for my ATI graphics card, I&#39;d be very happy.&lt;/p&gt;
</description>
	    <dc:date>2007-11-15T19:31:09-06:00</dc:date>
	        </item>
            <item rdf:about="http://blog.bwtaylor.com/2007/11/11/road_maps_are_important">
	    <title>Yes you do need a Product Road Map</title>
	    <link>http://blog.bwtaylor.com/2007/11/11/road_maps_are_important</link>
        <description>&lt;p&gt;You&#39;ve got to love David Heinemeier Hansson. He may be the new Mark Fleury: always ready to give you his opinion on why everything you know and do is wrong. His latest: a little &lt;a href=&quot;http://www.37signals.com/svn/posts/694-you-dont-need-a-product-road-map&quot;&gt;essay&lt;/a&gt; on why product road maps are harmful. 
&lt;/p&gt;

&lt;p&gt;While it&#39;s good to question the sacred cows, I&#39;m not so sure that 37signals has really sustained growth over a long enough period of time to deserve any special credibility in this arena. There is an arrogance that often comes to upstarts who produce some innovations and get market success and I suspect DHH is surfing in the wake of his own big head on this one. You would think that if it actually worked to ignore customer input and just innovate, that it wouldn&#39;t have taken until 2007 to discover it. Certainly there has been no shortage of really smart people who tried to ignore their customers (I just can&#39;t remember any who were successful over the long laul). Yet it seems like the old rich guys all say the same thing: listen to your customers like they are God, because they are.&lt;/p&gt;

&lt;p&gt;The problem with DHH&#39;s argument is that it is a cynical straw man. He assumes that having a road map and peddling vaporware are the same thing. They are not. The fact that road maps can be and are often abused by &quot;bullet point&quot; management only proves that the abuse is bad, not tool used by the abuse. Good companies almost by definition execute well on their road maps. &lt;/p&gt;

&lt;p&gt;I suspect &quot;most people can make do without [a road map]&quot; is the kind of idea that only occurs to small companies who are growing really fast. While you have the big growth, you tend to take customers for granted, though most don&#39;t have the nerve to celebrate it like DHH. If you lose a few customers in that situation, who cares: you can&#39;t grow fast enough to accommodate them all anyway. Unfortunately, the problem with this is that it never lasts and sooner or later you&#39;ll wake up and find you aren&#39;t the hot thing anymore, and you&#39;ll realize that your customers have no loyalty because you&#39;ve treated them like crap for years in terms of discussing their needs, desires, and goals. Once the market buzz has died, it&#39;s a whole lot better to be eBay than AOL.&lt;/p&gt;

&lt;p&gt;DHH compares software product road maps to big upfront software design in the derided waterfall software development methodology. By the way, I recently saw Dan Pritchett of eBay say that they use waterfall. He was almost apologetic about it, during a talk about how they solve their insane scalability problems, but I digress. Even assuming that big design up front is bad for software design, I disagree with the point. Product management and software design are not at all similar. Examine java: it&#39;s hardly developed waterfall style. Most of the agile principles out there originated or found early homes in the java community. Yet java has a roadmap created by the Java Community Process and Sun&#39;s (and IBM&#39;s and BEA&#39;s and Oracle&#39;s) business strategies. The road map serves as a direction to unify cooperation. It makes the strategy tangible. &lt;/p&gt;

&lt;p&gt;Want to know what&#39;s going to be in Java 7? It&#39;s there in detail. Want to know what&#39;s going to be in Java 8? It&#39;s there too. See something you like and want to help, click the link. For example, coming is JVM support for for dynamically typing for scripting language support, which will make groovy and jruby substantially faster. Did Sun have a road map when they hired the jruby team? Yes, you bet they did. And jruby is already at par performance-wise with ruby, and Glassfish will leverage this to be the most scalable app server for rails. Did they have a road map when they added ruby support to the Netbeans IDE? Yes, you bet they did. Did Java have a road map when they created groovy? Yes, it&#39;s called JSR-241. If DHH really believes that road maps are harmful, I suspect he&#39;s happy that there seems to be a road map within the java community of equaling or bettering all of the purported innovations of RoR within the java stack. Sooner or later, no matter who you are and how gifted, one of your competitors will innovate and jump ahead of you in some area. What do you do then? If you are smart and humble, you put closing the gap on your road map and rally your people on how to do it. If you want to lead, you have to tell people generally where you are going, unless you want to attract sheep. Maybe you do, but sheep aren&#39;t that lucrative.&lt;/p&gt;

&lt;p&gt;Nobody can sustain their business on ground breaking innovation year after year. Do companies that innovate more do better, yes. Can innovation jump start you from where you are? Yes. Is innovation the only thing that matters, long term? No. Once you&#39;ve innovated, you&#39;ve got to get and keep customers. Tivo is a great example of an IT company that missed this point. The jury is still out on whether Rails has any long term staying power. I predict Rails is more like Tivo than like the Macintosh, but we&#39;ll see.&lt;/p&gt;

&lt;p&gt;The simple fact is that people don&#39;t spend money on non-commoditized things unless they have confidence in the road map. That includes both customers and investors. I have personally been part of several large dollar purchases of software (the kind will more than one comma in the price), and you can be damn sure we asked vendors about and factored into our decisions the vendor&#39;s road map. The road map tells you whether they understand you or not. If you don&#39;t want me as a customer, don&#39;t have a road map. &lt;/p&gt;
</description>
	    <dc:date>2007-11-11T04:26:08-06:00</dc:date>
	        </item>
            <item rdf:about="http://blog.bwtaylor.com/2007/10/28/css_2007">
	    <title>Reflections on the Colorado Software Summit 2007</title>
	    <link>http://blog.bwtaylor.com/2007/10/28/css_2007</link>
        <description>I just returned from my third visit to the Colorado Software Summit. 2007 was another great year. This conference is unlike any other: it&#39;s just a bunch of developers talking shop. There are other conferences that try to do this, but this one seems to have the best speaker quality by far. I always have a strange feeling when I come back from this conference: it&#39;s sort of humbling to in an intimate setting with so many heavy hitters, yet it&#39;s sort of emboldening to have so much knowledge poured into your head in one week. &lt;p/&gt;

The opening keynote was a &quot;big picture&quot; talk by John Soyring of IBM. I really don&#39;t think I can summarize it without writing a whole blog on it other than to say: there are big social forces that require changes to our computing and programming models. The main keynote was given by Simon Phipps of Sun. He&#39;s the guy that lead the effort to GPL java, so he&#39;s on my &quot;you rock&quot; list. His main point: open source is going beyond main stream to the dominant paradigm. Like it or not, this means legal challenges. Patents and trademark issues matter now and we&#39;d better learn better ways to deal with them. &lt;p/&gt;

A big topic this year was REST. I went to three talks on this, which reminds me that I need to finish my blog series on this. It seems that several people believe that REST is or will be the basis of &quot;Web Services 2.0&quot; (as Scott Davis put it). I was really hoping to understand the implications of REST&#39;s Uniform Interface better, and I certainly made progress, but I&#39;m still struggling with translating the technical differences between it and than the SOAP approach (which I think I fully understand) into useful advice on what the architectural pros and cons are. Since I&#39;m on record in this blog as saying that service contracts are the big problem that has to be solved for REST to take first chair from SOAP inside the enterprise, I was keen to here talk of these solutions. Most speakers acknowledged that there is more interest in this lately and talked about WSDL 2.0 or WADL. I also got a new idea that I need to consider more deeply: using ATOM for data and embed schema information within it. This is sort of a half-contract: it&#39;s uniform behavior on custom objects. I kind of like the idea of a &quot;standard contract&quot; on behavior.&lt;p/&gt;

Dan Pritchett, aka &quot;the eBay guy&quot; gave several talks. His talks all concerned challenges that eBay faced as it tried to scale. It&#39;s interesting to know that eBay runs on Java and Oracle, with the Java using Tomcat running servlets. eBay&#39;s search is comparable in magnitude to Google&#39;s (they may even answer more searches). Their search infrastructure is really interesting: they message their data in a &quot;rows and columns&quot; grid with data partitioning and replication, and the replication crosses data centers. They use different indexes for different use cases. Changes are messaged to each node and applied locally by a custom search engine indexer. Dan said they had to go to this model over the centralized index building because the latency and bandwidth involved in pushing index out with all the updates they do was a killer. &lt;p/&gt;

I consider mastery of a subject to mean knowing when to sacrifice the sacred cows, and Dan&#39;s discussions on ACID vs BASE transactions really impressed me. Since we were all little kids, we&#39;ve been told that the quintessential example of two-phase commit (e.g. using XA) is transferring money from one account to another in a different database. eBay basically rejected this as unworkable at scale and came up with a rigorous way to meet their needs without it. &lt;p/&gt;

I went to a couple talks on messaging technologies. For JMS, ActiveMQ really seems like a no brainer for best-of-breed. It has beautiful Spring integration, features galore including many for HA environments, and lots of flexibility. I just wish I could get one of the STOMP clients to work from python. I still have a couple more to try. I was also impressed by AMQP, which will likely bring us platform independent fully featured messaging. I hope the JMS vendors take note and play ball with it. Gregor Hohpe gave a great look at some coding patterns for event driven programming. He has this way of making you feel like it&#39;s obviously dumb that we aren&#39;t all using messaging and event driven architectures as the norm. &lt;p/&gt;

Progress in the XML technologies is slow, but steady, and a couple sessions hit  on this. XQuery is looking quite useful as a way to turn XPath 2.0 into a query language. XSLT 2.0 also harnesses XPath 2.0 and may be a little more grokable. I think I have had to restudy XSLT 1.0 at least five times as it just doesn&#39;t &quot;stick&quot; in my brain due to it&#39;s unnatural programming model. I&#39;m very optimistic that XSLT 2.0 improves this. Noel Bergman gave a really good overview of the state of SOAP standards and the progress of the WS-I interoperability efforts. He also gave one of the talks on REST, which is probably not a coincidence.&lt;p/&gt;

In the &quot;that&#39;s just cool&quot; category: both grails and google gears look like good technologies to learn more about. One thing that grails uses that I&#39;m really enamored with is gant. I&#39;ve been dabbling with mixing in groovy to our build at work and gant takes this one step farther and turns it upside down: you mix in ant ot your groovy build scripts. I&#39;ve tried twice to drink the Maven kool-aid (but couldn&#39;t swallow it), but now I think I&#39;m going interested in with the other direction. Gears is most often viewed as an offline client tool, but I see it as having more impact as rich browser side caching.&lt;p/&gt;

Matt Raible gave his updated talk comparing web frameworks. He had some criteria for when to use different classes of frameworks and based on those, I think the project I&#39;m on now at work chose well to go with GWT. Matt made two really useful observations: First, with the rise of high quality javascript libraries (e.g. Ext, YUI, Scriptaculous) it becomes easier to switch web frameworks while keeping view layer skills (and look and feel) intact. Second, your team will get a bigger productivity increase by shutting off email, canceling meetings, and using better computing resources than it will by changing to the next great web framework of the day.&lt;p/&gt;

Some of the other cool topics I learned a little more about: Eclipse plugin writing and grid computing. It looks like it&#39;s easier to develop an eclipse plugin than it is to think of something that needs an Eclipse plugin. &lt;p/&gt;

I&#39;m also already sold that groovy is important, but I picked up some power user examples of groovy. Eric Schreiner did an awesome example of the groovy XML builder where he took a map of item/value pairs and produced an SVG chart in a rediculously small amount of code.&lt;p/&gt;

As always, I love this conference as a way to &quot;scan the horizon&quot; for frameworks, toolkits, and solutions that I hadn&#39;t heard of before or need to &quot;bump up&quot; my interest level on. Here&#39;s my list of &quot;cool things to check out&quot;:&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://mina.apache.org/&quot;&gt;Apache Mina&lt;/a&gt;, a high performance and high scalability network applications framework&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://activemq.apache.org/camel/&quot;&gt;Apache Camel&lt;/a&gt;, a rule based routing and mediation engine. Sort of &quot;EIP in a box&quot;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://esper.codehaus.org/&quot;&gt;Esper&lt;/a&gt;, an event stream processing tool in the Complex Event Processing category.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.gridgain.com/&quot;&gt;Gridgain&lt;/a&gt; open source grid toolkit with a cool example on &lt;a href=&quot;http://216.93.179.140:8080/wiki/display/GG15UG/Distributed+JUnit+Overview&quot;&gt;distributed unit testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Some AMQP implementations: &lt;a href=&quot;http://cwiki.apache.org/qpid/&quot;&gt;QPID&lt;/a&gt; (in java) and &lt;a href=&quot;http://www.rabbitmq.com/&quot;&gt;RabbitMQ&lt;/a&gt; in Erlang &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.eclipse.org/eclipselink/&quot;&gt;EclpseLink&lt;/a&gt;: Hibernate may not be the best JPA implementation&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://exist.sourceforge.net/&quot;&gt;eXist&lt;/a&gt;, an open source native XML database, with XQuery support.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://gant.codehaus.org/&quot;&gt;GANT&lt;/a&gt; the groovy/ant build system, as seen in &lt;a href=&quot;http://grails.codehaus.org/&quot;&gt;Grails&lt;/a&gt; like RAILS but based on java/spring/hibernate&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://developer.yahoo.com/yslow/&quot;&gt;YSlow&lt;/a&gt; a firebug plugin that analyses web pages for performance best practices&lt;/li&gt;
&lt;/ul&gt;


</description>
	    <dc:date>2007-10-28T01:24:41-05:00</dc:date>
	                                <wfw:comment>http://blog.bwtaylor.com/blojsom/commentapi/spout/java/2007/10/28/css_2007</wfw:comment>
            <wfw:commentRss>http://blog.bwtaylor.com/2007/10/28/css_2007?page=comments&amp;flavor=rss2</wfw:commentRss>
            </item>
            <item rdf:about="http://blog.bwtaylor.com/2007/09/23/ruby_meet_erlang">
	    <title>Rails, the 15 minutes is Almost Up. Meet Erlang.</title>
	    <link>http://blog.bwtaylor.com/2007/09/23/ruby_meet_erlang</link>
        <description>I just bought the latest book on Erlang from the pragmatic progammers. If you haven&#39;t heard, Erlang is a functional programming language that has some unique architectural constraints that make it work really well with parallelism and concurrency. Erlang is &quot;hot&quot;. This post isn&#39;t about Erlang, other than to note that it&#39;s what concludes the hype phase that has made Ruby on Rails the darling of fanboys everywhere and an annoyance to the rest of us. This means Ruby and Rails are going to have to stop riding on the wave of excitement by being the latest new thing and are going to have to start impressing people who have already heard about it, tried it, and unlike the fanboys, thought &quot;nya -- needs some work, I&#39;ll check back in a few years&quot;. &lt;p/&gt;

You gets a lot of attention when you mouth off the way the rails zealots have. You get a lot of attention for a while, that is, until then everybody gets tired of you, exposes your flaws, and waits to see how you do fixing them in a climate of criticism. One of the reasons I still like and use java, despite its  problems, verbosity, and all that, is that when valid criticisms are leveled against java, the people in the java community don&#39;t make excuses, they slowly quietly address the problems. That&#39;s a sign of maturity, and Ruby and Rails need to get it or they aren&#39;t going to be talked about in five years. &lt;p/&gt;

In terms of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Gartner&#39;s_Hype_Cycle&quot;&gt;Gartner Hype Cycle&lt;/a&gt;, Ruby and Rails are nearing the end of the &quot;Peak of Inflated Expectations&quot; and are moving into the &quot;Trough of Disillusionment&quot;. For evidence, here&#39;s an article by a PHP guy  who &lt;a href=&quot;http://www.oreillynet.com/ruby/blog/2007/09/7_reasons_i_switched_back_to_p_1.html&quot;&gt;switched back&lt;/a&gt;. That is NOT supposed to happen.&lt;p/&gt;

My experience with Ruby is that I read the pick-axe book four or five years ago, before Rails, played with it, liked it, and added a few other books too. I liked ruby&#39;s syntax - very efficient for the original writer. I had my doubts about using it in team settings with code maintained over years. I&#39;ve used Ruby to solve production problems in business settings on several occasions. I never considered adopting Ruby as my &quot;main&quot; language, for reasons I&#39;ll expound on below. &lt;p/&gt;

Then Rails appeared. Frankly, Rails ruined my enjoyment of Ruby because it attracted so many fanboys and zealots. The folks were making outrageous and ridiculous claims and were so arrogant about how Ruby would be the Java killer. These folks jumped the shark this week, with the posting of &lt;a href=&quot;http://www.jroller.com/obie/entry/top_10_reasons_why_java&quot;&gt;Top 10 Reasons Why Java Sucks Ass&lt;/a&gt;. Thank you Obie, for being so absurd that no one can deny  how absurd the hype around Rails has been. &lt;p/&gt;

Now that the industry has played with Ruby and Rails seriously, the problems of Ruby and Rails have become well known. They are:&lt;ul&gt;
&lt;li&gt; No high quality app server &lt;/li&gt;
&lt;li&gt; No language specification.&lt;/li&gt;
&lt;li&gt; Custom runtime VM that isn&#39;t supported by any well resourced organization&lt;/li&gt;
&lt;li&gt; Open source is not a substitute for open standards at the language or runtime engine level. &lt;/li&gt;
&lt;li&gt; You can quickly write code than nobody can understand, and several years later, people have done exactly that &lt;/li&gt;
&lt;li&gt; Duck typing doesn&#39;t save code, as it requires more unit tests or occasionally blows up on you&lt;/li&gt;
&lt;li&gt; Mixins aren&#39;t so great: A class&#39;s state and behavior specification shouldn&#39;t depend on its runtime history. I shouldn&#39;t need unit tests to verify my class can do what I think it&#39;s supposed to do - the unit tests waste more time than I save. Java&#39;s new static imports are a much better solution. &lt;/li&gt;
&lt;li&gt; Total lack of high quality enterprise features: transaction support is weak, SOAP support is weak, messaging is weak, caching solutions are weak, directory integration is weak, clustering is weak, multithreading is weak, etc...&lt;/li&gt;
&lt;li&gt; What do I do in the real world where my database already exists with 8 years of data in it and I can&#39;t design my schema to match the Rails opinions of what&#39;s best? &lt;/li&gt;
&lt;li&gt; Dynamic typing and Mixins make it nearly impossible to have tool assisted refactoring and good code completion. They are appropriate for small tasks with a low reuse quotient for 3rd party code (aka non-enterprise development). &lt;/li&gt;
&lt;li&gt; Opinionated software is great, if you are a follower-the-leader type who doesn&#39;t want to think about what&#39;s really best to solve your problem. &lt;/li&gt;
&lt;li&gt; Overuse of DSL&#39;s and embedding DSL&#39;s in regular code basically assure difficulty in maintenance. Your DSL&#39;s aren&#39;t as obvoius as you think. The reason everybody hates XML in java is not because it&#39;s XML (they don&#39;t complain about XHTML or RSS do they?) it&#39;s because they are really DSL&#39;s, but at least with editor support. &lt;/li&gt;
&lt;li&gt; Ruby is unbelievably slow. Slow. Slow. Slow. Don&#39;t say it doesn&#39;t matter because the database is slower, because it does matter. Ruby is like 6-7 times slower than Java. 2-3 times slower than Python and Perl. &lt;/li&gt;
&lt;li&gt; Reliability and scalability are crummy &lt;/li&gt;
&lt;/ul&gt;

The funniest thing about the above list is that the Ruby app servers are so bad that what&#39;s going to end up happening is that the Java app servers will bolt on JRuby support and Rails will simply be absorbed into the borg that is Java. If you run Glassfish, Rails is just another java library! That&#39;s really, really funny. Nya-Nya to the &quot;java sucks&quot; fanboys! Once they go away, I might actually take up Ruby again -- if the Ruby community shows some interest in solving some of the problems above. Not all of them -- just show me you can listen. &lt;p/&gt;&lt;p/&gt;

It turns out that it was easier for Java to bolt on the few innovations that Ruby offered than for Ruby to absorb the many innovations that Java has offered over the years. I think the end result of Ruby is that it killed perl, and forced PHP developers to improve their sophistication (see the article from the guy who switched back to PHP). Unfortunately, it stunted the growth of enterprise language solutions in Python. Python is a lot more maintainable than Ruby, by the way. Ruby&#39;s effect on Java has been positive. The concepts of reasonable conventions are being used more. Groovy is looking good (better than Ruby except for being even slower). Most of all, Ruby has forced Java framework makers to think about simplicity, and they have. Ruby is helping make REST more mainstream. REST has a fanboy problem too, but with a lot of work could become a viable alternative to SOA. The final benefit of Ruby is that JDK 7 will finally bring closures to Java.&lt;p/&gt;

Speaking of closures... That&#39;s why I&#39;m reading a book on Erlang. Ruby touts closures as their biggest strength, but if you buy into that, you should be using functional programming languages. Erlang (and Haskell and all the FP languages) are better for the purity of their closures than Ruby. Erlang gets other things right that Ruby struggles with. Ruby threading is a mess. Erlang gets this deeply and emphatically right (even Java should take note).  Unlike Ruby, which falters as it tries to move up to enterprise settings, Erlang as been used for 10 years in carrier grade telecommunications applications with many 9&#39;s of reliability. Erlang is Rock solid. As in: bet your company on the fact that your apps won&#39;t be down EVER. &lt;p/&gt;

Do I think Erlang will take over? No. People are starting to expose it&#39;s flaws too. But this isn&#39;t as fun as doing so for Ruby, because it&#39;s origins in telecom make it immune to false euphoria. But, grid computing and multi-core processing are moving IT towards Erlang&#39;s strength. Erlang&#39;s unique insistence on non-reassignable variables allow it to deliver fault tolerance, concurrency, and parallelism that give it something that will not be easy to bolt on to Java.  While functional programming can be added to Java. Though Scala is looking really interesting at bring FP to the JVM and it&#39;s performance doesn&#39;t disappoint like Ruby/Groovy, Erlang&#39;s inherent concurrency cannot be casually added the way many of the Rails innovations could be, and this means Erlang will have a suite spot that cannot be assimilated into the borg. &lt;p/&gt;

But this article is not really about Erlang. Erlang is here as a foil, and for it&#39;s cultural impact: the biggest feature that Erlang offers at this moment is that it will bring to a close the Rails 15 minutes of fame. Every time some Rails fanboy starts peddling their hype, the approved thing to do is to respond with Erlang. There is nothing sweeter than dropping the credible innuendo that hype is transient and fleeting and is almost over. &lt;p/&gt;

And because Erlang is old school telecom stuff, it will come without the fanboy culture. There something really refreshing about the the fact that it&#39;s a telecom industry&#39;s solution. After Ruby on Rails, it&#39;s hip and trendy to be stodgy and uncool, and Erlang fits the bill. Unsexy is sexy. God bless Erlang.&lt;p/&gt;
</description>
	    <dc:date>2007-09-23T11:29:42-05:00</dc:date>
	        </item>
    
</rdf:RDF>
