Two weeks in the Bandwidth sabbatical program
Based on the true story of a software developer in the year 2014.
Thanksgiving weekend is over, and I couldn’t be more excited to get back to work! Not at all because I dislike spending time with my in-laws; on the contrary, we had a blast, and the fried turkey this year was the best I ever had. The real reason that I couldn’t be more excited, is that for the next two weeks I won’t actually be doing what I normally do for “work.” Instead, I’ll be hiding away on the third floor (which is normally deserted), working on a super cool sabbatical project.
Two other developers, Brian and Frank, are also on sabbatical at the same time as me, and we’ll all be working in the same space. Two other long-time (and brilliant) Bandwidth guys, Jeff and Scott, have spent a lot of time pioneering the sabbatical program, and have planned out some of our activities for the next two weeks. They also provided a list of project “suggestions.” I get to work on one of these, and it’s definitely the coolest project on the list. The exact details of the project are top-secret though. In the event of this journal falling into enemy hands, I cannot allow our plans to be discovered! However, I can say I’m super excited to play with an Oculus Rift for the first time! I can also say that am trying to use it in a voice and video communication project – a virtual “phone call,” if you will.
There are doughnuts down here! Scott brought a box from Krispy Kreme for our sabbatical kickoff meeting. Brian, Frank and I have just finished talking through the projects we each selected, and setting goals for the two weeks. My goal is to create a prototype call using the Oculus Rift and prove (or disprove) its viability as a communication device. Now it’s time to get my workstation set up.
I am starting from a small sample project from Mozilla that displays a multicolored, rotating 3D cube in the middle of a black screen. However, when I put on the Oculus Rift and look at this same web page, it looks like the cube is floating out in front of me. As I turn my head to the side, and look up and down, I get the sense that I am floating in some black void, with my only point of reference spinning indefinitely in front of me. Because I can see the cube in true 3D, it looks like it’s only a few feet in front of my face. I really want to reach out and grab it – but then I try and I realize that my current reality is only virtual. With the right combination of audio and visual input, this could be really immersive! I think this will definitely work as a starting point for my communication project.
This morning, my goal is to get the code that I’ve written for the Rift to work with an existing Bandwidth project. Fortunately Jeff is one of the developers on this other project, so it’s been nice being able to ask him when I need to know where something is in his code.
I got it! It’s day two of my sabbatical and I’ve just accomplished the primary goal of my project. Wearing the Rift, I can see and hear someone else, and it looks like they are really standing in front of me. They can see and hear me too, although from their perspective I have a big black brick on my face. Hopefully when we finally arrive in the future, these things will be smaller. Right now I am just streaming a basic laptop webcam, but this could be much more interesting with a wide-angle camera, or a 360 degree camera.
Day three. I just showed Scott what I did yesterday and he thought it was really cool. However, I still have eight days left on sabbatical so we’ve been brainstorming about other directions I could take this project with the remaining time. Right now, when you put on the Rift, it looks like you are standing in a room somewhere else, if you setup the camera nicely. My idea is that instead of seeing a real room when wearing the rift, it would be like entering an entirely virtual room. Think of it like playing a video game, where you are the first person. There would also be someone else in the virtual room that you could talk to, present to, etc. The big challenge is that I’ve never done any graphics programming before, so this will be interesting.
Things are going really well but there is a lot of work to do to meet my new goal that I’ve set for my project by the end of next week. I brought my custom-built desktop PC from home because it has a much better graphics card than my work laptop does. Plus you can never have too many computers when you’re experimenting like this, right?
I am making some amazing progress, but there are still some significant portions of the project that I haven’t explored yet. Right now I can see my digital representation in my virtual room on my own computer. With the way I have designed it though, it should be fairly straightforward to display it on a second computer viewing the same web page. This project is so much fun to work on, I can’t help but show off my current progress any time one of my coworkers walks by. I think I’m in a fairly good spot headed into the weekend, but there will definitely be a lot to do next week still.
Today I discovered my first potential “deal breaker” issue that I didn’t anticipate. Basic math tells me that I’m trying to transmit far too much data across the network to create each person’s digital representation in the virtual room. I will have to do some serious brainstorming to figure out how to reduce the amount of data or make it more efficient. The other guys on sabbatical have been great to bounce ideas off of and to talk about these sorts of roadblocks though. Hopefully I will come up with something quickly!
I think I got something that will work. First, I was able to reduce the overall amount of data being transmitted, without any noticeable effect on performance, and secondly I was able to use compression on my websocket connection to make it more efficient. It turns out some browsers (mostly recent versions of Chrome) have support for a websockets extension called “permessage-defate” which allows for decompression. This, combined with a highly experimental version of the websockets library I am using for my Node.js server, seems to allow me to reduce the required bandwidth to run very smoothly on a normal LAN connection. Wi-Fi is still too slow at this point though. Obviously this would not be good enough for a commercial product, but my goal is to build a prototype that can prove (or disprove) whether what I am trying to do can even be done. My current take: it’s totally possible!
Yesterday I was able to get both audio and video in sync, and I’m feeling really good about the overall progress I’ve made. I should have a little bit of time tomorrow morning to put some finishing touches on it, to make it shiny and pretty for my demo at noon. Having Jeff, Brian, and Frank down here working alongside me has been wonderful for brainstorming and coming up with cool new ideas. I have lost count of the number of times I have shown them my progress and they’ll say something like “Hey that’s really cool! You know, it would be even better if it could _______” and then the idea becomes even greater than my mind alone could have imagined it.
Sad to say, but today is the last day of my sabbatical. This has been the most exciting two weeks I have ever experienced at work. But now it’s time to get ready for my demo. We have a tradition of having a “Lunch and Learn” meeting once a month, where the company brings in lunch for us, and someone presents on some interesting topic. One of the goals of the sabbatical program is to present what we learned during our two weeks with the larger development organization, so today, after the main presenter finishes, the three of us will each get about five minutes to talk about what we learned on sabbatical. Oh, and we will also have a live demo set up for people to try afterward. This is going to be fun!
I am scrambling to get everything set up for the demo. My project involves a lot of hardware, and we are presenting on the fourth floor so I have to move everything up there and get it all plugged in.
Okay everything is all set! Whew. That was intense. Now to get some food, and try to relax while the presenter talks for a little bit.
This is taking longer than expected. Hopefully I will still have time to talk about my project. Oh man…David Morken, our CEO just walked in to listen… no big deal…
Wow, that was fun! I had to fly through my slides and talk really fast, but I got through it and said everything I wanted to say. Now the meeting is over and people are having a fun time trying on the Oculus Rift, seeing my work, and talking to me about what I created. These two weeks have been a blast. If you are a developer at Bandwidth and you have an opportunity to take a sabbatical, you should totally do it. Work on something that’s completely unrelated to the work you normally do each day. Learn something new, and turn a creative vision into reality.