Photo by charlesdeluvio on Unsplash
My 1st Month at Nodeflux
From the lead up, to the induction week, to the technical journey
The Lead Up
"The time has come", I thought as I get closer to the end of my 5th semester.
I had been keeping an eye on one of Indonesia's Ministry of Education program since several semesters before. Kampus Merdeka, where students all around Indonesia get to fight for a position in several subprograms, two of which are the most popular: internship program and independent study program. And the time has finally come, I just cannot pass such opportunity.
My strategy was, I'm gonna apply for both of the two most popular programs but with more emphasis on the internship program. That means, if I got accepted on both programs, I will take the internship program instead of the independent study program. The reasoning was because I think the internship program guarantees more exposure to the industry as it will give me actual working experience, it guarantees more exposure to established company cultures and processes, as well as presents higher chance for me of getting to meet mentors with good experience in the industry. More over, the industry partners were awesome companies.
Getting Accepted
Around the end of January 2022, it was announced on Kampus Merdeka's website that I got accepted as a Software Engineer Intern at Nodeflux!
The interview for Software Engineer Intern at Nodeflux consists of a take-home assignment and a user interview. As for the assignment, we applicants are tasked to build a COVID-19 API using one of three programming languages: C++, Rust, and Python.
I decided to go with Rust. Because of the following reasons:
Basically it was a trade-off between the certainty of getting it done in time and the certainty of standing out from the crowd, and Rust suits my interest best.
Even though I did got around a week (6 days) to complete the assignment, I only start working on it on the 3rd day, so there's a lot more pressure there. That leads me to spend those days working on it till midnights haha. But I guess it was worth it because during the interview my interviewer told me that I was the only applicant who built their assignment using Rust :)
To be honest, after going through several interviews with several companies, I got this somewhat pessimistic feeling about getting accepted for the internship program because things didn't go as well as I expected it to be. But it turns out I got accepted as a software engineer intern at Nodeflux. Thank God and all of those who supports me so that I can get this precious chance.
In the Beginning, There was an Induction Week
The internship began on February 14th, the very first week was a period of induction for all the new interns, from General Affair, AI Engineers, Product Managers, Project Manager, Software Engineers, Legal, Business Affair, and several other positions.
The induction events were conducted via Zoom Meetings. Through these events, we get to know a little bit more about everyone, about Nodeflux, their products, their market, their work culture, and their vision as a company.
During our induction week, we were tasked to prepare several things, two of them was: a chant for our function (Software Engineer) or "yel-yel" as we call it in Bahasa Indonesia, and a way to creatively introduce our mentor to everyone in the Zoom room. We were expected to present them on the last day of the induction week.
With that in mind, near the end of the first week I and Hidayat initiated a small meeting with our mentor to reintroduce ourselves, to discuss about our chant, and to interview our mentor about some personal matters in order to get to know him more so that we can come up with a way to introduce him creatively during the mentor introduction session.
Or so we thought... we ended up using the meeting to discuss what we'll be doing during the internship instead of actually getting to know more about our mentor and discussing a chant for our function.
In the middle of our meeting, our mentor asks us what kind of task we would like to do, he proposes two kinds of tasks: software engineering tasks and a-bit-AI-related tasks. I chose the software engineering tasks, simply because I'm more into software engineering and AI is still kind of a like a magic box to me which I still can't demystify.
And as for the function chant, we came up with it in less than 10 minutes after the meeting, with only about 38 seconds in duration.
But despite that, lo and behold, by wonders and miracles and signs, we won the function chant contest by vote on the last day of the induction week.
Lol, I seriously don't understand on what basis these guys choses our chant as the best one ๐
Let the Workdays Start
With the induction week past ourselves, we interns are finally ready to start working on our role. My first task as a Software Engineer Intern is to familiarize myself with Nodeflux's products. I was instructed to learn more about VisionAIre and IdentifAI.
After getting the instruction I immediately started reading the docs, trying the products, exploring the platform, and browsing through the APIs. I also get a glimpse about the architecture, the API design, how the integration with external partner works technically, the tools used, and the SDKs that are provided by Nodeflux.
During this first real week, I get to make some small contributions. One of them was just pointing out some small mistakes on the platform, it was just outdated links though. The other one was making rather small improvements on VisionAIre Cloud's Postman collection. I'm truly grateful I had the opportunity to contribute to Nodeflux immediately.
After I was done going through the docs and the Postman collections, on the 4th day I decided to hit the "it's enough for now" button as I was feeling familiar enough with the products for the current needs.
Time to seek new challenge.
Let the Technical Tasks Start
At the very end of my very first very next 1-on-1 session with my mentor, I asked him for a new task, which then he instructs me to learn more about NVIDIA's Video Codec SDK and NVIDIA's DeepStream SDK. Basically I was tasked to familiarize myself with hardware accelerated video encoding and decoding. I never worked with video processing before and definitely no experience with NVIDIA tools either, but I just couldn't refuse an interesting challenge, so I take on the task.
Several days later he added on the task, saying I also need to benchmark the performance of these tools against several of its non-hardware accelerated alternatives.
DeepStream
Given that I have two tools I needed to learn, I decided to start with DeepStream first for no particular reason. I just jumped into their documentation, started reading things, then start setting things up.
It was not smooth though. Given that my personal computer doesn't have an NVIDIA GPU, I had to install DeepStream on a server. And because NVIDIA decided they needed to put some of their SDKs behind an authentication wall, I also had to setup the VM to be accessible via remote desktop protocol so that I can open a web browser and download the tools I need directly to the server's disk.
With that out of the way, setting up DeepStream itself is not a walk in the park either. I had to recreate VM many times because my CUDA Toolkit installation would break one time and I didn't know which part needs to be fixed, another time I couldn't get the sample apps running because of an error that I had no idea of the cause, another time the sample apps can run but not the way I expected it to be so I thought the sample apps can't run properly because there's something wrong with my installation process so I decided to start again from the beginning, and all sorts of similar problems. In short, it was frustrating and tedious.
I learned and tinker around with it for around a workweek and a half but still couldn't get the sample apps running properly still. With that in mind and the fact that DeepStream also uses Video Codec SDK, I decided to switch to Video Codec SDK because I thought I would waste my time if I keep tinkering around with DeepStream this way. My mentor approves this.
Video Codec SDK
Setting up Video Codec SDK is not as frustrating and tedious as setting up DeepStream. I just need to download the thing and it's all good.
The next step is to actually do a quick check by running the sample projects included with the SDK. This however, is not so straightforward.
Given that C & C++ lacks official package manager, if I'm gonna build any C/C++ projects that have external dependencies, I need to tediously installs the dependencies by myself first because for all I know most C/C++ projects use CMake as their build system, which does not act as a package manager.
Basically I need to get the dependency from the distro's package manager or other sources, or if I'm really not lucky I might even need to build the dependency from source, which is not a pleasing experience, then I need to locate the files that needed to be put to environment variables, and then build the project while crossing my fingers hard. Combine that with the fact that each Linux distros have their own way of doing things and where to put things and I think one will see why this is tedious.
In short, it was harder and involves more uncertainty (probably because of my lack of familiarity with C/C++ though) than getting a JavaScript project up and running where I can just do npm install
and look at the package.json
to see what scripts are available.
I did experience a little stuck when building the sample project. After setting things up, the build just keeps failing, it was because one of the sample projects depends on Vulkan. I installed Vulkan, then run the build again, turns out it also needs four environment variables in which three of them I have no idea where to point them to.
After tinkering around with it and digging through Google and NVIDIA's forum, I still couldn't find any clue, which leads me to yank out a line from the CMake file to exclude that particular sample project from the build process to save me some time because it's already more than halfway through the month and I wanted to get something done by the end of the month.
I run the build again, and voila... the sample projects are running and I get a glimpse of how things work as well as how the code look like.
VPF
So now Video Codec SDK is usable, but there's one more problem: I'm not quite familiar with C/C++ and their ecosystems. This means that it's hard for me to produce something viable enough in a workweek or two, because I also need to learn the language and the nuances as well as the complexities that come with it aside of learning how to use the tool itself and several other tools which I need to compare the performance of.
Luckily NVIDIA provided a Python binding for Video Codec SDK, which they call VideoProcessingFramework or VPF for short. This eases me off quite a bit because Python is rather straightforward compared to C & C++, thus it's very suitable for building prototypes (or just toy projects) in a short amount of time. After scratching around and learning how to use the framework, I immediately started working on the benchmarking program.
My mentor asked me to benchmark this tool against PyAV and OpenCV in video decoding operations. He also tasks me to collect several metrics, namely: frame processing time, CPU utilization, RAM utilization, GPU utilization, and GPU memory utilization.
I worked on it for about a bit more than a workweek, doing continuous improvements feature-wise as well as code quality-wise.
In the last day of the first month I feel that my work is mostly done and decided to setup a meet with my mentor to discuss about it. He gave several improvement ideas, which were: do process-based measurement instead of measuring the system's state as it is at that time, generate the report in markdown, plot the metrics, dump the records into CSV files, and measure percentiles and standard deviation for each metrics.
I spent the next week working on them and thankfully got it done by the end of the workweek.
So, How was it?
I'm grateful that I can join Nodeflux as a software engineer intern and meet amazing people which I can learn from. The culture is nice and humble, everybody can just contact everybody else, we can freely ask questions as well as share our problems, interests, projects, and progresses.
I even get to start getting into investment because of my mentor
From the technical perspective, I'm glad that this first month experience has exposes me more to several tools such as Azure, NVIDIA tools, Python, Docker, and C++ as well as its ecosystem.
I always have this lingering interest in system programming and lower level languages such as C and C++ but I always thought I better spend my time sticking to languages with larger job market in Indonesia. Which is why it's interesting when I get the chance to expose myself more to these languages and meet people with similar interest without worrying if my time is better spent on other things. What's more relieving is that my mentor actually cares about what I wanted to do and try to give me tasks that aligns with my interest.
But of course, it doesn't come without challenges. In this first month the challenge mostly involves my lack of familiarity with C & C++. Because for someone like me who is so used to code in JavaScript/TypeScript with their ease of use, combined with the benefits that npm/Yarn brings, any non-trivial C/C++ project is quite a headache to deal with. From building the project, to managing dependencies, to understanding the code, all of them are relatively hard compared to JavaScript and can potentially cause me a crippling depression (lol, no).
But nevertheless, I'm pretty interested to see what comes next, given that we interns will start working on a brand new project soon.