A.A
Welcome to this useless blog post where I'll be sharing my personal journey as a third-year computer science student. In this post, I'll be discussing various aspects of my experience, including online courses, programming competitions, career exploration, volunteering, and my plans for the next few months. If you're looking for an entertaining waste of time, you've come to the right place!
I hope you have a nice and interesting reading time.
PermalinkOnline Courses
When I was a freshman, I was shocked by how fucked up my university is: the courses are useless and do not cover enough topics, the instructors are shitheads who understand so little about the material, and the students around me are stupid and lazy. Since then, I set a quest for myself to find alternatives to university courses and make friends with smart people so that I don't get spoiled by those lazy idiots around me.
Fast forward to the future and I've been studying online courses from top educational institutes and instructors for 2-3 years. Here's a summary of what I studied:
Harvard's CS50: I didn't know back then that there are labs and problems to do but it's okay since I was already good at programming.
Helwan University's MA112 - Discrete Mathematics I: An instructor is perfect if and only if that instructor is Dr. Waleed A. Yousef. With a clear voice, a serious look, well-prepared slides, and a nerdy Linux setup, he steps up to present this masterpiece of a course in a way that's beginner-friendly and in-depth at the same time. After I took the course, I read most of Kenneth Rosen's Discrete Mathematics and its applications as a follow-up to Dr. Waleed's lectures.
MIT's Mathematics for Computer Science: I just skimmed through the material in this course. I didn't take it seriously.
Grokking Algorithms: An Illustrated Guide for Programmers and Other Curious People I already had some knowledge about algorithms from programming competitions so it was an easy read for me. Actually, it is an easy read for anyone xD
Tried to read Introduction to Algorithms but failed miserably because I couldn't keep up with its strong rigorous language. Also, it was too theoretical and I needed something more interactive and practical.
Algorithms 4th edition (AKA the red book) by Robert Sedgewick and Kevin Wayne: this one was awesome and way more useful than any other algorithms resource I've tried. They also have a great course that has an almost one-to-one correspondence with the book. Note that the course contains fun and interactive projects that are not included in the book.
Read Object-Oriented Thought Process: didn't gain much out of it back then, but I will probably give it another shot soon.
Read the first six chapters of Computer Systems: A Programmer's Perspective: That was my first step into the world of systems after having a long journey in theory. This book is unique because it explains most computer architecture concepts with programmers as the target audience, not hardware engineers. I only read the first six chapters because I thought the rest of the book will be covered in future courses (operating systems and networks). I also watched 12 videos out of these lectures by the same people who wrote the book.
University of Wisconsin's Introduction to Operating Systems (AKA operating systems: three easy pieces): I already have a draft blog post that is only dedicated to this course and how effective and useful it is. It's a practical course whose topics include CPU and memory virtualization, Scheduling algorithms, processes, threads, concurrency, locks, semaphores, storage technologies, and file systems. Just like CS:APP, this course is based on a book that was written by the same instructor, Remzi Arpaci-Dusseau.
CMU's Introduction to Database Systems (DJ Mosho's music playing in the background): This is a project-based course that teaches you about the internals of database management systems. It covers various topics and techniques including database storage techniques, buffer pools, indexes, B+ trees, join algorithms, query execution & optimization, concurrency control protocols, ACID, logging, recovery, and distributed databases. Being done in C++, the projects of this course are a bit hard but so fun to do.
Q: Was it worth it? Yes, it was well worth the effort. The amount of knowledge I gained from this journey is massive and I can't imagine myself missing out on all of that.
Q: Where do you find these courses? Most of these courses can be found in the OSSU and Teach Yourself CS curriculum.
Q: Isn't it hard to go through all of that by yourself? Technically, I was not all by myself. I had great help from other great students and engineers who provided support and guidance most of the time. A good place to find such helpful and hard-working people is Active Courses discord server, which I think is one of the best communities out there for CS students and self-taught programmers --- Why does this sound like an advertisement when it's not? xD
PermalinkProgramming Competitions
I've allocated a great percentage of my time up until now to programming competitions (ACM ICPC). I initially started doing it because it was so much fun. Cooperating as a team to solve an algorithmic problem in a highly competitive environment is a mentally pleasing idea. Later, I found out that it also has some positive side effects on me, like improving my programming skills, making friends with some amazing guys at my university, and building enough knowledge to ace coding interviews.
PermalinkRound 1
My first-ever ACM competition was Menofia University's Qualification Contest in 2020. As a freshman, I was the youngest competitive programmer in the community back then. I participated with Mostafa and Maram under the name "Coding Squad". Unfortunately, we weren't lucky enough to qualify, but honestly, I never thought we would make it anyway. That's because there was a significant skill gap between us and the teams that qualified. Despite that, I wasn't sad at all. Instead, I was so happy that I got the chance to compete in one of the oldest and most prestigious programming competitions in the world, which motivated me to try again the next year.
Round 2
It's 2021, and this time I joined a much stronger team consisting of me, Eid, and Belal, and we named ourselves "Aliens." I was over the moon when we ranked first in Menofia University's qualification contest and qualified to participate in the Egyptian Collegiate Programming Contest (ECPC). I was so happy that I could see my efforts finally pay off, and that I had a great impact in that achievement. In the ECPC, we didn't do well, but we were able to at least qualify for the next stage of the competition: The Africa and Arab Collegiate Programming Contest (ACPC). It didn't go well in the ACPC, and we were so far away from qualifying for the world finals.
Round 3
The year 2022 was not that different from 2021 regarding the competition. I participated with the same team and qualified for the ACPC, but couldn't make it to the world finals.
Round 4
This year, Belal decided not to participate, as he wanted to live peacefully until graduation. So, Eid and I brought Taha to our team. What will happen this season? I have no idea, but I'll try my best not to fail my teammates, and I hope I can live up to their expectations. To be continued...
Q: How do you manage your time to do all of these things? I don't know how to manage my time. I simply don't attend university classes and that's why I have so much time to do anything.
Career
When I was a freshman, I made my first resume and started applying to internships and jobs. It goes without saying that my resume back then was an absolute piece of trash that didn't have any useful content whatsoever. To be precise, it was a piece of decorated trash because it had some weird colors and layout that made me look like a clown xD
Round 1
In my first year in college, I didn't know much about jobs or internships. I was just applying blindly to every position I stumble upon on Facebook or LinkedIn. My resume at that time only contained a mediocre discrete math project alongside some other high school projects and a bullet point that says I participated in Menofia University's Qualification Contest 2020. As expected, I didn't get a single online assessment or an interview. That's when I read a blog post by the inspirational Hassan El Desouky talking about a program called Google Summer of Code. The rest was history :)
I literally gave my heart and soul to apply to Google Summer of Code (GSoC): I was spending more than 6 hours a day for a whole month just to fully explore the program and increase my chances of getting accepted. Despite spending that much time, I never actually thought I would get accepted into such a competitive program. I was so insecure to the point that I never thought such a good thing would ever happen to me. When I talked to my father, he told me that he is almost certain I will get accepted because he never saw me dedicate that much time to anything. Little did I know, he was right and I got accepted. I gained a massive amount of self-confidence and I was like: "Well, turns out I'm not that bad after all". Throughout the summer of 2021, I worked on a plugin for Joplin as part of GSoC and earned my first salary as a software engineer.
Round 2
In 2022, I improved my resume by including my participation in GSoC and the ACPC and removing the unnecessary colors and layout. Despite having GSoC on my resume, I did not receive any interviews for the second year in a row. However, later that year, a friend helped me secure an interview at Bld.ai, a US-based software company. After three successful interviews, I was hired and worked there for 3-4 months before leaving due to the company's poor condition.
Round 3
In 2023, I faced a series of rejections from top tech companies. Despite having a referral, I was rejected by Google. I also got a rejection from Facebook and, after completing an online assessment, from Twitter as well. After that, I did two problem-solving interviews with Bloomberg before getting rejected. Eventually, I decided to apply again to my beloved Google Summer of Code. But before I got the chance to do so, I discovered 40grid, a very small product-based startup in the US. After two successful interviews, I landed a job and have been working there for two months. While my job title may have changed from "idiot" to "idiot software engineer," at least now I'm getting paid to be an idiot.
Volunteering
I always liked the idea of sharing my knowledge and helping others. It seems natural to me that everyone has the right to know what I know. Everyone should have the same chances I have. Everyone should be able to do what I can do. With that in mind, I engaged in various student activities, clubs, events, and workshops all in order to spread my knowledge and give a hand to my fellow students.
I never considered myself a good instructor because I unintentionally stop a lot while speaking about anything. That was the case until I was tasked to explain some basic competitive programming concepts to a small group of people. During the session, they were silent most of the time and didn't interact with me as I hoped. After I finished, I apologized to them for wasting time thinking that it was a bad experience. However, surprisingly, their feedback was positive and they told me I have a good flow and beginner-friendly language. I said to myself for the second time, "Well, turns out I'm not that bad after all". From that point onward, over the course of two years, I recorded more than 56 hours worth of content in about 35 sessions spanning diverse topics, including data structures, graph theory, dynamic programming, GSoC, internships, operating systems, and computer science in general. I've been regularly posting most of them on my Google Drive until it was almost out of storage, at which point I began uploading to Youtube. Awesome, right?
Yet, I'm convinced that my greatest and most valuable contribution so far is "Why Google Summer of Code is a golden opportunity". It's an article I wrote in 2022 to be a step-by-step guide for anyone who wants to apply to Google Summer of Code. I consider writing that article as the most impactful thing I did till now due to several reasons:
According to Hashnode statistics, it was viewed by ~4.2K unique visitors since Mar 28, 2022, the day it was published. Who thought that I can write a piece of content that gets viewed by 4K people around the world?
I could see the impact of that article in my own circle. Suddenly, everyone became interested in GSoC and wants to apply to it. At some point, it was normal for me to get messages from at least 5 people a day wanting some help in the application process of the program. Over a month, I reviewed around 20 proposals and was constantly guiding 10-15 people to apply.
Ironically, I became known as "the guy who wrote the GSoC article".
I'm really happy that I could be useful to other people and that I'm trying my best to make sure everyone knows what I know, everyone has the same chances I have, and everyone can do what I can do. You might be wondering, "What's the point of doing all of that?" Honestly, I don't have a clear answer yet. Perhaps it's because I love it when people thank me and make dua for me after I help them. Maybe I'm trying to indirectly pay the debt I owe to Ahmed, who is one of my closest friends and the primary reason why I majored in CS in the first place. Or maybe I just seek recognition. Does it matter? I don't know.
Now what?
Phew, it was one hell of a journey with so many ups and downs. But it seems it is not over yet because I still have one extra year remaining in college. I have some kind of a plan for the upcoming 3-4 months, but it's still under development and I'm not sure whether I will be able to execute it or not. Here is my plan:
Prepare intensively for the competition: This might be the last year for me in ACM ICPC competitions, so I want it to be a proper ending. Spoiler Alert: By "proper ending," I mean qualifying for the ICPC world finals.
Stop studying new courses for the time being: I will probably come back again in September. The only two topics I want to look into are networks and distributed systems. If I have time before graduation, I will also look into compiler design.
Have another round of auditing for the courses I already studied: I will probably do the new projects that were recently included in OSTEP, as well as have an in-depth study of CS:APP. I also want to improve the query optimizer of BusTub (CMU's educational database management system) as part of the third project in the course.
Read Elegant Objects.
Learn more about Linux: It's embarrassing that I don't know much about the system I've been using for four years.
Learn more about hardware: CPUs, GPUs, disks, etc.
Save some money to buy a MacBook, because why not?
Work on some side projects: I have several things in mind such as Hefni's Qalam and the unfinished bake.
Learn more about economics.
Conclusion
That's it. Thank you for sticking around and reading my useless blog post.
I hope you are always safe and sound.