What I Do

Featured

A friend of mine asked me in March 2009 “exactly what it is I do” (for a living, that is). I thought this was a great question, and a good time to try and answer it, since I had recently been laid off due to the Great Recession.

The short answer is, I build web applications, soup to nuts. At least that’s what I’ve done the most of in my 18+ year software engineering career. I really enjoy doing it, and I intend to keep on doing it for a very long time.

Some examples of these applications include:

  • a system for tracking sales leads (a la salesforce.com)
  • apps that enable marketers to create and target ads and surveys to consumers
  • apps for US Postal Service employees to receive and track incoming service requests from call centers and other sources
  • online banking applications (First Chicago National Bank)
  • supply chain management applications (allowing Nortel‘s vendors to order their own supplies on line)
  • apps to support knowledge-base creation (NativeMinds)
  • content management applications (allowing giant auto insurance companies to create “co-branded” web sites that share content and functionality) (Terrace Consulting)
  • productivity applications that provide private email, calendaring, and file-sharing to small/medium size businesses (Bluetrain Inc.)
  • Digital Asset Management (DAM) applications that allow companies to consolidate, version, archive, distribute, and protect their critical digital files (WebWare/Clearstory). I developed the asynchronous media processing architecture behind WebWare ActiveMedia, a DAM system in production at Sony Pictures, Martha Stewart Omnimedia, National Geographic, etc.
  • Customer Relationship Management (CRM) applications to keep track of customer profiles, manage their accounts, etc. (BBH Media)
  • Ad management applications that allow call center employees and/or advertising clients to create online ads using a streamlined workflow that results in consistent, approved content (BBH Media)
  • Applications that automatically extract text and keywords from video (DigitalSmiths).
  • Applications that help analysts find associations in large, unstructured datasets (Saffron Technology).
  • Advanced Email Marketing solutions
  • Sites for building and maintaining online communities

About the only thing related to building web sites that I don’t do is graphic design. But I’ve had the good fortune to work with some very talented professionals.

I’ve been building web apps nonstop since the web was born in 1994 or so.

I’ve built web apps just about every language/framework/toolkit you can name (and some you probably can’t). My first projects were written in Perl, then NeXT (the company Steve Jobs founded while in “exile” from Apple, whose technology is now the backbone of Mac OS X and the iPhone) came out with this amazing web app framework called WebObjects. Being an Object Oriented sort of person, and having already spent some time building 2-tier apps in Objective-C/AppKit/EOF, WebObjects was a natural progression and served as my bread and butter for the next 8 years or so (with forays into things like C++ and ASP in between). I still think WebObjects was the best web app development environment ever created, but Ruby on Rails is definitely getting close. On the front end, I’ve gotten some good hands-on experience with Javascript libraries such as ExtJS and jQuery. I also worked a lot with Adobe Flex at Saffron Technology, and I’ve been quite impressed, particularly with how well Flex integrates with Javascript. Thanks to libraries like these, the usability gap between web applications and rich desktop clients is definitely closing.

The technology of web apps keeps changing, but their basic architecture hasn’t really changed that much since I wrote this white paper in 1997. Relational databases are still used in every big web app. I’ve developed software for every major RDBMS – Oracle, Sybase, SQL Server, MySQL, DB2, Postgres – and I’m pretty familiar with their strengths and weaknesses. Most big enterprise apps involve some kind of “middleware” as well: object-relational mapping frameworks like Hibernate, Doctrine, and ActiveRecord; various Object Request Brokers, Messaging frameworks, etc. And of course the user interface of these apps is critically important, and needs to be tailored to the needs of each project. I’ve found that the most productive software engineers have deep expertise in all of these areas. The approach of splintering the dev team into separate “silos” is far less effective in my experience than finding engineers who can “own” an entire application from the bottom up. That’s one reason I’ve tried not to get “pigeon-holed” into a narrow niche.

So that’s how I earn my keep. If you’d like to learn more about how I can help with your web application needs, you can reach me by email at mpelzsherman at gmail dot com.

Why I Hate Sports Analogies at Company Meetings

Let me begin this post by saying that I LOVE my job. I get paid to write code, and to help others do it better, and that’s AWESOME. I do not take this opportunity the least bit for granted. I’m incredibly grateful to the folks who started my company and grew it into the thriving enterprise it is today that enables me to put food on my table and provide a safe home for my family.

But it’s time for a little tough love.

Once every quarter, my employer (like most) has an All Hands meeting where our corporate overlords (the folks with “C”-level titles) attempt to communicate the current state of the company, and their plans for the future. I have come to dread these meetings, because I know I’ll be subjected to the all-too-familiar barrage of sports analogies. A good chunk of the content presented would not be out of place as a Super Bowl pre-game show. The slides at last week’s meeting even had a pigskin background!

Now don’t get me wrong. I may not be a huge sports fan, but I respect the skill and teamwork of professional athletes. I fully understand the importance of being a “team player”, that business – like sports – is competitive in nature, and that these meetings are intended in part to motivate people to give “110%”. But please, CEO’s, how about a little less fluff and a bit more information? Your employees are smart; that’s why you hired us. You don’t need to dumb things down for us. In order to succeed in helping the company “win”, we need specific details about the “game plan”. I’m often astounded by the inability of corporate leaders to articulate a plan, even a very high-level one, and present it clearly to the organization. Sports analogies are all too often used as a smoke screen to disguise the fact that you don’t actually have a plan. When that happens, the sports metaphors end up having the opposite of their intended effect; they leave employees feeling directionless and in the dark. They are in fact a key component of mushroom management, a phenomenon common enough to have its own Wikipedia entry.


Reflections on RubyConf 2013

Last weekend I had the great privilege of attending RubyConf 2013 with a few of my co-workers from RentPath.

This was the first major software development conference I’ve attended in many years. It was a great opportunity to meet the luminaries of the Ruby development community, including “Matz” himself (Yukihiro Matsumoto, the creator of Ruby).

The presentations ranged from fairly technical (details about new features and performance improvements in Ruby 2.1) to mildly entertaining (11 year old Katie Hagerty sharing her experiences with KidsRuby). Some highlights for me were Luca Bonmassar’s overview of Elasticsearch, Michael Fairly’s rapid game prototyping demo (writing a working Pong implementation using Gosu before our eyes in 15 minutes), and Ernie Miller’s talk entitled “That’s Not Very Ruby of You”. It was very inspiring to be around so many smart and talented developers.

The conference was very well organized and well run. The sessions started and ended on time, free hot Starbucks coffee was always available, and the A/V systems worked flawlessly. The free lunches provided were quite tasty. My only complaint was that there was no food provided for breakfast; some simple bagels or muffins would have been great, especially since the only alternative available at the gorgeous, swank Loews hotel was a $30 breakfast buffet. But really, that’s the only thing I can think of that the organizers could have done to improve the experience.

I will say that a few of the presentations seemed a bit under-prepared. In particular, when presenting code examples in a very large space, some presenters did not take font sizes into account. I was a little confused by the choice to let young Katie Hagerty have a keynote spot for a full half hour on Saturday morning. As adorable as she is – and while I think it’s totally awesome that she’s learning to code – I would have preferred something with a bit more substance. (Why not get the creators of KidsRuby up there as well, for example?)

Based on what I saw at this conference, I think Ruby is entering the “awkward teenage” phase of its lifecycle. No longer the “cute new kid” on the block, it’s experiencing growing pains, and some insecurity. The Ruby community is starting to learn lessons from more mature technologies (e.g. metaprogramming is bad, ‘mkay? Garbage Collection is important… etc. ) At the same time, lots of great companies are adopting it and job opportunities are plentiful. It’s an interesting time to be a rubyist!

Come and get your Micro-blues!

The band is warming up as you and your sweetie take your seats at the bar. You order a couple of local beers and kick back as the band launches into their set. You feel your cares melt away as the sweet strains of Muddy Waters wash over you like a cool Mississippi rain. You join the other couples on the dance floor, and the band takes another chorus so you and your friends (some new, some old) can dance your troubles away.

The experience of enjoying live, local music is just like a good micro-brew. Unlike the corporate, mass-produced, pre-recorded stuff you hear on the radio, live music is produced especially for you, in the moment, with loving attention by people who do it because they love it. Just like a good local beer, live local music taps into the creative juices flowing through your community. Get out and enjoy some tonight!

Why Rails isn’t “just another web framework”

I recently heard a software engineering director candidate with many years of web development experience describe Ruby on Rails as “just another web framework”.

That’s what I thought too, until I spent some time working with it over the past 8 months.

The fact is, Rails is much more than that. It is a radical paradigm shift away from both the bloated, configuration-based methods of J2EE and the chaotic hackfest that is PHP.

Here are my top 3 reasons why I think Rails sets itself apart:

- The ActiveRecord ORM. This is the first ORM I’ve worked with since NeXT’s Enterprise Object Framework that really lives up to the promise of ORM’s, and does so with minimal configuration and fuss.

- Terseness. The syntax of Ruby on Rails applications is remarkably terse. It can be a bit daunting at first, but after a while you begin to realize what a huge cognitive win this is. Getting rid of all that unnecessary syntactical noise makes it much easier to focus on solving problems.

- Gems. The eco-system of 3rd party components for rails in unlike anything I’ve ever seen in any development community. There are some truly remarkable gems, such as this one for authenticaion, or this one for creating seed data for your project. The time savings these gems provide cannot be overstated. And it’s fascinating to watch how the Rails community seems to converge on certain gems, which become almost part of the “standard”.

Rails is making web development fun again. I’m so glad I jumped in the pool – the water’s fine!

 

 

Ruby script for extracting email addresses from a text file

Here’s a handy Ruby script I wrote a few months ago to extract email addresses from a blob of text.

In this case, all of the email addresses are surrounded by angle-brackets, so that makes the script much easier.

It’s kind of trivial, but a nice little example of the elegance of Ruby:

#!/usr/bin/ruby -w
IO.foreach("data.txt") {|line|
    line.scan(/<.*?@.*?>/).each{|addr|puts(addr.delete('<>') + "\n")}
}

The Return of the Blog!

I shut down my blog about two years ago for a number of reasons.

However, now that I find myself working for Federated Media Publishing, a company that specializes in helping bloggers monetize their web sites, I thought it would be a good idea to fire it back up again. We’re doing some interesting integrations with WordPress, so if nothing else I figured it wouldn’t hurt to re-familiarize myself with WordPress.

You won’t find much here about my personal life though. For that, you’ll have to friend me on Facebook or, better yet, come to one of my gigs! :-)

WordPress Upgrade Hell

My blog was starting to have major problems recently – most notably, Akismet stopped working, and the spammers were getting through again. I tried to upgrade WordPress, but my database was out of date.

So I finally bit the bullet and did a clean install of the version of WordPress supported by my hosting service, and began the painful process of converting my data to the new version.

I’m in the process of restoring things (my user table for example). So if you want to leave a comment before that happens, you might have to sign up again. Very sorry for the inconvenience!

How to Read ExtJS documentation

I’ve been working with ExtJS now for about 7 months. It’s an amazing library for building Rich Internet Applications in Javascript, arguably the best available. However, as I’ve blogged about previously, the API is so huge and rich that it can be hard to find what you’re looking for.

For example, here’s a problem I ran into today:

- I note that a long field label is wrapping and would like to fix this.
- checking the code, I see this is an Ext.form.Textfield inside an Ext.form.FormPanel
- using Firebug I see it has a width of 100px. I verify that setting it to 200px fixes the wrapping issue.
- I check the Ext.form.Textfield docs.* No obvious way to set the width of the fieldLabel.
- try setting autoWidth: true on the Textfield. no change.
- try setting grow: true on the Textfield. no change. although not specified in the docs, these properties seem to apply to the field only, not its label.
- try google: “Ext.form.Textfield change fieldLabel width”
- found forum post that refers to the “labelWidth” property of Ext.form.FormPanel. Voila!

*Here is where I made my mistake. I assumed Ext.form.Textfield would contain the property to control its labelWidth, but it was actually the FormPanel that controls this for all of its elements. This is a common pattern with ExtJS – if the property you’re looking for isn’t on the object you expect, check its “container” object.

Of course I still don’t know how to override the labelWidth for a specific TextField, but I’m sure it’s in there somewhere…

MySQL and the perils of Going Rogue

Since the mid-90′s, I’ve worked fairly extensively with nearly all of the major Relational Database vendors: Oracle, Sybase, SQL Server, DB2, and MySQL. (Even dabbled a bit with Postgres.) I’ve been able to do this without too much trouble because, until fairly recently, the SQL implementations provided by the various vendors were not that different.

Over the past few years though, I’ve noticed more and more deviations from standard SQL coming into play, mostly from MySQL. I’ll admit I do not follow developments in the ANSI spec process, so some of these may be SQL-92 standards, but I suspect most are not. For example, take “INSERT IGNORE”. As others have noted, this is useful for developers, but it’s non-standard, and therefore not easily portable. Another example is “GROUP CONCAT”, which has created major headaches for some developers .

Oracle of course has its share of non-standard operators as well, such as “MINUS” and “INTERSECT”.

One could certainly argue that vendors are merely being “innovative” here, but one has to be careful when choosing to use these non-standard features. MySQL does not clearly point out in their documentation when they are deviating from SQL-92. Unless you are very certain that you will never need to run your code on a new database, these functions are probably best avoided if possible.