Sunday, 12 December 2010

Google Reading Level

A recent useful feature that I have seen added to Google search is part of the Advanced Search criteria. It filters by reading level. This level has been determined by Google in some magical way (yes, I will read more later) and at the moment only applies to English pages.



My main use for this is when searching for technical references, when I don't want to find the "did you forget to turn the power on?" solution or description.


When you search, you will see the break up of different pages, at their reading levels.

Parking Lot Build Lights

In software development, we talk about making the process of development as visible as possible. Be it by metrics graphing the progress of a project; Constant and clear communications; and visual indicators available to all who require or care about the state of a system.

Recently, I saw this same concept in place at the Westfield mall car park in Bondi Junction, NSW.

Each parking space had a light that would display either Red (taken), Green (available) or Blue (disabled space). Each camera contains a camera pointing at the car park.

After thorough testing, my sister and I discovered that a person can not make a space occupied by standing in it but a trolley will set off the "taken space" red light.

On reversing, the space becomes vacant and displays a green light as soon as the car has backed out far enough to no longer be visible to the camera.


When you drive in to the car park, you are told how many spaces are available currently, on each level. When you get to the level, it is quite easy to spot the available spaces by the highly visible green light.


This is the first time that I have been to Bondi Junction Westfield and not been circling to find a car park, behind a dozen other driver shoppers.


Yes, a picture is worth a thousand words and it seems that goes for a single glance to our brains. Without any explanation, people worked out what the colours meant and found parking spaces easily and quickly.

There is no doubt this system would have cost a lot for Westfield but I congratulate on solving the parking situation weeks before Christmas 2010, in an effective and simple way. Thank you for communicating with us. Great work Park Assist!

Sunday, 14 November 2010

Don't Panic

This is not a new area of discussion for me. You will see that a theme runs through my views on software development. It can be summed up to two simple words and one large exclamation mark: Don't Panic!

There will always be deadlines - be they realistic ones or complete death marches.

There will always be defects - found in testing or left to the point of blowing up in a user's browser.

There will always be uncertainty - from not deciding what colour to paint the bike shed to wondering if you should ever have become a programmer.

If you plan on staying around in the volatile world of software then you are going to have to learn to take a few deep breaths and deal with the problem at hand. Fainting at the slightest sign of a challenge is not going to help you work through that issue. Remember that unless you plan on never waking up from your fainting episode then the problem will be there when you are offered the smelling salts.

Do not become one of those people who stands back and has some other calm person fix your issues. Instead, be the calm one. Be the go to person. When the fit hits the shan, don't join the throng of zombie fearing masses. Step back and remember that you are building software, not searching for weapons of mass destruction. A bit of broken code or integration issues will maybe cost some money or annoy a few customers but nobody will die. It is software and it can be fixed.

Rectifying a situation and solving a problem is important but jumping at it with reactions rather than sanity will not bring peace to you or the issue.

What can you do?

  • Walk away for a minute and get your thoughts together;
  • Don't make changes until you know exactly what the problem is;
  • Find someone to discuss the issue with. Explaining it to others can help you sort through it. They may also see something or know something you can't see through the haze of stress;
  • Let the people who are going to be affected know that their may be an issue and actions are being taken to remedy it; and
  • most importantly, DON'T PANIC!

Friday, 5 November 2010

I'm on Triple J


This afternoon, I was interviewed by Triple J journalist Irene Scott for their program Hack. It was all about founding Girl Geek Dinners Sydney.

The story will be broadcast on Triple J at about 15 minutes in to Hack, which starts at 5:30PM EDST. If you miss it, you can hear stream past shows.

I Need A Job


It's true. After finally having the gap year that I never had, I am looking at working again. Back to join the rat race but this time I'm rested after a year old beach volleyball, Darwin sunshine, my mother's cooking and a lot of relaxing.

When I took that break in November last year, it was for an undetermined amount of time since I was unsure of whether I wanted to come back to IT at all.

To screw up a saying: A holiday is as good as a change and a one year holiday can be the perfect cure to ten years of crazy hours in an insane industry, in a manic city.

In the last year, I have worked on and off as an agile coach, a .NET developer, a Java developer, a Ruby trainer and in pre-sales. You probably aren't that interested in the time I spent selling gorgeous jewellery for my sister or the talents I gained in making the perfect coffee in my stint as a barista.

As a true geek, I never really stopped doing what I do best which is building great software. I wrote an iPad app (hasn't everyone), started playing with Windows Phone 7 and eventually started a business of my own, which is slowly growing.

So why am I looking for a job? Because I want to get back in to building good software for clients who care. It's how my brain works. It's what I do. It has to be something interesting and achieve the my driving goal of building software that helps people do their job and that they want to use.

If you need a good agile .NET developer in Sydney then contact me.

Thursday, 4 November 2010

Take 2 Cygwin a day and call me in the morning


For developers who have never ventured out of their Windows environments and in to the world of UNIX based operating systems (like Linux and Mac OSX), the command line is an often under-utilised tool.

This is quite understandable in the case of the Windows command line that lets you relive your early DOS days. With all the lack of power of DOS, the command line was long ago abandoned for many mouse clicks and maybe once in a while a RUN command that is copied straight off the Internet and into the START->RUN control.

For the uninitiated, who have never dropped back to a command line or shell or who never even started there like us oldies, the commands look like line noise. Amusingly enough, those who were not Bourne from a shell probably do not even know what line noise is. Ahh, the days of whistling along to our high speed 9600 baud modems are long and lost along with bulletin boards and green on black screens. Those days are lost because the world has progressed to the point that you need not listen to the squealing down the phone line or force your eyes to work in a Matrix like world.

The good things haven't gone. The powerful languages that let their engineers create low level code like C and C++ are still around. Even if more and more amazing higher level languages appear, there will always be a place for the land of hardcore programming. They are needed. They are powerful tools. Weapons even. When wielded by good software engineers, great things happen. Of course, you do need the high level languages because who really wants to spend all their time perfecting memory management and automation of the reinvention of the wheel.

The other thing that will never leave us is UNIX land. The beauty and capacity of the UNIX tools will never become obsolete. They have been ported to every new environment to follow UNIX and implemented as APIs wherever possible. To live without these tools is for some developers, like cutting off a limb at the neck. It's a horrid disabled world.

Windows is one of these worlds that lacks the default access to UNIX tools. The DOS command line is not a poor substitute because it's not even in the same league. It's like comparing Java as a programming language to pig latin. It's simply a silly and meaningless comparison.

For those of us (usually .NET devs) who must play in an exclusively Windows world, we have a few ways around it. We either have a non-Windows machine at hand or we use Cygwin. Cygwin is a library that provides POSIX functionality in the Windows environment. You install it on any Windows machine (an install that takes at least four coffees) and it gives a UNIX like environment for Windows. The Cygwin commands look like UNIX commands but are actually wrapping Windows system calls that do a similar thing or have been extended to do so.

There are of course limitations to the scope of Cygwin that are based in the fundamental differences between the Windows and UNIX based operating systems. Pretty much, the foundations aren't the same so only so much can be faked. Often that much is enough to provide a developer with these much needed tools.

Now Cygwin on it's own is a nice little tool and a lovely idea but the serenity comes from all the tools that are built on this basic foundation. There are shells that let you believe you could be using bash; text tools like grep; and much more.

The zealots will kick me and say this is a poor replacement in a bad environment. I tend to agree but it's the best thing out there for us .NET devs. How any developer can live without it, is beyond my understanding.

You'll find Cygwin here.

Have fun.

Tuesday, 26 October 2010

Stop Being Such Bitches


There have been a lot of discussions on this blog about what it feels like for a geek girl in this IT world. I've even covered the topic of what a geek girl is and isn't. This time, I want to tell you one of the worst things about being a geek woman.

It is other women.

You would think that the sisterhood would encourage women to support each other through tough times in a workplace. Women always refer to the "boys network" in a company. We talk about how they look after their crew and make a lot of deals over a beer. Women work at getting in to these circles of blokes to play the game too. Some are successful. Some aren't.

Over and over again, I see women pushing each other down for what seems to be no other reason than to be mean. Women can be more cruel to each other than any man can be to us.

If you'd help out a guy then a woman should be no different. Women should be building a support network in their careers made up of men and other women.

What happened to innate female empathy?

I refuse to push down or even push back at another woman at work. I don't go to work to fight. I go to work to get stuff done. Help me do this or don't. I simply will not play the games of 15 year old school girls. We are passed that.

Sunday, 17 October 2010

Australians Buying Software Online


It may be obvious to all around but I only just worked it out. When you are buying software to be downloaded from the Internet, choose to pay in US dollars. It is legal to pay in any currency you want but with our almost parity in Australia, US$ end up being a lot cheaper.

Last night, I saved $14 on software by choosing to buy via Paypal and opting for US dollar prices over Australian prices.

This goes for anything you buy online, I guess. Software is just famous for being priced at different levels depending on your currency. Let Paypal do your conversion. They are fairer.

Saturday, 16 October 2010

When do you not generalise your code?


At the moment, I'm working on a Silverlight project. The best way to learn a technology is to build something in it. Reading books and blogs and the rest will give you a vibe for what the technology is but only getting your hands dirty will make it real. Real is when you understand the beast and all its tides and moods. You also get to know the elegance of it and where the shine in its soul radiates from. Yes, I'm still talking about Silverlight.

One of the simple tasks in this current project requires me to parse a CSV file. That's easy enough to write on your own but anyone who has written a parser knows that if someone else has built one that does what you want then you should consume theirs. They would have handled all the exceptions and possible gotch-yas. This means I don't have to worry about that and I can get the task done quickly.

In this case, Fast CSV is a common choice in the .NET world. I've used it in the past on and it does what it promises. With the MIT license, the price is right too.

Sounds easy right? Well not totally. For my Silverlight application to consume this library, it must be a compiled as a SIlverlight library. Easy enough - I'll port it. Thing is, this code extensively uses the System.Data namespace and as I found out quickyly, there will be no talking directly to a database from a Silverlight application. That makes complete sense.

After looking in to it, the main use of System.Data is in the use of the IDataReader to stream the CSV file. There is also some DataTable usage. Nothing that couldn't be wrangled to use another stream reader and a generalised Linq table, in it's place.

But then I stopped...

When is porting the library more trouble than it is worth? My task is such a small simple one that I might as well write a custom parser that takes each line of the CSV file that I'm reading via normal file IO and push it straight to my view models for display.

Robustness of the code is an issue but I'll test drive it and keep it simple and neat. It doesn't have to be so general that it caters for every possible situation. It is just for my situation.

In this case, I have decided that a quick CSV parser that exists as a helper class in my project is good enough for this task. It is not just good enough but it's the right choice. Get the job done in a thorough way but don't over engineer the solution because it is the funnest way.

This has been a good learning experience and has solidified my resolve that sometimes you can write code that isn't so gold-plated and generalised and that's ok.

Thursday, 14 October 2010

Unable to start asp.net development server because port [port number] is in use

After a debugging session was stopped abruptly in VS.NET 2010, the error "Unable to start asp.net development server because port [port number] is in use" would appear every time I tried to debug or run the web application.

Restarting Cassini and killing all instances, restarting VS.NET and ultimately kicking Windows did not release the port. When I checked manually, the port was not in use but Visual Studio insisted it was. Changing the port used or auto generating the port to be used did not work around this issue.

This is a Silverlight application but the issue does not seem to be Silverlight specific.

The fastest way to fix this problem was to Remove the web application project from the solution and re-Add it.

Tuesday, 28 September 2010

Start by reading this documentation


There is no bigger buzz kill when starting a new job than that moment when a tree load of written documentation is set before you and you are told to start there.

"Read this to give you an idea of how we work."

That is a ridiculous idea. Reading documentation to find out how people work is about as useful as reciting them a haiku in Japanese, when they first cross the workplace threshold. Actually, the haiku is much less boring.

When I started at Buzz Numbers last week, I was given a computer and a set of short videos to watch. These walked me through the main code solution and discussed different areas in details. They are not only introduction documentation but good refresher resources when you go in to an unknown section of the code.

I was happily coding within an hour of starting work, on my first day. The video docs gave a good push start and an easy reference point for when I asked myself where that thing was again.

Since Buzz Numbers has me sign an NDA on my first day, I won't be sharing any of their video documentation with you. It's not a new idea so there are many examples online of how this can be achieved. Thing is that it's usually big companies with big budgets that are doing this. I work for a start up and they did it without any major cost.

Simple. Inexpensive. Effective.

What more could you ask for? Try this at your workplace if you understand the pain a new starter feels.

Here is an example of Yahoo's YUI video documentation...

Friday, 13 August 2010

Geek Girl - For Better or Worse


Hey Geek Girl, you know your marriage is in trouble when...

0. You look to xkcd for relationship advice;

1. Waiting for a green build sends your heart racing more than seeing your husband;

2. You get more excited in bed at night when you hear emails arrive on your smart phone than when anything else pops up;

3. Comments on your latest blog post elicit more emotion than the man you married;

4. You have defined the majority of your conversation with your spouse as a regular expression punctuated with "uh huh" and "yep, I'm listening";

5. You stop reading his tweet stream and scroll past most of what he says. Before seeing him at home after work, you read the latest tweets so you can fake interest in his day;

6. He gets emoticons more than he get cuddles;

7. You "like" his facebook status without reading what it is and often have to explain that liking a negative one was in fact showing support. Oops;

8. The thought crosses your mind that selling your engagement ring diamond would easily cover a new MacBook Pro, iPad and phone;

9. His handwriting seems to look like line noise.

Saturday, 24 July 2010

Choose Me. Choose Me.


There are all sorts of programs run in large companies these days to help people get through the working year, salary negotiation, conflict resolution and plain old peer support. They can be structured or informal but they are always there. No matter where I work, I set up a network inside and outside of work to make sure that there is a person to vent to; a person to bounce creative ideas off; someone to suggest how to resolve road blocks; etc..

Everyone needs some kind of support network in all aspects of their life. In this case, I am directly referring to the work place. Your job is something that you spend a whole lot of waking hours doing, so you have to make sure you do all that is in your power to make it a good experience. You'll notice I did not say "tolerable experience" because I don't think you should do a job that you don't like. If it is painful then fix it or leave it. Find a place you like to work and keep it that way. Making work a rewarding and enjoyable place to do is part of your full time job. Work at it. Work at doing the actual job well but also work on your relationships, your brand, your reputation and your purpose. It takes effort to do anything well. Make that effort enjoyable by finding a gang to help you negotiate the professional maze.

I would like to offer to be in the network of someone starting out as a software engineer. It doesn't matter how much experience you have or even if we are in the same technology. Female or male - it doesn't matter to me if it doesn't matter to you. If you are in Sydney and would like to build a graph of people who will help you out professionally then please contact me. I mean this on a one to one level.

What do I get out of it? I get to help out someone starting in the same way that so many great professionals stopped and helped me in my early career. I do this for a lot of younger people I have worked with and am sure that they would be happy to be references for me.

Let's start with a conversation about where you are going or where you want to be.

Contact me here by commenting on my blog or @damana on twitter.

Monday, 21 June 2010

How Software Loses My Trust


I have one word for you that is the most important concept in Information Technology: Trust

If users don't trust your product then they won't use it. It doesn't matter how many features you have or how many fancy schmancy algorithms are written in the latest whiz bang technology if a person uses your site and it behaves badly.

When you walk in to a financial institution, they will make it clear that the power of their brand and the price of their stock lies in the confidence their customers have in them. Especially important is the outward facing applications that they have on the Internet. Banks and Insurers are well aware of the importance of this. Even though they are huge mammoth organisations that do not always deal well with the tides of change, they will let that one guiding principal of being reliable and trustworthy guide their software development. This said, I mean mostly the facade of it in the very least. Then be careful what you pretend to be because you might just become that and finance computing is not that bad these days compared to other domains.

Why am I currently going on about trust in online software? Well, it all comes back to my old and true nemesis: Optus. For those of you who don't know the joke of a telecommunications market that we have in Australia, Optus is the second biggest telco in the game. Telstra is the biggest and still dominates since it had all it's infrastructure paid for when it was fully owned by the Federal Government and then privatised to make a quick $buck$. There are global players here like Vodaphone, Virgin Mobile and 3. No matter how innovative the imports try to be, the ruling duopoly holds them back with their market controlling behaviour and terrible customer service.

Recently, I've been led to believe Telstra service has improved but I'll have to wait to experience it again before calling it. As a mobile phone user with Optus, I have the right to throw as much mud as is acceptable, especially after the experience I had today.

This afternoon after 5pm, I received an automated call from Optus informing me that I had failed to pay my last two mobile phone bills for May and June. I was surprised at first and then remembered that I paid them on their website. You create an account on their website when you sign up for your phone account so that you can easily make payments online using your credit card. Over the almost 2 years of my phone contract, I have always paid using their website. It usually takes between 2-3 attempts to get the payment to go through and no matter how many times I ask them to save my credit card details for later use, they never manage to.

Each time I go to pay my bill, I login and go searching for the relevant bill paying screen. Of course one of the main headings is Bills in the left hand menu. Under that is a list of features and not one of them is for paying your bill. You instead have to click on the Bills heading to go to pay your bill. Tricky but I learned that after about 6 months of wanting to commit homicide on any random member of their usability team. Ahh, the delusional assumption that they even have one is still strong in me.

Once the page required to pay my bill is found in the rat's nest that is their website, I re-enter all my card details and choose to pay. You can't choose how much you want to pay. They give you that number and you just pay it. The invoice amount is updated once a month and if you have already paid but it didn't register then they just add it to the next total. I learned to ignore that too. Once I paid twice the amount and they wouldn't even reimburse but instead held it over for my next invoice. Yes, their refused to pay back money that they should never even have taken.

Then I pay until they accept the payment. Like I said, after about 3 tries. They give me a receipt number and my final assumption is that the bill is successfully paid. Actually, that assumption is based on the text on the screen that says something about your bill being successfully paid.

Several months later, an automated dialing machine with a rude message accusing me of being a bad customer who never pays is placed to my mobile phone after working hours.

At least they are consistent but the one thing that Optus does not have is my trust. I lack trust in their billing system, their payment gateway, their phone service and even snigger at their advertising. They DON'T care what I think. I'm stuck in a two year contract with them that promises I'll pay my $83.50 per month for my phone service. Obviously none of that money goes to their IT department. We instead pay for that with blood.

When the time comes to find a new provider for my mobile phone, I'm considering dropping back to tin cans and string. It certainly won't be with Optus because I can't trust them and I don't want a relationship with someone I can't trust.

Tuesday, 1 June 2010

Tuesday, 27 April 2010

C# 4 Last Minute Additions

Update: I'm being very anti-Microsoft at the moment because they make it too expensive for me to get an MSDN license to develop at home. In the past, I've been a big fan but I'm going to defect if they continue down the money or nothing path. Until they stop excluding me from their expensive community, I shall sulk and ridicule them. Please read and have a giggle. It's meant in jest.



I love reading Eric Lippert's blog because he is great at explaining complex ideas in an easy way. That is something severely lacking online. He also dishes the news on my latest reading obsession... C# 4.

They have managed to slip in a few extra features last minute in to the next version of the language. He describes them in more details here. The one's I thought were cute and make the language a little more interesting are the goes to --> and is approached by <-- operators used in loop conditions.

The examples given on his blog show them being used like this:

int x = 10;
// this is read "while x goes to zero"
while (x --> 0)
{
Console.WriteLine("x = {0}", x);
}

int x = 10;
// this is read "while zero is approached by x"
while (0 <-- x) { Console.WriteLine("x = {0}", x); }


Interestingly, when I mentioned the last minute additions to a colleague she commented that she hopes they implemented them properly. In C# 3 they snuck in partial methods and auto-properties which I wouldn't want to live without (although I am in Java-land at the moment).

I'm excited about C# 4. Now I just have to get Microsoft to give me a reasonably priced MSDN license for an individual who isn't a student, a company or a start-up. Market gap.

A recent email I sent to a friend who has started automated testing


Here is a quick email I threw together for a friend who has started writing automated tests and asked if there is a reason to have lots of different kinds of tests covering the same area. Yes, it's simplistic and I'm sure a bunch of ThoughtWorkers would kick me and say it is better explained in other ways but I think this is a good summary. In case it helps others, here it is...



OK, this is the way I structure testing of an application. This works when the tests are written retrospectively or if the application is written in a test driven manner.

There are three types of tests:
  1. Functional tests - UI testing that uses the terms of the users/business. You'll see tools like Selenium with junit/nunit/rspec used at this level. Functional areas of the application are tested in a similar workflow to what I user would use. Happy path comes in here for primary workflows. Deliberate error (validation and business logic) and exception testing at the highest level occur now;
  2. Integration tests - these tests are used when you are plugging all the bits of your system together. Bits can mean layers, components within a layer, or dependencies outside of your system (third party web services, etc...). The point of this is a test interfaces and APIs that are public to the component or application parts. You test input and output in a black box way. Again, with all good data and then causing errors and exceptions;
  3. Unit tests - These tests are the very specific low level tests that check that a unit of functionality is working. This can be at a class level, library or component. You'll see mocking frameworks used here to imitate data sources or connecting systems. At this point, you do not want to be distracted by the possibility of functionality external to this unit causing issues so it doesn't talk to anything and gets all input or directs all output to mocked objects.
The reason for the three layers individually is explained above in each point. The reason you do them together is that with continuous integration and thorough test suites, you can easily track down where an error is occurring and focus in on the area of concern. All these tests should be used together.

This is a starting point and written at a high-level. Ask me if you need it clarified further.

Offline Installers


Most installers available for download online these days, will actually download a a small executable that will download the rest of the required installation files form the Internet as it progresses. If you have a slow connection or are using a proxy then it will often fail.

Do not fret.

Usually, there will be an option to use what is called an Offline Installer. It will be accessible from another location of the installer's website. If it isn't obvious and easy to find then search for application installer offline in your favourite search engine.

For example: Here is the online installer for Chrome from Google and the here is the offline one.

This may seem too simple to share but I've encountered several people who have given up trying to install something because it failed through the online version.

Friday, 9 April 2010

Restart Windows from the command line


If you don't have access to restart a Windows machine (maybe you've remoted in) then here is the cheeky way to do it from the command line...

> shutdown -r -f -t 01

Where...

  • -r is Restart (you can use -s for a straight Shutdown and -h for Hibernate);
  • -f is Force; and
  • -t is Timelapse with a 01 second delay.
If you want to abort the shutdown use...

> shutdown -a

Wednesday, 24 March 2010

Ada Lovelace Day: Lindsay Ratcliffe


Today is Ada Lovelace Day. It is a day to highlight the accomplishments of women in technology. In particular, to shine a light on a woman who has influenced your life personally.

This post is being written on the day it is due because I had to think about it a lot. It certainly isn't hard to find someone to name and praise because I know so many fabulous females in computing. A shared post on five different geek girls crossed my mind but in the end, I knew it had to be about one person who truly deserved the dedication.

The last 12 months has been an amazing journey and like all good adventures, you encounter interesting characters along the way. Some stay around for a while and others are just meant to come in for a spell and help character development. This is one of those players.

Her name is Lindsay Ratcliffe.

There have been many amazing high-achieving women in my career who have taken me under their wing and taught me how to improve as a professional. Lindsay taught me to improve as a person and let all the benefits of that seep in to other parts of my life, including the professional side.

She did this by supporting everyone around her, in her working environment. It was not a motherly thing or done in a condescending way. She has a magic that makes you feel OK to be who you are. By showing respect and consideration to others, she empowers them.

At ThoughtWorks, there are many impressive alpha-females who you can't help but be affected by. The majority of the time, that was in a positive way. Unfortunately like most women in the workplace, they compete against each other. I see men compete a lot but also find ways to work together. I see women compete with men and also work well with them. I don't often see women at the top of their game work well with other women, a lot of the time. Things are changing but they are also staying the same.

When my star shone brightest in the last year, people flocked to my side to bask in the radiance. When it faded to a sputter, only the secure women stayed around. Lindsay simply brought her glow in to back me up. She was kind, inspiring, brilliant and wise when everything around me was falling apart.

She taught me to be kind to myself and not be my own worst critic, as perfectionists often are. She told me that you don't have to be invincible but just need to appear that way. She insisted I stop lying to myself and fix the issues I had in life. She dragged herself out when 8 months pregnant and made sure I survived the hardest days.

I won't use words like selfless and others that are used to describe women. Instead I like to think of her as solid, wise, at peace with herself, smart, charming and organised. She also lives up to what she says she believes.

Since meeting Lindsay, I have not wanted to be her. That was my normal reaction to people I respected and was in awe of. Instead, I want to be me but would love to make others feel the way she makes people feel. Make it ok for people to be who they are, at least around me. Respect everyone for their magic and talent. Celebrate and rejoice at how good life is and be at peace with myself.

I don't want to be her. I want to be just like Lindsay Ratcliffe, while completely being me.

Saturday, 20 March 2010

Would you like fries with that?


One in ten.

That's how many managers I have worked with who have made me better at my job just by working for them. There were three things about them that made me a better employee...


They are direct

If they wanted something from me then they asked me clearly and explained the reasons why. That could include doing things to gain brownie points with clients; for political reasons inside an organisation; for urgency; or for winning or losing a battle that needed to be won or lost.

Most developers are not political animals. In fact, trying to make us that works the other way. We don't have the same drives as the fox in the work place. Gaining power and status doesn't attract us to the work we do. Developers who like that usually end up as managers or start calling themselves Architects. No, software engineers chose to work in this profession because creating something from nothing is what we enjoy doing. Bringing order to chaos. Finding patterns in a mess of requirements. Deconstructing an unfathomable problem domain and rebuilding it in technology.

Don't get me wrong, we aren't stupid or disconnected from the games played in the workplace. Most of us would rather be but we are aware the these dynamics exist and that no matter how illogical it is, we are affected by them. We often see them as an necessary evil that must be dealt with to get stuff out of our way so that real stuff can be achieved.

With that in mind, when the political manoeuvrings draw us in we would rather you just tell us what you need us to do to make them go away. I have had many a management type ask me what it is ok to tell the team. My answer is almost always the same: tell them the truth.

Manipulation to get us to do what you want is only going to come across as condescending and kinda stupid (on the part of the manager). We are grown ups. Be straight up with why and how and unless it's illegal or completely immoral then you will find that we are on your side and do want to help make things happen.


They remove blockers

What I do well, is build things. In my world it involves talking to a framework on top of an operating system, running on hardware in a controlled little utopia that (in the best case) helps someone do their job better or be serviced at a higher level. People talk of efficiency and cost-benefit and rapid delivery and usability. That's a lot of blah blah blah to me most of the time. I want what I produce to make a positive difference in the world. When I walk off this client site, it should be in a better state than when I arrived. Be that for the workers internally or customers and external agents. Whoever uses the system should be benefiting from the man(a) hours I put in to it.

Those hours are the hours I bill the client that add up to the how much the project costs and how long it takes. I'm a cog in a complex system of other cogs including other software developers, managers, analysts, business people, users, testers, and dozens of others who care about getting the project out the door. What I need from a manager is to not know what all the other cogs are going through, except in summary. I need to work with a person who can hear me when I identify something that is slowing my progress and use whatever means they have to remove that blocker.

The best managers I have every worked with removed those blockers systematically and efficiently. They heard the pain points we were experiencing and took them seriously. They did not pacify with promises of actions but instead did all they could to get us moving again or at least explain what was holding us up. Information will set you free. Keeping information flowing in to a team and out of it, then on to whoever else needs it or can use it to keep us moving forward is the key to being a good manager or leader of a team.

People who pacify the team and cushion the message to the client are only prolonging the moment until the truth bites and the pain bubbles up to the surface. It's just like patting someone with a dislocated shoulder on the head and saying "I know it hurts. I'll get something for that right away" and then walking in to the next room and telling the doctor that all the screaming is just the person in the other room, having a pillow fight with a bunch of teenage girls. It doesn't help anyone do their job.

Solve the problem by removing the blocker and keeping the lines of communication open.


They are part of the team

This is the controversial one. The one that I have argued with many technical leads and managers about. They say that to lead, you can not be part of the group. That leading means living outside the organism that follows you on the leash. It means appearing infallible to those above and those below.

A very respected project manager at a recent company I worked at gave me feedback at the end of a project that summed up to this: You can not lead a team and be part of that team because no one will do what you say. She was on her way to becoming a big manager in that company. Management loved her because she was one of them. Of course, she wasn't one of us. One of the consultants that went out there and did the actual work. Nobody trusted her. We all liked her and said she was very organised and did her job well but we didn't want to follow her anywhere. She knew how to be a good project manager but she was never a leader.

A leader doesn't need the authority of another person to lead a group, they need the authority of the group. I did tell her this and she scoffed at it. Interestingly enough, within a month of getting a good promotion she was out drinking with the troops and doing all she could to become one of them. Why? Because bossing someone around only gets you so far. People have to know you understand them and have their best interests at heart or they won't follow you anywhere.

The big thing a manager needs is to be part of the team. Not necessarily mates who go out boozing it up together but someone who suffers their pain and celebrates their triumphs. Someone who knows what coffees they drink or that they don't drink coffee at all. Of course they have to be organised and structured and good with clients but people always forget how important it is to be good with your team as well.


In the end, most of this can be summarised by one important skill... communication.

Tell your team what you want in a clear and direct way with the real reasons behind the request. Listen to the team about what is causing them to slow down and remove those blockers or talk to someone else who can. Get to know your team and let them get to know you. You have to spend a lot of your time with these people so they might as well know why your least favourite alcohol is tequila or that the client drives you nuts too.

Monday, 22 February 2010

Darwin Microsoft User Group


From Microsoft Marty...


We are pleased to kick off the Darwin user group this Wednesday. Fujitsu will be hosting the event at their premises and will be sponsoring dinner (pizza) for the night. So thanks in advance to Martin Geddes and his team.

We have William Cornwill from Microsoft presenting on SharePoint 2010!!! I encourage you to forward this invite on to developers/designers within your organisation.

William Cornwill is a SharePoint Technology Solutions Professional with Microsoft Australia. William is an experienced speaker with over 15 years industry experience with backgrounds in Business Intelligence and Web Content Management. William has worked with Microsoft Australia for 2½ year prior to which he worked for a Melbourne based systems integrator, Strategic Data Management (SDM). William has an MCTS in Microsoft Office SharePoint Server Configuration and has recently attended the SharePoint 2010 Ignite Training for Developer in Singapore.


Wednesday, 10 February 2010

Algorithms


I am truly a geek girl. Today I am happy about replacing the one thing I regret losing in my divorce :o)

Saturday, 6 February 2010

Quack!


Since I am prancing through the playground that is Objective-C at the moment, I'm having to face concepts that have been pushed to the back of my C#'nd mind. Of course, I'm talking pre-C# 4.0 so assume the CLR and compiler are not collaborating to allow any form of duck typing, which is primarily what I'm interested in right now. I also don't count the C# libraries out there that work around the language and sealed classes because IMHO if the language doesn't let me do it then it's all just too much work on top of what I'm already writing. Yes, this even applies to assisted automated testing. Bring on C# 4.0 but until then, let's look at a language that complies... Objective-C.

This came up while looking at mocking in Objective-C and how the language makes it easy, whether you choose to use a mocking framework or implement something quickly yourself (as for how to do that, you'll have to wait until another post). Duck typing makes testing delightful in dynamically typed languages and I want to make sure that the tricks learned while testing in Ruby are not lost to me.

Take a look at some clear and concise code examples of Duck Typing on Wikipedia.

Over a conversation on IM with an ex-colleague, I had to spend quite a lot of time making it clear that a dynamic language does not mean the same thing as dynamic typing in a language. This is an error often made and voiced as if the terms are interchangeable. They are not.

Dynamic typing is when type checking is done at run-time, meaning while the program is executing and not at the time of compilation. The implication is that types are associated with values rather than variables. Run-time dynamism is different to dynamic typing, in that the language does a lot of things at run-time that other languages might do at compile time like adding code, optimising decision paths, extending objects and type checking (dynamic type checking). A dynamic language can have dynamic types but it does not have to.

Now one of the bonuses of this is that the type of an object can be used to make a decision while the program is running, to decide what code should be executed next. This is Duck Typing. The term comes from the idea that if something looks like a duck and quacks like a duck then it is probably a duck. That assumption allows for an instance of an object with the correct accessors or methods to be used without checking first if the object actually is of the right type. Of course, if the object does not have the right characteristics then is will throw a run-time error.

Run-time errors seem to scare people a lot more than I first realised. In a static world, a run-time error usually means that something very bad has happened in your compiled code with respect to resource management or the compiler corrupting the intent of your code. That is scary. Thing is that testing is a great way to check that your code isn't going to blow up unexpectedly, whether your typing is checked statically or not.

If you don't understand duck typing and are from a statically type checked world then you can end up hamstringing yourself by adding meta data to an object that is set and checked to indicate the type of an object. Explicit type checking in this case means you have missed the point and the advantages of the type system you are using. You must unlearn these habits and understand your language to use it correctly. Changing languages is not as simple as changing development environments. It's a mindset change. You as a developer have a responsibility to use your tools in the right way. You can always hammer a screw in to place but it's not necessarily the right way to do it. Maybe use a screwdriver and learn how it works. Many times, you will see a language that is written with the accent of another language and it works and looks almost right but simply isn't. Engineers who go from C# to Java and back will see themselves doing this and smack themselves on the hand when they realise. This is a habit to break.

While playing with Objective-C, I have seen compiler warnings given that won't stop you from running your code but will highlight that the compiler isn't sure that you are sure what you are doing. Explicit type casting will remove these warnings if you have the kind of OCD that doesn't allow you any warnings at all in what will ultimately become production code. For me, the majority of this is in my testing code so I'm more 'laxed than I might usually be.

C# has what is called nominative typing. In other words, you use the name of the object's type to determine what it is. To handle the type you use explicit naming to deal with what is expected. Duck typing allows part of an object's structure to be accessed at run-time to check compatibility. Before C# 4.0, any attempt to duck type sealed classes was shut down by the CLR. There are ways around that involve inheriting from your own interfaces that look similar to other interfaces but this is not sincere enough for me. If you must add these tricks to your code then maybe you are at the point of considering using another language that is more suitable for the job. Luckily for us .NET'ers, we can use a lovely language like C# for our glue and integrate a lot of other funky technologies to do cool stuff. I can't wait to see the next version of the language. Hopefully, the changes are real and not just work-arounds.

In summary, Duck Typing allows a method to use an object as long as the object it expects supports the methods or properties that the method is looking to call. The given object doesn't even have to inherit from the same base or interface. The object does not have to support all methods and properties to be passed into a method.

There is no actual point to this post. It's more a bunch of realisations as I journey from one language to another.

There is much space for misuse and making stuff go bang but that can be said about a lot of dynamic features of languages. You can't take all the power to create beauty away from developers simply because some may shoot themselves in the foot with it.

Dynamism doesn't kill people, people kill people.

Monday, 11 January 2010

No go areas can be gone around


Working in locked-down IT work environments can be frustrating, especially as a developer. We usually find a way around or are able to provide valid productivity or basic functionality reasons to have the rules relaxed for us. As long as I can write and run code, administer most tools required for development and google when I'm stuck then I'm a happy coder.

It is the latter that is most likely to be restricted to the point of insanity. This is the case in my current workplace and in pretty much every bank, insurance company and Government department that I have ever frequented for remuneration.

Why can't I use the Internet at work?

Let me talk to you here about how I work and how I like to work. These are two different things but certainly impact the other. How I work is what makes a Damana tick. How I like to work is what makes a Damana productive in the workplace.

As software engineers, ours is a thinking game. The actual doing does not take much time. If you see your job involving a lot of typing then you are most probably doing it wrong. The majority of my time is taken up with deciding what to do and then implementing it follows as a distant second.

When I say thinking, that doesn't mean reclining with feet on the desk and smoking a cigar, while wearing a dressing gown. No, it simply means that my progress can be broken down as follows...

How I like to Work
  1. Decide which task to work on next [thinking] - Where does the task fit in to the work I'm currently doing or just finished? What is the highest priority at the moment and which task satisfies that? What task will score me the most points with the business? What are the business benefits of this? So on and so on;
  2. Pick up the task [doing] - claim the task in whatever tracking system is used. Read any specs, details or notes associated with the task. Talk to the analyst or business to gain a common understanding of what needs to be achieved;
  3. Look at the code and running application so far to find out where this task fits in to the scheme of things or work out where it will if nothing yet exists. [thinking] - Understanding the context and the requirements is a thinking processing. Scrolling through the code or clicking a few buttons in the front-end doesn't constitute "doing" to me;
  4. Come up with a solution and an approach [thinking] - most problems are solved or have patterns that are used to best solve them. Experience will let you identify them quickly and googling can help you otherwise. This is the point where you can jump to the quickest solution or procrastinate and find the perfect one. My way is to think of a few ways and implement the one that seems the nicest technically and is within the timeframe. Of course, this is all decided knowing that refactoring is available to me in the future;
  5. Deciding how to test what I'm about to build [thinking] - working out how to test something lets you explore your understanding of the problem domain and create an interface to what you are about to build. It helps inner design and in determining how to build only what is needed;
  6. Write tests and code [doing] - this is the typing part;
  7. Show the user/business representative/analyst what you are building as you build it [thinking] - this is thinking as a group (not to be confused with group think);
  8. Merge and deploy [doing] - this can be automated. With a lot of developers on the same project, this can be a problem solving exercise and also involve thinking if bugs or clashes emerge during integration.
This is of course a skeleton view of the process and does change depending on what the task is. The thing is that what I refer to as "thinking" takes up the majority of time. If I was to add percentages to the different steps, I'd allocate 15-20% of that time to "doing" parts.


Why does this have anything to do with my me accessing the Internet?

How I Work

To be clear, I am not a Buddhist monk and really don't understand how I work in all aspects of my life. I'm nowhere near Nirvana but I do have a bloody good idea about what makes me productive at work.

Thinking is a mentally intensive process. It's not even correct to call it a process as that seems to imply some kind of contiguous set of steps. That's not what it is to me. Solving problems and implementing solutions needs to happen in small bursts. Of course, these bursts can follow each other closely or be broken up over different periods of minutes, hours or days. Days are less likely since I work in smaller tasks than would require days. Either way, I have to break that process up so that I don't become mentally exhausted. Breaks are important.

Call it slack. Call it a brain-break. Call it what you will.

Nothing is going to let me work 10 hours in a row doing nothing but thinking. Instead, I need to work in the bursts I talk about. Think-Do-Stop; rinse and repeat. What this means in a work day is that if you _made_me_ put all the thinking and doing together then you'd see me working a 6 hour day and then collapse in a heap. Instead, if I take micro-breaks between the bursts, I can easily produce valuable output in a combined 8-9 hour day, all the time working at a sustainable pace.

Does that mean spending time sitting at my desk with my brain turned off? Not really. Usually my brain-breaks still involve thinking but in a different way to the way I think at work. For me, reading my RSS feeds; sharing knowledge, events and fluff in real-time with friends online ; and turning around and talking about the front of the newspaper with my office mate let's me recharge. How much of the time I spend doing this depends on the how challenged I feel that day due to difficulty of and interest in the task and how tired/alert I'm feeling.

The format of working I have developed over the years has resulted in my being able to easily punch out 9 hour solid productive days, without burning out. In the process of learning this, I have burnt out. Damn, I'm the Phoenix of software development.

That's why I need access to the Internet at work. I want to read what I want. I want to talk to whoever I want. I want to be slack whenever and however I want. At least assume I mean well and want to do the best work I can. Not all of us want to abuse resources or our employers. In fact, most people are good people. Why treat us as if we are like the few who rort the system? It's the same as blaming all religious people for the acts of extremists. That's not representative.

It doesn't matter how much you lock-down your environment, I'll have my slack time. Thanks to smart phones, you have no way to bore me to death or burn me out anymore. So, what's the point of doing it now?