Jerry
McKee Jr.
Full Stack Developer
CONTACT ME

This Is My Story...

I am a software developer based in Northeastern CT. I started back in 2019 by learning HTML, CSS, and JavaScript through self-studying means (coding sites like Codecademy, freeCodeCamp.org, etc...). In 2020 I decided to enroll in Full Sail University in the Web Design and Development program. There I was exposed to C# and .NET for the first time. I enrolled in a bootcamp with Woz-U and Infosys to build up my skills with .NET and SQL Server. After my first few jobs with .NET I realized I needed more training and in 2023 I enrolled in the Guardian Cohort of Coder Foundry. Here I returned to the beginning refreshing my knowledge of HTML, CSS, Bootstrap, and JavaScript as well as .NET and SQL Server. I completed the program in December of 2023. In 2024, I received my Microsoft C# Certification through FreeCodeCamp.org, a goal that I had been working on over the past year. I spent the time building my confidence in my ability to create scallable programs and responsive websites. I've recently started learning more about Blazor/Blazor WebAssembly and .NET MAUI to create better responsive applications as well as add mobile development and cross-platform development to my knowledgebase of skills. In 2025, I've begun the journey of getting my certification in Microsoft Azure Fundamentals. This will be the first step in my journey to becoming a Microsoft Certified Azure Developer Associate. I am currently working on a project that utilizes Azure Functions and Azure SQL Database to create a scalable and interactive application. I am excited to continue my journey in software development and look forward to the challenges and opportunities that lie ahead.

This portfolio is a collection of my works in programming. Take a look and see if we can work together on your next project.

Download Resume Check out the GitHub Repos

Tech Set

C# has been the first language that I learned and the language that I am most passionate when it comes to continual learning. You can see my work implememnting C# in my projects section

I utilize ASP.NET Core MVC and Blazor/Blazor WebAssembly to build scalable and interactive applications to satisfy client needs. Please check out my work in the projects section.

I use HTML, CSS, and Bootstrap to create beautiful and responsive webpages for any use. Frontend technologies are considered not as impresive to many other developers, but I embrace the technologies as they are the very basic fundamentals of web design.

Persistence is achieved utilizing SQL. My projects utilize PostgreSQL on many of my projects, though I can write SQL on any DB platform, including Microsoft's SQL Server.

I can now use GraphQL to make more effective and efficient API calls. GraphQL now allows me to make a single call to multiple APIs and retrieve only the data that I need and nothing that I don't.

I use git and GitHub for all of my projects. Git is the most used source control framework on the planet. I employ CI/CD for publishing. The Javascript projects are hosted through Netlify, while the ASP.NET MVC applications are hosted via Railway along with an accompanying PostgreSQL Database.

JavaScript is the language the brings responsive psages to life. I utilize Vanilla JS along with a host of other JavaScript frameworks to bring interactivity to my pages. As my learning of front-end technologies has evolved, I have begun developing new projects utilizing JavaScript and its many libraries such as, Express, Node.js, and many more. Please check out the Projects section to try out these interactive demos. To see smaller JS Challenges, please check out my challenges section for interactive examples.

In 2025, I began working to earn my certifications in Microsoft Azure Fundamentals. I have been learning how to use Azure Functions and Azure SQL Database to create scalable and interactive applications.

I learned how to become very proficient with developer software as well as software for creators which in turn helps me to create a high quality product that a client requests. Once I begin to learn a new skill I research and learn the best software to complete the job. Whether it is Visual Studio for .NET Development or Postman for working with APIs, I always try to find the best software to complete the job.

Certifications

This section contains the certifications that I have achieved in my development journey.

C# has been the first language that I learned and the language that I am most passionate when it comes to continual learning. You can see my work implememnting C# in my projects section

I achieved the Microsoft Certified: C# Developer certification in January of 2024 through freeCodeCamp.org in partnership with Microsoft. This solidified my knowledge of C# and .NET development.

In 2021 I completed the Woz .NET Application Development Bootcamp which provided me with a solid foundation in C# and .NET development.

This certification has greatly enhanced my skills and confidence in developing .NET applications and lead to new opportunities in my career.

Projects

These are the works that showcase the concepts that I have learned through every aspect of web and software development. All of these projects were built from the ground up without the use of templates. Should you have any questions about any project or have a deeper interest for how one was built, please contact me and I will be glad to answer your questions.

Featured Projects

Bug Tracker Logo

A full stack bug tracker app built with ASP.NET MVC, C#, and SQL

Contact Pro Logo Logo

A full stack address book app built with ASP.NET MVC, C#, and SQL

Tech Pulse Logo Logo

A full stack interactive blog built with ASP.NET MVC, C#, and SQL


Work-Related Projects (Informational Only)

Mako Collections Logo

A full Stack application that is designed to assist the Collections Team in the daily task and meeting their assigned goals

.NET Projects

Bug Tracker Logo

A full stack meal planning app built with Blazor WebAssembly, C#, and OpenAI

IMS Logo

A full stack Inventory Management app built with Blazor WebAssembly, C#, and OpenAI

Blazored IS COMING SOON!!!

IMS Logo

A full stack Book Management app built with ASP.NET MVC, C#, PostgreSQL

Book Dragon's Lair IS LIVE NOW!!!

JavaScript Projects

IMS Logo

A Task Manager App built with Node.js, Express, and MongoDB

TASK MANAGER IS COMING SOON!!!

Small Projects, Make Big Gains

These are particular code challenges that we were asked to solve throughout our time at Coder Foundry. Most of the challenges utilize JavaScript while all of them are built out using responsive web development techniques as well as the frontend technologies of HTML, CSS, and Bootstrap.

Fizz Buzz Logo

Display the words Fizz, Buzz, or FizzBuzz depending on the condition

See The Challenge
Racecar Logo

An application that checks whether user input is the same forwards or backwards

See The Challenge
Mortgage Calculator Logo

Keep track of attendance counts for all of your events with this easy to you app

See The Challenge
Notary Logo

Utilizing JavaScript, access the TMDB API and display a list of popular movies on a website

See The Challenge
Centennial Logo

Display the numbers 0-100, All EVEN in bold, All ODD in Red

See The Challenge
Mortgagte Calculator Logo

Keep track of your loan through the application

See The Challenge
Battleship Logo

Play a Javascript version of the classic game Battleship

Play the Game

The PULSE of a digital frontier

Here you will find the writings of my experiences in tech, things that I've learned about and want to share, trends in tech, and opinions that I may have about being a developer.

3
September

The yearly update...

Back in July I started working on a blog series called the .NET Fundamentals and I have been enjoying working on these articles. But a few situations had begun to arise and I needed to step back for a little bit. So I wanted to give an update of what has been going on in my life an my development journey.

It starts with working towards the conclusion of a major step in my career. I have always been interested in cloud technologies and cloud development, none more so than Microsoft Azure. I had been learning the fundamentals of cloud services and Azure for the past few months and had made a decision. It was time to begin looking at Microsoft's certification for Azure Fundamentals. In August I had made a big push to begin studying to take the AZ-900 Azure Fundamentals Exam. Things have been going so well that I pulled the trigger and on Friday, September 5th, I'll be taking my exam. This is the 2nd Microsoft certification that I'll be attempting, the first was the C# Fundamentals exam administered through freeCodeCamp.org through a partnership with Microsoft. This, however, will be my first proctored exam.  I've been really nervous for this one but I had found that Microsoft gives you tons of tools to prep you for the exam. First, there is their learning platform, Microsoft Learn, which can guide you through everything Microsoft. On their platform they include courses to prep you with the knowledge to pass the exam, as well as tips to help you succeed and even practice exams to be able to experience what the exam would be like. This has been an amazing resource and I highly recommend that all developers, new or otherwise, take full advantage of this resource. There are also many other resources out there to help you prepare. My favorite has been Udemy. Many instructors out there create courses to help you learn anything, just be sure to audit the course before you buy to make sure it is the right fit for you. After Friday, I will have an update on what the outcome of the exam was, since you get the results at the end of the exam.

In July I had also taken some time off to recharge. This is something that is vitally important to all developers. Every now and then you need to relax and recharge before taking your next challenge. Physical and mental health are extremely important so you must prioritize this. This goes for any career choice. My wife and I took a vacation to Orlando to recharge (however, I don't think I did that right to often since I would turn to projects I have been working on every now and then). This got me thinking of traveling and developing on the go and I'll share my thoughts on that in another post.

Finally, I've been making some big moves for my future in my career. I don't have an update that I am able to share on this yet, but I anticipate this will happen soon so keep your eyes out for a later post with that specific update.

Starting on Friday, my goal is at least every other Friday to release a new post on a new topic. I am working on two articles currently, a new .NET Fundamentals article and an update on Friday's exam results. I hope that you will keep following along on my journey as a .NET developer. And I'd like some suggestions from you as well. Let me know in the comments about any topics you would like to see an article on. Thank you for checking the pulse and happy coding!   

Published 8 days ago

10
July

.NET Fundamentals: Registering Services

    In this series .NET Fundamentals, we started by taking a look at the concept of Dependency Injection and it's importance to modern day application development. We saw how loosely coupling components allows for easier maintenance and scalability. We took a look at how it can be implemented including a small demo featuring a service that inherits from an interface. This allows the service to be modified at any time without breaking things further down the application. The question becomes now, how do you get an application to recognize and use the service that you have created? In this article we are going to look at just that. We'll take a look at registering your services and the service lifetimes including what they are and how to use them.

     In an application services should be decoupled. We showed the reasons why in our discussion on Dependency Injection. To do this, you don't want to call your service directly where it is needed. Instead, you want an intermediary to do this. This is done by creating and interface and having your service inherit from that interface

// Interface for loose coupling
public interface IArticleService
{
    List<Article> GetArticles();
}

// Implementation of the interface
public class ArticleService : IArticleService
{
    public List<Article> GetArticles()
    {
        return new List<Article>
        {
            new Article { Id = 1, Title = "Intro to Dependency Injection" },
            new Article { Id = 2, Title = ".NET Best Practices" }
        };
    }
}

But now that we have this setup, we need to tell the application that the interface and this service are linked together. We do that by registering the service in the main method of the application. 

    In the days prior to .NET 6 there was a file that was part of any .NET application called startup.cs. This file generally held all of the services that would be injected into the program.cs file that was home to the main method of the program. This method was the starting point for any project. When .NET 6 was released, developers had gotten rid of the startup.cs file and moved everything to program .cs. This now became the main gateway to enter the program. It was also where service could be registered and injected into the application. these service were injected vis the lines in the file that started with something similar to “builder.Service.AddScoped….” These lines tend to intimidate any novice to .NET programming but they are fairly straight forward. It is also an error point when implementing DI. so a note here is that , if methods from your service are not working, check your program.cs file to make sure that the service is registered. So for the above example, how would we register this service?

// Add Custom Services
builder.Services.AddScoped<IArticleService, ArticleService>();

In the code block above we can see the infamous line the really tells the application, “ when you are executing the method from the interface, look to the attached service to find the implementation of the method. This is because in an interface, there is no definition for the method.  That's what keeps it loosely coupled. Now you can see how the link or registration of the service is done, but I bet you have questions about the part of the line of code that says, ”AddScoped"? That is the service lifetime. 

    The Service Lifetime tells the program about how each instance of the service is to be created and maintained by the application. There are three main service lifetimes, AddScoped, AddTransient, and AddSingleton

    AddScoped tells the application to create one instance of the service per request made by the user. This is useful when you are using the service to access data from a database. AddSingleton tells the application to create one instance of the service and use it for the entire life of the application. The use case here would be if you creating a service to log errors to a logging file. This service will continue to run as long as the application is running. And finally we have AddTransient, which tells the application to create an instance of the service every time the user makes a request. This would be used for services that may involve calculations and you need a clean service each time. As you learn to code, you will get use to knowing when you need to use each one of these lifetimes for your services.

So let's recap. You created an service that is inheriting from an interface. You register the service using the infamous, “builder.Services.Add….” line to your program.cs file linking the interface and the service together, telling the program when you are calling this service from the interface, you will find the implementation in this linked service file. And you have registered the service using the proper service lifetime. This is all an important part of Dependency Injection as a whole and now that we have gone through this, you are on your way to creating loosely coupled applications that are easily scaled and maintained making your life as a .NET Developer much easier and less stressful.

Published 63 days ago

8
July

.NET Programming Fundamentals: Dependency Injection

    There are many concepts that you will learn in .NET programming that may seem overwhelming at first, but once you get the concept it becomes second nature when designing and coding out applications. In this series of articles, the .NET Fundamentals Series, I will take a deep dive, along with examples, of each of the concepts to help new developers gain a higher level understanding of .NET programming fundamentals. In these articles I will not be talking about basic programming concepts like objects, classes, and the such. I'm currently working on another series for those basics of object oriented programming. In this series, it will be presumed that you have basic, working knowledge of OOP. 

    In this article I want to start with a very import concept in .NET programming. This concept is so important that you will be questioned at every single interview about it. It is a topic that is sometime confusing at first, but once you understand the concept, it becomes second nature when coding out any .NET Application. This article is all about Dependency Injection. We will be talking about what it is, why it was created, and what are the benefits to using Dependency Injection in applications

    Dependency Injection (or DI), by definition, is a design pattern that promotes loose coupling and enhances testability and maintainability of applications. It's a technique where one object supplies dependencies for another. But why was this concept created and what does “loose coupling” refer to? Let's take a look at Dependency Injection and what this all means. In the past, applications were built with tightly coupled components. This meant that every component built heavily relied on other components in the application. But why was this a problem? Well, as technology or business needs changed, applications inevitably need to be updated. When one change was made to meet a requirement, other changes had to made in order to keep the application from breaking. Let's create a small example to illustrate this point…

using System;
using System.Collections.Generic;

// Simulated article model
public class Article
{
    public int Id { get; set; }
    public string Title { get; set; }
}

// Service that retrieves articles
public class ArticleService
{
    public List<Article> GetArticles()
    {
        // Simulated data retrieval
        return new List<Article>
        {
            new Article { Id = 1, Title = "Intro to C#" },
            new Article { Id = 2, Title = "Understanding .NET" }
        };
    }
}

// Consumer without Dependency Injection
class Program
{
    static void Main(string[] args)
    {
        // Directly instantiate the service
        ArticleService service = new ArticleService();

        List<Article> articles = service.GetArticles();

        foreach (var article in articles)
        {
            Console.WriteLine($"ID: {article.Id}, Title: {article.Title}");
        }
    }
}

    Above is a simple code snippet that would be used in retrieving articles from a source. In this snippet, the Article service is tightly coupled to Program. In a small program, this might be ok. But if the business needs change or an app-breaking change occurs in the framework that demands the code be updated, this code could possibly break the entire app. It will be difficult to swap out this code or even test this code down the road. So, how can we change this? Let's take a look at a code snippet that allows for DI…

using Microsoft.Extensions.DependencyInjection;

class Program
{
    static void Main(string[] args)
    {
        // Setup DI container
        var serviceProvider = new ServiceCollection()
            .AddSingleton<IArticleService, ArticleService>()
            .BuildServiceProvider();

        // Get service via DI
        var service = serviceProvider.GetService<IArticleService>();

        var articles = service.GetArticles();
        foreach (var article in articles)
        {
            Console.WriteLine($"ID: {article.Id}, Title: {article.Title}");
        }
    }
}

// Interface for loose coupling
public interface IArticleService
{
    List<Article> GetArticles();
}

// Implementation of the interface
public class ArticleService : IArticleService
{
    public List<Article> GetArticles()
    {
        return new List<Article>
        {
            new Article { Id = 1, Title = "Intro to Dependency Injection" },
            new Article { Id = 2, Title = ".NET Best Practices" }
        };
    }
}

    In the above example you can see some changes made to the code. The first that should be noted is that in Program, there is now a DI container, where the dependency injection is occurring. The next change is the introduction of an Interface. Note that now, instead of the ArticleService being used directly in the Program class, it is using the interface instead to access the method for getting the article. The final change is that the ArticleService is using the OOP pillar of Inheritance to inherit the interface. So why is this good? Let's take a look at a scenario where the business has decided that in order to make error handling and maintenance easier. Your team has decided to add logging to the method for getting articles and you want to do this without a lot of changes to the program. Let's see how that is done…

using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

class Program
{
    static void Main(string[] args)
    {
        // Setup DI container
        var serviceProvider = new ServiceCollection()
            .AddLogging(configure => configure.AddConsole())
            .AddSingleton<IArticleService, ArticleService>()
            .BuildServiceProvider();

        var logger = serviceProvider.GetRequiredService<ILogger<Program>>();
        logger.LogInformation("Starting application...");

        var service = serviceProvider.GetRequiredService<IArticleService>();
        var articles = service.GetArticles();

        foreach (var article in articles)
        {
            Console.WriteLine($"ID: {article.Id}, Title: {article.Title}");
        }

        logger.LogInformation("Application finished.");
    }
}

// Interface for loose coupling
public interface IArticleService
{
    List<Article> GetArticles();
}

// Implementation using injected logger
public class ArticleService : IArticleService
{
    private readonly ILogger<ArticleService> _logger;

    public ArticleService(ILogger<ArticleService> logger)
    {
        _logger = logger;
    }

    public List<Article> GetArticles()
    {
        _logger.LogInformation("Fetching articles...");

        var articles = new List<Article>
        {
            new Article { Id = 1, Title = "Intro to Dependency Injection" },
            new Article { Id = 2, Title = ".NET Best Practices" }
        };

        _logger.LogInformation($"Retrieved {articles.Count} articles.");
        return articles;
    }
}

// Simple model
public class Article
{
    public int Id { get; set; }
    public string Title { get; set; }
}  

    Notice that in Program, not many changes were made to application. GetArticles() has the only major changes. In Program, articles is still implementing the same interface. This means everything that is depending on that Interface will not be changed, only the piece of code that needs to add the logging services. This means any debugging that needs to be done is confined to the only changes that have been made to the GetArticles() method. But what are some of the other benefits for Dependency Injection?

Enhanced Testability - When you are writing tests, it very difficult to replace dependencies with mocks in a unit test. However, in a unit test if you are inheriting the interface, now you can create a testing mockup based on the interface. This means that you can create isolated and reliable test cases.

Improved Maintainability - With Dependency Injection, you are only changing the implementation of the code, not any of the components that are consuming the service. This means that there is a much less chance of the app breaking because of the changes and if a break occurs, it is confined to the implementation changes only.

Increased Flexibility - Implemented service can be extended without breaking any of the consuming components.

Scalability - In DI, components can be extended and also, components can be developed, tested, and deployed independently. 

In this article we took a look at Dependency Injection; what it is, how it is used, and the benefits of using it. Now this is a much bigger topic that includes service registration, implementation in unit testing, and scaling up (or down) applications as needed and I'll go over that in future articles. Right now the goal was to show you just how important this concept of OOP is. Dependency Injection is not only limited to .NET. In Java, SpringBoot also allows for DI in there own way. This is a concept worth diving into more. Once you get a good grasp of this all it will become second nature when designing applications. I hope that this gives you a good start. Good luck in learning and as always, Happy Coding!   

Published 65 days ago

Contact Me