Monday, June 13, 2011

Things I need to get better at

Being a jack-of-all-trades suits me.  I enjoy being able to dabble in many diverse areas of technology.  Although my knowledge is shallow in many areas it is broad.  I am a decent programmer in many languages, and I have in my short career worked with embedded device drivers and firmware, writing proprietary messaging protocols over TCP/IP sockets, stored and queried needed information on both MySQL and H2 databases, wrote XMLRPC servers, RMI servers, written JNI wrappers around C shared libraries, and many things inbetween.  In other words, I have a pretty good view of the entire technology stack.

But there are still many areas I need improving on.  Now that I am writing more java again, and I wish to be better at clojure, I need to get better at the java ecosystem.  For example:

1.  Get better at maven.  I have built a few non-trivial maven projects, including one multi-module, but a lot of maven's finer points still elude me.
2.  Javadoc commenting.  I just let Eclipse auto-fill in the params and return values, but I really should know all the markup for it.
3. Annotations.  I understand them in theory, but I've never written one (same goes for python decorators)
4. Unit testing.  Yeah yeah, being in Test, I should know JUnit or TestNG like the back of my hand.  While I realize their importance, sadly, time constraints often win.  I have tried writing some TestNG unit tests, but they are not being called from maven, and I haven't had time to figure out why
5.  OSGi.  While I have written two eclipse plugins, I still don't truly understand a lot of OSGi.  I understand what it's for (modularity to decrease coupling, and provide metadata to end jar hell), but it's such a huge beast that I need to know more


There's also a lot in general that I want to get better at or relearn:

1. C/C++.  I haven't seriously written any C or C++ in a little over a year when I was doing some JNI wrapping.  The new features in C++0x looks interesting, and eventually, I hope to get back to more JNI programming.
2. Advanced python.  By this, I mean stuff like decorators, generators, continuations, and metaprogramming.  I actually think I finally understand generators (functions that yield an iterator like object), and how they can be used for continuation style programming.  I once showed a coworker how to implement "private" methods and fields in python through implementing some of the magic methods, but that's the most metaprogramming I've done.
3. Algorithm design.  After implementing a homegrown software dependency installer program, I came up on my own a depth first search algorithm that could do post-order traversal.  I didn't know it was called that until after I read the chapter on traversal algorithms in the book Python Algorithms: Mastering Basic Algorithms in the Python Language.
4. Concurrent programming:  Most of my experience with multi-threading has simply been to spawn a new thread to prevent blocking during a long running task.  Only twice have I had to share data across threads, and honestly, I'm not sure if I synchronized things right.  One reason I wanted to learn clojure was for its approach to concurrent programming (even OpenGL is massively parallel in nature).


And while all of the above will help me in the "real" world, for my own personal desire, I still want to learn OpenGL, and get better at clojure.  I also want to get better at JBoss's Netty NIO framework.  Sadly, much of my spare time is spent working for work.

No comments:

Post a Comment