views:

447

answers:

16

Hi there,

I've been coding since my early teenager years. I started out with HTML, went on to PHP/MySQL (created my own forums, social networking sites, etc..) and then branched out into more traditional languages such as Java and C++ (also picked up a little VB .NET in high school). I'm most familiar now with C++ as that is the language of choice taught to us in Computer Science II (skipped Comp Sci I) at RPI. I now feel like I have a very good knowledge of how to program from this class (the homework assignments were brutal).

It is now summer and I am interning at a company that is providing me some level of new experiences with programming, but I want more. I want to feel the incredible satisfaction that I got out of my computer classes at RPI whenever I finished a long assignment (generating every possible wordsearch from a set of words to include and exclude comes to mind).

My question is, where do I go from here? I tried following a tutorials online, but they were all too simple. I then tried heading over to sourceforge and helping out with various projects. But, as soon as I downloaded the code I got lost in its complexity. I have never created actual software of a real life applicapable scale. And I don't know where to get started. How do you transition from programming knowledge to actuall creation of software?

I'm also open to learning new languages (javascript/jQuery, ASP .NET, C#, Python), or using new libraries and/or frameworks with c++ (we only used the STL in Comp Sci II) and other languages. Again my question is, where do I go from here? And I am welcome to all possible answers.

Thanks Much, Michael

+7  A: 
marcgg
I tried this and like I said quickly got lost in simply the sheer size of the code. I've never created a project bigger than 5 or so files. I then look at a project on sourceforge and they have more folders than my projects have had files. I had no idea on where to start to understand the code infront of me.
mcFreid
I edited my answer, hope that helps more
marcgg
Thanks for your example. You started my mind on many tracks here and I think I am beginning to see how I can go on from here. You recommended learning a new technology though for my project. Isn't that too much at once? Is there any downfall to using, say C++, something I am well versed with to start my project?
mcFreid
It's all about what you want to do. I'm more into web technologies than desktop apps... Learning a new technology is always nice, but if you feel like it's too much work, just stick to what you know for now and focus on learning how to handle a large project.
marcgg
yeah i like this answer, before i started working as a programmer i made some programs that help me in my everyday computing such as a task managment program, a program that keeps all my contacts, a program that displays weather information, and little things like that
Petey B
+7  A: 

I'd recommend trying a pure functional language, such as Haskell. It's a completely different way of looking at programming, and I found it very satisfying.

I recommend the book Real World Haskell for learning it.

Edit: In response to comments, my interpretation of the question is where can he go from here as a programmer. Functional programming is a logical direction. For someone learning functional programming for the first time, Haskell is nice because it doesn't really allow for imperative programming practices. Furthermore, it has basically all features you will find in other functional languages, which means it will be easy to pick up other functional languages.

Zack
I am not doubting the usefulness of Haskell in real world applications, but learning Haskell seems like a very strange recommendation for someone trying to learn how to build real world software, as opposed to just learning another language.
Brad Barker
Knowledge of F# is probably more useful for 'real world's stuff.
Dmitri Nesteruk
Knowledge of functional programming of any type is useful, simply because it broadens your toolkit. The 1 functional programming subject I took at university has probably helped me more than any 10 other subjects.
RodeoClown
A: 

You've got to find a particular type of functionality that interests you. For me it's been basic socket programming and making my own protocols. I got that feeling when I was able to create a functional file uploading control that worked in conjunction with a file upload service on the server which I had created. The protocol handles authentication, chunking and hash comparison. Sometime soon I plan on incorporating file-resume functionality as well.

Spencer Ruport
+1  A: 

I would suggest looking at Project Euler. It's a great and fun way to learn a new language, and it does provide that level of satisfaction when you solve the problems. They offer a huge range of problems at all levels of difficulty.

Craig Martek
That's a great website! Thanks for the contribution. I participated in a programming competition hosted at my college and they had many algorithmic problems similiar to this. I still enjoy going back and doing these, but it is not what I'm looking for anymore. I want to start doing things on a bigger more real life scale, I just don't know where to start on that path.
mcFreid
A: 

Well my advice will be to find a problem/project you are interested in and try to code it. Trying a real problem is something that drives you. Find something not to complex but not too simple. Something to try when starting a new language is to write some tools. You can for example program a python script that print metrics on a C++ project. You can write a tool that extract some statistics from a website you use, etc. When I learn programming game programming was quite fun (I was young :-) ). You can try to program some simple game using a 3D engine like Ogre3D for example. Participate in an opensource project is great too but as you stated perhaps a bit overwhelming for now ;-)

Find something you like and that has a REAL useful goal for you. You will thrive to solve the problem and learn a lot along the way !

neuro
+1  A: 

I think the best way to improve your skills as a programmer is to do what programming was intended for: solve problems. I'm sure you've been playing around on your machine and at one time thought to yourself "I wish there was a program that did this..." or "I wonder if there are any programs that do X..." Instead of just googling to see if someone else wrote it, write it yourself. Start with something small, and gradually make it more complex. Add features. Allow yourself to fail, and when you do, ask yourself (or us at stackoverflow) how to overcome that obstacle. Once you have the basics of programming, everything else is just making big things out of littler things, and the little things are usually pretty easy.

When you are making something you know you will actually use, it's more fun and more gratifying when you finish.

Matt Bridges
A: 

I think the transition from the kind of finite tractable problems that are part of class projects (and some internships) to "real world" projects is quite tough. Sounds like language syntax, getting bugs out of code etc. is something you are comforatble with.

When we come to larger projects, probably with many release cycles, with developers working together, different kinds of problems emerge. I remember being shocked when I saw my first big project plan - what a small propertion of the time was actually writing code!

The thing I found helpful as a junior was "Sitting By Nelly", I was lucky enough to work for enlighted employers who put me with very experienced and helpful developers. Sometimes to work with, sometime to work alongside. I reckon that helped me get over the hurdles you describe.

So, I reckon you need to find employment of this kind. Be less concerned about specific technologies, salary etc. Look instead for the culture and level of responsibility you would have.

djna
+1  A: 

Do you understand all of the following and how they work?

  • Linked lists (single and double)
  • Sequential vs. binary search
  • Binary trees
  • Stacks
  • Red-black trees
  • Algorithmic complexity and big O notation
  • Recursion
  • Hash tables and hashing algorithms

If you don't feel completely conversant in any of these, take a class in data structures and algorithms.

John Pirie
Yes, I understand all of the above. It's more about taking that base knowledge now to creating actual software that I'm questioning about.
mcFreid
@mcFreid: that's great; then apart from the standard "write more code" advice, I'll vote for marcgg's suggestion of joining an open source project. You learn specific things from working on a big project, rules on collaboration that you won't get in a classroom; have to do it to appreciate it.
John Pirie
+1  A: 

It seems like you've experienced many languages, but have not created a real-world application. Creating software in any of those languages will bring you to a new level.

PS: Creating software is much more than just knowing how to mess around with a language.

Luca Matteis
Where do I start on how to do this? I don't know where to begin.
mcFreid
Just make an application that you would personally use, even if it already exists. An rss reader, mail client, blogging software...
Luca Matteis
A: 

I think you should really start a "real world application" as suggested here. You will see that a real project requires a bit more than just knowing the language.

I suggest you find some simple problem you had issue with, and make a software that solves that issue.

For example, if you want some kind of software that checks RSS feeds every 5 minutes and makes a little pop-up as soon as a new one comes along. Or you want a program that will let you do simple presentations by just dragging a few pictures in.

Then whatever you choose, start by making the simple solution to the problem and extend from there (like do different settings, extra features etc.)

kkaploon
A: 

I've looked for the answer to this question for a while now. Most all of the suggestions are usually either help an open source project or build something that interests you. I'm starting to realize that those answers are vague because what's 'interesting' or 'valuable' experience and how to get started doing it is completely subjective. Also, there's only one way to get real experience, which is to work on real projects. It's difficult but find a project, personal, open source, or otherwise that will increase your knowledge in a technology or platform that you think will hold your interest. Then just dig in. It doesn't have to be of earth shattering importance, just valuable in relation to your own goals.

Dcritelli
+1  A: 

Check out Design Patterns.

I believe that's beyond mere simple coding.

Mark Serrano
+1  A: 

You could offer your abilities to a non profit or a friend or someone who needs a website or program built.

Tell them you can do it for free and then just go for it. As you start to make it you'll start to see what you need to learn.

For example I bit ago I had the program Peel www.getpeel.com on my Mac. But sold my Mac for Wind as I am traveling.

Seeing that there was nothing for Windows (or nothing I could find) like Peel. I build my own in PHP and am up to a 4th rebuilding of it as I learn betters ways to do each new thing I am learning.

ian
A: 

There is no magic bullet transition from academic puzzle solving programs to real world applications. The best way to learn is just to jump in head first. It will take you a very long time to learn what you need to if you only ever look at your own code. You need to be looking at code written by professionals and struggling to understand why it works the way it does until you do understand it.

It seems overwhelming at first, but you will quickly start to see patterns if the application is at all logical. Well written code will be separated in logical ways, so you should be able to pick it apart one layer at a time.

For example, you could try a bottom up approach where you try to understand how the database interactions are handled before looking at the code that uses the database layer. You keep going upward until you get to the GUI event handlers.

Large enterprise applications can be even harder to understand because there might be a lot more than one executable, or component. Try to stay focused and learn what the component is responsible for doing, and then pick it apart a piece at a time.

You will see that there are not just patterns at the function and class level, but at higher levels as well. This makes it simpler to understand what is going on when you understand those patterns.

Brad Barker
A: 

Try to find an internship or co-op position. I was in a similar situation after my first few courses. I took a co-op position sophomore year and I learned so much more on the job than I did in class. Class is great for teaching you theory and the basics. I learned C# on my first project on my co-op and that got me my second co-op position at another employer (wanted to see how it was working at a small company).

This past spring, I accepted a position at my first co-op employer, reworking my first major project I had started on my co-op. I have a list of side projects I also want to complete, which will help round out my skills, as well as learn some other languages.

So my suggestion is try finding a job where you can have a great mentor. On my second co-op, I learned alot of the coding standards that I code against from my supervisor. He was a great teacher, and really had some great input, and explained why things should be done certain ways.

phsr
A: 

You will almost certainly go nowhere unless you find something that interests you. Figure out what is interesting, and then how to write software involving it.

David Plumpton