How to use Functional Programming with Clojure in Companies?

Heloisa Carbone
Senior Software Engineer
Automatic Summary

Unlocking the Potential of Functional Programming with Clojure for Modern Businesses

Hello and welcome to this exploration of how functional programming—specifically Clojure—can revolutionize the way companies approach software development. Eloisa, a software engineer from New Bank, shares her insights on leveraging functional programming within the enterprise space.

Why Is Functional Programming Important?

Functional programming isn't just a programming paradigm; it's a way to enhance code stability and predictability. Here are the key principles of functional programming that every developer should embrace:

  • Immutability: This principle ensures that state changes are carefully controlled, thus reducing unpredictability in code.
  • Functions as first-class citizens: In functional programming, functions are used as arguments, return values, and the basic building blocks for composing software.
  • Pure functions: Just like a mathematical function, a pure function guarantees the same output for the same input, simplifying testing and maintenance.
  • Recursion over loops: To handle lists and collections, functional languages favor recursion to simplify operations on data.
  • Expressions over statements: Functional programs prioritize expressions that return values, providing greater control over program flow and easing the debugging process.

By adhering to these concepts, functional programming provides a solid foundation for reliable and maintainable code.

Challenges in Functional Programming

Despite its advantages, functional programming presents challenges such as handling shared state and side effects, which need careful management to maintain code quality.

The Rise of Clojure

Clojure, created by Rich Hickey in 2007, emerged to offer a functional programming language that is compatible with the enterprise ecosystem. It's a modern Lisp dialect that runs on the Java Virtual Machine (JVM), ensuring interoperability with Java and accessibility for developers and companies alike.

Key Advantages of Using Clojure in Business

  1. Concise and efficient coding: Clojure code is typically more compact and quicker to write than its OOP counterparts.
  2. Exceptional test coverage: The language's design facilitates robust testing, potentially streamlining the QA process and saving costs.
  3. Interoperability with Java: Clojure's compatibility with the JVM means that existing Java libraries and tools are readily available.
  4. Strong community support: A vibrant community ensures good documentation and support, making it easier to implement and solve problems.

Clojure is notably beneficial for reducing code verbosity, enhancing test coverage, saving money by potentially reducing the need for additional QA processes, and providing access to a vast array of Java libraries and tools.

Recommended Ways to Implement Clojure in a Company Setting

To successfully integrate Clojure into a business, consider adopting a unified architecture across services to facilitate automation, scalability, and collaboration. The development team's familiarity with the language's environment and adoption of architectural patterns that promote predictability, like the hexagonal architecture, are also important.

The Power of Continuous Delivery

The practice of continuous delivery, which encompasses automated testing, building, and deployment, is critical for modern software development. This enables rapid and reliable production updates, underscoring the need for a well-organized development pipeline.

Onboarding Engineers to Clojure

When it comes to onboarding new engineers to Clojure or any other programming language, here's how to make the transition as smooth as possible:

  • Utilize self-service online courses for conceptual learning.
  • Engage in mob programming sessions for hands-on experience and quicker learning curves.
  • Appoint a designated buddy for each newcomer for personal assistance and to promote team integration.

By focusing on logic and problem-solving abilities rather than specific language expertise, companies can foster a versatile and adept workforce capable of adapting to Clojure or any new technology stack.

Final Thoughts and Resources on Clojure

Clojure might seem daunting at first glance, but its accelerated learning curve, simple grammar, and supportive community and documentation make it an advantageous choice for forward-thinking businesses. If you're looking to dive into Clojure, the book Clojure for the Brave and True is an excellent starting point.

The insights provided today on functional programming with Clojure aim to empower developers and businesses to embrace this paradigm, driving innovation and efficiency in software development. Thank you for your attention, and I'm here to answer any questions and provide further guidance on harnessing the power of Clojure in your operations. May functional programming be ever in your favor!


Video Transcription

Hello, everyone. Um I appreciate you being here today. It's a pleasure to be once more here in this amazing conference. And I'm Eloisa, I'm a software engineering at New Bank.And today I brought a topic that has been part of my life for the past four years in a different way because normally I do it very technical and all. But today I brought a little bit about the function of programming with closure, but more applied to how to use at companies and all. So I hope you enjoy and learn a little bit about it. And this is pretty much my view about it and how I see it being used uh in the companies that I've been working. And also it's something that I enjoy and appreciate a lot and to start understanding how to use it and all and the advantages I want to show you a little bit about the guidelines and concepts of functional programming because I think it is, it's really important to learn a little bit about why uh this is, this was chosen to better understand why we could use it to better improve our development and our way of doing business at companies.

So the first thing that we have with functional programming that we truly want to have uh to seek on those things is that we want to have immutability. So what's the your ability? Right. So we don't want to have things changing over time in the code. So because in that way, we are able to predict what's happening and don't lose control over time of the states of the code. So it gets better for you to understand what's happening and where the things are happening, what's really difficult sometimes in other types of paradigms.

Also, as the name of red, say functional programming, we want to have functions first and we want to use them as everything that we can. So as arguments as return on the functions as an integration uh of a composition of things, and also we want to have those functions as pure as they can be and what are pure functions, right? So imagine the mathematical expressions, remember your time at school and that you have like an that would say, oh I have this X plus something that would return and why and all the time that I put an X equals evaluating all the time this would generate exactly one Y. So this is the idea of pure functions once I pass something, I know exactly what the return will be. So the idea of having those pure functions is to be able to predict what's going to be returned at its stage. And this is really helpful for us because we are able to create tests and guarantee that everything that we want to be happening there. It is. And also the idea of having functions, compositions is that I can realize on having like multiple functions that are going to do small parts of the, the functionality that I need.

And then I will use them as a composition of functions instead of doing everything in a single place in which I'm going to lose control. So all those things are quite important with functional programming and are something that we need to follow to have like a good implementation.

And also when we talk about collections and lists. So when I have like a great amount of data to be processed and everything uh in functional programming, we prefer to have recursion over loops. So when I need to iterate over collections and do stuff with those collections, which is pretty much almost the time uh that we are doing things we are dealing with it. Uh In functional programming, we do this using recursion. And I know that you might be wondering that recursion um in many programming language is something very costly because it, it's not like really fast. But what we talk about functional programming, the language that implemented this paradigm, they have like a much more automated and improved version of recursion that is really fast and works uh as, as good as the looping. And it's really rare to use looping in functional programming.

So this is something very interesting and it's like a change of mindset that works pretty well. Also, uh we do prefer to have expressions over statements. So the difference are uh we want to have functions that return evaluate or something. Uh statements are functions that don't return anything.

So the void functions that you might know are the statements and expressions are functions that return something. So in functional programming, most part of the time we want to have functions and everything that we do returning stuff because in this way, we are able to predict, as I already mentioned, uh what's happening there and if it's going to the right direction, because in the other way with statements, you lose control over time because you don't know what's happening there and you don't have like a way to guarantee that what you need is happening.

So all those things are something that we truly need to take care when we are doing like functional programming to have like a good quality of code and to improve some stuff that we're going to see later on that help the business process to be better. And also as in any other paradigm, there are a few things that we try to avoid. When we try, when we talk about functional programming, there are two things that we need to, to pay attention it's not that we cannot have, but it's something that we truly need to pay attention and do the best way that we can. So the first thing is share states. So this goes uh pretty close to the immutability. So as we wish to have like only variables that don't change over time and that modify the value, only create new ones with shared states, we have the opposite, right? So this is something that we try to avoid as much as we can because this is not reliable and many parts of the time you can do it in another way. So shared states are something very delicate when we talk about functional programming because we truly don't want to use it.

There are a few thing, there are a few ways that you can do to have it and it's normally really isolated from all the other parts of what you're going to program. But we try to avoid if we can. But if not, there is like a possibility to do it isolated and separated for the whole context and being able to at least um try to see if things are happening as expected. And the other things is side effects, what are side effects? This is a very well known word. The most part of the people talk a lot, but sometimes we don't know exactly what they represent. But in computer, when we talk about side effects, uh the idea is to have things going outside of your service. So for example, when you connect to a database, when you update stuff in a database, when you do an att P request to another service, or even when you print something on the screen or when a Neer is from in your service. So all those things that, that are not expected and that go outside of your project, it's a side effect. So it's really hard for you to say, oh, try to avoid to have side effects. Otherwise you would have like a totally state full service that wouldn't do like anything, only treat like data at the moment and it wouldn't be like worthy, right? So this is something that we know that we have like to handle all the time.

But with functional programming, we try to isolate it and the way of doing it is to creating a nicer texture, a software texture in the service that we are creating in which we are able to at least isolate the side effects and be able to at least uh test it with an integration test.

We are not going to be able to do like units and testing. As I was mentioned, like, I know exactly what's going to happen, but I'm able to predict at least that the side effects happening. So if I expect the side effects to happen, I'm able to test that the side effects happening uh for sure, we are not going to be able to test efforts only if it is like uh an effort that should be happening if you did something, but we are able at least to isolate it in a very nice way and try to do it as smoothly as we can.

So now that we talk a little bit about those guidelines and concepts that are pretty good to be followed. When we talk about functional programming, we can deep dive a little bit in closure and why, how was this uh functional programming language created and why we should use it and the advantage of it. So just to illustrate a little bit about the history of closure, because I think it's really interesting to know from where it come from. Uh at least from my concept, I think it's really nice for you to know what your handle. So closure is, is a really young language. So it was released in 2007. Uh and it, it was created by Richie Hicky, which uh it's this is a fun fact but RTI created closure in his period sabbatical period life of life. So imagine uh in his free time, he decided to create this amazing language. And the idea was to have like a functional programming language that would be suitable for companies to use. Because in the past, it was really rare to have functional programming language being used among the companies.

You might have noticed that most part of the companies use like Java Python and all those other more common language that are not of the paradigm of functional programming, they are more of object oriented parallel and all those other uh paradigms. So closure uh is a functional programming language and even though functional programming language are very old, so we have like functional programming language since the fifths which is like quite close with the object oriented, which is the much used one nowadays. So this idea of having like a language that would be uh acceptable by companies was something that richie expected to have and how he would do this, right? So the closure was viewed from the top of the JVM, which is the Java virtual machines. So the the environments that runs Java and the computers and all and has all those stacks and with, in this way, it would be like much more suitable for anyone to start using a functional programming language. Because in the past those functional programming language were mostly um directed to the academy. So normally you didn't have this at courses at graduation, you didn't have like contact uh except if you want to. So sometimes someone that was doing like a master degree or a post graduated degree, it would like ST those functional programming language and would try to implement things using it and evolve those language because it was really hard to have those language running your machine because you didn't have like the environment settled.

You have like to do everything from the start. So that's why the companies didn't want to have this because they would have to hire someone that was an specialist to create the whole infrastructure to, to run of this new language that were not even like taught at school. So it would be like hard to have people hired to do it. So that's the idea of closure to make it simple and more acceptable by the companies and also easier for the the people to learn. And closure is also an open source. So you're able to see it's coding and everything and and it is at least dialect language. So what's Lisp writes? This is this weird word but this was the first functional programming language created and it is a language that was really spread among the academy and among the world for the people that like it to the functional programming because it brought like many innovations and many of the guidelines and concepts that I mentioned were brought by Lisp.

And also Lisp has a very interesting grammar which is uh an idea of using parenthesis as the limiters and runners of the code. And this is what closure follows and has the same grammar, the same structure and some guidelines that it, it, it express as well and also it evolved over time but has Lisp as its base. And this is really nice. We also have like many other programming language that use this Lisp dialect and uh are quite like similar in this way of thinking. And this was one of the benefits also of closure because it's really easy for you to learn its grammar. And now that I talked a little bit about its history, I think we can get more in the business part and how to use it at companies. And first of all, I want to talk with you. Why should we use closure? So what are the advantages of using a so different language that most part of the people haven't heard of it? Like for a whole time? So it's like the first time. So why would I choose the third different language? So first of all is that closure is a really objective language. So different from Java, for example, that has a really verbose uh coding closure is very direct to the point. So you have like to write short lines of code to have things done.

And this is very good because you're able to create many things and improve uh services like in a short period of time. So coding is fast. So this is uh uh advantage of it. The second thing is that it is outstanding in test coverage. And I think this is like the most beneficial thing that we have with functional programming in general. And closure brought it pretty well, which is this ability for you to test and rely on the testing that you have. Because most part of the time, if you take those big companies in consideration, you normally have a development team and then you have a quality assurance team that's going like to test everything that the development team has done to see if everything is ok and it is like ready to production or something like this.

When we have a really good test coverage in, in service, we might not need to have this quality assurance team. So it saves money for the company. And this is something that I already seen working pretty well in a big company as well that you disclosure. And it's amazing because you're able to truly rely on the test that you have on the service. So to guarantee that this is happening as you expect, and this is mostly because of the guidelines and concepts that I mentioned at the beginning because you're totally able to isolate things in your service and to test each part as it should and also to do a whole integration thing that's going like to predict if the side effects are happening as expected and all.

And this is pretty good and pretty awesome because you can integrate this in a integration that's going to run this all the time that you uh that you have like a new feature or something to guarantee that everything is still happening and happening the right way. And then you can just like skip this level of quality assurance of someone taking a look at if things are correct and just go to the release two clients. And in this way, the company is saving money because it doesn't need to have like these other team to do it. And this is quite amazing. And, and I think it is like a very important uh thing to have. And also uh another thing of closure is that it has full interoperability with Java. So you're able to have all the libraries, all the available coding that Java has uh to be able to use on closure because as I mentioned that it was used on the top of the JVM, we are are totally able to access whatever we need in the Java collections, in the Java environments and classes and so on.

And of course, there are some that we won't need like to use it. Uh I can say that most part of the time we don't need but imagine like uh a scenario in which you need to do like something very specific. And that would take like lots of time to do it in this new language because you don't have. But in Java, it's already done and has like I read a library available, for example, something related to cryptography that Java has already like created and has like some uh public libraries that you can use. Uh Of course, uh I'm not going to spend like lots of time creating this for the very uh start and closure to, to do it and use once if I can just like use this interoperability with Java and use it and run. And that's OK. That's fine. So this is very interesting because you have access to everything that Java has. So it's a huge environment. So today, Java is probably the most used uh language in the world. Uh It's probably like losing some space for Python, but this is still like very used, highly used. And so this is quite good because you have like uh this access wherever you meet. And also uh the last advantage that I want to give here is that it has like closure, has a really strong community.

So different from other language that sometimes for you, it's really hard to find documentations to find uh related articles or to have like your questions answered. Closure is different because the uh the community it's really involved in, in wanting this language to increase and, and be more used.

So whenever you need something, it's really easy for you to find out answers for that, that's quite cool. And also the documentation is pretty fantastic. It's really simple and direct to the point. Uh I can say that I never had to search for something that I couldn't find or that someone hadn't like answered to me. So this is quite good because there are sometimes like a few language that are created that you have like no control at all because there's no one using and there's nothing at the at the internet for you to use, accept the documentation that are pretty exense and and have like any everything that you need to.

This is quite helpful. And also there are like uh many people like trying to improve it even better and it's a language that is still uh running and people are doing things to make it better even better. So this is quite nice as well. Uh I think closure is a really strong language uh to be used like in many, for many programs. And how can we use closure? Right. So now that we talk about the adventures and so on, so how we could like implement this language in our, in our company and make it like really good and really reliable and make things like happen like easier and so on. As this is a very different uh language, I think the companies might wonder why will I choose it if it's going to be so hard to have people coding in it? And I can say to you uh for now, I will get to this later, but uh you don't have to hire people that know the language that you use. And I think this is work for all the language. You have to hire people that are able to have like a good logic and that are able to learn uh because it's going to be like better than to have a specialist in the language itself. But now let's get to how can we use closure in a company.

So uh the first thing is to have the company's architecture pretty well define it. So first thing is uh a good way to use a language is to have your whole uh infrastructure and Microsoft architecture using the same language. So I would say that an architecture created with the same language would be like perfect because you're able to automate things. So you're able to automate the creation of the service, you're able to automate the infrastructure that's going to run the service to deploy the service and have this release. So if you have um I put here nine percent of the Microsoft using closure. If you have like your most part of your service using the same language, it's something very good for you because you have more control over it. Of course, there are the benefits of having like different language to solve other problems because sometimes you have like a language that better solves the problem and the other fits better to other things. And this is quite fun to have like uh what be the technology that be fits to the be the best the problem that you have. Of course, this is amazing.

But if you take a look at scalability of the company, this is really hard because you're going to have like multiple technologies being used with different uh teams. And then once you need like someone for this team, you cannot like um rearrange the persons, the people that you have in the company you need, like to hire people that know about the language itself and so on. So when you have uh more uh unitary uh chosen way of language in a company, it's easier for you to escalate conform the necessities of the business. So this is something very interesting to take a look because many people say different things about it. But this is my idea, my view, I think it is really important for you to define uh the one that fits better for most part of the problems because it's easier for you to rearrange teams conform you need. And also when you have all those environments created uh a good thing is to choose a single microservice architecture. So now I'm talking about the internal architecture of the service because even though I use the same technology, if each team does does things different. So I organize my code in different ways. Sometimes it's hard to move people around because they are going to need to learn from the very beginning, not only the context of this new team, but also uh how things are done in the technology itself.

And when you define a good software texture for your internal service, uh this creates a much more complex way of escalating the teams because you're able to move people, but also to create a more concise and reliable environment because you're totally able to have like things created to guarantee that everything is the most secure that they can be.

And this is quite amazing. I'm going to talk more about it. Uh Given a suggestion of an architecture that I think fits really well with closure uh in just a second. And the last thing that I want to say about the company's architecture is when you have like this whole infrastructure created and so on, it is really nice to have a continuous delivery integration done and created in a really nice pipeline because in this way, it's going to be much easier for you to have things running and everything integrated.

And this is really beneficial for the company because when you have this whole thing already automated, uh you have like few problems in the past, you know, so it's very easy for you uh to have things better done and improved. And this is quite like good for the company itself. And the suggestion that I bring here about the architecture, the internal architecture of the Microsoft. So the software architecture is the diplomatic texture. I think this is a very different um architecture for most part of the people.

I don't know if everyone has heard about it, but this is an improvement of the Exon architecture, which is the parts and adapters architecture. I think this one is the most famous. So what's the idea of the Exon architecture for those that haven't heard? So this draw here, which has the Exons, the Exons represents uh service. So this is it Exon is a service. And the idea is how not only the internal way that you configure your service but also how it communicates with the others. So this idea of ports and adapters is that you're going to have like multiple ports in your service that are going to be the contact to the other services and to external things that you're going to. So for example, an HTP request to other service is a port. Uh A message being sent through CFC, for example, is another port um input or output with a file is also uh a port. So all those things are are going outside of the service or for me or for, for the connection to other service ports. And I want to have in this way, uh an adapter in each of those ports to guarantee that the things that are entering my service are what I expected. So the adapters create like an corruption layer to those service, which is quite amazing because with future things that are entering our internal core and guarantee that only what we need are getting there.

And this is amazing because in this way, we stop relying on the connections to the others and we only rely on our context itself and then inside it, we have the business logic. So everything uh that are uh inside the service itself has uh an only context so I can word things through those adapters. And that's how we do this isolation. And when I talk about the diploma architecture, we are using this exon architecture. But instead of only having a single business logic, which is this inside this context. In this internal context, we are using two levels of business logic. And what I want to say about these two levels is that we not even like isolated the business context as a whole. But we also isolate the business context from uh connecting to side effects and having the pure business logic. So we have a more internal um part of logic which I only have like pure functions as I mentioned before. But those poor functions are totally like business logic functions.

And then I have a greater uh space which is the business logic but controlling what's happening and this controlling might be like, oh now I need like to save this through a database. Now I need to retrieve this information. Now I need to call an A TCP request to insert this in the other serves and so on. So I have this isolated pretty well done. And with this, I'm totally able to do testing and cover everything like pretty, pretty well. And I think this architecture works amazingly with closure and I I've used it for a whole a a long time. And I think it's very worthy to take a look and see how things work. And it's quite uh useful also about the continuous delivery idea that I mentioned before. Uh just to clarify a little bit what I wanted to say about it. So when we talk about continuous delivery, we normally have like a pipeline of things that need to happen. So first things we are going to code an enclosure, for example, then we are going to do the testing and then we have like units testing and integration testing and all those testings are going to run all the time that I submit things to my repository. So to my git for example, and this is done automatically to guarantee that everything that has been done is passing and is still working. And also when I talk about the repository, I can have ac I configured there to guarantee that more things are correct.

So for example, I can validate uh schemas between microservice and guarantee that they are reliable. Uh I can check all connections I can see if passwords are OK and so on. So I can run many things automatic to guarantee that my microservice is still uh totally able to go to prediction in that way and it's reliable because in this way, I'm guaranteeing the quality of it and I'm skipping the level of passing this code to a quality assurance team.

And then after this, after everything is committed run and approved by other engineering to that are going to validate if the coding is OK, it fits in the code conventions and so on. Then after this, I'm going to build it with like a home environment configured. Uh and then after that, I'm going to deploy it. So it's going to be released and truly put in the production layer. And after this, I have it available to everyone that I need. And this is quite cool to have. There are many companies are already using continuous delivery today and I think this is the future. I think uh we need to go to a station which we're not going to have more like uh uh steps to put those things to production. I've already worked at a company that had like 11 once in a month, month, put things in production and this is like, you take too long to, to do things and put in production. So I think it is really nice to have a continuous delivery uh configured to, to your company because it works perfectly well and you have like things running all the time and it's much more like reliable because uh if you see a problem, you can correct this and put in production at the next uh moment.

Uh Well, it's not like uh able to do when you're talking about someone that only puts it once in a month to production So I think continued delivery is something very nice to have, even though you're not using closure, I think it's worth it. And now that we talked so much about all those, uh, things that we could use. Uh, I, I want to get to the part where we talk about on boarding engineering because I know that I'm talking about a language that's very different from others. And that's most part of the companies are going to take a look at and say, oh, I'm not going to use it because I don't, I think it's worth spend time and money teaching people to do it. And it's going to be really hard to find uh people that know it by heart. So how do you on board engineers when you have things like this? Uh But I'm going to show you a few steps of onboard engineers that I know that work pretty well. Foreclosure. But I know that this happens pretty well for all language as well because uh it's a very structured way of teaching people and I think it works for anything that you need. So the first thing is self survey online courses. I think I know that and everyone is doing this right now and all the companies have access to, to websites that have like many, many programming courses and this is very good and it is healthy to have this to people to learn by this house.

But sometimes this might take like a long time for the people to truly start learning because when you're just like watching a class or something, it's really hard to imagine how you're going to put this, uh, in, in your daily lives. You know. So apart from that, I think it is important to have because you're going to learn the concepts and everything. But I think what's the most important thing is to have like sessions of programming in group. And this is the mob programming sessions. I don't know if you have heard about it, but it's really similar to pair programming. But in a group, uh which is quite amazing. I can say that mob programming for me is what is the most uh important thing to have in a company even though you're not using closure for any programming language because it's a way to spread knowledge, not only about like context and all because this is amazing when you have like a group working in something and they do more programming, it's really easy to spread the knowledge uh among them, but also to teach people to program in different language.

Because sometimes uh what, what happened, how we handle the session we normally have when you're teaching a new language, right? So uh we, we take someone that already know the language and put this person in the as the lead of the session and then all the others are probably uh developers that were hired. But they don't, didn't know closure before. So we normally bring a task, uh a true task, like a task that we're going to be uh developed by uh a team. And this group is going like to discuss, decide how to implement and how the logic that is going to be implemented and so on. And the lead is going like to say, oh yeah, then this thing that you want to do it, you do it like this in closure and this lead not going to be the one coding itself. So all the others that are involved with are the ones that are going to be in the computer coding. So they have like hands on activities uh by using the language uh converting what they are thinking to the new language that they are learning. And this is uh it is amazing to teach new language because uh after a day of doing it, you are at sea. The many, many developers are able to start coding much better after that.

And I can say that I do this in the mentorship that I gave as well. And this works amazing for people that are, for example, changing career that are coming to technology. And this improves very much for them to understand how they convert the logic that they are thinking and that they are learning to a real problem, a real situation using a real programming language. So this works perfect. Not only to, to teach language, but also to do those on boardings. And I know that there are many companies that don't believe in this because they think it is a waste of time to have so many engineers at the same place, like doing the same task. But this improves uh very much the the knowledge share and also sometimes uh accelerates the the curve of learning. So I appreciate this very much and I think it is uh very useful and I think all the companies should use. Also, the other thing is to have a designated buddy for the new comers because sometimes when you're new to the company and you have like so many questions, uh sometimes you get like uh afraid to ask people because you might wonder that you are like annoying them. So it is good to have like a designated uh person for this, this people to, to ask because then they won't have like this feeling that I'm overcoming this app.

So this is quite useful and also to have the person already integrated in the team because in this way, uh the person is already going to do like pairings and gain like knowledge and start like doing things with the the team. So I think this is the better way to do on boarding on engineers that's going like to improve the the way of learning. And in this way, you don't have like to hire specialists of the the language itself you can do it like just a nice move fast test and hire people that have like good knowledge and good skills of logic instead of like specialist on the language itself. And just to summarize a few ideas of closure because I already talked very much about it. Uh The first thing that I want to like to emphasize here is that closure has an accelerated learning curve. So even though it looks so different from everything that you have ever seen, it has like an accelerated learning curve and people start programming very fast. Also, it has like a simple grammar and that's why it has this so accelerated learning curve. So it is the least dialect to remember about it. And also the community and documentations are very helpful and very amazing.

And if I had to recommend something I would say to start with this magnificent book, which is the Closure For the Brave and True that has a really simple, did a very smooth line of thought and it is quite amazing and may closure be ever in your favor and functional program in your life.

I appreciate your time here today. Thanks so much. I'm open to answer questions if you need. Thank you.