The world of Computer Science (CS) is a complicated one at best. So we have to ask ourselves, why pose the question “What is Computer Science?” For starters it’s a relatively new science no more than 50-60 years old. This does date it at the earliest the mid-1940’s which is about right. One of the first methods of applied CS was the breaking of the Enigma cipher which was key to the allies winning World War II. Another reason we need to educate ourselves on this topic is that not many people know what it really is. There have been many occasions where people significantly older than me have said, “Is it like creating an excel spreadsheet to analyze data?” So it’s important to understand that CS doesn’t merely involve using computers but the essence is the idea of using a computer program or something similar to solve a real world problem that we have. I should also note that that’s not all that it’s used for, we’ll go deeper into what it means later in the article. Another reason we want to ask the question is that there are many different areas of CS. You can picture a spectrum ranging from theoretical to practical and the various disciplines will fit on there. Finally, and perhaps the most important, how it relates to you and the world around you. We live in the 21st century and unless there is a catastrophic earth changing event computers and other digital devices aren’t going anywhere. Everything ranging from your cell phone, car, all the way to your computer is influenced by the world of CS.
Delving more into what it really means it’s best to start with what I mentioned above and using CS to solve pre-existing problems. These problems can be anything from basic mathematical problems to disease control simulations in the event a toxic substance was released over a city all the way on the far end to running projections of how a planets gravitational pull would effect the parent star. Another example might be taking in a known formula (the RuneScape combat formula) and calculating how many different ways there are to get a certain combat level, say 127, and then list the appropriate values. Another way to describe CS is to use the analogy that programming languages are like the English language, that being the words, grammar, and spelling that lets us express our feelings. CS is the analytical, interpretive, and application of programming. So in this case lets say someone is analyzing a short story, they will write an essay on the topic in which they analyze and interpret that story. The writing of the essay is the application of the English language to this certain situation. We do the same in CS where we may examine a problem as mentioned above or another computer program then write a program to run experiments or simulations on it. Another thing to mention is that Computer Science can be either be based in research or practicality. The research stream may consist of developing new techniques for enhancing AI or developing new languages to pursue the Holy Grail of computer programming. The Holy Grail in this case refers to a language that is easy to pick up and use so regular scientists can use it to solve their problems. In the practical area a person may be engaged in Software Engineering or Database Design for a specific company. So in a nutshell CS can be used to solve pre-existing problems, find new ways of doing things, or apply existing knowledge in an area such as Software or Databases.
With such a broad scope of solving problems, research, and practicality it’s only natural that there be many areas of Computer Science. There are four main large areas of CS including, theory of computation, algorithms and data structures, programming methodology and languages, and computer elements and architecture.
The first section includes things such as the well known A.I. discipline and computational complexity. Computational complexity is the study of how extensive an algorithm must be to solve a problem or if it’s even solvable at all.
Following from this Algorithms and Data Structures is key for anyone taking Computer Science. All an algorithm is, is a set defined way to solve a problem. Some classic algorithms that pretty much everyone hears about are the Quick Sort (and others) and various Graph traversal methods such as the Depth First Search (DFS) and Breadth First Search (BFS).
Along with this comes the analysis of algorithms and how efficient they are. Going to back to sorting this becomes very important, it’s unwise to try to sort a list of 1-million numbers with a slow algorithm. Someone who is just starting out may decide to use a sort such as the Bubble Sort which has a horrendous time complexity of O(n2) whereas someone who is experienced would use the Quick Sort which has a time complexity of O(n log n) (see Big-O Notation). Anyone who has looked at graphs before will note that a N^2 graph increases much faster than a n log n graph.
Finally comes Data Structures. Data Structures are key to storing data efficiently. In computer programming when most people start out they’ll use standard variables or arrays, however, for larger applications this can become cumbersome. Designing a proper data structure for the task is key. Some generic data structures include lists, queues/stacks, and trees. An example where a well designed data structure is key can be anything from an automatically sorted list for a phone book or an elaborate Hash table for dictionary lookup. Once I was to build an application in which the entire dictionary would be loaded and then lookups had to be made quickly. Now approaching this problem you have two choices, use a very large array which takes a long time to search or build a custom hash table, I went for the latter. I built a data structure in which when the user started the application the size of the table would be 50,000. If they approached a load factor of about 65% (32,500) I would add another hash table onto the list. The reason one has to worry about load factors is that with hashing if you go above the 70% load mark you risk hashes of your data that’s being inputted colliding, and this would overwrite data. The other option would have been to resize the table and re-create the indices which would have taken too much time. I also needed the ability to jump between hash tables so this required links between them. In the end there would end up to be either 7 or 8 tables for a standard English language dictionary.
Next up we start to express ourselves with various forms and techniques of programming otherwise known as programming methodology. This section includes everything from above in the application standpoint, ie. you know how to build a tree, make a tree. Languages fit into this area as well. There are many languages that exist, some have even died off just as real spoken languages do. Some common well known ones are Java, C/C++, and Visual Basic for the desktop. Two other not so well known languages are Lisp and Prolog. There are also languages that can be used on the web such as PHP, Python, and Perl. Remember, there are many other languages not listed here for both desktop, research, and web use. The programming methodology side of this part will include things such as various design concepts for software, ie. how can we make this work with the least amount of effort while still keeping it extensible in the future, an example is the MVC pattern. Another thing that fits here are design patterns. These include three categories: creational, structural, and behavioral. An example of a creational pattern is the Prototype which creates another object based on a pre-defined schematic (the prototype). A structural pattern may be the Façade which provides a tiny window into an area of greater complexity. A behavioral pattern that everyone likes is Observer, which allows any number of objects to watch for an event and then respond to it. All programming methodology boils down to is what are the known ways that work to accomplish a specific task by the use of languages.
Last but definitely the most important is computer architecture. Without computer architecture we’d have blind boxes filled with plastic and silicon that would have no idea what to do. Computer architecture is a vast topic. Things that may crop here are digital logic, architecture of the microprocessors, memory management, and I/O management. We can also learn about computer architecture by looking at the way in which operating systems are created. Modern computers are modeled after the Von Neumann architecture which hasn’t changed since the start of the computer science discipline. You may ask why it hasn’t changed in that long, well the answer is simple, it works well enough for our purposes and is still expandable to suit our needs. However an area that is drastically different in architectures is Quantum Computing. The reason being that Quantum computers will use Quantum mechanics to perform operations on data whereas traditional computers (Von-Neumann) use electrical charges on transistors. So as we see architecture is something that people don’t think about daily, even people like myself who are involved in Computer Science, but nevertheless it is still a very important field.
It’s now time to take a look at how CS relates to you and everyone else in daily life. As said before everything you use will have some form of a digital circuit in it, so with this becoming the norm it means that CS is becoming ever more relevant. It’s relevant to know how something was designed or how it works so it’s easier to understand and use. It’s also important so when you have the chance to talk to a designer or developer of a software product you have a bit of knowledge on how their thought process works. Again extending to other fields it may be prudent to know later on in life what the “environmental advisor” does in order to make his simulations for the consequences your company’s choice of location for where the waste will be dumped. Finally, it’s important to know so you as an individual can see if there’s one specific area of CS that you would like to pursue as a career.
Pursuing Computer Science as a career is something that a person should not just jump into. Research needs to be done to see if this is the right course of action rather than just learning a language and working on a programming team under someone with a CS degree. If a person is highly skilled in mathematical and statistical sciences there’s no reason to not go right ahead. It should also be considered whether it is more interesting to apply CS to other disciplines, research theoretical CS or use practical knowledge of CS. Once an education in Computing Science is completed it opens up a wide variety of opportunities from researching new ways of doing things in CS (the Holy Grail), building new architectures (Quantum computing), Database design and implementation (practical), software engineering (practical), or working for a weather office developing tools meteorologists use (applying CS to other disciplines). Another thing that’s very useful is to pick a secondary area of study. So if a person is an astronomy buff they can take astrophysics along with CS to apply CS later on to astrophysics problems. Another option if a person is an entrepreneur is to take accounting, marketing, and economics classes so they’d have an edge when they start their own business. The trend right now in Computing Science is leaning towards the theoretical side with a split probably around 60/40, 60% being theoretical the other 40% being practical. At the end of the day what can be done with a CS degree boils down to the path chosen, whether it be applicative, theoretical, or practical. Computer Science is diverse and can be applied to pretty much any other discipline.
If you have any questions about this article or suggestions for future articles please send me a PM on the forums.