We built computers to expand our brains, to solve complicated algorithms in a few seconds. In a few decades it turned out to be useful for many other things; running the internet, artificial Intelligence and bringing comic books to life. Computers are becoming smaller, more powerful and extremely fast everyday. As a rough estimate, there is more power in an iPhone than there was in the entire world in the 60’s and the Apollo moon landing could have been done just using couple of Nintendos or Play-stations. According to Wikipedia, Computer science is the study of processes that interact with data and that can be represented as data in the form of programs. It enables the use of algorithms to manipulate, store, and communicate digital information...Read more. A computer scientist studies the theory of computation and the practice of designing software systems.
It can be divided into three parts:
Theoratical Computer Science.
Computer Engineering.
Applications (as we may call them).
Before we dive into these three fields, let’s talk about the father of computer science, Alan Turing, who built one of the leading first general purpose computers as he stated there are only five actions that a computer has to perform in order to do "anything". Turing machine contains several parts:
Infinetely long tape that stores data and variables in it (we call it Ram today).
Head that moves and read from that tape (CPU).
State Register that stores state of the Head and think about every possible instruction (memory).
Although computers nowadays contain more parts like permanent storage or GPU but it’s the same concept. Every computer built based on Turing machine is using Lambda Calculus.
Back to our main topic, Computability theory attempts to classify and differentiate between what is and is not computable. No matter how fast, large and powerful computers are nowadays, There are still some problems that simply can not be solved, the famous example of that is ‘The Halting Problem’ (see more) where you try to predict weather the computer will stop running or carry on forever (image a man tries to reach the end point inside a circle or a loop).
On the other hand, there are many problems that can be solved in theory, but practically it will take too much memory or more steps than the entire universe lifetime itself. Computational Complexity, which we will talk about it in another article, attempts to categories these problems according to how they scale.
Computer scientists have a few tricks to solve these complicated problems they face, using Algorithms, but you will never know if they get the best answer.
An algorithm is simply a set of instructions that tries to solve a particular problem (consider it a recipe of how a program work). Computer scientists put a lot of work into developing algorithms to get the best of a program. Different algorithms can get to the same result such as Bubble sorting and Merge Sorting but some algorithms are just more efficient than others.
There are many more other fields in “Theoretical computer”,such as Information Theory, which studies the properties of information and how this information can be managed, stored and communicated with each other such as compressing an image. Also Cryptography is considered a part of theoretical computer in which scientists tries to keep the information sent over the internet secret.
There’s still a lot more that we can talk about, more and more such as Logic, Graph Theory, Parallel Programming, Data Structure.. and the list goes on and on.
Designing a computer is more a bit of a challenge. Computers need to be capable of solving many different kinds of problems and a wide range of them in very short time. This where computer engineering intervene.
Every single task that runs on a computer or a mobile phone has to go through the core of the computer which is the CPU. Imagine you are listening to music, browsing the internet and chatting with a friend while you are waiting for the latest update of your favorite game to be finished all at the same time, the CPU has to go back and forth between these jobs in order to make sure that everything gets done in a reasonable time and in the most efficient way which can be very hard and very difficult.
Multiprocessing helps to speed up the process because the CPU has several cores that can be assigned to different tasks at the same time.
Computer architecture is how the processor is designed to perform tasks. CPUs are optimized for general purposes, GPUs are optimized for graphics and FPGA are optimized for performing a very narrow range of tasks in an extremely short time.
On top of a computer hardware there are many layers of software written by programmers using many different programming languages. A programming language is how humans communicate with a computer and tells it what to do and how to do it, from a low level language like Assembly and C through to high level languages like C#, Java, Python, Javascript, PHP or Swift for coding websites and applications. In general, the closer you get to the hardware of a computer, the more difficult it is to use the language.
At all stages, these set of instructions written in programming language need to be compiled into raw CPU instructions, this can be done by compilers.
Compilers are also programs, but design a programming language along with its compiler can be very hard because a software engineer has to make sure that everything is working fine and is easy to use as possible as it can be, but also to be many-sided enough to allow programmers using it to build their crazy ideas.
Now, this brings us to another fun part, Software Engineering, writing a massive lines of instructions telling the computer what to do. Building a good software is an art, because it is not easy to translate your creative crazy ideas into specific logical instructions in a specific language. There are many best practices and design philosophies that programmers follow such as unit testing, formal methods, version control and object oriented design.
When you are going on vacation or taking a ride, and you want to get the best trip for the money you got or you want to spend, you are trying harder and harder to optimize the problem. Using a computer to solve real world problems, such as this optimization problem, underlie lots of programs, websites and mobile applications we use.
Computers can extend our brains, computer programmers researches nowadays is developing computer systems that can think for themselves; Artificial Intelligence (A.I). There are many paths that can be taken to reach A.I but one of the most promising is machine learning. Machine learning aims to develop algorithms and techniques to enable computers to learn from large amounts of data then use what they have learnt to do something useful like making a decision, classify things, play music, etc.
Closely to machine learning is computer vision, trying to make computers able to see objects and images the way we do which uses image processing techniques.
Natural language processing aims to get computers to speak and communicate with us using human language, processing large amounts of data and words in milliseconds.
Big data, internet of things, hacking, computational science, virtual reality, augmented reality and robotics; more fields that you can think about. Despite the fact that the hardware is hitting some hard limits, Computers have had a huge impact on human society and it is going to be interesting to see where this technology will lead us.
Computers have massively improved in the last couple of decades, need one more proof?! Have a look at this picture, things we thought is impossible became one-button-click, and computers are deeply involved in it. No better time to dive in deeply in these fields, than right now!
Don’t forget to check out our blog, and don’t hesitate to consult us about your idea.