June 26, 2010
So, as is my habit, as soon as Safari tells me Mike Lee has updated his website, I immediately go and read what's he's written. It's a hell of a post, although at first blush it might seem egotistical, since it's him explaining why he's worth a grand an hour.
But there's a deeper meaning behind it, and a lot of that meaning is: Don't waste my time. You want Mike's experience, expertise, and skill? Don't lowball him, don't fuck around. Pay him a grand an hour, and let him apply his abilities in ways that can help you. I finished reading that, and recalled my own deliberately limited consulting history, and realized that Mike was making a really good point. There's little more annoying than getting talked into consulting for someone, and finding out they either want to dick around with your rate, or dick around with what they're paying for. It's bullshit, and it's insulting, and it happens too much.
For example, while I'll help out friends/people I like for anything from money to beer to gear, that works because we both understand that either side can, and will tell the other to go fuck off if one of us gets too demanding. Obviously that's not going to work for long-term projects, but for the kind of one-off thing I do for folks, it works, and keeps things simple.
But if we're talking about 'formal' consulting, and I don't know you, then it changes. For one, my prices go way up. Currently, if you're local to Tallahassee, it's $2000 a day plus expenses. If you're in driving distance, then it's $4000 a day plus expenses. If I have to fly, then it's $5000 a day plus expenses.
Stop laughing, i completely understand those prices are ridiculous. I want them to be, because to be honest, consulting is a pain in my ass, and that's what you're paying for: that money overcomes the level of pain in my ass your problems are. Those rates do a number of things:
- First, if you agree to that shit, I know you're serious. I know we're not going to spend a lot of time dickering around like a bazaar merchant.
- Second, it means you have a real problem. Something that you can't easily handle, and it means it's a problem I can do something about. It means the chances of me discovering you decided "IT" is some kind of catchall and what you really wanted is a programmer are pretty low. If you're going to agree to those rates, you're not doing so blindly
- It also means that you understand that the contract we have won't be to dick you over or dick me over. It's there to clearly explain who is doing what, so that no one gets hurt by unrealistic expectations.
- Finally, it means no one's dicking about. For that kind of money, you're not going to want to waste my time, since you're paying for that time, and rather handsomely. You're not going to fuck about, I'm not going to fuck about. Life will be much easier for all that way.
I'm really serious about this, because while I can't speak for Mike, I can tell you that sysadmin consultants rarely get called in under good circumstances. Sometimes, but that's only when you have a client who realizes they don't have internal expertise, and need shit done quickly, too quickly to get it done in house. Those are the best, because there's no hurt feelings, and you're not a cover for intercine office wars.
That's what we all want. No dicking around, no hurt feelings, no drama. You know my skills, I know your problem, we get shit fixed quickly, and everyone's happy.
I totally get where Mike's coming from with his rate, and i think he's pretty fucking brilliant for it. His clients get someone well worth the money, and he gets clients who aren't going to piss and moan and waste his time with it. Not at that rate they won't.| Comments ()
June 14, 2010
more on being in charge
"My job is to hold the umbrella so the shit from above doesn't hit you.
Your job is to keep me from having to use it."
That may be the best quote I've ever read on the manager/grunt relationship. It distills reams of MBA and other theory into two sentences. Even with the minor profanity, it is almost a koan. It is simple and clear, and of course, 90% of people reading it will think "It can't be that simple". Well, it is and it is not.
There, cleared that up for you?
Heh. There are days that I find myself deeply missing the Air Force. Not for any patriotic reason, or similar, but because they got so much of that right. As a leader, my job was simple. Ensure my people had the things they needed, physical and otherwise to get the job done. I was there to keep people from fucking with them.
In return, their job was to make sure I didn't have to play human shit shield a lot. Because if I did, especially if they'd been stupid, they knew that once I got done dealing with SMsgt AssReamer, i was going to calmly call them into an office, close the door, and, bluntly explain why we needed to ensure that i never got reamed out for them bein' stupid again. Because there was a limit to how many times I was jumping in front of the cock for them, indeed, there was a limit to how many times I could jump in front of the cock for them, and at some point, if the stupid didn't stop, they was a-gonna get fucked. I'd get fucked too, but for a change, I'd have someone to kvetch with while it happened.
This is something that the military understands, in my experience, far better than the civilian world. As a civilian, you realize that with rare exception, you're not going to have too many bosses that will stick their ass in the woodchipper, so you don't have to. Oh, it's couched in all kinds of proper language, but you realize that unfortunately, most bosses will let you get nailed, so they don't. That's bullshit, but it's pretty common. It sucks, because it kills any chance at esprit de corps, another concept sadly lacking in the civilian world. (No, morale is not the same as esprit de corps. They complement each other, but they are in fact, different.) As I've told a few people, I'll trade petulant, whiny superstars for a team full of ruthlessly competent players who work well together. Give me that, and I'll kick the shit out of anyone.
But to get that, you have to give. To get trust, you have to give trust. To get people who will go all-out for you, you have to make sure that when they fuck up, and they will, that the total amount of blamestorming is "yeah, that was pretty fuckin' epic dude. Now, let's figure out how to not be epic like that again." If you want people to be honest with you, you have to be honest with them. Even when they don't like it. Even when it's bad news. Especially when it's bad news. Like I tell my minion, "If there's bad news coming down, you don't have to worry about me being all subtle about it. I'll tell you shit's going to be fucked up, and that we're going to be swimming in it." (or something similar. I have the memory of an IT guy for anything not in email. Like a fucking sieve it is.) Being in charge is both far harder than it seems, and easier than most people make it.
Oh: "leader" not "manager". You manage things, you lead people. I find that the civilian world fucks that all to hell and gone. It explains a lot of why "Dilbert" is so representative of corporate life. Here's a tip: if at any time, while talking about your people, you find you could replace <person's name> with "desk", you're doing it wrong.| Comments ()
June 13, 2010
Bindings! Bindings! Bindings!
When last we left our intrepid hero, he had gotten his application, sans plotting, into a basically functional state. Then he went to Shane Stanley's awesome AppleScriptObjC class, and learned about bindings.
Things got interesting.
So, leaving the hyperbole behind, Bindings are a different way to well, bind UI controls to the code in your application. They can make your life much easier, in that you can get the same task done with less work and, quite often, less code. But, they do require you to think about things differently. So, we'll cover bindings in multiple passes, with this article talking about text fields. Text fields are a good start because the WiFi Analyzer has a fair amount of them, and they're pretty simple to deal with, once you know a couple things.
So, as you recall, the non-bindings way we use text fields is pretty simple. We set up the field name in the application as a property with a value of "missing value":
property currentSSID : missing value
Then in Interface Builder, we create the text field, and do the ctrl-drag thing to connect the text field to the property. We can then use it in the application like so:
currentSSID's setStringValue_(theCurrentInterface's ssid())
This sets value of the text field's string value to the value of theCurrentInterFace's SSID. To get the contents of that string value:
currentSSID as text
Simple enough. So how do we do this with bindings? Well, the difference in the setup is minor. First, you set your property up to be an empty string, not missing value:
property currentSSID : ""
Then, in Interface Builder, you select the text field, and open up the Inspector. In that, you enable bindings, and pick your application delegate, (in this case, Wi Fi Analyzer App Delegate), and in the Model Key Path, you enter the property you're binding the control to. I highly recommend pasting this in, it avoids really annoying problems:
Save this change, and sweet, we're done, right? No dragging, no other changes!
Welllllll...no. That's what I initially thought, and nothing seemed to work. The text field wasn't set, writing the value failed all over the place, it was a mess. The reason why, once some folks on the core AppleScript team explained it is simple. When you use the non-bindings method, then you're working with a pointer to the data. So, things like setStringValue_() work and you have to specify "as text" when you're using it. With bindings, you're working with the actual data itself, not a pointer to the data, so you have to use more 'traditional' AppleScript methods:
set my currentSSID to theCurrentInterface's ssid()
Once you realize this it's pretty simple. Also, I realize that there's not a huge difference in code or convenience between bindings and non-bindings for text fields, at least not in the way we're using them. However, as we'll see in the next iteration of this, when we move to other controls, bindings can simplify our lives rather a lot.| Comments ()
June 12, 2010
On Urinals and Bars
Okay, so because some of you fuckers were raised in a barn by the Amish, and never let out:
When you are in a situation where you have a long line of urinals with an entrance near the door and an exit on the other end of the line of urinals, the protocol is elegant and simple.
- If only one urinal is available, you take it. Even if it is the kids' urinal.
- If multiple urinals are available, you always take the urinal farthest from the entrance. Even if it is surrounded by other men.
- If you have a shy bladder, you get the fuck out of the urinal line, and take a shitter.
Seriously, this is simple, and yet you dipshits, (you know who you are) fucked this up consistently. It's a urinal in a high-use bathroom. You have to get in, get out, and do so quickly.
When someone is picking up the tab for a night of drinking, even though they are tipping the bartenders/bar staff, you tip them too, even if you aren't paying. The person picking up the tab is tipping for the bar bill itself, and for the overall work of the staff. You are tipping because that bartender/bar staff still had to do the work to get you YOUR drink. I'm not saying you have to tip for every drink, and doing so at the end of the night is acceptable, but you still fucking tip. Christ, you think it's easy taking care of you drunkards?
You'd think that drinking and peeing correctly would be something that people are taught by their parents. Evidently that was an incorrect assumption. Now you know.| Comments ()
June 2, 2010
Other places I virtually am
Picked up a new-ish gig while I was playing server swap here. I've the "Mad Macs" column on ITworld.com! Go, read, drive up those hit counts!