Welcome to Everything Computer Science

Computer Science (CS)

Computer Science (CS) is the study of the principles and use of computers. Simply put it's the science that deals with the theory and methods of processing information in digital computers, the design of computer hardware and software, and the applications of computers. A computer is simply a tool for a computer scientist, like a telescope for an astronomer. Teach yourself !


CS Cheat Sheet CS Intro PDF Support us on Patreon !


10 Reasons to Learn Computer Science

  1. Computing is part of everything we do!
  2. Expertise in computing enables you to solve complex, challenging problems.
  3. Computing enables you to make a positive difference in the world.
  4. Computing offers many types of lucrative careers.
  5. Computing jobs are here to stay, regardless of where you are located.
  6. Expertise in computing helps you even if your primary career choice is something else
  7. Computing offers great opportunities for true creativity and innovativeness.
  8. Computing has space for both collaborative work and individual effort.
  9. Computing is an essential part of well-rounded academic preparation.
  10. Future opportunities in computing are without boundaries.

12 Computer Science Specializations

  1. Artificial Intelligence (AI)
  2. Computer Engineering
  3. Computer Security
  4. Computer Programming
  5. Robotics
  6. Neural Networks
  7. Software Engineering
  8. Computer Graphics
  9. Machine Learning
  10. Computer Networks
  11. Computational Biology
  12. Data Science

Best Programming Languages to Learn

The following languages provide a reasonable mixture of paradigms and practical applications:

  • Javascript
    • JavaScript is a good representative of the semantic model popular in dynamic, higher-order languages such as Python, Ruby and Perl.As the native language of the web, its pragmatic advantages are unique.
  • Java
    • The primary advantage of Java application development is that it is free and its syntax bears resemblance to various C-based programming languages, making it easier for developers to understand and implement.
  • C
    • If you want to be able to do more than write a simple web app, C is a great language. If you want to write a great, fast game, C is again a great choice. You can write an entire OS in C.
  • C#
    • C# AKA C Sharp, is a programming language that is designed for building a variety of applications that run on the .NET Framework. C# is simple, powerful, type-safe, and object-oriented.
  • C++
    • You can tap directly into the Windows API and work magic with it. You can program with objects and classes or abandon them altogether and make a C-style structured program.
  • PHP
    • PHP is a lot easier to get started with than you might think. By learning just a few simple functions, you are able to do a lot of things with your website. And once you know the basics, there are a wealth of scripts available on the internet that you only need to tweak a little to fit your needs.
  • Haskell
    • Haskell is the crown jewel of the Hindley-Milner family of languages. Fully exploiting laziness, Haskell comes closest to programming in pure mathematics of any major programming language.
  • R
    • R is a language and environment for statistical computing and graphics. It is similar to the S language and environment. R can be considered as a different implementation of S.
  • Python
    • It’s an easy language that just about anyone can master in a short period of time. If you’re impatient and want to make quick scripts that deliver results (and you don’t mind very rudimentary debugging), then you should definitely explore it! See also Python Programming
  • SQL
    • SQL is everywhere, and I'm not saying that because I want you to use it. It's just a fact. I bet you have some in your pocket right now. All Android Phones and iPhones have easy access to a SQL database called SQLite and many applications on your phone use it directly. It runs banks, hospitals, universities, governments, small businesses, large ones, just about every computer and every person on the planet eventually touches something running SQL. SQL is an incredibly successful and solid technology.

Best Programming Languages to Learn !

computer science (compsci112358)

In this video I talk about the best programming languages to learn right now ! This list is based off of job prospects, compensation, and easy languages to learn.

Download Presentation


Books on Algorithm Analysis and Recurrence Relation


Online Lessons



3 Great Insights of Computer Science:


  1. Gottfried Wilhelm Leibniz's, George Boole's, Alan Turing's, Claude Shannon's, and Samuel Morse's insight:
    All the information about any computable problem can be represented using only 0 and 1 (or any other bistable pair that can flip-flop between two easily distinguishable states, such as "on/off", "magnetized/de-magnetized", "high-voltage/low-voltage", etc.).

  2. Alan Turing's insight:
    There are only five actions that a computer has to perform in order to do "anything". Every algorithm can be expressed in a language for a computer consisting of only five basic instructions:
    • move left one location;
    • move right one location;
    • read symbol at current location;
    • print 0 at current location;
    • print 1 at current location.

  3. Corrado Böhm and Giuseppe Jacopini's insight:
    There are only three ways of combining these actions (into more complex ones) that are needed in order for a computer to do "anything".
    • sequence: first do this, then do that;
    • selection: IF such-and-such is the case, THEN do this, ELSE do that;
    • repetition: WHILE such-and-such is the case DO this.


Iterative Substitution

Prove Big-Oh

Recurrence Relation By Master Theorem

Compute Time Complexity Of Code


Iteration Method

AVL Tree Balance Factors

Master Theorem

Logical Equivalence Using Laws



What every computer science major should know!

  • Portfolio versus Resume
    • A resume says nothing of a programmer's ability. Every computer science major should build a portfolio. A portfolio could be as simple as a personal blog, with a post for each project or accomplishment. A better portfolio would include per-project pages, and publicly browsable code (hosted perhaps on github or Google code). Contributions to open source should be linked and documented. A code portfolio allows employers to directly judge ability. GPAs and resumes do not.

  • Programming languages
    • Programming languages rise and fall with the solar cycle. A programmer's career should not. While it is important to teach languages relevant to employers, it is equally important that students learn how to teach themselves new languages. The best way to learn how to learn programming languages is to learn multiple programming languages and programming paradigms. The difficulty of learning the nth language is half the difficulty of the (n-1)th. Yet, to truly understand programming languages, one must implement one. Ideally, every computer science major would take a compilers class. At a minimum, every computer science major should implement an interpreter.

  • Discrete mathematics
    • Students must have a solid grasp of formal logic and of proof. Proof by algebraic manipulation and by natural deduction engages the reasoning common to routine programming tasks. Proof by induction engages the reasoning used in the construction of recursive functions. Students must be fluent in formal mathematical notation, and in reasoning rigorously about the basic discrete structures: sets, tuples, sequences, functions and power sets.

  • Data structures and algorithms
    • Students should certainly see the common (or rare yet unreasonably effective) data structures and algorithms. But, more important than knowing a specific algorithm or data structure (which is usually easy enough to look up), students must understand how to design algorithms (e.g., greedy, dynamic strategies) and how to span the gap between an algorithm in the ideal and the nitty-gritty of its implementation.

  • Theory
    • A grasp of theory is a prerequisite to research in graduate school. Theory is invaluable when it provides hard boundaries on a problem (or when it provides a means of circumventing what initially appear to be hard boundaries). Computational complexity can legitimately claim to be one of the few truly predictive theories in all of computer "science." A computer student must know where the boundaries of tractability and computability lie. To ignore these limits invites frustration in the best case, and failure in the worst.

  • Architecture
    • There is no substitute for a solid understanding of computer architecture. Everyone should understand a computer from the transistors up. The understanding of architecture should encompass the standard levels of abstraction: transistors, gates, adders, muxes, flip flops, ALUs, control units, caches and RAM. An understanding of the GPU model of high-performance computing will be important for the foreseeable future.

  • Operating systems
    • Any sufficiently large program eventually becomes an operating system. As such, a person should be aware of how kernels handle system calls, paging, scheduling, context-switching, filesystems and internal resource management. A good understanding of operating systems is secondary only to an understanding of compilers and architecture for achieving performance. Understanding operating systems (which I would interpret liberally to include runtime systems) becomes especially important when programming an embedded system without one.

  • Networking
    • Given the ubiquity of networks, a person should have a firm understanding of the network stack and routing protocols within a network. The mechanics of building an efficient, reliable transmission protocol (like TCP) on top of an unreliable transmission protocol (like IP) should not be magic to a computer guy. It should be core knowledge. People must understand the trade-offs involved in protocol design--for example, when to choose TCP and when to choose UDP. (Programmers need to understand the larger social implications for congestion should they use UDP at large scales as well.)

  • Security
    • The sad truth of security is that the majority of security vulnerabilities come from sloppy programming. The sadder truth is that many schools do a poor job of training programmers to secure their code. Developers must be aware of the means by which a program can be compromised. They need to develop a sense of defensive programming--a mind for thinking about how their own code might be attacked. Security is the kind of training that is best distributed throughout the entire curriculum: each discipline should warn students of its native vulnerabilities.

  • User experience design (UX)
    • Programmers too often write software for other programmers, or worse, for themselves. User interface design (or more broadly, user experience design) might be the most underappreciated aspect of computer science. There's a misconception, even among professors, that user experience is a "soft" skill that can't be taught. In reality, modern user experience design is anchored in empirically-wrought principles from human factors engineering and industrial design. If nothing else, engineers should know that interfaces need to make the ease of executing any task proportional to the frequency of the task multiplied by its importance. As a practicality, every programmer should be comfortable with designing usable web interfaces in HTML, CSS and JavaScript.

  • Software engineering
    • The principles in software engineering change about as fast as the programming languages do. A good, hands-on course in the practice of team software construction provides a working knowledge of the pitfalls inherent in the endeavor. It's been recommended by several readers that students break up into teams of three, with the role of leader rotating through three different projects. Learning how to attack and maneuver through a large existing codebase is a skill most programmers will have to master, and it's one best learned in school instead of on the job.

  • Artificial intelligence
    • If for no other reason than its outsized impact on the early history of computing, student should study artificial intelligence. While the original dream of intelligent machines seems far off, artificial intelligence spurred a number of practical fields, such as machine learning (I really like machine learning), data mining and natural language processing.

  • Databases
    • Databases are too common and too useful to ignore. It's useful to understand the fundamental data structures and algorithms that power a database engine, since programmers often enough reimplement a database system within a larger software system. Relational algebra and relational calculus stand out as exceptional success stories in sub-Turing models of computation. Unlike UML modeling, ER modeling seems to be a reasonable mechanism for visualing encoding the design of and constraints upon a software artifact.


Caesar Cipher C Program

C Program Greedy Algorithm

C Program Greedy Algorithm Efficient (Making Change)

Recursive Power Function C Program


Number Guessing Game C Program

Vigenere Cipher C Program

Run C Program in Command Prompt

Bubble Sort C Program