Latest Articles

Just to be clear, I’m only going to be talking about so-called “enterprise development”. I’m not claiming that F# is the best for systems programming, or games development, or hobby projects. What’s appropriate for one kind of development objective may well be inappropriate for another. Enterprise development has its own constraints and demands, which I think F# is particularly well suited for.

I’ll start with an important caveat, which is that I don’t think that the success or failure of a project depends on using a particular programming language. Much more critical are things like good communication, clear requirements, caring about the user experience, realistic expectations, and so on. If the programming language really was that important, then there would be no successful companies using PHP, Visual Basic, or JavaScript, and all jobs would require Haskell and Lisp skills!

Nevertheless, having said that, I do think that the choice of programming language has an effect on productivity, maintainability, and stability, and that’s what I’m going to talk about in this post.

The characteristics of Enterprise Development

So what are some the key characteristics of “enterprise” development?

Software development is not the focus of the business

In an “enterprise”, software is generally treated as a tool; a cost center rather than a profit center. There is no pressure to have the latest technology, or to hire the best developers, or (sadly) to invest in training.

This means that being “enterprise” has nothing to do with the size of the business. By my definition, Google does not do enterprise development, while a 50-person B2B company probably does.

This also means that companies that develop in-house software to gain a competitive advantage, like FinTech companies, don’t count as “enterprise” either.

Projects are business-centric rather than technology-centric

The goal of enterprise development is generally to support business workflows rather than to implement a specific set of technical requirements. At the most basic level, typical enterprise software just moves data around and transforms it. This sounds trivial and is often looked down on as not “real programming”.

But business workflows involve humans, and any time humans are involved you will always have complexity. Implementing an efficient map/reduce algorithm or optimizing a graphics shader might be tricky, but possibly not as tricky as some business workflows! This 30-year old quote about COBOL sums it up well:

The bias against the problem domain is stated explicitly in [a] programming language textbook, which says that COBOL has “an orientation toward business data processing . . . in which the problems are . . . relatively simple algorithms coupled with high-volume input-output (e.g. computing the payroll for a large organization).”

Anyone who has written a serious payroll program would hardly characterize it as “relatively simple.” I believe that computer scientists have simply not been exposed to the complexity of many business data processing tasks. Computer scientists may also find it difficult to provide elegant theories for the annoying and pervasive complexities of many realistic data processing applications and therefore reject them. - Ben Shneiderman, 1985

Sadly, enterprise development has never been attractive.

Enterprise projects often have a long life

It’s not unique to enterprise development, of course, but it’s common that enterprise software projects live a long time (if they survive childhood). Many projects last five years or more – I am personally familiar with one that started in the 1970’s – and over the lifetime of a project, many developers will be involved. This has a couple of corollaries:

  • The majority of the project lifecycle is spent in so-called “maintenance”, a misleading term for what is basically low-speed evolution (with the occasional high-speed panic as well).
  • If you are a developer working on a long-lived project, most of the code will not have been written by you, nor even by anyone currently on your team.

There is a very interesting talk by Robert Smallshire in which he simulates code generation for different size teams over different time periods. So, for example, after five years, the current team will generally only have contributed 37% of the code.

For a bigger team over a longer period, the contribution % can drop even lower.

Yes, these are simulations, but they ring true in my experience.

Enterprise project managers have a low tolerance for risk

As a result of all these factors, project managers tend to be risk averse and are rarely early adopters – why break something that’s already working?

As the saying goes “process is the scar tissue of organizations”. Stability is more important than efficiency.

However, new environmental conditions occasionally arise which force change on even the most conservative businesses. For example, the newfangled “intranet” and “internet” in the 1990’s scared a lot of people and had a lot to do with the rise of Java and VisualBasic/ActiveX. Here’s what the hype looked like back then:

  • From 1996: “As Netscape and Microsoft battle for Net dominance, both Java and ActiveX are key pieces on the board.”
  • From 1997: “Prior to Java, there was no Internet programming language.”

Less than 10 years after those articles were published, the dominant enterprise programming languages had indeed changed to Java and C#.

Thanks to mobile apps and the rise of the cloud, I think we’re in the middle of another era like this, where enterprises are willing to risk new technologies so as not to get left behind. The challenge of course, is how to adopt new technologies without major disruption.

What is important when choosing an enterprise language?

So how does all this affect choose a programming language and its associated ecosystem, from a project manager’s point of view?

It should be enterprise-friendly

A project manager is not just choosing a programming language, they’re also committing to the ecosystem around the language, and the future support for that ecosystem. As noted above, enterprise development is not about being on the bleeding edge. Rather, if the ecosystem has support from an enterprise-friendly company like Microsoft, Oracle or Google, that is a big plus.

Also, from the enterprise manager’s point of view, it’s critical that the language and its ecosystem have deep support for enterprise databases (Oracle, Sql Server), enterprise web servers, enterprise authentication (AD, LDAP), enterprise data formats (XML) etc. It’s unlikely that support for the latest hotness will be their primary concern.

It should be future-proof

Given the longevity of enterprise projects, we want to make sure that the ecosystem and tooling will still be around and supported in, say, 10 years. If and when new platforms come along, you shouldn’t have to throw away all your code.

It should be flexible

And if you’re going to commit to an ecosystem, you’d ideally want to use it in as many different situations as possible (e.g. desktop apps, server apps, web apps) and different target platforms (Windows, Mac, Linux, mobile, etc).

It should make maintenance easy

Since the members of the team will probably rotate over the lifetime of the project, and most code will not be written by the current team, the dominant concerns are things like:

  • Comprehension: How easy is it to understand code that a previous team member wrote?
  • Productivity: Can we add new features quickly and safely?
  • Safety: If a change or refactoring is made, can we be confident it won’t break anything?
Choosing an enterprise language, part 1

With these requirements in place, we can use them to reduce our language choices.

  • For easy maintenance and safety most people agree that you need a statically-typed language. When you have a large code base with 10’s or 100’s of people working on it over the years, statically-typed languages support better refactoring, and compile-time errors can help prevent bad code from going into production. Sorry, PHP, Python, JavaScript and Clojure!
    Here’s John Carmack on this topic: 
    • The best of intentions really doesn’t matter. If something can syntactically be entered incorrectly, it eventually will be. And that’s one of the reasons why I’ve gotten very big on the static analysis, I would like to be able to enable even more restrictive subsets of languages and restrict programmers even more because we make mistakes constantly. - John Carmack, 2012
  • Software development is not the focus of the business implies that the emphasis is on stability and productivity, rather than, say, performance. This means that an enterprise programming language should not allow potentially dangerous actions such as control over memory and pointer arithmetic. Even if it can be done safely, as in Rust and modern C++, the effort to squeeze out the extra performance is generally not worth it. Letting the garbage collector take care of everything frees up time to focus on other things.
  • It should be enterprise-friendly so it’s no surprise that the favorites are:
    • Java (and languages on the JVM that can piggy-back off the Java ecosystem).
    • C# (and other languages in the .NET ecosystem).
    • Go also gets some points here because of Google supports it, and you can be confident that critical enterprise libraries will be available.

So, far no surprises. We have come up with the usual suspects, Java and C#.

If this was 2008, we’d be done. But it isn’t, and we’re not. In the last decade, there has been an explosion of new languages which are strong contenders to be better enterprise languages than C# and Java. Let’s look at why.

The rise of functional programming

Functional programming is the new hotness right now, but regardless of the hype, most modern programming languages are introducing FP-friendly features that make a big difference to software quality:

  • Higher-order functions replace heavyweight interfaces in many cases (the C# LINQ and Java streams libraries would not be possible without them).
  • Different defaults, such as immutability by default and non-null by default. Having these as the default makes maintenance and code comprehension much easier, because deviations from these defaults are explicitly signaled in the code.
  • Making effects explicit is emphasized by the functional programming community. This includes such things as a Result type for explicit error handling, and moving I/O and other sources of impurity to the edges of the application (as seen in the functional core/imperative shell and Onion Architecture approaches).
  • Finally, and most importantly, FP-influenced languages have algebraic data types. That is, not just records/structs, but also “choice” types (aka sum types or discriminated unions). In my opinion, these are essential for effective domain modeling. Of I course, I would say that, as I wrote a book on the subject, but I’m not alone in this view.

If we look at languages which support these features, we end up with the mainstream statically-typed FP languages (Haskell, F#, OCaml) and the more modern FP-influenced languages: Swift, Scala, Kotlin, Rust, TypeScript, etc.

As I said above, the rise of new technologies such as serverless means that enterprises will be willing to switch to these FP-influenced languages if they can provide a competitive advantage (which I think they do) and if the switch can be made with minimal disruption (which depends on the choice of language).

The danger of too much abstraction

Some FP languages (Haskell and Scala in particular) support some features that allow high levels of abstraction. Some people like to quote Dijkstra here:

“The purpose of abstraction is not to be vague, but to create a new semantic level in which one can be absolutely precise” – E.W. Dijkstra

That’s great, but I believe that in the specific context of enterprise development, too much abstraction can cause problems. If used too freely, it requires that all developers working on a project need to have the same understanding of the “new semantic level”, which is a burden on training and employability. All it takes is for one person to have too much fun with category theory in the code, and the code is rendered unmaintainable for everyone else.

That is, just as you can shoot yourself in the foot with low-level features, you can also shoot yourself in the foot with high-level features as well. For an enterprise language, we need to trim the top-end of the language capabilities as well as the bottom-end, and encourage an “only one way to do it” approach as much as possible.**

So I’m going to penalize Haskell and Scala at this point for being too easy to abuse.

** One of reasons people like Go or Elm as languages is because they are restrictive. There is a standard way of doing things, which in turn means that reading and maintaining someone else’s code is straightforward.

But how much abstraction is too much?

Are generics too advanced? 15 years ago, perhaps. But today it’s clear that it’s a mainstream feature. (The golang designers disagree!)

But how about lambdas? How about monads? I think that most FP concepts are on the verge of being mainstream now, and in ten years time will be commonly accepted, so it’s not unreasonable to have a language that supports them.

For me, in 2018, the “just-right” level of abstraction is that found in ML languages like OCaml and F#. In 10 years time things may be different, and we may be able to adjust the acceptable level of abstraction upwards.

However, I’m not convinced that more abstract, mathematical style programming (a la Idris, Coq) will ever be commonplace in the enterprise, due to the variation in employee skills. Yes, this could be solved with better training, or a certified-software-engineer qualification, but I’m not holding my breath.

Choosing an enterprise language, part 2

If we then filter these newer languages by the “enterprise” criteria above we end up with the FP-influenced languages that support .NET and the JVM, namely:

  • F# on .NET
  • Kotlin on the JVM.
  • I’m also going to add in TypeScript as well, as it is very well supported and meets the “enterprise” criteria.

To summarize the “why not language X” objections again:

  • C# and Java – These are OK, but F# and Kotlin respectively have better defaults (immutability), better support for effects, and better support for algebraic data types.
  • Swift – It’s well-supported within the Apple ecosystem but shows no signs of spreading into enterprises in general.
  • Ceylon – Kotlin has more momentum.
  • Haskell – Yes, Haskell does enforce purity rigorously, which is great, but that’s not the only component of programming. More importantly, there is no gradual migration path to Haskell – you are thrown in the deep end. That might be great for learning FP but is not suitable for enterprise, IMO.
  • Scala – Too many different ways of doing things is a disadvantage, I’m afraid. Kotlin is more enterprise-friendly.
  • OCaml – If you don’t need enterprise support, then OCaml is an excellent choice. But if you do, F# would be more applicable.
  • Go – Great for some things but not recommended for enterprise due to weak support for domain modeling with types.
  • Elm/Purescript – Front-end only right now.
  • Reason ML – Front-end only right now. Also, why not just use OCaml?
  • C++/Rust – If you don’t need performance, a GC’d language is easier to work with.
  • Erlang/Elixir – Great for high uptime, but not enterprise-friendly.
  • PHP/Python/Ruby/etc – I like Python a lot, but maintainability goes out the window when you have more than 10K LoC. As I said above, statically-typed languages are the only way to go for large projects.
What about higher-kinded types? What about type classes? What about GADTs?

Oh dear, none of the three finalists support them right now. I’ll let you judge whether this is a deal-breaker for enterprise development.

Picking a favorite

The three languages left (F#, Kotlin and TypeScript) are all good choices, they’re all open-source, cross platform, and enterprise friendly.

If you’re already using the JVM, then obviously Kotlin provides the best migration path. Similarly, if you’re using Node on the backend, then TypeScript is good (although trusting npm packages might be a problem).

But if you’re doing greenfield development (or if you are already on .NET) I believe that F# has the edge (and this is where I might be a bit biased!)

  • It has excellent support for low ceremony domain modeling.
  • It is functional-first, preferring functions and composition as the primary development approach.
  • Immutability really is everywhere – it’s the default for algebraic types and collections.
  • It has a wide range of capabilities. For example:
    • You can build microservices that support millions of customers. Here’s how did it.
    • You can write JavaScript in F# with Fable. For example, the F# plugin for VS Code, called Ionide, was built in F# and converted to JS this way.
    • You can develop full stack web apps (sharing the code between the front and back end) with the SAFE stack or WebSharper.
    • You can build mobile apps with the Fabulous library using an Elm-like approach.
    • You can build desktop apps with XAML or WinForms or Avalonia.
    • You can create lightweight scripts, such as build- and deployment pipelines. 
    • Another nice use for scripts is browser UI testing.
    • And of course you can do data science.

Of course, Kotlin can do some of these things and TypeScript some of the others, but I think that F# has the most breadth overall.

Extract from ScottW's note:

What is digital transformation?

Digital transformation is the way to transform the data provided by technology into relevant information that allows us to improve our business.

The digitization of businesses allows us to put data into context and share it with the whole organization.

Why does digital transformation fail?

Many companies interpret the digitalization process as a simple update of their technologies.

Without a previous cultural transformation, the digital transformation is unviable.

In other words, the focus of the digital transformation must be on people, not the technology itself.

The most common mistakes
Start without a clear objective

One of the most common mistakes a company makes as it moves toward digital business transformation is not having a clearly defined goal. The first step is to be clear about your main objectives and know the purpose of the digital transformation of your company.

Ignoring the Digital Transformation Opportunity

Many companies simply copy their traditional approach to the digital world. They create a digital equivalent to their traditional processes. The digital transformation of a company requires them to change the way they see their interactions with customers and the way they deliver value to them. It's much more than digitizing your documents. The old development practices of the past can no longer be applied. To implement a successful digital transformation you must offer new solutions and reconsider your development practices. Digital business transformation requires a complete rethinking of how the organization relates to its customers and how it delivers value to them. To take advantage of the productivity improvements offered by technology, you must be willing to change the way your business works.

Making change too fast

Digital transformation requires a certain sense of urgency; however, all changes must be made slowly and carefully. There is certainly a sense of urgency, but it is imperative that you plan and organize the required changes carefully to avoid mistakes that could harm your organization.

Disregard the participation of customers, suppliers and third parties

When you digitize, you must consider the people you deal with on a daily basis. If you do not wish to receive paper invoices, printed receipts and other materials in analogue format, you will have to involve stakeholders in your digitalization efforts.

Don't adopt the data solution

Digital transformation produces only a fraction of its true value when it is not compatible with a data collection solution. In addition to providing mobile forms that can be used in the field, the right mobile forms solution must naturally integrate with your company's digital workflow.

Do Not Include Employees

Digitization changes the core of the work that employees do. It is very important that anyone affected by the changes understands the importance of this transformation. In many cases, employees must be trained and kept up to date on the implementation of new technologies. This will make them feel empowered by the changes after the transformation. They must understand that digital transformation is paramount to the survival of the organization and that they must be part of that transformation.

The digital transformation of businesses is not just about building an application or website; it requires companies to change the way they see their interactions with customers and how they will deliver value to them in the future.

What is digital culture like?

Digital culture is one that takes full advantage of digitization to discover and exploit new opportunities for business growth, applying it to all areas. By using technology to improve performance, new ways of communicating and storing information are created. In addition, these new digital formulas make it possible to better measure everything that happens in the business, from equipment productivity to user satisfaction.


Digitization has become an obligatory process to be followed by any business that wants to survive in this digital world. But for this process to be fulfilled, it is essential to have a digital culture.

As a further step in the process of integration into the Spanish software market, and in order to strengthen the commitment to provide quality solutions, Virtusway has closed an agreement with Sage International. The software provider has registered an important evolution in its ERP, such is the case of Sage 200cloud, which is positioned as a leader in the local market. In addition, Sage 50cloud and X3 Enterprise Management complete its product portfolio, ranging from micro-enterprises to large multinationals.

When choosing ERP, you don't just have to consider what you need today. It's important to anticipate how you'll adapt to what you'll need tomorrow, and that's why Virtusway presents Sage solutions to its customers.

Sage 200cloud is not only an enterprise management program, it is a complete business control and management proposal adaptable to your current needs, but with a view to future growth. Its flexibility makes Sage 200c the ideal management software for medium and small businesses, whatever the sector in which they work.

Sage 200cloud will allow you to grow in an efficient, flexible and integrated way, so that you can control your business in a more practical, easy and agile way. It has a wide variety of automated tasks that help you save time and costs, always in accordance with regulations and laws. In addition, thanks to Sage 200cloud you will improve your decision making because you will be able to make them in real time and based on the analysis of certain data. Thanks to its multiple contracting proposals and the subscription-based payment method, it allows an adequate and controlled management of the investment, avoiding large initial disbursements. Pay only for what you need, with the confidence of knowing that if you need more functionalities, you can add them whenever you like.

In addition to the traditional ERP modules, such as Accounting and Finance, Purchasing, Sales, Warehousing and Manufacturing, and a series of advanced management modules in Customer Management, Customer Service and Marketing, Project Management, Contracts, TPV, Labor and Human Resources Management, Document Management, Treasury and Business Intelligence, Sage 200cloud gives you access to high productivity functionalities with collaboration tools via APIs such as the connection, download and automatic integration of bank notes, the electronic store or E-commerce, Sage 200cloud Laboral, etc...

Sage 200cloud also helps you improve the control and visibility of your business thanks to a modern, intuitive and well-integrated interface. You can navigate without menus and know where you are at all times.

Sage 200cloud is always aligned with advances in technology and application environments. That's why it's 100% compatible with the latest versions of MS Windows, MS Office and MS SQL Server.

In what degree of technological maturity is your company?

It is common these days to hear the words logistics and technology in the same sentence. The second is intervening so much in the business that there are almost no companies that can avoid it, but there are still some.

The following article aims to clarify and establish a positioning parameter for companies that feel they should advance in the technification of their logistics operations, but do not know where to start.

There are 4 stages according to the integration of technologies in each one:

  1. Intuitive
  2. Computerized
  3. Integrated
  4. Avant-garde

Level 1. Intuitive:

As the name implies, companies at this level do not have computer systems that allow them to make rational decisions. They are managed by the experience of their directors and by subjective perceptions of the situation. The information is stored in spreadsheets and does not reflect the reality of the business, is a mere record that is sometimes completed only by tax obligations.

Distribution of chaotic warehouses, without documentation or planning. Archaic equipment. No connectivity with other areas of the company.

Level 2. Computerized:

At this level we will find management software (ERP), inventory control software and distributed applications to meet the needs of each area. The drawback at this level is the communication and information flow between the different sectors of the company.

The available infrastructure consists of some simple shelves which allows to organize a little better the warehouse, but it does not assure the optimal use of all the spaces and resources. Systems can be found that notify the lack or non-existence of products to the corresponding area. Barcodes are used to identify products individually.

Second level companies lose business opportunities due to their lack of efficiency and depend on partners or third parties to carry out some operations.

Level 3. Integrated:

At this level are many companies that have already perceived the need to technify their warehouse in order not to lose competitiveness. There is an EMS (WMS) that allows optimizing the use of resources (time and space) in a dynamic way, that is, providing a quick response to business needs and including all actors in the supply chain.

The infrastructure is much more advanced than in the previous ones, we can see voice picking systems, pick to light, robotic picking carousel, RFID technology.

The third level is characterized by the quality of the information, the KPIs are defined according to the business objectives and are used for decision making.

The degree of customer satisfaction is very high, accelerating the ROI. This means that the work done to improve the logistics operations of the company is perceived by the customer as an added value, which translates directly into conversion and loyalty of the customer.

Level 4. Avant-garde.

Level with a great volume of work. Availability of the latest technologies. Artificial Intelligence and Machine Learning to plan and optimize operations. Assistance to manual operations with Augmented Reality, highly robotized installations, demand simulations and assistance in strategic planning with Business Intelligence and Big Data.

At this level are the forerunners of breakthroughs that move towards the lower levels. It is also the most competitive level, where permanence and profits depend on the speed of adaptation to changes.

Fourth level companies determine the rules of the game and impose increasingly demanding challenges on their competitors.

The first step to propose an improvement is to know where the starting point is, so we urge you to evaluate your company and then identify the way forward.

Find more information in the following article:

The Catalan city awaits the arrival of one of the most important logistical events of international level, the 2019 edition begins next June 26 with a full agenda of assemblies, congresses and exhibitions.

SIL Barcelona, the leading trade fair in logistics, transport, intralogistics and supply chain in southern Europe, organised by El Consorci de la Zona Franca de Barcelona, aims to consolidate itself as the main annual trade fair in southern Europe and the Mediterranean in which the entire supply chain is represented (transport, logistics, distribution, intralogistics, warehousing and new technologies) and which brings the entire chain together for 3 days in a single event, becoming an international business bridge between Europe, Latin America and the Mediterranean.

Among the most outstanding events we can mention:

  • Meeting and assembly of the Association of Free Trade Zones of the Americas:

    The Association of Free Zones of the Americas (AZFA) is a non-profit organization that in its regional context promotes and defends the Free Zone regime through integrations, research and cooperation with the public and private sectors of all Latin American countries. Currently, it is constituted as the most important regional guild of Free Trade Zones and represents its affiliates in 23 countries on 2 continents, bringing together more than 600 Free Trade Zones with more than 10,000 companies installed in them.

  • 3rd Edition e-Delivery Barcelona Expo & Congress:

    The aim of the event is to be the new approach to the online channel that seeks to respond to the eDelivery strategy of companies and put in contact suppliers and retailers and e-tailers from Spain, Europe and the Mediterranean. 

  • Congress of Freight Forwarders and Logistics Operators of Latin America:

    ALACAT is the Federation of National Associations of Freight Forwarders and International Logistics Operators of Latin America and the Caribbean. Founded on June 12, 1982.

  • 3rd International Congress of Authorized Economic, Customs and Logistics Operators:

    The purpose of the 2019 International Congress of Authorized Economic Operators: OAS in Global Supply Chains is to support all participants interested in OAS standards, the international association of OAS member organizations and their affiliates to participate with opinion leaders on AEO's role in commercial management, e-commerce, security and integrity, as well as to promote compliance with an appropriate practice.

    5th World Congress of Free Trade Zones

Check the complete address book here

  • Space optimization

    The inadequate planning and organization of the warehouse results in multiple problems. It is common for companies to grow and start using free spaces without taking enough time to planning first. Special sized items are incorporated, with specific storage requirements, and the need for warehouse mapping becomes increasingly apparent.

  • Easy access to stored products

    Speed up picking, meet order preparation times, these variables depend on precise knowledge of the SKUs' location. Tools such as voice picking or pick to light can optimize those processes, but it must be clear that previously, it is necessary to identify the location of each item and record it correctly in the database.

  • Minimum possible stock (Just in time)

    Implementing systems that help predict our stock movements will prevent us from confronting serious logistical problems: own or customer shortages, lack of personnel, excessive workload, etc.

    Having a warehouse management system will allow minimizing costs in storage area without losing supply capacity. Similarly, changes in demand can be easily followed by the logistics operator, providing an agile response to the final customer.

Discover how we can help you

Please leave us your question and one of our assistants will contact you asap.