One of my favorite places in Boston is one of it’s best kept secrets. It’s not obvious how to get there, or that it even exists, but secreted within the bowels of the Boston Public Library is a beautiful courtyard. It’s a wonderful, quiet, relaxing place to spend an afternoon reading. There’s even a little coffee shop just before one of it’s entrances. This afternoon I went on an excursion. In my quest to expand my mathematical knowledge I bit off a bit more than I was ready to chew with The Nature of Mathematical Modeling. It came highly recommended and would be great knowledge for my new job, if only I had the mathematical vocabulary required to read it. So, a few steps back, maybe a refresher course in linear algebra. But, alas, I had to return it having barely started in on it, and that’s what brought me to the library, where I was given a wonderful reminder of the power of unexpected individuals. You see, once upon a time there was a french man named Alexandre Vattemare with a talent for voices. Some have called him the world’s greatest ventriloquist, but that is only what made him famous, not what made him great. Alexandre’s talents enabled him to travel the world, meet emperors and the crowned heads of Europe, and that enabled him to make connections. Alexandre used those connections to create a system of international exchanges between libraries which later expanded to include art, maps, and specimens of natural history. It was because of him that a young United States came to acquire 300,000 volumes for it’s libraries, and because of him that the Boston Public Library came to be. I have long believed that the public library is one of the greatest things about the United States. It’s not that we have them, it’s that they are supported by law, that they are open to anyone without regard to money, status, or even citizenship. They aren’t owned, and thus controlled, by private individuals. The people of every state have collectively decided to build and support an institution where everyone can go to better themselves even if they don’t have a penny to their name. I don’t think many of us have any idea just how amazing this is. I don’t think many people have given it much thought, or realize that this is something that simply doesn’t exist for many people around the world. What an incredible privilege it is to have a place you can go to learn the skills you need to do practically anything… It’s a place where you can go and learn that no matter how quirky your skill or personality, you have the power to change the world, because there are hundreds of volumes on people like Alexandre Vattemare whose penchant for making cadavers “speak” got him expelled from medical school and, ultimately, gave me my favorite place in Boston.
One of these 2 weeks this road map and a hawt geek girl to share it with… hey, a girl can dream right? I’m thinking that next summer I may actually be able to afford to do it.
[Update] I was thinking of flying back…not taking the same route back. If i were to drive back I’d do a loop.
Unsurprisingly, I’m not the only one using a distributed version control system in conjunction with / to improve upon my centralized version control system at work, and with the various open source projects I touch that use CVS or SVN. The Rock Star Programmer (not sure of his name/nic) gives a quick look at Using Mercurial to Work Around Centralized SCM Limitations. It’s similar to what I was saying in Why you should be using a distributed source control system. You may want to grab a copy of my flow chart for using Darcs with SVN/CVS if you want to try his idea for Mercurial. It’s conceptually the same.
Regarding Mercurial, I’ve given it a quick try and while it is boatloads faster than Darcs it requires configuring a CGI script on a server somewhere if you want to share your repository with others. It does have a built in server but that’s really only useful to people who only want to share over a lan. Darcs doesn’t require this. Just upload your current darcs repo to any standard web server, or put the files anywhere they can be accessed by others, and you’re done. The Darcs client is smart enough to check out from the statically served files on a server or wherever you happen to have placed the repo on your filesystem. I’ll probably stick with Darcs for now because it just makes my life easier to not have to configure a cgi every time I want to share a new repo with people. Especially since I still haven’t figured out why it’s not working for me.
[Update] Related posts: Using Darcs WITH Subversion / CVS Using Darcs with SVN / CVS Flow Chart Why you should be using a distributed source control system
We talk about quality, but few of us, especially in the ephemeral wold of software, have any idea what quality really is. Today I received a very practical example of what quality is and what happens when it isn’t there. You see, this morning I had a conversation about motorcycles with one of the local dog people. When it comes to engines, especially motorcycles you’ll frequently hear that the engine is a cc engine. A 1000cc motorcycle engine is pretty big. The cc stands for cubic centimeters and indicates how many cubic centimeters of fuel can be in the engine at any given time. Obviously, the more fuel you can ignite the more energy you can release at any given moment. So, the common misconception is that the more cc’s the engine is the faster it can go. Today I leared just how big of a misconception that was. A little while ago Harley Davidson decided they wanted a piece of the sport bike market, so they created the Buell motorcycle company. Buell builds affordable but cool looking bikes. The problem is that anyone who has done any research, or worked on one, knows that Buell bikes are some of the poorest quality bikes on the market. On the other hand you’ve got Aprilia motorbike. Since then they have been driven to build the best bikes in the world, and some would argue that they’ve which was started in the late 60’s when Ivano Beggio joined his father’s company and built the first Aprillia succeeded. I am fortunate to own a 150cc Aprilia Scarabeo, but I’ve only recently started to realize just what an incredible machine I have sitting outside my door and this morning it was driven home by that conversation. You see, my fellow dog person took a 500cc Buell out for a spin not too long ago. According to him it not only felt like the poorly made bike they’re known to be but he really had to push it to get it to 60mph and it took a while to get there. When he said this, my brain locked up, because my little 150cc Scarabeo, built to comfortably hold two riders, can hit 60 without issue. My top speed is only 80 but… Being largely ignorant of what makes one engine better than another I started trying to figure this out with him, and what we basically figured out was that it comes down to quality. He explained it this way. His 1000cc Harley can rev up to 16,000 rpm, at which speed the forces within the engine are so significant that you just can’t afford to have low tolerances wherever the engine’s pieces fit together. The same force in a Buell would most likely find flaws invisible to the naked eye, exploit them, and blow the seals. But my little Aprilia is made to such a higher level of quality than the Buell that even though it starts with 1/4 as much potential energy (fuel) it can match it for speed, and be constantly reviewed as one of the best made scooters on the market. Aprilia doesn’t make a 500cc motorcycle but they have a 500cc scooter, built for two people (the Atlantic Sprint), with a reported top speed of about 103mph. And that, is what quality is all about. It’s about doing something so much better than your competition that it takes them four times the resources to even approach the power of your product and even then their’s is still shoddily made and likely to break. People may not know quality when they see it. They may not know it when they use it on a daily basis, but the quality of your product will always show up when your customers try to use something else. Yes, they may leave your product for something cheaper. It’s your job to make sure they remember just how much better things were when they used yours. There’s another very significant side effect of having a high quality product, one that Guy Kawasaki is very familiar with. Quality products engender evangelism. Evangelest are what made Apple computer what it is today. It’s why 37signals is doing so well in the world of business webapps and it’s why the iPod can’t be touched even though it’s got a 1/3 as many features and four times the price of some of it’s competitors. I wrote this article not just because I wanted to share a lesson in quality, but because I finally realized just how amazing my Aprilia is. P.S. For anyone who thinks comparing scooters and motorcycles is like apples an oranges you should know that the only difference is the position of the seat, and scooters frequently, but not always, have an automatic transmission. Also, Harely’s used to be known for crap quality, but fortunately that’s no longer the case. Most motorcyclists will agree that Harley’s are generally very well made these days. P.P.S. Think your company could use a good grounding in the idea of quality? Check out The Deming Management Method. Deming is why the Japanese ended up kicking so much economic ass after WWII. P.P.P.S. The evidence of just how awesome Aprilias are has been mounting for me for years as I’ve researched other scooters and motorcycles online, in the stores, and through talking to others. They’ve got a customer for life in me even though they are frequently four times the cost of the low end competitors.
[Update] I was so focused on the Perl that I did Python a disservice. I’ve tweaked the comments about Python based on Alexander’s comment which I’ve also quoted below. The full quote from him is in the comments. In Graeme’s comments the other day he mentioned that
…the syntax of Perl is so hideous and mysterious it produces unmaintainable code (I know having maintained a multi-tier Perl webapp).
And, sadly, he’s not the only one that shares that belief. Perl has been written off by many talented developers because essentially every piece of Perl code they’ve ever encountered is, well, crap. But, when you get right down to it you’re basing your opinion of a language based on what people write with it. It’s like saying that the English language sucks because there are so many vile and crappy things written in it. Perl is quite possibly the most flexible modern programming language. But, as with anything, great power comes with great responsibility. Perl geeks believe “There’s more than one way to do it.” where as Python geeks follow a slightly different way
The Python philosophy [is] that “There should be one– and preferably only one –obvious way to do it.” That is, I can write a a multitude of programs that do exactly the same thing in python in different styles and methods, but there is only one way that is Pythonic… What python does is emphasize a standard quality and method for doing various tasks instead of just hacking it together. - Alexander Botero-Lowry
So, if you’re working with undisciplined idiots, there’s no question, choose a language like Python. But, what happens when the Pythonic way of expressing an idea doesn’t quite mesh with the idea you are trying to express? In Python you’ll generally just have to deal and find a way of coding what you wanted to express that isn’t very “Pythonic” or that ends up being more verbose. In Perl there’s probably another handful of ways to express the same concept. It’s like always having a kick ass thesaurus available. Yes, this means you’ll eventually speak with words other people aren’t familiar with yet or do things in ways others may not be so kosher with. But Perl is all about letting you work in whatever way / style feels best to you. This can obviously lead to situations where different people don’t agree with how something’s been implemented even if it’s very sensible. What you need to keep in mind though, is that the readability and maintainability are the direct result of the experience, discipline, and consideration given for other developers by the person writing the code. The problem with Perl is that it makes it incredibly easy for a person with no discipline or limited experience to express themselves badly… very badly. Combine that with the fact that it’s so easy to get something that works in Perl when you haven’t a clue how to code well in any language and the problem just compounds itself. It is very easy to write readable and maintainable Perl code, but to do so requires discipline. It’s the difference between giving a kindergartner a generous pallette of oil paints and giving one to Michelangelo. The paint is capable of producing a masterpiece in his hands, but the kindergartner is just going to make a finger-paintey mess. Don’t blame the paint. Likewise, don’t blame Perl for the crap that idiots and newbs produce with it. Instead, go buy them a copy of Code Complete and make every-one’s life a little bit better. And yes, before anyone mentions it, Perl’s OOP tools seem a bit hackish and can feel bolted on. But once you start to understand how they work they’re incredibly flexible and let you do things that you couldn’t hope to touch in Java. And yes, Perl does have a number of funky looking operators like $# but you really only need to know a few of them. If you don’t like them you’ll be happy to know that they weren’t to thrilled with the number of them when they started planning Perl 6. Speaking of which, there are some truly awesome things that have been put into Perl 6 and they’ve cleaned up a lot of the syntactic issues people frequently bitch about…but there will still always be more than one way to do “it” so you’ll still be able to write ugly code if you don’t know any better. A note about Python: Python rocks. It just has a very different mindset to Perl. Python isn’t a language for “undisciplined idiots” as I implied above, but it is a better language to have undisciplined idiots coding in because while their code may still be crap you’ll at least be able to read it because of the formatting limitations and because of the intentionally limited number of choices for how to do any given thing.
Do creatively chained methods constitute a DSL? I found a nice example (see below) of chained methods in this post about Using a DSL to create a fluent interface to test your domain model. But I have to wonder… Is this really a DSL? Especially when you consider the excellent points in What’s a Ruby DSL and what isn’t. This isn’t a rhetorical question, I’d really like your input, as I implemented this style of programming in Compensate and was quite pleased with the results.
public static Person CreateHennieLouwUsingDSL() { return PersonBuilder.StartRecording() .CreatePerson(Title.Mr, "Hennie", "Louw", new DateTime (1971, 8, 7), Gender.Male) .PrefersToSpeak(CorrespondenceLanguage.English) .WithCitizenshipDetailsOf(EthnicGroup.White, "7108070108083") .WithMaritalStatusOf(MaritalStatus.Married) .WithPrimaryJobOf("Software Developer") .WorksAt("Microsoft Ltd", "Pinelands") .EarnsMonthlyIncomeOf(10000M) .WithCellNumberOf("+27", "82", "2824827") .WithHomeNumberOf("+27", "21", "9814402") .WithPostalAddressOf("6 Sinai Close", "Cape Town", "8000") .WithHomeEmailOf("hennie.louw@gmail.com") .Finish(); }
Netflix recommended
And if you’re curious, the repeated mentions of Netflix derive not just from my interest in movies and their curious recommendations but because of the interesting statistical analysis going on behind them, and the fact that I got rid of cable because I felt like I was getting screwed at $60+ per month without any “pay” channels.
[Update: This was written in June of 07. I haven't been involved with Grails, or Rails, much since then, but I do know that the Grails people have been making some great improvements. Of course, the Rails people have been working hard too...]
Graeme Rocher just made a post entitled Grails vs Rails Myth #1: Grails has a fraction of what Rails has to offer
While I totally respect Graeme and the work he’s doing on Grails, after having written a project in it at work I have to say thatďż˝ I think he’s not seeing the forest for the trees. In general I would agree that the component parts that make up Grails are significantly superior to those that make up Rails. Hibernate does kick ActiveRecord’s ass. Spring is incredibly flexible and powerful. But, Grails does, currently, have a fraction of what Rails has to offer. I think in about a year Grails will be pretty close.
The thing is that while Graeme has chosen some truly excellent libraries to built Grails on top of he’s missing the fact that people don’t use Rails because of the capabilities of it’s underlying libraries. In fact, I could care less if Rails uses ActiveRecord, Hibernate, or anything else because they aren’t what makes Rails special. Rails is special because it makes it incredibly easy to build web apps and it wraps the underlying services and extra features in such a way as to make them trivial to use. Grails just feels unfinished and rough compared to Rails. I think that in time Grails is going to be a truly awesome Rails competitor and when it’s made things as easy to do as Rails has, then the underpinnings will really start to be valuable.
But, as Grails stands, I personally feel you have to deal with too much cruft and jump through too many hoops to leverage the potential power. Let me give you a simple example with Hibernate. I wanted to do some custom mappings with one of my grails domain classes (a model for you Rails people), but I couldn’t because as far as I could tell it was an all or nothing proposition. Either you used the nice and easy GORM (Groovy Object Relational Mapping) that came with Grails or you manually mapped everything. If I have to start doing everything manually then what benefit is Grails giving me? It felt like that in many places.
On the topic of languages:
I would be Ruby maniac right now if Ruby didn’t offer only a fraction of what is available in Java. From the reams of web frameworks, to the dozens of persistence engines, to distributed caches, enterprise integration tools and testing frameworks. Java has it all. There is literally a library for everything.
I think you’re conflating two issues Graeme. You should be a Ruby or Java maniac because of what they offer as languages NOT because of how many extra libraries there happen to be for them. That’s like being an artist and saying you’re not in love with using pencils because there are so many more ball point pens in the world. Yes it makes itďż˝ easier to find a tool to draw something with but it doesn’t mean the tool is better, more enjoyable to use, or produces a better result. Also, if you’re making your choice in language based on libraries you’re still using the wrong one because Perl kicks every language’s ass is that department.
I’ve just clicked send on my letter of resignation. Doing it in person wasn’t an option as my bosses are in NJ and I’m in MA. It was scary as hell to click that button because today was the end of a long stretch of serious mis-communications related to verifying my past employment and a significant portion of my brain is in a state of denial that the job offer is finally finalized. Because a few of you still haven’t heard the details please allow me to explain what has been happening over the past few weeks. This is long and boring to anyone who doesn’t know me personally. But I don’t want to write it out any more times. If you don’t know me and don’t care about the problems I encountered getting my new job please just take this simple piece of advice and then stop reading: ALWAYS keep some paystubs from your past employers. ALWAYS keep your w2s / 1099s and ALWAYS keep in touch with your past managers.
Begin way long story most of you should just skip unless you’re bored or know me.
You see, my new employer uses a company called HireRight to do their past employment verification checks which normally isn’t an issue. The recruiter I was dealing with said that she had a couple failed dot com companies on her resume and it wasn’t a problem for her. HireRight called the one company I had a number for and stuck my social security number into some database for the other two recent employers, other than my current one, and came up with bupkis. When the easy way failed they asked me to provide w2 forms or paystubs from those employers which is where things started going wrong because I don’t have any. Not only haven’t I been keeping them, I generally shred anything I don’t need that has information that could be used to steal my identity (not that it would get anyone very far). I’m not even going to go into how amazingly stupid it is for a company whose job is to prove someone isn’t lying about their work history to prove their own work history. If I was less ethical I would have just photoshopped a fake w2 and faxed it to them. If I had of known the shit that was going to follow I may have anyway…
Now, before you ask… no, I have no fear of being audited. I owe the IRS a fair amount of money and have been dealing with them for a while to pay it back. They are awesome. Yes, you heard me right. The people at the IRS kick ass, and I have talked with a lot of them. I know that they have accurate records on me and if they did randomly audit me things would come out essentially the same as they already are. No I wouldn’t be able to prove anything but they would only be able to charge me for what they’re already charging me for….but all of that is irrelevant to the story I was trying to tell you.
So, after a week of HireRight twiddling their thumbs my new employer decided to take matters into their own hands and asked for a list of people to contact and w2s or paystubs from past employers. I’m not sure why they asked for those as they already knew I didn’t have them from the bs with HireRight but anyway…. Their application form which I had filled out already included the standard space for three references and an indication that at least one should be a manager. So I listed three references one of which was a manager. The first problem was that, for reasons unknown to me they either thought I hadn’t listed a manager or they thought that since the one one person I listed as a manager was mentioned as also being a coworker he was unable to act as a manager reference. I don’t know which and I don’t care. They also said they wanted a second manager’s reference. Which meant I needed to do some serious sleuthing to track down some contact info I didn’t have.
The next problem was that when they contacted Autonomy about my employment at Virage (a company they bought). Autonomy claimed they had no record of me even though I was definitely on the Autonomy payroll for a while. I think they probably talked to the wrong office but I’ve been in contact with the correct office and I can’t get a response out of them either confirming or denying my having worked there. They also called IBM, who I had indicated had bought a company I worked at called iPhrase. IBM claimed they had no record of me either but I was never on IBM payroll and this didn’t actually surprise me too much. This is pointed out to me and everyone agreed that this was an issue that had to be addressed.
I pointed out that two of my references were coworkers at Virage / Autonomy and that if they trusted them to be truthful about their experiences working with me it logically stood to reason that they trusted them to be truthful about the fact that I actually did work with them and thus they had two points of verification of my employment their even though neither were “official” whatever “official” is in this context. I offered them the contact information of a coworker at iPhrase / IBM as a form of verification there and politely suggested that I would kick Autonomy’s ass and see what I could do about IBM.
They then called my references which was fine until they talked to the person I marked as a manager. You see I said he was my manager, and separately I said he was a coworker at Virage and could confirm I worked there. They, understandably, combined the two data points and assumed he was my manager at Virage. So they asked him, “Were you Kate’s manager at Virage?” to which my friend honestly replied “no”…. They didn’t think to ask him if he was my manager anywhere else and he assumed the conversation would just get around to that point later, but, alas, it did not.
I then received a letter saying, essentially, “Why did you claim someone was your manager who wasn’t and why don’t the companies you claimed to have worked for have any record of you?”…. THAT was the start of a VERY stressful day for me. Let’s summarize shall we?
Two companies claim they have no record of me
I have no w2 or pay stubs proving that they’re wrong.
The person I claimed was my manager told them he wasn’t.
Insert hyperventalation and depression here. “There is no way I’m getting this job.” I think to myself. I wouldn’t hire me with that list.
I wrote them a letter explaining about his being a manager and asked him to e-mail them a note explaining the situation in terms of his conversation with them. I suggested that if we could get to a point where everything was approved except needing one more manager reference I’d happily call up my former manager at my current employer but was hesitant to do so because he still comes into the office one a month and I didn’t want it getting back to them. Given, I think if I asked him he wouldn’t mention anything but I’d feel like crap once a month when he stops by to grab mail and shoot the breeze with us knowing that we both knew I wanted to leave but that my fellow coder in the office didn’t. I also attempted to point out that in the worst case scenario MA was an employee at will state and as such they wouldn’t be stuck with me if it turned out I was full of shit. Apparently I came off as preachy / snotty / something I wasn’t aiming for.
As luck would have it my friend from iPhrase knew how to get a hold of iPhrase’s Director of Finance and even better, he remembered me! [Chris I SO owe you.] He offered to talk to my new employer and explain that IBM only bought iPhrase’s assets not the company. So IBM had absolutely no reason to have any record of me. Furthermore iPhrase doesn’t even exist as a shell company. I have a feeling he said something else convincing because my new manager’s conversation with him seems to have been what turned the tide. Then I finally got a hold of my manager at iPhrase who was willing to be act as another manager reference and was obviously a person of authority to confirm that I actually worked there. I’m not sure if they ended up talking with him or not.
The new tally stood at:
Two companies claiming they have no record of me
One we now have an explanation for and two people (one the Director of Finance) willing to attest to my having worked there.
One who we now have three people, one of which was my manager, willing to attest to my having worked there.
I still have no pay stubs or w2s
The person I claimed was a manager has been able to convince them, truthfully, that even though he wasn’t my manager at Virage he really was my manager at other places. He actually remembered one I had forgotten. I’ve known him for 17 years and have worked over, under, and beside him on many occasions.
It’s still not as glowing as you’d like but if you look at it logically it’s reasonable to believe that I actually worked where I claimed I did.
Today I received an e-mail saying they had the “Green Light” to hire me. I’ll be starting on the 2nd. I responded with:
A) Holy Crap!B) Holy Crap!C) *checks for solar flares*D) (see A & B)
I also let them know how thankful I was that they were willing to stick with me and hire me after all that bullshit. I recognize that they are taking a bit of a chance. Tim, Catherine, anyone else who was involved: THANK YOU!! From the bottom of my heart.
The downside is that I’ve obviously started this new adventure on the wrong foot. The upside is they’re getting someone absolutely determined to prove her worth and that they didn’t make the wrong decision.
I am ecstatic. I am thrilled. I am absolutely bouncing in anticipation of this new position. The challenge I’ll be helping to tackle really has my mind buzzing. My new manager has known from the beginning what my major concerns are and how I feel about the process of managing software. And as if that wasn’t good enough my new employer is a fifteen minute stroll from my house, I will actually be paid a decent wage, and every developer there gets their choice of mac or pc laptop in addition to a nicely decked out desktop.
No, I won’t tell you what I’m going to be working on. It’s a secret. And I’m going to avoid mentioning my new employers name for a while because I’m a cautious bitch.
To anyone at my new employer who may be reading this: HOLY FUCK! I AM REALLY EXCITED TO BE WORKING WITH YOU AND I CAN’T WAIT TO START.
P.S. I am still going to track down my records at Autonomy because I may need them in the future and it’s bullshit that they claimed I hadn’t worked for them.
O’Reilly has just agreet to assign
…the full copyright in the book “Perl 6 and Parrot Essentials” to The Perl Foundation. The text is out-of-date, but can be updated much more rapidly than it can be rewritten from scratch.
Three cheers for O’Reilly. I wish more publishers would stop being so damn stupid when it comes to the copyright on old books that they have no intention of reprinting. Especially geek books which are frequently outdated and no-one would want them if they were reprinted (not rewritten).