views:

1876

answers:

7

I need your advice on how to develop my programming skills. Though I am very curious about learning new techniques, I somehow feel stucked at the moment and would like to get some opinions on that. I hope the following description will help to illustrate my current situation clearly to you.

I got interested in programming after writing my first HTML page some years ago. It was quite useless to me, because it didn't offer any functionalities besides displaying text :-]. That's why I looked for a way to equip it with "intelligence" and found an easy possibility with PHP. PHP was the first language I used, and I created the "standard" web applications with it (a forum, news with comments, gallery, ...). I did like it a lot because it was very easy to use and also helped me to learn how to interact with databases. I also heard for the first time of object-oriented concepts at that time, which - interestingly enough - was even more poorly implemented in PHP 4.x.x than nowadays.

At school we learned object-oriented programming with Java. We implemented trees, graphs, finite state machines, etc and I feel quite lucky about that time. It increased my curiosity even more. Besides PHP and Java, I also learned some basics of Perl.

However, I somehow feel that I am really missing a big piece every programmer should now, especially because I mainly developed web applications. I don't know how to program applications that operate on a "lower level" (I consider web applications being more high-level).

Though I received some basic education on computer sciences, I have never learned practically how to use threads, how to communicate between two different applications (locally or over the net), how to write a daemon or a very basic device driver or how to structure programs and interfaces best. I could easily extend this list for forever (which demonstrates my serious interests in programming, doesn't it?).

Of course I know these are things you don't learn from one day to another, however I feel that I will not even get close to this point because I simply don't know where to start. There are a lot of interesting questions here on stackoverflow (or on reddit) or blog posts on the Internet, but either they are too simple or to hard to understand for me. I sometimes think my programming skills are reduced to communicating with databases only.

What do you think would help me most to get out of this state of mind? What did really help you making progress? Do you have any recommendations on where to start?

Thanks for anyone who has made the efforts to read until the end. I really appreciate any thoughts.

Related:

and others. Pretty near a duplicate.

+1  A: 

If you like to figure out algorithms and be more math based, you could always do the problems on Project Euler.

CookieOfFortune
+5  A: 

I've never regretted more, that I can vote up a question just once ;)

As You have obviously discovered, programming and computer science are big fields. It really depends on Your interests.

Possible ways might be:

  • Study computer science
    • You will get most of the theoretical backround there.
    • It is likely that You get some practice.
  • Try starting or supporting open source projects
    • This will show You by good and bad examples how programmers develop software as a team.
  • Try designing/coding for money
    • This will teach You a lot about understandig requirements.

It really depends.

By the way, there is no one on the third planet, who knows everything about programming and computer science. I guess, it will not be easy to find someone who is outstanding in both web application design and device driver development...

Black
"BTW there is no one on the third planet, who knows everything about programming and computer science. I guess, it will not be easy to find someone who is outstanding in both web application design and device driver development..." ... apart John Skeet? ;-)
yves Baumes
"By the way, there is no one on the third planet, who knows everything about programming and computer science." No, for that you'll have to go to Mars.
Calvin
"By the way, there is no one [...], who knows everything about CS. I guess, it will not be easy to find someone who is outstanding in both web application design and device driver development..." Of course you're right. Anyway I think it is good to know how these things basically work.
Bluegene
+1  A: 

Write a simple application that exercises some of the concepts you want to learn. Reading is fine, but applying it is most useful to understand it. What you need is some carefully selected application idea (not too simple, not too complicated), implement it and improve it with new features. Without a goal, your learning effort will not be focused enough.

Rainer Joswig
+2  A: 

Pick one language and learn that really well.

It doesn't matter which language you learn as long you put the effort in.

Find out (using Stack Overflow) which are the good books. E.g. For Java you could pick Thinking in Java by Bruce Eckel. Start at the beginning and work through to the end.

The other thing you could do is to pick a certification course. The Java certification courses will give you a qualification (if you take the test) and will ensure that you learn all aspects of the language.

My other advice would be to pick a project to hone your skills on. It doesn't matter what it is: you will end up writing and rewriting it until you feel comfortable with the end result. Write yourself a backup tool or a something to manage your photos.

Never be afraid to write code and throw it away. I've been programming 30 years and I still rewrite my code endlessly.

Once you are a master of one language - learn another. If you learn Java you will find C# easier (and vice-versa).

Fortyrunner
+6  A: 

I thoroughly recommend you find and read blogs about software development; there are lots of really great ones out there. Subscribe to periodicals. Talk to other developers in chat rooms. Participate in software development forums. Buy books on software development theory -- and by that, I do not mean Learn to Write C# in Thirty Days type books, I mean books with titles like Concurrency Issues in Multi-threaded Software or Patterns and Practices and How To Use Them.

But ultimately, the only really effective way to sharpen your coding skills is to write software.

So if your current job is not allowing you to expand your skills, do stuff on the side. Pick an aspect you have heard about and want to learn about, then write a program that uses it. It doesn't have to be functional or even useful, although it certainly helps if it is -- especially if it's beneficial to the community as a whole. But you have to write, otherwise you'll never get where you want to be.

It's rather like writing in general; authors of novels never start out and write a huge novel and then get it published. Instead, they are always practicing in the form of themes and essays and short stories and so forth. The only way they grow is by practicing their skills. If there's some type of fiction, some literary technique that they've never done but always wanted to do, they think up a small idea then run with it. Most of the time it goes nowhere, other than to help the author think about writing.

That's what you need to do. If you've only ever done web programming, do something completely different. Write a desktop application. Make it multi-threaded, just because you want it to be. Make mistakes. Go down a path until you've hit a dead end and say "how the hell did I get here?" Then back up and try again.

If you don't practice, you'll never get better.

Randolpho
+4  A: 

Unlike other fields, programmers have an easy way out of your situation. Just do it.

No architect, who is bored with houses can just on a whim, build a skyscraper. You COULD do the equivalent... If you really wanted to.

Pick a lower level language (or 2, or 3), buy some books and get coding! Those of us who are entirely self taught live our whole lives this way.

dicroce
+2  A: 

One way that helped me get better quickly was reading source code. Simple as that. In school we get all the theory, some of it we never use it at all, and then we start working on things. Because you are really focused on a specific task you don't really learn too much from working either. Actually not fast enough to keep up with the technology.

My advice is take your questions one by one, find the best open source project that can answer it and just inspect the source code. If you don't get it from the first try let go for a while and come back to it later. I've got all the open source projects I'm interested in checked-out on my local drive for a quick reference when I need them.

Of course, you shouldn't ignore, blog posts, big events, podcasts, webcasts, etc.

Don't forget to contribute back to the community as well :)

Cosmin Onea