April 29, 2019 - December 20, 2019

About NCR

  For 135 years, National Cash Register (NCR) has been a leading organization in financial services. The company invented the first mechanical cash register in 1879, before NCR was even founded in 1884, when it was still known as the National Manufacturing Company. Since its establishment, NCR has continued to generate innovative ideas, including the first magnetic card strip and self-checkout machines. Today, NCR is comprised of a team totalling over 34,000 employees in 160 countries and has become the global leader in Multivendor ATM Software, as well as the world’s top POS software provider for retail and hospitality services. Although NCR originally began hardware-oriented, their focus has shifted to software-first solutions that can be utilized by various industries. This applies to the Waterloo site I spent my 8-month co-op term, where my team worked on extending software for the payment and transaction processing portion of NCR’s banking solution.

Job Description

  My first 8-month co-op term was well-spent as a Software Engineering Intern within the Channel Services Platform (CSP) Foundation section of the NCR Waterloo branch. More specifically, I was a proud software developer in Team Omega, one of seven 8-person teams working on the CSP product, where I contributed to the RESTful APIs created to be consumed by the front end banking application of our customer, one of the largest American banking companies.
  Here, I received the opportunity to practically apply the knowledge from school and learn many new things that helped build a foundation for my career. Besides knowing Java and Agile development along with some knowledge about REST from classes, I learned everything while on the job. Moreover, although Agile is taught in class and practiced during labs, experiencing it in a real workplace setting is extremely different, especially at a large company like NCR. There is a seemingly infinite number of meetings for things such as daily standup, sprint planning, backlog refinement, sprint retrospective, and product implementation planning.
  In regards to the other half of my job, the real coding and product development proved to be almost entirely new for me. First of all, the code itself provided a platform for constant learning because “API Toolkit” is a custom language that was built for this product using mainly Spring, Swagger, and YAML among other things. Secondly, I had to learn an entirely new concept: the infrastructure of how the API operates using Java-based microservices that reside in a Kubernetes environment setup with Docker containers. On top of all this, I even learned Bash scripting, some more about databases, how to properly use more Git operations, and even how to use a real debugger in order to aid my development work with CSP’s tech stack. Even the straightforward development flow where each task goes through phases starting with design and ending with a successful demonstration to a product owner after writing, reviewing, improving, and testing code was a new experience, especially our continuous integration test suite that is run via Jenkins. This all seemed like a lot when I first started, but I really enjoyed the challenges that came along with learning all of these new things.

Tools and Technologies

  There were many new tools and technologies that I had the opportunity to learn during my 8 months at NCR. For my term here, Visual Studio Code (with a lot of extra plugins) was my primary editor and was used for the bulk of my work, including development in Swagger OpenAPI 2.0 and YAML. For our continuous integration testing run via Jenkins, I developed the Java unit and end-to-end tests using Eclipse in coordination with Maven to build projects and Cucumber to write easy-to-read test steps. Git, Bitbucket, SourceTree, Microsoft Teams, Slack, Jira, and Agilecraft were all used for product management, group communication, and sprint tracking. The product itself was a Java-based microservice architecture running on a Kubernetes deployment cluster with Docker containers. Postman was used along with a custom web UI debugger to test endpoint calls, which was developed in parallel with NCR’s custom API Toolkit language. Although, I had minimal interactions with these databases through DBeaver, our product also uses NoSQL and Relational databases, such as Elasticsearch, Cassandra, Redis, and Oracle. As you can see above, the work I did was all back-end, with some dabbling in dev-ops and Bash scripting in order to manage my own cluster and work more easily.

Work Highlights

  • For the first annual NCR Global Hackathon, my team of 4 co-ops, SilverFace, was awarded for being in the top 10 finalists of nearly 400 teams for our submission of a React Native software we called FacePay. Essentially, this product would allow a POS system to no longer require a card or sign-in during transactions because it uses facial recognition to detect and identify its operating customer and charge the bill to the associated account. It mainly used Expo, Microsoft Azure Face API, Imgur API, and Outlook API.
  • Refactored all Elasticsearch Electronic Journal template configuration files to improve modularity, organization, and efficiency.
  • Developed a new endpoint in response to a client’s change request to retrieve cheque images from our integrated storage system with parameters to specify colour and image format by myself. This was my favourite assigned task because I was able to work with encrypting and decrypting image data. It was especially rewarding when I was able to see the full image rendered from the endpoint call, showing that it was properly retrieved from the database, decrypted, and finally returned in byte form.
  • Led the development of a new feature, ATM Deposit Cash, that was later reused in a nearly identical manner for a similar ATM Cash Dispense feature. As part of this story, I laid the groundwork for using substitution within a configuration file that was later improved by a senior developer. I encountered some difficulties while developing this feature and it allowed me to improve my debugging abilities and problem-solving skills.

Goals

  1. CRITICAL & CREATIVE THINKING - Problem Solving: Training with Minimal Help
      The first goal I set for myself at NCR was to persevere through the two weeks of onboarding and training with a minimal amount of assistance. I was able to complete my goal and gain a better understanding of the technologies we use because I spent the time to explore each one by myself, only requiring assistance to setup my dev cluster.

  2. CRITICAL & CREATIVE THINKING - Depth & Breadth of Understanding: Understanding Tech Stack for TxInfinity
      My second goal was to gain a full understanding of the complete tech stack I was working with at NCR by the end of my term. This was achieved from the diversity of the many tasks I completed, that became increasingly easier as I gained more experience and knowledge about my work.

  3. LITERACY - Technological Literacy: Git/Bitbucket Proficiency
      As I have only ever used Git to backup my projects, the third goal I made was to become more proficient with Git and Bitbucket during my time at NCR. Due to the many repositories, pull requests, and reviews, I was able to learn how Bitbucket works. Most importantly, I learned how to use command line or SourceTree for many Git operations: branch, merge, clone, commit, add, push, and pull.

  4. PROFESSIONAL & ETHICAL BEHAVIOUR - Teamwork: Social Skill - Ping Pong
      Finally, my last goal of the first term was my favourite because I feel that I completely overcame my own expectations of improvement. Since there were ping pong tables in the break room, my goal was to finally breakthrough just rallying and learn how to curve the ball, especially to smash. Of course, this goal was naturally a social aspect and helped me get along with my coworkers by providing a fun and competitive medium. It was a nice break from our normal work and increased morale too. I was able to get lots of practice and learn from the more experienced regulars because we played at lunch everyday. NCR noticed all of this and even enlarged the rec area for ping pong! By the end of the term, I definitely had the best record among the co-ops and even managed to surpass the people who showed me how to smash and curve the ball. I was very proud of this achievement.

  5. LITERACY - Technological Literacy: Working Speed Improvement - Average Velocity Increase & New Hire Guidance
      One of the goals of my second term was to improve my average velocity in order to show my overall growth and improvement by completing more work in less time. Looking back at the number of stories and the amount of points I completed in each term, I can see that this goal was achieved by a significant margin. On top of this, I also wanted to ensure I was able to assist the new hires to my team by answering any questions and helping them with setup and onboarding, especially for creating their local dev cluster.

  6. PROFESSIONAL & ETHICAL BEHAVIOUR - Leadership: Coding Standards Committee
      Another goal of this term was to become more involved and have an active leadership role in the workplace, so I decided to join the coding standards committee. I’m satisfied that I was able to make a significant contribution here, especially in regards to leading the creation and improvement of the coding standards documents because our custom language did not have any when I started here in the summer. In addition, I reviewed a significant number of PRs as a member and helped to start awareness of the new guidelines and design improvements.

  7. PROFESSIONAL & ETHICAL BEHAVIOUR - Personal Organization/Time Management: Structured Developer Repository
      A personal goal I had was to finally create an organized and structured repository for developers to publicize and helpful, tips, tricks, scripts, or guides. This was finally realized and I was able to post the Bash scripts I made to automate a lot of things. I was especially proud because I learned Bash in order to develop a script that would automate setting up the local dev cluster and make everyone’s work easier, particularly the new hires. Although there was already a guide for this, I continued to improve it during my time here and even automated the process. The new fall co-ops were very thankful for this. In general, this repository is a trove of useful information that can aid developers’ daily work life. Creating this repository will also make it easier to maintain and improve because it has version control and revision history instead of the previous method, “pass around a zip file”. I hope that I spread enough awareness for this to be maintained after I left.

Conclusions

  During my 8 months at NCR, saying I learned a lot would be considered a severe understatement. There were many things I needed to know for this position, so I learned a lot of different technologies and interacted with a lot of people, but this still barely scratched the surface and I continued to grow everyday. I really enjoyed my time at NCR because I found it was always interesting. Fortunately, I had the freedom to pursue stories that interested me and was able to try my hand at completing a lot of different types of work, even leading planning meetings in some cases. I feel this was largely due to the Omega Scrum team I was a part of, and I’d like to thank them for being welcoming, helpful, patient, and supportive throughout my time there.
  I’m grateful for the numerous opportunities I was given as a part of the team to work on a variety of more interesting stories, rather than be stuck with “typical co-op grunt work”. This allowed me to grow more confident and independent, in turn becoming a more reliable team member during my term at NCR. Although I believe to have strong soft skills from the multitude of sports I play and experience from part-time jobs, I feel much more confident in my overall communication skills in a more technical environment after my experience at NCR, especially in agile development with such a large team. I also hope that I have made a lasting impact with my team and NCR, as they have have made a lasting impression with me.

Acknowledgements

  I’d like to give a special thank you to the following people as they have all made a significant impact on my experience and growth in the past 8 months.

  • Dmytro Yermolov - Software Architect I, promoted from Omega Team Lead
  • Ryan Nesbitt - Senior Omega Co-op, showed me the ropes
  • Melissa Lynett - Omega Software Engineer II
  • Vasavi Sagi - QA Lead, promoted from Omega QA
  • Vladan Maricic - Software Engineer III, new Omega Team Lead

  • Xiaogang Hu - Ping Pong Rival, taught more advanced techniques of how to play
  • A quick shoutout to Team SilverFace - Kamran Fekri, Jacob Haig, and Seegal Panchal
  • Lastly, a big thank you to the rest of Omega Team: Ajay Gour (Software Engineer III), Nikhil Kumar Chaurasia (Software Engineer I), Mark Kaiser (co-op), Chris Boves (Software Engineer III), and Shahnavaz Saiyed (Contractor)