Slashdot videos: Now with more Slashdot!

View

Discuss

Share

We've improved Slashdot's video section; now you can view our video interviews, product close-ups and site visits with all the usual Slashdot options to comment, share, etc. No more walled garden! It's a work in progress -- we hope you'll check it out (Learn more about the recent updates).

I don't think I've written this down anywhere before, so here's my story about the first time I had a face-to-face conversation with Steve Jobs.

I was working for Richard Kerris in Apple Worldwide Developer Relations, on a group called the SWAT team. I was the Cocoa expert on that team, and I had colleagues who had expertise in UNIX internals, Windows development, and the Metrowerks tools.

Our role was to help third-party developers bring their products to Mac OS X, whether they were coming from Windows, Solaris, Mac OS 9, etc. We would look over their code, and consult with them on how to go about porting and/or rewriting their products for the new platform.

I went to Fred Anderson's retirement party which was held at Cafe Macs in Building four of the Infinite Loop campus. I saw Steve there, and I went over to introduce myself. I said "Hi Steve, I'm John Randolph. You may or may not recognize my name, but I used to flame you from time to time before I worked here." He asked me "Why did you stop?" I told him "Well, I work here now, and I respect the chain of command."

At the time we had this conversation, there was a big fight going on between the foot-dragging laggards who wanted to keep using the old Mac Toolbox API (which had been cleaned up considerably and put into a framework we called "Carbon"), and those of us who wanted to get everyone using the NeXTStep-derived "Cocoa" frameworks,

At the previous WWDC, Steve had started the keynote with a bit of theater: a coffin had risen up through a trap door on the stage, in the midst of a cloud of dry ice fog. Steve had opened the coffin to show a big Mac OS 9 box, and he praised OS 9 in a eulogy, to make the point that Apple developers should consider it dead and gone.

So getting back to our conversation.. I told Steve what I was doing on Richard's team, and I said "I know that you can't do this politically, but I wish you could have another coffin on the stage at the next WWDC...." and he said: "With Carbon in it?"

He was grinning. At that point, I realized that I could quit worrying about where Apple's development environment was heading. Steve knew what we needed to do, and in the years that followed, Apple has kept the best of NeXT's technology, and let go of what we didn't need.

We miss you Steve, but we're doing fine. Thanks for the things you made happen.

Earlier today, I read an account of a little girl getting a severe sunburn while on a school field trip, because of an unconscionable policy prohibiting children from possessing sunscreen while at school or on school activities. I looked up the name of the spokesman who had the nerve to try to defend this policy to the press, and wrote her the following e-mail:

Miss Chancellor, you and the pinheads you serve in the Northeast Indecent School District are a tragic example of the kind of abject incompetence that pervades American public schools in the past several decades.

I would urge you to resign and pursue employment in the janitorial services industry, but youâ(TM)re obviously too goddamned stupid to be trusted with cleaning supplies.

-jcr

Well, it would appear that Miss Chancellor was offended by my criticism, and she replied thusly:

Your comments do not warrant an intelligent response. Clearly - you do not have all the facts.

Now, it's rather unusual for an apparatchik in a shitstorm to bother to respond to any of the angry e-mails they get, so naturally I have replied:

On Jun 6, 2014, at 10:26 AM, Chancellor, Aubrey wrote:

>Your comments do not warrant an intelligent response.

Since youâ(TM)re entirely incapable of an intelligent response, that just works out fine and dandy now, doesnâ(TM)t it?

>Clearly - you do not have all the facts.

The fact is that when you screw up like this, the thing to do is apologize and promise the parents, the child, and the rest of the community that it will never happen again. You donâ(TM)t double down on your idiotic policy of depriving children of sunscreen.

When children are entrusted to you by their parents, your paramount duty is to ensure their safety and well being. it is NOT to sacrifice their welfare to your psychotic need for obedience.

In the time since I created this Facebook account in 2006, I found a bunch of old friends, met many new ones, wasted a whole lot of time, had some arguments that never would have happened in real life, and been frequently annoyed by the business decisions FB has made.

This post will be my last. I will delete this account 48 hours from now. Those of you who want to keep in touch can reach me as always at jcr@mac.com, which I've had for at least a decade.

All's well that ends. I wish you all peace, love and happiness.

It feels like leaving high school. There are people there that I will always care about, some that I love, some that I barely know, some that I have no idea how I met in the first place or why they're in my FB friends list.

A very smart friend of mine is working on changing social media from a site and a vendor that sells the users' info to advertisers, into a protocol that would operate on a peer-to-peer basis, with strong security to ensure that what we write goes to those we wish, and no one else. I hope he succeeds, and I look forward to making a fair bit of cash shorting FB when the writing appears on the wall.

I will thank my friends who worked on FB, and every user there who ever shared a heartwarming, interesting, inspiring, or even outrageous bit of information that I wouldn't have found otherwise. Congrats to all the FB millionaires and worker bees, I wish them all the best.

I'll still be NSResponder here on/., on StackOverflow and Twitter. The internet is still a lot bigger than Facebook, and I'll see you all around.

I doubt that this message will actually get to you personally, but what the hell.

After the fracas over the last few weeks in which e-trade failed to issue me a second ATM card, I finally got around to transferring the bulk of my shares to a competent broker.

The automatic mail from e-trade notifying me of the transfer included this paragraph:

E*TRADE strives to achieve best in class service and is focused on meeting all of your financial needs. We would like to understand your reason for your transfer out and see if there are any improvements we can make to serve you better in the future. If you have the time to discuss, please call us at 1-800-ETRADE -1 (1-800-387-2331).

The fact is, after going around with your underlings a few times on my requirement for a second card, and having told each of them several times that this was a deal breaker, I know that the claim that youâ(TM)re âoestriving to achieve best in class serviceâ is nothing but marketing drivel. Indeed, my direct, personal experience has shown me that my business isnâ(TM)t important enough to get on the radar of anyone who would actually solve the problem.

I had already planned to find another broker, but the thing that made me hurry up and do so was receiving your oh-so-thoughtful gift of an e-trade gym bag. So, after refusing my very simple request, you apparently assumed that Iâ(TM)d be satisfied if I just got a bag to advertise an incompetent financial institution to my friends.

Looking at the transaction log, I see that e-trade has charged me $25 for the privilege of taking my property elsewhere. Now, Iâ(TM)m sure you have something in your fine print that allows you to do that, but itâ(TM)s still kind of shitty on your part. Given that youâ(TM)re not even capable of issuing two cards on one account (as you had done for the previous decade or so), waiving that fee is probably entirely beyond the capabilities of the fifth-rate keyboard monkeys in your so-called âoeIT departmentâ, so you can go ahead and keep it. Iâ(TM)m getting a nice welcome gift from your competition, which I didnâ(TM)t even ask for.

Got this from some minion at E-trade, since the VP I wrote to was apparently too busy to answer a customer personally:

Good Morning Mr. Randolph,

We received your email inquiry to our VP of Customer Service, Neal Martin on 8/5/13. We regret that we are unable to accommodate your request for two ATM cards for your account. We appreciate your feedback and it has been shared with management and our product teams for review. If you have any additional questions or concerns feel free to contact me at [phone number deleted]

Manager? Yeah, right. In a functioning company, a manager is someone who takes the initiative to solve a problem.

I left the VP's name because he fully deserves to have this come up when someone googles him in the future.

My response:

[redacted],

You might mention to Neal Martin that when a customer responds to an email message that has his name on it, itâ(TM)s rather poor form to pass the buck to someone else unless that other person is capable of solving the problem.

I was a more-or-less satisfied customer of E-trade for over a decade. I will be transferring my assets to another broker in the near future, as soon as I determine which of your competitors can demonstrate the competence that E-trade has abandoned.

I've been a customer of theirs for over a decade, and I've had two ATM cards for the same account for many years. Recently, I needed to cancel one of the cards and instead of just replacing that card, they cancelled both of my cards. I just sent the following message to Neal Martin, VP of customer service at E-trade.

Neal,

I got a call from one of your employees this morning, Meagan something, who told me that after looking into it she wasnâ(TM)t able to find a way to issue a second card for my account. Her suggested workaround was that I should open another account, and get an ATM card for that account.

So, because of your IT departmentâ(TM)s refusal to fulfill a very simple request, E-tradeâ(TM)s âoesolutionâ is that I should give you MORE of my business, and incur whatever additional costs are associated with having a second account. Not to mention that using a second account means that if I lose a card while traveling, Iâ(TM)ll either be dead in the water for a day while funds get transferred to that second account, or Iâ(TM)d have to have money parked in that second account already.

Now, Iâ(TM)m a software engineer myself with a fair bit of experience in financial systems. In my Wall Street days, I worked at JP Morgan, Salomon Brothers, and UBS/Warburg. I know that there is indeed a way to solve the problem at hand, even if it requires manually editing a database to make it happen. If my business is important enough to you, youâ(TM)ll direct your IT department to do so.

In the meantime, I suggest your inform all of your employees in customer-facing roles that âoesecurity policy" is not an excuse for incompetence.

-jcr

The message above was a follow-up to this one:

Hello Neal,

I have been an E-Trade customer since 2002 or thereabouts, and I currently have about [redacted] in assets on deposit with e-trade.

Iâ(TM)ve got to say, Iâ(TM)m on the verge of taking my business elsewhere and itâ(TM)s because of something that should be trivial for you to solve.

Iâ(TM)ve had two debit cards for my account for a decade or more, and Iâ(TM)ve just been told that I can only have one now. This doesnâ(TM)t work for me, because I travel quite a bit, and I like to keep one card in the safe in my hotel room, and have the other one on me. If I lose a card while traveling, I do not want to be stranded without a way to access my funds.

Yesterday, I spoke with a representative who told me that he had figured it out and was sending me an additional card, but this morning he called me back and told me that he couldnâ(TM)t do it after all. Just now, I spoke with another representative from your âoeCorporate Relationship Managementâ team, and heâ(TM)s looking into it.

Iâ(TM)ve generally been happy with E-trade up to this point, but if you canâ(TM)t issue me two cards as before, itâ(TM)s a deal breaker. I hope you get this figured out.

Also, donâ(TM)t put your name on an e-mail address that doesnâ(TM)t go to you directly. Itâ(TM)s insulting.

-jcr

The upshot is I did some shopping around and found that Scottrade's fees are lower than E-trade's. The first brokerage company I find that can issue two cards on one account will get my business.

For the last two years (almost), I was back at Apple working on the UI frameworks that the ProApps and the iApps use to give them their distinctive look. Interesting work, nice people to work with, and now I can say that there's some of my code in most of Apple's Pro and consumer apps on the Mac.

To everyone in PhotoApps, ProApps, Frameworks, and Dev Tools, thanks much! I enjoyed working with you.

1) Mac users are highly sensitive to the quality of your products' user experience. What this means is, go native or don't bother. Even though Google Earth and Photoshop are rife with UI atrocities, don't imagine that you can get away with ignoring the rules like they can. They're 500-pound Gorillas, and you're not. If you are Google or Adobe, get with the program and write a Cocoa UI, already. It's about time.

2) The native language for the Mac and the iPhone is Objective-C. Get used to it; it's not hard to learn. Any developer familiar with C should be able to learn Objective-C in a day, and be an Objective-C language lawyer within a week if he cares to. Yes, there are Ruby, Python, and other bridges you can use, and they work just fine, but limit this to integrating existing libraries with your apps. DO NOT try to use the bridges as a way to avoid learning the environment you're working with.

3) A cross-platform GUI is neither feasible nor desirable. You can't #ifdef the difference between Cocoa, xlib, and Win32. Don't believe me? Look at OpenOffice. (If OpenOffice looks OK to you, then please, forget about offering your products on the Mac. You'll only cause us pain.)

4) Don't bother with third-party cross-platform GUI libraries like Qt. Yeah, you can make it sort of work, but you'll get a lot of complaints from your Mac customers, and it will be more expensive than properly factoring your code and writing a native GUI for each platform. For every Mac customer who complains about a bad UI, there are many more who took one look at it and decided never to do business with the vendor in question. I just learned from a friend that Qt is far worse than I'd realized: if you use Qt, you wont' get any hardware acceleration , and you won't be able to deliver ADA compliance.

5) If you're shopping for people with years of experience in Cocoa and Objective-C, you should know that they're pretty scarce due to the flood of iPhone projects going on these days. I'm hearing about people getting $200 to 250/hr for iPhone projects. Keep in mind that you're also competing with Apple for those developers, and chances are your project isn't as interesting as Apple's. If you're a start-up and you can offer equity, then it's not too hard to find people who are willing to gamble with you if they believe in your business plan. Mac and iPhone developer tend to be somewhat less risk-averse than the average engineer, in my experience.

6) If you can't afford experienced Mac developers, you'll have to make your own. Save yourself a lot of time and money by sending your people to a class. I recommend Big Nerd Ranch, that's where Apple sent their own people when they quit doing Cocoa training in-house. Keep in mind though, that once your newly-minted Cocoa developers have a year or so of experience under their belts, you'd better be prepared to offer them market rates, or you'll lose them. Back in the NeXTSTEP days, Fannie Mae insisted on low salaries, and they lost people steadily to other NeXTSTEP shops. Attrition is expensive; it will cost you more than you think when your institutional knowledge of your product scatters to the winds.

7) Send your people to the Apple developer conference every year. I can't emphasize this enough. Time is money, and the connections you can make there with the Apple engineers you need to know can save you weeks or months of trial and error.

That should do for starters.

Addition 8/24/09:

8) When interviewing an Objective-C expert, DO NOT try the "Microsoft style interview". (See #5 above.) We are not entry-level, fresh-out-of-DeVry kids who have the time for solving the little brain teasers that someone looked up on the web last night. Talk about the actual work at hand, how the candidate's previous experience is relevant to what you need to do, and ask for some examples of creative solutions they've come up with before.

9) Probably the best place to advertise for iPhone or Mac developers is the cocoa-dev mailing list at lists.apple.com. You have to be a subscriber to the list, and you have to send your ad to the moderator for approval first. In any ad on Cocoa-dev, be very specific about what kind of developer you're looking for, and what the job entails. This is not the place to just list buzzwords or try to lowball anyone.

10) When advertising for candidates, don't hide behind a webform or an e-mail address. Put a phone number in your ad that reaches a human being. People with skills that are in high demand aren't going to mail their resume to recruiter@companyNobodyEverHeardOf, because that kind of thing gets you spammed.

This goes out to every left- or right-wing power seeker, who believes that everything will be just dandy if only they get the right bunch of little tyrants in office.

Ok, time for a bucket of cold water in the face, kids.

First, income is not "distributed", it's earned, and it belongs to those who earn it.Second, you have no moral right to take someone else's earnings, even if they have more than you do. It doesn't become moral if you hire a thug to do it for you, and it doesn't become moral if you have a group of hundreds of thousands of thugs and bureaucrats to do the dirty work.

The legitimate power of the state can ONLY derive from a delegation of the rights of the people. Free people institute governments to secure our rights, not to interfere with them.

We have a written constitution in this country, and despite its having been routinely ignored whenever government found it inconvenient, it is nevertheless the entirety of the legal basis for the government's existence. If the government doesn't want to follow the constitution, then the government has no legitimate authority, at all.

Maybe you can make a compelling utilitarian argument for some of the currently unconstitutional activities that the federal government engages in, and if so, then propose an amendment, let's have that national debate, and maybe you can get your amendment ratified. Until and unless that happens, the federal government has no legitimate basis to harass sick people for using marijuana, to take our hard-earned wealth and give it to failed banks, to "redistribute" our earnings, to interfere with the choices we make for our health care, to prevent us from traveling to any country we care to visit, or to draft us into "national service."

We are not the property of the state. Get that through your power-hungry little minds.

I happened to hear a recording of a fine performance of our national anthem a short while ago, and the question posed at the end of the song suddenly caught my attention.

"O, say does that star-spangled banner yet wave, over the land of the free, and the home of the brave?"

That's really the most profound thing that Francis Scott Key ever wrote. The question isn't whether the symbol of freedom still exists, we can see that it does. The question is: are we still free? Are we still brave enough to demand and defend our liberty?

A year ago, I would probably have said no. Today though, with Ron Paul'sbook at #1 on the New York Times' bestseller list, I'm rather more hopeful than I have been in a very long time.

Like many other Libertarians, I generally regard self-declared "liberals" as well-meaning, but hopelessly deluded on matters of economics. In the last few days though, in the aftermath of the hurricane, as they scramble to blame the Bush administration for failing to take the precautions that were also ignored by every other administration back to Abraham Lincoln, I began to wonder whether they were actually interested in helping the people of New Orleans, or simply reveling in the opportunity to work up a lather blaming George Bush for a natural disaster.

Now, knowing just how rare it is for a mugger to lure a victim by pretending to have a disabled vehicle, it has been my policy for as long as I've been driving to stop and help anyone whose car has broken down, since I'd like to have the same common decency applied for my benefit should I need the same help. I've stopped to pick up a young couple at 3:00am on a completely deserted road, and been told that a dozen other people had passed them by already, including more than one highway patrol car. Nearly every time I've helped someone on the road, they were surprised that I did so without fear.

That being said, the story that this "demgurl" at democraticUnderground.com tells about zooming away from a woman and a child who needed help, because the mother had performed the unpardonable sin of having a George Bush sticker on the bumper of her van, made me wonder what it might take for me to behave similarly. Perhaps if I spotted a sticker that promoted a racist agenda, I might drive on by. But wouldn't I do better to pick up a person in such a circumstance, and let the Klansman or Nation of Islam adherent know that they had been helped by a Jew?

Let me also offer a suggestion for a "liberal" who might find himself in such a situation. Perhaps the young mother was not the owner of the van she was driving. What then? Should she be left stranded because her brother or grandmother may have supported George Bush? What if she is indeed a Bush supporter? Does that mean that she's not a human being deserving of compassion? Isn't it the Liberals who are always excoriating the Conservatives for callously ignoring people in need?

I'm reminded of a story of a Rabbi a few years ago who was getting hateful phone calls from a neo-Nazi. The Rabbi found out who this man was, learned that he was disabled (wheelchair-bound), and offered him help. He ran errands for him. He patiently listened to all the evils of the "Worldwide Jewish Conspiracy" that the man spewed at him, and pointed out where the man contradicted himself. Sometimes they argued, but the Rabbi consistently helped the man. The Nazi eventually converted to Judaism, and celebrated his Bar Mitzvah in that Rabbi's synagogue.

I'm not a religious person, but there are some very profound sayings in the Torah and the Christian scriptures. One of them that I pay attention to in particular, is "by their fruits shall ye know them." When I look at "demgurl"'s behavior, I see a vicious little misanthrope. I see the other people in the discussion chiming in and telling her that what she did was acceptable. I see a stunted, infantile, and utterly narcissistic world view. The fruits of this woman's world-view are hatred and division. I hope she snaps out of it some day.

I wrote a number of Sample Code projects when I was at Apple, and we didn't have a way to mark them as superseded or obsolete, so let me just give you a few notes on them here. As far as I know, all of these samples work just fine on Mac OS X 10.4 (Tiger), but in many cases, the code in these samples is no longer necessary, or can be greatly reduced by using new features of Tiger.

Animated Slider Back when I first wrote this sample, iTunes had just added a graphic equalizer, which does a spiffy trick of animating the motion of the sliders from one preset configuration to another. This sample demonstrated how simple it was to add this animation capability to all NSSliders in your app, but today, with the NSAnimation and NSViewAnimation classes it's even easier.

RGB ImageThe purpose of this sample was to demonstrate how to use compositing to separate any image into its Red, Green and Blue components. This was superseded by...

RGB Value TransformersIn this program I refactored the compositing code into an NSValueTransformer subclass, called RGBTransformer. It's a much better way to organize the code than its predecessor, but today I would do this kind of thing with no code at all, using the Color Matrix patch in a Quartz Composer composition.

PolygonsThis sample is mostly about how to add methods to NSBezierPath for shapes that you might want to draw often. If I were writing this example today, I'd use Bindings, and there would be a lot less glue code. In fact, I'd probably delete the Controller class altogether.

Tinted Image: this app is still handy for testing various combinations of colors and compositing modes. But, if you want to apply coloration to an image in your app, you should look into the much richer capabilities of CoreImage.

Transformed Image:
Not much to say about this one. I added a category to NSAffineTransform to make shearing a little more obvious.

Image Difference:I was rather proud of this one at the time I wrote it. I was curious what the error was in JPEG images with various levels of compression, so I figured out how to subtract one image from another by compositing. I still had to do some manual bit-twiddling of the image data in the NSBitmapImageRep instances to generate the negative images, which I definitely would not do today. This is another of those things that Quartz Composer can do with no code at all.

Cropped ImageIn the Cropped Image sample, I show how to use compositing to extract a portion of an image, and also a few ways to draw a selection indicator. If you have something like this to do today, consider putting the selection marker in its own layer, instead of drawing it over the source image as I did here. It would be far more efficient that way.

Color SamplerTotally obsolete in Leopard and later. See the WWDC 2009 session on NSImage for how this kind of thing should be done today.

and, on any Mac with Xcode installed, at/Developer/Examples/CoreData/Stickies, you will find the first Core Data app I ever wrote. The Core Data team liked it enough to put it on the Developer Tools DMG.

There's a bug that appeared sometime before Leopard that prevents the sticky windows from resizing. The solution is to explicitly turn on mouseMoved events when there's a mouseDown in the resizing corner. To remedy this, add the following code to "StickyResizeCornerView.m", inside the implementation context: