Introduction

Over the past 8 months, from January to August 2022, I have completed my fourth and fifth Bachelor of Computing co-op work terms at NCR. In this report, I will talk about NCR itself, my goals over the past 8 months, as well as detail the various projects I was involved in over the past 2 terms.

About NCR

NCR (formerly National Cash Register) was founded over 130 years ago in Dayton, Ohio. As the name implies, their original business was in the sale of mechanical cash registers. In years since, NCR has greatly expanded its business to include a variety of different products and services that assist companies in the Retail, Hospitality, and Banking industries.

NCR has over 34,000 employees located in 160 countries, and serves businesses in over 140 countries around the world.

NCR’s banking division develops the majority of the software involved in a financial transaction between a bank and its clients, from the front-end (ATMs, tellers, mobile apps) up until a transaction is sent to the bank itself. NCR works with multiple different providers of bank “cores” (the software ran by banks to actually manage clients and their money) to enable the deployment of their banking solutions across a multitude of different financial institutions.

Given the size of NCR as a company, many different software technologies are used in different divisions. In their banking division, however, NCR utilizes microservices to enable their software solutions to be incredibly flexible, and easily deployed across many different environments. These microservices are powered by Docker (a tool enabling software to be ran in isolated, virtualized environments known as “containers”), and Kubernetes (software used to deploy and manage Docker containers).

Goals

During my two work terms at NCR, I established 6 learning goals (3 per term) that I wished to complete:

  • Learn how to use Docker
  • Learn how to use Kubernetes
  • Gain a good understanding of NCR’s codebase as it pertains to my job
  • Become more active in sprint planning and backlog grooming meetings
  • Become more proactive in helping other teammates or picking up new stories as I complete them
  • Improve my personal time management skills

Docker is a piece of software used to run applications inside of a “container”, an isolated space that is only used to run the application, and is separated from all other applications running on the host computer. Docker greatly simplifies the deployment of software. Due to this benefit, Docker has become incredibly popular in software development, and is used by many companies as part of their tech stack. Because of this, having professional experience with Docker would be extremely helpful to me in my future work, and I was very interested in learning about Docker as part of my work experience at NCR. Over the course of the past 8 months, I have learned a lot about Docker and how it is utilized in the software development process. I believe that I was successful in completing this goal.

Kubernetes is another piece of software that is often used hand-in-hand with Docker as a method to simplify the deployment of applications. In an organization that uses a microservice architecture with its applications, Kubernetes provides an easy way to organize and manage multiple applications running in separate Docker containers simultaneously. Kubernetes is used in many of the same organizations that also utilize Docker as part of their software development process. It is however a separate piece of software from Docker, and is thus considered a separate skill. Because Kubernetes is so popular, having experience with it would be very beneficial to me in the future. For this reason, I wanted to learn more about Kubernetes as part of my work experience at NCR. During my time at NCR, I have gained a considerable amount of experience with Kubernetes, and have no issues using Kubernetes as needed in my daily work. Because of this, I believe I was successful in completing this goal.

When I first started working at NCR, I found the organization of their code to be very confusing. In my previous work experiences, full-stack development was utilized. This meant that each developer had knowledge of the entire tech stack the application was running on. At NCR, I only regularly worked with one portion of the tech stack. Other layers up and down stream were managed by other teams. In order to better understand what I was doing when completing work tasks at NCR, I wanted to gain a better understanding of NCR’s code base. While it wouldn’t be feasible to learn the intricacies of code I didn’t regularly work with, I at least wanted to gain a broader general understanding of how their whole tech stack worked. I have made great strides in this regard over the past 8 months. As I worked with different parts of the code that my team was responsible for, I asked questions and gradually gained a much better understanding of what I was doing and how it affected other teams. If I work with another codebase in the future that is organized similarly to the code at NCR, I believe that it will take much less time for me to adjust, now that I have this experience. Overall, I believe that I have been successful in completing this goal.

After my first term at NCR, during my evaluation for the term, one of the comments my team lead had was that I could be more active during work meetings, such as sprint planning and backlog grooming. As this was pointed out to me as an area that I could improve in, I thought it would be fitting to include this as one of my goals for the following term. Over the past 4 months, I have made an effort to speak up more during meetings. These efforts have included voicing my input where I deem it necessary or helpful, as well as speaking up and asking questions if there is anything discussed in the meetings I would like clarification on. As such, I believe that I have been successful in completing this goal. The skills that I have developed by doing this will greatly benefit me in my future work. By practicing speaking up during meetings, I have gained a better understanding of when it is appropriate to speak, and have improved in my ability to phrase my comments and concerns.

Another comment that my team lead had on my evaluation for my first term at NCR was that I could be better at picking up new stories (work tasks) to complete as I finish my current stories. During my first term at NCR, I experienced a lot of downtime, where I wasn’t able to continue with my current task, and was unsure of what to do next. As such, I added a goal for my second term at NCR to try and mitigate this to a degree. While I shouldn’t pick up new stories and start working on them without input from the other people on my team, I can at least review the stories that I may potentially start working on next, and familiarize myself with them as best as I can. Over the past 4 months I have done this multiple times. While this isn’t a foolproof strategy for reducing downtime, it does help a little bit if I’m stuck and not sure of what to do. By practicing this, I have also improved my ability to help reduce any potential downtime I experience in future work. I believe that I have been successful in completing this goal.

The final goal I set over my two work terms with NCR was to improve on my personal time management skills. During my first work term at NCR (from January to April), I noticed that I often experienced trouble with gauging how to best use my time throughout the workday such that I could participate effectively in scheduled meetings. Because of this, for the following work term I added a learning goal to try and improve in this area. Every day, at the end of the day, I would review my schedule for the next day, to determine how to plan out my time best. While this definitely helped in improving my performance in this area, I believe I still have room to grow. Because of this, I do not believe I have fully completed this goal. To improve in this in the future, I will try to develop additional strategies that will help with my time management skills, in combination with reviewing my schedule ahead of time.

I believe that my work terms at NCR were an excellent vessel through which I was able to work on my goals. Throughout my time at NCR, I was given tasks that exposed me to many new areas of development. I have also gained experience with new ways in which the development process can be completed. Working at NCR has greatly expanded my skill set, and will enable me to produce software of vastly improved quality in the future.

Job Description

My title while working at NCR was “Software Developer Co-op (Java/API)”. As one might expect from this title, the majority of my time at NCR was spent developing APIs, as well as supporting the development of these APIs.

In contrast with my previous work terms, at NCR my work was entirely within the backend of NCR’s tech stack. Throughout my two work terms at NCR, I was on one of the “Core Integration” teams. The Core Integration teams at NCR work directly with the various bank cores that NCR supports, to develop a software layer that translates requests from NCR’s banking applications into requests that these bank cores can understand. The vast majority of this development work is done in NCR’s domain-specific language, API Toolkit. Occasionally, Java code is also used to enhance the functionality of API Toolkit.

As was mentioned previously, NCR’s tech stack utilizes a microservice architecture. Instead of all the code needed to enable NCR’s banking services being in one monolithic codebase, each layer of the tech stack is self-contained. This structure makes it easy to swap out components, and enable NCR’s banking services across a wide array of different bank cores. As the way NCR structures its code is different from my previous experiences, it makes sense that the way this code is tested differs as well. While it is possible in many situations to run each of the applications that compose NCR’s tech stack locally, on your own computer, the vast majority of development work at NCR is not done in this way. Instead, development (at least on the Core Integration teams) is usually done in the cloud, utilizing Google Cloud Platform (GCP). Each team has a Kubernetes namespace (a set of applications that can communicate with one another) hosted on GCP that they develop in. When code changes are made, the developer pushes up a new Docker image for the application that was changed, and modifies the Kubernetes configuration to use it. They can then test their code, and push up another image if further changes are needed.

NCR makes strong use of Agile (more specifically, Scrum) methodology to manage its development lifecycle. As is typical for an organization using Scrum methodology, development is organized into two-week sprints. Before a sprint starts, it is planned. Developers, working with an Agile coach and their product owner, determine what the team will try to accomplish during the sprint. Individual members of the team are then assigned tasks (stories, bugs, etc.), and the sprint begins. At the end of the two-week period, all of the teams come together and share what they have accomplished during the sprint, as well as what will need to be moved into the next sprint. After this review, the Agile coach hosts a sprint retrospective with each of the teams, discussing with the members what went right, what went wrong, and how the development process can be improved in the future. The majority of NCR’s development lifecycle is managed using Atlassian’s Jira software.

Some of the tasks I worked on during my terms at NCR include:

  • Core Adapter - Transfers Functionality
    • Implemented the functionality to transfer funds between different accounts from NCR’s banking applications, on an external client’s bank core, utilizing their API.
    • Extended the functionality of an existing API endpoint, to enable it to also be used for transfers.
  • Core Adapter, BIS Adapter - Improved tokenization logging
    • Improved the logging functionality across multiple of NCR’s banking applications so that concerned individuals and teams could track when credit and debit card numbers were being tokenized and de-tokenized for security reasons.
  • Continuous Integration & Deployment - Transitioning to new Jenkins servers
    • Assisted in the transitioning of CI and CD jobs to a new instance of the Jenkins CI/CD software.
    • Made numerous modifications to existing Jenkins jobs to ensure that CI/CD functionality remained consistent from one environment to another.
  • Integration and End-To-End Tests
    • After the development of new features, I implemented integration and end-to-end tests for said features that ensure they do not break when others make changes to the codebase in the future.
  • Development Support for Upstream Teams
    • After the release of new versions of software that I worked on, I supported and answered questions from other teams upstream in NCR’s tech stack, so that they could utilize new features/bug fixes that I had implemented.

Conclusion

The past 8 months I’ve spent at NCR have been a powerful learning experience. Joining a new company with different policies, procedures, etc. from what I was used to has given me a valuable new perspective on software development. The skills that I have learned during my time at NCR will continue to benefit me well into the future. I would not hesitate to recommend NCR to any co-op student looking to experience what software development at a larger scale is like. For those who have only experienced development from the perspective of a smaller company or startup, the skills and knowledge you acquire when developing software at NCR will benefit you greatly in the future.

Acknowledgements

I would like to thank all of my co-workers at NCR, especially my team lead Callum Butterworth and my development manager Jarrett Tremblay. Working with them over the past 8 months has been a pleasure, and greatly contributed to why I think my work terms at NCR were so successful.