<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Nagarro Blog</title>
	<atom:link href="http://www.nagarro.com/blog/rss2" rel="self" type="application/rss+xml" />
	<link>http://www.nagarro.com/blog</link>
	<description>Nagarro blog: software development, design, architecture and usability</description>
	<lastBuildDate>Thu, 11 Mar 2010 02:54:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Nagarro Named a “Rising Star” in IAOP’s 2010 Global Outsourcing 100 List</title>
		<link>http://www.nagarro.com/blog/nagarro-named-a-%e2%80%9crising-star%e2%80%9d-in-iaop%e2%80%99s-2010-global-outsourcing-100-list/</link>
		<comments>http://www.nagarro.com/blog/nagarro-named-a-%e2%80%9crising-star%e2%80%9d-in-iaop%e2%80%99s-2010-global-outsourcing-100-list/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 23:31:17 +0000</pubDate>
		<dc:creator>Vikas Sehgal</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=550</guid>
		<description><![CDATA[This week we announced that Nagarro has been named to the 2010 Global Outsourcing 100® List by the International Association of Outsourcing Professionals® (IAOP®). Nagarro was selected as a “Rising Star,” a category designated for the top 25 emerging companies on the list (the remaining 75 “Leaders” are considered large companies based on revenues and [...]]]></description>
			<content:encoded><![CDATA[<p>This week we announced that <a href="http://www.nagarro.com/NewsEvents/Press%20Releases/Nagarro%20Named%20to%202010%20Global%20O.aspx" target="_blank"><span style="text-decoration: underline;">Nagarro has been named to the </span><span style="text-decoration: underline;">2010 Global Outsourcing 100® List</span></a> by the International Association of Outsourcing Professionals® (IAOP®). Nagarro was selected as a “Rising Star,” a category designated for the top 25 emerging companies on the list (the remaining 75 “Leaders” are considered large companies based on revenues and headcount).</p>
<p>Nagarro is proud to be listed alongside some of the industry’s most highly regarded outsourcing firms. We fared well in evaluations of our HR practices, management team strength and corporate social responsibility programs. But ultimately, we took the greatest pride in being able to provide <a href="http://www.nagarro.com/NewsEvents/News_Events.aspx"><span style="text-decoration: underline;">objective third-party validation</span></a> and <a href="http://www.nagarro.com/Clients/Our%20Customers%20Speak.aspx"><span style="text-decoration: underline;">glowing customer references</span></a>. As we add this award to Nagarro’s accolades, we are once again grateful to all the customers, partners and employees who have helped Nagarro continue to achieve success.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/nagarro-named-a-%e2%80%9crising-star%e2%80%9d-in-iaop%e2%80%99s-2010-global-outsourcing-100-list/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Embedding BI in Web Applications</title>
		<link>http://www.nagarro.com/blog/embedding-bi-in-web-applications/</link>
		<comments>http://www.nagarro.com/blog/embedding-bi-in-web-applications/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 14:24:17 +0000</pubDate>
		<dc:creator>vishal.jindal</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/embedding-bi-in-web-applications/</guid>
		<description><![CDATA[There was a time when business intelligence was synonymous with intelligence being created long after an activity has taken place. With the business becoming more competitive, there is an inherent need to create intelligence on the fly during the transaction process itself. Business cannot wait for the data to be loaded in the data warehouse [...]]]></description>
			<content:encoded><![CDATA[<p>There was a time when business intelligence was synonymous with intelligence being created long after an activity has taken place. With the business becoming more competitive, there is an inherent need to create intelligence on the fly during the transaction process itself. Business cannot wait for the data to be loaded in the data warehouse during the night batch process and then the analytics routines to run to create intelligence the next day.<span id="more-544"></span> For this to happen, the BI interfaces need to integrated with the transactional application to provide a seamless feel to the end user.<br />
This seamless integration between transactional and BI systems is brought about by using web services in service oriented architecture. The request for information is passed via a web service to the DW or any other data store and the result which may be analytical reports can be transferred via the same services. This integration of analytical function with transaction is called embedded BI.<br />
Similarly on the data integration side, data can be integrated from multiple data sources in real time. Many companies are using traditional ETL tools in a web service environment to achieve this integration. Many data providers use BI delivery mechanisms wrapped in web services to deliver data to their customers.<br />
For creating these embedded business intelligence applications, understanding both domains of service architecture and business intelligence is important, but the key requirement here is to understand the bigger process in which both transaction and decision making is woven together. The application of this concept is huge and can create really enriched applications.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/embedding-bi-in-web-applications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nagarro SAP Consulting Provides Banking Solutions in Mexico</title>
		<link>http://www.nagarro.com/blog/nagarro-sap-consulting-provides-banking-solutions-in-mexico/</link>
		<comments>http://www.nagarro.com/blog/nagarro-sap-consulting-provides-banking-solutions-in-mexico/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 09:21:03 +0000</pubDate>
		<dc:creator>Vishal Gauri</dc:creator>
				<category><![CDATA[SAP]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=540</guid>
		<description><![CDATA[Nagarro SAP Consulting has kicked off a challenging new engagement with Mexican mortgage and lending company Patrimonio Hipotecaria.
As part of a company-wide upgrade to the SAP platform, our SAP Consulting team is using the SAP Netweaver ™ platform, SAP IS-Banking and numerous other SAP technologies to help catapult Patrimonio Hipotecaria to the next level of [...]]]></description>
			<content:encoded><![CDATA[<p>Nagarro SAP Consulting has kicked off a challenging new engagement with Mexican mortgage and lending company Patrimonio Hipotecaria.</p>
<p>As part of a company-wide upgrade to the SAP platform, our SAP Consulting team is using the SAP Netweaver ™ platform, SAP IS-Banking and numerous other SAP technologies to help catapult Patrimonio Hipotecaria to the next level of success. Our team will create a 12-fold increase in overall system capacity for Patrimonio Hipotecaria –while improving the consumer experience as well as streamlining internal efficiencies.</p>
<p>You can read more about this new customer engagement in our <a href="http://www.nagarro.com/NewsEvents/Press%20Releases/Nagarro-Taps-Mexican-IT-Market.aspx">recent press release</a> and <a href="http://www.nagarro.com/Documents/Nagarro_Casestudy_Patrimonio.pdf">new customer case study</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/nagarro-sap-consulting-provides-banking-solutions-in-mexico/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Designing Cloud Based Systems  &#8211; 3. Scalability, Performance and Software Engineering</title>
		<link>http://www.nagarro.com/blog/designing-cloud-based-systems-3-scalability-performance-and-software-engineering/</link>
		<comments>http://www.nagarro.com/blog/designing-cloud-based-systems-3-scalability-performance-and-software-engineering/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 11:26:23 +0000</pubDate>
		<dc:creator>Abhijat Vatsyayan</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=525</guid>
		<description><![CDATA[Scalability and robustness
Since a very compelling business reason for using cloud computing is the ability to scale on demand and when needed, using the best practices and guidelines for designing large scale  distributed systems is a good starting point. While academia has a preference for   distributed transactions, ACID properties, and all kinds of consensus protocols, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Scalability and robustness</strong></p>
<p>Since a very compelling business reason for using cloud computing is the ability to scale on demand and when needed, using the best practices and guidelines for designing large scale  distributed systems is a good starting point. While academia has a preference for   distributed transactions, ACID properties, and all kinds of consensus protocols, you are better off with loosely coupled systems where nodes will eventually reach a consistent state (as opposed to waiting for all nodes in a very large system to  reach a consistent state before proceeding). Considering the state of existing systems, loosely coupled self healing self regulating systems should be preferred over system with exotic distributed transactional properties and consensus protocols.<span id="more-525"></span></p>
<p>Be prepared to lose computational appliances. As you already know, stateful systems are bad for scalability. Avoid storing the state in server sessions. If you are designing a client-server system from scratch, do not store client sessions on the server. For typical web applications, this means that your HTTP calls should be stateless. GWT and other rich AJAX or Flex clients let you do this relatively easily.</p>
<p>You should also try to avoid solutions that try to replicate state across multiple nodes. This almost always leads to overly complicated solutions. You are better off being prepared for  loss of data and designing with the assumption  that client application state, if at all available on the server side, may not  be synchronized across all nodes. UDP, which is often used for discovery, and negotiating other information may not even be available on many cloud platforms.</p>
<p>These are important design decisions that you must make right up front.  Retrofitting these into existing solution might be impossible.</p>
<p><strong>Software engineering</strong></p>
<p>In addition to strictly technical design and runtime issues, you also need to take into account other software engineering issues which affect you development.</p>
<p>As already discussed, you need to have a pool of engineers who understand the technologies you will be using. You may find it hard to find many engineers who have had experience with large scale, self healing, self managing systems. While one of the objectives of most cloud platforms is to take these complexities away from the developers, you will need engineers who understand these concerns.</p>
<p>You also need to find out if the platform you have selected provides good tools for development, deployment and debugging. You should ask the same questions you ask when selecting any technology.</p>
<ul>
<li>Find out if the platform integrates with the IDE you are planning to use (or if the platform comes with an IDE that will serve your development needs).  I would recommend staying away from custom IDEs. Amazon, Google and Microsoft support industry standard IDEs for their respective platforms.</li>
<li>You need to design for testability right from day one and your design should be testable on the platform.</li>
<li>If your organization has an enterprise architecture, you need to be sure that your design and tools meet the standards and approaches laid down by it. Different network topologies, moving data in and out of the cloud and integrating systems running in the cloud with the systems inside the enterprise will come with its own set of challenges. While most enterprises have already started looking into cloud as a viable means for extending their computational needs, they may not be ready for a complete adoption.</li>
<li>Security is an important aspect that you may not have full visibility into when you are running on someone else’s platform. Work with your security experts, quality assurance and compliance team to make sure everyone understands the security risks. A perceived security risk and lack of visibility could be a major problem while adopting any new technology (anyone remember trying to use Java RMI across enterprise firewalls?) and clouds are no exception. In fact the shared nature of the services makes security a bigger concern.</li>
<li>Finally, you need to design for monitoring. It is best if the platform supports automated monitoring. Otherwise you may need to design for it right from day one. Even when the platform provides some tools, you may still have to monitors aspects not supported by the platform tools.</li>
</ul>
<p>This discussing should provide you with a good starting point for creating your own best practices and guidelines. These are important design decisions that you should try to get right  up front.  Retrofitting these into existing solution might be impossible.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/designing-cloud-based-systems-3-scalability-performance-and-software-engineering/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SAP SOA and Web Services &#8211; what determines an Enterprise Service</title>
		<link>http://www.nagarro.com/blog/sap-soa-and-web-services-what-determines-an-enterprise-service/</link>
		<comments>http://www.nagarro.com/blog/sap-soa-and-web-services-what-determines-an-enterprise-service/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 11:58:56 +0000</pubDate>
		<dc:creator>Manish Agarwal</dc:creator>
				<category><![CDATA[SAP]]></category>
		<category><![CDATA[SAP enterprise services]]></category>
		<category><![CDATA[SAP eSOA]]></category>
		<category><![CDATA[SAP ESR]]></category>
		<category><![CDATA[SAP PI]]></category>
		<category><![CDATA[SAP SOA]]></category>
		<category><![CDATA[SAP SR]]></category>
		<category><![CDATA[SAP web services]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=533</guid>
		<description><![CDATA[SAP SOA design provides guidelines to determine enterprise service and web services. Through SAP eSOA tools, it is possible to manage SAP enterprise services and web services through classification in SAP ESR and SAP SR.]]></description>
			<content:encoded><![CDATA[<p>SAP SOA is now a mainstream architectural strategy being followed by SAP customers for providing future proof integration to SAP and non-SAP systems. However, customers are not clear on the SAP SOA guidelines, and how to truly model, design and develop enterprise level services.<span id="more-533"></span></p>
<p><strong>What is SOA<br />
</strong></p>
<p>Service Oriented Architecture (SOA) is a software design strategy in which there is a service provider and many service consumers. SOA is similar to the distributed computing principles of loosely coupled architecture. SOA differs from the traditional client server architecture in terms of distributing the functionality over separate business objects exposed through service interfaces, loose coupling through independent business objects, durable interface contracts and promoting reuse of functionality through a loosely coupled architecture.</p>
<p><strong>What is a Web Service<br />
</strong></p>
<p>A web service is an interface implementing the industry standards of SOAP and WSDL (and usually HTTP) to expose functionality to a web service consumer. It is a technical implementation to expose functionality through a standards based protocol.</p>
<p>The use of web services has enabled a tremendous leap in enterprise integration. Till a few years back, most applications provided proprietary or rudimentary methods of integration, such as SAP provided SAP RFC, BAPI, IDOC based integrations. Such integrations warranted the use of middleware adapters to provide integration with SAP.</p>
<p>The use of web services now allows a direct integration between applications with the SAP business suite.</p>
<p>Hence, we recommend the usage of web services as a central integration strategy for all integration initiatives.</p>
<p>With the proliferation of web services, it is a challenge to catalog and manage the usage of services in the enterprise. Hence, SAP has provided a robust set of SOA toolsets to manage the usage of services in the enterprise.</p>
<p><strong>What is an SAP Enterprise Service<br />
</strong><br />
An SAP Enterprise service is technically a web service, and it has the following attributes:</p>
<ul>
<li>Based on web services standards of WSDL and SOAP</li>
<li>Based on SAP global data types</li>
<li>The service has been modeled within SAP ESR using business objects, process components and the SAP enterprise model</li>
<li>Published in the SAP SR (service registry)</li>
<li>Guarantee on the availability and functional correctness</li>
</ul>
<p><strong>What if my Web Service does not qualify to be an Enterprise Service<br />
</strong><br />
There are scenarios where the web service interface exposed by an enterprise application is not globally relevant, and is really a technical interface to a localized business functionality. The usage of such a web service may be limited to the department in the organization and its particular IT applications having its own semantics.</p>
<p>Such web services are not Enterprise Services. However, SAP SOA tools can be used to manage and catalog such localized and non enterprise services as well. The SAP SR provides rich taxonomy capabilities to catalog and manage all such services.</p>
<p><strong>Summary<br />
</strong><br />
Web services should be the central integration strategy for all integration initiatives to provide a standards based integration to applications. However, not all web services are meant to be used at an enterprise level across the organization.</p>
<p>The SOA Governance body should approve all enterprise service candidates based on the above mentioned criteria, and use the SAP SOA toolset for cataloging and managing all service in the enterprise.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/sap-soa-and-web-services-what-determines-an-enterprise-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Designing Cloud Based Systems  &#8211; 2. System Integration and Development Considerations</title>
		<link>http://www.nagarro.com/blog/designing-cloud-based-systems-2-system-integration-and-development-considerations/</link>
		<comments>http://www.nagarro.com/blog/designing-cloud-based-systems-2-system-integration-and-development-considerations/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 19:03:06 +0000</pubDate>
		<dc:creator>Abhijat Vatsyayan</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=522</guid>
		<description><![CDATA[Enterprise Application Integration
You need to consider how your system integrates with other systems in your organization. Clouds are good but one-off systems that use cloud but do not integrate with existing systems will diminish the payoffs of using a cloud.
You need to consider how your system and its data get integrated with existing data. This [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Enterprise Application Integration</strong></p>
<p>You need to consider how your system integrates with other systems in your organization. Clouds are good but one-off systems that use cloud but do not integrate with existing systems will diminish the payoffs of using a cloud.</p>
<p>You need to consider how your system and its data get integrated with existing data. This may need to be done both ways. Without access to existing data or data created and maintained by your cloud based system, you will again limit the potential of your system under design.<span id="more-522"></span></p>
<p>You may also need to integrate your application with your enterprise’s existing authentication and authorization solution.</p>
<p>Even if integration is not an immediate concern, an architectural choice can make it impossible to integrate even in future. You will need to worry about different networks and firewalls and if the protocols you will use to integrate these systems will work across these networks and firewalls.</p>
<p><strong>Development Considerations</strong></p>
<p>Once you start building the system, you will need to take into account how many engineers and support people are comfortable with the technologies you are using (in this case – something cloud based). You may need to take training and documentation time into account in your plans.</p>
<p>If you need to move large amounts of data between your internal computers and the cloud, you will need to either have sufficiently fast network connections or take the associated delays into account. This delay could play a major role in how you trouble-shoot issues, provide other kinds of support, take backup or just make the data collected by your application available to the users within your internal network.</p>
<p>Offshore development is a reality and if your application is either developed and/or maintained by a team working offshore, network speeds,  latency and round trip times will all come to play a major role. This means your choice of development and support tools and environments should work well over a bad network. VNC and Xserver-clients do not behave well, text terminals work better, light-weight HTML based clients work best. You also need to worry about moving large amounts of data in and out of the cloud from your development and support centers.</p>
<p>If you have specific regulatory compliance requirements, you need to be sure that the platform complies with the standard. For example, Amazon EC2 instances are not PCI (payment card industry) compliant so you should not plan on storing credit card information on Amazon EC2 instances. There could be regulations  regarding sending customer data out of country and when you store data in a cloud,  you (or even the provider) may have no control on where (which node) that data  could be at any given time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/designing-cloud-based-systems-2-system-integration-and-development-considerations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Designing Cloud Based Systems  &#8211; 1. Introduction</title>
		<link>http://www.nagarro.com/blog/designing-cloud-based-systems-1-introduction/</link>
		<comments>http://www.nagarro.com/blog/designing-cloud-based-systems-1-introduction/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 22:22:03 +0000</pubDate>
		<dc:creator>Abhijat Vatsyayan</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=519</guid>
		<description><![CDATA[Definitions and architecture
I am not a big fan of using definitions as a starting point.  In technology many useful and successful concepts have escaped definition. People still argue about what exactly is an object in an object-oriented system.  There is no scarcity of definitions for software architecture. The internet cannot be pinned down to a simple [...]]]></description>
			<content:encoded><![CDATA[<h3>Definitions and architecture</h3>
<p>I am not a big fan of using definitions as a starting point.  In technology many useful and successful concepts have escaped definition. People still argue about what exactly is an object in an object-oriented system.  There is no scarcity of definitions for software architecture. The internet cannot be pinned down to a simple definition. A definition, however, it is still useful in certain contexts.<span id="more-519"></span></p>
<p>While people might argue about the exact definition of cloud computing (which is probably a futile effort at this time), a working definition can be used to evolve a shared meaning. This is especially useful in software architecture where clear communication among stakeholders is extremely important. Software architects interact closely with business, users, developers, testers, compliance groups and others and before you move your architecture to the cloud, you should state exactly what cloud computing means  in the context of the system you are designing.</p>
<p>Definitions will differ based on whether you are a consumer of the cloud based  services or a provider and with more and more of private and hybrid clouds out there,  organizations and enterprises are fast becoming internal providers of cloud based  computing services which is blurring the line between providers and consumers of a  cloud “style” service.  Today, from a consumer’s point of view, a cloud based compute service:</p>
<ul>
<li>is implemented as a pool of servers though the consumer may not have direct access to the underlying pool.</li>
<li>is characterized by very high degree of automation typically providing both  programmatic access (for integration) and graphical or command line user interfaces.</li>
<li>provides an abstraction of compute services along with constraints that enable  the provider’s offering.</li>
<li>is priced on a pay-as-you-go basis. Consumers only pay for what they use.</li>
</ul>
<p>When you take these along with (effective) infinite scalability and pay-per-use utility model into consideration and design a system for the cloud, there are several issues that you should take  into account. I will discuss a few architectural considerations that must be taken into account while designing a cloud based system. The usual design principles and best practices for building a cloud based are not very different from what you probably already use as part of your enterprise architecture standards and/or other best practices for building large scale distributed systems; but some of these may be unique.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/designing-cloud-based-systems-1-introduction/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>SAP Customer&#8217;s UI Technology Choices: SAP WebDynpro vs Microsoft .NET vs Java</title>
		<link>http://www.nagarro.com/blog/sap-customers-ui-technology-choices-sap-webdynpro-vs-microsoft-net-vs-java/</link>
		<comments>http://www.nagarro.com/blog/sap-customers-ui-technology-choices-sap-webdynpro-vs-microsoft-net-vs-java/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 11:48:19 +0000</pubDate>
		<dc:creator>Manish Agarwal</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=516</guid>
		<description><![CDATA[This blog illustrates the decision criteria and strategy for selecting SAP NetWeaver (SAP BPM, SAP BRM, SAP WebDynpro) or Microsoft or Java for custom application for a SAP customer.]]></description>
			<content:encoded><![CDATA[<p><strong>Background</strong><br />
Most SAP customers have enterprise applications developed in other mainstream development platforms such as Microsoft, Java and others. Many customers have existing legacy applications built on multiple technologies and platforms (too numerous to list here).</p>
<p>Going forward, SAP customers are tending to standardize on the SAP platform for running their core business operations. However, for development of custom applications, customers do not have a clear approach towards selecting SAP NetWeaver or the other mainstream platforms for development.<span id="more-516"></span></p>
<p><strong>UI Technology Choice Criteria</strong><br />
Most enterprise vendors such as SAP, Oracle, Microsoft and IBM offer a complete technology stack with comparable features such as Portal, content management, knowledge management, enterprise search, data warehousing, middleware integration, mobility, application server and solution management tools.</p>
<p>A custom application is usually not isolated. In our opinion, the decision to select a development platform for custom applications should be determined based on the following criteria:</p>
<ul>
<li>Developer Skills: If your development team is most comfortable with SAP ABAP (rather than Java), then it would enable you to develop custom applications faster, accurate and perfectly aligned with business expectations. If your development team does not have SAP skills but Microsoft dotNET or Java, then it may be rational to develop custom applications on the Microsoft platform with integration to SAP.</li>
<li>IT comfort to support the development platform: If your SAP IT team is not comfortable with supporting the SAP J2EE application server (for maintenance, patching, upgrade, transports, security), then it may make sense to stick with the SAP ABAP development platform.</li>
<li>Depth of SAP Integration and SAP Business Processes: An SAP platform based development would accelerate development if there is significant SAP integration and business process interaction involved. A custom application is usually not isolated. If the majority of business data is resident in SAP, then an SAP platform based development would be faster and more accurate to end user requirements.</li>
<li>Comfort of end users: This is an important criteria in determining the technology for end user applications. For example, if the end user has a strong liking for Adobe Flex based reports or dashboards, then, getting a similar look-and-feel on other platforms may be a challenge.</li>
</ul>
<p>It should be noted that SAP NetWeaver has strong User Interface and data visualization capabilities. With the introduction of Adobe Flex integration, we can show &#8220;cool&#8221; tables, charts and graphics within an SAP application.</p>
<p><strong>.NET based UI scenarios</strong><br />
If the development team is very comfortable using .NET for all application development, then .NET can be the natural choice for custom applications that have integration to SAP.</p>
<p><strong>SAP WebDynpro based scenarios</strong><br />
SAP NetWeaver is a compelling choice for core business processes that fetch majority of their business data from SAP systems. SAP NetWeaver provides WebDynpro for User Interface development, SAP BPM for a guided business process and SAP BRM for business rules. Most of the development is through model based development,  thereby reducing manual coding to the &#8220;framework exit points or hooks&#8221;. Since SAP NetWeaver has a native integration to all SAP Business Suite systems, this reduces integration effort, increases accuracy of data mapping, and a much higher end user satisfaction with the business process.</p>
<p><strong>Recommendation</strong><br />
As shown above, the use of a development platform is dependant on several criteria, and every customer has unique drivers to opt for a development platform.</p>
<p>In our experience, customers having both SAP and a nonSAP platform (such as Microsoft .NET) have benefited by developing SAP centric business processes on SAP NetWeaver. The SAP and Microsoft platforms co-exist and there is a conscious strategy and decision criteria to determine the use of SAP or Microsoft for a custom application.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/sap-customers-ui-technology-choices-sap-webdynpro-vs-microsoft-net-vs-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nagarro among first to offer custom application development on Google App Engine cloud computing platform</title>
		<link>http://www.nagarro.com/blog/nagarro-among-first-to-offer-custom-application-development-on-google-app-engine-cloud-computing-platform/</link>
		<comments>http://www.nagarro.com/blog/nagarro-among-first-to-offer-custom-application-development-on-google-app-engine-cloud-computing-platform/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 22:02:37 +0000</pubDate>
		<dc:creator>Vishal Gauri</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=500</guid>
		<description><![CDATA[Last week we announced that Nagarro has joined the Google Enterprise Partner™ program, which extends the power of Google across the enterprise and helps customers get more value out of their Google Enterprise™ deployments. Through this partnership, Nagarro has become one of the first software development firms offering custom application development on Google’s cloud computing platform, [...]]]></description>
			<content:encoded><![CDATA[<p>Last week we<img class="alignleft size-full wp-image-504" title="GEP_Logo" src="http://www.nagarro.com/blog/wp-content/uploads/2009/12/GEP_Logo1.JPG" alt="GEP_Logo" width="109" height="95" /> announced that Nagarro has joined the Google Enterprise Partner™ program, which extends the power of Google across the enterprise and helps customers get more value out of their Google Enterprise™ deployments. Through this partnership, Nagarro has become one of the first software development firms offering custom application development on Google’s cloud computing platform, Google App Engine™.</p>
<p> For our customers, this means that Nagarro continues to be a trusted resource for the newest, most advanced tools and technologies available.  We will keep you posted on our work with Google App Engine as it evolves.  If you have any experiences with Google App Engine to share, we would love to hear your comments as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/nagarro-among-first-to-offer-custom-application-development-on-google-app-engine-cloud-computing-platform/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Know a High School Math Whiz?</title>
		<link>http://www.nagarro.com/blog/know-a-high-school-math-whiz/</link>
		<comments>http://www.nagarro.com/blog/know-a-high-school-math-whiz/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 21:53:30 +0000</pubDate>
		<dc:creator>Vikas Sehgal</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=495</guid>
		<description><![CDATA[Know a high school math whiz? Registration is open for Moody’s Mega Math Challenge
Nagarro shares a love of mathematics with customer SIAM (the Society for Industrial and Applied Mathematics).  This year, Nagarro’s custom applications will be automating the judging process for the Moody’s Mega Math Challenge, an Internet-based math contest co-hosted with SIAM. Participating teams [...]]]></description>
			<content:encoded><![CDATA[<p>Know a high school math whiz? Registration is open for Moody’s Mega Math Challenge</p>
<p>Nagarro shares a love of mathematics with customer <a href="http://www.siam.org/">SIAM</a> (the Society for Industrial and Applied Mathematics).  This year, Nagarro’s custom applications will be automating the judging process for the <a href="http://m3challenge.siam.org/">Moody’s Mega Math Challenge</a>, an Internet-based math contest co-hosted with SIAM. Participating teams of students are given 14 hours to solve an open-ended, realistic, applied math-modeling problem focused on real-world issues.</p>
<p>The content spotlights applied mathematics as a powerful problem-solving tool, a viable and exciting profession, and a vital contributor to advances in an increasingly technical society. Scholarship prizes total $100,000.</p>
<p>If you know a high school math whiz from Maine through Washington, DC who might be interested in participating, please feel free to share information on the contest. <a href="http://m3challenge.siam.org/participate/">Registration</a> closes on February 26, 2010.</p>
<p>Who knows, the winners could be your future employees (or our future customers)…</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/know-a-high-school-math-whiz/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SAP Remote Consulting: The practical way to get quality consulting at affordable prices</title>
		<link>http://www.nagarro.com/blog/sap-remote-consulting-the-practical-way-to-get-quality-consulting-at-affordable-prices/</link>
		<comments>http://www.nagarro.com/blog/sap-remote-consulting-the-practical-way-to-get-quality-consulting-at-affordable-prices/#comments</comments>
		<pubDate>Fri, 27 Nov 2009 14:12:55 +0000</pubDate>
		<dc:creator>Manish Agarwal</dc:creator>
				<category><![CDATA[SAP]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=492</guid>
		<description><![CDATA[SAP consulting remotely is catching up as organizations realize the true potential of having access to quality talent in a flexible manner. The direct impact is on cost reduction for SAP support services inhouse and access to SAP talent for a variety of SAP functional areas.]]></description>
			<content:encoded><![CDATA[<p>In most organizations, the SAP infrastructure is maintained through a team of SAP consultants sitting full time in the head office. The SAP team looks after all SAP functional areas, SAP technical development, SAP BASIS maintenance, and interacts with the business to resolve all their SAP issues.<span id="more-492"></span></p>
<p>Often, there are issues related to:<br />
- Having a full time SAP consultant to address a functional area where there are few support requests or development requests<br />
- Having a SAP consultant to manage and juggle many different functional areas. This leads to SLA issues when many issues pile up simultaneously<br />
- Unable to address complex issues due to high costs involved in getting a Senior SAP consultant to the customer location<br />
- Unable to implement advanced SAP modules (such as SAP APO) due to lack of inhouse talent for current and future support needs for these advanced modules</p>
<p>For all the above reasons, the customer organization continues to stick with the current implementation and the older SAP releases, and unable to innovate or implement advanced SAP products.</p>
<p>Remote consulting is catching up with many customers to address all the above issues.</p>
<p>Remote consulting allows you the following benefits:<br />
- Access to advanced SAP skills and SAP talent. It is a fact that many Senior SAP consultants are unable to travel as much as they would like to! Hence, many Senior SAP consultants are constrained to serve their local geographic areas only.<br />
- Cost reduction and control of SAP support budget. Remote consulting is always significantly cheaper than calling the Senior SAP consultant to physically arrive at our offices.<br />
- Access to SAP functional services on Fractional basis. Many SAP service providers offer SAP services at less than full time basis. This is valuable for companies to get support for SAP services that have less support requests.</p>
<p>Today, many customer organizations are becoming receptive to the idea of SAP services delivered remotely. For many large global organizations, they are already geographically distributed over multiple locations and timezones and collaborating over the phone, Webex and VPN. For most organizations, remote consulting fits seamlessly with their current SAP team. Considering the advantages of access to sparse SAP talent and huge cost advantages, SAP remote consulting is the smart way to get access to SAP talent.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/sap-remote-consulting-the-practical-way-to-get-quality-consulting-at-affordable-prices/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Architectural Principles for usage of SAP PI in a SOA environment</title>
		<link>http://www.nagarro.com/blog/architectural-principles-for-usage-of-sap-pi-in-a-soa-environment/</link>
		<comments>http://www.nagarro.com/blog/architectural-principles-for-usage-of-sap-pi-in-a-soa-environment/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 21:15:29 +0000</pubDate>
		<dc:creator>Manish Agarwal</dc:creator>
				<category><![CDATA[SAP]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/architectural-principles-for-usage-of-sap-pi-in-a-soa-environment/</guid>
		<description><![CDATA[We discuss the architectural principles and best practices for usage of SAP PI in an Enterprise SOA environment in a SAP centric landscape.]]></description>
			<content:encoded><![CDATA[<p>In our experience working with customers who want to adopt Enterprise SOA in an SAP environment, many customers tend to believe that SAP PI is a prerequisite to enabling and consuming enterprise services. Since SAP&#8217;s service management tools of SAP ESR and SAP SR are provided by the SAP PI infrastructure, customers tend to believe that they need to use SAP PI in all service interactions.</p>
<p>In this blog, we would present guidelines and best practices for usage of SAP PI in an Enterprise SOA environment.<span id="more-489"></span></p>
<p><strong>Usage of SAP ESR and SAP SR for managing enterprise services:<br />
</strong>- SAP ESR and SAP SR should be used for modeling and publishing enterprise services in the landscape.<br />
- SAP ESR and SAP SR are provided by SAP PI and SAP CE infrastructures. Hence, the customer could install either SAP PI or SAP CE to get access to the SAP ESR and SAP SR instances.<br />
- SAP ESR should be used to model and manage all SOA assets. We can use it to model SAP and nonSAP services. SAP ESR models can be used to directly implement the service implementation in SAP. With SAP ESR model, it is not possible to directly implement a .NET or J2EE service. However, the .NET or Java service signature can be made to conform to the Service definition described in SAP ESR.<br />
- Enterprise Services Repository used to define re-useable services rather than classical interfaces<br />
- SAP SR can be used to manage the publication of SAP and nonSAP services.</p>
<p><strong>Usage Scenarios of SAP PI:<br />
</strong>- All web services and enterprise services that are being exposed to the customer should go through SAP PI. This is to ensure scalability, security and availability, since going through a managed middleware ensures the quality of service (QoS) for the enterprise service. For example, we cannot expose an application web service directly to a customer in a B2B scenario since the security and load are unpredictable<br />
- SAP PI is used to create abstraction between heterogeneous sender and receiver systems based on SOA standards to provide unified access to legacy systems.<br />
- SAP PI 7.1 is for mainly leveraging functionalities for service enablement, and service and process orchestration<br />
- Integration between non-SAP system and non-SAP system.<br />
- Use SAP PI for both A2A, B2B integrations including EDI<br />
- Use SAP PI for service enabling legacy applications that lack a framework for exposing web services.<br />
- For SAP PI 7.1, many SOA enabling standards or WS standards are supported as part of this release making it the core technology enabler of Enterprise SOA. (e.g. WS Reliable Messaging, WS Security, SAML, WS Policy, WS PolicyAttachment  etc.)<br />
- For a predominantly SAP landscape, SAP PI should be the strategic integration platform and the enterprise wide service bus</p>
<p><strong>When not to use SAP PI in enterprise SOA:<br />
</strong>- Recent release of the SAP platform (SAP ECC6) has native capability to expose enterprise services. The service should be modeled in SAP ESR and implemented in SAP ECC6. This service is readily available for consumption across the enterprise without the intervention of SAP PI or any other middleware.<br />
- SAP PI usage is not recommended for synchronous communication since it places a significant load on the infrastructure services for servicing a synchronous request. Also, SAP PI cannot guarantee the QoS and response time in processing a sync request.<br />
- For User Interface scenarios (such as a WebDynpro UI), the UI can directly consume enterprise services. SAP PI should not be used in UI driven scenarios if the backend is exposed as enterprise services.<br />
- If a nonSAP backend such as .NET or J2EE or any other platform is exposing business services in a UI scenario, SAP PI is not needed for intermediation. The UI such as SAP Portal based User Interface through various SAP NetWeaver technologies (SAP CAF, SAP BPM, WebDynpro etc.) can directly consume nonSAP services.</p>
<p>In conclusion, SAP PI should be the strategic integration platform in a SAP centric landscape. However, SAP PI should be used as an intermediary if it adds value between the sender and the receiver entities.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/architectural-principles-for-usage-of-sap-pi-in-a-soa-environment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Case study: How a usability workshop can work wonders</title>
		<link>http://www.nagarro.com/blog/case-study-how-a-usability-workshop-can-work-wonders/</link>
		<comments>http://www.nagarro.com/blog/case-study-how-a-usability-workshop-can-work-wonders/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 11:54:22 +0000</pubDate>
		<dc:creator>Manas Fuloria</dc:creator>
				<category><![CDATA[Usability]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=482</guid>
		<description><![CDATA[We have all heard the usability spiel: that technology is more or less a commodity, that ease of use – and in fact “delight of use” &#8211; should be paramount. We have also heard the horror stories of expensive enterprise and consumer applications that failed miserably because they were just too “kludgy” to use. Yet [...]]]></description>
			<content:encoded><![CDATA[<p>We have all heard the usability spiel: that technology is more or less a commodity, that ease of use – and in fact “delight of use” &#8211; should be paramount. We have also heard the horror stories of expensive enterprise and consumer applications that failed miserably because they were just too “kludgy” to use. Yet even today, for every wonderfully user-centric design (think iPhone) there are dozens of desktop or web applications that are boring at best, and simply unusable at worst.</p>
<p>Why is this so? Perhaps the problem is that when you are early in the SDLC, there are so many other challenges and moving parts that you have little time to worry about usability. You worry that bringing the “naïve” users in for design discussions will just derail the project or send it off on a tangent. On the other hand, if you wait till you are through with version 1, you have been compromised as well &#8211; it requires great courage to admit at this point that usability is poor and that major elements of the application have to be re-designed.</p>
<p>These are formidable challenges. Yet we at Nagarro recently had a very positive series of usability-related discussions with a major client, which may be useful to recount in this context.<br />
<span id="more-482"></span><br />
The client is one of the world’s leading travel-related companies. We are building a business-critical application for this company that will be used by a handful of users. The IT project management on the client side had invested a lot of intellectual muscle into the functional and algorithmic design of the application. We too put in a lot of effort to make mockups of the entire application UI and these were approved by the client – but by the IT project management, not by the users. The users did see the application from time to time, but in short bursts and they definitely did not have enough time to play with it and give their feedback.</p>
<p>Then after we had a successful development release and were reviewing progress with senior folks on both sides, we all collectively realized that the usability of the application left quite a bit to be desired. It was a depressing moment.</p>
<p>It wasn’t just a matter of aligning data elements or fiddling with the color palette.</p>
<p>It wasn’t even a matter of trying to streamline workflows to reduce the number of clicks required for each task.</p>
<p>It was the fact that the application’s UI looked like it had been designed by highly analytical engineers and scientists, which it in fact had. Would the users – who were neither engineers nor scientists &#8211; find it easy to use? Would they buy into it? Would they find all the features that they would need?</p>
<p>Luckily, the client team comprised very intelligent and wise folks. Rather than blame the team members on either side, the client’s senior VP-level executive said, “We should think of this as continuous improvement. You all did a great job, but we now see it can make it even better. Let’s see this as a positive opportunity and move forward.”</p>
<p>So, no blame game, no recriminations, no requests for “free rework”. The gentleman basically had the wisdom to see that when you are building something highly innovative, you may have to iterate to get the design just right.</p>
<p>Still, on our part, we offered the client a free usability workshop with our best consultant, a person skilled at combining “right brain” creative thinking with the “left brain” analytical thinking required for software design. The users were the star participants in the workshop, which started from first principles – what exactly is it that the users want to achieve? Our engineering team got the chance to put itself into the shoes of the users and try to come up with metaphors and overarching design principles that would work for them and, hopefully, delight them.</p>
<p>The workshop ran for two days and turned our previous thinking on its head. Yet everyone was thrilled with the insights and we agreed we’d run such workshops for each new project. The client agreed to fund a few person-months of effort to upgrade the user interface. Perhaps the cost of the overall development rose by 10%. But as a result, the chances of the application being very successful and useful in the hands of the users probably doubled or tripled.</p>
<p>And that’s always the most important metric!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/case-study-how-a-usability-workshop-can-work-wonders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Benefits of SAP Integration / SAP based product capability for Independent Software Vendors (ISV)</title>
		<link>http://www.nagarro.com/blog/benefits-of-sap-integration-sap-based-product-capability-for-independent-software-vendors-isv/</link>
		<comments>http://www.nagarro.com/blog/benefits-of-sap-integration-sap-based-product-capability-for-independent-software-vendors-isv/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 12:13:17 +0000</pubDate>
		<dc:creator>Manish Agarwal</dc:creator>
				<category><![CDATA[SAP]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=477</guid>
		<description><![CDATA[For an ISV looking to break-into the SAP customer base (which consists of a significant number of Fortune 1000 companies), it is almost mandatory to demonstrate SAP compliance. In this blog, we provide approaches for the ISV to reach this milestone.]]></description>
			<content:encoded><![CDATA[<p>Independent Software Vendors (ISV) are companies that have niche product offerings for a certain industry area. ISVs typically have acquired their deep understanding of an industry through years of working in their particular focus areas. You would typically find the ISVs to have &#8220;champions&#8221; and well know industry experts in their area of expertise. Hence, these ISVs are extremely well known in the industry, and they may enjoy comfortable market share in the particular industry vertical in a certain geography.<span id="more-477"></span></p>
<p>So far so good. With increasing globalization of the customer base, we are witnessing several movements that are making the ISVs to sit up and take action to preserve their market share. First of all, the customers themselves are getting acquired by larger companies, and &#8220;acquiring&#8221; globally recognized names. The decision making policies are now getting centralized, and all decisions need to adhere to &#8220;global standards&#8221; such as compliance of new software products, interoperability, multilingual multicurrency support etc. Additionally, the ISVs are seeing increasing competition from the larger &#8220;less specialized&#8221; players who are coming up with offerings to compete head-on with the ISVs. Finally, the customers are now less excited about buying &#8220;best of breed&#8221; applications, and leaning towards solutions from a single product vendor which complies to their global IT standards. For ISVs, deep functionality is not enough to break into larger customers who have a certain gate-criteria for qualifying all software solutions.</p>
<p>SAP is the predominant ERP globally; it is run by a large number of global corporations across Auto, High Tech, CPG, Retail, Chemical, Pharmaceutical, Oil&amp;Gas etc. These global corporations have acquired global footprint across Americas, Europe and Asia with distributed IT management teams. For consistent management, most corporations mandate SAP compliance of all software solutions.</p>
<p>For an ISV looking to break-into the SAP customer base (which consists of a significant number of Fortune 1000 companies), it is almost mandatory to demonstrate SAP compliance. SAP compliance would be one of the earliest concerns to be brought up by the IT during the product evaluation and due diligence phase.</p>
<p>Then why wait ?</p>
<p>SAP compliance can be achieved through the following two approaches:<br />
- Migration of the product&#8217;s important features to the SAP platform: Though this may seem like a more difficult approach, it is not. We have helped customers to rapidly build important features of the product using the SAP NetWeaver platform in a short span of a few weeks. The initial product release is adequate to support the ISV Marketing team to start socializing with the SAP customers.<br />
- Integration of the ISV product with SAP: This is a common approach to integrate the ISV product with the SAP business suite. We typically use SAP PI (SAP XI) middleware platform to provide data conversion between the ISV product and SAP proprietary data formats.</p>
<p>Finally, nothing beats SAP Certification! An SAP certified product or SAP certified integration provides assurance to the customer that the deliverable meets SAP&#8217;s quality and data interoperability standards.</p>
<p>How do we do it ? ISVs are understandingly not SAP experts. The best way is to partner with an SAP Services provider who has previous experience in working with ISVs and has completed several such projects. The ISV should not need to learn SAP or get into the nitty-gritty of SAP Certification, all these activities are the responsibility of the SAP services provider.</p>
<p>What would be the effort ? As with any IT project, we need to set the boundaries and scope of work to reach the effort and costs. As a rough estimate, an ISV can achieve their initial goals through a 3 month project with a 3 person team; With capable SAP expertise available offshore, the offshore costs should hopefully justify an SAP migration project to make it into your engineering and marketing budgets for the next quarter.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/benefits-of-sap-integration-sap-based-product-capability-for-independent-software-vendors-isv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Performance Tuning a Complex Application: An Example</title>
		<link>http://www.nagarro.com/blog/performance-tuning-a-complex-application-an-example/</link>
		<comments>http://www.nagarro.com/blog/performance-tuning-a-complex-application-an-example/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 19:33:48 +0000</pubDate>
		<dc:creator>Ram Kripal Prasad</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=464</guid>
		<description><![CDATA[We recently undertook an exercise to analyze the database performance, and subsequently optimize the overall performance for large, data-intensive business application. This post outlines the approach we adopted to analyze the problem, and how we went about arriving at solutions.
A Bit of Background
The application database is SQL Server 2005, single instance (non replicated, non clustered). [...]]]></description>
			<content:encoded><![CDATA[<p>We recently undertook an exercise to analyze the database performance, and subsequently optimize the overall performance for large, data-intensive business application. This post outlines the approach we adopted to analyze the problem, and how we went about arriving at solutions.<span id="more-464"></span></p>
<p><strong>A Bit of Background</strong><br />
The application database is SQL Server 2005, single instance (non replicated, non clustered). The database has patient data (Electronic Medical Records) and the end clients (clinics and hospitals) access this data via web services. The database had around 3 million records, which they expected to scale to around 5 million. The software product vendor was receiving performance related complaints from end customers, and had solicited our help in resolving these issues.</p>
<p><strong>Analysis</strong><br />
The first step was to establish the nature of the performance problems. For this we worked with the business and development teams of ISV to determine the nature of the performance issues. Users had reported performance problems in the following situations:</p>
<ul>
<li>Longer than expected response times for transactions or queries.</li>
<li>Insufficient transaction throughput to complete the required workload.</li>
<li>Decrease in transaction throughput.</li>
</ul>
<p>We needed to</p>
<ul>
<li>Determine if the performance degrades with increased load or with increase in data in the system.</li>
<li>Determine the volume of historical data and if they cause long running queries.</li>
<li>Examine the hardware configuration (RAID, multiple disk controllers) of disk subsystems.</li>
<li>Take regular measurements of resource utilization and database activity and determine whether there is a disproportionate utilization of CPU, memory, disks or network. System Monitor (aka Performance Monitor) helps to identify potential hardware bottlenecks w.r.t. a few key counters (see <a href="http://www.sql-server-performance.com/articles/per/performance_audit_part2_p1.aspx"><span style="color: #0000ff;">http://www.sql-server-performance.com/articles/per/performance_audit_part2_p1.aspx</span></a>) and potentially obvious performance problems.</li>
</ul>
<p>The next step was to establish performance objectives. For this we developed a plan for measuring the system performance. The most common metrics used for measuring database application performance are:</p>
<ul>
<li>transactions per second (TPS)</li>
<li>response time</li>
</ul>
<p>We then needed to define clear objectives for the above metrics. Selecting a tool (we evaluated some of the many available; refer: <a href="http://www.testingfaqs.org/t-load.html"><span style="color: #0000ff;">http://www.testingfaqs.org/t-load.html</span></a>) that can automate measuring the TPS and/or response times by generating peak / off–peak / average load conditions.</p>
<p>We would regularly monitor the application performance on these metrics to get a feedback on whether the optimization changes are reaping any improvements.</p>
<p>The next post shall cover a discussion of the various solution approaches that could be adopted to improve the database problems once the problems (or at least some pattern that may be imminent in the problem) have been identified. I shall describe the various areas and perspectives of looking for a solution to the database performance problems.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/performance-tuning-a-complex-application-an-example/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Managing Remote Development for SAP NetWeaver Projects</title>
		<link>http://www.nagarro.com/blog/how-to-conduct-remote-development-for-sap-netweaver-projects/</link>
		<comments>http://www.nagarro.com/blog/how-to-conduct-remote-development-for-sap-netweaver-projects/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 12:41:34 +0000</pubDate>
		<dc:creator>Manish Agarwal</dc:creator>
				<category><![CDATA[SAP]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=468</guid>
		<description><![CDATA[Overview and best practice for conducting SAP Netweaver project with a distributed team and remote located offsite team.]]></description>
			<content:encoded><![CDATA[<p>SAP NetWeaver projects are characterized by a high degree of core development activities, and less of business re-engineering or process re-engineering or SAP systems configuration. Hence, the extent for interaction with the customer&#8217;s Business team is much less as compared to a &#8220;traditional&#8221; SAP development project.<span id="more-468"></span></p>
<p>An SAP NetWeaver project would typically consist of identifying new business processes to be implemented, new SAP BW reporting, new data integrations etc. The SAP Netweaver is a platform that provides implementation of new processes and data visualization applications where the SAP ECC is at the backend. Hence, the need for SAP ECC core configurations is minimal.</p>
<p>As with any development project, the initial phase of the project needs close understanding of business requirements. This requires the Business process consultant to personally interact with the business and identify the business requirements through workshops, white boarding and discussions over printouts/charts/sheets etc. This process typically takes 10% of the total project effort for capturing the high level requirements. This phase of the projet has to be conducted onsite to fully interact with the business and understand their true requirements and aspirations.</p>
<p>Thereafter, the next level of details can be arrived at by the remote development team located at the offshore location. This includes creation of mock User Interface and mock process walkthrough to confirm the requirements. This is a partial development activity and can be efficiently conducted offsite. All artifacts can be discussed with the customer team remotely, with the partial assistance of the onsite consultant. This activity may take about 20% of the total project effort.</p>
<p>Thereafter, the design and development phase of the project can be totally conducted offshore. This phase takes 40% of the total project effort and needs access to deep SAP Netweaver expertise. We do not need close co-ordinatation with the business for this phase. Hence, this phase is ideally suited for offshore execution because it needs access to deep SAP Netweaver expertise and can lead to significant cost reductions for the customer.</p>
<p>The object is unit tested, and then provided to the customer for integration testing and acceptance testing. Thereafter, the approved objects can be deployed to production. All these activities take the remaining 30% of the project effort.</p>
<p>As we can observe, the initial phase of capturing high level business requirements needs an onsite presence to determine scope and negotiate with the Business to reach a technically feasable and cost-effective solution. Almost all the remaining activities can be efficiently conducted offsite to leverage the team knowledge and SAP Netweaver expertise available in the offshore team.</p>
<p>In our direct experience, we are observing customers to benefit through SAP NetWeaver offshoring by getting access to Netweaver experts located at offshore locations, and also get cost savings due to lower cost offshore pricing. This lives up to our motto of doing the &#8220;right activities at the right location&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/how-to-conduct-remote-development-for-sap-netweaver-projects/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Behind the Scenes at Qtrax</title>
		<link>http://www.nagarro.com/blog/behind-the-scenes-at-qtrax/</link>
		<comments>http://www.nagarro.com/blog/behind-the-scenes-at-qtrax/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 18:29:25 +0000</pubDate>
		<dc:creator>Vikas Sehgal</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=455</guid>
		<description><![CDATA[
We recently caught up with Chris Roe, CTO of Qtrax, in New York to find out more about his experience as a Nagarro customer. Qtrax and Nagarro have been working around the clock for months preparing for the launch of Qtrax 1.0, the industry’s first free and legal peer-to-peer music download service.  Qtrax had a [...]]]></description>
			<content:encoded><![CDATA[<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="560" height="340" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/-df0hsTH-VA&amp;hl=en&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="560" height="340" src="http://www.youtube.com/v/-df0hsTH-VA&amp;hl=en&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>We recently caught up with Chris Roe, CTO of <a href="http://music.qtrax.com/">Qtrax</a>, in New York to find out more about his experience as a Nagarro customer. Qtrax and Nagarro have been working around the clock for months preparing for the launch of Qtrax 1.0, the industry’s first free and legal peer-to-peer music download service.  Qtrax had a tall order – linking a massive music file system with ad-serving features while enabling millions of site visitors to rapidly download an unlimited number of high-quality music files.</p>
<p>Oh, and did we mention that they needed it done in just four months? Click on the video to hear how Nagarro rose to the challenge.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/behind-the-scenes-at-qtrax/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>.NET Reflection: The untouchable? No, not at all.</title>
		<link>http://www.nagarro.com/blog/net-reflection-the-untouchable-no-not-at-all/</link>
		<comments>http://www.nagarro.com/blog/net-reflection-the-untouchable-no-not-at-all/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 14:08:25 +0000</pubDate>
		<dc:creator>Vikas Burman</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/net-reflection-the-untouchable-no-not-at-all/</guid>
		<description><![CDATA[I am a big fan of .NET reflection. However most often you will hear more of critics than praise. The biggest of all &#8220;It’s slow.&#8221; Web is full of cautions and warnings telling you not to use it. Some will go as far as saying that if you care for performance, do not even think [...]]]></description>
			<content:encoded><![CDATA[<p>I am a big fan of .NET reflection. However most often you will hear more of critics than praise. The biggest of all &#8220;<em>It’s slow.</em>&#8221; Web is full of cautions and warnings telling you not to use it. Some will go as far as saying that if you care for performance, do not even think about using reflection. If you go on and read beyond the highlight points, you will realize that a large percentage of these warnings and cautions are discussing a particular scenario where some developer failed to get what s/he was trying to achieve. And while being judgmental with the experiment a generalized statement like this comes up as an end result.<span id="more-453"></span></p>
<p>The problem of making such general rules about programming practices is that you tend to miss out the benefits by following these rules too literally in every context. Think it on the lines – Reflection or any feature for that matter, if included must have a valid reason for its presence. We should be able to see and know how and when to use it and when specifically to avoid it.</p>
<p>Reflection is slow; but the question is <em>how slow is slow?</em> One should worry about performance but this worry should not keep you away from making best use of a technology. If you look around in .NET world, you will realize that .NET framework itself uses a lot of reflection. Ability to store meta-data about your code and to be able to use it at runtime opens the door to a whole lot of possibilities limited only by your imagination.</p>
<p><!--more--></p>
<p>If you rethink it it’s just one another way of storing and working with information; difference being that this information is stored in code itself. So instead of retrieving information from some XML file or database, you are pulling it in from the code itself. Therefore your concerns towards writing optimized code while reading data from XML (e.g., load once read many times) or from database (e.g., making fewer trips to database), etc. will not be much different when using reflection. You might want to fetch type info once and hold it for future calls as well instead of fetching it every time you need it.</p>
<p>As in case of database, we know where to use joins, on which columns to create indexes and which <em><strong>where</strong></em> clauses to use to get optimized execution time; in case of reflection too there is a well defined grammar to make optimized reflective calls. For example, using <strong><em>BindingFlags</em></strong> enumeration correctly, not trying to use <strong><em>IgnoreCase</em></strong> flag, and limiting your searches to <strong><em>public</em></strong> or <strong><em>static</em></strong> or <strong><em>instance</em></strong> members as required, will definitely give you best possible results. <a href="http://msdn.microsoft.com/en-us/magazine/cc163759.aspx">Joel Pobar’s post</a> talks at length about how reflection works internally and is a good reference to understand how to avoid performance pitfalls.</p>
<p>Don’t just assume that reflection will hit the performance, but use it, test it, tweak it for performance optimization and enjoy the flexibility it provides. If you think your problem statement has a solution in reflection; don’t hesitate in going ahead just because someone says that it will be slow. If this turns out to be slow; there are ways to optimize it too. For instance <a href="http://msmvps.com/blogs/jon_skeet/archive/2008/08/09/making-reflection-fly-and-exploring-delegates.aspx">Jon Skeet’s post</a> talks about using <strong><em>Delegate.CreateDelegate</em></strong> to turn a <strong><em>MethodInfo</em></strong> into a strongly-typed delegate. This can improve performance massively in scenarios where you need to set the same properties multiple times. Essentially this means that a lot of the type checking is done once when you created the delegate, rather than on every invocation.</p>
<p>Let’s explore a scenario where reflection is no harm to use and probably the only way you can achieve the end result with.</p>
<p><strong><em>You want dynamic extensibility to your desktop application; your revenue model includes selling various groups of features separately. You do not want to build multiple deployment packages and you want to be able to provide even more features to your customers after they have started using your application.</em></strong> How would you do it?</p>
<p>You might do this by developing a plug-in model in your application.</p>
<p>You may define an <em>IMyAppPlugin</em> interface which can be implemented in each of your application’s plug-in assembly implementing a specific feature. At minimum you may have following definition:</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">interface</span> IMyAppPlugin
{
    Guid Identifier { get; }
    <span class="kwrd">string</span> Name { get; }
    <span class="kwrd">string</span> Copyright { get; }
    <span class="kwrd">bool</span> Start(IHostApp hostApp);
    <span class="kwrd">void</span> Stop();
    <span class="kwrd">bool</span> Run();
}</pre>
<p>You will not have any reference of these assemblies in your project at design time. Its only at runtime when you will try to discover these plug-in assemblies (using some mechanism such as looking in specific folder or registry, an XML file or anything else) and load it using reflection.</p>
<p>You will write code to find and create instance of the class that implements this IMyAppPlugin interface. Once you have this object you can initialize it by calling its <em>Start()</em> method passing your application’s reference as required. You may also write code to add access points (such as menu items) for this dynamic functionality to appear in your application’s user interface when this plug-in is successfully loaded.</p>
<p>A call to <em>Run()</em> method anytime after this will do what is desired.</p>
<p>So essentially what we are doing here is that we have loaded the assembly using reflection and we are calling methods dynamically again using reflection. If we just go by numbers, yes dynamically invoking a method is slow. Referring to <a href="http://www.west-wind.com/weblog/posts/351.aspx">Rick Strahl’s post</a> we can say that invoking a method dynamically is about 3.5 to 4 times slower than directly calling of a method. But again the question needs to be asked – <em>how slow is slow?</em> Here we are talking about few milliseconds extra. Unless you are making calls in a loop for a large number of times, does it really matter in the larger perspective of a typical application? Most likely – No!</p>
<p>Remember .Net Framework and especially ASP.Net uses a lot of reflection internally to provide dynamic execution of code and controls.</p>
<p>Talking again about the above scenario, if not reflection, do we have some other relevant approach of dynamically extending the application? You may talk about using COM interfaces to achieve it – but reflection or no reflection – the essence of every approach is to dynamically resolve the address of the method to be called, which is the only major difference wrt static calls where this address is readily available.</p>
<p>This is just one scenario where reflection proves to be the most effective and simplified approach to work with. There are a lot of other scenarios where reflective access to properties, fields and methods provides enormous flexibility that simply wouldn&#8217;t be there otherwise.</p>
<p>With <a href="http://msdn.microsoft.com/en-us/library/dd233052(VS.100).aspx">Dynamic Language Runtime</a> (DLR) in .NET 4.0 we are heading towards a cleaner reflection. Eventually this may replace reflection how we see it today, due to its simplified code and caching advantages. In-fact as mentioned in this <a href="http://blogs.msdn.com/hugunin/">Jim hugunin’s post</a>, it appears that DLR too internally makes good use of reflection.</p>
<p>In short, do not shy away from using reflection, just because you hear warnings about it. Always verify if these warnings apply to your project or scenario. Often they will not. As they say, “trust but verify!</p>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/net-reflection-the-untouchable-no-not-at-all/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>My Tryst with “The Gu”</title>
		<link>http://www.nagarro.com/blog/my-tryst-with-%e2%80%9cthe-gu%e2%80%9d/</link>
		<comments>http://www.nagarro.com/blog/my-tryst-with-%e2%80%9cthe-gu%e2%80%9d/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 04:28:56 +0000</pubDate>
		<dc:creator>Harish Tejwani</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=440</guid>
		<description><![CDATA[I recently got the opportunity to represent Nagarro at a Microsoft Event,  where Scott Guthrie was speaking. Scott runs Microsoft’s Developer Division and is a great visionary and speaker. After the keynote there was a informal session of developers with “The Gu” on what’s coming in .NET. It was amazing to see how Scott [...]]]></description>
			<content:encoded><![CDATA[<p>I recently got the opportunity to represent Nagarro at a Microsoft Event,  where Scott Guthrie was speaking. Scott runs Microsoft’s Developer Division and is a great visionary and speaker. After the keynote there was a informal session of developers with “The Gu” on what’s coming in .NET. It was amazing to see how Scott went down to lowest level details in explaining everything and anything related to .NET technologies be it on Silverlight 3.0, .NET RIA Services, ASP.NET MVC, IIS 7.0, SEO and so on.<span id="more-440"></span></p>
<p>At end there was Q&amp;A session where I ended up raising my hand and asking a question  “with so many technology choices available even in .NET for same tasks, the choice picking correct ones becomes tougher, with lack of guidance and gave several examples”. The reply was “That’s a great question” followed by a long answer – explaining the reason why this has happened and a nod of creating more practices and patterns around this topic. Highly encouraged, I ended up asking many more – till I was shut down by moderator! I ended up getting his autograph and a picture together using my low end camera phone – but a moment to remember!</p>
<div id="attachment_443" class="wp-caption alignleft" style="width: 160px"><img class="size-thumbnail wp-image-443" title="Tryst with Gu" src="http://www.nagarro.com/blog/wp-content/uploads/2009/10/Tryst-with-Gu-150x150.jpg" alt="My Tryst with Gu" width="150" height="150" /><p class="wp-caption-text">With &quot;The Gu&quot;</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/my-tryst-with-%e2%80%9cthe-gu%e2%80%9d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cloud Computing Series: Exploring the Google App Engine Java Runtime Environment</title>
		<link>http://www.nagarro.com/blog/cloud-computing-series-exploring-the-google-app-engine-java-runtime-environment/</link>
		<comments>http://www.nagarro.com/blog/cloud-computing-series-exploring-the-google-app-engine-java-runtime-environment/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 17:42:59 +0000</pubDate>
		<dc:creator>Ram Kripal Prasad</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Cloud computing]]></category>
		<category><![CDATA[GAE]]></category>
		<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Runtime Environment]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=418</guid>
		<description><![CDATA[Google recently released a Java runtime environment for their App Engine platform. As a software development organization, this offering is of special interest to Nagarro, as it offers several advantages over competing cloud hosting environments. Hosting a Java application on Google’s infrastructure provides automatic scaling and load balancing, a feature that is of interest to [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-424" title="Various Cloud Formations" src="http://www.nagarro.com/blog/wp-content/uploads/2009/09/photo_13459_20090818-150x150.jpg" alt="Various Cloud Formations" width="78" height="78" />Google recently released a Java runtime environment for their App Engine platform. As a software development organization, this offering is of special interest to Nagarro, as it offers several advantages over competing cloud hosting environments. Hosting a Java application on Google’s infrastructure provides automatic scaling and load balancing, a feature that is of interest to a number of our software product development ISV customers. To better understand the issues and risks, we conducted an internal exercise to assess the technical effort required to port an existing application to the Google App Engine for Java (GAE-J).<span id="more-418"></span><br/><br/><strong>A Bit of Background</strong><br/><br/>GAE-J is a complete development stack that uses familiar Java technologies like JSPs, servlets and JavaScript to build and host web applications. With GAE-J we would write the application code, test it on the local machine and upload it to Google with a simple click of a button or a command line script. Once the application is uploaded to the Google infrastructure, it would host and scale the application for us. We would then, no longer need to worry about system administration, bringing up new instances of the application, clustering the database or buying new machines.<br/><br/>GAE-J provides access to many popular services from the enterprise applications world, including a scheduler, logging that can be reported from the Google Application console, mail, caching and URL fetch. It also provides elegant integration with technologies like Spring, Sitemesh, Struts etc.<br/><br/>GAE-J also makes it easy to serve static files like Images, CSS style sheets, JavaScript code, movies and Flash animations can served directly to the browser from separate servers that those that invoke servlets.<br/><br/>As you would expect from initiatives by Google, GAE-J comes with extensive online documentation &#8211; including quick start guides which I found invaluable. Also, Google provides many tools that make coding and developer testing simple and quick. GAE-J provides a local sandbox (based on Jetty) that should be used for testing before deploying into the cloud. The development web server simulates the App Engine Java runtime environment and all of its services, including the datastore. The <span style="color: blue;">Google Plugin for Eclipse </span>can run the server in the Eclipse debugger. You can also run the development server from the command line.<br/><br/><strong>Our Experience</strong><br/><br/>We found that using Google App Engine has great advantages, but it also has serious limitations. Google has implemented a tight security model on GAE-J, and you can&#8217;t write to the file system, it is read-only. You can only store data using the Google Datastore API. On first look, this seemed like a big restriction, but given the fact that the servers are clustered, it made sense in the long run.<br/><br/>In the GAE-J sandbox, the application code only runs in response to a web request or a <em>cron</em> job, and must return response data within 30 seconds in any case. A request handler cannot spawn a sub-process or execute code after the response has been sent.<br/><br/>Uploading the initial data is another challenge; however, that may be solved by providing the capability to upload data into the data store of the application itself.<br/><br/>It is also evident that GAE-J is still in its infancy and has glaring restrictions (for example: GAE-J sets a hard limit to the number of application and static files in the application; refer to <a href="http://code.google.com/appengine/docs/java/runtime.html#Quotas_and_Limits"><span style="color:blue;">The Java Servlet Environment &#8211; Quotas and Limits</span></a>.) IMO that needs to be addressed ASAP; to continue its evolution into a serious contender in the Cloud Services industry.<br/><br/>In conclusion, we found that moving an existing project to GAE-J’s infrastructure is not a trivial job, but it can be done. There are a big number of areas that differ between traditional web applications and Google’s app engine. I agree with Abhijat’s post on <a title="Cloud Computing Demystified: Part-I" href="../cloud-computing-demystified-part-i/"><span style="color:blue;">Cloud Computing Demystified: Part-I</span></a> <strong><em>#<span style="font-family:"> the real cost of using these services </span></em></strong>that identifying and reconciling all these differences would require significant work; esp. in view of the fact that in many cases it may be imperative that the changes (refactoring / re-organizations) made MUST work nicely with the traditional deployment as well. Specifically, certain areas such as the constraints from traditional relational database methodology, restrictions on the number of URLMap entries etc. may induce a re-design of the application and add to the challenges of migrating to the GAE-J cloud.<br/><br/>It would be much easier to develop a new project on GAE-J where innovative architectures for an application could be explored, rather than trying to port an existing application.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/cloud-computing-series-exploring-the-google-app-engine-java-runtime-environment/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>&#8220;Customer Facing Innovation&#8221; &#8211; a View from the Midsize Enterprise Summit</title>
		<link>http://www.nagarro.com/blog/customer-facing-innovation-a-view-from-the-midsize-enterprise-summit/</link>
		<comments>http://www.nagarro.com/blog/customer-facing-innovation-a-view-from-the-midsize-enterprise-summit/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 16:48:43 +0000</pubDate>
		<dc:creator>Vishal Gauri</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Cloud computing]]></category>
		<category><![CDATA[IT budgets]]></category>
		<category><![CDATA[Midsize Enterprises]]></category>
		<category><![CDATA[Virtualization]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=412</guid>
		<description><![CDATA[As we interact with CIOs of midsize companies at the MES show, there are several common themes that come out in the conversations. While cost-cutting has been the overwhelming focus of IT organizations in the last year, there seems to be a change in objectives going forward. More CIOs seem to be focused on ways [...]]]></description>
			<content:encoded><![CDATA[<p>As we interact with CIOs of midsize companies at the MES show, there are several common themes that come out in the conversations. While cost-cutting has been the overwhelming focus of IT organizations in the last year, there seems to be a change in objectives going forward. More CIOs seem to be focused on ways to increase business revenues, rather than containing costs. The projects that are being funded are the ones that involve customer facing solutions, challenging IT to provide innovation that is targeted at end customers, rather than internal business users.</p>
<p>A number of companies have had positive experiences with server virtualization over the last couple of years, and are looking to take the next step &#8211; virtualizing their desktop systems. Cloud computing, especially storage is finding increased traction in the midsize organizations, as they look to improve business continuity and disaster recovery plans. Another trend seems to be the increased focus on building relationships with external service companies in this market segment, as IT executives seek to do more with less.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/customer-facing-innovation-a-view-from-the-midsize-enterprise-summit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nagarro Boosts Competitive Strategy for QISoft</title>
		<link>http://www.nagarro.com/blog/nagarro-boosts-competitive-strategy-for-qisoft/</link>
		<comments>http://www.nagarro.com/blog/nagarro-boosts-competitive-strategy-for-qisoft/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 23:21:17 +0000</pubDate>
		<dc:creator>Vishal Gauri</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[SAP]]></category>
		<category><![CDATA[Netweaver]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=391</guid>
		<description><![CDATA[Today Nagarro announced a new SAP NetWeaver project with QISoft, a customer in the manufacturing execution systems (MES) space. As a provider of Windows-based software, QISoft had been facing a major competitive obstacle in attracting customers running SAP on the backend. Nagarro is developing a new SAP-based product suite to allow QISoft to compete more effectively.
With [...]]]></description>
			<content:encoded><![CDATA[<p>Today Nagarro announced <a href="http://www.nagarro.com/NewsEvents/Press%20Releases/Nagarro-Boosts-QISoft.aspx">a new SAP NetWeaver project with QISoft</a>, a customer in the manufacturing execution systems (MES) space. As a provider of Windows-based software, QISoft had been facing a major competitive obstacle in attracting customers running SAP on the backend. Nagarro is developing a new SAP-based product suite to allow QISoft to compete more effectively.<span id="more-391"></span></p>
<p>With our expertise in software product development, manufacturing and SAP consulting, we knew Nagarro was a great fit for QISoft. But the winning the business was only the beginning. The real success story here is that Nagarro is making an immediate, positive impact on QISoft’s long-term competitive advantage.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/nagarro-boosts-competitive-strategy-for-qisoft/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cloud Computing Demystified: Part-I</title>
		<link>http://www.nagarro.com/blog/cloud-computing-demystified-part-i/</link>
		<comments>http://www.nagarro.com/blog/cloud-computing-demystified-part-i/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 18:05:41 +0000</pubDate>
		<dc:creator>Abhijat Vatsyayan</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Cloud computing]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=336</guid>
		<description><![CDATA[I recently took part in a panel discussion on cloud computing and how it relates to software architecture. The event used an online event organizer for signing up and the website wouldn&#8217;t let me register for the event. I later found out that I could not sign-up because the event was sold out. This says [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><span style="color: #000000;">I recently took part in a panel discussion on cloud computing and how it relates to software architecture. The event used an online event organizer for signing up and the website wouldn&#8217;t let me register for the event. I later found out that I could not sign-up because the event was sold out. This says something about the hype surrounding cloud computing which has become the in-thing to be &#8217;seen with&#8217;. The panel discussion was interesting and animated and one takeaway for me was that everybody had their own idea of what cloud computing is and to some it was barely more than a buzzword.<span id="more-336"></span> </span></p>
<p style="text-align: justify;"><span style="color: #000000;">So, is cloud computing merely hype? While there truly is value in what is provided by Amazon (<span style="color: #800080;"><a title="Cloud Computing provider" href="http://aws.amazon.com/ec2/" target="_blank">EC2</a> </span>and <span style="color: #800080;"><a title="AWS" href="http://aws.amazon.com/" target="_blank">other services</a></span>), <span style="color: #800080;"><a title="Google App Engine" href="http://code.google.com/appengine/">Google&#8217;s App Engine</a></span>, <span style="color: #800080;"><a title="Azure" href="http://www.microsoft.com/azure/default.mspx" target="_blank">Microsoft&#8217;s Azure</a></span> and a few others, the providers (or at least their marketing teams), if you ask me, have not helped a whole lot.  It seems like every company that used to provide virtual private servers is now a cloud computing provider. So are companies that used to provide hosting solutions, and every company that used to be a destination for an outsourced data center. Soon, we will have clouds of every other conceivable kind! When a term can be applied to pretty much anything, the term starts losing its meaning. Cloud computing, which I would put in the first stage of Gartner&#8217;s Hype-Cycle (hype followed by disillusionment followed by realization), is the latest buzzword that marketing teams love to apply to anything they can. I asked representatives from several companies that claim to provide cloud solutions what did they really mean when they talked about a &#8220;cloud&#8221;. When pushed, pretty much all of them ended up saying &#8211; &#8220;its just a buzzword&#8221;.</span></p>
<p style="text-align: justify; "><span style="color: #000000;">Getting back to the panel discussion, there were several strands of discussion which I would have liked to address in detail but couldn&#8217;t because of time constraints. So I decided to use this blog to move the discussion online (and to also share it with a wider audience). In this and subsequent posts, I will try to summarize as well as share my view of this technology, starting with some of the points from the panel. </span></p>
<ul style="text-align: justify;">
<li><span style="color: #000000;"><strong>Cloud computing is nothing new:</strong> Cloud computing, like most other technologies, is an evolution, not a revolution. If it does end up changing the way we develop, deploy and manage software (and other components), we might start calling it a revolution but at this time, it represents incremental but very useful changes in several existing technologies and how it all comes together. Most offerings use virtualization, deliver services over the Internet and expose HTTP based APIs for accessing and controlling the services. But what is truly important for me is not whether its new or old; but whether it solves my technical and business problems. There are several class of applications and organizations for which EC2, Azure or Google App Engine is the right choice.  Moreover, I can not think of  a single service in the late 90s or early 2000s where I could provision Linux boxes in a matter or minutes by just signing up on a website using a credit card.  If nothing else, the sheer ease of use and affordability (at least in the beginning) is an innovation worth taking note of (and make use of if, it makes sense). My take on it &#8211; it works great when you use it to solve the problem it was designed to solve.</span></li>
<li><span style="color: #000000;"><strong>There is no such thing as infinite scalability:</strong> The use of term &#8220;Infinitely Scalable&#8221; by the cloud computing service providers, in my opinion, is misguided. A better term to use would be &#8220;Sufficiently Scalable&#8221; but it does not have the same ring to it. Amazon&#8217;s or Google&#8217;s infrastructure can effectively provide &#8220;<em>sufficient</em>&#8221; scalability for small application. If you are mostly running on a couple of Xeons with 12GB of Ram or so, a typical spike in demand might need you to scale up by 4 or 5 times which can easily be handled by the Amazons of this world. I suspect, however, that you can not run another Amazon on Amazon&#8217;s infrastructure (especially during Christmas time!). There is a slightly different but related discussion about differences of scale and statistical models which I will not get into.</span></li>
<li><span style="color: #000000;"><strong>What about the security of my data</strong>? Its no less secure that using a hosting solution of the past. While people like to complaint about Hypervizor breaches and how most cloud computing providers (especially those who provide infrastructure as a service)  use virtualization, the reality is that Hypervisors are far more secure that the operating systems they run. The two main and mostly related reasons for this is that the people who build Hypervizors realize this (and they are a pretty smart bunch), and that the Hypervizors are kept as small as possible. While I am not an expert in this area, the last time I was talking to one of the experts in Hypervizor and virtual machine security, he took pains to point out that inspite of the fact that it is bad for his business, Hypervizor breaches are extremely rare and that most Hypervizors are quite secure. I would, however, like to point out that what happens in case of a security breach is still not clear. We simply do not know enough about this stuff. And if you have contractual or legal requirements that prohibit you from moving your data into the cloud, you will simply have to wait until the lawyers catch up with the technology and the providers address these concerns directly through their SLAs. </span></li>
<li><span style="color: #000000;"><strong>The clouds are not interoperable<em>.</em></strong> Because every-body&#8217;s offering of &#8220;cloud&#8221; services is different, the questions of interoperability while being a very important question, does not make sense at this time. The really compelling offerings today are from Amazon (EC2 being the big one, but there is also SQS and S3 and a few others), Google (app engine) and Microsoft&#8217;s Azure.  EC2 gives you virtual Linux servers (and now windows too) and options of launching pre-configured servers. If all you are truly using is the Linux platform, nothing stops you from moving over to someone else who will also provide you Linux boxes (either virtualized or real). While you may have to make a lot of changes to migrate your Java application over to Google App Engine, taking your application out of the App Engine and deploying it somewhere else should not be a problem (assuming you have appropriately abstracted out the areas that use Google specific APIs). I have heard talks of Azure supporting Java (and a few other platforms) in the future and it will be interesting to see how portable Java applications will be between Google App Engine and Azure. </span></li>
<li><span style="color: #000000;"><strong>What is the real cost of using these services?</strong> This is a tough one and merits at least a white paper of its own. I do not have a clear answer but I say this &#8211;  two main advantages of the cloud, <em>the ability to scale up when you need to, and pay only for what you use</em> go a long way in making cloud computing solutions cost effective. If you know your usage and it does not vary much, you do not really need to use a cloud computing provider.  There is work needed for moving an existing application either completely or partially into the cloud and you should not, as a matter of basic engineering principle, use a cloud simply because its the in-thing. It will not make sense and it will not be cost effective. You may, however, have other reasons for using Amazon or Google (for example, cloud computing payment models let you convert your capital expenses into operational expenses). </span></li>
</ul>
<p style="text-align: justify;"><span style="color: #000000;">In my next post on cloud computing, I will list some of the prevalent definitions of cloud computing and try to factor out the characteristics that make most sense to me (especially for providers that we are most interested in) and try to come up with a working definition of the term that is most relevant to us as software architects/designers/engineers.</span></p>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/cloud-computing-demystified-part-i/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>A better way to test email sending functionality is to use your own SMTP Server</title>
		<link>http://www.nagarro.com/blog/a-better-way-to-test-email-sending-functionality-is-to-use-your-own-smtp-server/</link>
		<comments>http://www.nagarro.com/blog/a-better-way-to-test-email-sending-functionality-is-to-use-your-own-smtp-server/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 07:09:14 +0000</pubDate>
		<dc:creator>Vaibhav Gadodia</dc:creator>
				<category><![CDATA[Testing]]></category>
		<category><![CDATA[Tools and Utilities]]></category>
		<category><![CDATA[Email]]></category>
		<category><![CDATA[SMTP Server]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/a-better-way-to-test-email-sending-functionality-is-to-use-your-own-smtp-server/</guid>
		<description><![CDATA[A large number of applications today have some kind of a notification mechanism built-in. More often than not, an email is used to send these notifications. Typically, while developing these applications, developers use their own inbox to send notifications to. Or they setup some dummy account to send test emails to; or sometimes they might [...]]]></description>
			<content:encoded><![CDATA[<p>A large number of applications today have some kind of a notification mechanism built-in. More often than not, an email is used to send these notifications. Typically, while developing these applications, developers use their own inbox to send notifications to. Or they setup some dummy account to send test emails to; or sometimes they might send test mails to real users (it&#8217;s been known to happen).<span id="more-335"></span></p>
<p>There are many limitations to this approach:</p>
<ul>
<li>one has to deal with dummy messages arriving in the inbox, when all that you want to test is your email sending code.</li>
<li>automating the testing of the email sending code will result in a large number of emails being generated and delivered to your inbox.</li>
<li>code that is supposed to deliver large amounts of email will generate a lot of load on the Internet bandwidth (and yes that can be a problem).</li>
<li>if you are testing on a copy of a production database, you might inadvertently end up sending test emails to real users.</li>
</ul>
<p>There are other issues present as well. One solution to solving these problems is to use your own SMTP server to handle all these emails in a manner that it receives an email and doesn&#8217;t sent it forward. So, it is like a dummy SMTP server. But setting up an SMTP server is usually a hassle.</p>
<p><!--more--></p>
<p>There are plenty of options out there which make your job much easier than you think it is. In this post, I am going to list some solutions which can be used (though there are many more). The basic premise behind this approach is to run a local SMTP server (either on the developer box, or the test server, or both, or somewhere on the LAN). This local SMTP server address is what is configured as the server address in your application which is being tested. Any mail sent to such a server is kept with the server and not forwarded, thus preventing all the above listed issues.</p>
<p>Following are some of the more popular out-of-the-box programs that can be used (click on the names to go to their websites):</p>
<ul>
<li><a href="http://invalidlogic.com/papercut/"><strong>Papercut</strong></a><strong> </strong>- this is a simple windows application which will run in your System Tray and simulate an SMTP server; it receives and stores any messages it receives. It allows you to view the messages. It sits in your system tray and alerts you whenever a new message arrives.</li>
<li><a href="http://www.donovanbrown.com/post/2008/10/20/Neptune.aspx"><strong>Neptune</strong></a><strong> &#8211; </strong>this is another application which will do a similar task. It is however a little more advanced. It has an admin API interface which allows you to run custom queries to analyze the messages that it processes. It doesn&#8217;t have a UI through which you can view the received message though &#8211; but sometimes all you need to check is if the messages are being delivered. Very useful in a bulk messaging scenario.</li>
<li><a href="http://smtp4dev.codeplex.com/"><strong>smtp4dev</strong></a> &#8211; this is another option similar to Papercut, which again sits in the system tray and will let you know whenever any message arrives and will let you look at the message details.</li>
</ul>
<p>There are many more out there which can be used to do similar things with some features here and there (for example, Neptune doesn&#8217;t generate all SMTP responses). Here&#8217;s a post by Phil Haack from long ago which is also interesting: <a href="http://haacked.com/archive/2006/05/30/ATestingMailServerForUnitTestingEmailFunctionality.aspx">A testing mail server for unit testing email functionality</a>.</p>
<p>So, when you feel the need to test your email sending code the next time, it might make sense to have one of the tools (or something similar) available.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/a-better-way-to-test-email-sending-functionality-is-to-use-your-own-smtp-server/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Want to Know What our Customers Think?</title>
		<link>http://www.nagarro.com/blog/want-to-know-what-our-customers-think/</link>
		<comments>http://www.nagarro.com/blog/want-to-know-what-our-customers-think/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 18:01:45 +0000</pubDate>
		<dc:creator>Vikas Sehgal</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=329</guid>
		<description><![CDATA[
Get a look behind the scenes at Pacific Southwest Container, a midsize manufacturer of sustainable custom packaging.  Nagarro’s custom applications enable PSC to optimize use of printing materials and equipment, reducing PSC’s costs and waste. End result? Cost savings are passed along to customers, while PSC improves its environmental footprint. Please view this short [...]]]></description>
			<content:encoded><![CDATA[<p><code><object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/l4CJ8sOUgSw&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/l4CJ8sOUgSw&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object></code></p>
<p>Get a look behind the scenes at <em>Pacific Southwest Container</em>, a midsize manufacturer of sustainable custom packaging.  Nagarro’s custom applications enable PSC to optimize use of printing materials and equipment, reducing PSC’s costs and waste. End result? Cost savings are passed along to customers, while PSC improves its environmental footprint. Please view this short video and let us know what you think!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/want-to-know-what-our-customers-think/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using ActiveRecord for Database Setup and Migration: A How-to</title>
		<link>http://www.nagarro.com/blog/using-activerecord-for-database-setup-and-migration/</link>
		<comments>http://www.nagarro.com/blog/using-activerecord-for-database-setup-and-migration/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 15:20:08 +0000</pubDate>
		<dc:creator>Ram Kripal Prasad</dc:creator>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[LAMP]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=305</guid>
		<description><![CDATA[One of the first places where the ActiveRecord pattern first appeared, was in the book Patterns of Enterprise Architecture by Martin Fowler. The ActiveRecord pattern embeds the knowledge of how to interact with the database directly into the class performing the interaction.
Per Wikipedia  
With ActiveRecord, a database table or view is wrapped into a class, thus [...]]]></description>
			<content:encoded><![CDATA[<p>One of the first places where the ActiveRecord pattern first appeared, was in the book <em>Patterns of Enterprise Architecture</em> by <em>Martin Fowler</em>. The ActiveRecord pattern embeds the knowledge of how to interact with the database directly into the class performing the interaction.<span id="more-305"></span></p>
<p>Per <em><a href="http://en.wikipedia.org/wiki/Active_record_pattern">Wikipedia</a></em>  </p>
<blockquote><p>With ActiveRecord, a database table or view is wrapped into a class, thus an object instance is tied to a single row in the table. After creation of an object, a new row is added to the table upon save. Any object loaded gets its information from the database; when an object is updated, the corresponding row in the table is also updated. The wrapper class implements accessor methods or properties for each column in the table or view.</p></blockquote>
<p>This pattern is often implemented by ORM and Object Persistence Tools like Hibernate (Java) and ActiveRecord (ruby). The implementation framework handles generating the necessary SQL appropriate for the database being used and executing them over a database connection.</p>
<p>Recently, in a couple of projects I used ActiveRecord Migrations to manage database setup and migrations.<br />
Below, I shall present a walk though the steps that I followed to get a set of ActiveRecord migrations working on my Ubuntu-9.0.4 desktop.</p>
<p>1. Check if you have ruby installed:</p>
<p>     <em>ruby -v</em></p>
<p>You&#8217;d see something like the following: <em>ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]</em></p>
<p>If not, then install ruby by executing the following from a terminal window:</p>
<p>     <em>sudo aptitude install <strong>ruby</strong></em></p>
<p>Also, install <a href="http://rake.rubyforge.org/">rake, – ruby&#8217;s build program with capabilities similar to make</a> using:</p>
<p>    <em>sudo aptitude install <strong>rake</strong></em></p>
<p>2. Install <a href="http://rubygems.org/read/book/1">rubygems</a>:</p>
<p>    <em>sudo aptitude install <strong>rubygems1.9</strong></em></p>
<p>3. Install the following ruby-gems</p>
<ul>
<li>ActiveRecord: <em>sudo gem install <strong>activerecord</strong></em></li>
<li>Database adapter: I used the MySQL database; so I needed to install the mysql gem  <em>sudo gem install <strong>mysql</strong></em><br/><br/>The above command results in the following error:<br/><br/>&nbsp;&nbsp;<em>extconf.rb:8:in `require’: no such file to load — mkmf (LoadError)</em></li>
</ul>
<p><strong>Fix:</strong> Being a Debian or Ubuntu user you’ll find that the Ruby standard distribution is split into lots of little packages in order to comply with <a href="http://www.debian.org/doc/debian-policy/">Debian packaging Guidelines</a>. Installing ruby only gives you the ruby binary and a subset of the libraries for Ruby. You’ll need to add more packages if you want to utilize more of Ruby’s standard library.</p>
<p>Hence, we need to install the ruby-dev package prior to installing the mysql gem.</p>
<p>  <em>sudo aptitude install ruby-dev</em></p>
<p>4. Create directories to hold the migration definitions:</p>
<p>  <em>mkdir ~/workspace/db_setup<br />
  mkdir ~/workspace/db_setup/migrations</em></p>
<p>That&#8217;s all on the installation side. Now it&#8217;s time to write the migrations.</p>
<p>With ActiveRecord, each change to the database is termed as a <strong>migration</strong>. Migrations derive from <em>ActiveRecord::Migration</em> and enable a developer to generate a database structure using a series of Ruby script files (each of which is an individual migration) to define database operations. It&#8217;s a <em>database-agnostic representation</em> of the database. It uses generic data types for columns, like :binary, :string, :text, :boolean, etc. to define the kind of data to be stored in a column. A sample migration would look like the following:</p>
<p><b>File:</b> <em>migrations/001_create_institutions.rb</em><br />
class CreateInstitutions &lt; ActiveRecord::Migration<br />
def self.up<br />
create_table :institutions, {:id =&gt; true} do |inst|<br />
inst.column :name, :string, :limit =&gt; 100, :null =&gt; false<br />
inst.column :url, :string, :null =&gt; false<br />
end</p>
<p>execute(&#8217;ALTER TABLE institutions ADD UNIQUE (name) &#8216;);</p>
<p>end</p>
<p>def self.down<br />
drop_table : institutions<br />
end<br />
end</p>
<ul>
<li>The file-naming convention is important here:
<ul>
<li>ActiveRecord uses the numeric prefix to determine which migrations it needs to apply. To do this, it creates a table called as <strong>SCHEMA_MIGRATIONS</strong> in the database in which the VERSION column holds the number from the last migration added. When the migrations are run without a target version specified, it will only execute the migrations that have number greater than that stored in the database, lowest numbered first.</li>
<li>The class name should correspond to a camel case representation of the migration&#8217;s file name.</li>
<li>Typically your project would have a collection of these migrations, in files with prefixes as 001_xx, 002_xx&#8230;. and so on, each defining a change desired on the database.</li>
</ul>
</li>
<li>The two methods <strong>up</strong> and <strong>down</strong> should be functional complements of each other. The <strong>up</strong> method is executed when upgrading the database while <strong>down</strong> method is executed while reverting to an earlier version.</li>
<li>You can do many things in a migration – create and delete tables, add and remove columns, set column constraints (such as nullability and column length) and also run code to initialize the data in a table.</li>
<li>As a convenience, you also have the <strong>execute</strong> method available (shown as the last statement in the <strong>up</strong> method) to run SQL / commands directly. This has many implications: it lets you execute commands that use specific database dialects, like adding database constraints. The following script allows you to execute SQL commands from an external file, say <em>create_db.sql</em>:<br/><br/>&nbsp;&nbsp;sqlCode = File.open(File.dirname(__FILE__) + &#8220;/create_db.sql&#8221;).read<br/>&nbsp;&nbsp;sqlCode.split(&#8221;;\n&#8221;).each do |stmt|<br/>&nbsp;&nbsp;&nbsp;<b>execute</b> stmt if stmt =~ /\S/<br/>&nbsp;&nbsp;end</li>
</ul>
<p>ActiveRecord can read the database configuration from a YAML config file called as database.yml (place it under ~/workspace/db_setup) that looks like:</p>
<p><em># The # character signifies a comment.<br />
#<br />
# Define db config per environment here.<br />
# yml files are formatted in a very strict way; you cannot insert spaces and tabs randomly.<br />
# Typically they use two (2) spaces to indent options.<br />
#<br />
# The space between the &#8216;:&#8217; and the configuration values is required.<br />
dev:</p>
<p>  adapter: mysql<br />
  database: devdb<br />
  username: dev_user<br />
  password: dev_pass<br />
  host:     127.0.0.1</p>
<p>qa:</p>
<p>  adapter: mysql<br />
  database: $DB_NAME<br />
  username: $USER<br />
  password: $PASSWORD<br />
  host:     $HOST<br />
</em></p>
<p>A set of ActiveRecord migrations can be executed as<br />
1. A part of a Rails application by invoking</p>
<p>  rake db:migrate RAILS_ENV=xx VERSION=yy</p>
<p>2. A standalone Ruby application: If it is not a part of a Rails application, there is no default Rakefile to use. So we&#8217;d need to create one (under ~/workspace/db_setup) with the following content:</p>
<p><em>require &#8216;rubygems&#8217;<br />
require &#8216;active_record&#8217;<br />
require &#8216;yaml&#8217;<br />
task :default => :migrate</p>
<p>desc &#8220;Migrate the database through scripts in &#8216;migrations&#8217;. Target specific version with VERSION=x&#8221;<br />
task :migrate =&gt; :environment do<br />
ActiveRecord::Migrator.migrate(&#8217;migrations&#8217;, ENV["VERSION"] ? ENV["VERSION"].to_i : nil )<br />
end</p>
<p>task :environment do<br />
RAILS_ENV = (ENV['RAILS_ENV'] ||= &#8216;dev&#8217;)<br />
dbconfig = YAML::load(File.open(&#8217;database.yml&#8217;))[RAILS_ENV]<br />
ActiveRecord::Base.establish_connection(dbconfig)</p>
<p># Enable diagnostic logging to help debugging.<br />
# Note that ActiveRecord colorizes output for viewing in a terminal.<br />
# But when viewed as a normal file, it isn&#8217;t readable. So we disable it.<br />
ActiveRecord::Base.colorize_logging = false<br />
logFile = File.open(&#8217;database.log&#8217;, &#8216;w&#8217;) # set it to &#8216;STDERR&#8217; to enable logging to Std. ERROR console<br />
ActiveRecord::Base.logger = Logger.new(logFile)<br />
end</em></p>
<p>To execute the migrations, run the following command from the directory containing the RakeFile:</p>
<p>  rake RAILS_ENV=xx VERSION=yy</p>
<p>Both the above mentioned ways lend themselves to be easily invoked from a multitude of build and CI tools, like ANT, CruiseControl, python scripts etc.</p>
<p>Thus we, saw how to configure ActiveRecord as a database agnostic mechanism of managing database setup and incremental migrations. It is relatively simple to use and highly extensible.</p>
<p>Although, some may argue that ActiveRecord leads to a high degree of coupling between application code and database structure; in many cases the issues due to this coupling is much easier to manage than to adopt an alternate complex solution.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/using-activerecord-for-database-setup-and-migration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Ado.Net Entity Framework v2, are we there yet?</title>
		<link>http://www.nagarro.com/blog/the-adonet-entity-framework-v2-are-we-there-yet/</link>
		<comments>http://www.nagarro.com/blog/the-adonet-entity-framework-v2-are-we-there-yet/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 10:11:48 +0000</pubDate>
		<dc:creator>Vaibhav Gadodia</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Ado.Net]]></category>
		<category><![CDATA[Entity Framework]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/the-adonet-entity-framework-v2-are-we-there-yet/</guid>
		<description><![CDATA[At Nagarro, we are always looking to stay tuned into upcoming technology (of all types &#8211; gadgets to frameworks); and the current flavor is of course Visual Studio 2010 and .Net Framework 4. We have been trying out the beta and the earlier preview versions of VS2010, however, that is not the topic of this [...]]]></description>
			<content:encoded><![CDATA[<p>At <a href="http://www.nagarro.com/">Nagarro</a>, we are always looking to stay tuned into upcoming technology (of all types &#8211; gadgets to frameworks); and the current flavor is of course Visual Studio 2010 and .Net Framework 4. We have been trying out the beta and the earlier preview versions of VS2010, however, that is not the topic of this post.</p>
<p>Recently, we had the opportunity to give our opinion on the latest avatar of the Ado.Net Entity Framework to Jeffrey Schwartz from Application Development Trends magazine. Jeff was kind enough to publish our opinions in an article on the Visual Studio Magazine (thank you Jeff). The article is titled &#8220;<a href="http://visualstudiomagazine.com/blogs/data-driver/2009/06/will-entity-framework-2-appease-early-adopters-of-linq-to-sql.aspx">Will Entity Framework 2 appease early adopters of LINQ to SQL?</a>&#8220;. We, as can be deduced, were early adopters of LINQ (to SQL and others).</p>
<p>If you would like to see that question answered, I urge you to go and read that article. In this article, I wanted to discuss a little bit more about how we look at Entity Framework v2.</p>
<p> <span id="more-304"></span>
<p>When Microsoft first announced the Ado.Net Entity Framework, we were unsure about what to do with it. We had already started training our developers on LINQ to SQL, and some of our projects were already using the technology. We found it (L2S) to be a very good way to implement the ORM layer of an application (and that worked very well in most cases). Additionally, we weren&#8217;t sure how mature the framework was. Sure, it looked perfect for some of our larger projects, but somehow it wasn&#8217;t fitting the bill (and we were not alone). And compared to LINQ to SQL, it felt quite lackluster in features.</p>
<p>The new version of the Entity Framework looks much better. It almost feels as if Microsoft went out of their way to ensure that Ado.Net EFv2 can stand on its own when compared to LINQ to SQL. However, by this time, we are pretty invested in LINQ to SQL, so there is no question of moving any of our existing projects over. But, we are very keen to try out the EFv2 in newer projects and internal applications. Specifically, we will looking at integrating it the next version of our Nagarro .Net Application Framework (which is a base framework that we use for most of our projects).</p>
<p>&#8220;<strong>Are we there yet?</strong>&#8221; &#8211; I would say, almost. The latest version of the Entity Framework looks a much more complete product as compared to the earlier version. Some of the features from an implementation-as-a-tool-in-a-software-development-services-shop perspective are really great:</p>
<ul>
<li><strong>POCO support </strong>- the support for persistence ignorant objects make a great deal of difference because we can continue to leverage the features of the Entity Framework while using your own custom data layer logic alongside it. This is beneficial because this means we can at least consider using the EF in existing applications where the data model and the layers are already defined.</li>
<li><strong>First class code generation &#8211; </strong>this will come as a relief to most developers. The code generation engine, T4, is much more versatile that what we used to have earlier. This means that each application development team can customize the code generation a little bit according to their specific needs.</li>
</ul>
<p>And of course there are hosts of improvements in general and there are tons of articles covering those.</p>
<p>From Nagarro&#8217;s perspective, <strong>I think we are almost there</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/the-adonet-entity-framework-v2-are-we-there-yet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TiECon 2009 – Entrepreneurship Lives</title>
		<link>http://www.nagarro.com/blog/tiecon-2009-%e2%80%93-entrepreneurship-lives/</link>
		<comments>http://www.nagarro.com/blog/tiecon-2009-%e2%80%93-entrepreneurship-lives/#comments</comments>
		<pubDate>Wed, 27 May 2009 00:35:57 +0000</pubDate>
		<dc:creator>Vishal Gauri</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[tiecon]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/tiecon-2009-%e2%80%93-entrepreneurship-lives/</guid>
		<description><![CDATA[For months we’ve been saying that despite the recession, innovation is alive and well. Last week we spent two days at TiECon 2009, where our opinion was validated by entrepreneurs of promising startups as well as recognized business leaders. The buzz this year is that there are still plenty of interesting, innovative startups poised for [...]]]></description>
			<content:encoded><![CDATA[<p>For months we’ve been saying that despite the recession, innovation is alive and well. Last week we spent two days at TiECon 2009, where our opinion was validated by entrepreneurs of promising startups as well as recognized business leaders. The buzz this year is that there are still plenty of interesting, innovative startups poised for success – <a href="http://creativecapital.wordpress.com/2009/05/18/recession-be-damned-entrepreneurship-lives-at-tiecon-2009/">as others have noted</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/tiecon-2009-%e2%80%93-entrepreneurship-lives/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google Web Toolkit for Rich Internet Applications –A Java Programmer’s Experience</title>
		<link>http://www.nagarro.com/blog/google-web-toolkit-internet-applications/</link>
		<comments>http://www.nagarro.com/blog/google-web-toolkit-internet-applications/#comments</comments>
		<pubDate>Thu, 14 May 2009 17:52:42 +0000</pubDate>
		<dc:creator>Nitin Sood</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=285</guid>
		<description><![CDATA[Recently, I have been working on porting a Struts and uPortal based legacy application to GWT. This work was initiated a year ago to replace an unappealing, non-responsive and slow user interface of the legacy application. Another key requirement was to make the client side technology stack lighter. Use of multiple client side technologies (Struts, [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I have been working on porting a Struts and uPortal based legacy application to GWT. This work was initiated a year ago to replace an unappealing, non-responsive and slow user interface of the legacy application. Another key requirement was to make the client side technology stack lighter. Use of multiple client side technologies (Struts, uPortal, JSP, Tag libraries, Java Script, configuration files, CSS, XSLT) made it difficult to make even simple UI changes.<span id="more-285"></span></p>
<p>After initial analysis, it was clear that we needed to incorporate AJAX in multiple areas across the application. It was further decided to use one of the existing AJAX frameworks rather than writing AJAX &#8220;by hand&#8221;. After evaluating several AJAX frameworks, we selected GWT. Other AJAX frameworks like DOJO and YUI library are also good but they did not solve the above mentioned problems arising from a fat architecture and a complicated technology stack.</p>
<p>One of the primary reasons for selecting GWT was its unique approach to developing the complete application: both the client side and the server side components using Java. GUI development with GWT APIs is similar to Swing development and it is refreshing to forget JSP, JavaScript, and Struts and write everything using Java. I am very happy with experience so far and we have vastly improved presentation layer while retaining most of the service layer code.</p>
<p>With GWT, the AJAX front-end is written in Java that gets compiled into highly optimized Java Script. Developers do not need to write Java Script while end users are provided with dynamic and standards-compliant AJAX experience. JavaScript gets downloaded by the client browser at runtime where most of the client side processing is performed thus releasing the server side from handling presentation tasks.</p>
<p>I am impressed by the developer friendly features of GWT. Using Java in the presentation layer facilitates the use of design patterns and creation of reusable widget libraries. GWT’s approach to history management, internationalization, and service layer interaction is easy to understand and implement. I felt spoilt by the choice of available tools, default support for multiple browsers and ability to debug AJAX in hosted mode. I also noticed ancillary benefits like elimination of training on multiple technologies, reduced dependence on technology experts, and the overall speed of development.</p>
<p>I have heard arguments about Flex being a better RIA choice than GWT. I think this may be because some people may not be aware of other GWT widget libraries (like GWT-EXT) available today. Although GWT comes with a very good collection of useful and cool widgets but you can always use third party widget libraries which provide additional AJAX components like a special Tree or Grid component. We used <a href="http://code.google.com/p/gwt-ext/">GWT-EXT</a>, a very rich widget library to achieve the desired functionality.</p>
<p>I found a few features missing &#8211; for example, there is no inbuilt support to load client side libraries on demand. Actually GWT loads all client-side libraries in client’s browser when the end-user accesses any module of the web application for the first time. So I think GWT may be a misfit for large enterprise applications. Also I faced problems due to lack of emulators for some of the Java classes like Calendar and our application POJOs contain Calendar objects. The good thing is that there are workarounds available to solve these problems.</p>
<p>I strongly recommend GWT if you are developing a mid size web application that needs enhanced usability and a desktop like look and feel.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/google-web-toolkit-internet-applications/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Updates from Midsize Enterprise Summit: Business to Community</title>
		<link>http://www.nagarro.com/blog/updates-from-midsize-enterprise-summit/</link>
		<comments>http://www.nagarro.com/blog/updates-from-midsize-enterprise-summit/#comments</comments>
		<pubDate>Thu, 14 May 2009 00:12:34 +0000</pubDate>
		<dc:creator>Vikas Sehgal</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[custom software]]></category>
		<category><![CDATA[midsize enterprise]]></category>
		<category><![CDATA[social media]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=261</guid>
		<description><![CDATA[Last week I attended the Midsize Enterprise Summit (MES) in Miami. This event has become one of Nagarro’s favorite venues for discussing the unique business and technology challenges faced by midsize enterprises – that vast range of companies across industries that falls somewhere between startups and global players.

 
While at the show, I had the opportunity [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-273 alignleft" title="golf" src="http://www.nagarro.com/blog/wp-content/uploads/2009/05/golf.png" alt="golf" width="132" height="95" />Last week I attended the <a href="http://www.everythingchannelevents.com/mese09">Midsize Enterprise Summit</a> (MES) in Miami. This event has become one of Nagarro’s favorite venues for discussing the unique business and technology challenges faced by midsize enterprises – that vast range of companies across industries that falls somewhere between startups and global players.</p>
<p><span id="more-261"></span></p>
<div class="mceTemp"> </div>
<p>While at the show, <a href="http://www.crn.com/it-channel/217400007;jsessionid=VSIXWWHZSIROIQSNDLOSKHSCJUNN2JVN">I had the opportunity to participate in a panel on social networking</a>. Our discussion was an important reminder that the idea of “business to business” is giving way to “business to community.” In our constant endeavor to make our clients more competitive, we have been working closely with them to understand how social media impacts their organizations. I am constantly amazed by the possibilities of building custom applications using the Web 2.0 APIs to leverage this new medium in departments ranging from sales, marketing, customer support, product development, design innovation, training, and education.</p>
<div id="attachment_268" class="wp-caption alignnone" style="width: 346px"><img class="size-full wp-image-268 " title="img_3563" src="http://www.nagarro.com/blog/wp-content/uploads/2009/05/img_3563.jpg" alt="Social Networking Panel at the Midsize Enterprise Summit" width="336" height="252" /><p class="wp-caption-text">Social Networking Panel at the Midsize Enterprise Summit</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/updates-from-midsize-enterprise-summit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nagarro featured in NASSCOM blog and Technology Digital: Attracting best and brightest</title>
		<link>http://www.nagarro.com/blog/nagarro-featured-in-nasscom-blog-and-technology-digital-may-issue-attracting-best-and-brightest/</link>
		<comments>http://www.nagarro.com/blog/nagarro-featured-in-nasscom-blog-and-technology-digital-may-issue-attracting-best-and-brightest/#comments</comments>
		<pubDate>Mon, 11 May 2009 20:29:36 +0000</pubDate>
		<dc:creator>Vikas Sehgal</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=255</guid>
		<description><![CDATA[The May issue of Technology Digital features a profile of Nagarro and our quest to hire the best and brightest engineers available.
And last week, the NASSCOM Emerge blog examined Nagarro’s intellectually vigorous culture in a post about the NASSCOM Emerging 15 (I like It Here, Do You?).Nagarro stands out from the crowd as “a company [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://www.technology-digital.com/Nagarro--Developing-business-critical-software_23442.aspx">May issue of Technology Digital features a profile of Nagarro</a> and our quest to hire the best and brightest engineers available.<span id="more-255"></span></p>
<p>And last week, the <em>NASSCOM Emerge</em> blog examined Nagarro’s intellectually vigorous culture in a post about the NASSCOM Emerging 15 (<a href="http://blog.nasscom.in/emerge/2009/05/nasscom-emerging-15-i-like-it-here-do-you/">I like It Here, Do You?</a>).Nagarro stands out from the crowd as “a company where nerds love to work” as NASSCOM discusses its picks for the best small and medium sized IT-BPO companies to work for.</p>
<p>NASSCOM characterizes the top 15 emerging companies as “sought after by career seekers for their close knit, non-hierarchical work environment, culture of innovation and commitment to employee empowerment.” If this is the definition of a nerd-magnet, sign us up.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/nagarro-featured-in-nasscom-blog-and-technology-digital-may-issue-attracting-best-and-brightest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Successfully Outsourcing SAP Remote Services</title>
		<link>http://www.nagarro.com/blog/new-white-paper-successfully-outsourcing-sap-remote-services/</link>
		<comments>http://www.nagarro.com/blog/new-white-paper-successfully-outsourcing-sap-remote-services/#comments</comments>
		<pubDate>Wed, 06 May 2009 18:55:51 +0000</pubDate>
		<dc:creator>Manish Agarwal</dc:creator>
				<category><![CDATA[SAP]]></category>
		<category><![CDATA[Netweaver]]></category>
		<category><![CDATA[SAP maintenance]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=241</guid>
		<description><![CDATA[
In today’s dynamic business environment, IT departments need to remain agile so they can align IT strategy with shifting business,market, competitive and economic conditions.  Outsourcing is one way to adapt resources to suit an ever-changing landscape but can also introduce risks if the right partner is not engaged or the partnership is mismanaged.
Companies rely on [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-244 alignleft" title="77008124120224641" src="http://www.nagarro.com/blog/wp-content/uploads/2009/05/77008124120224641.jpg" alt="Connected in all directions" width="68" height="94" /></p>
<p>In today’s dynamic business environment, IT departments need to remain agile so they can align IT strategy with shifting business,market, competitive and economic conditions.  Outsourcing is one way to adapt resources to suit an ever-changing landscape but can also introduce risks if the right partner is not engaged or the partnership is mismanaged.</p>
<p>Companies rely on SAP deployments to run their core business operations.  As a result, outsourcing decisions must contemplate security controls and allow the IT department to maintain operational control.<span id="more-241"></span></p>
<p>In an effort to help you identify and manage risks, <a href="http://www.nagarro.com/Resource%20Library/WhitepaperDetail.aspx?id=55">Nagarro&#8217;s new white paper</a> addresses some common outsourcing concerns and objectives, and provides practical information that can help you more effectively address your current and future business requirements.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/new-white-paper-successfully-outsourcing-sap-remote-services/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Use the features of the .Net framework to implement good coding patterns</title>
		<link>http://www.nagarro.com/blog/use-the-features-of-the-net-framework-to-implement-good-coding-patterns/</link>
		<comments>http://www.nagarro.com/blog/use-the-features-of-the-net-framework-to-implement-good-coding-patterns/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 21:55:02 +0000</pubDate>
		<dc:creator>Ramesh Soni</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[.net framework]]></category>
		<category><![CDATA[event processing]]></category>
		<category><![CDATA[IDisposable]]></category>
		<category><![CDATA[Tips and Tricks]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=200</guid>
		<description><![CDATA[In our haste to finish the coding of a given application, we often overlook great little techniques which can be deployed to ensure best practices in code. And since one of the best ways to learn is by example, we will walk through a very common block of code that is found in almost all [...]]]></description>
			<content:encoded><![CDATA[<p>In our haste to finish the coding of a given application, we often overlook great little techniques which can be deployed to ensure best practices in code. And since one of the best ways to learn is by example, we will walk through a very common block of code that is found in almost all Windows based applications &#8211; the block which shows and hides a wait cursor when a time consuming task is being executed by the application.<span id="more-200"></span></p>
<p>A quick  review of event processing in Windows Application tells us that there are 3 different types:</p>
<ol>
<li><strong>Quick Processing (less than a second) &#8211; </strong>Action performed is executed almost instantaneously without any significant wait period. In this case, you would generally not display any indication to the user about the background task execution. For instance, Open a dialog on the Click of a button.</li>
<li><strong>Short Processing (1 second &#8211; 5 seconds) &#8211; </strong>User action consumed a few seconds in execution. In such cases, recommended practice is to show a wait cursor. For instance, Pick records from database to list them in the application screen requested by the user.</li>
<li><strong>Long Processing (more than 5 seconds) -</strong> Actions which involve a significantly longer processing time, in such cases it is recommended to show progress bar indication to users.<!--more--></li>
</ol>
<p>In order to display a wait cursor (category 2 above) the following is the most common block of code seen in most applications:</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">object</span> GetData(<span class="kwrd">int</span> id)
{
    Cursor.Current = Cursors.WaitCursor;
    <span class="kwrd">try</span>
    {
        <span class="rem">// Processing code here    </span>
    }
    <span class="kwrd">finally</span>
    {
        Cursor.Current = Cursors.Default;
    }
}</pre>
<p>The code piece above will have to be duplicated at all the places where we want to use wait cursor during processing, this would be a pretty tedious task. Now, let&#8217;s have a look at another approach to implement the same feature:</p>
<pre class="csharpcode"><span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Windows.Forms;

<span class="kwrd">public</span> <span class="kwrd">class</span> WaitCursor : IDisposable
{
    <span class="kwrd">private</span> Cursor cursor;

    <span class="kwrd">public</span> WaitCursor()
    {
        cursor = Cursor.Current;
        Cursor.Current = Cursors.WaitCursor;
    }

    <span class="kwrd">public</span> <span class="kwrd">void</span> Dispose()
    {
        Cursor.Current = cursor;
    }
}</pre>
<p>The WaitCursor class above implements <a href="http://msdn.microsoft.com/en-us/library/system.idisposable.aspx">IDisposable</a> interface, hence you may use this is the using block. Now see how simple it is to add a wait cursor to your application:</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">object</span> GetData(<span class="kwrd">int</span> id)
{
    <span class="kwrd">using</span> (<span class="kwrd">new</span> WaitCursor())
    {
        <span class="rem">// Processing code here</span>
    }
}</pre>
<p>There are some very obvious benefits by doing it this way:</p>
<ul>
<li>It simplifies the code at several places into a single line statement.</li>
<li>More importantly, we just ensured that a bug where some developer forgot to restore the cursor to normal can never happen (as long as we have trained our team to simply call the above code).</li>
<li>Finally, it is always a best practice to encapsulate repeated code in one place.</li>
</ul>
<p>One should always be on the lookout for such small coding patterns and implement them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/use-the-features-of-the-net-framework-to-implement-good-coding-patterns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting the most out of custom applications during the downturn</title>
		<link>http://www.nagarro.com/blog/getting-the-most-out-of-custom-applications-during-the-downturn/</link>
		<comments>http://www.nagarro.com/blog/getting-the-most-out-of-custom-applications-during-the-downturn/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 18:14:54 +0000</pubDate>
		<dc:creator>Vishal Gauri</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[custom applications]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=208</guid>
		<description><![CDATA[Last week Manufacturing Business Technology published Nagarro’s top “Dos and Don’ts” for custom application development. Our customers in manufacturing as well as other markets continue to prove that downturn is a perfect opportunity to revamp IT strategy for competitive advantage. As companies look to evolve to a ‘smarter’ IT strategy, smaller, inexpensive, made-to-fit custom applications [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-227 alignleft" title="monitors" src="http://www.nagarro.com/blog/wp-content/uploads/2009/04/monitors.jpg" alt="monitors" width="90" height="62" />Last week <a href="http://http://www.mbtmag.com/article/CA6651349.html" target="_blank"><strong><em>Manufacturing Business Technology</em></strong> published Nagarro’s top “Dos and Don’ts”</a> for custom application development. Our customers in manufacturing as well as other markets continue to prove that downturn is a perfect opportunity to revamp IT strategy for competitive advantage. As companies look to evolve to a ‘smarter’ IT strategy, smaller, inexpensive, made-to-fit custom applications offer a great way to build lasting competitive advantage.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/getting-the-most-out-of-custom-applications-during-the-downturn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Application programming in the era of multicore processors</title>
		<link>http://www.nagarro.com/blog/application-programming-in-the-era-of-multicore-processors/</link>
		<comments>http://www.nagarro.com/blog/application-programming-in-the-era-of-multicore-processors/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 20:44:55 +0000</pubDate>
		<dc:creator>Abhijat Vatsyayan</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tools and Utilities]]></category>
		<category><![CDATA[Concurrent programming]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=142</guid>
		<description><![CDATA[Computer chip manufacturers cannot keep on increasing the clock speed indefinitely to make their processors faster. They seem to have already reached the limit (on clock speed) and have started putting multiple independent processing cores on a single chip to increase the computational capacity. As most systems start running on processors with tens of cores (if [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><span style="color: #000000;">Computer chip manufacturers cannot keep on increasing the clock speed indefinitely to make their processors faster. They seem to have already reached the limit (on clock speed) and have started putting multiple<span id="more-142"></span> independent processing cores on a single chip to increase the computational capacity. As most systems start running on processors with tens of cores (if not hundreds right away) application programmers will need to start relying on concurrent programming to make their applications faster and responsive. This will lead to significant changes in the way we design, develop, debug and test programs. We will have new tools, APIs, compilers, languages and frameworks for supporting highly concurrent programs written by application programmers.</span></p>
<p><span style="color: #000000;">The first and most obvious change will be that programmers will start using many more threads and use current lock based approaches to synchronize access to shared data. Now detecting bugs in multithreaded programs is extremely difficult and as we write more concurrent programs, it will become increasingly important to have tools which can check our programs for correctness. Two such tools are <span style="text-decoration: underline;"><a href="http://research.microsoft.com/en-us/projects/chess/" target="_blank">CHESS</a></span> from Microsoft research and <span style="text-decoration: underline;"><a href="http://fsl.cs.uiuc.edu/index.php/JPredictor" target="_blank">jPredictor</a></span> from UIUC. Both are still research projects but are definitely worth taking a look at and playing around with.</span></p>
<p style="text-align: justify;"><span style="color: #000000;">The transactional memory research community advocates getting rid of lock based approach for managing access to shared data. The idea comes from the database world where transactions have been around for a long time. Hardware transactional memory, hybrid transactional memory and software transactional memory, the three broad categories in which implementations are often split, are all under active research but there already are quite a few implementations out there for you to play around with. One of the core ideas behind using transactional memory for accessing shared data is to allow users to specify &#8220;what&#8221; needs to be synchronized and then let the machine take care of the &#8220;how&#8221; part (compare this to how you use locks today). This is supposed to greatly simplify the concurrent programming model but it is too early to say if it really does make the programming model simpler.</span></p>
<p style="text-align: justify;"><span style="color: #000000;">While  I cannot cover or summarize the work being done on transactional memory without making it into a small project, I can provide a few starting points that you may find interesting. Microsoft is doing very interesting work in this area and while a lot of it uses Haskel, there is a <span style="text-decoration: underline;"><a href="http://research.microsoft.com/en-us/downloads/6cfc842d-1c16-4739-afaf-edb35f544384/default.aspx" target="_blank">C-sharp API for software transactional memory</a></span> that you should look at. If you are a Java programmer, you should take a look at <span style="text-decoration: underline;"><a href="http://www.sun.com/download/products.xml?id=453fb28e" target="_blank">DSTM2</a></span>. And irrespective of what technology you use for building systems, I will recommend reading publications on transactional memory by Maurice Herlihy, Simon Peyton-Jones, Victor Luchangco and Mark Moir (there are others, I just picked up the four I see often in the literature).</span></p>
<p style="text-align: justify;"><span style="color: #000000;">Finally, we should not ignore the world of message passing. <span style="text-decoration: underline;"><a href="http://www.openmp.org/" target="_blank">OpenMP</a></span> and <span style="text-decoration: underline;"><a href="http://erlang.org/" target="_blank">Erlang</a></span> have been around for a long time and are designed for concurrent programming. OpenMP is an API you can use from C/C++ and FORTRAN to write parallel programs to take advantage of shared-memory architectures.  Erlang is a programming language in which you write processes that communicate exclusively using messages and if you write your Erlang programs correctly, you get the ability to scale to hundreds of processors for free.</span></p>
<p style="text-align: justify;"><span style="color: #000000;"><br />
</span></p>
<p style="text-align: justify;"><span style="color: #000000;"><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/application-programming-in-the-era-of-multicore-processors/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A readymade caching solution for scalable .Net applications</title>
		<link>http://www.nagarro.com/blog/shared-cache/</link>
		<comments>http://www.nagarro.com/blog/shared-cache/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 11:36:08 +0000</pubDate>
		<dc:creator>Vikas Gandhi</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Tools and Utilities]]></category>
		<category><![CDATA[caching]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=133</guid>
		<description><![CDATA[One of the challenges of scaling out applications through server farms is the need to share memory artifacts (session and cache). There are of course many techniques which can be employed. As always, looking around the Internet  reveals that there are good solutions already available.
Recently, I evaluated SharedCache, which according to their website is a [...]]]></description>
			<content:encoded><![CDATA[<p>One of the challenges of scaling out applications through server farms is the need to share memory artifacts (session and cache). There are of course many techniques which can be employed. As always, looking around the Internet <span id="more-133"></span> reveals that there are good solutions already available.</p>
<p>Recently, I evaluated <a href="http://www.sharedcache.com/" target="_blank">SharedCache</a>, which according to their website is a high performance distributed and replication cache system built for .Net applications running in server farms. The system is made available to .Net applications through a Windows service.</p>
<p> Some of the key features are listed of SharedCache are listed below:</p>
<ul>
<li>Works for both web and non-web solutions.</li>
<li>Is extremely fast for fetch.</li>
<li>It supports multiple topologies: distributed partitioned caching, replicated caching, and single instance caching. You can choose which you need based on your requirements (for example, you may want to choose replicated caching over single caching to ensure that you don&#8217;t have any single points of failure)</li>
<li>In case of Caching, one of the most important aspect is purging. With SharedCache, you have a choice to make amongst the several that are supported:
<ul>
<li>Cache Item Priority</li>
<li>Least Recent Used Item (LRU)</li>
<li>Least Frequently Used Item (LFU)</li>
<li>Time based</li>
<li>Biggest Latency First (BLF)</li>
<li>Lowest Latency First (LLF)</li>
<li>Hybrid &#8211; Creating an index based on various item attributes such as: time in cache, Amount of requests, Size, Cache Life Time, etc.</li>
</ul>
</li>
<li>Configurable maximum cache size and the load factor when the system starts to purge cached items.</li>
</ul>
<p>You can install the service by downloading it from <a href="http://www.codeplex.com/SharedCache/SourceControl/ListDownloadableCommits.aspx" target="_blank">CodePlex</a>. And several samples and discussions are available at the <a href="http://netrsc.blogspot.com/search/label/SharedCache" target="_blank">author&#8217;s blog</a>. The best thing about this service is that there is plenty of documentation to guide you.</p>
<p>Just try it out. Its pretty cool.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/shared-cache/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Downturn Creates Opportunities for Innovation and Competition</title>
		<link>http://www.nagarro.com/blog/downturn-creates-opportunities-for-innovation-and-competition/</link>
		<comments>http://www.nagarro.com/blog/downturn-creates-opportunities-for-innovation-and-competition/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 15:25:44 +0000</pubDate>
		<dc:creator>Vikas Sehgal</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=119</guid>
		<description><![CDATA[The opportunity for competitive advantage is far greater when potential rivals are frozen at a standstill. ]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: small; font-family: Calibri;">As we all know, the economy has been in a tailspin for several months. When the economic crisis first began to rumble, many of our customers and prospects slammed the brakes on technology spending. But then before too long, we started noticing a change: smart companies began to realize that this was actually the perfect time to step on the gas and leave their competitors in the dust. The opportunity for competitive advantage is far greater when potential rivals are frozen at a standstill. <span id="more-119"></span></span></p>
<p><span style="font-size: small; font-family: Calibri;">Today we announced that <a href="http://www.nagarro.com/NewsEvents/Press%20Releases/Downturn_Creates_Opportunity.aspx">Nagarro has signed on more than two dozen new customers in the US and Europe in the past three quarters</a>. And we continue to sign new deals almost every week. Like our customers, we at Nagarro are looking at the downturn as an opportunity to keep our focus sharp and our resources first-rate. Obviously we are glad to be maintaining a steady presence despite the ups and downs of the market, but more importantly, today’s news sends a strong signal that at the high end of the technology market, innovation and competition are alive and well. </span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/downturn-creates-opportunities-for-innovation-and-competition/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Log your exceptions to the cloud</title>
		<link>http://www.nagarro.com/blog/an-alternative-way-to-do-exception-logging/</link>
		<comments>http://www.nagarro.com/blog/an-alternative-way-to-do-exception-logging/#comments</comments>
		<pubDate>Fri, 20 Mar 2009 07:58:04 +0000</pubDate>
		<dc:creator>Vaibhav Gadodia</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Exception Logging]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/an-alternative-way-to-do-exception-logging/</guid>
		<description><![CDATA[Exception Logging is always an interesting problem to solve. Depending on your needs you may have a simple log statement which writes to a text file, or you may need to have a full-fledged exception management module which logs exceptions to the database, categorized them, and generates notifications. There is no single solution for how [...]]]></description>
			<content:encoded><![CDATA[<p>Exception Logging is always an interesting problem to solve. Depending on your needs you may have a simple log statement which writes to a text file, or you may need to have a full-fledged exception management module which <span id="more-108"></span>logs exceptions to the database, categorized them, and generates notifications. There is no single solution for how to log and manage your exceptions. It helps then to be aware of as many techniques and options as you can; since you never know which will come in handy in a situation.</p>
<p>One method to log exceptions is to log them in the cloud. And there exists a useful service which makes your job easier.</p>
<p> <!--more-->
<p>A service in the cloud represents a service that is hosted on the Internet, available to you through an API, so that you have no idea how it is physically implemented. This makes things simple for you since you don&#8217;t have to worry about writing implementation code for the exception logging and reporting framework. You only need to call it.</p>
<p>The service that I am discussing is called <a href="http://www.hoptoadapp.com/" target="_blank">HopToad</a>. The service offers a simple to use API which allow you to log exceptions from your application. The exceptions are stored in the cloud and are available to you from a central web-based console. All the logged exceptions are presented in easy to understand and navigable way. For example, you can see which errors are occurring most often, or which one is the latest error that came up and from where. You can look at error details and stack traces.</p>
<p>The service developed to be used from within RubyOnRails applications. However, they have an open API, and can be accessed through any technology stack. K. Robertson has made a .Net wrapper available for logging to HopToad. It&#8217;s called <a href="http://github.com/krobertson/hopsharp/tree/master" target="_blank">HopSharp</a>. It is fairly straight forward to use (just drop the DLL in your application and you are good to go). I can imagine that it would be straight forward to write a Log4Net extension for this service as well.</p>
<p><strong>When to use this?</strong></p>
<p>So, when would you use something like this. While the final decision to use this would vary from project to project and client to client, I can think of the following scenarios:</p>
<ul>
<li>The application is a work in progress and you are expected to release a number of updates. Typically, in such scenarios, a lot of testing happens while the application is in deployed state. A logging framework such as this will allow you to monitor the application as it is being used, and priorities on bugs can be assigned based on frequency and severity. </li>
<li>You have an application deployed at multiple locations and you would like to see a consolidated view of the exceptions being reported. </li>
<li>As a way to save time and effort. This is a ready made framework where you don&#8217;t need to impart any effort for implementing an exception logging and notification system. </li>
</ul>
<p>I am pretty sure that there are other such services out there.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/an-alternative-way-to-do-exception-logging/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ruby vs. Java</title>
		<link>http://www.nagarro.com/blog/ruby-vs-java/</link>
		<comments>http://www.nagarro.com/blog/ruby-vs-java/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 17:44:34 +0000</pubDate>
		<dc:creator>Bill Kayser</dc:creator>
				<category><![CDATA[Guest Blog: Kayser]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[radrails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blogs.nagarro.net/kayser/ruby_vs_java/</guid>
		<description><![CDATA[It&#8217;s not that we don&#8217;t have enough people offering opinions on what is a better language.  It&#8217;s just that some of us never tire of discussing it.  There are so many perspectives, so many arguments, and so many people willing to   spend time blogging about it you&#8217;d think we&#8217;d all be pretty sick of it [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s not that we don&#8217;t have enough people offering opinions on what is a better language.  It&#8217;s just that some of us never tire of discussing it.  There are so many perspectives, so many arguments, and so many people willing to  <span id="more-29"></span> spend time blogging about it you&#8217;d think we&#8217;d all be pretty sick of it by now, and I might move on to some more interesting less traveled topic, like <em>Semicolons: friend or foil to good programming?</em> or <em>Extreme Programming, Acceptance Testing, and ISO 9001: Putting it All Together</em>.</p>
<p>Yet I just can&#8217;t stay away, and neither can you if you are still reading this.  So let me jump right in with my take&#8230;</p>
<p><strong><em>Ruby Doesn&#8217;t Scale</em></strong>.  It can&#8217;t take you to the same places Java can.</p>
<p>I don&#8217;t mean performance-wise.  And I don&#8217;t necessarily believe it can&#8217;t scale complexity-wise.  I just think it won&#8217;t scale with the size of a team.  I can&#8217;t see an application equivalent to 2 million lines of Java code with 80 developers written in Ruby.  Here are some reasons why:</p>
<ul>
<li>the language and tools don&#8217;t facilitate writing APIs<img src="http://www.nagarro.com/blog/wp-content/uploads/2009/02/java_vs_ruby1.jpg" alt="Java Books vs Ruby Books" hspace="16" vspace="16" width="243" height="200" align="right" /></li>
<li>it&#8217;s too hard to protect code from the side effects of other unrelated subsystems</li>
<li>the language and tools do not support for components or version management (see my posts on OSGi)</li>
<li>one bad Ruby developer can do a lot more damage than one bad Java developer</li>
<li>there are a lot of bad Ruby developers (I am one!)</li>
<li>the tests don&#8217;t scale&#8211;no Ruby app can survive inadequate tests, and the while the amount of tests grows linearly with the size of the application, the cost of maintaining them grows exponentially.  This may be true of any tests but&#8230;</li>
<li>you need more tests with Ruby&#8211;a Java app can survive without a complete unit test suite.  In fact, some large Java app can survive without tests at all.  Call me crazy but I&#8217;ve seen it.  What did we do before JUnit, after all?  I don&#8217;t think I&#8217;d want to work on one of those apps, but the point is, test code for Ruby is as essential as an interpreter to make a decent sized Ruby app work.</li>
<li>there&#8217;s no meta-programming in Java; that&#8217;s kind of a bummer, but it also means no massive indecipherable frameworks collapsing under the weight of the author&#8217;s cleverness, frameworks which are so unfathomable they are as brittle as COBOL.</li>
</ul>
<p>There, I said it.  Now that I did, I&#8217;ll make a couple of other observations about why I love Ruby anyway:</p>
<ul>
<li>A two million line Java program probably translates to 100K lines of Ruby code</li>
<li>80 Java developers are probably as productive as 20 equivalently skilled Ruby developers</li>
<li>With only a couple of developers, I think there&#8217;s no limit to how big the application can be.  In fact, the language is much better suited for a very small team than Java because you can be so much more efficient if you know what you&#8217;re doing.</li>
<li>The tools for Ruby are way behind Java, and there&#8217;s no reason to think they won&#8217;t catch up.  When they do, it&#8217;s entirely possible the gulf between the scalability of the languages will close substantially.  I certainly hope they will.  As far as the tools for writing Ruby go, I feel like I stepped back into 2002 when I went from Java/Eclipse to Ruby/{NetBeans/RadRails/TextMate}.  rake ~ make: when was the last time I typed in make when writing Java apps?</li>
<li>The tools may be behind, but the available libraries, plugins and gems are already very rich.</li>
<li>Ruby helped me remember why I love to write programs</li>
</ul>
<p>The last point I threw in there apropos of nothing, other than to point out that while I do miss some things about writing Java apps, I&#8217;m happy to be writing in Ruby now, and hope to keep working on it for the indefinite future, or until our app gets over 100,000 lines of Ruby which should be&#8230; never.</p>
<p>P.S. Here&#8217;s my <a href="http://www.youtube.com/watch?v=PQbuyKUaKFo">favorite entry</a> in the Ruby vs. Java debate, brought to you courtesty of RailsEnvy.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/ruby-vs-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>What I Learned from Ward Cunningham</title>
		<link>http://www.nagarro.com/blog/ward-cunningham/</link>
		<comments>http://www.nagarro.com/blog/ward-cunningham/#comments</comments>
		<pubDate>Mon, 02 Feb 2009 00:51:50 +0000</pubDate>
		<dc:creator>Bill Kayser</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Guest Blog: Kayser]]></category>
		<category><![CDATA[fitnesse]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[ward cunningham]]></category>
		<category><![CDATA[wiki]]></category>
		<category><![CDATA[wycash]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://blogs.nagarro.net/kayser/ward_cunningham/</guid>
		<description><![CDATA[Ward Cunningham is well known in the software engineering community and was famous in his own right for his work on WyCash and the development of CRC Cards, Extreme Programming, and Programming Patterns, even before his fame went to a new level as the inventor of the Wiki.  I first met him in 1995 and our [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Ward_Cunningham" target="_blank">Ward Cunningham</a> is well known in the software engineering community and was famous in his own right for his work on <a href="http://c2.com/doc/oopsla91.html">WyCash</a> and the development of <a href="http://c2.com/doc/oopsla89/paper.html">CRC Cards</a>, Extreme Programming, and Programming Patterns, even before his<span id="more-47"></span> fame went to a new level as the inventor of the Wiki.  I first met him in 1995 and our paths crossed several times since then, and the last few years we&#8217;ve very much traveled in the same circles among the Ruby on Rails community.  Recently I had the honor of sitting down for one of his <a href="http://www.youtube.com/view_play_list?p=740B993B09228573">Lightning Interviews</a> where he asked me about <a href="http://www.newrelic.com">New Relic</a> and traded some ideas on the career of software engineering.</p>
<p> </p>
<p style="text-align: center"><img src="http://www.nagarro.com/blog/wp-content/uploads/2009/02/ward.JPG" alt="Ward Cunningham" hspace="12" vspace="12" width="460" height="308" /></p>
<p>I feel privileged to have worked with Ward in several different contexts, and to have had a front row seat as he developed the first Wiki site and his <a href="http://c2.com/cgi/wiki?FitLibrary">Framework for Integration Testing</a> (FIT), as well as a few other fascinating smaller projects along the way.  Even though I haven&#8217;t worked closely with him over any extended period, in the long run I think I&#8217;ve developed a sense of what he&#8217;s about as an innovator, and with the publishing of this interview have some reflections on what I&#8217;ve learned from him.</p>
<p>Ward to me is a classic idea guy.  He&#8217;s always thinking, always saying &#8220;what if?&#8221;  In many of the conversations we&#8217;ve had, I&#8217;m embarrassed to say I can hardly keep up.  If I can follow half of what he&#8217;s talking about I&#8217;m fortunate since that half is usually enough to cause me to go running back to my desk and start working on some new angle in my own work.</p>
<p>Not all of his ideas see the light of day, I&#8217;m pretty sure.  But when he hits on a good one, he hits it out of the park&#8211;nobody could deny that.  The Wiki wasn&#8217;t his first great idea and it definitely wasn&#8217;t his last.</p>
<p>So that&#8217;s one thing I&#8217;ve learned.  Having great ideas isn&#8217;t like making great movies, where if you&#8217;re <a href="http://www.google.com/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fwww.imdb.com%2Fname%2Fnm0001837%2F&amp;ei=oTyGSfu-Cpm0sQOF_IG7DQ&amp;usg=AFQjCNEm7BwXt3vMLSmV5QAvR8Wu6d14Kw&amp;sig2=aY_5jRq3T4iy-ZhXkUWefg">Peter Weir</a> you do nothing for five years and then suddenly come out with some brilliant new film, then go quiet again for another five years.  You have to constantly be working on it.  You have to come up with a lot of ideas, be constantly thinking about where to go next, and keep pushing them, trying them out, until you find the one that captures the imagination and the mindset of those around you, and really takes hold.  Put another way, it&#8217;s not about the batting average&#8211;it&#8217;s about the number of at bats.</p>
<p><img src="http://blogs.nagarro.net/kayser/wp-content/uploads/2009/02/gifted.jpg" alt="Gifted" hspace="12" vspace="12" align="right" />Joel Spoelsky <a href="http://www.joelonsoftware.com/articles/fog0000000073.html" target="_blank">likes to make fun of smart people</a>, people that say things like,  &#8220;spreadsheets are really just a special case of a programming language.&#8221;  Rightly so.  Those kinds of smart people are useless.  That&#8217;s not Ward.  It&#8217;s not enough to just be an idea guy&#8211;to always be drawing connections between seemingly unrelated things, or playing with the meaning of things to try to derive new value.  If you want to make your mark the way Ward has, your ideas need to have true value, to make people&#8217;s lives easier somehow.  That&#8217;s the second thing I learned from Ward.  Great ideas need to be a path to a better way.  The Wiki, XP, and Fit&#8211;they all fit the bill in that regard.</p>
<p>Also, Ward&#8217;s ideas have a common theme, in my mind.  They are simple but with incredible leverage. He doesn&#8217;t overthink anything.  He just starts off with a simple way of looking at something differently.  He challenges conventional thinking, not very overtly, but in a kind of subtle, subversive way, innocently asking, &#8220;what if?&#8221;</p>
<p><em>What if customers wrote tests?</em>  (They can&#8217;t!)</p>
<p><em>What if programs told you how they behaved, instead of creating lots tests to ensure they behave how we expect? </em> (That won&#8217;t work!)</p>
<p><em>What if web surfers could edit the pages they view on the web?</em>  (Chaos!)</p>
<p>Ward knows the most successful systems always start out as simple concepts.  It would be easy to get carried away, to get too ambitious and over-engineer, but he always showed restraint.  The <a href="http://wiki.org/">original Wiki</a>, still going strong, is not much changed from the original implementation (although I doubt it is still served over a modem).  Instead, Ward left it to others to explore new platforms, languages, and intentions.  And thus it blossomed.</p>
<p>Which brings me to my third observation on his success.  It reminds me of something my father always used to say: &#8220;There is no limit to the amount of good you can do if you don&#8217;t care who gets the credit.&#8221;  Ward never tried to own the ideas or control them.  He puts everything into the public domain because he feels that&#8217;s where ideas can flourish and do the most good.  I believe if he tried to control his ideas with trademarks or patents (some have offered to &#8220;help&#8221; him by registering Wiki as a trademark), it would have stifled their growth, and maybe we would never have MediaWiki or Wikipedia.</p>
<p>But the best lesson I learned is something I observed when Ward was with other people.  He brings out the best in those around him.  I think he has that effect because he&#8217;s such an enjoyable person to be around.  People gravitate towards him.  Humble, unassuming, with not the slightest bit of arrogance, he disarms the cynics and brings people together, getting them to leave egos at the door and get down to the business of talking about really interesting things.  And the best example of that for me is the interview he did with me, which I thoroughly enjoyed.  View it along with the other <a href="http://www.youtube.com/view_play_list?p=740B993B09228573">lightning interviews</a> and I&#8217;m sure you&#8217;ll see what I mean.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/ward-cunningham/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OSGi from Here to There, Part II</title>
		<link>http://www.nagarro.com/blog/osgi-from-here-to-there-part-ii/</link>
		<comments>http://www.nagarro.com/blog/osgi-from-here-to-there-part-ii/#comments</comments>
		<pubDate>Thu, 14 Feb 2008 07:27:17 +0000</pubDate>
		<dc:creator>Bill Kayser</dc:creator>
				<category><![CDATA[Guest Blog: Kayser]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[OSGI]]></category>

		<guid isPermaLink="false">http://blogs.nagarro.net/kayser/osgi-from-here-to-there-part-ii/</guid>
		<description><![CDATA[So what does it take to migrate a large, multi-tier product to the OSGi Equinox runtime?
We started out with a large, over-frameworked set of applications built with a creaky buildsystem cobbled together from perl scripts and ant build files. We had all the code crammed into two projects, one for core libraries and the other [...]]]></description>
			<content:encoded><![CDATA[<p>So what does it take to migrate a large, multi-tier product to the OSGi Equinox runtime?</p>
<p>We started out with a large, over-frameworked set of applications built with a creaky buildsystem cobbled together from perl scripts and ant build files. We had all the code crammed into two projects, one for core libraries and the <span id="more-24"></span>other for application code. The applications were all part of a stack that had a lot of shared libraries and resources and the only thing that kept parts separated were the build scripts which extracted selected packages from the projects and built jars out of them. The jars would then be combined into the classpath for the corresponding application. So there was some attention to keeping components decoupled but nothing that actually enforced dependency management other than the build files. You couldn&#8217;t see any real structure emerge by browsing the two projects but after you ran the build you could browse the dozen or so different jar files in the targets directory to identify the common components, the application modules, client libraries for server communication, and the shared open source libraries.</p>
<p><img title="Software should be Art, not an Art Project!" src="http://www.nagarro.com/blog/wp-content/uploads/2008/02/hairball2_thumbnail1.jpg" border="1" alt="Hairball Architecture" hspace="16" vspace="12" align="left" /></p>
<p>Don&#8217;t bother reading that last paragraph again. It&#8217;s not worth it. It&#8217;s enough to know that things were a mess. We were a long way from a system based on a component architecture with every functional component of the system assigned to a standalone project with it&#8217;s dependencies and exports plainly elaborated in the IDE. And even if we did manage to completely reorganize everything, how could it possibly build? Our buildsystem would be useless, and at that moment there were about 25,000 lines of it to contend with.I spent about three weeks doing nothing but analyzing the situation. I didn&#8217;t change anything but played around with Equinox. I hacked our jarfiles to make them look like bundles. I wrote some PDE builders to see how they worked. I considered all possible options for breaking apart our two mammoth projects and putting everything back together again in. I read documentation, wikis, blogs and watched a number of <a title="EclipseCon Home" href="http://www.eclipsecon.org/2008/" target="_blank">EclipseCon</a> presentations. I was already halfway through my alloted time and I had not made one change. Finally I decided to take the plunge. I sent out e-mails to the dev team and told them for the next few weeks (which included the Christmas Holiday) I would be moving code around, breaking the build often, and changing the way they did everything. Then I went to work on a sort of recursive process to break apart the projects and re-constitute them as OSGi bundles.</p>
<p>Here&#8217;s how it went:</p>
<p>It&#8217;s not hard to make any Java application run in an OSGi runtime. All you have to do is zip everything up into a single file&#8211;class files, jar files, resources&#8211;and add the appropriate manifest headers. You need to write a few lines of java that implements a bundle Activator by invoking your main() routine. Then you start up your OSGi runtime (Equinox) and have the configuration reference your zip file, which is now a bundle. No application code needs to be changed.</p>
<p>So that was my starting point. I created four different projects for the different applications that made up our product. These projects are OSGi Bundles. I went back to my build output folder from the old ant build and grabbed the jar files needed for each of the applications and copied them into my new bundles. Then I created an Activator class for each one that just called the main() method for the application. I was stunned when it actually worked. It only took a little while but of course I wasn&#8217;t actually compiling code. It was just a re-packaging of the binaries.</p>
<p>To get to the point of having all the source in OSGi bundles I was going to have to break down the big bundles into smaller ones and move the source over one at a time. This turned out to be an iterative process that looked something like this:</p>
<ol>
<li>Pick one of the bundle projects I had just created.<img src="http://www.nagarro.com/blog/wp-content/uploads/2008/02/nugeo.gif" alt="Decomposition" hspace="16" vspace="12" align="right" /></li>
<li>Go through the jar files inside of it one at a time.For each one, I would create a new bundle corresponding only to that jar file. Let me use <code>utilities.jar</code> as an example. The bundle I created was called <code>com.acme.utilities</code>.
<ol>
<li>I would take all the classes that appeared in <code>utilities.jar, </code>find the java source files in the old projects and move them into my new <code>com.acme.utilities</code> bundle source folder.</li>
<li>Once I had that working, I would go back through all the other bundles I had already created and find any others that were using the <code>utilities.jar</code>. In those bundles I would delete thejar file and add the dependency on <code>com.acme.utilities</code>.</li>
</ol>
</li>
<li>Now my new bundle project had no more jar libraries in it. It also had no source code. I had broken it up into a bunch of bundles like <code>com.acme.utilities</code> so now I could just delete it.</li>
</ol>
<p>The trick was to work up the food chain starting from the bottom. Pick out the jar files which did not depend on anything else that wasn&#8217;t already a bundle. I started with 3rd party libraries and simply converted those jar files into bundles. It only takes a minute to do this in Eclipse or with the excellent <a href="http://www.aqute.biz/Code/Bnd" target="_blank">BND utility</a> from Peter Kriens. You add the 3rd party bundles to what&#8217;s known in Eclipse as the target platform for your application.</p>
<p>After this phase, I had gone from two huge projects to a dozen or so smaller ones, each more clearly identified with it&#8217;s function. Instead of one giant &#8220;libs&#8221; project I had <code>com.acme.utilites.core</code>, <code>com.acme.utilities.swing</code>, and <code>com.acme.utilities.html</code>, etc.</p>
<p>Along the way I discovered problems in our application, like circular dependencies.  These weren&#8217;t necessarily bugs but were isolated cases where someone had specifically broken a rule like accessing some view code from the model.  The IDE was catching problems like this.</p>
<p>One lesson I learned was to let go of our classloaders.  We were using classloaders in a number of places to try to scope visibility of jar files or look up classes dynamically by name.  OSGi now managed all of the issues we were trying to solve with classloaders.  Invariably when I encountered places in the code that were passing classloaders as arguments I could pretty much just remove them completely.  OSGi gives you the proper class visibility no matter where you are.When it was all finished I could look at our code and see real structure.  Bundles represented groups of related classes that often corresponded to some layer in the application, like persistence, ui, domain code, messaging, utilities, etc.  Not only could I see the dependencies but I could make strong assertions about them because they were actually being enforced.  I could find exactly who had visibility into classes down to the package level.  The public module APIs were clearly delineated from the implementation classes.  Not only was there loose coupling but there was also good cohesion.</p>
<p>Other unanticipated benefits to developers were immediately apparent:</p>
<ul>
<li>It was much easier to understand how things were being used and easier to change them.</li>
<li>We have an environment that supports different Java VMs in different tiers, but we had to write code to the least common denominator.  Now we could move the major parts of the server to Java5 and utilize things like generics without worrying about breaking other tiers because we had separated out the bundles that were not going into the Java 1.3 applications.</li>
<li>We didn&#8217;t have a 20 minute ant build anymore on the developer desktop.  It was part of the headless build only.  Because the same build artifacts were used to launch apps in the IDE and drive the headless build, they were pretty much in sync with each other so developers didn&#8217;t need to do a headless build.  Just edit code, launch application.</li>
<li>We could create extension points for add-ons, rather than implement complicated hooks with classloaders and convoluted configuration files.  This is part of Equinox, not OSGi per se.  It&#8217;s the same kind of benefit you would get with Spring.</li>
<li>Eclipse was much more responsive.  Apparently having lots of small projects instead of one giant one is more efficient for many tasks.  It didn&#8217;t improve Eclipse build times but it did help with other things like auto-complete and refactoring.</li>
</ul>
<p>There were many, many other nice benefits yielded from this exercise, most of them unanticipated.</p>
<p>Would anyone yield these kinds of benefits from converting to OSGi?  I don&#8217;t think so.  We saw such a dramatic improvement because our existing infrastructure was so dilapidated.  Our code was old and the buildsystem brittle.  It&#8217;s a common scenario for many Java developers&#8211;dealing with the legacy of a system that became massively bloated over time.  We all look at systems like that and wistfully imagine rewriting layers with Hibernate, Spring, Struts, JSF&#8211;whatever.  Many times the benefit doesn&#8217;t justify the cost, or the rewrite turns into a classic <a title="The Second System Effect" href="http://en.wikipedia.org/wiki/Second_system_effect">Second System</a>.  From the outset this didn&#8217;t seem much different.  Early on I worried this was going to be a very ambitious undertaking, and I had doubts about whether it would spin out of control.</p>
<p>It didn&#8217;t turn out like that at all.  In fact, this was my first experience giving a facelift to such an old application with relative ease.  I didn&#8217;t have to rewrite any code (other than fixing a few bugs).  I just moved classes around.  I did rewrite the buildsystem, but since the new build artifacts were a tiny fraction of the size of the old buildsystem, this effort paid for itself quickly.   It only took a long time because I was working alone and was being extremely cautious, keeping the system stable continuously throughout the process, rather than just break everything for two weeks and put it all back together again all at once.</p>
<p>Engineers understand the value of this kind of improvement immediately.  You can almost get Product Managers on board with the &#8220;SOA in a JVM&#8221; story.  But Sales and Marketing won&#8217;t bother to stop typing on their Blackberries once you start talking about OSGi.  For me this was mostly about extending the life of a very useful piece of software.  The legacy of older applications isn&#8217;t just the code, but all the energy, innovation and hard work that goes into them, regardless of how you feel about the end result.  We owe it to the original authors to make as much as we can of their work.  We&#8217;d want nothing less for our legacy.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/osgi-from-here-to-there-part-ii/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>OSGi from Here to There</title>
		<link>http://www.nagarro.com/blog/osgi-from-here-to-there/</link>
		<comments>http://www.nagarro.com/blog/osgi-from-here-to-there/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 05:22:49 +0000</pubDate>
		<dc:creator>Bill Kayser</dc:creator>
				<category><![CDATA[Guest Blog: Kayser]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[OSGI]]></category>

		<guid isPermaLink="false">http://blogs.nagarro.net/kayser/osgi-from-here-to-there/</guid>
		<description><![CDATA[In the last installment I talked about programs built on the OSGi runtime, how they consist of discrete bundles of code and resources loosely coupled with each other, using a service registry to communicate, much the way discrete applications work together in an SOA environment. I tried to draw a picture of a Java application [...]]]></description>
			<content:encoded><![CDATA[<p>In the last installment I talked about programs built on the OSGi runtime, how they consist of discrete bundles of code and resources loosely coupled with each other, using a service registry to communicate, much the way discrete <span id="more-23"></span>applications work together in an SOA environment. I tried to draw a picture of a Java application not as a main class entry point into a soup of jar files and classes all piled onto a single tower known as the class path, but rather as a set of these OSGi bundles, each declaring their own dependencies and exports, with a runtime that wires everything up as a network to satisfy all the dependencies. I tried to describe how applications broken up this way are actually easier to understand and manage. You can look at any individual Java package and make strong assertions about who has access to it and how, and understand what will break if it is modified or removed.</p>
<p>If my picture wasn&#8217;t very clear, or you still don&#8217;t fully grasp the motivation for this, I&#8217;ll describe a specific example that many Java developers should relate to. But before I do, it might be a good idea to make a more detailed presentation of OSGi and Equinox, the implementation used by Eclipse. Rather than take up space here though, I think I&#8217;ll just include some references to articles which I think give the best overview:</p>
<p>This <a title="Jeff McAffer Presentation" href="http://www.google.com/url?sa=t&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fwww.eclipsecon.org%2Fsummiteurope2007%2Fpresentations%2FESE2007_EquinoxUpdate.pdf&amp;ei=H89VR568F5aspwTcxLHiCA&amp;usg=AFQjCNEYUic4vuOcsogNX01LIDV6PaCdvQ&amp;sig2=sXE5dQZ8ILjTooxPFJ8mVA">presentation by Jeff McAffer</a> covers some OSGi basics as well as some of the really interesting areas being explored, such as dynamic provisioning of bundles (think of Java Webstart) and <a href="http://wiki.eclipse.org/API_Comparison_demo">API tooling</a>.</p>
<ul>
<li>50 minute <a href="http://live.eclipse.org/node/387">presentation </a>by some Equinox implementers introducing OSGi and Equinox. Sample Code available for download.</li>
<li><a href="http://www.eclipse.org/equinox/documents/">Equinox Documentation Page</a>, pretty much all you need.</li>
<li>Peter Kriens&#8217; <a href="http://www.osgi.org/blog/">OSGi blog</a> (thanks Abhijat!). This covers OSGi in more detail as well as a lot of the politics going on around competing component models.</li>
</ul>
<p>On a recent project I was working on we ran into a sort of crisis. We had reached a point where development was no longer scaling. Incremental changes to the architecture required a tedious littany of changes to configuration files, build files, test scripts, library paths, IDE configurations, and installer scripts. These changes all had to be carefully coordinated and missed steps often didn&#8217;t show up until further downstream; something as simple as adding a new class could result in a ClassNotFoundError in testing if one of the many dependent configurations had not been updated with the new class. So much effort and diligence was required for even small changes that we could not keep up with the kinds of improvements necessary to remain competitive.</p>
<p>We decided to migrate our application runtime to the OSGi Equinox runtime. As it turned out our motivation had nothing to do with the issues above but with other business issues. What we discovered was that after making the investment in structuring our application into bundles, we were able to breathe new life into it. We could again make big changes to the &#8220;plumbing&#8221; with much less effort and could make stronger assertions about the different parts of the application&#8211;what could be safely refactored and what had fragile dependencies.</p>
<p>The improvements included but were not limited to:</p>
<ul>
<li>Going from 25,000 lines of ant code required for a full build down to about 200 lines of boilerplate configuration, plus about 200 lines of custom callbacks,</li>
<li>We eliminated about seventy class file catalogs used to ensure extra classes were not inadvertently shipped in the wrong jar file or duplicated unnecessarily,</li>
<li>Reducing the size of application distros by eliminating unused dependencies</li>
<li>Surfacing previously unknown bugs based on dangling references to missing classes and libraries,</li>
<li>Eliminating a large body of code devoted to managing extensions with segregated class spaces using custom class loaders.</li>
<li>Going from managing four different runtime configurations for each application&#8211;the IDE classpaths, the IDE launchers, the runtime script classpaths, the build script classpaths&#8211;down to a single feature descriptor listing the OSGi bundles comprised by each application.</li>
</ul>
<p>And probably the biggest improvement was in the introduction of the extension mechanism provided in Equinox to extend applications with a sort of dependency injection. This allowed us a new lease on life as a platform for custom configuration and specialized implementations instead of a product trying to be all things to all customers.</p>
<p>The investment required wasn&#8217;t trivial but it turned out to be much easier and simpler than I expected. I worked on the conversion myself over a period of weeks. We were able to pull the trigger on the new configuration after about two weeks (implemented over a slow holiday period) and have it fully baked with about a four week effort spread over time. Much of this effort consisted on eliminating the old build system, verifying that everything we did before was being done the same way using the new build system. Developers didn&#8217;t really have much downtime but it was very disruptive for them. I had to send out emails every few days or few weeks with instructions on how to do things differently. Most notes were joyous announcements that &#8220;you no longer have to&#8221; do some tedious routine task that you had to do before. For instance, developers no longer had to kick off an ant build before testing an app. They could launch it directly. They no longer had to update build scripts. We no longer had to wait for the CI server to inform us that a build broke because a dependency was missing. Now Eclipse would show us the missing dependencies. In fact, it did this before but because the configuration of the IDE was separate from the build it wouldn&#8217;t really mean anything.</p>
<p>To this day team members still come up to me occasionally to thank me for introducing OSGi, often after being reminded what things were like by having to go back to an old release build. I wish I could take credit but the truth is I never anticipated most of these benefits until I started the conversion.</p>
<p>Now clearly most of the benefit derived had to do with the painfully wrongheaded buildsystem we already had in place by the previous generation of developers. In their defense, it was developed when the only real build tool available was an early version of ant, before they were even using a modern refactoring IDE. And there are a lot of good choices for modern build tools which solve some of these problems (<a title="Maven Buildsystem" href="http://maven.apache.org">Maven</a> and <a href="http://www.eclipse.org/buckminster/">Buckminster</a> are two that I would look at). But OSGi isn&#8217;t really a buildsystem or a configuration management system. It&#8217;s simply a runtime that enables solutions to these problems with a much more coherent, consistent and simplified approach.</p>
<p>Our buildsystem, our unit test runner, the IDE, the extensible platform, the launchers, the branding, dependency management&#8211;all of these mechanisms are now based on the same set of build artifacts, the Equinox configuration files (bundle manifests, feature and product descriptors), files which are managed with a very nice GUI.</p>
<p>I was expecting to start this entry in early December but I&#8217;m learning it&#8217;s hard to get a few hours of quiet time at the computer now with the baby and two year old. I&#8217;m adapting slowly! I hope to continue the OSGi discussion with the actual procedure for converting applications to OSGi and how the PDE headless build works.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/osgi-from-here-to-there/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>SOA in a JVM</title>
		<link>http://www.nagarro.com/blog/soa-in-a-jvm/</link>
		<comments>http://www.nagarro.com/blog/soa-in-a-jvm/#comments</comments>
		<pubDate>Mon, 26 Nov 2007 00:40:51 +0000</pubDate>
		<dc:creator>Bill Kayser</dc:creator>
				<category><![CDATA[Guest Blog: Kayser]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[OSGI]]></category>
		<category><![CDATA[SOA]]></category>

		<guid isPermaLink="false">http://blogs.nagarro.net/kayser/soa-in-a-jvm/</guid>
		<description><![CDATA[There has never really much debate about whether Service Oriented Architecture is a good idea or not. Based on principles such as loose coupling, encapsulation, location transparency, and the separation of infrastructure and applications, it has always had broad appeal. IT executives like the uniformity of a standards based solution that provides management and visibility [...]]]></description>
			<content:encoded><![CDATA[<p>There has never really much debate about whether <a title="SOA Definition" href="http://www.developer.com/services/article.php/1010451" target="_blank">Service Oriented Architecture</a> is a good idea or not. Based on principles such as loose coupling, encapsulation, location transparency, and the separation of infrastructure <span id="more-17"></span>and applications, it has always had broad appeal. IT executives like the uniformity of a standards based solution that provides management and visibility across all applications. Application Owners like that it gives them much needed interoperability with other parts of the business. And developers especially like the layered architecture and loose coupling achieved with relatively simple plumbing, unlike the component model predecessors of earlier years.</p>
<p><img src="http://www.nagarro.com/blog/wp-content/uploads/2007/11/20050128705-0-large.jpg" alt="Simple Plumbing" hspace="12" vspace="12" align="left" />But this appeal isn&#8217;t limited to distributed enterprise applications. Wouldn&#8217;t software developers like to see a Service Oriented Architecture for the &#8220;services&#8221; located within a single JVM?</p>
<p>Java Enterprise Software is never written from scratch. Typically it involves writing components that utilize 3rd party libraries, extensions to application frameworks, communications with different tiers. Just look at the class path of any Java Enterprise Application and you&#8217;ll see a long list of jar files including JDBC drivers, web application frameworks, validation libraries, Jakarta Commons libraries, and various client libraries. Also, typically you&#8217;ll see a number of entries developed by other groups in house: proprietary frameworks, common core utilities, i18n libraries, validation frameworks&#8211;on and on.</p>
<p>The end result of the typical class path of a Java application is a giant set of classes from many different libraries all thrown together into a big soup where any class technically can access any other public class, directly or indirectly. Furthermore, nothing guarantees that all the necessary parts are present. Just because everything compiles into jar files doesn&#8217;t mean the classes referenced at runtime are actually going to be there, or for that matter be the correct version.<img src="http://blogs.nagarro.net/kayser/wp-content/uploads/2007/11/plumbing.jpg" border="2" alt="Poor Plumbing" hspace="12" vspace="12" align="right" /></p>
<p>In these applications, dependencies are hard to manage. Tools such as <a title="JDepend Open Source Dependency Management Tool" href="http://clarkware.com/software/JDepend.html">JDepend</a> can be used to identify fragile APIs, problematic dependencies and tight coupling, but nothing really prevents developers from using classes they shouldn&#8217;t be using. For instance, once someone uses an Oracle specific class in the Oracle JDBC driver they will be unable to use a different vendor&#8217;s driver. Or some code might inadvertently reference an implementation class that is not part of the public API and break on a subsequent upgrade of the library.</p>
<p>Now imagine that the different libraries and frameworks were actually services. They had a public API which is accessible to other components and private implementation classes which are not. The dependencies of any service would be explicit, listing the other services and versions which are required at runtime for them to operate properly. These constraints would be enforced at compilation time as well as at runtime; if a required service in a particular version range is not available in either instance, the system fails fast with an indication of what&#8217;s missing. If a service tries to access a public class in a service not listed as a dependency, a class not found error occurs (an error also caught at compilation time). These libraries would still materialize as jar files, but these jar files would be service modules which can be moved in or out of an application even while the application is running. There would be no separate step of composing the classes of a jar file with globs in an ant file. The definition of a service implies the contents of the jar files&#8211;no need to maintain an ant file, just a manifest file for the service identifying it&#8217;s version and dependencies.</p>
<p align="left"><img title="If only our software architecture was this neat" src="http://blogs.nagarro.net/kayser/wp-content/uploads/2007/11/sub.jpg" alt="" align="left" />Some of this may already sound familiar. <a href="http://en.wikipedia.org/wiki/Inversion_of_control">Inversion of Control</a> (IoC) frameworks such as <a href="http://www.picocontainer.org/">PicoContainer</a> and <a href="http://www.springframework.org/">Spring</a> provide some aspects of the separation of implementation and interface already. Application servers use class loader hierarchies to enforce separation of class visibility within a single JVM. And various application architectural patterns such as <a href="http://c2.com/cgi-bin/wiki?AbstractFactory">Abstract Factories</a> and <a href="http://c2.com/cgi-bin/wiki?DependencyInjection">Dependency Injection</a> provide a means for protecting implementation classes and avoiding fragile APIs.</p>
<p>While these frameworks are all helpful they still leave the programmer in charge of introducing and utilizing them. In most cases, the JVM still loads classes from the big vat of class soup indicated by the class path. What is needed is something more fundamental, something that would completely &#8220;invert&#8221; the control of the whole application, executing everything as services, not the chosen few components. Instead of the JVM invoking main() on your main class with a single class loader for all your classes, a small application runtime is invoked that looks at all your services, wires up all the dependencies between the services, blocks any that have unresolved dependencies, then invokes start() on each of the services.</p>
<p>Hold it right there, you are probably saying. It already sounds complicated. You might be picturing some big API, or massive documentation you have to go out and read. Sign up for the classes, read the articles, copy the example code, and a week later you&#8217;ve got HelloWorld done. Stick with me and you&#8217;ll find out it&#8217;s not like that. The runtime I&#8217;m speaking about is called <a href="http://www.osgi.org/">OSGi</a> and while it is complicated in what it does and how it works, it&#8217;s remarkably simple to utilize with the right tool. And <a href="http://www.google.com/url?sa=t&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fwww.internetnews.com%2Fdev-news%2Farticle.php%2F3630071&amp;ei=ff9JR8OeIZSWgQOOqKjYDg&amp;usg=AFQjCNHMpXXZF5hLOzRnt0KNN-Ww5poNkw&amp;sig2=sG8yqGEiGbERmBLL4USz_w">more likely than not</a>, you are using that tool already.</p>
<p>OSGi is a standard for a Java component model that has several open source implementations. The most common implementation is calld <a href="http://www.eclipse.org/equinox/">Equinox</a>. Equinox is the runtime used by the Eclipse IDE and all Eclipse RCP based applications. It&#8217;s the lowest level on the Eclipse application runtime stack. It provides the SOA architecture on which Eclipse runs, as of version 3.0. If you&#8217;ve programmed RCP applications you&#8217;re already familiar with Equinox, but even if you&#8217;re just an Eclipse user, you might have noticed that Eclipse is composed of plug-ins which all live in the plugins directory in the Eclipse installation. These plugins are generally jar files or directories that represent the various components of the application. There can be hundreds of these. As an Eclipse user, you may appreciate that you can extend Eclipse with new features by simply adding new plugin jars to the plugins directory and restarting the IDE. If you&#8217;ve looked at how Eclipse starts, you&#8217;ll see it simply invokes a small jar file on the command line&#8211;no reference to any application libraries or classes. As a plugin developer, you are more keenly aware of how these plugins are built, their lifecycle, and the actual mechanics of extending the IDE.</p>
<p>What you may not be aware of is that the plumbing for all of this is not part of the IDE, or even part of RCP, but is actually part of the Equinox runtime bundled with Eclipse. The main class invoked when you start up Eclipse is actually an Equinox entry point, and none of the Equinox code knows anything about Eclipse, RCP, SWT or any of that. This is very important because it means that Equinox can be used as the runtime for any application, including Swing and Web applications.</p>
<p style="text-align: center"><img src="http://blogs.nagarro.net/kayser/wp-content/uploads/2007/11/highlevel.png" alt="Eclipse OSGi Architecture" /></p>
<p style="text-align: center"><em>Eclipse/RCP Architecture built on OSGi</em></p>
<p>What does all of this mean for you? You have the means and the opportunity to be building your applications with a service oriented architecture, much more easily than you might expect, and I&#8217;ve only scratched the surface of the benefits.</p>
<p>You may have noticed it&#8217;s been a pretty long gap between my last entry and this one. I&#8217;m currently on a leave of absence while managing a new dependency in my family, in the form of a baby boy born on November 14. I&#8217;ll pick up this thread in a week or two and show you how we converted our 600,000 line multi-tier swing based application into a service oriented architecture, replacing over 30,000 lines of ant code with about 200 lines, and vastly improving its maintainability and longevity in the process.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/soa-in-a-jvm/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>The Usability of Programs, Part 2 of 2</title>
		<link>http://www.nagarro.com/blog/the-usability-of-programs-part-2-of-2/</link>
		<comments>http://www.nagarro.com/blog/the-usability-of-programs-part-2-of-2/#comments</comments>
		<pubDate>Mon, 22 Oct 2007 06:32:40 +0000</pubDate>
		<dc:creator>Bill Kayser</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Guest Blog: Kayser]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blogs.nagarro.net/kayser/the-usability-of-programs-part-2-of-2/</guid>
		<description><![CDATA[Here are some other principles of UI design that apply to program design:
Reduce Cognitive Load. This guideline in UI design is about minimizing the amount of things a user has to know in order to be able to use a tool effectively. Likewise, a programmer shouldn&#8217;t have to subclass five different classes just to effect [...]]]></description>
			<content:encoded><![CDATA[<p>Here are some other principles of UI design that apply to program design:</p>
<p><strong>Reduce Cognitive Load</strong>. This guideline in UI design is about minimizing the amount of things a user has to know in order to be able to use a tool effectively. Likewise, a programmer shouldn&#8217;t have to subclass five different classes just to effect one small change to an application. For instance, I often find that in order to add a new behavior interactive application I may have to learn the logging framework, the undo/redo mechanism, the localization framework, and the validation framework&#8211;on top of whatever complicated hierarchies exist in the model and views. Things usually reach this state when developers anticipating future needs and striving for reusability and generality in their frameworks end up sacrificing simplicity and, ultimately, usability.</p>
<p><span id="more-12"></span></p>
<p><a title="DaVinci Vman" href="http://www.nagarro.com/blog/wp-content/uploads/2007/10/davinci_vman.jpg"><img src="http://www.nagarro.com/blog/wp-content/uploads/2007/10/davinci_vman.jpg" alt="DaVinci Vman" hspace="16" vspace="12" width="213" height="250" align="right" /></a><strong>Be consistent</strong>. The brake pedal on one model of car shouldn&#8217;t serve as the accelerator on another. That would be dangerous. It can also be dangerous to mix thread safe classes with classes that aren&#8217;t thread safe, or to have methods accept null String values in some places and throw exceptions in others. If you adopt an idiom in your public interfaces, like converting exceptions thrown by delegate APIs to local exceptions, or using immutable objects as enumerated types instead of ints, then try to stick with it. Consistency fosters a perception of predictability and stability.</p>
<p><strong>&#8230;But not too consistent.</strong> Jakob Nielsen, a well known usability expert, suggested that you can take certain principles too far, and the principle of consistency is one of those. He felt that Mac interfaces went to excess in trying to maintain consistency, to the point of defying common sense. A famous example: since the operation of removing things from a desktop consisted of dragging them to the trash can, the operation for ejecting a floppy disk was to drag it from the desktop into the trash can, an operation guaranteed to unnerve a user the first time they try it. In software, programmers often step into the realm of over-engineering in an effort to enforce consistency. An action in a user interface may implement an Undoable interface, but that doesn&#8217;t mean all actions should be undoable. One might take pains to separate UI code from Domain objects, but if it means introducing intermediary classes and interfaces just to keep domain code from importing javax.swing packages then it may be better to diverge from consistency.</p>
<p><strong>Avoid modality. </strong>In many applications users are confronted with modal dialogs which force them to take action before they can proceed in other parts of the application. While a modal dialog is showing, all other parts of the interface are disabled. On the surface this may seem helpful to the user but oftentimes it&#8217;s just a convenience for the programmer who doesn&#8217;t have the inclination to design the data model so that multiple activities can be conducted concurrently (i.e., changing the properties of an Employee in a dialog while simultaneously deleting that employee in the parent window).</p>
<p>The same thing applies in program design. Sometimes when one object collaborates with another it makes assumptions about the state of that object. Its operation is only guaranteed to be correct under those assumptions. For instance in some data access object there may be operations which result in updating a database object. But these operations might assume that a transaction has been started and fail in the worst possible way if that&#8217;s not the case. Users of this class must be aware these methods can only be called in a transaction and keep track of the state of the transaction. An alternative design might encapsulate individual operations in a full transaction, or offer more support keeping track of the transaction state.</p>
<p>Avoid this kind of modality in your classes. You can&#8217;t drop all preconditions but the fewer opportunities for failure, the more robust the application.</p>
<p><img src="http://www.nagarro.com/blog/wp-content/uploads/2007/10/handle.jpg" alt="Handle" hspace="16" vspace="12" width="295" height="300" align="left" /><strong>Utilize Affordances. </strong>Affordances are properties of an object that suggest some action can be taken. A door knob &#8220;affords&#8221; opening a door. A rectangle on a screen may not afford action, but if it is raised and rounded, resembling a button, it affords being pushed. For programmers, affordances might be properties of an interface which make it&#8217;s usage more clear. In a class, abstract methods afford overriding. If a class requires several instance variables be initialized when the instance is created, then the programmer should afford that action by adding parameters to the constructor to populate those variables, rather than rely on the caller to invoke setters. Good abstractions and well factored class hierarchies can afford subclass extensions, where flat class structures with duplicate code and concrete classes may not.</p>
<p><strong>Adopt Standards. </strong>What more is there to say? Standards in User Interface design result in uniformity across user interfaces, giving the user a sense of familiarity when using an application for the first time. In programming, coding standards provide exactly the same benefit.</p>
<p><strong>Provide Feedback.</strong> Feedback in user interfaces usually means giving some indication that a user action has been detected and interpreted. If the action was accepted then give an indication to the user of success. If the action results in an error, make that error known to the user directly. This could probably be interpreted several ways in the context of programming, but the best one would probably be the principal of &#8220;Fail Fast.&#8221; This means detecting an erroneous use of a class or method early and communicating the actual offense, preferably in a runtime exception, as opposed to letting it go and waiting until the effects of the error cause secondary exceptions which may not reveal the actual API violation. An example of this would be not checking for null values in method parameters but passing the null values on to subsequent calls until a NullPointerException appears in a lower level method. I don&#8217;t think you want to check every pre-condition to an exception since it makes methods very noisy, but a lot of times there are conditions which are more likely to be violated. Play the odds and enforce those when you come across them.</p>
<p>You can really go on and on with this idea. The principles of usability apply to any system that interacts with a user, and that includes a programming model. The goal of a great programmer should be the same as the great product designers: empower and delight your users. Programmers should never forget that ultimately their users are not CPUs but other programmers.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/the-usability-of-programs-part-2-of-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The Usability of Code, Part 1 of 2</title>
		<link>http://www.nagarro.com/blog/the-usability-of-programs-part-1-of-2/</link>
		<comments>http://www.nagarro.com/blog/the-usability-of-programs-part-1-of-2/#comments</comments>
		<pubDate>Fri, 12 Oct 2007 06:54:08 +0000</pubDate>
		<dc:creator>Bill Kayser</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Guest Blog: Kayser]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[api design]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[ken arnold]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://blogs.nagarro.net/kayser/the-usability-of-programs-part-1-of-2/</guid>
		<description><![CDATA[Not long ago Ken Arnold wrote an article for Queue magazine called Programmers are People Too. In it he talks about applying the principles of User Interface Design to the design of APIs. It turns out the practices of Human Factors and Usability Engineering have a lot to offer the implementors of public APIs and [...]]]></description>
			<content:encoded><![CDATA[<p>Not long ago Ken Arnold wrote an article for Queue magazine called <em><a href="http://www.acmqueue.com/modules.php?name=Content&amp;pa=printer_friendly&amp;pid=317&amp;page=3">Programmers are People Too</a></em>. In it he talks about applying the principles of User Interface Design to the design of APIs. It turns out the practices of Human Factors and Usability Engineering have a lot to offer the implementors of public APIs and frameworks. Think of an API as the &#8220;user interface&#8221; of a larger programming model. Users are application programmers and the usability of the API is judged not just by it&#8217;s richness, but on the ease of use and learnability of the API. It&#8217;s not sufficient to address usability with thorough documentation any more than it&#8217;s sufficient to compensate for a bewilderingly difficult user interface to a mobile phone with a five pound user manual.</p>
<p><span id="more-11"></span></p>
<p><img src="http://www.nagarro.com/blog/wp-content/uploads/2007/10/explorer-8300-remote-large.jpg" border="0" alt="Remote Control Interface" hspace="16" vspace="6" width="120" height="400" align="left" />The idea of applying Human Factors to API design is not far off the idea of designing programs as works of literature. In both cases your main focus is your audience, not the computer. The common principle in both is readability, but the idea of API usability takes it a little further because your audience isn&#8217;t just trying to understand what it&#8217;s looking at but actually use and extend the work.</p>
<p>I believe these principles of usability apply not just to API design, but to programs in general. Ken Arnold gives a couple of examples of UI principles applied to API design, such as the use of <strong>Progressive Disclosure</strong>. That&#8217;s the principle that says you shouldn&#8217;t overwhelm a user with more detail than they need for a common task, but rather disclose the additional detail when the need arises as they move further along in some interaction. Give the user what they need to know when they need it and only when they need it. That way they won&#8217;t be distracted or confused by superfluous information.</p>
<p>For an API, this might mean segregating the methods of a complicated class into the methods most commonly used by client applications from the less frequently used methods needed in special situations or by advanced users. For an application designer it might mean using interfaces and abstract classes to hide the distracting implementation details of a class.</p>
<p>Think about other common principles for user interface design, such those described in the <a href="http://developer.apple.com/documentation/UserExperience/Conceptual/OSXHIGuidelines/XHIGIntro/chapter_1_section_1.html">Apple Human Interface Guidelines</a>. How can these be applied to program design? I&#8217;ll list some more examples in the next installment of this column.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/the-usability-of-programs-part-1-of-2/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Programmers as Channel Surfers</title>
		<link>http://www.nagarro.com/blog/programmers-as-channel-surfers/</link>
		<comments>http://www.nagarro.com/blog/programmers-as-channel-surfers/#comments</comments>
		<pubDate>Tue, 02 Oct 2007 06:00:41 +0000</pubDate>
		<dc:creator>Bill Kayser</dc:creator>
				<category><![CDATA[Guest Blog: Kayser]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[literate programming]]></category>
		<category><![CDATA[program documentation standards]]></category>

		<guid isPermaLink="false">http://blogs.nagarro.net/kayser/programmers-as-channel-surfers/</guid>
		<description><![CDATA[If a program is to be a work of literature, then where does that leave object-oriented programs? In the era of functional decomposition, programs were built around algorithms and data structures. They executed in a single thread as a sequence of steps and subroutine calls, not unlike a story. Our object-oriented programs, on the other [...]]]></description>
			<content:encoded><![CDATA[<p>If a program is to be a work of literature, then where does that leave object-oriented programs? In the era of functional decomposition, programs were built around algorithms and data structures. They executed in a single thread as a sequence of steps and subroutine calls, not unlike a story. Our object-oriented programs, on the other hand, don’t have such a fixed path of execution. Whether server or client applications, they start up multiple threads and make heavy use of message passing and asynchronicity. The essence of a program is not in a sequence of steps and subroutine calls but in the subtle relationships between classes spread across many frameworks and subsystems, relationships such as inheritance, aggregation and collaboration. So how does one read a Java application like a story? The whole idea of object oriented programs seems at odds with literate programming.</p>
<p><span id="more-10"></span></p>
<p><img src="http://www.windowsusers.org/articles3/convertx/win_tv_surfing.jpg" border="1" alt="" hspace="14" vspace="6" width="180" height="151" align="left" />It may help to view your program less as a novel read in a single sitting and more like a TV show that is tuned in once a week by busy people with short attention spans. The purpose is still to engage and inform, but you need to keep in mind your audience could be jumping in to the story just about anywhere. Like a viewer flipping through channels, happening upon an interesting show, there’s a good chance that the first time a colleague comes across your code is clicking through the frames in a stack trace. They will be debugging an application trying to understand some unexpected sequence of events and will stumble upon one of your classes. Or they might drop in to use some small part of your API. Maybe they jump into your code to extend some capabilities, add a new feature, or make small changes as part of a global refactoring. They just want to know enough to get the task done and keep going. They might watch an episode but then move on.</p>
<p>There are a lot of practical implications to this approach but for this article I’ll just focus on one: give the user the information they need in the context of just “dropping in.” Think about the questions they might have looking at your code in a debugger: What is this class for? What elements are in the collection? Where did this member variable get set? Don’t make them work to find out something you could have made apparent with very little effort to begin with. Your goal is to give them enough information about each element so they won’t have to get sidetracked tracking down other references to the element just to see how it’s used . For example:</p>
<ul>
<li>Don’t make it a precondition for them to read a big design document on your intranet just to be able to understand what your GizmoClass is. Put the information as close to the artifact as possible. In the code, or at least in the same directory as the source.</li>
<li>Document all your classes and interfaces. This may seem like a no-brainer, but it’s not about spending more time writing comments. Instead, keep it as simple as possible. Avoid verbosity and forms. Just a sentence or two to explain what the class is (especially helpful if you couldn’t come up with a really good name). Maybe say what it’s used for. That’s usually about as much as someone needs to know. Refrain from a huge exposition on the overall design or the justification for the class. Save discussion of the class members for the member comments themselves. And if you can&#8217;t think of something meaningful to say, don&#8217;t say anything at all.</li>
<li>Don’t duplicate information in an Interface and a Class. If you have to pick one, document the interface. Focus on the interface for describing what something is or represents, and in the implementation, anything noteworthy about the implementation.</li>
<li>When declaring variables of collection types, if you say nothing else in the comment you should at least state the actual type of the elements of the collection.</li>
<li>Method javadocs are critical for the casual audience, but not because they will show up in the HTML documentation. Most IDEs will provide javadoc comments in a tooltip or property sheet, saving the user the step of clicking through to the declaration, or opening up the javadocs in a new window.</li>
<li>Make variable names as descriptive as possible. Not just your member or local variables. People tuning in to your code the first time will have a much easier time decrypting your for loops if instead of i or index you use names like row, month, or customerNumber.</li>
<li>Consider “Hungarian Notation” for variable names. Many developers find this convention ugly and onerous, but you can’t deny the value of immediately recognizing a variables scope without having to jump to its declaration. There’s a wide spectrum of adherence to this principle; from the old C++ practice of limiting the convention to member variables with a ‘_’ prefix on one hand, to an array of prefixes identifying the scope of every variable.</li>
</ul>
<p>The point of this is not to enumerate a list of documentation standards for your programs, but to get you to think like an author and empathize with your audience. Use your own experience learning and debugging other people’s code to determine what your audience needs from your documentation. Give them whatever they need to keep them from changing the channel before your program finishes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/programmers-as-channel-surfers/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>The Literacy of Programs</title>
		<link>http://www.nagarro.com/blog/the-literacy-of-programs/</link>
		<comments>http://www.nagarro.com/blog/the-literacy-of-programs/#comments</comments>
		<pubDate>Sun, 30 Sep 2007 09:21:36 +0000</pubDate>
		<dc:creator>Bill Kayser</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Guest Blog: Kayser]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[donald knuth]]></category>
		<category><![CDATA[literate programming]]></category>

		<guid isPermaLink="false">http://blogs.nagarro.net/kayser/the-literacy-of-programs/</guid>
		<description><![CDATA[
What is the purpose of a computer program?
Your colleagues and you all write software.  You generate software prose on a daily basis, crafting these artifacts called programs, line by line.  You utilize a common language that you all agree upon, a language which bears scant resemblance to a spoken language.  So what is it that [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.nagarro.com/blog/wp-content/uploads/2007/09/clip-image001.jpg"><img src="http://www.nagarro.com/blog/wp-content/uploads/2007/09/clip-image001-thumb.jpg" style="border: 0px none ; margin: 0px 10px 10px 0px" alt="Bill1" align="left" border="0" width="272" height="282" /></a></p>
<p><strong>What is the purpose of a computer program?</strong></p>
<p>Your colleagues and you all write software.  You generate software prose on a daily basis, crafting these artifacts called programs, line by line.  You utilize a common language that you all agree upon, a language which bears scant resemblance to a spoken language.  So what is it that you are creating?  What is the purpose of these lines of code?</p>
<p>You might say a program elaborates how a computer is to execute an algorithm.  It describes what the system should do and how to do it.  As programmers, we are the narrators and the computer is our audience.  That&#8217;s basically what we were taught in our very first computer class.</p>
<p><span id="more-8"></span></p>
<p><a href="http://en.wikipedia.org/wiki/Donald_Knuth">Donald Knuth</a>, Professor of the Art of Computer Programming at Stanford University, challenged this idea over twenty years ago when he first proposed the idea of “literate programming.”  Knuth felt that computer programs were first and foremost works of literature, to be read and appreciated by humans more than computers.  A programmer should take the same sort of care and attention in writing a program that an essayist takes in writing prose.  He devised a special language called “WEB” which was basically a programming language that resulted in two artifacts: one compiled into the machine language of the computer and the other compiled into a document for humans.  A program listing in WEB not only read like an article, it actually looked like one because it was based partly on <a href="http://en.wikipedia.org/wiki/TeX">Tex</a>, the typesetting language Knuth developed in the 70’s for publishing technical papers.</p>
<p>This would have been a much more challenging idea in the days before open source and tools that readily made source available and searchable, like Archie and the World Wide Web.  It wasn’t as easy to find examples of source code and even book authors were reluctant to disclose real applications in all the gory detail.  Most publications relied heavily on pseudo-code when trying to present samples for human consumption.  Before object oriented programming and the subsequent wave of class libraries and frameworks, programs had to do much more.  Real programs were just too ugly and verbose to put on display.</p>
<p>Open source has heralded in a new era of visibility for software artifacts.  The authors of Linux and Apache know that it’s not enough for their APIs to work as expected.  It’s not just how the systems behave that falls under scrutiny, but the actual source code itself.  The source of the Java Class Libraries makes itself known to most java programmers on a daily basis when they click on a stack frame in the debugger.  Successful open source contributors are very self conscious about how the source code looks.  The computer may not judge their triply nested loops but other programmers certainly will.  Their audience is first and foremost other software professionals.</p>
<p>So our program is a work of literature, then what is its purpose?  The purpose of our program is not to describe for the computer what we want it to do, but to describe for the programmer what the computer will do.  If that sounds subtle, then think about this the next time you are editing code in your IDE.  Is your &#8220;audience&#8221; really the computer?  Or is it the person in the office next to you?</p>
<p>Most conscientious programmers like to think of their code as maintainable&#8211;well documented and readable&#8211;but even the best of us may be tempted by obscure or clever shortcuts when we think nobody is looking.  Focus your work on a human audience.  If you&#8217;ve ever done pair programming, you know that having someone looking over your shoulder makes you take a bit more care with what you type in.  So imagine that someone is always looking over your shoulder, or that every line is going to be subjected to a team code review, scrutinized by your peers.  Write the code not for yourself, not for the computer, but for them.  Take pride in how your program communicates its cleverness, not just in being clever.  Choose names that not only mean something but could actually be read out loud in something that sounds like English.  Comments shouldn&#8217;t be an afterthought&#8211;your disconnected scribbled notes in the sidebar.  They should be interweaved in the source, flowing with it and filling in the prose to help the reader move effortlessly through the narration of what the computer is doing.  And remember: the best writers are avid readers.</p>
<p>Those are just a few examples of how programs should play to an audience of humans and not a computer.  I&#8217;ll be covering more in upcoming installments of this column.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/the-literacy-of-programs/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Introducing Bill Kayser</title>
		<link>http://www.nagarro.com/blog/introducing-bill-kayser/</link>
		<comments>http://www.nagarro.com/blog/introducing-bill-kayser/#comments</comments>
		<pubDate>Sun, 30 Sep 2007 10:30:29 +0000</pubDate>
		<dc:creator>Manas Fuloria</dc:creator>
				<category><![CDATA[Guest Blog: Kayser]]></category>

		<guid isPermaLink="false">http://www.nagarro.com/blog/?p=112</guid>
		<description><![CDATA[Bill holds a Masters in Computer Science from Stanford University. He has more than 20 years of experience with object technology and languages including C++, Smalltalk and Java (he’s a certified Java programmer and architect). He has served as a member of Sun JCP expert groups on RMI Custom Remote References (JSR78) and EJB Performance [...]]]></description>
			<content:encoded><![CDATA[<p>Bill holds a Masters in Computer Science from Stanford University. He has more than 20 years of experience with object technology and languages including C++, Smalltalk and Java (he’s a certified Java programmer and architect). He has served as a member of Sun JCP expert groups on RMI Custom Remote References (JSR78) and EJB Performance Benchmarking (JSR131). His career spans IBM, Schlumberger (on oilfield applications), WorldStreet Corporation (on financial applications, as Chief Architect) and SupplyChainge (again as Chief Architect) At SupplyChainge, Bill interacted with Nagarro and visited Delhi as well. After SupplyChainge, Bill joined the very successful application performance management company Wily Technology, which was acquired by Computer Associates in early 2006 for a large sum. He currently works on the Wily Introscope™ product. He is also the co-founder of StepZero, LLC, a performance management consulting firm. He collaborates informally with many open source gurus including <a href="http://en.wikipedia.org/wiki/Ward_Cunningham">Ward Cunningham</a>, the father of the Wiki.</p>
<p><span id="more-112"></span></p>
<p>But you’ll seldom hear him talk about himself. He is modest to a fault, which is one of his endearing qualities.</p>
<div class="wp-caption alignleft" style="width: 311px"><img style="margin-left: 0px; margin-right: 10px; margin-top: 0px; margin-bottom: 0px;" title="Bill Kayser" src="http://www.nagarro.com/blog/wp-content/uploads/2007/09/clip-image0011.jpg" alt="Bill Kayser" width="301" height="207" /><p class="wp-caption-text">Bill Kayser</p></div>
<p>There are other interesting sides to Bill. In 1996, he took a six month sabbatical to sail as a deck hand on the tall ship <a href="http://www.tallshiprose.org/">HMS Rose</a>, scrubbing decks and rigging up sails. He plays soccer fanatically and has badly scarred knees to show for it. Plus he’s often up to something fun – one day we played a prank on his sister, calling her with exaggerated Indian accents, telling her that we were calling from Dell Service Center in Bangalore, and that she should be careful while using her computer because it “might catch fire”.</p>
<p>Bill lives in Portland, Oregon with his British wife Crista, two-year old son Felix, and Boris the cat.</p>
<p>Anyway, Bill has agreed to write a series of articles exclusively for Nagarro that talk about the philosophy of programming and architecture. The first article of the series, titled “The Literacy of Programs” will be out tomorrow. Over time, we might put new articles up on a Wiki or a blog (internal or external?) and then you can discuss the articles directly with Bill. If you have any ideas of how we should structure this Wiki/blog, or you can volunteer to set it up, please do write to me. Plus if you want to write a note to Bill at any time, you can do so at <a href="mailto:bill@kayser.org">bill@kayser.org</a>.</p>
<p>We are excited by this initiative and look forward to seeing how this will work out.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nagarro.com/blog/introducing-bill-kayser/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
