Kuro5hin.org: technology and culture, from the trenches
create account | help/FAQ | contact | links | search | IRC | site news
[ Everything | Diaries | Technology | Science | Culture | Politics | Media | News | Internet | Op-Ed | Fiction | Meta | MLP ]
We need your support: buy an ad | premium membership

[P]
Sermon at the Soup Kitchen I-IV: How I Was Saved

By MichaelCrawford in Technology
Sat Nov 05, 2005 at 09:28:55 AM EST
Tags: Technology (all tags)
Technology

I. October 28, 2005: I am working on a project with three young programmers and a manager. The oldest of the programmers is more than ten years younger than I. The manager is older, but does not know much about programming beyond how to check our code out of subversion and type "make" to check our progress.

I was talking to my buddy Leo Baschy yesterday about it. Leo's around the same age I am. He is a Rocket Scientist: he wrote MacsBug 6.2 when he worked for Apple, and spent several years writing an access control application that he is just now bringing to market. Leo Does Things Right. I told Leo I really enjoyed talking shop with someone who had a clue. But I said:

"When I talk to those guys about how to write better code I have the sense that their experience of me is like going to church."

"Many people go to church. How many are without sin?"

"But I didn't learn to preach because I studied at the seminary. It's because I was a derelict on skid row until I was saved by..."


"... smart pointers and automated testing."

Contents

Sermons I-IV

This work is licensed under a Creative Commons Attribution-NoDerivs 2.5 License.

Smart Pointers

[Top]

The usual reason for using smart pointers is to automatically free memory when we don't need it anymore, no matter what happens.

Pop quiz: the Boost Smart Pointers exist because auto_ptr has some problems. What are these problems? Sometimes auto_ptr is the right choice, and in this case, the Boost alternatives do not provide the best solution to the problem. When is this the case?

A partial answer to why auto_ptr might not be what you want appears in my article On Refactoring C++ Code.

Even auto_ptr and Boost's smart pointers don't provide all the different kinds of smart pointers one might want. What other kinds should there be? How would you implement them?

I've already written one for my project and plan to write several more. As a hint, some of them will include Boost smart pointers as members. I'm planning to place them under the Boost license, then submit them for review for possible inclusion in the Boost C++ library.

Automated Testing

[Top]

II. Ultimatum

[Top]

October 30, 2005: During Friday's service I said the manager at my startup company knew little more about programming than how to type "make". Well, he and I have been butting heads like a couple of bull moose. He may never have written code in his life, but he has been a technical manager for other kinds of engineers for years and is accustomed to having things done His Way.

By contrast, I made it clear in my interview that all I needed to be a happy employee was not any amount of pay or stock, but management that was supportive of programmers taking the time to write reliable, efficient code. "Jack" (not his real name) assurred me quality was a priority at "Yoyodyne" (ditto) because the cost to our customers of even a single incident of product failure could be a hundred thousand to a million dollars.

Be careful what you wish for, when seeking someone who takes pride in his work: you might get it. After Jack angrily informed me that my position was not to implement better software development methodologies at my new company, but to write code quick and dirty, and get it out the door as fast as possible no matter what the cost to the end user, I wrote a sad email expressing my disappointment that my stock would never amount to anything of value, but then thought better of it and copied the following to the whole company:

Lest you're worried I might get fired for posting all this online, I have only this to say for myself: Fuck 'em if they can't take a joke. I long ago decided I wasn't going to cower in fear that something bad might happen because of something I wrote on the Internet. Every Kuron should understand that about me by now.

None of the names given in the following are their real names. I don't think I've told anyone but a few close friends and family who I'm even working for. We are a startup.

Jack had asked me to spend a couple weeks teaching Bill to write better C++ code, and especially to learn better ways to test it, yet never seemed to allow Bill to actually take the time to do so.

At first I thought Bill was just being lazy or indifferent, but then I remembered what he told me when we first met, that he had actually already read all the books I recommended to him, but Jack wouldn't give him the time to implement any of their advice.

No one involved with Yoyodyne had ever hard of RAII, smart pointers, auto_ptr, Boost or unit testing before I brought them to their attention.

Gentlemen,

After further reflection upon my previous mail I'm prepared to offer you a choice. I will not back down or negotiate. This is an ultimatum. Think carefully before you respond.

Option Number One:

I want two weeks - fourteen days - of Bill's undivided attention and cooperation during which time I will teach him about RAII (Resource Allocation is Initialization), smart pointers and automated testing, and he will implement them in his code. I will check in with him several times a day to verify his progress, and also check out his code at least daily to verify the increasing numbers of his tests both written and passed without error.

That means that if Jack has something important he needs done, then he has to either do it himself or get Joe or Jim to do it. I can't have him taking time away from my work with Bill as he has so frequently demonstrated his willingness to do.

In return for your help, I will complete my project as quickly as I can. I am quite close, the only reason it's not already done is because I was working on testing support for Bill.

Option Number Two:

I will tender my resignation, effective immediately.

Please make your decision by consensus. Don't just leave it up to Jack. That's why I'm copying everyone on my offer.

I want your answer in writing. I won't be accepting phone calls until I have it. Otherwise I would just start shouting at Jack, and none of us want that.

Ever Faithful,

Mike Crawford

It's not just that I faced a certain lifetime of sleeping in the gutter, half-mad from starvation and dirty drugs, until I was saved by smart pointers and automated testing. It's that I turned down several offers from good companies where I would have earned at least a hundred thousand dollars a year, with stock options, because I felt Yoyodyne offered me a brighter future than they did.

That's right folks: I gave up my life of hungry freedom as an independent software consultant for a salaryman role at a corporation, because I felt I needed to find a better way to make a better life for Bonita and myself. I flew out West and spent three weeks crashing on my friend's couch so I could interview in the Valley.

And why did I feel Yoyodyne offerred me a brighter future? In part it was because Jack said I could do my work for Yoyodyne remotely, so I could return home to Bonita. But that wasn't the main reason I accepted Yoyodyne's offer: It was because Jack assured me that quality was a priority at Yoyodyne, and he wanted to put me in charge of implementing my software development methodologies at the company. It can't get much better than that, can it?

I feel pretty betrayed right about now. Pretty ripped off. I feel just like I fell for a swindler's con.

After Jack's initial response, which demonstrated to me that he had not the first clue as to why I was angry at him, I then sent the following reply, again copied to the whole team.

Why the whole team? Because the lot of them are working for stock. They have been getting no cash pay whatsoever, and have no prospect of getting any for several months. I am only getting paid because I made it clear that keeping my wife in art school was a priority. I'm not getting paid very much, just the bare minimum I calculated I would need to meet our living expenses and pay Bonita's tuition. Like the others, my pay is mainly in stock.

I wanted to help them understand just how little that stock was going to be worth someday if Jack didn't shape up and get a fucking clue.

Jack,

I'll be giving you the benefit of the doubt by assuming you didn't read my second mail before you sent me your reply quoted below.

Go read it, then discuss with the team which option the team prefers. Please don't contact me again until all of you have discussed it with each other. If Jim and Joe are out then you need to reach them on the phone.

While I'm awaiting your response I'll be posting my resume on Craig's List. I would rather not get another job, I would rather stay with Yoyodyne, but without resolution of some important issues I will have to look at other options.

It's important for everyone to understand I'm not just trying to be difficult. I made clear to Jack before we even met that a basic precondition of my accepting ANY offer of employment - not just Yoyodyne's offer - was management support of software methodologies that lead to reliable, high performance code. I have no interest in compromising my integrity as a software engineer by contributing to the success of a company that does not serve the best interests of its customers.

I have made this point repeatedly every time you and I have had a disagreement, and I am making it as clear as I possibly can now: if I am going to resign, it is because Yoyodyne does not want to produce quality software.

Life is too short to write bad code.

I stand by the work I've done so far. I've you have any doubt, have Jim, Joe and Bill audit my source code. I've already invited you to have them do so.

Good Day.

Mike

After several hours of heartfelt discussion, my wife Bonita feels I should just resign no matter what they say or do. Based on everything I've told her about Yoyodyne and Jack so far, Bonita feels Yoyodyne is destined for failure, it is not in my power to save it, and even if it were, Jack would never stop making life miserable for me.

III. auto_ptr and Its Alternatives

[Top]

October 31, 2005: In my first sermon I explained that the Boost smart pointers were created to address some shortcomings in auto_ptr. I gave you a quiz: what are these shortcomings? Boost isn't always the right solution: sometimes auto_ptr is the best choice. When?

Answers with sample code within. Tomorrow: the other kinds of smart pointers you need to make your kit complete.

In my second sermon I explained I gave an ultimatum to my new employer "Yoyodyne", in which I demanded founder "Jack" give me two weeks to teach young programmer "Bill" how to overcome his quality problems. Brother rusty pointed out that commitment to quality is a bad strategy for a startup, and Brother localroger agreed with my wife Bonita that I should leave no matter what because Jack and I will always be fundamentally at odds.

I accepted Yoyodyne's offer because Jack himself explained why Yoyodyne had no choice but to write quality code. But some souls can't be saved: Jack knows The Way in his head, but does not feel it in his heart. That's why I'm posting this link to my resume:

I will accept both permanent and consulting positions. Didn't Jack even read my resume before he hired me?

There are two reasons why auto_ptr might not be what you want.

auto_ptr Doesn't Work for Arrays

[Top]

The simplest is that it doesn't work to with arrays, because auto_ptr deletes its member pointer with just plain "delete" and not "delete []". The second form is required for arrays because the memory manager needs to store the length of the array somewhere with the pointer as a lookup key. Without saying "[]" it won't know to go look.

The effect of using just plain "delete" might be a memory leak or it could be a crash. It's not simply that arrays could be stored differently than single objects - portable code has no way to know - but the destructors for all the objects but the first will not be called. Bad bugs might result if the objects in the array have non-trivial distructors,

I understand Metrowerks CodeWarrior figures out which kind you really should use and does the right thing, but I consider this a misfeature. I would prefer the memory manager called assert( false ) when the wrong kind of delete was used. I'm pleased to report that the valgrind memory debugger says "mismatched new/delete" when you call the wrong form.

I discuss this in further excrutiating detail in my article On Refactoring C++ Code.

Take My Memory. Please!

[Top]

The second reason auto_ptr is probably not what you want to use is more subtle, and will lead to crazy bugs any time you try to put auto_ptrs in Standard Template Library containers: auto_ptr has extremely nonintuitive copy and assignment semantics. The auto_ptr being copied or assigned from hands over responsibility for its memory to the auto_ptr that is being assigned or is the new copy, and resets its member pointer to NULL.

Why?

It really could be no other way, if auto_ptr is going to just manage a single pointer in a simple way. If instead the copy got a copy of the pointer while the original kept it too, there would be a double delete that would corrupt the heap and likely cause a crash.

There are two ways to solve the problem, the simple way and the complicated way. In the simplest cases, it doesn't matter that auto_ptr does the wrong thing when you copy it, because you just don't ever try to make a copy.

However, it is possible to make a copy accidentally, which leads to crashes that are hard to figure out. This happens especially because the C++ compiler will define invisible default copy constructors and operator=() member functions even if you don't want them. For that reason alone, if you have any auto_ptr members, you should explicitly declare your copy constructor and operator=() "private" so a compiler error will be emitted if you should accidentally try to copy or assign an object with an auto_ptr member.

The Simple Solution

[Top]

It's tedious to have to do that every time you want to use an auto_ptr. Error prone too: what if you forget sometimes? Is there an alternative that would automatically force compiles to fail should you accidentally try to copy or assign one? That's what Boost's scoped_ptr is for. scoped_ptr is just like auto_ptr, in that it manages a single object in a simple way, but its copy constructor and assignment operator are declared private. Attempts to copy or assign an object with a scoped_ptr member will fail to compile.

(Not always though: only if you leave the copy constructor and assignment operator up to the compiler-generated defaults. It is possible to define your own that do the right thing. When would you want to do this? I can see good reasons for doing it two different ways. What ways? What would the implementations look like?)

"That's helpful," you say, "in that I won't accidentally make an awful mistake. But isn't there a way to use pointers in STL containers? That's the only way they can hold polymorphic objects!"

For STL containers, you need the more complex alternative to auto_ptr: reference counted smart pointers.

Standard Template Library-Compatible Smart Pointers

[Top]

For an object to be held in an STL container, it needs to have a well-behaved copy constructor. auto_ptr's copy constructor is not STL compatible. What would work is a smart pointer whose copy constructor copies the object whose pointer it holds, but that would be slow and memory-intensive.

A fast, lean alternative is reference counting. The memory managed by a reference counted smart pointer is shared between all the assigned or copied pointers. Each time a copy is made, the reference count is incremented. Each time a copy is destroyed, or an assignment changes which object a smart pointer manages, the reference count is decremented. If the reference ever reaches zero, then the memory being managed is deleted.

If your objective is to hold polymorphic objects in an STL container, then almost certainly what you want is an STL container that holds reference counted smart pointers to your objects.

There are a lot of different kinds of reference counted smart pointers around. Boost offers two, the first being shared_ptr.

The advantage of shared_ptr is that it can be used to manage objects of any class: the objects a scoped_ptr manages don't need to know they are being managed in a reference counted way.

The disadvantage is that a separate reference count has to be allocated that all the shared_ptrs share among themselves, so updating the reference count for one of them updates it for all. Thus shared_ptrs take up more memory and have to allocate their reference count from the heap, so creating the first shared_ptr and deleting the last is slow.

If you create a new class specifically meant to be reference counted, a faster, leaner alternative to scoped_ptr is Boost's intrusive_ptr. The objects being managed maintain their own reference count as a member variable, and provide member function accessors for intrusive_ptr to call to manipulate the count.

That's Great! Is It Thread-Safe Too?

[Top]

Maybe Not! A naive implementation won't be. Thread-safe smart pointers require atomic reference counts.

If one increments and decrements the reference count by just adding or subtracting one to or from it, the smart pointer won't be thread-safe because the code that updates and checks the reference count is a critical region: if two threads update the reference count at the same time, then check the result to decide whether to call delete, one of two errors might occur: the memory might never be deleted, or it might be deleted before the last shared_ptr is done with it - that is, before your client code is finished using the managed object. Most likely this will corrupt the heap and lead to a crash.

Conceptually, the solution is simple: most platforms that support threads also provide atomic arithmetic libraries. All you need to do is increment and decrement the reference count in an atomic way.

Unfortunately, using library subroutines to do the atomic math is slow: each increment and decrement requires a subroutine call and return. Large STL containers full of thread-safe reference counted smart pointers will run a lot slower than equivalent containers full of thread-unsafe ones.

There is a faster solution, but it's not very pretty, and it's completely non-portable. Or rather, it's portable, but it takes work to port to new platforms, and each port must be maintained separately. One can manipulate the reference count directly by using each target processor's atomic arithmetic instructions in assembly code.

Hey! Who farted? This may be skid row, but it's still a church, you know!

I've never used it, but I understand Boost's Thread library provides such atomic math with the platform-specific parts encapsulated so client code can use it in a portable way. But I also know the task of maintaining the Boost Thread library is an onerous one for the Boost developers, and I have read complaints that new processors needing new ports written appear faster than the Boost developers can implement support for them.

Boost's shared_ptr is thread-safe by default, but will run faster if you disable thread-safety in your build. scoped_ptr's documentation details its thread-safety guarantees, and makes it clear that only certain kinds of simultaneous accesses from different threads are guaranteed to work:

shared_ptr objects offer the same level of thread safety as built-in types. A shared_ptr instance can be "read" (accessed using only const operations) simultaneously by multiple threads. Different shared_ptr instances can be "written to" (accessed using mutable operations such as operator= or reset) simultaneosly by multiple threads (even when these instances are copies, and share the same reference count underneath.)

Any other simultaneous accesses result in undefined behavior.

It's important to understand that "thread-safe" doesn't imply "anything goes"; just as with exception-safety, there are different degrees of thread-safety, and one has to take care to understand what is guaranteed and what is not.

I'm more familiar with the ZRef thread-safe reference counted smart pointer in the ZooLib cross-platform application framework, which was written by my other Rocket Scientist friend Andrew Green, his clients Learning in Motion, and Learning in Motion's client, The Ontario Institute for Studies in Education. ZooLib is Open Source under the MIT License.

(Please forgive ZooLib.org's primitive HTML design. I threw it up at Sourceforge in a hurry for ZooLib's Open Source release before I knew much about web design, and still haven't redone it.)

ZooLib's flagship application is the educational multimedia database Knowledge Forum. To allow Knowledge Forum to handle thousands of clients in a fast, scalable way, ZooLib is extensively multithreaded. But ZooLib isn't just for servers: graphical user interface applications written in ZooLib are snappy and responsive in a way that is difficult to achieve with single-threaded code.

ZRef is similar to Boost's intrusive_ptr in that the reference count is held by the objects that are managed by ZRef. They must be subclasses of ZRefCounted, but otherwise client code doesn't need to worry about implementing the reference count code.

The atomic arithmetic used by ZRefCounted is provided by inline assembly code embedded in inline C++ functions in ZAtomic.h. You will see there is a different implementation for each arithmetic operation, for each target processor, and what's worse, for each target compiler on each platform, because every compiler has its own idea of how inline assembly should be written; inline assembly is not defined by the C++ or C standards documents.

It's not hard to port ZooLib to new platforms or compilers, but the very first work required is to implement each arithmetic operation in ZAtomic.h. That's why, sometimes, naive users think ZooLib, being written in C++, should work on any POSIX platform, but find programs built with ZooLib don't work when compiled for an unsupported target processor. (ZooLib also supports Mac OS, Windows and BeOS.)

I describe ZooLib and ZRef in more detail in The ZooLib Cookbook.

But Arrays? What About the Arrays?

[Top]

Boost offers array-compatible variants of each kind of smart pointer: scoped_array and shared_array.

I understand the C++ ISO Standards Committee didn't provide an auto_array because they felt the STL vector template was a better alternative. They failed to understand that vector doesn't serve every need, for example integration with legacy code that returns naked pointers to arrays that become the responsibility of client code to delete.

So is auto_ptr Completely Useless?

[Top]

No, there is a common situation where auto_ptr is the best choice. shared_ptr will do, but auto_ptr is actually better. Naked pointers also work and are more commonly used, but risk leaking memory.

When could that possibly be the case? When auto_ptr's peculiar copy semantics are what you want!

I began to wonder about this when I started to change my code for Yoyodyne from auto_ptr over to scoped_ptr. Being deeply religious, I always completely construct my class' member variables in initialization lists. I don't initialize member variables in constructor bodies if I can possibly avoid it, thus nearly every constructor I write has an empty body.

(Smart pointers are examples of "RAII" - Resource Allocation is Initialization - applied to memory management. Zealous use of RAII is the first step towards the Holy Grail of exception safety. When one uses RAII, one's destructor bodies are almost always empty too.)

The entry for each member variable in an initialization list is not actually its initial value. This is the case for primitive types like integers and pointers, but the entry is actually the parameters for to a call to each member's constructor. It's just that for primitive types, the constructor turns out to be a simple assignment of the value given.

Each parameter passed to the constructor has to be an expression, that is, some C++ code that resolves to a single value. Usually you can calculate each parameter in-place as an expression, but some parameters are more complicated to calculate; they require one or more statements and one must call a static member function that calculates the parameter and returns it as its result.

(Why static? Because the object "this" points to is incompletely constructed until processing of the initialization list is complete and the constructor body is entered. It usually works to call a non-static member function, if one is careful not to refer to unconstructed members, but this requires care and is hard to maintain. Using static member functions keeps one's code Pure of Heart and bug-free.)

Commonly these static member initializers allocate a pointer with new after calculating the object's constructor's parameters, then return the pointer. One can return just the naked pointer, but there is a potential for a leak: what if some other code calls the initialization function, but forgets to capture and delete the result? What if "new" is not called as the last statement in the function, and a later statement throws an exception? You get a memory leak!

The solution is to return a smart pointer. If its memory is not deleted elsewhere, the smart pointer will delete it after function return processing is complete and it goes out of scope. To be more clear: there is a small window of invisible code in between the return statement and the resumption of the code that called the function. The calling code can capture the return value during that window, but if one forgets, returning a smart pointer prevents a leak.

One can't return a scoped_ptr because it doesn't have a release() member function: once a scoped_ptr starts to manage some memory, one can make it manage different memory by calling its reset() method, but one can't make it simply stop managing any memory at all.

shared_ptr will work, but only if the member variable being initialized is another shared_ptr. shared_ptr doesn't have release() either (why not?); you can't initialize a scoped_ptr from a shared_ptr.

But auto_ptr has a release() method! You can initialize a scoped_ptr from an auto_ptr. The scoped_ptr's copy constructor calls auto_ptr's release() method so the scoped_ptr assumes responsibility for deleting the memory when it goes out of scope.

Sample code below: auto_ptr_demo.cpp prints "Hello World!" when it runs. Testing with valgrind proves it does not leak memory or have any illegal memory references.

Coming Soon to a Soup Kitchen Near You: The Smart Pointers Boost Forgot.

You might think auto_ptr and the Boost smart pointers provide all the smart pointers one might ever need, but that's not actually the case.

To understand why, think about how this skid row derelict was saved: by smart pointers and automated testing. The smart pointer templates I've been working on are for memory you don't own, but that test automatically every time you run your program, by asserting that the pointer is still valid every time you dereference it.

Without Further Ado

[Top]

auto_ptr_demo.cpp was formatted using the handy perl script found in Brother tmoertel's How to Post Code to K5 -- the easy way!

I gotta run. I'm going in with Bonita to Halifax this morning.
/* auto_ptr_demo.cpp
*
* This demonstrates one situation in which auto_ptr is the right choice,
* rather than one of the Boost smart pointers such as scoped_ptr or
* shared_ptr.
*/

#include <iostream>
#include <string>
#include <memory>
#include <boost/scoped_ptr.hpp> // http://www.boost.org/

using std::ostream;
using std::string;
using std::auto_ptr;
using boost::scoped_ptr;
using std::cout;

class HelloSayer
{
public:
HelloSayer()
{}

~HelloSayer()
{}

string asString() const { return "Hello, World!\n"; }
};

class Microphone
{
public:

Microphone()
: mSpeakerPtr( getSpeaker() )
{}

~Microphone()
{}

private:

scoped_ptr<HelloSayer> mSpeakerPtr;

// static because the object "this" points to is
// incompletely constructed when getSpeaker is called.

static auto_ptr<HelloSayer> getSpeaker();

friend ostream &operator<<( ostream &stream, Microphone const &mike );<br> };

int main( int argc, char **argv )
{
Microphone mike;

cout << mike;<br>
return 0;
}

ostream &operator<<( ostream &stream, Microphone const &mike )<br> {
stream << mike.mSpeakerPtr->asString();

return stream;
}

auto_ptr<HelloSayer> Microphone::getSpeaker()
{
return auto_ptr<HelloSayer>( new HelloSayer );
}

IV. The Right Tool for the Job

[Top]

November 1, 2005 - Today's sermon won't be what's listed in your program. I must answer a question posed by Brother th0m after yesterday's sermon as I feel it is of fundamental importance in any discussion of any programming language - not just C++ - and especially, when interviewing applicants for software development positions. Again, jobs where one writes code in any programming language, not just C++.

Engineers of any sort, not just software engineers, will readily agree to the following:

  1. One should use the right tool for the job.
  2. One should hire workmen who are skilled and experienced with, as well as trained in the use of these tools.

Makes sense right? But the mistake nearly everyone makes is to assert that C++ cannot possibly be the right tool for the job when much safer languages like Java or Python are readily available. Evidence that C++ is unsafe comes in the form of bloated, slow, crashy and leaky C++ applications. Examples of such products are easy to find, and all too numerous. I readily admit that many, if not most C++ applications are buggy as all get-out.

But, I assert, that's not because C++ is never the right tool for the job, but because most people employed as C++ programmers aren't the right workmen for the tools: they are either not adequately skilled or experienced with, or trained in the use of the C++ programming language.

I assert:

  1. The requirements of some jobs require the use of tools which are powerful, sharp and difficult to wield correctly. Thus:
  2. A great deal more skill, experience and training is required before any workman is qualified to use such tools.
  3. The use of such tools by unqualified workmen is dangerous. Use by qualified workmen is risky, but less dangerous than using the wrong tool.

The mistake made by most who either write C++ code or employ C++ programmers is thinking that knowing enough C++ to be dangerous implies one is qualified to hold a C++ programming job. That's just plain wrong: all it makes one is just that: dangerous. Having the brute strength to gouge a chip out of a piece of walnut with a sharp chisel does not make one a fine furniture craftsman.

Brother th0m was moved to jump up at the end of yesterday's service and shout:

for fuck's sake,

what does the very existence of this topic tell you about C++ as a programming language? ANYONE? THIS THING ON?!!?

Brother th0m has an excellent point. But I hasten to point out, one can live a completely righteous life, yet not be saved.

I'll restate his question in a way that will make its answer more readily apparent:

Question: What does the very existence of the Air Force and Naval Academies say about the fighter plane as a mode of aerial transportation?

Answer: That's not what fighter planes are for. Fighter planes are for killing people.

If you want to go on vacation, visit a relative or attend a business meeting, you don't travel in a fighter plane: you fly on a passenger jet operated by a commercial airline. If at all possible, you purchase your ticket days or even weeks ahead of time, to save on the fare. In all cases, one travels from one airport to another, and may ride in commercially operated ground transportation at one or both ends.

But if you want to defeat an enemy, whether to defend from their attack or to conquer them, one does not attack with any more advance notice than is absolutely necessary, as the element of surprise is a significant advantage. One must be ready to deliver one's strike to the enemy wherever he may be, anywhere in the world, whether on land or at sea. If an airbase is not available near the enemy, one must take the airbase to the enemy in the form of an aircraft carrier. One does not ride a taxi or bus to an airbase: one lives in barracks on base, or quarters aboard ship, so one is ready to fly a sortie on a moments notice.

Fighter planes are dangerous to fly because killing is dangerous work. Why? Because the enemy defends itself. Fighter planes do their job by raining bullets, bombs and Hellfire upon the enemy until they are killed, maimed or burned beyond recognition. Most enemies I have discussed this with explained to me they don't like this kind of treatment. So they fight back, in the form of antiaircraft guns and missiles, and heat-seeking air-to-air missiles launched by their own... (wait for it!) fighter planes.

Fighter planes are dangerous to operate even in times of peace because the maneuverability required, not even to win an aerial battle but simply to survive it make fighter jets unstable and difficult to control. They respond to the pilot's lightest touch as if hair-triggered, and are as likely to spiral out of control as to fly straight.

Passenger jets are safe in part because their wings are tilted in a shallow "V" shape known as a dihedral angle. Its effect is to gently press the plane back towards level if it should ever tilt sideways. Not just passenger jets, but small aircraft and even most kites have dihedral angles.

But fighter planes don't have dihedral angles: their wings stick straight out. That makes them dangerously unstable, but it also means they fly just as well upside-down as right-side-up.

Why do we care? Not so some Top Gun academy graduate can get his rocks off flying upside-down: it's so, should he happen to find himself upside-down in the heat of a battle, he can still fight.

What would happen if a 747 pilot, even a trained and experienced one, were to sneak onto an Air Force Base and steal an F-15? I can confidently predict the outcome:

  1. A smoking crater in the ground
  2. Millions of dollars of lost taxpayer money in the form of a wrecked F-15
  3. One dead 747 pilot

I have absolutely no argument with the claim that fighter planes are dangerous. Fighter pilots, even highly trained academy graduates, die all the time, not just in battle but in peacetime training accidents.

But:

Does that in any way imply that a sovereign nation should not have fighter planes?

No.

Let me ask you then: when a nation has a war to fight, should it employ postal clerks or Professional Killers?

Profesional Killers of course: military men and women, soldiers and sailors.

"But we don't have any resumes on file for Professional Killers. Where do we find them? Are there headhunters for this sort of work?"

No: you have to make them yourself, by hiring postal clerks and training them to be soldiers and sailors. Many require only boot camp, but to fight with the most powerful and dangerous weapons, such as fighter planes, the training must include a college degree and flight school, or even better, graduation from a Military Academy.

BROTHER MIKE! Are You OK? Do You Need Help?

[Top]

Oh. I'm sorry... a moment please. (A sip of water sister, please? Thank you. Thank you very much.)

Forgive me brothers and sisters: sometimes when The Spirit catches me, I forget myself. I completely forgot I was even discussing computer programming. Allow me to explain:

Long before I was Saved, long before I was down and out on skid row, I read the words of the prophet Richard, that foretold a return to The Garden. What's more, his Prophecy gave the directions to get there! We must learn again what we were taught by our mothers and our fathers when we were small: to regain Paradise, we must Share.

I knew the instant I read his Prophecy that Richard's way was my way, and immediately commenced study of The Good Books, starting right from the beginning with The Old Testament.

(I have already explained that my path was not a righteous one: tempted by filthy lucre, I lived for many years in The Valley of the Shadow of Death. While I was Saved years ago, I yet continued to sin, as even the saved are sinners. We can do little else than strive to do good works while begging for forgiveness for our sins. But that's a story for another day.)

But why you ask, did I know so instantly I was to be a GNU hippy? Because, in many ways, I was already a hippy of the more common kind: I already believed one must share. I even owned a tye-dyed t-shirt and bedsheet to prove it.

I never served in the military, yet I lived the military life: I was a Navy brat. My father Charles Russell Crawford was a proud officer of the United States Navy. And not just him: his brothers Herb and Ben, my grandfather Herbert, and as far as I am able to tell, very nearly every male relative and ancestor on my father's side of the family for as far back as anyone has any record served their country in the Navy, or the Army during the Civil war.

Speaking of weapons of war and those who wield them made me cry. And I cried, yes brothers and sisters, how I cried, as the Spirit caught me, because all I could think of was how I hurt my father so, my father who served his country in Vietnam, because I didn't serve as he so proudly expected me to.

No, worse: I slapped my father in the face as hard as I could. In High School, I applied and interviewed for the Naval Reserve Officer's Training Corps Scholarship, and fully expected to get it. My father knew I didn't want it, but begged me to accept it. He made clear to me that he wanted this for me not so I could go to college for free, but so one day I too could serve my country as an Officer of the United States Navy. My father wanted this for me more, I'm certain, than anything he ever wanted.

But I knew I was, in my heart, a hippy. I knew I was Fundamentally Incompatible with Military Service. I loved my father, and I loved and still love my country, but I knew it would be wrong to accept the ROTC scholarship.

But I was young, and my father could be angry and unapproachable. I did not have the courage to refuse. I admit: I did not have the balls. I didn't decline the scholarship, I simply didn't show up for the Navy's medical exam.

My father went to his grave without mentioning it ever again. But I knew what I had done, and how he must have felt about it.

My father never spoke of his time aboard the USS Providence off the coast of North Vietnam as if it were any different than a fishing vacation. But I know that, as the ship's missile fire control officer, it was my father's personal duty to take the lives of North Vietnamese fighter pilots. Did he? I don't know, and likely never will know, as he never spoke of it. But if he did, I know that by doing so he saved the lives of dozens, perhaps hundreds of his shipmates, and quite likely his own.

Saint Gödel taught us that it's not all Black and White: there is a great deal of Gray in between. Is war justified? If it is, it's not so nearly as often as some claim. But if one finds oneself by whatever circumstance in a battle, is it then justified to kill or be killed? To kill, or let one's comrades die?

This very question torments me, as my father told me it tormented him, and as I know it torments many of our brothers and sisters in Iraq and Afghanistan this very day. And that, brothers and sisters, is why the Spirit caught me, and that, brothers and sisters, is why I cried.

But Brother Mike! Isn't this about C++? Tell me about C++! You've lost me completely!

No, brother th0m, the topic of today's service is about choosing, or, more precisely, correctly wielding the right tool for the job. C++ and fighter planes are both just examples of powerful and dangerous tools that require years of study and practice to learn how to use.

I'll tell you in a moment when C++ is the best tool. But first I want to explain an important lesson my father taught me, that I may pass it on to you. When you wield a tool, whether it be a programming language or weapon of war, you must do as my father taught me, and wield it righteously:

Every Engineer's Solemn Duty

[Top]

My father was an engineer too, an electrical engineer. Once a carpenter, he was inspired to enlist in the Navy one snowy evening while roofing a house, when he struck his thumb real hard with a hammer. The Navy sensed my father's potential for leadership and sent him to study at the University of Idaho, where he met my mother. My sister was born while they were still students. After graduation, he went on to Officer Candidate School and was given his commission. The telegram with news of my birth took two weeks to reach him: he was deep in the Phillipine jungle getting trained in survival, as the Vietnam War was just then heating up: the year was 1964. My father's engineering specialty was antiaircraft missile electronics: guidance and control systems.

The lesson my father taught me, a lesson I only now, as I speak, realize for the first time I was ever taught, is to Do My Duty. You already know my father did his for his country. I want you to know that he did his duty to his family as a husband, father and provider, and he did it well. He did his duty as a teacher too: I learned science and engineering at my father's knee, as we worked on projects together. Once we had a contest to see who could make a working telephone from stuff found lying around the house.

Engineers have other Masters who demand duty of us: our profession, our conscience, those who invest in, purchase or use what we design, our coworkers, and the public.

Listen to me carefully, and never forget what I'm about to say. I want all of you to spend some time thinking it over deeply, then I want you to discuss it among yourselves:

There may come a time in your career as an engineer when you will be called to take a stand against your employer's disastrous course of action. When that time comes, your duty is not to your employer, but to your profession, your conscience, your coworkers, your company's investors, its customers, and the public. When your coworkers, investors or customers could be bankrupted, or the public's safety could be placed at risk, it is your solemn duty to take a stand.

Your stand could be an ultimatum: you might lose your job, as I did. You could blow the whistle as I still might. You must accept the consequences: unemployment, poverty, getting blacklisted, sued or even imprisoned. Such may be the cost of doing the right thing.

But when the chips are down, it is your solemn duty to do it.

My father knew from engineering quality: After getting his Master's degree at the U of I after the war ended, he went back to work for the Navy as a civilian. His last job before he retired was overseeing the repair and testing of nuclear submarine reactor control systems at Mare Island Naval Shipyard. Now I ask you: if the Navy decided to send a sub out to sea before my father felt its reactor control system was ready, would he have spoken up about it? Even if he lost his job by doing so? And was thereby unable to feed his hungry children?

I know my father, he would have done the right thing.

Because an engineer named Roger Boisjoly didn't trust his conscience, seven brave and innocent people died. No, he followed standard procedure, by reporting a safety risk to his superiors, then trusted them to do the right thing, despite the fact that they obviously didn't heed his warning:

It got real cold one night when the Space Shuttle Challenger was being readied for launch. The Shuttle's two solid fuel rocket boosters had been manufactured by Morton Thiokol in several sections. Rubber O-rings were used to seal the joints between each section, and covered with high-temperature putty to protect the rubber from the flames. But the rubber the O-rings were made of became stiff if it ever got cold. It wouldn't flex as the sides of the joint vibrated in and out, so that the flames inside the rockets might shoot out through a crack, and make the liquid fuel tank explode.

Realizing the risk, Mr. Boisjoly filed a safety report with his superiors, yet despite the fact that they overruled his advice for fear of losing Morton Thiokol's fat government contract, he did his duty to his company and kept quiet.

But he didn't do the right thing when he realized the Challenger was going to launch to its doom. Why didn't he ring someone up at NASA? We didn't he go to the press? Why didn't he crash his way into Mission Control, arms flailing and screaming "IT'S GOING TO FUCKING EXPLODE!"?

Because he might have lost his job? He probably would have, but I don't think that's why. Gotten arrested? No. I don't know for sure, but I'll hazard a guess: either because he trusted his company to do the right thing or because he didn't want to get blacklisted. And because he didn't trust his conscience, and go against orders - no, not even that - against standard procedure, he has these people to answer to, and their loved ones:

  • Francis R. (Dick) Scobee (1939-86), Commander
  • Michael John Smith (1945-86), Pilot
  • Ellison S. Onizuka (1946-86), Mission Specialist One
  • Judith Arlene Resnik (1949-86), Mission Specialist Two
  • Ronald Erwin McNair (1950-86), Mission Specialist Three
  • S.Christa McAuliffe (1948-86), Payload Specialist One
  • Gregory Bruce Jarvis (1944-86), Payload Specialist Two

Someday you might be faced with such an awful decision. Most engineers don't ever consider the possibility. I'm asking you to consider it now, ahead of time, so if the time ever comes, your mind will already be made up.

What to Consider When Choosing a Tool

[Top]

The hour grows late and I know many of you still need to find a safe place to sleep tonight. Before we close, I'll list some of the factors that influence the choice of language for a software product. Among them are:

  • Availability of funding and burn rate
  • Compatibility with the existing codebase
  • Real-time requirements
  • Time to market
  • Sales potential
  • Speed
  • User interface responsiveness, which depends more on latency than speed
  • Memory constraints
  • The platforms your target customers use
  • Target processor
  • Target operating system
  • Availability, reliability and cost of development tools for the target
  • Availability, cost and licensing for needed code libraries
  • Heat generation, and requirements for cooling
  • Power consumption
  • Battery life
  • Physical packaging of embedded products
  • How to penetrate and service the retail channel
  • Compliance to government regulations
  • Compliance to technical specifications
  • Contractual requirements
  • Acceptance by the market
  • Retail packaging
  • Weight
  • Safety of the user and the public
  • Cost of manufacturing embedded systems
  • Availability of required electrical and mechanical components
  • Ease of testing
  • Degree of assurance that successful testing proves real reliability
  • Availability and cost of test tools
  • Ease and reliability of deployment
  • Ease of upgrading in the field
  • Speed of prototyping
  • Ease of debugging

I'm sure you can think of many others. But every software architect simply must consider:

  • The availability of craftsmen adequately trained in and experienced with the use of the chosen tools

"But we don't have any resumes on file for C++ experts. Where do we find them? The headhunters want too much money, and the candidates they submit are never any good!"

Then you must make do with the staff you already have. But that doesn't mean you let them write bad code.

If you have a war to fight, but you have no pilots, then you must teach postal clerks to fly. That's where Brother Mike comes in, you can send your wretched refuse to be Saved at the Soup Kitchen, and to enjoy a free, nourishing hot meal. But all Brother Mike can do is convince them there even is a Way. It takes long, hard study and practice to follow it faithfully. You must purchase The Good Books for your staff and urge them to read them, specifically the C++ texts, and one book, most important of all:

Friends, while I don't want you to steal, do beg or borrow if you have to, but don't let the Sun go down before you have obtained a copy of:

  • Large Scale C++ Software Design by John Lakos

Start with Chapter 4, "Physical Heirarchy", and Chapter 5, "Levelization". We shall discuss these when we cover unit testing in a few days.

C++ is the right tool when the design constraints indicate you need choice and control. Garbage collected languages might not be able to satisfy the constraints because they offer only one choice for memory management. C++ is difficult and dangerous precisely because it offers a nearly infinite array of choices. A novice or careless coder might still ship by writing his product in Java, but when a surgical strike is required to deal a deadly blow to the enemy, you need an Academy graduate and an stealth fighter, not a commercial airline pilot and a passenger jet.

At last, our tortuous journey this evening allows me to reveal to you the most powerful and dangerous tool of all. Used with love, skill and care, it is the best tool for nearly every job, but it saddens me to tell you - it grieves me deeply - that used carelessly or in anger, it is the deadliest weapon known to man.

I am absolutely serious.

Why We Fight

[Top]

I know of an even more powerful and dangerous tool than C++. Even more powerful and dangerous than jet fighters. But I used it right here tonight to carry out a difficult job: to help you understand why, even though it is a dangerous programming language, C++ can be the best tool for certain jobs.

I knew this tool was doing its work because I felt its power as I used it. I used it as carefully as I could, but brothers and sisters, I didn't study at the seminary: I don't know how to wield it all that well, and it nearly destroyed me.

But I assert it was the right tool for this job.

I will reveal it to you now. I put it in this little box for safekeeping. Sister Pandora carved it for me from mahogany. Here, I'll open it, just a little, so you can have a look. Shield your eyes, or you'll be blinded:

The Metaphor.

Get back!. Sorry, Brother Jacob! I didn't mean to knock you over, but you got too close. You could have been killed! Please forgive me.

This evening, I used the metaphor of the fighter plane and its pilot to help you understand why C++ can be the right choice, but one must hire a highly skilled C++ programmer to write it if disaster is not to ensue.

Even that simple metaphor was risky as it overwhelmed me even to speak of it.

What other metaphors do you know about?

C++ is a metaphor! It is a metaphor for the central processing unit and memory of a computer. Using C++ as a metaphor makes the computer easier to understand and write software for: C++ is the machine code for a virtual machine that has such hardware opcodes as new and delete.

But wait, there's more: Java is a metaphor too, used in many of the same ways. It is a much less dangerous tool than C++, and so better for younger programmers to use than C++.

And brothers and sisters, while it pains me to admit it, even PHP is a metaphor. We aren't all of us poets.

And here is why I am ready to admit defeat: I don't think any of what I have said to you tonight has changed anyone's opinion on the value of the C++ programming language. I might as well have been pissing off the back off a moving pickup truck.

Here's why: not all metaphors, but some, hold a lock over the human heart and mind that is almost, but not quite impossible to unlock. We believe in our metaphors in such a deep and fundamental way that we are almost always unaware that they even exist, yet we will fight for them with every fiber of our being.

You don't believe me do you? It sounds crazy. I admit that, but explain to me then why my little joke here is funny:

Why do we have to hide from the police, daddy?

Because we use vi, son. They use emacs.

Just a joke. Forgive me, but it helped me explain an important point.

The Right Tool for the Workman, or the Military Way of Life

[Top]

Why do you suppose most fighter pilots feel it's worse to be grounded than shot down? Why did my father join the civil service after grad school, instead of working for the power company for twice the money?

It's the same reason that an Emacs fan will suffer if he must work in Visual Studio. He might ship his product, but every minute spent coding it will be a torment. Why?

In every case, it's because the time, study and work required to master a tool has allowed its Metaphor to capture their hearts and minds. It has to be that way: mastery is achieved only when one has fully come under the power of a tool's Metaphor.

Thus a good C++ programmer doesn't simply know C++. He is a C++ coder in the same way as he might be an American, a Baptist, or a black man. You aren't one of these because of where you were born, where you went to church or the color of your skin. You are this way because of your culture, which you carry deep in your heart.

Thus, no matter how masterful you may be with C++, if Java is the right tool for the job, and you are not already a masterful Java programmer, then you must either undertake to become one, or step aside that your company may hire someone who is. You do a disservice to write Java when you don't feel Java in your bones.

The Most Dangerous Weapon Known To Man

[Top]

While the hydrogen bomb has the potential to be worse, it hasn't been dropped yet, and I assert it won't ever be lest some metaphor send the missiles flying.

I will end tonight's service by naming a few metaphors to help you understand my claim that metaphors control our hearts and minds:

  • Heaven
  • Hell
  • The Garden of Eden
  • The River Styx
  • The Swastika
  • The Hammer and Sickle
  • The Stars and Stripes
  • The Confederate Flag
  • The Raised Fist
  • The Cross
  • The Star of David
  • The Crescent Moon and Star
  • Mein Kampf
  • Das Kapital
  • The United States Constitution
  • A Diamond Ring
  • A Bouquet of Flowers
  • The Skull and Crossbones
  • Money
  • Judgement Day

Lord Have Mercy, it never ceases to amaze me that we have not already all of us perished from the Earth.

Let us pray.

Next Up:

[Top]

Come back soon to Brother Mike's Skid Row Soup Kitchen for a free, nourishing hot supper and a sermon: "The Path of Righteousness": on automated testing and the smart pointers Boost forgot.

For my father, Charles Russell Crawford, Lt. USN, 1934-2003. May He Rest In Peace.

Sponsors

Voxel dot net
o Managed Hosting
o VoxCAST Content Delivery
o Raw Infrastructure

Login

Poll
Have I Saved Your Soul?
o Yes. 11%
o No, I was already Saved. 33%
o No, I will go to Hell someday. 55%

Votes: 27
Results | Other Polls

Related Links
o Leo Baschy
o How I Was Saved
o Smart Pointers
o Automated Testing
o Ultimatum
o auto_ptr and Its Alternatives
o auto_ptr Doesn't Work for Arrays
o Take My Memory. Please!
o The Simple Solution
o Standard Template Library-Compatible Smart Pointers
o That's Great! Is It Thread-Safe Too?
o But Arrays? What About the Arrays?
o So is auto_ptr Completely Useless?
o Without Further Ado
o The Right Tool for the Job
o Brother Mike is Overcome with Grief
o Every Engineer's Solemn Duty
o What to Consider When Choosing a Tool
o Why We Fight
o The Right Tool for the Workman, or the Military Way of Life
o The Most Dangerous Weapon Known to Man
o Creative Commons Attribution-NoDerivs 2.5 License
o Top
o Boost C++ Libraries
o Smart Pointers [2]
o Using auto_ptr Effectively
o Exceptiona l C++
o More Exceptional C++
o Exceptiona l C++ Style
o C++ Coding Standards
o Guru of the Week
o Smart Pointers in C++
o Andrei Alexandrescu
o arg library
o On Refactoring C++ Code
o Open Source Testing
o Extreme Programming Roadmap
o Test Driven Development
o Code Unit Test First
o Functional Test
o Integratio nTest
o Relentless Testing
o CPPUnit
o JUnit
o TestDriven .NET
o NUnit
o Boost Test Library
o Mock Objects for C++
o Java
o PyUnit
o ZenTest
o Simple Smalltalk Testing: With Patterns
o Friday's service
o my resume
o Craig's List
o first sermon
o Boost
o smart pointers
o second sermon
o Brother rusty
o Brother localroger
o why Yoyodyne had no choice but to write quality code
o Custom programming, emphasizing sound architecture, robust implementation and unquestionable quality.
o Metrowerks
o valgrind
o On Refactoring C++ Code
o Boost's
o scoped_ptr
o shared_ptr
o intrusive_ ptr
o Thread
o thread-safety guarantees
o ZooLib
o Learning in Motion
o The Ontario Institute for Studies in Education
o Knowledge Forum
o ZAtomic.h
o The ZooLib Cookbook
o scoped_array
o shared_array
o initialization lists
o How to Post Code to K5 -- the easy way!
o a question
o yesterday's sermon
o shout
o the words
o Richard
o Share
o The Good Books
o The Old Testament
o already explained
o The Valley of the Shadow of Death
o University of Idaho
o Mare Island Naval Shipyard
o Challenger
o The Good Books
o the C++ texts
o Also by MichaelCrawford


Display: Sort:
Sermon at the Soup Kitchen I-IV: How I Was Saved | 103 comments (71 topical, 32 editorial, 0 hidden)
I skimmed through this a couple of times. (3.00 / 13) (#1)
by shm on Thu Nov 03, 2005 at 01:13:24 PM EST

And I can't figure out why you've got your autobiographical rant mixed up with C++.

Because I performed my solemn duty... (2.33 / 6) (#2)
by MichaelCrawford on Thu Nov 03, 2005 at 01:34:44 PM EST

... as an engineer by issuing an ultimatum to Jack when it became clear I could not deter him from carrying our a course of action that could drive Yoyodyne's customers into bankrupcy.

I'm absolutely serious when I say a single incident of failure of Yoyodyne's product a million dollars. I don't feel comfortable explaining why in such a way that you would be able to see that. However...

The widgets that Yoyodyne's Widget CAD Pro might design someday are sometimes used in products whose failure could put human life at risk. That should be enough to make one blow the whistle. But Jack just didn't give a damn.

The reason for my autobiography was to help you understand why I felt it was important to do what I did.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

Just curious: CAD for what? (3.00 / 4) (#5)
by shm on Thu Nov 03, 2005 at 02:04:49 PM EST

Mechanical or EDA?

[ Parent ]
My lips are sealed (2.80 / 5) (#6)
by MichaelCrawford on Thu Nov 03, 2005 at 02:12:05 PM EST

... but they might not always be.

I do feel comfortable in saying that a license for Widget CAD Pro will go for tens of thousands of dollars a seat.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

Why I sealed them (2.83 / 6) (#7)
by MichaelCrawford on Thu Nov 03, 2005 at 02:27:47 PM EST

... it's less to avoid legal liability than to avoid causing Yoyodyne trouble, should they realize the error of their ways and repent.

In many ways unrelated to software, Jack is a good engineer, and the young programmers, while inexperienced, are smart and hard working.

So if it turns out that Jack changes his mind and makes quality a priority, Yoyodyne's product will be a boon to the widget manufacturing industry, rather than the curse I claim it is more likely to be.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

You are so mysterious and thus (none / 1) (#90)
by Harvey Anderson on Sat Nov 05, 2005 at 10:23:20 AM EST

more attractive. Can we go on a date?

[ Parent ]
Ah, EDA then. NT (3.00 / 2) (#65)
by shm on Fri Nov 04, 2005 at 10:19:53 AM EST



[ Parent ]
So assuming that it's EDA. (3.00 / 2) (#88)
by shm on Sat Nov 05, 2005 at 06:39:51 AM EST

EDA tools "fail" all the time. That's why almost all large semicon. companies have large CAD/EDA support teams to validate and tweak the design flow.

Less than 5 years ago, I would have agreed with your basic principle of doing the right thing for the company. But having been kicked around the world after building a product which literally became the lifeline for my employer's survival, I've come to the conclusion that Dilbert was right, and I was wrong. Not worth getting your knickers' in a twist.


[ Parent ]

Another way of looking at it (3.00 / 7) (#3)
by MichaelCrawford on Thu Nov 03, 2005 at 01:41:56 PM EST

I wanted to make the case that there is no engineering without the engineer. In most discussions of any engineering topic, the human considerations are left out completely.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

Thanks for the explanation (3.00 / 5) (#4)
by shm on Thu Nov 03, 2005 at 01:56:49 PM EST

Maybe you should rewrite this so that the connection becomes less subtle.

[ Parent ]
It's like a Reeses Peanut Butter Cup (3.00 / 6) (#10)
by localroger on Thu Nov 03, 2005 at 03:43:25 PM EST

Sure Mike's autobiographical musing is all mixed up in his language-war rant, but I find it charming. How often do you get such a clear top-down insight into how someone's values were formed, and how those values are expressed in something as mundane and concrete yet alien as these very specific technique choices? I suppose it will have an uphill climb but if I see it in vote, +1FP.

I am become Death, Destroyer of Worlds -- J. Robert Oppenheimer
[ Parent ]
That's precisely the point I'm trying to make (3.00 / 4) (#13)
by MichaelCrawford on Thu Nov 03, 2005 at 03:51:11 PM EST

... one's work reflects one's upbringing and one's values, whether they are a software engineer or a ditch digger.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

The predominant (2.33 / 3) (#89)
by Harvey Anderson on Sat Nov 05, 2005 at 10:21:38 AM EST

message I get from your writing is that you are weak.

[ Parent ]
There is No Engineering Without an Engineer (2.10 / 10) (#17)
by MichaelCrawford on Thu Nov 03, 2005 at 06:47:25 PM EST

If you decide to rate this comment, whether a zero or a three, I want you to pause to consider that the fact that you can rate any comments at all is because someone, most likely Rusty, labored, if only a little bit, to implement comment ratings in Scoop.

Engineers are enamoured of that which we engineer, and we think our profession is all about technology. But engineering is an essentially human endeavour, as engineers are essentially... well... most of the time anyway... human, and therefore possessed of all the frailties, vices and foibles that humans can posses.

Thus every line of code in every program ever written says something about the coder who wrote it. Maybe he was tired, angry, thinking about something else, maybe his girl just ditched him. Or maybe he was In Flow, had just the right amount of Red Bull to drink, and was In Tune With The Machine.

The point I was trying to make in everything I wrote is that, held up to intense scrutiny, we make a moral decision with every line of code we ever write, whether it is to write code we can take pride in, or code we cut corners on so we can be first to market, or code we cut corners on because we either don't give a damn or know any better what to do.

At some level, engineers make moral and ethical choices with every design decision we make. Almost always these choices are completely unconscious. My objective, in serving free, hot nourishing meals to the homeless and hungry, is to help everyone understand that we would all be better off if at least some of those moral and ethical choices were conscious ones.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


Too Deep (2.25 / 4) (#69)
by virg on Fri Nov 04, 2005 at 12:10:19 PM EST

> If you decide to rate this comment, whether a zero or a three, I want you to pause to consider that the fact that you can rate any comments at all is because someone, most likely Rusty, labored, if only a little bit, to implement comment ratings in Scoop.

Wow, that's deep, but frankly if I paused to consider all of the things I'm able to do because someone put out some design effort to make it possible, I'd never get anything done at all. Sure, someone put forth effort to make it happen, but it's intellectually useless to try to analyze the ramifications of all of that in every action.

> At some level, engineers make moral and ethical choices with every design decision we make. Almost always these choices are completely unconscious. My objective, in serving free, hot nourishing meals to the homeless and hungry, is to help everyone understand that we would all be better off if at least some of those moral and ethical choices were conscious ones.

I agree with the sentiment, but the idea that every design decision we make is an unconscious moral choice is overly analytical. It could be said that my decision to get out of bed today was a moral choice, but what's the use of that particular consideration? It's also not very accurate nor very fair to assume that almost all of the design decisions made are unconscious. Lastly, it's unfair to imply that designers make design decisions based only on morality when certain considerations are beyond their control. While Mr. Boisjoly's decision had radical consequences, blowing the lid off of everything you see that you don't agree with has its own costs, including the unapproached-by-you possibility that you could be wrong about a design decision and not know it.

Food for thought, but let's not go too deep.

Virg
"Imagine (it won't be hard) that most people would prefer seeing Carrot Top beaten to death with a bag of walnuts." - Jmzero
[ Parent ]
Michael Crawford is a web whore (1.53 / 13) (#23)
by debacle on Thu Nov 03, 2005 at 07:30:30 PM EST

But we'll never see a moneyshot. I suggest you vote this shit down before he gets that skank on all of you.

At least localroger admits that he's destroyed k5. Michael Crawford uses this site as a keyword-buffing ad-stroking fucktoy.

That's and he's just fucking ugly. What a goon.

It tastes sweet.

1227 comments, 0 stories, and 26 diaries (2.37 / 8) (#26)
by MichaelCrawford on Thu Nov 03, 2005 at 07:57:02 PM EST

Come back and talk to me again after you've published at least one story.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

We don't publish stories where I come from. (2.66 / 6) (#27)
by debacle on Thu Nov 03, 2005 at 07:58:47 PM EST

But you're aware of that.

It tastes sweet.
[ Parent ]
Well, if you want it done right... (2.68 / 16) (#31)
by localroger on Thu Nov 03, 2005 at 08:29:27 PM EST

...fucking do it yourself or shut the fuck up.

I am become Death, Destroyer of Worlds -- J. Robert Oppenheimer
[ Parent ]
Why? Because it's a canned motto coming from (2.12 / 8) (#33)
by debacle on Thu Nov 03, 2005 at 08:44:36 PM EST

Someone who lives below sea level?

I'd rather it not be done at all.


It tastes sweet.
[ Parent ]

... coming from someone who (3.00 / 7) (#36)
by MichaelCrawford on Thu Nov 03, 2005 at 08:49:38 PM EST

... actually has made front page here at kuro5hin, and quite a few times.

I mean localroger, not me. The guy who told you to put up or shut up.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

Put up or shut up (1.90 / 10) (#38)
by debacle on Thu Nov 03, 2005 at 09:02:06 PM EST

In the case of rape?

localroger has posted a fair share of very, very good fiction.

He has also posted a fair share of very, very bad fiction and asshatery.

I love a man with good fiction. Link farmers, however, are not my thing.

It tastes sweet.
[ Parent ]

i don't understand your problem (3.00 / 8) (#28)
by circletimessquare on Thu Nov 03, 2005 at 08:17:28 PM EST

show me one crime MC is guilty of that you are not also guilty of

The tigers of wrath are wiser than the horses of instruction.

[ Parent ]
Being a web whore? (2.28 / 7) (#29)
by debacle on Thu Nov 03, 2005 at 08:22:53 PM EST

The guy is not a member of the community. He's a sociopathic internet persona a bit more dangerous than the likes of la_princesa. Delusional, shallow, and cunning, he needs to be culled because this isn't slashdot.

It tastes sweet.
[ Parent ]
No, it isn't, in fact, Slashdot. (3.00 / 5) (#30)
by MichaelCrawford on Thu Nov 03, 2005 at 08:27:55 PM EST

They never publish stories of much length over at the other site.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

who the fuck are you? (3.00 / 8) (#62)
by circletimessquare on Fri Nov 04, 2005 at 08:20:15 AM EST

the appropriateness police?

i see an informative article above me about c++

i see a comment here criticizing the man's MOTIVATIONS for writing the article

are you his mother?

who the fuck are you and why do you think you matter her?

mc is adding value to k5 with this article

and what exactly do you THINK you are adding to this site?

all i see is self-appointed self-importance

your a negative useless troll

mc wins, you lose

bye loser

The tigers of wrath are wiser than the horses of instruction.

[ Parent ]

More Emacs Jokes (2.85 / 7) (#34)
by MichaelCrawford on Thu Nov 03, 2005 at 08:47:35 PM EST

Despite what I might say about Emacs, I have come to know and love it once again, because Yoyodyne's product was to run on Linux.

It's not that Linux doesn't have GUI text editors, but because I thought the other guys wouldn't think I was a real man unless I wrote my code in emacs.

  • Eight
  • Megs
  • And
  • Constantly
  • Swapping
  • Emacs
  • Makes
  • A
  • Computer
  • Slow
However, I remain convinced that the reason IDEs get such a bad rap is that the only one most people ever try is Visual Studio. Using Visual Studio is like trying to pound nails with your fists. Metrowerks Codewarrior, on the other hand, is an IDE done right.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


Esc Meta Alt Ctrl Shift NT (3.00 / 2) (#58)
by jsnow on Fri Nov 04, 2005 at 03:32:26 AM EST



[ Parent ]
Emacs' bloat vs. the new IDEs (3.00 / 2) (#87)
by strlen on Sat Nov 05, 2005 at 02:18:28 AM EST

I mylself use nvi/vim for most all things except TeX/LaTeX (for which i use emacs due to the fact no vim plugin comes close to AucTeX), but the emacs jokes seem like nothing compared to the bloat that is Visual Studio 2003 or Eclipse (what the fuck? the thing running on an Athlon 64 with 1.5gb of ram feels as if I'm running Mozilla on a Sparc 5).

Granted Visual SlickEdit is (or at least, when I last tried it) is fairly decent as is XCode (which, however, isn't a general purpose IDE).

Bottom line is it may be fun to joke about emacs, but if one compares it to any major IDE, the concerns magically go away -- and that is despite it can handle most all IDE functionality (I myself prefer separate tools for doing different functions; e.g. vim for editing, ddd for debugging, and command line cvs/svn (rather than a  front end to it) -- but I haven't founded any IDE functionality that eclipse or visual studio has (except may be creating UIs) that can't be done by some sort of an emacs package0.


--
[T]he strongest man in the world is he who stands most alone. - Henrik Ibsen.
[ Parent ]

Mike (3.00 / 7) (#39)
by stuaart on Thu Nov 03, 2005 at 09:08:56 PM EST

Mike Mike Mike.

I'm sure it is great content. But at the moment I am wasted and thus quite unable to reasonably assess this in a way that does justice to the work.

Mike. You are great. An asset to k5. But I regret to inform you that I don't have energy to read your latest effort, mainly because my energy has been sapped by expensive import Belgian lager. So I apologise forthwith.

Linkwhore: [Hidden stories.] Baldrtainment: Corporate concubines and Baldrson: An Introspective


I just popped the cork off a bottle of Chimay (3.00 / 6) (#42)
by MichaelCrawford on Thu Nov 03, 2005 at 09:25:51 PM EST

My buddy from Santa Cruz who introduced me to it said:

  • That's the shit.
I understand it's made by monks. What is it with monks and liquor anyway?


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

Don't talk to me about (none / 1) (#59)
by stuaart on Fri Nov 04, 2005 at 04:42:42 AM EST

Chimay. Ouch --- hangover.

Linkwhore: [Hidden stories.] Baldrtainment: Corporate concubines and Baldrson: An Introspective


[ Parent ]
If you live in a monastery (none / 1) (#60)
by bml on Fri Nov 04, 2005 at 05:00:22 AM EST

you are going to need a lot of good booze around. And you don't have any money to buy it. So you have to learn to do it.

The Internet is vast, and contains many people. This is the way of things. -- Russell Dovey
[ Parent ]
Rochefort > Chimay (none / 1) (#91)
by tommusic on Sat Nov 05, 2005 at 01:35:59 PM EST

For me, its all about the Rochefort. Chimay, however, is a very close second. The Rochefort 10 is something that I grab one of each time I buy beer. I save it for after a day of glory at work. It is such a great tasting ale, I can't stand to follow it with another beer. Trappist ales forever!

[ Parent ]
I'll look for it (1.50 / 2) (#94)
by MichaelCrawford on Sat Nov 05, 2005 at 01:55:55 PM EST

... but our selection of fancy beer is kinda limited, Truro being a small town with only the provincial liquor store to get beer from.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

Beers (none / 1) (#97)
by trollable on Sun Nov 06, 2005 at 01:45:25 PM EST

I second this. The Rochefort is my favorite beer. I also like others, including Pilsen, 3 monts and Murphy's.
--
Expensive Screenshot
--
I sell the icons of my dekstop.
http://www.milliondollarscreenshot.com/
[ Parent ]
did your schizophrenia help you write this? $ (3.00 / 9) (#40)
by Lemon Juice on Thu Nov 03, 2005 at 09:14:10 PM EST



It wrote it while he was playing Everquest. (3.00 / 5) (#41)
by debacle on Thu Nov 03, 2005 at 09:15:56 PM EST

See the related article in the queue for more info.

It tastes sweet.
[ Parent ]
"schizoaffective disorder". (2.88 / 9) (#43)
by MichaelCrawford on Thu Nov 03, 2005 at 09:37:24 PM EST

There's a difference.

It's hard to say. I think what made more of a difference was acting in the theatre when I was in high school. Rather than writing as if I were a street preacher, I actually became a street preacher who happened to be into C++.

It was more than a little scary.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

wouldn't that keep you out of the navy anyway? $ (3.00 / 7) (#46)
by Lemon Juice on Thu Nov 03, 2005 at 10:19:51 PM EST



[ Parent ]
It hadn't happened yet (2.50 / 6) (#47)
by MichaelCrawford on Thu Nov 03, 2005 at 10:26:11 PM EST

schizoaffective disorder, manic depression and schizophrenia all tend to strike around the college years.

So, now, I wouldn't have got my commission, but I'm pretty sure I would have passed the medical.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

Jesus + C Code = -1 [n/t] (1.58 / 12) (#45)
by AlwaysAnonyminated on Thu Nov 03, 2005 at 09:57:48 PM EST


---------------------------------------------
Posted from my Droid 2.
Two questions (2.40 / 5) (#50)
by waxmop on Thu Nov 03, 2005 at 10:50:22 PM EST

  1. Do you write code like you write k5 articles?
  2. What happened to your plan to live off Adsense and be a full-time writer?

--
Saying Java is good because it works on all platforms is like saying anal sex is good because it works on all genders.
Answer, somewhat (3.00 / 4) (#51)
by debacle on Thu Nov 03, 2005 at 11:08:16 PM EST

2. This is it. Look at the number of links on the side of the page. If you're interested in reading a telling article, look here:

http://www.goingware.com/tips/playing-it-clean.html

It tastes sweet.
[ Parent ]

I feel lied to. (3.00 / 5) (#56)
by waxmop on Thu Nov 03, 2005 at 11:16:33 PM EST

I thought I could follow those tips and the money would come rolling in. This is worse than when I found out William McCorkle had never been a busboy.
--
Saying Java is good because it works on all platforms is like saying anal sex is good because it works on all genders. Parent ]
Attention to detail is the key (2.40 / 5) (#57)
by MichaelCrawford on Thu Nov 03, 2005 at 11:17:56 PM EST

learning to write well is what gets one ranked in the search engines, because readers will be happier to give you links.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

Adsense is still too unpredictable (2.62 / 8) (#52)
by MichaelCrawford on Thu Nov 03, 2005 at 11:10:50 PM EST

I only have one article making significant money. Until I have more to level out the statistical fluctuations, I just have to make money the old fashioned way: by printing it.

My long-term plan is still to make it as a writer, but not anytime soon.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

How do I write code? (2.50 / 6) (#53)
by MichaelCrawford on Thu Nov 03, 2005 at 11:12:18 PM EST

My code is very minimalist, actually, but it takes me a long time to get many features implemented, because I am so careful.

However, my beta test and final debugging cycles are typically very short. I never could get Jack to understand that.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

Nighty-Night! (2.40 / 5) (#54)
by MichaelCrawford on Thu Nov 03, 2005 at 11:13:05 PM EST

Don't let the bedbugs bite!


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


Abstain, sorry... (2.50 / 8) (#61)
by mirleid on Fri Nov 04, 2005 at 06:44:40 AM EST

...there's valuable information/experience in it, but the general sanctimonious tone annoys me to no end...

Chickens don't give milk
He's bipolar man give him a break ;D $ (2.00 / 3) (#63)
by Love Child of Baldrson and HollyHopDrive on Fri Nov 04, 2005 at 08:39:18 AM EST



trane: Eventually the human race will realize that scientific progress is (almost always) slowed down by lies, and promote truth, justice and the American way over lying, discrimination, and the lesser American way.
[ Parent ]
You are very wrong about metaphors (3.00 / 2) (#70)
by MrHanky on Fri Nov 04, 2005 at 01:48:19 PM EST

But fortunately only in the last paragraph. C++ may be considered a metaphorical language.

However, the cross and the swastika aren't metaphors: neither the thing cross nor the sign "cross" would be meaningfully related to what they symbolize for a christian if it weren't for the cross' closeness (metonymy) to and part (synecdoche) of Jesus's suffering. But even if the cross has a metonymical origin, it's no longer a simple metonymy, since its relationship to Jesus also defines him -- it's no longer a matter of an arbitrary relationship between two signs. The cross is a symbol.


"This was great, because it was a bunch of mature players who were able to express themselves and talk politics." Lettuce B-Free, on being a total fucking moron for Ron Paul.

I am a little hazy on it... (1.50 / 2) (#71)
by MichaelCrawford on Fri Nov 04, 2005 at 02:01:57 PM EST

... but I wasn't just making all that up. I got it all from anthropologist Joseph Cambell, who devoted his life to the study of myth and how it influences human culture and thinking.

I can see your point though that some of my examples of metaphors aren't quite correct, but I assert that the point I was trying to make is valid in general.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

wowsers (2.50 / 6) (#72)
by regeya on Fri Nov 04, 2005 at 02:04:08 PM EST

I mean this as a serious question: have you been keeping up on the meds lately?

[ yokelpunk | kuro5hin diary ]

I'm not completely certain (1.50 / 2) (#73)
by MichaelCrawford on Fri Nov 04, 2005 at 02:11:16 PM EST

I had been working twenty hour days since I started working for Yoyodyne. Because my meds are all very sedating, I can only really take them at bedtime. I have been taking them faithfully, but "bedtime" has not been as well-defined lately as it should be.

On the other hand, Bonita feels that it did me a world of good to write my sermons. It helped me work through a lot of anger and regret.

And I realize now that I actually do have a great deal to show for my time with Yoyodyne, in that in many ways I'm a much better programmer now than I was six weeks ago. It was a very intense experience. Also, I'll be making a small tarball of free software available when I publish my next installment.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

Well, that's neat (none / 1) (#84)
by regeya on Fri Nov 04, 2005 at 10:54:28 PM EST

It just seemed that you were, you know, rambling, and you seemed a little out of sorts, and given all you've shared about your past, it seemed almost as if this were a desperate cry for help. Or if not that, then a rambling tract borne more of mental illness than anything.

But, hey, if you feel better after doing this, then more power to ya.

You could always take a cue from a famous USian (Abraham Lincoln) and write a nasty letter...then throw it away. You get to blow off the steam, and you get to save face by not risking having your boss read it.

[ yokelpunk | kuro5hin diary ]
[ Parent ]

Excessively long and rambling... (2.28 / 7) (#75)
by GreenYoda on Fri Nov 04, 2005 at 05:21:21 PM EST

... not to mention preachy and patronizing.

Article's Comments are being Artificially Rated (none / 1) (#81)
by loteck on Fri Nov 04, 2005 at 09:47:10 PM EST

why the same 3 or 4 accounts are ratebombing the majority comments in this article, seemingly to artificially boost it into FP?

Mike, ill give you one chance at explanation before i shitlist you. What the fuck is up with this shit? Can't pass or fail on the merits of your own writing these days?
--
"You're in tune to the musical sound of loteck hi-fi, the musical sound that moves right round. Keep on moving ya'll." -Mylakovich
"WHAT AN ETERNAL MOBIUS STRIP OF FELLATIATIC BANALITY THIS IS." -Harry B Otch

It's not my doing, honest (1.50 / 2) (#82)
by MichaelCrawford on Fri Nov 04, 2005 at 09:51:53 PM EST

Have you cast your vote yet? It should be pretty apparent I'll make front page without having to do that.

My only dupe account is GoingWare, and I haven't used it since a very publicly switched my nick to MichaelCrawford.

Frankly, I'm appalled that you would think I would stoop to such extremes.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

of the 3 in question (none / 1) (#83)
by loteck on Fri Nov 04, 2005 at 09:53:45 PM EST

2 are the same person and 1 is a nullo.

fishy.
--
"You're in tune to the musical sound of loteck hi-fi, the musical sound that moves right round. Keep on moving ya'll." -Mylakovich
"WHAT AN ETERNAL MOBIUS STRIP OF FELLATIATIC BANALITY THIS IS." -Harry B Otch

[ Parent ]

Perhaps someone WAS being dishonest (1.50 / 2) (#93)
by MichaelCrawford on Sat Nov 05, 2005 at 01:45:31 PM EST

... but because they liked the article, and wanted to see it published.

I did notice their ratings myself, before you pointed them out, but didn't think much of it.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

+1 FP (1.75 / 4) (#85)
by crazy canuck on Fri Nov 04, 2005 at 11:15:17 PM EST

because I have no fucking idea what you just said

Well? (2.90 / 10) (#92)
by cdguru on Sat Nov 05, 2005 at 01:40:06 PM EST

People that honestly believe that whatever time they need to "get the job done right" is justified in today's business environment need either a time machine or a serious attitude readjustment.

A time machine would help a lot, because it would enable them to go somewhen else where the rules of the game are different. I don't care if they are making furniture or coding C++. Unfortunately, there are market forces at work that can't be ignored.

An attitude adjustment is what happens to most people. They leave school with some pretty lofty ideals, either about how great a job being a social worker is or how they are going to change the way a company operates by doing it better when they write a program. Lofty ideals are a good thing, and sometimes they can inspire others, even those jaded by many years of reality. Unfortunately, there are some lofty ideals that just don't work.

I seem to have gotten lost in the above article, but I didn't seem to see a resolution to the job crisis. There are two points that I consider to be very, very significant here had I been involved in the management structure of said company:

  1. Sending an email like the one here would have resulted in the immediate termination of the sender. No questions, no discussion, just an escort to the door. Ultimatums don't work. Period.
  2. Anyone managing programmers that clearly says quality is second to the schedule and there never was time planned for quality needs to be gone as well. Right away before they cause more damage.

Quality is important. Allocating time for quality is important. Training staff for quality is important. There can be times, not necessarily planned for long in advance, when it becomes necessary to deliver a product. Without fail, on schedule, meeting a deadline. There can be situations where this is necessary for reasons not always disclosed to all staff members. It is nice if this happens rarely, but we don't always get that wish. Dealing with what happens when things are pushed up against a deadline can indeed be challenging for everyone, but it is a fact of life in today's environment.

We can say how we wish it wasn't so and how it is awful that the true spirit of creativity needs to be yoked with that nasty word revenue. Unfortunately, that is the way things are today. Maybe they were different a long time ago and might be different in the future. Today, if you want to eat, there are real deadlines.

The 'get a haircut and respect business realities' (none / 1) (#103)
by wnight on Sat Nov 26, 2005 at 08:57:41 AM EST

It's a good thing to point out, that there are business realities that drive the market. But, do you know what they call an executive who ships a product knowing it doesn't work? A felon.

Besides, it's your very own knee-jerk fear reaction to having an employee stand up and speak uncomfortable news that blinds you to the answer. His way is cheaper. Seriously. If you would bite the bullet, schedule a small project delay now and build a test structure, use proper new methods, you'd be left with a schedule you could keep and a product you could sell. Your way leaves you with a stinkier lie as the goals and deadline keep getting pushed back while programmers struggle to keep the codebase compiling, let alone add features or fix old bugs.

His problem is that he doesn't know how to put this in business words you'll understand, but that's really your fault as management. You don't know enough to listen to your employees - they being the actual talent you employ to make your business run.


[ Parent ]

When bending over is the way forward ... (3.00 / 3) (#95)
by smallstepforman on Sun Nov 06, 2005 at 08:41:43 AM EST

Hello. My name is SmallStepForMan. I too am an engineer. I bend over when requested, and take one for the team. When asked to jump, I ask "How high?" Am I betraying my creed? Well, frankly, I dont see any appeal in dining at soup kitchens. I've become used to little things like Toothpaste(TM) and Soap(TM). My family, who I support, have a roof over their heads. This is why I whore my mind, body and spirit.

But once the bills have been payed, the food cooked, my Ms satisfied, and all mundane chores completed, I enter My Refuge. For me personally it's BeOS/Haiku hobby software projects. I do not care that it's a dead platform, I dont care that my projects will only be seen by 2 people on the face of this planet, and I don't care what anyone else thinks of it. From 9pm-midnight, it is my time. This is my place of rest, my temple, my safe haven. This is where I regain my energy, where I recharge, in preperation for more whoring tomorrow.

Speaking of whoring, how about this personal anegdote. For years the company I work for have tried to sell a product to a customer, and every time they refused since they never had the proper infrastructure in place. Finally, after 8 years, once they've realised how much money they're loosing to the competition, they find the money to build the infrastructure. They walk up to the regional "marketoid/salesman" and ask

"OK, we now have the infrastructure in place, what can you offer us?"

Marketoid looks at sales catalogue and says:

"Product A, product B or product C"

"All right. We will take 72 million dollars worth of A and C."

"Deal. Lets do lunch".

The Marketoid gets an amazing commission for selling the product (being at the right place at the right time), yet us engineers tasked to actually implement the product (6 months of sweat, skin from the knuckles, tears, fading and grey hairline etc) get normal salary. Dont forget the original designers from 8 years ago who actually built the prototype, plus the poor factory sods who actually have to built the boxes, the guys in the warehouse delivering, technicians installing etc, we all get jack shit. The marketoid can safely retire once we ship this project. His involvement - 10 minutes tops. My involvement - 6 months and counting. Guys doing prototype - who knows.

Excuse me, I'm off to search for my shotgun.

BeOS! (none / 1) (#96)
by MichaelCrawford on Sun Nov 06, 2005 at 08:55:42 AM EST

I'm an old BeOS hacker. I won Honorable Mention for Working Software's Spellswell's port from Mac OS to BeOS in the '97 Be Master's Awards.

I've been meaning for quite sometime to get into Haiku OS, and may yet someday.


--

Live your fucking life. Sue someone on the Internet. Write a fucking music player. Like the great man Michael David Crawford has shown us all: Hard work, a strong will to stalk, and a few fries short of a happy meal goes a long way. -- bride of spidy


[ Parent ]

That figher plane shit... (2.66 / 3) (#98)
by der on Sun Nov 06, 2005 at 06:47:24 PM EST

... was genius.

Nothing is more annoying than C#/Java/Whatever people railing on C++, implying that those VM environments are actually the best choice for all programming tasks.

It's like a Python coder telling an OS developer he's an idiot for using C because Python is so superior.

Idiots.



...was shit. (none / 1) (#99)
by Thought Assassin on Tue Nov 08, 2005 at 01:26:57 AM EST

I agree to the merits of using different languages to fill different roles (though I cling to my dream that one day all those roles will just be domain-specific libraries for Haskell 3098).

But I remain unconvinced that C++ has a role anywhere. If the project is big enough that you need the things C++ can offer you over well-written C, then it's big enough to amortize the costs of using two languages: C for the low-level or performance-critical parts, some more suitable language for the high-level structure. Where is this niche you see for C++?

<flamebait>
The only reason C++ has gained any acceptance at all is because of the misperception that it offered a shallower learning curve from C to OO.
</flamebait>

[ Parent ]

C++'s place in the world (none / 0) (#102)
by wnight on Sat Nov 26, 2005 at 08:05:55 AM EST

I completely agree. C++, for many reasons, is not the language you want anyone using, let alone for performance critical things when they'll be tempted to optimize.

It's got all the power of C, but ten times the danger - look at pointer use, it's a black art.

It's got the most complicated OO I've ever seen, and for what benefit? Nowhere near the ease of use or power of LISP, not even as much as Perl!

I do agree with the author that it's the support systems that really make the project - a good test environment can save almost any coder, and good programming practices can train the bad programmers. But... using C++ is like trying to build a bridge from plastic straws - theoretically doable, and very elegant if done right, but so very risky compared to using industry best practices (metal, bolts, etc).

But I've seen so many coders who are *sure* that they've investigated everything else on the market (Java and PHP usually) and need C++ which just happens to be the language they know best. So there's no way we'll ever convince anyone that they don't need it - they're sure it's six times faster and produces smaller code, or than untunable GC, or whatever would destroy their project.

[ Parent ]

I remember many years ago, perhaps in 2000, (2.33 / 3) (#100)
by skyknight on Sat Nov 12, 2005 at 09:33:56 AM EST

reading that bit about "make a bonfire of your reputation" on goingware.com. It stuck with me as it resonates with the kind of person that I am and have been becoming. I am a professional pain in the ass with an obsession for quality. In the short term it's not a good way to garner popularity, but in the long run it's the only real path to trust and respect. I would rather many people dislike me while having everyone trust and respect me, than have everyone like me but nobody think that they can count on me in a pinch. It's a painful calculus to make at times, but I make it every day.

Fundamentally, most software developers operate with the "greedy algorithm" as their heuristic. They take the most direct path to a solution, not realizing that there is value to be had in erecting support infrastructures along the way. They fail to have an investor mind set. Writing software without clean architecture and good unit tests would be like constructing a building without using any scaffolding. A mechanical engineer would recognize that as insane, and yet so many software developers do precisely that. Most likely this stems from software development being so new as a profession. We've been building bridges and such for thousands of years, whereas we've been building software at a professional level for less than half a century.

In any case, thanks for the article. It was an enjoyable read, albeit long.



It's not much fun at the top. I envy the common people, their hearty meals and Bruce Springsteen and voting. --SIGNOR SPAGHETTI
Required Reading for the SW Industry (3.00 / 2) (#101)
by ethereal on Wed Nov 16, 2005 at 09:26:19 AM EST

'nuff said.  Thanks Mike, that was great :) .

--

Stand up for your right to not believe: Americans United for Separation of Church and State

Sermon at the Soup Kitchen I-IV: How I Was Saved | 103 comments (71 topical, 32 editorial, 0 hidden)
Display: Sort:

kuro5hin.org

[XML]
All trademarks and copyrights on this page are owned by their respective companies. The Rest © 2000 - Present Kuro5hin.org Inc.
See our legalese page for copyright policies. Please also read our Privacy Policy.
Kuro5hin.org is powered by Free Software, including Apache, Perl, and Linux, The Scoop Engine that runs this site is freely available, under the terms of the GPL.
Need some help? Email help@kuro5hin.org.
My heart's the long stairs.

Powered by Scoop create account | help/FAQ | mission | links | search | IRC | YOU choose the stories!