 Je suis très heureuse d'être ici parce que c'est mon premier jour. C'est une très bonne chose et j'aimerais aussi remercier Sourzy pour toute l'organisation de la Dévruma. Je vais parler de l'automatique refacteur et de l'automatique de migration. Je suis un ingénieur de software et je travaille dans une compagnie consultée et je parlerai de cela juste après et je suis très passionnée de la qualité de l'automatique et de la compagnie de l'automatique et j'ai travaillé sur un outil comme ça depuis 4 ans maintenant. Donc, en première place, dans ma compagnie, c'est une compagnie consultée. On a beaucoup de projets de modernisation dans le secteur financier. Pourquoi la modernisation ? First, because of technical depth and also obsolescence. It's not because your design was fine at some point. Your technology was trendy 4 years ago. That's now it's still ok. So you might end up with projects completely not in phase with what you want to build and also for very old cut bases legacy. Donc, pour chaque base de cours, à un moment, vous devez méridiner cela. Mais, il est difficile, il y a des projets difficiles. Donc, si nous prenons le secteur financier, généralement, c'est une application très grande, plus que 1,5 million de codes. Et ces projets, parce qu'on a beaucoup d'acteurs, beaucoup de codes, mais aussi, il y a beaucoup de documentation, beaucoup de différentes langues. Vous vous rendez avec un projet très caustique et long. 10 millions, à peu près, et 3, 4 ans. Donc, c'est très difficile, et généralement, c'est un vrai travail pour ces entreprises pour moderniser leur application. Et, pour exemple, dans la production, aujourd'hui, nous avons 3 millions de codes en cours. Et juste pour Cobble, il y a 200 millions de codes en cours. Et Cobble, il n'est pas assez nouveau. Il y a des codes que vous devez moderniser un jour. Donc, c'est un vrai problème. Et les développeurs ne sont pas assez équipés aujourd'hui. Donc, nous devons faire quelque chose. Et sur le projet de modernisation. Donc, nous commençons pour l'automation. Donc, rapidement, parce que je pense que si vous avez gardé toute la journée ici, vous savez que le code est de la belle date, donc je vais être rapide sur la première partie. Ensuite, je vais vous présenter comment nous transformons le code, ou l'engagement de l'arrivée. Et pour la fin, je vais vous concentrer sur le refacteur. Donc, premièrement, le code a des données. Donc, vous savez, quand vous voyez le code, vous pouvez relâcher au texte. Vous avez une structure, vous pouvez relâcher au... Oui, vous avez bloc, vous avez paix. Et la main différence entre code et texte, c'est que vous avez une relation, entre une strong relationship entre les entêtres de code. Et ce que je trouve le plus intéressant dans le code, c'est que vous avez une dualité, parce que le code peut être vu comme un programmeur. Donc, c'est texte. Avec le reading it, vous pouvez comprendre ce qu'il fait, ce qu'il fait, ce qu'est le purpose de ça. Donc, ici, c'est un poker, un jeu poker. Et après, vous avez le view as a machine. Donc, vous ne vous inquiétez pas sur le goal du programme, vous avez juste besoin d'exécuter l'instruction. Et... aussi, vous avez différentes langues et vous avez très fortes différences entre les langues. Donc, pour exemple, ici, le même exemple dans Java et Python, le goal est juste de lire un file, mais il y a 8 lines pour Java et juste une ligne sur Python. Donc, ce que l'information est réellement élevée sur ça, ça dépend aussi de votre goal. Pour exemple, dans la migration, vous voulez garder toute l'information. Mais si vous voulez juste extraire l'objet de la logique, vous ne vous inquiétez pas de toutes les lignes. En même temps, dans la cleaning de data, vous pouvez demander cette question ce qu'est-ce qui est réellement élevée ou pas. Pour exemple, un code généré, un code de frameworks. Est-ce utile pour mon use case? Est-ce que j'ai besoin de miner cette data? Ou peut-être que je l'ai oublié? Il y a aussi des commentaires et des names. Ils sont une bonne source d'information, mais si les commentaires sont totalement obsolètes, si les names sont complètement mauvaises, il peut être un problème. Et vous avez un code utile d'un code utile. C'est le code cor-algorithme d'un programme. Et le code signifie que c'est juste le surf pour le faire fonctionner. Donc, ce n'est pas un task et il va vraiment dépendre de votre objectif. Donc, comme toujours, dans la mining, vous devez vraiment savoir ce que vous voulez acheter pour choisir ce qui sera le modèle, ce qui sera l'interessant de la data. Donc, la cleaning, la data, la processation. Donc, dans le process global, vous avez un code, vous avez un modèle. Et selon vos outils de utilisation, vous devez avoir un modèle différent. Donc, je pense que vous devez payer avec beaucoup d'applications et ça. Donc, d'abord, vous avez ce que j'appelle le format d'approche. Donc, pour le code, c'est la structure. Vous avez un grammar parce que vous avez un compiler. Donc, vous avez juste un moyen, un correct moyen d'écrire des choses. Donc, grâce à ça, nous pouvons exprimer la structure et toute la relation sur le code. Et la modélisation à l'IST. C'est toujours bien d'aller à l'information et vous avez beaucoup d'outils existants avec cet approche. Mais, vous ne pouvez pas comprendre ce qu'est le code. Qu'est-ce que l'intention de l'application de l'application et c'est vraiment difficile d'extracter le logic business avec juste cet approche. Donc, après, vous avez l'approche naturelle. Donc, maintenant, le code, c'est juste un texte simple. Et vous pouvez extracter l'élément naturel. Mais, même si vous pouvez extracter le logic business de l'application, vous avez toujours beaucoup d'ambiguities qui sont difficiles à résolver. Vous avez également une vocabularie infinie. Nous tous connaissons comme développeurs, nous avons toutes différentes conventions personnelles qui apprennent des variables. Parfois, pour le même monde, vous pouvez avoir les versions longues, donc, à la fin, vous avez une vocabularie infinie. Et, spécialement, dans le secteur financier mais pas juste le secteur, généralement, vous avez beaucoup d'applications dans différentes langues qui interagissent avec eux-mêmes. Donc, vous devez prendre soin de ça. Et aussi, parfois, ce n'est pas possible par un homme. Donc, comment vous faites l'application des compétences. Donc, après, nous avons l'approche de l'élément naturel. Donc, c'est un procès que vous extractez la structure, et ensuite, vous consolidatez par l'application des codes. Donc, si vous entendez ce que l'on fait, et ce que l'autre classe fait, si l'un s'appelle l'autre, vous pouvez avoir un niveau de compréhension, de l'application. Donc, nous sommes aujourd'hui et nous savons que c'est encore un jeune dans cet ordre. Et vous avez beaucoup d'applications, mais nous avons encore besoin de créer un nouveau algorithme pour traiter les codes. Donc, ce que nous faisons dans ma compagnie, c'est la modernisation. Donc, c'est refacturant et la translation, basiquement. Donc, basé sur ça, qu'est-ce que nous voulons avoir comme modèle? C'est le plus important, c'est de avoir le lien entre les entités des codes. Parce que, si vous voulez refactor la méthode, vous devez changer tout le monde où c'est cool. Donc, oui, c'est juste un exemple. Donc, nous avons un réveil et un gène. Donc, nous commençons avec la compagnie. Qu'est-ce qui est intéressant ici? Nous avons la première étape que vous pouvez avoir un file de projet. Donc, comme le Proj ou l'Eclipse Proj. Et nous devons comprendre cela, parce que dans le code legacy, pas tous les codes sont réveillés par ces projets. Donc, il n'y a pas besoin d'analyser et d'understand le code mortel. Donc, c'est vraiment important d'en savoir ce qui est vraiment utilisé. Et nous avons des... parce que... Oh, oui, j'ai oublié de mentionner ça. Notre modèle est un langage agnostique. C'est... parce que nous faisons beaucoup de différents projets. Nous avons beaucoup de différents langages. Donc, c'était très important pour nous pour avoir une représentation pour tous... pour tous les différents langages, pour évoquer, rewrite tous nos ingénieurs pour chaque langage. Et donc, pour cela, nous avons des post-processes pour faire le code plus général. Pour exemple, vous pouvez avoir entre les langages différents paradigmes que n'existent pas dans un autre. Donc, vous devez transformer ce modèle pour avoir un modèle langage agnostique. Et après, nous avons de solider et de battre pour retirer toutes les interactions dans le code base. Donc, ici, c'est un exemple d'outil d'outil. Donc, vous pouvez voir, par exemple, ici, un bar. Vous avez une référence sur cela, où c'est un bar, ici, c'est un col. Et vous avez ici un lien. Et aussi, c'était très important d'avoir un système query dans notre modèle parce que pour appliquer la refacturation, d'abord, vous devez détecter ce qui est mal dans le code. Vous devez pouvoir rapidement aller à ce que vous voulez changer, à ce que vous voulez transformer. Donc, nous avons un système query avec un tool analytique. Donc, c'était vraiment important. Donc, un kit d'outil. Donc, vous avez la refacturation. Aujourd'hui, on a Java, C-sharp, C, C++, Cobble, aussi, VBnet, et tout ce genre. Et après, sur le modèle, vous avez la refacturation. Donc, ici, vous avez toutes les transformations sur le code. Et après, parce que vous avez besoin de quelque chose qui compile, vous devez re-generer le code. Donc, vous pouvez le faire dans la même langue si vous voulez juste réduire le détail technique ou vous pouvez le générer dans une autre langue si vous avez besoin de le transmettre. C'est aussi intéressant ici de l'agnostic de la langue. C'est thanks to that we are able to transform the Cobble in a modern object-oriented program very easily. Because all the complexity was in the reverse engine. So, the level of transformation you need to be able to have a good generated code is not is not that high. So, here for instance, an example of code from C++ to C sharp. So, for instance here you have some pointers that have been translated. What is also interesting if here you have a change of a dependency for instance here you have compare an okay and it was translated by two uppers compare two. So, that kind of things it was at the beginning it was just translated by compare no case like that but it was not available in C sharp. So, it was not compiling and we we had we added a rule when you see this method in fact in C sharp you have to translated into a pair compare to a chain of code. So, what we do in project at first you have a lot of for all the dependency at first it's not compiling at all and you have a lot of error because of that. So, it's a mix of done manually and when you can add rule like that you can translate it and I will focus on the refactoring because it's very important the refactoring you can't do any modernisation project without refactoring and and if it's done manually it's a waste of time and we had some defects in your code and this is our first version of engine and we were dreaming about magic refactoring engine with automatic detector using machine learning to to be able to detect all the code smell what can be done differently and automatically refactor everything and have a clean code base in the end but in fact our clients who are not very happy with that because for them it was not possible they wanted to have a choice of what they wanted to refactor they wanted to refactor the way they were used to it so it was not working at all and we had some failed project because of that in fact even if the code was compiling at the end the client was not happy so what we learned from that it was very important to let the client out of the control so to have a catalog of refactoring but the clients can personalize them and also sometimes from clients they are very specific needs and it's just specific to the company on the team so you don't have a generic refactoring for that so they don't have a generic refactoring for that so they need to be able to create their own refactoring and also no big bang it's crucial application and usually it's three, four years and you have to you can't do it one time and also because you don't transform the code without unit test and usually they don't have unit test so they really need to keep the control and do refactoring class by class and so on but they still wanted to have the possibility to understand something if they wanted to change a dependency the first the first one time they need to to change the dependency they can create a refactoring for this dependency and then apply it to all the code base so this is our second version so you have you have a detector with the catalog of code smell then you have a remediator using the refactoring catalog and from that you can create a plan of refactoring and then apply it what is interesting here it's because of the of this structure you can add very different way to detect the code smell in your code for instance we can use input of sonar we can use we have already some methods and where to detect things but we can you can create and have different algorithm really you can add something very specific of your use case and it's the same for the refactoring and yes also it's an iterative process because sometimes when you refactor something you create other defects so now we have we have a look for that and it was a shame for us but when we started this project it was six years ago we wanted to put machine learning everywhere but in fact we because of the constraints I said before it was really hard to implement and also because of some specificities of the banking sector first each time we add a client project it was like three months something like that just to be able to see the code lot of DNA to sign so it was really hard so imagine if you have to gather all the code of the company to train a data model I think it will need at least three or four years also yes no revision history access sometimes because the code is too old or sometimes because it's just too difficult as an external provider to get this kind of information so it was not possible to see the evolution of the code base to learn from that so after we thought ok but you have a lot of code online so why why can't you use it to learn our model but in fact there is a real difference between the code you can find online on github and the code in such industry you have big company patterns that you can't find really easily and at the end you will end up with a bias and also because we were because we are in modernisation project you have to imagine they are the worst code base you can you can see the legacy is really really huge and you really have to change everything so you have nothing within the code base that you want to keep like this this kind of project you have always to change the architecture and you can't can't do that automatically so you have to to always mix the both aspects and especially on legacy code nobody agrees on what is good what it is to keep so in fact it's really hard to just to train a model on that so that's why we implemented first a lot of algorithm and heuristic not using machine learning because of this constraints but now because we have we have an engine like this with all the different yes modules very separate it's now possible for some small use case use machine learning and today it's our current state so we created this so our client could be happy because we do a lot of projects and they are successful but now we want to go further and I hope to see in a few years a lot of different engine using machine learning so in conclusion if you want to to start with a sector don't start with financial and and yes and for me it's really the beginning of new era for the developer to give the developer the tools to be able to modernize change the code without the big pain in this today and that's it for me I had a demo but I have not enough time to do it but if you're interested, 5 minutes ok we can do it quickly so it's a video because I don't want to the demo to crash so so it's open source code, it's an example it was made for non-technical people so it's really, the code is not that complicated so here it's in this I want to scroll but no it's a video ah it's really disturbing so here for instance you have an access to a database and you have an art coded string here it's a user account and you have an underscore here and everywhere in the file you can see there is no underscore so imagine in the process of everyday process my tech lead tells me you have to change the user account's name and replace it with a uppercase for the A letter so it's easy just a few seconds but in fact this art coded string it's a different emplacement locations within the file and it's duplicated 5 times and if I look deeper I can see you have other art coded strings even if they are good, they are still art coded and do you know manually how much time you will take to extract a variable for each art coded string according to Sonar it will take 40 minutes it's huge, why because it will probably make mistakes so you have to correct it and run the test and so on so you can change also with with your editor you can use refactoring tool but you will have to do the refactoring 5 times for each time you have a different duplicated string so we launch refactoring engine so the first step is the reverse and after the refactoring engine and in fact it's not just launch on the file but on all the code base so across the code base you have 1600 detected smell that need to be corrected so then the refactoring the refactoring is applied second iteration of the tool and by doing the refactoring we added some duplicated data cut smells so we merge them in a second step and you can see here it was extracted successfully but if you if you see the changelog in fact you applied all the change on all the code base so in just few minutes you applied your refactoring on all the code base so the process was as a developer you spot a problem you think about it you find a solution you write it, you configure your refactoring and then you apply it on all the code base and in this example the name is not really meaningful that you can configure for instance to try to guess the name for the variable of the policies you can have for instance extract only the hard coding thing that are duplicated more than 2 or 3 times with minimum of 3 characters and with this kind of refactoring policies in fact is really personalizable for the client so this example is really easy but we also have refactoring for instance to split huge methods like more than 300 lines of code to extract bits and make new methods and what we have what is interesting in Java for instance in C sharp synchronize the block and check that you have a static before stuff like that and that's it for me yeah this is a good question oh yes so how do we ensure the quality of the product over time so mostly it's used for modernization project so it's one time project and after we don't do the maintenance of the code quality it could be used but I think other techniques are more useful because you can rely on the revision between the version so here it's more like a snapshot and we have to save the code base so after we we can help our clients to find good solution to ensure the quality over time but mostly it's tooling and also to change their internal process so to give example about yes to give example about project for instance the C++ to C sharp example I showed you it was 600 billions of C++ codes no unique test and it was migrated in six months and it was both our team using the tool and their team to create unique test integration test and so on and I think we reach 60% of automation for the translation and because you can automate yes tedious and monotonous translation task after the developer can really focus on what is tricky so is it okay or do you want more example no it's just we think that you can't have a click and play tool for that because it's really important to have the human deciding the target the architecture and because you have to change some dependency also you may want to change and recode manually some parts and also sometimes it's just really difficult especially for C++ if you have optimization relying on pointers it might be difficult to automatically migrate it we prefer to let the human do yes so I'm not sure to get the question yes yes so what is better between machine learning and the whole code base based on the revision I think there is no one better than the other it's just depending on your use cases I think over time it's better to ensure the quality and to improve the quality of the code base but on the old code base I think it's more for use case in fact like for us or you need to really save the code base and you don't have a good history and all the changes that can have in the few years they may not be a quality commit because they are just here to yes to you have still to have evolution but because you have a legacy the quality will be very bad so you don't want to rely on that