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.
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
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.
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!"
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?
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.
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...
"[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! |
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.
So, when the Little Schemer told me to cons some cake onto my face...
I get to have my cake and eat it too?
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.
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?
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.)
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.
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?
This is a little late, but:
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.)
Additional Resource:
A organization of textbooks complied from an /r/compsci thread
https://docs.google.com/document/d/1vMZCJl5lsMYxnBnYPj24DjrCL7qjN9tEVqxv2N9VWdY/edit?pli=1
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?
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.
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.
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.)
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.
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.
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.
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.
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.
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.
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.)
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.
I agree, with the exception of most of the links in the Python section: these are complete-beginner appropriate.
Updated Version @ LW Wiki: wiki.lesswrong.com/wiki/Programming_resources
Contents
How Computers Work
1. CODE The Hidden Language of Computer Hardware and Software
2. The Elements of Computing Systems: Building a Modern Computer from First Principles
3. The Write Great Code Series (A Solid Foundation in Software Engineering for Programmers)
Write Great Code Volume I: Understanding the Machine
Write Great Code Volume II: Thinking Low-Level, Writing High-Level
4. The Art of Assembly Language Programming
5. The Art of Computer Programming
An Overview of Computer Programming
1. Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages
2. Programming Language Pragmatics
3. An Introduction to Functional Programming Through Lambda Calculus
4. How to Design Programs (An Introduction to Computing and Programming)
5. Structure and Interpretation of Computer Programs
Computer Science and Computation
1. The Annotated Turing: A Guided Tour Through Alan Turing's Historic Paper on Computability and the Turing Machine
2. New Turing Omnibus (New Turning Omnibus : 66 Excursions in Computer Science)
3. Udacity
4. Introduction to Artificial Intelligence
Supplementary Resources: Mathematics and Algorithms
1. Concrete Mathematics: A Foundation for Computer Science
2. Algorithms
3. Introduction to Algorithms
Practice
1. Project Euler
2. The Python Challenge
3. CodeChef Programming Competition
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
2. Learn Python The Hard Way
3. Python for Software Design: How to Think Like a Computer Scientist
4. Python Programming: An Introduction to Computer Science
5. Practical Programming: An Introduction to Computer Science Using Python
6. The Quick Python Book
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
2. Learn Haskell in 10 minutes
3. A brief introduction to Haskell
4. Programming in Haskell
5. Learn You a Haskell for Great Good!
6. Real World Haskell
7. The Haskell Road to Logic, Maths and Programming
Common Lisp
1. Land of Lisp: Learn to Program in Lisp, One Game at a Time!
2. Practical Common Lisp
3. ANSI Common LISP
4. Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp
5. Let Over Lambda
6. Lisp as the Maxwell’s equations of software
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
4. R-bloggers
5. The Art of R Programming: A Tour of Statistical Software Design
6. Introduction to Statistical Thinking (With R, Without Calculus)
7. Doing Bayesian Data Analysis: A Tutorial with R and BUGS