# Introduction

**The Programmer's Handbook** is a [GitBook](https://www.gitbook.com/) that serves a source for learning and review for computer scientists and software developers written by Michael Wilson.

It covers a wide range of topics,  including [Data Structures](/data-structures/intro), [Algorithms](/algorithms/intro), [Operating Systems](/operating-systems/intro), [Languages](/computing-theory/intro), and more. See the Table of Contents at the left for the full list of pages.


# Introduction

Data Structures


# Arrays


# Lists


# Stacks and Queues


# Hash Tables


# Trees


# Tries


# Graphs


# Introduction


# Sorting


# Graph


# Greedy


# Dynamic Programming


# Backtracking


# Branch and Bound


# Divide and Conquer


# Introduction


# Introduction


# Combinational Logic


# Assembly Instruction Sets


# Floating Point Representation


# Finite State Machines and CPUs


# Pipelining


# Caching


# Introduction

## Why have an Operating System?

While we can run applications directly on hardware without an operating system (think of [Arduino](https://www.arduino.cc/)), as computers have become more powerful we have wanted to run more and more complicated software on our machines, often alongside other applications. If we wanted to run more than one application on an Arduino, not only would there be no mechanism for the applications to share resources but if you wanted to run the same applications on different hardware you would need to rewrite a lot of code. Operating systems provide an **abstraction** for hardware, allowing both [portability](https://en.wikipedia.org/wiki/Software_portability) and the efficient sharing of resources.

## What is an Operating System?

The operating system is the **software layer** between user applications and computer hardware.


# Concurrency


# Synchronization


# Virtual Memory


# File Systems


# Introduction


# Introduction


# C++


# Python


# Go

> Go is expressive, concise, clean, and efficient. Its concurrency mechanisms make it easy to write programs that get the most out of multicore and networked machines, while its novel type system enables flexible and modular program construction. Go compiles quickly to machine code yet has the convenience of garbage collection and the power of run-time reflection. It's a fast, statically typed, compiled language that feels like a dynamically typed, interpreted language. - [golang.org](https://golang.org/doc/)


# Introduction


# Commands

A collection of useful Linux commands and how to use them.

### The Usual Suspects

#### `man` - what does the \_\_\_\_ command do?

The `man` command allows the user to view the manual of any command that has one. Try it out with `man man`, you'll see a list of uppercase informative sections including NAME DESCRIPTION and OPTIONS.&#x20;

#### `cd` - how do i get around?

The change directory command lets you move between directories.

#### `ls` - show me everything in this directory

#### `pwd` - where am i?

#### `mv` - let's move this file

#### `rm` - i would like to destroy this file or directory

#### `alias` - i want to make my own cool linux commands

### The IO Stuff

#### `cat` - print all the things!

#### `less` - i want to look at a file in my terminal without using a text editor

#### `head` - only show me the top part

#### `tail` - only show me the bottom part

Prints out the last 10 lines of the input by default.

* `-n` specify the number of lines to output
* `-f` prevents `tail` from closing and waits for additional output; useful for printing out a file as it is appended to

### The Super Powerful Ones That Don't Make Sense

#### `sed` - i want to edit a stream of text


# Directories

How is the Linux file system laid out and what do all those weird three letter words (etc, var, bin...) mean?


