Programming Influence
This article appeared as my column for Connect Magazine in March 2006.
In The University: An Owner's Manual, Henry Rosovsky discusses the various "owners" of a university: students, parents, alumni, employers, and faculty. Similarly, academic departments are always torn between who their customers are. This affects faculty discussions about almost everything.
In the BYU CS Department, we have a goal of developing and graduating CS majors who will have influential careers. That's a hard thing to define and difficult achieve. There are some who argue that "influential" is wishy washy and while it sounds nice isn't anything that can really drive decisions. I disagree.
Note first off, that we're not talking about how to help the best students to be influential. They'll probably achieve that regardless of, even in spite of, anything we do. The issue is how to help average students gather the skills they'll need to be influential.
If I look at the places a CS student might end up, I think one path that leads to influence is the role of software designer, architect, and even CTO. I contrast this specifically with programmer and even lead programmer positions which, while important, don't offer the same opportunities for influence. Moreover, as an additional benefit, design-oriented roles are less prone to outsourcing. How do you help someone prepare for those roles?
I think teaching students to be competent and effective programmers is necessary, but not sufficient. At BYU, we spend a lot of time ensuring that regardless of what other knowledge our students gain, they can at least program. Some of what we do is structural. For example, we require that senior level courses include big projects so that no matter what electives a student takes, they get some experience with large (by academic standards), group projects.
Beyond mere programming, what else is there? Communication skills have to be at the top of the list. Not just technical writing, but presentation skills as well. I think CS programs do a spotty job of this. Giving students time to make presentations takes quite a bit of time in class. Grading writing assignments can ruin a Christmas vacation. We need to find ways to more consistently develop student communication skills.
Good architects and CTOs understand business concepts. Consequently, teaching CS students an appreciation for business is crucial. I'm not necessarily suggesting that every student should be required to take a business class of some sort, although that's certainly an option. My issue is cultural: too often the feeling among technical folk is that the business side is not worthy of study because it's somehow soft or easy. I try to talk to each of my classes about business ideas and requirements and how they impinge on design decisions. Admittedly, my background makes that easier for me than it might be for others. BYU also offers a software entrepreneurship course that I encourage all students to take, even if they don't think they'll ever start a business.
Most CS programs do a terrible job of explicitly teaching students about software architecture. I think CS majors should be required to take a senior-level software architecture course. Most of what students learn about software architecture, they gain from seeing lots of examples without anyone ever pointing about specific ideas. We teach modularity as a programming skill, but don't tie it into architecture and discuss its role in creating value.
A capstone senior project or thesis would go a long way to building these skills in students as long as it was designed correctly. Making students interact with real customers would help them learn communication skills and they'd gain appreciation for business requirements and needs.
I think it's vital that CS programs create a culture of curiosity and innovation. In my experience, good architects have broad knowledge and skills. They generally picked them up because they're curious and self-motivated. As I said, the best students will do this naturally. Average students, however, tend to struggle more just getting the course work done and consequently spend less time playing around and exploring. I'm leery of techies who avoid programming outside work. Conversely, I'm always excited by students who want to show me something they built "just for fun." You can see the excitement in their eyes and those are the ones that I would hire and who I believe have a great shot at being influential.
Related to this is the capacity to continue to learn. If students have the right background, they will more easily pick up new concepts and technologies. Unfortunately, these concepts are usually taught in the concepts in the classes they don't want to take.
Teaching students the skills then need to be influential takes effort and requires the sacrifice of other concepts and skills. But I can think of no better way to lift students who will, in turn, lift the department, university, and state through their success.
Phil Windley teaches Computer Science at Brigham Young University. Windley writes a blog on enterprise computing at http://www.windley.com and is the author of Digital Identity published by O'Reilly Media. Contact him at phil@windley.com
Last Modified: Wednesday, 11-Jan-2006 03:47:31 UTC