views:

164

answers:

6

I completed Stanford's CS106a over the summer and took the ap exam in java a few months ago. As a result I have a pretty good knowledge of java. Now I want to continue my programming education. Several things have been recommended to me.

  1. Learn Python (I already have a python book or two lying around)
  2. Learn by programming and building projects.

I am here to ask 2 things.

  1. What do you recommend (how is the advice I have received)?
  2. Any ideas for projects?
+3  A: 

My personal opinion is that you should program in a language, any language, I don't care what language! for two years to learn all the ins and outs of it. While doing that it is a great idea to expose yourself to other influences. Since you have started learning Java it makes sense to continue, but if Python interest you go for that.

Once you have really learned a language you will find that most of what you have learned in transferable to other languages. The syntax will be different, but most of the concepts will be the same.

A couple of good books to read for influencing are:

As for projects, find something that interests you, something that is reasonable in scope (say creating a database of your music library or something like that). Something that you would use will motivate you to improve on it as time goes by.

TofuBeer
+1. One thing that being exposed to multiple languages will teach you is that, at their core, they're really not that different. Alternatively, it will make you *much* more appreciative of the differences that they do have (e.g. functions as first-class values in Python, closures in ECMAscript, etc.) In any case, this understanding comes from using languages and not just reading about them.
Faisal
@Faisal - actually, some languages are VERY different; e.g. SNOBOL or Prolog or a data flow language.
Stephen C
This is true; a different programming paradigm can definitely change the way you think about a problem. I agree too that I wasn't really as expansive as I should have been in my examples. I think what I was trying to get at, though, is that as you gain experience programming in different languages, you realize that many differences are superficial in terms of breaking a problem down into its constituent parts. No Turing-complete language is fundamentally more capable than any other, but they of course lend themselves to different solutions.
Faisal
@Stephen I'd say the core of programming is logic, the ability to break a problem down logically is pretty fundamental to all programming languages. Yes, it is true, that how you apply the logic can be very different, but once you can learn to think in a way that lets you write programs in another language it is easier to adopt new languages, even if they are radically different. At the same time, if you simply try to apply your existing knowledge to a new language without trying to conform to the way the new language "thinks" it can be very bad.
TofuBeer
+1  A: 

Widen your horizons early, learn the some practical theory, get feedback

People may disagree, but here is my 2p:

a) Read SICP -- You won't get it all first time round, but do try ... it is worth it.

b) Learn about the nature of programming languages, not just the languages themselves. Get a good mix of object orientated, procedural and functional languages. Haskell, Lisp, Self, Javascript, Clojure, Scala, Python are all good candidates. Learn about 'design patterns' for common solutions.

c) learn C. and use it in a sufficiently complex project. The aim here is to hone your 'debugging intuition'

d) Open Source -- Try finding a mentor or someone to give consistent criticism to your patches. Go and contribute to software that real people use in the real world

Most importantly, get feedback from people and study real world code.

Aiden Bell
+1  A: 

If you already know a language (sounds like you do), check out Google's Python Class videos. While doing these exercises (to find the actual files, go here) As extra practice, take a look at codingbat. This site was written by the same guy in the videos.

For me at least, learning code from a book is a tough thing to do, so I like videos more than just text.

Python is a great language with easy to learn syntax, and can be applied almost anywhere. Its strengths are usually that it is easily written and understood, as opposed to efficiency and running speed.

If you're looking to do some more intense programming, take a look at C++. It's very similar to Java syntactically. With c++ you can make the fastest running programs out there, and you can make them run on windows with the Windows API (However, the windows API is hard to learn, and Microsoft has horrible documentation)

For learning C++, or at least starting to learn, I recommend the 3DBuzz Introduction to C++ Videos

As for projects, try to find something that really annoys you on your computer. Do you hate doing something repetitive? Want to make a bot for a game? Find something to fix with code, and then fix it!

Good luck on your new language!

codysehl
A: 

You should learn atleast one Functional Language, (Haskell,Scheme,etc) it'll be hard at first. But then it becomes "fun".

Functional Languages, help you think, in an entirely different way.

st0le
A: 

A lot of job postings look for abilities in scripting languages (python, perl, php, bash, etc..) in addition to mainstream languages like Java or C++. From a practical point of view, I'd suggest you start learning python.

Tim Bender
+1  A: 

The best advice I can give is to write and read A LOT of code, and work on projects where you know the problem space very well. What helped me early on was writing software that solved problems that I was already intimately familiar with. For example I worked as a bus dispatcher for a time so when I was asked to write a web app for tracking busses, shifts, drivers and driver to shift / bus to shift assignment I could basically just sit down and pund away without having to think much about all of the ancillary aspects of software development.

Also, like a few people have already said, you want to 1) become an expert in a language but 2) become proficient in say pulls number from hat 7 languages.

I think SICP might be a little over your head at this point (btw they stopped using SICP at MIT a few years ago, sigh), but it's a great read once you start thinking you know what you're doing. (at which point, btw, you don't know what you are doing)

Write a memory manager. (or some other very low level component) I think the most progress I ever made as a "programmer" in one week was when I had to swap out the linux memory manager for my own implementation for a project in undergrad. Once you run vim, pine, mplayer, ... etc. on your own memory manager and know what's going on in the background... that's when you start to feel like you actually know what the hell is going on on the inside. Just little things like debugging the fact that ls ran succeccfuly but ls -l gave you a seg fault are great learning experiences.

Write an application framework. Given the number of web development jobs out there I would say write a web application framework... from scratch. You probably don't want to use it in a real production application because there are likely a dozen more complete, more secure, more scalable, etc. frameworks out there to chose from, but the exercise is enlightening. Plus when you switch to working with other people's frameworks later their framework will be easier to understand because they wrote it by solving the same problems you had. Believe it or not folks Rails is not actually magic. :-)

Understand the underlying systems and tools you are going to be working with. I have mentored a number of junior developers and the ones who are confortable working with the environment they are working in invariably get off to a better start (by weeks or months, not days folks) than those who don't. I have had an intern who was "stuck" for an entire day while I was out sick because he couldn't get his dev server restarted. Solving the problem took us 20 seconds the next morning. To be fair he was a terrible intern all around, but the fact remains that even if you have an entire department of 30 people dedicated to the support of your development systems you will be a more effective software developer if you are intimately familiar with the operating system and tools required for your code to function.

umassthrower
As I read this I realize that I think I just gave you a few years worth of work to do :-)In the short term, just code something familiar and preferably something people use. In 2 years if you look back at it you'll say "ohh my god, I can't believe I wrote this crap" but no one just instantly knows how to code. You have to do the work, make the mistakes, and over time the XP will come. You have time.. I didn't start coding until I was 18 and didn't start seriously doing it until I was 20.
umassthrower