- Completely agree with @mipsytipsy here:
I am an extremely literal person, and literally speaking, nobody can be a “full stack” engineer. The idea is a ridiculous one. There’s too much stack! But that’s not what people mean when they say it. They mean, “I’m not just a frontend or backend engineer. I span boundaries.” - Yeah, this blog is for bragging.
- What is it with fillable PDFs on some gov’t websites (I know, I know; that’s a post for a different day) — but they can be sometimes saved but not printable?
- TFW about 16 years later after your colleague writes an impassioned call to “Tear down that GIL!” (take that, Mr. Gorbachev!), the GIL is finally torn down.
- I was wondering what the Go team was smoking when they came up with the reference date concept and can I have some of that?
- What is it that causes Medium to suck so much? Is it all the useless “content creators” writing things pre-GPT that just rephrase stuff from the Internet with nary a value added (“Here’s 10 reasons to learn Python”, and here’s how to write “Hello, world” in C, did you know?)? Is it that now probably thousands more are using generative AI — kinda indistinguishable? Or is it their idiotic subscription model which cannot deal with some logins? (I should really devote time to figure out that one but why — is that platform really worth anything at all?)
rant
The King, the Jedi and the Prodigal Son walk into a bar…
So, earlier I tried to switch to Blogger briefly, because my LiveJournal was messing up javablogs feeds (and I wanted something trackback-like).
But then I missed this tag/label/category functionality thingie, so I had a brief affair with Movable Type, but then, voila — The New Version of Blogger. Good, I don’t have to host the stupid thing then…
Peter Kriens has been working too much: “Today an interesting project proposal drew my attention: Corona. Ok, the name is a bad start. The Apache model of names without a cause is becoming a trend.” Eh? I was with you until the last sentence — but it’s not an Apache model of names without a cause, it’s a model of — aw, geez, there must be a pithier term for it — names for things associated with main product that are in some ways puns on the original name (JavaBeans, Jakarta, etc.) Get it? Sun – Eclipse, Eclipse – Corona? (Things will really get out of hand — with horses! — when a Corona-associated product will be called Dos Equis).
It’s Friday…
- (*) to .
- FP!
- The endsingularity is near.
Hear, hear!
IFOWONGO!!!. - No kidding… I’ve been wondering about this myself:
> where can I find the correct capitalization for the xmlrpcfilter setting ? - Really, Sherlock? It looks like
xmlrpc_filter
from where I’m sitting (CherryPy 2.2.1). How many different misleading combinations of capitalizations and underscore placements can you find in online “docs”? This is one of those really annoying things about this stuff… (And don’t tell me to RTFC, though that’s the only thing that resolved it for me…) - Most excellent all things GWT resource
- Sorokin ported to Java
- What’s up with the snide attitudes? This is
not even worth commenting, so I won’t… But a propos: what is wrong with “want[ing] everything done through [the] IDE“? This desire could be due to “Laziness, Impatience and Hubris“. Computers are good at repetitive tasks and I hate wasting keystrokes… - A propos of nothing (I think this is my motto), it’s so nice that
com.google.gwt.user.client.ui.MouseListener extends java.util.EventListener
, having nothing to do withcom.google.gwt.user.client.ui.EventListener
… Not!
Just say no to Holub
Boo-hoo! You had me, and then you lost me!
При чем тут голубь?
Yeah, yeah, we do want to “Just say ‘No’ to XML“. Amen.
And +1 to Mr.Holub for noting that “…many so-called programmers just don’t know how to build a compiler. I really don’t have much patience for this sort of thing.” But
it’s all downhill from there:
- -0.1 for describing Ant as a “scripting language” (it really is declarative…)
- -0.4 for picking on Ant, of all things, in the first place. Some people can write a compiler and still manage
to subject “every one of [their] users to many hours of needless grappling with”, oh, I don’t know…make
???
- -0.5 for plugging his book at the end
- -10 for doing the above with an innocent “By the way”. (+10 if this “innocence” is tongue-in-cheek, Lt.Columbo-“Oh, and just one more thing”-like. But
“architects, consultants and instructors in C/C++, Java and OO design” don’t do this kind of subtlety.)
In all, Mr.Holub is 10 in the hole for this round… A classic case of how a perfectly defensible thesis is ruined by the examples…
More WIBNIs
- Indexing into Flash/AJAX sites (by BOBHYTAPb) – a plugin for browsers, that would allow you to send people links, in which the information of a post-page-loaded sequence of clicks is encoded.
- An expert system for stores like Home Depot – to find thingamajjig whatchamacallit, that you know exists…
P.S. And on the lighter side…
Rant
The debate holy war on the topic of software engineering vs “real” engineering seems as endless as GWOT. I am too lazy to do an extensive
search, but I do remember one of the pithy definitions to claim the use of differential equations as a necessary condition…
But I thought I’d throw just one more difference into the mix. Software engineers — at least those that work in application development — have to use knowledge of other domains — those, for which software is written (e.g., finance, etc.) As far as I am concerned, these domains tend to be boring… I like technology for technology’s sake… Does that make me more of an engineer? Discuss… I wonder whether Michael Swaine weighed/will weigh in on it… P.S. Please…DISCLAIMER/DIGRESSION
I don’t really care, but “engineer” does sound cooler than “programmer”, which doesn’t have a sci-fi ring to it anymore, or “developer”, ’cause Donald Trump is also one — not that he isn’t cool…
Monkey business
After reading <a
href=http://discuss.fogcreek.com/joelonsoftware/default.asp?cmd=show&ixPost=75607&ixReplies=51>this, I thought I’ll put in my couple of bucks… This is a RANT!
It seems that the orientation in business is towards “monkey”
programmers — those who do not think, but do as they are
told. This is because management, apparently (and justifiably),
believes that at any given time it is easier to hire a hundred
monkeys (those are trained ones, that do not type randomly,
and so less than a million and less than infinite time will suffice,
but this is not a good analogy anyway), than a Shakespeare – or even Dumas
(with his own monkeys, so that’s another bad analogy, woe is me!)
As a result, there are (the list is by no means exhaustive; Java is
the language unless otherwise specified — I think Java has produced
more monkeys who think they are software engineers than anything
else — at least VB does not lend one an air of superiority):
- …monkeys who would rather sharpen the
carpal-syndrome-inducing skills of cutting and pasting the same
thing over and over again, rather than learn something like sed or Perl or a
similar tool —
or, indeed, spend some effort finding out about the existence
of such tools and their availability on the monkey platform of
choice (read: Windows) — or even finding out what plugins are
available for their lovely IDE.
IBM, for example, provides a framework called
EAD4J, Enterprise
Application Development for Java (it is only available with
purchase of IBM IGS consulting services). It includes components
similar to Struts, log4j, etc.
The framework is well designed, but here is a catch — because
of its design, adding or changing a service requires changes to
about 8 files. There are abstract processes, process factories,
interfaces, factories, XML files with queries, files containing constants to
look up these queries, etc., etc. It would really be nice if there was
a simple way to manage it, plugging in your logic where
some IDE plugin or script do the, well, monkey
job. Otherwise it’s overdesigned.Now, there are simple plugins for the current IDE of choice, WSAD, that at
least allow generating these
standard files (if not managing them, which is also important —
change one signature, and you have to change several
files). These plugins are provided by IGS
But nooo, the monkeys here prefer to create all of this by hand. It’s
a painful sight.
- …macaques who cannot fathom how one
could write a client-server application that does not communicate through
XML requests embedded in HTTP, but – o, horror! – actually has its own
application layer protocol.
- …baboons who think that
patterns
are not merely possible (albeit very good) approaches to problems
(and indeed are generalizations of good approaches to common
problems that have arisen). In fact, they
are the only way to solve problems, and that they must be copied from of
the book, or else it wouldn’t work. They wouldn’t know a pattern they
haven’t read about if it bit them on that place their head is
forever hidden in. If GoF didn’t write about it, it ain’t a pattern.
- Ok, I am tired of enumerating primate species. I’ll
just give an anecdote.
I wrote a module used by several teams. Because of the ever-changing
requirements, some methods and classes became
useless. I gave a fair warning by email, then I gave a second one by
marking themdeprecated
in the code. I notice that the
deprecated
tags were periodically removed. I send mail about this, and mark them
deprecated again. And again. And again.A monkey who was the team leader of another team came complaining that
I should remove it, because he cannot perform a build. Everyone else
can,
but he can’t, and so I should remove the single tag (that is probably
more useful to the whole project than anything he’s ever
produced). He cannot be bothered to find out how to make
it work? Why can everyone else make it work? Oh, he’s using some Ant
scripts? What? That’s an excuse? What the hell does that
have to do with anything? Oh, he didn’t write those
scripts. Well, write your own, or take them from those
people for whom they work. Oh, you don’t have time? Well,
I don’t have time to keep giving you warnings you just
ignore, you twit.Screw you, I finally thought, the warning has been there for some
time. I’ll just remove this stuff altogether.
His build promptly crashed. “Not my problem – we talked about this
over 5 weeks ago!”, I gloated, producing the emails from my
appropriately named CYA folder.As Butch said, “that’s what he gets for fucking up my sport.”
In short, they are not
Joel’s kind of programmers,
to put it mildly. Monkeys see and monkeys do. They do not think. They
have been taught a way to do things, and it is beyond them to figure
out that there could be another way. I honestly do not think they
understand what a boolean is (I submit that in their mind there is an
if
statement, and then there’s a boolean type)when they write:
if (thingie.isOk()) {return true;
} else {
return false;
}
Then someone they blindly trust (it must be an established authority,
like a book/magazine — only that approved by an already established
authority, because monkeys do not further their education on their
own, — a manager, instructor at a paid course) tells
them about a ternary operator. Now they write:
return thingie.isOk() ? true : false;
The above two examples are from an actual production code. Further, because monkeys do not think, they often reinvent the
wheel, badly. Which is also ironic, because they have been imbued with
all the right (and wrong) buzzwords, including “reuse”. I hesitate
to hazard a guess as to whether there is some meaning in their heads
they associate with this word, or is it just something they cry out
when playing free associations with their shrinks (“OO –
Encapsulation! Polymorphism! Reuse!”). Here are some more anecdotes.
- One programmer on a project wrote his own utilities to convert things
from/to hex numbers, for crying out loud. Here is Java, the only thing
he knows at all, and he can’t be bothered to think that maybe,
just maybe, such a thing is a part of standard API.
- This same monkey took several weeks to write a
parser (for a very simple
grammar, containing only certain expressions and operators such as
ANDs and ORs). When I asked him why he didn’t use a
parser generator (such as ANTLR, CUPS or JavaCC), he replied that
he didn’t know any of them. Now, it is not a crime not to know a
particular technology, but surely a programmer must be a) aware
that there are such things as parser generators, and b) be
able to learn how to use one. Whether he lacked the understanding or the
desire to learn, is this the kind of developer you want?
- Background: We needed to create some scripts doing export from the
database. The export was to be done under some specific
conditions, which were to be specified in the queries
(that is, only export dependent tables if their parent
tables are eligible to be exported, etc.) The logic was
only in SQL queries, the rest were just scripts passing
these queries to DB2 command-line, logging everything.
All of those were written by hand, 80% time spent copying
and pasting things, and then looking for places where the
pasted things needed to be changed a bit (for example,
some things are exported several times into different IXF
files, because they are dependent on different
things. These files need to be numbered sequentially, so
next one does not overwrite the other. What do monkeys do?
Number them by hand. Great.)
When I suggested automating things, in fact, automating
from the first step – even before writing our own queries,
using the metadata to generate the
queries themselves, I was looked at as if I just escaped
from the mental asylum.Monkey But you cannot just rely on metadata, there are also
functional links which are not foreign keys.Me Why are they not foreign keys in the first place?
Monkey Because they are functional.
Me Stop using that word. Tell me why are they not foreign keys?
Monkey Because they are nullable.
Me A foreign key can be nullable! Why is it not a foreign key?
OK, whatever, that’s our DBA’s problem… But there’s a convention for
functional keys anyway (we know they all start with
SFK_
, by convention). I’ll use that.Two days pass. My script works. A week later, they have problems
with their original scripts. My approach works,
demonstrably. But ok, they want to keep doing it their
way, fine. They ask for help with their way – those scripts, wrapping
hand-made SQL queries (which are already being automatically
generated, but I’ll hold on that for now…)Monkey What are you doing?
Me Writing a Perl script.
Monkey But there is no Perl on Windows.
Me See, I am sitting at a Windows machine and I have Perl.
Monkey What is it for? I thought Perl was only for the Web?
Me I am writing a script to generate your silly scripts
from the small set of user input. The resulting files, which you
are now doing BY HAND, are cluttered with repetitive stuff, such
as error-handling code and file numbering, and it’s error-prone to do
search and
replace manually. So we’ll generate all these scripts using my script.Monkey But they don’t have Perl on their Windows.
Me Who are “they”?
Monkey The client?
Me First of all, this is for the AIX machine. Second, this is
not for them, we will just deliver the generated shell scripts, the
Perl script is for us only.Me Hey, where’s my Perl script I wrote to generate the import
scripts?Monkey We have to have only shell scripts.
Me Yes, I used that one to create those shell scripts, dammit!
Monkey (sits writing these shell scripts again by hand. At the
moment, manually replacing some upper-case strings into lower-case) I
removed it from CVS. They only want shell scripts on their machine.Me It wasn’t going on their machine! It’s only for us!!!
Monkey Here, I changed these files already, you change the
rest.Me (giving up) OK.
Monkey Oh, and they have to be K-shell. Change them all to
.ksh.Me Why do they have to be ksh? What’s wrong with sh? They are
all very simple anyway, just call db2 import, check error status,
that’s it.Monkey They have to be K shell. That’s what the DBA said.
Me What the hell does the DBA have to do with it?
Monkey He wants to be able change them, and he doesn’t know sh,
only ksh.Me Ok, fine. I suppose you’re right,
echo
is
different in K-shell.Monkey Right here.
Me I don’t see them. What is this OAD_0035.ksh? Is that it?
Monkey Yes.
Me What does this mean? What do these numbers mean?
Monkey That’s what they said they should be called.
Me Who are “they”???
Me OK, you have a script called OAD_0035.ksh calling
OAD_0038.ksh, which in turn calls OAD_0038_1.ksh, OAD_0039_2.ksh, etc.
Why are they called this? It’s hard to remember which one is which.Monkey Why do you want to know what it means?
Me Because if I don’t know what it means, it’s much harder for
me to look at the file and see what is supposed to be inside. Ah, I
see
you added the insightful comment inside each file with its meaningful
name. Ah, I see also, you use that stupid name inside of it over and
over again, to write to the logs, instead of just using $0. (deep
breath). I’ll just create some symbolic links to them with meaningful
names, so I know what’s going on…Me Where are my links?
Monkey They only wanted files there that are named like
OAD_0035, etc.
Me What the hell do these numbers mean???Monkey I don’t know. For security.
Me (pause) Who told you to do this?
Monkey The client.
Me The client is a company. Who have you met from the company?
Monkey I don’t know. They said the client wants this.
Me Who said? Where? When?
Now I’m really curious. I turn with this question to
others. Finally I come to the last monkey who knows.
supposed to be called. It should start with OAD, and
then underscore, then four characters.Me Why four characters?
Monkey 5 For normalization.
Me What normalization?! What can you possibly
change in a, I mean, normalize in a 20-line shell script?
luminous eggMonkey 5 So they can keep them consistent and do some things to
all of them, regardless of what they are called.Me What can they possibly want to do with shell scripts? Rename
them to some other numeric pattern? There isn’t even any method as to
how they are named, it’s not like a certain number
pattern means it’s dependent on the other. You just
named them randomly…Curtain
But hey, fire one, and the replacement is easy to find. That’s true.
I suppose Henry Ford would be proud, but isn’t this a backward
approach? You don’t need monkeys at all, most of this work can
be automated.Maybe I need another line of work. 🙂