Monday, June 29, 2009

How to Contribute to Open Source (When You're Not Exactly Scott Hanselman)


 

Some of you will remember my rant about open source, and how I couldn't find time to do it and didn't know how anyone could. That post caused a big backlash, lots of people wanted to know how I could say that without ever trying it. Many more shared their personal experiences getting involved in open source and loving it. They explained that it was something you MADE time for. So, to see if they were right I did make time. Let me just tell you, totally worth it.

 

Witty is a WPF project brought to you by some of the guys that do the Herding Code podcast. I initially reached out to Jon Galloway to see if I could get involved with their project. He explained that anyone that wanted to could get involved in Witty, and he linked me to this post by Scott Hanselman.

 

The post was very educational about the process for contributing, but I am no Scott Hanselman. There is a lot of green still left around these ears, and whether or not Scott Hanselman can do something is no indication if I can do it. I knew I would run into issues working on a new application in a new framework I hadn't seen yet (WPF). However, I tried it anyway and I was able to contribute a conversation viewing module to this past Witty release (2.2). I can't tell you how cool it is to think of the fact that so many people use this awesome project and I had a hand in it.

 

I thought that I would demonstrate to you guys how easy and rewarding it is to contribute to open source no matter what level you are at.

 

 

Ok, so the first step is figuring out what change you are going to make. I find that the best way to to do this is to actually use the application.

issue 

 

I actually got this idea for a feature through a tweet someone sent me about usernames not turning into links when they are prepended by a character. This became more noticable when the changes to replies were made and people were leading off

their tweets with a character so all their followers could see. So, I figured we could change this today.

 

Step one is getting the checking out the application through SVN. If you haven't done this before check out this tutorial.

 

Now, what you want to do next is up to you. Some people might want to take a look around first, see how the application is set up. I did that initially, it enabled me to get a handle on how things where done and where things are located.

 

Solution Explorer

 

I looked around at the file structure and kind of got a feel of where they stored things, there is a twitter library, and then the main application where the xaml is stored. Also, a skins project, common classes, and a test project.

 

Our first task today is to find where the usernames are being set as hyperlinks. My initial thought was that it was in the code behind for our xaml files. Or possibly directly in the xaml as a regex. I took a look around and didn't find anything. It was frustrating, but after I pursued that direction for a while I thought to do a Cntl + Shift + F search for the character @. So I did that and found this region in my seach results:

 

Regions

 

Jackpot! I found where they were setting the username as a hyperlink here in the OnTweetChanged method:

 

Original Method

 

As you can see they are treating each tweet as an array and then iterating through that array to check the words for @usernames and #hashtags. Initially, I was going to have this loop check for a word

either starting with, or having the second character be @, but then it occured to me that we only want to check that first word in the tweet, since this issue is only an issue in that first word. It's adding more checks to each word to throw the logic into the loop and there has to be a better way

to do it.

 

I figured a great way to do this would be if I could separate the initial character and the @username into two separate parts of the array. I knew you couldn't insert into a string array, but you can with an arraylist.

 

 First Change

 

 I turned the array into an Arraylist and then I can make the first character and @username two words in the array. Then the loop will treat the see the @username for what it is and make it a link.

 

I was all set to check this in when I realized how much of a performance hit making the array into an Array List would be. So, I've gotta come up with something else. I decided to remove the functionality to format the @username from inside to loop, make it a method and call it before entering the loop if it falls in our char+username if statement, then call it from inside the loop if it is an actual username within the tweet.

 

Format User Name

 

There we go and here are our final changes to the OnTweetTextChanged method:

 

Final Method

 

 

I tested again, and we're looking great.

 

 

test 

 

 

Step next: submitting our patch.

Patch

 

 

 

 

 

 

What you want to do is go to the svn folder where everything is contained right click as if you were committing your work however go to "Create Patch" instead. Select the files you changed and save the patch somewhere.

 

diff

 

SVN will show you a diff for your changes, go through and make sure you put everything in the patch.

 

Submit Patch

 

Now go to the Witty issues list, and submit your patch along with a comment about what it is doing and then submit!

 

That's it! We're golden. All together it took a little over an hour What have I gained here?

 

1. . I got to add a feature I wanted to an application that I use.

2.  After I submitted my first patch I got great feedback and critique from a developer I really look up to (Jon Galloway). You can have the same experience as long as the project you are working on is run by people you think are interesting.

3. I got to work with a new framework.

4. I feel like I've contributed something to the community, I walked around smugly for at least a few hours (j/k, but it's cool).

 

Anyway, I hope this encourages you to get started. I'm certainly glad I did.


Sunday, June 28, 2009

Take a Deep Breath



I just got back from an extremely relaxing weekend in different 'burbs than I own with some seriously amazing people. It occurs to me


that we don't do these things often enough (at least I don't). When you start up Skype, the splash screen when loading says "Take a Deep Breath"  


What an awesome feature! It always makes me smile, 



Speaking of Skype, this past week we did our first WAN party on Ventrilo which is a server dedicated to connecting people It is used 


often for gaming. Our connection was much better than usual, however, I fear making this switch will discourage people from coming 


to the parties because you DO have to download Ventrilo. Has anyone had a good experience with both hosting many people on a


Skype call and recording it? I have had many issues with Skype since we started, a great tool but for multiple people on a call it stinks. 


We have run into a lot of trouble during our calls and that is what makes me want to switch. Can you reccomend a different tool to do these calls? I really


enjoy them and when they work well they are great, but there MUST be a better way.



In other news Girl Developer the news was super fun and will now be a regular feature. 



Also, NJ Tech Drinks is coming up soon!!! If you are from the area it would be awesome if you could stop by, or if you


know anyone forward them the invite! I'm really looking forward to it. Link here. 



Monday, June 15, 2009

ASP.NET MVC Translated for the Web Forms Programmer (3 in a series)

Obviously I've been putting this off a little. I think the controller has been haunting me, it's very intimidating. I've become such a good friend to System.Web.UI.Page, it's hard to imagine my life without him. However, we all get older, grow apart. It's time for me (and you) to go head first into the next layer of MVC, we've started our project, set up our model. Now it's time for View -> Controller.


The thing about the controller is, it's a lot like normal code behind. The biggest adjustment? There is no page load. The View gets all its data from the Controller at runtime. There are a few key terms we need to learn. The first one is ActionResult. This is going to be a little confusing so strap in. The Action Result is what each method returns with relation to the View. Each method in the controller that returns data to a view is called an "Action Method"


To demo this we're going to do something super easy, we're going to do some simple math and post the result as a string on our page. Sounds easy? I think so too, don't forget, we're doing this for the first time together.


I must digress for a moment and move over to our global.asax. We're going to look at a method it's called RegisterRoutes and what it does is let our application know how to look at the Urls we're passing it. The way it's set up now, the first term being passed is the name of our controller, MVC now knows what to do with that, and the second term is the name of our Action Method, the third term will be any parameters, and so on. MVC has some serious RESTful goodness, so the RegisterRoutes method shows our application what to look at and where to go when it gets one of our pretty Urls. I left in the defaults, you can customise it for your application, take a look:


 

Routes


Also, before we get started, we need to cover something that's very important in MVC, and that's naming. In order to implement the intuitive functionality of MVC we need a few things to be the same. The name of our controller (plus the word "controller"), and the folder that contains our views related to it (as children of the "Views" folder). Mine is called CapsuleController.cs and My folder is called Capsule. Two more things that need to match are the name of your view, and the name of your action method that returns the view (though not always, it does make things more convenient). Capsule contains a view called Math and we have a an action method in our controller called Math. Take a look at our tree:



 

Tree

 


This is going to look weird the first time you're looking at it. Our action method is being passed no parameters, this is the action that automatically is called by the controller when our view (of the same name) is loaded. If you have named your view (or action) something different, you can just call View("ViewName") and pass the name of the view you want into your method. When this guy is called we get our page as is, with no data passed in.



 

 

So, say we want to populate a label on the load of this ViewPage?  We can pass data through to our page like so:

 Label Action

 

We can now display "Message" in our page by adding this to our View:

 

View

Our page ends up like this:

First Page

It displays our string as if it were an asp:textbox or an asp:label that we were binding it to. So this kind of makes sense. In order to load something at runtime or bind something to the page we reference it from the controller. How do we handle our events?.

MVC introduces us to a keyword "AcceptVerbs" that tells our action method what HTTP action to look for within our view. In the beta of MVC this was required to use HTTP commands, however, now MVC just searches for the applicable action when your view gets a command. We're going to enter a value, and have it save to our DB as a new Link for this project (a Link is one of our objects). So, we're going to do a POST, and we're going to grab a property of the link from our view that the user has entered in a text box (we will cover validation in the future, right now, though, we have a magical user that does no wrong).  

First we add a form to our method, we can pass the values entered into the form when we do our POST.  I am doing this here by overloading our Math method with a FormCollection. You can also use Model Binders which allow you to specify what objects go with which controls. These are a great alternative to the asp:Repeater and asp:GridView. We will go over them more in depth in the next installment. My action grabs all the data entered into our form through the passing of the FormCollection. In order for MVC to know what data is located where we identify it this way on our form, we are only setting one property of an object called Link, as well as creating a new Link:

Here is the way our Action looks (remember I'm using LINQ to SQL):

 view

And our View:

 Final View

When we are done our page looks like so, I enter my value and save:

 Page Second

 

That is it! That's all you have to do to CRUD it up in MVC.

However, what happens when you have more than one submit button or POST per page? I guess you're going to just have to tune in next time and find out.

 

 

 


Wednesday, June 3, 2009

So, You Want to Come to a WAN Party?

This week we had:


Tonight's WAN party attendees:


Sara Chipps(me)!


Tobin Titus


Lloyd Humphreys


Nick Berardi


Nathan Kelley


Kevin Griffin


James Thigpen


Dane O'Connor


Brian Papa


Teh Norm


James Pendarvis


 This weeks topics are: "Do you think technical interviews are beneficial?", "Are comments (and regions) a code smell?", "Google Wave and Bing Buzz"


Please excuse our audio troubles, and my chomping. This is the first time we are publishing. Thanks to everyone who took part. I am including the text chat below the link, so you can follow along if needed, but it should be fine without. The only things you might want to see is Nick Berardi's code snippet which we discuss.


Oh, and the comment I left yesterday:  'This is really ugly code, I will hopefully fix later


I don't know how this comes accross entertainment-wise, feel free to leave suggestions.


WAN PARTY DELICIOUSNESS



[6/3/2009 7:31:04 PM] *** Sara Chipps added Kevin Griffin, Nathan Kelley, Nick Berardi, Norm, Dane O'Connor, Tobin Titus ***

[6/3/2009 7:31:07 PM] *** Conference call, duration 1:34:50 ***

[6/3/2009 7:31:37 PM] Norm: Yeah solid echo

[6/3/2009 7:32:06 PM] *** Sara Chipps added James Thigpen ***

[6/3/2009 7:32:09 PM] Norm: yay trains!

[6/3/2009 7:32:29 PM] Nathan Kelley: Lloyd Humphreys said he's having trouble talking to you sara

[6/3/2009 7:32:40 PM] *** Sara Chipps added Lloyd Humphreys ***

[6/3/2009 7:32:49 PM] Dane O'Connor: omg

[6/3/2009 7:32:52 PM] Dane O'Connor: whats going on?

[6/3/2009 7:33:04 PM] Lloyd Humphreys: hey

[6/3/2009 7:33:16 PM] Nathan Kelley: i thought you got arrested for that kind of stuff

[6/3/2009 7:33:25 PM] Tobin Titus: me too

[6/3/2009 7:33:25 PM] *** Missed conference call. ***

[6/3/2009 7:33:51 PM] *** Call ended ***

[6/3/2009 7:34:30 PM] Dane O'Connor: sounds like we're in an empty staduim?

[6/3/2009 7:34:47 PM] *** Sara Chipps added James Pendarvis ***

[6/3/2009 7:35:11 PM] *** Sara Chipps added brian papa ***

[6/3/2009 7:35:21 PM] *** Tobin Titus has changed the conversation topic to "Technical interviews" ***

[6/3/2009 7:41:42 PM] Norm: sounds good

[6/3/2009 7:41:56 PM] Lloyd Humphreys: Now I can't hear Sara :P

[6/3/2009 7:42:30 PM] Dane O'Connor: lost ya

[6/3/2009 7:42:36 PM] Lloyd Humphreys: ditto

[6/3/2009 7:42:36 PM] Nathan Kelley: same

[6/3/2009 7:42:39 PM] Dane O'Connor: back

[6/3/2009 7:42:41 PM] Sara Chipps: I can hear?

[6/3/2009 7:48:34 PM] James Pendarvis: Lost Sara

[6/3/2009 7:48:35 PM] Lloyd Humphreys: gone

[6/3/2009 7:48:36 PM] Dane O'Connor: losing ya

[6/3/2009 7:48:41 PM] Norm: lol

[6/3/2009 7:48:46 PM] Lloyd Humphreys: back

[6/3/2009 7:55:48 PM] Dane O'Connor: as an aside. r u a consultant Nick?

[6/3/2009 7:56:00 PM] James Pendarvis: Who here is an employee and who is a consultant?

[6/3/2009 7:56:10 PM] Tobin Titus: I'm an employee now :)

[6/3/2009 7:56:13 PM] Sara Chipps: consulting now

[6/3/2009 7:56:18 PM] brian papa: I'm an employee but I dabbled in consulting

[6/3/2009 7:56:30 PM] James Thigpen: I'm at some nebulous halfway point between the two.  Employed but seeking consulting.

[6/3/2009 7:56:46 PM] Dane O'Connor: employee with consulting about 10-12 hrs a week

[6/3/2009 7:57:01 PM] Norm: More entrepreneur than employee as of now.

[6/3/2009 7:58:05 PM] Norm: So many life lessons in that one!

[6/3/2009 7:58:08 PM] Dane O'Connor: nathan breakin up

[6/3/2009 7:58:11 PM] Nathan Kelley: cue the beavis and butthed

[6/3/2009 7:58:15 PM] Tobin Titus: :)

[6/3/2009 7:59:03 PM] *** Tobin Titus has changed the conversation topic to "Commenting code smell" ***

[6/3/2009 7:59:25 PM] Nathan Kelley: /* no comment */

[6/3/2009 7:59:30 PM] Tobin Titus: lol

[6/3/2009 7:59:37 PM] Lloyd Humphreys: :D

[6/3/2009 8:03:22 PM] Norm: Personally would agree with Sarah if there are excessive or useless comments

[6/3/2009 8:04:16 PM] Tobin Titus: throw new NoEffinWayException()

[6/3/2009 8:04:30 PM] Dane O'Connor: breakin up

[6/3/2009 8:04:34 PM] Lloyd Humphreys: ditto

[6/3/2009 8:04:35 PM] Nathan Kelley: lag

[6/3/2009 8:04:36 PM] brian papa: static

[6/3/2009 8:04:41 PM] Dane O'Connor: NJ connection sux!

[6/3/2009 8:04:44 PM] Lloyd Humphreys: better

[6/3/2009 8:04:45 PM] Tobin Titus: breakin up is hard to do

[6/3/2009 8:04:51 PM] Tobin Titus: but sara keeps doing it

[6/3/2009 8:05:17 PM] Tobin Titus: lol

[6/3/2009 8:05:39 PM] Norm: lol

[6/3/2009 8:06:56 PM] Tobin Titus: as an aside, some code that I commented in 5 years ago just broke after running at a bank without a single error for 5 years... however, the fact that it broke exactly where my comment was... is almost proof for sara

[6/3/2009 8:07:07 PM] Sara Chipps: yesssss!

[6/3/2009 8:07:30 PM] Tobin Titus: I just tweeted about that earlier this week

[6/3/2009 8:08:16 PM] Dane O'Connor: quirks = +1 on comments

[6/3/2009 8:09:00 PM] Nick Berardi: Type targetType = typeof(NameValueCollection);


// get the property for setting readability

PropertyInfo isReadOnlyProperty = targetType.GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);


// set headers as read and write

isReadOnlyProperty.SetValue(context.Request.Headers, false, null);


ArrayList list = new ArrayList();

list.Add(value);


// get the method to fill in the headers

MethodInfo filleInHeadersCollectionMethod = targetType.GetMethod("BaseSet", BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(string), typeof(object) }, null);

filleInHeadersCollectionMethod.Invoke(context.Request.Headers, new object[] { name, list });


// set headers as read only

isReadOnlyProperty.SetValue(context.Request.Headers, true, null);

[6/3/2009 8:09:17 PM] Sara Chipps: this is the last comment I wrote (in VB.NET)

[6/3/2009 8:09:18 PM] Sara Chipps:    'This is really ugly code, I will hopefully fix later

[6/3/2009 8:09:32 PM] Tobin Titus: lol

[6/3/2009 8:11:23 PM] Dane O'Connor: haha

[6/3/2009 8:11:24 PM] Dane O'Connor: yeah

[6/3/2009 8:11:42 PM] Norm: lol

[6/3/2009 8:12:40 PM] James Pendarvis: pastie.org right?

[6/3/2009 8:14:20 PM] Dane O'Connor: // Magic. Do not touch.

[6/3/2009 8:20:24 PM] Tobin Titus: back

[6/3/2009 8:20:47 PM] James Thigpen: Some bad smells are really tasty cheese.

[6/3/2009 8:21:12 PM] Tobin Titus: #region

/// <summary> code smell here </summary>

#endregion

[6/3/2009 8:21:18 PM] Dane O'Connor: haha

[6/3/2009 8:22:04 PM] Tobin Titus: I have to be honest. I used to be a HUGe abuser of regions

[6/3/2009 8:23:31 PM] Dane O'Connor: // --- Methods | My Group

[6/3/2009 8:23:39 PM] *** Tobin Titus has changed the conversation topic to "stinky code with regions, and comments as code smells" ***

[6/3/2009 8:23:45 PM] Dane O'Connor: // --- Impl | Idispoable

[6/3/2009 8:24:10 PM] Nick Berardi: even with the mis-spelling and everything :D

[6/3/2009 8:24:14 PM] Dane O'Connor: :)

[6/3/2009 8:24:16 PM] Dane O'Connor: too fast

[6/3/2009 8:24:36 PM] Tobin Titus: like HTTP_REFERER <-- spehlt rowng

[6/3/2009 8:24:53 PM] Nick Berardi: I usually do

[6/3/2009 8:25:05 PM] Nick Berardi: #region exec sp_MyProc

[6/3/2009 8:25:14 PM] Nick Berardi: all the command related connection stuff

[6/3/2009 8:25:17 PM] Nick Berardi: #endregion

[6/3/2009 8:25:24 PM] Sara Chipps: #region methods

[6/3/2009 8:25:30 PM] Tobin Titus: #region Pandora's Box - do not expand

#endregion

[6/3/2009 8:25:31 PM] Sara Chipps: #region code

[6/3/2009 8:25:38 PM] Nick Berardi: LOL nice tobin

[6/3/2009 8:27:07 PM] *** Tobin Titus has changed the conversation topic to "Magical Elixors Framework" ***

[6/3/2009 8:27:40 PM] Norm: Awesome!

[6/3/2009 8:28:13 PM] Tobin Titus: I'm waiting for some to hold the following at a code camp:  "MEF Lab"

[6/3/2009 8:28:42 PM] Tobin Titus: in the same mall?

[6/3/2009 8:29:17 PM] James Thigpen: it's an hour and 20 minutes

[6/3/2009 8:29:25 PM] Lloyd Humphreys: oh gWave seems pretty cool :D

[6/3/2009 8:29:41 PM] Lloyd Humphreys: I've been off school with pretty bad sunburn, so I've watched it ;)

[6/3/2009 8:29:49 PM] Tobin Titus: http://www.youtube.com/watch?v=v_UyVmITiYQ ?

[6/3/2009 8:29:53 PM] Lloyd Humphreys: it's pretty cool, yeah

[6/3/2009 8:30:27 PM] Lloyd Humphreys: there're some really cool concepts

[6/3/2009 8:30:44 PM] Lloyd Humphreys: like, you can take a "Wave" to your blog and embed it there etc

[6/3/2009 8:31:10 PM] James Thigpen: it'd look AWESOME

[6/3/2009 8:31:21 PM] Lloyd Humphreys: not a clue - nothing in the video about it

[6/3/2009 8:31:36 PM] Lloyd Humphreys: I imagine it'll be pretty solidly integrated with Android

[6/3/2009 8:31:50 PM] Tobin Titus: http://wave.google.com/

[6/3/2009 8:32:11 PM] Lloyd Humphreys: yeah

[6/3/2009 8:32:11 PM] Tobin Titus: http://wave.google.com/help/wave/about.html <-- screenshots

[6/3/2009 8:32:33 PM] Lloyd Humphreys: lost you

[6/3/2009 8:32:37 PM] Tobin Titus: lag

[6/3/2009 8:32:37 PM] Nathan Kelley: lag all

[6/3/2009 8:32:43 PM] Dane O'Connor: NJ ftl

[6/3/2009 8:32:44 PM] Dane O'Connor: !

[6/3/2009 8:32:46 PM] Tobin Titus: maybe the dingo ate your baby

[6/3/2009 8:34:28 PM] James Thigpen: Everytime I hear bing I think Chandler

[6/3/2009 8:34:31 PM] Tobin Titus: Cannibis lovers can search bong.bing.com

[6/3/2009 8:34:53 PM] Lloyd Humphreys: yup

[6/3/2009 8:36:27 PM] Lloyd Humphreys: for me, in ff3, that preview thing only works for one of the results and then doesn't work for any of the others?

[6/3/2009 8:36:33 PM] Sara Chipps: me too

[6/3/2009 8:36:34 PM] Lloyd Humphreys: lag

[6/3/2009 8:36:38 PM] Nick Berardi: is the travel feature from Kayak.com

[6/3/2009 8:36:55 PM] Tobin Titus: I'm in FF3 and it works fine

[6/3/2009 8:36:57 PM] Tobin Titus: yeah

[6/3/2009 8:37:00 PM] Tobin Titus: I think so

[6/3/2009 8:37:04 PM] Nathan Kelley: it's pretty accurate too, it says the red wings are 2 wins away from another cup

[6/3/2009 8:37:21 PM] Nathan Kelley: that didn't sound right

[6/3/2009 8:37:36 PM] Nathan Kelley: it said the wings won the 2009 stanly cup finals 4-1

[6/3/2009 8:38:13 PM] Lloyd Humphreys: yeah

[6/3/2009 8:38:29 PM] Tobin Titus: lol Nathan... shut your mouth son!

[6/3/2009 8:38:46 PM] Tobin Titus: There is no accuracy in that .. Pens will win again tomorrow!

[6/3/2009 8:38:55 PM] Lloyd Humphreys: I know Bing is great for newbs - if you look for NHL and it gives you related stuff like NHL tickets or something.. thing is, if I want the stuff in the related searches, I'll *search* for the related searches :P

[6/3/2009 8:39:09 PM] Sara Chipps: hahah, nice

[6/3/2009 8:39:43 PM] Tobin Titus: what about if we gave you a para quarters in stead?

[6/3/2009 8:39:50 PM] Nick Berardi: Tobin you have a really loud keyboard

[6/3/2009 8:40:00 PM] James Pendarvis: What are you using either service for?

[6/3/2009 8:41:11 PM] Sara Chipps: searching?

[6/3/2009 8:42:19 PM] Tobin Titus: http://twitpic.com/6jm02

[6/3/2009 8:43:08 PM] *** Tobin Titus has changed the conversation topic to "Twitter, Bing, Google, Searching, Symantic Web" ***

[6/3/2009 8:43:16 PM] *** Tobin Titus has changed the conversation topic to "Twitter, Bing, Google, Searching, Semantic Web" ***

[6/3/2009 8:43:18 PM] Lloyd Humphreys: give you free money

[6/3/2009 8:43:23 PM] Nick Berardi: PAY ME PER SEARCH

[6/3/2009 8:43:29 PM] Dane O'Connor: lol

[6/3/2009 8:43:31 PM] Sara Chipps: hahaha I love free money

[6/3/2009 8:43:31 PM] Dane O'Connor: omg

[6/3/2009 8:43:33 PM] Tobin Titus: Nick , they sorta tried that

[6/3/2009 8:43:35 PM] Norm: Has anyone used http://www.wolframalpha.com/ ?

[6/3/2009 8:43:37 PM] Lloyd Humphreys: yeah

[6/3/2009 8:44:09 PM] *** Tobin Titus has changed the conversation topic to "Paul Wolfowitz's new search engine" ***

[6/3/2009 8:44:59 PM] Norm: lol - right, it seems useful at some point but a bit unrefined

[6/3/2009 8:45:37 PM] Norm: true

[6/3/2009 8:46:23 PM] James Thigpen: I'm gonna make bing my default search engine in chrome for a few days, see what happens.

[6/3/2009 8:46:36 PM] Nathan Kelley: if people at work ask me search related questions i use http://lmgtfy.com/

[6/3/2009 8:47:36 PM] *** Tobin Titus has changed the conversation topic to "Talking to computer classes" ***

[6/3/2009 8:48:28 PM] Lloyd Humphreys: we have such boring computer classes here :(

[6/3/2009 8:49:25 PM] Lloyd Humphreys: thats wicked

[6/3/2009 8:50:13 PM] Norm: those are the best!!

[6/3/2009 8:50:15 PM] Lloyd Humphreys: :P

[6/3/2009 8:51:41 PM] *** Tobin Titus has changed the conversation topic to "Lego Mindstorm" ***

[6/3/2009 8:51:42 PM] Lloyd Humphreys: I was always more of a Meccano man

[6/3/2009 8:51:58 PM] brian papa: http://www.makerbot.com/

[6/3/2009 8:52:09 PM] Lloyd Humphreys: anybody played with Arduino?

[6/3/2009 8:52:55 PM] Nathan Kelley: http://www.nathanblevins.com/

[6/3/2009 8:53:01 PM] Tobin Titus: http://msdn.microsoft.com/en-us/robotics/default.aspx

[6/3/2009 8:53:41 PM] Lloyd Humphreys: just been playing with WAlpha - try Searching your DOB

[6/3/2009 8:55:22 PM] Lloyd Humphreys: sweet, I'm 815 weeks old :D

[6/3/2009 8:55:50 PM] James Pendarvis: Great..my B-day was the date of the Charles Manson Murders

[6/3/2009 8:55:53 PM] Lloyd Humphreys: I <3 Greys Anatomy :P

[6/3/2009 8:55:58 PM] Nick Berardi: so you want to cut off the recording, since this has degraded in to geeks searching wolfram alpha

[6/3/2009 8:56:08 PM] Lloyd Humphreys: haha

[6/3/2009 8:56:36 PM] Tobin Titus: http://wolframsbeta.com/

[6/3/2009 8:57:16 PM] Norm: or replay the awesome echo laughs

[6/3/2009 8:57:17 PM] Lloyd Humphreys: thats great

[6/3/2009 8:57:34 PM] Lloyd Humphreys: wtf is twiffleball?

[6/3/2009 8:57:59 PM] Lloyd Humphreys: wtf is wiffleball? :P

[6/3/2009 8:58:26 PM] Lloyd Humphreys: yeah

[6/3/2009 8:58:36 PM] Lloyd Humphreys: (y)

[6/3/2009 8:58:45 PM] Lloyd Humphreys: gotcha

[6/3/2009 8:59:09 PM] Lloyd Humphreys: if anybody feels like buying me a plane ticket I'll come on over :P

[6/3/2009 8:59:28 PM] Tobin Titus: "I did it like this. I did it like that. I did it with a wiffleball bat." ... see that just makes no sense.

[6/3/2009 8:59:58 PM] Tobin Titus: http://www.fmcarenas.com/img/wiffleball.jpg

[6/3/2009 9:01:11 PM] Nick Berardi: its all about hte networking

[6/3/2009 9:01:47 PM] Lloyd Humphreys: www.managingthegray.com is great for social media stuff - you'd be surprised

[6/3/2009 9:02:07 PM] Dane O'Connor: tobin!

[6/3/2009 9:02:14 PM] Nick Berardi: what is going on over there

[6/3/2009 9:02:54 PM] Nick Berardi: it's not April 1st anymore Sara

[6/3/2009 9:02:59 PM] Nick Berardi: you don't have to beleive everything

[6/3/2009 9:03:44 PM] brian papa: i'm gonna head out guys, had fun

[6/3/2009 9:03:50 PM] Lloyd Humphreys: bye

[6/3/2009 9:03:51 PM] Tobin Titus: see ya

[6/3/2009 9:03:51 PM] Dane O'Connor: cya bri

[6/3/2009 9:05:05 PM] Nathan Kelley: http://netcave.org/

[6/3/2009 9:05:16 PM] James Thigpen: thanks everyone

[6/3/2009 9:05:19 PM] Lloyd Humphreys: catch you soon :)

[6/3/2009 9:05:30 PM] Nathan Kelley: http://netcave.org/ct.ashx?id=8335804e-124b-4825-9292-2851bcba38bb&url=http%3a%2f%2fvimeo.com%2f3898804

[6/3/2009 9:05:57 PM] Norm: Yup same. Been great!

[6/3/2009 9:05:59 PM] Lloyd Humphreys: bye!

[6/3/2009 9:06:01 PM] *** Call ended ***

[6/3/2009 9:06:25 PM] *** Tobin Titus has left ***



Monday, June 1, 2009

The Rotting Stink of Corporate IT


My friend Lisa has a prejudice against those lip glosses that come in a little jar. The kind you dip your finger in and rub on your lips? She calls them little petri dishes, with all the bacteria and germs from your fingers just living in there waiting for their next home.


I see many similarities between lip gloss germ factories and corporate IT. There are good bacteria, and there are bad bacteria, but what they have in common is that they fester. The good developers fester in frustration, the frustration of change request forms. The frustration of knowing the right thing to do, and not being able to do it until four months later when the "budget is there." The bad programmers are festering in sloth, in the fact that their work goes largely unnoticed and as long as their tie matches their shirt we can ignore the fact that their classes go on for days, and their code is illegible, and their methods are bloated. In these environments you are taught that to care is to waste time, and the only thing that is important is that it GETS DONE, not if it is done right. A culture of apathy and wanton disregard for standards is all that is being enforced.


The biggest issue here is not the bad programmers, it's not the suffocated good programmers, as they say "A fish rots from the head." Management is who decides what the priorities are. If the priority is to "get it done so it works for now and ship it out" you will get exactly what you asked for. It starts at the top, when the CTO puts pressure on the IT Directors who put pressure on the Department Managers who in turn flip on their coders and turn the screws that bind them. Some symptoms of this are projects that are constantly coming back for work, deadlines that are constantly pushed, and the blame game from QA to the developers to the testers.


Can a large corporation have a healthy team? Yes. I didn't used to think so, but I have kept my eyes and ears open. I haven't experienced it, but I have met people that have shared their good experiences. The friends I have that are in corporate IT that are also happy have always had one thing in common: small teams. When you break up a big group into small teams, and hold the leaders of those teams personally responsible for the health of the team it succeeds. When you give them the tools they need for success, when you make it about who is contributing the best, when managers take the time to examine who is touching the code and IF what they are doing is the best solution, that's when you can succeed. When you allow for enough time and budget to make sure that things only need to be done once, and changes can be easily made, that's when you can succeed. The Five Dysfunctions book is a great place to start if you are looking to do so. I can imagine it's hard work, but when you look at companies like Microsoft and Google the reward is obviously worth it.