Software Designers~The People Behind the Code~(英語)

#44Computer Science 2.0: Part 3ーDaniel Jackson, Professor, Computer Science, MIT

Daniel Jackson didn’t have to look far for inspiration in his career. His father, Michael A. Jackson, is an author and prominent software engineer with a couple of methodologies named after him: Jackson Structured Programming and Jackson System Development. Daniel first opted for a physics major at Oxford. But after looking for work in London, he realized that ⁠the exciting companies at the time were software companies. So I came to software engineering through a slightly circuitous route.”


That’s when Jackson truly began to appreciate his father’s work. He read his books and got advice, including an emphatic point on the importance of diving deep into every project. ⁠What characterizes his work is that he has never been satisfied with just understanding things on the surface. He always wants to get to the essence of what any particular software problem is about. That’s what eventually sent me back to graduate school. I realized I wanted a deeper understanding.”

Now a professor of computer science at MIT, Jackson stresses the value of modeling complex software before you build it. He has created his own methodology: lightweight formal methods, and, with his students, a modeling language called Alloy. But more broadly, it’s his conviction--that a deep understanding leads to better programming--that has driven his career and informed his lesson plans. For Jackson, that’s the difference between mere coding and software engineering. And software engineering, he says, is a rigorous discipline worthy of serious study.

Let’s start with Alloy. Why did you create it?

Alloy is inspired by this idea that you can get to the essence of a system. You can build a succinct, precise model that describes the most fundamental things going on in the system. And if you focus on the fundamentals, you can make that model very small. It’s analogous to a laser: you can do more with that focused beam than with a big, powerful floodlight. Alloy was also motivated by the desire to do something with the model--to bring the computational power of hardware to analyzing software. And that computational power is extraordinary. You buy a new laptop and you get a terabyte of flash memory, a powerful processor, 16 GB of RAM. But if you’re a software developer, what do you use that machine for? Chances are, the most computationally intensive stuff that you’re running is probably playing back videos and using Photoshop in your spare time. The compilers and editors that programmers use could mostly run on machines from 30 years ago!

Alloy was produced by you and your students, working in a traditional classroom setting. But is that setting becoming obsolete? Do young software developers still need to learn their craft that way?

That’s a great question. If what you want to achieve is familiarity with some basic technologies, if you want to hack out some Web pages or a Web app, to use HTML and CSS, and maybe Ruby on Rails and Java, you can pretty much do all that by yourself. But what if you want to do it really well? By that, I mean producing systems that are elegant, usable, and flexible, that are maintainable and highly reliable. To do that, I believe that you need a different level of understanding. You need to have in your pocket a bunch of concepts like modularity and abstraction that I can’t readily acquire through small engagements with online education. Of course, you can pick these things up eventually through experience, but it can take decades.

So I see a formal education as a shortcut to get to these fundamental skills, by being engaged with someone who can boil these ideas down to small nuggets. Going forward, the challenge is to see whether the traditional classroom experience can be conveyed online. We already know this level of education can be conveyed in books. And not just computer science, but almost anything. If you want to learn about relativity, Einstein himself wrote books for lay people. So thinking about online education, I don’t think there’s any inherent limit to the technology. But there are no shortcuts, either. Maybe you don’t have to be there in person, but it’s what Malcolm Gladwell and others have noticed: you need thousands of hours to master most skills, and you need engagement with people who can mentor you and respond in detail to what you’re doing.

How important is the degree itself--the certification versus the work behind it?

This is like a question we’ve asked in the past: how much does the prestige of the university matter in comparison to how well the program actually suits your intellectual interest? And that is something you always have to weigh up in terms of what you want to do. If you want to change the world through a startup, it doesn’t make much difference how you got your education. If you’re qualified to build great software, you can do it. On the other hand, if you want to work for most companies, they still expect you to have some kind of official qualification. If you want to teach at university, you have to have a PhD.

You’re involved in MIT Professional Education, which offers courses to working professionals. Who are the students and what are they after?

It’s only a small part of what I do, but I’ve been doing it for some time. Even back when I was an assistant professor at Carnegie Mellon, I helped design its masters in software engineering program, which was for people who had been out in industry for five or 10 years. What I noticed even back then is that, compared to undergraduates, these people actually have more patience for doing things the right way. They’ve been burnt too many times to take shortcuts. Less experienced developers quite understandably love the thrill of building things. The act of building is exciting, but it can be hard to prevent that thrill from completely dominating your view. So it is often more difficult to convince an undergraduate of the value of seeing the bigger picture, of understanding the importance of designing something well: not just to execute the first time, but to have the right kind of structure and support the right kind of features. For people in industry, that’s a much easier sell, because they tend to think more long-term.

How do you define this inherently vague notion of well-crafted software? What do you tell your students?

I believe that the most important thing when you design a piece of software is to have a robust conceptual foundation. That means you have to understand what the key concepts are and how they are related to one another. You have to have that down really clearly before you begin. This is related to what Fred Brooks in The Mythical Man-Month, his 1975 book on software development, called ⁠conceptual integrity,⁠⁠ which stresses the importance of software architecture ahead of coding. When he revisited the book 20 years later, he was even more convinced of its importance, and it’s something that I stress in my classes.

For example, my students are designing an e-commerce shopping cart for their current project. On the face of it, this task seems pretty trivial. But as soon as you start thinking about the details, you realize that to get the concepts clear you have to put in some work. You’ll have to distinguish, for example, an item someone buys (this particular iPhone, say, with its serial number) from the generic item on offer (⁠the iPhone 5⁠). On Amazon, for example, you have wish lists and shopping lists. Are these the same? Do you put the same kinds of things in them? At first, these might seem like simple notions, but when you work them out in detail you find that they are actually rather subtle. And if you don’t work them out in detail in advance of building code, then you typically get into a mess and have to fix things later, often at great expense. Or, you never fix them and you end up with a system that’s clunky and unreliable.

For students looking for this kind of depth, where do online courses fit in? MIT has been in the forefront here with its OpenCourseWare initiative.

OpenCourseWare took materials that had already been prepared for MIT courses and made them available online. Many of my graduate courses have been put on OCW, and it’s been very gratifying. One of my earliest courses, a software engineering course, was quite widely used quite widely. It was translated into Portuguese and Spanish and got quite a lot of use in South America. OpenCourseWare gives an opportunity to download material like video, lecture notes, slides and problem sets. Students could contact the faculty, and indeed I have had many nice exchanges with students who were studying the material.

But as a student, you weren’t really part of a community. What is changing is that online courses are starting to be delivered in real time, at least in the sense that there is a cohort of students taking the course together and the material is tailored for that style of delivery. For example, you might watch videos when you want to watch them. But the course itself has a formal beginning and end, you have fellow students who are taking it with you, and you can interact with them and teaching assistants in online forums.

You can see at least some of this in a new project, called edX, which was created by MIT and Harvard University, and has since been joined by the University of California at Berkeley and the University of Texas. I have been talking to a lot to my colleagues about edX and the role it will play in our courses.

edX in which MIT, Harvard University, etc. participate
edX in which MIT, Harvard University, etc. participate
And edX is part of this movement--an attempt to bridge traditional and online education?

I think so. The purpose of edX is precisely to offer opportunities for a very high quality education to people who don’t have the ability to attend residential education, whether because of cost--edX courses are currently free--or convenience. edX is designed to take the kinds of things we are able to do residentially at MIT and provide them to a much wider online audience. This means that the kind of deep education that you could previously only get by coming to MIT can be available to millions of people worldwide. And I think edX will improve the quality of residential education at MIT, as well, by providing supplementary materials and online ways to engage our students.

Will it come with its own certification?

Yes--a certificate of completion issued by the underlying "X University": MITx. BerkeleyX, etc. The first certificates will be free; a nominal fee will be charged in the future.

So what advice would you give to young developers getting started in this new world?

I’d tell them to keep in mind the basics of software engineering. First of all, to be able to analyze a problem so that you deeply understand what you are trying to solve. Secondly, to be able to formulate, articulate and evaluate design ideas. And thirdly, to be able to implement your ideas skillfully. Being a skilled software developer involves all those three activities, often interleaved with one another.

The next generation of developers will find of lots of new and exciting opportunities to learn their craft. So be discriminating. You need to find the materials that are really deep, substantial and inspiring, and then invest your effort in them first. And don’t get overwhelmed by technology. You can spend your whole life studying the details, the technological platforms, but ultimately it’s the fundamental concepts, ideas and skills that matter. Those are the things that will persist.