Defective Yeti has a Cliche Rotation Project going on. Trading in the old cliches for new shiny ones. I just made the following submission: As the crow flies -> As the neutrino flies. The problem with crow flight is that it is still subject to going around skyscrapers, mountains, etc. Neutrinos, on the other hand, don’t have such problems.
Khoi Vinh flow charted the thought process of his dog (Mr. President) which got me thinking about the thought process of my dogs. Bandido’s is entirely too complex to flow chart, and I only understand small bits of it, but Ebony’s has always been relatively simple and it seems that the limitations of her rather ancient body have simplified it even further. So, being the type of person who enjoys making flow charts I figured it would be fun to map out the way she thinks. But, there are a couple things you need to know to fully appreciate this. First of all, Ebony will be 14 in a couple weeks (I’ve had her since she was one), and she’s a Great Dane. Officially Great Dane’s live about 9 to 13 years, but it’s my impression that it’s pretty rare to see one older than 10. Combine that with those long legs and you’ve got a dog who has a lot of trouble standing, or sitting, or laying down. Stairs with more than five steps are no longer and option (she falls down) and the only reason she’ll deal with those short flights is that she couldn’t get into the house without being carried if she didn’t, and she really doesn’t like being picked up. That and she knows that I’ll catch her when she starts to fall trying to go up those which happens at least once a week. So, without further ado, I present to you Ebony’s thought process:
Seriously. What makes you so special? It’s not that you’re brilliant, because, statistically speaking, you’re not. Sure there may be one or… maaaybe two brilliant people reading this. But, the odds are that you aren’t them. So what makes you so special? The way I see it there are three types of people:
And, since it’s safe to say that you’re not brilliant, you’re either someone people look up to or… someone else. So, what makes you so special? Are you actively pursuing your dream? Are you fighting for a cause you believe in? Are you actively trying to be the best you could be at whatever it is you do? Or, are you like everyone else? I work with coders, and I am happy to say that most of the people I work with are really smart, and really good at what they do, but there are very few whose work I would want to emulate. They’re like “everyone else.” And that’s not bad. That’s, in fact, quite normal. But, do you really want to be normal? Maybe the “normal” people around you lead passionate and powerful lives when they leave the office. I’d like to think they do, but I think most of them don’t. The sad fact of life in the USA is that you are defined by your job. Your job takes up the vast majority of your waking hours. When people meet you they ask what it is that you “do” and, if you’re like most, you answer with your job, because it’s not just others that define us by our jobs. Artists are one of the few exceptions to this. When you ask an artist what they “do” they’ll say “I’m an artist.”, or “I’m a painter.”, or something like that, even though art is rarely what pays their rent or puts food on their table. I say this is a “sad fact of life” because, in the USA at least, people generally don’t love their jobs. They generally do something they happen to have skills for, or work in a position they happened to fall into. If you’re like most people your job is something you do to get money to pay the bills. Are you really happy about the idea of spending the rest of your foreseeable future doing what you’re doing? When I started writing this, as with most things I write here, I was thinking about coders and the type of code they leave in their wake. I was thinking about the type of people in my professional life, and I was going to make a point about the type of code that you write. But, I think the code you write is more a symptom of this larger issue. There are a lot of talented people I work with but, I think, for the most part, they aren’t passionate about what they do. And if you’re not passionate about what you don’t have a personal investment in the product of your labor. Sure you want it to be good enough to not get fired but beyond that I wonder how many of you really care. And, I’m not talking about my current job, I’m talking about everyone I’ve encountered. I think my office would be a very empty place if all the people who were just “going to work” suddenly disappeared. I have been dealing with code that just “gets the job done” for years. I’m guilty of writing enough of it myself. I’ve written a lot of crap too, much of it because I was young and ignorant, although I’m sure I’ll write more crap in the days to come. And, for all those who have had to deal with my crap, I’m sorry. I’m sorry I didn’t realize what it meant to be the best I possibly could. I didn’t realize the difference between “quality work” and “work”. I was like most of you; agreeing with the smart people about the way things “should” be done but never getting off my ass and doing it. But, I realized something. I realized that it is not enough to want to be someone worth looking up to. It is not enough to want to do or be better. You have to act. You have to actively work towards these things and that’s where most people fail. They think that doing is harder than saying. But it isn’t. It really isn’t. The key is to get your ass out of bed and do it. Every day. That’s it. It’s not a hard thing. Build the best damn house you can. Be the best damn parent you can. Be the best damn coder you can. And every time you see yourself slacking you need to go back and fix it, make it the best thing you can. Maybe you’re not great at what you do, but you are the only thing preventing you from being the best you possibly can be at what you do, and if you keep being the best you can be, you’re just going to keep getting better. All you have to do is hold yourself to your own standards, accept nothing less than the best from yourself. How hard is that really? If you look at something you’ve just done and think, “I really should have done x”, then go do x. Don’t just move on and accept something you know isn’t right, and don’t allow yourself to keep making the same mistakes. Learn from your actions, so that next time you can be better. Make a promise to yourself that you won’t accept anything less than the best you can do. When you find yourself slacking go back and fix it. Repeat. I want to be someone worth looking up to, not because I want your admiration, or even your respect (although that would be nice), but because I have to live with myself and I am not OK with being another schlemiel, and neither should you. So, what makes you so special?
For those of you who were wondering: recent research plus years of entrepreneurial experience has brought me to the conclusion that combining the tasty goodness of cheese pizza with this generation’s must have gadget (the cell phone) will not produce the next multi-billionaire. If you disagree, please feel free to take the idea and make as much money as you can from it.
I’ve been sitting on this post for a few days, pondering if it was worth releasing or if I was just beating a dead horse. I’ve come to the conclusion that it is worth releasing but not to point out how much Perforce sucks but to act as a very concrete example of the difference between applications that care about how you use them and applications that don’t, about how the words you choose can make a big difference in usage, and how your current position affects the perception of your actions. Renaming/Moving a file in Darcs: darcs mv bad_name.txt decent_name.txt “mv” is known to millions of linux/unix geeks but even so it looks like they’re renaming the command to “move” just to be even easier. Renaming/Moving a file in Mercurial: hg rename bad_name.txt decent_name.txt Can’t get much more obvious than that. Renaming/Moving a file in Perforce: p4 integrate bad_name.txt decent_name.txt p4 delete bad_name.txt
Integrate: [v] become one; become integrated; “The students at this school integrate immediately, despite their different backgrounds”
Perforce has been working on their tool for twelve years and in all that time they couldn’t be bothered to spend the 5 minutes (probably literally) it would have taken to add a “move” command to make their system easier and more intuitive. Back in the day they probably figured that since they already had an “integrate” command (which was decently named for what it did) they may as well just reuse it for something that, under the covers, was essentially the same operation. In all this time it doesn’t seem to have mattered to them that it is a horrible and misleading name for a rename operation. Nor do they seem to care that it makes it harder for new users. It didn’t even seem to matter to them that by the act of taking money for their product they are setting themselves up to a higher level of accountability than any free product. The people behind Darcs and Mercurial aren’t getting paid for their efforts and they’re taking the time to make their tools easier to use. Git’s commands could still use some work before they’re ready for general usage but the project is still new, they readily admit that the commands need work, and they’re actively working to make them easier for people. Even now, after a little more than two years of part time work, I believe that Git’s command set is better that Perforce’s. If it wasn’t I still would have excused them simply because the project is both young and free. If you think I’m making a mountain out of a mole hill, I’m just picking on the “move” command because it’s a simple concept to grasp that’s easy one to demonstrate to you. There are similar, and worse, issues all over the place when dealing with Perforce. Alone, you’re right, one or two issues like this are not a big deal. In concert, they’re an impediment to adoption and an increased level of frustration and annoyance. But, it goes beyond even that. It’s the principle of the thing. When faced with The 3 Pixel Conundrum Panic Software went out of it’s way to make things right. The Darcs team is constantly improving it’s commands and trying to make itself easier to use. Darcs is molasses on a glacier compared to Mercurial and Git but its user interface is just so damn good that people like using it. Google around for the comments people leave about their experiences using Darcs. They’re like people who finally got a deep breath of fresh air after sucking car exhaust through a straw for three weeks. Why should anyone have to put up with misleading terminology combined with extra steps and an obvious lack of concern for the users that Perforce shows when they could use a product that makes them feel the way Darcs makes people feel? They both get the same job done in the end, but one of them is hard to learn and miserable to use and the other… well, isn’t. Apps like Delicious Library don’t even do much of anything but they are so enjoyable to use that you want to buy them, and you want to tell your friends to buy them. I bought it and I love it and I’m still not sure why I need a categorized list of 500+ books and movies but I know I’ve got a few stacks of books new books that I need to get in there and I’d have fun doing it. Scan, smile. Scan, smile. You shouldn’t tolerate Perforce’s approach in the tools you buy. Unfortunately, sometimes you don’t have much choice, but you most definitely shouldn’t tolerate it in the tools you make. I expect better of myself and I expect better of you. I especially expect better of something that people have been working on for twelve years! People don’t rave about how great Perforce is. They say it’s reliable and stable. People don’t say Perforce is easy to use they say I should “learn how to use it”. Can you see the difference? Darcs has evangelists. Mercurial does too, even Subversion with all it’s limitations has evangelists. You don’t hear people saying “I use Subversion because it’s stable and reliable.” No, you hear people say “I use Subversion because it’s excellent!” It doesn’t matter if you agree with them or not. What matters is that these tools have paid attention to what their users wanted, or thought they wanted, and are all trying to make things better for those users. You have a choice, you can use tools from people who want you to love their product or you can use tools from people who want you to use their product. The same choice applies to the tools you make too. Do you want your users to love your product or just use it, and what effect should that have on the choices you make in your work? Panic Software and Delicious Monster want you to love their products, and the effort that they’ve put towards that goal has paid off. P.S. Darcs is groovy and all but I’m still recommending Mercurial. P.P.S. Delicious Library is really good for keeping track of who you lent books too, but doesn’t track the books you’ve borrowed. Overall there’s a lot I wish it would do, but I mention it here because it’s a really good example of what a difference making your app pleasurable to use can make. It has made it’s creators a lot of money almost entirely because it’s pretty and easy to use. Come to think of it… that describes the iPods too. People LIKE these things and you can’t discard them as crap because of limited feature sets. They do what the main thing their owners want and they make doing it enjoyable. I’ll take that over 50,000 features, rote memorization, and a thick users manual any day.
I just received my Kinesis Contoured keyboard and thought that those of you who actually care about the ergonomics of your work environment might appreciate my first impressions of it. I also needed an excuse to type something so as to get used to it. ;)
Now, before I get started I should mention, as many of you already know, that I take my ergonomics seriously. I endured two weeks of painfully slow typing while I retrained myself to use the Dvorak keyboard layout because doing so involves provably less contorting and reaching, and is thus less wear on your hands. Being a programmer, and wanting to continue to be a programmer for the foreseeable future, and having the tendency to come home and either write or code after a long day of writing or coding I believe it to be in my best interest to take preventative measures to not end up in wrist braces unable to type for more than a few hours at a time. I use a trackball that involves minimal thumb movement, and nothing else, and now I, finally, have a keyboard that’s actually ergonomically designed. Let me explain…
Unlike most “ergo” keyboard the Kinesis Contoured is, and I realize this may sound a bit crazy at first, contoured to fit your fingers. I know, I know, you’re thinking “But Kate! Fingers should be contoured to match the shape of the keyboard not the other way around!” But, bear with me. I think these Kinesis people may actually be on to something. Instead of just splitting a keyboard so that your arms weren’t bent anymore they actually discovered the amazing fact that finger-tips don’t form a straight line! I know, who would have guessed?! So they went and designed a keyboard where the keys that fell under your “longer” fingers were farther away so that when you rest your fingers on the keyboard they, get this, “rest” lightly against the keys without having the longer fingers being arched back more than the shorter ones.
Traditional keyboards which were designed with diagonal rows because otherwise connecting the levers that moved the strikers would have been much more difficult. Oddly most keyboard manufacturers don’t seem to have noticed that we don’t have levers and strikers and paper rolled around a drum any more. Kinesis, bright folks that they are, did notice this. So they decided to lay the keys out in straight rows that aligned with the way you curve your fingers back and out so no more shifting to the side a little to get the key “below” the one your finger is currently on. This is a decidedly weird feeling at first. You don’t realize how many weird contortions you’ve been doing until you suddenly have to train yourself to not do them any more.
The arrow keys are no longer over in an inverted T that you have to move your fingers away from the letters to use anymore. Instead they’re 2 rows below the home keys, which would absolutely suck on a traditional keyboard but on this keyboard makes you go “Oh my god! I didn’t realize reaching for arrow keys was just as bad as reaching for the mouse!” Of course now they’re in a completely different place so that’s going to take some getting used to but they feel so, so much better in the new place that I can’t wait to get used to them here.
They’ve moved a few other non-letter keys around and for the most part I agree with the choices, although I’m not sure what the thinking was behind moving the = – and ~ keys around was. Getting used to the new location of the control keys is also going to take some getting used to but the space, backspace, and delete keys rock in their new homes: very comfortable, very natural, although the space bar is only accessible from the right hand so the default location might be an issue for lefties, fortunately you can remap keys. As a lefty I’d probably swap the sides of the four large thumb keys. You can take a gander at the keyboard layout of the Contoured here. So far the only keys that look as if they’re going to take any real time to get used to are the arrow keys and the control other than that it’s very nice. The number keys are now so easy to reach that I don’t think I’m going to want to take advantage of the keypad option (like the one on your laptop except it’s useful because the keys are in straight rows not screwed up diagonals).
The keyboard makes a small click when each key is activated which, if i had of heard about beforehand would have turned me off, but it’s so subtle that I wasn’t even sure it was happening, and while you can turn it off I’ve come to the conclusion that it’s an excellent feature that’s sorely lacking in other keyboards. The reason I like it is because I actually tend to use real passwords with like thirteen characters, numbers, and various capitalisation’s. The problem I have is that sometimes in the middle of typing in a password I won’t know if I actually pressed that key enough of if I just think I pressed the key enough and if I press it again will I end up that character typed twice or just once. I also type quickly (80-120wpm) and without looking at the keyboard so I either have the option of stopping and counting how many black dots are in the field or just wiping them all out and starting over. Now I *know* when I’ve fully depressed a key enough to activate it or not by if I’ve heard that subtle click or not. It’s not even remotely annoying because the click of the actual keys being struck is louder (no louder than most keyboards). So, it’s a nice subtle touch (no pun intended).
The one thing I really wish they had done differently was given it some weight. When I spend $250+ dollars on a keyboard I want it to feel 6 times more expensive than a $40 keyboard. I want metal and impressive thuds, but the overall construction feels no better or worse than any standard $40 keyboard I’ve tried.
Final verdict? This thing rocks and I’m pretty sure that I need to get one for home now too because going back to that half-assed Microsoft “Ergonomic” is going to suck after using something as nice as this all day. I don’t even want to think about what typing on the horrid laptop keyboards is going to feel like after this.
And all of you people who keep saying “I can only type on a straight keyboard” or “I like straight keyboards” should really stop for a minute and ask yourself if whatever it is that keeps you from switching to something that actually resembles the way your hands and arms are shaped is really worth the increased risk of carpal tunnel? I don’t think it really matters much for casual typists but if you spend your day clicking away at a keyboard like I do then I think you should seriously re-evaluate what you’re putting your hands, wrists, and arms through. Sure those ergo keyboards may feel “weird” and make you type like a dork at first but you get used to them really quickly (usually within an hour or two) and you tend to find that the movements that are hardest to get used to on the new keyboards are the ones that you really shouldn’t have been doing in the first place. Maybe you’re not convinced enough to plunk down $250 dollars on a keyboard like this one. But maybe you should consider something that’s at least a little better than that crap straight keyboard. And, at the very least, stop putting up those little feet at the back of your keyboard. They force your wrists to bend upwards more when they should really be straight like a concert pianists. The only reason those feet exist is because typewriters used to have to have rising rows of keys so that the levers didn’t collide. Do you really think you should be compensating for non-existent levers?
Six years ago Akamai lost one of it’s founders in 9/11. It’s still quite evident what a blow it was to the people here as he was apparently a man who lived life to the fullest and really touched a lot of lives. How Akamai has chosen to deal with this loss has really impressed me. The made a little park next to the office building (at least i don’t think it was here before then) and planted a tree for him. Instead of making some disconnected financial contribution to some random charity they encourage employees to go help out at the food bank or spend time at a children’s center. They give an award every year in his name to employees who show the same kind of drive and passion that Danny had.
This morning there was a small service in the park. Paul and Tom said a few words about Danny why trying not to cry. Then we had a moment of silence and those who were close to him each laid a rose next to his tree. Danny is never mentioned in the abstract here. He’s not some random guy who a bad thing happened to. His spirit very much lives on in Akamai, and that’s quite possibly the greatest tribute they could give him.
This morning emphasized one thing to me. That Akamai is one of the few companies that really is a family. I may be on the outside edge of that but I feel proud to be included at all.
The best thing about Distributed Source Control Managers ( IMNSHO ) is how quick and easy it is to branch and merge. The problem is that most of cut our teeth on centralized systems that couldn’t even hope to take advantage of cherry picking, which is, in short the ability to take a single patch out of the middle of a sequence of patches, or every patch but one from a sequence. Just imagine knowing that there was a bug introduced in a specific patch and being able to prune it from your repository but not any of the patches around it. Or, plucking one little feature out of a mass of others that should wait until the next release. You can, but if you don’t make the effort to keep your patches as atomic as possible you’ll find that that patch you want to remove or extract is dependant upon another one, or more, that you may not want to involve. Which brings me to my hierarchy of branches. Now, I’m still working with this concept so if you can improve upon it please let me know (masukomi @ masukomi.org) . The idea is that most of the time you’re not adding one little atomic feature, you’re adding a number of features that can be conceptually clustered. So, you make a branch for the cluster, but do no actual development directly in it. Then you branch from there for each atomic feature (be sure to scroll down to the graph below the fold here). While you are working on a feature feel free to commit as often as you want. Check in broken or unfinished code. Pollute that branch’s revision history with as much crap as you want. Do whatever it takes in there to make sure you can roll back to any point you want, and never loose work. Have a cron job check in any uncommitted changes to this micro-branch every night in case you forget to. It doesn’t matter because you’re not going to push the revision history back up to the branch for the feature cluster. Instead you diff from the branch point and patch the cluster branch and commit it. This way you’ve got one atomic revision with the combined changes for that one small feature and if you need to prune it for any reason (maybe it’s broken, or decided you should wait on adding it) you can easily do so without worry of dependencies. Your micro branch has all the details of the feature evolution if you really feel you need it, but most of the time you’ll just delete it after creating the patch and applying it to the cluster. Eventually the cluster will have all the related features completed and checked in and it’s revision history will consist of a series of atomic commits. The cluster’s revision history is then pushed upstream to your personal development branch. Occasionally you’ll have a small feature to work on with no related ones to cluster. Just branch from your personal development trunk and then patch back into it as you would have into a feature cluster. Bugs should be treated in exactly the same way as features, although you’ll find yourself with many more small bugs that don’t need a parent cluster and can just be worked on in their branch and then used to patch your personal development branch. People working farther upstream now have the option of cherry picking features, feature clusters, bugs, and bug clusters, and will be able to do so with much less worry of getting caught up with patches that depend on other patches.
Please note that I wasn’t just bitching about Perforce. No, I don’t like it, but I’ve done something about it. I’ve written a tool called SSCM to enable people experiencing my frustrations to work with tools we do appreciate and still keep our work synced with tools like Perforce for the benefit of our coworkers.
My Dear Perforce: fuck you post made the front page of Reddit Programming, which generated a lot of comments so rather than address them individually I’m going to address them here.
The comments could basically be broken into three categories but before I go into any of them I must point you to the best damn response anyone had to that post. Thanks keithb. I’ve used it for n years and it’s never screwed up a file / been unstable /gone down comments:
I’ve been using it for 4 years on my own project, never once running into any of the problems you talk about. -Michael G
I’d have to say that whatever its faults, it’s stable and reliable and does what it says on the box. -Jeremy O’Donoghue Perforce has been rock-solid for our group of ~10 developers and a codebase of 10,000+ files (text and binary), used from Linux and Windows and OS X. -Mike McNally
I’d have to say that whatever its faults, it’s stable and reliable and does what it says on the box. -Jeremy O’Donoghue
Perforce has been rock-solid for our group of ~10 developers and a codebase of 10,000+ files (text and binary), used from Linux and Windows and OS X. -Mike McNally
You just don’t know how to use it / haven’t given it a chance / are forcing it comments:
The only people who ever have any problems with it are the ones who don’t understand it and randomly try things to get it to work instead of asking for help. — Bill Napier
It sounds to me like you’re trying to use Perforce as if it were a distributed system, when it’s the opposite. I suspect many of the problems you’re having with it are a result of your attempt to use it like svn, git, or darcs. You should use a system the way it was designed to be used, and if its architecture doesn’t benefit you or help your process in any way, then you shouldn’t be using it at all. -MCS
I think you’re being completely unfair on Perforce. The reliability must be a configuration issue. The model is highly centralized, which sounds like it’s not what you want. -Jeremy O’Donoghue
I find the command-line tools to be very powerful and useful. -Mark Adams
They are. I can’t deny that the command line tools are both powerful and useful. Heck, it seems as if the GUI is just running those same command-line commands under the covers for almost every operation. I also believe that the F-16 Fighter plane is a very powerful and useful but that doesn’t mean that it even remotely approaches something that is actually usable without some serious training. Unfortunately, I think the same can be said about Perforce’s command line tools (although not as much training… I hope).
So Perforce takes a different approach – try getting the hang of it before ranting so aggressively. I found it awkward too when we started using it. -i_soar
Why do I feel like I’m the only one who sees the inherent problem with “I found it awkward too when we started using it”… No. NO NO NO. This should NEVER be uttered. Perforce has been around for years, and people have been getting familiar with Source Control Managers for even longer. There is absolutely no excuse for the basic version control operations being anything other than easy at this point. Perforce has had plenty of time to refine their interface, to do crazy things like add an effing “move” command (Yes I know about the integrate command. It’s not the same thing). It’s fine to say some new, fresh out of beta tool is awkward. It’s fine to say that some tool that uses an entirely different paradigm than you’re used to is awkward. It is unacceptable for an app as old as Perforce in a paradigm as old as centralized source control management.
I agree with Perforce suckage comments:
SSCM v0.3 is now available. New version includes support for CVS and Bazaar and other goodness. :) CVS support should be considered experimental until I get more feedback from CVS users. I really don’t expect any problems with it though. In the process of putting this release together I discovered that Bazaar isn’t getting nearly the attention it deserves. From a user’s standpoint Bazaar does almost everything right:
It’s not perfect, and I’m not sure if has the same level of cryptographic integrity checking on its files as Git and Mercurial do but it appears as if it does. If you’re considering giving a Distributed Source Control Manager a shot, take a moment and spend some time with Bazaar. Currently I’m recommending Mercurial (Hg) to folks but I think Bazaar may just be an equal, or better, competitor. It’s still too early for me to say, but what I will say is that Bazaar definitely deserves more air-time and your consideration.