Thursday, January 16, 2020

Rapid XAML - sticking with the name

Back in November last year, while awaiting the transfer of ownership, I considered renaming the Rapid XAML Toolkit.

Spoiler, I decided to keep it the same.

However, possible pronunciation issues almost made me reconsider.

It's a hard word for some to pronounce.

It can be confused for rabid or rabbit (🐇). I've even heard some people pronounce "wrapped" the way I pronounce 'rapid.'

To complicate things further, today, I also saw this.

I'm still sticking put though.
Hopefully, I'll be able to promote it in a way that can avoid confusion over the name and its pronunciation.

Friday, January 10, 2020

4 responses to Citizen Development

I was recently asked what I thought about citizen developers/development.
If you're not familiar with the term, it's the ability for "power-users" to create apps for their own use.

My answer comes in four parts.
  1. In General
  2. As a developer
  3. As a business-person
  4. and as a designer.

General (human response)
Citizen development is a good thing. It's great to be able to empower people to create their own solutions and not have them be held back through limited resources or overly controlling processes.


Developer (and IT department)
With my "developer hat" on I have some concerns.
- Will developers in the company be expected to support such apps?
- Will developers be asked to change citizen developed apps?
- How will these apps work alongside other developed software?
- Will the same rigors of testing and reliability be applied to citizen developed apps as ones created by an IT department?
- What if a citizen developed app needs to be reimplemented by the IT department? Is this something that needs to be considered, planned, or prepared for?
- How to balance the needs of an entire company when some departments are doing citizen development and others aren't?
- How to avoid the creation of a "shadow IT" department? Or departments going out and doing other IT related things themselves?
- What support is needed/required from the IT department for those creating citizen apps?

With my "business hat" on I have different concerns.
- How do we verify the accuracy of what's developed and what it does?
- What if there are legal consequences associated with actions taken in the apps? (e.g. personal or private information not tracked or protected correctly.)
- How do we keep track of what's developed, where they're distributed, when, where, and how they're used?
- What happens if the people who develop these things leave the company and changes need to be made?
- What happens if the company supplying the tools to make these apps goes away, or stops making them?
- What if we need a change or support from the company making the tool to create the apps?

These business and developer concerns may seem extreme but the idea of a department in a business that has their own Excel spreadsheet containing complex formulas and macros is common. That those spreadsheets are things that no-one knows all the details about how they work, what they actually do, how to successfully modify them, or the full consequences of changing them, is not uncommon. I see a great potential similarity between such spreadsheets and citizen developed apps.

With my "Designer-hat" on my concerns are different again.
- Most of the apps I've seen developed with these tools are ugly. At best they're like 20-year old WinForms apps. Through their crude visual designers, it's easy to end up with the app equivalent of bad PowerPoint and they don't have the tools or guidance to make anything better.
- There are more practical implications too. What about the accessibility needs of users of developed apps? How do they support accessibility tools like screen-readers? What about system-wide accessibility settings like text size changes or high-contrast?
- How are (or can) designers (be) involved in the creation of these apps to ensure good usability and UX practices?


So what can be done about this?
I'm not sure yet. I don't even know if these concerns are valid. They may not apply or matter to the businesses that use them.

I'm hoping that I'll learn more and get responses to some of my concerns when I attend Ignite: The Tour next week.

Tuesday, January 07, 2020

Decoding feedback - 4/5 stars

I recently saw this software review being shared on Twitter.
THIS APP HAS EVERYTHING I COULD WANT but it does more than I need. 4/5 stars
The implication was that if it does everything that they want the reviewer should have given it 5 stars.
4 filled stars, one empty
This sat in my mind for a while and the response I was building became too long for Twitter so I'm posting it here.

Part of the job of a developer and any business owner is to understand what customers (or users) want. Often you have to try and work this out for yourself. If you're fortunate they'll tell you what they think or what they think they want. The trick of being a good business owner, or product manager, or customer relations person, or developer working from a spec is being able to take what is said and working out what is meant.

Reviews are great feedback. Let's see what the person who left the above review might be telling us. With no more context, we have to guess at some of it but let's what they might be saying as an exercise in trying to understand the user and identify ways of improving a product.

  • This app does all they want. It's important to recognize that we're in a positive place and we want to make it even better. Don't start by being defensive and critical of what is mostly positive feedback. This is a learning opportunity.
  • But they don't think it's perfect. The opportunity for improvement.
  • Doing more than they need may be a problem. The challenge here is finding out why this is the case.
  • Maybe there are so many features, options, and pieces of functionality it's hard to get to the ones they want.
  • Maybe the features they want are at the bottom of or hidden in, a long list that the person has to search through each time.
  • Maybe the terms the app uses aren't the ones the person uses and so they are forced to remember (or figure out--through trial and error) the translations each time they use the app.
  • Maybe it's hard to do the things that they want, even though they are possible.
  • Maybe they have to navigate through multiple pages/sections/menus to get to the functionality they want.
  • Maybe the app has ways around the issue they're encountering but they don't know how and so it's just an education issue.

So, what could be done about this?

  • If possible, seek clarification.
  • Consolidate this feedback with what others are saying.
  • Address the concerns once it's known what they are.
    My guess is that the ability to mark options as favorites or maintain a recently used list will help but it's worth exploring the possible other issues highlighted above to see if they're issues too.


Sunday, January 05, 2020

The specified ITextSnapshot doesn't belong to the correct TextBuffer - a solution

I'm assuming you're reading this because you encountered this error message in a Visual Studio log and didn't know what to do about it.

"The specified ITextSnapshot doesn't belong to the correct TextBuffer."

You may even have found a number of other blog and forum posts looking for answers but finding none.
I've been there myself.

This is a record of how I fixed this issue. This applies to how I addressed it in an extension I'm writing. If you're just using VS and not writing an extension yourself this is unlikely to be useful or interesting. If you are investigating this because of an extension you're writing, please note that you might be having this issue because of another issue to me.

Disclaimer over, I noticed this error occurring when a config file was deleted from the project.

The call stack in the log wasn't immediately helpful either.

System.ArgumentException: The specified ITextSnapshot doesn't belong to the correct TextBuffer.
   at Microsoft.VisualStudio.Text.SnapshotSpan.TranslateTo(ITextSnapshot targetSnapshot, SpanTrackingMode spanTrackingMode)
   at Microsoft.VisualStudio.Text.Tagging.Implementation.TagAggregator`1.<GetTagsForBuffer>d__47.MoveNext()
   at Microsoft.VisualStudio.Text.Tagging.Implementation.TagAggregator`1.<InternalGetTags>d__51.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at Microsoft.VisualStudio.Text.AdornmentLibrary.Squiggles.Implementation.SquiggleVisualManager.GetNormalizedSquiggleSpanCollections(ITextViewLine line)
   at Microsoft.VisualStudio.Text.AdornmentLibrary.Squiggles.Implementation.SquiggleVisualManager.UpdateVisualsOn(IEnumerable`1 lines, Boolean removeOldSquiggles)
   at Microsoft.VisualStudio.Text.AdornmentLibrary.Squiggles.Implementation.SquiggleVisualManager.UpdateSquigglesOnInvalidatedSpans()
   at Microsoft.VisualStudio.Text.AdornmentLibrary.Squiggles.Implementation.SquiggleVisualManager.OnLayoutChanged(Object sender, TextViewLayoutChangedEventArgs e)
   at Microsoft.VisualStudio.Text.Utilities.GuardedOperations.RaiseEvent[TArgs](Object sender, EventHandler`1 eventHandlers, TArgs args)

However, on reflection, it did provide a hint.
The mention of `GetTagsForBuffer` made me look at what I was doing with tagging.

In my `ITagger<T>` implementation I was using a cache of created tags to avoid needing to recreate them unnecessarily. However, it seems that changing the project that an open file is in causes a new TextBuffer to be created.
The consequence of this is that my cached tags now refer to a Snapshot with a different TextBuffer and that causes VS to have (but log) an exception.

My solution is that in the GetTags method, I check that the TextBuffer of the NormalizedSnapshotSpanCollection matches the TextBuffer of the SnapShot of the cached tags.
I only return the tags if they do match and if they don't I invalidate the cache for that file.

Hopefully, this helps save someone else some time trying to debug a similar issue.

Wednesday, December 04, 2019

Uno talk notes (links)

Today I gave a talk about Uno in London.

Here are the links I mentioned (all in one handy place 😀)

Main website -
GitHub -

All the latest details -

Try it out (Sample apps)
Android app -
iOS app -
Windows app -
In browser -

Other browser-based demos
In browser DB -
SkiaSharp -
Community Toolkit -
Lottie (animations) -

Ask for help -