Scrum Tip: Don't underestimate your developers ability to underestimate

Estimating is hard. Developers, at least in my experience, are notorious for making their lives harder and underestimating tasks. No matter how often you tell them to be realistic, it doesn’t happen. There are a few things that can be done to mitigate this. Be realistic about the hours actually focused on development. Many team members, especially team leads, spend a lot of time doing other tasks outside of a sprint. »

Brian Hartsock on #Scrum,

Simple Security Tips

In many startups, the developer of an application is also in charge of managing the server. Since resources are thin, this is how it has to be. Developers don’t always make the best decisions when it comes to managing security concerns on servers though. Here a few tips to you developers in charge of managing servers. Believe me, if you’re successful, you will regret not having followed security best practicies from the beginning. »

Scrum Tip: How to make planning go smoother

Sprint planning can be one of the longest, most painful parts of the Scrum process. I have been in planning meetings that take a full day and still end with many questions up in the air. It is terrible. But it doesn’t have to be. Planning meetings have a singular purpose in my opinion: to define what the team is working on for the next sprint. Everything else is tangential. This is the real goal for me as product owner and development manager. »

8 signs of a great development environment

At least one person playing the air-guitar or drums at any given time Free coffee and soda Little bit chatter from pairing, conversation, and collaboration Lots of headphones to drown out the chatter At least one book on everyone’s desk The majority of the desks are filled, aka everyone isn’t always in meetings You can play bingo with the words test, unit, mock, loosely coupled, automate, build, pairing, code review, and powershell (Okay, maybe I threw that last one in there) Employees ask to come in and work 12 hours on a Saturday for a Hackathon Next Hackathon, May 9th. »

Scrum Tip: Tools change with team dynamics

My teams have been practicing Scrum for nearly a year, and it has been an eye opening experience. I have learned a lot, as has everyone at Mailtrust. I hope to post a few Scrum tips every now and again to help others learn from our mistakes and experiences. The first tip is don’t pick one tool for all your teams. Picking one shiny tool seems like the route to go when you first start Scrumming (that feels like a dirty word), but it isn’t. »

Brian Hartsock on #Scrum,

Backup Integrity Checks in the Cloud

Moving into the cloud is a big paradigm shift. Its hard to imagine what such a big change might look like, so start small. Don’t try to offload your whole system at once. Offload the small stuff that doesn’t fit anywhere else. One interesting use case for using the cloud is backup integrity checks for databases. Here is the scenario. You are doing backups regularly of your databases. You need to restore them every once and a while and verify they aren’t corrupt. »

Brian Hartsock on #Cloud,

Why I like WPF, yet dislike Web Forms

I have been playing with WPF over the past few weeks, and I kind of like it. What’s odd is I hate Web Forms, which has very similar concepts to WPF. Concepts like controls, data binding, data templates, etc… Why do I think WPF works while Web Forms don’t? The first step is really understanding what I dislike in Web Forms. Two reasons, ViewState and controls. ViewState I hate the ViewState. »

Review: Harmony One Remote

The Harmony One is easily the best buy of the past 6 months for me (even though someone bought it for me). For anyone with more than 1 home theater device, get this remote. Since I bought this remote, I have lost all my other remotes, and it is a good thing. It is a universal remote that focuses more on user actions that devices and inputs. For example, you can create a Watch TV action that turns on the TV, Receiver, and cable box together, and sets everything to the right input. »

New Year's Resolution - The Year of Community

It’s April, and I have decided what my new years resolution is going to be. The year of community. I have really enjoyed participating in Mailtrust’s tech talks, Code Camp, RVNUG, and a few speaking opportunities. Now, my goal is just to keep going. »

Brian Hartsock

Using Pipeline.Input for Powershell testing

Last week, I posted about how to unit test powershell, which I have been working with a little bit over the weekend. One thing I quickly realized was testing interaction with the pipeline is a must for Powershell. It’s pretty easy to do. Let’s start with the Get-Service cmdlet that ships with Powershell. If you load up reflector, you will see the follow class definition. [Cmdlet("Get", "Service", DefaultParameterSetName="Default")] public sealed class GetServiceCommand : MultipleServiceCommandBase { // Methods public GetServiceCommand(); protected override void ProcessRecord(); // Properties [Parameter(Position=0, ParameterSetName="Default", ValueFromPipelineByPropertyName=true, ValueFromPipeline=true), Alias(new string[] { "ServiceName" })] public string[] Name { get; set; } } Remembering the base test fixture from the previous post on TDD in Powershell, I can quickly write up a few tests that test a few different use cases of the get-service cmdlet with [Test] public void Get_Service_with_single_string_in_pipeline() { // "MySQL" | get-service var name = "MySQL"; var pipeline = Runspace.CreatePipeline(); pipeline.Input.Write(name); pipeline.Commands.Add("get-service"); var result = pipeline.Invoke(); AssertThatPipelineResultIsService(result, name); } [Test] public void Get_Service_with_single_object_in_pipeline_using_Name_property() { //New-Object PSObject | Add-Member NoteProperty Name "MySQL" -PassThru | get-service var name = "MySQL"; var pipeline = Runspace.CreatePipeline(); pipeline.Input.Write(new { Name = name }); pipeline.Commands.Add("get-service"); var result = pipeline.Invoke(); AssertThatPipelineResultIsService(result, name); } [Test] public void Get_Service_with_single_object_in_pipeline_using_ServiceName_property() { //New-Object PSObject | Add-Member NoteProperty ServiceName "MySQL" -PassThru | get-service var name = "MySQL"; var pipeline = Runspace.CreatePipeline(); pipeline.Input.Write(new { ServiceName = name }); pipeline.Commands.Add("get-service"); var result = pipeline.Invoke(); AssertThatPipelineResultIsService(result, name); } private void AssertThatPipelineResultIsService(Collection<psobject> result, string name) { Assert.That(result.Count == 1); Assert.That(result[0].BaseObject is ServiceController); Assert.That((result[0].BaseObject as ServiceController).ServiceName == name); } By using pipeline.Input.Write(), I can write to the pipeline before invoking commands. »