A Day at Constant Contact
On Friday, March 29, I had the wonderful opportunity to participate in an externship program and shadow the engineers at Constant Contact (CtCt). I spent a couple of hours the night before doing "research" (reading about their products, googling my mentor, etc.), and I was very impressed with what they do. "But how did they do it? What technology did they use?" were some of my questions at the time. And I had the chance to get all my questions answered the very next day...
Morning + Noon
I arrived at the office just barely on time (pulled out my cell phone, 9:57 am :o). Upon ringing the bell, and entering, I was greeted by a fairly tall man. We exchanged a bit of information, then I awkwardly asserted:
'You must be Mike?'
'No, I'm Peter. Mike's not here yet.'
I wanted to hide somewhere. Anyway, he showed me around a bit, then introduced me to another man. David was his name (David also turned out to be one of the two people that I spent the most time with - along with Mike). We went into a small meeting room where everyone gathered around in a circle and told their colleagues what he/she had been doing for the past couple of days, as well as what they were working now. (I think it was freaking cool because you got the chance to check out what your colleage had been working on, their progress, and see if they needed any help. I've yet seen anything like that in any company!).
After that, David showed me around and introduced me to everyone! I got the chance to ask questions and learn what everyone was working on. He then introduced me to Mike, and after that I spent the rest of my morning observing Mike's work. He was deploying his work to D1 (their local's server, afaik). Mike built a robot that would always say "Deploying to..." everytime a person deploy something, which was totally cool and mind-blowing. Not only that, the robot that he built could also increase/decrease the music's volume with some simple instructions. I spent the majority of my morning asking Mike questions about his work, the Ruby on Rails project he's working on, and using backbone.js to provide richer client-side's experience.
During lunchs, employees would usually do a couple of demos showing their work to their colleagues and getting feedback. Which was totally cool because everyone got to see cool demos while also enjoying the awesome food! Today, two of the employees were demo-ing Facebook integration with their Social Campaign app, and Dropbox integration, respectively. I had to admit that these blew my mind, both the awesomeness of the demo and the fact that I could barely follow them and the technologies they were using, haha.
Afternoon
After lunch, Mike and David showed me one of the company's conference room, where there was a TV that connected live to their Boston office (there's also another one outside!) so that they could chat and exchange ideas directly between multiple people. While waiting for a member of the Boston's team, I got the chance to ask them a ton of questions. I told them a little bit about my background, the classes I had taken/was taking, and any experience I had in the field. I also asked them interview's tip for internships and jobs, and their interview & working experience at CtCt. The advice that they gave were absolutely terrific to me, as a junior, rising senior about to leave college for the real world :)
We finally met with a person from the Boston team. He was very friendly and down-to-earth funny (I remember he talked something about eating five cheeseburgers last night while massaging his stomach, lol). Sidenote: I think software engineering is one of those fields that you got the chance to work with super, duper talented, but down-to-earth funny people like that. You don't often see bankers, accountants, or even doctors do those sort of things, haha.
I was then introduced to Jason, Mike's roommate and colleague, and we exchanged a bit of our background's info. Jason was actually the first person to deliver his demo on Facebook and CtCt's Social Campaign app. He was also a down-to-earth person, and he showed me his sticker's collection (It was during then that I found out there's still someone, beside me, enjoyed playing the good 'ol Megaman game series!) I spent the next hour watching Jason's work, while bugging him with a bunch of questions xD. I told him that I would be working with Ruby on Rails during one of my senior year's class, and upon hearing that, he introduced me to a couple of great books on the topic. I took a look at his code, and asked him how he usually tested them before committing them on Github, and he introduced me to Rspec, a Ruby gem that acted as a testing framework. He gave me a demonstration on how to test code in the real world, and it's totally cool (Sidenote: I think we all agree that code testing are taught and executed horribly in school, especially in gigantic classes like at Berkeley. I know tons of people just do the project, submit it to the evil autograder, without even bother manually test the code they wrote...).
I then asked Jason, and David, who was sitting two chairs away, about coding practice in the real world. How they usually dealt with buggy code, how often to commit or push to Github, how to deal with teammates that have different coding style, etc. I then moved on to the final part of my externship, to observe David as he handled pull request and showed me his backend work in Java.
Concluding my Externship
David first showed me the steps to handle pull requests on Github. More than often, Git will not be able to replace the changes automatically, and it's up to us humans to handle the merge conflicts. He also showed me how to effectively used all the powerful tools that Git gave us - branch, stash, rebase, reset, etc. Most of the time in schools, we never need to know, or take advantage of, the full power of git. Knowing how to add the files into the staged area, commit and push 'em are often good enough for any school projects, but it's not exactly the same way in the real world, perhaps different people may have different ideas and want to develop on different branches, for example. He then showed me the bulk of his work in Java on Eclipse, a program that was used to validate user's input before injecting their info into the system's database. The abstraction was hidden away at the UI/UX-level, but when you broke it down to smaller pieces, you actually saw some very friendly Java code just like those that are taught in school, or out of a textbook.
I concluded my externship by asking David and Mike a couple more questions. "In your opinion, what's the most important skill or attribute as a software engineer?" "What is the most enjoyable aspect of your work?" 'Desire to learn' came up in the answers to both questions, because you got the chance to work with talented people and improved everyday, and never became intimidated by other people. Nobody knew everything, and 'before you know it, you may be the one that helps those computer-whiz that has been programming since 10' was one of the advice that David gave me.
Overall, it was a very enjoyable experience, and I had nothing but positive things to say about my externship, as well as CtCt. It gave me a much different view about software engineering and how's it done in the real world. Computer science is taught in school as a 'science' (which really, really helps with the way you approach and think about a problem), but there are many lacking aspects of software engineering that can only be gained via internship or externship like this. I believe the experience I gained in my short, one-day, externship will be crucial for any internship or job that I have in the future. In the end, I'm very happy to pursue this career, and I can't say how proud I am to make this decision. Maybe I will change my mind five, ten years from now, but I can totally see myself doing this a couple of years from now as a newly-grad from Berkeley.