Copyright (c) 2017 Kathi Fisler
Computer science is a huge field, and each of you may have a difference sense of what it is and what you might expect to get out of this class. So let’s start there – what do you think of when someone says "computer science"? What do you think computer scientists do all day?
Now let’s look at a particular application that you all
Consider gmail (the Brown system) or some other mail service you accesss through the web or your phone. What sorts of tasks went into either creating gmail or keeping it running?
Users have to be able to create accounts. Each account holds several kinds of information.
Accounts need passwords so that messages can be kept private.
Messages need to get delivered from one user’s computer to other.
Features like tagging email (or putting it in folders) and searching email had to be designed and provided to users.
Someone needs to keep the machines that process the mail running.
Data needs to be "backed-up" or stored multiple places so that if one central computer goes down, users can still get their mail.
Someone had to design the visual look of the system and make sure that users without technical expertise, or users with disabilities, or users from multiple countries (and so on) could use it.
Some tool needs to figure out which ads to display to you (that’s how they keep gmail "free" for users).
The list obviously goes on, but this gives you an initial sense of how many different kinds of tasks go into this: user-design, security, privacy, machine maintenance, accessibility, data management, ...
All of these tasks have an element of computer science. Many involve other fields of expertise as well. When people talk about computer science being "interdisciplinary", they are talking both about all of the tasks that go into making modern computing-based tools, and all of the domains in which software and applications are now in use (medical research, self-driving cars, media production, gaming, and so on).
Obviously, we can’t cover all of these topics in 7 weeks (you barely hit all of these in a 4-year concentration). So our focus is going to be three essential topics that underlie many of the others:
Identifying and organizing the data for a given problem (data design)
Expressing computations over data (programming)
Checking whether computations are producing the right answers (testing)
These topics have a role in many areas beyond computer science: most of you will organize data for some project or work task, and thinking through how to make sure something "works" is valuable whether or not that something is a program. As for programming, it’s increasingly useful to be able to do a bit of it in different contexts. Also, learning to program teaches you a bit about how computing devices work under the hood.
Right now, this is all a bit abstract, so let’s use email again to give a slightly more concrete example.
What kinds of information does an email system manage?
Each user’s email address
Each user’s real name
Each user’s password
The sender of each message
The recipients of each message
The contents of each message
Which recipients have already read each message
And so on
Not surprisingly, the email system tries to organize this
Information about a single message belongs together, such as:
The address of the sender
The addresses of the recipients
The contents, which may include attachments
Information about an individual user belongs together, such as:
Their email address
Their real name
What about the information about which recipients have read which messages. Does that go with the messages, or with the recipients? You could argue for either. Does it matter? It does, because some organizations make it harder or easier to do jobs quickly, or privately, or clearly, and so on.
Figuring out data organizations, and how they support the various tasks that people or organizations want to do, is one of the key activities of computer science.
Now you want to compute something over your organized data. For example, you want all the messages that refer to your friend Jumi. How does your email tool find all the messages about Jumi? Does it look in a folder labeled "Jumi"? Look in the recipients list? The contents? Does it just look for Jumi’s name in the contents, or also her email address?
Programming is the act of telling a computer how to perform an action, such as searching for a name entered into a search box. You have to give precise instructions such as "find Jumi’s email address, then look at every email message, check whether that address is one of the recipients, and if so, display that message on the screen". You have to write these instructions in a precise notation, but this is the gist of it.
But how do you know that your instructions are right? If there are several million email messages in your system, how do you gain confidence that your program got all of the ones about Jumi and didn’t pick up others? There are good habits for testing programs, and we’ll cover those as well.
By the end of the course, you should have learned how to:
Apply fundamental data-organizations to capture the information in a computing problem
Break down a computing question into manageable smaller problems
Write programs to compute answers to questions over fundamental data organizations
Check whether your programs behave as intended/required
You will NOT learn how to build mobile applications, design user
interfaces, create interactive websites, or set up databases or
networks. The skills taught in this class are relevant to doing these
things, but we won’t cover all of the skills that you need for these
activities. You will get to do projects and assignments that have the
core pieces of mainstream applications—
Everything you need is on the course website. Post to the Piazza board (linked into the website) or send me email if you have any questions.