This may help communicate / coordinate efforts that span multiple development teams and stakeholders.
http://code.google.com/p/apropos/
Apropos is an open source agile planning tool focused on large team Agile Portfolio Planning. The typical use of Apropos would be an organization that:
* Uses an Agile development process like XP, Scrum, or Kanban
* Has multiple Agile teams that need to coordinate
* Makes use of an Agile Lifecycle Management (ALM) tool to track their team progress
The last point is very important. Apropos is designed to work in tandem with your existing ALM tool, not replace it. Most ALM tools do not provide the full tool set to support a Agile Project Portfolio Scheduling, which is where Apropos comes in.
Some of the benefits that you can realize from implementing an Agile Portfolio Process using Apropos as the foundation include:
* Synergies with downstream organizations such as Operations, Professional Services, and Sales
* Increased delivery value through organization-wide alignment of priorities
* Continuous improvement enabled by whole process feedback loops
* Realtime visibility into delivery status and potential blockages
Saturday, July 03, 2010
Tuesday, June 29, 2010
Clonezilla
http://clonezilla.org/
You're probably familiar with the popular proprietary commercial package Norton Ghost®. The problem with these kind of software packages is that it takes a lot of time to massively clone systems to many computers. You've probably also heard of Symantec's solution to this problem, Symantec Ghost Corporate Edition® with multicasting. Well, now there is an OpenSource clone system (OCS) solution called Clonezilla with unicasting and multicasting!
You're probably familiar with the popular proprietary commercial package Norton Ghost®. The problem with these kind of software packages is that it takes a lot of time to massively clone systems to many computers. You've probably also heard of Symantec's solution to this problem, Symantec Ghost Corporate Edition® with multicasting. Well, now there is an OpenSource clone system (OCS) solution called Clonezilla with unicasting and multicasting!
Tuesday, June 01, 2010
Setting up Windows 2008 Workstation
We have found this to be a very good reference for setting up Windows 2008 as a workstation:
http://www.win2008r2workstation.com/
http://www.win2008r2workstation.com/
Wednesday, May 19, 2010
Pex and Moles...Amazing Stuff
Our engineering team has greatly benefited from this revolutionary software.
Saturday, May 01, 2010
Bulk Insert
Discovered one way to do a bulk update using XML in sql 2005, not sure if it is optimal, but it works :)
Schema for tblContractBranchCustomerLocations:
PK_ContractBranchCustomerLocationId int
,DaysOfWeek VARCHAR(50)
,RateDefinition VARCHAR(50)
,LastUpdateDate smalldatetime
,LastUpdateUser varchar(11)
DECLARE @xmlDoc XML
SET @xmlDoc = ' '
UPDATE a
SET a.[DaysOfWeek] = Items.Item.value('@daysofweek','varchar(50)'),
a.[RateDefinition] = Items.Item.value('@ratedefinition','varchar(50)'),
a.[LastUpdateDate] = GETUTCDATE(),
a.[LastUpdateUser] = Items.Item.value('@audituser','varchar(11)')
FROM [tblContractBranchCustomerLocations] a
INNER JOIN @xmlDoc.nodes('/items/item') AS Items(Item) ON a.[PK_ContractBranchCustomerLocationId] = Items.Item.value('@id','int')
Schema for tblContractBranchCustomerLocations:
PK_ContractBranchCustomerLocationId int
,DaysOfWeek VARCHAR(50)
,RateDefinition VARCHAR(50)
,LastUpdateDate smalldatetime
,LastUpdateUser varchar(11)
DECLARE @xmlDoc XML
SET @xmlDoc = '
UPDATE a
SET a.[DaysOfWeek] = Items.Item.value('@daysofweek','varchar(50)'),
a.[RateDefinition] = Items.Item.value('@ratedefinition','varchar(50)'),
a.[LastUpdateDate] = GETUTCDATE(),
a.[LastUpdateUser] = Items.Item.value('@audituser','varchar(11)')
FROM [tblContractBranchCustomerLocations] a
INNER JOIN @xmlDoc.nodes('/items/item') AS Items(Item) ON a.[PK_ContractBranchCustomerLocationId] = Items.Item.value('@id','int')
Saturday, April 17, 2010
Microsoft: Changing Passwords Isn't Worth the Effort
I've thought for some time that the enforcement of strict password policies, especially in the corporate world, are an overkill. An interesting article.
http://www.pcmag.com/article2/0,2817,2362692,00.asp
http://www.pcmag.com/article2/0,2817,2362692,00.asp
Friday, March 26, 2010
Most software stinks... Know it, Learn it, Live it!
A thought provoking title and an article engineers on my team found to be a good read.
Saturday, March 20, 2010
Monday, February 22, 2010
Configuring Delegation for a Site or an Application in IIS 7
http://technet.microsoft.com/en-us/library/cc770505(WS.10).aspx
"When you configure the delegation state for site or application features, you can delegate a feature as Read Only. When you delegate a feature as Read Only, users who connect to the site or application see the feature in the UI but cannot configure the feature. This is useful if you want users to know that the feature exists, such as for troubleshooting, but you do not want to allow them to configure it."
"When you configure the delegation state for site or application features, you can delegate a feature as Read Only. When you delegate a feature as Read Only, users who connect to the site or application see the feature in the UI but cannot configure the feature. This is useful if you want users to know that the feature exists, such as for troubleshooting, but you do not want to allow them to configure it."
Thursday, February 18, 2010
UI Patterns Site
This site has very compelling information pertaining to UI design and user experience… something software engineers should pay more attention to.
http://quince.infragistics.com/#/Main
http://quince.infragistics.com/#/Main
Tuesday, January 26, 2010
User experience is becoming a key differentiator in software
In a January report by Forrester Research, analysts advised application developers to make five key changes in 2010. On that list: "Become passionate about user experience."
http://visualstudiomagazine.com/articles/2010/01/21/infragistics-expands-ux-patterns-explorer.aspx
http://visualstudiomagazine.com/articles/2010/01/21/infragistics-expands-ux-patterns-explorer.aspx
Wednesday, January 20, 2010
Paying Down Technical Debt
I put together this short bulleted list of things to bear in mind when working with applications that have a high amount of technical debt.
The Facts:
• Every application has some amount of technical debt…even Brink's CF systems
• Ignoring such technical debt is NOT an option
• We cannot just work on technical debt and not provide additional product enhancements
How do we address it?
• Identify the debt and how it's negatively impacting the application and organization
• Build a slam-dunk case for medium-to-large scale deficits…not "just because"
• Be creative and find a way to inject debt payment into an already desired product request
• Fix the debt. Avoid building any sort of temporary solution(s). Do it right.
Deficit Payment Tactics
• Provide constructive criticism to your peers, but don't beat each other up. Code Review.
• Consider refactoring over rewriting
• All code should have tests associated with it
• Measure before and after the change and identify improvement
• We'll work to improve collective ownership
• Review the debt backlog after each new release…ongoing refactoring is inevitable
• Learn from both yours and others mistakes
• Remind yourselves of what's helped make us successful….TEAMWORK
The Facts:
• Every application has some amount of technical debt…even Brink's CF systems
• Ignoring such technical debt is NOT an option
• We cannot just work on technical debt and not provide additional product enhancements
How do we address it?
• Identify the debt and how it's negatively impacting the application and organization
• Build a slam-dunk case for medium-to-large scale deficits…not "just because"
• Be creative and find a way to inject debt payment into an already desired product request
• Fix the debt. Avoid building any sort of temporary solution(s). Do it right.
Deficit Payment Tactics
• Provide constructive criticism to your peers, but don't beat each other up. Code Review.
• Consider refactoring over rewriting
• All code should have tests associated with it
• Measure before and after the change and identify improvement
• We'll work to improve collective ownership
• Review the debt backlog after each new release…ongoing refactoring is inevitable
• Learn from both yours and others mistakes
• Remind yourselves of what's helped make us successful….TEAMWORK
Sunday, December 20, 2009
Notes on Pragmatic Unit Testing
Andy Hunt's book on Pragmatic Unit Testing is a good resource and should be on the bookshelf of every .Net developer. I took a few notes while going through the book...
What to Test? Use Right BICEP method.
Right: Are the results right?
B: Are all the Boundary conditions correct?
I: Can we check Inverse relationships?
C: Can we Cross-check results using other means?
E: Can we force Error conditions to happen?
P: Are Performance characteristics within bounds?
Are the results right?
• We must validate method results and verify that the code ran correctly?
• Consider using data files for testing larger amounts of data.
• Use test classes/methods to prove the existing code is right.
Boundary Conditions
• Test the boundaries of code inputs using extreme data.
• Try to break the code and/or ensure data validation using garbage data that seems insane.
• Test for duplicates, data sequence, and security holes
• CORRECT (Conformance, Ordering, Range, Reference, Existence, Cardinality, Time)…more later
Check Inverse Relationships
• Work your methods backwards.
• Execute cycle of: 1) start with original data, 2) Inject Test Data, 3) Inverse new test data back to original data using test(s).
Cross-Check using Other Means
• Create a system of checks and balances by having test methods cross-check one another.
• Explicitly using different code to achieve the same results.
Force Error Conditions
• Create real-world scenarios by forcing errors to occur….creating negative tests.
• Some sample environmental scenarios include network availability, insufficient permissions, not enough disk space, overloaded CPU, etc.
What to Test? Use Right BICEP method.
Right: Are the results right?
B: Are all the Boundary conditions correct?
I: Can we check Inverse relationships?
C: Can we Cross-check results using other means?
E: Can we force Error conditions to happen?
P: Are Performance characteristics within bounds?
Are the results right?
• We must validate method results and verify that the code ran correctly?
• Consider using data files for testing larger amounts of data.
• Use test classes/methods to prove the existing code is right.
Boundary Conditions
• Test the boundaries of code inputs using extreme data.
• Try to break the code and/or ensure data validation using garbage data that seems insane.
• Test for duplicates, data sequence, and security holes
• CORRECT (Conformance, Ordering, Range, Reference, Existence, Cardinality, Time)…more later
Check Inverse Relationships
• Work your methods backwards.
• Execute cycle of: 1) start with original data, 2) Inject Test Data, 3) Inverse new test data back to original data using test(s).
Cross-Check using Other Means
• Create a system of checks and balances by having test methods cross-check one another.
• Explicitly using different code to achieve the same results.
Force Error Conditions
• Create real-world scenarios by forcing errors to occur….creating negative tests.
• Some sample environmental scenarios include network availability, insufficient permissions, not enough disk space, overloaded CPU, etc.
Friday, May 01, 2009
Waltzing with Bears: Managing Risk on Software Projects
I found this to be an interesting read. It has made me think a little more about the potential risks that are associated with developing software and how to go about managing those risks.
Sunday, March 01, 2009
Passing Lists in SQL Server 2005
DECLARE @productIds xml
SET @productIds ='3 6 15 '
SELECT
ParamValues.ID.value('.','VARCHAR(20)')
FROM @productIds.nodes('/Products/id') as ParamValues(ID)
SET @productIds ='
SELECT
ParamValues.ID.value('.','VARCHAR(20)')
FROM @productIds.nodes('/Products/id') as ParamValues(ID)
Wednesday, February 18, 2009
Hierarchical vs Linear Workflow
Several of the applications that we've built or are currently working on in the OSS group involve the processing of workflow in some form. If you peruse the Web you'll find there are a variety of types such as "activity-based" or "content-driven". Microsoft Windows Workflow Foundation supports two types: "Sequential" and "State Machine" (http://msdn.microsoft.com/en-us/library/ms468447.aspx). There is enough material out there though to make your head spin. Being that I'm not an authority on the subject I thought I'd explain in a simple-to-understand format the two types that we've used.
Hierarchical: workflow events are fired one at a time and they operate in a very sequential fashion...one waits on the other. Example: I fill out a form and submit it to my boss for approval. Until he approves or denies the request, the entire transaction is in a holding state. Once he approves it, it then gets submitted to his boss. If he denies the request, it comes back to me. After all approvals have been gathered, the transaction is considered complete.
Linear: here workflow events all fire off on different threads (asynchronously) and are independent of one another. They must all be completed though before the transaction can be considered complete. Example: I put in a request to get a widget ordered. This order requires the participation of four different groups to perform an action. So, requests are sent to all four groups and they all complete their task independent of one another. Once all four are completed, the widget can be processed.
Hopefully those two approaches make sense. If you have more to add to this topic, I welcome your feedback.
Hierarchical: workflow events are fired one at a time and they operate in a very sequential fashion...one waits on the other. Example: I fill out a form and submit it to my boss for approval. Until he approves or denies the request, the entire transaction is in a holding state. Once he approves it, it then gets submitted to his boss. If he denies the request, it comes back to me. After all approvals have been gathered, the transaction is considered complete.
Linear: here workflow events all fire off on different threads (asynchronously) and are independent of one another. They must all be completed though before the transaction can be considered complete. Example: I put in a request to get a widget ordered. This order requires the participation of four different groups to perform an action. So, requests are sent to all four groups and they all complete their task independent of one another. Once all four are completed, the widget can be processed.
Hopefully those two approaches make sense. If you have more to add to this topic, I welcome your feedback.
Friday, February 13, 2009
Shay
Someone sent me this story via email and I just had to share it...
At a fundraising dinner for a school that serves children with learning disabilities, the father of one of the students delivered a speech that would never be forgotten by all who attended. After extolling the school and its dedicated staff, he offered a question:
'When not interfered with by outside influences, everything nature does, is done with perfection. Yet my son, Shay, cannot learn things as other children do. He cannot understand things as other children do. Where is the natural order of things in my son?'
The audience was stilled by the query.
The father continued. 'I believe that when a child like Shay, who was mentally and physically disabled comes into the world, an opportunity to realize true human nature presents itself, and it comes in the way other people treat that child.'
Then he told the following story:
Shay and I had walked past a park where some boys Shay knew were playing baseball. Shay asked, 'Do you think they'll let me play?' I knew that most of the boys would not want someone like Shay on their team, but as a father I also understood that if my son were allowed to play, it would give him a much-needed sense of belonging and some confidence to be accepted by others in spite of his handicaps.
I approached one of the boys on the field and asked (not expecting much) if Shay could play. The boy looked around for guidance and said, 'We're losing by six runs and the game is in the eighth inning. I guess he can be on our team and we'll try to put him in to bat in the ninth inning.'
Shay struggled over to the team's bench and, with a broad smile, put on a team shirt. I watched with a small tear in my eye and warmth in my heart. The boys saw my joy at my son being accepted. In the bottom of the eighth inning, Shay's team scored a few runs but was still behind by three.
In the top of the ninth inning, Shay put on a glove and played in the right field. Even though no hits came his way, he was obviously ecstatic just to be in the game and on the field, grinning from ear to ear as I waved to him from the stands.
In the bottom of the ninth inning, Shay's team scored again.
Now, with two outs and the bases loaded, the potential winning run was on base and Shay was scheduled to be next at bat.
At this juncture, do they let Shay bat and give away their chance to win the game? Surprisingly, Shay was given the bat. Everyone knew that a hit was all but impossible because Shay didn't even know how to hold the bat properly, much less connect with the ball. However, as Shay stepped up to the Plate, the pitcher, recognizing that the other team was putting winning aside for this moment in Shay's life, moved in a few steps to lob the ball in softly so Shay could at least make contact.
The first pitch came and Shay swung clumsily and missed.
The pitcher again took a few steps forward to toss the ball softly towards Shay. As the pitch came in, Shay swung at the ball and hit a slow ground ball right back to the pitcher.
The game would now be over. The pitcher picked up the soft grounder and could have easily thrown the ball to the first baseman. Shay would have been out and that would have been the end of the game. Instead, the pitcher threw the ball right over the first baseman's head, out of reach of all team mates. Everyone from the stands and both teams started yelling, 'Shay, run to first! Run to first!' Never in his life had Shay ever run that far, but he made it to first base.
He scampered down the baseline, wide-eyed and startled.
Everyone yelled, 'Run to second, run to second!' Catching his breath, Shay awkwardly ran towards second, gleaming and struggling to make it to the base. By the time Shay rounded towards second base, the right fielder had the ball . The smallest guy on their team who now had his first chance to be the hero for his team. He could have thrown the ball to the second-baseman for the tag, but he understood the pitcher's intentions so he, too, intentionally threw the ball high and far over the third-baseman's head. Shay ran toward third base deliriously as the runners ahead of him circled the bases toward home.
All were screaming, 'Shay, Shay, Shay, all the Way Shay'
Shay reached third base because the opposing shortstop ran to help him by turning him in the direction of third base, and shouted, 'Run to third! Shay, run to third!' As Shay rounded third, the boys from both teams, and the spectators, were on their feet screaming, 'Shay, run home! Run home!' Shay ran to home, stepped on the plate, and was cheered as the hero who hit the grand slam and won the game for his team.
'That day', said the father softly with tears now rolling down his face, 'the boys from both teams helped bring a piece of true love and humanity into this world'.
Shay didn't make it to another summer. He died that winter, having never forgotten being the hero and making me so happy, and coming home and seeing his Mother tearfully embrace her little hero of the day!
At a fundraising dinner for a school that serves children with learning disabilities, the father of one of the students delivered a speech that would never be forgotten by all who attended. After extolling the school and its dedicated staff, he offered a question:
'When not interfered with by outside influences, everything nature does, is done with perfection. Yet my son, Shay, cannot learn things as other children do. He cannot understand things as other children do. Where is the natural order of things in my son?'
The audience was stilled by the query.
The father continued. 'I believe that when a child like Shay, who was mentally and physically disabled comes into the world, an opportunity to realize true human nature presents itself, and it comes in the way other people treat that child.'
Then he told the following story:
Shay and I had walked past a park where some boys Shay knew were playing baseball. Shay asked, 'Do you think they'll let me play?' I knew that most of the boys would not want someone like Shay on their team, but as a father I also understood that if my son were allowed to play, it would give him a much-needed sense of belonging and some confidence to be accepted by others in spite of his handicaps.
I approached one of the boys on the field and asked (not expecting much) if Shay could play. The boy looked around for guidance and said, 'We're losing by six runs and the game is in the eighth inning. I guess he can be on our team and we'll try to put him in to bat in the ninth inning.'
Shay struggled over to the team's bench and, with a broad smile, put on a team shirt. I watched with a small tear in my eye and warmth in my heart. The boys saw my joy at my son being accepted. In the bottom of the eighth inning, Shay's team scored a few runs but was still behind by three.
In the top of the ninth inning, Shay put on a glove and played in the right field. Even though no hits came his way, he was obviously ecstatic just to be in the game and on the field, grinning from ear to ear as I waved to him from the stands.
In the bottom of the ninth inning, Shay's team scored again.
Now, with two outs and the bases loaded, the potential winning run was on base and Shay was scheduled to be next at bat.
At this juncture, do they let Shay bat and give away their chance to win the game? Surprisingly, Shay was given the bat. Everyone knew that a hit was all but impossible because Shay didn't even know how to hold the bat properly, much less connect with the ball. However, as Shay stepped up to the Plate, the pitcher, recognizing that the other team was putting winning aside for this moment in Shay's life, moved in a few steps to lob the ball in softly so Shay could at least make contact.
The first pitch came and Shay swung clumsily and missed.
The pitcher again took a few steps forward to toss the ball softly towards Shay. As the pitch came in, Shay swung at the ball and hit a slow ground ball right back to the pitcher.
The game would now be over. The pitcher picked up the soft grounder and could have easily thrown the ball to the first baseman. Shay would have been out and that would have been the end of the game. Instead, the pitcher threw the ball right over the first baseman's head, out of reach of all team mates. Everyone from the stands and both teams started yelling, 'Shay, run to first! Run to first!' Never in his life had Shay ever run that far, but he made it to first base.
He scampered down the baseline, wide-eyed and startled.
Everyone yelled, 'Run to second, run to second!' Catching his breath, Shay awkwardly ran towards second, gleaming and struggling to make it to the base. By the time Shay rounded towards second base, the right fielder had the ball . The smallest guy on their team who now had his first chance to be the hero for his team. He could have thrown the ball to the second-baseman for the tag, but he understood the pitcher's intentions so he, too, intentionally threw the ball high and far over the third-baseman's head. Shay ran toward third base deliriously as the runners ahead of him circled the bases toward home.
All were screaming, 'Shay, Shay, Shay, all the Way Shay'
Shay reached third base because the opposing shortstop ran to help him by turning him in the direction of third base, and shouted, 'Run to third! Shay, run to third!' As Shay rounded third, the boys from both teams, and the spectators, were on their feet screaming, 'Shay, run home! Run home!' Shay ran to home, stepped on the plate, and was cheered as the hero who hit the grand slam and won the game for his team.
'That day', said the father softly with tears now rolling down his face, 'the boys from both teams helped bring a piece of true love and humanity into this world'.
Shay didn't make it to another summer. He died that winter, having never forgotten being the hero and making me so happy, and coming home and seeing his Mother tearfully embrace her little hero of the day!
Wednesday, February 11, 2009
Cohesion and Coupling
Every seasoned object-oriented developer should be familiar with these coding principles. Sometimes we forget though to implement them in the code that we write which leads to future refactoring. This article is a good reminder of these design and architecture patterns, and it provides some pretty good examples.
http://msdn.microsoft.com/en-us/magazine/cc947917.aspx
http://msdn.microsoft.com/en-us/magazine/cc947917.aspx
Sunday, February 01, 2009
URL ReWrite
void Application_BeginRequest(object sender, EventArgs e)
{
System.Web.HttpContext httpContext = HttpContext.Current;
String currentURL = httpContext.Request.Path.ToLower();
string processPath =currentURL.Substring(httpContext.Request.ApplicationPath.Length).TrimStart('/').ToLower();
//Creates th
string physicalPath = httpContext.Server.MapPath(
currentURL.Substring(currentURL.LastIndexOf("/") + 1));
//checks to see if the file does not exsists.
if (!System.IO.File.Exists(physicalPath))
{
string queryString =httpContext.Request.ServerVariables["QUERY_STRING"];
string defaultPage = "~/PageViewer.aspx?process=";
if (processPath.EndsWith(".aspx"))
processPath = processPath.Substring(0, processPath.Length - ".aspx".Length);
// Rewrites the path
httpContext.RewritePath(defaultPage + processPath + "&" + queryString);
}
}
{
System.Web.HttpContext httpContext = HttpContext.Current;
String currentURL = httpContext.Request.Path.ToLower();
string processPath =currentURL.Substring(httpContext.Request.ApplicationPath.Length).TrimStart('/').ToLower();
//Creates th
string physicalPath = httpContext.Server.MapPath(
currentURL.Substring(currentURL.LastIndexOf("/") + 1));
//checks to see if the file does not exsists.
if (!System.IO.File.Exists(physicalPath))
{
string queryString =httpContext.Request.ServerVariables["QUERY_STRING"];
string defaultPage = "~/PageViewer.aspx?process=";
if (processPath.EndsWith(".aspx"))
processPath = processPath.Substring(0, processPath.Length - ".aspx".Length);
// Rewrites the path
httpContext.RewritePath(defaultPage + processPath + "&" + queryString);
}
}
Peopleware: Productive Projects and Teams
This is one of the best books that I've read in a while on People Management. I would recommend it to all Development and Project Managers...heck, all managers in general.
Subscribe to:
Posts (Atom)



