{"id":348,"date":"2025-12-11T10:21:37","date_gmt":"2025-12-11T17:21:37","guid":{"rendered":"https:\/\/www.jsnover.com\/blog\/?p=348"},"modified":"2026-02-06T05:30:37","modified_gmt":"2026-02-06T12:30:37","slug":"the-cmdlet-decision-when-to-be-weird","status":"publish","type":"post","link":"https:\/\/www.jsnover.com\/blog\/2025\/12\/11\/the-cmdlet-decision-when-to-be-weird\/","title":{"rendered":"The Cmdlet Decision: When to Be Weird"},"content":{"rendered":"\n<p>I\u2019ve spent a lot of time, and acquired a lot of scar tissue, in this industry, and if there is one thing I\u2019ve learned, it\u2019s that most people are terrified of looking different. People hug the center of the road because it feels safe. But as Jim Hightower once said,&nbsp;<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"has-blue-color has-text-color has-link-color wp-elements-880323c29d900c118f7a6e4faed0db75\"><em>\u201cThere&#8217;s nothing in the middle of the road but yellow stripes and dead armadillos.<\/em>\u201d<\/p>\n<\/blockquote>\n\n\n\n<p>When we were building the early versions of PowerShell (back when it was Monad), we had a massive fight over a single word. It seemed trivial to everyone else, but I knew it was a hill worth dying on. It was the fight over the word Cmdlet.<\/p>\n\n\n\n<p>The disagreement wasn&#8217;t a matter of wordsmithing; it was a foundational issue about establishing the cognitive contours of the product &#8211; how people would think, learn, find things, and form a community. It was an issue of soul.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h1 class=\"wp-block-heading\"><strong>The Battle for a Word<\/strong><\/h1>\n\n\n\n<p>In the initial prototype of Monad, I referred to what are now called cmdlets as <strong>Function Units,<\/strong> which I then shortened to <strong>FUs<\/strong>. This abbreviation reflected the Unix smart-ass culture I was embracing at the time. Plus I was developing this in a hostile environment, and my sense of diplomacy was not yet fully operational. \ud83d\ude42<\/p>\n\n\n\n<p>So, you\u2019d have FUs for processes and FUs for services. We had lots of fun with that! But you can see why we had to change that. Even I knew shipping a Windows Feature full of FUs wasn\u2019t going to fly in Redmond.<\/p>\n\n\n\n<p>I replaced FUs with <strong>Cmdlets<\/strong>\u2014short for command-lets. They were small, focused commands. It was descriptive, precise, and technically accurate.<\/p>\n\n\n\n<p>But the documentation team hated it.<\/p>\n\n\n\n<p>They looked at their style guides and their consistency metrics, and they said, \u201c<em>Jeffrey, we need to change this to &#8216;Command.&#8217; We have to align with the rest of Windows. Users know what a &#8216;Command&#8217; is. &#8216;Cmdlet&#8217; is jargon.\u201d<\/em><\/p>\n\n\n\n<p>Now, understand the organizational gravity here. The documentation team\u2019s job is to reduce friction by standardizing language. They wanted to smooth off the rough edges. That is their mission. But I realized they were focusing on the wrong kind of friction.<\/p>\n\n\n\n<p>They were arguing that Command was easier to read. I argued that Command was impossible to <em>find<\/em>.<\/p>\n\n\n\n<p>Command is a generic term. It means everything, so it means nothing.&nbsp;<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>The Search Query Test: Measuring the Noise<\/strong><\/h1>\n\n\n\n<p>I didn\u2019t win this argument with philosophy; I won it with data. I ran a simple test, and I asked the docs team to look at the results.<\/p>\n\n\n\n<p>I went to a search engine and queried the word Command.<\/p>\n\n\n\n<p>The result? Hundreds of millions of hits. Everything from DOS commands to military commands to command and control. It was an ocean of noise.<\/p>\n\n\n\n<p>Then I queried Cmdlet.<\/p>\n\n\n\n<p>The result? A few thousand hits. And every single one of them was relevant to us.<\/p>\n\n\n\n<p>That was the Aha! moment. I realized that by using a unique term, I wasn\u2019t confusing users; I was giving them a flashlight in a dark room. I was guaranteeing that if they searched for Cmdlet, they would find <em>us<\/em>. They wouldn\u2019t find an OS\/360 manual, a VMS DCL thread, or a DOS newsgroup from 1985.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Lesson 1: Conformity vs. Distinctiveness<\/strong><\/h1>\n\n\n\n<p>There is a fundamental trade-off in design that people often ignore. You have to choose between <strong>Conformity<\/strong> and <strong>Distinctiveness<\/strong>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Conformity &#8211; the Safe Path:<\/strong> If we had gone with Command, the barrier to entry would have been low. Users would see a familiar word. But the cost of ownership of that knowledge would be astronomical because they couldn&#8217;t troubleshoot it.<\/li>\n\n\n\n<li><strong>Distinctiveness &#8211; the Path Less Travelled:<\/strong> By choosing Cmdlet, we raised the barrier to entry. People looked at it and asked, \u201c<em>What the hell is a cmdlet?\u201d<\/em> It created immediate friction.<\/li>\n<\/ul>\n\n\n\n<p>But\u2014and this is the key\u2014that friction was an investment. Once you learned the word, you had a high-fidelity channel for communication.<\/p>\n\n\n\n<p>In my view, getting comfortable with being uncomfortable is the price of admission for innovation. We accepted the initial discomfort of a weird name to buy ourselves a lifetime of precise search results.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Lesson 2: Naming is Conceptual Engineering<\/strong><\/h1>\n\n\n\n<p>We often half-ass our naming conventions because we think of naming as marketing or docs. That is a disaster. Naming is a functional requirement. It defines the ontology of your product.&nbsp; It teaches people how to think. It is conceptual engineering.<\/p>\n\n\n\n<p>In a world driven by search engines (and now AI), the uniqueness of your terminology dictates the success of your support ecosystem.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Think of it like a Semantic Bucket.<\/h1>\n\n\n\n<p>If I use a common word like Script or Command, I am throwing my user&#8217;s problem into the ocean. You might as well ship a rabbit\u2019s foot with your product &#8211; your customer is going to need all the luck they can get finding an answer.<\/p>\n\n\n\n<p>By coining Cmdlet, I created a specific semantic bucket. When the community wrote a blog post, or a script, or a help file, they put it in that bucket. Our language defined our community and made it easy for us to find one another and communicate with each other.<\/p>\n\n\n\n<p>This is the 2 AM Principle in action. When an admin is paged at 2 AM because a server is down, they don&#8217;t care about the corporate style guide. They care about finding the fix <em>right now<\/em>. If they Google \u201c<strong>Exchange Command fails<\/strong>\u201d, they get garbage. If they Google \u201c<strong>Exchange Cmdlet fails<\/strong>\u201d, they get the solution.<\/p>\n\n\n\n<p>Naming is a discoverability feature. If you can&#8217;t Google the answer, the feature is broken.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Lesson 3: Judgment and The Bet<\/strong><\/h1>\n\n\n\n<p>Here is the hard truth about leadership:<strong> Sometimes you need to go with judgement and sometimes you need to go with data.<\/strong><\/p>\n\n\n\n<p>The documentation team had a Style Guide. That is a collection of expert judgement calls.<\/p>\n\n\n\n<p>I had search result counts. That is data.<\/p>\n\n\n\n<p>When you are in a deadlock about readability or standards, bringing concrete numbers to the table\u2014even crude ones like search hit counts\u2014is the only way to cut through the bureaucracy.<\/p>\n\n\n\n<p>But ultimately, you cannot A\/B test every strategic decision. You have to use judgment to make a bet.<\/p>\n\n\n\n<p>I made the bet that the friction of learning a new word was outweighed by the benefit of precise search results.<\/p>\n\n\n\n<p>I was betting on the long game. I was betting that our users were smart enough to learn a new word if it actually helped them solve their problems.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Conclusion<\/strong><\/h1>\n\n\n\n<p>Today, PowerShell users benefit from a relatively noise-free search environment because of that decision. <\/p>\n\n\n\n<p>When you are building something new, ask yourself: Are you trying to blend in, or are you trying to be found?<\/p>\n\n\n\n<p>Don\u2019t be weird for the sake of being weird.&nbsp; But \u2026&nbsp;<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"has-blue-color has-text-color has-link-color has-medium-font-size wp-elements-e0aa0fa309f9c32360d823048edb01fd\"><strong>If being weird is a path to success &#8211; then have the courage to be weird!<\/strong><\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.jsnover.com\/blog\/wp-content\/uploads\/2025\/12\/CmdletNaming-scaled.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"572\" src=\"https:\/\/www.jsnover.com\/blog\/wp-content\/uploads\/2025\/12\/CmdletNaming-1024x572.png\" alt=\"\" class=\"wp-image-400\" srcset=\"https:\/\/www.jsnover.com\/blog\/wp-content\/uploads\/2025\/12\/CmdletNaming-1024x572.png 1024w, https:\/\/www.jsnover.com\/blog\/wp-content\/uploads\/2025\/12\/CmdletNaming-300x167.png 300w, https:\/\/www.jsnover.com\/blog\/wp-content\/uploads\/2025\/12\/CmdletNaming-768x429.png 768w, https:\/\/www.jsnover.com\/blog\/wp-content\/uploads\/2025\/12\/CmdletNaming-1536x857.png 1536w, https:\/\/www.jsnover.com\/blog\/wp-content\/uploads\/2025\/12\/CmdletNaming-2048x1143.png 2048w, https:\/\/www.jsnover.com\/blog\/wp-content\/uploads\/2025\/12\/CmdletNaming-500x279.png 500w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>I\u2019ve spent a lot of time, and acquired a lot of scar tissue, in this industry, and if there is one thing I\u2019ve learned, it\u2019s that most people are terrified of looking different. People hug the center of the road &hellip; <a href=\"https:\/\/www.jsnover.com\/blog\/2025\/12\/11\/the-cmdlet-decision-when-to-be-weird\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":395,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-348","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"jetpack_featured_media_url":"https:\/\/www.jsnover.com\/blog\/wp-content\/uploads\/2025\/12\/WeirdCmdlet-scaled.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/posts\/348","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/comments?post=348"}],"version-history":[{"count":3,"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/posts\/348\/revisions"}],"predecessor-version":[{"id":402,"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/posts\/348\/revisions\/402"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/media\/395"}],"wp:attachment":[{"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/media?parent=348"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/categories?post=348"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jsnover.com\/blog\/wp-json\/wp\/v2\/tags?post=348"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}