Monthly Archive for September, 2005

FedEx day results

(Last post tonight, I swear!)

The FedEx day today was pretty cool. Jens and I worked on polishing up Mike's calendar macro, and I'm proud to say it's available now. Unfortunately, we spent a good chunk of the day trying to get the AJAX responses formatted correctly across a whole bunch of actions (ick), so we didn't get as much as we would have liked done. It's a bit rough around the edges, and has limited functionality, but it's getting there. If I have time in the future, it's definitely something I'd like to pursue. The AJAX used in it is also quite hacky. I looked into wrapping DWR around it, but it wouldn't work with the plugin system we're using (no way to dynamically load the DWR beans from the plugins, as far as I can tell), which would have made implementing it SO much easier.

We had a presentation on a number of the other tasks for the day, and I must say there were some REALLY cool ideas that came out of it… if any of them end up being released, it'd be great. :)

UPDATE: Jonathan Nolen has posted about his FedEx Day, all the way over in San Francisco. I have no idea what he was working on, but it seems like he had fun!

“Avoiding Copland 2010″

John Siracusa has initiated an interesting discussion about automatic memory-management vs Cocoa's retain/release system… I can see the arguments for both sides.

It's handy in Java to not have to worry about releasing objects after using them. It's also neat in Objective-C/Cocoa, at times, as you can *almost* have the best of both worlds with NSAutoreleasePools ("autoreleased" objects are collated into the pool, and either released by the application at certain times, or when you release a pool you created) and retain/release methods. It's also neat when writing a for loop dealing with lots of data, to be able to say "I definitely don't want this hanging around in memory any more! Get rid of it!", without having to wait for the garbage collector to pick it up (and the memory usage going up in the process).

Would automatic memory-management be useful? Sure. I'd spend less time making sure I'm properly retaining/releasing objects, but I'm not going to lose any sleep over it (actually… maybe I am, given the time I'm writing this post). The Cocoa (and related APIs) are great to use, and if I have to put up with "semi-automatic" memory management, then so be it!

“The Wall of Death”

Charles has written about the Confluence team's "Wall of Death", which is currently in force. I agree that it's an excellent way to focus attention and convey progress towards the next release, although I've probably taken a bit too long on some of my tasks. :)

On Unit Testing…

So Wil Shipley's post a few days ago about the merits (or lack thereof) of unit testing has enraged quite a few people.

Looking at the comments, there's a bunch of people that agree with Wil's reasoning on face value ("Yeah! Unit testing sucks! It takes up so much time!"), but then you have others who disagree (to an extent). The most enlightening post I've seen on the topic is by Bill Bumgarner, who notes that unit testing was used by the team developing Core Data to make sure the code adhered to the specification (or expected behaviour), as well as preventing regressions when bugs were fixed.

As has been pointed out by many, unit testing is most useful for application "infrastructure", and, with my limited experience, I would tend to agree. Unit testing of the classes that directly handle user actions usually doesn't make sense. However, at the foundation classes, it does. In the Confluence team at Atlassian, we write unit tests (although probably not as often as we should!) for many of the base classes to ensure that they behave as expected. The advantage of this is that should the implementation change, we can run the unit tests and make sure the code behaves as we expect it to! Granted, this is an application deployed over the web, but the same principles can be applied to an application with a GUI on the Mac.

When developing Connoisseur, I had no idea what unit tests were, and as such there have been no tests. Recently, while re-writing some of the parsers, I decided to write tests to chuck recipes at the application and make sure they're parsed correctly (or to an acceptable degree - nothing's perfect). The advantage of this is that if I made a change in the code that stopped the parser from interpreting a certain type of recipe, I would know about it. It took a while to do, but I believe it was time well spent, as I can now determine when there are regressions in the quality of the various recipe parsers, automatically.

Something which Wil didn't mention is automated/functional testing. We use this heavily in the Confluence team (and part of my work has been to write more test cases), utilising jWebUnit. While unit testing is handy, I can more readily see the benefits of using automated acceptance testing (at least for a web application). Over the past two days, I've been re-writing one of the default macros to add support for a feature in the next release. Obviously, backwards-compatibility with the old version of the macro is essential, so I wrote a bunch of test cases that would cover most areas, including testing different parameter settings, permissions, errors, etc. Had I done this manually, actually implementing the new version (and making sure it worked) would have taken forever.

Things on the "normal" application side are a bit different. With jWebUnit, you can simply inspect the HTML source and make sure such and such link is present, some other text isn't present, and so on. With a traditional application, how to you determine that the correct entries are in a table, and that the correct sheet with the correct text appears? One solution I've seen is Eggplant, which looks great for doing such testing, but costs a fair amount (let's just say a one-user license is a little bit more than the most expensive version of Confluence…), and neither Mat nor I are prepared to spend that much at the moment. So automated acceptance testing is out of the picture, for now.

However, as Wil said, there are other forms of testing that are essential to product development, such as user/beta testing. Ideally, the development process could benefit from the use of unit, acceptance AND user testing, to effectively eradicate a large proportion of bugs in the program. This is something that has been lacking in the last few releases of iPodRip and Connoisseur, and something we're working on for the future.

Phew. What a rant. Basically, unit testing has its merits, but should be used in conjunction with user/beta testing and (ideally) acceptance/functional testing.

FedEx Day Tomorrow!

It has been decreed by the powers that be (you know who you are) that tomorrow is going to be a FedEx Day at Atlassian. It means we get to work on all the cool stuff we've wanted to do, but haven't been able to fit into the development cycle. :)

There are some really neat ideas in the list we have, but one in particular has caught my eye. Implementing it would be awesome (but not something that could be done in one day).

Mmm… souffle

Lucy and I treated ourselves to dessert at Bistro Moncur last night… and darn was it good.

We came primarily to have their souffle (in this case, a rhubarb one), and were recommended the chocolate and hazelnut fondant, and they were both extremely tasty! To top it off, the service was great - the waitress that served us was friendly and enthusiatic; something you don't always see.

OmniWeb-style tabs in Safari

An update for the SafariStand plugin has been released today, which allows you to have thumbnail tabs (like those in OmniWeb) in Safari. Yay!

Thumbnail sidebar tabs in Safari

Mmm… iPod nano

It's been posted all over the Internet, but Apple replaced the iPod mini line today with the iPod nano. I want one! I'm extremely tempted to plonk down the money (only A$270 for a 2GB with edu discount) for a black one, which I could take to work, instead of lugging my 40GB iPod.

Despite the size and weight, there's one nagging issue: no port-thingy next to the headphone jack (which is now on the bottom). This means you can't use one of the Apple wired remote controls, or the AirClick. Since I haven't bothered to shell out the money for a proper car integration system (nor do I plan to, at least for a while), I wouldn't be able to use a nano in the car. Dammit.

Minus four teeth and a little less wise…

So I had the wonderful experience of having four wisdom teeth ripped out of my mouth on Tuesday… Luckily, I was given a general anaesthetic (which took about 5 seconds to send me happily away to sleep), and haven't had a whole lot of pain.

Needless to say, I now look like a bit of a chipmunk, as my jaw has swelled a bit. Fun!

On Hurricane Katrina

What has happened in New Orleans (and along the Gulf of Mexico) is truly a disaster. The fact that not everyone was able to be evacuated, and the sluggishness of the government to provide supplies and assistance only exacerbates the situation.

The thing that I find most intriguing about this is what is happening to those left in New Orleans. Without supplies, people have started looting shops, assaulting and killing each other, as well as attacking those trying to help. Perhaps even worse is that people sheltering in the Superdome have been subjected to rape, violence and murder.

Contrast this to the aftermath of the December 2004 tsunamis, which affected Indonesia, India and Sri Lanka (among others). I'm sure there was violence and some disturbance, but it appears those affected simply got on with rebuilding their lives.

Isn't it interesting that when THE most "civilised" country in the world is faced with a crisis and the support infrastructure is removed, every ounce of civilised behaviour dissipates, while in the "developing" world, people rebuild and get on with their lives?




Creative Commons Attribution-NonCommercial-ShareAlike 2.5 Australia
Creative Commons Attribution-NonCommercial-ShareAlike 2.5 Australia