<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4857601802022051593</id><updated>2011-12-01T08:27:48.074-08:00</updated><category term='Hibernate'/><category term='Avaje'/><category term='EBean'/><category term='JPA'/><category term='Persistence'/><category term='ORM'/><title type='text'>Chandika's thoughts on Software Engineering</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cmendis.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4857601802022051593/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://cmendis.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Chandika</name><uri>http://www.blogger.com/profile/04144077435682878926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_yUg5F-q0nx0/S3GCn5BPHdI/AAAAAAAAAAM/smxDdzYvSPo/S220/profile.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4857601802022051593.post-3296013280928358257</id><published>2011-11-30T20:00:00.000-08:00</published><updated>2011-12-01T08:27:48.185-08:00</updated><title type='text'>Document centric NoSql databases and SOA</title><content type='html'>I &lt;a href="http://cmendis.blogspot.com/2010/02/losing-plot-on-soa.html"&gt;previously blogged&lt;/a&gt; about some of the common mistakes in the journey towards a Service Oriented Architecture.&lt;br /&gt;I have recently been very interested in the NoSQL movement and have taken a stab at trying out MongoDB which belongs to the document databases category. I'm not going to discuss NoSQL or MongoDB here - there's enough material out there on those. A key insight or epiphany for me is the excellent alignment between document centric databases and the SOA paradigm.&lt;br /&gt;&lt;br /&gt;Let's take a common scenario, "placing an order". In the RDBMS world, when you think of "placing an order" you automatically think in terms of entities and relationships and how they are impacted. You attempt to take a "God view" looking at all the interactions across entities and their complexities. You almost have to force yourself to think of storing a snapshot of customer information such as address etc. as part of the order as  the requirement entails versus having a reference to the address - the two approaches resulting in two very different business consequences. The Order itself will span multiple tables independent of the corresponding master tables, making the relational design quite complex. When implementing your logic, you will typically use an ORM technology and will invariably struggle with the complexities introduced by the Object-Relational Impedance mismatch.&lt;br /&gt;&lt;br /&gt;SOA is inherently business process and document centric. The act of placing the order is broken down into a business process spanning many services rather than a single transaction - for example, customer credit check,  inventory check and reservation, payment,  inventory adjustment etc. This results in a significant improvement in simplicity, even though you have to think through the exception scenarios, which are also usually managed as well defined business processes.  In the SOA world, you imagine the order as an order document, with customer, billing and shipping information as embedded parts of that order (very much aligned to Object Oriented thinking).  In a Document database world, your design for this becomes amazingly simple, fully aligned to the conceptual thought process. Thus it makes a huge amount of sense to use a document centric database for document centric services. This is obviously a significant paradigm shift and requires that we unlearn (at least temporarily forget) some of our many years of learning and assumptions. The key is that NoSql has given us a canvas of options where previously there was only one. As in the above example, if we keep an open mind about using the right tool for the job, we could end up significantly simplifying system design. &lt;br /&gt;&lt;br /&gt;&lt;u&gt;References&lt;/u&gt; &lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.mongodb.org/display/DOCS/Schema+Design"&gt;Schema design in mongoDB&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.nosqldatabases.com/main/2011/1/6/q-a-with-kenny-gorman-data-architect-for-shutterfly-inc.html"&gt;Good perspective on NoSQL- a Q&amp;amp;A with Kenny Gorman,   Data Architect for Shutterfly&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/morphia/wiki/QuickStart"&gt;Morphia- a POJO persistence mapper and API for Java&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4857601802022051593-3296013280928358257?l=cmendis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cmendis.blogspot.com/feeds/3296013280928358257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cmendis.blogspot.com/2011/11/document-centric-nosql-databases-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4857601802022051593/posts/default/3296013280928358257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4857601802022051593/posts/default/3296013280928358257'/><link rel='alternate' type='text/html' href='http://cmendis.blogspot.com/2011/11/document-centric-nosql-databases-and.html' title='Document centric NoSql databases and SOA'/><author><name>Chandika</name><uri>http://www.blogger.com/profile/04144077435682878926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_yUg5F-q0nx0/S3GCn5BPHdI/AAAAAAAAAAM/smxDdzYvSPo/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4857601802022051593.post-116473977762299742</id><published>2011-10-07T11:00:00.000-07:00</published><updated>2011-10-08T07:41:00.201-07:00</updated><title type='text'>Don't under-estimate the power of the underdog frameworks</title><content type='html'>&lt;p&gt;I blogged previously about Avaje EBean framework, an "off-the-beaten-track" persistence framework that provided several fundamental advantages against Hibernate/JPA. Ran into a similar scenario recently on the UI framework front. Had a chance to look at Apache Stripes. Love the simplicity of this framework. It uses convention over configuration and avoids the XML hell that is so common in most frameworks. It provides the important features of a web framework in a very simple easy to understand manner:&lt;/p&gt;&lt;br /&gt;&lt;li&gt;URL to Controller mapping - mapping URLs to controller methods is extremely simple. There is a default mapping mechanism based on naming convention which is sensible, which can be easily over-ridden using annotations. Even extracting parts of the URL into parameter variables for the controller method is simple and declarative, making it easy to implement REST services.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Data binding - data binding is extremely simple - it maps the "names" of the controls in the JSP page to javabean properties in the controller. The beauty of it is that it can map variables any level deep. This means you can reuse domain class objects as is within the controller rather than having to introduce another layer of classes. Button actions are also mapped to controller methods using simple name matching. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Easy to understand control flow - in most frameworks, the controller method will return a "logical" path name which will be mapped to the actual JSP page in an XML file, making it difficult to read through and understand the control flow. Stripes controller methods return "Resolutions" - the type of resolution makes it obvious where it will go next. eg. ForwardResolution, RedirectResolution, StreamingResolution etc. - very easy to create your own resolutions (eg. JSonResolution). Dont you love it when code is self explanatory and you have the full power of intellisence, rather than having to read through unnecessary levels of indirection to understand? Sample code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    public Resolution addition() {&lt;br /&gt;        result = getNumberOne() + getNumberTwo();&lt;br /&gt;        return new ForwardResolution("/quickstart/index.jsp"); //you know what exactly happens next!&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Very simple layout - layout tags in Stripes are very simple and straightforward.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;Ofcourse, Stripes is still an action oriented web framework. If you're looking for a component oriented framework, you will have to look at other alternatives (JSF, Wicket, Click etc.). My minimalistic preference is Stripes, and for reuse at the UI level, use JSP tag files.&lt;br /&gt;&lt;br /&gt;Steve Jobs quote: "Simple can be harder than complex: You have to work hard to get your thinking clean to make it simple. But it's worth it in the end because once you get there, you can move mountains"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4857601802022051593-116473977762299742?l=cmendis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cmendis.blogspot.com/feeds/116473977762299742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cmendis.blogspot.com/2011/10/dont-under-estimate-power-of-underdog.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4857601802022051593/posts/default/116473977762299742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4857601802022051593/posts/default/116473977762299742'/><link rel='alternate' type='text/html' href='http://cmendis.blogspot.com/2011/10/dont-under-estimate-power-of-underdog.html' title='Don&apos;t under-estimate the power of the underdog frameworks'/><author><name>Chandika</name><uri>http://www.blogger.com/profile/04144077435682878926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_yUg5F-q0nx0/S3GCn5BPHdI/AAAAAAAAAAM/smxDdzYvSPo/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4857601802022051593.post-8476346435214386973</id><published>2011-07-19T19:27:00.000-07:00</published><updated>2011-07-19T19:45:46.657-07:00</updated><title type='text'>More on Code Quality</title><content type='html'>&lt;p&gt;Is Code Quality, like beauty, in the eyes of the beholder? Perhaps not as much, but there is a significant amount of subjectiveness in any assessment of code quality. Technical leaders need to be aware of the many layers of code quality: &lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Coding conventions and standards&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Adherance to the best practices of the programming language and paradigm &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Optimal algorithms and design &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Architectural and cross-cutting concerns &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Static analysis provides a convenient way to improve layers (1) and (2) in a scalable manner. These tools are meant to reduce the noise and help technical leaders focus on the more important layers (3) and (4), which invariably require a deep-dive/manual review. I've covered the dangers of over-reliance on these tools in my &lt;a href="http://cmendis.blogspot.com/2010/03/code-quality-bridge-collapse.html"&gt;previous blog post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So what should you do if the static analysis tools come out with a bad report on your code?The most common mistake in this scenario is to focus the team on immediately fixing the layer (1) and (2) issues. It's easy to fall in to the trap of focussing on just those areas, that are immediately visible to the managers. Instead, this should be read as a warning sign of much worse things in layers (3) and (4), and the first order of activity should be to do a deep dive to figure out the more critical issues in layers (3) and (4). Fixing should prioritize on the most impactful areas across the four layers rather than just those immeidately visible to the "managers". For example, it's far more important to fix connection leaks and exception and logging issues than it is to fix a coding style issue. This is not to say the style issue should not be fixed - that should be a given. Setting a design right after the fact, however is a complicated and risky proposition, and that is where the technical leader's good judgement comes into play. I've seen technical leaders either shy away from this difficult decision, or become a cowboy and plunge right in, without the safeguards in place. Unit testing is your best friend when engaging in such a refactoring job. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Ofcouse, as always, an ounce of prevention is far better than a pound of cure. A deep dive into the first 100-500 lines of code written by the team and regular reviews thereafter is the best safeguard against code quality going astray later on. The paradox of code quality is that although the architecture and design is usually done by senior technical leaders in the project, the entire team including the junior-most engineer need to understand this in order for the code to come out good. Strong leadership and communication traits are essential to drive this common vision and understanding among the team and prevent the disaster caused by poor code quality.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4857601802022051593-8476346435214386973?l=cmendis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cmendis.blogspot.com/feeds/8476346435214386973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cmendis.blogspot.com/2011/07/more-on-code-quality.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4857601802022051593/posts/default/8476346435214386973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4857601802022051593/posts/default/8476346435214386973'/><link rel='alternate' type='text/html' href='http://cmendis.blogspot.com/2011/07/more-on-code-quality.html' title='More on Code Quality'/><author><name>Chandika</name><uri>http://www.blogger.com/profile/04144077435682878926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_yUg5F-q0nx0/S3GCn5BPHdI/AAAAAAAAAAM/smxDdzYvSPo/S220/profile.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4857601802022051593.post-1632951210089783156</id><published>2010-10-02T06:56:00.001-07:00</published><updated>2010-10-03T07:33:50.082-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Persistence'/><category scheme='http://www.blogger.com/atom/ns#' term='Avaje'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><category scheme='http://www.blogger.com/atom/ns#' term='EBean'/><title type='text'>Persistence Revisited</title><content type='html'>Persistence technology has become such a commodity today that the decision to use a popular open source product such as Hibernate is usually taken for granted. There may be simpler use cases with the requirement to use a legacy database and/or complex SQL queries where Ibatis makes more sense. I always had the uncomfortable feeling that there were pros and cons that seemed mutually exclusive between the two approaches. For instance, shouldn't the exact columns retrieved from the database really depend on the specific use-case, rather than through a common lazy or eager mapping? An ORM persistence layer should simply be a mechanim to retrieve and modify the bare minimum object graph that is required for a usecase. Databases have many levels of performance optimization that become infeasible if unnecessary data is retrieved. I've also seen newcomers struggle to understand how the ORM lifecycle works - and how operations such as merge actually works under the hood - making many mistakes along the path to learning the framework. Somehow, things seem to have gotten too complex not to mention sub-optimal from a performance point of view in the Hibernate/JPA world. In the direct SQL approach, it seems a waste not to have the intelligence about the tables and their relationships defined just once - instead of being taken into consideration in each query. Also working with a proper object model is much more simpler and maintainable than datarows/records from tables. For example, whether two tables should be inner-joined or outer-joined to obtain an extended object graph should simply be a function of the optionality of their relationship. So an ideal persistence layer would work with a properly defined object model but provide a simple API to retrieve and save an object graph in an optimal manner without too many hidden surprises. Also isn't it a common use case to have reference data that is read-only and thus shared - rather than object instances being created each time they are referred to in a query? What a waste!&lt;br /&gt;&lt;br /&gt;Avaje EBean ORM layer seems to have hit the seemingly idealistic middle ground. It uses JPA like annotations to define the mapping but provides a much simpler API and some key features missing from JPA. EBean allows Partial (read, optimal) fetching not just for the root object but for any object in the graph. Has a background fetching feature that can be used in a stateful pagination mode. Caching strategy can be optimized not to make copies for read-only objects. Nice. You also have control to flush specific parts of the cache if the database is modified external to the Ebean mechanism (eg. by calling a stored procedure). Let's face it - real world applications invariably end up having some functionality that is best done in Stored Procedures. All of these are such basic common sensical features you need in order to get the convenience and maintainability of ORM without compromising the performance of direct SQL. Ofcourse, Avaje ORM layer is definitely off the beaten track - and carries some level of risk compared to more popular frameworks like Hibernate or TopLink (primarily in the amount of information available and accessible on the web). It definitely deserves praise for filling a big void IMHO. Read more about it &lt;a href="http://www.avaje.org/doc/ebean-userguide.pdf"&gt;here&lt;/a&gt; and do give it a shot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4857601802022051593-1632951210089783156?l=cmendis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cmendis.blogspot.com/feeds/1632951210089783156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cmendis.blogspot.com/2010/10/persistence-revisited.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4857601802022051593/posts/default/1632951210089783156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4857601802022051593/posts/default/1632951210089783156'/><link rel='alternate' type='text/html' href='http://cmendis.blogspot.com/2010/10/persistence-revisited.html' title='Persistence Revisited'/><author><name>Chandika</name><uri>http://www.blogger.com/profile/04144077435682878926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_yUg5F-q0nx0/S3GCn5BPHdI/AAAAAAAAAAM/smxDdzYvSPo/S220/profile.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4857601802022051593.post-437997095100782138</id><published>2010-03-25T00:04:00.000-07:00</published><updated>2010-03-25T02:01:31.962-07:00</updated><title type='text'>Code Quality bridge collapse</title><content type='html'>Henry Petroski popularized an interesting theory that there is a spectacular bridge collapse every 30 years. There are some very convincing datapoints behind this observation:  The Tay Bridge in 1879, the Quebec bridge in 1907, the Tacoma Narrows bridge in 1940 etc. The reasoning is that engineers tend to get over confident over time and start stretching the boundaries of a new technology and start making unreasonable trade-offs between cost and safety  until it gives way at some point. In the case of civil engineering, the results of the compromises made come back to bite much later.&lt;br /&gt;&lt;br /&gt;The general principle seems to apply to Software Engineering as well, only the collapse will come much earlier than 30 years! Take the following classic example from a simple process improvement initiative:&lt;br /&gt;&lt;br /&gt;Take a team with a partially effective manual code review process that is starting to leverage automated tools for static analysis. Initial results will be very positive. The automated process/tool will improve coverage and will be used as a mechanism to optimize the manual reviews. Rather than selecting code randomly, manual reviews will be done on the code blocks that show the most amount of complexity, duplications, best practice violations etc.  The result will be more effective code reviews leading to improved code quality.&lt;br /&gt;&lt;br /&gt;Slowly but surely over-confidence will set in as there are no observed code quality failures over a period of time. Manual code reviews themselves will start getting compromised as long as the automated metrics are within "reasonable" range - effectively compromising quality to reduce the cost.  The ingredients are thus in place for a code quality bridge collapse.&lt;br /&gt;&lt;br /&gt;The worst case scenario is that you blame such failures on the automated process or tool and go back to square one.  The ideal solution is to make sure you combine the best of automated and manual processes to get the right balance of quality and cost.&lt;br /&gt;&lt;br /&gt;Yet another important lesson for Software Engineers from the classic civil engineering world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4857601802022051593-437997095100782138?l=cmendis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cmendis.blogspot.com/feeds/437997095100782138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cmendis.blogspot.com/2010/03/code-quality-bridge-collapse.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4857601802022051593/posts/default/437997095100782138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4857601802022051593/posts/default/437997095100782138'/><link rel='alternate' type='text/html' href='http://cmendis.blogspot.com/2010/03/code-quality-bridge-collapse.html' title='Code Quality bridge collapse'/><author><name>Chandika</name><uri>http://www.blogger.com/profile/04144077435682878926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_yUg5F-q0nx0/S3GCn5BPHdI/AAAAAAAAAAM/smxDdzYvSPo/S220/profile.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4857601802022051593.post-2310323949871811225</id><published>2010-02-09T07:44:00.000-08:00</published><updated>2010-02-09T07:52:41.628-08:00</updated><title type='text'>Losing the plot on SOA?</title><content type='html'>Many product development engagements seem to be losing the plot on SOA - concepts of Service Oriented Architecture abused to create systems that are unnecessarily complex and cumbersome to maintain, not to mention perform badly. The major issue is about service granularity and the common mistake of equating "logical services" in an SOA context with "web services".&lt;br /&gt;&lt;br /&gt;Important to be first clear about what I mean by a "logical service". A "logical service" is a "set of functionality" that needs to be managed or may need to be provisioned autonomously. By this definition, a "logical service" will most often equate to a "system", since a system typically is an autonomous unit with a cohesive development/release cycle, persistence store etc. But the important exception to this is in relation to expected integration points. If there is a set of functionality in your system which you feel needs to be optionally supported through some third party integration - that is a good separation point, where a single system should be separated into multiple logical services even though they currently (in the default state) access the same system. All linkages between logical services should ONLY be via the service interfaces and any linkages and joins (also called service orchestration logic) between these logical systems should reside above the logical services. Whether or not you need a full-fledged BPEL orchestration layer for having this orchestration logic can be based on the complexity of the linkages between your logical services and the flexibility required to change that orchestration logic. If you’re designing a new system and want to leverage SOA principles to improve the extensibility and integratability of your application, then this may even not be necessary. If you’re trying to orchestrate end-to-end business processes across diverse logical services, or you're designing a massive ERP with the requirement to sell different pieces separately (with support for integration with other systems), then this makes a lot of sense.&lt;br /&gt;&lt;br /&gt;So what's the relationship between a “logical service” and a “web service”? A logical Service in an SOA context could be organized as a collection of web services to make it easier to manage and access. This does not mean that any dependencies between the functionality of those web services should be done only by making web-service calls! What a total waste that would be?? As long as these web services form a single "logical service", their implementations should be free to use a common business logic layer as well as even a common persistence store, making it possible to write web services that are performant that use the full power of good old SQL etc. This will also ensure that you expose as web services only those services that are crossing the logical service boundary - making the "logical service" itself course grained and light weight from a contract perspective. When trying to carve out logical services, think at the level of current or expected system integrations.&lt;br /&gt;&lt;br /&gt;Here are some of the indicators that you have lost the plot on SOA:&lt;br /&gt;&lt;br /&gt;4) A lot of your business logic is starting to appear in the orchestration layer or your orchestration layer seems to be getting bulkier.&lt;br /&gt;3) You're confused as to why you need a rules engine or a workflow engine when you have BPEL. 2) You are asking yourself why "WS-Transactions" is not better supported in major SOA frameworks or writing a lot of compensating transactions to calls that are eventually going into the same system.&lt;br /&gt;1) You are pulling your hair out trying to essentially do what looks like "joins" in your services/orchestration layer, between services that are underneath going to the same database!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4857601802022051593-2310323949871811225?l=cmendis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cmendis.blogspot.com/feeds/2310323949871811225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cmendis.blogspot.com/2010/02/losing-plot-on-soa.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4857601802022051593/posts/default/2310323949871811225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4857601802022051593/posts/default/2310323949871811225'/><link rel='alternate' type='text/html' href='http://cmendis.blogspot.com/2010/02/losing-plot-on-soa.html' title='Losing the plot on SOA?'/><author><name>Chandika</name><uri>http://www.blogger.com/profile/04144077435682878926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_yUg5F-q0nx0/S3GCn5BPHdI/AAAAAAAAAAM/smxDdzYvSPo/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4857601802022051593.post-1526679006323703233</id><published>2009-07-05T20:53:00.000-07:00</published><updated>2009-07-05T21:21:10.401-07:00</updated><title type='text'>Revisiting the Eclipse vs. Netbeans battle</title><content type='html'>I've been watching the Eclipse vs. Netbeans battle for a long time. Even though I've always been impressed with the coherant and comprehensive set of functionality offered by Netbeans, the one thing that always put me off was performance, even on a decent machine with 4GB RAM.  And ofcourse eclipse always had a bigger following and therefore a bigger mindshare.  As of late, looks like both of these factors have changed!&lt;br /&gt;&lt;br /&gt;I Just tried out version 6.7 of Netbeans and I'm seriously impressed! Performance of Nebeans 6.7 is very decent (even better than eclipse ganymede, even though ganymede had some serious performance improvements as well) and as usual, the functionality, documentation and training (including lots of screencasts) doesn't seem to leave anything to chance. Support for standard frameworks like  Hibernate, Struts, JSF etc. to web services, Java-FX and portlets is top notch. For example, when editing a hibernate mapping file, it will give you intellisence of the fields in the object and columns in the database table that you're mapping (&lt;a href="http://www.netbeans.org/kb/docs/web/hibernate-screencast.html"&gt;view the screencast&lt;/a&gt;)! Lot of the plumbing, adding of the relevant libraries etc. gets done for you when you create a project and add support for the relevant frameworks. It has integrated support for Maven and Hudson. Also impressive is the integrated support for &lt;a href="http://kenai.com/"&gt;Kenai, Sun's alternative to SourceForge&lt;/a&gt;. Integration with Kenai is not only for source control but goes all the way to defect tracking! Nice!!&lt;br /&gt;&lt;br /&gt;Ok, so now I'm impressed with the performance and functionality.  How about adoption? &lt;a href="http://javabyexample.wisdomplug.com/component/content/article/61-select-your-ide-netbeans-vs-eclipse.html"&gt;These stats &lt;/a&gt;seem to suggest an intersting trend - from 2007 onwards, Netbeans has been catching up pretty fast - and as of mid-2008, it has overtaken eclipse.  In places like China, Netbeans is king. I believe Netbeans is already past the tipping point. &lt;br /&gt;&lt;br /&gt;So this time, I'm convinced - Netbeans is going to be a permanent resident on my laptop, to be used as my primary IDE... I'm not uninstalling eclipse yet: there are many speciality things that are written as eclipse plugins (with no NB alternative) for which you would still need your eclipse IDE. If netbeans adoption trend continues as it is, I expect this to also change eventually...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4857601802022051593-1526679006323703233?l=cmendis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cmendis.blogspot.com/feeds/1526679006323703233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cmendis.blogspot.com/2009/07/revisiting-eclipse-vs-netbeans-battle.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4857601802022051593/posts/default/1526679006323703233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4857601802022051593/posts/default/1526679006323703233'/><link rel='alternate' type='text/html' href='http://cmendis.blogspot.com/2009/07/revisiting-eclipse-vs-netbeans-battle.html' title='Revisiting the Eclipse vs. Netbeans battle'/><author><name>Chandika</name><uri>http://www.blogger.com/profile/04144077435682878926</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_yUg5F-q0nx0/S3GCn5BPHdI/AAAAAAAAAAM/smxDdzYvSPo/S220/profile.JPG'/></author><thr:total>3</thr:total></entry></feed>
