Less Wrong is a community blog devoted to refining the art of human rationality. Please visit our About page for more information.

Computer Science and Programming: Links and Resources

29 Post author: XiXiDu 29 May 2012 01:17PM

Updated Version @ LW Wiki: wiki.lesswrong.com/wiki/Programming_resources

Contents

 

How Computers Work

1. CODE The Hidden Language of Computer Hardware and Software

The book intends to show a layman the basic mechanical principles of how computers work, instead of merely summarizing how the different parts relate. He starts with basic principles of language and logic and then demonstrates how they can be embodied by electrical circuits, and these principles give him an opening to describe in principle how computers work mechanically without requiring very much technical knowledge. Although it is not possible in a medium sized book for layman to describe the entire technical summary of a computer, he describes how and why it is possible that elaborate electronics can act in the ways computers do. In the introduction, he contrasts his own work with those books which "include pictures of trains full of 1s and 0s."

2. The Elements of Computing Systems: Building a Modern Computer from First Principles

Indeed, the best way to understand how computers work is to build one from scratch, and this textbook leads students through twelve chapters and projects that gradually build a basic hardware platform and a modern software hierarchy from the ground up. In the process, the students gain hands-on knowledge of hardware architecture, operating systems, programming languages, compilers, data structures, algorithms, and software engineering. Using this constructive approach, the book exposes a significant body of computer science knowledge and demonstrates how theoretical and applied techniques taught in other courses fit into the overall picture.

3. The Write Great Code Series (A Solid Foundation in Software Engineering for Programmers)

Write Great Code Volume I: Understanding the Machine

This, the first of four volumes, teaches important concepts of machine organization in a language-independent fashion, giving programmers what they need to know to write great code in any language, without the usual overhead of learning assembly language to master this topic. The Write Great Code series will help programmers make wiser choices with respect to programming statements and data types when writing software.

Write Great Code Volume II: Thinking Low-Level, Writing High-Level

...a good question to ask might be "Is there some way to write high-level language code to help the compiler produce high-quality machine code?" The answer to this question is "yes" and Write Great Code, Volume II, will teach you how to write such high-level code. This volume in the Write Great Code series describes how compilers translate statements into machine code so that you can choose appropriate high-level programming language statements to produce executable code that is almost as good as hand-optimized assembly code.

4. The Art of Assembly Language Programming

Assembly is a low-level programming language that's one step above a computer's native machine language. Although assembly language is commonly used for writing device drivers, emulators, and video games, many programmers find its somewhat unfriendly syntax intimidating to learn and use.

Since 1996, Randall Hyde's The Art of Assembly Language has provided a comprehensive, plain-English, and patient introduction to assembly for non-assembly programmers. Hyde's primary teaching tool, High Level Assembler (or HLA), incorporates many of the features found in high-level languages (like C, C++, and Java) to help you quickly grasp basic assembly concepts. HLA lets you write true low-level code while enjoying the benefits of high-level language programming.

5. The Art of Computer Programming

This work is not about computer programming in the narrow sense, but about the algorithms and methods which lie at the heart of most computer systems.

At the end of 1999, these books were named among the best twelve physical-science monographs of the century by American Scientist, along with: Dirac on quantum mechanics, Einstein on relativity, Mandelbrot on fractals, Pauling on the chemical bond, Russell and Whitehead on foundations of mathematics, von Neumann and Morgenstern on game theory, Wiener on cybernetics, Woodward and Hoffmann on orbital symmetry, Feynman on quantum electrodynamics, Smith on the search for structure, and Einstein's collected papers.

An Overview of Computer Programming

1. Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages

Ruby, Io, Prolog, Scala, Erlang, Clojure, Haskell. With Seven Languages in Seven Weeks, by Bruce A. Tate, you'll go beyond the syntax-and beyond the 20-minute tutorial you'll find someplace online. This book has an audacious goal: to present a meaningful exploration of seven languages within a single book. Rather than serve as a complete reference or installation guide, Seven Languages hits what's essential and unique about each language. Moreover, this approach will help teach you how to grok new languages.

For each language, you'll solve a nontrivial problem, using techniques that show off the language's most important features. As the book proceeds, you'll discover the strengths and weaknesses of the languages, while dissecting the process of learning languages quickly--for example, finding the typing and programming models, decision structures, and how you interact with them.

2. Programming Language Pragmatics

The ubiquity of computers in everyday life in the 21st century justifies the centrality of programming languages to computer science education.  Programming languages is the area that connects the theoretical foundations of computer science, the source of problem-solving algorithms, to modern computer architectures on which the corresponding programs produce solutions.  Given the speed with which computing technology advances in this post-Internet era, a computing textbook must present a structure for organizing information about a subject, not just the facts of the subject itself.  In this book, Michael Scott broadly and comprehensively presents the key concepts of programming languages and their implementation, in a manner appropriate for computer science majors. 

3. An Introduction to Functional Programming Through Lambda Calculus

This well-respected text offers an accessible introduction to functional programming concepts and techniques for students of mathematics and computer science. The treatment is as nontechnical as possible, assuming no prior knowledge of mathematics or functional programming. Numerous exercises appear throughout the text, and all problems feature complete solutions.

4. How to Design Programs (An Introduction to Computing and Programming)

This introduction to programming places computer science in the core of a liberal arts education. Unlike other introductory books, it focuses on the program design process. This approach fosters a variety of skills--critical reading, analytical thinking, creative synthesis, and attention to detail--that are important for everyone, not just future computer programmers.The book exposes readers to two fundamentally new ideas. First, it presents program design guidelines that show the reader how to analyze a problem statement; how to formulate concise goals; how to make up examples; how to develop an outline of the solution, based on the analysis; how to finish the program; and how to test. Each step produces a well-defined intermediate product. Second, the book comes with a novel programming environment, the first one explicitly designed for beginners.

5. Structure and Interpretation of Computer Programs

Using a dialect of the Lisp programming language known as Scheme, the book explains core computer science concepts, including abstraction, recursion, interpreters and metalinguistic abstraction, and teaches modular programming.

The program also introduces a practical implementation of the register machine concept, defining and developing an assembler for such a construct, which is used as a virtual machine for the implementation of interpreters and compilers in the book, and as a testbed for illustrating the implementation and effect of modifications to the evaluation mechanism. Working Scheme systems based on the design described in this book are quite common student projects.

Computer Science and Computation

1. The Annotated Turing: A Guided Tour Through Alan Turing's Historic Paper on Computability and the Turing Machine

Mathematician Alan Turing invented an imaginary computer known as the Turing Machine; in an age before computers, he explored the concept of what it meant to be computable, creating the field of computability theory in the process, a foundation of present-day computer programming.

The book expands Turing’s original 36-page paper with additional background chapters and extensive annotations; the author elaborates on and clarifies many of Turing’s statements, making the original difficult-to-read document accessible to present day programmers, computer science majors, math geeks, and others.

2. New Turing Omnibus (New Turning Omnibus : 66 Excursions in Computer Science)

This text provides a broad introduction to the realm of computers. Updated and expanded, "The New Turing Omnibus" offers 66 concise articles on the major points of interest in computer science theory, technology and applications. New for this edition are: updated information on algorithms, detecting primes, noncomputable functions, and self-replicating computers - plus completely new sections on the Mandelbrot set, genetic algorithms, the Newton-Raphson Method, neural networks that learn, DOS systems for personal computers, and computer viruses.

3. Udacity

Udacity is a private educational organization founded by Sebastian Thrun, David Stavens, and Mike Sokolsky, with the stated goal of democratizing education

It is the outgrowth of free computer science classes offered in 2011 through Stanford University. As of May 2012 Udacity has six active courses.

The first two courses ever launched on Udacity both started on 20th February, 2012, entitled "CS 101: Building a Search Engine", taught by Dave Evans, from the University of Virginia, and "CS 373: Programming a Robotic Car" taught by Thrun. Both courses use Python.

4. Introduction to Artificial Intelligence

A bold experiment in distributed education, "Introduction to Artificial Intelligence" will be offered free and online to students worldwide from October 10th to December 18th 2011. The course will include feedback on progress and a statement of accomplishment. Taught by Sebastian Thrun and Peter Norvig, the curriculum draws from that used in Stanford's introductory Artificial Intelligence course. The instructors will offer similar materials, assignments, and exams.

Artificial Intelligence is the science of making computer software that reasons about the world around it. Humanoid robots, Google Goggles, self-driving cars, even software that suggests music you might like to hear are all examples of AI. In this class, you will learn how to create this software from two of the leaders in the field. Class begins October 10.

Supplementary Resources: Mathematics and Algorithms

1. Concrete Mathematics: A Foundation for Computer Science

This book introduces the mathematics that supports advanced computer programming and the analysis of algorithms. The primary aim of its well-known authors is to provide a solid and relevant base of mathematical skills - the skills needed to solve complex problems, to evaluate horrendous sums, and to discover subtle patterns in data. It is an indispensable text and reference not only for computer scientists - the authors themselves rely heavily on it! - but for serious users of mathematics in virtually every discipline.

2. Algorithms

The textbook Algorithms, 4th Edition by Robert Sedgewick and Kevin Wayne surveys the most important algorithms and data structures in use today.

3. Introduction to Algorithms

Some books on algorithms are rigorous but incomplete; others cover masses of material but lack rigor. Introduction to Algorithms uniquely combines rigor and comprehensiveness. The book covers a broad range of algorithms in depth, yet makes their design and analysis accessible to all levels of readers. Each chapter is relatively self-contained and can be used as a unit of study. The algorithms are described in English and in a pseudocode designed to be readable by anyone who has done a little programming. The explanations have been kept elementary without sacrificing depth of coverage or mathematical rigor.

Practice

1. Project Euler

Project Euler is a series of challenging mathematical/computer programming problems that will require more than just mathematical insights to solve. Although mathematics will help you arrive at elegant and efficient methods, the use of a computer and programming skills will be required to solve most problems.

2. The Python Challenge

Python Challenge is a game in which each level can be solved by a bit of (Python) programming.

3. CodeChef Programming Competition

CodeChef is a global programming community. We host contests, trainings and events for programmers around the world. Our goal is to provide a platform for programmers everywhere to meet, compete, and have fun.

4. Write your own programs.

Python

pyscripter

An open-source Python Integrated Development Environment (IDE)

Khan Academy

Introduction to programming and computer science (using Python)

1. Invent Your Own Computer Games with Python

“Invent Your Own Computer Games with Python” is a free book (as in, open source) and a free eBook (as in, no cost to download) that teaches you how to program in the Python programming language. Each chapter gives you the complete source code for a new game, and then teaches the programming concepts from the example.

“Invent with Python” was written to be understandable by kids as young as 10 to 12 years old, although it is great for anyone of any age who has never programmed before.

2. Learn Python The Hard Way

Have you always wanted to learn how to code but never thought you could? Are you looking to build a foundation for more complex coding? Do you want to challenge your brain in a new way? Then Learn Python the Hard Way is the book for you.

3. Python for Software Design: How to Think Like a Computer Scientist

Think Python is an introduction to Python programming for beginners. It starts with basic concepts of programming, and is carefully designed to define all terms when they are first used and to develop each new concept in a logical progression. Larger pieces, like recursion and object-oriented programming are divided into a sequence of smaller steps and introduced over the course of several chapters.

4. Python Programming: An Introduction to Computer Science

This book is suitable for use in a university-level first course in computing (CS1), as well as the increasingly popular course known as CS0. It is difficult for many students to master basic concepts in computer science and programming. A large portion of the confusion can be blamed on the complexity of the tools and materials that are traditionally used to teach CS1 and CS2. This textbook was written with a single overarching goal: to present the core concepts of computer science as simply as possible without being simplistic.

5. Practical Programming: An Introduction to Computer Science Using Python

Computers are used in every part of science from ecology to particle physics. This introduction to computer science continually reinforces those ties by using real-world science problems as examples. Anyone who has taken a high school science class will be able to follow along as the book introduces the basics of programming, then goes on to show readers how to work with databases, download data from the web automatically, build graphical interfaces, and most importantly, how to think like a professional programmer.

6. The Quick Python Book

The Quick Python Book, Second Edition, is a clear, concise introduction to Python 3, aimed at programmers new to Python. This updated edition includes all the changes in Python 3, itself a significant shift from earlier versions of Python.

The book begins with basic but useful programs that teach the core features of syntax, control flow, and data structures. It then moves to larger applications involving code management, object-oriented programming, web development, and converting code from earlier versions of Python.

Haskell

The Haskell Platform

The Haskell Platform is the easiest way to get started with programming Haskell. It comes with all you need to get up and running. Think of it as "Haskell: batteries included".

1. Haskell in 5 steps

This page will help you get started as quickly as possible.

2. Learn Haskell in 10 minutes

3. A brief introduction to Haskell

4. Programming in Haskell

Haskell is one of the leading languages for teaching functional programming, enabling students to write simpler and cleaner code, and to learn how to structure and reason about programs. This introduction is ideal for beginners: it requires no previous programming experience and all concepts are explained from first principles via carefully chosen examples. Each chapter includes exercises that range from the straightforward to extended projects, plus suggestions for further reading on more advanced topics. The author is a leading Haskell researcher and instructor, well-known for his teaching skills. The presentation is clear and simple, and benefits from having been refined and class-tested over several years. The result is a text that can be used with courses, or for self-learning. Features include freely accessible Powerpoint slides for each chapter, solutions to exercises and examination questions (with solutions) available to instructors, and a downloadable code that's fully compliant with the latest Haskell release.

5. Learn You a Haskell for Great Good!

Learn You a Haskell, the funkiest way to learn Haskell, which is the best functional programming language around. You may have heard of it. This guide is meant for people who have programmed already, but have yet to try functional programming.

6. Real World Haskell

This easy-to-use, fast-moving tutorial introduces you to functional programming with Haskell. You'll learn how to use Haskell in a variety of practical ways, from short scripts to large and demanding applications. Real World Haskell takes you through the basics of functional programming at a brisk pace, and then helps you increase your understanding of Haskell in real-world issues like I/O, performance, dealing with data, concurrency, and more as you move through each chapter.

7. The Haskell Road to Logic, Maths and Programming

The textbook by Doets and van Eijck puts the Haskell programming language systematically to work for presenting a major piece of logic and mathematics. The reader is taken through chapters on basic logic, proof recipes, sets and lists, relations and functions, recursion and co-recursion, the number systems, polynomials and power series, ending with Cantor's infinities. The book uses Haskell for the executable and strongly typed manifestation of various mathematical notions at the level of declarative programming. The book adopts a systematic but relaxed mathematical style (definition, example, exercise, ...); the text is very pleasant to read due to a small amount of anecdotal information, and due to the fact that definitions are fluently integrated in the running text. An important goal of the book is to get the reader acquainted with reasoning about programs. 

Common Lisp

1. Land of Lisp: Learn to Program in Lisp, One Game at a Time!

Lisp has been hailed as the world's most powerful programming language, but its cryptic syntax and academic reputation can be enough to scare off even experienced programmers. Those dark days are finally over—Land of Lisp brings the power of functional programming to the people!

With his brilliantly quirky comics and out-of-this-world games, longtime Lisper Conrad Barski teaches you the mysteries of Common Lisp. You'll start with the basics, like list manipulation, I/O, and recursion, then move on to more complex topics like macros, higher order programming, and domain-specific languages. Then, when your brain overheats, you can kick back with an action-packed comic book interlude!

2. Practical Common Lisp

Practical Common Lisp presents a thorough introduction to Common Lisp, providing you with an overall understanding of the language features and how they work. Over a third of the book is devoted to practical examples such as the core of a spam filter and a web application for browsing MP3s and streaming them via the Shoutcast protocol to any standard MP3 client software (e.g., iTunes, XMMS, or WinAmp). In other "practical" chapters, author Peter Seibel demonstrates how to build a simple but flexible in-memory database, how to parse binary files, and how to build a unit test framework in 26 lines of code.

3. ANSI Common LISP

Teaching users new and more powerful ways of thinking about programs, this two-in-one text contains a tutorial—full of examples—that explains all the essential concepts of Lisp programming, plus an up-to-date summary of ANSI Common Lisp, listing every operator in the language. Informative and fun, it gives users everything they need to start writing programs in Lisp both efficiently and effectively, and highlights such innovative Lisp features as automatic memory management, manifest typing, closures, and more. Dividing material into two parts, the tutorial half of the book covers subject-by-subject the essential core of Common Lisp, and sums up lessons of preceding chapters in two examples of real applications: a backward-chainer, and an embedded language for object-oriented programming. Consisting of three appendices, the summary half of the book gives source code for a selection of widely used Common Lisp operators, with definitions that offer a comprehensive explanation of the language and provide a rich source of real examples; summarizes some differences between ANSI Common Lisp and Common Lisp as it was originally defined in 1984; and contains a concise description of every function, macro, and special operator in ANSI Common Lisp. The book concludes with a section of notes containing clarifications, references, and additional code.

4. Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp

Paradigms of AI Programming is the first text to teach advanced Common Lisp techniques in the context of building major AI systems. By reconstructing authentic, complex AI programs using state-of-the-art Common Lisp, the book teaches students and professionals how to build and debug robust practical programs, while demonstrating superior programming style and important AI concepts. The author strongly emphasizes the practical performance issues involved in writing real working programs of significant size. Chapters on troubleshooting and efficiency are included, along with a discussion of the fundamentals of object-oriented programming and a description of the main CLOS functions. This volume is an excellent text for a course on AI programming, a useful supplement for general AI courses and an indispensable reference for the professional programmer.

5. Let Over Lambda

Let Over Lambda is one of the most hardcore computer programming books out there. Starting with the fundamentals, it describes the most advanced features of the most advanced language: COMMON LISP. The point of this book is to expose you to ideas that you might otherwise never be exposed to.

6. Lisp as the Maxwell’s equations of software

These are Maxwell’s equations. Just four compact equations. With a little work it’s easy to understand the basic elements of the equations – what all the symbols mean, how we can compute all the relevant quantities, and so on. But while it’s easy to understand the elements of the equations, understanding all their consequences is another matter. Inside these equations is all of electromagnetism – everything from antennas to motors to circuits. If you think you understand the consequences of these four equations, then you may leave the room now, and you can come back and ace the exam at the end of semester.

R

RStudio

RStudio™ is a free and open source integrated development environment (IDE) for R. You can run it on your desktop (Windows, Mac, or Linux) or even over the web using RStudio Server.

1. R Videos

2. R Tutorials

3. R Tutorials from Universities Around the World

Here is a list of FREE R tutorials hosted in official website of universities around the world.

4. R-bloggers

Here you will find daily news and tutorials about R, contributed by over 300 bloggers.

5. The Art of R Programming: A Tour of Statistical Software Design

R is the world's most popular language for developing statistical software: Archaeologists use it to track the spread of ancient civilizations, drug companies use it to discover which medications are safe and effective, and actuaries use it to assess financial risks and keep economies running smoothly.

The Art of R Programming takes you on a guided tour of software development with R, from basic types and data structures to advanced topics like closures, recursion, and anonymous functions. No statistical knowledge is required, and your programming skills can range from hobbyist to pro.

Along the way, you'll learn about functional and object-oriented programming, running mathematical simulations, and rearranging complex data into simpler, more useful formats.

6. Introduction to Statistical Thinking (With R, Without Calculus)

The target audience for this book is college students who are required to learn statistics, students with little background in mathematics and often no motivation to learn more.

7. Doing Bayesian Data Analysis: A Tutorial with R and BUGS

There is an explosion of interest in Bayesian statistics, primarily because recently created computational methods have finally made Bayesian analysis obtainable to a wide audience. Doing Bayesian Data Analysis, A Tutorial Introduction with R and BUGS provides an accessible approach to Bayesian data analysis, as material is explained clearly with concrete examples. The book begins with the basics, including essential concepts of probability and random sampling, and gradually progresses to advanced hierarchical modeling methods for realistic data. The text delivers comprehensive coverage of all scenarios addressed by non-Bayesian textbooks--t-tests, analysis of variance (ANOVA) and comparisons in ANOVA, multiple regression, and chi-square (contingency table analysis).

This book is intended for first year graduate students or advanced undergraduates. It provides a bridge between undergraduate training and modern Bayesian methods for data analysis, which is becoming the accepted research standard. Prerequisite is knowledge of algebra and basic calculus. Free software now includes programs in JAGS, which runs on Macintosh, Linux, and Windows.

Comments (47)

Comment author: lsparrish 29 May 2012 05:53:36PM *  12 points [-]

I'm a big fan of the interactive approach:

IMHO any tutorial that starts out with "first install the compiler" is suboptimal for a procrastinator to get started with because Delay is part of the procrastination equation. Also reading is not the same thing as typing.

Once you've typed in a bunch of code in a language it increases your Expectancy, making it easier to dive into the steps of installing an IDE and following along from a book.

Comment author: MBlume 29 May 2012 11:26:13PM 7 points [-]

Note that if you intend to learn a bunch of languages, starting from a linux box means that "first install the compiler" is just "sudo apt-get install haskell-platform", or for Python, a no-op

Comment author: lsparrish 30 May 2012 01:40:12AM 2 points [-]

This is a good point. Being on Linux as a starting point eliminates a lot of trivial inconveniences to programming. For example, it's simple to clone a git repo. Also you're more likely to actually use the command line for everyday stuff, which automatically teaches some aspects of programming.

Comment author: pleeppleep 30 May 2012 01:35:30PM 2 points [-]

I know absolutely nothing about computers or programming, and I really want to. I have no money to put towards learning such things at the moment. Can someone please direct me to the best place to start?

Comment author: XiXiDu 30 May 2012 01:48:06PM *  1 point [-]

Can someone please direct me to the best place to start?

See the Python section above and try the free Khan Academy videos. If that is, or isn't, too hard then you should try to read the first book linked in that section, which is also free.

If you are unable to install Python and pyscripter then use this web-based interpreter first.

Comment author: pleeppleep 30 May 2012 08:26:40PM 0 points [-]

Thank you

Comment author: thomblake 30 May 2012 03:15:24PM 1 point [-]

If what you want to learn is programming, I recommend Udacity's CS101. It's free and pretty awesome.

"know about computers" is a bit more vague of a problem. The best way to start is to poke at them.

Comment author: dugancm 30 May 2012 01:39:09AM 2 points [-]

For those who've never used a command line interface and find them intimidating (one of my hurdles on the way to learning to program), I'd recommend Learn Code the Hard Way: The Command Line Crash Course. The exercises are designed to trip you up and force you to figure some things out for yourself, which has quickly increased my confidence and self-reliance so far.

I have not finished the book, but am already getting slightly addicted to "commanding" my computer to do my bidding instead of having to dig my way through windows explorer and context menus to get anything done. Am I right in thinking this may be good prep for migrating to linux?

Comment author: dbaupp 30 May 2012 12:24:05PM *  0 points [-]

Am I right in thinking this may be good prep for migrating to linux?

Yes. And the shells (the command-line program: normally cmd.exe on Windows and something like bash or zsh on Unix) on Linux/OS X/Unix are much much more powerful, so it's even better.

(The Unix shells are actually (Turing-)complete programming languages and non-trivial programs can be implemented in them. Although this isn't a good idea normally.)

(Edit: it seems that that book teaches you to use Powershell, which is similar to the Unix shells (i.e. it doesn't suck), so this comment is probably irrelevant.)

Comment author: shokwave 30 May 2012 05:39:48AM -1 points [-]

Am I right in thinking this may be good prep for migrating to linux?

It is, although I'd seriously consider OS X instead of linux. You get the terminal, same as always, but it's nice to have the amenities there too.

Comment author: Grognor 29 May 2012 07:33:37PM *  6 points [-]

For crying out loud, why do you keep making these things posts instead of wiki articles?

Actually, I know the answer to that question, but I'm trying to communicate "stop doing that!"

Comment author: thomblake 29 May 2012 07:38:32PM *  9 points [-]

I thought that as a general policy Lw wiki articles proceed from good Lw posts.

Comment author: Grognor 29 May 2012 11:00:14PM 6 points [-]

And yet, this has no wiki article, despite how obviously superior it would be as one.

Comment author: XiXiDu 01 June 2012 11:48:55AM 0 points [-]
Comment author: damage 30 May 2012 03:24:34AM *  -1 points [-]

Interesting thread, I see these huge lists all the time full of links, resources etc. But something to think about is that someone who wants to program most likely already has a plan. And if they don't, I don't think they have the time or ability to decipher this material.

Comment author: dbaupp 30 May 2012 12:30:39PM 0 points [-]

But something to think about is that someone who wants to program most likely already has a plan

I'm sure there are many people who have heard about, and are interested by, this "coding" thing and maybe even had people encourage them to learn something, but have no idea where to start, and don't even know enough jargon to be able to effectively find a starting place.

Lists like these provide a distilled subset of the huge amount of information that allows beginners to start somewhere. (I do think this list could be better arranged to target beginners: more emphasis on a small number of Python tutorials to give a good entry point.)

Comment author: shokwave 30 May 2012 12:51:17PM 1 point [-]

Lists like these provide a distilled subset of the huge amount of information that allows beginners to start somewhere.

It's my feeling that this list provides a beginner or moderate programmer with the resources to become a moderate or advanced computer scientist.

Comment author: dbaupp 30 May 2012 04:08:45PM 1 point [-]

I agree, with the exception of most of the links in the Python section: these are complete-beginner appropriate.

Comment author: John_Maxwell_IV 29 May 2012 11:15:48PM 1 point [-]

It's too bad there aren't any algorithms books that challenge you to discover algorithms for yourself, maybe with a graduated system of hints. The classes in data structures and algorithms I've taken felt like reading a bunch of spoilers...

Comment author: arundelo 30 May 2012 03:51:04AM *  8 points [-]

"[D]iscover algorithms for yourself" -- The Little Schemer (mentioned recently by shokwave) is this, but for things defined in terms of themselves (i.e., recursive data structures and recursive functions). It is a programmed text, which means you read it with a card in your hand covering up part of the page. The book asks a question, then you come up with an answer, then you move the card and check your answer. The authors play around with this format a bit, sometimes asking you questions that you have to make an educated guess at, or asking you questions that you have to think about long enough to realize that you don't yet know how to answer them.

From the preface:

What You Need to Know to Read This Book

The reader must be comfortable reading English, recognizing numbers, and counting.

The notational system the book uses is (a small but powerful subset of) the Lisp dialect Scheme. In the opening pages, you learn what atoms and lists are. By page 21 you have seen how to write a recursive function that tells you whether every item in a list is an atom. Later you write recursive functions on lists of lists (i.e., tree structures) and define Peano arithmetic, and by the end of the book you have written a Scheme interpreter (a function that can evaluate any other function).

Recursive functions were mind-benders to me at first. Now, thanks to The Little Schemer, I eat them for breakfast.

To check your understanding, you can type this stuff into a Scheme interpreter (or a Lisp one -- the book has footnotes showing what you'll need to change), but it's possible to go through it with nothing but a pencil and paper. (I went through most of it just typing my answers into a text editor.)

The authors have honed the book (through several editions) with actual students, and it shows. Several times while reading it I thought, "Why are they asking me this again?", then it turned out the question they were asking required me to make a conceptual leap not required by the similar question from a previous page.

Disclosure: I have not yet gone through the last couple chapters frame by frame. (Edit: I finally got back to the book and finished it in June 2013.) (I have, however, written a Lisp interpreter [with lexical scope, the scoping style used by Scheme and other modern Lisps].)

| This space reserved for |
|                         |
|                         |
|                         |
|      JELLY STAINS!      |
Comment author: shokwave 30 May 2012 05:37:53AM 0 points [-]

(cons upvote arundel-post)

Comment author: sketerpot 30 May 2012 05:45:47AM *  5 points [-]

As written, that wouldn't actually upvote anything; it would evaluate the variables upvote and arundel-post and build a cons cell containing them, which would serve as the value of the expression. Since we're talking scheme, functions called for their side-effects customarily end with an exclamation mark. I would write something like this:

(upvote! arundel-post)

Here endeth the extreme pedantry! And now, before I forget, I'm going to go upvote the post instead of just talking about upvoting it.

Comment author: shokwave 30 May 2012 07:39:15AM 1 point [-]

So, when the Little Schemer told me to cons some cake onto my face...

I get to have my cake and eat it too?

Comment author: beoShaffer 30 May 2012 12:34:33AM 0 points [-]

It's too bad there aren't any algorithms books that challenge you to discover algorithms for yourself, maybe with a graduated system of hints.

The classroom segments of several of my classes have been like this, though the collaboration between students aspect was a mixed blessing.

Comment author: shokwave 29 May 2012 01:27:01PM 1 point [-]

Excellent!

Comment author: Curiouskid 07 July 2012 02:04:34AM 0 points [-]

I've taken the AP CS class at my high school (so, I know a bit of Java). I also just finished the CS101 class on Udacity (which was lots of fun). However, after trying to do the Udacity CS253 class, I noticed that when I got stuck, there was less help (unlike CS101 and my AP CS class). It's basically impossible to move forward when you're stuck unless you have somebody experienced hovering over you. It's also not too fun to bug all your friends to help you do something really basic.

My question is which of these resources can you use without getting hopelessly stuck? Alternatively, what can you do if you're hopelessly stuck other than bug your friends?

Comment author: dbaupp 09 September 2012 04:18:57PM *  0 points [-]

This is a little late, but:

  • you should Google things. I know this isn't so useful often, but, especially with popular online courses, others may have posted answers, which can help you over the hump. Also, it's an intensely useful skill/habit to have.
  • you can ask questions on StackOverflow. Be careful to phrase it as "I'm learning x, and I'm not sure how to do y, could someone point me in the right direction" (where y is quite specific), rather than "Give me the code to do y" or something too general. As an essentially arbitrary example,

    I'm doing the Udacity CS253 class, and I'm not sure how to get the information after the ? out of a URL like http://mywebsite.com/blah?a=1&b=2 in Python, I would like it so that there is some way to ask for the value of a or the value of b. (I've tried Google but I don't know the correct terminology, so no luck there.)

Comment author: John_Maxwell_IV 01 June 2012 04:12:04AM 0 points [-]

This could be another good practice method: http://lesswrong.com/lw/cnh/psa_learn_to_code/6oqn

Comment author: Karmakaiser 30 May 2012 08:43:11PM 0 points [-]

Additional Resource:

A organization of textbooks complied from an /r/compsci thread

https://docs.google.com/document/d/1vMZCJl5lsMYxnBnYPj24DjrCL7qjN9tEVqxv2N9VWdY/edit?pli=1

Comment author: Athrelon 29 May 2012 11:08:32PM *  0 points [-]

Shamelessly crowdsourcing the availability heuristic: I'm trying to learn web development and have been looking for resources to learn it on my own. My goals are fairly modest; I'd like to make basically static pages and a few forms.

So far I've tried HTML/CSS tutorials, which were approachable and fun to play around with offline, but did not offer step by step instructions on how to translate that online. I also tried the Udemy course, which was great on lesson 1, but gratuitously racheted up the complexity on lesson 2 with unexplained Python code.

So, thus far, there's plenty of materials but they tend to skip some inferential distance when approached by a total noob. Does anyone have recommendations for a lesson plan that can take me all the way there?

Comment author: shokwave 30 May 2012 05:48:54AM 1 point [-]

This is the gold standard. It will both give you your goals very quickly (rails project-name, cd project-name, rails generate scaffold my-page ... where ... is some arguments to the scaffold generator that you'll have to look up and tailor to fit my-page) and give you, eventually, formidable knowledge on arguably the best web development platform going.

but did not offer step by step instructions on how to translate that online.

This is tackled by the rails tutorial - in the process of following the tutorial you will actually, step by step, host your website on an external provider and visit it in your browser like everybody else.

Comment author: John_Maxwell_IV 01 June 2012 04:17:54AM 0 points [-]

Look into web hosting. If you feel a strong need to pay nothing, x10hosting fit the bill several years ago when I felt that way. WebFaction is supposed to be good for Django. Linode could be good if you want to do a lot of difficult system administration first, which will allow you to create far more flexible setups later on. In general, just googling around for hosting opportunities is probably better than listening to me.

Comment author: dbaupp 30 May 2012 12:18:33PM 0 points [-]

This doesn't answer your question but it is something to keep in mind when doing web development: don't use w3schools as a reference (explanation), something like the Mozilla Developer Network is much better (or one of these other references).

(In fact, I just noticed: Mozilla seems to provide some tutorials, although they don't look like they are the sort of tutorials you are looking for.)

Comment author: John_Maxwell_IV 01 June 2012 04:18:57AM 0 points [-]

I like this: http://htmldog.com/

Comment author: ShardPhoenix 30 May 2012 02:09:38AM *  0 points [-]

If you just want static pages, you can just make them and then upload them to some webhost via FTP. Your ISP may offer a small amount of free webhosting, or there are various free webhosts you can find by searching. You can then use an FTP client (such as WinSCP on windows) to upload the files to the server.

For forms, it depends on exactly what you want to do (just emailing stuff can be done through pure HTML IIRC), but the easiest way would be through PHP - there are many cheap/free PHP hosts and you can just upload the PHP files to the host and have them work without further setup.

Comment author: Dr_Manhattan 29 May 2012 05:13:14PM 0 points [-]

addendum: Concepts Techniques and Models of Computer Programming

http://www.amazon.com/Concepts-Techniques-Models-Computer-Programming/dp/0262220695

Good book for intermediate programmer to get a taste of higher levels of abstraction and how they can be implemented using Oz.

Comment deleted 29 May 2012 03:48:50PM [-]
Comment author: lincolnquirk 29 May 2012 04:17:58PM 1 point [-]

Why is this crossed out?

Learn Python the Hard Way is one of the best programming books IMO if you've never programmed before.

Comment author: cousin_it 29 May 2012 06:16:10PM *  0 points [-]

I guess it's crossed out because razor11 mistakenly posted 5 copies of the same comment and someone banned the extra ones.

Comment author: razor11 29 May 2012 03:47:42PM 0 points [-]

What about Learning Python the Hard Way? Would you recommend it for a newbie to programming who wants to pursue a career in CS? I downloaded that book due to Internet recommendations but havent dived into it yet. I would appreciate insight into what i should start with if i want to program seriously for the long haul.

Comment author: sketerpot 30 May 2012 05:52:03AM 2 points [-]

For most people who've never programmed before, Learn Python the Hard Way is what I would recommend for getting started. It builds intuitions for programming little by little, without any huge "leap a tall building in a single bound!" parts of the learning curve. Most programming books are written by people who have forgotten what was once hard for them; LPtHW doesn't have that problem.

Comment author: XiXiDu 29 May 2012 04:52:09PM *  0 points [-]

What about Learning Python the Hard Way?

I did not want to overload the list. I have read 'Learn Python The Hard Way' and thought it was good but not outstanding.

I have added it to the list now as the second book to read.

Would you recommend it for a newbie to programming who wants to pursue a career in CS?

The list is mostly based on my personal research of what to read. I am not a CS person. But if you are a complete newbie then you have to start somewhere and 'Learn Python The Hard Way' is a good choice, yes.

I would appreciate insight into what i should start with if i want to program seriously for the long haul.

That's up to your background in mathematics I would say. I guess if you know all the math over at Kahn Academy (probably excluding linear algebra), then you are well equipped to start programming and probably earn money with it at some point. And here I would recommend to start with Python.

It is also possible to start with web programming. Maybe try Murach's PHP and MySQL or JavaScript and DOM Scripting, but I am not sure.

From what I have heard it is not recommended to start with languages used in an engineering, science or industrial background like C/C++ or Java. But if you are really devoted that probably won't be problem either. I recommend C++ Programming in Easy Steps followed by Accelerated C++: Practical Programming by Example. After that there are quite a few very good advanced books.

For Java check out Introduction to Programming in Java: An Interdisciplinary Approach, which is probably going to be a tough but thorough introduction.

Comment author: shokwave 30 May 2012 05:53:19AM 0 points [-]

It is also possible to start with web programming.

If you do, start with , they will serve you better than PHP. Can't speak for JavaScript except that it's harder to get started.

Comment author: thomblake 29 May 2012 06:28:23PM 1 point [-]

I recommend Udacity.