This week I achieved my 1 year anniversary working at WePay. I wanted to take some time to reflect on the things I have learned over the past year and the many things I feel grateful for.
System Design Level Thinking
As detailed in my first WePay blog post, one of the main reasons I joined WePay was to strengthen my system design level thinking. I am looking forward to becoming a senior software engineer soon, and the ability to think at the system design level is one of the main differentiators between a junior software engineer and a senior software engineer. Junior software engineers are less skilled in system design thinking because they are generally told what to do, e.g. are assigned tasks to accomplish in sprints, while their more senior managers or teammates think through the components and higher levels tasks that need to be achieved to build the product.
During the interview process, it was clear to me that WePay valued candidates who could think at the system level: one of the four on-site interview modules was dedicated to system design. System design is core to our company's offerings because our product is an API for merchants to accept credit card payments. Building this distributed system requires a thorough understanding of system design.
As a member of the Enterprise Engineering team at WePay, I have accumulated a lot of experience over the past year thinking at the system level, particularly about how our microservices interact with each other in our distributed system. I remember when I was working on an asset management application, the system needed to be able to create Jira issues via Jira API calls. At this point, we already had one other microservice which had Jira helper functions and Jira API credentials. I decided that it was best to invest the time to create a dedicated Jira microservice so that the two services could make Jira API calls without needing to duplicate Jira helpers and configs in both of the microservices.
I have also strengthened my design level thinking by training to become an on-site interviewer for the Communication & Design module. I have been interviewing for the past half year now and have become very attuned to the thinking that goes into a system design.
Prior to joining WePay, I had never built a microservice before. It turned out to be easier than I expected. Well, I don't get all of the credit because our DevTools team has built amazing tools and processes that make creating and deploying microservices so much easier.
I have to be careful not to go into proprietary information in this section so I will keep it more generic. WePay microservices are mostly written in Java and Python. We have an internal tool which can generate the boilerplate Java Dropwizard project code given a microservice name and some configs like the team name, environment, etc. I then write the endpoints, logic, and set configs to tie in other microservices, databases, third-party services (Jamf, Jira, etc.), and more. When it is time to deploy, there are also great developer tools to set the service configs for POC, prod, and other deployment environments.
I am proud to have written many microservices and to have learned a lot about microservice architecture. When I joined WePay, our team had 2 microservices; now we have over 10. There is a network of API calls that go on behind the scenes to support the applications that we build. Because these services touch proprietary company processes, unfortunately I cannot talk in detail about the services that I have built.
How to Conduct a Software Engineering Interview
At my first company, I was not given any opportunities to interview. There was no software engineering interviewing system in place. Decisions were not made with more than 2 people involved. There was only one interviewer. I remember sitting in at the end of a candidate's full-day interview where he presented the solution he had built for some type of geometry matching optimization problem, and thinking that this was such a disorganized interview. I then experienced a lot of software engineering attrition and other problems that probably resulted because of a poor interviewing system.
As a result of this experience, a year ago I really wanted to join a company where I could learn how to interview. During my second month, I expressed interest in interviewing and was put in a queue after completing an interviewing exercise. I chose to conduct the Communication and Design interview, instead of the more mainstream Algorithmic Coding interview or the Everyday Coding interview, because I wanted to strengthen in system design thinking and I value good communication skills a lot in myself and in a candidate/potential future teammate.
I began training for interviews earlier this year and after a month of training / 10 interviews, some of which I observed and some of which I was observed on, I graduated into the interviewer program. I generally interview candidates once or twice a week and I have completed around 30 interviews to date. I think that knowing how to interview is an important life skill for me, especially since I aspire to manage others and grow a team in the future. I feel that being able to interview and find the right people for my team is an incredible skill to have.
Becoming a mentor
Besides interviewing, being able to mentor is another important skill to becoming a manager and growing a team one day. This week I gained my first people responsibility in my career: mentoring an intern. I am excited that a summer intern joined my team, and I have the responsibility as her intern buddy. I don't have as much to say right now on this section, but I will just say that I am incredibly grateful for this opportunity and so far I am really enjoying seeing another person grow in their career with some of my guidance.
I am looking forward to writing a blog post on my intern buddy experience.
In conclusion, I am very proud to have worked at WePay for a year and I am excited for more to come. This is just a sample of the things I have learned this year, and I am looking forward to learning even more and teaching what I've learned with teammates, mentees, and others.