I've read and understood the Head First OO books, including Design Patterns. I've read through the DP book a couple times now, and I really feel like I not only understand the patterns, but also have a pretty good "armchair-coder" grasp of why the patterns are the way they are...like why this pattern uses an interface or why that pattern uses inheritance, etc. Although when it comes to my own code, I don't really know when to use inheritance, or when to go with an interface. It still doesn't feel like I'm really OO-ing it in my own code. What's the next step?
So a little background might help. I'm a hardware designer, and all I've ever used (for almost 15 years) is procedural languages like VHDL, Verilog, Perl, Tcl, C, and whatever else I've had to pick up along the way.
With the latest verification and modeling languages like System Verilog and SystemC, we're getting large doses of OOP finally entering our world. The guys from SW backgrounds are able to pick this stuff up no problem, and have very firm grasps of best practices and how to really leverage all these new (to us) techniques. Of course, they suck at designing HW, so I'm not worried about my job security or anything.
However, I do want to learn and develop. I am comfortable using my OO languages at work (mostly System Verilog and some SystemC/C++), but I don't think I'm really getting how to best go about OO design. It always feels like either I'm just splitting up procedural code into classes, or I'm just using design patterns by rote instead of really designing.
Is the next step just to keep doing? Or are there more concepts to learn that will make all this kind of fall into place?
Other background that might help, I've started doing some Joomla/PHP/SQL stuff in my spare time, more as a hobby, although some folks have been paying me to do some stuff for them. I've been thinking about learning Javascript, or something like that to extend my knowledge in web development. Would it help to learn a more standard and widely adopted OO language?