A few months ago, COVID-19 began to take a grip on life and the UK entered full lockdown. Just as I began to lose hope of finding a tech internship this Summer, I received DEV's weekly newsletter linking to a post announcing their involvement with the MLH Fellowship:
It sparked my interest as I noticed that the Fellowship was all about open source code. Being a maintainer of another open source project, I was aware of the importance of open source contributions but never had the time or courage (after all, it is quite scary) to do it myself. This seemed like an ideal way to start!
I applied immediately.
I'm incredibly grateful to have been selected amongst almost 20,000 global applications and to have had the opportunity to meet people from around the world whilst levelling up my technical skills!
In this post, I go through:
- What is the MLH Fellowship?
- The first week!
- The Hackathons 🥳
- The main Fellowship: Webaverse
- What did I learn?
- Shoutouts 😍
The MLH Fellowship is a 12-week internship for aspiring software engineers created because of the lack of job opportunities across the world due to the pandemic.
The 3-stage application process was fairly simple:
- Written application: A form centered around your skills, interests and reasons for applying to be an MLH fellow.
- Screening interview: A 10 minute video call chatting about the information you provided earlier.
- Technical interview: Another short video call walking through some open source code you've written in the past whilst screen sharing. You can choose how you want to go through your code, but don't worry if you can't go through all of it.
If you're offered a place, congratulations! You are then placed into "Pods" of ~10 students and a full-time industry mentor to support you and help develop your skills (ranging from technical to entrepreneurial!) -- just one of the unique features of the Fellowship.
Despite it being virtual, you get plenty of opportunities to interact with your Pod and Mentor through daily meetings:
- Three ~30 minute standups to update your Pod on your progress and get help with any blockers you might be facing.
- One ~60 minute retrospective, where you highlight your "red" (bad), "yellow" (not so well) and "green" (good) areas of the week. These give you that boost of encouragement, support and appreciation you might need as everyone is there to listen and help, without judgement or blame!
- One ~60 minute show-and-tell where either a Fellow from your Pod or your mentor showcases something they've created or are passionate about. I found it really interesting to learn about my Podmates' side projects, businesses and startups!
A concern I had was how isolated I might feel working full-time and remotely for the first time, but the MLH team have worked tirelessly to plan a fun and engaging Fellowship!
In the first few days, I was introduced to my Pod and Podmates through various Zoom meetings and was added to the Fellowship Discord server, which has helped make everyone feel at home throughout the program. The server had channels for a multitude of topics to encourage fruitful discussions and if one wasn't there, the MLH team would happily add it.
We scheduled 1-on-1's with our Podmates after the first introductory Zoom meeting. These helped me feel much more comfortable about working in the Fellowship for 12 more weeks; I really recommend making use of 1-on-1's to get to know people remotely!
Personally, I love hackathons -- and for a program organised by MLH, the hackathons were no surprise.
The Fellowship had two hackathons: at the beginning (3 days) and the middle (5 days). Having attended just under 10 hackathons, these were the longest I've ever been to (most span just one weekend). I was amazed by how much more we accomplished with just a few more days, and this made them my favourite by far!
Of course, the success (we won in both! 🎉) and enjoyment of these hackathons wouldn't have been possible without my amazing teammates: Iván Ovejero and Kenneth Aladi -- the most passionate, talented, and dedicated hackathon partners I could have asked for 😍!
During both hackathons, I learnt so much. I was the main backend developer in my team, and I used AWS Amplify and AWS services (Lambdas, API Gateway, DynamoDB, CloudWatch, EC2) for the first time ever. Previously, AWS intimidated me as it seemed like a massive service that would be too difficult to jump into myself -- but knowing I had the support of my teammates and mentor, I was able to try it and came out much more confident! I also learnt more about React state management, how to make Discord bots, how to deploy to Heroku, how to use GitHub effectively, and so much more!
In the first hackathon, we came 2nd place out of over 30 global teams (~115 Fellows). We created FellowBook -- a full blown picture-based web-app to find our Fellows and a fully-featured Discord Bot named fellowbot who the Fellows came to know and love throughout the Fellowship:
My team and I didn't just stop after the first hackathon -- we kept tweaking and improving the fellowbot by adding features like randomised lists of fellows from each Pod to aid in standups.
So naturally, for the second Hackathon we reunited and redesigned FellowBook from scratch to create FellowHub. We came 1st place in the Getting Help category out of over 25 global teams! We focused on making the Fellowship as easy as possible to navigate, aiding fellows with job searches, and boosting their social/developer presence:
We even created individual portfolio pages for each Fellow to easily refer to their PRs, Issues and Standups from the Fellowship, and an Exchange Network to promote Fellows' open source projects:
We used GitHub's Primer Design System for the first time ever to create the website. I was astonished to see how much we accomplished in just a few days and how professional our site looked and behaved.
So what did I get up to in the main Fellowship?
The Webaverse is a virtual network of apps that can run anywhere in VR, powered by IPFS, Ethereum and WebXR -- there is a great focus on making it an open, decentralised experience for anyone, and uses open standards. It also aims to give you full ownership of content (avatars, wearables, worlds, objects, etc.) you create.
At first, it seemed quite daunting because I had zero experience in VR, WebXR, Service Workers, Ethereum, IPFS -- pretty much everything that this project seemed to be related to... 🙃
But the maintainer, Avaer Kazmer was incredibly patient and even did an informal 1.5 hour teaching stream (in VR 🤯) introducing my team and I to ThreeJS, WebXR and the Webaverse -- which is available on YouTube for anyone to view now:
(yes, it was as cool as it looks! 😃)
Most of my Summer was spent working on XRPackage -- the packaging system which lets you bundle many different types of content (e.g. WebXR sites, Blender 3D models, VRoid Studio avatars, glTF models) into something that can run in VR and interact with the world seamlessly.
The 'magic' of XRPackage is this: you can move content that was never intended to be used in VR into VR, without much effort at all! I found this pretty amazing -- you can develop 3D content using tools and software you're already familiar with (like Blender), and then use the web interface or CLI tool to package it up into a single file (which you can share on the decentralised IPFS network, or through Ethereum) to run in VR!
I'm really proud of what I've accomplished this Summer: over 50 pull requests ranging from UI/UX tweaks and fixing core packaging bugs, to creating 2 test suites and over 15 PRs to write the majority of the Webaverse documentation.
When we started working on the Webaverse, there was no formal documentation -- which worried us all! However, I'm thrilled to have been the core contributor to the new documentation site which involved thorough digging into and experimenting with the codebase, research into good documentation practices, and improving my technical writing skills to produce concise, user-friendly documentation that anybody can now use to get started with the Webaverse:
I setup 2 test frameworks from scratch, for the core XRPackage code and CLI tool using AVA and Puppeteer, and used GitHub Actions for the first time to setup a CI environment. I also wrote over 15 unit tests (and as a result, discovered 3 bugs/improvements in the core code which I then fixed):
We even wrote (and open-sourced) a Discord bot that allows you to interact with worlds all from your keyboard! I wrote half of the bot's commands.
The most important lesson I learnt from the Fellowship is how to work remotely with people. It's not easy! I was used to working in person at my last job where I could chat to my team about a problem by pointing at the screen with my hands instead of a mouse!
Working remotely is one thing, but working remotely and asynchronously -- with people across the world -- is another thing entirely; when one of us was working, the other would be asleep in another part of the world!
During the Hackathons, we had a 4-hour time difference so we managed by working together for half the day and syncing up around lunch-time/morning for the other person.
However during my main work, we had a time difference of around 8 hours -- that's the entire working day! Working synchronously just wasn't possible and I found it very difficult to adjust in the first week. Here are some tips from my experience with dealing with this:
- Be willing to compromise. Your team should find at least one time in the day (or week) where you can sync up and talk. If that means coming back online later in the evening for half an hour, or waking up a bit earlier every now and again, it would go a long way for the success of your project and team!
- Embrace working asynchronously. You can still be an effective team even if you don't all work at the exact same time! My team started meeting every Monday to plan out any issues we wanted to finish during the week and discuss any blockers. We could then work independently and quickly pick up a new issue from the list if needed. We also managed to 'hand over' work -- if my teammate was 8 hours behind me working on a tough issue, then when I came online I could take over and provide a fresh perspective.
- Communicate. Communication really is key, in just about everything. Updating each other with your progress throughout your day helps keep everyone on the same page, even if it's only read by others a few hours later. I found this quite weird at first, because I was just typing into an empty Discord channel talking to myself throughout the day -- but it was definitely worth it for our team.
If you're looking to get into open source software, I really do suggest applying for the next batch(es) of the MLH Fellowship now!
I'm extremely grateful for my mentor, Ian Jennings for his invaluable guidance and passion for making the Fellowship as enriching as possible. In particular, his digressions in standups and advice on getting over the initial troubles with timezones have been awesome. Check out his recent post about transforming code screencasts into markdown tutorials with his latest product: Paircast!
I'm also grateful for Avaer Kazmer for the guidance, patience, and so many code reviews throughout the Fellowship -- I've learnt a ton 🙏🏽! If you're interested, the Webaverse community is extremely friendly and would love contributions! Join the Webaverse Discord here.
If you have any questions about the Fellowship or anything else, I'd be more than happy to answer them in the comments, or you can find more ways to reach me on my website!