The first thing I would like to talk about my Australia adventure is the internship at Google Sydney.
Google Sydney is a relatively small office, compared to the size of Google. There are about 500 employees in the office, occupying 3 top floors of the Accenture building near the Darling habour and the casino Star City. There are a lot of engineering teams in the Sydney office: Docs, Maps, Chrome, etc. I was in the Google App Engine team.
My project was a very difficult project; it was one of the toughest projects I have ever done. The difficulty did not only come from the project itself, but came mainly from acquiring necessary knowledge in order to do it. Google love to build their own technology. Actually, they invented a lot of new technologies to foster their development process. They are fascinating. But imagine you was in my shoes, you had to understand the current implementation of the system, which was complicated and not always well documented, while learn 5-6 new advanced things at the same time. You had to design and implement the project using something you did not know, which was different from the thing used currently, which you also did not know. To add to the complication, it required a few new and/or uncommon knowledge that even your host did not know well. The only thing I was familiar with before taking the project was the language, Java.
Although I was always confident of my skill, I was still doubtful if I could complete the project with the remaining time of my internship. In fact, when I started, I only expected that I could finish the back end implementation. At the end I managed to finish not only the back end, but also API and front end presentation of the project. I was totally happy about that.
The project was tough, but it was also a fascinating learning experience. It challenged me not only in technical ability, but also work habit. Given limited timing, I needed to learn to work more efficiently. I learned to keep myself on track by constantly writing down what I need to do. (There were many times what I wrote was "what should I do now?" But even so, it was still helpful to keep me on the topic). I also learned that taking appropriate break was crucial. I would occasionally retreat from the computer, go to a tea drop and lie down there alone, musing about what I was doing. Many times I came back with a clearer understanding of the stuff I just consumed, some few ideas. Sometimes I was still as clueless, but I acknowledged that resting was not enough, that I had to come back and stick to the problem longer. I found that if you were stuck at a problem, it was usually better to take a break, then change the approach to the problem. By the way, strange as it may sound, I am growing detached from my laptop.
When it came to actual code implementation, I realized that code design (code organization) was not trivial. My first trunk of code actually required a lot of changes in design (thanks for my host who suggested me better and better design). It took me several times to get it (kind of) right. The final code was much cleaner in design than the initial code. One lesson I learned was avoiding over design or over generalization. Sometimes it is better to have a very good, clean (and explicit) design for the very specific problem at hand, than a general solutions with multiple levels of abstraction. A more explicit lesson was using class constants to capture things that class need to use. That way, when someone use that class, they do not need to know about the dependencies required to use it in most cases.
Another thing I would like to talk about is testing. Google requires testing extensively. Every functions must be tested. I learned a lot about automated testing throughout the internship. However, I cannot help to think that aggressive testing significantly slow down development time. In fact, I believe I spent around half of the implementation time writing testing code. However, automated testing is still crucial. The question is how much is right? In the context of a start-up, I think product development should be the focus. Automated testing code should be added to the core, frequently used functionality only, or when something is broken several times. Facebook is pretty big already and yet extensive testing is not yet enforced.
There are few other lessons I have learned (or reaffirmed that it was right) as well, such as better estimation of the time needed to complete a task (that is, including sufficient buffering time in the estimation). I have got a better understanding of my skills. Or breaking tasks down to smaller, easier to complete and review changes. Each change should implement one and just one small improvement. If you need to implement a big feature, you may (and should) have a draft CL (diff) to have the view of the big picture, but when write check-in code, break that CL down to multiple small CLs. In Facebook, Google or a big company, it makes it easier to get your changes checked in the code trunk. In a small start-ups, it helps reviewing code easier. By the way, unlike testing, code reviewing should be done even in small company. At least have a glance of what others write..
Lastly, to praise Google, their internal technologies are very awesome and advanced stuff. Despite of their complexity, they are relatively easy to use (well, in most cases).
Now let us talk about social stuff. It was unfortunate that my project did not involve cooperation with lots of other people in the App Engine team. We do chat and joke around a lot during lunch and dinner time though. My colleagues are, generally, nice and geeky. However, it took me longer to get along with the team compared to at Facebook. I guess it is because of the nature of Facebook. We are friends on Facebook and know a lot about others more personally. It gives a higher sense of closeness. People at both companies are smart and friendly though. It led me to believe that I can expect awesome people at any office in both companies (come on, these geeky people are always nice anywhere you go). The more important thing is whether you like (/love) what you are doing or not. Another intern who worked at Intel before confirmed to me that people there are also very nice and fun, but he did not enjoy it totally due to the kind of work there. (Talking about that, I feel that the team could do better at selling me the idea of Google App Engine. For example, why I should work for App Engine instead of Amazon Cloud Computing service? They kinda took it for granted that I would be passionate about GAE. For my main project, however, I immediately realized its importance and/or benefits to developers, so it was not hard to convince myself doing it, despite of its complexity.)
I have also got some taste of working with people in different timezone. But it was not fun (no wonder Facebook resist opening engineering office in different timezone). Your progress could easily be put on hold if you depended on response of people in another half a day away. They only started working when you were out of office! Sometimes I made changes to my work, and had to wait until the next day to receive reply before I could continue doing anything. It was not too bad for me, because I usually had something else to do during the waiting time. However, I did get blocked a few times. It was much worse for another intern friend of mine. He complained to me a lot about how he would do nothing in the afternoon because he had made all his changes in the morning, and had to wait for comments from people in Mountain View office to get back to him first.
There are tons of other benefits working at Google, such as free food, flexible working time, game room, break anytime you want, massage, etc. etc. and etc. They are all awesome but do not need much discussion.
Overall, the internship was totally worth it. I feel that I have grown tremendously throughout the term. Now, after the two internships at Facebook and Google, I have much better understanding of software development process in real life. My confidence was just leveled up one more time. However, it is also a good reminder of my current ability. I still have yet a lot of things to learn. But I will continue growing =)