By Abhishek Sah
First, some background: I’m a final year undergraduate at the Indian Institute of Technology, Jodhpur. I’m pursuing B.Tech in Computer Science and Engineering. I started coding from my first year of graduation. Before that, I didn’t even know what programming meant. I started with C++.
Initially, it was super hard for me to grasp basic things. I started exploring web development in PHP. I gained some hands on experience by making few websites for my college to learn HTML, CSS and Bootstrap. I participated in hackathons. These were the stepping stones for me in the field of software development though they weren’t that challenging and disciplined. So to put my skills to test I started looking for Open Source contributions and internship opportunities in the software industry.
TL;DR: This post is about my Summer Internship at GO-JEK and how I was ultimately selected to work with the Engineering team. Also, in the process, what I learned in my short stint.
The big test — Getting Selected
GO-JEK visited my campus for hiring summer interns and full times in October’17. We got MCQ questions on topics ranging from Data Structure, Algorithms, Operating System, Computer Architecture, Math (Probability) and aptitude.
Next was the coding round. But this was different from any other traditional coding rounds that I had participated in.
It was called the Pair Programming Round. In this round we were given 2/3 hours to design and write code for a simple management system. We were supposed to pair with one of the members of the hiring team. In this round, candidates were judged on the basis of their ability to write good code, their explanation behind the logic used and whether they can adapt to a pair’s ideas/suggestions on the logic. For example, why are you passing this object as a value and not as a reference, and vice versa. The idea was to select developers who know what they were doing and why they were doing so. In the process, eliminate people who merely wrote code and solved questions for the sake of it.
Next was the technical interview. I must say that was my greatest experience. I was little nervous because that was my first ever interview, but my interviewers made me feel very relaxed. They asked me questions on the projects that I had done. All the question were phrased to analyse my fundamental understanding of technology and algorithms I used. Since, I designed and developed the website for my college’s Student Placement Cell, some questions were around the design of this website and what can be done ti improve it. There were some questions on Machine Learning, Natural Language Processing (project related) and Data structures. It all went well. Finally, 3 candidates were selected for the summer internship, including me. Phew. 😎
The Sweet Summer of ‘18
Bangalore is a dream come true. The weather was impeccable. The traffic, yeah, let’s not get there. We were given the best accommodation possible for those 2 months. I wasn’t expecting such amazing facilities for interns. First day of office and we were given a brand new Apple Mac-book Pro to code on for just a couple of months!
I was selected in the Data Engineering team along with two others from IIT, Ropar. In the first week we were got to understand the Data Engineering pipeline for GO-JEK. You can read more about it here. GO-JEK has an awesome culture in the software industry. You can reach out to people for help, there are talks from various teams on different challenging problems (and how they are solving them), open office culture, free food etc. which makes life way easier and better for a developer.
Our (3 interns) first target was to learn how to write good readable code with proper tests. We started learning Ruby, the code conventions, RSpec, TDD, Git, REST API etc. Code reviews were the best part at the end of the day. We were getting regular feedback from our mentors and team members on how we were performing on a daily basis. I should really thank our mentors for their level of commitment to us.
It helped us improve a lot in a very limited period of time. We could see the change in our coding styles and habits that eventually made us better at what we were doing. We learned how to reason, ask questions on what we are doing, why we are doing etc... This gave me confidence to tackle problems never seen before and search for solutions, understand it (not mere copy/paste).
Once we were on track of writing better code, we were assigned a real internship project. This was based on Data Visualization. We were going to develop a mobile app for both Android and iOS which shows statistics for all GO-JEK products and internal services. This app was going to be used by developers, designers, the marketing team, sales team, operations team, executives of GO-JEK and many more. It was… A super challenging project.
We had a lot to learn. Client and servers were to be developed in parallel. We picked React-Native for the client side and Ruby on Rails for server. The idea was simple. All the data is available in the data pipeline, we just need a server which fetches the required data and exposes it to clients asking for it. One of the clients was the React-Native app. But this is an oversimplification. Let’s take a deeper look.
Let’s say I am the user of this app and I want to see how many bookings have been made today and how many are completed. Whenever there is an event triggered (e.g. a booking created) it is logged into Kafka servers in protocol buffer format. You can read more about how it is done at GO-JEK here. To consume the raw data from kafka there are different ways (http, log, influx etc.) called Firehose sinks.
For visualization purposes we needed some aggregations because raw data doesn’t make much sense. Daggers are used only for this purpose. In simple terms, Daggers can give you aggregated data of your choice, of your format in whatever sink you want. We used influxdbsink. To consume certain forms of data, all you need to do is create a Dagger, specify the message format, aggregation window and within a minute you will be able to consume live data and use it wherever you want. Moreover daggers are created with one simple SQL query. It can’t get any much simpler.
The 3 of us worked hard to write the best code possible from our end, to design the service with the best conventions. We were switching stories from client side and server side following pair programming. Regular stand-ups, code reviews, showcases helped us stick to the requirements. Although I had a hard time testing the React-Native lifecycle methods, I learnt a lot doing that. In the last couple of weeks we deployed our server on GO-JEK artifactory. That gave us a chance to learn about Docker and Kubernetes. Yes, we learnt the basics of Dev-Ops as well.
At the end of the internship, our app was showing single stats data for all bookings happening in GO-JEK in real time. It was customizable enough to show any single stats value as well as graphical (charts) stats of any internal services or products ,and not just bookings. Overall, it was a great learning experience.
The best part of the internship was that we were free to do things as we want, design as we like, and learn by doing, and not merely following people.
GO-JEK gave me an opportunity to understand how bad things can go if not done carefully and with good practices. I realized the worth of those values in just a few months. 😊
And… At the end of it all, I guess folks liked my work. How do I know?
I was selected for a full time role.