<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description></description><title>Technobabble: The official AgileHead blog</title><generator>Tumblr (3.0; @agilehead-blog)</generator><link>http://blog.agilehead.com/</link><item><title>Productivity Techniques for .Net Application Development</title><description>&lt;p&gt;In a software company, competitiveness has a linear co-relation to productivity. The huge variance in productivity at different companies let better companies run circles around slower ones. They innovate more, they are more profitable, and they get more customers.&lt;/p&gt;

&lt;p&gt;It is interesting to look at the situation in India; one of the top destinations for IT projects. I have been working here for about a decade now. Since the early days, programmer salaries have seen at least a 4-fold increase. Competent programmers in India are no longer an order of magnitude less expensive than their western counterparts. Indian IT Services companies can no longer afford to throw large teams at problems, ignoring team productivity statistics. At the same time, a modest improvement in productivity can significantly contribute to the bottom line.&lt;/p&gt;

&lt;p&gt;But indeed, productivity is a truly global challenge in software engineering. In the context of the .Net development platform, this article looks at using recent technological innovation to dramatically improve productivity in IT projects.&lt;/p&gt;

&lt;h2&gt;The Big Leap&lt;/h2&gt;
&lt;p&gt;Enterprises and IT Services companies have predominantly used Java or Microsoft platforms for building Line of Business applications. Within these two platforms, programming idioms have been more or less the same since C# was largely based on Java. While there were improvements in tooling, language capabilities and expressiveness had not changed much. Tooling can only improve productivity to an extent, before hitting the limitations of the programming language.&lt;/p&gt;

&lt;p&gt;But the main .Net languages C# and VB.Net made huge leaps over the last couple of years.. So much so that it eclipses everything done till that point. Microsoft borrowed many concepts from &lt;a href="http://en.wikipedia.org/wiki/Functional_programming"&gt;Functional Programming&lt;/a&gt; and the academia, which suddenly opened up new ways to express logic. The techniques described in this article are based on these language innovations.
&lt;/p&gt;

&lt;h2&gt;Three Pillars of productivity&lt;/h2&gt;

&lt;h3&gt;1. Declarative Programming&lt;/h3&gt;
&lt;p&gt;I will borrow Wikipedia&amp;#8217;s definition of &lt;a href="http://en.wikipedia.org/wiki/Declarative_programming"&gt;Declarative Programming&lt;/a&gt;:&lt;br/&gt;&lt;i&gt;Declarative Programming is a programming paradigm that expresses the logic of a computation without describing its control flow. Many languages applying this style attempt to minimize or eliminate side effects by &lt;strong&gt;describing what the program should accomplish, rather than describing how to go about accomplishing it&lt;/strong&gt;.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Here is an example:&lt;/p&gt;
&lt;table&gt;&lt;tr&gt;&lt;td style="width:380px"&gt;
&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
&lt;h4 style="font-size:13px; font-weight:bold; padding-left: 8px"&gt;Example 1: Imperative (typical)&lt;/h4&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; collection = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;gt; { 1, 2, 3, 4 };&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; oddNumbers = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;gt;();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; num &lt;span style="color: blue;"&gt;in&lt;/span&gt; collection)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;if&lt;/span&gt; (num % 2&amp;#160;!= 0)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        oddNumbers.Add(num);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style="width:380px; padding-left: 20px"&gt;
&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
&lt;h4 style="font-size:13px; font-weight:bold; padding-left: 8px"&gt;Example 2: Declarative&lt;/h4&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; collection = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;gt; { 1, 2, 3, 4 };&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; oddNumbers = collection&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    .Where(num =&amp;gt; num % 2&amp;#160;!= 0);&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;In Example 1 (left), the task of finding odd numbers is accomplished by looping through the collection and adding matching entries to another list. But Example 2 simply defines what an odd number is. That is, it should not be divisible by two!&lt;/p&gt;

&lt;p&gt;The difference is very fundamental. When applied to a business function, an imperative approach specifies how to execute the business function while a declarative approach merely defines the business function.&lt;/p&gt;

&lt;p&gt;Consider some real business logic, written in &lt;strong&gt;imperative style:&lt;/strong&gt;&lt;/p&gt;

&lt;div&gt;
&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;//Get Customers who deposited money in 2010;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; GetCustomers_With_RecentDeposits()&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;var&lt;/span&gt; customers = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt;();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;var&lt;/span&gt; conn = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SqlConnection&lt;/span&gt;(CONN_STR);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;var&lt;/span&gt; cmd = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SqlCommand&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;&amp;#8220;SELECT * FROM Customers C JOIN Deposits D ON &amp;#8220;&lt;/span&gt; +&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        &lt;span style="color: #a31515;"&gt;&amp;#8220;D.CustomerId = C.Id WHERE D.Year = 2010&amp;#8221;&lt;/span&gt;, conn);&lt;/p&gt;

&lt;p style="margin: 0px;"&gt;    &lt;span style="color: green;"&gt;//Lengthy code to retrieve the dataset and create customers omitted.&lt;/span&gt;&lt;/p&gt;

&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;return&lt;/span&gt; customers;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;

&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;//Get Indians who deposited money in 2010;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; GetIndianCustomers_With_RecentDeposits()&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;var&lt;/span&gt; customers = GetCustomers_With_RecentDeposits();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;var&lt;/span&gt; indians = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt;();&lt;/p&gt;

&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; cust &lt;span style="color: blue;"&gt;in&lt;/span&gt; customers)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;if&lt;/span&gt; (cust.Country == &lt;span style="color: #a31515;"&gt;&amp;#8220;India&amp;#8221;&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            indians.Add(cust);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;return&lt;/span&gt; indians;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Here is the same example, written in a &lt;strong&gt;declarative manner&lt;/strong&gt; using LINQ&lt;/p&gt;

&lt;div id="#linqDeposit"&gt;
&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;//Get Customers who deposited money in 2010;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; GetCustomers_With_RecentDeposits()&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;var&lt;/span&gt; customers = &lt;span style="color: blue;"&gt;from&lt;/span&gt; customer &lt;span style="color: blue;"&gt;in&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Db&lt;/span&gt;.Customers()&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;                    &lt;span style="color: blue;"&gt;where&lt;/span&gt; customer.Deposits.Any(d =&amp;gt; d.Year == 2010)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;                    &lt;span style="color: blue;"&gt;select&lt;/span&gt; customer;&lt;/p&gt;

&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;return&lt;/span&gt; customers.ToList();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;

&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;//Get Indians who deposited money in 2010;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; GetIndianCustomers_With_RecentDeposits()&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;return&lt;/span&gt; GetCustomers_With_RecentDeposits()&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        .Where(customer =&amp;gt; customer.Country == &lt;span style="color: #a31515;"&gt;&amp;#8220;India&amp;#8221;&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;With the declarative approach, we simply specified what we wanted and left it to the runtime and compiler to decide how to go about doing it.&lt;/p&gt;

&lt;h3&gt;2. Type-safe, Verifiable Code&lt;/h3&gt;

&lt;p&gt;One of the biggest benefits of using a LINQ query as in the &lt;a href="#linqDeposit"&gt;example above&lt;/a&gt; is that they can be verified for correctness at compile time. The LINQ query is a data structure built using the types referenced in the query and can be checked for type-safety. As a result, if a field name or data type was incorrectly specified in the query the compiler would immediately complain and report the mismatch. In contrast, if the SQL string in the imperative approach referred to an incorrect column name or an invalid relationship, the error is only detected when the application is run.&lt;/p&gt;

&lt;p&gt;
Of course, Type-Safety is not just about queries. All code should be type safe; strings should only be used to in Resource files or in messages displayed to the user.
&lt;/p&gt;

&lt;p&gt;Here are more examples:&lt;/p&gt;
&lt;div&gt;
&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;//Avoid the dictionary, use a strongly typed view&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;ViewData[&lt;span style="color: #a31515;"&gt;&amp;#8220;Username&amp;#8221;&lt;/span&gt;] = &lt;span style="color: #a31515;"&gt;&amp;#8220;jeswin&amp;#8221;&lt;/span&gt;;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;//Strings used for column names!.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;customer.FirstName = (&lt;span style="color: blue;"&gt;string&lt;/span&gt;)reader[&lt;span style="color: #a31515;"&gt;&amp;#8220;FirstName&amp;#8221;&lt;/span&gt;];&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;customer.LastName = (&lt;span style="color: blue;"&gt;string&lt;/span&gt;)reader[&lt;span style="color: #a31515;"&gt;&amp;#8220;LastName&amp;#8221;&lt;/span&gt;];&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;customer.Age = (&lt;span style="color: blue;"&gt;int&lt;/span&gt;)reader[&lt;span style="color: #a31515;"&gt;&amp;#8220;Age&amp;#8221;&lt;/span&gt;];&lt;/p&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Being able to identify bugs at compile time makes a huge difference in productivity. With such code, the programmer is able to change code without worrying about its impact on other parts of the application.&lt;/p&gt;

&lt;p&gt;
In addition to this, making code analyzable by the compiler through strong typing allows for easier refactoring. For example, renaming a Field in an Entity (used in LINQ queries) is as easy as right-clicking and selecting &amp;#8216;Rename&amp;#8217;. The IDE will automatically change all LINQ queries to use the new Field name.&lt;/p&gt;

&lt;h3&gt;3. Composable Business Logic&lt;/h3&gt;
&lt;p&gt;One of the biggest advantages of LINQ is that it makes queries &amp;#8216;composable&amp;#8217;. In other words, simpler queries and business logic can be combined to form more complex queries.&lt;/p&gt;

&lt;p&gt;This is better explained with an example. Assume we are writing and banking application and there is a function called GetHighNetWorthCustomers() which lists people with a large account balance. Say we want to find high net worth customers who also have a PREMIUM plan.&lt;/p&gt;

&lt;p&gt;
If we are not using LINQ for data access, we would probably have two Stored Procedures or SQL Statements which fetch this data from the database. An oversimplified version of this might look like:&lt;br/&gt;
High Net-Worth: &lt;span style="color:Blue"&gt;SELECT * from Customers WHERE Spending &amp;gt; 100,000&lt;/span&gt;&lt;br/&gt;
High Net-Worth and PREMIUM: &lt;span style="color:Blue"&gt;SELECT * from Customers WHERE AccountType = &amp;#8216;PREMIUM&amp;#8217; AND Spending &amp;gt; 100,000&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;

&lt;p&gt;
As we see, SQL doesn&amp;#8217;t yield to easy re-use. They sit in isolated form, each confined to a separate function. Not re-usable, Not &amp;#8216;composable&amp;#8217;.
&lt;/p&gt;

&lt;div&gt;
By using LINQ for Data Access, such logic can be made composable:
&lt;br/&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; GetHighNetWorthCustomers() {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Db&lt;/span&gt;.Customers().Where(customer =&amp;gt; customer.Balance &amp;gt; 1000000);  &lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;

&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;//High Net-Worth customers with a PREMIUM Plan&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; GetRichPremiumCustomers() {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;return&lt;/span&gt; GetHighNetWorthCustomers().Where(customer =&amp;gt; customer.AccountType == &lt;span style="color: #a31515;"&gt;&amp;#8220;PREMIUM&amp;#8221;&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;
It was straight forward to re-use the existing query which fetched High Net-Worth customers. In a large application, such composability will dramatically improve productivity. Also, in line with the techniques discussed earlier it is expressed declaratively, and is type-safe and verifiable. Not to mention, a lot more concise.&lt;/p&gt;

&lt;div&gt;Finally, here is how to get Rich Indians:
&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; richIndians = GetRichPremiumCustomers().Where(customer =&amp;gt; customer.Country == &lt;span style="color: #a31515;"&gt;&amp;#8220;India&amp;#8221;&lt;/span&gt;);&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;h4&gt;Composability techniques with Extension Methods&lt;/h4&gt;

&lt;p&gt;
There are people who prefer to use extension methods to compose functions. This provides for slightly more concise code. Whether to use this or not is a matter of taste.
&lt;/p&gt;

&lt;div&gt;
&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CustomerModule&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; HighNetWorth(&lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; customers) {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;return&lt;/span&gt; customers.Where(customer =&amp;gt; customer.Balance &amp;gt; 1000000);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    }&lt;/p&gt;

&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; Premium(&lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; customers) {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;return&lt;/span&gt; customers.Where(customer =&amp;gt; customer.AccountType == &lt;span style="color: #a31515;"&gt;&amp;#8220;PREMIUM&amp;#8221;&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    }&lt;/p&gt;

&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; Indians(&lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; customers) {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;return&lt;/span&gt; customers.Where(customer =&amp;gt; customer.Country == &lt;span style="color: #a31515;"&gt;&amp;#8220;India&amp;#8221;&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;This allows us to combine these functions in a very elegant manner:&lt;/p&gt;

&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;
&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; richIndians = &lt;span style="color: #2b91af;"&gt;Db&lt;/span&gt;.Customers().HighNetWorth().Premium().Indians();&lt;/p&gt;
&lt;/div&gt;

&lt;h3&gt;Refactor-ability&lt;/h3&gt;

&lt;p&gt;A few months or a few sprints into a project, teams are generally hesitant to fix less optimal code written earlier in the project for fear of introducing bugs and having to re-test the entire application. This should not happen; inefficiencies and bugs multiply exponentially as more code is written on top of the problematic parts.&lt;/p&gt;

&lt;p&gt;The reluctance on the part of developers to fix problems can only be avoided if the cost of making changes are manageable. For example, half way through a project splitting the &amp;#8220;CustomerName&amp;#8221; column in Customers table into &amp;#8220;FirstName&amp;#8221; and &amp;#8220;LastName&amp;#8221; is many hours of work since the entire application might have to be retested. With the new approaches we discussed, this is likely to be 30 minutes of work. It is important to keep your codebase Refactoring-friendly and Agile.&lt;/p&gt;

&lt;h3&gt;Last words&lt;/h3&gt;

&lt;p&gt;My company provides architectural and technical consulting services to various IT Services companies in India. Our first-hand experience with a variety of projects in these companies tells us that a significant number of problems faced by teams can be eliminated by using the methods discussed in this article. In our opinion, recent changes to .Net languages represent the most significant mainstream language innovation since the advent of object oriented programming many years ago. The question is how quickly companies will adapt and adopt them.&lt;/p&gt;

&lt;p&gt;Especially for IT Services companies in India, the future is moving away from offering lower cost talent to high quality engineering expertise.&lt;/p&gt;

&lt;p&gt;Jeswin Kumar&lt;br/&gt;
AgileHead&lt;/p&gt;

&lt;p style="padding:8px; background:#FFC; border:1px solid #FC9"&gt;AgileHead offers architectural consulting services and training to IT companies in India. You can email us at &lt;a href="mailto:services@agilehead.com"&gt;services@agilehead.com&lt;/a&gt;.&lt;/p&gt; &lt;/div&gt;</description><link>http://blog.agilehead.com/post/1391031154</link><guid>http://blog.agilehead.com/post/1391031154</guid><pubDate>Sun, 24 Oct 2010 13:53:00 -0400</pubDate></item><item><title>AgileHead launches new Training Courses (.Net Platform)</title><description>&lt;p&gt;We happy to announce our corporate training program for IT Services companies based in India. We will have four tracks available at launch, targeting Technical Leads and Architects working on the .Net Platform.&lt;/p&gt;
&lt;h2&gt;T1: Rapid Development with Asp.Net MVC &amp;amp; Entity Framework&lt;/h2&gt;
&lt;p&gt;Level: Intermediate-Advanced         &lt;br/&gt; Duration: 16 Hours&lt;/p&gt;
&lt;p&gt;This two day session targets Intermediate-Advanced level programmers, and focuses         on rapidly developing Web Applications using Asp.Net MVC.&lt;/p&gt;
&lt;h3&gt;Day 1: (8 hours)&lt;/h3&gt;
&lt;ol&gt;&lt;li&gt;Introduction to Asp.Net MVC&lt;/li&gt;
&lt;li&gt;N-Tier Applications&lt;/li&gt;
&lt;li&gt;Project Structure and Code Layout&lt;/li&gt;
&lt;li&gt;Designing the Business Logic Layer                  
&lt;ul&gt;&lt;li&gt;Entity Modeling&lt;/li&gt;
&lt;li&gt;Data Access Techniques&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;View and Controllers&lt;/li&gt;
&lt;li&gt;Introduction to ADO.NET Entity Framework (optional: LINQ to SQL)&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;Day 2: (8 hours)&lt;/h3&gt;
&lt;ol&gt;&lt;li&gt;Writing Semantic Code                  
&lt;ul&gt;&lt;li&gt;Optimal use of LINQ&lt;/li&gt;
&lt;li&gt;Fluent Interfaces&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Using jQuery&lt;/li&gt;
&lt;li&gt;Security Best Practices&lt;/li&gt;
&lt;li&gt;Web Services and REST-ful services&lt;/li&gt;
&lt;li&gt;Unit Testing with Asp.Net MVC&lt;/li&gt;
&lt;li&gt;Improving Code Quality                  
&lt;ul&gt;&lt;li&gt;Writing Verifiable Code&lt;/li&gt;
&lt;li&gt;Automation of Error Checking&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Deployment Scenarios&lt;/li&gt;
&lt;li&gt;Scalability and Performance&lt;/li&gt;
&lt;li&gt;Introduction to Windows Azure Cloud &lt;/li&gt;
&lt;li&gt;Examples&lt;/li&gt;
&lt;/ol&gt;&lt;h2&gt;T2: Advanced Entity Framework and LINQ to SQL&lt;/h2&gt;
&lt;p&gt;Level: Intermediate-Advanced&lt;br/&gt; Duration: 16 Hours&lt;/p&gt;
&lt;p&gt;This two day session targets Intermediate-Advanced level programmers, and focuses         on mastering ADO.Net Entity Framework with real world applications. This course         can be customized for specific scenarios and projects.&lt;/p&gt;
&lt;h3&gt;Day 1: (8 hours)&lt;/h3&gt;
&lt;ol&gt;&lt;li&gt;Introduction to LINQ&lt;/li&gt;
&lt;li&gt;Advantages of LINQ over conventional techniques&lt;/li&gt;
&lt;li&gt;LINQ to SQL&lt;/li&gt;
&lt;li&gt;ADO.NET Entity Framework v4&lt;/li&gt;
&lt;li&gt;N-Tier Applications&lt;/li&gt;
&lt;li&gt;Entity Modeling with the Entity Designer&lt;/li&gt;
&lt;li&gt;Model First Approach&lt;/li&gt;
&lt;li&gt;Using POCO and Templating&lt;/li&gt;
&lt;li&gt;Entity Framework Internals&lt;/li&gt;
&lt;li&gt;Debugging and Optimizing Queries&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;Day 2: (8 hours)&lt;/h3&gt;
&lt;ol&gt;&lt;li&gt;Using Stored Procedures&lt;/li&gt;
&lt;li&gt;Performance and Scalability Considerations&lt;/li&gt;
&lt;li&gt;Building a Web App with Asp.Net MVC&lt;/li&gt;
&lt;li&gt;Building WCF Services&lt;/li&gt;
&lt;li&gt;Improving Code Quality                  
&lt;ul&gt;&lt;li&gt;Writing Verifiable Code&lt;/li&gt;
&lt;li&gt;Automation of Error Checking&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Writing Unit Tests&lt;/li&gt;
&lt;li&gt;Migrating applications to use Entity Framework&lt;/li&gt;
&lt;li&gt;Examples&lt;/li&gt;
&lt;/ol&gt;&lt;h2&gt;T3: Windows Azure Cloud Platform&lt;/h2&gt;
&lt;p&gt;Level: Intermediate-Advanced&lt;br/&gt; Duration: 16 Hours&lt;/p&gt;
&lt;p&gt;This two day session introduces developers to the Windows Azure cloud platform.         It takes them through an overview of fundamental concepts and then into developing         and deploying applications on Microsoft Windows Azure.&lt;/p&gt;
&lt;h3&gt;Day 1: (8 hours)&lt;/h3&gt;
&lt;ol&gt;&lt;li&gt;Introduction to Cloud Platforms&lt;/li&gt;
&lt;li&gt;Virtualization Concepts&lt;/li&gt;
&lt;li&gt;Platform as a Service (PaaS)&lt;/li&gt;
&lt;li&gt;Windows Azure Fundamentals&lt;/li&gt;
&lt;li&gt;Comparison with Amazon AWS, Google App Engine&lt;/li&gt;
&lt;li&gt;Developing .Net Applications for Windows Azure&lt;/li&gt;
&lt;li&gt;Testing Cloud Applications&lt;/li&gt;
&lt;li&gt;Deploying a Simple Asp.Net MVC Web Application&lt;/li&gt;
&lt;li&gt;Entity Modeling with Entity Framework or LINQ to SQL&lt;/li&gt;
&lt;li&gt;SQL Azure&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;Day 2: (8 hours)&lt;/h3&gt;
&lt;ol&gt;&lt;li&gt;Developing a full-fledged Business Application&lt;/li&gt;
&lt;li&gt;Windows Azure Storage Services                  
&lt;ul&gt;&lt;li&gt;Blob Service&lt;/li&gt;
&lt;li&gt;Queue Service&lt;/li&gt;
&lt;li&gt;Table Service&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Enhanced Scalability with Non-Relational Databases&lt;/li&gt;
&lt;li&gt;Deploying and Managing Windows Azure Applications&lt;/li&gt;
&lt;li&gt;Application Security&lt;/li&gt;
&lt;li&gt;Scalability and Performance Considerations&lt;/li&gt;
&lt;li&gt;Windows Azure Billing and Pricing Models&lt;/li&gt;
&lt;li&gt;Examples&lt;/li&gt;
&lt;/ol&gt;&lt;h2&gt;T4: Improving productivity with better engineering (for .Net Technical Architects)&lt;/h2&gt;
&lt;p&gt;Level: Advanced&lt;br/&gt; Duration: 8 Hours&lt;/p&gt;
&lt;p&gt;This one day session targets Architects and discusses various techniques for improving         productivity and code quality within their teams.&lt;/p&gt;
&lt;h3&gt;Day 1:&lt;/h3&gt;
&lt;ol&gt;&lt;li&gt;Typical Problems faced by Teams&lt;/li&gt;
&lt;li&gt;Agile Processes and Agile Code&lt;/li&gt;
&lt;li&gt;DRY (Don’t Repeat Yourself) Principles&lt;/li&gt;
&lt;li&gt;Convention over Configuration&lt;/li&gt;
&lt;li&gt;Declarative and Functional Programming&lt;/li&gt;
&lt;li&gt;Object Oriented Design Principles&lt;/li&gt;
&lt;li&gt;Composable Business Logic     
&lt;ul&gt;&lt;li&gt;Fluent Interfaces&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Writing Statically Verifiable Code&lt;/li&gt;
&lt;li&gt;Avoiding over-engineering     
&lt;ul&gt;&lt;li&gt;Knowing Computational Complexity and I/O Costs&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Semantic HTML and CSS&lt;/li&gt;
&lt;li&gt;Advanced Javascript&lt;/li&gt;
&lt;li&gt;Designing for Continuous Refactoring&lt;/li&gt;
&lt;li&gt;Automated Testing     
&lt;ul&gt;&lt;li&gt;via Setup Scripts&lt;/li&gt;
&lt;li&gt;Unit Test Frameworks&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Continuous Integration&lt;/li&gt;
&lt;li&gt;Conventions for Modern Database Design&lt;/li&gt;
&lt;li&gt;Examples&lt;/li&gt;
&lt;/ol&gt;</description><link>http://blog.agilehead.com/post/1255630022</link><guid>http://blog.agilehead.com/post/1255630022</guid><pubDate>Wed, 06 Oct 2010 09:28:00 -0400</pubDate></item><item><title>From C# on Mono, to Clojure on the JVM</title><description>&lt;p&gt;Last week, we had to take a decision  that reminded us of a similar situation we faced three years back. On  which platform and language will we develop back-end services?&lt;/p&gt;
&lt;h3&gt;Going with Mono, in 2006&lt;/h3&gt;
&lt;p&gt;In early 2006, we were working on a  fairly large Social Networking project which included building a few  long running processes. We decided to build these in the popular, but  not yet widely deployed platform called Mono. Two factors tilted the  decision in favor of Mono, the most important being that we were  building the application on Linux, and the second being that we had  decided to use a mainstream object-oriented, statically-typed language  for building these components. That leaves us with Java and C#; while  Java was left in the quagmire of community-driven, slow design process,  C# was getting increasingly productive leaving Java behind in terms of  expressiveness. By 2006, Mono had an excellent C# compiler, an efficient  runtime, and good coverage of the .Net Base Class Libraries.&lt;/p&gt;
&lt;p&gt;Though the project eventually failed due  to non-technical reasons, Mono itself served us well for 3 years. Over  that period, Mono improved by leaps and bounds. Compatibility is great  with Net 2.0 libraries being almost entirely supported, compilers are  exceptional, MonoDevelop 2.0 has become a capable IDE, and performance  is comparable to Microsoft .Net itself. In specific benchmarks, the Mono  runtime even bests the official  .Net runtime. Often, the mono compiler  supports upcoming C# features ahead of the official Microsoft release.&lt;/p&gt;
&lt;p&gt;We could say that the “Mono Project” has  done well over the years. I actually admire the Mono Team; they have  faced unnecessary criticism within the Open Source community, often by  people who knew little about the project. That did not stop them from  building a great product.&lt;/p&gt;
&lt;p&gt;However, my confidence in Mono has been waning for some time.&lt;/p&gt;
&lt;h3&gt;In the Shadows of .Net&lt;/h3&gt;
&lt;p&gt;Back in 2006, we put our trust in Mono  because we refused, or perhaps disliked, to vilify a project solely  because it emulated something created at Microsoft. While Open Source  backers generally dislike Microsoft technology, with Mono they had  another argument that being a clone it could be affected by a number of  patents that Microsoft holds related to the .Net framework. This point  often comes up in debates about the “safety” of the Mono project, the  defense of Mono being that large parts of the .Net specification are an  open, published ECMA standard. I sided with the Mono supporters then,  downplaying the risk of patents from Microsoft. But then in November,  Microsoft and Novell announced their &lt;a href="http://en.wikipedia.org/wiki/Novell#Agreement_with_Microsoft"&gt;Patent Agreement&lt;/a&gt;,  which guarantees patent protection exclusively for users of Novell  Linux. The Mono project is largely supported by Novell, and such an  agreement is disastrous for a community project like Mono. At this  point, the fence-sitters in the Open Source community largely crossed  over to the anti-Mono camp. Perhaps, they were justified in doing so. I  could no longer defend Mono, and my belief in the framework getting  wider acceptance has diminished significantly since then.&lt;/p&gt;
&lt;p&gt;One might wonder why acceptance or  ideological reasons should affect the platform we choose to build a  product on. It just needs to work well, right? It is not that easy.  Today my company works with customers on Microsoft and non-Microsoft  platforms. We have skills on Microsoft and Open Source technologies, and  while consulting or providing services to our customers we choose the  right tool for the job irrespective of our ideological leaning. But when  building our own products, we  are convinced about the advantages of  Open Source. And as a company, we see Open Source as a principle and  ideology – not just for its commercial benefit. Building a new product  requires a lot of sacrifice, stamina, coffee and redbull. And you will  only build it on a technology you believe in.&lt;/p&gt;
&lt;p&gt;There are other minor issues that make  Mono a stranger in Open Source land. Mono uses very Windows specific  conventions, like “.exe” for executables and “.dll” for libraries. For  non-windows users some of these conventions look odd. Again, this is not  Mono’s fault; rather a consequence of emulating a platform designed for  a very different Operating System.&lt;/p&gt;
&lt;p&gt;It is entirely possible that Mono can  suddenly gain acceptance if Microsoft decides to relinquish patent  claims regarding the .Net framework. If it happens, .Net and Mono could  well become an powerful challenger to the dominance of Java. This is  very unlikely, Microsoft’s current strategy seems to be relying strongly  on patents and IP to ward off the looming threat from Linux.&lt;/p&gt;
&lt;p&gt;For now, we decided to look beyond Mono and C#.&lt;/p&gt;
&lt;h3&gt;What about Python?&lt;/h3&gt;
&lt;p&gt;In the last two years, I have mostly  used Python with Django for web development. It is easy to learn and to  apply. Documentation is plentiful, and there are libraries for getting  most things done. While Python is  easy and practical, there was nothing  quite remarkable about it. I felt Python’s strengths were not a  consequence of well thought-out language design; instead it was the  flexibility inherent in the dynamic nature of the language.&lt;/p&gt;
&lt;p&gt;The language itself seems to be going  backwards. I do not deny that I have an affection for functional-style  programming, but its relevance cannot be overlooked anymore. In a  variety of situations, Functional Programming (FP) is more concise, and  it is also more suited for the dawning Parallel Programming era. For  this reason alone, languages like C# are incorporating functional  concepts in future versions. But not Guido;  Python’s benevolent  dictator has a well known dislike for functional style programming.  Guido deserves credit for creating a very popular programming language,  but you wonder if he is paying attention to the evolution of  contemporary programming languages.&lt;/p&gt;
&lt;p&gt;Some people say that Python’s legacy  will be like that of Visual Basic; if it ever gets that popular. I doubt  whether it will be as popular as “VeeBee”, but I don’t disagree. There  are more capable languages out there. If we ever accomplish  interoperability across dynamic languages, I predict that Python would  have a bleak future. Why aren’t the &lt;a href="http://www.parrot.org/"&gt;Parrots&lt;/a&gt; speaking, yet?&lt;/p&gt;
&lt;h3&gt;The JVM&lt;/h3&gt;
&lt;p&gt;Java is the most common language for  building applications today; due to its maturity, multi-platform  support, proven reliability and the huge-huge ecosystem built around it.  But Java itself is a really sucky language. It is boring to write code  in Java, and even simple tasks tend to be very lengthy. Steve Yegge’s ‘&lt;a href="http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html"&gt;Kingdom of Nouns&lt;/a&gt;‘ captures this verbosity in a humorous style.&lt;/p&gt;
&lt;p&gt;The JVM is however, quite an interesting  platform.  While originally designed for the Java language, it is now  the target of many new languages. Some of these languages have been  around for some time now and have gained some momentum, like Scala,  JRuby, Groovy and Clojure. Groovy has not caught on as much as the  others; so it fails my “excellent community” criteria. JRuby’s biggest  problem is Ruby itself; rockstars are unlikely to use the JVM.&lt;/p&gt;
&lt;p&gt;But Scala is impressive; has great  interop with Java, has a growing community around it,  and recently  acquired a really high-profile user – Twitter. If you have been  programming in Java or C#, Scala is a wonderful alternative. For Java  developers, Scala offers a leap in productivity and the ability to call  and get called by Java code. If you are on the Microsoft stack and hate  the JVM because you hate Java, Scala offers the expressiveness that was  recently introduced into C#.&lt;/p&gt;
&lt;p&gt;But I knew Scala wasn’t what I was  looking for. I actually knew what I wanted; I wanted a language with few  syntactic rules and constructs. I wanted to move to a language I do not  have to discard any time soon.  I wanted something like the ‘&lt;a href="http://www.google.com/search?q=Hundred+Year+Language"&gt;Hundred Year Language&lt;/a&gt;‘.&lt;/p&gt;
&lt;h3&gt;LISP will win, eventually&lt;/h3&gt;
&lt;p&gt;LISP is a bit like our company’s motto: &lt;em&gt;“Simplicity is the ultimate sophistication.”&lt;/em&gt; – originally by Leonardo DaVinci. The language itself is so simple that  you could learn the semantics in less time than it takes to read this  article. This simplicity is achieved by abstracting ideas in programming  languages to the extreme; yielding a simple form which is infinitely  extensible. This extensibility comes from the ability to treat a program  as data, and manipulate the program itself, using a feature called  Macros.&lt;/p&gt;
&lt;p&gt;While the syntax of LISP is very simple  and elegant, writing a typical business or web application in LISP is  (or was) much harder; perhaps an order of magnitude harder. This is  especially true for newbies; unless they are really determined it is  difficult to find documentation and useful libraries. This happened to  me as well. I had read many books on LISP, but I did not have the  confidence to execute a real project in LISP. It has been done before by  so many others, but there is a big challenge in transitioning from a  theoretical understanding of LISP and getting it to work in practice.&lt;/p&gt;
&lt;p&gt;Although I was unable to use LISP in any  production code, what I learnt from LISP profoundly impacted the way I  saw programming. And since then, I have been keeping a close watch on  upcoming languages bearing any resemblance to LISP. One such language  was &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Clojure, the acceptable LISP&lt;/h3&gt;
&lt;p&gt;Clojure is a dialect of LISP and a  dynamic programming language, running on the JVM.   It has all the  benefits of LISP, including the powerful macro system. It also has  useful features which help with parallel programming; like Software  Transactional Memory for dealing with shared state without worries.  Clojure makes some of LISP’s biggest problems go away. Lack of Libraries  and other supporting infrastructure like Application Servers. Java has  libraries for everything, from connecting to SAP to talking to Twitter.  And you could deploy on robust servers like Tomcat.&lt;/p&gt;
&lt;p&gt;Everything ever built for Java can be used with Clojure.&lt;/p&gt;
&lt;p&gt;Clojure is very young, and like any new  programming language you would encounter minor inconsistencies and bugs.  But it is stable enough to get work done. There is an active and  rapidly growing community around the language now, contributing useful  modules and supporting new users. Clojure is like a breath of fresh air.&lt;/p&gt;
&lt;p&gt;We are excited about building our  new product on Clojure. Such unconventional choices are only possible  when you are building your own product; but hey, that’s one good reason  to do one. Enthusiasm is  vital ingredient in building products; they  sprout from a variety of reasons. Like usefulness, financial rewards,  challenges, technology, ..and programming languages like Clojure.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Jeswin P Kumar&lt;br/&gt; (jeswinpk@agilehead.com)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;These comments were imported into Tumblr from the original post.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;ol class="commentlist"&gt;&lt;li class="alt" id="comment-1"&gt;&lt;span&gt; &lt;/span&gt;&lt;a href="http://uglylispcode.wordpress.com/"&gt;Joseph Gutierrez&lt;/a&gt;  said at                 10:23 AM on June 13, 2009&amp;#160;:
&lt;p&gt;What IDE do you plan on using?&lt;/p&gt;
&lt;/li&gt;
&lt;li class="alt" id="comment-2"&gt;&lt;span&gt; &lt;/span&gt; &lt;a href="http://www.agilehead.com/"&gt;jeswinpk&lt;/a&gt;  said at                 11:31 AM on June 13, 2009&amp;#160;:
&lt;p&gt;&lt;a href="http://enclojure.org/"&gt;enclojure&lt;/a&gt; looks more friendly to me, but perhaps that’s only because I am not so familiar with emacs.&lt;/p&gt;
&lt;/li&gt;
&lt;li class="alt" id="comment-3"&gt;&lt;span&gt; &lt;/span&gt; &lt;a href="http://website/"&gt;KL&lt;/a&gt;  said at                 1:04 PM on June 13, 2009&amp;#160;:
&lt;p&gt;enclosure looks very cool.&lt;/p&gt;
&lt;p&gt;For those people who really like Eclipse, there is the clojure feature &lt;a href="http://code.google.com/p/clojure-dev/"&gt;clojure-dev&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also,  you might consider looking at the &amp;#8220;D&amp;#8221; language for applications that  will need to connect to native C/C++ libraries, e.g. desktop apps. Where  Clojure feels like &amp;#8220;Lisp done right&amp;#8221;, D is &amp;#8220;C++ done right&amp;#8221;.&lt;/p&gt;
&lt;/li&gt;
&lt;li class="alt" id="comment-4"&gt;&lt;span&gt; &lt;/span&gt; &lt;a href="http://tonylara.net/"&gt;Tony&lt;/a&gt;  said at                 1:26 PM on June 13, 2009&amp;#160;:
&lt;p&gt;Hi Jeswin, Clojure and Scala are really nice languages  for sure but fall way behind Groovy in terms of industry take up. In a  recent survey in Germany, 30% of Java shops are now using Groovy. If you  add up use of Scala, JRuby, Jython and Clojure they are in use in only  about 10% of Java shops combined. I haven&amp;#8217;t done the numbers but I think  it is about the same here in Australia. Language choice is a very  subjective thing, so I encourage people to choose what they prefer -  just providing you with some feedback on your perceptions of the Groovy  community. Cheers, Paul.&lt;/p&gt;
&lt;/li&gt;
&lt;li class="alt" id="comment-5"&gt;&lt;span&gt; &lt;/span&gt; &lt;a href="http://website/"&gt;Paul King&lt;/a&gt;  said at                 4:30 PM on June 13, 2009&amp;#160;:
&lt;p&gt;Hi Jeswin, Clojure and Scala are really nice languages  for sure but fall way behind Groovy in terms of industry take up. In a  recent survey in Germany, 30% of Java shops are now using Groovy. If you  add up use of Scala, JRuby, Jython and Clojure they are in use in only  about 10% of Java shops combined. I haven?t done the numbers but I think  it is about the same here in Australia. Language choice is a very  subjective thing, so I encourage people to choose what they prefer -  just providing you with some feedback on your perceptions of the Groovy  community. Cheers, Paul.&lt;/p&gt;
&lt;/li&gt;
&lt;li class="alt" id="comment-6"&gt;&lt;span&gt; &lt;/span&gt; &lt;a href="http://website/"&gt;jjames&lt;/a&gt;  said at                 6:38 PM on June 13, 2009&amp;#160;:
&lt;p&gt;Lots of smart hackers are already using Clojure.&lt;/p&gt;
&lt;/li&gt;
&lt;li class="alt" id="comment-7"&gt;&lt;span&gt; &lt;/span&gt; &lt;a href="http://website/"&gt;Steve Kos&lt;/a&gt;  said at                 7:40 PM on June 13, 2009&amp;#160;:
&lt;p&gt;I&amp;#8217;m puzzled.&lt;/p&gt;
&lt;p&gt;A few years ago, you took a risky bet and decided to base your company on an obscure and potentially dangerous technology.&lt;/p&gt;
&lt;p&gt;That project failed for exactly the reasons you suspected when you made that decision.&lt;/p&gt;
&lt;p&gt;And now you want to make the same mistake by basing your company on yet another bleeding edge technology?&lt;/p&gt;
&lt;p&gt;If seems to me you are more interested in experimenting with fun software stuff than building a sound business.&lt;/p&gt;
&lt;p&gt;As  for the hundred year language, I?m betting that C# or Java is probably  in a better position to achieve that goal than any of the other  languages you listed in this post.&lt;/p&gt;
&lt;p&gt;Good luck, though, I admire your bravado :-)&lt;/p&gt;
&lt;/li&gt;
&lt;li class="alt" id="comment-8"&gt;&lt;span&gt; &lt;/span&gt; &lt;a href="http://www.agilehead.com/"&gt;jeswinpk&lt;/a&gt;  said at                 8:17 PM on June 13, 2009&amp;#160;:
&lt;p&gt;@Steve&lt;/p&gt;
&lt;p&gt;Just like most other failures, ours had  little to do with our choice of technology. I was suggesting that the  choice of technology is a small company (or a small group of  programmers), serves to drum up interest and enthusiasm.&lt;/p&gt;
&lt;p&gt;As long  as the interface remains the same and the app is fast, I don&amp;#8217;t think  users will care. And as I was saying, those Mono services never needed  restarts&amp;#160;? so Mono really served us well as far as the technology is  concerned.&lt;/p&gt;
&lt;/li&gt;
&lt;li class="alt" id="comment-9"&gt;&lt;span&gt; &lt;/span&gt; &lt;a href="http://website/"&gt;Jacques Chester&lt;/a&gt;  said at                 11:10 PM on June 13, 2009&amp;#160;:
&lt;p&gt;Nitpick:&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s generally referred to as &amp;#8220;Lisp&amp;#8221;, not &amp;#8220;LISP&amp;#8221;.&lt;/p&gt;
&lt;/li&gt;
&lt;li class="alt" id="comment-10"&gt;&lt;span&gt; &lt;/span&gt; &lt;a href="http://website/"&gt;mark&lt;/a&gt;  said at                 7:09 AM on June 14, 2009&amp;#160;:
&lt;p&gt;Cobol will be the 100 year language first, it&amp;#8217;s already 50&amp;#8230;.&lt;/p&gt;
&lt;p&gt;:D&lt;/p&gt;
&lt;/li&gt;
&lt;li class="alt" id="comment-11"&gt;&lt;span&gt; &lt;/span&gt; &lt;a href="http://website/"&gt;Thomas&lt;/a&gt;  said at                 10:35 PM on June 14, 2009&amp;#160;:
&lt;p&gt;Strictly speaking, both Fortran and Lisp are older then Cobol&amp;#8230;.&lt;/p&gt;
&lt;/li&gt;
&lt;li class="alt" id="comment-12"&gt;&lt;span&gt; &lt;/span&gt; &lt;a href="http://blog.webunusual.com/"&gt;Amr&lt;/a&gt;  said at                 5:18 AM on June 15, 2009&amp;#160;:
&lt;p&gt;you can still stick with Mono though. &lt;a href="http://boo.codehaus.org/"&gt;Boo&lt;/a&gt; and &lt;a href="http://nemerle.org/Main_Page"&gt;Nemrle&lt;/a&gt; deserves your attention&amp;#160;!&lt;/p&gt;
&lt;/li&gt;
&lt;li class="alt" id="comment-13"&gt;&lt;span&gt; &lt;/span&gt; &lt;a href="http://oozone.blogspot.com/"&gt;Thomas&lt;/a&gt;  said at                 11:13 PM on June 22, 2009&amp;#160;:
&lt;p&gt;Lisp will not win! &lt;br/&gt; (Too (many) pa(r) ent (hese) s)&lt;/p&gt;
&lt;p&gt;There has to be a reason why Lisp didn&amp;#8217;t pick up since when it was introduced&amp;#8230;. readability.&lt;/p&gt;
&lt;p&gt;Parens indicate in literature (a side thought) or something that can be skipped.&lt;/p&gt;
&lt;p&gt;It is just not natural to express 2+2 as (+(2,2)) or whatever, in code.&lt;/p&gt;
&lt;p&gt;IMHO,  it will forever remain a cult language. Something like Sanskrit, Latin  etc - good to know and helpful to understand the finer things in (coding  (can&amp;#8217;t resist)) life!&lt;/p&gt;
&lt;/li&gt;
&lt;li class="alt" id="comment-14"&gt;&lt;span&gt; &lt;/span&gt; &lt;a href="http://www.christianwirth.de/"&gt;Chris&lt;/a&gt;  said at                 1:55 AM on June 23, 2009&amp;#160;:
&lt;p&gt;And what about F#&amp;#160;?&lt;/p&gt;
&lt;/li&gt;
&lt;li class="alt" id="comment-15"&gt;&lt;span&gt; &lt;/span&gt;&lt;a href="http://website/"&gt;Nick B&lt;/a&gt;  said at                 8:59 PM on June 29, 2009&amp;#160;:
&lt;p&gt;&amp;gt; Also, you might consider looking at the &amp;#8220;D&amp;#8221; language  for applications that will need to connect to native C/C++ libraries,  e.g. desktop apps. Where Clojure feels like &amp;#8220;Lisp done right&amp;#8221;, D is &amp;#8220;C++  done right&amp;#8221;.&lt;/p&gt;
&lt;p&gt;To be precise - check out &amp;#8220;D programming language&amp;#8221; &amp;amp; &amp;#8220;TANGO&amp;#8221; (the framework).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description><link>http://blog.agilehead.com/post/1241875464</link><guid>http://blog.agilehead.com/post/1241875464</guid><pubDate>Tue, 26 May 2009 06:52:00 -0400</pubDate></item></channel></rss>

