January 2006 - Posts

Pair Programming in Rockville MD on Weds 2/1/2006
Monday, January 30, 2006 9:07 AM

"Imagine working the code while constantly rethinking the grand scheme of the design in your head.  Imagine catching your typos first time, every time.  Imagine finding bugs twice as fast and having a good conversation about how to approach finding them.  Imagine learning new techniques, ideas and strategies while working on your code everyday.  If you already achieve all of these things on your own then skip the usergroup and go straight to a psychologist!  If not, then come along to learn why Pair Programming is fun, productive and a tremendous improvement to the otherwise black art of lone gun programming."

I will be speaking on Pair Programming at the WinProTeam .NET User Group in Rockville, Maryland on Wednesday 1st Feb 2006.

Pair Programming is something we practice on a daily basis and have done so for a few years now.  We have tried lots of different layouts and techniques to maximize productivity and developer satisfaction.  If you are looking to start pair programming or are experimenting with different approaches then this session is for you!

Stop by to join in the discussion, eat pizza and get a chance to win a free Secret Server license.

 

Jonathan Cogley is the CEO and founder of thycotic, a .NET consulting company and ISV in Washington DC.  thycotic has just released Thycotic Secret Server which is a secure web-based solution to both "Where is my Hotmail password?" and "Who has the password for our domain name?".  Secret Server is the leader in secret management and sharing within companies and teams.

Simple pluggable forum software
Thursday, January 26, 2006 1:06 PM

We had a requirement to provide a support forum in our online store for Secret Server which led to the classic "Buy vs. Build" decision. 

Build:  The requirements were very simple and it could be developed in-house but who wants to write simple forum code when it has been done many times before?!

Buy: Most of available options were too sophisticated for our requirements which could make integration difficult (either no source code provided or overly complicated software or restrictive licensing).

Then I found the Riverside Internet Forums on CodeProject by Mike Puddephat.  The forum uses 4 generic database tables and has custom controls in one dll (with source code provided).  You can add the custom control with a unique "forum id" to any ASPX page and it just works!  It was easy to integrate and achieve "single sign on" with our existing system by ensuring that our user maintenance code keeps the WS_Users (a forum table) up to date. 

Voila!  Secret Server now has an online support forum!

 

Jonathan Cogley is the CEO and founder of thycotic, a .NET consulting company and ISV in Washington DC.  thycotic has just released Thycotic Secret Server which is a secure web-based solution to both "Where is my Hotmail password?" and "Who has the password for our domain name?".  Secret Server is the leader in secret management and sharing within companies and teams.

Programmers don't buy support
Wednesday, January 18, 2006 9:04 AM

After thinking more on my previous post, the basic flaw in our plan was expecting a programmer to buy support. 

Programmers are relatively conservative buyers of software since:

  1. They don't buy much software, usually some form of management does.
  2. They typically want to build rather than buy.

If you think through all the products that you have purchased, how many offered support - did you buy it?  The best case where a programmer would purchase support is when it is bundled (such as with an MSDN subscription which programmers and especially independents often purchase themselves).  Would programmers buy the technical support tickets if they had a choice? 

The other flaw in the plan was expecting programmers to buy support when they weren't buying anything else.  Many developer tools vendors (source control and bug tracking for instance) offer support as an option when you buy a license.  I think this works for two reasons:

  1. If the authorized buyer is a management person then they are more likely to see the value (whether real or perceived) in getting support too.
  2. If the authorized buyer is a programmer then they already have their credit card out so the decision to buy has been made - now the vendor just has to close the deal on a bundle with support (typically through the draw of free upgrades if you buy a support contract).

Bottom line - make sure your business plan doesn't rely on programmers buying support contracts rather look for user license fees. 

(Many companies have taken the open source approach and changed it to have special versions that are either more convenient to install, have additional features or even different licenses for commercial purposes to drive their revenue.)

Do you buy support contracts?

Jonathan Cogley is the CEO and founder of thycotic, a .NET consulting company and ISV in Washington DC.  thycotic has just released Thycotic Secret Server which is a secure web-based solution to both "Where is my Hotmail password?" and "Who has the password for our domain name?".  Secret Server is the leader in secret management and sharing within companies and teams.

Open Source doesn't work (for your typical ISV)
Tuesday, January 17, 2006 9:31 AM

Can you feel the flamethrowers warming up? :-)  Larry O'Brien pointed me to this great SDTimes article "The Changing Face of Open Source".  In the article, Andrew Binstock discusses the challenges in coming up to speed with a complex codebase and contributing real value as a 'volunteer'.  He discusses how large projects tend to be primarily driven by commercial developers and concludes that the economics ultimately comes back to the same model as traditional closed source software.

We have released various of our internal APIs as open source in the last couple of a years and have made exactly $0 in direct revenue.  There have certainly been benefits through company recognition for some of these projects (especially Thycotic.RemoteScripting which has saved several developer butts when porting a classic ASP application to ASP.NET - we have also received kind words of appreciation for Thycotic.Data at user group meetings in the past and from random individuals on the internet).  Sure you say ... but what was your business model? How did you expect to make money?

It all started with the buzz of companies such as Netscape open sourcing their product and how it would take over the world (FireFox anyone?).  We had just finished reading the same book that convinced Netscape to open source Mozilla and were dreaming of a growing customer base and how a new revenue stream could be added from support contracts.  We learned over time that people don't pay for something when they can have it for free - and unfortunately developers only want support as long as it is free.  The quickest way to reduce our support calls to zero is to point people towards our support contract order form. :-)

Looking back, was it worth open sourcing these APIs?  The community recognition was wonderful but it is hard to assign a dollar value.  One thing that was a great success was the number of bug reports and bug fixes we received.  Developers were using the APIs and did much of our testing for us on various platforms and found/solved many problems.  This seems to fall in line with Andrew's findings.  However the support model did not work as a revenue stream.

Will we release future APIs as open source?  Yes, if we can adapt the model to generate revenue or if bug fixes and greater stability are sufficient benefits.  Time will tell.

 

Jonathan Cogley is the CEO and founder of thycotic, a .NET consulting company and ISV in Washington DC.  thycotic has just released Thycotic Secret Server which is a secure web-based solution to both "Where is my Hotmail password?" and "Who has the password for our domain name?".  Secret Server is the leader in secret management and sharing within companies and teams.

Secret Server now supports ASP.NET 2.0!
Wednesday, January 11, 2006 6:59 PM

Our product, Secret Server, now supports ASP.NET 2.0.  Testing on ASP.NET 2.0 started with a horrible crash on the secret view page resulting in the typical "but it worked fine in 1.1?!".

Here is the exception stack trace, we were seeing:

Message: Collection was modified; enumeration operation may not execute.
Exception: System.InvalidOperationException
StackTrace:
   at System.Web.UI.ControlCollection.ControlCollectionEnumerator.MoveNext()
   at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
   at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
   at System.Web.UI.WebControls.WebControl.RenderContents(HtmlTextWriter writer)
   at System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer)
   at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
   at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
   at System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
   at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
   at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
   at System.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer)
   at System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter output)
   at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
   at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
   at System.Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter writer)
   at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
   at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
   at System.Web.UI.HtmlControls.HtmlContainerControl.Render(HtmlTextWriter writer)
   at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
   at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
   at System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
   at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
   at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
   at System.Web.UI.Page.Render(HtmlTextWriter writer)
   at Thycotic.Foundation.WebControls.BasePage.RenderMiddle(HtmlTextWriter writer)
   at Thycotic.Foundation.WebControls.BasePage.RenderAll(HtmlTextWriter writer)
   at Thycotic.Foundation.WebControls.BasePage.Render(HtmlTextWriter writer)
   at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
   at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
   at System.Web.UI.Control.RenderControl(HtmlTextWriter writer
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Putting on our deerstalker and tapping our pipe, this stack trace still doesn't reveal the culprit and is not particularly helpful at all.  The exception message sounds like the error you get when modifying the collection inside a foreach loop, right?  But where?! - it appears to be happening in the Render method of one of the controls on the page - but which one?!  The error was finally trapped down through a slow process of trial and error to a custom webcontrol (in a compiled referenced dll, no less!) that has a curious ReadOnly capability that works fine in 1.1 but dies miserably in 2.0. 

Here is the code:

  1 protected override void Render(HtmlTextWriter writer)
  2 {
  3 	if (_readOnly)
  4 	{
  5 		Label label = new Label();
  6 		label.ID = this.ID;
  7 		label.Text = this.Text;
  8 		ReplaceSelfWithControl(label);
  9 		label.RenderControl(writer);
 10 	} 
 11 	else 
 12 	{
 13 		base.Render(writer);
 14 	}
 15 }
 16 
 17 private void ReplaceSelfWithControl(Control control)
 18 {
 19 	this.Parent.Controls.AddAt(this.Parent.Controls.IndexOf(this), control);
 20 	this.Parent.Controls.Remove(this);
 21 }

The problem (as you probably have guessed) is the ReplaceSelfWithControl method where the TextBox reaches back into the Controls collection and replaces itself with a Label. Changing the code to simply render the HTML output fixed the problem, like so:

  1 protected override void Render(HtmlTextWriter writer)
  2 {
  3 	if (_readOnly)
  4 	{
  5 		if (this.CssClass != null && this.CssClass.Trim() != "")
  6 		{
  7 			writer.AddAttribute("class", this.CssClass);
  8 		}
  9 		writer.AddAttribute("id", this.ClientID);
 10 		writer.RenderBeginTag(HtmlTextWriterTag.Span);
 11 		writer.Write(this.Text);
 12 		writer.RenderEndTag();
 13 	} 
 14 	else 
 15 	{
 16 		base.Render(writer);
 17 	}
 18 }

Hopefully this will help someone else tackling a similar problem.

 

Jonathan Cogley is the CEO and founder of thycotic, a .NET consulting company and ISV in Washington DC.  thycotic has just released Thycotic Secret Server which is a secure web-based solution to both "Where is my Hotmail password?" and "Who has the password for our domain name?".  Secret Server is the leader in secret management and sharing within companies and teams.

by thycotic | with no comments
Filed under: ,
More Posts