Thursday, November 15, 2007

Agile Excitement

I've been listening to Dismemberment Plan a lot more lately. Perhaps it's causing the excitement I used to feel when I was learning and in college.

Regardless, I've been learning and implementing a few things at work recently.
  1. Scrum. At our old school bi-weekly software meeting, I advised everyone that I wanted to start a scrum for the "Software" group project, which actually includes four people and probably 15 projects. Two are major and have been worked on for over a year by one or two people part time. I asked everyone to edit the wiki and add tasks that were on their personal lists, with due dates and the amount of time it would take them to finish it. They are doing this. This will become the product backlog, once I find better software to track and manage the priorities. I installed Tackle, and got it working. But I like the functionality. It's written with the new .NET 2.0 (ASP) data controls, and aren't very efficient for users. It's clumsy, and I'm having hte same problem in my first ASP.NET app that's used for auditing OCR images. Anyway. We have a product backlog. I will be prioritizing it while away on vacation in the coming week (Thanksgiving), so we can start a sprint when we all get back. I'm excited because I've run through two 2 week sprints with my own tasks, and it works better than the cowboy shit we were doing.

  2. Test Driven Development (TDD). I'm reading an article by Laurie Williams called "Agile Testing", which gives a very detailed example for using TDD with JUnit to set up a monopoly game board with users and such. Test Driven Development is where you write the test, first, before writing the code. The process is: Requirements -> Design -> Failed Unit Test -> Code -> Passing Unit Test -> Commit to SVN. This is basically what it means. So, the difference between what I'm thinking, and what this article says, is that I'm going to be using PyUnit and NUnit for different compliers and code. We might have to make some sort of xUnit for our firmware and assembly if we're to test and compile on the post commit hook in SVN...but I'm sure we'll get to that later. Four things have happened now that I've read this.

    1. Professors write better articles than professionals (i.e. O'Reilly).

    2. My Object Oriented skills need some work. I know that they're bad, but I wasn't trained as a software person...so let me write one .ASM file and get it over with, k? (no, really, I will be working on this for the coming designs.)

    3. TDD makes all of the problems I was having in my mind regarding development disappear. That sentence might not make sense to you, but basically, I think about my job all day and night. I don't think about how to solve the coding problems (those are easy), but the management and project problems. I'm very good at abstracting things, as well as drilling things down. I need a lot of work and TDD will most definitely make me a better professional software person.

    4. Even if I don't get a new job soon (where I can implement some of these things as a manager, or be told to utilize these advances as a junior developer), I will weasel my way into these old skool Japanese managers' styles and insert my own. The whole point of TDD and Scrum is to work from the bottom up, not the top down. Well, me and my software guys are the bottom of one of the 5 biggest companies in the world (circa 2000).

  3. Informally: eXtreme Programming (XP). I moved my cube next to the other full time software guy, and took down the wall between us. He was cool with it because we could collaborate better, and everyone else (except the CEO) was ok with it. I'll convince them that we'll be quicker on generating good code for them. We're in a position to sell tons of stuff to Asia and Europe...so I have to get ready for my first real public test (ok, Hyundai wasn't that bad). I know some of the ports liked my GUIs, but I hated them. I guess that minimalist approach (as well as centralizing software and updates) is a better design than what they get from SAIC or something...I don't know. I can't imagine that anything I do is better than anyone else in the world who writes code. I guess it works, and that's what they like, right? ANYWAY...time to make my stuff better and faster :).

  4. .NET 2.0 and 3.5, Python, SQL Server, and (possibly in the nearer future) java. Infrastructure. I'm doing it. I got some internal servers set up. The first two linux boxes these guys had, as well as the first three Win2003 servers were set up. I pushed for DNS server, Apache and IIS, SQL Server, MySQL, public FTP, public HTTP, VPN (required a new Cisco PIX), and other major changes. I RAID'ed all of the linux boxes, and wrote backup scripts. I forced the new software people to learn and use .NET2.0, and have been slowly feeding them 3.5 technology (Linq, XLinq, WCF, etc) to see what they think. I was the first person to write using Python, and now all of our services that we sell are written in Python (and async Twisted of course). I'm re-learning java to see if we can transfer any tech or projects to that instead of heavy C++ or not-strongly-typed-yet-immutable-strings python.
Wow, /me pats self on back. I've done quite a bit for the infrastructure. I'm getting it where it needed to be, now it's time to code like an Agile (Rock) Star (without the drugs, chicks, and fame). Maybe someday soon I'll look at applying to grad school so I can pick a field that's more specialized :).

Monday, November 05, 2007

Purdue University

I'd like to personally thank the university where I received a degree from, for allowing me to find and learn the following things on my own:
  1. Agile Development
  2. Test Driven Development (TDD)
  3. NUnit/PyUnit/xUnit/etc
  4. Scrum
  5. eXtreme Programming (XP)
  6. Pair Programming
  7. Good unit testing
  8. java
I guess it was my fault for being interested in a subject that requires a PhD for consideration of interviewing (VHDL and circuit board layout), and then falling back to a software position after graduation. I guess that's no body's fault but my own.