Dynamics Corner
About Dynamics Corner Podcast "Unraveling the World of Microsoft Dynamics 365 and Beyond" Welcome to the Dynamics Corner Podcast, where we explore the fascinating world of Microsoft Dynamics 365 Business Central and related technologies. Co-hosted by industry veterans Kris Ruyeras and Brad Prendergast, this engaging podcast keeps you updated on the latest trends, innovations, and best practices in the Microsoft Dynamics 365 ecosystem. We dive deep into various topics in each episode, including Microsoft Dynamics 365 Business Central, Power Platform, Azure, and more. Our conversations aim to provide valuable insights, practical tips, and expert advice to help users of businesses of all sizes unlock their full potential through the power of technology. The podcast features in-depth discussions, interviews with thought leaders, real-world case studies, and helpful tips and tricks, providing a unique blend of perspectives and experiences. Join us on this exciting journey as we uncover the secrets to digital transformation, operational efficiency, and seamless system integration with Microsoft Dynamics 365 and beyond. Whether you're a business owner, IT professional, consultant, or just curious about the Microsoft Dynamics 365 world, the Dynamics Corner Podcast is the perfect platform to stay informed and inspired.
Dynamics Corner
Episode 345: In the Dynamics Corner Chair: Code Craft: Mastering Reviews, Clean Code, and AI
Why should everyone in a team participate in code reviews? Because it's more efficient than doing it ALone! 😄
🚀Join us in this episode with Natalie and Stefan as we explore the ins and outs of code reviews, the art of clean code, and the transformative power of automation and AI tools like Copilot. 🧩
Key Takeaways:
🌟How to leverage code reviews to maximize collaboration and learning.
🌟Why you should strive for the holy grail of clean code, even if it's out of reach.
🌟How automation can tidy up your code, but why manual reviews remain crucial.
🌟Why it's important that everyone participates in code reviews, regardless of experience.
🌟Yes, documentation remains a challenge, but what can we do about it?
🌟Programming languages are evolving fast. Are you keeping up?
🌟How community resources like #Discord can be a source of support and learning.
🌟Last, but not least, why it's critical to engage with the developer community to maintain best practices.
🎧💡Are you ready to develop your development journey?
#MSDyn365BC #BusinessCentral #BC #DynamicsCorner
Follow Kris and Brad for more content:
https://matalino.io/bio
https://bprendergast.bio.link/
Welcome everyone to another episode of Dynamics Corner, the podcast where we dive deep into all things Microsoft Dynamics. Whether you're a seasoned expert or just starting your journey into the world of Dynamics 365, this is your place to gain insights, learn new tricks and fact-checking. Co-pilot in AL for review. I'm your co-host, Chris.
Speaker 2:This is Brad. This episode was recorded on October 2nd 2024. Chris, chris, chris, welcome to October. Welcome to another great episode. This episode is a follow-up to a conversation we had with two well-known Business Central community members. Back in August, we had the opportunity to start talking with them about code reviews and clean code, and today we had the opportunity to talk with them a little bit more about that topic and also how they utilize Copilot within their daily workflow With us. Today we had the opportunity to speak with Natalie Carioca. Carioca Niddy, I call her. I'm bad with the bad last names Natalie Carioca and Stefan Moran. Good afternoon.
Speaker 3:How are you doing?
Speaker 2:Morning, oh morning, good morning.
Speaker 1:Good night I don't know. Really. No, it's still early, very early, but it's all good.
Speaker 2:No, it's okay. See, we need to do that with the backgrounds. We should just have a consistent background, so that way you can't tell the time of day. Yeah, so that way it could be, we could pretend it's one.
Speaker 1:I'll close my blinds I could have like what stefan has just you know, white background I like that though you could do a lot with a white background.
Speaker 5:Yeah, I intentionally turned my desk so for the streams I do. I have a neutral background. Normally I have my camera also cut off, so the mess on my desk is not visible. Let me know. I'm not sure how the podcast will turn out. Otherwise I will just quickly remove some of those things.
Speaker 2:No, the neutral background is good. I was thinking of putting a green screen. I have a green screen. I was thinking of putting it behind me and just putting something behind me. One time I had a meeting I used the green screen and I took a video of a coffee shop that I found online and with OBS it filtered the chroma key for the green screen and worked well, and everyone thought I don't know, chris, if you recall that, everyone thought I was in a coffee shop Because there were people walking. I mean, it was a loop so it didn't jump, so it looked like I was in a coffee shop, but I was really.
Speaker 5:That's pretty clever man no.
Speaker 2:I have to do that again. Well, that was. I wanted to put myself in an X-Wing from.
Speaker 1:Star Wars and have space.
Speaker 2:It was back in May 4th. I wanted to pretend I was in an X-Wing and have the stars, but I couldn't find the video. Jeez, Natalie and Stefan are like what are these guys talking about? It's fine, go on. I remember when we talked last time.
Speaker 3:Several times I heard you say wow, we could continue talking about that much longer, though I don't remember the details anymore.
Speaker 2:That's even better. So we'll pick it up. No, thank you both for taking the time to speak with us again. It was back in August when we spoke, if you recall, a few short months ago we were talking about code reviews and clean code and during that conversation we did say and even afterwards we talked about how we could talk about this forever or for several more hours. Forever is a long time and we wanted to follow up with that in talking about code review and clean code and other uh points. So that's uh where we are.
Speaker 2:Do you remember the conversation now?
Speaker 5:no, the conversation is is clear, just not like. I had some topics in mind, what I wanted to elaborate further on and those specific points. They're gone, so I don't know if I will repeat stuff I said before, because I wanted to go back and listen to the episode, at least in fast forward, so I could just continue, but I did not find the time.
Speaker 2:No, it's okay. I listened to the episode so I'll try to, and if we repeat ourselves, it's okay. It's the important point of the code review, one thing that I was thinking about talking about which we didn't talk about last time. We could talk about the code review, clean code and some of the follow-up points that you wanted to talk about. I'm sure they'll come back or even additional points.
Speaker 2:But one thing I was thinking about with the world of automation today and I hate to say AI, because everybody talks about AI, but I also know that there are some tools to do, like AZL tools has like a code cleanup and there's other tools available how much of a code review or code clean code right, it depends on what the definition you're talking about is. Clean code is which I'd like to go back and actually define what each of you think clean code? Right, it depends on what the definition you're talking about is. Clean code is which I'd like to go back and actually define what each of you think clean code means. But how much of this do you think could be done automated? You know, during the pipelines, we can have tests run against code to ensure that the functionality is sound. There's other things that we can do with automation during the pipeline process. How much of this do you think could be done in that fashion?
Speaker 5:Do you want to go first or should I?
Speaker 5:Okay, I've done quite a bit amount of code cleaning up operations in the last weeks and days and weeks, so especially the tools that Andre wrote, the extension, the ASE tools library.
Speaker 5:It's pretty good to do some of those tasks to just be quicker, but especially those I would not automate and I do not like to have them run through the entire project automate and I do not like to have them run through the entire project.
Speaker 5:Um, when I do those cleanup tasks for for a project or an app or something, then I like to go through the files individually to also pick up the contents and to read through everything once. But I'm always a little bit afraid of those with those tasks like there could just be one back in there and it messes everything up and then I need to revert everything that I did. So I need to do really granular commits to prevent that and just the hassle seems to be too much. So I use those tools but I run them individually on the current file as I go through, just to do some of those like remove duplicate lines or those commands, remove the redundant app areas those kinds of commands I use and I run them frequently, but I'm not through the entire thing and not just on an automated base, more like a developer tool to be quicker, I feel better about that because I'm sorry, natalie.
Speaker 2:I feel better about that because I do it the same way, because I do like to see the changes as a result, because I have come across with some tools not necessarily that tool I love the AZL dev tools but I like to see the differences afterwards just to make sure that what I had intended to be done, because I do a lot of the you know the parentheses, the case, the remove unused variables, the sorting and such. So I prefer to see them individually to make sure that it's sound.
Speaker 5:Well, the sorting actually that I have automated on safe in my settings, so I sort properties and variables automatically on safe. That is something I like to do because afterwards you have, like in the git, differences when you compare with git or in general you look at commits and see the differences, then you can better align. You do not see them moving afterwards anymore. So I make sure to have them always sorted in the same order. So that's automated, but just in VS code for me.
Speaker 3:Finally, this is one of the few rules that I have disabled for myself. My process is currently similar maybe, as yours now, so while I code directly, I already tried to stick to all the rules and remember everything. However, before I release, I run the code cleanup on everything on the whole project, and I really I run the code cleanup on everything on the whole project and I really, really must check the results. I could not rely on it doing it all automatically in the background, because not only for some new rules. There can always be some bugs, or because the IA language has been extended again and suddenly something doesn't work anymore as it used to be. There's no guarantee that the tool that worked yesterday works today, so I really need to check the output each and every time, but it doesn't take that much time, so I don't see a problem in that. So the question, rather, is Brad, why would you like to automate this?
Speaker 2:Why would I like to automate it? I think anything that you can do to save time or to leave time to do other tasks I would like to take advantage of, take advantage of. I don't want to reduce quality of any reviews, but it goes with the same type of notion of if somebody spends a lot of time entering data into a system, they may not have as much time to analyze that data. So if you're entering financial information or other types of information anytime you're spent doing one task. You're not doing another task. So if there's some things we can do to save time through this process without losing the quality, right, the key here is I'm not saying you know save time and you know hope that everything works okay. I'm saying save time and have something at least similar or near or even 80% of the way which you can do the last 20% of a review or a cleanup.
Speaker 3:I mean, the majority of time does the truth for us already within seconds, and my manual check afterwards takes, I don't know, a few seconds up to half a minute, maybe. That's all, if there are no issues, of course, but this is the exception of the rule. So I would not see a reason to automate just that, because it is actually automated, and just a little bit of post-processing after it.
Speaker 2:Okay. So if there isn't a gain there, I understand. So go back to the we talked about before, about clean code and code reviews. What is clean code? Again we get these words, I see these terms, I see people write them and say I want you know it's again. It's a continuation and we'll maybe repeat some of this or not, but I wanted to dive deeper into code reviews and clean code as a definition.
Speaker 3:Well, first of all, clean code. For me, it's an ideal I will never reach, but I'm doing my best to come closer and closer, just in general. And when we leave this level, then it's of course about rules, about patterns and all that stuff we all also talked about earlier.
Speaker 2:Stefan, what is your take? We'll go back into the clean code area well I I definitely agree with natalie here.
Speaker 5:it's um, yeah, I I would say impossible to reach the ultimate clean code um, but the goal I'm following is to make the code as readable as possible and as um reliable as possible in terms of execution as well. So when talking about clean code, I also think about approaches to reduce errors, to make it more resilient against users, because if the developer tests code, it obviously always works because he knows how it was written and how it's intended to work. But, yeah, catching errors and stuff that's also, for me, a part of clean coding to really write good code not only clean, but also good code no, it is important I mean clean code that I follow the same suit.
Speaker 2:Clean code to me is more readability as well, and the ability to follow through. I know some will have conversations about I know many early on in some other languages where you know how much could I fit on one line of code versus having multiple lines of code and versus what do you save but ask that same person to go back and remember what they were trying to do. Sometimes it gets a little bit challenging. Or if somebody has to pick up that code afterwards and follow it, they can't, so it's a bit challenging to do so. With that, with the code review we talked about, I wanted to talk a little bit deeper.
Speaker 2:We talked about some of the things you had mentioned, Natalie. You said it takes a few seconds or a few minutes for you to do some of this code review, and someone even asked me the other day when we were talking about code reviews. They asked me should I download and execute this and run this? It's outside of the tests. Is there a point where you think, from doing a code review, someone should package the code and run it and go through it if they have a question about the logic or how it processes I would say that depends a little bit.
Speaker 5:Um has everything. Um, I'm trying to remember. If I ever did that, though I feel like a code review is more for me a tool of getting to know what has changed for me personally. So I'm aware of what this change is intended to do and also to see if there are any flaws I can just pick up by reading through the code. I may download the code in order to have the code cops and the assistance in my editor. Um, if it's a little bit more, if it's a really big feature pull request, I might decide to run the code and just to see if it works. But it's always also a little bit challenging, depending on on the change itself, to get it set up correctly and just it's. It's an overhead to really get there to run and test the code. But I mean, I could imagine the situation.
Speaker 3:Yes, Well, code review is the name states is just a review of the code and not of the actual functionality, when, when I get a pull request to check, I rely on the writer of it that he has checked the functionality and I'm taking care of the rest and maybe for some little I don't know typos or other small kinds of errors that happen when you write down something quickly. So far I would not have ever tested more than that.
Speaker 1:I do have a question around just how you are utilizing this particular tool, and I just got back from a conference and I believe in the past year or this year alone, everyone talks about AI and Copilot. I am curious from the both of you if you've utilized Copilot in any form of your day-to-day development, whether that's reaching the clean code or building a solution. Have you utilized Copilot and to what degree?
Speaker 3:I may start. So I use it mainly and only as the GitHub copilot directly in VS Code to suggest me mainly text and sometimes even lines of code, because sometimes the suggestions are really good or at least near enough to take them over and then slightly change them again. But anyway, the copilot is really great if you have some pattern. Sometimes you need to write I don't know thousands of codes that look almost the same, except one number that always increases or something like that. So something very mathematical yeah, mathematical, let's say and for that case Copilot is really great because it really detects patterns and then suggests the future lines predicted on that, and this is really great. However, I rarely rely on more than that.
Speaker 3:Recently I've played around with the GitHub Copilot chat because I needed some regular expressions that I absolutely don't master at all, but well, copilot does so. I asked them to return me the regex strings and this really helps me a lot. Wow, but for sure we all could use Copilot much more than this. But this really ends here for me. Inside our organization we also have AIilot to create the descriptions and all the textual stuff and edit to tasks, user stories and so on to write that for us. To be honest, I'm not that much working with it though I should, but I know that my colleagues are and the results look really great. So it's just a matter of getting used to it, and I didn't start as much you're gonna be forced to adopt to it.
Speaker 1:Uh, eventually I feel like it's been sort of thrown at us and said, hey, you gotta use this at some point.
Speaker 2:So I just want to go a day where I don't hear the word co-pilot or ai, and just see if I could go a single day without it I guess you could if you went and sat on the beach or went and sat in the woods somewhere and didn't turn on anything at all, but it seems to be all over. That is interesting because I've used Copilot with code just similar to what you had mentioned. I really haven't used the chat portion of it and asked it questions within Visual Studio Code but with GitHub to suggest. I guess you could say I always use the tele, but it's like snippets on steroids in a sense, but you can get a little bit more out of it and I've had some fun playing with it.
Speaker 5:Yeah, you really should look at the chat. I've used the Copilot in GitHub for a number of things and I feel like it's a better intelligence. As you said snippets and steroids so yeah, when I use it for like, for example, I type out code and use variables that do not exist yet. Then I go to the variables section and it automatically suggests me to create those, so I don't need to type them twice. I just used before this call, literally, and then I've also on stream. I've made a prototype for the JSON wrapper. So it's somewhere on YouTube where I've defined a complete wrapper code unit for the JSON wrapper. So it's somewhere on YouTube where I've defined a complete wrapper code unit for the JSON functions. So there I could, just after I created, I think, the first few of them, I just went and let Copilot create all the functions, like 20 or 30 functions or whatever, because it was, as Natalie described, a pattern which would just continue, and it picked up on the pattern and really helped that.
Speaker 5:And for the chat, I once needed to write a recursive function to do number matching on dictionaries.
Speaker 5:So I had like two dictionaries where I would want to like it was for invoices versus payments, where I have. I have an invoice, uh amount and I want to see if my payment amounts, like any combinations of the payment amounts I have, would match up 100 to that invoice amount. So I needed to go through the first dictionary and then pick up like all combinations and and try and find the combinations that match and I really used like it took me probably an hour with the Copilot chat to really write out that function and it worked really great. So I had adjustments made and then I just described the adjustments I wanted to do or I wanted to have in that algorithm and it picked up on that. And sometimes there are issues where the copilot tries to do or use commands that do not exist in the AI language and then you just need to bring it up to attention and say that this doesn't exist or recommend something else, and then it just changes everything and adjusts.
Speaker 4:So, it learned.
Speaker 2:Did you use the chat portion for that? Yes, to type out in natural language what you were looking to do, and it created the AL code for you.
Speaker 5:I even created example dictionaries just in text, in pseudocode. Basically.
Speaker 1:As a reference.
Speaker 5:I pasted them in there and explained what I wanted to reach, what my expected results are, and then I just started to yeah, like a colleague, basically a co-pilot it's a pretty fitting word for that to just do pair development basically.
Speaker 2:See that I'm going to do that. I'll try that later, so it saved you a lot of time.
Speaker 1:It sounds like versus right Well, this was. Yeah, it was an a lot of time. It sounds like versus right Well, this was.
Speaker 5:yeah, it was an example with high complexity and it would have taken me longer to wrap my head really around how to achieve the result. And in those scenarios, I think, where you're really looking at a high complex problem, it's helpful to get to a solution problem.
Speaker 1:It's helpful to get to a solution.
Speaker 2:It's like having another co-worker. I listened to several podcasts and I was listening to a podcast and they were talking about this. I definitely want to go back to this topic of the co-pilot chat because I have to. I'm going to start using it today to try some examples. But you mentioned, you know co-pilot is fitting because it is a co-pilot right If you're flying a plane, it's something that helps you. But you mentioned, it's almost like a colleague and I was listening to an entrepreneurial podcast and they were talking about software development and then also ai and software development and they were talking how the number of you know it increases the bar or raises the level of senior development and also this leaves space for a junior development. But there's that middle piece where you can reduce the number of developers you need because of something similar to what you just had mentioned is you could talk with Copilot, have Copilot, generate the code and then you do a code review.
Speaker 2:So it takes out a lot of that smaller, you know, time-consuming tasks and then you just have to do a review in essence, and I think you're doing a code review for Copilot, yeah, yeah, that, that, yeah so it's so it reduces the number of developers needed.
Speaker 2:And this wasn't. It wasn't related to AL in any way or Business Central. It was just they were talking about, you know, other standalone software applications you know that are available in the market and someone who started several software companies that's what he had said is said is it used to be. You know he would have a team of 10 and now he needed a team of three because ai was able to reduce the number of developers needed, because it could create a lot of the code for them yeah, it also.
Speaker 5:Uh, just another example. I just I just remembered, um, it's great if, uh, you have maybe code snippets from another language, just algorithms in Java or some JavaScript. That's really common that you see, you find some libraries or just take overflow stuff that's JavaScript and you want to have it translated into AL. I did that for a binary to hexadecimal conversion in AL native AL. That worked. I got that working. I would have never been able to write that on my own without days probably of learning how that works. Maybe not days now that I know how it works, but yeah, my copilot really reduced the time.
Speaker 1:That's a game changer for you know, stefan you mentioned, you know, as an independent consultant or independent developer, you know to have a co-pilot that allows you to provide more output of work with co-pilot. With Copilot, and it's like you hiring another person to help you without paying any benefits of some sort. And remember, I think last time we talked about how do you test each other's code or validate each other's code. I mean, you could potentially use copilot to test your code and vice versa as well.
Speaker 5:I think there are predefined questions in the copilot chat. That asks the chat to review your own code. I think that would be something possible.
Speaker 2:I need to try that actually that was one of the questions that I was going to bring up is is how can Copilot maybe help with that too, as far as going with the automation portion of it? But I have to do this Copilot chat. I'm excited now to try it, and it must be getting better and better with AL. I know, with what I see, with just the suggestions, with typing AL code, how good it's getting.
Speaker 5:Sometimes I wonder if it's reading my mind. I think it's already on GPT-4.0, if. I saw that correctly last time, so yeah, it's getting better.
Speaker 3:Yeah, but has it already been actually trained on AL? I think not, but that also got better. Yeah, of course it gets better over time and I'm seeing this myself, but it's not comparable to other old languages that the ALM has been trained on, and I'm really waiting for us to have this feature available as well that the co-pilot actually had learned, or has read, more AL lines than we have.
Speaker 2:Yeah. I think as more and more becomes available. I guess it has to learn. I don't even understand how it could learn it, because again you could type some procedures and some code, and how something can understand what it's doing is still. I'm not even going to try to understand how it understands to write code, because if you do you know a colon equals customer dot, get you know 1000 dot name or something like how does it know what you're doing or what you're trying to do?
Speaker 5:no idea. I think it's pattern recognition at a large scale, but uh, I I don't know. But I what? What I want to say? I I recently noticed that the co-pilot also picks up like it's. It's has something like to some degree in awareness of the of the entire project. So I'm getting recommendations for like for code that is present in other files I had opened recently. So when I switch files it somehow picks up what I was looking at before and adapts. So that was something I did. I noticed that it wasn't there before and it got introduced at like.
Speaker 2:I don't know when, but recently yes, now I'm my mind is going all over the place with this and, natalie, you'd mentioned that you're using it in your organization for documentation. Are they documenting the code? Is it something where you could have an al file and say, summarize or create notes for this file?
Speaker 3:I think this has already been created. We have our own ALM for that. So there's a company, an internal machine, let's say, and it does really a lot. It has been trained for just like that and the results are really, really, really good.
Speaker 2:I have to try that because documentation is one of the worst things to do, I think, and nobody does it.
Speaker 3:But it doesn't mean that there are still not other manual processes that it cannot replace. This is actually the case.
Speaker 2:But if it can do 80% of the documentation, I'm happy. And that's what I keep saying is I am not one, and I'll say over and over again I do not think AI is a replacement for things. I think AI is a tool that somebody can use to do a job a little quicker, just like I keep saying over we have a hammer or we have an air gun. You know to place a nail, you have a screwdriver and you have a hammer. You know which tool do you use for the job. You just have to choose the appropriate, but you still need someone to manage it or oversee it, in a sense, and what level it all depends on. You know the task that you're doing as well, which is interesting. So back to the. I don't want to talk about this co-pilot thing. That wasn't the intent of the whole thing, but I'm, I'm, I'm hung up on this co-pilot.
Speaker 1:I was just curious about the efficiency because it's been thrown, you know, around quite a bit and I'm just curious from every other areas of how it's being used. So I appreciate the both of you you know, sharing where it fits into your day to day and, of course, being able to adopt to it, you know, to your day to day task. So good insight, I appreciate it. Yeah, I want to open up Because we're trying to figure it out.
Speaker 2:No, I have some things that I'm working on that I'm thinking that if this can do this for me, I didn't even think of using the chat I have to Stefan on one stream. Can you just dedicate one to just the chat and have it create a whole app for you?
Speaker 5:I mean, I can certainly try.
Speaker 2:Yeah, we'll come up with an idea. Let's do that and we'll come up with an idea and see what AI creates for you. If you said if it mentioned I saw the JSON wrapper that you had posted something similar, maybe we can do like we'll have to do something creative to create an app and see what it comes up with in AL for us for us and Brent, just as a tip, in my second let's Block post I actually posted about how I used the GitHub Copilot chat to create these regular expressions for me.
Speaker 3:So it's not full of screenshots or something, but it's only textual. But it should also get you along.
Speaker 2:When did you post that? And I didn't see that.
Speaker 3:When was it Last week, two weeks ago? I, I didn't see that. When was it Last week?
Speaker 2:Two weeks ago. I'll tell you why Because I was on vacation last week.
Speaker 3:How dare you?
Speaker 2:Yes, the one time I took a vacation and I, honestly, I did not keep up with anything. I checked emails here and there just to see if there's any emergency, but I told myself it's going to be a vacation from everything, and then a hurricane came and cut it short, so I wasn't meant to take a vacation. Yeah, see.
Speaker 1:Yeah, the world's telling him you need to go back to work. Yeah, I'm thankful that.
Speaker 2:I didn't suffer any damage or have any issues, but we had to cut the vacation short to ensure that we got away from any of the horrible damage of the hurricane. I was extremely disappointed because I had a lot of things planned and I guess Mother Nature didn't want me to have that fun. I still took the vacation, though I just did other things other, uh, other than what I had planned to do, uh, in the water. So I will go back and read that, though, um, and that's why I missed it. So that's a. At least I don't feel as badly now because I do read what you have. Uh, you're on my list and I see the post that you create. So, um, the post that you create. So I'll look at it afterwards.
Speaker 2:I have used Copilot, though, on some of these posts not yours to say give me the summary of this as well. And even on emails. You know, when I was away, for example, there's email threads. I didn't realize that you could highlight all of the emails and say I did realize, I tried it and summarize this for me. Example there's email threads. I didn't realize that you could highlight all of the emails and say I did realize, I tried it and summarize this for me. So those 10, 15 emails. It just created a summary for me and it was quite accurate, so I appreciated that as well.
Speaker 3:We're using these summaries also on meetings and for support requests that come to us, and what I'm seeing sometimes is that the summary is wrong in some details and you have to be careful when you read this.
Speaker 1:Yes, that is key. You have to validate and make sure that it makes sense.
Speaker 2:Oh well, I think it works okay. So let's go back to our. Did you come back with your topics that you want to talk about? Stefan, for the code review? No, I'm having fun with the conversation. My mind is now thinking about Copilot and the code reviews and the process and the code reviews and the process. Now, when it comes to code reviews, who should do the code review? I know it's somebody else that's in there. I noticed, stefan you talked about last time that sometimes you would take a look at your own because you're doing a lot of the independent consulting. But within an organization, who should do the code reviews? I know that it can be a learning tool for some developers. You know I found some having them take a look at code doing code user work with them. They were able to learn from seeing code of others. But is there a a particular level of developer that should do it or a particular person in an organization that should do it, and how can we define the rules of what they do for a code view?
Speaker 2:I'm still stuck on this. I don't know if I'll ever get the answer. It's similar to what you say with the clean code. I don't know if you ever get there, but for a code review, how can you come up with the rules for what someone should look for?
Speaker 3:That's difficult. In our organization it's mostly a team member and in web cases, when, for example, somebody externally requested a feature from me and I am then pushing it to a pull request, then the requester if he's also a programmer, then I'll let him check it again, but usually it's just somebody from the team, and if I need to choose from my team members then I tend to those who are as nitty as I am. I still call you nitty.
Speaker 2:I still call you nitty.
Speaker 5:by the way, you'll always be, you know I think, um the there is no ideal reviewer. I think everyone should engage in code reviews and everyone should get reviewed, like the seniors. Senior should get reviewed, maybe by junior, just to get new ideas. Like why are you doing this stuff like this? And just because they did it like this the last 20 years is not an answer. There should be a reason or learning vice versa.
Speaker 1:So, um, yeah, probably just everyone, everyone that is a good point because, um, you know, I I don't. I don't believe that it has to be a senior developer doing the only review. I think, like Stefan, like you said, everyone should be involved. It does give you more of a collaborative approach to a solution that you're building, to a solution that you're building, and you'd be surprised that some junior developers may have a different perspective, especially the ones that are maybe coming from a different language or code language, because we all know that ALs continue to evolve and become more and more modern, that they may have a different perspective, especially if they're coming from a different language. But, good, good, call out on there that everyone should be able to have a chance to review someone else's work, even though you've only been doing it for a short period of time.
Speaker 5:no, I mean maybe the maybe the question would be if a junior should be the only reviewer of a junior developer, then you could maybe think about pulling somebody else into review in addition. But yeah, I think everyone should engage.
Speaker 2:You hit the key point of the 20 years and, chris, your topic too, because that's sometimes some of the struggles that I've seen is the old way for those that have been working with Cal, for example. Sometimes those habits I guess you could have with that, and I think we mentioned it last time can be dangerous. So having somebody with a fresh set because it's a fresh mindset could also help with the coding as well too, because some of the coding has become easier because of the addition of different data types or different features added to the AL language, that something that was done 20 years ago, 15 years ago may not be the same A good example would maybe be the name value buffer.
Speaker 5:It was common and best practice a few years ago that we got dictionaries. Now it's yeah, there are still use cases for that table. But yeah, if I just see it randomly in code, I will probably ask why are you using this? Why are you not using dictionaries? If there is a reason, fine. If there is not, maybe it just out of habit was used or whatever. But yeah.
Speaker 2:I'm still thrilled that they added lists and dictionaries so that we didn't have to use all those temporary tables or those, as you call them, like the buffer tables to move a lot of information around.
Speaker 1:So a quick question now. You know, with new features coming in, you know how do you like I think you guys clearly put this out there earlier that it's hard to achieve clean code. I mean, how do you maintain clean code when new features comes out or new functionalities come out, right, so how do you even keep up? I think that's the bigger component, and you know, do you go back and make adjustments? You know, is there a process within your areas that you go back, say this new feature came out, we should adjust this. You know, is there a process or cycle that you have you go through to clean up because of new features?
Speaker 3:My apps, as per AppJSON, are based on the current or at least the pre-latest BC version outside, so I can use the latest features usually and whenever I upgrade to a new BC version. So when I'm raising the minimum BC version for my app, then I always check what are the new features and I try to uptake them as much as possible. And for the question, how do I keep up with that? Well, I actually create blog posts for them where I gather all the development stuff in one post so I can go through it, like through a list, and then that's it. This helps me at least, but this can be done, of course, only if your app is already almost up to date, because if you're having an app that is, for example, based on a really old PC version though maybe still supported, but old then you have other interests to keeping this app up to date.
Speaker 3:Maybe, but in any way the usual programmer doesn't see so much of the new features. They are relying on somebody telling them what are the new features, like we are getting to know next week in the BC launch event, for example, or through blog posts or whatever. I, from my side, get everything from the docs, where it's really written, and and the change logs and so on. This is all the nerdy stuff that I really love to read, but then I try to summarize them for you guys.
Speaker 5:So, um, this is how I try to keep up to date yeah, just today I read your blog post on what's new in v15. Or it's 25 and compiler 14. So, yeah, and my take on that.
Speaker 2:Sorry, I laugh at that, because those numbers always throw me too. It's like it's 25, but it's 2024, wave 2.
Speaker 5:It's runtime version 14, but 13 is it's microsoft should just jump the compiler version to align with bc version. That would be do 26 in april, in april and everybody's you have my vote that has my vote too.
Speaker 2:It absolutely has my vote, and they could just pick it up from there.
Speaker 5:Yeah, and my take on this is a little bit depending on the feature, so I do not go back to all like change all the code. It depends a little bit. For example, read isolation was introduced, which can potentially improve performance quite a bit, and I try to use it everywhere, going forward when I write new code quite a bit, and I try to use it everywhere, going forward when I write new code. But if I would go back and apply this to all the find statements or every code read that's in an app, then I could introduce potential bugs. So then I'm careful. If there is not a problem that I need to fix, then I would not go back and introduce this. If, for example, with the set load fields, I would much rather go back and introduce this. If, for example, with the setLoadFields, I would much rather go back and apply this everywhere, because, first of all, there is a quick fix to do this and second, if I'm looking at the local variable that's not passed in as parameters, then I'm pretty sure that I can definitely know which fields are needed. And then perorf's blog post it's even better if there are JIT loads than not using it at all. So there is not really potential to break code if I do this change and I could potentially really increase performance when I'm applying this to the base tables, like sales header or items with lots and lots of fields where I just need maybe two or three fields of them. So really, for me it depends on the feature.
Speaker 5:But I just today enabled the warning for the, like the, the analyzer warning for the, this keyword, to have it always in front of. So I'm working on a project. I just increased the runtime today to 14. So I can, I can use this, this, and I just switched the runtime today to 14. So I can use this and I just switched the warning on so I can update this and get reminded to use it everywhere.
Speaker 3:Cool. I cannot pick that up as quickly as you, because I usually release my apps for the new BC version a few months, maybe later.
Speaker 5:It's a new app that's not yet on AppSource. I'm just working on new stuff and then there's no sense in doing version 13 anymore.
Speaker 2:I want to do that. I'm going to bump it up today too.
Speaker 5:I'm happy that it came out that 2024 Wave 2 is out now officially, If you really want to see what you can do with this, you should check out my stream on the Jason Rapper, because they really try to go as far as possible with this.
Speaker 2:I will watch that one. When was that? Was that last week?
Speaker 5:No, it's some time ago already.
Speaker 2:Was it some time ago? I worked on the preview.
Speaker 5:Yeah, probably a month or something.
Speaker 2:I will need to check I'll have to look what happened. Is you you listen? I'll be honest, after you went from twitter to youtube, it's tough because twitter gave me a warning. You know it pops up and says, oh, now this live.
Speaker 5:So I jumped on it and with the time difference you need to. You need to follow me on youtube, then you will get that notification as well.
Speaker 1:Yeah, you got to click that notification button.
Speaker 2:Just like with this podcast, you have to click that notification.
Speaker 1:I will click that notification button.
Speaker 2:But if I don't have YouTube open, will I get the notification?
Speaker 5:If you have the app.
Speaker 1:I think you will yeah the app.
Speaker 2:The YouTube app. So I have the app on the phone. We'll try this when you're doing the next stream. I'll do it right now. I'll make sure I follow it with the notification.
Speaker 5:Not sure yet. I'm always saying on the stream at the end that I'm doing them as I find something that I can and want to share, so very spontaneously. So you need to make sure that you click the button to get the notification.
Speaker 1:The notification bell right. Okay, to get the notification the notification bell right, okay, I'll do the notification bell.
Speaker 2:I'll see now now you're playing some no, I will click the notification button to see if it pops up, because I don't have the notifications on for many things on youtube, I don't think for anything I follow, so I could see if I open up and I can see the videos. Right, I have several people that I follow and it shows me that there's new videos, but I will put the notification off. The live stream, that way I can catch it, because twitter I usually have up and it says, oh, this person's now doing live and I'll watch it now in the background uh, maybe I need to think about the twitter premium.
Speaker 2:Then think about the twitter premium, then are you gonna get that check? Don't do that for me, let's try that. Uh, I, I did the twitter premium and it renewed on me again. I I tried it just to see if it was worth it. Then I liked it. Actually, I do like it.
Speaker 5:So yeah, but I think this could be a common issue for many people. I don't don't not not the topic of this podcast, but listen, we can talk about anything, but now I learned something.
Speaker 2:See, I'm learning a lot. See, you can teach an old guy something.
Speaker 1:I have a question for the both of you. Evolvement evolves of AL, you know. What do you see? What would you like to see in the future, or where do you see AL going? I guess that's two different questions. I guess, what would you like to see in the future of AL and where would you like it to go?
Speaker 3:That's tough for me Because there are so much possibilities, but maybe Stefan has some good ideas already.
Speaker 5:I have a meta idea, not exactly for language features, but I spent some time thinking about this in the past and I think I would like to see microsoft breaking more um for language only features like if you have, if, if there is data involved or anything like with with the base app or anything that's. That's off topic, of course, but if you have like data type breaking changes, where you need to rethink the implementation of a certain data type, why not breaking it with a new runtime? You do not need to switch the runtime. You're always backwards compatible with runtime as it gets compiled into c-sharp anyways and and the compiler can handle those those changes. But I would. I don. But I can't think of a reason why I could not change the way the dictionaries work if it doesn't make sense in runtime version 13. I can totally re-implement the thing in 14, and any developer who isn't ready to uptake that change doesn't need to go to 14.
Speaker 2:I like that. It's in a sense I don't want to say forces, but maybe it forces you to move forward and not keep so much around for so long, for it to phase out. And I understand the intent of trying to do the slow change to pick up the adoption. But, as you had mentioned, if you do it with each runtime, you're not forced to do it until you switch the runtime.
Speaker 5:Exactly, and I understand that not all the things can be breaking in that way, because if they depend on the server or something, if the database layer is involved or anything like that, it's it's really hard to do those changes, I guess. But like language only, compiler only stuff, I would really like to see them uptaking and evolving faster. I know that that maybe, uh, others would like to see it slower because we're going fast compared to cl days. But, um, yeah, and my example again I'm promoting myself a lot this episode the json wrapper, where I see that I I just don't feel like the. The json implementation in al makes a lot of sense and I would like to see that cleaned up and and be improved and I think, as far as I can tell, that would be a change possible and would be a breaking change.
Speaker 2:But yeah, yeah, it's not a breaking change in the sense of the application, though the breaking change makes me cringe because that breaking change excuse gets thrown for a lot of things.
Speaker 5:The word is uh, yeah, not best, but yeah in the code.
Speaker 2:It's not necessarily breaking. You just have to re adjust your code for a specific version. As far as the speed of the language evolving, I guess you could say it is going quickly. The only thing that I get a little challenged with is you can't move so fast as well because of the versions of the application with customers and things that are online. With customers that are online, you can go a little faster, but having to readjust the code with each revision, in that case they would have to have an overlap. I wish we could adopt the changes to the code quicker within the applications, but it's tough to go back and have to update some of these apps that are already in place.
Speaker 5:That's absolutely true, but as far I mean, I didn't try, but we probably could use runtime one in BC 25.
Speaker 2:And, natalie, if you know anything else there is, there is a break on that, because I tried that. I forget with with which version there is a minimum version. I don't know if it's published anywhere, but I had some code that I had to switch the runtime to work within that version because it told me that the runtime was not compatible with this version.
Speaker 5:Okay, there could be, but you can go back, I think, pretty far.
Speaker 2:Okay, that's a good solution for it. Though, Natalie, do you know in your docs?
Speaker 3:Is it?
Speaker 2:published.
Speaker 3:Not from my heart, but yes, there should be some documentation, maybe, about it. However, I would always assume that it should always be possible to grab an older runtime than your minimum BC version, but not the other way around. I've never tried this. I always keep it in sync and well, I'm using your Linterkop, stefan, and I think especially this Linterkop strikes out to to to say, hey, you're not in sync yes, there is a rule that checks if you are on the most recent runtime that's supported by the BC version you specified.
Speaker 5:That's right, but it's. I mean, it's a recommendation, just to make you aware that that you're falling behind on features the recommendations weren't good to move the code forward, which is nice, uh, all right.
Speaker 2:Stefan and natalie, thank you again for taking the time to speak with us. Uh, we're talking about a lot of different things, which was uh fun. I also learned about the youtube notifications, which is good. It's totally off topic, but I'm turning that notification on um so I can get the notification of the next stream, because I do like to watch those streams. There's a couple I like to watch, um, while I'm working. You know, in the background you can hear them. Uh, sometimes you guys are a bit early for us over the pond, but if you do it later in the afternoon, I can catch it early in the morning here.
Speaker 1:I do appreciate your both insights, and you know I'm just curious about this. You know you guys answering the way how you're utilizing Copilot, because I think a lot of us are still trying to figure out where it fits, and so I want to say thank you both for sharing that insight.
Speaker 2:Absolutely. I appreciate it and I appreciate all that you do. And I'll go back, natalie, and read about your regular expression post and, stefan, I'll go back. And I didn't see the stream for the JSON wrapper, but I did see the post that you had made about the JSON wrapper and all the conversations about that as well. So we do appreciate everything you do and, if anything, I learned a lot from this episode. So you know, check that off. As you know, sharing some information with somebody, because I'm going to co-pilot chat things all afternoon. You'll see I'm going to. I already know a couple of things I'm going to record and do some testing on. So again, thank you very much for your time. We appreciate all that you do and for sharing your time with us today. If anyone would like to get in contact with you, what's the best way to reach out to talk with you about a little bit of information, to see what you do, natalie?
Speaker 3:Twitter is the easiest way to get me.
Speaker 2:Okay, and Stefan, way to get me. Okay and Stefan.
Speaker 5:Same for me Also. Linkedin works, or GitHub, if issues or something. Discussions on the repositories I own.
Speaker 2:Oh, not to jump over, but I saw another thing you posted and I had asked the question before and I think, natalie, you might have answered. How is that Business Central Discord? I just learned, just learned about discord. See, I'm an old guy and I learned about discord and chris knows where this came from. But the business central discord, um, that I saw that you had mentioned and you had posted a couple times that you would be there for, uh, some time. See, I do see the stuff that you have post and how is that business central discord?
Speaker 5:it's huge actually I I somehow forgot to have it open for half a year or something. I've I totally forgot about it as well. Now I'm, I'm on there as well. So again, a discord is also a way to to reach out to me. The discord bc server uh, jeremy visca is the host of it. He, he created it and I think there are I would need to check 500 plus people, 1,000 maybe something in that area and it's really active.
Speaker 5:There are multiple channels also, like beginner question area, where no stupid question stuff, where you could just ask, and there are pretty active people on this.
Speaker 2:Chris, we have to get on there.
Speaker 1:Wow, well, I did join, but, like what stefan said, I just forgot it was there.
Speaker 2:You know, forgot to check well, I've learned about I mean, I heard about discord and, again, there's so much technology in the world today and it's tough to keep up with everything and know about everything. And I've heard about discord before but I never really paid any attention to it because of, you know, there's twitter, there's linkedin, there's all these other you know social engagement type, you know um platforms, and then, once I got discord, I was like, wow, this would be a cool little thing for business central. That's why I asked about it, so I'll have to join it and check it out. And is it just something where there's several channels and you can join a channel and people are talking and asking?
Speaker 5:questions. You're joining the server and you can see all the channels and engage in all of them. You do not have to, obviously, but you see what are unread messages and what's going on.
Speaker 2:Is it mostly written or do people talk?
Speaker 5:It's written, but there are a few voice channels as well, also limited voice channels, like with maximum capacity, where you can have just a one-on-one without anybody being able to join if that's necessary. I do not see the voice channels being utilized frequently, unfortunately. But uh yeah, written is is huge I'm going to say another thing.
Speaker 2:I'll have to check natalie.
Speaker 1:Are you on get? Are you on that discord?
Speaker 3:um, I've been there, but I didn't visit for a long time, and which is only due to the fact that I don't like discord such a lot, um, but, but the community back in those days where I've been there is is really good. I I cannot say anything else really, but it's just another piece of software that I'm I absolutely don't work with at all. Plus, in our company, discord is prohibited.
Speaker 5:Oh yeah, yeah.
Speaker 2:So at least you have the same understanding. I don't feel as badly because it's another thing to follow, but I do want to check it out. I think I'll join it and check it out.
Speaker 1:Even AJ Kaufman's on there, posted two days ago.
Speaker 5:He's the most active replier as far as I can see, even AJ Kaufman's on there Posted two days ago.
Speaker 1:He is the most active replier as far as I can see.
Speaker 3:Yeah, I'm just checking it out. I have to put it on. He does a really great job with that community.
Speaker 5:Yes, yes, yeah, and if anyone has any questions regarding APIs, it's probably the best way to reach out to AJ. Go to.
Speaker 1:Discord.
Speaker 4:Okay, we'll put that on the show notes in case anyone's interested on Discord.
Speaker 1:But yeah, there's beginners, there's talks about PowerShell, devops, docker, I mean there's quite a bit of.
Speaker 5:Also a few local language channels and if anyone's missing a local language channel, I think Jeremy will just edit.
Speaker 2:How did you find it?
Speaker 1:Chris, I just got that. I said I've always had it in there and I just never looked through and I just didn't realize there's actually so much in here. I don't want to create a server.
Speaker 2:I want to find a student group or a club. I don't know, I'll figure it out afterwards. I can't read to create a server. I want to find a student group or club. I don't know, I'll figure it out afterwards. I can't read on the phone. But again, thank you both for taking the time to speak with us and sharing your insights and all that you do for the community. I really do appreciate it and I look forward to speaking with the both of you soon. All right, thank you, ciao, ciao, all right thank you both.
Speaker 2:Thank you, chris, for your time for another episode of In the Dynamics Corner Chair, and thank you to our guests for participating thank you, brad, for your time.
Speaker 4:It is a wonderful episode of Dynamics Corner Chair. I would also like to thank our guests for joining us. Thank you for all of our listeners tuning in as well. You can find Brad at developerlifecom, that is D-V-L-P-R-L-I-F-E dot com, and you can interact with them via Twitter D-V-L-P-R-L-I-F-E. You can also find me at matalinoio, m-a-t-a-l-i-n-o dot I-O, and my Twitter handle is matalino16. And you can see those links down below in the show notes. Again, thank you everyone. Thank you and take care.