05
Dec 09

Building Momentum

Some of the best projects I have worked on have been those with momentum. It may be just a feeling, but regardless of whether the project is on schedule or behind, when everybody is on the same page productivity starts to breed productivity and a little more seems to get done each day.

I wonder if it would be possible to formalize this feeling into something that can be modeled, measured, reported and ultimately used to bring transparency to software projects. I started an open source project on github.com today to play around with this idea. Check it out!


25
Nov 09

Tear down pillars to build up software.

When I was in high school reading Franz Kafka’s The Metamorphosis I learned one of the most invaluable lessons of my life; every piece of good writing simply must begin with a well formulated and famously interesting first sentence. There were other themes the teacher wanted to discuss such as transformation and existentialism, but to my young pragmatic (future programmer) mind none of them were as logical as the first sentence rule. I learned this lesson so well that some of my best writing over the next few years was never committed to a page.

Hugh MacLeod suggests in Ignore Everybody: and 39 Other Keys to Creativity that I have created a mental pillar to hide behind which provides  opportunity for me to disengage from a creative and possibly productive activity such as writing.  He is exactly right.

We create pillars in the software industry all the time because software systems are complex and not predictable and our craft is at its core still a largely creative endeavor.  Personal pillars like mine above save us from putting ourselves out there to expose our creative (or lack thereof) inclinations.  Organizational pillars such as a policy preventing the use of open source software exist; well I am not sure *why* they exist but they do.

The complexity inherent within any software project leads to one of the most common pillars which I will refer to as requirement explosion; otherwise recognized as the phenomenon that prevents you from finally starting that open source project that you have been thinking about for months because you first need to come up with a project name and a description with which to create your github.com account (or should it be google code or sourceforge?) but before that or at the same time you should have a project website ready that provides your vision for which you will need to acquire a domain name that ideally matches the github.com name (that you haven’t created yet) as well as the visual studio solution name which by the way you probably need to create ASAP so users have something to download once they stumble upon your project.  Requirement explosion is paralyzing as we fear starting the first task without fully understanding the necessity and order of all the tasks and thus we do not move forward.

The spirit of this example actually occurs in some form in almost every project and team I have worked on.  No matter the level of technical talent, no matter the brute force hours; pillars exist that prevent us from excelling at what we do best; using technology to create value for our users. 

Towards this end and in the interest of getting things done I intend to identify pillars created by me and around me and tear them down.


11
Nov 09

Future of Software

I stumbled upon Programming Bits and Atoms by Neil Gershenfeld which I found both eye opening and a little inspirational. The premise of the talk is that computer science is founded upon an abstraction of the physical world which is beginning to break down and that in the future computer science and physics will converge.

Particularly compelling was an example of the unacceptable cost not of creating smart building technology but of deploying (and supporting and troubleshooting) the network topology required for such technology using our current IP stack. Internet 0 is solution that changes the game.

I took this video as a subtle reminder that we as software developers must continue to hone our craft. Microsoft.NET, Java, Ruby; these are tools that we use to solve problems today but they will not be the tools we use tomorrow. Sometimes I catch myself thinking; how can I solve this problem with a Microsoft.NET application?. I should be thinking; how can I *best* solve this problem? Maybe that means spending a little less time becoming an expert in a particular tool and a little more time becoming an expert in delivering solutions that provide tangible value to customers.

The future looks incredibly promising for our industry; there is so much interesting work to be done that we can’t afford to stop learning for even one day.


04
Nov 09

stackoverflow careers

The collection of stack* websites continues to grow.  The latest offering stackoverflow careers beta is a neat idea.  It will be interesting to see if it gains any traction. 

I signed up for an account and created a first cut CV which you can see here:

http://careers.stackoverflow.com/zacharyruiz

This site is definitely one to keep an eye on!


03
Oct 09

YouTrack Bugs from Anywhere with Powershell

I really dig the new issue tracker from the JetBrains folks formerly codenamed Charisma.  The in-browser experience is on the bleeding edge.

I spend a lot of time dreaming up or finding issues and bugs when I am not at my development machine.  When this happens often times I do not want to launch YouTrack and get stuck in; I would rather quickly log the issue and come back to it later to categorize, investigate or assign. 

YouTrack has an undocumented REST API for needs like this.  I have ported their Java example to a quick and dirty powershell script:

param($summary, $project, $usr, $pwd, $youtrack_url)

$cookies = new-object Net.CookieContainer

function http-post([string]$url, [string]$postData) {
    $buffer = [text.encoding]::ascii.getbytes($postData)
    [net.httpWebRequest] $req = [net.webRequest]::create($url)
    $req.method = "POST"
    $req.ContentType = "application/x-www-form-urlencoded"
    $req.ContentLength = $buffer.length
    $req.TimeOut = 5000
    $req.CookieContainer = $cookies
    $reqst = $req.getRequestStream()
    $reqst.write($buffer, 0, $buffer.length)
    $reqst.flush()
    $reqst.close()
    [net.httpWebResponse] $res = $req.getResponse()
    $resst = $res.getResponseStream()
    $sr = new-object IO.StreamReader($resst)
    $results = $sr.ReadToEnd()
    # save cookies for next request
    foreach($cookie in $res.Cookies) {
        $cookies.Add($cookie)
    }
    $results
}

if (([xml](http-post "$youtrack_url/rest/user/login" "login=$usr&password=$pwd")).login -match "ok") {
    $id = ([xml](http-post "$youtrack_url/rest/issue" "project=$project&summary=$summary")).issue.id[0]
    return "issue $id created in youtrack..."
}

I look forward to refactoring this script into a full featured library as the need arises and the YouTrack REST API becomes documented. 

In the meantime I keep this script on my portable USB drive.  I have a home grown application launcher that I like to use to execute scripts like the one above.

image

So when I am in the lab being a “user” and I find a bug, I just type “<project code> bug <summary>” as illustrated above and a new issue will be opened in YouTrack.  Later in the afternoon when I am at my desk being a “developer” I can fire up YouTrack and take it from there.


14
Sep 09

New Project Documentation Stack

A colleague posed an interesting question today; if I was starting a new project for a client from scratch (ground zero, day 1) what documentation would I want to put together to capture the business requirements?

Of course the real world answer would vary from client to client.  More times than not the business requirements would mostly be defined and documented by someone else before I was brought onto the team.  Likewise teams often already have a preferred process in place with document templates, etc.

But just for fun; if I was tasked with starting the documentation stack for a brand new project today, this is what I would do…

1.) Brainstorm

My brainstorming tool of choice is FreeMind

I would sit down with the primary project stakeholder(s) and capture any and every idea we can conjure about the system we want to build.  No idea is too big or too far out for the mind map; this should be a fun exercise to generate some excitement and momentum for the project.

2.) Capture Requirements and Use Cases

The next step would be to sit down with *all* the project and product stakeholders and refine the wild ideas from the previous exercise into something real.  The important concept here is the brainstorming that happened above are the ideas of myself and one or two people while at this stage we want to capture the ideas of everybody else including the users.

The form will be a document that summarizes the business case (goals, scope, objectives) as well as requirement considerations and important use cases.  I say requirement considerations because these are not the final requirements, but rather a stepping stone on the path towards the final requirements.  If you believe that requirements are revealed as opposed to created then this document is your bridge to somewhere.

I use the following categories when interviewing the project stakeholders and users:

image 

I am not sure where I came across this list and I almost never wind up with a ton of stuff in every single category but this list really gets me thinking about other important facets of the system on top of core functionality.

The use cases in this document will include the standard sections: goal, actors, pre-conditions, paths, etc.  When this document is complete everybody on the project should be able to read it and understand it and be on the same page and it will be important to keep this document up to date throughout the project. 

3.) Formulate User Stories

I prefer to work with user stories as opposed to formal requirements from this point out.  A large batch of the user stories can be gleaned from the document above and entered into something like TargetProcess.  The sooner I can get to this phase of the project the better; but not at the expense of the previous two steps.  The most important consideration moving forward is that I am not allowed to create user stories when I feel like it.  I must get some small version of the system in the hands of the stakeholders and users so they can refine and add to the backlog of stories while I continue fleshing out the documentation stack with design documentation, architecture diagrams, a test plan, etc.


09
Sep 09

Software Development: Having Fun vs. Doing My Job

As a software developer it is my responsibility to maintain connections between my work and the real world.  I cannot afford to code features that no one will use, to write documents that no one will read, to use tools that do not add value.  I love getting lost in the code for weeks as much as anyone, churning out feature after feature while experimenting with the latest productivity tools.  But ultimately if these efforts do not create value for my customers they are best suited for a hobby.

It is no longer good enough to exist as a software developer following a given software process.  I must constantly step away from my laptop to run my code on other people’s machines;  working code on my machine means absolutely nothing.  I must question *everything*;  my intuition regarding  look and feel of a graphical user interface is meaningless.  I must keep looking after the first solution to a problem presents itself; the second solution or the third may provide more value to my project.  I must never do anything for only one reason;  my time is too valuable to waste killing one bird with one stone.  I must assume nothing; talking to my users face to face on a regular basis is the only way to understand their ever changing realities.

If I sit at my laptop and code away day after day I may be having fun but I am not doing my job.


23
Aug 09

Continuous Integration with Charisma

I am a People over Process person.  Once we have the right people in place it is essential to craft a process which empowers our team to produce to their absolute full potential; anything less and we waste time and money.

I have decided to wire up a software development process using some new tools with the goal of increasing my own efficiency for consulting projects and hobby projects.  The first step is to choose some tools;  I will start with these three:

TargetProcess for User Stories

I chose TargetProcess after looking at the following screenshot:

image

This is how I want to track my project regardless of whether I choose to embrace pure Kanban.  TargetProcess is designed for flexibility.

TeamCity for Builds

Automated builds are a must and I want mine to look like this:

image

Charisma for Bug Tracking

I chose Charisma after looking at the following screenshot:

image

A bug tracker that puts search and tagging first is very intriguing.

Extensibility and interoperability were also major factors in the choices above because we are going to create user stories and bugs using two different applications, each tuned to its specific audience.

Future Posts in this Series:

  • Explore TeamCity
  • Explore TargetProcess
  • Explore Charisma
  • Development Process Overview\Design
  • Integrating Charisma with TargetProcess
  • Integrating Charisma with TeamCity
  • Case Studies
  • Lessons Learned


08
Jul 09

Continuous Integration Progress

I have been addicted to Continuous Integration for the last five years.  The first question I ask when I start a new project is “What does your build look like?”  If the answer doesn’t include the words fully automated or single button press I am extremely disappointed.  It’s really almost a physical reaction; I want nothing to do with any software project that doesn’t rely on an automated build.  I can’t help it of course but honestly, the tools are out there and freely available; there is no excuse at this point.

So all of my projects have automated builds.  I used CruiseControl.NET for many years with much satisfaction.  Over time I built up a generic NAnt build script that all my projects relied on.  This script automated the works; unit testing, code coverage, static analysis, coding standards checking, etc.  I haven’t looked at it in a long time but I opened it today…

image

it’s 1500 lines of XML!!!  For years it has provided bang for the buck because I have used it in over 20 projects but man, 1500 lines of XML is not something you ever want to look at.

I opened this script because I need to port one of my old CruiseControl.NET builds to JetBrains TeamCity 4.5.  My initial thought was that I would simply configure TeamCity to use the NAnt Build Runner to kick off targets in my existing script much like CruiseControl.

It didn’t take long to realize that TeamCity is too awesome for my monster script.  In one hour I was able to completely throw away my 1500 lines and get my project building and unit tested in TeamCity with zero lines of script.  Zero lines!

I love to see how much progress is being made in continuous integration tooling.  I will post shortly about what an incredible piece of software JetBrains TeamCity 4.5 is.


30
Jun 09

Backwards Compatibility for Firefox Extensions

A year and a half ago I wrote a Firefox extension to learn how they work.  We were all using Firefox 2.4 or thereabouts at the time.  I never finished it and today I dusted it off and tried to install it within my Firefox v3.0.3.  Naturally the installation failed; I feared as much considering the major version change.

Imagine my surprise…

InstallRDF

when the extension installed perfectly after updating my supported maxVersion to 3.0.*. 

Kudos to the folks for maintaining backwards compatibility!  Too many software projects sacrifice this necessity under the crunch of a deadline or the spell of the next killer feature.  I like Firefox now more than ever.  Bring on Firefox 3.5!