ENGL 279

Course Description

This is an intensive course in the major concepts of programming and software design as applied to the humanities (with a focus on text manipulation). We will study the UNIX operating system (briefly), the Ruby programming language in detail, and use both to explore the algorithms, data structures, and design patterns relevant to the advanced use of computers in the study of literature, history, philosophy, journalism, and related fields. We will also survey some of the more important scholarly work in digital humanities and theory of new media. Students are expected to demonstrate understanding of the material through frequent exercises.

This class meets in Burnett 126.

Frequently Asked Questions

Do I need to be a computer wiz to take this class?

This class assumes no knowledge of either UNIX or programming.

It is, however, necessary to have a fairly high level of comfort with computers. If you generally like computers, enjoy fiddling around with them, and are curious about how they work, then that is probably all you need. That said, this is in no way a "computer literacy" course. If you think you need a more basic introduction, come talk to me. You might be interested in either CSCE 101: Fundamentals of Computer Science, or in one of the many workshops offered by our own Center for Digital Research in the Humanities.

Do I have to know math?

For this class, nothing more sophisticated than basic arithmetic.

I suspect, though, that you may be asking, "Is programming mathematical?" or "Do I need to be good at math in order to be good at programming?"

The answer to that is more complicated. On the one hand, programming is all math in some abstract sense; nearly every programming concept has its origins in some branch of mathematics (combinatorics, set theory, abstract algebra, graph theory, and so on). In practice, though, programming is exactly as mathematical as the problem you're working on. If you are writing programs to model the aerodynamics of an aircraft wing, then the programming is going to require very deep knowledge of mathematics. If you're writing programs to generate Web pages, however, there may be no mathematics at all. In general, most programming leans toward the latter category.

Most of the mathematics that shows up in the humanities has to do with either statistics (which is heavily used in text analysis in general and data mining in particular) or geometry (which shows up in GIS and 3D modeling). Even there, though, it's highly likely that someone else has developed a tool or an external library that does the heavy lifting for you.

One thing is certain: Being good at mathematics in no way guarantees that one will be good at programming (or vice versa). My own (admittedly anecdotal) experience as a teacher suggests that being musical, enjoying games and puzzles, being a tinkerer, and being generally curious and inquisitive are far better predictors of success.

A very high tolerance for frustration helps as well.

Are the problem sets hard?

They can be. You will nearly always have a good four-and-a-half days to complete an assignment, and there's a good reason for that.

I've seen people write decent papers the night before. In fact, I've done it myself. It is, however, highly unlikely that you will be able to pull off a working, fault-tolerant program two hours before the deadline. Programming is extremely detail oriented; it can take hours to track down a problem (and the problem might be a single missing letter). You would be well advised to start working on the assignment early and give yourself plenty of time.

I've done some programming before. Can I still take the course?

That depends. If you are proficient in another programming language, then this class is almost certainly a bad fit.

If you've studied programming on your own or studied the subject in high school, it may or may not be a good fit. Come talk to me.

When I was in college, signing up for a course in, say, French, when you were already proficient in the language was called "sandbagging." Deliberately sandbagging a class is a matter of academic integrity (since you're taking the seat from someone who doesn't know the material and wants to learn). Let's not go there.

What will I know at the end of the course?

You'll have been introduced to most of the fundamental concepts in modern programming. You'll also have a quite robust knowledge of Ruby, know your way around the UNIX command line, and have read some of the more famous articles in digital humanities and theory of new media.

I've designed this course to give people a strong conceptual foundation in software development for the humanities. That said, mastering programming—if such a thing is even possible—is approximately as hard as mastering the violin. One very famous programmer claims it takes ten years to learn to program, and I don't know a single serious practitioner who would disagree.

Ruby is an excellent first language. After we're through with it, you should find it relatively easy to learn related languages (like Perl, PHP, Python, and Javascript), and have a good running start on more complex languages (like C++, Java, and Lisp).

Why is Ruby an excellent first language?

Since you probably aren't familiar with other programming languages, I suppose you'll have to trust me. But in brief, Ruby provides a very low barrier to entry. It's possible to start writing working programs in the language almost immediately, and it has a graceful, consistent syntax. It also draws its feature set from a variety of different language paradigms, which makes it easier to study different approaches to program design.

Ruby is also a well-supported, mainstream language with tons of third-party libraries for doing all manner of things. It is, for example, the main language used with Ruby on Rails—an extremely popular framework for building complex, dynamic websites.

Why are we studying UNIX?

Mainly because an enormous number of the computers in the world that are serving up Web content use Linux (a free variant of the UNIX operating system). In fact, in academic contexts, I would say the vast majority are doing so. Having a good, working knowledge of how to use UNIX/Linux will undoubtedly come in handy down the line if you continue working in digital humanities.

Because Linux is new to most people and is quite unlike the usual suspects, it also defamiliarizes the notion of an operating system. You may come to see the interfaces you use every day as less inevitable. In fact, I would say that seeing one's computational world as less inevitable is one of the main ulterior motives for the course.

I want to be a ninja hacker! I need to know HTML5, CSS, Javascript, Python, PHP, JQuery, Drupal, Django, XML, XSLT, C++, relational databases, ArcGIS, and the Unity engine!

What you really need to know are the technologies relevant to the problems that interest you. In the humanities, there are people who work almost exclusively with only one or two technologies, neither of which may require "programming" as such.

I continue to insist, however, that knowing how to program—even at a basic level—makes it a lot easier to work with other technologies, because the fundamental patterns in computing reappear over and over. That's why I recommend that aspiring digital humanists learn to code, even if that's not their final destination.

It may also ease your worries to know that not all of the aforementioned technologies require months or years of intense study. Many of the things on that list can be learned on one's own (using books or the abundant Web resources that exist for each one), or in a short workshop. And while some are certainly harder than others, there's no need to despair. No one knows all of them. The trick, as I said, is figuring out what's relevant to your own interests.

The key thing to keep in mind about this course is that despite there being thousands of programming languages in existence, the fundamental concepts are reasonably uniform. The material we'll cover is therefore relevant to nearly any kind of software development you decide to pursue, whether that be Web development, games, simulations, data mining, or something you invent yourself.