Questions about Software Engineering

I was going through some old emails yesterday and came across one from a student at RIT who interviewed me for an introductory course he was taking. The interview consisted of questions regarding software engineering and my experience working in the field and at the Center for Computational Research.

The questions were good and made me think back through my career about some things I've learned along the way. I thought a few of them were worth sharing and if you're so inclined, feel free to leave how you might have answered the questions in the comments. Here's an excerpt of the interview with a few questions and my responses:

Q: What skills are important for your job?

I think having a strong foundation in computer science is important. We work across several disciplines and being able to apply computer science concepts to help solve the various problems in a particular research area is important.

Managing expectations. It's often the case that you work with users who don't have a firm grasp of the technology and being able to explain the various components of a system in such a way that they understand both the capabilities and limitations is an important skill.

Problem solving. I think as a programmer you're often confronted with a vast array of problems, whether they be bugs in code, design choices (what implications does a particular design choice have on the overall system?), reverse engineering legacy systems, data processing (how do you efficiently process terabytes of data?). Your ability to adapt to these problems and come up with effective solutions is a very important skill to develop. I'm not sure it's a skill you ever really master but one that you are constantly fine tuning.

Q: What is your typical process for designing and developing software?

We tend to follow an Agile approach to software development (iterative approach: design, code, test, feedback, repeat). For any given project we first start with a requirements gathering phase. This includes meeting with the various groups involved in the project and getting a solid understanding of the scope. We then meet internally and come up with an initial design and set various milestones for the project. The next phase depends on the main focus of the project, because we are a research focused group we are often times working on a grant application or an already funded grant. In the first case we usually build a prototype of the system which serves as proof of concept should the grant get funded. In the case of an already funded project we follow a more rigorous development cycle involving a more formal design specification and development/staging/production environments for releasing versions of the system.

Q: What makes working for a university unique (as opposed to a private company)?

In a university setting (specifically research) there's obviously more focus on cutting edge research areas. We're exploring new topics that aren't always well defined so there's quite a bit of room for creativity. We also support researchers across many disciplines and sometimes you work on a project that doesn't always end up getting funded. So there's times when you put quite a bit of work into something that never gets off the ground.

In contrast, working for a private company ultimately comes down to being profitable. So design decisions tend to be heavily influenced by customers/investors and what effects the bottom line. In my experience the private sector is much more deadline driven as well. Usually there's a strict release schedule to meet and a never ending list of features to be implemented.

Q: What do you like most and like least about your job?

I very much enjoy the problem solving aspects of programming. Tackling hard problems is something I enjoy and in this field there's definitely no shortage of them. I would have to say the thing I like least about my job is having to occasionally work with Microsoft technologies :) I'm a big advocate of free software and I cringe at the thought of having to implement a piece of JavaScript code so that it works in I.E.

Q: What skills have you learned from being a software engineer? What has the job taught you?

I think one of the best skills I've learned from being a software engineer is system administration. I've always had a passion for tinkering around with different technologies and in doing so spent quite a bit of time building systems so that I could develop on. In the process I've learned a lot about system administration which has helped me out tremendously in various projects throughout my career. As a programmer it helps to know more than just how to write code.

Q: Any additional thoughts or comments?

Random advice: One of the most important tools for a programmer is a good editor. There's a lengthy debate as to which editor is the best (I personally prefer Vim) but whatever one works for you, learn it inside and out.