Skill Set By Category

Each skill set, or grouping of skill sets, is listed as a separate page with notes accordingly.

Agile Programming Approaches

Agile programming approaches have been all the rage at user group meetings and NFJS for the past several years.
 
Every project I have been on since mid 2003 has utilized one or more of these approaches, whichever I could get the team and/or customer to buy into. The short iteration cycles are the easiest to sell, and the testing is easy to do even without permission, though different programmers resist this technique with differing amounts of force.
 
My most recent project in 2009 saw agile practices undertaken with great gusto by the customer, and as a result saw the biggest boost in yeild. As a result, it has also been one fo the most successful and enjoyable projects I have worked on.
 
No-one would ever give me an award for purity in agile practices. My own testing tends to be too course grained and hurried, sufficient to get it working initially but insufficient for daily test runs. Similarly, pair programming is done on my teams with only half hearted zeal, we tend to split up the work once we have a shared technique and meeting of the minds. Frequent refactoring, however, is usually done quite aggressively - as it seems to bear the highest yeild for the least effort.
 
Perhaps the easiest thing to implement is also the highest yeild. A daily standup meeting (90 seconds per developer every day same time) can be amazing in it's effect on a team. It takes a forceful personality to implement in the initial 21 days - but once it's "in" it's rock solid and well loved by all. And the accountability and zeal that follows is hard to beat. I've used this technique for two straight years and have nothing but good reports to offer.

Automation - "Code that writes code"

"Code that writes code" has been my specialty since 1999. For me anyway, it was discovered by accident, yet it became my major focus for a couple years around 2000, 2001, and my most marketable skill from that point forward. Only in recent years has my emphasis moved toward more protoptypical concerns.
 
The initial accident happened when I discovered that the code that I was writing would be easier to generate from a script, because scripts don't make the same typos.
 
I tried it again with surprising success at Nortel in 2000, when I used it to show off and distribute some menial tasks that had no chance of getting done if allowed to be delegated to personell by hand. Once again I was totally surprised how easy it was and made a note to try it again sometime when the stakes were higher.
 
My first serious persuit was WebAppWriter, which I finished in 2000 and stayed up and running until I finally brought this publicly accessible server down in late 2005. This application wrote complete and functional web applications, including security, logins, and custom create, edit, tabular and delete views for each table that you give it a structure for. This tool wrote apps to fit within the Expresso framework, and was very popular and successful for the initial years. No attempt was made to keep it up with subsequent versions of Expresso, and it gradually fell out of favor.
 
The applications generated by WebAppWriter prooved extremely durable and easy to customize, and in 2001 and again in 2004 I was able to use this tool to write applications for customers in a matter of days, which I was then able to customize beyond the boilerplate forms and tables provided.
 
By 2001 I was making presentations to users groups and getting a strong name within the community for my use of code generation and frameworks. It began to be my calling card - I introduced myself as the automation guy.
 
Also called "Code Generation", this practice is not without it's negatives, see Automation Lessons for a summary of when all this stuff is a very bad idea.
 
In 200n I used it to generate hundreds of data access beans for a project that was being written all by hand.
 
Later on that same project, after spending months writing pl-sql scripts for complex data conversion routines, I took a month and automated that same process, so that the same scripts I was writing by hand for days at a time could be written in seconds by merely pointing the generator to the tables in question.
 
In 2003 I was hired by Lockeed Martin, primarily on the promise of my ability to quickly write code generation scripts for a large implementation of an inventory management application. Things stalled for a couple months, not because of the generator, but because it was difficult to isolate and learn the code that had to be generated. Once that was ascertained, it took about a month to generate then hundreds of thousands of lines of code that had previously been written by hand. This was also a bit of a breakthrough for me because it was the first time that I had used XSL transformations as part of the tool set.
 
Once the initial code set was written, I worked for several months on refinements of the code to decrease the need for hand customization after generation, finally migrating it to a set of Eclipse tools (see link here).
 
In 2005, after spending almost a year writing framework and application code by hand, it was time to port the new framework code to the dozens of new tables which had been added into the app. I spent aproximately one month, and once again 10,000 lines of code appeared in seconds.
 
Again in 2006, after slogging through an endless morass of custom written code in one project for months, I was able to replace about 80% of it in two weeks using a simple sourceforge mda project.
 
Now of course the whole world is going whacko with this "Rails" thing, so that plus another 20 or so great alternatives already open sourced, there is no need to consider any other type of alternative, once one knows the basics, and has done it a few times

Lessons Learned from Years of Code Generation

EXECUTIVE SUMMARY OF THIS PAGE: Database Table I/O is almost the only use case for generated code. Of course, that covers about 85% of most code written :)

 


 

It is interesting that one of my most important mentors who is always highly supportive - Michael Nash - has been almost silent with respect to code generation, excepting one very pointed criticism. When someone I respect as much as Michael criticizes, something he almost never does, I listen.

 

His criticism of code generation in general is quite simple. Generated code is almost always a dumb idea, and code that can be generated should almost always be simplified and written once as a higher level of abstraction, at the framework level.

 

This has been an important lesson for me. My first reaction was to simply stop generating code, which I did for a year as I considered Michael's analysis. But then, I did come up with one very pointed and singular use case, and I have pretty much stuck to this use case from that point forward.

 

Virtually all applications point to database tables and fields, usually lots and lots of them. This code is actually some of the most verbose code, and from this code is also derived table headers and form headings. This is code that can, but rarely works well as framework code, it is almost always customized beyond the pointers in the database.

Build and Version Control Tools

Ant

I have written dozens (maybe hundreds if you count code generation) of Ant scripts of varying functionality, everything from the standard build scripts to specialized scripts that kick off external routines.
 
My ant skills have gone mostly dormant for the past year or so, as everyone I work with has moved exclusively to Maven. There are some routines which still require Ant due to deficiencies in some Maven plugins, which I am happy to do.

Maven

Maven has become the standard on every project I have worked on for half a decade, and appears to be that way for everything in the open source java world as well (such as Apache).
 
I have "mavenized" perhaps a dozens of projects by now, including many that were originally built with Ant. It's actually quite an easy process now - though it was pretty painful in the earlier years.
 
I also presented Maven as a topic in a several presentations to local user groups over the years including the last one in February 2007 to JavaMUG.
 
Maven is a frequent topic on past blog posts, though I am happy to note that this is becoming much less so as Maven becomes less controversial and less worthy of arguing about.
 
As Product Manager for MyEclipse in 2008, one of my proudest (and most intimmidating) accomplishments was sheparding the M2Eclipse Maven plugin through the development and testing process to become an integral part of MyEclipse. All credit goes to the brillant development team that did the integration however - my part was just to set the targets and do the testing as it became a part of the product.
 
There are many like me who take the position that "To love Maven is to hate Maven". Over the years, it has been a real sore spot at times, yet I would never consider doing a project without it. There are simply too many advantages, too much power, to forgo it's use. This is true, despite it's many shortcomings.

Client and GUI Work

GUI Design

My most brilliant decisions with regards to design are to leave it to the pros. If we have learned nothing else from Steve Jobs and Apple, it is that UI design trumps almost every other feature of a good application. If you have ever worked with a solid designer such as Roberta Masciarelli or Chris Giametta, you know the difference that such talent can bring to the table.
 
Over the years I have designed dozens of screens, most also implemented by myself. I do not consider myself a committed designer because I have never allowed myself, nor been allowed, sufficient time to really define the functionality of a GUI in the kind of way that I expect from some of the best programs I have used, such as Office or QuickBooks or any other app.

Types of [UI] Clients I have worked with

I mistrust this list because it seems there have been so many different types of clients that I couldn't remember them all, but mainly here are the different types of clients I have programmed in successfully since 1980.

  • Command Line (Green Screen) clients
  • Command Line (Shell) clients
  • Visual Basic
  • MS Office / VBA / MS Access
  • Browser
  • Java Swing
  • Java SWT
  • Flex
  • Ajax
  • Eclipse
  • GWT (minimally)
  • fX

For the record, I am much more enthusiastic about the Swing toolset than anyone else I know. Fat desktop clients went out of fashion when the RIA browser apps got powerful, because fat desktop clients were a disaster for the teams that had to keep them updated. But that disadvantage went away, for me, when JNLP showed up (WebStart). Since then, I've been a real fan of Swing, and now even more so that Swing can be hosted by an fX browser client.

Databases and Database Related

 Whatever my title or role, I have almost always been the domain architect or database guy or DBA on every project I have worked on for the past 10 years.
 
I'm always happy to delegate as much of the authority and or work to whoever it fits best with, but design issues at the domain model level almost always get decided at my desk last.  
 
Hierarchical data structures can take many forms, including but not limited to databases. Linked below, I cover some of the particulars of my experience in this area.

Database Design and Normalization

Databses being the storage mechanism of choice for nearly any modern application, database design has usually been a part of every development job I have ever had, the two exceptions being large projects where database design was a function of a single specialist.
  
In 1999, as database administrator/designer/developer for IBM's y2k remediation project for TXU in Dallas, I designed the entire, somewhat complex relational database structure to represent almost every piece of hardware in TXU's IT infrastructure. Done on a very hasty deadline, we nonetheless finished a bit ahead of schedule and in fine style.
 
In 2005, as architect for Blueline Technology's software development, I oversaw database normalization by others, resulting in a database footprint perhaps 25% of the table/field sixe of it's original size.
 
In 2006, as ProductManager for Semantra, worked intimately with founder and codebase to integrate this applications database with current coding practices.
 
In 2007 and again in 2009, worked with a fortune 500 retailer to design and implement, from scratch, a mission critical application based on my database design.

Database Migration

Three different contracts, in 1998, 1999 and again in 2003, put me in the position of having to handle massive database migration efforts on a daily basis for months.
As a consequence, I am fairly good and well tooled in this area, and with many different platforms, 4 different database brands, and flat files.

FilePro

FilePro, a piece of software that is long since outdated, was an extremely powerful database, client, and general application framework, back when command line clients and green screens were king, just after the last dinosaur roamed the earth.
 
I spent a decade writing, maintaining and using FilePro applications in my daily business (1985-1995). It ran in unix and served up its screens in our green-screen terminals, where the admin help typed in the data and or got their reports. It's kind of hard to believe, in modern terms, but it was very powerful stuff back then, and I had no idea at the time how sophisticated the stuff I was writing was. At the time, I just needed it, and it got the job done.

MS Access

Get ready for a laugh, my friends, controversy follows:
1994-2006
MS Access may be a lousy database, but it is a great interface and terrific reporting engine to any other database, at least from a windoze desktop. I have been an enthusiastic user of MS Access, both using and over-using it since I learned it in 1994 to maintain my own time recording application.
I have also used it to do quickie corporate work throughout the years, and to put together internal use databases for work groups that would otherwise have to do without.
Two different year-long jobs, one in 1998 and one in 2000, started out as MS-Access and migrated the database structure itself to SQL Server, once the kinks had been worked out. Both retained the MS-Access interface, using these to link to the data on the more serious platform.
This same technique works great with MySQL too, I have done backend MySQL and front-end MS-Access, that works really well when you have a large data set but need the power of the easy to develop and maintain MS-Access interface.
I get a lot of grief from my serious programmer friends for being an enthusiast, but if it works well, I use it.

MySQL

I have installed and maintained perhaps dozens of mysql databases since 1998. I am still not brilliant at it, because it has always been a secondary task to my primary task as developer.
I have found mysql to be an exceptionally reliable and fast database, though I have never used it with any project that requires transaction support.

ORM (Object Relational Mapping) Tools

I was an early advocate and user of O-R tools since 2004. When first introduced to Expresso. Now popularized through Hibernate, I have used first Expresso and then Keel's version of same, and also spent a few months using another tool called [can't remember] during 2003-2004.
The syntactical and or semantic differences between the various tools are not great, and I would feel comfortable tackling any such usage as required by a contract or job.

Oracle

Spent several months writing data migration stored procedures in PLSQL, Oracle's proprietary language. See also Data Migration.
Also took week long PLSQL course given by the contracting agency I worked under in 1999.

SQL (the language)

In almost every job I have had SQL has been an integral part of the job. I have done it from scratch, and also using any of several tools such as Toad, Access, others, though I tend to do pretty much from scratch in later years.
Familiar and comfortable with pretty much all of the constructs including ddl, but I remain shameless about keeping my example syntax to guide me.

SQL Server

Got certified in SQL Server admin at the 6.5 version level, for whatever that is worth.
Managed two migrations from major over-taxed MS Access databases to SQL Server, at two different companies.
Spent several months writing very complex stored procedures (and a few triggers) in SQL Server. Basic functionality was to render complex combinations of selects and subselects as a simple tabular result query. Some took several minutes to run even on fast boxes with relatively small data sets, so it got pretty hairy.

Frameworks

Core contributor to highly successful expresso framework for critical year before it rolled out it's first worldwide popular version (4.0), focusing primarily in useability and UI issues. (It was a very vibrant project in 2000, when I was involved.)
 
Founding contributor to keel framework, supporting first the marketing side, site management and wiki. Later automation, tools, and useability features. This framework died a slow death by 2007, we never recovered from the emergence of a much stronger and easier to use SpringFramework.
 
Interestingly - as per Neal Ford of Thoughtworks - frameworks are being increasingly seen as an anti-pattern. My early experiences with frameworks tend to validate that point of view, as if a framework for getting something done almost becomes "Tail Wags Dog".  
 
Regardless of which frameworks you do or do not espouse (SpringFramework, etc) the use of frameworks will not go away easily. I've learned a lot from this evolution over the past decade, and expect to learn much more by observing the evolution of frameworks towards 2020.

CMS/Wiki-type stuff

Everywhere I have gone since perhaps 2003, and with all of the open source projects I was a committer on, I established a wiki and/or later, a CMS (Content Mangement System). Thsee make excellent tools for documentation and other group collaboration efforts. One example of a CMS is this site you are reading. CMS is getting to be very powerful and easy to use, and it has been a very productive way. I must be on my 50th site by now, it is getting pretty easy.

Expresso

I was a core contributor to the popular Expresso framework during it's version 1.0 to 4.02 migrations, as well as writer of the then popular WebAppWriter code generator, which generated entire web applications from existing database structures.
I have created Expresso applications for clients as well.
Beyond version 4.02, I have had no involvment with Expresso, not because it is a bad framework to use, I just went to keel instead.

Keel Framework

I was a founder of the Keel framwork and have been actively involved since it's inception, some years more than others.
Keel is an IOC framework, much as Spring or Pico or others are, except it has different goals as a project.
The last couple of years I have been working with Keel every day.

LAMP - (Linux, Apache, MySQL, Php)

Linux, Apache, Mysql, Php
I have both used, and also experimented with these technologies throughout the past several years since 2000, mostly in an effort to ease my workload adminstrating web sites which I use for documentation or otherwise.
Projects using these combinations of technology about on the internet, and are one of the most popular forms of open source projects in the public domain.
I have found many of them to be surprisingly high quality, fully featured, and easy to deploy, use, and customize. It also seems as if I am getting pretty fast at deploying them experimentally, as I have done so many of them.
See also my experience with:

 

General Business Skills

Bottom Line Management

Probably nothing sets me apart from other programmers more than the fact that I have managed profitable (and not profitable) businesses for decades at a time, through thick and thin.
 
Making payroll for as many as 30, once close to 50 people at a time, keeping costs in line with billings, etc, has a way of disciplining one's self beyond what one might imagine before undertaking such a silly thing.
 
2005 - 2010 virtually every project I have worked on, I have also answered to the owner or management as the principal product lead responsible for direct bottom line costs and productivity. 

Marketing

Marketing is not the same as sales, marketing is getting the message out there, and I have been a practiced and recognized marketer since 1985.
 
Sometimes polished, sometimes rough, but always effective for my target market, I established a very well known brand in my small market segment in the 1980s.
 
For the decade between 2000 and 2010 I have carefully avoided all forms of marketing other than user groups due to having consistently more work than I wished to take on as a one man firm.

Negotiation Skills

Negotiating may seem to be a curious thing to put in an IT resume, but it is an IT skill that I find useful every day, no matter if I am negotiating scope on a win-win basis with the customer, or negotiating which technology to use with a peer.
 
It didn't start out as an IT issue, from 1975-1988 I negotiated dozens and dozens of building contracts totalling over 5 million dollars, and found that generally, the record showed that I did not excel at this task during this period. When I learned there were actually courses I could take, I attacked the study of negotiating with the zeal that comes from having one's butt handed back to one'self on a platter. I didn't let go until i proved to myself that I had developed excellent negotiating skills.
 
Negotiating is all about win-win, and at first I negotiated too well, it was me winning and others losing. But over the years I have matured and grown in this practice, and now am fairly good at it, at least I am when I want to be.
 
I negotiate every day. I negotiate with team-mates on best tasks for each to tackle. I negotiate with bosses and owners on approaches and goals. And on and on through every aspect of my life. Good skills in this area allow me to use my best talents where they do the most good, and the same with others I deal with.

Presentation and Communication Skills

Since you are reading an example of my communication skills, perhaps you could tell me as much as I could tell you.
 
Sparing you of false claims about the quality of my communications, I have been an active and sometimes articulate communicator in many different media throughout my life.
 
Have tried to keep up with all the latest fads and styles, seem to be as capable as the next guy at:

  • Blogs
  • CMS (Drupal)
  • Powerpoint/Office etc
  • Twitter
  • Facebook
  • Whiteboard
  • Pen and paper

If there is an achiles heel, I am not the best long-meeting attendee you have ever met. Meetings that I run are typically over very quickly, unless I can get it down to a couple or three attendees and then I'm a little more relaxed because the meter isn't running on as many bodies...

Project Management

I have been managing projets and personell consistently since 1976, before I even finished my first trades apprenticeship. I have a;most always worked with small companies and teams, which where the manager is not just the leader, but also the provider of whatever element was missing from the team.
  
From 1975-1997 I managed millions of dollars of construction work, most of which I also estimated, sold and contracted with both customers and vendors.
  
From 1995 to current I have menaged many projects in the IT world, though typically this has only been my own work, or the work of a very small team.
 
In the IT world which often shuns management as a general rule, my management role has often has to be undeclared or de-facto. This is usually a more comfortable role for me, as it's easier to get co-operation from peers than subordinates.
 
EDS once advertised it's work as herding cats, which for me as often been to spread out the facts to those on the team, and asking them how they wished to address them. Often that is all that is requierd to keep a project on track.

Sales Engineering

I have sometimes worked with customers to engineer or re-engineer projects to make them fit the customers needs better and make the sale. 
 
It is a role that I feel comfortable with, though I have rarely worked in this role for more than a few hours or days at a time.
 
This is almost always a win-win for both customer and producer, as it is rare that an initial design concept perfectly nails the most efficient way to produce software, or anything, for that matter.

Teaching Training Lecturing

I have been teaching formally and informally since 1977, when I began several years as an instructor for several different modules of the local carpenters apprenticeship program.
1986-1990 I ran my own formalized training program of sorts to facilitate the crewe I was running in my own shop - Pete Carepenter Company. We met weekly, and covered every relevant topic. Attendance was equal to crew sixe, usually 8-20.
2001-2004 I co-founded and ran or co-ran (depending on the year) the local users group "Hands On Java". We met at different periods, sometimes bi-weekly and sometimes monthly, and covered a wide variety of topics. I presented about 10% of the sessions myself, volunteers or my partner presented the rest.

Team Building

Much is made of the Horatio Alger type story where the guy starts at the bottom, but it doesn't always have to end up in wealth.
Having started at the bottom and working my way up in both programming and previous careers, I have always found it easy to build the best teams. This is something I also learned from my Father and GrandFather, as I watched them as choral directors build brilliant choirs from otherwies undistinguished participants.
Whether working with a titled lead role or as a peer, I have always found it possible to encourage, lead by example, raise expectations and compare notes, building strong teams as a natural result. I have always found that a strong team is more than just efficient, it is much more fun to work on a strong team for all players.

Work Flow Analysis

Several times throughout my career I have performed an analysis of work flow situations, and come up with a solution for improving efficiency.
The interest is far from academic, see Bottom Line.
As it relates to the programming/development profession, several of these analysis and prescriptions resulted in new architecture, re-distribution of tasks, usage of new technologies, and other.
This is a field which requires both analysis and diplomacy. I have always been better at the former, but have learned a great deal about the latter in recent years.
It has always helped that I was willing to tackle whatever the hardest jobs that came out of such tasks.

General IT Skills

CAD and 3D Modeling

I have hundreds of hours of CAD (Computer Aided Drafting) and 3d Modeling.
In CAD, I have worked for an exhibit builder, a cabinetmaker and an Architect doing shop drawings, in three different programs including AutoCAD. This experience precedes 1995, so I am fairly rusty. Not that I ever got as fast as a full time production CAD person in the first place.
In 2005, I have probably 100+ hours working in a program called ArtOfIllusion. It is a 3D Modeling program that can be used to create almost photo-realistic images in 3d. As my work was purely geometric, I used this tool entirely in scripts rather than drawing usung the GUI.

PageMaker (Desktop Publishing)

Between 1988 and 1994 I was an active user of Pagemaker, and produced several marketing peices all the way through the printing process.

Photoshop/GIMP

I learned enough photoshop years ago to create images such as logos and schematics. I am far from brilliant in this area but I can get the job done, I have always had to do it on a friend's computer as she has photoshop.
Recently I moved entirely to GIMP, which does all of he same operations I was using.

QuickBooks

I am generally familiar with QuickBooks and Quicken and can do the rudimentary stuff.

Security Skills

I am the antithesis of a well rounded security specialist, but I have worked for a decade with role-based authentication and authorization in many different systems: managing, customizing, and implementing, as required.
I have also succesfully used encryption libraries since 2000, though this is not something I consider an area of expertise.

Site/Network Admin

For about a year, around 1997, I worked as a network admin and general IT support admin for about 100 employees at Exhibitgroup-Giltspur in Grapevine.
 
I maintained the network and file servers, all machines, internet access, voice mail server, and corporate email connectiviity.
 
During this same period, we also upgraded the entire staff to Windows 95 from Windows 3.1. I built and/or rebuilt dozens of computers.
 
Responsibilities also included building and maintaining a few MS Access applications, including an inventory application, and a project managemnt app.

VI

I use VI frequently, and am still not very good at it. I just use the basics and wish that I would take the time to learn more commands, but I never do.

Web Site Management

I have built and maintained dozens of sites since 1998, mostly user's group or open-source oriented sites, but also a few personal and a few business.
 
As with similar skills, this isn't the kind of thing that recommends me to higher paying contracts, but as an adjunct to my other skills it is something I can do in an easy, fluid, and quick manner, or at least as easy as that type of work gets anyway.

IDEs

I have over the years mastered the basic functionality of sets of visual studio (1995-2000), forte/netbeans (2000-2003) and Eclipse (2005-current).
 
As with any everyday user, I have fallen in love with Eclipse and can't even remember how to work in previously favorite IDE's.
 
For most of 2008 I served in the prestigious position of Product Manager for MyEclipse, the superb IDE based on the Eclipse platform. I still use MyEclipse everyday, and regard it as one of the finest accomplishments of tooling vendors anywhere - as the perfect merger of open source tooling and proprietary development and support.
 
I have also created several successful plugins with Eclipse. See tools.

Languages

C Programming Language

I have written C programs, and also called C programs from within Java using JNI. But this experience is very slight, and except for saying that I can and have done it, and might could do so in a pinch with enough time, I could not call myself a C programmer.
 
On the other hand, C programming syntax is not so terribly differnent than Java, and I would feel comfortable taking most any program written in C and converting it to Java, perhaps excluding external library calls.

HTML

I have been actively maintaining web sites and web applications using HTML since 1999.
 
It is not something an programmer points to with pride, HTML is the kind of work that one typically tries to hand off to novices and graphic designers. Sadly, I probably have hundreds of hours with HTML over the years.
 
I also use CSS and javascript as required, but am not brilliant at either. Mostly I just modify work written by others.

Java

Full time java developer since 2000, have done just about everything from Swing applications to automation to full blown j2EE applications.
 
It is interesting that I do not consider myself a brilliant Java programmer, despite being regarded with somewhat elevated status by those who I work with on a daily basis. Feels to me like I'm just getting good :)
 
I am fast, and relatively facile with heavy refactoring and other such tasks which make less seasoned developers cringe with caution.
 
Also see J2EE, Java User Groups link below

J2EE

Especially between the years 2001 - 2004, web appplcations were my entire focus, full time. Starting with my first app written in servlets in 2000, and quickly migrating to the Expresso framework and then to purs Struts apps, I have worked almost exclusively with apps running on the Tomcat app server.
If you read the automation section, I tell there were I wrote a web application that writes web applications, and published some 30 generated applications into the public domain.
An early proponent of frameworks within the local user's groups, I introduced many to both Expresso and later Keel as they began to roll out.
I have also used WebSphere, BEA[?] JBoss, app servers.
j2EE is NOT my favorite approach for writing apps, as of the fall of 2004. With WebStart and Swing, or any other combination of WebStart and desktop apps such as SWT, it is possible to offer much more functionality than with a browser based app, even compared to all the latest buzz about AJAX.
I have not used EJBs, as have always used other forms to accomplish same task. See O/R tools, IOC.

JavaScript

I am not a great javascript programmer, that might be the most generous way of expressing this capability.
 
Enough of my user-group buddies and presenters have kept me filled in on this area to have some moderate degree of exposure to the differences between this programming paradigm and my more comfortable Java paradigm. Mostly it keeps me educated enough to stay away from it in any serious efforts, but I can also maintain small quantities of it when written as a part of an application I am maintaining.

PHP

I have written a minimal amount of PHP and maintained a bit more than that, but not much. I found it a very easy language to learn and use.
 
On the other hand, I have been using various open source LAMP (Linux Apache Mysql PHP) applications for years and have found them extremely easy to work with. I am able and willing to modify them as required, but have rarely found that necessary.

Shell Scripts - Unix, DOS

I have been writing shell scripts for years. Nothing complex but enough to get my work done. This is rarely done from memory, I usually look up sample scripts I wrote in previous years, and modify accordingly.
 
Until recently my skills stayed about even with dos and unix variants, but in the last year I moved to unix entirely even on windows, running it under cygwin. So my dos hasn't been exercised very well for over half a decade.
 
In unix I have always used the bash shell.

Visual Basic

1995 - 2000 wrote several visual basic programs and some Microsoft Office appliations to support my work as administrator,  and also to provide departmental size user groups with common interfaces to databases and files.
 
As of 2009 this is not an active skill set, I would have to re-learn some of the syntax and interfaces.
 
For the record - I remember my years writing VB fondly. It seems quite self-destructive for Microsoft to have held it back as much as they had, if it went cross platform and sustained enterprise development practices, it would have killed Java.

XML and XML Variants

Have created and/or parsed thousands of xml files (see automation for explanation on why so many) using combination of jdom, dom4j, xerces, xslt/xpath.
 
My two current favorites are dom4j and xslt/xpath, using a combination of these two technologies I have found it extremely fast to do just about anything I need to do with xml.
 
I am a member of the XML-haters club which tends to be found at the periphery of IT everywhere.
 
To clarify my experience with the xml variants see pages linked below:

XPath

 If you user XML much beyond simple configuration files, walking the tree quickly and easily can be an important part of your daily work cycle.
 
The two things which I have learned in many such assignments are that.

  1. JDom and it's bigger cousin Dom4J are verbose but always the fastest way for me to do anything light but programmatical.
  2. When you have even just a little bit more to do, XPath absolutely rocks, especially in concert with Dom4J

The reason for the "little bit more to do" requirement in number 2 above is because XPath has all the ease of Regular Expressions :)
 
So you really need to have enough work to get over the afternoon or so of fumbling through sample code until you re-learn the syntax that makes everything so easy. But once you've got it, it's really sweet. Recommended.
 
Not recommended, however, is doing super complex programming via XPath and xml transformations, not unless you've got enough work to keep you going for a couple months or more. Your first couple weeks of super complex transforms can be harrowingly unproductive, even if you are God's gift to programming. It's just a cranky combination of languages.
 
Also see XSLT
 
 
 

XSL Schemas

 I've probably spent less than 80 hours working with XSL schemas over my career, but that's probably OK because with modern IDE's there's not a whole lot of stuff you really have to memorize or understand about XSL to get it to do what you need to do.
 
Specifically, both the JEE version of Eclipse and the latest JDevelopers offer somewhat facile wizards to handle the basics.
 
I don't even have an XSL book, despite my propensity to buy books at the drop of a hat. That would point to how straightforward it can be for the common developer.
 
One of the more fun tasks I have taken on was to reverse engineer xsl from existing xml, which in turn I had reverse engineered from java, which in turn I had reverse engineered from database tables. Making 2 way round-tripping work was actually a quite enjoyable experience, and a lot less heartache than I expected. The business case found it extremely useful as well.
 
 

XSLT

 XSLT is not for sissies. 
 
See also sister page on XPath, same notes there apply.
 
I have done more than my fair share of XSLT, enough to know not to ever do it again except for larger projects where it's worth the re-learning curve.
 
When used in the appropriate place, it is an incredibly powerful and helpful way to get certain tasks done. Recommended for those use cases.
 
That does not include the occassional small project, or at least, not for me. It has all the charm of Regular Expressions, coupled with the added complexity of whatever custom XML variants you are engaging with.

Mentors

Ben Einer - Mentor for total focus on customer

Ben Einer was my boss in 1997, and was kind enough to allow me to establish an IT dept under him at Exhibitgroup-Giltspur.
 
Ben is both brilliant and capable, but his success, and that which helped me the most working under him, was his simple insistence on pleasing the customer. To Ben, that is neither complex nor difficult, one just listens, smiles, and does whatever it takes. My propensity to over-analyze meant nothing to Ben, so I had to really rework my thought processes, and that has been a great help to me to this day.
 
Over a decade later, I still carry a poster he made for his team. Like one of those posters you see that translates a key phrase into many languages, this poster asks the question "How May I Help You ?" in many different phrases. To Ben, you get this right, and everything else follows...

Chad Hooker - Mentor for Extreme Programming

Chad Hooker taught me XP on a team I was on in 2002-2003. Unrelenting, unforgiving, and unapologetic in his pure determination to succeed at getting his team to accomodate to the Extreme Programming (XP) model.
 
There are times when perseverence and determination alone is sufficient to the task, and I learned through him that it can be enough.
 
Now 7 years later, Chad is still a stand-out in my career experience. On my best days I channel Chad Hooker with half the natural ability and grace that he showed us at Transplace.

Chris Davis - Mentor for Sales

Chris Davis is one of the most persuasive and effective salespersons I have ever met.
 
If you are like me, you might believe that sales is one of the highest callings. No idea, no product, no movement ever happens without someone selling it, and that single role is probably much more important than the idea itself - otherwise it just never sees the light of day.
 
I worked under Chris Davis in 2006 at Semantra, where Chris was CEO. Chris is the direct opposite of the used-car-salesman archetype of a sales person. Chris is direct, thoughtful, respectful, and yeilding in his approach. Yet he never gives up, and he never even considers failure as an option, you will understand his point of view after your exchange is complete, and you will be thankful that he took the time to help you through it.
 
It was a great honor to work under Chris as Product Manager of the Semantra product line in 2006. I owe him much gratitude for the many lessons I learned from him.

Chris Rauschuber - Mentor for Programming Practices

Chris Rauschuber is 20 years younger than I am, and yet I have learned much from Chris about how to learn. He is ridiculously patient with himself and others, and has a significant portfolio of work to claim as his own, despite his youth.
 
Chris has taught me to take time off the job and learn the IDE, learn new tricks with this or that technology, just try things that I would never take the time to try. As a result, he is not less productive, but more. Being an old school impatient Type A kind of guy, Chris has taught me that there is another way, and it works pretty well too. It also makes for a more pleasant experience as a human.

Dennis Nussbaum - Mentor for how to work

Dennis was one of my earliest and most profound mentors. My boss at three different companies, in 1974, 1976, and again in 1996, Dennis was for me the human equivalent of the Nike commercial "Just Do It". Dennis liked my energy and working style enough to always give me a tough job in the shop. But he had no patience for my sometime tendency to over-analyze, and didn't hesitate to tell me so the instant it was necessary. It didn't take too many times, I took everything that Dennis said very seriously, and I believe I owe a huge part of whatever success I have had to my time under Dennis.

Donna Hegdahl - Mentor for Marketing

My year under Donna got me many funny looks, I don't know if I ever once even got the first requirement of marketing done, which was the necessary 10 second elevator speech of what my business does.
 
As a marketing mentor, Donna was extremely effective in turning my entire approach 180 degrees. Her emphasis on sticking to the basics, follow up, and clarity of message goes against every impulse I had starting out, and I only got about 5% of her prescriptions implemnted before I filled up my schedule 100% even in a horrible couple of years, and I haven't had a monent of slack since.
 
I was certain that if I had to give my elevator speech one more time, or one second shorter, I might burst. Turned out I was wrong, it only helped me market myself better, and nothing bad ever even happened. Thanks Donna.

Gary Cunningham - Mentor for Design

Gary is an architect who taught me the importance of the dubious slang word "Stupid." Gary is now a world renowned architect. He kept me fed from 1976-1988 with many exciting projects to build. I learned the importance of design over execution, and most importantly the importance of simplicity to good design. Gary's favorite complement at that time was the word "stupid", meaning it was so simple, so outlandishly functional that it didn't cause any attention to itself, and therefore worked perfectly. It took me years to fully understand what that meant, but I have used it ever since, and probably confused others ever since, as a result of my usage of that private slang term.

Janet Taylor - Mentor for Group Leadership

Janet Taylor taught me how to be a better leader, and the critical role that a smile, or outward appearance plays.
 
Being a professional nerd -  in other words, someone who is really only paid to deliver results, it is easy for someone in my position to think that outward appearance doesn't matter.
 
Janet knows that this is not true, that we have a responsibility to present ourselves in the most friendly and helpful manner that we possibly can. She claimed to me that she, in turn, learned this from her father, but whatever the case, using her as a model, I have been able to affect at least a slight change in my behavior to the better.
 
Janet is the consumate sales person, always sharp, always attractive, always smiling, always interested in the needs of others. In 2006-2007, I succeeded her as President of our Sunday school class, which I led for about a year. By using her as a model, I was able to stretch into this role which would have been unthinkable had I not had her excellent patterning to follow.
 
If you knew Janet ( which I believe you could, if you lived in Kansas City and attended Unity Church ) you would know that there is much more depth to Janet than could ever be described in a smile or set of externals. I owe much to her for her kind help with my own personal growth.
 

Michael Nash - Mentor for Programming Frameworks

I have been working with Michael since 1999 when he was developing Expresso, and I was a hopeful contributor, new to Java, web applications and many other things. In the programming world, Michael is fearless, and his work reflects his courage on a daily basis.
Because he is more experienced than I am, I often consult with him on issues I lack confidence in, only to discover that he is answering not from his experience but just from the courage that it takes to dig in and come up with an answer. Michael has taught me much about programming, but I am not sure that the most important thing he taught me is to always maintain the courage to experiment.

Programming Sub-Specialties

Application Design

I have designed and implemented over 50 different applications in my 20 years of writing software. Most of us that have been doing this since the '80s have.
Few apps are ever rip roaring successes, most of mine were either prototypes or software for the use of small work groups. The basic process of designing and implementing is the same, refinement is usually more of a budgetary and market size issue.
My approach to application design tends to be more customer centric an iterative than anything else. Experience has shown that few people can ever hit better than 10% or 20% on anticipating requirements, so rather than expecting customers to do something that seems unlikely, I attempt to be flexible and move quickly through many iterations.
This is also another huge advantage for an approach using code generation. By doing as much of the database table IO through code generation as I can, this frees up 80% of the time to do the changes that keep a customer on target.

Artificial Intelligence / Business Rules

Artificial Intelligence, also sometimes called by the discipline of Business Rules, has been a focus of my weekend and evening studies for years, ever since I met James [] and learned about how much higher his billing rate was than mine.
This aggravation only increased after an epiphany in one of James's Saturday sessions when I suddenly realized that, in essence, Artificial Intelligence is little more than syntactical sugar for abastracting out "if-then" logic statements.
So to summarize, I understand the basics of RETE and rules engines in general, and would know which tools to use to pursue this type of project. I cannot claim any direct experience though, other than my many sessions with James and others like me, trying to learn.
As a side issue, I have built some of my own "rules based" processing engines, though it is not Business Rules-ish in the sense that the rules are not always stored in a different medium or syntax. I also can't remember what they are.

Autonomic Computing

Autonomic computing, also described as self healing systems, are a new fad in computing amongst the biggies (IBM, HP, etc). The two primary features are diagnostics and corrective routines.
Almost in passing, I have incorporated automated background launching of any named subroutines (prescribed in xml files). I haven't written the diagnostics of healing pieces, but these are pieces common to systems over past decades, hardly difficult.
So I can't say that I have done autonomic computing yet, but it looks like doing so is going to be pretty easy to get a start, once I get a customer interested in the end result.

Documentation

Like any good developer, I am never enthusiastic when forced to take time out to document my work.
Despite these impulses, however, I have done some excellent documentation, as well as pioneered some nice documentation technologies in the shops I have worked in.
I can't claim to have singlehandedly started the Wiki craze in Dallas, but I did introduce, install, pollinate, and utilize the Wiki technology in many shops and user groups in town and in the open source scene.
I am also one of the strongest users of documentation using massive quantities of screen shots, a very easy kind of documentation to follow, on the web.
Lately I have (appparently) been a pioneer in the next thing up from a Wiki, which is a CMS. This has been a very helpful documentation technology because of its controlled access and better menuing and searching. I must credit my mentor Chris Rauschuber for turning me on to this one though.

Eclipse Tool Building

In 2003-2004 during my time at Lockheed, I was allowed to convert several of my command line based programs to Eclipse plugins, where everyone on the team could run them from within Eclipse.
We were also allowed to customize another open source plugin for testing to add additional testing functionalities. This too was very successful and well received.
In subsequent months I also created a couple Eclipse plugins for modifying Ant properties files for Keel builds.

File Parsers

I have written many different file parsers, mostly for delimited and fixed length files, but also for more complex files. This is a frequent requirement of automated code generators and also of data conversion routines.
It typically takes longer to figure out WHAT to do with the information to be parsed from a file, than it does to write the parser that does it.

IOC - Inversion Of Control

If you are a component based programming enthusiast such as a user of Spring, Pico etc, you probably use the term IOC or Inversion of Control to define the basic building blocks that make up this approach.
If not, the high level idea is that Objects are not enough, because they allow for too much wide open interdependency. Component Oriented programming is more like your old component based stereo, everything is separate black boxes. IOC is the wires that connect them all together. Maybe that's a crappy analogy but it's a start.
As a founding contributor of Keel Framework (see Keel Framework) I have been following this programming fad actively since 2000, well before it became a rage in recent years. We use Apache's Avalon as our IOC container, and I am still not brilliant in its use, but I have used it for enough years to at least be able to get the job done.

Large or Media Files

In 2004 I got some experience with some of the more arcane capabilities in java, the handling an moving of very large media files using the java.nio libraries.
It is very strange handling 5 and 10 gig files, but it does seem to work fine.

Regular Expressions

I have run the gauntlet of learning and applying regular expression syntax many times for many different purposes. I never seem to retain it, so I have to relearn it every time.
It is never a pleasant task, but one that always leaves me smiling just because I am always so glad when it's over. It is so incredibly powerful; it's hard not to appreciate.
I have used several different regular expression parsers, most commonly the one in the standard java library, lately.

Scheduling

Fall 2005 I worked for several weeks as designer and architect of a sophisticated scheduling module and its companion management module.
Using a combination of CRON like or time based [] library, and sequential or list based processing, the primary features of the system were to provide a minimal interface to allow complex combinations of various broadcast and media file movement tasks.

Software Budgeting and Building

The first software I wrote in 1985 was job cost accounting, the second a job estimating program. That was not for someone else, I have been estimating, budgeting and building since 1980, and doing so without computers to handle the minutiae is a pain.
It is interesting how little things changed when I migrated to building software, from building buildings. From a budgetary standpoint, the differences are not so great. The processes are so similar you can almost use the same software, only the categories and cost ratios seem to be very different.
See also project management and bottom line, I am accustomed to running from a budget, meeting a schedule, etc. It is sometimes harder in software than in the building business, but only because the practice of establishing requirements is so relaxed, er uh, I mean unrefined.

Struts

I was at one time a proficient struts user (2001-2003) and could be again, with a little effort.
See also JSF.

Web Applications

See also J2EE, I have built many web applications of many types, having done little but that for several years.
This includes working on two large teams (one very large) and many smaller or solo efforts.

Rules Programming

I am vaguely competent as a beginning BRE or Rules programmer, at least by my own standards.
 
I have spent many years attending rules groups sponsored by James Owen and Greg Barton, and more recently in 2008 and 2009 founded and led the DallasRulesGroup, where I also instructed two sessions on beginning rules programming with Drools.
 
I have used rules on two projects (neither commercial or in production) and both were successful at what they attempted to do.
 
If you need someone with a very solid understanding of what a BRE does from the high level, and how to accomplish it at the beginning level, my skills are sufficient. If you need more expert decades long experience, someone such as James Owen or Greg Barton or Lawrence Terrill would be an exellent choice.
 

Toastmasters

I have been a practicing member of Toastmasters for several years, and currently hold CTM and CL status.
 
I have served in an officer position for 6 months. Have won my fair share of "Best Speaker" and "Best Evaluator" ribbons, and have seen great improvement in my speaking skills during this time period.

User Group Leadership

User groups are programming's answer to a professional association, and I have founded, led, sat on boards, and followed several user groups over the past decade 2000-2010
Groups founded or co-founded by me:

Groups led or co-ked by me through significant portion of time

Additionally I have served as board member in the following positions for the very large and prestigious JavaMUG java user's group in Dallas.

User groups are funny entities, they can get very fractuous at times, discorganized at other times. My leadership has always been recognized as very organized, and my negotiation of the many interests has led previously fractured groups to work in a cohesive, motivated, self interest manner. We have never avoided controversy, as that is the spice of life in user's groups. But we have always resolved issues openly, quickly, and without needless personal animosity, and growth of the groups has reflected this management.
 
I owe much of my success in such groups to loyal (and sometimes boisterous) relationships with Erik Weibust (President 2008, 2008), also a leader of many groups over the past decade, and with previous JavaMUG Presidents David Dietz(2002), Dan Kern Ekins(1999 - 2001), and Bob Byron (2006).