A tribute to our feminine volleyball team who won the French championship!

Earlier this year, we decided to sponsor CGI volleyball team. I have personally played with this group for almost 20 years, the CGI name surviving the absorption of the former company by IBM more than a decade ago.

This association has 4 volleyball teams playing in the FSGT league, a championship in France that gathers sport teams usually coming from Corporations. This year was a revival for the group, with many new members joining the association and it was actually the first year that a CGI feminine team joined the league.

The weekly championship takes place at local level but there is a national competition which gathers the best teams throughout the country.

Not sure whether it is the players’ quality or the brand on the jersey that made the difference (I like to think it is both as SoftFluent strives for excellence :) ) but they certainly dominated their league in the national championship, winning the semi-final and the final in Bordeaux without even losing a game.

Next year, they will compete at the "top level" of the French championship, with the opportunity to qualify for a world’s championship of these Corporation leagues in Brazil.

So thank you girls for defending the colors of our brand, you are the best and deserve all the kudos. Good luck for next year, it will be much tougher!

image

From left to right: Véronique Bruneau, Isabelle Lubas, Paola Gava, Alexandra Ferreira, Marie-Mélodie Baralle, Marie-José Duque-Ribeiro, Florence Dejean & Frédérique Sandro.

Missing on the picture: Nathalie Vivier, Bénédicte Deflesselle and Iris Mazzacurati.

The “No Services on Entities” dogma

Today, we would like to open a new category on our blog under the topic “Trendy patterns that can kill you”.

Since in the field, we observe a lot of confusion in the interpretation of key architecture concepts and their translation at implementation level, we decided it would be worth sharing our point of view with others.

We are aware that some of these interpretations tend to be “broadly accepted” by the community at this stage, and this is why we call them “trendy”, but we still think that these interpretations are often irrelevant or simply useless, at least on the .NET platform.

An important point is that our opinion is anything but dogmatic, and we might even change it over time if we get convinced that it provides a tangible benefit in some scenarios, but we have selected patterns that – to date – have done more harm than good to the .NET projects we know. In the end, everyone will make its own opinion and base decisions for his projects depending on objectives and constraints.

Let us start by the “No Services on Entities” dogma.

What is it?

Many architects argue that no service should be implemented directly on business object classes. Instead, the recommendation would be to create another kind of classes dedicated to implementing the services and consolidate appropriate methods, possibly across several objects.

What is the driver?

The arguments usually emphasize the separation of concerns, and the fact that services cannot always be clearly attached to one specific object.

Why don’t we buy those arguments?

First of all, with a cumulated experience of hundreds of projects, we never faced a situation where the service could not be relatively naturally attached to a business entity.

And the reason is quite easy to understand, a service is not different from a method, except that it is exposed to the outside world. So if you are used to object-oriented programming design, you should always be able to find the relevant class to support the behavior this service is about. Second, separation of concerns is not a goal as such.

It is interesting to separate elements that should not be too closely coupled, either because:

· Those elements can be used separately and separation could then improve reusability (a driver or a plug-in for example)

· Those elements have different evolution cycles and they will not evolve at the same rhythm (business rule intensive components or web user interfaces that need to be frequently revisited for instance)

In our views, and as explained above, a service primarily exists to serve as an interface to external systems, and .NET provides you with all the relevant mechanisms to create interfaces for your objects which need to be exposed as services.

If you need to create interfaces, just do so, once you do have at least two implementations or if you are sure you will have more than one. Do not do it before though, as you won’t be able to change it once you have created the "contract". We will comment further on interfaces in an upcoming post.

Why is this harmful?

We truly believe that adding layers and complexity that are not strictly needed is always harmful, as the biggest challenge of this industry is to deal with systems that are already getting more and more complex, just by technology evolution.

A second argument is that it greatly reduces code readability. It is not easy to find a name for these classes that will support services. In fact they usually end up with names such as SomethingManager, and it does not map to any concrete object, contrarily to what object-oriented programming was primarily designed for.

If you struggle naming your entities, properties or methods, give yourself more time to design, since you are probably on the wrong path. And it is likely that it’ll give a hard time to the ones who will maintain your code in the long run.

The .NET Framework itself is heavily object oriented and does not follow any complex service pattern. If it did, it would simply contain 40,000 classes instead of 20,000.

Why Model-Driven is the solution to the evolution challenge

The only viable route to manage obsolescence

What is the evolution challenge?

Technology innovation is going fast, and this pace of change is accelerating as the world goes global and the competition gets fierce. A lot of announcements are made every day by technology providers and it does not look like this motion is going to slow down. The multi-layer style of software development has increased flexibility and capability, but has also strongly increased the complexity of software development. With the multiplication of platforms and devices, such as cloud platforms or new mobile devices, and the growing needs to connect to collaborative social networks, we can be sure that this complexity will keep increasing in the future.

At the same time, for several decades now, businesses have developed significant operational IT systems, going further and deeper in features supporting their business and vertical sector. This means the legacy is way more important than it was years ago, and it is most of the time increasing. A recent study by Gartner showed that what they call the “IT Debt” is growing at a worrying rate.

In all businesses, there is a high pressure to lower costs, while providing new services to remain competitive in a more complex environment, and at the same time bearing the increasing legacy burden mentioned above, with its set of obsolescence constraints. Some systems even run totally unsupported which might become a critical issue that will force a reengineering at some stage.

For enterprises which need to maintain and improve the systems supporting their businesses, this is a quite unsolvable challenge, at least by keeping the same approach that was used in the past.

What is our proposed solution?

In our view, it is not a solution to just apply past recipes of redeveloping the applications at each new technology wave. In fact, we do not see any client managing to do it and except for very few extra-rich exceptions, no enterprise can afford such a cost. And even if you were very rich, it would probably be a better option to spend your money on increasing your business.

At the same time, maintaining very old applications tends to be field reality, but one can legitimately wonder how long can this still be sustained without a major crisis. And such a “status quo” strategy, which is obviously less risky in the short term, is probably a sure path to death in the long term. Because once a competitor in the same vertical has been able to deal with it, it will be too late to start a reengineering which will take a long time to achieve. Competition will have killed you during this period.

This is why we think that there are 2 critical areas that any enterprise organization should be working on proactively:

A. Set measurable objectives on the reduction of maintenance for existing legacy systems,

B. Use the savings to implement new projects in a way as independent from technology as possible.

On point A, it is critical to precisely evaluate maintenance costs, in terms of hardware, software licenses and maintenance fees, and of course human expenses to run the system and correct bugs. For custom applications that are in maintenance mode, the cost is highly correlated to the number of lines of code and the quality of the application. Refactoring existing applications without any functional change can provide huge savings and is not a hard task, as long as we do not fall into the trap of changing features at the same time.

On point B, model-driven is exactly the promise of capitalizing our work at a higher abstraction level than code. We and our customers have been delivering projects that way for 6 years, and this evolution capability is obvious once you have done it.

We sum this up through our 4 tenets that come from our experience:

1. Business entities have longer lifecycles than technology and should be defined in formats that will survive technology shifts and allow supporting them without reengineering the application.

2. Business rules and process changes need to occur through short cycles that can fit into a lean continuous maintenance scheme.

3. Efficient coupling of data, model, and presentation layers including customized code parts must be guaranteed by design.

4. Coding patterns need to be standardized and their implementation automated to ensure maintenance can be performed by standardized skills.

image

If model-driven is the solution, why Microsoft does not seem to be interested?

Since Microsoft dropped the Oslo project, and smart and talented people like Don Box have moved to other jobs in the company, one can legitimately wonder what Microsoft plans about model-driven are. Visual Studio Magazine has even published an article somewhat positioning our CodeFluent Entities product as the future of Model-Driven on the Microsoft platform.

Why has Oslo failed? As former Microsoft employees, here are some of our views on the subject.

Microsoft is a platform company. Despite a huge product offering, most of the revenue still comes from the platform, and any initiative that structurally helps the customer in being able to move away from the platform is not very well received internally, which one can easily understand. It generates a lot of internal conflicts between product groups.

It is interesting to note that even in Entity Framework, which approaches the data tier modeling in different ways, the “Code First” approach is pushed quite strongly by Microsoft. We think coding before thinking is probably not the good approach, as the global view of your model and the real key design questions are lost, but it seems more important for Microsoft to ensure developers approach development in a platform-dependent format and directly inside the language, than take the risk to give them the opportunity to switch to another platform at a later stage.

In further posts, we will detail more about our metrics for software development performance gathered from our field experience, and the cost that we think consistent with the dimension of a project: counting tables, screens, rules, reports or entities, as well as lines of code.

In a few hours, we will celebrate our 100th post on CodeFluent Entities blog, and give some insights on how we got there, starting from a very pragmatic field experience.

Motivating developers

Mazlow’s pyramid applied to developers

This article has been updated and is now here http://blog.softfluent.com/2012/12/04/motivating-developers/

Follow

Get every new post delivered to your Inbox.

Join 103 other followers