Tuesday, June 14, 2005
It (sort of) just works!
Anyway, I'm showing my age by saying it's 19 years since I last had a Mac, so I knew things would have changed quite a bit in the meantime. I've been reading 'Mac OS X The Missing Manual' while waiting for my machine to arrive so I already had some of the keyboard shortcuts down before I had the box open. Which brings me to the first of my observations about the oft-repeated cries of "It just works" by the MacCult members...don't get me wrong, this little baby is a beautiful thing, but in the interests of full disclosure, I thought I'd jot down my notes on the switching experience...
Getting the machine delivered was something Apple found quite challenging. I ordered the PowerBook, MS Office, iWork, .mac and Logic Express, and they got off to a bad start by shipping the software individually so that a couple of times when the courier's arrival at my house found nobody at home, they went away until we called them and could commit to waiting at home for a full day before they'd deliver. Not so bad for a single delivery, but when the order is part-shipped in four separate trips, this gets a bit old. Of course the software was no use without the machine, which didn't turn up at all. Problem was, the online order status page showed it as having been shipped many days ago. Several calls to the courier and Apple finally led to the discovery that the courier had returned it to Apple because the exterior box was slightly damaged in transit. Still no drama, except that Apple seemed to not have a process to keep it moving. I had to call them multiple times to get multiple people to find the box and ship it to me after testing that the machine was OK. Very annoying.
The machine arrived last Friday and with sweaty palms I fired it up. The warm, welcoming and soothing setup process came to a shuddering halt at the wireless network setup screen. No matter what I did, I could not get it to connect to my network. Now I know my 128-bit WEP key off by heart, so this should not be hard. Eventually I gave up in disgust and told it I didn't have a network at all. When I got into the OS proper, I found I had extra options, including to change its default WEP key size of 40 bits to the 128 I needed. Up and running immediately, but obviously unimpressed with the unnecessary dumbing down of the setup program.
A little later on, I cracked open my iWork 05 disc and stuck it in. Lo and behold, the machine refused to install the software because a later version was already installed on the machine. So I go hunting and find a trial version of iWork, which I start and am annoyed to find there is no 'enter the serial number from your boxed copy you just brought home from the store and I'll start working for you' option. So I drag the application to the trash, since that's what book said was all that was needed to uninstall an application. No dice. A call to a Mac buddy and a little Spotlight magic later and I find a couple of files in the /Library/Receipts folder, which has something to do with the auto-update feature for the software. Killing off the files and now I can install my software. This is software I bought with the machine, you realise. And the machine won't let me install it. This is not what I call 'It just works'
The rest of my installs go pretty much according to plan (after Office downloads the 50Mb of updates needed to actually get it to run properly). The only other disappointment was the Logic Express has not had the latest UI goodness like the rest of the apps that sport the Apple logo. They've done the box up nice, but the app must be one of those 'carbonised' ones they talk about.
Of course, before I could really start using the apps, I had to sort out the accessibility options. Being a visually impaired person, one of the things that tipped me to considering the Mac was the built in accessibility features, particularly the new VoiceOver software that speaks the UI to you as you use the machine. Annoying as all get out to anyone standing nearby, but pretty darn useful for me. In fact, as I type this, it's reading each word as I go. Overall, the software is good, and I can save the money I'd normally have to spend getting set up with specialist software, so I'm happy about that. It's got a few minor issues like jumping around a little crazily when the screen is magnified and the focus shifts, and not reading full paragraphs of text in Safari if they contain a (gasp!) hyperlink, but not too bad at all.
Things really started to crank when I got my head around expose, spotlight and some of the apps that come with it. iMovie is awesome in its elegance and simplicity and speed (I talk as someone who purchased Pinnacle video editing software for Windows) and iPhoto blew me away when I imported my six years worth of photos from its home in a nicely structured directory, and iPhoto turned the directory names into keywords that I can search, so 'Antonia's Wedding' instantly finds all the right pics. Awesome.
I find I'm not as productive when typing and editing text because I don't know all the keyboard shortcuts for selecting a word or a paragraph, but that will come with practice. It is true what they say that it just feels solid, and having a large number of apps open doesn't seem to have the same drag effect as it does in Windows. Now I just have to figure out how to replace all the apps I rely on like The Brain and Microsoft Money. I'm not in a great hurry as I invested in Virtual PC to ease the transition. I haven't actually used it yet, as I'm trying to just feel the vibe for now. And I must say it feels pretty gooood. I look forward to being snobbish and dismissive of my Windows colleagues very soon.
Sunday, May 15, 2005
Too busy to blog
Having finally succumbed to the weight of my geek buddies buying Macs, I've just ordered a new Powerbook, so I reckon I'll be posting a bit about the experience. I've had to buy a copy of Virtual PC to ease the switch, but I'd like to retire all my Windows apps if I can.
Sunday, March 6, 2005
A couple of views on coupling
"It is important to constrain relationships as much as possible. A bidirectional association means that both objects can be understood only together. When application requirements do not call for traversal in both directions, adding a traversal direction reduces interdependence and simplifies the design. Understanding the domain may reveal a natural directional bias."
...and here's what Gavin King and Christian Bauer have to say on the same subject:
"Good uses for unidirectional one-to-many associations are uncommon in practice, and we don�t
have one in our auction application. You may remember that we started with the
Item and Bid mapping in chapter 3, making it first unidirectional, but we quickly
introduced the other side of the mapping."
So I agree with Eric, but I'm using Hibernate. Things that make you go hmmmm....
Saturday, January 8, 2005
A new brain for Christmas
A colleague showed me the brain a year or so ago, and I used it sporadically, finding it particularly useful when triaging ideas arriving rapidly and randomly, like in requirements gathering workshops. It works really well in this kind of environment, where a little bit of thought association goes a long way. But when I noticed that a new version had come out, I thought I'd get it and this time (gasp!) I actually read the manual. What a difference that makes, I must say. Now I know the hot keys to make navigation and construction easier, and I know how to make 'thoughts' refer to files, folders and web sites, I'll be darned if it isn't a fantastic way to organise your stuff. Within a day or so of mostly input, I started to get some benefit back in rapid access to whatever I was thinking about, and was surprised at how limiting and pervasive the whole hierarchical file structure we're trained in is and how much it affects my productivity.
The brain has a very simple model of parent, child and 'jump' connections between thoughts. You can have any number of each type of link (actually there is an arbitrary limit which is kind of weird, but it's enough for my purposes) and restructuring them is simple. That's really all there is to it, and like most great ideas, that's all there needs to be.
Here's a screenshot of my brain when I'm thinking about joodi. You'll see 'parent' thoughts above the central thought, 'child' thoughts below, 'jump' thoughts to the left and siblings to the right. The funky way the window reorganises itself when you move between thoughts is worth seeing, so go get it and have a play if you're interested.
Wednesday, December 22, 2004
Taste-Driven Development
Having used Test-Driven Development for several years now, I am as convinced as I have ever been of its benefits in producing high quality maintainable code. One thing that bothers me, though, is that TDD itself provides no forces to ensure that the small pieces you build are assembled together into the higher-order structures you intended. For example, you can write a clean, concise fully tested set of classes such that your domain model is directly accessing your custom tags for your web app. Of course nobody interested enough in software to read this would ever do such a thing, but the point remains: with the promiscuous coupling encouraged by IDE's that will helpfully import any class from anywhere without requiring you to think whether this violates good taste in the form of layering, abstraction or anything else, we seem to be constantly having to fight against randomly coupled internal workings in good-sized systems.
So I find I'm constantly looking for ways to do what we do at the class level with TDD and do it at the package/component level; that is, allow the good taste desired in the design to be formally expressed and tested with every build. Developers who aren't up to speed yet on the complexities of the system they're working on would be protected from violating its conventions, and the emergent design can be allowed to flourish in a controlled way. On our current project we use a few things to help, such as simian, jdepend, ydoc, lots of checkstyle checks aimed at code quality and the usual test coverage stuff. But a few of us think that what the world really needs is yet another open source java development tool. Oh, no, you say, not another one. Yes, I'm afraid, it's another one. But this one is different - this one uses a business rule engine (drools) to allow you to declare in a text file your idea of good taste and enforce it for your code base. This one even has a user guide. No, seriously. So if design is your bag, have a look at joodi and let me know what you think. It only has a few rules in it at the moment, so it's not overly complicated.
Oh, by the way, if you think the java runtime itself would show good taste, check out what joodi has to say about rt.jar in the sample reports section of the user guide...you might be surprised!
Here's an example rule from the joodi rule file. This one expresses the simple good taste that cyclic package dependence is bad. It's kind of cryptic at first glance, but it basically says that if there exists a namespace (i.e. a java package) that depends on itself (dependence being part of the joodi fact model when your code is analysed), then create a notification including the cause of the problem so that the report provides full traceability for each notification produced. Using joodi is pretty much down to writing rules like this that express what good taste means to you and your project. Welcome to Taste-Driven Development!
<rule name="Cyclic Namespace Dependence Is Bad">
<parameter identifier="namespace">
<java:class>Namespace</java:class>
</parameter>
<java:condition>
namespace.dependsOnNamespace(namespace) != null
</java:condition>
<java:consequence>
drools.assertObject(new CyclicNamespaceUseNotification(namespace.dependsOnNamespace(namespace)));
</java:consequence>
</rule>
Friday, December 10, 2004
Agile Requirements
Sunday, November 21, 2004
Re-routing CVS repositories
find -name Root -exec sed -i.bak -e 's:/old/path:/new/path:' {} \;. You will also need to be careful if you use a Windows CVS server like CVSNT, since using the ':' as the sed separator will require you to escape the colon in your repository path if you have one. By the way, this will make a backup of each Root file called Root.bak, just in case you don't trust it (and why should you...:P)