PlasticSCM Review

Well, I’m finally giving up.  I wanted it to work.  It’s looks great, and the advertised features are very impressive.  I have now spent about 3 to 4 days trying to get PlasticSCM up-and-running, and my work days are usually from 9am-5pm and 8pm-11pm, so that’s a lot of time.

Unfortunately, I just can’t get it working. I also have some serious concerns:

  • There is one support guy in the USA.  He’s fantastic, and knows his stuff inside and out.  But there’s only one of him.
  • Lots of little bugs and usability issues.
    • I have a screenshot of PlasticSCM showing me that my revisions are all happening tomorrow, while the Vista clock is clearly showing today’s date (and the server and the client are both on my desktop where I took the screen shot).
    • If you want to pull changes from another machine (my laptop in this case) you do a “pop”, because that apparently is the opposite of pushing changes to another server.  If the support guy hadn’t told me this I never would have thought to apply a “stack-data-structure” analogy to grabbing changes from another machine.
    • Right-clicking on the root of the repository and saying “Check-in (recursive)” doesn’t actually check-in all the changes.  I discovered that changes to files that I had not explicitly checked out were completely (and silently) ignored.  However, you can right-click on those files and then say “Check-in” and it will do so.  So the check-in recursive command doesn’t actually check-in all the files you’ve changed, unless you are clicking on a changed file explicitly and then the check-in command will check it in.  Software should be polite, and it should at the very least be consistent, and even better should probably ask if I want to include files I didn’t check-out and offer to show me the files.  The software should adapt to my needs, not vice-versa.
      (BTW, according to the support guy the solution is to click on the file root and say show changes, select them all, and then say check-in; that’s fine, but I really dislike the changing semantics of “check-in” and the silent failure to check-in modified but not explicitly checked-out files (like many other revision control systems will allow).
  • I never did get the Subversion import working.  They offered to do it for me if I sent them my subversion repository, but I just can’t bring myself to send all of my code to a 3rd party company without lots of legal paperwork in place.
  • Their website is under heavy construction, and apparently things like the 1-800 number got forgotten.  There should be strict processes for reviewing changes before pushing them out to the production website.  It’s still not there and this is three days after I mentioned it to them.
  • The documentation is dramatically wrong (see this post)

I know software has bugs – ALL software has bugs.  My software has bugs.  If the PlasticSCM date/time bug had been the only issue I’d encountered I’d have no problem paying for and using their product.  But it wasn’t, it was all of the above and more.  But in my previous job as a top-level systems architect and lead-developer with a very large finanical services company, it is really important not to mess up the basics, and with the right processes in place it’s not too hard either.

There are a few things I think they could do easily do better:

  • They need more than 1 person on support
  • For my business I use Ring Central, so if somebody phones the 1-800 number it goes directly to both my land-line and my cell phone at the same time.
  • To be honest, I don’t really care if there is bad grammar in the documentation, I understand we live in a global world; it’s not terribly impressive, but I understand.  However the documentation should not be flat-out wrong.  Have the developer that wrote the feature either write the documentation for it (if their English is good enough) or have the developer check out the documentation after the technical writer has written it.
  • Implement strict processes and controls for the website – it’s the first place a customer will come – spelling mistakes, broken forms and missing support phone numbers should never happen.  There are lots of services to check that a website is up and running, including submitting forms; on the back-end any request e-mail with say “FROM TEST SERVER” and then a really long silly (constant) number could be automatically deleted.  Additionally, before pushing out a new version of the website have somebody run through a check-list of features to test, including submitting forms.
  • Do usability testing, and do it often.  I do this as often as possible, and especially after implementing a new feature.  My experience is that people are always very happy to help out and give you their advice!  I’ll post more on usability testing soon, but it’s very easy to do and personally I find it very fun and rewarding.

I think  that Codice Software have a potentially really great product, and I’ll definitely check out PlasticSCM in a few more versions.  I think the easy and very visual branching is fantastic, and I love the distributed features (although sadly I didn’t get to try them out).  I wish them all the best.


PS.  The version I was trying to use is 2.8.163, and today’s date is 2009-12-08.

The PlasticSCM Evaluation: Not good so far, problems with ignore.conf

So I’ve downloaded PlasticSCM and I’m giving it a whirl, and sadly, so far I’m not impressed and I don’t even have my files into it yet!

After dealing with Subversion bugs and corruption the other day, I thought things would be smooth sailing.  Unfortunately, the PlasticSCM Subversion importer did not correctly import everything even after all that work.  So instead, I just did a direct export of just the current HEAD revision from Subversion into the Plastic workspace, and then did an “Add (recursive)” to add everything.

Of course, it added all my bin, obj, publish, etc folders too, which is no good, so I went looking in the documentation for how to ignore files and easily found the information.  I followed the documentation, and it didn’t work .

I posted on their forum, I Googled, I phoned their support #, I e-mailed their support.  Nothing.

So I started to play with it, and I eventually got it working.

Apparently the exclusion patterns are not compared to the file name or to the folder name as described in the documentation, but instead the exclusions are applied to the entire path!. That’s why I couldn’t just specify “desktop.ini“, because the path doesn’t match it!  Instead, *desktop.ini works, because that will ignore any desktop.ini file on any path.

Powerful yes, documented no; this is very different from the documentation and the release notes!
If anybody out there cares, here’s my now working ignore.conf file:

Here is what really worries me

  1. The documentation is dramatically wrong.
  2. Only one person replied to this forum thread
  3. That person was wrong
  4. When I called their support phone number I got an answering machine
  5. When I e-mailed their support I got absolutely no response (even to acknowledge that they received my question
    (I have still not received any response, more than 24 hours later)
  6. Google only had links to the incorrect documentation and release notes

Maybe I will not buy this after all despite the cool videos…

So far this entire process has wasted about 5 hours of my time, all in an effort to save 30 minutes every week with SubVersion problems.  This is not good…

Switching to PlasticSCM & Dealing with Subversion corruption

So I’m switching over to PlasticSCM, and I’m trying to import my existing SubVersion repository.

The PlasticSCM importer was easy enough to configure, and at first I pointed it against the VisualSvn Server bin directory. That didn’t work very well, and I immediately got a null-pointer exception. Continue reading Switching to PlasticSCM & Dealing with Subversion corruption

Switching to NLog

My application has about 165,000 lines of code, and I have been using log4net for all my logging needs.  However, for a client application that I’m working on I wondered if Log4Net was the best choice.  After doing some research and experimentation I decided it wasn’t.  Instead, NLog wins the new title, and it only took 1 hour to switch my entire 165,000 lines of code over to NLog.

Benefits of NLog over Log4Net:

  • Signs of life!  Log4Net doesn’t seem to be active any more – certainly there hasn’t been a release in ages.
  • Logging methods that accept format strings and parameters.
    This later is why switching to NLog took so long: I was able to go through my code (using VS2008 & searching across the entire solution) and remove all the irritating string concatenation, replacing them with format strings and parameters.  This means that if a logging level is turned off, the string concatenation will never occur!

So instead of:

log.Debug(“Some message ” + pieceOfData + ” and ” + someOtherData );

which ALWAYS results in 3 string concatenations even if debug logging is disabled, I can now do:

log.Debug(“Some message {0} and {1}”,pieceOfData,someOtherData );

which ONLY does a string concatenation if the debugging is enabled.

  • Automatic configuration – just start-up your application and go
  • More powerful configuration!
    Their configuration has LOTS of very cool marcos (which they call Layout Renderers).  This allowed me to eliminate a huge pile of messy C# log4net configuration code (complete with nasty casting to internal classes – which apparently is the “documented” approach) just to configure the output file to go into the user’s AppData local folder.Eliminiating C# code for a single easy-to-understand line of configuration is good!

So instead of all of this:

I now have this one line of configuration code in the XML configuration file:



  • NLog is also supported by Gibraltar!  (Which I WISH I owned…)

The only down side is that padding doesn’t always work, so laying out the log file for easier reading is not there yet (from the NLog blog):

…the use of “padding” attribute on layout renderers. If you used it in v1 you may have found
that it did not work for all renderers (depending on their implementation)

Apparently this is fixed in version 2, but I don’t know when that will be available.

Somebody has also already written an article about NLog and PostSharp which is cool because it means “free” logging.

I also can’t get it to do rolling log files every time the application starts up.  I’ve posted a question on the NLog forum here.


Things I have found to be true #1

A life lesson that I learned the hard way is this:

If I’m right about something it should easily to convince somebody of my point of view.

Now, “easy” might mean doing some research and writing up a small Word document if it’s a professional disagreement at work. It almost certainly means understanding the other person’s context: their point of view, their understanding of the way things work and ought to work, and the constraints they have to work within and why those constraints are there (and if they can possibly be removed, often with creative thinking or bringing somebody else into the discussion and repeating this process).

For example, I had a disagreement with boss about something. Before I tried to convince them I was right, I first asked lots of questions to understand why he thought he was right. I didn’t know the constraints the boss was working under, but I knew that their boss and the boss’s boss were often dogmatic about technology, and I respected the boss as a very intelligent person that always tried to make the best decisions (yes, it was great working with this gentleman!) So I worked hard to understand his constraints.

Mountain boyOnce I understood his context, I realized two things: 1. his understanding of the technologies in question was slightly incorrect (he is after-all the boss and slightly removed the technology after 20 years in management) and 2. he was rightly concerned about alignment with strategic technology direction, a few other projects that were doing something similar, larger scale, security initiates and how my suggested technology would worth within those constraints, etc. With that deeper understanding of the problem and solution criteria I did some research, wrote up a small Word document that outlined at a high level how two technologies worked, the pros and cons of both approaches and presented a summary evaluation of both technologies against a more complete set of criteria than I had originally been aware of. In the end we almost always chose the right technology.

This actually happened about 20 times in the 4 years that I had the pleasure of working with this gentleman, and sometimes the technology I had suggested was the better choice, and sometimes once I understood everything better my original thinking was wrong. Thus, this life lesson has an inescapable and important corollary:

If, after correctly understanding the complete problem, understanding all the solution criteria and understanding any other constraints, my original point of view may be wrong. However, that’s okay because we can now choose the right solution together.

And a few times, my original thinking was right, but artificial, capricious and immutable constraints defined by the boss’s boss’s boss (etc) meant that we couldn’t do the right thing, so we chose the best thing we could under the circumstances.

PS. The dogma clause

Obviously sometimes the constraints the other person is working within are their own personal dogma, and therefore absolutely preclude any ability to change their mind regardless of any amount of evidence. Hopefully (and usually?) this is not the case in a professional setting like work. I therefore cast out such situations as obviously not applicable to a professional discussion like this one is pretending to be. I also make it a rule to try my best to avoid issues with people whose personal dogma on the issue overrides evidence. However, it does happen even at work (as it the case with the boss’s boss’s boss etc above). I have found the best solution in such situations is to politely say that you’ll have to agree to disagree, then do what they are asking while looking for another job…

Failed to deserialize change-set. Operation is not valid due to the current state of the object.

I’ve had a long disucssion with myself over on the MSDN forums here:

I’ve reproduced it here:

I’ve written a domain service that allows basic CRUD operations for a person’s “Contacts”.  Lots and lots of unit tests run just fine against the server side code, and the Silverlight client can download all the contacts I put into the database using a SQL script and display them very nicely.

Unfortunately, I can’t create a new contact from the Silverlight side.  In the submit operation’s completed event handler I get the error message:

However,  in the submit operation completed event handler submitOp.EntitiesInError.Count()=0.  Thus, it doesn’t seem to be my new contact instance object that’s the problem.

I’ve overriden all the methods in the domain service adding try/catch blocks (or at least a breakpoint) and just calling base.whatever()  the only method that seems to be called is the Initialize(DomainServiceContext context) method, which completes normally.  The insert method of the domain service is definitely not called:

The JSON that is passed to the server is:

So, in a separate solution I started from scratch and created a new Silverlight  .NET RIA Services project. I copied the definition of the DTO contact class into this new project.  I can easily create new instances of the DTO contact class in the new project.   Then I copied my simplified GUI in to the original project and it doesn’t work, I get the same error as above.  Then I copied my simplified domain service to the original project and it STILL doesn’t work, I get the same error.

The contact DTO class was being automatically generated by my ORM tool, and was being annotated by that tool as follows:

When I had previously copied the DTO code to my simplified experimentation project I had not copied the attributes.  The moment I copied the attributes it stopped working.  Changing the name of the data contract to match the name of the class fixes the problem.

Notice that this is actually visible in the original JSON:

this should have been

I don’t know WCF so I don’t fully understand what this name is actually doing, although according to the MSDN documentation ( the default value is the name of the class.

Is it possible that this is a bug in .NET RIA Services, where RIA Services is assuming the data contract name is the same as the class name even when it doesn’t have to be?


I’ve asked Mindscape if LightSpeed could be modified to make this work:



Binding WPF to Dynamic Objects in the ViewModel tier

This is very cool, and should dramatically simplify the creation of the ViewModel tier!  I’ll blog about this more later