About Me

My name is Griffin Hood and I am a Computer Science major at Southern New Hampshire University. I started the program 3 years ago and I have learned an unbelievable amount as a result of it. Currently, I am working as a software engineer in Boston, MA. My experiences in this program have been nothing but positive. I have learned so much about computer science and software development and I am excited to apply these skills to my career.

CS-499

CS-499 is the Computer Science capstone. This course is designed to test the knowledge and skills that I have learned throughout my time in the program. I am excited to apply my knowledge to a real-world project and show off the skills that I have acquired throughout my time in the program.

The coursework that I completed during my time at SNHU has been the foundation of my learnings. Project based courses in particular have allowed me to learn how to organize my abstract software design ideas and shape them into something that is fully functional. The different types of coursework changed quite a bit as I progressed through my degree. In the earlier parts of the program, the applications that I built were mostly console applications, such as the terminal-based adventure game that you will see in this ePortfolio. In a later course, I developed a Python dashboard using Jupyter, which was a nice intermediary between a terminal-based app and a full-stack web app. In one of my last courses, the final project was to create a full-stack Angular application with Express.js. This project opened my eyes to how much I had learned and how quickly I was able to put that application together.

Additionally, I was a part of many group-based discussions with my peers about the concepts we were learning in the different courses. This discussion helped me to effectively communicate my ideas to a group of people with varying technical backgrounds. These discussions also helped me to learn how to work in a team environment and be collaborative. Many courses that I took involved either drafting communications to send directly to stakeholders or presenting some sort of detailed report or visualization to a group. These exercises have played a significant role in my ability to communicate technical ideas or concepts to non-technical audiences.

My courses concerning algorithms and data structures have also played a big part in my educational experience. Almost every computer science course that I took taught me something about algorithms or data structures. In applied linear algebra, I worked mainly with matrix multiplication which relates directly to arrays in modern programming languages. The strategies for doing matrix calculations are very similar to the way you would manipulate an array in code such as accessing and changing data across rows and columns of a multi-dimensional array. Separately, in my algorithms class, I discovered the various sorting algorithms that can be used to sort a collection of items. The more interesting part was learning about how their levels of efficiency vary greatly between the different types of algorithms. I then took it one step further and investigated the underlying algorithms of typical programming language sort functions like Python, C#, and JavaScript.

The artifact that I chose to represent my skills in this ePortfolio is a text-based adventure game that I wrote in Python for the final project of IT-140, one of my first IT courses. I decided that I would use this artifact for all 3 of my enhancements as opposed to choosing a different one for each category. I thought that enhancing one artifact in 3 different areas would better showcase the wide range of skills that I have acquired because of this program. These enhancements come together to form a backend web service that is production-ready, secure, scalable, and open source. I would also like to point out that the various classes that are used throughout the enhanced solution (C#) are directly ported from the Python code and are not modified in any way. This is to show that enhancing an artifact does not necessarily mean changing any of the core business/game logic. It can involve other things like adding database capabilities, hosting it in the cloud, and making it open source to encourage the wider community to contribute.

Artifact Selection

When I initially started thinking about which artifacts I would use for this portfolio, I decided that I wanted to select one artifact and enhance it in all 3 categories (Software Design and Engineering, Algorithms and Data Structures, and Databases). The artifact that I chose was my final project from IT-140: a terminal-based adventure game. This game was written in Python and was one of the first programs that I wrote in this program. The game consists of a static map with several locations that the player can move between. The player can only move north, south, east and west. The player must collect all of the items in every room before running into the location with the villain, which ends the game. The game was originally written in Python and I decided to enhance it by converting it to a .NET Core Web API and adding a database to store the map data.

Link to code review

Code Review

Code Repository

The code for these enhancements is available on GitHub. It includes a .NET Core Web API, a C# console app, and the original Python script that I developed title TextBasedGame.py. My plans for furuture enhancements on this project include adding authentication and a login flow to secure the backend, and deploying the projects to Azure. GitHub Repository

Enhancement One: Software Design and Engineering

This artifact was created as a part of IT-140 which was a Python course. It was one of the first IT courses I took. The task was to build a text-based adventure game where a user could travel around a map and collect items while avoiding the villain. I selected this item because I wanted to show how I can take concepts from one type of language (interpreted, dynamically typed) and apply it to a different type of language (compiled, strongly typed). I decided to use this artifact for all 3 enhancements.

The game logic in this artifact demonstrates my ability to design software while incorporating efficient algorithms. Additionally, converting the back end of the game to be a separate application showcases my skills in system design and software architecture. Learning how to build a .NET Core was very easy thanks to the documentation provided by Microsoft. And being able to use Visual Studio to scaffold new classes like controllers and models made the process even easier.

In addition to moving the backend into a separate app, the game was improved by converting the data structure that was used to represent the map from an array of arrays to a dictionary like structure. I did meet the course outcomes that I planned to meet, and I do not have any updates to my outcome-coverage plan. The only outcome that hasn’t bet met is the first one however that will be completed when the app is completed as it will allow for collaborative, interactive gaming.

The biggest thing I learned while enhancing this artifact is the difference in how object references are handled in Python vs C#. In C#, it is very popular to use LINQ (Language INterated Query) to filter, sort, and transform arrays of data. One thing I didn’t realize in the beginning, is that the LINQ queries return new instances of the objects and not references to the original array of objects.

Course outcomes achieved:

Enhancement Two: Algorithms and Data Structures

Originally, the program used an array of array to read in the fixed map definition. This was a clunky way to represent the map and it was also very hard to read. I decided that since I planned to move this app into a backend API, I would take advantage of some JSON serialization libraries offered in C# so that I could move away from the nested array structure. By using ASP.NET Core, which is a C# web framework created by Microsoft, I was able to easily scaffold the controllers necessary for serializing the C# models into JSON to return to the calling client.

In the API project, the 2 controller classes have methods that return objects of type ActionResult. This is a feature that is built into the web framework that provides a declarative way to return a simple object and have it automatically serialized to JSON. We could also choose to serialize the responses to XML, but I think JSON is easier to read and is more common nowadays. Ultimately, this improves the artifact as it makes it much easier to visualize the data that the app uses. This will be particularly useful for other developers who would hopefully fork the project and put their own spin on it.

As far as the course objectives are concerned, I did meet the intended outcomes as a result of this enhancement. In this enhancement, I covered the last two outcomes: “Demonstrate an ability to use well-founded and innovative techniques, skills, and tools…” and “Develop a security mindset that anticipates adversarial exploits…”. The former was met by showcasing my ability to setup a new ASP.NET Core web API from scratch using Visual Studio and other industry standard tools like Git. The latter was met in a couple of different aspects. First, ASP.NET Core is marveled as one of the most secure open-source web frameworks available and is a popular choice for enterprise application. And secondly, utilizing a .env file within my project allows me to configure my project for local development, while excluding the sensitive environment variables from source control which is a security best practice.

I really enjoyed working on this enhancement. I have always liked learning how to use new tools and frameworks and I find the .NET ecosystem very interesting. One challenge I did face in this enhancement was in my development setup. I wanted to try to use Docker to containerize the backend API, but it proved to be a bit more difficult than I thought. I ended up just reverting to the default webserver provided by Visual Studio. I think the root of the issue is that I don’t quite understand Docker networking enough to be able to implement this yet.

Course outcome achieved:

Enhancement Three: Databases

For this enhancement, I wanted to show how I can take an existing application and add database capabilities to it. The Azure SQL database that is implemented in this enhancement showcases my skills in database development, design, and integration. Azure SQL is the industry standard database for apps running in Microsoft Azure. It is a cloud-optimized version of the popular SQL Server relational database management system.

Adding a database to an existing application instantly makes it more scalable. Without an external data store, the only way to add new maps to the game is to make a code change. What was previously implemented as an array of arrays is now a fully auto scalable Azure SQL database that can be backed up automatically. Entity Framework Core (EF Core) is a NuGet package developed by Microsoft, and it serves as an object relational mapper (ORM) for .NET applications. EF Core greatly simplifies the database schema development process by allowing developers to specify code-first models that describe the database structure.

I learned more during this enhancement than I did in the previous 2 enhancements. I was not familiar with SQL Server databases before this project, and I am glad I took the time to learn more about how it works. I think the most crucial piece of knowledge that I learned as a result of this enhancement is how to use dependency injection in .NET Core. In .NET web applications, there is a built in dependency injection container that allows you to register your own services with the container. In turn, this allows you to inject dependencies into different classes for them to utilize.

Course outcome achieved:

Other course outcomes achieved in this project: