Language-Ext 2024 Roadmap #1289
Replies: 4 comments 8 replies
-
I am really excited to hear, that you are investing more time and moving forward with If I understood correctly, then |
Beta Was this translation helpful? Give feedback.
-
Glad to hear some news, as I thought something bad happend recently that caused radio-silence. I've accumulated several questions during this time that I would like to ask you:
What do you think about F*, proof-oriented systems and dependent types in general? Do these have any chances to become more popular in the future, or it way too academic stuff just for researching?
|
Beta Was this translation helpful? Give feedback.
-
Hoping for a book from you for years, obvious pre-order. |
Beta Was this translation helpful? Give feedback.
-
The blog is a great idea, I am your latest subscriber. Interesting approach to the HKTs.
We are just starting a new project and hopefully we will be able to convert to v5 once its officially out.
From: Paul Louth ***@***.***>
Sent: Friday, May 24, 2024 3:22 PM
To: louthy/language-ext ***@***.***>
Cc: Pascal Charbonneau ***@***.***>; Comment ***@***.***>
Subject: Re: [louthy/language-ext] Language-Ext 2024 Roadmap (Discussion #1289)
Thanks for the support 👍
I know that if I sit down to write a book it'll probably never happen. So, what I'm doing is building up articles on my blog<https://paullouth.com/> - this has immediate value to users of the library.
I am hoping that I'll get to a point where I have enough content, so that I can then adapt it into a book.
This seems like an approach that's got a greater chance of succeeding and if it doesn't there's still plenty of content on the blog.
—
Reply to this email directly, view it on GitHub<#1289 (reply in thread)>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/A7WZV4YWARFZGWKZOJMAZO3ZD6HLZAVCNFSM6AAAAABBYHLYNKVHI2DSMVQWIX3LMV43SRDJONRXK43TNFXW4Q3PNVWWK3TUHM4TKNJRGAZDI>.
You are receiving this because you commented.Message ID: ***@***.******@***.***>>
|
Beta Was this translation helpful? Give feedback.
-
After nearly 19 years I have left my full-time role as CTO at Medical Management Systems (although I'm staying on as a non-exec director and technology advisor to the board) and am now investing more time into personal projects, including bootstrapping a new idea I have for my next startup.
History
Much of the reason I built language-ext was to make programming in C# more robust, less error prone, and to enable declarative coding, which leads to easier long-term maintenance of complex code-bases. Language-Ext started as a pet project that then became vital to the success of meddbase.com which grew to over 10 million+ lines-of-code, and is probably used in every
.cs
file in the project.Seeing the pain points of large, complex software, up-close allowed me the insight to see why a project like language-ext is so needed - but it also allowed me to be very opinionated on what it is and how it should be built.
There aren't many people who have managed an 18+ year long project from the first line of code to a behemoth and kept the thing on track through that period. And there's no courses or reference manuals on how to do it either!
Industry
Many applications written today start off as quite simple, but they are also on the 'this project will last forever track'; forever growing in complexity, year-on-year (I'm thinking web-applications, phone-apps, etc.). And so there are many more projects that will fall into the 'complexity well' and will need to start looking at how to manage that cognitive load before becoming unmanageable.
What we see in the industry is that people are trying to deal with the complexity problem through micro-services and lately AI co-pilots. All these 'solutions' do is create new complexity problems. Micro-services allow for relatively easy containerisation of code but swap it for deployment complexity, weak typing, integration and synchronisation issues. AI co-pilots make code easier to write, but reduce the overall understanding of the system by the human writing it, adding cognitive load eventually. Writing code is not the hard bit: maintaining it forever is.
Not that there's no place for these things and AI will be a big part of the future of software development, I'm sure, but it doesn't fix the problems: we're still writing code like we did in the 90s - for simple applications, used by 1 person, on a single core machine. The solutions put in place to deal with the distributed computing landscape, we're now in, are sticking plasters at best.
Me + language-ext = ?
Now that I have left that project you may be concerned that I won't be continuing the support of language-ext. That isn't the case and I will be using it for my new projects which will take the ideas of language-ext waaaay beyond where it is now.
However, because I am now not in a full-time role, I will be trying to make language-ext viable financially, if possible. I have a bit of a runway, so it's not essential that it pays immediately, but within a year I'd like to see some movement with it.
That will not mean switching the licence of the
Core
of language-ext and all of the existing libraries from MIT. The MIT licence will stay, but I will be looking at a Dual-licencing approach for the new functionality I plan to build around the core of language-ext.Why can't I just rely on donations? Well, language-ext is accruing about $50 per month at the moment. And so, I can't see the donation model working reliably going forward.
However, if you are reading this and you are able to sway the decision makers at your organisation to set up a regular donation then it would be very much appreciated! If the needle moves significantly before I deploy release versions of the new functionality, then I may well hold off on the more commercial licencing.
Other non-code things I'll be considering are:
Advisory and mentoring - if you use language-ext in your organisation and you think you could benefit from some of my time with your team then I will be looking into consultancy and mentoring programmes. Feel free to email me at:
[email protected]
Patreon based courses/tutorials
A book - on FP architecture leveraging language-ext
Dual licence
This will be defined soon, but I will be looking at something along the lines of:
Core
,CodeGen
,Parsec
,Sys
,SysX
,FSharp
,Rx
,Transformers
The code will always be open-source it just won't always be free (i.e. the source is open, but using it will require a licence for commercial use).
Roadmap 2024
0. Bring higher-kinded types and transducers to
LanguageExt.Core
- licence: MITThis is a massive refactor to bring in higher-kinded types to allow some of the more general FP programming you see in languages like Haskell. This will include new functors, applicatives, monads, and monad-transformers (for real, not with extension methods)!
You can read more about it here as I build up to the v5 release.
1.
LanguageExt.Meta
- licence: DualThis will be an advanced dependently-typed type-system and runtime. This is very much going to be the foundational architecture of much of my future work.
I have a strong belief that software-engineering becomes more robust when we use well-defined types (which is much of the reason for language-ext to exist!), but C#'s type-system isn't expressive enough to take this as far as we could with other languages like Idris (or other theorem-prover languages).
However, those other languages are really out of the reach of the average dev working in industry. Either the ecosystem isn't there or the employer is not willing to move away from a mainstream language (like C#). Even a language like F# is not particularly expressive once you get past discriminated-unions (and won't ever be, if comments by Don Syme are anything to go by).
I want to create something that absolutely helps with very real issues in developing commercial and enterprise software:
These questions matter at every scale of application, from the smallest to the largest, but they become more acute as the complexity of an application grows. Having tools to manage that from the start of an application's life will make that growth much more manageable.
Something that I feel we get with the more expressive languages (Haskell, Idris, Coq, etc.) is an 'academia tax' - whether it's the lexicon used, the attitudes of the community, even just the things that the community tends to obsess over doesn't always overlap with the real world problems etc. Not that this is bad, it just doesn't talk to the average developer working in the real world of commercial software.
I want to make this stuff accessible without disappearing into theory-land; which won't be easy, as some of this stuff comes directly out of Category Theory, but if we can all agree that more expressive types leads to more robust code then that's a good start. Finding the balance between the theory and the practice will be essential.
Features:
1
,"hello"
, etc.Unit
in language-ext. It is a type with exactly one value:unit
. So, you can think of"hello"
as a type with exactly one value:"hello"
, which is different to the type"world"
. But you could then define a type:"hello" | "world"
that is a type that accepts one of two values (likebool
but with different constants).One thing that people often don't think about when using languages like C# is how much effort you have to put in at runtime to refine your types. If you think about how you might write C# today; every time you write:
What you're actually doing is taking a poorly spec'd type and trying to refine it at runtime. Those
if
statements are part of the type itself!. You just don't realise it! Or, looking at it another way, you're creating a new anonymised sub-type.We see this with the nullable-references feature in C#, where this:
You can see that the type has been refined by an
if
statement. It's insane when you think about it, because it means the type you pass around changes shape without changing its identity. It may well be a pragmatic solution for a C# that previously allowednull
to propagate and causeNullReferenceException
time-bombs., but we can do better by building a type-system that has proper refinement constructs.This system aims to be the ultimate validation system: never allowing bad values to exist and leveraging propositions to refine the types into a their most minimal form.
What you could use this project for:
/v1
endpoint, automatically. This can facilitate partial rollouts of microservices, for example, or make backwards compatibility something that's trivially easy to support, with little overhead.LanguageExt.Meta
as the virtual-machine for your DSL allows for a richly-typed DSL that is also sandboxed - all you have to do is write the parser for the syntax (and you can useLanguageExt.Parsec
for that!).2.
LanguageExt.Serialisation
- licence: DualEach data-type in language-ext will support transformation to-and-from
LanguageExt.Meta
types. This will mean, for example, types likeEither
,Option
, etc. get represented as real union-types inMeta
(which C# can't do properly right now).A set of serialisation libraries that convert to-and-from
LanguageExt.Meta.Type
will then be developed:LanguageExt.Serialisation.Newtonsoft
LanguageExt.Serialisation.System.Json
LanguageExt.Serialisation.XmlDocument
LanguageExt.Serialisation.Protobuf
Meaning that any C# type - that provides a conversion to a
LanguageExt.Meta.Type
representation - will automatically be serialisable/deserialisable with any of the above libraries (and any future ones added).This is super beneficial as the serialisers can stay static and written - no need to update them, and serialisation of all types are consistent - meaning that any tooling that leverages the output doesn't end up dealing with weird edge-cases. Serialisation is often fraught with problems due to the untyped nature of the transformation, but this will make all of that go away.
3.
LanguageExt.SourceGen
- licence: DualThis will be the successor to
LanguageExt.CodeGen
. A perfect example of whereLanguageExt.Meta
will be useful is for source-generation. The currentCodeGen
project is quite messy and ugly and is closer to a text-templating tool than anything that fundamentally understands the types it consumes and generates. That lack of understanding of the types severely limits the scope of any code-generation.What I want to do is create a toolkit that works with the type-system in
LanguageExt.Meta
, to projectMeta
types into C# source-code. For anyone that's used C# Source Generators, you will know that it can read existing C# code and use that to generate new C# code. But a layer on top of that could read C# types intoLanguageExt.Meta
types, and then use projections (morphisms) to generate newLanguageExt.Meta
types, which can then be projected back into C#.This allows the Source Generator to do type-checking with a type-system that is much more powerful than C#'s type-system and to do transformations that would be extremely complex with the existing simple C# source transformers.
As well as existing C# types being imported into the
LanguageExt.Meta
type-system, we will also allow, non-C#, scripted types that can support more expressive-types that leverage higher-kinds, ad-hoc polymorphism, but also dependent-types to be imported and then projected.These core tools can then be used to easily build:
But, the big point is not so much what projects I can provide, but that the tooling will exist for you to generate complex types without having to deal with Roslyn and the crazy API for C# source-generation: Meta-programming on steroids.
Another major benefit is that because
LanguageExt.Meta
is essentially leveraging lambda-calculus, we can also optimise the generated code, using Beta-reduction. Beta reduction is the process of invoking the (type) expressions to reduce to their most minimal (and therefore most efficient) form.Once in [the more expressive form of the
LanguageExt.Meta
type-system] more complex code-generation can happen because of the ability to infer and transform more reliably using well-known techniques like theorems for free. This just isn't possible with the current approach to code-gen (well, not easily, and is likely to be error prone).Other features of
LanguageExt.SourceGen
will likely be:LanguageExt.Meta
types, and it generates an API surface for you that properly validates data in and out of your system. The types can then be used in any audit documentation to prove correctness.Also, all source-gen'd types will automatically support transformation between the C# type and its
LanguageExt.Meta
type equivalent. Which means any additional functionality built to support theLanguageExt.Meta
type-system will automatically provide extra capabilities to the generated-types. The obvious first example is serialisation, but the scope is absolutely enormous!Conclusion
Because I will be using these new capabilities to build the bigger idea that I hope to be my new startup, I am committed to all of them - but just need to keep an eye on my cash in the meantime. Being full-time on language-ext and some of the bigger ideas for improving software engineering will pay dividends for everyone who uses language-ext. I wish I could talk about the real big picture project right now, but I'm going to keep that under wraps for the moment - as I still have a lot of typing to do!
So, please donate if you can afford it. If you use it at work, please ask them to donate also.
And, if you have any thoughts, ideas, or questions about this roadmap or any of the features, please let me know.
Beta Was this translation helpful? Give feedback.
All reactions