[{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/","section":"Andrew Rady","summary":"","title":"Andrew Rady"},{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/posts/","section":"Posts","summary":"","title":"Posts"},{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/tags/rails/","section":"Tags","summary":"","title":"Rails"},{"content":"Prototyping With Rails #About a year ago I had to step back into my family business due to a death. During that time I was operating the business while trying to figure out a new owner I was looking at trying to stream line a process that had a pain for many years. It was a fairly simple problem to solve and I had used multiple CRMs geared towards our industry, but none of them had this one feature. So what did I do? I decided prototype an application to see solve my frustration. As a business owner\u0026hellip;terrible idea, but as a programmer..typical! Normally, I would reach for my normal dotnet stack, but I wanted to try out the new Rails 8. This has been the inspiration for the recent Rails posts, and now I want to share the project.\nIgnite Studio #This application was pretty simple and was focused around one core feature. It was a small CRM meant for martial arts studios to track students. The main feature was to stream line the process tracking student ranks. When a testing event happened it digitalized the scoring process and would auto advance the student\u0026rsquo;s rank if they passed. This process manually done was not hard, but it took time and was prone to simple mistakes.\nCore Stack #I wanted to keep the stack fairly simple and use as many built in features that ships with Rails 8. This was just a prototype\nRails 8 Built in Authentication Solid Que for jobs Bootstrap 5 Thoughts #It\u0026rsquo;s been a few years since I properly dove into a full applications and it took a bit to get back into it. One of the main things I truly enjoy about Rails is the convention over configuration principle. Coming from Dotnet the configuration setup can sometimes get excessive. I worked on the same teams with multiple project and each one of them have different configuration setups for the same thing. Sure, you could point that out as tech debt or a skill issue - but it\u0026rsquo;s way more common then what people would like to admit.\nActive Record\u0026rsquo;s method and how to query for data is similar to Entity Framework, but just different enough to get enough \u0026ldquo;gotchas\u0026rdquo;. This has a lot to do with ruby vs c# syntax, but context switch was just enough to where I had to repeatedly look up the docs in Active Record or a stack overflow post\u0026hellip;maybe even ask ChatGPT I did find myself wishing the Active Record has a little bit more flexibility as Entity Framework for more complex relationship setups. To be fair, it probably does and my limited experience was hindering my use of the tool.\nDeploying with Kamal was amazing and I wish dotnet had a companion. It was refreshing being able to setup a \u0026ldquo;simple\u0026rdquo; script and be able to locally deploy my code to anywhere that had an ssh connection. I\u0026rsquo;m use to using Github Action and Azure Devops Pipelines with yaml files. While at some abstract level both of these do the same thing, Kamal gives so much more control back to the user.\n","date":"7 August 2025","permalink":"https://andrewrady.github.io/blog/posts/rails-personal-project/","section":"Posts","summary":"\u003ch2 id=\"prototyping-with-rails\" class=\"relative group\"\u003ePrototyping With Rails \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#prototyping-with-rails\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003cp\u003eAbout a year ago I had to step back into my family business due to a death. During that time I was operating the business while trying to figure out a new owner I was looking at trying to stream line a process that had a pain for many years.\nIt was a fairly simple problem to solve and I had used multiple CRMs geared towards our industry, but none of them had this one feature. So what did I do? I decided prototype an application to see solve my frustration. As a business owner\u0026hellip;terrible idea, but as a programmer..typical!\nNormally, I would reach for my normal dotnet stack, but I wanted to try out the new Rails 8. This has been the inspiration for the recent Rails posts, and now I want to share the project.\u003c/p\u003e","title":"Rails Personal Project"},{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/tags/ruby/","section":"Tags","summary":"","title":"Ruby"},{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/tags/software/","section":"Tags","summary":"","title":"Software"},{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/tags/","section":"Tags","summary":"","title":"Tags"},{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/tags/c%23/","section":"Tags","summary":"","title":"C#"},{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/tags/dotnet/","section":"Tags","summary":"","title":"Dotnet"},{"content":"Query Performance #As Dotnet developers it’s very common to use ORMs like Entity Framework to work with databases. While it’s not the most performance tool, it’s extremely useful and flexible to use. With that it’s important to remember that the methods we use can change the performance of the query. Whether to use a Where followed by a FirstOrDefault or should we just use the FirstOrDefault? And what kind of query statement will either of these make?\nI found a cool little settings you add to your appsettings.Development.json file that will show the query statement used in the console. Which is a incredibly useful thing to look at when looking at the performance of our application. This should work for .NET 6+ applications. In the logging object we can add “Information” values for “Microsoft.EntityFrameworkCore.Database.Commad”.\nExample #{ \u0026#34;Logging\u0026#34;: { \u0026#34;LogLevel\u0026#34;: { \u0026#34;Default\u0026#34;: \u0026#34;Information\u0026#34;, \u0026#34;Microsoft\u0026#34;: \u0026#34;Warning\u0026#34;, \u0026#34;Microsoft.Hosting.Lifetime\u0026#34;: \u0026#34;Information\u0026#34; ,\u0026#34;Microsoft.EntityFrameworkCore.Database.Command\u0026#34;: \u0026#34;Information\u0026#34; } }, \u0026#34;AllowedHosts\u0026#34;: \u0026#34;*\u0026#34; } Recently, we took some time to look over our queries at work. We were able to take the results from these and plug them into SSMS or Azure Data Studio to evaluate ways to improve them.\n","date":"1 June 2025","permalink":"https://andrewrady.github.io/blog/posts/entity-framework-core-query/","section":"Posts","summary":"\u003ch1 id=\"query-performance\" class=\"relative group\"\u003eQuery Performance \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#query-performance\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h1\u003e\u003cp\u003eAs Dotnet developers it’s very common to use ORMs like Entity Framework to work with databases. While it’s not the most performance tool, it’s extremely useful and flexible to use. With that it’s important to remember that the methods we use can change the performance of the query. Whether to use a \u003ccode\u003eWhere\u003c/code\u003e followed by a \u003ccode\u003eFirstOrDefault\u003c/code\u003e or should we just use the \u003ccode\u003eFirstOrDefault\u003c/code\u003e? And what kind of query statement will either of these make?\u003c/p\u003e","title":"Entity Framework Core Query"},{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/tags/typescript/","section":"Tags","summary":"","title":"Typescript"},{"content":"It\u0026rsquo;s optional name parameters\u0026hellip;thank you for coming to my Ted Talk\nHere\u0026rsquo;s why #While there are many features I would like to be added in Typescript there is one major one that needs to make it\u0026rsquo;s way over from C#. That would be optional named parameters. At this point I\u0026rsquo;m not sure how this hasn\u0026rsquo;t been added into the language. Personally, I used it a lot when writing in C# and I\u0026rsquo;ve ran into a few self inflicted bugs that named parameters would have prevented. For those who don\u0026rsquo;t program in a language that has named parameters it allow you to specify the parameter when calling a function or method.\nBelow is an example of a simple semi-pseudo C# code which is a class and a method that takes in two parameters and makes an http call.\npublic static class HttpClient { public static async Task\u0026lt;HttpResponseMessage\u0026gt; Post(string baseUrl, string parameter) { return await _httpClient.Post(baseUrl, parameter); } } Calling this method using the optional name parameters would look like this:\nvar response = await HttpClient.Post(baseUrl: \u0026#34;https://www.github.com\u0026#34;, parameter: \u0026#34;repo=linux\u0026#34;); For small method like this feature might seem overkill and it is. But for larger methods that take in three or four parameters chained with optional parameters this can help save you from passing in the wrong parameter. I can already hear the comments \u0026ldquo;if you write clean code you shouldn\u0026rsquo;t need that many parameters\u0026rdquo; and I hear you\u0026hellip;.but sometimes life doesn\u0026rsquo;t work out like that. You have to make compromises with good standard to meet technical or business goals.\nConclusion #Look I get that vanilla JavaScript doesn\u0026rsquo;t have this feature, but for a language that is modeled after C# this blows my mind?! There has been proposals to add this feature and I really hope that it gets added.\nPS #I know you can get around this by passing in an object, and that is the current common solution. I think that is fine for large configuration needs, but for simple parameters this would be a nice addition.\n","date":"11 March 2025","permalink":"https://andrewrady.github.io/blog/posts/typescript-one-wish/","section":"Posts","summary":"\u003cp\u003eIt\u0026rsquo;s optional name parameters\u0026hellip;thank you for coming to my Ted Talk\u003c/p\u003e\n\u003ch3 id=\"heres-why\" class=\"relative group\"\u003eHere\u0026rsquo;s why \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#heres-why\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h3\u003e\u003cp\u003eWhile there are many features I would like to be added in Typescript there is one major one that needs to make it\u0026rsquo;s way over from C#. That would be optional named parameters. At this point I\u0026rsquo;m not sure how this hasn\u0026rsquo;t been added into the language. Personally, I used it a lot when writing in C# and I\u0026rsquo;ve ran into a few \u003cem\u003eself inflicted\u003c/em\u003e bugs that named parameters would have prevented. For those who don\u0026rsquo;t program in a language that has named parameters it allow you to specify the parameter when calling a function or method.\u003c/p\u003e","title":"Typescript One Wish"},{"content":"Introduction #After coding for a while and making more mistakes then anyone wants to admit we as programmers tend to create a spidey-sense of potential issues when doing code reviews. This is one of the primary reason we as an industry do code reviews. It\u0026rsquo;s commonly called \u0026ldquo;code smell\u0026rdquo; - when we see a pattern or code usage that seems off. A few months ago I ran into one of these and wanted to highlight the usage, because I see even experienced software engineers fall into this common practice. I would like to highlight that while good practice in theory is commonly agreed upon, people get lost in the details. That\u0026rsquo;s ok as long\nSetup #Below is some example code I\u0026rsquo;ve see in different variations before. It\u0026rsquo;s fairly simple, all it does is gets a results of clients from a service and returns them. In this situation the method of the service takes in an optional parameter for a name\u0026hellip;yes I\u0026rsquo;ve seen this before. Once we get the results we\u0026rsquo;ll grab the first result and perform our business logic.\n*Please note: I\u0026rsquo;m making some of the common mistakes on purpose - I\u0026rsquo;m sure many of you can easily spot the mistakes before the next section :)\nvar results = await _clientService.GetClients(\u0026#34;josh\u0026#34;); //returns an IList\u0026lt;Client\u0026gt; models if (results != null \u0026amp;\u0026amp; results.Any() == true) { var client = results.First(); //logic for client actions } Concerns #For those who work to keep their functions and methods simple there is one very glaring issue here. You have a method that is named one thing \u0026ldquo;GetClients\u0026rdquo; but has a parameter to get a single client. An important principle in code design is to have your methods or function do one thing, and this method is doing two things. Additionally, the naming convention implies that it\u0026rsquo;s doing one thing\u0026hellip; getting a list of clients because it\u0026rsquo;s plural. The issue is by having an optional parameter to get a single client the method is now doing two things. This is a classic code smell that a bare minimum that it\u0026rsquo;s time for a new method to get a single client.\nImprovements #Let\u0026rsquo;s take the code from above and make some small changes. There is three main things we can change based on creating a new method that just returns a single Client record.\nImprove the variable name as it reflects we\u0026rsquo;re getting a single client record. We can simplify our conditional to check if the results from the service is null. Since it\u0026rsquo;s a single record we don\u0026rsquo;t have to put it in a list. Anyone using the method doesn\u0026rsquo;t need to know about an optional parameter to get a specific record. Single Record #var client = await _clientService.GetClient(\u0026#34;josh\u0026#34;); if (client == null) { //Error Handling } //logic for client record Multiple Records #var clients = await _clientService.GetClients(); if (client.Any() != true) { //Error Handling } //logic for client records Conclusion #It\u0026rsquo;s a valid concern when creating software not to bloat our application. I think that is the main system to this issue, but in our effort we make more work for ourselves. Situations like this is a common when trying to take our existing code base and make small changes to accomplish our goals. Keeping in mind basic principals like this will keep our code easier to understand and maintain over the life cycle.\n","date":"17 January 2025","permalink":"https://andrewrady.github.io/blog/posts/code-smells/","section":"Posts","summary":"\u003ch2 id=\"introduction\" class=\"relative group\"\u003eIntroduction \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#introduction\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003cp\u003eAfter coding for a while and making more mistakes then anyone wants to admit we as programmers tend to create a spidey-sense of potential issues when doing code reviews. This is one of the primary reason we as an industry do code reviews.\nIt\u0026rsquo;s commonly called \u0026ldquo;code smell\u0026rdquo; - when we see a pattern or code usage that seems off. A few months ago I ran into one of these and wanted to highlight the usage, because I see even experienced software engineers fall into this common practice. I would like to highlight\nthat while good practice in theory is commonly agreed upon, people get lost in the details. That\u0026rsquo;s ok as long\u003c/p\u003e","title":"Code Smells"},{"content":"Keeping data clean #One important aspect of managing data coming in through our api(s). Of course this is what data types and validation is for, but an easily overlooked aspect is handling strings and how we want store them in the database. It\u0026rsquo;s an easy oversight for anyone who hasn\u0026rsquo;t handle a large amount of data that is being used by multiple teams. An easy example is when two systems are comparing an email, but one system didn\u0026rsquo;t trim any white space and the user inputed their email with a space at the end. Sounds simple, right? It happens much more often then you\u0026rsquo;d think. We don\u0026rsquo;t want to add a lot of extra logic every time we compare strings to ensure there isn\u0026rsquo;t any white space unless absolutely necessary. Which is why it\u0026rsquo;s important to add logic to handle this on every request - which is pretty easy with Dotnet.\nSolution #Linked is an example repo of a dotnet generated project for a webapi. You can generate it with the dotnet command dotnet new webapi -n API -controllers - I still use controllers for the most part. There\u0026rsquo;s a new post endpoint that takes in the standard WeatherForcast class that is included from the generated code and returns it back. This is helpful because it will show the results of the converter in swagger. We\u0026rsquo;ll create a new TrimStringConverter class that will handle all of the logic.\nusing System.Text.Json.Serialization; public class TrimStringConverter : JsonConverter\u0026lt;string?\u0026gt; { public override string? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return reader.GetString().Trim(); } public override void Write(Utf8JsonWriter writer, string? value, JsonSerializerOptions options) { writer.WriteStringValue(value); } } Most of the time you\u0026rsquo;ll see Converters used on the data annotion level which can be very granular, but we want to apply this to every property that is a string. We can do that by adding a few lines in the Program.cs file.\nbuilder.Services .AddControllers() .AddJsonOptions(option =\u0026gt; { option.JsonSerializerOptions.Converters.Add(new TrimStringConverter()); }); Now if we hit our endpoint http://localhost:5175/WeatherForecast with a payload with intended spaces in the properties that strings values it will return with those trimmed. This will happen before the values hit the controller. If you put a break point on the method name of the controller you can see the values update automatically.\nPayload #{ \u0026#34;date\u0026#34;: \u0026#34;2024-12-27\u0026#34;, \u0026#34;temperatureC\u0026#34;: 29, \u0026#34;summary\u0026#34;: \u0026#34;Warm \u0026#34; } Response #{ \u0026#34;date\u0026#34;: \u0026#34;2024-12-27\u0026#34;, \u0026#34;temperatureC\u0026#34;: 29, \u0026#34;temperatureF\u0026#34;: 84, \u0026#34;summary\u0026#34;: \u0026#34;Warm\u0026#34; } Improvements #While this is a good first step we can improve on this. Keeping strings clean and not having additional white space is important and we should also stop any blank string from being saved in columns. This can cause headaches for anyone who has to maintain the data later.\nusing System.Text.Json.Serialization; public class TrimStringConverter : JsonConverter\u0026lt;string?\u0026gt; { public override string? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var value = reader.GetString(); if (string.IsNullOrWhiteSpace(value)) { return null; } return value.Trim(); } public override void Write(Utf8JsonWriter writer, string? value, JsonSerializerOptions options) { writer.WriteStringValue(value); } } Conclusion #Something as simple handing empty strings on requests can easily overlooked, but can cause a lot of headaches down the road if not handled. With Dotnet\u0026rsquo;s middleware it makes it easy to take our custom converters and apply them to all requests before going to the controllers. There may be times where we only want to apply these with data annotations (which is a more common way to use converters) so applying them to the middleware is something you\u0026rsquo;ll need to consider if you want the behavior by default.\n","date":"26 December 2024","permalink":"https://andrewrady.github.io/blog/posts/trimming-string-api/","section":"Posts","summary":"\u003ch1 id=\"keeping-data-clean\" class=\"relative group\"\u003eKeeping data clean \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#keeping-data-clean\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h1\u003e\u003cp\u003eOne important aspect of managing data coming in through our api(s). Of course this is what data types and validation is for, but an easily overlooked aspect is handling strings and how we want store them in the database.\nIt\u0026rsquo;s an easy oversight for anyone who hasn\u0026rsquo;t handle a large amount of data that is being used by multiple teams. An easy example is when two systems are comparing an email, but one system didn\u0026rsquo;t trim any white space and the user inputed\ntheir email with a space at the end. Sounds simple, right? It happens much more often then you\u0026rsquo;d think. We don\u0026rsquo;t want to add a lot of extra logic every time we compare strings to ensure there isn\u0026rsquo;t any white space unless absolutely necessary.\nWhich is why it\u0026rsquo;s important to add logic to handle this on every request - which is pretty easy with Dotnet.\u003c/p\u003e","title":"Trimming Strings For Api Using Dotnet"},{"content":"Catching Up #It\u0026rsquo;s been a couple years since I started this blog and there hasn\u0026rsquo;t been much progress. There is a couple different factors but the main one has been focus. I\u0026rsquo;ve been working Ritter Insurance Marketing since 2017. I started there a junior front end developer and in 2020 I moved over as a back end developer. Working primarily on back end services written in Dotnet. I started this blog a couple of years ago to try write down my thoughts and some experiences, but obviously didn\u0026rsquo;t keep up on that.\nTime As A Front-End Developer #The time I spent on the front end is where I learned the most. It\u0026rsquo;s not just the technical stuff too - much is how to work in a software development team. A lot of this are the things you don\u0026rsquo;t get in school. Aspects like working with others, git, how to do good code reviews, meeting (everyone\u0026rsquo;s favorite), and so much more. I also got my real first hand experience of how powerful JavaScript can be. I worked with some great and extremely talented people and learned as much as possible. Framework of choice? Vue - I\u0026rsquo;ll still stand pick Vue over React and Angular any day! I also picked on other important skills working with tools like webpack, vite, creating NPM packages, etc.\nWhile working on the front-end team we were able to go to some amazing conferences\n2017 VueConf in New Orleans 2018 VueConf in Tampa 2019 An Event Apart in Chicago 2020 VueConf in Austin Back-End Developer #Late 2020 I switch to our backend team. I was a little nervous about the choice for a couple of years. First, the front end team was a great group and I didn\u0026rsquo;t want to \u0026ldquo;leave\u0026rdquo; them. Although we all work together I was worried about not being part of that group. Another was my ability to adapt and work with C# and Dotnet. It was a pretty big change going from JavaScript, a dynamic run time language to a static precompiled language like C#. Overall it was a challenge and I learned a lot over the years - backend is a whole other beast. Here I mostly worked on micro-services that were restful apis, but also got to work with other tools. Azure functions, Terraform, and our own developed bot that integrated with our deployment process.\nSome other cool conference\n2023 VSLive in Las Vegas What I\u0026rsquo;m Currently Doing #I\u0026rsquo;m still working as a back-end developer here at Ritter Insurance marketing. It has been a turbulent year as we\u0026rsquo;ve been assisting a sister team at Integrity, and looking to fully integrate here soon. Doing so has let me meet some great engineers over there and I\u0026rsquo;m looking forward to improving their systems. Seeing how other teams work and operate together has been super insightful. I\u0026rsquo;m hopeful and excited to see what our teams can create together.\n","date":"8 December 2024","permalink":"https://andrewrady.github.io/blog/posts/catching-up/","section":"Posts","summary":"\u003ch2 id=\"catching-up\" class=\"relative group\"\u003eCatching Up \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#catching-up\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003cp\u003eIt\u0026rsquo;s been a couple years since I started this blog and there hasn\u0026rsquo;t been much progress. There is a couple different factors but the main one has been focus. I\u0026rsquo;ve been working Ritter Insurance Marketing since\n2017. I started there a junior front end developer and in 2020 I moved over as a back end developer. Working primarily on back end services written in Dotnet. I started this blog a couple of years\nago to try write down my thoughts and some experiences, but obviously didn\u0026rsquo;t keep up on that.\u003c/p\u003e","title":"Catching Up"},{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/tags/golang/","section":"Tags","summary":"","title":"Golang"},{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/tags/javascript/","section":"Tags","summary":"","title":"Javascript"},{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/tags/vue/","section":"Tags","summary":"","title":"Vue"},{"content":"My Experience Building A Rails App As A Dotnet Developer #I use to write a lot of rails applications when I was newer as a developer. Fast forward almost a decade later with professional experience, I thought I would look into rails again. I\u0026rsquo;ve slightly followed the progression of rails over the years and agree with some points of DDH\u0026rsquo;s. Main about JavaScript and how it\u0026rsquo;s become overly complex for web apps. Although, I personally love static type languages. I know shocker - coming from a dotnet developer.\nGoal #I wanted to create a basic crud application that mimicked an existing application I\u0026rsquo;ve built in dotnet. This way I didn\u0026rsquo;t have to worry about what I was making..and be able to focus more on ruby and rails. It was a pretty simple mvc product that focused on three main points.\nStandard CRUD workflow for a handful on models Authentication Background jobs Of course, there was more minor details on the architecture but I want to focus on more of my experience writing the application\nWhat I liked #The last time I wrote a Rails application in any real fashion has to be close to eight years. A lot has changed in the web world since then! The main point I really liked was just how easy it was to get started. I remembered many of the cli commands to generate models and controllers. That is a huge because anyone who works with these tools know how many there are! Just that alone I was able to scaffold out a large amount very quickly. Another great thing was Rails documentation. When I didn\u0026rsquo;t know how to setup something like nested forms for child models I was able to \u0026ldquo;easily\u0026rdquo; find how to do it directly on their documentation site. I quotes because easy can be relative and while it was super convenient once I found it - it took me some research to get there. Seriously, Rails documentation is great and can easily be navigated to find great gems (see what I did there)! Lastly, the plugin ecosystem is great. I was able to easily install the few gems I needed to get up and running. Since the app was pretty slim I really only need devise for authentication and sidekiq for sidejobs. I\u0026rsquo;m sure if this need to be put into production things would become more complex. For example, devise is a great way to start authentication but it would probably be worth integrating it with OAuth as well.\nWhat I didn\u0026rsquo;t like #Rails is known for convention over configuration and overall I think that is great perspective. The issue is when you\u0026rsquo;re not in a specific domain it can be hard to know how it should be done. I ran into this situation a handful of times. Figuring out nested attributes and how to pass them into the parent controller was \u0026ldquo;annoying\u0026rdquo; at first, but once I knew how Rails wanted it setup it was simple. Another major point was some of the helpers for forms. Nested forms and how to get them setup was enough to make me second guess my entire decision. I was almost to the point of just manually writing out the forms in html. Lucky after some research on the docs I was able to figure it out. This one is a personal problem\u0026hellip;I missed having static types. There was more then once dealing with fairly complex logic that I messed up types and had to step through the logs to see what was going on.\nConclusion #Ruby on Rails gets a lot of flack from the community. Most of the criticism are unjust and blown way out of proportion in my opinion. Using the correct tool for the requirements and the developer behind the tool is just, if not more important. I\u0026rsquo;ve worked on technologies that you would expect to be more performance based on the stack, but the choices of prior developers were not great. At the end of the day most web applications are just basic CRUD applications with business logic. Sure there are outliers that need a higher performance stack or language like Go or Rust. Most of my personal projects that are in use are in either Dotnet or Go but if I find a small fit for a Rails application I would consider adding it to my small ecosystem.\n","date":"4 December 2024","permalink":"https://andrewrady.github.io/blog/posts/rails-experience/","section":"Posts","summary":"\u003ch1 id=\"my-experience-building-a-rails-app-as-a-dotnet-developer\" class=\"relative group\"\u003eMy Experience Building A Rails App As A Dotnet Developer \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#my-experience-building-a-rails-app-as-a-dotnet-developer\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h1\u003e\u003cp\u003eI use to write a lot of rails applications when I was newer as a developer. Fast forward almost a decade later with professional experience, I thought I would look into rails again.\nI\u0026rsquo;ve slightly followed the progression of rails over the years and agree with some points of DDH\u0026rsquo;s. Main about JavaScript and how it\u0026rsquo;s become overly complex for web apps. Although, I personally love static type languages.\nI know shocker - coming from a dotnet developer.\u003c/p\u003e","title":"Rails Experience"},{"content":"Connecting your Rails application to a database #Rails default setup uses sqlite which is a great way to get starting building applications, but at some point we will need to connect to a real database. Whether you need functionality that is specific to a certain database, or you want to simulate your production environment more. Connecting to a database is pretty easy with Rails. The first thing you will need is a database installed on your computer. For my apps I primarily use Postgres and pgAdmin as my GUI.\nFirst we will also want to add a gem for Postgres in our Gemfile\ngem ‘pg’\nThen run the command bundle install. Next in our Rails app we want to update the database.yml file in the config directory. There is four sections, default, development, test, and production. For a basic configuration set the default and any changes you may need in the different environments can be overridden.\ndefault: \u0026amp;default adapter: postgresql encoding: unicode username: postgres password: postgres pool: 5 timeout: 5000 host: 127.0.0.1 development: \u0026lt;\u0026lt;: *default database: TestApp test: \u0026lt;\u0026lt;: *default database: TestApp_test production: \u0026lt;\u0026lt;: *default database: \u0026lt;%= ENV[\u0026#39;POSTGRES_DB\u0026#39;] %\u0026gt; Let’s break down this file a little. The default is where most of the key information is at. I have the username and password set to postgres, but for a real application you would want to put these into environment variables. The host is the IP address for your database. The other environments have a line \u0026lt;\u0026lt;: *default which pulls the config options from the default section. If you need to change anything for these environments do so after that line.\n","date":"3 March 2020","permalink":"https://andrewrady.github.io/blog/posts/connecting-your-rails-app-to-a-database/","section":"Posts","summary":"\u003ch1 id=\"connecting-your-rails-application-to-a-database\" class=\"relative group\"\u003eConnecting your Rails application to a database \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#connecting-your-rails-application-to-a-database\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h1\u003e\u003cp\u003eRails default setup uses sqlite which is a great way to get starting building applications, but at some point we will need to connect to a real database. Whether you need functionality that is specific to a certain database, or you want to simulate your production environment more. Connecting to a database is pretty easy with Rails. The first thing you will need is a database installed on your computer. For my apps I primarily use Postgres and pgAdmin as my GUI.\u003c/p\u003e","title":"Connecting Your Rails App to a Database"},{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/tags/postgres/","section":"Tags","summary":"","title":"Postgres"},{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/tags/api/","section":"Tags","summary":"","title":"Api"},{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/tags/cors/","section":"Tags","summary":"","title":"Cors"},{"content":"Handling CORS with Gorilla Mux #In an earlier post I talked about create an API with golang using a few packages. One of the main ones packages many people use is mux for routes. This makes it easier handles routes within our application. Now we need setup our application to allow certain sites to talk with our api. Luckily Gorilla has another package that integrates seamlessly with Mux.\nSetting up our routes #Let\u0026rsquo;s make a function in our main.go that handles the routes and then call it in our main function\nimport ( \u0026#34;fmt\u0026#34; \u0026#34;log\u0026#34; \u0026#34;net/http\u0026#34; \u0026#34;github.com/gorilla/mux\u0026#34; ) func routes() { myRouter := mux.NewRouter().StrictSlash(true) myRouter.Handle(\u0026#34;/records\u0026#34;, RecordsHandler).Methods(\u0026#34;GET) log.Fatal(http:ListenAndServe(\u0026#34;:8080\u0026#34;, myRouter)) } func main() { fmt.Println(\u0026#34;Server is running on port 8080\u0026#34; ) routes() } Here we have a basic implementation with one route, /records which refers to the function RecordsHandler. I didn\u0026rsquo;t have that in the code snippet, but that function handles the logic of getting the records and returning the json. This works great if the application, is on the domain. If not then this is where we need to add some cors policies.\nGorilla Handlers #Lucky gorilla has the handlers package that plays really nicely with mux. All we need to do is import it and add a few more lines. First lets import github.com/gorilla/handlers, then we need to add some variables to configure for headers, methods, and origins.\nheaders := handlers.AllowedHeaders([]string{\u0026#34;X-Requested-With:\u0026#34;, \u0026#34;Content-Type\u0026#34;}) methods := handlers.AllowedMethods([]string{\u0026#34;GET\u0026#34;, \u0026#34;POST\u0026#34;, \u0026#34;PUT\u0026#34;, \u0026#34;DELETE\u0026#34;}) origins := handlers.AllowedOrigins([]string{\u0026#34;www.somewebsite.com\u0026#34;}) This allows the headers to be set with content-type so allow for json, the standard crud actions in the methods, and the origin sets where the api is allowed to give this information to. Now we need to alter the listen and server to passes these in.\nlog.Fatal(http.ListenAndServe(\u0026#34;8080\u0026#34;, handlers.CORS(headers, methods, origins)(myRouter))) This will allow our api to be able to communication with our applications on different domains. This is great if we only want certain sites to be able to access our data. If we want to open the api and be public we can update the string in the origin variable to a wildcard,\norigins := handlers.AllowedOrigins([]string{\u0026#34;*\u0026#34;}) Wrap up #Below is the full program from above with the cors configuration as well,\nimport ( \u0026#34;fmt\u0026#34; \u0026#34;log\u0026#34; \u0026#34;net/http\u0026#34; \u0026#34;github.com/gorilla/mux\u0026#34; \u0026#34;github.com/gorilla/handlers\u0026#34; ) func routes() { myRouter := mux.NewRouter().StrictSlash(true) headers := handlers.AllowedHeaders([]string{\u0026#34;X-Requested-With:\u0026#34;, \u0026#34;Content-Type\u0026#34;}) methods := handlers.AllowedMethods([]string{\u0026#34;GET\u0026#34;, \u0026#34;POST\u0026#34;, \u0026#34;PUT\u0026#34;, \u0026#34;DELETE\u0026#34;}) origins := handlers.AllowedOrigins([]string{\u0026#34;www.somewebsite.com\u0026#34;}) myRouter.Handle(\u0026#34;/records\u0026#34;, RecordsHandler).Methods(\u0026#34;GET) log.Fatal(http.ListenAndServe(\u0026#34;8080\u0026#34;, handlers.CORS(headers, methods, origins)(myRouter))) } func main() { fmt.Println(\u0026#34;Server is running on port 8080\u0026#34; ) routes() } ","date":"4 May 2019","permalink":"https://andrewrady.github.io/blog/posts/mux-cors/","section":"Posts","summary":"\u003ch2 id=\"handling-cors-with-gorilla-mux\" class=\"relative group\"\u003eHandling CORS with Gorilla Mux \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#handling-cors-with-gorilla-mux\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003cp\u003eIn an earlier post I talked about create an API with golang using a few packages. One of the main ones packages many people use is mux for routes. This makes it easier handles routes within our application. Now we need setup our application to allow certain sites to talk with our api. Luckily Gorilla has another package that integrates seamlessly with Mux.\u003c/p\u003e","title":"Mux Cors"},{"content":"Golang First API #I have been following Golang for a little bit. It seemed interesting to me for a few reasons. One major one was the speed of it. Another was it\u0026rsquo;s syntax is similar to python. I am no python developer, but I have made a few side project with it. SO I decided to update and an aging Rails application. It\u0026rsquo;s just a simple crud application that displays martial arts rings at tournaments. While I could write the entire website with Go I opted in to make an api. The reason is I want to make a React site and mobile apps made with React Native. It\u0026rsquo;s a pretty simple rest API that needed to connect to a database. I used a few packages to make development practical\nMux (for route handling) gorm (an orm for golang to interface with databases) jwt-go [to help create jwt for Auth] bcrypt (to hash passwords) Things I have learned #importing packages are fairly similar to other languages as python. In Golang we can import a package like,\nimport(\u0026#34;os\u0026#34;) or for multiple imports,\nimport( \u0026#34;os\u0026#34; \u0026#34;fmt\u0026#34; \u0026#34;net/http\u0026#34; ) These are packages that come with Go, but we can also import other people\u0026rsquo;s packages with an import path to their github.\nimport( \u0026#34;os\u0026#34; \u0026#34;fmt\u0026#34; \u0026#34;net/http\u0026#34; \u0026#34;github.com/gorilla/mux ) So importing packages are pretty simple. While there seems to be a few different dependency managers in Golang there is no standard at this time like NPM for node. For this project I ended up using dep More on this in another post.\nAnother thing I learned from this project is export functions and how to use them in different files. This project is pretty small so the main.go handles all of the routing, and the functions that handle all of the logic is broken into different files. For example the /ring route returns all of the active rings. The function that handles communication to the database and return the values in json is in the rings.go file. For the main.go to be able to use the AllRings function all we need to do is capitalize the function. Any function in that file that isn\u0026rsquo;t capitalized can only be used within that file. Personally I like this simple practice. I have forgot to export a function in larger files and took some valuable time debugging to figure out I forgot this.\nWrap up #The project is hosted in github and still needs some work. This is a side project that gets used only a few times a year so I continue to work on it from time to time. If you want to check it out head over and have a look at my github\n","date":"11 March 2019","permalink":"https://andrewrady.github.io/blog/posts/go-api/","section":"Posts","summary":"\u003ch2 id=\"golang-first-api\" class=\"relative group\"\u003eGolang First API \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#golang-first-api\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003cp\u003eI have been following Golang for a little bit. It seemed interesting to me for a few reasons. One major one was the speed of it. Another was it\u0026rsquo;s syntax is similar to python. I am no python developer, but I have made a few side project with it. SO I decided to update and an aging Rails application. It\u0026rsquo;s just a simple crud application that displays martial arts rings at tournaments. While I could write the entire website with Go I opted in to make an api. The reason is I want to make a React site and mobile apps made with React Native. It\u0026rsquo;s a pretty simple rest API that needed to connect to a database. I used a few packages to make development practical\u003c/p\u003e","title":"Go Api"},{"content":"Rails development on Windows #Developing Rails applications on windows has always been a pain. It\u0026rsquo;s simple enough to install ruby and the need gems to get a basic Rails application started, but in time developers will run into problems. A lot of gem work fine in a windows environment, but some do not compile down correctly and this is the main issue with developing on Windows. For this reason many people who need to work on Rails applications are running their development environment on OSX or Linux, including me. With Windows WSL I decided to see if I can get a working, acceptable development environment on a Windows computer. After some trial and error (plus some help from google) it\u0026rsquo;s pretty good.\nWindows Subsystem for Linux (WSL) #Microsoft now lets us install Linux distro system directly on our windows computer easily from the Microsoft Store. Before we do this though we need to open Powershell as an Admin run\nEnable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux and then restart our computer. The easiest way to install a Linux distro is from the Windows Store, just open it up and search for your preferred distro. Personally I am using Ubuntu because I have the most experience with that one. For more details on installing WSL on windows check out this article. If we search for Ubuntu from the Windows search it will open a terminal that we can setup everything.\nSetting up our Environment #For now we are going to do a simple install and talk about a few gotchas developing with WSL. Normally I would recommend installing Ruby using RVM so you can easily change versions if need be. For now lets just do a simple install of ruby. First update our new system and then install ruby\nsudo apt-get update sudo apt-get install ruby-full We can check our install and the version with\nruby -v and we should get a result similar too\nruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux] Now we need to install Bundler which is a package manager similar to npm for node development. We can do this with\ngem install bundler and finally lets install Rails!\ngem install rails There we go, a full Linux environment to develop rails applications without any compatibility issues. We can spin up a project and run it.\nrails new test_app cd test_app rails s From there we can see the front page showing we are running a rails application But wait theres more! #If you are a vim user you are good, but us new kids to the block who uses flashy text editors then there is one small gotcha. Window doesn\u0026rsquo;t want you going into the WSL and manually editing files. This can causes us problems if you use something like vscode. After some research Microsoft has setup a directory to work on project and be able to open them on the Windows side and work like normal. In the WSL terminal we can get to this by,\ncd /mnt/c/dev/ please note that the c in the path is your hard drive. So if you have changed this change the path to reflect that. In this directory we can store our Rails applications and open them with any text editor or IDE!\n","date":"16 February 2019","permalink":"https://andrewrady.github.io/blog/posts/rails-windows-development/","section":"Posts","summary":"\u003ch2 id=\"rails-development-on-windows\" class=\"relative group\"\u003eRails development on Windows \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#rails-development-on-windows\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003cp\u003eDeveloping Rails applications on windows has always been a pain. It\u0026rsquo;s simple enough to install ruby and the need gems to get a basic Rails application started, but in time developers will run into problems. A lot of gem work fine in a windows environment, but some do not compile down correctly and this is the main issue with developing on Windows. For this reason many people who need to work on Rails applications are running their development environment on OSX or Linux, including me. With Windows WSL I decided to see if I can get a working, acceptable development environment on a Windows computer. After some trial and error (plus some help from google) it\u0026rsquo;s pretty good.\u003c/p\u003e","title":"Rails Windows Development"},{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/tags/wsl/","section":"Tags","summary":"","title":"Wsl"},{"content":"Hello, World! #My name is Andrew Rady and I am currently a front end developer at Ritter Insurance Marketing working with Vue. I have been writing some blog post on our company blog at rimdev.io, but I wanted to start a personal one. On rimdev.io most of my articles are around vue since that is what I work on mostly, but I want to be able to share some of my experiences from side projects. I am person who doesn\u0026rsquo;t write a lot so a personal goal of 2019 is to get better, and the best way to improve on something is to do it.\nA little more about me #At work I am a front end developer and our main framework we support currently is Vue.js, but we also have other apps that are written in Angular. Most of my day is working in Javascript connecting to our apis and sometimes working in our back which is asp.net. One of our internal sites is written in Hugo and that was my first experience and I really liked it. So much that this site is written in Hugo. In my personal time I write software mostly for a local martial arts community. I run a studio which I wrote our internal software that is a rails api and a vue front end. I am also interested in Golang and wrote an api for a martial arts tournament schedule app. I have a few of these projects public on my github.\nAs I continue to work on these applications I will share my experiences, what I learned, how I fix problems, and more.\n","date":"3 February 2019","permalink":"https://andrewrady.github.io/blog/posts/first-post/","section":"Posts","summary":"\u003ch2 id=\"hello-world\" class=\"relative group\"\u003eHello, World! \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#hello-world\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003cp\u003eMy name is Andrew Rady and I am currently a front end developer at Ritter Insurance Marketing working with Vue. I have been writing some blog post on our company blog at \u003ca href=\"https://rimdev.io\" target=\"_blank\" rel=\"noreferrer\"\u003erimdev.io\u003c/a\u003e, but I wanted to start a personal one. On rimdev.io most of my articles are around vue since that is what I work on mostly, but I want to be able to share some of my experiences from side projects. I am person who doesn\u0026rsquo;t write a lot so a personal goal of 2019 is to get better, and the best way to improve on something is to do it.\u003c/p\u003e","title":"First Post"},{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/tags/vue.js/","section":"Tags","summary":"","title":"Vue.js"},{"content":"Hi! I\u0026rsquo;m a software engineer in Boise, Idaho who specializes in back-end development. My primary tools have been Dotnet and related technologies, which keeps me in the Windows ecosystem most of the time — but I\u0026rsquo;m a Linux guy at heart.\nI started my career in 2017 as a front-end developer at Ritter Insurance Marketing, working primarily with Vue and JavaScript. In 2020 I made the switch to back-end development, where I\u0026rsquo;ve been working on Dotnet microservices, Azure infrastructure, and a fair amount of Terraform since. It was a big shift going from a dynamic language to a statically typed one, but it\u0026rsquo;s been worth it.\nMy blog is a place for me to share technical write-ups, personal projects, and the occasional life update. Writing is something I\u0026rsquo;ve been working to do more of, so this is my corner of the internet to do that. You can also check out some of my work blogs for my other writing at RIMdev.io\nFavorite Topics #Recently my main focus has been working with Dotnet and TypeScript, but I also enjoy working with Ruby and Ruby on Rails. I\u0026rsquo;ve worked with Docker for automated tasks, including setting up test suite runners and batch processes.\nOutside of Work #Outside of the day job I run a small martial arts studio. Over the years I\u0026rsquo;ve built and maintained the internal software for it — a Rails API with a Vue front end to handle student management, rank tracking, and scheduling. It\u0026rsquo;s been a great excuse to work on side projects that actually get used.\nSkills #A few things I\u0026rsquo;ve worked with in the past\u0026hellip;\nProgramming Languages # C# • JavaScript • TypeScript • Ruby\nOperating Systems \u0026amp; Code Editors # Work: Windows Personal: Omarchy Editors Neovim Rider (C#) Framework \u0026amp; General Software # Dotnet • Vue.js • SQL • Azure • Docker • Ruby on Rails\n✝ Christ is King\n","date":"1 January 0001","permalink":"https://andrewrady.github.io/blog/about/","section":"Andrew Rady","summary":"\u003cp\u003eHi! I\u0026rsquo;m a software engineer in Boise, Idaho who specializes in back-end development. My primary tools have been Dotnet and related technologies, which keeps me in the Windows ecosystem most of the time — but I\u0026rsquo;m a Linux guy at heart.\u003c/p\u003e\n\u003cp\u003eI started my career in 2017 as a front-end developer at Ritter Insurance Marketing, working primarily with Vue and JavaScript. In 2020 I made the switch to back-end development, where I\u0026rsquo;ve been working on Dotnet microservices, Azure infrastructure, and a fair amount of Terraform since. It was a big shift going from a dynamic language to a statically typed one, but it\u0026rsquo;s been worth it.\u003c/p\u003e","title":"About"},{"content":"","date":null,"permalink":"https://andrewrady.github.io/blog/categories/","section":"Categories","summary":"","title":"Categories"},{"content":"Backend engineer with nearly a decade of professional experience building distributed systems, APIs, and developer tooling across insurance, healthcare, and marketing domains. Focused on writing maintainable, scalable code and solving real problems for real users.\nExperience #Back-End Engineer — Integrity Marketing Group #2025 – Present · Remote\nDesigning and maintaining high-performance .NET Core APIs that support critical business workflows and partner integrations. Work spans event-driven architecture with Kafka, third-party integrations with SendGrid and Google APIs, and internal CRM improvements that directly impact agent productivity. Also responsible for leading technical design discussions, conducting code reviews, and mentoring junior engineers on .NET Core best practices.\nArchitected event-driven messaging to enable real-time updates across distributed services Improved system observability and significantly reduced incident response times Integrated geolocation services to improve data accuracy during client onboarding Back-End Engineer — Ritter Insurance Marketing #2020 – 2024 · Remote\nBuilt and maintained distributed systems and microservices across a large insurance platform serving thousands of users. Took ownership of the full deployment lifecycle, introducing GitHub Actions and Terraform automation that cut release cycle time by 50%. Also led integrations with Twilio, SendGrid, and healthcare-specific APIs, and built internal developer tooling that significantly reduced manual steps in the release process.\nImplemented SSO and identity management, improving security across the platform Significantly reduced manual steps in the release process through internal developer tooling Collaborated cross-functionally with product and QA on architecture and delivery Front-End Engineer — Ritter Insurance Marketing #2017 – 2020 · Remote\nDeveloped the UI layer of internal tools used by staff to support thousands of insurance customers. Worked closely with designers and backend engineers to take features from wireframe to production. Helped establish UI consistency across multiple applications through reusable Vue components and a shared NPM package.\nIntroduced unit testing practices that meaningfully improved front-end code quality Built shared components that standardized UI patterns and reduced new feature development time Full Stack Developer — Eaglewood Homes #2015 – 2016\nDeveloped and maintained web applications for a home builder, collaborating with cross-functional teams to deliver quality software. Focused on responsive design, modern web technologies, and content-driven features.\nImplemented responsive design best practices to ensure optimal performance across devices and screen sizes Streamlined development processes and enhanced application functionality using modern web technologies Built and integrated a blog feature, enabling dynamic content updates and ongoing audience engagement Technical Skills # Category Technologies Languages \u0026amp; Frameworks C#, .NET Core, ASP.NET Core, Entity Framework, LINQ, JavaScript, TypeScript, Vue, Ruby, Ruby on Rails Architecture Microservices, RESTful APIs, MVC, Event-Driven Systems Cloud \u0026amp; DevOps Azure, Azure DevOps, GitHub Actions, Docker, CI/CD Auth \u0026amp; Security OAuth2, IdentityServer, SSO, Active Directory Databases SQL Server, PostgreSQL Testing xUnit, Moq, Jest Education #Boise State University — B.S. Computer Science (In Progress)\n","date":"1 January 0001","permalink":"https://andrewrady.github.io/blog/resume/","section":"Andrew Rady","summary":"\u003cp\u003eBackend engineer with nearly a decade of professional experience building distributed systems, APIs, and developer tooling across insurance, healthcare, and marketing domains. Focused on writing maintainable, scalable code and solving real problems for real users.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"experience\" class=\"relative group\"\u003eExperience \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#experience\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003ch3 id=\"back-end-engineer--integrity-marketing-group\" class=\"relative group\"\u003eBack-End Engineer — Integrity Marketing Group \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#back-end-engineer--integrity-marketing-group\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003e2025 – Present · Remote\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eDesigning and maintaining high-performance .NET Core APIs that support critical business workflows and partner integrations. Work spans event-driven architecture with Kafka, third-party integrations with SendGrid and Google APIs, and internal CRM improvements that directly impact agent productivity. Also responsible for leading technical design discussions, conducting code reviews, and mentoring junior engineers on .NET Core best practices.\u003c/p\u003e","title":"Resume"}]