some thoughts on the "knowledge portfolio" idea 06 September 2003
keywords: design, soapbox, blog, knowledge portfolio
Dave Thomas and Andy Hunt ("the pragmatic programmers") say that you should consider your skills like a share portfolio. Investing small amounts regularly, because these skills are "expiring assets". They also say that you should weigh up the probability of reward with the cost of investment and achieve a diverse portfolio with a balanced risks.
I've been thinking what technologies I've been using and learning, and I came up with this classification:
Educational - Skills and technology that have innate value, last for a long time or give you a whole new perspective. Learning how to build a type of application you've never written before falls into this category. For example writing your first shrinkwrap, GUI-based application, your first web application or your first compiler would all fit into this category. If you program in conventional programming languages based on C or Pascal, learning a different paradigm like functional or logic programming would qualify here.
Personally, I've done a lot of Prolog, and I did functional programming in college - but I do feel that I missed out by not learning Lisp, and by learning object-orientation through C++ rather than Smalltalk. Presently, I'm learning about the powerful, dynamic side of object-orientation by doing some hobby projects in Smalltalk. Lisp is on my agenda to be done in future.
Capability-based - Knowledge that extends your ability to do things or give you new capabilities. This is where learning how to use product, tools or libraries tends to fit. Knowing how to install Linux, or the Windows SDK APIs fits in at this level. Because we're addressing what you can do, systems integration work falls squarely into this category. For example, learning to access COM-based software using Python, learning to make calls between Jython and Java would also count separately at this level. Knowing how to use JNI to link platform-specific code into Java is another example. Learning how to use a development technique like extreme programming also fits in this category.
Capability-based investments expire more quickly than educational ones. If you haven't touched a technology in a while you might find that your scripting language of choice has got new, albeit dodgy object-oriented facilities (like the change from perl 4 to perl 5), or that somebody sneaked the gargantuan standard template library into the C++ standard when you weren't looking. It's usually worth watching the things you aren't using any more, just to keep them up to date. There's a distinction between pure capabilities (what something enables you to do) and commercial capabilities (what something enables you to do as part of a commercial system). Just because you can't use something in a product at work doesn't necessarily make it useless. You might be able to use it as part of your development toolset, in an internal application, or in private work. Open source technologies tend to excel as capability-based investments because they're usually written to solve some specific problem, don't usually involve up-front fees, and have liberal software licences.
I've worked with Perl as a scripting language for a long time, and I can see that Python and Ruby offer pretty much the same facilities as perl, but without the ridiculously arcane complexity of perl. Python and Ruby can also run inside Java where Perl can't. This means that I'm interested in Python or Ruby. Ruby is conceptually cleaner, and is recommended by at least four smart people (PragDave, Andy Hunt, Nat Pryce, and Martin Fowler) but isn't as popular or well-established as Python.
Marketing/Fashion - Having capabilities isn't usually enough. Often someone else dictates the platform and the tools. This means that we have to watch what skills and techologies are saleable and the likely trends in demand for those skills. Being at least a little buzzword-compliant gives you more flexibility in the marketplace. There's also an important crossover between the marketing and capability-based categories with systems integration skills. For example, I recently learned how to incrementally migrate a web application from Microsoft ASP/IIS to J2EE, and one way to link C++ and Java together in the same application.
As a strategic decision, I've decided to learn more about Oracle. It fits well with my Java skills, but it's also useful on windows and with other programming languages. (Yes, more diversification.) Although Oracle is a relational database (yuk) it is very popular and is likely to remain so for some time to come. Theoretically .Net should be a strong contender in this category in future (as it will be in the capability-based category for those who haven't done web services in Java) but C# is far too close to Java to look like I want to do it in my spare time.
Summary
So you can see that when I pick skills and technologies, I'm rating them on three criteria. This year, my position is:
Dolphin Smalltalk - A powerful programming language (education), with a normal-looking Windows GUI (capability) and using the conventional Windows APIs (capability). Picking Smalltalk is high risk, high reward but doing it through windows APIs mitigates some of that risk.
Oracle 9i - Learning more about a very popular database (capability/marketing), fits in well with Java (what I mostly do now) yet can work just as well with other platforms and languages (diversification). Oracle is a conservative stock, although low return.
Ruby/Python - I can decide between them. I want to choose Ruby on grounds of conceptual integrity, but I'm worried about the marketing/fashion impact of this decision. Python is quite a way behind Perl in market share, and Ruby is behind Python, so Ruby might never make it to mainstream use, whereas I have seen something resembling demand for Python work. They both work on the JVM (capability). A decision on this is posponed until after I'm further down the track with Smalltalk.