First thoughts on Kanban

The project managers, and some of my team leads, have started throwing out the idea of Kanban instead of Scrum. Really, they are wanting to start with Scrumban, where they ease into Kanban and as Rex likes to say, “kick the ends out of Scrum”.

One of my teams has started playing with it. Here are my initial thoughts.

  • I don’t feel bad about pushing important things into a sprint that are a high priority. Even though they weren’t planned for, in Kanban they don’t throw anything off so it is fine to let a couple come in.
  • Since Kanban is a pull system, it puts more pressure on the upstream provider, aka me, the product owner. I have to be on the ball every day, not just once a month. Good, but takes some getting used to.
  • Tracking progress during a cycle is a little different. Burndown doesn’t really exist, but there are other metrics. I just haven’t gotten used to them yet.
  • Unfinished items during a sprint aren’t bastardized during the next sprint. They stay on the board, and keep getting worked on, instead of floating to some netherworld of we are kind of working on this, but we don’t really treat it like we are.
  • It is super agile. After I realized a recent story was missing some very important requirements, I put a new story up to get it worked on ASAP. Normally, this would get put in some CRITICAL pile when it really wasn’t, I just knew it needed to get done before the next iteration.
  • The team dynamic hasn’t really changed. They work the same, and I fill them in when something new comes in.

Overall, I think it is a great direction, but it takes a super disciplined team and a product owner that spends a lot of time with them.

More to come on this in future posts.

Scheduled Tasks in Powershell, Alpha

Scheduled tasks don’t have any good way to be edited in Powershell, at least from what I have seen. The other day I set out to write some scripts to help me out. This isn’t really cleaned up or final (aka I haven’t figured out the best error checking yet and it could use a decent refactoring), but I figured I would go ahead and throw them up here to get some feedback.

 
function get-scheduledtask($server=$env:COMPUTERNAME)
{
	$tempFile = $env:TEMP + "\scheduledtaskstemp.csv"
	schtasks /query /S $server /FO csv /V | where { $_.length -gt 0 } | Set-Content $tempFile
	Import-Csv $tempFile
	Remove-Item $tempFile
}
 
function remove-scheduledtask($taskname, $server=$env:COMPUTERNAME, [switch]$verbose, [switch]$whatif=$variable:whatifpreference)
{
	if(-not $taskname) { throw "Must provide taskname" }
	$command = "schtasks /DELETE /TN '$taskName'"
	if($server) { $command += " /S '$server' " }
 
	if($verbose -or $whatif) { $command }
	if(-not $whatif) { Invoke-Expression $command }
}
 
function run-scheduledtask($taskname, $server=$env:COMPUTERNAME, [switch]$verbose, [switch]$whatif=$variable:whatifpreference){
	if(-not $taskname) { throw "Must provide taskname" }
	$command = "schtasks /RUN /TN '$taskname'"
 
	if($server) { $command += " /S '$server' " }
 
	if($verbose -or $whatif) { $command }
	if(-not $whatif) { Invoke-Expression $command }
}
 
function add-scheduledtask {
	param
	(
		[string] $user, 
		[string] $password, 
		[string] $schedule,
		[string] $runUser,
		[string] $runPassword,
		$modifier, 
		$days, 
		$idleTime, 
		$taskName, 
		$taskRun, 
		$startTime, 
		$months, 
		$startDate, 
		$endDate, 
		$server=$env:COMPUTERNAME,
		[switch]$verbose,
		[switch]$whatif = $variable:whatifpreference
	)	
 
	if(-not $taskName) { throw "Must Provide a taskName" }
	if(-not $taskRun) { throw "Must provide a taskRun" }
	if(-not $schedule) { throw "Must provide a schedule" }
	if(-not $runPassword) { throw "Must provide a runPassword" }
	if(-not $runUser) { throw "Must provide a runUser"}
 
	$command = "schtasks /CREATE /TN '$taskname' /TR '$taskRun' /SC '$schedule' /RU '$runUser' /RP '$runPassword' "
 
	($user,"U"),
	($password,"P"),
	($modifer,"MO"),
	($days,"D"),
	($months,"M"),
	($idleTime,"I"),
	($startTime,"ST"),
	($server,"S"),
	($startDate,"SD"),
	($endDate,"ED")| 
		%{
			if($_[0]) { $command += " /$($_[1]) '$($_[0])' " }
		}
 
	if($verbose -or $whatif) { $command }
	if(-not $whatif) { Invoke-Expression $command }
}

Powershell and Grep

I am running Powershell V2 and needed to look through some log files from a bunch of different servers. Powershell V2 and this article showed me the light.

gci -recurse | gc | select-string -context 50 "some string to match" > results.txt

The context parameter is a Powershell V2 addition that helps give lines above and below the matched string. Select-String is slowly becoming the grep I need in Windows.