Corporate America
J.P. Morgan 5
February 16, 2002
by Uriel Wittenberg (uw@urielw.com)
This is one in a series of letters from Uriel reflecting on Corporate America. See Corporate America Index for full list and subscription info.
|
Perhaps you know someone afflicted by the BCL mindset. It is not a
condition that lifts when the subject goes for lunch, sees a movie, or
dreams at night. It is full-time -- 24 by 7, in business-speak -- an
unrelievedly twisted, perplexing way of seeing, hearing, and having and
expressing thoughts.
The BCL team's conception of my task was that it was to be a "gap
analysis." What "gap" was I supposed to analyze? Well, if you're
supposed to evaluate a car, you can describe its good points and bad
points. Or you can describe how it differs from the ideal car -- the
"gap" between it and the ideal. This nuance, which I confess was lost on
me, seemed very significant to the BCL team.
They had presumably attempted to convey their conception to my boss Bob
when the task was arranged. I was not privy to these discussions.
(Managers commonly like to think of a "technical resource" as a sort of
gun, which does not need to be consulted as one is aiming. Or maybe
we're too expensive for the endless meetings. At any rate, lots of stray
passersby get shot.)
Bob, not one to agonize over subtleties, had simply asked me to evaluate
the product, and that's what I set out to do. The product to be
addressed was actually "EBPFC," sometimes called "EB4PFC" -- a successor
product to BCL. (The generational shift made little difference.
Albatrosses beget albatrosses.)
I had the chore of setting up the product and trying to get something,
anything, to work in the first place. The product was typical for the
software industry in that it failed right out of the box. But I
consulted BCL team member Steve Katz regularly, and he acknowledged the
defects I encountered and helped overcome them.
In the course of these consultations I emailed him an inquiry about
certain features that seemed to either not work at all or be pointless,
sincerely thinking I must be missing something. He replied:
From: Steve Katz
06/19/98 04:14 PM
To: Uriel Wittenberg
cc: Robert Zolkiewicz, Marc O Becker, William Green, Millard Brown
Subject: Re: EB4PFC
While your comments are accurate, please include them in your gap
analysis of EBPFC vs. your ideal PB development environment. Note that
some of the current deficiencies of the library are known, even if they
have not as yet been addressed.
Your earlier bulletin board posts and messages indicated a fair amount
of familiarity with EB4PFC. My interpretation of the purpose of the gap
analysis is for you to tell us how and why the library is far from your
ideal PB development environment. From that we will be able to identify
areas for improvement and also make sense as to why, from a technical
perspective, you characterized the library as "utterly misconceived" and
"not recommended for use".
I wrote back:
From: Uriel Wittenberg
06/22/98 11:57 AM
To: Steve Katz
cc: Robert Zolkiewicz, Marc O Becker, William Green, Millard Brown
Subject: Re: FW: Re: EB4PFC
Thanks, the training manual could be useful.
You're more or less correct as to the purpose of my analysis, though I'd
describe my objective as an open-minded evaluation rather than a
retrospective justification of my earlier comments.
This objective is hindered by the lack of documentation and the
inadequate or malfunctioning demo apps. I made some use of BCL at one
point, but I wouldn't claim great prior familiarity with the product.
Incidentally, I had never revealed my Icon Solutions experiences to them
or to others at Morgan, since the termination etc. was somewhat
sensitive and would only invigorate my opponents in prejudiced councils
conducted in my absence (except that I may have confided in Bob -- I
forget). I had ignored the BCL team's earlier demands to know where I'd
had experience with BCL.
The above communication, specifically its innocuous characterization of
the point of the analysis, inexplicably stirred VP Marc O. Becker to
fury. He jumped in from the sidelines with:
SendTo: Uriel Wittenberg, Robert Zolkiewicz
CopyTo: William Green, Steve Katz, Millard Brown
From: Marc O Becker
PostedDate: 06/23/98 10:59:03 AM
Wait a minute!! Enough talk here. Uriel, what we asked for is a gap
analysis, not an open-minded(!) evaluation of our library. Shouldn't you
have already done this before making your anti-library recommendations
of the last few months?
As for documentation, we have given you a user manual, an object
reference, and a training manual. Isn't this enough? This should provide
the primary features, etc.. Again, if you are not familiar with the
product, why have you been lambasting it all along.
Finally, there are simple/sample apps with both BCL and EBPFC (the
Features demos) that illustrate the use of the product's most important
features. If you think these are a problem, please note this in your gap
analysis.
Can you just get to work!
Marc
People did not express themselves like this at Morgan.
As I reflect on my overall Morgan experience, the "gap" that occurs to
me is that I actually never met Becker. I'd emailed him months earlier
when he complained to Bob about me: "Since your grievance is with me,
may I suggest that we discuss this directly? I would be happy to meet at
your convenience." He'd never replied.
Bob raced to forestall my anticipated response to Becker: "Do not reply
to this. There is nothing constructive to be gained here." His email
(sent only to me) was timestamped two minutes after Becker's.
I complied. And a short time later I sent:
From: Uriel Wittenberg
06/23/98 12:26 PM
To: Steve Katz
cc: Robert Zolkiewicz, Marc O Becker, William Green, Millard Brown
Subject: Re: FW: Re: EB4PFC
Since I'm leaving July 10, I'd like to offer you the opportunity to
respond to specific criticisms as I document them, prior to completion
of the entire evaluation.
Attached was a short document that criticized a particular feature of
the product.
I am deeply sorry, list members. Although many of you ... no, probably
all of you, will find this unendurable, I am going to quote the document
here. I want to make it clear that it was very specific in its
criticism, and that the aspect of the product I was criticizing imposed
a serious time/labor cost on software developers. Also, the document is
generally simple enough to be understood by the layperson -- or
managers, which was the intention:
For the purposes of this document, let us define "Puritanism" as
follows:
A rigid adherence to painful, tedious and inefficient practices in the
name of righteousness.
"Constants" objects are a widespread form of puritanism. They create
work, increase obscurity, and produce no benefits.
The use of "Constants" objects possibly has its roots in a fallacious
view that literals should be completely banished from programs because
they are wrong, or impure. This is a misunderstanding of a reasonable CS
101 stricture against certain types of literals. For example, it's a bad
idea to hardcode the string "New York" in a program written to process
data relating to New York, because a new, unforeseen requirement may
arise for the program to be used to process data relating to "Toronto".
If "New York" were hardcoded, then each instance would have to be found
and replaced in order for the program to function properly for
"Toronto". If instead a variable is used, it is a simple matter to
change the single line of the program in which "New York" is assigned to
the variable.
A totally different situation exists when a variable's value represents
a system of codes that is independent of the world outside the program.
For example, one might write a function
CHARGET(S1, S2, CODE)
to take as arguments 2 strings, S1 and S2, and a code indicating one of
the following:
- "C" (for "common"): return all characters appearing in both strings
- "X" (for "exclusive"): return all characters appearing in one or the
other but not both strings
In this case there is no reason not to hardcode the third argument in
all the places where the function is invoked. There is no way a need
will arise in the future to change all C's to X's or some other value.
Striving to create a system devoid of such literals is doomed to
internal inconsistency in any case. To completely renounce literals, one
would have to recognize commonplace enumerated-value arguments to PB
primitives (such as primary! or cascade!) as literals that need to be
replaced as well. To be thoroughly consistent, even "true" and "false"
should be recognized as literals. Such extremism is obviously absurd.
COSTS OF THE "CONSTANTS" METHODOLOGY
The "constants" methodology (really an ideology) creates a very
substantial drag on development, grossly increasing the complexity and
tediousness of programming any system. As an illustration, consider the
"sample application" provided with EB4PFC.
n_cst_sample_appmanager:constructor includes the line:
inv_Splash.of_SetSource(This.c.Source.IFC)
To thoroughly understand this, the person reading the script has to
figure out that "c" is an instance var of type "n_cst_constants", though
it's not declared in n_cst_sample_appmanager itself but in some ancestor
thereof; that "source", in turn, is an instance variable declared in
some ancestor of n_cst_constant as type "n_constant_source"; and that
ifc_n_constant_source, the parent of n_constant_source, contains the
following instance var declarations:
constant integer PFC = 1
constant integer IFC = 2
constant integer USER = 3
constant integer OS = 4
constant integer TEXTFILE = 5
constant integer DATABASE = 6
constant integer DW = 7
//BTG: Added constant
constant integer BOSS=9
What we have here is not even a single constants object, but a hierarchy
of constants objects. This hierarchy must be understood and referenced
throughout development by all developers. It reflects a "central
planning" ideology in which the organizing principle demands that
complete information (ALL constants, for ALL functions anywhere in the
system) be preserved in a central location.
The central control fixation imposes a great task upon developers: all
additions, all changes to the set of constants used throughout the
system must be centrally maintained. All invocations of functions
involving such values must be preceded by a navigation through the
constants hierarchy; the constants relevant to the function to be used
must be identified and understood.
Consider the alternative, childish in its simplicity: an of_SetSource()
function that takes a string argument, value "pfc", "ifc", ., and
performs accordingly. No one uninvolved with of_SetSource() has to know
anything about its argument. The person calling of_SetSource() looks in
the obvious place -- of_SetSource() itself, guaranteed to be
up-to-date -- to determine which argument to pass.
But looking "inside" a function one is calling violates "encapsulation"
(though only in the most technical, literal-minded sense), which
constitutes an outrage for puritans. Thus does religion overcome common
sense.
Home > Master Index > Corporate America Index > Next
|