Audio file Medusa.output.mp3 Transcript 00:00:10 Matt Welcome back everyone to the Xamarin podcast, keeping you up to date with the latest and greatest in mobile development. For Xamarin developers, covering the world with xamarin.net Azure and more, I'm Matt Soucoup and today's podcast we're talking about another cool app built with Xamarin called Siren field user, created by a company called Medusa. 00:00:31 Matt This app is pretty cool. It helps paramedics provide better health care in the field. 00:00:37 Matt And today I'm joined by Dan McDonald from Medusa and Dean Faisal from the mobile customer advisory team at Microsoft. So Dan, can you tell our listeners a little bit about yourself and the app called Siren Field user? 00:00:52 Dan Thanks Matt, I just want to thank you and appreciate the time you folks have spent to put this podcast together. 00:00:58 Dan And thanks for having me here. So my name is Dan McDonald. I've been in it for about 30 years and I'm the VP product development at Medusa Medical. 00:01:08 Dan And our science field user app is used by paramedics in the field or mobile clinicians and the idea is to make their job easier so they can do better. Patient care and chart that patient care better. So you get a better patient patient outcome at the end of the day. So it's an app that's been used for about 20 years, open the market and we're pretty excited to come up with a new version of it. 00:01:30 Matt Well, it sounds really, really interesting, especially about how it's not a new app overall. But the mobile portion of it kind of sounds like it's a little bit newer, and what will dig into that? Like specially like what how it's built an why Xamarin and some of the performance not performance, but the overall architecture issues. 00:01:51 Matt And challenges that you ran into. But first before we get into that, I want to talk to Dean a little bit. Dean. What was your role in this app? We know a little bit about your background and actually tell us a little bit about the mobile customer advisory team. It's always fun to hear what you all are up to. 00:02:08 Dean Definitely yeah. So I'm Dean. I work on the mobile customer advisory team. We help customers with all sorts of mobile solutions, but we do specialize in Xamarin. On my team, we we definitely help bridge the gap between customers and product teams. So we help. 00:02:29 Dean Kind of with alignment connecting the pieces. Sometimes we even do some cool engineering sessions with the customers. In this case with Dan, we did design sessions. We did all sorts of things around architecture and also UI testing things like that. 00:02:48 Matt And we'll get into a little bit more about how you helped out, but Dan, alright, so silent field user is. It's been around for a little bit, especially the back end for it so, but why? Why did you go with a mobile app? What was what's the reasoning behind creating a mobile app here? 00:03:08 Dan Well, we work in about 10 countries around the world, and in one particular market in the UK. Basically the market spoke to us. So are Windows apps been around for about 20 years. Very stable app and this market they start to say hey. 00:03:25 Dan We actually want to interact with our end users. Are paramedics better? And So what the market said is we're going to issue. 00:03:33 Dan IPads to everyone of our medics in. Some of our customers they might have 4000 medics, 5000 medics and to issue a ruggedized Windows device, which is what a lot of our customers use today. The cost of those versus an iPad? There's. There's a pretty big cost difference. 00:03:50 Dan And so they want to be able to offer other apps on those iPads. So scheduling HR, email and so you know my team didn't have experience in that whole iOS world got a super talented team. I couldn't ask for a better team, we just didn't have that expertise. But we also had a vision that we wanted to be able to have an app that. 00:04:12 Dan Could run on any operating system, any platform, and really be the same core app and that would give even more flexibility as we have some customers who said, hey, you know we'd like to have Android. You know, some Android devices are cheaper than iOS devices. 00:04:27 Dan There's different features between those devices, and so although the market had some tenders that came out in the UK that specifically said iOS, we didn't want to lock directly into that, so we didn't want to create just a native app in iOS and then have to do a whole different code base in Windows and a whole different code base, you know. 00:04:46 Dan In Android, and so we had to quickly make a decision because there was a tender that came out that had a really short kind of fuse on it. 00:04:54 Dan And so we went out, and we found a partner, MNP, that I'm extremely happy with, and they had that Xamarin, Android, iOS experience. And so we basically augmented our team that has all the knowledge of our app and our market space and we kind of had the best of both worlds and put the big brains together and then started on this project and so. 00:05:15 Dan IOS was obviously the first release we wanted to do, but but Android and you WP is definitely on that road map. 00:05:23 Matt Sweet sounds like the classic Xamarin use case. You have it running on generally a windows. I mean, the app already exists. You had a running on Windows and now you need to expand it to iOS and possibly Android. 00:05:38 Matt Makes total sense to reuse some of your some of your existing logic. Your existing libraries, let's bring it over to Xamarin. Why not mix? Makes makes sense? That's what that's the. That's the benefit of doing it this way. Alright so? 00:05:53 Matt Then the we had a quick tour of the app just before we started recording and bring our listeners kind of up to date and what we're talking about is. There's a lot of fields in this app as the the paramedics can use to just enter data about the person who needs help and and like some of the things would be like date and time like. 00:06:14 Matt When? 00:06:15 Matt Like the well, the I'm just going to make stuff up here. Like when the accident occurred and like what type of injuries the patient sustained and stuff like that. So tell me about the user interface 'cause there are just a ton of fields on here mean that the parents could enter. 00:06:33 Matt So as we were talking, you told me some pretty cool things about all these fields and how they're created. 00:06:40 Dean Definitely yeah, there's a ton of different screens, tons of different fields like you mentioned and. 00:06:47 Dean The the funniest thing when I came to the team and I I wanted to look at the code. There was only like one or two actual XAML pages and that was it. And the whole code base. So I'm like where where is all the UI right? And that's when they explained to me that it's all generated from configuration which is very rare. 00:07:07 Dean Or from what I've seen. 00:07:10 Dean Usually we come from like XAML first or code first, but in this case it was just like back end. First, it's all from configuration and then they parse it into controls. So that was really cool and. 00:07:22 Dean Like you said, there's all sorts of combinations of controls. All sorts of dropdowns and datepickers, and. 00:07:29 Dean All sorts of pickers, even an another cool type of field that they have is this screen where it actually pulls up a picture of a human model and then the paramedics can actually pick regions on the model to say like where the trauma is, what sort of injuries they've sustained and things like that. 00:07:52 Dean Um? 00:07:53 Dean Yeah, an it's definitely really cool where they're pulling in all this data and parsing it locally and then they have all sorts of customization options where it can be different based on the user based on the customer who's using it or their accounts Even so. 00:08:14 Dean Definitely a lot of cool customization there. 00:08:17 Matt Alright, configuration first programming, that's that's, I guess that's kind of a new one for me and Dan. Can you tell us a little bit about how you decided to go that route instead of just doing like XAML or or code first? I mean, it's that's not the typical way people go. So what? What influenced those choices and why did you go that way? 00:08:38 Dan The big reason was because we already had a Windows app several years ago and we put our big brain people in a room and we had a challenge. Like a lot of companies did, you know, use original app as a VB6 app and so you might add 10 developers and they all went off and build their own screens and it wasn't common architecture. 00:08:59 Dan Everybody had a database table separately for every screen, and so we wound up with the boat on oh 800 database tables to represent all the data that you can collect in siren, right? That's a lot to maintain. 00:09:12 Dan And so we sat down and said, hey, can we come up with a generic way of representing that and so we created a technology we called Dad Dad, dynamic application design and we're able to distill those 800 separate tables down to about 6 database tables. And it's it's it's a generic structure. 00:09:33 Dan It has this parent child relationship concept and then the concept of properties and So what we do is we configure these controls. We have sort of 1010 or 12 controls in our app, so a datetime a numeric field, a text field. 00:09:49 Dan What we call a button list, which would be the equivalent of a dropdown list box in the web. We represent that as a bunch of buttons you would pick one or many from, and so it says what 10 or 12 of those rich UI controls. 00:10:02 Dan But the idea is we built this generic structure that will define all of those and then be able to store that data in a generic structure. So we've got thousands of screens in our app. 00:10:13 Dan That you know it take you forever to go through every screen if you want it to to collect all that data, but they're actually all the exact same control. They're just configured differently, so the name of the fields different, whether or not you can pick one button versus many buttons, different states of the buttons can be configured, the order that they're on the screen. 00:10:33 Dan There's a huge amount of these properties, so like in it to your Visual Studio, you have those properties in your Visual Studio property pane. That's kind of the model that we followed. 00:10:43 Dan And so we had that running in our Windows product, and so we really needed to have the Xamarin product follow that same model, and so because of that, every screen is dynamically built. What based on how you configure it? So as Dean said, you might load one configuration for a customer. 00:11:03 Dan With the exact same code, the same release of our software and I can load a different version that all the screens could be different, different fields on them. Some are visible, some are different orders. 00:11:14 Dan Um, it's pretty wide flexibility, but you know the challenge for us, then, is that performance factor, because in a normal mobile app you have a static Dean set of XAML page. Wow, the app can draw that really quick. We basically have to load that configuration out of a SQL Lite database, put it in a memory object. 00:11:34 Dan And then basically render the controls in real time. Both the navigation and the data entry controls and so we had to spend a lot of time around understanding performance in the Mobile World because in the Windows world we had a lot more horsepower in our Windows devices that we had running field user. 00:11:52 Matt So yeah, I wanted to talk a little bit more about performance. So are you still using all the built in Xamarin forms controls or did you have to drop down and do any custom renderers for it? So I guess speaking just for the dynamically rendered portions of this. 00:12:09 Dan I'll let Dean he might be able to give you some better examples. Our goal was. 00:12:14 Dan To leverage the power of Xamarin was to use this little custom renderers as possible because we want to have most of the same code base. 00:12:24 Dan For us to be able to compile into native apps for all three platforms through Xamarin. So when we had to make some usability product decisions, we would tend to lend ourselves more towards, well, let's tweak our functionality versus going to a custom renderer. There were some instances in the UI where we had to do custom renderers. 00:12:45 Dan I believe an example would be for the date time Picker in iOS. 00:12:51 Dan We need to have the ability to when you go into a date time control to pick prior to arrival or unknown. So I get to the scene and there's a person there that said I gave CPR and they don't know when they gave it for any other treatment I give I need to give a specific time 'cause I did it but if it was before I got there I need to say CPR was given. 00:13:12 Dan So we need to have a little button in the top of the datetime controller picklist. You know where there's usually one that says like current or clear. We need to add 2 new options there and that was a custom renderer. I don't know Dean if you can remember any other ones that we discussed with you, but there's very few of them that we've had to do that and that was the power for me of. 00:13:32 Dan The investment that this would put into Xamarin that I didn't have to do those custom renderers very often showed me that the framework was pretty extensible. 00:13:41 Matt So Dinam as far As for the performance went with these dynamically rendered controls. What did you notice? Or did you have to really tweak it to make things work fast, or did it just kind of you read that perform or you read the configuration file you popped him on the screen, and then you went home for a break? 00:13:59 Matt How did it go? 00:14:00 Dean Yeah, there was a little bit of pre planning that we had to do because another cool thing about the app is that it used Xamarin forms shell. So with Shell you do have the ability to kind of. 00:14:14 Dean Um? 00:14:15 Dean Cache pages as like templates right for Shell sections so you can have them load when the shell loads, or you can have them load on demand, so in some cases we did have to play around with kind of that loading time, right? When would be the best time to actually draw the controls? Would it? Would it be before the user access them or should things come on demand? 00:14:36 Dean Um, so kind of that kind of level of analysis in terms of the performance, but in most cases I would say it was on demand so. 00:14:51 Dean Because of the mobile layout, right? The I think the way they designed it was very smart, where the screens weren't as crowded as they would be like on a desktop app. So that helped a lot with performance in terms of like you get what you need when you need it. 00:15:10 Matt Being one more question about about this whole dynamically rendered thing, actually I got two more. Then I'll let it go. 'cause this is just really interesting to me and I have seen this happen like in websites and stuff like that but and I actually seen it once before in a salmon farmers wanted, and strangely enough it was a sample app that Microsoft released that did this a couple of years ago. 00:15:30 Matt But anyways, alright 1 final question. Well, the second final question, the penultimate question Dean is how did you do the the performance measurement? I mean you mentioned that you went through and you kind of tweet or you went back and forth between using the shell templates and to see if you should have 'em in memory beforehand. But how did you actually go through and do the measurement to find out? 00:15:52 Matt What was loading faster? 00:15:54 Dean Yeah, so from from my involvement with the project. 00:15:59 Dean It was kind of in the I don't want to say beginning stages like in the middle stages when they were kind of set up, we'd look at different pages, just like at a high level and just from our own perception and not really do any sort of telemetry at that point. And kind of do analysis that way. I'm not sure, Dan. 00:16:20 Dean How the team tackled that after or if it? 00:16:24 Dean How they approach that? 00:16:27 Dan Yeah, and I'm not sure if we got into setting timers. I think there was a few things that we said. Yeah, let's put some timers inside of things to see start and end to find out the performance of those things. We've also had a balance. We've tried to do a balance in shell between. 00:16:47 Dan Rendering things immediately and having a pause in in. I think it was in a xamarin forms 48. We were seeing an issue where we're having some. 00:16:59 Dan Issues if the user went through the navigation too quickly. 00:17:03 Dan That a screen wouldn't render properly and had something to do with the collision of timing, and so we put a little bit of pause. That said, let's wait, you know whatever couple. Build a seconds after a navigation click has happened before I start to draw. And that way if a user is tapping a whole bunch of navigation quick, I don't draw. Still kind of it settles down. 00:17:24 Dan So we did have to balance a little bit there around that type of timing. 00:17:30 Matt So let me get that straight, then you intentionally slow down the application. Isn't that crazy? 00:17:37 Matt That's all fast, never. And is that you have to intentionally slow it down. Yeah, so. 00:17:41 Matt The user could catch it, yeah? 00:17:42 Dean It's it's more like throttling, right? Like when yeah it types insert and you're trying to autofill and you don't want to autofill on every single keystroke immediately. 'cause they yeah exactly. 00:17:56 Matt One more question then I have about, but the dynamic rendering and this is the final one is that when we started talking about this you said you had pretty much. It was just one control that did this all. So you can explain that just a little bit more mean is it just like one date time control or did you subclass all the controls into your own like Medusa Super Control? 00:18:16 Matt So it can like pull all the extra properties so you do. You have like 1 meta control for everything? Or are you really just using one Xamarin forms control here? Or am I just getting everything wrong? 00:18:26 Dan Yeah, I think I might have described it a little deceptively intentionally, so we have about 10 or 12 controls so you know, there would be a numeric field control A. 00:18:38 Dan Text control a date time control. 00:18:41 Dan A button list control, a grid control, sort of like 10 or 12 of those, but each one of those there's only one type of it, and then there's a bunch of properties or configurations you can give to that. So say it was a grid control. You could say how why each the columns are, you know? And can you delete things? 00:19:02 Dan In the with the left swipe, that type of properties and then you can have 10,000 of those controls in the app, and they're all just configured differently, so each would have a different field name 'cause it's different data you're collecting, but it would be the same control used. 00:19:17 Dan From the UI navigation perspective, all the navigation is shell and then what we have maybe the one control. I might've misled you on was we just have one. I'll call data entry pane or screen which is a flex layout, so that's another Xamarin form control and it's interesting. 00:19:38 Dan When we built our Windows product, we built a a custom version in Windows of that Flex layout and we called it a flow layout and the whole idea was I can drop drop a bunch of UI controls on that. 00:19:50 Dan And give and it knows how to read certain properties and then render them. So the properties that Flex layout looks at are. What are the order of the fields they should show up in the screen? Can I put as many as I can on the line and let Flex layout figure it out or should I can I hard code like Carriage returns and then there's there's UI stylings like a set of fields should be grouped like an address. 00:20:14 Dan So there's a UI kind of grey box and behind the addresses. 00:20:17 Dan There's linked fields you know measurement, like your age in your units, right? So you know, I want to be able to say I'm 52 and then you want to have a dropdown list box or button list that are years, months, days. You know that type of thing and so that's each one of those screens you go to is field. User has to dynamically figure out for the navigation you've gone. 00:20:41 Dan It's all a parent child relationship, so I know when I pick that navigation. I know all the controls that are on that screen because. 00:20:48 Dan They're all children of that navigation node and then the flex layout basically gets thrown. All those controls with all those properties and says draw this for me, and that's all done in real time. Where like we talked about a lot of apps are predefined with XAML and it's all the same and it's just, you know, content that's different. Ours is that like we talked before is that that? 00:21:10 Dan Data driven development is quite different, and so with the structures. Sorry with the structures we've built and how we've built these is. 00:21:20 Dan As we want to have new controls or add properties to controls, I can add a new control like code like development and now that controls available on every screen. Or if I add a new property to a control it's available in every screen and we have this tool called Configuration Builder that a non developer. It's kind of like a the old style HTML editors, the wysiwyg's. 00:21:41 Dan You basically just pick which control you want, drop it on the screen, tell it what you know you want, the name of the field and all the properties you want, and now it's in the app automatically. No code needed, it's all done dynamically, and that's one of the big drivers for us with that Dad technology. 00:21:57 Dan Is now if I want to have 50 or 1000 new screens, I don't have to do any development and release, do a new release of my software. I just configure it in Configuration Builder an it basically applies that configuration to the database. 00:22:11 Matt That is, so. I mean that is super interesting and thanks for going through all of that because I mean really, you kind of did. 00:22:17 Matt Created a you have the app. You have siren fuse field user but you also have this meta app so to speak. Sitting on the background that creates the user interface for Siren Fyfield user which is super super interesting. So I finally I'm going to transition off of the dynamic rendering. 00:22:36 Matt And go to where the dynamic rendering comes from and it comes from. As I understand a SQL Lite database where he kind of pulls out the configuration, but what else are you all using? SQL Lite Four within Siren Field user Dan. 00:22:50 Dan Right, so that SQL Lite database stores that configuration and then. 00:22:56 Dan There's just one database table that stores all the patient data, and so it doesn't matter which type of data is a datetime control a blob. 00:23:06 Dan It stores into that same database structure one table, and that allows us. Now all these tools can work off that generic data structure. I don't need to know that there's these 55 or 100 different database tables to get data from. It's all the exact same database table and what we drive is everything off guids, so every. 00:23:26 Dan Every item has a gooed to it, so I know guit. 00:23:30 Dan I'm just going to use 55. It's not a true guit, but they give it ID 55. I know that means CPR treatment as an example and so all I need to know is that gooed and I can get that data out of the database where in our old days some would have to find out what the table name is that had CPR, find out the columns in it, right? 00:23:51 Dan A separate SQL query. 00:23:53 Dan This way it's the same SQL query, I just need to know what the gooed is and so it gives us a lot of flexibility. But what we we have in our configuration, I'll say is kind of your standard configuration of data. But then we've got data that the our customers need to change more frequently, and so in the ambulance or the EMS space every customer. 00:24:13 Dan Names their vehicles a different name. They have different users, they have different receiving locations that they transmit or transport their patients to. So we have a back end Web application that allows our customers to type in what we call that reference data. 00:24:29 Dan And then what happens is they they fill that data in the in the web app and then it automatically syncs that data out to every field user as long as they're connected, and if it's in a disconnected state, the field user as soon as there's connectivity, it automatically communicates to the server and we have this background service. I think in iOS 13 they called it a background task. 00:24:50 Dan And it's basically a polar, so it wakes up every period, let's say every minute, and that that particular iPad with field user on it sends a message like a heartbeat to the server and says, hey, I'm this particular tablet tablet with Dan McDonald logged in. What data do you have for me? 00:25:08 Dan And so we built this custom message messaging layer that communicates over a web service back to our server, and so let's say oh for that tablet with that user. I've got a set of data from 911 dispatch for the patient, so you can bring that down. You asked to do a patient look up. Here's your data for patient look up. 00:25:28 Dan Oh, there's some new users that were added or edited. Here's your user data, so we have this constant heartbeat communication going on between Xamarin Field user and our server, and so there's a huge amount of data flow that happens coming down to the tablet. 00:25:45 Dan And so we had to build our own communication layer because one of the big challenges we have is that we're different than a lot of other mobile apps is we have to work offline. So a paramedic can't be. Oh, I don't have Internet access, so I can't do my job. And so that's part of why we use the encrypted SQL Lite database locally is we store all that. 00:26:06 Dan That patient data that we're recording in that SQL Lite database. 00:26:10 Dan And every piece of data that's entered. So every control you interact with to put data. So if I picked a date time or I put in a patient name every one of those is a discrete piece of data that goes into the local SQL Lite database for the patient record. But then it goes in as a discrete message to our messaging layer. So as long as. 00:26:30 Dan The field user has connectivity to the server in real time. Every data entry you put in goes to the server, so where a lot of like web apps and mobile apps you kind of one page. You fill all the data and you hit next or save or submit. 00:26:45 Dan We don't work that way. We need to have the data in real time and so every single data entry thing you do is a separate message. It goes to the server and so we built up a robust I call intelligent messaging where that data we actually adjust. How big of a package of data to send to the server. 00:27:06 Dan Based on how good the network connection is, so think of it like Mail. You know Amazon does this right. Hey, I'd like to get five things in that package I'm sending to you, Matt, because it's more efficient. 00:27:16 Dan Well, I'm not going to wait five days. You know to get that fifth item I'll send you 4 today and I'll send the other one later. And that's kind of what our software does in real time. But it measures it. There's an acknowledgement message from the server. So when I send a packet from field user to the server I get an acknowledgement back to let me know how long it took for that message to go. 00:27:37 Dan And so if it took a long time, then we are intelligent messaging dynamically. 00:27:42 Dan Pairs back the size of those envelopes that I'm sending, and then if if it goes really quick, I build them back up dynamically and so that's the stuff that was challenging to do in in the iOS world, because you've got to be really conscious of battery consumption and memory usage, and so I've been really impressed with what we've been able to do in Xamarin. 00:28:03 Dan That we're able to have that intelligent messaging and you know it's not draining the battery. You know instantly. 00:28:11 Matt That's actually super amazing that I love that you're only sending what you need up there at a time, which is a lot of what a lot of people have front of mind when you're developing a mobile app and you kind of compared it to what Amazon ships you there. There's a joke in there, Dan about. Maybe sometimes you get this huge envelope with just a little bit of data. 00:28:33 Matt In there but. 00:28:34 Matt Kind of how Amazon always sends you. Sometimes a big box with hardly anything. 00:28:38 Dan And lots of bubble wrap. 00:28:40 Matt Yeah, lots of bubble wrap, so maybe there's bubble wrap in there. Anyways, I'll so another thing that really we're really struck me as you were talking before is that patient table. There's only one. There's only one table there an so that kind of makes it easy is that. 00:28:56 Matt Nothing is easy, but it makes it straightforward when you, when you conceptually think about it, is that every piece of data is a own separate row as far as when you go sync back up to the server, which lets you do it a little bit easier when you're offline, in that you can really have a. 00:29:14 Matt You have a cure an, so I go in and I enter a date time of when I started my service and then I have another another row of saying this is what I you know. When I started CPR or that I started CPR and this is when I started an tell me if I'm wrong Dan on all this. 00:29:35 Matt An that kind of streams up to the server when I connect back online piece by piece, one row by one row and it makes it easier that you don't have this huge relational data sitting in SQL Lite with like. 00:29:48 Matt CPR, row CPR table and. 00:29:52 Matt Yeah, whatever head trauma table and all that stuff, you just have one an just goes up one by one and that really helps out when you're doing mobile development and you have this flat table structure. So did I paraphrase all that correctly. 00:30:06 Dan You did, and there's one other. 00:30:08 Dan Twist to the data that we use. You know where medical device. 00:30:12 Dan In often you get sets of data and it's really important that that set of data has to go as a transaction. 00:30:22 Dan And so you don't want, say, part of that data somehow to be there in other parts, not so the example I would give you know. 00:30:30 Dan Age, so the number 23 for age makes no sense to anybody unless I say the units years, months or days. So we actually had to have this ability to have a transaction. That said, I can't put 'cause those are two different fields. One is the age number and the other is the unit. And so I can't have. 00:30:50 Dan Just one of those go into the database because without them together it's nonsense data, and so we actually had to build this concept. 00:30:59 Dan Of a change queue. 00:31:00 Dan That actually runs in Xamarin Field user in memory in. The idea is whenever that piece of data is entered, I need to do a couple things with it and these have to be done as a transaction because they have to not only be in the local database, they have to make it to the server and be guaranteed to that and so this change queue coset concept says. 00:31:21 Dan OK, I'm the UI. When I've done a entered an you know is the first name field that control now knows I need to change. I need to send a message to the change queue and it says OK, it's first name. It's it's not a set of data. I can just stick that on the change cube and then the change. Q has to. 00:31:41 Dan Um? 00:31:42 Dan Transactionally, store that name in the local Seattle at SQL Lite database and put that record in the message queue for that intelligent messaging. If those both can't happen, it needs to back them both out because I can't afford to have the SQL Lite database not get that data, but the server does. Now I've got 2 records that aren't the same, which you can't have. 00:32:04 Dan But the sets of data it would need to go in and say, yeah, I if its name. Sorry if it's age I need to make sure I could put the you know the 50 in there for the the the value and then years for the units. If only one of those can go in I need to back them both out and so we had to build these layers. I call them frameworks or infrastructure. 00:32:26 Dan That you wouldn't see in in any other app, because again, you might just have one page you hit save on and then you do your analysis on that page because I have to do each field by itself. But one field might have a relationship to 8 other fields or 20 other fields. 00:32:43 Dan And so there's a. There's an added layer of complexity in computation that needs to go on and go on very fast because you can't sit there and hold the UI up well. Figuring all this stuff out. 00:32:54 Dan Not Dean, I don't know if there's any stuff you want to talk about around the change queue piece, as I know that was a tough one to get our head around that you just wouldn't see in any other mobile app. 00:33:04 Dean Yeah, so the team had a lot of use cases where they needed to do a lot of parallel things with async and await, so I pointed them to the TPL Dataflow library which helps with a lot of this kind of structuring. Asynchronous data flows, right? 00:33:25 Dean In terms of how. 00:33:30 Dean How things can be arranged and how things how certain data points are dependent on each other. So that was a really useful tool that was pretty specific to or that was a great fit for this case. That is, I want to say underutilized. 00:33:48 Matt So here here's the thing I took. When you take a look. 00:33:51 Matt At this app initially I mean from 1000 feet away. It just looks like it's forms over day. 00:33:57 Matt I it it's super, you know it's easy to understand but there's just so much going on underneath it as as we've been talking about. So Dean, what was the most difficult thing when you come in and on this app? Pretty much you know, it's there's a lot of it's opinionated way things are happening. What was the most difficult thing to get up to speed on? 00:34:17 Matt And the second thing here is, what were you most proud of, as as you and the team came together an finish some things out. 00:34:25 Dean Yeah, I think definitely the. 00:34:28 Dean Um page generation or control generation kind of threw a curveball at me, 'cause I'm very used to looking at XAML, seeing what's wrong if there's too many nested layouts. Things like that, right? But in this case, since it's any control can be anywhere at anytime, just based on configuration. That's kind of hard to tell, right like? 00:34:50 Dean How would you not have too many controls on one page, right? So things like that that was kind of hard to wrap my head around in the beginning because like on. 00:35:03 Dean Um on demand. You have these controls being generated and you can't really just look at it. Look at look at XAML or look at code and debug it right. 00:35:15 Dean So that was really interesting and then also the data flow part. Um, that was kind of a mindwarp like trying to understand how they needed to. 00:35:30 Dean Consolidate blocks and tasks. Things like that. Just getting that sync layer. 00:35:38 Dean Designing that sync layer in a way that it made sense, especially with iOS with the background background service, because iOS itself has a lot of control over that, so I'm kind of rambling right now, but those were two of the biggest kind of challenges with helping out with this project. 00:35:58 Matt It must be pretty rewarding though. You have all the just getting a handle on him and overcoming 'em and then seeing the coolness of it, knowing that it's it's different than what a lot of folks are trying to do and it works. And so that's that's super. That's super nice, yeah? 00:36:15 Dean Definitely like you said, like at the surface level, it's it's an app, right? 00:36:19 Dean But you dig underneath and this is so much to it, but yeah. And and definitely. 00:36:26 Dean As it is a kind of a paramedic app, it's very like mission critical, which is also very rewarding. 00:36:32 Matt Yes, yeah, absolutely. The app itself is. That's one of the things we're trying to feature here on the podcast are apps that kind of stick out, and this one definitely does because it's really it helps people. It really, definitely it helps people. 00:36:46 Matt So then kind of the same question over to. 00:36:48 Matt You where are you most proud? 00:36:50 Matt Of about this app. 00:36:52 Dan Yeah, I think from my perspective is it maybe it's it's the app or in the team we put together is, you know, we went from knowing nothing about iOS and Xamarin to ramping up very quickly, both with my team and the MNP team as well as the the Microsoft team and. 00:37:12 Dan You know we did a lot of kind of prototyping. One thing we did in this project we hadn't done before. His TDD test driven development. So we made a lot of use of the automated unit test frameworks that Microsoft provides, and I think we've got 600 automated tests right now. 00:37:31 Dan And we really tried to leverage one of the reasons we picked salmon is we're a Microsoft shop for a lot of the things we do, and so you know, we had a lot of existing.net code that were like, hey, if it's not UI so that messaging layer. I talked about the intelligent messaging layer for the most part we were able to bring that over from our Windows product. We had to do some tweaks to make it work. 00:37:54 Dan Net standard I think was in Dot Net 4 seven or four 8. 00:37:58 Dan But you know, we have all that that complicated business logic and algorithms that are tried, and true dinar Windows product for you know 20 years. I don't have to go rewrite that in swift or anything else so that's one thing I'm proud of that reuse as much as we could, especially the high value high risk things that we did. 00:38:18 Dan Um, but I think you know. 00:38:22 Dan For me it kind of stuck home when the MNP Group were dealing with. We've got a team of their group, and at one point we were looking to roll one of the people off. The project is some of the work was winding down and and I got a call from that person's manager and they said I got a problem and I'm like what's your problem? It's like Bob doesn't want to leave the project. 00:38:43 Dan You know Bob's like this? I've never done a project like this before and so and when I talked to the folks at Microsoft Dean and they and other people, it's the same kind of thing once. Once they get their head around this app, I think it's one of those kind of. 00:38:57 Dan Career defining apps that you get to work on. To say I'm going to tell people about this for 30 years, I personally I see it that way and I hope most of the people on the team do as well. 00:39:08 Matt And that has to be a good feeling, and only that you're both helping out the public at large. Yeah, I mean, really essentially saving lives and also making people who work for the app you know, kind of dubious career fulfillment. 00:39:21 Matt And now that's. 00:39:23 Matt What more could you ask for that's? 00:39:25 Dan At the altar, the Holy Grail. 00:39:28 Matt Exactly. 00:39:30 Matt Alright guys, so one last thing that I wanted to talk about or ask you is really, we'll call it the pick of the Pod and Dean. What are you digging right digging right now? Like a TV show or a movie? What's what's really interesting to you? 00:39:46 Dean Today oh man, a couple of things. So I just finished watching Queens Gambit. 00:39:50 Dean On Netflix that was really fun. It's show about chess, so any chess fans I'm sure you'll enjoy or even that is very dramatic. But the bigger than that this year is hoping to catch the dune movie, but. 00:40:06 Dean I just finished the books last year and apparently it's delayed, so I'm looking forward to that. Just trying to hype hype myself up even more. 00:40:18 Matt That sounds cool I I remember I remembered the dune books, but I did not know there was a movie coming out. Yeah, super cool and an same question over to you. What's what is interesting you? 00:40:29 Dan These days, you know. 00:40:30 Dan I think there was an original Doom movie out. Got 15 years 2011 was staying in this Yep. 00:40:38 Dan Yeah yeah, OK. 00:40:40 Dan So I I like that was a long movie, if I recall quite the books were definitely long. I'm just wrapping up. I just finished. I think season two of the boys. I can't remember that's on Netflix or Amazon, it's. 00:40:52 Dan Kind of superheroes, but they're not the best superhero, so it's a very gritty, really well written show, so I suggest people have a look at that. I was really excited about that. 00:41:05 Matt Did where can people find? 00:41:06 Dean You yeah, so I'm on Twitter. If you look for a Dean Faisal, I'm also on LinkedIn. Those are kind of my main social networking channels right now. I don't have a Facebook or anything. 00:41:19 Dean I'm also on GitHub if you search for Sam Cat, that's kind of my team's GitHub. You can check out some samples there. Also raise some issues to reach out to me indirectly. 00:41:32 Dean But yeah. 00:41:34 Matt Yeah I I'll put the XamCat link GitHub repo link in the show notes. That's actually an awesome repo to see a lot of best practices about how your team is developing and recommends developing mobile applications with sample. So that's yeah, that's actually and it has an awesome logo. Thanks, yeah I was. I was telling Alex your manager about the logo and he's like I added. 00:41:57 Matt It goes that great, but yeah, it's. 00:41:59 Dean Awesome, I love it. I don't know what he's talking about. 00:42:02 Matt I do too. Dan, over to you. How can people find you and maybe even learn a little bit more about the siren field user app. 00:42:10 Dan Our websites MedusaMedical.com so you can get some marketing collateral there. I don't do a lot of the marketing social media pieces so I do know we have a Twitter account and a few other social medias. But if you go to the website you have to see the links off of there as well. 00:42:29 Matt Alright, well thank you very much Dean and Dan this has been a great podcast. We really got down deep, especially about that dynamically render controls I. 00:42:38 Matt I found those super interesting, so I kept on asking questions about them, but this is awesome. I mean, I really enjoyed it, so I hope our listeners did to an until next time this has been the Xamarin podcasts.