Source Allies had three apprentices during Summer 2020! They got to learn and gain experience with test-driven development, pair programming, cloud infrastructure, mobile development, and much more. Each apprentice had their own unique experience over the course of the summer, and gave a presentation in August to showcase their growth as developers, consultants, and people. In this post, each apprentice will share their story of their time at Source Allies.
Talen - Dragons Team
I started out at Source Allies last May (2019) moving CI/CD pipelines from Bamboo to AWS CodePipeline. Last fall, I stayed on to complete that work with the help of my fellow Teammates, Akrem, Michael, Jack, Rick, Kyle and several others. In October, we finished the job and finally deleted Bamboo! Since December, I have been working on the Dragons team with one of our global precision agriculture partners. We’ve been working on an app for dealers and technicians to use while working out in the field servicing various equipment. I’ve been working on several different areas of the app recently, but the largest amount of my time has been spent implementing an offline mode and sync engine for the app. These two features allow technicians to continue working in the app without an internet connection, and upload their progress when they come back online.
Some of the technologies we’re using are React Native with TypeScript, Redux Saga for our longer running background tasks, MongoDB’s Realm as our database and Spring Framework with Java on the backend. Out of these, I had only worked with Spring prior to starting the project, so I had a lot of fun learning them. For offline mode, I’ve been working mostly on the frontend in our Redux Sagas using generators. There are a lot of cool things you can do with generators to achieve co-routines or asynchrony. It’s a different style of programming than I’m used to, but it’s been quite a useful tool for the problems we’re solving. However, it turns out that generators are a little hard to test - each yield has its own block of code that runs, and we’re treating that as a unit in our unit tests. If you’re not careful, you can end up with some messy looking test code, which is definitely not what you want as tests should be easy to read. The way we are working around this is creating a function that advances the generator by one ‘yield’ and tests the code that was just run. From there, we can make assertions about the value the generator just yielded and any side effects created up to that point.
Next, our partner has been transitioning to a more agile workflow and we’ve changed up the way we approach work a lot over the past couple months. In the process, we’ve taken a hybrid approach where we’ve combined our team with a partner site’s team to work together on the app. Things were a bit slow going at first, but since then we have accomplished a lot and have worked really well together. Another challenge we are facing is lack of end-to-end or integration tests on the frontend. This comes with a bit of uncertainty about if every feature we’ve implemented is still working as expected, and creates a lot of manual testing work for our team members that are focused on quality assurance. Over the summer, some of my team members started working on adding end to end tests using Appium. Lastly, we’re having to do a lot of manual builds. Since we make iOS builds and our (dockerized) Drone instance did not have the ability to run commands on the host, we have to manually create builds each time we deploy to the app and play stores using Fastlane. This process can take up quite a bit of time, so we’re currently looking into ways to speed this up. Work on this is still in its early stages, but right now we’re considering Jenkins.
I have learned a lot this year, but three things in particular: I’ve learned a lot about mobile development, the use of generators to achieve coroutines and asynchrony, and React Native architecture as a whole. Doing mobile development has inspired me to look deeper into the subfield, and I am eager to learn about both native mobile development and other cross-platform technologies like the upcoming .NET MAUI. Overall, I have really enjoyed my time at Source Allies. I am looking forward to staying on in the fall and going full-time this December!
Tim - Team Aegis
I spent my summer as a member of Team Aegis working on Source Allies’ proprietary Payment Gateway application. The legacy project was primarily written in Java, using Spring as a framework and Maven for dependency management. My experience with development as a whole was focused on the “core principles” that were taught in my classes, primarily vanilla Java and Python, so I had virtually no experience working with external packages and dependency management tools, much less using a framework that fully wraps the project. We were first tasked with spinning up a new project that would allow customers to easily interface with our backend application, greatly improving ease of use and onboarding capability. We ended up using TypeScript, which was something I hadn’t even heard of before. On top of that, starting this TypeScript project was going to require setting up everything necessary for deployment in AWS. Needless to say, I felt like I was in way over my head. With that being said, the spin-up process allowed me to build a strong understanding of the backend application. It wasn’t long before I felt I had a firm grasp on how the application operated and how the moving parts interacted with each other.
I had the opportunity to work on a variety of features and technologies this summer. This included iframe pages for our current customers and building an administrator panel to allow customers to easily be rolled on to our service with minimal need for developer intervention. Other parts of the summer were spent learning how to interact with AWS to set up the TypeScript project as well as getting our internal Tech Radar (based off of ThoughtWorks’ concept) moved to an S3 bucket after our transition away from GitHub Pages (mostly thanks to Talen). I had very little experience pairing or doing test-driven development before this summer and my time at Source Allies has really shown me just how useful it can be.
Overall, I greatly enjoyed my summer as an apprentice here, even with our outstanding circumstances. I think it was a great learning experience and introduction to what the development process with a team is really like. I am glad I got to spend my time here and that I get to continue working with such great people this fall!
Luke - Team Aegis
When I first joined Team Aegis in May, the Payment Gateway project only consisted of an API for accepting payments. Our goal was to make Payment Gateway easier to use for partners because a lot of them are non-profits or universities who don’t have full-time developers. The first project we created to make integrating Payment Gateway into a website was an NPM package called @sourceallies/payment-gateway. This package consists of helper functions for interfacing with Payment Gateway and was built using the TypeScript language. We went with TypeScript because it reduces the number of bugs in our code because of the type safety. TypeScript also allows partners using the package to have type safety if they are using TypeScript. To build this package we went with Rollup.js because it is a very easy tool to use.
The second part of improving the ease of Payment Gateway was to create a web component for partners to add to their website with only a few lines of code. The web component is also published to NPM and can be found on our website at https://sourceallies.com/pay. The web component works in a similar way to an iFrame, but without the limitations. For example, it allows partners to style it to match their website with increased flexibility over what information they want displayed. We are using the StencilJS framework with TypeScript to create the web component because it transpiles to a standard web component that can be used on any website. Bonus - it has built-in support for Jest and Puppeteer.
In addition to the web form component, we also worked to add an admin application to Payment Gateway. This will allow Source Allies Teammates to easily add partners to Payment Gateway. Before this addition, a developer with knowledge of how the database is structured had to submit a pull request with a database changeset to add a partner. The admin app is being built into the backend using Spring and JSP to create the site. The future plan is to also improve the application for partners so they can easily create new gateways and add users to them.
I have learned a lot throughout my apprenticeship, specifically about AWS, the software development cycle, pair programming, and test-driven development. I have also made a lot of great connections due to the culture here at Source Allies as well as the nature of Team Aegis always rotating people. I have really enjoyed getting to put everything I have learned into developing software throughout the summer and look forward to continuing it this fall!
Talen, Tim, and Luke would all like to thank their fellow teammates for supporting, teaching and mentoring them throughout the summer. If you have enjoyed hearing about their experiences and think Source Allies may be a good fit for you, please do not hesitate to apply!