Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free.

I've currently hit a plateau and want to get better at coding in C and Java. I want to improve, but I think I hit a plateau on my learning curve. I can't find any "advanced" tutorials on the net; most of the things that are introductions that I already know. I don't really know where to go from here to get better. How do I get past the plateau? Would reading through the Linux kernel's source help? Is there a site, or something with advanced exercises or tasks to do? Not something that requires expert knowledge, and nothing basic, but something in the middle. Something with programming puzzles or riddles, that take a couple of hours at most, but not months.

By advanced, I mean that I already know the syntax pretty well. I haven't mastered it, and still make mistakes here and there, but I wouldn't be completely useless without my IDE of choice (Eclipse). In Java, I have a basic grasp of collections, the Swing library, and the JDBC library. I also have some basic experience with ant and junit. I can make basic 2D games, and utility programs with local database connectivity. I'm reading up on Java's sound API.

As for C, it's pretty rusty. I do know the syntax, and know how to use make, but I don't know many libraries. I've tinkered with sqlite3, and made a simple pacman type game that runs on a win32 console a few years ago, but I never really advanced past the basic syntax. Also, I recently learned about function pointers.

Basically, I've gotten the lessons most books have in their first few chapters, but don't really know where to go from here. I am aware that the best way to improve is to code, but I don't really know what to code. I don't really want to keep making the same kinds of programs again and again, but I can't think of any short, but new project.

share|improve this question

closed as not a real question by gnat, Walter, Josh K Dec 6 '12 at 13:16

It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center. If this question can be reworded to fit the rules in the help center, please edit the question.

It would help if you described more precisely at what level you currently are. For example, which of the definitive C / Java books are you familiar with? –  Péter Török Jul 21 '11 at 12:09
Actually made me laugh out loud: Would reading the Linux kernel source help? Hard to answer if you don't tell us what you've done. Generally, my answer is: Start/join a project. :) –  Max Jul 21 '11 at 12:10
After you learn the very basics of programming (syntax), then getting better starts to take more time as you have to put much more thought into what you are doing. –  Peter Smith Jul 21 '11 at 17:26
@Peter and Max: alright, I'll edit my question to try and reflect my current skill. –  cesar Jul 22 '11 at 4:10

7 Answers 7

There is no easy way. No matter what books, tutorials etc. you read, you will not become better programmer unless you write computer programs. You need to code.

I'm not saying you should not read. You should. And you should talk and learn from more experienced programmers. You will get ideas, maybe grasp new concepts. But in the end, if you don't go grab your keyboard and start coding, you will not really become a better programmer.

If possible, start or join a project. When you are programming, show your code to others. Get feedback. Discuss. Rewrite. Share.

share|improve this answer

Project Euler

This is a great site that can help you with the actual code side. It provides coding challenges for mathematical equations. You can code the challenges in any language, however your solution should come up with the answer within a few seconds. If it takes longer than that you need to optimize your solution, and research how to actually get your code working faster.

Learn a Functional Language

Additionally I also recommend learning a functional language. Any functional language. Learning how to program in a functional manner opens up different patterns that can help you to abstract away complex and difficult design choices that imperative and object oriented languages provide.

So far I've been doing the challenges from Project Euler and learning Haskell and I've opened up a completely different view of how to abstract away complex functionality.

Learn Software Craftsmanship

I've written blog articles (as have a lot of others) about this very thing, sometimes it's not your ability to write lots of code, but write clean code.

I highly recommend that you check out the links at the bottom of the page for book recommendations and Robert Martins site on S.O.L.I.D principles to Object Oriented Design.

Friday Forum

The company I work for has started a friday forum where we take about 2hrs after lunch on a friday to try and teach or discuss the values of that new concept to the rest of the team. For instance past discussion topics:

  • .NET optimization
  • Memcache (Implementing and using Memcache for enterprise level development)
  • Domain Driven Design (and actually applied DDD to real world projects following our discussions, and plenty of research)
  • Aspect Oriented Programming (implementing Cross Cutting Concerns in .NET)
  • Software Craftsmanship

Pretty much the idea is to collaborate and discuss ideas and try them out write sample apps that use a new idea. So you are always writing code and increasing your skills.

share|improve this answer
Your software craftsmanship just lists the tools you think should be on the workbench. Perhaps you also should add some notes on how to actually do the craft? –  user1249 Jul 22 '11 at 11:55
@Thorbjørn Ravn Andersen - I'm working on a series of posts, some of these require more than a cursory explanation to do them justice. –  Justin Shield Jul 22 '11 at 12:04

One book that I find outstanding and has really helped me doing better code is Code complete by Steve McConnell, the first edition is more oriented towards C, the second edition more towards C++/OOP. It teaches you things like defensive programming and other not so obvious techniques which are useful in any language you program in.

share|improve this answer

For Java, go for the book Effective Java, second edition.

It will teach you things you did not know before.

Then write code using these new things. It will make you a better programmer.

share|improve this answer

What I learned is that books help a little. Practice is much more valuable. You can read 10 books, or make 3 apps, and you'll see that those 3 apps will bring more experience than the books. So just do something - no matter what. Write desktop application which implements functions you need, write something for the web, do whatever interests you. Then you'll master quickly.

share|improve this answer

You can find things like The Great Tree List Recursion Problem. It is said that working your way up Project Euler can help.

The great logician Raymond Smullyan has a few books that aren't explicitly about programming, but rather are full of logic problems. The Lady or the Tiger, and Satan, Cantor and Infinity both have sections that beg for a program to help you solve the problems. Working the logic problems alone would probably end up helping you, but writing a program to help solve the problems would be even better.

share|improve this answer

Like Anders K. I recommend Code Complete very highly.

In addition:

  • Robert Martin - "Clean Code" (examples in Java so particularly relevant and a great read), after many years of recommending McConnell I now reckon this book edges it out of the top spot.
  • Robert Martin (again) - "The Clean Coder"
  • Fowler's "Refactoring" which is very readable for a "classic"
  • The Pragmatic Programmer (Authors names escape me) is a good read
share|improve this answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.