10 years, and never missed a day

On May 31, 2000, I formally left United Technologies Research Center and joined the Golden Consulting Group (now BIT Advisors) as a full-time technical trainer. ¬†I’m posting now to celebrate the fact that, having just passed my 10th anniversary at a technical trainer, I’ve still never missed a day. ūüôā

I spent almost 12 years at UTRC.  The first eight were as a research scientist, where my specialty was theoretical and computational analyses of the aerodynamics and aeroacoustics of jet engines.  It all sounds pretty impressive, at least when it worked.  If you look, you can still find some papers I wrote or co-authored, through Google Scholar.  My work at the time consisted almost entirely of lots of math and lots of FORTRAN (shudder).

I was never that wild about research. ¬†I liked the actual investigating part, and I liked presenting results and explaining what they meant, but I hated all the begging for funding. ¬†That’s actually how I wound up at UTRC in the first place — I planned to be a professor, but I thought if I went to a research laboratory I could build up my resume and publications list and then later join a university somewhere. ¬† Unfortunately, the market for professors fell apart soon after I joined UTRC. ¬†A year later I was married to a local girl, too, so I wasn’t able to move to wherever the opportunities might be. ¬†Sigh.

I was always an awkward fit in engineering. ¬†I never took things apart or put them together as a kid. ¬†I liked the science aspect, but never really felt comfortable as an engineer. ¬†I always wanted to move away from FORTRAN, too, which was problematic because I naturally didn’t want to write my own numerical analysis libraries. ¬†Eventually, though, I discovered Java back around version 1.0.6, and started learning that.

Around the same time, I made a friend at UTRC who ran an Artificial Intelligence group. ¬† After some discussion (and the fact that the acoustic funding dried up), I joined his group and started learning about neural networks and genetic algorithms. ¬†Unfortunately, I also realized that about fifteen years of coding in Fortran hadn’t taught me anything about modern software development. ¬†So I went back to school at night at Rensselaer at Hartford and got my MS in Computer Science. ¬†I also became a Sun Certified Java Programmer along the way.

During the spring of 2000, when I started interviewing, I found that I could either work for a consulting firm as a developer (back then having the SCJP certification was hot), or I could join a training company and teach technical training courses in business and industry. ¬†It came down to two job offers at the time. ¬†I’ll always remember my dinner-table conversation the night I made my decision.

Me: I’ve decided which job to take.

Xander (my son, age 8 at the time): Did you take the one that had more money, or the one that you liked?

Out of the mouth of babes. ūüôā ¬†I’ve always been pleased to say that I took the job I liked, and I’ve never regretted that decision.

After five years with Golden, I eventually went out on my own. ¬†I’ve now been an independent trainer for five years as of last March, as the owner (and sole employee) of Kousen IT, Inc. ¬†I’ve learned a ton along the way (sometimes I shudder to think about how little I knew when I started) and still love what I’m doing, especially when it involves Groovy or Grails.

One notable achievement, as I mentioned at the beginning of this (way too long) post, is that I still haven’t missed a day. ¬†There are roughly 20 or so training days available in a given month, and a typical trainer tries to schedule between 10 and 15 of them. ¬†How many depends on the length of individual classes (a two-day class often wipes out a week, because it’s very hard to find a three-day class that will fit into the remaining slot), but you don’t want to teach too many in a given month or you get tired and nothing good comes of that. ¬†I tend to average about 120 to 150 days a year, so conservatively I’ve taught about 1200 days during that time.

Some of that is luck, of course. ¬†I’ve certainly been sick enough that if I’d had a class scheduled, I couldn’t have made it. ¬†Also life tends to intervene, with family illnesses and the like. ¬†But so far, so good. ¬†I’m rather proud of that, actually, and hope to keep the streak going as long as possible.

My wife is very happy I made it, too, partly because now I’ll stop obsessing over it. ¬†Over the last few months I grew increasingly paranoid that something would happen to cause me to miss a day, but fortunately it never did.

Maybe I’ll see you in a class someday. ¬†If so, the odds are very good that I’ll be there the whole way. ūüôā

My approach to academic teaching

I recently read a fascinating post by Joel Spolsky entitled “Capstone projects and time management”.¬† It’s highly opinionated, as usual, but makes several interesting points about teaching computer science in academia.

He basically claims that academic computer science doesn’t teach you to use modern tools, or do version control, bug tracking, teamwork, planning, etc., etc., etc.¬† He repeats his frequent assertion that the academic world is almost completely divorced from the real world of software development.

I imagine he’ll get a ton of responses to his post, which is fine.¬† Somebody needs to whack the beehive every now and again, and I’m glad this time it won’t be me.

(I’ve been bumping into beehives lately, which is unfortunate.¬† I like causing trouble, but I hate getting into trouble, and I’m doing way to much of the latter.¬† Maybe it’s my premature entry into curmudgeon-hood.¬† Ginger thinks it’s way too early for me to be turning into such a grumpy old man.¬† But, you kids, get off my lawn!)

At any rate, most people who follow my blog are aware that my regular job is teaching software development training courses.¬† Roughly once a year, though, I get to play at being a professor at Rensselaer Polytechnic Institute in the Education for Working Professionals program in Hartford, CT.¬† That’s formerly Rensselaer at Hartford, formerly the Hartford Graduate Center.¬† In the late ’90’s I got my MS in CS there, at night, while I was transitioning from my career as a research scientist into my current business.

I teach a class called “Developing Enterprise Applications”*

*So all of our programs work on the library computer on a starship (rimshot).

The basic idea is that I try to show the students the current state-of-the-art in software development, based on my experiences.¬† Since I teach a lot, I can travel to 20 to 40 different companies a year.¬† That gives me a decent sense of what’s going on around me, along with blogs, podcasts, twitter feeds, and participating in the Groovy and Grails open source projects.

I’ve taught my Rensselaer class about half a dozen times so far, and it’s been completely different each time.¬† Most recently I taught it last spring (2009).¬† We talked about Spring and Hibernate, used a Subversion server to check in code (actually a Google code project, but that’s the same thing), ran lots of JUnit tests, added Ajax capabilities with prototype and script.aculo.us, and briefly went over, of course, Groovy and Grails.¬† I write code during class which the students are free to use, and I keep notes on Google Docs, which I share with them.

Here’s the cool part, though.¬† There are no assignments, no exams, and no homework of any kind, with one exception.¬† At the end of the course, the students have to present an application they’ve written to the rest of the group.

The choice of project is completely up to the individual student.¬† I do give them a list of requirements, which are negotiable until about half-way through the semester.¬† Here’s a portion of this years’ list:

  • Use a framework (Struts, Spring MVC, JSF, Grails, RoR, or other)
  • Create an ORM layer (Hibernate, JPA, roll-your-own)
  • Test as much as possible (unit, integration, functional)
  • Ajax capabilities are a plus
  • Do something with web services (REST or SOAP; at least consume, generate if possible)
  • View templates are optional but preferred (Velocity, Freemarker, Sitemesh, whatever)

I’m quite flexible on the actual implementations, as long as the student clearly learned something and the implementation has some value.¬† Students can write in Java (most of my demos are in Java, so that tends to be a favorite), or .Net, or anything else they prefer, as long as they try to fulfill the requirements above.

My favorite requirement, however, is the Design Document.¬† This is very important to me because I want the students to tell me what worked, what didn’t, what they liked, and what they didn’t.¬† I want this to be a low-pressure opportunity to experiment, and if they’re truly experimenting, then not everything will succeed.¬† I want to know what they tried, even if it failed.

I do ask that one use case has to work.¬† I’m fine with experimenting, but there’s nothing like working code to motivate you.¬† Students (like most developers) tend to way overestimate how much they’ll actually finish, though, so I only ask for a single case to function correctly.

Regarding teamwork, I allow them to work in groups of one or two only.¬† My experience has been that groups of three or larger don’t finish in time, or one student winds up doing too much of the work.¬† I like the idea of doing a team project, but I haven’t figured out a good way to manage it yet.¬† Two person teams tend to work, both in scheduling and production.¬† Most students prefer to work by themselves.¬† I’m fine either way.

During the last class, each student (or group) hooks up their laptop to the projector, demonstrates the application, and then walks through the code.  I bring the donuts and coffee, and we all watch together and ask questions.

Then I give out the A’s.¬† If you clearly tried something ambitious, and you clearly learned something, and you fulfilled the deliverables above, then why not?¬† I only give out A’s and F’s, and the latter only happens if a student clearly left everything until the last minute, never came to class, and then tried to snow me with a rushed project.¬† My rule of thumb is that if I could do your entire project in a couple hours, you didn’t do enough*.¬† I get a student like that about once every other year.

*Of course, I have to pretend I don’t know Grails when I say that…

I find this a very easy, successful way to teach, and the students seem to like it too.

Dragons roar, cough, and sputter in Dayton

Tim Kurkjian says you should never miss the chance to go to a ballgame, because you might see something you’ve never seen before. ¬†On Tuesday I got the chance to go to see the Dayton Dragons play in their charming stadium, Fifth Third Field (seriously, that’s the name) in downtown Dayton, Ohio.

(I’m here this week teaching a class that combines Java Server Faces, Spring Web Flow, and Spring Faces — an adventure to say the least, but a story for another post.)

Accompanying me was my friend Stephen Williams, who I hadn’t seen in about eight months. He lives reasonably close to Dayton, but had never seen the Dragons play.

The Dragons are the A-ball affliate of the Cincinnati Reds. ¬†They draw extremely well in Dayton, despite the fact that they’re really, really bad this year.

(This is in contrast to my own Connecticut Defenders, who are limping their way out of town this season and playing to an almost empty stadium.  That, too, though, is a post for another day.)

The Dragons were 8 Р23 when the game started.  Their opponent tonight was the West Michigan Whitecaps, the Class A affliate of the Detroit Tigers and leaders of their division with a record of 21 Р9.  The weather was beautiful, roughly 70 degrees and sunny, with a very mild breeze, and the stands were nearly filled.  They were treated to what only can be described as a very odd game.

The fun started in the bottom of the second inning. ¬†There’s no score when Taylor Sloval led off with a walk. ¬†Then Stephen Chapman was called out on strikes, leaving a man on first with one out.

The official boxscore then says, “Kevin Coddington reaches on a fielders choice, fielded by third baseman Bryan Pounds. ¬†Tyler Stoval to 2nd.”

Hmm.  How did that happen?  How can a third baseman field a cleanly hit ball and manage not to get either runner out?

The key is that it looked to everyone in the place, including poor Bryan Pounds, like Coddington hit a soft fly right to him which he then caught. ¬†Pounds looked around, expecting the umpire to signal an out, but nothing happened. ¬†The runner, seeing this, kept going for 2nd, and by the time Pounds threw the ball there, he was called safe. ¬†Even that wasn’t clear, though, because it looked like the throw beat the runner.

So, either Coddington is out and Stoval is safe at 2nd on a stolen base, because he wasn’t tagged, or Coddington is safe at 1st because the ball bounced, but Stoval is out at 2nd on a force out. ¬†Which is it?

The umpires got together and talked it over. ¬†Eventually they settled on the unlikeliest of outcomes, which was that both runners were safe, but Coddington didn’t get a base hit on the play, nor was anybody charged with an error. ¬† Instead, it looked like Pounds was an idiot for holding onto the ball too long.

In my scorecard, I just put in a giant question mark. ¬†Welcome to A ball, where the umpires, too, are not necessarily ready for the big leagues. We’ll come back to that later.

Of course, what followed was a double and a single, resulting in a 2 Р0 lead for Dayton.  Yay home team.

Skip forward to the top of the 7th, where the fun really started. ¬†The Dragons are holding onto a 2 – 1 lead when Billy Nowlin for the Whitecaps singled and stole 2nd. ¬†Joseph Bowen struck out swinging, then Luis Salas walked, and Gustavo Nunez popped out to the catcher in foul territory. ¬†So now we have men on 1st and 2nd, but with two outs. ¬†The tying run is on 2nd, but both teams have hit horribly with men in scoring position all night. ¬† Then the next batter, Brett Wyatt, hits a soft grounder to the pitcher. ¬†It looks like Andrew Bowman, the Dragon’s pitcher who came in at the top of the 6th, is going to escape with no damage.

Or not.  His throw to 1st winds up somewhere near Cincinnati.  Nowlin scores, Salas makes it to 3rd, and Wyatt is safe at 1st.  Now the game is tied, with men on 1st and 3rd, still with two outs.

Surprise, surprise, the next batter, Ben Guez, gets hit by a pitch, loading the bases.   This despite the fact that Guez was 0 for 2 at the time, with a strike out and a foul out to 3rd, and had already been hit by a pitch way back in the 1st inning.

The catcher trots out to have a word with Bowman.  Steve and I imagine the conversation going something like:

Catcher: Dude, stop thinking about your throwing error, or the fact that you just blew the win so that the best you can hope for now is a no-decision.  Just throw strikes.

Pitcher: Yeah, whatever.

Next up comes Brandon Douglas. ¬†Whack! ¬†Yet another hit by pitch, bringing home Salas. Now it’s 3 – 2 Whitecaps and the bases are still loaded. ¬†The night is now officially over for Andrew Bowman. ¬†He’s replaced by Aguido Gonzales.

Gonzales faces Bryan Pounds (remember him from the 2nd inning?). ¬†Pounds works the count full and is rewarded with a walk, bringing home another run. ¬†Ron Bourquin then singles, scoring yet another. ¬†Finally, Billy Nowlin (batting again this inning — yup, the Whitecaps batted around) pops out to 1st to end the inning. ¬†The score is now 6 – 2 Whitecaps and the game is effectively over.

By the way, the second-to-last batter was given a single by a generous home scorer when the 2nd baseman (Cody Pucket, who went 4 for 4 and probably won’t be playing here long) should have been given an error. ¬†If it had been ruled an error, then the Whitecaps would have scored 5 runs on one hit, two walks, two errors, and two hit-by-pitches. ¬†I don’t expect to ever see that again.

The fun wasn’t over yet. ¬†Advance to the bottom of the 8th, with the score still 6 to 2. ¬†After two fly-outs and two singles, it’s now men on 1st and 2nd with two outs, and up comes Byron Wiley for the home team. ¬†The count goes full, and to Byron Wiley, the next pitch looks very much like a ball. ¬†He actually tosses his bat three feet away and starts heading for 1st when the umpire yells strike!

Oops.  Umpires really hate it when you show them up like that.  Wiley retrieves his bat, and again Steve and I imagine the conversation going on at the moment.

Umpire: Make me look bad like that? ¬†You better swing at the next pitch, dude, because it’s a strike. ¬†I can tell you that right now. ¬†I don’t care if it’s over your head, in the dugout, or three rows into the stands, it’s a strike. ¬†So don’t forget to swing.

Wiley: <grumble>

Sure enough, the next pitch is high and outside.  Sure enough, Wiley swings and misses.  Sure enough, the umpire calls it a strike before the swing even starts.  Inning over.

Wiley throws both his helmet and his bat this time, and the umpire throws Wiley.  Out of the game, actually, which comes as a surprise to nobody.

You’d think that would be it, but no, the top of the 9th was great, too. ¬†There were six total at-bats in the top of the 9th. ¬†They went: home run, strike out, strike out, home run, home run, strike out.

Yes, that’s three homers and three Ks. ¬†The fielders might as well have stayed in the dugout. How cool is that? ūüôā

The bottom of the 9th featured yet another homer, meaning that there were four total home runs in the 9th.  The final score was 9 Р4 in favor of the Whitecaps.

Even then my evening wasn’t finished. ¬†I convinced Steve to come with me to the Dragons Team Store, so I could buy a massively overpriced T-shirt or a massively overpriced cap. While I was browsing the massively overpriced merchandise ($35 for a shirt, and even $33 for a cap, but at least I wasn’t even tempted by the massively overpriced $125 jersey), a worker in the store pointed us to the line for autographs. ¬†It turned out one of the Dragon players was coming down to sign for the fans.

Who was the player?  Yup, you guessed it, poor unfortunate pitcher Andrew Bowman, whose pitching line for the night read 1.2 innings, 1 hit, 5 runs, none earned (wow), two walks, two strike outs, a very bad throwing error and a 6.48 ERA.  He got both a blown save and took the loss.  Not his best day.

He was warm and friendly, though.  He was kind enough to put an unintelligible scribble in my program and I got a quick picture with him on my phone.

Me and poor Andrew Bowman, of the Dayton Dragons

I did feel I had to say something, though.

Me: How’s your arm?

Bowman (smiling): It’s sore.

Me: Ah.  Well, good luck.

Bowman: Thanks.

I think anything else would have been cruel. ¬†I paid for my massively overpriced shirt and left with a cool story to tell. ¬†Yup, never miss the chance to go to a ballgame. ūüôā

O’Reilly screencasts coming

A few weeks ago, I got an email from a “digital content director” at O’Reilly. He said he was building up O’Reilly’s catalog of screencasts on technical subjects and wanted to know if I wanted to participate. The plan would be for me to come to California, where a camera crew would record me teaching students, in an informal setting, about new interesting technologies.

As they say in baseball, that’s right in my wheelhouse. While I do as much development and consulting as I can, my schedule fills with teaching engagements very quickly. I probably consider myself an instructor above everything else. Asking me to talk for a couple of days to make a 90 to 120 minute screencast is simple — getting me to stop talking would be much harder.

(That’s the thing about instructors: the job requires you to respond to every question with a conversation that lasts until the student is either satisfied or gives up. The job selects for that. After all, I’m not grading them; they’re grading me. Okay, that was a bit facetious, but only a bit.)

The upshot is that last week I traveled to California and recorded two screencasts. The first is tentatively entitled “How Groovy Helps,” and walks through a handful of Groovy-based applications to show how the language dramatically simplify application development. The other is called “Modern Enterprise Java Development” and discusses how creating web applications evolved from a servlets/JSPs/JavaBeans model to Spring Core + JPA + Ajax, with an overview of tools and technologies thrown in for good measure. They were all recorded as I talked to one student at the Westerbeke Ranch in Sonoma, CA.

I’ll have a lot more to say about them as we get closer to their availability, which ought to be in a month or so. In the meantime, here are a few observations:

1. You know you’re in wine country when there’s a bottle of wine waiting for you in the hotel (a decent chardonnay as it turned out).

2. I enjoyed adding Google Maps functionality to my Groovy Baseball application. Now when I choose a date, I get a marker at each home stadium with an info window showing the scores. Once I clean up the look and feel, I’ll add that to my own web site.

3. My student didn’t have much of a programming background, so I inevitably slowed down. The screencasts are therefore geared more towards beginners than experts.

4. We recorded almost everything outside. That was quite an adjustment for me, since I consider air conditioning and high-speed Internet access minimum requirements for any trip, including vacations. My son was quite amused to hear I got a mild sunburn on my bald spot.

5. I had to drive to Boston in order to take Virgin America, but have an actual, real live plug in the seat was worth it.

6. The production values on these things are going to be sick. I saw a preview and was very, very impressed. I only hope the content measures up. ūüôā

My only regret was not being able to meet up with Andres Almiray while I was out there, but he was south of San Francisco and I was about an hour north of there. Maybe next time.

Podcast on Pulse in education and training

A couple of weeks ago I participated in a BriefingsDirect podcast about using Pulse in academic and training environments. For those who aren’t aware, Pulse is a product created by Genuitec (the same people who make the MyEclipse IDE) that allows you to manage Eclipse profiles and plugins. I’ve used MyEclipse in my academic courses at Rensselaer at Hartford for several years, so they asked me to be on the podcast.

The other people on the podcast were Michael Cote, an analyst with RedMonk, and Todd Williams, VP of Technology for Genuitec.  The podcast was hosted by Dana Gardner, principal analyst at Interarbor Solutions.

The podcast itself and a verbatim transcript are now available, and can be found here.

This was my first time being interviewed on a podcast, and it was quite an experience.¬† I would say that it was an interesting experience, but one of the most obvious things that jumps out at me from reading the transcript is that I use the word “interesting” far too often. ūüôā

NetBeans 6.1 is a lot better than I thought

This week I’m in New Haven, CT, teaching a class that combines UML and Java Web Services (an odd combination to be sure).¬† The client wanted to use NetBeans as their primary IDE, and I always try to accommodate that if I can.

My last exposure to NetBeans was back in version 5.5, I think, when a couple of friends suggested I give it a whirl.¬† I’ve been an Eclipse user since version 1, so I’m very comfortable with that environment.¬† As part of giving a presentation at my local Java User’s Group, I also got a license for IntelliJ’s IDEA, so I’ve been playing with that off an on.¬† When I don’t want to use a heavy IDE, I generally stick with UltraEdit, which does a decent job, even with Groovy code.

Nevertheless, I downloaded and installed NetBeans 6.1.¬† I have to say that I’ve been very pleasantly surprised by the editor.¬† The UML support is surprisingly good, including the capability to generate sequency diagrams from code.¬† But its JAX-WS and JAXB support has been outstanding.¬† I’ve been using them with the embedded Glassfish server and really enjoyed it.

I’m in a bit of a rush (have to get back to class) or I’d say more.¬† What I can say, though, is that if the NetBeans group really does deliver on Groovy and Grails support in NB 6.5, as promised, I’m definitely going to try it.¬† I’m still mostly an Eclipse person (and the commercial MyEclipse tool as well).¬† I know it’s practically heresey to say so these days, but I’m still finding that IntelliJ slows me down a lot more than it speeds me up.¬† But this single week with NetBeans has been a revelation.¬† I can only hope the Groovy and Grails support when it comes out in October is as good as the rest of the IDE.

Our last, best hope … for message digests?

So I’m teaching my course in Securing Java Web Applications (my third one in the last six weeks) and we got to a section that discussed the MD5 algorithm for generating message digests.

One of the students asked, “whatever happened to MD’s 1 through 4?”

I simply couldn’t resist saying, “MD’s 1, 2, and 3 were sabotaged during construction.¬† MD4 vanished without a trace shortly after it came online.¬† Now we have MD5, our last, best hope for peaceful digests.”

To my pleasant surprise, about five different students got the joke.

(And yes, every time I see the abbreviation JMS I don’t think Java Message Service, I think J. Michael Straczynski.)

We live for the One; we die for the One.

%d bloggers like this: