I started a new job in March at the Australian Bureau of Meteorology. It is a software engineer role and I'm part of a team responsible for maintenance and on-going development of software used by meteorologists to forecast tropical cyclones (see here).
As part of my burn in, I had the opportunity to spend most of a week in the Brisbane tropical cyclone warning center while tropic cyclone Ului (ooh-lewie) approached the Queensland coast. It was an amazing experience where I sat on the shoulder of a forecaster for 4 days, and was exposed to both the forecast process and how our software is used operationally.
It is a big change for me. My last job was primarily R&D and developing experimental prototypes, whereas before that I was focused on research. Not only has it been a number of years since I've worked on operational software systems, but I've gone from a sector interested in killing of people (kind of) with defence work, to a sector focused on saving them. I didn't think it would affect me, but it has. I feel good coming to work in the morning, knowing that I can make the life of a forecaster a fraction easier (or a lot harder if I screw up!), maybe helping them do their job better.
Day-to-day I'm working on a large-ish, 10y/o Java codebase for a desktop app that talks to network resources. The team is focused on best practices toward being a flagship project within the organisation (which it seems it already is). Our team does great things like follow the Java Look and Feel Design Guidelines, code review before check-in, and open feature/bug/change discussions. The best part is the strong user or user-experience focus. Sounds obvious, but in this field it is all too easy to focus on things the user does not see, like the technology or the beauty of the code or its architecture.
It is a solid piece of software managed by some great process, although I've been thinking hard about how to improve things further. Some ideas I've been playing around with in my down-time include:
- Automated GUI testing (Swing): I want to see where things are at with intelligently testing the app from the GUI. Likely with careful use of mock objects rather than robots that click screen coordinates. I need some ideas of what is good in this space! UISpec4J? Swing Extreme Testing? SwingUnit?
- Automated unit testing: The codebase was not written with automated unit testing in mind. Specifically, a liberal use of private access modifier and tight coupling of model and view. There are a handful of JUnit tests and I endeavor to use TDD for all new changes I make, writing unit tests for code before I make changes to help understand it. The test suite is growing slowly but has a long way to go.
- Automated regression testing: Tests and Builds are done by hand on a random team-members workstation, which works fine. Having a commit hook run automated regression tests would be nice, but having an automated test and build server would be even better.
- Formalized system tests: Much of the system must be regression tested from the GUI, the old fashioned way. We have really high-level scripts to follow, but I'd love to have much more detailed version that could be followed by a non-developer. Something a-kin to a user acceptance test with really high system coverage and priorities (paths) for when time is tight.
- Information gathering using Aspects: I have been playing with the idea of using Aspects in my development environment to help understand parts of the code (tracing across threads). This might also be useful for information gathering on a crash or failure, either operationally or in development. Because of the extensive use of restrictive access modifiers (making traditional unit testing hard) I am thinking about using aspects to inject access to functionality for testing without affecting the operational releases.
- Instrumenting with JMX: It is very easy to monitor the memory and threading behaviour of an application using jconsole, and I've found the results interesting. I think instrumenting the app with Java Management Extensions is a little overkill given it is a desktop application, but I'm noodling the idea around anyway.
I'm having fun, the team is smart and capable, I'm learning, and the work feels important.


