Jekyll2026-02-12T02:41:03+00:00https://gorshing.net/feed.xmlChad GorshingMy own writings and ramblings. Chad GorshingBrands Owning Their Delivery Channel2020-09-17T00:00:00+00:002020-09-17T00:00:00+00:00https://gorshing.net/2020/09/owning-the-delivery-channelFor your brand or business, the times for short term plays and long term plays can get mixed. Being able to do a new offering now, shows speed, quickness, agility, and time to market. All of which are valid characteristics for any business to aspire to, but I hope you do not go into ventures because you can, there is more at risk than just short term increased sales. Please play the long game even if there is pain in the short term.

Many of us are accustomed to using a shipping/delivery provider for things we buy online. Most businesses are not in the transport business, so it makes sense to focus on their differentiating factor and leave the shipping to others. This is obvious where the product is shipped further away from any brick and mortal or where the customer is already going to your digital property (website, app ..etc) to purchase your goods. They are on your platform. They are engaging with your brand. As a Brand Owner, I agree with this, as a customer I am happy to engage with the brands I love.

As Retail Delivery Providers have grown this last decade, I hope brands keep in mind what they are losing when asking their guests/customers to engage on a third party platform. This either removes or makes more difficult the ability to use rewards or loyalty points, the brand loses the ability to market themselves, customers loose due to paying more money, and worst of all the brand trains customers to go somewhere else to get their product. While the customer gets used to this, they will grow to engage with brands on their delivery provider of choice. This will open the gates for these delivery providers to own the experience and remove your business from the transaction.

Often there is not a single event that ruins a company, but do keep in mind how Toys R Us celebrated selling their toys on Amazon. They trained their customers to go elsewhere for their product. Amazon didn’t need them for long. People began to get used to going to Amazon for toys, not Toys R Us anymore. I see the same thing happening to restaurants and delivery providers. As restaurants continue to push customers to Postmates, Grubhub, and UeberEats, the experience will be moved. It will slowly not matter where you get fried rice, hamburgers, or butter chicken from. Postmates will create their own kitchen and offer to sell their food. Thus becoming the largest restaurant chain. I believe it is already happening.

Brands need to take these things seriously and think forward.

I see two options in these scenarios. One is to perform your own delivery. If you own the delivery of your product to customers that are a quick drive away, then invest in your own drivers. Owning the full experience will differentiate your brand amongst the crowd. You will be unique. Customers will notice and they will like it. The other option is to flip how online orders flow. Instead of from the delivery providers site into your business, businesses can continue to own the experience and integrate with each delivery provider. This will require a fair amount of software integration, but this is a strategic move. It will hurt in the short term, but will be significantly better in the long term. It will also allow you to slowly strangle out the delivery provider and your brand to continue to own the experience.

My hope is brands look harder at the last mile to the customer and make a strategic decision on who they want to own that. It’s a new time.

]]>
Chad Gorshing
Motivating Your Team2020-09-01T00:00:00+00:002020-09-01T00:00:00+00:00https://gorshing.net/2020/09/motivating-your-teamKeeping a software team going, engaged, and motivated doesn’t take someone cheering to hype up the team. This would work about as well as cheering for someone working on a crossword puzzle, in fact it would have the opposite intended impact. Encouraging and motivating a cognitive basis team takes a different approach. Many seemingly innocuous actions can negatively impact a team, instead of focusing on what not to do, I wanted to go over what I feel are good things to do.

Many of these are a blog post within theirselves, so to keep this down in size, I’ll try and make it quick. But each topic could be expanded upon.

Working Agreements

Teams need to have their own working agreements. I often find employees not thinking of doing this enough, and is something vendors/contractors do more often. They need to establish working agreements because they need this as a place of understanding and setting expectations. I find discussions, arguments, and some conflicts can be resolved long before emotions are at play by establishing proper working agreements. These can be used as conventions, or “rails”, for the team to follow.

You can easily find templates for establishing working agreements online, having the team spell out what their own beliefs, values, and rules of the game are important for establishing self-autonomy.

Limit WIP

Find ways to limit what the team has in progress, having many things to keep track of can exhaust a team. There are two ways to look at WIP, one is a total number of cards in play and the other is how many epics, or common themes, are in play. Looking at the total number of cards and finding ways to limit those amounts is purely a team and Tech Leadership decision. Limiting the amount of epics at play normally brings in the Product Owner to the discussion as well.

Make the Priority Clear

Many teams really want to limit what they have in progress and be able to deliver things, but as they are asked for more and more, then they will often have a hard time saying no. Making the priority clear and describing how their priority relates to others is also beneficial. As their Engineering Manager or Director, they will find it comforting to know the clarity of what is happening and find it easier to say no to those things.

Personnel Problems

Definitely not one a lot of folks are comfortable addressing or bringing up. But this is a killer if left alone. You don’t have to snoop around and dig up dirt on specific people, just make yourself available, and obviously listen to the team members during 1-on-1’s. A big lesson learned for me was finding out what the Corporate Policy is for handling under performing team members. I waited until after I tried everything I could during 1-on1’s with no improvement to then engage HR (the corporate policy). It took much more time than I expected to get the ball moving and all the while the team was really upset that the behavior of the individual was being tolerated.

Listen for Problems

There could be numerous problems on this and I won’t be able to touch upon all of them. But as noted previously, listen during 1-on-1’s, what are people complaining about? People often aren’t negative the whole entire time, but listen to things they want. I’ve seen developers brighten up when they find out they can expense their cell phone or home internet. Their prior supervisors never brought it to their attention, with you bringing these kind of items to their attention shows you have their back, and you having their back is one of the best things you can show a team.

Again though, listen to them. If they have ideas they feel are not being heard. Then schedule white board sessions with them to hash out their idea. Work together with them on putting together an article, documentation, or slides to show others. Take the initiative and schedule the meeting with other peers or even better your boss.

One big key here is if they aren’t saying much, or if they are saying everything is fine and nothing is wrong. No room for improvement. Then highly likely you, their leader or boss, is their problem. I’ve had team members talk to me about their problems with their boss (who didn’t report to me and I didn’t report to them). Come to find out their boss just didn’t listen to them and didn’t ask questions well enough. The team didn’t trust them, so kept information from their direct supervisor.

Some smaller items to consider that play a big role for developers:

  • Are they physically too close to one another?
  • Too far a part?
  • Bad chairs? I was shocked at one company I visited where their labs had broken chairs, some even had no back because the back had broken off.
  • Need a new keyboard or mouse? Ask them for what their favorite keyboard and mouse are. If it is different than what they have in the office, then working on getting those purchased.
  • Is their work laptop or VM powerful enough? One DBA I worked with had a grossly under powered VM he has required to use, it would take 5-10 seconds for many key strokes to show on the screen. I got him one that responded close to a native desktop. Needless to say, he was excited to have it.
  • Does CyberSecurity have anti-virus that is slowing them down (have those conversations with others, see what options exist)

Mental Exhaustion

Is the team making progress at all? Do they feel stuck and slowed by something technical? Are they troubleshooting an issue and having issues making progress? Bringing in someone from the outside, a short-term contractor, could be a wonderful shot in the arm. Teams when stuck with a troubling technical problem can be mentally exhausted or even scared to make a wrong decision (after all, many programmers are Stable).

This can also be tied to high WIP as well, if there are many different epics/themes at play, then the team could be under decision fatigue or context switching fatigue.

Anchors/Engines

Technical Debt is commonly discussed around software engineering teams, so be sure the team has a strategic plan, rack and stack, list of tech debt items they would like. Engineers love looking for better and newer ways to do things, and this can cause endless conversations about what folks want to do with the project. So yet again pull the team again and have a white board session. At a high level, list out all the things they would like to do. This isn’t a feature or product view, this is more technical. Make sure everyone is heard. Talk about the value each suggested item could bring, what all would it impact, any chance for a piece meal approach, time box a POC …etc. Get them listed. Then ask the team to start ranking them. Have the team acknowledge “This is our plan, we all know we want to do #17 on the list, but until we get 16 other things done, then there is no sense talking about it. Let’s get our focus on the top 1 or 2, let’s all get behind it and knock it out of the park”.

Another exercise to perform with the team is identifying Anchors and Engines. This could bring to light items leadership is not aware of and bring to light items to use more that are speeding the team up and identify those items you need to mitigate.

Lunch

Maybe this one should be more at the top of the list, this is such an obvious one, but it is typically ignored. There are Foodies all over the place. People love their food. Many others are interested in trying something new. Others enjoy taking their team to their own favorite spot close to the house. Figure out the budget you have for this, ask for more money for team building, and get these on the calendar. Now.

With remote teams this is a bit harder, and normally doesn’t apply. I have seen teams that get along well eat lunch over zoom together, have happy hour, have a “water cooler” online meeting …etc. Different ways to approach this with remote teams.

Activities or Ceremonies

I sure do hope the team is having their own ceremonies and they are running it themselves instead of the boss. Do they have dailies? Tech huddles? Pairing or even better yet, Mobbing sessions?

Story Telling

Who is using the app your team is building (or impacted by your app)? Find stories of people using it. Story tell these back to the team, point out how they relate back to the team’s Beliefs, Values, and Rules of the Game.

For many backend applications, the net benefit is often lost on the team on how their work relates back up to a Strategic Objective. Help showing the team this path. Then also show them how the next thing coming up will also have a positive impact. Show them the road where everyone is headed and I’m sure excitement will follow.

]]>
Chad Gorshing
It is my blog2014-01-20T00:00:00+00:002014-01-20T00:00:00+00:00https://gorshing.net/2014/01/it-is-my-blogI had troubles keeping it going after my last post or two. I was asked by someone if it was a technical blog or a business related blog … I didn’t really have an answer for him. I’ve read articles talking about how best to grow your blog, to find your voice, to have a common message. So as not to confuse your audience.

Well at least for this blog, it isn’t about my audience, the crowd, or how many shares a post has. This is about improving myself, growing myself. This will be my thoughts and with no direction, who knows where it could end up.

I have to keep at it though. I’m not worried about the future. I’m worried about being better than I was the previous time. I have lost years of progress and do plan to make it up. I’ll find my voice or meaning of this blog in the future. Right now I have thoughts to put out.

]]>
Chad Gorshing
ASP.NET MVC Tags2010-09-12T00:00:00+00:002010-09-12T00:00:00+00:00https://gorshing.net/2010/09/asp-net-mvc-tagsI was looking through the NerdDinner source code, and ran across the <%: syntax in the views. I tried many different combinations of searching through Google and Stackoverflow, but I couldn’t find anything. I finally found the answer accidently while reading Phil Haack’s blog post. I kept trying to search for tags (including the words percent and colon) and the like, but it looks like Microsoft references them as a code block or code nugget.

This is to replace or supersede the <%= syntax. More specifically it is to alleviate some of the repetitive typing of <%= Html.Encode as is typically seen through ASP.NET MVC apps.

Please refer back to Phil’s post on more information about this topic, this is something more people need to be aware of and using through their MVC2 apps (only for ASP.NET 4).

]]>
Chad Gorshing
Different Levels of Cooks2010-09-12T00:00:00+00:002010-09-12T00:00:00+00:00https://gorshing.net/2010/09/different-levels-of-cooksThere are a few different types of people who cook food. First you have the person who doesn’t actually cook the food themselves, they typically perform to go out and pay for this service. They don’t worry about many aspects to cooking, such as the act itself, preparation, tools (oven, pots, utensils). They typically enjoy the experience, what the cooks produce, and the presentation; and are content with being disconnected of the process.

Another type is more of a single parent mom who is busy enough with running her kids around to where ever they need to be. She cares tremendously about her kids and what she puts into their body, but many times, due to time constraints, they order out. When she does cook, she is looking for a recipe which will provide a quick meal and enough to feed all her kids. She is not concerned with all the aspects of cooking as she would much rather spend time with her kids and helping with homework. They look towards someone or something to help create the meal quicker, so their uni-tools begin to emerge.

Family recipes and consistency is the typical meal plan for another type of family. Tradition sets in because of sentimental value and a sense of belonging to a family and how things used to be back in the good ‘ol days. They will most always cook the food themselves and are absolutely closed to the idea of improving or changing how their meals are made. After all how dare someone suggest a change to a family legacy? The tools they use stay the same, they are still using the knife and cutting board that has been handed down generation after generation.

The one which fits my household currently is having a tradition but also trying out different recipes found by watching AB (Alton Brown), Emeril Lagasse, Rachael Ray, Giada De Laurentiis, and numerous other shows and magazine recipes. There are family traditions, but they are willing to try something different in hopes of improving the family meal. One draw back to this is on occasion the meals turn out horrible, either by cooking the meal completely wrong or by not satisfying the family’s taste buds. After a disaster they using revert either to paying for a meal as a last resort, or by going back to the traditions they are comfortable with. But also on other occasions great things come from trying out different recipes and ways of cooking and new traditions are born. They also start to care about their tools and what they are using to cook with. A sense of pride of their tools and the process begins to emerge.

Professional cooks are on a level all their own, and they typically take on the ‘chef’ moniker. They possess great culinary skill and each cook begins to take on a specialty they are either talented in or have a great desire in learning more about. There is also a ranking system within a team. You have an executive chef, su chef, saute chef and so on. They pay top dollar for the tools they use and the environment in which they work is something completely different than other people who cook. They study the art of cooking, travel the world to see how people prepare food, offer up their talents for other people to use and consume their product. What they currently produce will not stand, they actively make an attempt at progressing further.

What do you think? How well does this transfer over to the software world? I also wonder how much contention is between these different levels. As I see it, in the software world, groups of developers are also quick to make a judgement about another set/type of developers. We need to see that all of us have different priorities in what we want to accomplish and neither side is wrong.

One last thing I would like to note about chefs, I can’t help but imagine that at some family gatherings people will ask for the chefs advice for a quick fix here and there.

]]>
Chad Gorshing
Cherish Your Opponent2010-06-22T00:00:00+00:002010-06-22T00:00:00+00:00https://gorshing.net/2010/06/cherish-your-opponentI was reading about Harold Abrahams recently and was absolutely blown away by something I read in Wikipedia’s article (I have shorten it for brevity):

Abrahams won the 100m in a time of 10.6 seconds, beating all the American favorites. In third place was Arthur Porritt ... The Paris Olympics 100m dash took place at 7pm on 7 July 1924 (Abrahams and Porritt dined together at 7pm on 7 July every year thereafter, until Abrahams' death).

I had to read this a couple times then had to sit and reflect on this to make sure I understand it wholly.

I have read and been told of some of the great respect and honor people seemed to once have in the past. I think we are starting to lose this (maybe I’ve just not been enlightened).

There are times when I don’t stay in contact with people whom I consider to be good friends of mine, let alone people who were once my opponent/competitor. I do not think I can fathom the great respect or honor these gentlemen had for each other.

I would be glad to see this once again in our age, and it all starts with the person in the mirror.

]]>
Chad Gorshing
Table of Contents Code Kata2010-06-17T00:00:00+00:002010-06-17T00:00:00+00:00https://gorshing.net/2010/06/table-of-contents-code-kataI was looking through some code the other day that generated web based documentation for a framework. They, of course, list everything in a table of contents layout with those being links to the actual files.

In order to achieve this, they break out each section into a file. So the first section is located in the file named “1. Introduction.txt”, and the 2.3.5.1 section is located in the file named “2.3.5.1 Section Name.txt” - simple enough?

They do not use another file to specify how to order these files, there is already a convention. They just execute a directory listing, then sort this list.

As an example, given this as input:

[
  '2.2 Next Agenda Item.txt',
  '2.1.1 Baby Step.txt',
  '1. Introduction.txt',
  '2.1 Moving Forward.txt',
  '2. Getting Started.txt'
]

Should result in:

[
  '1. Introduction.txt',
  '2. Getting Started.txt',
  '2.1 Moving Forward.txt',
  '2.1.1 Baby Step.txt',
  '2.2 Next Agenda Item.txt'
]

I wouldn’t worry about actually making the files. Just have a list of file names, then sort them to match up with how they are actually suppose to be sorted.

So I’m curious, do you think this is code kata? It is much shorter than other ones I have seen, but I think we do need variations of katas.

]]>
Chad Gorshing
The Startup Success Podcast2010-03-29T00:00:00+00:002010-03-29T00:00:00+00:00https://gorshing.net/2010/03/the-startup-success-podcastI am not sure how I ended up subscribing to ‘The Startup Success Podcast’, but I am very glad that I did. I have been listening to this for about three weeks now, and I have been passing up some of my other podcast subscriptions in favor of this one.

Some of the more recent ones I have really enjoyed are: #52 Sramana Mitra #53 Ben Hatten of Legal River #55 David Allen of Getting Things Done #56 Carl Erickson of Atomic Object #57 Seth Godin

And on my way to work this morning I started #60 Daniel Pink on Startups and Motivation (part 1), I have really enjoyed this first part, and I’m looking forward to part two.

]]>
Chad Gorshing
Character Sets Having Trouble With An Apostrophe2010-02-10T00:00:00+00:002010-02-10T00:00:00+00:00https://gorshing.net/2010/02/character-sets-having-trouble-with-an-apostropheIn the past I had read Joel Spolsky’s article over character sets. Occasionally I run into a problem where certain characters do not show correctly, but for the most part I do nothing about it as I can determine what the word or letter is suppose to be.

At one my previous client location, I was lucky enough to have a broken test. This struck me as odd, as it was only one test and not many. It was on a fresh install of Ubuntu and I assumed I had something out of place relating to configuration. I spent roughly four hours tracking down the problem and finally determined that Ubuntu was set to use UTF-8 and the development and deployment environments where meant to run as 8859, the Windows default encoding.

So when will you change? Dave Ramsey said “Most people won’t change until the pain of where they are exceeds the pain of the change”, well I hit that point. I have begun to learn a little more about the funny looking ‘?’ symbols shown when I expect something else.

The article which I was reading happened to be something referenced from Wikipedia. I’m not sure how this will show up as I would expect someone to correct the issue, but the following are some cropped images of how it looked on a WindowsXP box (they look the same on Mac using FireFox, Chrome, and Safari): Safari

Internet Explorer

FireFox

Chrome

The character is obviously an apostrophe, but saving the source out and viewing the value shows 0222/0x92/146 (1001 0010 binary, take your pick). The encoding of the page is set to 8859-2, which Firefox sets the page to correctly … but of course this shows the question mark in the diamond shape. When I override the default encoding and change it to 8859-1 then it shows fine.

I thought that I had it all figured out at this point. This is an easy case right? The encoding is just wrong, in that it shouldn’t be 8859-2, but 8859-1. Well if you look through the 8859-1 character set, there is not any apostrophe near 146 (side note: if you don’t know how to use an apostrophe or unsure on some parts, then The Oatmeal has an awesome explanation). I tried many combinations to try and get something to calculate out, such as dropping the most significant bit which would leave me with 18 decimal. But I could never get close to what an apostrophe should be showing as.

As it turns out, according to this article:

ISO-8859-1 explicitly does not define displayable characters for positions 0-31 and 127-159, and the HTML standard does not allow those to be used for displayable characters.

So it seems like no browser should show anything for that character.

So the question still remains, why does switching the encoding to 8859-1 make Firefox show it right?

Shockingly, Wikipedia to the rescue:

It is very common to mislabel text data with the charset label ISO-8859-1, even though the data is really Windows-1252 encoded. In Windows-1252, codes between 0x80 and 0x9F are used for letters and punctuation, whereas they are control codes in ISO-8859-1. Many web browsers and e-mail clients will interpret ISO-8859-1 control codes as Windows-1252 characters in order to accommodate such mislabeling but it is not standard behaviour and care should be taken to avoid generating these characters in ISO-8859-1 labeled content. However, the draft HTML 5 specification requires that documents advertised as ISO-8859-1 actually be parsed with the Windows-1252 encoding.

So FireFox, upon being told of using the 8859-1 character set instead of the declared 8859-2, notices this mistake and displays it as the Windows-1252 encoding. Doing so the apostrophe finally shows up in correct fashion.

I believe I’m going to enjoy this journey down the Character Set Path.

I must acknowledge Paul Carter, as he pointed out the article from Wikipedia.

]]>
Chad Gorshing
My Lessons Learned From Rhino.Mocks2010-01-26T00:00:00+00:002010-01-26T00:00:00+00:00https://gorshing.net/2010/01/my-lessons-learned-from-rhino-mocksRecently I have begun working with Rhino.Mocks and I stumbled a little bit getting up to speed. My experience with mocks is from using JMock1 with a Java project. This is the first time I have used mocks on a .NET project so it took me a little bit getting used to the syntax.

From looking at all the tutorials and examples on the web about Rhino.Mocks I couldn’t really find anything that was a kick in the pants from my stand point. Most of the tutorials didn’t discuss the methods Rhino.Mocks framework in any detail, and would instead go into, somewhat, depth about the theory of mocking. I already know (or at least think I do) the theory of mocking so I was really wanting something to get me going quickly.

I found a video by the creator of Rhino.Mocks, Ayende, which really helped out. I wanted to put up here some of the key points. You can watch the video at http://www.ayende.com/hibernating-rhinos.aspx.

The ‘_mocks’ variable listed below is a reference to the mocks repository, this will basically contain all of your mocks:

var \_mocks = new MockRepository();

The ReplayAll method, _mocks.ReplayAll(), puts the framework into record mode. You will need to call this method after creating your mocks and setting expectations. The Rhino.Mock framework will begin to track all the method calls and verify the expected counts (if any) are meet. In the video Ayende talks about this around 11:08, 28:10 & 29:50. There is not any issue with calling this method repeatedly, so having it in your TearDown method as a precaution will not cause any problems.

One other thing that sent me on a wild goose chase is the error message:

require a return value or an exception to throw

This will occur when you don’t move your tests from Record mode to Replay mode (typically you are missing a _mocks.ReplayAll() method call). What happens is you call a method such as ‘user.GetPurchases()’, and in my case I was making an assertion on the expected values. But the framework is waiting on you to specify an expectation or a return value, but since this is missing Rhino.Mocks can not handle it and so throws that exception.

As the name implies ‘_mocks.VerifyAll()’ will verify any outstanding expectations which were set by you, I have this in my TearDown method as well.

What’s the difference between Expect.Call and LastCall.Constraints? As he discusses in the video at 36:55, this is due to a constraint the compiler enforces. If you had the following code:

class User {
  public void Save() { .... }
}

Then of course the compiler will not allow you to have syntax such as:

Expect.Call(user.Save())

You will need a way to execute the call, then set expectations on that … well, last call. Simple name huh? Shockingly he discusses this as well in the video at 36:55. Both of syntaxes are basically the same, the Expect.Call syntax is actually changed into the LastCall format. He shows how to mock out a void return type around 19:40.

Another exception/error you might stumble across is:

This action is invalid when the mock object is in verified state.

You will run across this while trying to setup a mock or expectation and in the record phase. My mistake was putting the creation of the MockRepository instance (the _mocks variable) in the TestFixtureSetup method - being this is only called once per the entire test class, my MockRepository was not being recreated. So I received the error - switching this to be what I expected, the Setup attribute, then all was well.

Something I have yet to look into is the difference between the following lines:

Expect.Call(order.PaidInFull).Return(false);

-- and --

SetupResult.For(order.PaidInFull).Return(false);

If you know of what the difference might be, I would be happy to hear.

]]>
Chad Gorshing