10

Hi all,

After 2,5 years of professional Java programing, I still have problems that make my job difficult and, more importantly - more times that I would like to admit - not enjoyable. I would like to ask for advice by more experienced people on ways that would help me overcome them.

These are the problems I have:

  • I do not absorb new knowledge easily. Even when I understand something, after a couple of days I easily forget even basic stuff. Other co-workers, even with the same working experience, when reading new technologies put things easily into "context", and are able to compare in "real time| similar technologies they already have used.
  • I always try to address all the issues to whatever I am doing at one go, which results in me trying to resolve too many problems at the same time, losing completely control. I find it difficult to make my mind on a single problem that I should address first, and even when I do, and find myself throwing away code that I wrote because I started addressing the wrong issue first.
  • As far as architecture and data modeling is concerned, I have difficulty making decisions on what objects must be created, with what hierarchy, interfaces, abstraction etc.

I imagine that - to a certain degree - these things come with experience. But after 2,5 years of Java programming, I would expect myself to have come much farther that I have come, both in terms of absorption and experience.

Is there a way to improve my learning speed? Any books, methods, advice is welcome.

6

The book I would most highly recommend is Code Complete. It will give you a solid foundation to lean on, and will also teach you practical tips to grow in your knowledge of software development.

It takes some time to fully understand the complexity of software, so don't give up. Break things in to smaller pieces and focus on that small piece for awhile. With so much to tackle, becoming overwhelmed is easy if we don't learn in manageable chunks.

5

Regarding your difficulties in learning and remembering, I suggest you start keeping a handwritten journal of important things you are learning. There is research showing that writing notes by hand activates areas in the brain that are not activated by just typing or reading. The extra activation helps with with learning.

Regarding tackling everything at one go, this is a very common difficulty that junior developers encounter. Some peer review might help, as might some pair programming. You might find it interesting to read Kent Beck's Extreme Programming Explained to learn both about pair programming and about building "the simplest thing that could possibly work". Beck's methods are somewhat controversial, but he has lots of ideas about how to make things simpler and avoid building code that is thrown away. Take the ideas you can use, and leave the rest.

Finally, I think you might benefit from reading some classic work on principled design. Glenford Myers's book on Composite/Structured Design and Constantine and Yourdon's book on Structured Design are both classics, and they are about design principles and analysis. You get a somewhat bigger picture than with Code Complete, and the approach is very different from the "Design Patterns" approach which simply hands you a bunch of designs and a lot of vocabulary, but no organizing principles. (You may safely conclude that I think Code Complete is a great book, but that Design Patterns has limited utility.)

The other classic you should read is Fred Brooks's Mythical Man-Month. It will help you adjust your expectations about what things happen on software projects, and how things go wrong. It always helps to know that other people also struggle with problems of making software work.

2

Learning styles online has assessments that may help in learning how you learn that may help in some ways as perhaps if you learn something verbally it is better than if you learn it visually.

A second thought on retaining information may be to try different ideas to see if something helps with retention. Does teaching someone else something help you retain something? Does repeating various lines each day help drive a point home? Does doing practical examples of using this knowledge help you retain it?

On your second point, I also suffer from this problem. It may help to identify what is the top priority from time to time. Knowing what the key point is can help to have blinders to the rest and believe that those details will get addressed once you have a working prototype. It won't be perfect but the key functionality should be there and then fine tuning can begin.

For the third point, I'd suggest reading up on various design patterns and seeing where you can identify some of these patterns in your current code base and see if that helps get some things to click.

2

"I do not absorb new knowledge easily. Even when I understand something, after a couple of days I easily forget even basic stuff."

For this, I highly recommend a Spaced Repetition System. It's like a smart flashcard system: the ideas is that the system shows you a card when you're just about to forget it, so facts get pushed into your long-term memory with minimal time spent on them. It's popular for things like memorizing the roughly 2000 general-use kanji, but will work for anything you can put on a flashcard. No reason you couldn't use an SRS for (aspects of) data structures or algorithms or whatnot. Being able to access more raw facts will help you put things in context.

1

I'll stick with the notion: "Practice makes perfect " - (the more you practice, the better you will become... )

When it comes to books : I've read design patterns and clean code( the best )

1

I believe you are right in that experience is the best way to improve your skill in any language. I find that tackling small well defined problems gives confidence in using that language.

It also sounds like your having difficulty with organizing a project, for this I highly recommend the book "Design Patterns" by the Gang Of Four (Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides). This book walks you through a large number of extremely useful design patterns that will help you greatly in deciding what classes you need, and how to organize them.

Hope this helps