Hi, my name is Ben Grady. I am a Senior Software Engineer with 6 years of industry experience developing and maintaining REST APIs and dynamic frontends. At Cambridge Global Payments, I learned to plan, review code, reflect on team progress, test features and promote discussion. In small teams I learned to react quickly to change and adapt to shifting business demands. Throughout it all, I have amassed a wide range of experience across many languages and frameworks. 

My work emphasize strong design principles and communication. When starting a project, I invariably start by drawing a diagram. By the time I start implementation, I can be sure that everyone involved knows how the system will work, and has provided their input—I'm not the only person who has great ideas! This collaboration and planning is a big part of why I like Software Engineering. In my work, I want to build a great team that builds great software. 

I built this website for anyone looking to know more about me and the things that I work on. Below, you can read about how I built this site, as well as the teams that I've been a part of, and the projects that highlight my diverse software interests. I'd love to get your feedback!   

Tech Stack
Languages
[object Object]
Having worked with a large number of languages, I am able to easily pick up new languages. For example at Cambridge, I was able to start a new project by applying my knowledge of strongly-typed object oriented languages to GoLang, despite never having used it before. Now, it is my go-to language for many projects. 

In addition to object-oriented languages, I have experience with scripting languages, templating languages, and even hardware-description languages. I am proficient in high-abstraction languages like C#, as well as embedded systems languages like Assembly. I have a preference for strongly typing, as it encourages code organization, reducing code maintenance and improving readability. 
Frameworks
[object Object]
It is imperative to choose a framework for building code. Not all frameworks are complicated, but most have hidden complexities that are only revealed with experience.

I've worked with React in large and small workplaces, with both Javascript and Typescript. In my time with React, I've used class components, migrated to using hooks, and used the 3 best-known state management frameworks—Redux, Recoil, and Flux. 

In terms of search, I've worked with both Elasticsearch and Solr. At IBM, I worked with corporate clients to address Solr indexing and query issues, and I helped them propagate their indexes across servers. At Cambridge, I worked to programmatically read data from our DB, flatten it, and insert it into the Solr index without server downtime. I also wrote aggregate queries for an API usage statistics plugin, which queried Elasticsearch for our API logs.

My REST API development experience with Node.js, Gin, and .Net Framework. Has allowed me to create organized, performant APIs by focusing on REST best practices.
Software Principles
[object Object]
I have extensive experience in software principles, which are key in facilitating problem solving, group collaboration, and in guaranteeing a solution deliverable to stakeholders. I apply SOLID principles and Object Oriented Programming to the code I write, Agile practices to the teams and discussions I have, CI/CD to the review and deployment processes, and Domain-Driven Design to the planning of new software. Through these principles, I can ensure good code, close collaboration, intelligent design and reliable software delivery.

SOLID has 5 key coding principles:         
  1. Single-responsibility: Code should have 1 purpose
  2. Open/Closed principle: Open to extension, closed to modification
  3. Liskov substitution principle: A derived class should have all the functionality of the prototype class
  4. Interface segregation principle: Code should be forced to depend on it does not use
  5. Dependency inversion principle: Abstractions should not depend on implementation
Agile principles have most positively influenced my team collaboration. These principles revolve around frequent delivery, open client communication, and empowering individuals. I have been fortunate enough to belong to some strong teams that have taught me agile practices, and I apply them in every workplace.

Domain-Driven Design (DDD) is the approach to software that involves creating diagrams and models around domain knowledge. By creating a diagram or model, a developer can understand things that would otherwise only be understood by specialists. DDD is the tool to use that can allow people to discuss approaches to problems before they're implemented. 

My experience in Continuous Integration/Continuous Deployment (CI/CD) is limited, but the concept relies on a strong process for verifying work. CI/CD is used to make small changes whenever they are ready as opposed to waiting for a deployment schedule. 

Finally, Object-Oriented Programming is the cornerstone of most modern software. Although initially difficult to learn, they are a strong asset for any developer. 

Employment
urite logo
URite - Senior Software Engineer
  • Developed and maintained underwriting software integrated with Microsoft Excel, with a C# .Net Backend
  • Introduced a growing team to Agile methodologies including planning and retrospective meetings, Scrum boards, Backlogs, and Domain-Driven Design
  • Linked Excel cells to application fields to handle value changes, worksheet renames, cell movement, and more 
cambridge logo
Cambridge Global Payments - Full Stack Developer
  • As the payments REST API SME led weekly meetings to review all changes to our API endpoints
  • Implemented notifications for the Link Android and iPhone mobile apps using Firebase
  • Built an internal dashboard for monitoring Production Hangfire events
  • Created a dockerized service for the collection of API statistics
  • Created a Visual Studio plugin for displaying API statistics inline with code, allowing developers to make more informed decisions when modifying APIs
  • Worked on implementing Multi-Factor authentication using DUO auth
ibm logo
IBM - Websphere Commerce Support Engineer
Java  java , SQL  db, Solr  solr, WebSphere Commerce/IBM WAS was
  • Collaborated with developers and business stakeholders from multiple fortune 500 businesses to solve system-critical issues regarding Solr search and order management.
  • Maintained corporate client relations by providing technical expertise
  • Continued troubleshooting eCommerce issues part-time while finishing university
lighthouse logo
Lighthouse Tech. - Owner/Co-Founder
PHP,  , SQL  db, WordPress  wp
  • Collaborated with Kingston Economic Development Corporation (KEDCO) to launch a mobile-friendly web design company
  • Optimized existing websites to be mobile-friendly for local Kingston companies


Projects
Go Server
This project started as a ready-made server application that I could use for any future web projects. Today, it is the backbone of the CMS used to make this website. It is already paying itself off in dividends!

In any project, before you can implement any domain-specific code, you need to create a framework. After working with several API-building frameworks, I recognized a need for clear code scaffolding. GoLang's main strength is that it promotes good organization, so I decided to build a minimal server that can be used as a starting point for any server project. 

Go Server serves both static files (Html, js, png, etc.) and handles REST requests. It has user authentication and accepts POST/GET requests to receive/serve data, which it stores in the Postgres database.
GoLang Golang
As an opinionated language, which makes it perfect for project organization. 

Gin Gin
Chosen for its widespread adoption, Gin allows for simple authentication, serves static files, and handles REST Requests. 

Docker docker
I used docker so I could easily port this project to any machine I happen to be using to run it (even if I come back to it in a decade). Docker Compose runs the server and a Postgres database, connecting them with environment variables and exposing the appropriate ports. The database tables are initialized if they don't exist, and data is backed up to a volume within the project directory so it can seamlessly pick up where it left off.

Postgres/SQL postgres
With no shortage of SQL server applications, Postgres was chosen because of its feature set. Postgres handles JSON, Geometry, and Advanced Indexing. 
Home Server
Like Go Server, I found myself wanting to host applications and projects. Here are some things I've hosted:
  • SSH server for maintaining the server
  • Plex movie streaming platform
  • Torrent client that users can access from the browser 
  • An in-browser instance of vs-code for when my laptop broke
  • Taiga scrum board/kanban board
  • A big reason I undertook this project was that I wanted to learn more about the DevOps/IT Operations side of web applications. Maintaining a live server demystified many of the concepts that make cloud hosting so attractive, and introduced me to many technologies that are industry standards for configuring distributed systems. 
    Linux ubuntu
    The server runs on a headless Ubuntu server. 

    Nginx nginx
    Currently, Nginx proxies all subdomains to various applications running on a single machine, but if I ever make the move to a full server cluster, I'll be ready for it. 

    Systemd systemd
    If the server turns off for any reason, it can pose a problem if the applications aren't available until the next time I connect via SSH to start them. I use Systemd to ensure all of the applications start automatically. 

    Crond cron
    With all the applications running, I needed to point the DNS to my server's IP address. Since my internet provider updates my IP regularly (unless I pay for a static IP), I needed a dynamic DNS. I created a bash script to get my IP and send it to https://dynamicdns.park-your-domain.com. Crond triggers this bash script periodically, allowing for my server to maintain its uptime.
    Grapesjs Scroll NPM Package
    Grapesjs is a content management system (CMS) used to edit and modify HTML, CSS, and Javascript. When looking through the plugins available online, I noticed there was no way of triggering animations as the user scrolls through a page. 

    To address this, I built a plugin called grapesjs-plugin-scroll. For a demo of the plugin in action, check out this demo page.

    Using my experience with Grapesjs, I have started work on a new plugin to integrate Charts.js with Grapesjs. Currently, it can only create radar charts, but stay tuned for a complete integration!
    Grapesjsgrapesjs
    Custom Traits, Components, and Blocks were built into this plugin for use in the Grapesjs CMS. 

    Vanilla JS js
    Since Grapesjs outputs plain HTML, Vanilla JS was used for DOM events and managing DOM components. It doesn't do any render batching the way React does, but since only a few elements are being managed, DOM updates are more than enough.

    NPM npm
    This project was published using NPM, so anyone who wants to use it can just add it to their node modules. So far, it has peaked at 162 weekly downloads!
    CIFAR-10 Classification
    The CIFAR-10 dataset is a collection of 50,000 images of 10 different categories: cat, deer, dog, frog, airplane, bird, automobile, horse, ship, and truck. For the human brain, it's very easy to identify the category from the image, but for a computer, it's a complex problem to identify objects using nothing but color data. (There's a reason the "are you a robot" questions are frequently identifying images!)
    In python, I've created a program that classifies these images into 10 groups. In deep learning,  multiple convolutional layers are configured to extract features from an image and the relation between those features. We can then use reinforcement learning to learn the category using the features we extract from the image. Finally, we test the neural network by passing in a new set of images and checking to see how many images are correctly classified. In this case, we achieved 72% accuracy!
    Python python
    When working on any machine learning (ML) program, Python has many advantages. It has a large number of tools that are built for data scientists to take advantage of, as well as a large online community.

    Numpy numpy
    Data manipulation in Python is made simple and easy with Numpy. It handles both simple array manipulations and complex mathematical operations. 

    Tensorflow/Keras tensorflow
    This library is the backbone of deep neural networks in Python. Keras offers a simple API for designing neural networks that might take weeks to implement. 

    Colabcolab
    Writing, saving, sharing and, and executing Python code are all done within Colab for this project. It functions just like Jupyter or Kaggle, but it stores directly to your google drive.
    Contact
    Ben Grady 2022