A reflection on my experience as a software engineer intern at Recursion in 2020:
I first heard about Recursion through a friend at the University of Utah while discussing the potential applications of AI and deep learning. He brought up a local biotech company that was attempting to utilize AI and deep learning to automate drug discovery in hopes of significantly reducing costs in the pharmaceutical industry.
A year later during my internship search, I was on the lookout for a company that I believed was doing meaningful work to improve the world and officially stumbled upon Recursion. I also discovered that one of the best teaching assistants I had in an algorithms class earlier in college was working there (shout-out Sara Moore!), and when I reached out to her, she had nothing but great things to say about the company. I was fortunate enough to land an interview, and throughout the hiring process, I felt that their highly collaborative team of engineers genuinely believed that their work was meaningful.
One of the things that stood out to me was that they were willing to give feedback about the interview immediately which, in a world of leetcode interviews, was something I really appreciated. From the very beginning, the process was collaborative and discussion-based — as if we were already on a team solving problems together. This definitely gave me a positive first impression of what it may be like to work at Recursion. They offered me the role, and it was a no-brainer for me to join the team.
During my internship, I was given the opportunity to work on a real project. As part of the high throughput automation pipeline, Recursion modifies cells to be “unhealthy” through perturbations. Prior to joining, perturbing cells only occurred through a single method (siRNA) and the application was built under the assumption that this was the only way that cells could be broken. Over time, other technologies such as CRISPR were introduced, which created a need to modify how the application was built. As part of this initiative, I worked on an analysis tool called Image Explorer which aids biologists in filtering our image data and seeing the variations in images. Given the addition of CRISPR, we had to update the way our filtering was handled.
Through this process, I got hands-on experience learning a functional programming language for the first time in ClojureScript (similar to Haskell or Scala). Specifically, we used the re-frame framework (https://day8.github.io/re-frame/) which has a data-oriented, functional design. As an example of the framework, we can define a front-end component that re-renders based on updates in the data.
Here, the reference to
allows us to access a cached database state for the sidebar-pane where the data loaded from the database is defined as a subscription.
The exciting thing about reframe was that the dataflow was completely pure. Our data flowed in a loop, allowing convenient rendering for a web application.
Changes in URL or on-click events would toggle event dispatches, which would update an to an internal signal graph that flowed up to allow further data manipulation.
Being completely new to ClojureScript, functional programming and the biological domain, my teammates were always willing to help guide me in the right direction. I gained first-hand insights into data-oriented frameworks and keeping functions pure. Within data-oriented frameworks, data flow itself drives the actions within the application. Whenever events triggering data calls occurred, frontend components “subscribed” to that data would re-render, which allowed pure and easy-to-follow logic for how and where data flows from when it’s first cached to eventually being rendered in the component that relies on it.
Below is a diagram representing the reframe workflow:
I felt that I was given enough autonomy to own the project, and was encouraged to consider better ways to do something, rather than just deferring to the first feedback. This enabled me to think about the problem more deeply in exploring various ideas and tradeoffs compared to just accepting an answer without much thought.
Even though the internship was remote due to the challenges of Covid, my teammates were always there to help me through issues. My team consistently made an effort to reach out to me to see if I needed any help or just to strike up casual conversation. I even went biking with one of my teammates who happened to live down the street. (@Denton, who is the reason I bought a bike!)
By the end of my internship, I managed to successfully deliver a new version of filtering which could handle CRISPR and more easily support onboarding newer types of perturbations. Recursion’s mission and values were deeply apparent during my time as an intern, even with the team primarily working remotely. During company all-hands meetings (which occurred on a weekly basis), we received transparent updates on the company’s progress, direction and long-term vision from Chris, Recursion’s Co-founder and CEO, and other leaders.
Every week, Chris reminded us of the timeliness and importance of our work in creating a platform that could potentially save lives. He openly shared stories about clinics he visited where the children he met just a few years back had passed away and what that meant to him. While there are many jobs out there where it’s “just a job,” Recursion is unique in having a sense of urgency and knowing that we have to deliver because people’s lives are on the line.
I had an incredible experience supporting Recursion’s mission to make an impact and would highly recommend Recursion to anyone looking for similar opportunities!
Aaron Goh is now a full-time software engineer on the Accelerated Pharmaceutical team at Recursion.