What types of Comp Sci Coursework for High Schoolers

Hello - I have a high school child who is interested in Computer Science. I urged him to consider learning some programming languages over the summer. However he’s having a difficult time trying to figure out what language is the best for him to consider taking up.

I was thinking that something like Visual C++ would be good, however I don’t know much about programming.

What languages would you recommend?

The industry is dominated by Java, PHP and the usual client-side HTML, CSS and JavaScript.

Java can be used for a lot of things such as desktop applications, web applications (Applets, JSP, Java Server Faces, etc.)

PHP is a server-side scripting language usually used to connect to various databases on websites (Facebook uses this, and about 75% of the internet’s websites use PHP).

HTML is a markup language, that’s the foundation of web design, which goes hand-in-hand with CSS.

JavaScript is a client-side language and is used to tweak some of the functionality on the websites (drop-down menus, moving objects, etc. jQuery is a nice framework to use in this case.)

C++ is a lot more advanced and shouldn’t be someone’s first programming language, in my opinion.

C# is also very popular with Windows applications and is very similar to Java.

My personal preference is Java, not because it dominates the market, but because it is very flexible in the sense that it can be used across all platforms, i.e. all operating systems without modifying the code or importing any specific libraries. It works on the web just as good as PHP (and can also be used instead of PHP), and it is very easy to get into when it comes to desktop applications. Apart from that, there’s a ton of resources (which are free, such as textbooks and tutorials) your child can learn and study from.

Java / Python are two good starters for language. Java is the language of AP Computer Science.

I should probably have mentioned that he took a scratch programming class about 2 years ago in middle school. Scratch is a bit basic though.

I like the suggestion for Java.

There are languages specifically designed to solve certain problems. Lisp, for example, was developed at MIT with the intention to solve problems involving artificial intelligence. In short, the point is that there are a ton of languages you can learn, so learning the “easiest” might not really get you anywhere and might even be useless.

Python is probably a better beginner language than Java.

People learning CS should not focus too much on a particular computer language, because each has its own capabilities and limitations with respect to the types of problems it can be used to solve well. Learning CS with several different types of computer languages is preferable to learning CS with just one computer language.

deleted double post

Some introductory CS books:

http://mitpress.mit.edu/sicp/
http://www.composingprograms.com/

I am posting because I have conflicting views to what has been said here.

  1. I don't think Java is a good language to learn first. This is also a common opinion of older more senior developers too. Why? Java abstracts you in a way that you don't get a clear idea of what is actually going on. (How and why the entire OOP language is structured the way it is, references, pointers, deallocation, etc.) I believe your principal multi-purpose language should be C/C++. (closer feel for why code is the way it is, c++->java easier than java->c++, etc.)
  2. I also don't believe you should be focusing on a myriad of different languages. You will gain a similar shallow understanding of each language, just now you're memorizing different syntax. Less critical thinking. Instead your kid should focus on getting as deep into one language as possible, or two if he must, and once he has a lot down, to then branch out. The best programmers don't know some of every language, but instead, after 15+ years they are extremely well versed in 3-6 languages.

In saying this, I believe if your child is up for the best learning experience to learn C++, a standard that will teach you immensely and allow you to branch off into most any language. But if you would like to start simpler, and maybe with a more interesting factor of playing with websites and animations to start with Javascript. Javascript can be learned on Khanacademy.com and Codecademy.com. C++ will be with a compiler and a good book on Amazon.

I doubt that Scheme is still used at MIT.

MIT uses Python for the AI class.

http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-034-artificial-intelligence-fall-2010/

@eshkidd I think you miss the whole point about CS in general. The gut of a good software developer is the ability in abstraction. If you don’t have abstraction ability you will not be able to build a complex but invisible architect of the object models for CS data structures.

C/C++ is the worst language to learn about object oriented programming. My son wanted to learn programming in middle school but he was frustrated with C/C++ in online classes. I taught him a little bit Java and he enjoyed it. He later took the Java programming from Stanford EPGY and he had a blast. The EPGY class recommended 2 classes in C/C++ as prerequisites. I found that unnecessary and let my son take the Java class and he had no problem with that. My son did not touch C/C++ at MIT. He is using Java and Phython at work now.

…continue

My son wrote the Sokoban game as a homework assignment in his EPGY Java programming class.
It’s similar to this version:

http://www.game-sokoban.com/

Wow thanks for everyone who responded! I should also probably mention that he is working in a genetics lab this summer. The lab head mentioned to me yesterday that the research assistants all use Python for their genetic analyses.

So it sounds like it might be a good idea for him to learn Python. I do understand the arguments for Java and C++. My son is only in grade 9, so it probably makes sense for him to do Python this summer, and then if further interest develops, he could learn Java and/or C++ later.

The best programmers are the ones who know the foundational CS concepts well, and who have enough experience with different programming languages that they can easily use (learn as needed) the best available programming language for the task at hand, rather than trying to force-fit a problem into a particular programming language.

In agreement with @ucbalumnus

And for the record, as far as Scheme goes, it is a similarly good intro language as python in my opinion. Brown uses a variant as well as my current school. The simplicity allows the teachers to focus on the CS concepts as UCBAlum has been talking about. You can get to recursion in the first few weeks, and understand higher order programming within recursion in your first semester. You can take those concepts and apply them to OOD after very easily with a strong founding in logic. After that, Java, C/C++, it all is just a matter of knowing the abilities of the language and working with them as best as you can.

I started in C, and while it worked, I would not recommend it. You can teach Java in parallel with explaining its design.

@sgopal2 - I also suggest Python or Java. Python is probably easier to pick up for someone with no programming experience, because Java has all sorts of keywords and other things that are pretty difficult to understand if you’ve never programmed before (e.g. the keywords public, static, void).

For the record, MIT’s introductory classes (6.0001/6.0002, 6.01), as well as their AI and intro algorithms courses (6.034, 6.006) all use Python.

Agree that Java (and C++) have more little details to have to remember, which means more time learning the language and less time learning foundational CS concepts for the beginner interested in studying CS.

Here’s a different perspective. Look for a language that

  1. has some other people - either local or on line, but trustable either way - that are also using the language and can help solve problems or critique code. Both spoken and computer languages are all about reducing and rearranging complex ideas into a more structured format. Neither can be learned well in a vacuum.
  2. Has a decent base of reference solutions and readily available style guides
  3. is not dependent on a particular IDE. Ideally, it could be written using Netbeans or command line on a linux system as easily as with Eclipse on Windows or (name your favorites). It’s easy to think that the development environment features are part of the language. They are not. (FWIW, I’ve been doing software for money since the 80’s, and have had some time to ponder this while waiting for compiles).

The language itself really doesn’t matter - the software engineer adds value by doing the mental exercise of translating the idea from one paradigm (the ether) into something concrete and reproducible. For example, I got my first embedded C job after telling the interviewer that I’d never written C for money. “Well, you know how to program; you can figure out the implementation language.” He was right. For my part, I’d much rather work with a fresh out of school kid who really grooves on solid programming concepts but knows only perl than one who knows a dozen languages but has horrible style and never uses functions or subroutines.

If you think about it as an idea translation exercise, ask yourself whether the interpreter that “got” the subtle parts of German, for example, had a better future than the one who’d memorized the same 95 words in six different languages.

I’m hoping to get my kids hooked on Harvard’s CS50 lectures and problem sets. It’s in straight up C, but I really like what I’ve seen in the 4-5 lectures I’ve watched so far and yes, I’m doing the problem sets; it’s fun!

Not saying this is the only way, just my opinion, and worth no more than you paid for it.

… Or just get your kid an Arduino. That could work too.