Shortly after I got the internship offer from Ancestry, the COVID outbreak flamed across the US. A number of companies rescinded their offers or switched to remote working. However, because of the Nexus Tax restrictions to companies that provide digital subscription products, we are not allowed to work remotely out-of-state (in states other than UT and CA). Finally, the company let us fly to Utah and remote onboard in the corporate housing.
In early June, I departed from Syracuse and headed for SLC. Lehi is a small but bustling town near SLC. There are quite a lot of tech companies, there are big names like Cisco and Adobe, there’re also small companies and start-ups. The Uber driver told me lots of companies moved here from California, Facebook is also going to build a new datacenter around here.
The first day of the virtual onboarding was a Zoom meeting throughout the day. We learned about the company history, mission, and filled some paperwork for onboarding. I used to think Ancestry is a bio company(some friends asked me “I heard you’re joining a bio company”). But Ancestry is actually a data company. The main business of Ancestry is the family tree, and the family tree data is the most valuable property. These data came from a variety of sources, including paperwork and document that records birth, death, marriage, immigration, and military, some of them were even written in ancient English. While DNA and Health are businesses that just started in recent years.
The first week was mainly about familiarizing with the environment and setting up the computer. I worked for the Performance Engineering team. We were responsible for assisting other teams in detecting and optimizing performance problems in products, as well as developing performance-related internal tools. Our project was a brand new internal tool that I would work with another intern in San Francisco. The scope of the project was not very large, but we need to collect requirements, design, implement, test, and deploy the project from scratch.
Actually the project was not that complicated, but many things need to be considered in enterprise projects, such as performance, availability, cost, etc. Because it was a brand new project, our team gave us a lot of flexibility. We can choose any language and framework we like, as long as it is available on AWS.
We use Scrum for agile, I was really confused when I just get started. Finally, I got used to it after a period of time. But the Rally software was super difficult to use.
The work for configuring the environment was pretty easy, I finished it in half a day. The following weeks were basically spent on meetings to discuss requirements, researching various technologies in AWS, to see whether these things can be adapted to the project requirements, and then write a document for the discussion with everyone in the team.
We started with a lot of overdesign, and the manager kept asking us to keep it simple. We selected AWS Lambda and SQS, which was a great choice to reduce cost and achieve good scalability. If this was a course project, we could have used various frameworks and heavy messaging middleware, then deploy it on Kubernetes. However, for a company, fancy techniques don’t always solve the problem, solving problems with the lowest cost and secure delivery is the top priority. After that, we spent about three weeks composing the design document and get it reviewed by the whole team.
The implementation was pretty simple once the design has been settled. One problem was that we stuffed three Lambdas in a single project, which resulted in a very confusing package structure and caused various import errors, but we nailed it after fighting it for a couple of days. I also encountered a typical behavior question scenario that my mentor didn’t agree with one of my designs, and his opinion was in conflict with the current design, so I would have to change it drastically if following the mentor’s idea. Finally, I brainstormed and worked out three solutions A, B, and C to discuss with the mentor, and finally selected a more neutral solution.
Meanwhile, we also need to write tests. The importance of tests is already a cliché, but to be honest, this is the first time I write tests seriously(. In addition to unit tests we also need to use SonarQube for static checks, so we also need to take code style seriously, otherwise, the SonarQube report will be a mess.
I’ve always believed that Python is the best language, but during this internship, I did learn some drawbacks of Python. Duck typing is a double-edged sword. When collaborating with others, I have no idea what the attributes of a function are without referring to the document, and the more flexible the code is, the fewer problems can be found by static checking, a lot of problems can only be observed in runtime.
By week 7, the project was basically warped up. I spent three days fighting with permission issues before finally deploying to production. We have a Jenkins for infrastructure provisioning, I only need to write Terraform scripts, and the Jenkins will handle the rest. The only problem was the permissions issue, AWS has a really complicated permission system, I use the root account for almost everything when I use AWS for personal use, which I definitely can’t do in the company. Sometimes the tool we use will depend on the permissions of other tools in the team, for example, the team Jenkins, then I need to create PR to change the permissions of the team Jenkins.
Recapping the entire development, I spent roughly 50% of time coding, The rest of the time was spent on discussing requirements, discussing design, waiting for Jenkins build, and waiting for others to unblock… Indeed, the most difficult part of the job is not the job itself, but communicating with people, even for the SDE job that deals with machines every day.
Ancestry has very good WLB, even in the case of WFH, most people sign off at the end of the work. My teammate was a workaholic, he often pushes code or submits PR at midnight when sprinting for the deadline, sometimes I also dive into a bug until late night. Later the mentor found out and told us not to work overtime, and let him know if we were overwhelmed.
However, it was a challenge that my first internship in the US became a remote one. The meetings were a big problem. Ancestry booked us a hotel with a very poor network, and the Zoom call quality was super poor, which added to my poor English, but finally, I got used to it after a week or so.
WFH also caused trouble in communication. If working in an office and I need to ask someone a question, I can simply go to their desk and talk about it. But when WFH, everything can only be done through Slack and Zoom, and the experience of debugging through screen share was a nightmare. Worse, the searching in Confluence was totally a mess. When I run into some problem and tried to find documents to solve it, the Confluence search couldn’t find anything helpful at all, so I usually end up asking my mentor for documents.
I read the EA 游戏公司实习记 – Manfong’s Blog by @MF before, it mentioned various activities held by the company during the internship. Ancestry usually had 3-5 days of Intern Days in the first week of August in previous years. The interns from the San Francisco office will fly to Lehi and join us for various activities. However, because of COVID, the Intern Day was cut down to only Executive Intern Presentation and feedback session. Luckily, our project was selected for the executive presentation, which made me feel my work was recognized.
Even if we were working remotely, all of the interns based in Lehi were staying in the same hotel, so we had a chance to hang out or barbecue together. We were very cautious in social distancing when we first met, but we ended up giving up social distancing after several times…
There was a cabinet in the hotel lobby, filled with boardgames(?)
Although the entire internship became pretty rough because of COVID, it was a great experience overall. Thanks to Ancestry, I have made many new friends, learned new knowledge, and achieved a short period of financial freedom (doge