An Internship of Firsts
Intro
With a quick splash of water on my face and a glance in the mirror, I made my entrance. Wearing headphones and looking at his phone, Raphael, Numina’s Computer Vision Engineer, sat alone in the office. I manage to mumble out my name before reaching to shake his hand. Mid-extension, it dawned on me that my hand was still damp. But due to Raphaël’s viper-like acceleration, our hands met in a wet embrace.
Despite an awkward start, working at Numina has been an unforgettable summer of wonderful firsts and enriching experiences. As excited as I was to start, I found my early entry into the rat race daunting.
One on hand, I was eager to start working on a subject I truly loved studying. Yet, I feared entering a field may have been devoid of passion and joy; I doubted whether I could express myself through thousands of lines of code. The encouraging and supportive team at Numina quickly quelled my fears. At the beginning of the internship, the engineering team spent time reviewing the exciting tech stack in detail. After the thorough introduction, the team presented a long list of suggestions for intern projects which covered all parts of the stack, including computer vision, front-end, back-end, data visualization, and more.
My Project Background
Numina has two existing web tools. The first is a web dashboard for customers to view and interact with Numina’s sensor data. The second is an internal admin panel that Numina employees use to update and modify sensor information and user accounts. At the time, Numina’s account creation process consisted of having an engineer manually creating a user account through the admin panel with a random password. They would then send that password through a onetimesecret link. Users could not change their password nor could they recover a password. If a user forgot a password, an engineer would delete their account and go through the entire account creation process again.
The project that I ultimately decided to work on would automate this process by sending automated transactional emails through the backend, allowing users to set their passwords upon account creation and reset their passwords should they forget or want to change them. As a result, engineers would not have to spend time manually dealing with the account management and the user experience would be drastically improved.
Methodology
The project encompassed three goals:
- Send users an email when we create an account for them in the admin panel
- Allow users to independently set their password upon account creation on the dashboard
- Allow users to “reset” their password (i.e. “Forgot password?”) on the dashboard
First, I started work on the back-end functionality necessary to achieve these goals.
Sending an email
I spent time looking at APIs and services that would allow me to send an email. This led me to several popular solutions, including MailChimp, Mailgun, Sendgrid, and Amazon’s Simple Email Service (SES). I eventually decided on SES because it was simple to integrate into our existing AWS stack and was the most affordable.
Creating a User
To automate creating a user, I had to modify our existing mutation for creating a user and use SES to send a welcome email on creation. This email would include a link to a reset password page on the dashboard where the users could initially set their password.
Kicking off the Reset Password process
Our GraphQL APIbackend, numina-graph, runs on a Python + Flask framework that pulls data from Postgres and Influx databases. To allow the users to reset their passwords, I wrote a mutation that would send an email through SES and then store an account id in a DynamoDB (AWS’s NoSQL) database; we can then link their account id with a unique token denoting that they requested a password reset. The email sent to the user includes a link, embedded with the unique token, to a reset password page on the dashboard.
Reset Password
Next was creating a page for resetting a password, which would take in a new password, confirm password inputs, and then call the reset password mutation to check DynamoDB before resetting their password in the database.
Reset Password Mutation
To reset a password, I had to create another mutation which checks the DynamoDB database for that user and see if their request was valid. A password reset request is valid if the user passes in a valid token that has not expired. If the request was valid, the mutation would change their password in the database to the new password.
Forgot password
I created a forgot password page using React.js where users could request a password reset and it would send a password reset email to them. This page would kick off the password reset process again, as described above. The password email sent to the user would then lead them to the Reset Password, also described above.
MailChimp
Numina had already been using MailChimp to collect and send emails. I decided it would be very useful to also add users to our existing MailChimp list. To accomplish this, I used a python MailChimp API that would add a user’s email and company names to our MailChimp list upon user creation.
Conclusion
Working at a small start-up like Numina has been invaluable for an inexperienced first-year student. Instead of working on a single micro-service at a larger company, my first project, which seemed like low-hanging fruit, became a multi-week project that allowed me to work full-stack. In my subsequent projects, I got to work with React Native mobile development and customer-facing data visualization on the dashboard.
I want to wrap up by thanking a couple of individuals who went out of their way to support me this summer. Ilan, thank you for taking time out of CTO-ing to answer my questions, review my messy PRs, and making me feel like part of the team. Meghan, thank you for putting so much work into sketching, reviewing, and tweaking my front-end components. Design was my weakest skill coming into this internship but you still were willing to provide resources and push me to get something perfect and functional. I would still be creating websites with off-center logos without you. Lastly, I want to thank Pranav. First, my code quality has improved immensely because of how meticulous you were with code reviews. Second, when I felt lost even with topics that were not directly related to your expertise, you found no issue putting your work aside and immediately providing guidance and pair programming. Third, you were not just a great mentor for me but to all the other interns, too.
Thank you, Numina for providing me with an unforgettable summer that included: my first stack overflow post, egregious amounts of food truck dining, awesome and insightful company meetings, my wettest handshake, and working with an awesome team.
Numina empowers cities with data to become more responsive and more equitable. With a privacy-first approach, we develop technology that measures all kinds of activity in streets and provides intelligence without surveillance.