October 2006

Monthly Archive

A Dublin-based high-potential software company has scored a major deal with software company Microsoft to train thousands of developers around the world on its flagship .NET technology.

By John Kennedy, Silicon Republic
October 26, 2006

Under the terms of the deal, InnerWorkings will offer its entire catalogue of Microsoft .NET framework coding challenges and performance support services to help Microsoft’s customers close the skills gap for enterprise developers.

InnerWorkings serves global enterprises through a unique technology that enables software developers to learn how to write code. Developers are tasked in a hosted environment to solve real-world coding challenges.

Microsoft-based developers will have access to InnerWorkings’ catalogue of drills on key technologies such as ASP .NET 2.0, .NET AJAX Extensions and AJAX Library, Visual Studio Team System and SQL Server 2005.

“We are excited about working with Microsoft on our shared goal of driving .NET framework development skills and programming excellence for enterprise customers on a large scale,” said InnerWorkings chief executive Francis McKeagney.

“InnerWorkings offers a completely novel approach to improving developer performance and productivity within the enterprise. Developers learn real programming skills with the very latest technologies while working almost exclusively in Visual Studio,” McKeagney added.

Under the terms of the deal, businesses who are members of the Microsoft Developer and Platform Readiness programme, will receive detailed reports on the learning progress of their developers as they enhance their .NET framework coding skills.

McKeagney, who spent 13 years at SmartForce, founded InnerWorkings in 2002, drawing on his knowledge of the learning industry.

In 2005 the company secured an investment of US$8.8m from Benchmark Capital (Europe) and Mohr Davidow Ventures.

Launch Article 

Add this post to: del.icio.us:Irish Firm in Landmark Deal with Microsoft digg:Irish Firm in Landmark Deal with Microsoft spurl:Irish Firm in Landmark Deal with Microsoft simpy:Irish Firm in Landmark Deal with Microsoft newsvine:Irish Firm in Landmark Deal with Microsoft blinklist:Irish Firm in Landmark Deal with Microsoft furl:Irish Firm in Landmark Deal with Microsoft reddit:Irish Firm in Landmark Deal with Microsoft Y!:Irish Firm in Landmark Deal with Microsoft google:Irish Firm in Landmark Deal with Microsoft technorati:Irish Firm in Landmark Deal with Microsoft stumbleupon:Irish Firm in Landmark Deal with Microsoft windowslive:Irish Firm in Landmark Deal with Microsoft

Pleasanton, CA - October 25, 2006 - InnerWorkings announced today that it has signed an agreement with Microsoft to deliver its flagship product to thousands of developers through the Microsoft Developer & Platform Readiness program. Microsoft Logo

The company will offer its entire catalog of Microsoft .NET Framework coding challenges and performance support services to help Microsoft customers close the skills gap for enterprise developers. InnerWorkings Developer is scaleable for geographically dispersed development teams, yet allows individual developers to receive in-depth feedback, code samples, and support.

Select Microsoft customers will have access to InnerWorkings’ growing catalog of Drills on key technologies such as Microsoft ASP.NET 2.0, Microsoft .NET Framework 3.0, Microsoft ASP.NET AJAX Extensions & Microsoft AJAX Library, Microsoft Visual Studio Team System, and Microsoft SQL Server 2005. Participating Readiness customers will also avail of InnerWorkings’ acclaimed code judging engine, Personal Tutor support service, full code search functionality, and the company’s extensive reference framework. The InnerWorkings learning environment is tightly embedded in Microsoft Visual Studio so developers can enjoy a more seamless and in-depth programming experience.

“InnerWorkings is delighted to be chosen by Microsoft’s Developer & Platform Readiness team for this important initiative,” said Francis McKeagney, CEO of InnerWorkings. “We are excited about working with Microsoft on our shared goal of driving .NET Framework development skills and programming excellence for enterprise customers on a large scale. InnerWorkings offers a completely novel approach to improving developer performance and productivity within the enterprise. Developers learn real programming skills with the very latest technologies while working almost exclusively in Visual Studio. We look forward to the successful execution of this ground-breaking developer program in conjunction with Microsoft.”

“Microsoft is pleased to see InnerWorkings place value in the Microsoft Developer and Platform Readiness program,” said Thom Robbins, director of the .NET Platform Marketing Group at Microsoft Corp. “The impressive capabilities of InnerWorkings Developer work in tandem with the innate power and flexibility of Visual Studio, offering developers a compelling environment for skills development and productivity gains.”

Under the terms of this agreement, each Readiness customer will receive detailed reports on the learning progress of its developers as they enhance their .NET Framework coding skills. Development managers will enjoy unprecedented visibility into the core strengths and skills gaps of their development team, ensuring that each team member is fully prepared for upcoming .NET Framework project assignments. In addition, InnerWorkings will compile extensive developer evaluations and feedback to ensure program success across each customer’s software development organization.

Working closely with Microsoft, InnerWorkings is committed to providing hands-on, in-depth learning on the .NET Framework for select Microsoft Readiness customers. Microsoft can now offer a compelling and innovative way to learn new .NET Framework skills while working in Visual Studio. With InnerWorkings, developers will enjoy rigorous coding challenges, an opportunity to practice real coding skills, expert Personal Tutor support, and an extensive library of proven coding samples. Please contact your local Microsoft field representative for further details on how to sign-up for this Readiness initiative.

About InnerWorkings
InnerWorkings’ mission is to enhance the performance capability of software organizations by transforming the way developers learn and perform in the workplace, while enabling better management decision-making through insight into the capabilities of their software teams. InnerWorkings is a Microsoft Gold Certified Partner and member of the Visual Studio Industry Partner (VSIP) program. The company’s R&D facility is based in Dublin, Ireland and InnerWorkings maintains its corporate headquarters in Pleasanton, California. For more information about InnerWorkings and its services, visit www.innerworkings.com.

All products and company names herein may be trademarks of their respective owners.

Company Contact
Brian Finnerty
bfinnerty@innerworkings.com
+1 (925) 737 0600

Add this post to: del.icio.us:InnerWorkings Selected by Microsoft to Deliver Developer Readiness Training digg:InnerWorkings Selected by Microsoft to Deliver Developer Readiness Training spurl:InnerWorkings Selected by Microsoft to Deliver Developer Readiness Training simpy:InnerWorkings Selected by Microsoft to Deliver Developer Readiness Training newsvine:InnerWorkings Selected by Microsoft to Deliver Developer Readiness Training blinklist:InnerWorkings Selected by Microsoft to Deliver Developer Readiness Training furl:InnerWorkings Selected by Microsoft to Deliver Developer Readiness Training reddit:InnerWorkings Selected by Microsoft to Deliver Developer Readiness Training Y!:InnerWorkings Selected by Microsoft to Deliver Developer Readiness Training google:InnerWorkings Selected by Microsoft to Deliver Developer Readiness Training technorati:InnerWorkings Selected by Microsoft to Deliver Developer Readiness Training stumbleupon:InnerWorkings Selected by Microsoft to Deliver Developer Readiness Training windowslive:InnerWorkings Selected by Microsoft to Deliver Developer Readiness Training

While Visual Studio has always been the de-facto standard for writing solutions based on Microsoft technologies, savvy developers have often extended it with additional tools to help them better handle the increased complexity of today’s applications.
My team is no different, and, over time, we incorporated all sorts of extra tools, using a pretty aggressive “buy/build/open-source” strategy.

To my great surprise, early last year I heard about the plans to release Visual Studio Team System (VSTS) and Team Foundation Server (TFS); I was under non-disclosure agreement, and getting the news directly from the mouth of Somasegar (Corporate VP, Developer Division) contributed to create a certain level of expectations.

In the months that followed the release, I attended to a few presentations on the topic and the excitement was soon replaced by a bit of disappointment.
It was evident that Microsoft was mostly targeting enterprises that had already plenty of money to invest and was somewhat ignoring smaller realities.
I also felt that existing open source tools were already providing equivalent or better support for well known problems such as unit testing, code coverage, static analysis, version control, continuous integration, etc.

I started considering a slightly different perspective only recently, after I attended an excellent presentation organized by Microsoft Ireland on the subject of agile development, VSTS and TFS.
A few days after that event, I decided to download a trial version and take the system for a good spin.

This time, instead of focusing on the specific developer tools (which I already knew) I concentrated on the architecture, the customization capabilities, and the extensibility points.
I came to the realization that VSTS has a lot more to offer than a simple integration of tools; it simplifies the process of building software by providing better visibility across the various roles involved (e.g. developers, project managers, business analysts, testers, etc).
It is also a very extensible platform; if we don’t like a process or a tool we can bend the system to adopt a better one.

So, do we “need” VSTS?
As usual, it depends.

In our case, we have already created a process that we re-examine and refine frequently; we have tons of tools, workflow capabilities, reports, and excellent metrics we work with.

whiteboard

Although the early days are long gone (when we could simply track our progress on a whiteboard), we can still rely on a healthy dose of verbal communication; after all, the first commandment of the agile manifesto states that we value (more):

Individuals and interactions over processes and tools

Admittedly, building all this didn’t happen overnight, so I can see why other teams may choose a different path and consider using VSTS.
Have any of you guys seriously tried it yet?

Add this post to: del.icio.us:Rediscovering Visual Studio Team System digg:Rediscovering Visual Studio Team System spurl:Rediscovering Visual Studio Team System simpy:Rediscovering Visual Studio Team System newsvine:Rediscovering Visual Studio Team System blinklist:Rediscovering Visual Studio Team System furl:Rediscovering Visual Studio Team System reddit:Rediscovering Visual Studio Team System Y!:Rediscovering Visual Studio Team System google:Rediscovering Visual Studio Team System technorati:Rediscovering Visual Studio Team System stumbleupon:Rediscovering Visual Studio Team System windowslive:Rediscovering Visual Studio Team System

It’s been some time since my last entry, and as so often happens, life and work tend to get in the way of free time and useless activities.  “You know put off today…Yada…Yada…Yada…”; Oh well…!! 

In any case, I have a whole lot of things floating around in the brain pan, unfortunately trying to pull together a cohesive topic worth talking about, from everything I’ve been thinking about is proving rather difficult at 12:20 am. So I think that I will just talk a bit about Vista and the Vista climate and see where it goes from there.

With that being said, let’s get into something techie!!  I’m sure that, unless you’ve been hiding under rocks lately you know that the Vista release date is creeping up on us; presumably in November for MSDN subscribers.  Also, as we all know Vista is now in RC2 release and has been met with quite an interesting bit of scrutiny, at least in the blogoshpere.  I have come across several posts and threads on the web and I have been surprised by some of the commentary that I have seen.  It seems that the web is full of “experts” that could write a perfect operating system with little to no effort and it would have no issues.  At least that’s what a lot of the posts appear to be preaching anyway.  I do have to say that I have gotten quite a kick out of reading some of the posts, though. 

Now before I go any further, let me just say that I am not an OS expert, let alone a Vista expert.  I also am not affiliated with Microsoft in any way other than as a user of their products. Now Back to my point; it seems to me that writing an operating system is a difficult and monumental task.  Not to mention having to write one that you are expecting people to actually use. :-)  I think that a lot of the people, non-techies and developers alike, tend to forget that.  It also seems as if some individuals think that Microsoft is writing the operating system for them and only them.  Kinda’ selfish, huh!! 

I think that we all need to keep things in a little bit of perspective.  From my perspective, Microsoft is a company that is in the business of making software for a “wide” range of users.  They are also in the business of making software to make money.  Heaven forbid!!  Now they don’t always get it exactly the way we want it, but who does?  Has anybody ever written a piece of software that was bug free, had all of the exact features that it needed, was loved by everyone and was delivered on time.  I think not.  If you have, then maybe you should get into the business of writing OS’s.  I know that I’ve made a mistake or two; not that I’d ever admit to it in public of course. :-) 

Anyway, all I am saying is let’s try to give things a fair chance before we criticize too heavily.  After all, Microsoft has been catching quite a bit of crap from the development and technical communities for the long development cycles and the extended release dates.  Once they get closer to releasing the software we are all begging for, we give them even larger amounts of crap for delivering the product before it’s ready.  Can we make up our mind already..?? 

I know that Vista is not going to be perfect when it is released, and I will probably be cussing it out the first time that it inconveniences me, however I am excited about the foundations that have been built into the system this time around.  Not all of it is sexy or flashy, but it definitely sets the stage for some really cool things in the future.  So let’s try to embrace the goodness and look forward and contribute to the possibilities!! 

Time to put away the soapbox….1:20am.

Add this post to: del.icio.us:A Vista Perspective… digg:A Vista Perspective… spurl:A Vista Perspective… simpy:A Vista Perspective… newsvine:A Vista Perspective… blinklist:A Vista Perspective… furl:A Vista Perspective… reddit:A Vista Perspective… Y!:A Vista Perspective… google:A Vista Perspective… technorati:A Vista Perspective… stumbleupon:A Vista Perspective… windowslive:A Vista Perspective…

I finally moved my extremely interesting and groundbreaking blog to claudioperrone.com.

I thought about doing it for a long time, but I haven’t really bothered until now.

house plan image

The geek in me, however, has finally taken full control of my destiny and now I can finally tweak everything I want: permalinks, themes, text filters, and, even more importantly, spam filters!

Since I’m moving away from a service based on .Text, what do you think a traditionally hardcore Microsoft technologist like me would install? Community Server? DasBlog? Perhaps Subtext? Build my own engine?
Nahhh… boring, boring, boring… been there, done that.

In the end, I decided to install Typo 4, a little jewel based on Ruby on Rails.
I can almost hear you guys: Blasphemy?This is not .NET! Betrayer etc, etc (well I know, others may ask Ruby on what???, but never mind).

No, I’m not out of my mind. I still love .NET, and I passionately work for an outstanding company whose purpose is to reveal more efficient ways to help developers building enterprise applications using .NET technologies.

The truth is that it is time for me to give Ruby another chance. Yes, you heard me. I said another chance. In fact, I tried it in the past, with modest results.
The problem was me, not the language, of course.
I kept questioning everything.
Can you imagine it?
Why this, why that?
How can that code be manageable in a reasonably big application?

I remember going through the Pickaxe book with extreme frustration.
I lost the battle; Ruby was too different; I didn’t “get it”.

But do you know how children learn their (first) language so fast?

  • They don’t have anything to compare it with
  • They don’t question its value
  • They don’t set high expectations
  • They just absorb everything, like only the best sponges can do

So there you go; I want to be a child again.

Arguably I have being exposed to these concepts for too long. Some colleagues already played with Ruby, and, largely thanks to the early adoption of Michael O’Brien, both strategic applications and tactical scripts have been already built for internal use.

And like a disease, the doubt that I might have been a bit too superficial in my early judgement is spreading all over my body.

At the workshop in Crested Butte, Niclas Nilsson, Martin Fowler and Bruce Eckel giggled when I na?vely told them that I have a “static” mindset. Puzzled by my (admittedly poor) choice of the word “static” in that context, Bruce smiled and asked me if I meant that I live in a static world where nothing ever changes!
Eh eh, we had a good laugh. Of course, I only meant that I’ve been pretty comfortable with the perceived sense of security that “strongly typed” languages give me.
But now I’m ready to go back and revisit my assumptions.

So, what’s next?

If there is one thing that I’m learning about blogging is that I should never set expectations about future posts unless I am positively confident that I will definitely fulfil those expectations. My writing energy fades away too easily.

So don’t expect anything.
Be a child.

Add this post to: del.icio.us:A New Home, A New Mindset digg:A New Home, A New Mindset spurl:A New Home, A New Mindset simpy:A New Home, A New Mindset newsvine:A New Home, A New Mindset blinklist:A New Home, A New Mindset furl:A New Home, A New Mindset reddit:A New Home, A New Mindset Y!:A New Home, A New Mindset google:A New Home, A New Mindset technorati:A New Home, A New Mindset stumbleupon:A New Home, A New Mindset windowslive:A New Home, A New Mindset

For those of you interested in all things relating to Enterprise Library, I’d like to announce that InnerWorkings has just released two Drills on the subject. Our R&D team has spent the month of September busily compiling a host of brain-crunching coding challenges on several core aspects of Enterprise Library for the .NET Framework 2.0.

Our first Drill asks you to develop your C# skills using the following application blocks:

  • use the Data Access Application Block to retrieve and modify data from a database
  • employ the Logging Application Block to log information to a file and trace activities to a database
  • configure the Exception Handling Application Block to catch, wrap, and throw exceptions
  • configure the Exception Handling Application Block and the Logging Application Block to catch and log exceptions

Our next Drill delves into C# coding challenges using several additional application blocks:

  • use the Caching Application Block to cache frequently accessed data
  • configure the Cryptography Application Block to encrypt and decrypt data using the same cryptographic key
  • configure and use the Cryptography Application Block to hash data using a salt, and compare plain text values with their hash equivalent
  • employ the Security Application Block for authorization
  • set the Security Cache Manager to cache user identities

If you’re into developing reusable components that encapsulate Microsoft best practices, then look no further than our online catalog where both the above Drills are available (with some “new release” discounts thrown into the mix). Enjoy.

P.S. Don’t despair, VB developers! Equivalent VB language versions of both Drills on Enterprise Library are scheduled for release at the end of October.

Add this post to: del.icio.us:Don’t pay late fees on your Enterprise Library skills… digg:Don’t pay late fees on your Enterprise Library skills… spurl:Don’t pay late fees on your Enterprise Library skills… simpy:Don’t pay late fees on your Enterprise Library skills… newsvine:Don’t pay late fees on your Enterprise Library skills… blinklist:Don’t pay late fees on your Enterprise Library skills… furl:Don’t pay late fees on your Enterprise Library skills… reddit:Don’t pay late fees on your Enterprise Library skills… Y!:Don’t pay late fees on your Enterprise Library skills… google:Don’t pay late fees on your Enterprise Library skills… technorati:Don’t pay late fees on your Enterprise Library skills… stumbleupon:Don’t pay late fees on your Enterprise Library skills… windowslive:Don’t pay late fees on your Enterprise Library skills…

Two of my favourite C# 2.0 features come together in something of a perfect storm in a set of static methods on the Array class. These generic methods accept delegates that can be used to search and change arrays in a nice strongly typed way. A lot of these are inspired by features in functional and dynamic languages like lisp, smalltalk, ruby and python and are discussed in that context by Martin Fowler at http://www.martinfowler.com/bliki/CollectionClosureMethod.html.

The methods include gems like Find, FindAll, Exists, TrueForAll, the amazingly useful ConvertAll and overloads of BinarySearch and Sort that accept a generic delegate to compare items.

Find and the related methods can be used like this:

Track[] allTracks = GetAllMyTracks();
Track[] greatMusic = Array.FindAll(allTracks, delegate(Track t) { 
    return t.Rating == 5;
});
Track firstToDelete = Array.Find(allTracks, delegate(Track t) { 
    return t.Rating == 1;
});
bool someTracksUnrated = Array.Exists(allTracks, delegate(Track t) { 
    return t.Rating == 0;
});

ConvertAll is a real workhorse and very similar to the map or collect function in dynamic languages.

Track[] allTracks = GetAllMyTracks();
ListViewItem[] items = Array.ConvertAll<Track, ListViewItem>(allTracks, delegate(Track t) {
    return new ListViewItem(new string [] {t.Name, t.Album, t.Rating});
});
string[] albums = Array.ConvertAll<Track, string>(allTracks, delegate(Track t) {
    return t.Album;
});

These examples don’t do map/collect justice — once you start using map/collect you realise it solves a basic problem that you encounter all the time. Unfortunately the C# syntax is a little long-winded and not helped by the need to explicitly state the generic parameters to the method — in most cases the compiler can figure these out for you, but it falls down in this case. In ruby the second example would be:

albums = tracks.map{|t| t.album}

In fact the long-windedness is a bit of a problem with all of these methods, particularly when compared with their dynamic language counterparts. Luckily, the situation improves a LOT with C# 3.0, due late next year as part of Visual Studio Orcas.

C# 3.0 takes the generic delegates introduced in version 2.0 and makes them much more compact by relying on the type inference features introduced in Orcas. Writing the albums code in C# 3.0 looks like this:

albums = Array.ConvertAll(tracks, t => t.Album);

One method that seems to be missing from both the static methods on Array and from the current LINQ bits though, is the inject function. The inject function is a tricky little feller and I must admit I was completely stumped by it when I first encountered it in Ruby. Inject basically allows you to create some single accumulated value based on the entries in a list. A great example is summing numbers:

int[] numbers = new int[] { 1, 2, 3 };
int sum = Inject(numbers, 0, delegate(int total, int number)
{
    return total + number;
}));

Here, the zero we pass as the second parameter to the Inject method is the initial value of our accumulator. Inject then calls our delegate for each member of the numbers array, passing both the accumulator (total in this case) and the array member. The delegate then returns a new value for the accumulator.

In C# 3.0, we again get a much nicer syntax:

int sum = Inject(numbers, 0, (total, number) => total + number);

While summing is the classic inject example, once you get the hang of it you see how useful this simple operation is. Here’s max:

int max = Inject(numbers, int.MinValue, (current, number) => Math.Max(current, number));

If you want to count the number of times a value occurs, you can use:

int count = Inject(numbers, 0, (total, number) => number == 1 ? total + 1 : total);

Building up a hash or dictionary is also a great use of Inject, though it’s a little clunky in C#, even in version 3.0. This counts the number of times each value occurs in the array “a”.

Dictionary<int, int> frequencies = a.Inject(new Dictionary<int, int>(), (dict, i) =>
{
    dict[i] = (dict.ContainsKey(i) ? dict[i] + 1 : 1); 
    return dict;
});

It’s much neater in ruby:

frequencies = a.inject({}){|hsh,i| hsh[i] ||= 0; hsh[i] += 1; hsh }

Ruby’s more concise syntax also means you can do a “group by” very easily:

# a is an array of customers, let's group them by city
by_city = a.inject({}){|hsh,c| hsh[c.city] ||= []; hsh[c.city] << c; hsh}

In C#, this would be:

Dictionary<string, List<Customer>> byCity = a.Inject(new Dictionary<string, List<Customer>>(), (dict, c) =>
{
    if (dict.ContainsKey(c.City) == false)
        dict[c.City] = new List<Customer>();
    dict[c.City].Add(c);
    return dict;
});

Inject is pretty easy to write, though in C# 2.0 you’ll have to define a delegate for it as well:

public delegate T2 Injector<T1, T2>(T2 accumulator, T1 item);

public T2 Inject<T1, T2>(IEnumerable<T1> enumerable, T2 initialValue, Injector<T1, T2> func)
{
    T2 accumulator = initialValue;
    foreach (T1 item in enumerable)
    {
        accumulator = func(accumulator, item);
    }

    return accumulator;
}

Just for good measure, here’s both inject and map in C# 3.0, this time written as extension methods on IEnumerable, which means they can be lazily evaluated:

public static T2 Inject<T1, T2>(this IEnumerable<T1> enumerable, T2 accumulator, Func<T2, T1, T2> func)
{
    foreach (T1 item in enumerable)
    {
        accumulator = func(accumulator, item);
    }

    return accumulator;
}

public static IEnumerable<T2> Map<T1, T2>(this IEnumerable<T1> enumerable, Func<T1, T2> func)
{
    foreach (T1 item in enumerable)
    {
        yield return func(item);
    }
}
Add this post to: del.icio.us:Inject and other goodness in C# digg:Inject and other goodness in C# spurl:Inject and other goodness in C# simpy:Inject and other goodness in C# newsvine:Inject and other goodness in C# blinklist:Inject and other goodness in C# furl:Inject and other goodness in C# reddit:Inject and other goodness in C# Y!:Inject and other goodness in C# google:Inject and other goodness in C# technorati:Inject and other goodness in C# stumbleupon:Inject and other goodness in C# windowslive:Inject and other goodness in C#