tags:

views:

610

answers:

16

Hi, I am pretty much a classified beginner programmer, messing in a few languages. I know basic C# from a principle and paradigm point of view. My question is where do go from here?

Should I try out other languages, should I delve deeper into C#, learn C/C++/Ruby/Python, should I learn more about programming in general (OOP and Functional etc).

I guess you could say I have done the basic course of basic programming, learning about scopes, polymorphism, inheritance etc.

But my question to SO is, what path would you recommend I go into? How did you senior programmers get experience, did you make applications to make your day to day life easier? Did you create web applications for fun?

I am just a little lost and need a little direction.

EDIT: Any links would greatly be appreciated

EDIT2: What do you guys think about the XNA game Tutorials floating around (even the ones on the xna website)?

EDIT3: Grabbed that book and giving it a read. Thanks for all the input guys

+7  A: 

Start with the road heavily traveled. Learn C, and start with K&R's famous book:

http://www.amazon.com/Programming-Language-Prentice-Hall-Software/dp/0131103628

BobbyShaftoe
An excellent suggestion; it's a thin book that you could work thru in a few days....
ja
+1 for the classical approach. If you know C your skills will translate into any language.
Genericrich
You will never learn the C language in a few days, but that's not a bad thing. I definitely recommend that you spend some time really learning C and understanding structural programming and understanding algorithms. These skills will prove useful when you start OOP.
senfo
Listen to this man.
Max
+1  A: 

I think it be advantageous to learn C, maybe a little Java and Scheme to get a sampling of the varieties of programming languages and delve into the one that you feel best suits your style of thinking. Some languages just feel right. For me that language is C but to me Haskell is disgusting; I don't understand how people can code in it. They probably can't understand how I don't. Just experiment until you find one that feels right. Avoid assembly languages for a while though ; ).

Tutorials I've used:

C:

http://www.physics.drexel.edu/students/courses/Comp_Phys/General/C_basics/c_tutorial.html

http://www.iu.hio.no/~mark/CTutorial/CTutorial.html

Haskell:

http://www.cs.utah.edu/~hal/docs/daume02yaht.pdf

http://www.haskell.org/~pairwise/intro/intro.html

Lisp:

http://www.cs.gmu.edu/~sean/lisp/LispTutorial.html

C++:

http://www.cplusplus.com/doc/tutorial/ I don't know I found this really help as both a reference and tutorial.

Just a few I found helpful

faceless1_14
+4  A: 

If you know basic C# then dive deeper into it. At the same time learn about different programming paradigms like OOP. Once you start getting into the C# 3.0 stuff like Linq then start learning about FP. Get to know one language really, really well before learning new languages.

To learn a language well you need to read code written in it and write code. Not just exercises but a real program. Think of a problem you want to solve and write a program for it. I usually go for games, because that's fun for me and makes learning a language fun, too.

Mark A. Nicolosi
+8  A: 

There are several language groups you'll want to learn before you can really classify yourself as an experienced programmer:

  • functional programming
  • low-level programming where you do your own memory management - C
  • a VB.Net, C#, or Java - a memory-managed enviroment
  • scripting languages (Ruby, PHP, Python, Perl)
  • javascript

And there are numerous aspects of programming:

  • distributed systems
  • multi-threaded systems
  • web programming
  • working with APIs
  • on and on...

I think the best advice to someone is to do what you enjoy; and make yourself learn how to do it in the process.

  1. If you like flickr, write a script in Ruby to do something with photos using their API.
  2. If you're annoyed with windows crashing, grab windbg, whocrashed, some C++; and The Old New Thing - write some programs, crash them, and learn about Win32 and assembly
  3. If you're trying to get into linux, make a gentoo install and write a bunch of scripts in perl to automate tasks for you
  4. If you like gaming, write Pong. Then make it a networked game. Or a flash game. OR hack at Darkstar
  5. If you enjoyed math, grab lisp or scheme and implement RSA
Tom Ritter
A great NTDebugging link would be http://blogs.msdn.com/ntdebugging/
Larry Smithmier
A: 

I am very familiar with where you are at right now. Was just there and finally coming out of it. My suggestion is you code, read others code and things of that nature. Really make sure you understand how to code with C#. As a shameless plug my blog http://www.buddylindsey.com/Blog has some beginner content programming wise that might help on understanding more. Its up to you.

I also suggest going through http://www.autumnofagile.net/ when you get more comfortable with programming, or even now. It will help you with a good "process" of coding and coding in general. Again i stress make sure you understand OOP in practical use and not just theory. The sooner you understand it the better this held me up for a long time in advancing in programming.

percent20
A: 

I would highly recommend starting with a more practical language, specifically Python. Its easy to install, easy to get running, and gives nice, friendly, predictable results right away.

I recommend this route because you'll see results instantly, and get that "mini-reward" that keeps you interested and inspired.

Eventually you'll want to delve into the concepts of C to understand what Python is doing under the hood, but that doesn't mean you need to be an expert, just understand pointers.

I find the object model in Python to be a lot more forgiving and easy to experiment with than in C++ as well. You'll want to learn about inheritance, polymorphism while you're at the stage. You may eventually want to experiment with Java, C# to see what strongly typed object oriented languages are like, as well as learn some of the design patterns used for statically typed languages. For some reason, Python seems to be able to avoid a lot of these design patterns because its a dynamic language.

Generally, the idea is to explore principles, practices and concepts. These span several languages so you'll want to try at least a handful. Don't expect to learn C and suddenly know how to write ActionScript for Flash, for example.

Soviut
+2  A: 

Well, this greatly depends on the kind of software/industry you'd like to work on. Is not the same working for an online retailer than it is for an embedded software company. Ask yourself what kind of software you'd like to write:

  • web apps?
  • desktop apps?
  • games?
  • embedded programming?
  • Highly available/mission critical systems (such as ATC, Railroads, military etc)?
  • What OS: Windows, Linux, Mac, embedded, realtime OS's??

Also consider what company you'd like to work for, Microsoft? Apple? Google? Raytheon? NASA?

Once you narrow down your choices of the software you'd enjoy writing the most, start looking online job postings for that job/company/industry and look at the requirements.

For example, if you wanted to write software for avionics, you probably want to learn C and C++ on embedded or real time systems. If you'd like to work on Air Traffic Control systems, you'll also want C, C++ and maybe Ada on linux. On the other hand, if you're interested on writing web or desktop appls you'll be better off learning C#, Java, and maybe Ruby on Rails or other dynamic web frameworks, etc.

Ricardo Villamil
+1  A: 

The best advice I can give is to find some interesting domain or problem or simple (or not so simple) application that interests you and try to write it - or at least part of it.

depending on your interests some languages and technologies may be more suitable than others.

Do you like to do animation or web type stuff, or are you perhaps interested in making some PDA or cell phone applications?

What other hobbies or interests do you have? Perhaps you can think of those things and what related programs you can write.

C# is a fine language - don't be in a rush to learn other ones - they will come in time. Focus more on doing something with it and mastering at least one language first.

Have fun.

EDIT:

I just checked your profile - I guess you are at a university. Some of the interesting ways for learning real-world development is to talk to researchers (students or professors) in other departments who DO NOT know how to program. For example, one of my coaches in college was a physiologist and did research with students and reaction time, etc. he needed students to write programs to interface with some hardware devices. I am not saying this is how you should proceed, but you can find some real problems and work with real people rather than just sample apps that have no real meaning. You might also find some niche...

Tim
A: 

hi there, i would say stick with one language first and learn enough of it that you can actually be comfortable enough to whip out a simple web or db app in your favorite language when necessary or at least know enough of it that you can easily google up the missing parts to make it work.

Besides perfecting your craft in the language, i also found it helpful to know about other stuff involving making our craft better, for that i highly recommend reading Pragmatic programmer and after you manage to absorb all the warm and fuzzy stuff from that book. You can move on to this one Pragmatic Thinking

And if you still have spare time from those, then maybe you might want to learn a simple scripting language for doing simple lightweight stuff like copying files, etc. I'd say go for either Perl or Ruby. They're awesome!!

melaos
A: 

In my opinion languages are secondary. Learn the fundamentals and it won't matter what language you use (you can always learn a new one).

When I was learning the basics I read everything I could get my hands on. This gave me exposure to other ways of thinking about problems and just as importantly it gave me a huge set of interesting problems to solve. It didn't matter that they had been solved already, I would take a problem and write an application to solve it, and then compare it to how other people solved it.

I was never concerned with finishing anything - there is plenty of time to fuss with the details of how to actually ship something later - but instead I just experimented with as much as I could.

edit

Since you mentioned the XNA game tutorials I should probably admit that anytime I learn a new language/framework I usually try to implement a version of the old Breakout game. I've wasted many an hour playing that game and its simple enough to do quickly, but complicated enough to give me exposure to most of the features I am trying to learn... :)

Brian B.
A: 

Language skills are essential. I lean towards the C route since that's how I learned. But, there is the ability to take a problem and turn it into a series of steps than can be solved by code, that isn't specific to any language.

Algorithmic-al thinking is hard to learn but once you can view things in that mode you can use your language toolbox to solve pretty much any problem. Or at least know where to go for the parts you can't do.

Genericrich
+2  A: 

I would put in a bid for learning C++.

You get access to all the concepts that are important to understand from C (e.g. pointers) and also you get Object Orientated Programming and Templates and those other more modern ideas.

With a good grounding in those concepts you are ready for most things that will be thrown at you as you move forward (with some important exceptions that you will need to cover later).

This is a good place to start: http://www.cplusplus.com/

duncan
A: 

I'd say you first have to learn C, then unlearn C and learn C++. Get tired with all the headaches of (C in) C++ and move over to java (or C#). Then discover that Java sucks too in a different way, and try python or ruby. But python and ruby seem to be rather unpredictable (as is Java), and move back to C++.

Finally live a satisfied (or dissatisfied) life after realizing all languages have their good and bad parts, and the things about algorithms you learnt from C, and interfaces you learnt from java/C++, and brevity you learnt from ruby are going to last forever.

Amit Kumar
A: 

After unlearning C, you might want to learn assembly language. ;)

Then get back into C and C++.

Hideo
A: 

I'm fighting against my primordial instinct to recommend C#, as I always do. Ahh, what the hell. Go after C#, and diversify with F#, Boo and Nererle. Enjoy the .NET universe - I hope you find it as exciting as I do!

Dmitri Nesteruk
A: 

I started with C++ and i think it's a pretty good start. Also you should really play around with assembly a bit (there are also emulators for this), because knowing what's going on under the hood can be quite useful.

Botz3000