views:

469

answers:

19

I'm a high school student who's looking into programming as possible profession later on. I've dabbled in tons of languages, and am a somewhat competent programmer. Strangely though the languages I know the best are:

  1. Ruby
  2. Actionscript
  3. Java

I feel that there is a huge gap in my programming education. What else should I be doing?

Edit: C is definitely the way to go.

+1  A: 

I assume you have not taken formal computer trainning and just learned programming languages... I would then suggest that you also study some theoratical computer science courses like OS, distributed computing etc etc. No good to learn other programming languages you already know enough

Umair Ahmed
+11  A: 

I think you should take a look at atleast the basic C ( I mean you should know about pointer stuff. You can leave out bit more complicated stuff such as unions or function pointers). Take a look at this article Perils of JavaSchools.

Naveen
I wouldn't class functyion pointers or unions as "complex". And you will have a hard job doing any UN*X programming without using them.
anon
+3  A: 

Focus on learning the fundamentals.For example, focus on understanding object-oriented principles rather than learning another object-oriented language. Take a look at other paradigms - procedural, functional, logical - as well. Once you have a good solid technical basis, learning new languages is relatively easy.

I have found ACM's Curricula Recommendations to be useful in finding areas where I might need to 'plug some gaps' in my own understanding of the field.

Brandon E Taylor
+6  A: 

I really recommend a little book called The Elements of Computing Systems by Noam Nisan and Shimon Schocken. It has a companion website here.

This book walks you through building logic gates, designing a CPU, an OS, a Compiler and Programming language, and finally you program the game Tetris in the language you wrote that is compiled by your compiler and runs on your OS on top of the logic gates and chips you designed. It has simulators included so you don't physically have to do this. It has a very nice learning curve and is enjoyable to read. You get a big picture of everything you'd do and everything behind the scenes as a programmer. And the best thing is , it only takes a few months to complete in your spare time.

colithium
+1. I found that book instructive as well.
Brandon E Taylor
I like this too.
deeb
I entirely agree. I just discovered this book and am addicted.
Dinah
+5  A: 

Object oriented Programming Concepts. Get your basics right. As long as you code the right way; a language is just a medium. Not to undermine the importance of a language but you may want to study:

-Algorithms a bit (Binary Trees, Search algos etc..) (Analysis and Design of Algorithm)

-Object Oriented Programming Concepts (Very Important)

-Best Practices and generic frameworks like MVC architecture etc. (If you plan web development)

-Pointers and memory management is definitely a good addup.

Priyank
A: 

Most important thing is to think what you are interested in. It looks like scripting is not something you need to delve any deeper at this time as you have two scripting languages in your skill set. If you do want to learn another one I suggest Python.

If you really want to expand your mindset you might want to look at something completely different like Lisp. It will teach you to think of problems in a very different way.

If, however, you want to increase your chances of getting a job you would first want to think what sort of jobs you are looking at. If it's web stuff, SQL is almost a must even if it is not a programming language as such. If you want to dabble with very low level stuff, C and/or C++ are almost a must and you would also want to familiarize yourself with the concepts (how processors actually work etc). If you want to do programming for Windows, learn .Net and one of the languages. I would suggest C#, as it seems to be most popular of the .Net languages.

There are also issues in programming that you might want to look into that are not directly connected to programming like SCM (Software Configuration Management) and issues that are programming related but not tied to a single language like unit testing and what constitutes good code. Code Complete by Steve McConnell is a good starter.

If I was hiring someone based on their work I wouldn't look if the person knows every nook and cranny of some language. I would look if he is capable of writing code that is easy to understand and maintain. This is often overlooked by programmers (and managers, for that matter).

But first and foremost before choosing what you want to learn: think what you are interested in. It will take a considerable effort to learn a new concept and it will be mostly wasted if you are not interested. So, if you want more exact answers please let us know what you like and what sort of programmer you would like to become.

Makis
A: 

Up to today, computing is 90% algorithms and 10% programming languages. If you do want to have a preview of algorithms and it's applications, you should read "The algorithm design manual" by Skiena and, of course, Cormen's "Introduction to algorithms". After checking these, you would end up with a strong foundation.

nairdaen
And how many % is data structures?
Jonas
Yeah, I had the feeling I missed something. I'd say that both data structures and algorithms make that 90%. Data structures and Discrete Mathematics are also the theorical foundations of computing. In fact, one should be clear about math and structures before moving on to algorithms.
nairdaen
+1  A: 

A very good introductory computer science course is one by Richard Buckland - available on youtube. You'll learn all the basics of C, algorithms, data structures, machine code, development processes, etc.

Good luck.

anderstornvig
+3  A: 

I think there is merit in learning 'C', I also think you should read about Design Patterns as a way to understand what power can exist in Object Oriented code. I shall explain further why I think you should learn C.

The principle challenge in computer programming is that of managing complexity. Programming is a uniquely challenging in that the programmer has to deal with data structures ranging from individual bits to megabytes in almost the blink of an eye and still maintain a detailed and complete understanding of what is going on. In order to manage this you need to introduce abstract concepts to your code, and try and work in the highest level of abstraction you can. For instance, you live in a house, a house has doors and windows. To enter your house you open the door and walk in. You would never normally talk about living in a brick and wooden structure with a slate tiled roof with glass panes and a wooden hinged assembly to allow you to enter and exit - thats too low a level of abstraction when you can just say you live in a house. The same with code.

Where am I going with this? ... hold on I'm getting there.

Modern computer languages, such as Java, have raised the level of abstraction that you work at. This has helped increase productivity and code quality which is fantastic. But it has also hidden from the programmer a complete knowledge and understanding of what the software is doing. This strips from the programmer control. 'C' allows you to create your own abstractions, your own models and data types, but its starting point is at a level where it is transparent what the software is doing and the programmer maintains complete understanding and control.

I strongly would recommend reading Code Complete.

Regards

Howard May
+3  A: 

To be a good writer, you have to be fluent in a language, but it's not enough. You need to have something interesting to say. Language is just a medium that allows you to express yourself, don't overestimate the importance of it. The languages that you know are great and should cover most of the targets. At some point you have to learn C. But it's not a big deal.

Fundamentals that really matter: math and algorithms. Everything else will come with experience. Languages and technologies come and go. Invest your time in math and algorithms, this baggage will be always with you and will always give you a competitive advantage.

Igor Krivokon
A: 

As many of others say here start with basics of Object Oriented Programming, choose "what you want to be able to" in future. Then you'll come up with the languages that you have to go for.

From my own experience never expect too much from college or university studies, they are good for basic knowledge but you get the real knowledge on real projects.

If you can not work on a commercial project (lack of knowledge, lack of time etc.) create own projects start from scratch, google, google, and google it and you'll find your way.

Hope it helps.

Sinan Y.
+1  A: 

You should be learning to use the search feature on stack overflow to see the response to the question you've asked already answered many times over. Google also works.

I don't care about anything else. Give me google, and an unlimited supply of mountain dew and pizza and the answer will be found, created, or proven impossble. Being a programmer is about being a problem solver and finding the right information to solve those problems. If you do it efficiently, you get paid well too. Everything else is just a tool, and using your experience with a specific set of tools to be efficient at you completing your goal.

The most important thing I can tell you: be a problem solver. Find your own solutions. Show your work (document it) so that others can benefit from your experience. Understand what you are doing, and don't blindly fumble about guessing unless you are doing it scientifically.

You can go to a university if that helps give you the structure you need to understand this profession. It will also help you prove to yourself that you can accomplish a large goal that you set out for yourself, and not one that was forced upon you like high-school & grade school. If you don't motivate yourself in college, you will fail. I think that's the biggest thing that I get out of seeing someone's resume with a college degree.

Zak
A: 

I'd take a two-pronged approach, from the top AND the bottom.

At the top, abstract level, learn and practice good OOP design, and familiarize yourself with newer concepts, frameworks and languages

And, from the bottom "physical" level, learn how the bare metal works - assembler, C, microcontrollers. Maybe buy an Arduino kit and have a play.

There's a vast chasm between the two ends, but the skills you learn in each will help you appreciate how all the bits in between work, and how they're related.

Roddy
+1  A: 

I have to give a pointer back up to Brandon's referral to the ACM Curricula recommendation. Just peruse the headings and you will notice a trend. You need to explore the theoretical side of CS to be well rounded but, from a completely career track centered perspective, the future is:

  • Secure
  • Net-centric
  • Parallel

Your skills, as listed, indicate a useful set for the coming years. Follow the recommendations though of the folks urging you to pursue fundamentals and some bare-metal coding. You will feel more fulfilled intellectually. You will understand the layers upon which your code operates and be able to respond to the needs of your shop.

maengle
+3  A: 

You could join open source projects or start your own, for example on sourceforge.net or google summer of code. Most computer programming isn't creating new code, it is refactoring, debugging and improving existing code. So learning about maintaining existing code is very important.

+1  A: 

Something that makes you stop thinking that you're a "somewhat competent programmer" and makes you realize that there's always more to learn!

To start with, learn the basic computer science topics such as algorithm and data structures, different programming schemes (functional, procedural, object-oriented), and at least an overview of compiler technology.

Then, you should cover some computer engineering topics such as agile development methods, test and verification processes and team management (useful to know even if you're the managed part).

After that, you're probably ready to look closer at how stuff really works, such as computer architectures, real-time programming, operating systems, game programming (graphics, AI, UI design), embedded systems ... (I could go on all day but I'm at work so I'll cut the list here)

Christoffer
A: 

A word of encouragement, you're already over the worst. Most likely you'll make a fine programmer.

Why?

Firstly many (most) people don't get coding at all - thinking along the lines of branches and loops like a programmer doesn't come naturally and if you're past the point of groking what programming is then you must have aptitude. Having three languages under your belt to some degree already confirms that.

Secondly you're asking how to get better and you recognise that you have gaps. That's an enormous plus. I've seen several coders who have more than a modicum of raw talent go completely to the dogs because of sheer bloody arrogance. Interestingly these days they can often be recognised by an insistence that X (nearly always PHP) is the perfect language and Y (nearly always MySQL) the perfect database. I doubt very much that applies in your case.

After that, well really it's just a question of putting in your 10,000 hours and making sure you get a suitable education, which probably, but not necessarily means university and working alongside more experienced coders.

Cruachan
+3  A: 

Every professional programmer should know SQL and understand the basic concepts of a relational database.

RossFabricant
+1  A: 

Learn C first and then go for C++