Software Engineering Internship I

I didn't realize that I had not written anything about my other internship experiences. In my first blog, I talked about my experience as a first-time intern at a startup. I touched briefly about the work but didn't really delve deep since I wasn't sure at the time if I could disclose it. However, since then, I've managed to have 2 additional internships as a software engineer at 2 different startups. So, I'll talk about those two instead.

So, the first time I interned as a software engineer was at a YC-backed startup. Actually, it's the same startup as my first internship. The difference is I'm now working in the "main" company, if you will. The recruitment process (if any) was simple. Because I had already known the team (and they knew me), I didn't have to do any interviews whatsoever. They told me that they saw "passion" or "drive" inside of me and that they were confident enough to onboard me without interviews.

Which, at the time, really frightened me because I have a terrible case of imposter syndrome. Typically, you would need to do some data structures and algorithm (DSA) sort of problems. Actually, I wasn't comfortable with that subject at the time (despite being a teaching assistant for DSA).

Anyway, I was hired, and on the first day, they had already put me to good work. As always, I probably couldn't disclose much of what I worked on and with whom, but I can tell you that It's definitely grueling. As an intern, I didn't expect to work a full 40 hours/week, let alone 50. There must have been some weeks where I spent all day (16 hours) just coding. Not to mention the weekends I sacrificed to complete a project before Monday. This isn't to say that I didn't enjoy it. On the contrary, I loved it!

It's exactly what I imagine interning at a startup to be like. And since I was on vacation at the time, I could dedicate 100% of my time to working. I didn't have to worry about homework or assignments.

The stack that we used was Django for the backend. I told them that I was most comfortable working on BE, so that's where they put me. I already had some experience with Django in a university project, but it's nowhere near this level of sophistication. So, I spent about an entire day just looking at the codebase and seeing the patterns. In fact, that's what I did for most of my tasks. I would look in the codebase if there's a similar problem and go from there. I think this is how most people learn to code (?)

Throughout the internship, I managed to work on a CV generator, sitemap generator, and also executed data analytics requests from the other teams using SQL. But I'm only going to be talking about the first two projects since the data analytics one is basically just me writing SQL.

For the CV generator, it's basically a way for users to automatically create a beautiful CV based on their inputted data. Under the hood, it works by defining an HTML of the CV template. We then use Django templates to insert the data dynamically into that HTML template. This process is simple. An if statement there, for loop here and there for multiple sections, and voila! After that, you can use a library to process the HTML into a PDF. There are limitations to this approach, such as you can't predict where the page will overflow to the next page. Hence, if we use a template that does not have gaps at the top, it might look weird for the 2nd, 3rd, and other pages. To understand what I'm talking about, open your profile on LinkedIn and click on More > Save to PDF. You'll notice that on that PDF, there's a gap at the top of the page. You might think that it's to make the CV look nicer. But I have my suspicions that it might be because it's impossible to detect when the text will overflow! If it turns out I was wrong, then please let me know. I'm genuinely curious since I spent a lot of time trying to solve this problem to no avail.

For the sitemap project, I was tasked to make the startup's pages more SEO-friendly. The way to do this is to provide Google's crawler (aptly named Googlebot) with a sitemap. A sitemap contains all of your website's pages. For example, website.com/1, website.com/2, you get the idea. The problem is this: How can we automatically add every page created by our users to our sitemap? Sounds simple, but you have to keep in mind that users can delete and edit their posts. So, we also have to take into account posts that no longer exist or are modified and update them in the sitemap. The algorithm I created was complicated. The simple explanation is that every day, a script will run to check posts that have not yet been indexed and put that into the sitemap. And then we will also check posts that have some sort of isEdited or isDeleted flag in the database and then update the sitemap accordingly. Every time we index a post, we add the isIndexed flag so we don't index them twice. What's interesting about this project is that I actually took my time designing the algorithm by taking a piece of paper and illustrating it. It made perfect sense in my head, and my mentors seemed to agree with this approach. Oh yeah, I forgot to mention to run the script daily; we set up a cron job on AWS. It was the first time I had done something of value on AWS :)

Example of a sitemap. Source: Semrush
Example of a sitemap. Source: Semrush

A typical day is as follows. I would wake up at 9 or 10 (I forgot), about 10 minutes before standup, and spend 30 minutes there. This is where we report what we had worked on the previous day and what we will be working on today. After that, I normally have breakfast and go straight back to work. If I'm lucky, I have a couple meetings throughout the day, so I can take a break from coding.

Every two weeks, we will have a retrospective that outlines how we have worked over the past two weeks and what could be improved. I like this idea. It's like taking a step back and acknowledging our flaws. The only problem is, as humans have a hard time changing habits, we often don't solve the issues outlined in the retrospective.

In any case, it was.. rewarding. I felt like I had truly made an impact on the company. In fact, I literally do have an impact. I can't disclose much, but my code is literally in production right now, and the feature I created is probably being used by thousands of people!

The internship lasted for 3 months. I didn't want to extend it since I felt like I had learned so much already at the same company and needed to move on. Plus, since the semester was starting soon, I didn't have much confidence that I could balance academia and work at the same time (this turned out to be a lie, and I went on to do another internship instead).

And so I parted ways. I enjoyed my time there. It was truly an honor to be working with such cool engineers, PMs, and founders.