Software dev, tech, mind hacks and the occasional personal bit

Category: C#

Slides from ‘Learning to live with the static-typing fascist and the dynamic-typing fan-boy in your enterpriseā€¦’

Here’s the slides from Jim‘s and my recent presentation at Tech Ed 07 on the Gold Coast and in Auckland:

LearningToLiveWithTheStaticTypingFascistAndTheDynamicTypingFanboy-TechEd07.pptx (Powerpoint 2007)

LearningToLiveWithTheStaticTypingFascistAndTheDynamicTypingFanboy-TechEd07.ppt (Powerpoint 2003)

You may also be interested in having a read of the abstract.

TechEd 07 – Some interesting snippets

Silverlight

  • Silverlight runs on MAC and PC.
  • There is now a CLR for the Mac.
  • Microsoft is not currently planning to provide Silverlight for any unix platform (although there is MoonLight).
  • Silverlight 1.0 is basically a media player. It has hooks for javascript etc and some might say it has similar functionality to the Flash movie player.
  • Silverlight 1.1 has the real programming API. All further Silverlight references are to 1.1.
  • Silverlight will do a (currently undefined) simplified subset of WPF.
  • Silverlight gives acess to DOM in the browser.
  • Currently, the alpha allows 1mb local storage per page. In future, the storage is probably going to be shared across a domain rather than on a page by page basis.
  • Silverlight provides the capability to open a file on disk for read to allow for file uploads etc.
  • Interop between JavaScript and hosted Silverlight app is quite easy.
  • Silverlight looks a bit fiddly to set up, requiring javascript and sometimes xaml bootstrap – but being improved.

Software Factories

  • Allow solution and project structures to be auto-generated based on wizards.
  • Can provide code snippets and some (often template-based) code auto-generation.
  • Comes with documentation in help files and some context specific stuff.
  • Can include GUI designers that generate code.
  • People can develop their own domain specific factories.

DSLs
Currently, Microsoft’s take on DSLs is GUI editors, not written language or code. At the Software Factories talk, a GUI tool in Visual Studio for drawing your business entities and relationships was billed as a DSL.

Windows Workflow Foundation (WF)

  • Activity based with GUI designer for connecting and composing activities.
  • Custom activities and compositions can be developed and inherit from base classes.
  • Single threaded and mainly queue based, with some events sprinkled through.
  • Activities can reference data from other activities using a mechanism vaguely like data binding.
  • Hosted in the CLR, so can be part of a console app, ASP.NET, WinForms etc.
  • Handles pickling and reconstitution of long running activities.
  • Base Activity classes provide virtual hooks. Eg, ‘Execute’ for doing the work, ‘Cancel’, and ‘Compensate’ for handling rollback scenarios.

New in the Enterprise Library 3.1

  • Validation Application Block: provides simple, attribute based property validation. Easy integration with standard ErrorProvider on WinForms and WebForms and WPF is possible. Looks ok but somewhat basic – don’t think it supports warnings for example. It has GUI tool support and also capability to specify related objects which need to be validated.
  • Policy Injection Application Block: provides aspect oriented programming (AOP) style coding using attributes. All new AOP objects need to be created using the block’s object factory. Looks useful – there is out of the box support for validation, caching and logging in AOP fashion.

 

Tech Ed Talks

Jim Webber and I will be co-presenting at Tech Ed Australia and Tech Ed New Zealand this year. Here’s the low down:

Learning to live with the static-typing fascist and the dynamic-typing fan-boy in your enterprise…

Gold Coast
Thursday 9 Aug
5pm – 6:15pm

Auckland
Tuesday 14 Aug
2:20pm – 3:35pm

“What’s best for your enterprise? Is it the ‘glue that never sets’ and flexibility of dynamic languages like Ruby, or the tried and true, hard and fast rules and tool support of static languages like C# 3.0? Are there different trade-offs for green field development and integration?

And more importantly, which is best, the Mac or PC?

In a dynamic, and combative presentation, Jim and James will let their alter-egos run amok and answer these questions from the perspective of a seasoned enterprise architect and a l33t hax0r. By the end of this session you will understand the interplays between the two personality types, have had a few laughs, and picked up a few tips on how to use both technology
sets in harmony in your enterprise. “

Hope to see you there!

The Castle Project – Rails for .NET

The Castle Project is an interesting open source alternative to ASP.NET / ADO.NET. Among other things, the Castle Project provides a Rails-like development framework for .NET. It has an ActiveRecord implementation built on top of NHibernate, a very Rails-like MVC setup called MonoRail, and uses NVelocity for template style views. It’s worth checking out. This screencast gives a bit of an overview.

There’s tough competition around the corner though, with Orcas already in beta, providing XAML, LINQ and O-R mapping.

Is .NET or Java dying?

Are C# and .NET losing ground as Martin Fowler suggests? Or is Java’s market share dropping? What about Ruby? And what about the Australian market in particular?

Here’s what I’ve been able to find.

Job Trends
Which technologies have the most demand for people?

From Indeed.com, which claims to search “millions of jobs from thousands of job sites”, but I suspect may have a USA focus:

“Best Talent Index May 2007” from Best People Solutions gives an Australian perspective:

Here’s job counts from the (largest?) primarily Australian job search site Seek on 5 June 2007, 3pm (today):

Keyword(s) Number of positions found
Java 3,414
“.NET” or “dot net” 2,744
“c#” or “c sharp” 1,722
ruby 100

As an aside, I remember doing a search on Seek for “ruby” about 6 months ago, and getting under 20 jobs mentioning it.

Search Engine Number of Hits

Extract from the TIOBE Programming Community Index for June 2007:

Position
Jun 2007
Position
Jun 2006
Delta in Position Programming Language Ratings
Jun 2007
Delta
Jun 2006
Status
1 1 Java 20.025% -1.10% A
2 2 C 15.967% -2.29% A
3 3 C++ 11.118% +0.45% A
4 4 (Visual) Basic 9.332% -0.85% A
5 5 PHP 8.871% -0.72% A
6 6 Perl 6.177% +0.17% A
7 8 C# 3.483% +0.25% A
8 7 Python 3.161% -0.30% A
9 10 JavaScript 2.616% +1.16% A
10 19 Ruby 2.132% +1.65% A


I think this gives a good idea of web buzz, but suggest that most non-IT companies do not publish information about their projects and chosen technologies and languages on the web.

Conclusion
The data collected suggests that:

  • Both .NET and Java are major players in the job market with thousands of positions advertised, implying wide industry adoption of both.
  • Neither .NET nor Java seem to be undergoing any significant decline in jobs.
  • Java has much more information about it on the internet, although .NET is slowing gaining ground and Java slowly losing it.
  • Ruby is comparatively tiny but growing rapidly in terms of jobs and information on the internet.

Thanks
Thanks to Jason Yip and Suzi Edwards for their help finding/sourcing information.

Using floating point variables to represent money => not a good idea!

I was reading through some code the other day and was surprised to find that it was using doubles to represent dollar amounts. Reason for the alarm bells is that doubles and floats cannot accurately represent many decimal fractions (eg, 0.1), since doubles and floats internally work with powers of 2 rather than powers of 10. These inaccuracies are likely to lead to significant errors, especially when performing arithmetic (eg, adding up a table of dollar amounts). See this IBM article for a more in depth explanation and examples. The solution is to use types that work with powers of ten internally. In C#, you can use ‘decimal’ and in Java or Ruby, ‘BigDecimal‘, to avoid these problems.

AntiPattern: BusinessObjects in the driving seat

When you have a rich domain model with a business object centric design, and a Windows forms GUI, it can be very tempting to start putting significant process logic in the business objects. After continuing along this path a little further, you may realise that the process needs some sort of user input, and you use events or some sort of notifier pattern to gain user input required by the process, while still maintaining layering in terms of referencing. Then additionally you may need to access some sort of external service.

Here is an example:

class Order : BusinessObject
{
  public void SendOrder(INotifier notifier)
  {
    if (ReadyForDelivery ||
        notifier.Confirm("Are you sure you want to send order lines? They are not ready for delivery."))
    {
      OrderLine[] orders = GetLinesToSend();
      foreach(OrderLine line in Lines)
      {
        SendLine(line); // send line using a web service?
      }

      Notify("Lines sent successfully.");
    }
  }
}

interface INotifier
{
  void Notify(string msg);
  bool Confirm(string msg);
  OrderLine[] GetLinesToSend();
}

I would like to suggest that this is an anti-pattern and a trap. Although there is no direct reference from the Business Layer to the GUI layer (INotifier is implemented in GUI and passed down), the Business Layer now requires the ability to stay instantiated, pause while waiting for responses from the notifier, and then continue execution. This will work for rich client applications, but not in a stateless web environment. The ideal of being able to swap in/out the GUI layers on top of the Business layer is now compromised.

Instead, it would be possible to drive form the GUI layer, and call a service to send the Order Lines. In pseudo code below:

void SendMenu_Click(...)
{
  if (Order.ReadyForDelivery ||
      MessageBox.Show(...) == DialogResult.Yes)
  {
    using (ChooseLineForm chooseLineForm = new ChooseLineForm(Order))
    {
      chooseLineForm.ShowDialog()
    }
    SendingSevice.SendLines(chooseLineForm.selectedLines);
    ...
  }
}

If the logic in the GUI layer became much more complex, it may be a good idea to pull it out into its own class (eg, LineSender). This class would be a type of GUI level controller, responsible for orchestrating the send process.

Using this approach, there are a number of benefits:

  • BusinessObjects have no reliance on GUI implementation, so can be used for Rich Client and Web Client indiscriminately.
  • Web developers are free to implement the user input process in stateless way more appropriate to their platform.
  • Functionality for sending Order lines (some sort of integration with a web service?) is pulled out into a service class which can be reused elsewhere (potentially sending other types of objects?) and unclutters the Order business object and removes its dependency on an external service.
  • Code is simpler and easier to follow.

Page 4 of 4

Powered by WordPress & Theme by Anders Norén