Sunday, 28 December 2008
Don't Tweet Drunk
The latest meme on Twitter is for twitterers to blog about Twitter and then tweet it so that it can be retweeted. We all sit around and read it and retweet in agreement or scroll on with a little bit of passive aggression.
Since I'm an individual just like everyone else, here is my Twitter post of choice. It addresses the eternal question asked by those outside the twitterverse about what this is all about - What is Twitter and why should I use it?
My first response to that is usually that you don't have to use it. You could go on for the rest of your life not using Twitter and not feel as though you have missed anything. On the other hand, if you do try it out then there are a few things you will experience and gain that are not so easy to list out and debate over Chinese food. These things are additive, like MSG. They add flavour but some people may not react well to it.
Networking
This is networking in whatever sense you want. If there something that you are in to then there are micro-groups on Twitter that share in your passion and will not hesitate to help or support you with your common pursuit. If you want to connect with people around the globe who can encourage your "thing" then Twitter is your forum.
I use Twitter to network with geek girls; software engineers, ThoughtWorkers; friends around the world; and family.
Reading
I use Google Reader less and less to find things I want to read when I'm not rushing around and have time to stop. Instead I steadily open in my browser the links that people tweet about that sound interesting to me. These are sometimes things they produce but most often are links to other places on the 'net. From this I find new things to read and subscribe to that I would not have found on my own in the lifetime of the universe. The Interblag is a big place and following people with common interests can introduce a new source of information to the pool you have already collected.
Thinking
I often find it useful to share my thoughts with people on Twitter and then discuss them in order to articulate what I think. There are many intelligent and switched on people out there who will actively discuss things with you.
Yeah, it is nice to talk about what you are thinking at the time but the coolest part is listening to interesting people bring up ideas that make me you think. Ideas that challenge your own thinking. Ideas you may never ever agree with but are willing to listen to because it's not being shoved down your throat.
On this point, you must be very careful not to get caught up in group-think. This is very easy to do on Twitter. People do complain regularly that there is too much of this on Twitter and that us being to nice and cuddly towards each other is killing original and critical thought. I do see the danger but also believe that an encouraging environment that allows you to test your assumptions and be wrong without fear of the fail whale pushes creativity and individuality. That in itself can overcome the memes that drift in and out of this growing nest of communities and networks.
Twitter is not for everyone but there is a place for you if you choose to follow. It's something different to every person. For all I've expressed here, there will be someone who sees it differently and that's just Twitter.
Try twitter. I recommend it.
Tuesday, 9 December 2008
Learning about Testing ASP.NET MVC
Working on my first commercial implementation of ASP.NET MVC Beta has been rewarding and frustrating to almost even degrees. Learning to test the MVC framework after hearing the promises of Microsoft and the choir has proven that it is still young and the road is long. It feels like being back in .NET 1.1 land again but as an eternal optimist, I see that as meaning that ASP.NET MVC has a promising future. As promising as C#, which had humble beginnings.
Abstracting the business value and corresponding actions in to the C part of MVC has meant that the code behind an ASP.NET Page is reduced to nothing more than specifying the type of model that the strongly typed View uses. That solves an enormous amount of problems that came out of the pre-ASP.NET-MVC world. In particular the classic-ASP-like tendency to put all logic straight in to the events in the code-behind with little to no abstraction. Since you can not instantiate a Page object outside of the ASP.NET framework, it was impossible to unit test the controlling logic in the code-behind. When I have walked on to a project and seen the 3000 lines of code nested in page events, I knew it was almost impossible to safely refactor let alone extend the functionality. All changes in that case had to be additive and in no way morph logic so that nothing legacy would be broken.
The ability to test Controllers has pushed that code out in to a testable .NET class that can be instantiated independently of the framework and then easily tested. That's brilliant if you weren't already doing that but most of us were. I do commend Microsoft on forcing some sort of design on to us but as usual it's all mechanism and no policy. It's another easy way to say "put it all here" but also test it.
What I want to see out of future ASP.NET MVC releases is the ability to test Views with simple xpath searches and annotation validators on Models that feed through to the View. Yes, it's not there now but it will be soon as we can see in MVC Futures. This is not a case of Microsoft missing the point at all. They just have to release something and then they will add to it. They have shown their responsiveness to community feedback. If only they wouldn't refer us to stackoverflow.com.
From the conversations we have had with Microsoft, they have started by saying that it's only the Controller that needs testing and that Views should be tested by a UI testing tool like Selenium and that models have accessors only so don't worry about them. There is then the realisation that testing your View as an abstract concept is not a bad one since it is faster and most efficient than using the UI tools with their overhead (even headless). It certainly will let us test state more efficiently. As for models, validation is so important that the lack of access to annotation validators has resulted in an excess of JavaScript (beit jquery) in our application and I'm not convinced that is a good thing yet. Maybe that's my C# bias kicking in.
I for one am looking forward to the MVC futures becoming MVC present. Until then, all the positive parts of this new framework like the ease of integration of the Model, View and Controller make up for all the things I still want. It saves me the time I used to spend on implementing MVC in the old world.
This leaves me extremely optimistic about the future of .NET web development. Until then, let's do our best to avoid the fat Controller.
Sunday, 23 November 2008
You Inspire Me
I was recently asked by one of my colleagues at ThoughtWorks, who my female role models are.
It took a bit of thought to come up with famous people who I want to grow up to be or who I aspire to and I felt like I was picking the same old cliches that everyone picks. The interesting thing that was going on as I looked for inspiring political leaders was that I kept going "oh, I can't pick her because she's a friend of mine".
Then I realised that the people who inspire me are often people you know. People who you look towards for inspiration. I keep reading lists of women in IT who rock but they all seem to be stacked with people from the US and the UK. Here are mine...
Catherine Eibner
I met Catherine at the first Girl Geek Dinner held in Sydney. She ran her own successful business at the time. Now she is an evanglist for Microsoft in the Dynamics space. She travels, speaks, blogs and is an active member and organiser of many community groups including Geek Girl Blogs Podcasts. On top of all of this, she is a mother of a 3 year old boy who never stands still for more than a minute. She is always smiling, even on 2 hours of sleep.
Her best advice to me: "Exhale and enjoy life. We have it pretty good."
Anna Liu
Anna is the lead of the Microsoft evanglisits in Australia. She's the only person I've ever seen the rest of them truly jump for but they all adore her. Anna and I first met at a lunch for International Women's Day in 2008, that was organised by a splinter group who were over the non-technical dominant IT women's group in Sydney. We first bonded over the colours we had worn on the day and then over the idea that this town needed a group for the niche geek girl idea. Through this year, she has supported GGD Sydney and me by arranging Microsoft sponsorship and just being someone who I could send an email to and have a chat. When I saw her speak on a panel for the first time, she inspired me to want to get up there and do it too. Going to lunch with Anna and friends is always blogable but I've learnt to hold myself back :)
Her best advice to me: "Keep doing what you are doing."
Lindsay Ratcliffe
Linz and I work together. At least we used to at a previous client. Lindsay is the guru of User Experience at ThoughtWorks and in Australia through her involvement in the Australian Usabilty Group. She is a huge supporter of the women she works with and most probably the person TW Australia will attempt to clone first when the technology is in beta. Her skills in user experience design have shown me that building applications is less about what the devs think is cool technology and more about how much people enjoy using your final application.
Her best advice to me: "Always think about motives behind why someone may say something nasty to you and throw it away if it just doesn't feel right."
Jodie Miners
Jodie specialises in construction IT. She has many interesting insights in to women in IT and working in male dominated environments and is always positive about our industry. I met Jodie at the first GGD Sydney and we have grown to be good friends. She is actively involved in organsing the IT communities in Sydney and inspires me every time I feel a little tired with my own organising. No matter what happens, she will turn up and support her community because as she has told me, it's about people. After sneaking her in to the TechEd08 party and competing to meet the most new people in a night, I've learnt from her that it's cool to be a geek amongst geeks and never have to apologise.
Her advice to me: "Just keep organising it and they will come."
Pia Waugh
Pia is one of those people who has a wikipedia page, as you do. She's an open source girl but her and I have always found a lot of common ground. I even spare her my rants about giving stuff away for free since I respect her so much. She is major force behind the OLPC in Australia. That includes work in Aboriginal commuities. We met at dinner 0 for GGD Sydney. Since then we have supported each other's causes and even gone to a tupperware party together.
Her advice to me: "Geeks rock! Be proud of it."
Kate Carruthers
Kate and I just keep running in to each other, at work and in life. I guess the universe was going to get us together sooner or later. She's the most relaxed woman I know yet is on the ball and always ten steps ahead of everyone else. She works for herself as a contractor, a writer and an avid social networker. She is inclusive and supportive to all the people around her and has mastered the ability to get her point across strongly without stepping on a single toe. A must in what we do.
Her best advice to me: "Don't worry about it too much. Ask others to help and they will."
Bronwen Zande
Bronwen and I met virtually through Geek Girl Blogs - the biggest women's blog aggregator in the world. She started it. She also works for herself as the expert on Microsoft Live services in Oz, plays volleyball and runs the very successful Brisbane GGD. When we first met IRL after emailing and tweeting for months, she amazed me. She's young, organised and brilliant and the first person in a while who made me want to build a time machine and go back in time to tell myself to do more in my mid-twenties.
Her best advice to me: "Ignore the idiots."
Allison Young
Alegrya as she is better known in social networking circles is the most popular geek girl in this town. She only recently graduated from a degree with honours in IT and is working in her dream job. If only I had known what I wanted at her age. She's energetic and an achiever. Being around her is fun and educational.
Her best advice to me: "You should tweet that."
Who inspires you?
Wednesday, 19 November 2008
What if they just don't get you?
Experiencing feedback is really like it sounds. You are holding the microphone of life and you turn to face the speakers. They scream and squeal in agony as the sound makes the sound of the sound making the sound.
Feedback is good for me. They all say it is. People who I want to be when I grow up.
Some people put effort in to it and make comments that will haunt but improve you.
Others take the 95% of you what is good and put that aside. Then they take a gigantic magnifying glass and hold it up so the Sun burns the 5%. They want to fix you.
Here is my view of feedback in a formal and informal sense...
- Always have real life examples for someone when you stand before them and compliment of condemn them. Both situations require honestly and example to show you sincerly care;
- Don't put it in writing if it burns - oh how it burns. People don't need to see something in writing that could have been improved with a conversation. Sometimes, taking the time to sit and drink coffee and talk to someone can mend anything you think needs mending. Remember to tell them that if you didn't care then you would not bother sharing;
- Mean well. Always mean to help or improve and share. Otherwise, there is no point in bothering.
Saturday, 15 November 2008
Making your own VS.NET nunit Test Project Template
Returning to .NET has been exciting after a long time away playing in Java and Ruby land. I can't say I'll miss XML config files and all that junk.
First thing I did after creating my first ASP.NET MVC project was to add a template to easily create a project to test it. The new template will create a class library project with MVC, nunit and my mocking framework of choice Rhino included and ready to go.
When you use VS.NET 2008 to create an MVC web application, it asks if you want to add a testing project to go alongside. Unfortunately, the only choice of test project template you get is the Microsoft one and I like nunit much much more.
This is how we do it...
Set the project up the way you want it to appear new
First thing I did after creating my first ASP.NET MVC project was to add a template to easily create a project to test it. The new template will create a class library project with MVC, nunit and my mocking framework of choice Rhino included and ready to go.
When you use VS.NET 2008 to create an MVC web application, it asks if you want to add a testing project to go alongside. Unfortunately, the only choice of test project template you get is the Microsoft one and I like nunit much much more.
This is how we do it...
Set the project up the way you want it to appear new
- Create a new C# class library project. Give it a general name which will apply to your test project template.
- Add a reference to the System.Web.MVC dll.
- Add a reference to the nunit.framework dll.
- Add a reference to the Rhino.Mocks dll.
- Set the Copy Local property for all of the above dll references to True.
- Create a Controller folder under the project root.
- Add a class HomeControllerTest to the Controller folder.
- Add unit tests to cover the About and Index actions.
- Build your project to get the binaries.
Export the project template
- Go to File --> Export Template and use the wizard to export the template. Call it NUnitTest. You will be told where the zip file is saved to.
- Be sure to chose the option to include the icon.
- Move the NUnitTest.zip to %Program Files%\Microsoft Visual Studio 9.0\Common7\IDE\ProjectTemplates\Csharp\Test\1033. This might be different for you.
- Quit Visual Studio.
- Open a command prompt and navigate to %Program Files%\Microsoft Visual Studio 9.0\Common7\IDE.
- Execute devenv /setup and go make a cup of coffee.
- If you now open VS.NET 2008 and create a new project, you should be able to see your template show up under the C#-->Test directory.
- Add the registry key below by copying the text in to a file and calling it nunit.reg. Run this regfile to add the key. You can add it manually also using regedit.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\MVC\TestProjectTemplates\NUnit\C#]
"Template"="NUnitTest.zip"
"Path"="CSharp\\Test"
"TestFrameworkName"="nunit Test"
"AdditionalInfo"="http://msdn2.microsoft.com/en-us/library/ms243147(VS.80).aspx"
"Package"=""
Monday, 3 November 2008
Bar Camp Sydney
Barcamp Sydney is on again...
Details
- Who? Anyone who is interested in technology, the Internet and related topics. We have room for more than 200 people, so bring your colleagues.
- What? A good opportunity to share ideas and projects and to work with like-minded individuals.
- When? 9am-6pm on Saturday 15 November 2008
- Where? BarCampSydney will be held at the Roundhouse at UNSW, Anzac Parade. See WikiMapia for details about the location.
- Getting There Lots of buses to & from Central or Elizabeth St (39x, L94). Click HERE for details on busses from the City (QVB) to UNSW to get you to there on time, and see the Univeristy Busses Page for details about getting back to the city. For Parking see the University Parking Map - All day parking is on the upper floors of the Barker St and Botany St Parking Stations and will cost you $12 for the day. Plenty of nearby street parking just over Anzac Pde.
- Website? The BarCampSydney blog is located at: www.BarCampSydney.org. We'll be posting updated information about the event there.
- On the day A map of local food, drink and transport here. wino kredyt mieszkaniowy sprzedam mieszkanie sprzedam bilet
Friday, 31 October 2008
Finding our target velocity without black magic
To be in the moment (and I always like to be), here is a post for Halloween that removes the black magic from the estimation process and determines initial velocity.
Starting a new project and being around from the beginning is always an eye opener. If you are involved in estimation then it is also like signing a contract. Breach of promise to reach the guessed random number can be punished with overtime and a sense of failure. Heaven forbid a late project especially if it is fixed price.
I've started a new project and we are working out how long it will take and what resources are required. For the first time, estimation seemed more deliberate and less like guesstimation.
This is how we did it...
What you need to start estimating:
- The latest draft of the master story list - a list of the all the stories known so far, written like "AS a person using the system, I WANT TO do something functional SO THAT business value is achieved";
- As many members of the delivery team as possible - including engineers, testers (QA), business analysts (BA) and even business;
- Agree on the length of an iteration;
- An estimation deck - usually consisting of cards representing the Fibonacci sequence between 1 to 13. If you don't have this then use your fingers with 10 fingers = 13;
- A willingness to estimate in points and not days;
- A big table for everyone to sit around and to spread the cards on;
- Snacks - this can take a while.
- Sit everyone down at the table;
- Have the BA or Project Manager (PM) read through every story;
- Allow questions to understand what the story means;
- Rewrite or breakdown stories in to small functioning parts;
- Write out all stories on 4x6 cards.
- Re-read the stories;
- Get everyone involved in delivery to do min-likely-max estimates and write them on the back of the cards- minimum points if all goes blissfully well, likely points in a realistic situation and maximum points if all hell breaks loose;
- For each story work out volatility - low, medium or high;
- For each story work out completeness - complete, incomplete or unknown;
- For each story work out complexity - simple, medium or complex;
- Engineers group the stories in to what they think they could complete in one iteration. Use about 5 groups - dependencies and iteration order are not important. Just look at the size of the stories and group an iterations worth;
- PM secretly adds up the total likely estimated points from the groups and works out average iteration velocity;
- PM lays out different groups of stories that would fit in to the new predicted velocity - note this is not the teams actual velocity because that isn't known until they actually start banking points;
- The engineers looks at the groups and decide if they are too big, just right or too small - it's a little like Goldilocks;
- Rinse and repeat - this can be re-estimated and sorted again to double check numbers.
Monday, 27 October 2008
Don't Embrace Mediocrity
used under the flick creative commons license by caravinagre
I wrote a post a while ago that somehow got on to a few of the IT aggregators and resulted in an influx of readers, many of whom were interested in what was a popular topic at the time. That attention brings out the good, the bad and the ugly on the Interblag.
A friend of mine who regularly blogs about food on our work blog feeder has also recently been attacked by the freak-geek police and told her blog doesn't belong as it isn't technical. Amusingly enough, it wasn't even a work colleague who said this.
After spending an hour listening to Edward de Bono talk about why arguing a point doesn't always produce the best outcome, I'm starting to see that point of view reinforced online. It was probably always there but it seems relevant to me now. So let's discuss it and also annoy the people who think that only code snippets belong in blog posts.
Are any new ideas being added to the blogosphere? Is blogging dead? If it is and there are no new ideas then what or who killed it?
It seems that if you are established, usually not through rising on the Internet but through a more traditional (and rightfully respected) publishing background, then your opinion is rarely knocked online. Social proof or tangible proof. If you are more like the bloggers I see out there with new ideas and different ways of thinking and challenging the established norm, then your words will be hammered. Interestingly enough, it is a small enough group who attacks so it doesn't really matter most of the time. It does however feel like that constant beating at the edges of the blogosphere, is dulling the interesting sparky parts.
It even has the potential to silence any new comers who think they might have something to say and haven't quite found their voice. Instead those who are happy with the way the Internet appears to be to them want to keep it that way. Maintain the average. Silence the creativity. It's an obscure notion to tell someone else not to speak so I will not tell them not to speak as they so happily feel the right to do to others.
Instead, I encourage any of you out there with something to say to stand up and say it. Ignore the push toward mediocrity. I paraphrase the wise and powerful Madonna in saying: Express what you've got, baby ready or not. Express yourself!
This one is better: ruby-net-ldap
After posting a quick how-to about Ruby-LDAP, I received a couple of very helpful comments that pointed me towards ruby-net-ldap. This is a pure Ruby LDAP library that is stable and has good documentation to help you along. It is the best Ruby LDAP gem out there and I've been through almost all of them to get to this point.
Here is a simple search for an organizational unit with the name "marketing"...
Here is the code to add an organizational unit under the base node...
Check out the rest of the documentation for pretty good examples. This is the library I recommend. In my situation, I'm using ruby-net-ldap to import data in to, manipulate and query data in an OpenDS LDAP server.
Here is a simple search for an organizational unit with the name "marketing"...
require 'rubygems'
require 'net/ldap'
def ldap_search
ldap = Net::LDAP.new
ldap.host = "localhost"
ldap.port = "389"
ldap.auth "cn=Directory Manager", "password"
filter = Net::LDAP::Filter.eq( "ou", "marketing" )
attrs = [ "ou" , "objectClass"]
ldap.search( :base => "dc=mycompany, dc=com", :attributes => attrs, :filter =>
filter, :return_result => true ) do |entry|
puts entry.dn
end
end
Here is the code to add an organizational unit under the base node...
require 'rubygems'
require 'net/ldap'
def ldap_search
ldap = Net::LDAP.new
ldap.host = "localhost"
ldap.port = "389"
ldap.auth "cn=Directory Manager", "password"
dn = "ou=marketing, dc=mycompany, dc=com"
attr = {
:ou => "marketing",
:objectclass =>"organizationalUnit"
}
ldap.add( :dn => dn, :attributes => attr )
end
Check out the rest of the documentation for pretty good examples. This is the library I recommend. In my situation, I'm using ruby-net-ldap to import data in to, manipulate and query data in an OpenDS LDAP server.
Sunday, 5 October 2008
Ruby-LDAP
I said it would never happen but here is another Ruby blogpost for the ThoughtWorks pool. In my defense, there really wasn't much help out there on this topic so my pair and I decided this had to be posted. His post on what we tried in order to make Ruby talk to LDAP is over there.
The Bits
OpenDS is Sun's LDAP server. We chose this as our LDAP server because it is the one most likely to sit behind the OpenSSO Single Sign-On implementation we are populating, querying and binding to. It is written purely in Java and provides a bunch of useful shell scripts and a Java API to do the things we want to do. This will allow us to test our Ruby-LDAP implementation independently of our solution.
OpenDS has a nice installer with a friendly setup wizard. If you want to script the install then run this from the root of the installation directory:
Ruby-LDAP was the friendliest and most sensible choice because it was the most pure Ruby choice which allowed us to do things the Ruby way. RJB let us use the OpenDS libraries but was too much like writing Java in Ruby and involved running another JVM on the production server it is destined for. If we were to go that far then we'd have opted for JRuby to do the bridging. After ActiveLDAP flat out refused to acknowledge OpenDS and would only play well with OpenLDAP, that was written off. Ruby-LDAP is a written in C so it isn't a nice gem install but instead takes a bit of making and shaking to get going.
Here is how to install it from the command line once it is downloaded and unzipped:
The Required Basic LDAP Knowledge
LDAP is like a very simple and slightly stupid database for storing Identity information. It does not have transactions. You can't query it with SQL. It is a tree. It does have a schema.
Understand your LDAP schema. You can customise it. It is made up of nodes that are defined by object classes and attributes. These include but are not restricted to: Organization; OrganizationalUnit; and Person.
Distinguished Name (DN) appears everywhere when you are dealing with LDAP. It is the unique name given to a node in the LDAP tree and describes the exact path from the node to the root. A DN starts at the node and walks up the tree. It looks like:
This is an LDAP glossary that was useful in deciphering the LDAP maze and nomenclature.
Adding an Organizational Unit
To add an organizational unit:
Adding a User
To add a user to an organizational unit:
Deleting a User
To delete a user:
The Bits
OpenDS is Sun's LDAP server. We chose this as our LDAP server because it is the one most likely to sit behind the OpenSSO Single Sign-On implementation we are populating, querying and binding to. It is written purely in Java and provides a bunch of useful shell scripts and a Java API to do the things we want to do. This will allow us to test our Ruby-LDAP implementation independently of our solution.
OpenDS has a nice installer with a friendly setup wizard. If you want to script the install then run this from the root of the installation directory:
>$ './setup --cli --no-prompt -p 1389 -D "cn=Directory Manager" -w "password" -b dc=example,dc=com -a --doNotStart'
Ruby-LDAP was the friendliest and most sensible choice because it was the most pure Ruby choice which allowed us to do things the Ruby way. RJB let us use the OpenDS libraries but was too much like writing Java in Ruby and involved running another JVM on the production server it is destined for. If we were to go that far then we'd have opted for JRuby to do the bridging. After ActiveLDAP flat out refused to acknowledge OpenDS and would only play well with OpenLDAP, that was written off. Ruby-LDAP is a written in C so it isn't a nice gem install but instead takes a bit of making and shaking to get going.
Here is how to install it from the command line once it is downloaded and unzipped:
>$ ruby
ruby-ldap-0.9.7
/extconf.rb "."
>$ make
>$ make install
The Required Basic LDAP Knowledge
LDAP is like a very simple and slightly stupid database for storing Identity information. It does not have transactions. You can't query it with SQL. It is a tree. It does have a schema.
Understand your LDAP schema. You can customise it. It is made up of nodes that are defined by object classes and attributes. These include but are not restricted to: Organization; OrganizationalUnit; and Person.
Distinguished Name (DN) appears everywhere when you are dealing with LDAP. It is the unique name given to a node in the LDAP tree and describes the exact path from the node to the root. A DN starts at the node and walks up the tree. It looks like:
uid=damana,ou=australia,dc=mycompany,dc=com
This is an LDAP glossary that was useful in deciphering the LDAP maze and nomenclature.
Adding an Organizational Unit
To add an organizational unit:
#/usr/bin/ruby -w
require 'ldap'
connection = LDAP::Conn.new('localhost', 1389)
connection
.bind('cn=Directory Manager','password')
record = [
LDAP.mod(LDAP::LDAP_MOD_ADD,'objectclass',['organizationalUnit']),
LDAP.mod(LDAP::LDAP_MOD_ADD,'ou',['australia
']),
]
connection.add("ou=branches, dc=
mycompany
, dc=com", record)
connection.unbind
Adding a User
To add a user to an organizational unit:
#/usr/bin/ruby -w
require 'ldap'
connection = LDAP::Conn.new('localhost', 1389)
connection.bind('cn=Directory Manager','password')
record = [
LDAP.mod(LDAP::LDAP_MOD_ADD,'objectclass',['person']),
LDAP.mod(LDAP::LDAP_MOD_ADD,'cn',['Damana Madden']),
LDAP.mod(LDAP::LDAP_MOD_ADD,'cn',['dmadden']),
LDAP.mod(LDAP::LDAP_MOD_ADD,'sn',['Damana Madden']),
]
connection.add("cn=Damana Madden ou=australia, dc=mycompany, dc=com", record)
connection.unbind
Deleting a User
To delete a user:
#/usr/bin/ruby -w
require 'ldap'
connection
= LDAP::Conn.new('localhost', 1389)
connection
.bind('cn=Directory Manager','password')
connection
.delete("cn=Damana Madden ou=australia, dc=mycompany, dc=com")
connection
.unbind
Monday, 1 September 2008
Is there no hope for stoopid programmers?
Recently, we (on the Interblag) have gone through another wave of controversial discussions about people who shouldn't be writing code and should consider choosing a different career that is not in Technology. There has been heated debate and a lot of elitism expressed but what we have not talked about is if there is some other way for these developers to be used. I would like to consider and work my way through this idea.
There are many different levels of developers. My usual way of dividing up developers is in to two groups: Software Engineers and People Who Waste Air. This is the result of years of running in to and over people who don't belong in my profession.
On my long commute to and from my current engagement (in south-Brisbane/Chatswood), I've had the time to wonder...
- Why don't some programmers belong in IT?
- How do we encourage them go somewhere else?
- and if we can't then what can be done to make them useful and less destructive?
Why don't some programmers belong in IT?
This is not a new list of reasons. Most discussion seems to settle on the idea that there are people who are always learning and adopting new ideas. They do this in order to hone their craft and improve the journey - the journey from idea to software for the builders and the clients. These people are probably you. Yes, you reading this blog. You are a small minority of people who are constantly learning and thinking.
There are also people who don't learn or they once did and that was enough. That usually means that they don't know what's going on now. I've heard people say...
nothing has changed since the 70s in computing...and I really want to slap them with the Internet.
Then there are those people who have brains but they've blue screened or they just don't think the way you need to think to do this job. If the idea of expressing something in code is difficult every time then that's not good. One highly paid contractor I worked with in 2005 said
programming is a matter of trial and error. You write it and then you try to get it working over and over again until it all of a sudden does.That's not how it works if you have a clue at all about what you are doing. If this is how the job looks to you then look for another job.
The other prevalent characteristic that rears it's ugly head and hisses at us, is the unwillingness to alter the way things are done. Change is difficult for everyone. I struggle with it in many ways, every day. Change is not worth it just for the sake of change and that's not how I like to do it. I like the idea of learning from what I've done before. Retrospection and learning are reasons for change. Many programmers I've worked with who probably should not have been there were not open to adjusting their ways in any form at all. It was the way they were comfortable and any motion made them very insecure.
How do we encourage them go somewhere else?
The solution I usually see to getting rid of people who are making a mess of their career in IT or making a mess of your project, is to have the team push them out. First assumption here is that the rest of the team is able to judge that a person is not worthy. The Dunning Kruger effect describes when people who don't know much think they know a lot, while those who know a lot realise how little they actually know. What if your team really believes in themselves but don't have the ability to judge up? What if they don't know enough to know if an engineer is good?
Sadly, I have seen that a lot. Teams of people who have decided that they are brilliant and have nothing more to learn. Anyone who disagrees with their team is collectively declared an idiot. Wrongly usually but the mob prevails. They have little chance of realising this about themselves so self-culling won't occur. Other teams and organisations do it quite well. I guess you need to find smart people first or bring in smart people who can make this judgement.
There is one other way to deal with this and it is to have as good a firing policy as your hiring policy. I've worked in a situation like that. The people manager was one of the coolest chicks you've ever met but one of the scariest if you happened to suck at your job. In her previous company, she was known to come up to the desk of people judged lacking with a moving trolley so they could be marched off the premises wheeling their belongings. It got to the point that people would run and hide if they saw her pushing a trolley. The thing was that she did something about people who were not meant to be there. She didn't let them cluster or build up political power. If you were wrongly hired, your were rightly fired. Trolleyed out!
If we can't get rid of them then what can be done to make them useful and less destructive?
This is where the arguments start. If you've had to spend the time undoing and fixing what these people produce then you just don't want them there. That is fair. If you have had to work with people who you have to constantly direct and correct then that consumes time and good resources. You could write the code in the time it takes to hammer it in to their heads. That frustration is understandable.
While writing this post I asked if these people are the same as junior developers who need to be mentored and taught and there was a resounding "NO WAY!" in response. Juniors with potential are more productive and encouraging than the useless types.
People suggested that it's best to keep them out of the way all together. Give them the jobs that no good developer wants. I'm not sure what those jobs are. Won't they just screw them up too?
At a start-up I worked at recently, the most unproductive and partially comatose person in the business was allowed to do the repetitive Flash work. He was a flunky for the graphic designer. Someone to write the script the designer wasn't interested in but had to be done. He was happy doing that and it kept him out of harms way, mostly.
The conclusion seems to be that these non-developers should be kept out of the way or removed completely. Is this valid? Is this how we all see it? Maybe there is no conclusion. I still need to ask...
Is there no hope for stoopid programmers?
Thursday, 28 August 2008
GeekGirlBlogs Podcast about Girl Geek Dinners Sydney
Check out the podcast with me about How to set up a GGD.
Sunday, 24 August 2008
Scrabulous completely gone from Facebook
It's official, I hate Hasbro.
Yesterday, Scrabulous disappeared from Facebook completely after Hasbro sued them. It's been suggested that I sign up to the Hasbro application on fb but I'd rather light fire to my newly painted toenails. It was a good fb community and was well written and presented.
This is a terrible shame. Big companies triumph again. Why can Hasbro do this in Australia?
Apart from status updates and photos, that only reason I went to facebook was to play Scrabulous. Twitter and flickr can replace the others for me. Maybe this is the end of facebook, at least for me.
Yesterday, Scrabulous disappeared from Facebook completely after Hasbro sued them. It's been suggested that I sign up to the Hasbro application on fb but I'd rather light fire to my newly painted toenails. It was a good fb community and was well written and presented.
This is a terrible shame. Big companies triumph again. Why can Hasbro do this in Australia?
Apart from status updates and photos, that only reason I went to facebook was to play Scrabulous. Twitter and flickr can replace the others for me. Maybe this is the end of facebook, at least for me.
Monday, 11 August 2008
Spam A LOT
Today I unsubscribe from Australia's biggest ticketing agent after they sent out mine and tens of thousands of other people's email addresses in a broadcast email.
I opened it thinking "cool, I might go see the Dandy Warhols" and was pretty unimpressed to see the body of the email with a listing of their subscribers. Apparently I am in the lucky 0.01% who had their email address shared with their entire mailing list and any spammers who get their hands on it.
First thought, can I trust a company with my credit card details if I can not trust them with my email address? Second thought, where do I complain about this? Go here and do complain because in Australia you can't be defended if you don't put your hand up and complain.
Friday, 1 August 2008
Degoogling My Life
I've recently started using Google Analytics for my blogs. Yes, I'm watching you watching me.
A few interesting things have emerged from setting this up and from looking at the data it produces. The first is that Google applications are easy to register for, own and use. They make it easy to let them host your data. The second revelation is that a website can collect a surprising amount of information about you as you meander around the Interblag.
Let's go backwards and look at second things first - collecting information about the people who land on your site. Here is a quick summary about what I know about you when you visit this blog:
- your browser and OS;
- screen colours and resolutions;
- flash and Java versions;
- network location and host name;
- connection speed;
- the length and depth of your visit (the pages you read and time you spent);
- language used;
- referral sites (search engines, other sites or if you came directly to my blog);
- and where in the world you are.
This information is collected using a simple script call that looks something like this, which is generated for each of your sites:
<script> type="text/javascript" var="">gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'
<script>