You've reached the internet home of Chris Sells, who has a long history as a contributing member of the Windows developer community. He enjoys long walks on the beach and various computer technologies.
Monday, Oct 11, 2004, 10:04 AM in The Spout
"How is anyone supposed to know that?"
The high priests that run the Internet and the IT industry have betrayed the trust of the secular community.
My wife called me over to her computer the other day when she was worried about an email stating a problem with her eBay account. By reflex, I said, "Oh, just ignore that."
"What? Why? They're going to shut off my eBay account," she said, motioning me over more urgently this time.
Looking over her shoulder, I saw an email that looked very official, including the eBay logo.
"See?" she pointed at the From line. "It's from ebay.com."
"I know, sweetie, but hang the mouse over the link they want you to click. It's a number; it's not ebay.com"
Looking at me like I'd just broken the news about Santa Claus, "But how is anyone supposed to know that?"
I didn't have an answer. There really should be one.
Monday, Oct 11, 2004, 9:56 AM in The Spout
All The Fun, Half the UK Price
Curt Johnson, my marketing guy at Addison-Wesley, has let me know this morning at the UK Amazon is having a 1/2 price sale on my Windows Forms book this month. Plus, the UK guys have their own reviews that are just as nice as the US reviews. Who knew? : )
Thursday, Oct 7, 2004, 11:56 AM in The Spout
You Too Can Be A Technical Writer!
Here.
The one where I outline every technical piece I've ever written.
Thursday, Oct 7, 2004, 12:00 AM in The Spout
Every Story I've Ever Written
I was working with a potential author on an article he'd like to write covering some ground I left uncovered in my original No-Touch Deployment piece for MSDN Mag. Anyway, he sent me the list of topics and then said the following:
"There is a fair amount of material here it might benefit from being broken into chunks. I think I will write about small chunks at a time and then we see how much belongs in one article. Rereading your original article it struck me that you had [a] story that held it together, I need to find one for me."
I've heard this kind of thing before, i.e. people ask how I turn a seemingly random set of topics into "a story." I'm all for that, but it's not really such a chore. In fact, here's the essence of every technical piece I've ever written:
"So, I want to build this thing that needs to do this, that and the other. I started with this, did it this way and it worked. Now I need to do that. Oops. That didn't work the way I thought it should. Here's what I need to do to work around the problem. OK, now I want to do the other... [repeat]"
The secret is really building up from what the reader already knows with some minimal new, interesting thing and keep on like that 'til you've covered the ground you want to cover, stringing things together with transitions that give the reader the impression of one contiguous story. If you really want to get fancy, put a personal anecdote at the front that you use as an analogy, bring it up a few times during the piece and then wrap up with something clever that ties the your anecdote together with the ground you've covered by extending the analogy in a humorous way (but that's optional).
Thursday, Oct 7, 2004, 12:00 AM in The Spout
Settings, Collections and VS05b1 (oh my)
I sat down to write a new Windows Forms application in .NET 1.1 the other day, but the Visual Studio 2005 beta 1 called to me with its "menu strips" and its "user settings" and most especially its "generics," and I just couldn't resist.
To start with, it was such a pleasure to add a menu strip, add in the standard menu items (including graphics), then just strip it down to just the menu items I wanted. Then, as I added new menu items, the menu item object names were set for me based on the menu item text, e.g. startRetrievalToolStripMenuItem instead of menuItem1, which was fabulous. Not everything was wonderful, e.g. I couldn't drag and drop menu items or use Alt+arrows to rearrange them , but overall the new menu control was a pleasant experience.
Even more pleasant was the app/user settings model. To add a setting to my application, all I had to do was bring up the properties of my project, add a named setting of whatever type I wanted (more on this later) and choose whether it should be an Application setting or a User setting. Both kinds of settings are loaded automatically when the app starts and all I had to do to save them was call Properties.Settings.Value.Save() when my main form shut down. Then, with the settings in place, e.g. MyUserSetting, I could get to it after the app started from anyone in my app with a type-safe access, e.g. Properties.Settings.Value.MyUserSetting.
And this didn't just work for built-in simple strings and ints and such like. Oh, no. I was allowed to add custom and collection types like System.Collections.Generic.List<MyNamespace.MyType> as well. Plus, using generics, the underlying XML serialization mechanism worked great, because all of the types are known at compile-time (settings are stored in standard XML .config files @ c:\documents and settings\<user name>\Local Settings\Application Data\<company name>\<product name_hash>\<product version>\user.config). Being able to declaratively set app and user settings of any type and then just use them in a type-safe manner, saving them with one line of code, loading them with zero lines of code and not having to flatten my collections into comma-separated lists made things so pleasant until I hit the ugly realities of beta software, especially as new features interact with existing features and each other.
For example, because the default AssemblyVersion attribute is set to "1.0.*" in AssemblyInfo.cs (which has moved to below the Properties folder of your VS05 project), every time I compiled, all of my settings were lost. That seems very counterintuitive to me. Why should a user lose all of their settings with the new version of the application? To work around this, I changed my AssemblyVersion attribute to a hard-coded string that I now have to remember to change manually, blowing the benefit of having a version number that changes automatically with each build.
As another example, like C++ "const" of old, generics infect your code; use them in one place and you find yourself using them all over. That was fine with me (the generic Predicate<T> for finding things in a List<T> was so handy!) except that as of b1, the Windows Forms Designer gets all unhappy when you use generics. I have every hope that this will be fixed by b2, but as of right now, if I wanted to use the Designer (and it's so sweet, how could I not want to use it?!?), I had to strip out any methods or properties in my visual code that exposed generics (although method and property implementations with generics works just fine).
Stripping out List<T> brought me to the use of ArrayList instead. That worked just fine (System.Collections.ArrayList is even available via the Browse button when setting up app/user settings) until the XML serializer couldn't serialize instances of the custom type that I was using to populate my ArrayList. The error looked like this:
Could not use Xml serialization for setting: SelectedExchanges. ---> System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type MyNamespace.MyType was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.
When I start up the debugger to see the line of code where the error is happening, I ended up in Main because the code is part of the Application start-up for which there is no source code, making this even more difficult to debug. The problem was that the underlying serialization engine didn't know what to do with this custom type. The clue was the mention of the XmlInclude attribute, which you can use to tell the serializer what types may be in the ArrayList, but you have to have somewhere to hang the attributes. In this case, that lead to a custom ArrayList type for the express purpose of informing the serializer (making me really miss the use of generics, where all of the types were specified at compile-type for me automatically):
[System.Xml.Serialization.XmlInclude(typeof(MyNamespace.MyType))] public class MyList : System.Collections.ArrayList { public override object Clone() { MyList newList = new MyList(); newList.AddRange(this); return newList; } }
Notice also the Clone method. I added this later because the base ArrayList Clone method creates an instance of ArrayList, not my custom MyList type. Of course, since this was all run-time type errors, I couldn't let the compiler tell me about these problems; I had to run my app and find them. Very frustrating, especially when generics makes these problems all go away.
Still, I'm very much enjoying the new productivity features in VS05 and Windows Forms 2.0 and when they work better together, I'll be even more happy.
Wednesday, Sep 29, 2004, 10:20 AM in The Spout
BankOne: Special Victims Unit
I have a BankOne Visa card that I use for Sells Brothers, Inc. as a charge card for expenses like computer equipment, technical book purchases and strip clubs (you know -- business expenses : ). Apparently somebody got a hold of the number and started making charges with it today. A $19 charge was approved, but the $331 charge swung the BankOne AI software into action and the charge was declined. They called right away to confirm the activity and when I didn't recognize it, they credited me the $19, canceled the card, put a new one in the mail, sent all three major credit card agencies a notice so that my credit rating wouldn't be affected and put an affidavit in the mail so that I could swear that the $19 charge wasn't mine. All of this defense against identity theft cost me 5 minutes on the phone, a few days wait while I receive my new card, a signature and $0. Amazing.
Monday, Sep 6, 2004, 10:41 AM in The Spout
The Week Before Burning Man
Here. The one where I list the activites in which I was involved the week before Burning Man.
Monday, Sep 6, 2004, 12:00 AM in The Spout
The Week Before Burning Man
I was just listing my activities for the week before Burning Man and amazed even myself:
Shopping for and celebrating my wife's 36th birthday
Helping to prepare for and then watching Sells brother #1 test for his Jr. Brown belt in karate (he was amazing)
Hosting my aunt and grandmother on a very rare 4-day trip
A day-trip to the beach
Celebrating the birthday of Sells brother #2
Coordinating the update, from my house and at the last possible moment, of more than 100 pages on microsoft.com to reflect the recent announcement of WinFX being made available on down-level versions of Windows (this included 3 all-nighters)
Preparing for and running a 2-day garage sale of the stuff I pulled out of my house over the last 8 months in my own personal episode of Clean Sweep
Packing for 5 days in the desert (I worried about survival and my wife worried about having enough costumes...)
Of course, after that I spent a week at Burning Man, and today we're cleaning the playa out of everything, preparing the boys for school, hanging out with the relatives for Labor Day and celebrating our 13th wedding anniversary. Starting tomorrow, I have to figure out what to do with the Longhorn Developer Center now that WinFX will be available on down-level windows, co-author two Avalon books and one Windows Forms book and run the Applied XML Developer's Conference 5. Should be fun. : )
Monday, Aug 16, 2004, 4:46 PM in The Spout
Where Are You In The Software Practitioner Triad
In his piece Software Practitioner Triad (I know it's old, but I just got pointed to it by Phil Weber), Alan Cooper points out three different folks needed to design and build software:
- Architect: responsible for determining who the user is, what he or she is trying to accomplish, and what behavior the software must exhibit to satisfy these human goals.
- Engineer: technical problem solving via experimentation, not fettered with the demands of producing release code.
- Programmer: producing a shippable product, consisting mostly of protective code that rarely—if ever—executes, but is dedicated to supporting obscure edge cases, platform idiosyncrasies, and error conditions.
I've done all three, but am happiest with architect and engineer. Where are you in your current job? Where do you want to be?
Thursday, Aug 5, 2004, 12:15 AM in The Spout
Mensa Has an Open Enrollment Day
"I refuse to join any club that would have me as a member." --Groucho Marx
I must fit into some kind of quota (Windows programmers? Authors? Norwegians? Big, Dopey, White Guys?) for Mensa to let me in...
And don't forget to steal the new flair, Rory... : )
Monday, Aug 2, 2004, 10:34 AM in The Spout
I want remote apps, not remote desktops
Ever since WinXP, I've been using Terminal Server a ton. Recently, I've been using Virtual PC and when Virtual Server is released, I bet I'll be using a lot of that, too.
However, as enabling as TS and VPC are, I want more. Instead of logging into a desktop and having the windows trapped on that desktop, I want the windows from a VPC or TS session to just show up on my local desktop, maybe using title bar colors to tell me which ones are running on which machines. I know that X-Windows has provided this for a while, but I want this for Windows. That is all.
Thursday, Jul 29, 2004, 7:01 PM in The Spout
I Can't Imagine More Great Hackers
Here. According to Paul Graham, hackers only program Python and never program NT, so none of the people that I would consider "great" hackers are, by Paul's definition, great. Given the quality of the hackers I was mistakenly classifying as great, I can't image what Paul's bar must be (or it could be that he's an elitist snob... : ).
Tuesday, Jul 27, 2004, 11:54 PM in The Spout
What Makes A Book Successful?
Here. The one where I pontificate like an arrogant windbag on the subject of what makes a book successful as if I knew.
Tuesday, Jul 27, 2004, 12:00 AM in The Spout
What Makes A Book Successful?
I got an email today from a friend who wanted to know what he could do to make the book he had in his head successful. I've thought a lot about this topic in the genre of Windows programming (I don't have a clue how to make your bodice ripper successful), but had never verbalized it 'til now, so I thought I'd run it up the flag pole and see who burns it.
DISCLAIMER: I make no claim about whether following these guidelines will make your book successful. These are just things that I think about when I'm trying to make my own books successful.
Write a quality book. I know this one goes without saying, but given the state of most books that make their way to the shelves, I thought I'd say it anyway. Karen Gettman, my editor at Addison-Wesley, says it like this, "Be the first or be the best." I've never yet had any luck being first, so I really try to be "the" book in any given category. For example, I think the 6 guys who read the TAPI book would agree that I really nailed it. : )
For me, the crux of quality (besides being able to string sentences into paragraphs and chapters in pleasant ways) is writing a book that describes how to do your work with the technology instead of that describes how the technology works. The difference is subtle, but it's what separates, for example, a book that describes how to build real applications in WinForms using the appropriate tools from a book on the WinForms classes, methods and events. Likewise, the former fills in the gaps when a technology falls short whereas the latter is frustratingly silent on such topics.
Have a significant audience. This is the one that's killed me time and again. The Win95 user book was killed by Internet encyclopedias. The TAPI book was killed by the lack of PC/Telephony adoption. The ATL book was pretty well-received, but the audience was still not the audience size that you'd like (although it still sells nicely and we're planning on having a 2e in time for Visual Studio 2005 and ATL 8).
Having a significant audience was the thing that killed my friend's book dreams when he called. Before our call, he was all excited about his technology (passion is an important part of the writing process and it's the only thing that can get you through the murderous back-end of a quality book [on the other hand, I understand that people that write crappy books don't have this problem, so there's something to be said for that...]). After our call, he had to admit that the market just wasn't there for anyone to purchase his labor of love once he'd produced it.
Own the marketing. The truth is that even though publishers have full-time marketing folks, you are much more likely to know where your audience hangs out and how to reach them then they are. Plus, there are all kinds of "guerrilla marketing" things that you are much more able to do than any publishing company. For example, these are some of the things that I like to do:
Answer questions online in your area of expertise. I'm continually surprised by the number of authors that don't participate in the communities that support their technology. If you answer questions and then point folks to your book for more details enough times, folks will grow to appreciate your book without ever having picked it up (although don't just point folks at your book without answering their question -- that'll just make you look like an asshole).
Ask for Amazon reviews of your book. People often feel the need to say something nice about my book before asking me a related question. In that case, I always take the opportunity to ask them to post a review and give them the URL to do so (the difference between finding my book on Amazon and just clicking an URL can make all the difference between whether they do it or not). I never ask them to post a "nice review," btw. I just encourage them to write what they feel.
Why do I care about them posting their reviews? According to legend, the number of reviews a book has is a fair indicator of how well it sells, regardless of whether those reviews are good or not. I don't know if it's causal, but since I can only influence one of the variables, that's what I do. Plus, the reviews look good to your family and friends when they pull up your books and since you're not going to make any money writing a book, you might as well get something out of it. : )
Why so I want the reviews on Amazon instead of blogs, newsgroups or BookPool? Because everyone goes to Amazon to buy books and that's where I want them to see the reviews. In fact, if I see a review somewhere else besides Amazon, I'll ask the reviewer to copy and paste it on Amazon so that all of the reviews are in that one, critical place (providing them the URL, of course, to make it nice and easy for them : ).
Continue writing in your area of expertise. There's no better free advertisement for your book than that tiny bio at the end of an article that says "Joe Grammer is the author of Essential EDI Programming in a Nutshell in 21 Days for Dummies." Of course, that pre-supposes that the article is good enough for folks to want to read more of your work, but if it isn't, you've got bigger fish to fry.
Bang on your publisher. Your publisher has a PR department and a marketing department. Talk to them. Ask them what they're doing for your book. Watch where they go and make sure your book is represented. Watch where they don't go and tell them to go there. Make sure your publisher signs you up to revise your book as the technology evolves.
Pick your publisher wisely. Speaking of publishers, make sure you choose one you're going to like. It's easy to fall into the money trap, especially since every publisher on the planet can provide numbers about how they're the #1 publisher in some way for your book and you'd be a fool to go anywhere else. Unfortunately, when you do the hourly math, most authors make poverty level money, so why not pick the publisher you'll like the best? To find out which publisher fits you, you can either write for/flirt seriously with them or ask around. To save you the trouble of the former, I'll give a brief overview of the publishers with which I'm familiar:
Microsoft Press. This is the big dog that all the other publishers a) think is given an unfair advantage and b) are constantly trying to get within striking distance of. MS Press is so far ahead on sales volumes that the rest of the publishers are scrambling for #2. I've never written for MS Press, but have seriously flirted with them enough to be scared by them. This was years ago before the great opening of MS and things may be different now, but at the time, MS Press seemed keen to "fix" my writing to fit the "official" story and to be very firm about schedules, neither of which made me happy (I was used to a more loving, lax environment : ). Plus, MS Press is famous for little clauses in their contracts for which authors need to watch (although all publishers do this -- watch out for the one called "Right Of First Refusal").
Addison-Wesley. I've written all but one of my real books for Addison-Wesley and they have set the author environment standard against which I measure all others. In the old days, they'd throw advances and even grants at anyone with a pulse and then expect you to take 23.5 months to deliver on a 9-month contract while leaving you free to say pretty much whatever you wanted. Sadly, those days are over, but the idea of letting the author be the ultimate arbiter of what goes on the page has stayed. This comes from editors that are more like project managers in that they send nag emails when you're late and send chapters off to reviews to gather feedback, but don't ever really read the chapters (most AW editors aren't technical). What this means is that you have a lot of freedom as an author until some reviewer you don't agree with brings up something silly that the editor takes as gospel and whacks you with it.
Luckily, if you're writing for an AW series, you'll have someone technical that can read and review your content, although in this case, you'll want to make very sure that you see eye to eye with your series editor or you'll find yourself butting heads.
O'Reilly & Associates. I've only written one book for them and it was a mixed experience. On the one hand, it was the wrong book (it should've been a Visual Studio Hacks book, but this was before the Hacks format was invented). On the other hand, ORA editors actually read the book and provide intelligent, thoughtful feedback. I really like that. On the gripping hand, ORA has built its reputation of steady quality by applying heavy copy editing to all of their authors to coerce those that aren't writers into the ORA "voice." Most of the time, this works nicely. If you pick up any ORA book in any series, you know what you're getting and lots of people love that (I love a lot of ORA books myself). However, if you're an arrogant author (like me) who thinks that he writes better than the copy editors, you may be surprised with what the copy editor does to your stuff.
Also, ORA doesn't really have series so much as formats, e.g. Nutshell, Hacks, Developer Notebook, etc., so make sure you like the gimmick associated with a format before you sign up for one. To maintain that steady level of quality, they're going to make sure you stick to the format closely.
APress. I don't know a thing about APress except that I like Dan Appleman, Gary Cornell is a character and a half, they seem to have some good books and I've never written for them, so naturally I'd like to write for them for some day (I mean, just because my wife doesn't allow me to fool around outside our marriage, why shouldn't I be able to fool around in another genre? : ).
BTW, a lot of these same principles can be applied to your article writing, too, but there you know what they're paying you up front. A bunch of my friends have done the math and for the same amount of work required to produce a book, they can produce articles that pay much better. But you're not writing for the money, right? (Please don't try to write for the money...)
Wednesday, Jul 21, 2004, 10:25 AM in The Spout
Hypothetical: What's Best For Windows Developers?
Hypothetically, if you were a relatively well-known voice in the Windows development community (let's call her Kris) and you were being pursued as a series editor for two publishers, call them O'Shawnasee Associated (OSA) and Anderson-Manderson (AM), which would you pick?
Suppose that both OSA and AM have a strong existing Windows presence, but AM has the edge in a quality .NET series with a strong voice already at the helm (call her Dawn) while OSA has a more scattered offering spread across format and media types. Would it be better for Windows developers if Kris lent her voice to the AM existing series, reducing the competition for authors between series, or should she work with OSA to gather their Windows editorial vision into a more cohesive whole, requiring developers to make a harder choice between publishers?
I know that this question is hypothetical and holds no importance in any pending decisions by anyone real, but I'm still curious about your thoughts. Please post your comments here.