As usual, I've been a delinquent blogger. But I've finally come to the point where my sentiments about my role and my work have finally (somewhat) gelled.
I wasn't always a computer geek. Sure, I was always interested in computers, but I never programmed anything before setting foot in university. I just liked solving problems and building things. When I chose Computer Science (quite randomly, as you'll soon find out), I never really understood what developers did outside of code-monkeying, and I was not at all clear about what my role would be as a software developer.
I entered my first year of Computer Science without ever having programmed before. Why? Well, I actually wanted to be a doctor, but realized I only really liked the science and the romanticized ideal of helping people. I didn't actually want to see anyone die, or diagnose anyone with some terrible illness. A part of you has to be removed from your patient, and I didn't want to sacrifice that feeling of solidarity; I wasn't, and am still not, okay with death or chronic illness. Also, the unimaginable hours would have made me go insane. So in my last year of CEGEP (a Quebecois flavor of pre-university and vocational school), I opted to go into engineering because I liked solving problems. So which kind of engineering to pick? I was leaning toward materials engineering, since it combined all my favorite subjects, but I had a strange and rather inexplicable desire to try something completely different. Both my career counselor and father told me that computer science was something I'd probably be good at, and potentially enjoy. I had never been the kind of person to be afraid of a computer, or be afraid of learning something new, so I said "What the hell, why not try it out?" My plan was to take my chances and try Computer Science at Waterloo for one year, and if I didn't like it, I would go back to McGill for their materials engineering co-op program. Now that I reflect on it, my decision was pretty out there, but I'm extremely glad I took that chance, because I loved the material the first day of class. But going to Waterloo is far from just an academic experience, it also ensured that I would be going through a series of internships. The internships were a key factor in deciding where I wanted to go for school, because I had no idea what being a "computer scientist" would entail. I knew that with this program, I would be on my way to an eye-opening journey.
My first internship was a strange one. I was totally new to programming, so I opted for a QA job (I started class 8 months prior, so at that point I barely even understood the concept of tree traversal). The job itself was something I had no passion for; I love building things and solving problems, not trying to break other people's software or writing test scripts. The environment wasn't one for me either. It was quite corporate, and not one where I felt I could easily contribute outside of my designated role as tester. After that experience, I realized I should move on to developer positions, since my passion lay elsewhere.
My next few internships were at start-ups, and they were great. I loved wearing different hats, and doing whatever was needed to get the job done. I loved the chaos. I loved being part of such small teams, and building out systems from the ground up. It was fun, exciting, and I was always learning something. I had applied a lot of the academic knowledge I acquired, as well as just general coding principles and designs. Having done rapid development for a few internships, I wanted to see what else was out there.
This brings me to my last internship. I heard good things about Amazon, and it seemed like the perfect introduction to a "corporate" developer environment. I'm now in my 3rd month here, and it has definitely been an interesting experience. The small team sizes and the amount of freedom we are given is very reminiscent of the start-up culture. The real difference was the involvement I had with the entire software development lifecycle.
At start-ups, you're always on the beginning part of that cycle. Get specs (or at least some data or proof of concepts), build, build more, refactor, build again, test. Scrap occasionally. Build more. At Amazon, I was given many tasks at different levels of the cycle. The interns are given projects where they must seek out the right people to get specs from, design a solution, build it, and release it. I had never been given any customer-facing roles, so this was a new and truly enlightening experience for me. I had also been tasked with adding parts to a maintained system, and had seen quite a few projects being obsoleted and replaced by better solutions. Students always hear about this 'software development lifecycle' and we all know how it works, but seeing this concept in action and being part of each division gave me a real appreciation for the work we all do as software developers. There are many lessons I have learned here so far, but it can all be summed up by the fact that this experience has made me truly understand the software lifecycle, and my role as a developer in creating software solutions. To continuously build and improve, and listen to your users.
I had always had a narrow field of view on the work I was doing. I understood my role as a coder, but not as a developer. My job isn't just about coding, but also working with others to find a solution that helps everyone, finding and addressing issues, and understanding to let go of something when the time comes. It is a true and full form of constant problem solving. I completely get that now.
This internship was the perfect conclusion to my undergraduate career. I have learned so much from school and from my internship experiences, and I now feel like I have a grasp of what my role is, and where I want to go from here. We'll see what the future brings!