Let me start with a brief introduction. I am Arnab Sen, currently, a final year undergraduate at IIEST Shibpur pursuing my B.Tech in Computer Science. And in this article, I will share my 3 years of experience as an undergrad exploring various technologies. It includes:
- What technologies have I learned? When? Why? How? resources that I referred to.
- My journey from CP → CTF → Open Source → Google Intern
- The various communities I am currently a part of. And many more…
Before Joining College
As a kid, I have always been into computers. I would always tinker with the PC that I got in my 5th standard. And when I say “tinker”, I mean breaking stuff by installing pirated games that had a lot of viruses and you know what I mean 🤷♂️.
So, every month or so my dad had to call this Tech guy who would then format my PC and install a pirated Windows 7 and charge my dad 500 Rs. At one point, I got pretty frustrated because my dad would restrict my PC usage and at the same time felt a bit sad that he has to pay 500 Rs every time for my misdeeds (to a kid 500 was a lot of money). That’s when I came across Linux for the first time.
I remember installing Ubuntu 14 by myself and I felt like I am going to become the next Bill Gates. On the first try, I wiped the entire hard disk :) so it was after a bunch of tries that I was able to successfully install it. And this kind of sparked my interest in computers and I took CS as my stream in College.
By this time I had very basic knowledge about C++ since we had it on our CBSE Boards. And the first thing that I was exposed to was Competitive Coding. I practiced my Data Structures and Algorithms from:
- MIT 6.006 Introduction To Algorithms .
- CLRS (The Bible of Algorithms and Data Structures) and its solutions .
For problem-solving I used to refer to:
My main motive at that time was to prepare for ICPC and improve my general coding skills and my knowledge of C++.
By the end of the 1st year, I became pretty good at CP and even reached Experts in Codeforces . But I started losing interest in this field, cause they were mainly about solving abstract problems. I wanted to tackle some real-world problems and came across Cybersecurity.
This is when COVID happened, I had a lot of free time to explore. With my interest in CP declining, I wanted to know more about computer internals and it’s fundamental workings. So I started solving CTF Challenges.
Since not many people may know about this, let me explain CTFs. CTF stands for Capture The Flag. You will be given a security challenge, it can be an encrypted text or a vulnerable website. You have to bypass the security or decrypt the ciphertext to get a token which is called the flag. Finding the flag wins some points and finally, the team/individual with the most points wins. This category of CTF is called Jeopardy style.
There is another style of CTF called Attack-N-Defense. Here we have two teams one Red team and another Blue team. The Red team’s job is to break into a machine/system by finding loopholes and security flaws, while the Blue team’s job is to fix those loopholes and patch those vulnerabilities before the Red team is able to enter into the system.
The reason these CTF challenges intrigued me was that they are based on more real-life scenarios. To solve CTF challenges I had to learn:
- Assembly Language
- Binary Exploitation
- Web Vulnerabilities like CSRF, XSS, SQL Injection
- Cryptography like RSA, Symmetric and Asymmetric key encryption
- Computer Networking dealing with network packet capture
- Steganography, learning how PNGs work, how zip compression works, etc
- Writing scripts in bash, python, C .etc and many more
My knowledge about computer fundamentals grew and I learned how to use tools like gdb, tcpdump, burpsuite, etc.
With rigorous practice and participating in a bunch of CTF challenges my team (which included me and my friend) ranked 67th in CTFTime in India.
There are no one-place resources for CTFs cause it is a huge domain. To even understand the vulnerabilities of a particular technology you have to be proficient in that technology first. For example, to understand the weakness of RSA, one needs to know how RSA works and what is the significance of exponent (e) and the primes (p and q).
But these are some of the youtube channels I followed:
But the best way to learn is to participate in the CTF challenges and then read the writeups or have discussions with other teams after the CTF is over.
By the end of 2nd year, I got into a fellowship program called Pupilfirst Coronasafe Fellowship . I was in the top 24 out of 50k applicants. So, for the rest of the 2nd year, I was learning technologies like Ruby on Rails, and Rescript React and started my open source journey. As a Pupilfirst Coronasafe Fellow I contributed to two open source health care projects called Arike and Life . Through this experience I learned about:
- Building and designing software, the workflow of the applications, and understanding the user experience
- Pair programming, which is a really cool way to learn and work. Read more .
- The importance of networking and having 1:1s with industry experts
- Open-source best practices
This is when my internship prep started. I got rejected by Microsoft for both Engage program and the on-campus drive. It was a bit disheartening.
But then I came across Summer of Bitcoin . It was an open-source opportunity and since I knew open-source won’t dishearten me I applied. And guess what? I got selected. I was among the 51 mentees for the first ever batch of Summer of Bitcoin. My project was to improve support for User Statically Defined Tracing (USDT) in Bitcoin core by adding new tracepoints and scripts, leveraging eBPF (extended Berkeley Packet Filter) technology. But what’s more interesting is that during this mentorship, I had to work with:
- C++ (which I did in my 1st year for CP)
- gdb for debugging (which I did during my 2nd year for CTFs)
- Github and Open Source practices (which I gained from the coronasafe fellowship experience)
My point is you might not see a direct advantage of what you are learning right now, but knowledge never goes to waste.
There is this very popular story of Steve Jobs. Jobs took a calligraphy class at Reed College based on campus posters he saw after dropping out. He knew the class would earn him no credit towards a degree but he still did it anyway. This knowledge of calligraphy, later on, inspired Jobs during his Apple days to include multiple typefaces in Macintosh.
“If I had never dropped in on that single course in college, the Mac would have never had multiple typefaces or proportionally spaced fonts. And since Windows just copied the Mac, it’s likely that no personal computer would have them.” ~ Steve Jobs
The takeaway is to be curious and keep learning.
I have shared my Summer of Bitcoin journey in detail in my other blog here .
A couple of days later, I saw there was an opening at Google for SWE Internship. I asked my senior to refer me and I applied. After a week I got a mail saying that I have 10 days before my interviews. So, I just got back into interview prep. I mostly referred to these resources:
- Leetcode and Leetcode discuss
- MIT Lectures
- Gave a bunch of mock interviews at pramp .
I am not a big fan of practicing from different resources and platforms. I like to keep things simple 😇
Both of my Google interviews went really well, and after a long wait of 2 months I heard back that I got the internship. I was on cloud nine because at that point I was starting to get a bit depressed about having no internships even after working really hard.
My first corporate internship
Luckily, I got a really interesting and impactful project. It had to be built from scratch. So, a lot of time was spent writing design docs, making sequence diagrams, brainstorming the component workflows, and designing models. I worked for Google Ads.
The main codebase was in Java and at Google, we have a lot of private frameworks and technologies for internal usage. But some of my key learnings were:
- Communication is the key. It doesn’t matter if you have a solution in your head if you can’t explain it to the other person.
- Reach out for doubts. No one knows everything, so don’t shy away from asking doubts. But while asking doubts make sure you have researched properly, provide enough information regarding the doubts, your thought process, your approaches, etc.
- Always keep your manager/host updated about your work.
- Meet new people, ask them about their project, their work what they like the most, etc. Getting insights from people who are more experienced than you helps a lot in gaining a new perspective which is really important as a fresher. The more you network the more you grow. At Google, we have this Lunch Ninja where we are paired with a random Googler to have a 1:1 discussion. I met so many amazing people that way, people from different roles like DevRel, SRE, UI/UX Designer, etc.
- Writing high-quality code. In most of our personal projects, we don’t care much about the code quality, but in industry, it’s the code that is readable and is working that get’s merged. So writing code that follows the readability standards and the style guides was a big takeaway.
I also wanted to add, that after successful completion of my 10-week internship, I even got a pre-placement offer from Google and will be joining them next year 😊.
Finallyyy 😭😭— Arnab Sen (arnabsen.dev) (@ArnabSen1729) July 25, 2022
Got the PPO 🙏
As you might have seen I have tried out different stuff throughout my college days and still doing. I have also participated in hackathons, kept sessions at our GDSC, and facilitated campaigns. I love sharing my knowledge through blogs.
My approach remains the same for everything, “no matter what you are doing, give your best and try to go the extra mile”.
Feel free to connect with me at any of my social handles. You can find them in the footer of my blog.