So you want to be a computer scientist?
Becoming a Computer Scientist
Computer scientists and software engineers arguably make up the backbone of advanced technology in our modern world. But what exactly do computer scientists and software engineers do? People often upset various individuals in technical vocations (like myself) by a conversation that goes begins as follows:
Billy Bob: "What do you do for a living?"
Computer scientist: "I'm a computer scientist"
Billy Bob: "Oh, so you're a programmer?"
That last sentence, "Oh, so you're a programmer?" is the sentence which may end up with your computer scientist friend rolling his eyes and sighing, walking away, or worse yet - hacking into your computer and changing your mouse settings.
Computer scientists and software engineers are not just cogs in some grandiose machine called "The Software Industry". While a non-so-insignificant amount of time is spent by individuals in this field programming, it is not the only thing that they do.
So what are you then?
Computer scientists and software engineers are problem solvers. Typically, a software or technical problem presents itself and it is the software professional's duty to devise a solution to the problem, and then translate the solution into a programming language.
What's the difference between a computer scientist and a software engineer?
This question is asked quite frequently. There is a quote that touches the surface of the distinction between the two:
"The engineer learns in order to build, and the scientist builds in order to learn."
- Fred Brooks
Software engineers, in essence, are practitioners of software. They are mostly concerned with finding the programming languages, APIs (Application Programming Interface), and other technologies that help them to solve a problem.
Computer scientists, by definition, are concerned when advancing the technology, describing technology, developing new programming languages and APIs to in turn, allow the engineers to "build".
So, software engineers learn new technology in order to solve practical problems, and computer scientists build using existing technology to learn more about it, and advance the technology.
This is, however, an extreme oversimplification. Many individuals with degrees in computer science work in the industry as software engineers (like myself), and many others have degrees in software engineering and work at research facilities and universities as computer scientists. The line is very blurry, and ultimately, a software engineer could work as a computer scientist, and vice versa.
So what should I major in?
If you are pursuing becoming a computer scientist or software engineer as a career, then it is almost expected that you will have a degree in a technological field. Most four year universities offer B.Sc. degrees in Computer Science, and some are beginning to offer Bachelors of Science in Software Engineering degrees.
Other related degrees include, but are not limited to, degrees in Network Technologies, Computer Technologies, and Computer Security. These are often more focused on the network infrastructure of companies, and job titles for individuals with these degrees would include technical infrastructure specialists, and network administrators.
What does a computer science or software engineering curriculum look like?
Computer science and software engineering curriculums are usually quite similar, especially for the fundamental (100 and 200, i.e. freshman and sophomore level) courses. These courses are losely divided into Core and General. Core courses are those directly related to computer science, while general courses are supporting classes (such as math courses, language, social and natural sciences).
Introduction to Computer Science (CS 100)
In the beginning of most four year curriculums, a computer science or software engineering student is expected to take (not surprisingly) an Introduction to Computer Science course. This course will typically begin to teach the student the fundamentals of a programming language. The most common programming languages as of the time of this writing for introduction classes are C++ and Java.
Computer Science II (CS 200)
After completing a CS-Introduction course, the student in both CS (computer science) and SE (software engineering) will move on to take a Computer Science II course. This course is more advanced, and builds on the student's knowledge of basic programming. It introduces the concepts of data structures and algorithms. Students who complete this level should have a reasonably solid grasp of the language being taught, as well as how to implement (i.e., actually program) algorithms (a big fancy word for the procedure that tells the computer to do something).
Specifically, it is assumed that students at this level know how to implement sorting algorithms and basic data structures such as stacks and queues.
Another very important course that is included in the core curriculum, and typically taught by a computer science professor (instead of a math professor) is Discrete Mathematics. This course is usually taken after or alongside Computer Science II. It is primarily concerned with the mathematics that help to solve more complicated problems, and understanding how a computer performs calculations. It is typical, but not always the case, that the instructor assigns programming assignments along with the expected math homework.
Introduction to Algorithm Design and Analysis
This course could be described as the "gateway" course into all the fun stuff in a computer science curriculum. It is, to many students, the "trial by fire" to decide if they have what it takes to be a computer scientist or software engineer.
Intro to Algorithm Design and Analysis uses everything learned from CS 100, CS 200, and Discrete Mathematics, and builds on top of this, requiring the students to solve many complex problems by designing and implementing software to solve them.
Software Engineering I
Both computer scientists and software engineers are required to take the introductory course in software engineering. After this course is completed, the curriculum of computer scientists and software engineers can vary significantly depending on the requirements of the university or college.
After completing an algorithm design and analysis course, most CS and SE students will take a course in Networking, a course in Operating Systems, and a course in Database Systems.
Software engineers typically take more business-oriented technology courses, and advanced software engineering courses later in their curriculum.
Computer scientists, on the other hand, typically take more courses on advanced operating systems, advanced networking systems, and artificial intelligence.
However, it is important to note that with only a few course differences, a computer science student or software engineering student could switch their major to the other (SE -> CS, CS -> SE) with very little difficulty or lost courses, and/or wasted time.
Many universities have courses in subjects like compiler design, game design and implementation, and graphics.
Most CS and SE curriculum require the student to have a heavy helping of mathematics, and to specifically take courses in Calculus I, Calculus II (sometimes also Calculus III and Diff. Eq.), and also courses in Advanced Discrete Mathematics, Statistics.
If you don't like mathematics, don't let this be a discouragement to you. Many individuals who hated mathematics in high school come to find that in an environment with a caring professor who treats their students like adults and more like peers than pond scum do much better. Most universities offer at least a course in Pre-Calculus to get students who are weak in mathematics off of their feet. If you were absolutely horrible in mathematics and are terrified at the thought of the word "Calculus", it may be a good idea to take a College Algebra and/or Trigonometry course at a community college first, then start at a university.
CS and SE students typically have to have both social and natural science courses. Social science usually includes choosing from among psychology, sociology, anthropology, history, and other related courses.
Natural science courses typically consist of biology, physics, chemistry, ecology, geology, and related subjects. Usually a CS or SE student will only have to take a one year series in one of the above natural science courses (e.g., a course in Microbiology and a course in Macrobiology would be a Biology Series).
Business and Economics Courses
Typically this is one of the ways in which CS and SE curriculum diverge. SE students usually take a course or two in a business or business-like subject, whereas CS students typically do not have to take these courses.
However, most CS and SE both require at least a semester of economics or related subject.
Often, just to fill space in a 120 or 126 credit hour Bachelors of Science degree program, the student must pick 12 or so credits (which is essentially 3 to 4 courses) in general electives. Many students choose to continue with a more advanced course in whatever their natural or social science course was. For example, a student who took Biology 1 and 2, may wish to take an "Introduction to Genetics" course, or another biology course that requires both Bio 1 and 2.
Also, many students choose to take more advanced mathematics courses. Some students choose to take foreign languages, or perhaps, a course of some sort from another engineering discipline (like Electrical Engineering, or Mechanical Engineering), assuming the student has enough prerequisites to take such a course.
What if I want to just dabble in computer science or software engineering, or maybe just get a head start before I start college?
This is a loaded question, and depends on what you want to achieve. Many individuals who did not study computer science or software engineering at the college level want to learn how to program and develop software.
It is important that you learn as much as you can about a specific programming language, and how it is used, and what it is used for. A lot of professors cringe when they hear this, because they like to say, "The language isn't the important part! It's the problem solving!".
Both knowing how to solve a problem and knowing how to implement your solution in a programming language are important.
Do you recommend anything to get started with programming?
If you are a very impatient person, or perhaps a person in junior high or high school and want to just get your feet wet, I recommend looking into something like the programming language "Alice" (www.alice.org). It is developed with and on top of Java and makes learning languages much more simple, and also provides practical and easy move into Java itself, so your time is not wasted at all with some esoteric programming language you will never see again.
Also, it is quite useful to pick up abilities in web development and design, although basic web design is not technically programming, it's marking up. There is a distinction. Markup languages just tell a page how it should look (styling the page), whereas programming tells a page or piece of software what to do.
What are some languages that are useful to know in the computer industry?
Without a doubt, anything you learn makes you a more knowledgeable person, and learning one programming language typically helps you more easily learn another.
But, in all reality there are a few programming languages that are very important for computer scientists to know:
- C / C++ (a true programming language)
- Java (a cross-platform programming language)
- PHP (a server-side web scripting language)
- XHTML (a markup language)