Jekyll2023-02-03T18:27:34+00:00https://jason.famularo.org/feed.xmlJason FamularoJason FamularoDifferent Oh My Posh color scheme per day2023-01-31T00:00:00+00:002023-01-31T00:00:00+00:00https://jason.famularo.org/different-oh-my-posh-color-scheme-per-day<h2 id="briefly-what-is-oh-my-posh">Briefly: what is Oh My Posh</h2>
<p><a href="https://ohmyposh.dev/">Oh My Posh</a> describes itself as “a prompt theme engine for any shell.” Basically, your prompt, or the line that shows up in your terminal/console/shell/etc that you type commands into, is very customizable. Instead of just showing your current path, or maybe your username and path, you can leverage Oh My Posh (and many other engines like it) to make things both colorful and informative.</p>
<p>I’ve chosen Oh My Posh over others because of its flexiblity, features and it gives me a consistent prompt on Windows, Mac, and Linux.</p>
<h2 id="themes">Themes!</h2>
<p>Oh My Posh has <a href="https://ohmyposh.dev/docs/themes">many themes</a> showcasing a variety of colors and <a href="https://ohmyposh.dev/docs/segments/path">segments</a> (the parts of your prompt, such as path, git status, battery level, and so forth).</p>
<p>I personally started by copying the <a href="https://github.com/JanDeDobbeleer/oh-my-posh/blob/main/themes/paradox.omp.json">Paradox theme</a> and customizing it. Recently, I decided to re-color my theme based on the Highway color scheme on the <a href="https://gogh-co.github.io/Gogh/">Gogh website</a>. Gogh has many great color schemes and I kept experimenting and thought: what if I used multiple colors schemes and rotated per day…</p>
<h2 id="different-color-scheme-per-day-or-hourminutesecond">Different color scheme per day (or hour/minute/second)</h2>
<p>Using the <a href="https://ohmyposh.dev/docs/configuration/templates">Go templates</a> within Oh My Posh themes, we can have a bit of logic and <a href="https://ohmyposh.dev/docs/configuration/colors#palettes">choose a color palette dynamically</a>.</p>
<p>Here’s the logic related to palettes that choose a different palette each day. I’ve included 6 that rotate.</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre><span class="p">{</span>
<span class="dl">"</span><span class="s2">palettes</span><span class="dl">"</span><span class="p">:</span> <span class="p">{</span>
<span class="dl">"</span><span class="s2">template</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">{{ $factor := mod (now.YearDay | int) 6 }}{{ if eq $factor 0 }}theme1{{ else if eq $factor 1 }}theme2{{ else if eq $factor 2 }}theme3{{ else if eq $factor 3 }}theme4{{ else if eq $factor 4 }}theme5{{else}}theme6{{ end }}</span><span class="dl">"</span><span class="p">,</span>
<span class="dl">"</span><span class="s2">list</span><span class="dl">"</span><span class="p">:</span> <span class="p">{</span>
<span class="dl">"</span><span class="s2">theme1</span><span class="dl">"</span><span class="p">:</span> <span class="p">{},</span>
<span class="dl">"</span><span class="s2">theme2</span><span class="dl">"</span><span class="p">:</span> <span class="p">{},</span>
<span class="dl">"</span><span class="s2">theme3</span><span class="dl">"</span><span class="p">:</span> <span class="p">{},</span>
<span class="dl">"</span><span class="s2">theme4</span><span class="dl">"</span><span class="p">:</span> <span class="p">{},</span>
<span class="dl">"</span><span class="s2">theme5</span><span class="dl">"</span><span class="p">:</span> <span class="p">{},</span>
<span class="dl">"</span><span class="s2">theme6</span><span class="dl">"</span><span class="p">:</span> <span class="p">{}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></figure>
<p>Throughout the day, your prompt will now change like this:</p>
<p><a href="/assets/images/different-oh-my-posh-color-scheme-per-day/windows-color-schemes.png"><img src="/assets/images/different-oh-my-posh-color-scheme-per-day/windows-color-schemes.png" alt="colorschemes" class="align-center" /></a></p>
<p>Or if Linux is your thing:</p>
<p><a href="/assets/images/different-oh-my-posh-color-scheme-per-day/ubuntu-color-schemes.png"><img src="/assets/images/different-oh-my-posh-color-scheme-per-day/ubuntu-color-schemes.png" alt="colorschemes" class="align-center" /></a></p>
<p>(Note: the background color is set in my terminal. I don’t believe you can control that directly in Oh My Posh)</p>
<p>The trick is to use <a href="https://ohmyposh.dev/docs/configuration/colors#palette">palette references</a>, which will let you style changes the bare the colors in one place and have them show up throughout the theme. Check out the source to my theme in the last section.</p>
<h2 id="blast-mode">Blast mode</h2>
<p>Every day not often enough for you? Change <code class="language-plaintext highlighter-rouge">now.YearDay</code> to <code class="language-plaintext highlighter-rouge">now.Hour</code>, or for the impatient <code class="language-plaintext highlighter-rouge">now.Minute</code> (or even <code class="language-plaintext highlighter-rouge">now.Second</code>).</p>
<p>Example:</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
</pre></td><td class="code"><pre><span class="dl">"</span><span class="s2">template</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">{{ $factor := mod (now.Minute | int) 6 }}{{ if eq $factor 0 }}theme1{{ else if eq $factor 1 }}theme2{{ else if eq $factor 2 }}theme3{{ else if eq $factor 3 }}theme4{{ else if eq $factor 4 }}theme5{{else}}theme6{{ end }}</span><span class="dl">"</span>
</pre></td></tr></tbody></table></code></pre></figure>
<h2 id="its-5-oclock-somewhere">It’s 5 o’clock somewhere</h2>
<p>Perhaps you want something a little something to remind you it’s after 5pm and problably time to wrap up your day. Here’s the logic to change your prompt after 5pm.</p>
<figure class="highlight"><pre><code class="language-javascript" data-lang="javascript"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
</pre></td><td class="code"><pre><span class="dl">"</span><span class="s2">template</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">{{ if gt (now.Hour | int) 17 }}day_theme{{ else }}night_theme{{ end }}</span><span class="dl">"</span>
</pre></td></tr></tbody></table></code></pre></figure>
<h2 id="my-theme">My theme</h2>
<p>My full theme can be found as a <a href="https://gist.github.com/Fammy/cfc685f7cbd3dabfb0d41ca7729ea530">gist on GitHub</a> and is embedded below. The palette logic is at the bottom.</p>
<p>If you have any questions, feel free to reach out to me.</p>
<script src="https://gist.github.com/Fammy/cfc685f7cbd3dabfb0d41ca7729ea530.js"></script>Jason FamularoBriefly: what is Oh My Posh Oh My Posh describes itself as “a prompt theme engine for any shell.” Basically, your prompt, or the line that shows up in your terminal/console/shell/etc that you type commands into, is very customizable. Instead of just showing your current path, or maybe your username and path, you can leverage Oh My Posh (and many other engines like it) to make things both colorful and informative. I’ve chosen Oh My Posh over others because of its flexiblity, features and it gives me a consistent prompt on Windows, Mac, and Linux. Themes! Oh My Posh has many themes showcasing a variety of colors and segments (the parts of your prompt, such as path, git status, battery level, and so forth). I personally started by copying the Paradox theme and customizing it. Recently, I decided to re-color my theme based on the Highway color scheme on the Gogh website. Gogh has many great color schemes and I kept experimenting and thought: what if I used multiple colors schemes and rotated per day… Different color scheme per day (or hour/minute/second) Using the Go templates within Oh My Posh themes, we can have a bit of logic and choose a color palette dynamically. Here’s the logic related to palettes that choose a different palette each day. I’ve included 6 that rotate. 1 2 3 4 5 6 7 8 9 10 11 12 13 { "palettes": { "template": "{{ $factor := mod (now.YearDay | int) 6 }}{{ if eq $factor 0 }}theme1{{ else if eq $factor 1 }}theme2{{ else if eq $factor 2 }}theme3{{ else if eq $factor 3 }}theme4{{ else if eq $factor 4 }}theme5{{else}}theme6{{ end }}", "list": { "theme1": {}, "theme2": {}, "theme3": {}, "theme4": {}, "theme5": {}, "theme6": {} } } } Throughout the day, your prompt will now change like this: Or if Linux is your thing: (Note: the background color is set in my terminal. I don’t believe you can control that directly in Oh My Posh) The trick is to use palette references, which will let you style changes the bare the colors in one place and have them show up throughout the theme. Check out the source to my theme in the last section. Blast mode Every day not often enough for you? Change now.YearDay to now.Hour, or for the impatient now.Minute (or even now.Second). Example: 1 "template": "{{ $factor := mod (now.Minute | int) 6 }}{{ if eq $factor 0 }}theme1{{ else if eq $factor 1 }}theme2{{ else if eq $factor 2 }}theme3{{ else if eq $factor 3 }}theme4{{ else if eq $factor 4 }}theme5{{else}}theme6{{ end }}" It’s 5 o’clock somewhere Perhaps you want something a little something to remind you it’s after 5pm and problably time to wrap up your day. Here’s the logic to change your prompt after 5pm. 1 "template": "{{ if gt (now.Hour | int) 17 }}day_theme{{ else }}night_theme{{ end }}" My theme My full theme can be found as a gist on GitHub and is embedded below. The palette logic is at the bottom. If you have any questions, feel free to reach out to me.Get your jam on2022-11-21T00:00:00+00:002022-11-21T00:00:00+00:00https://jason.famularo.org/get-your-jam-on<h2 id="jam-time">Jam time</h2>
<p>Every year GitHub sponsors a <a href="https://en.wikipedia.org/wiki/Game_jam">game jam</a> during the month of November: <a href="https://github.blog/2022-11-01-game-off-2022-theme-announcement/">GitHub Game Off</a>. I’ve dabbled with making games my whole life and I’ve found excuses to not to participate in the jam in previous years.</p>
<p>I made a committment to myself to start <em>and finish</em> and I did so, in about 2 weeks (I realized that travelling and visiting family for Thanksgiving was going to not leave me with much time the second half of the month).</p>
<h2 id="the-tech">The tech</h2>
<p>From past experience, I knew that making a game from scratch would be difficult in a short time period (anyone who does a game jam in a weekend is a wizard). I took at peek at <a href="https://godotengine.org/">Godot</a>, but I quickly realized that I’d spend a lot more time learning the tool than I wanted too.</p>
<p>I spied <a href="https://www.lexaloffle.com/pico-8.php">Pico-8</a> on the list of suggested tools. I’d messed with it some in the past and it’s really straight foward. I had a small sprite up and runnig (well, gliding) after a few minutes and it all started to click. The tool had been chosen. Now time to make a game.</p>
<h2 id="theme">Theme</h2>
<p>Each year the game jam has a theme. This year the theme is “cliché”. I scanned the list of clichés—over 4000—for inspiration and settled on “the only thing certain in life is death and taxes” as my theme. I wasn’t sure yet what type of game I was going to make.</p>
<p>I converted my sprite into a horrible looking accountant and had him gliding across the screen. I made a gold coin—because 8x8 sprites only let you have so much detail—and had it chase my accountant and an idea was born.</p>
<h2 id="surviving">Surviving</h2>
<p>I’ve played a lot of <a href="https://poncle.itch.io/vampire-survivors">Vampire Survivors</a> lately (check out the <a href="https://store.steampowered.com/app/1794680/Vampire_Survivors/">Steam</a> version) and it’s a really simple concept: you are a character who shoots their weapons automatically. You slowly grow more powerful over time, which is good because thousands of enemies are seeking you out. The game is also weird, pure fun, and totally awesome.</p>
<p>I titled my game “Death and Taxes: Survivor”. I made a skull enemy to go with my coin (death and taxes, respectively). I gave the accountant 3 health hearts and the ability to shoot and I had something that was playable.</p>
<h2 id="iterating">Iterating</h2>
<p>To make my seed of a game into something more, I played with things, logic and did a lot of googling. The Pico-8 community has a lot of resources and had answers to all my beginning questions.</p>
<p>I improved my accountant sprite, added two more enemy types, music, and sound effects. I made a simple title screen, and little intros before each act. I even wrote a little backstory.</p>
<p>I had the basic game up and running after a few days and spent a week adding polish. That’s the part of any game project that can take forever, so I made it “good enough” and let it be.</p>
<h2 id="play-now">Play now!</h2>
<p>While I could have worked on this little game forever, I knew I mentally needed the win of releasing. I think it’s entertaining for a few games at least.</p>
<p><img src="/assets/images/get-your-jam-on/taxgrunt.png" alt="Tax Accountant" class="align-left" /> Head on over to <a href="https://fammy.itch.io/death-and-taxes-survivors">itch.io</a> and play now in the browser. If you want to see the source, that’s on <a href="https://github.com/Fammy/death-and-taxes">GitHub</a>.</p>Jason FamularoJam time Every year GitHub sponsors a game jam during the month of November: GitHub Game Off. I’ve dabbled with making games my whole life and I’ve found excuses to not to participate in the jam in previous years. I made a committment to myself to start and finish and I did so, in about 2 weeks (I realized that travelling and visiting family for Thanksgiving was going to not leave me with much time the second half of the month). The tech From past experience, I knew that making a game from scratch would be difficult in a short time period (anyone who does a game jam in a weekend is a wizard). I took at peek at Godot, but I quickly realized that I’d spend a lot more time learning the tool than I wanted too. I spied Pico-8 on the list of suggested tools. I’d messed with it some in the past and it’s really straight foward. I had a small sprite up and runnig (well, gliding) after a few minutes and it all started to click. The tool had been chosen. Now time to make a game. Theme Each year the game jam has a theme. This year the theme is “cliché”. I scanned the list of clichés—over 4000—for inspiration and settled on “the only thing certain in life is death and taxes” as my theme. I wasn’t sure yet what type of game I was going to make. I converted my sprite into a horrible looking accountant and had him gliding across the screen. I made a gold coin—because 8x8 sprites only let you have so much detail—and had it chase my accountant and an idea was born. Surviving I’ve played a lot of Vampire Survivors lately (check out the Steam version) and it’s a really simple concept: you are a character who shoots their weapons automatically. You slowly grow more powerful over time, which is good because thousands of enemies are seeking you out. The game is also weird, pure fun, and totally awesome. I titled my game “Death and Taxes: Survivor”. I made a skull enemy to go with my coin (death and taxes, respectively). I gave the accountant 3 health hearts and the ability to shoot and I had something that was playable. Iterating To make my seed of a game into something more, I played with things, logic and did a lot of googling. The Pico-8 community has a lot of resources and had answers to all my beginning questions. I improved my accountant sprite, added two more enemy types, music, and sound effects. I made a simple title screen, and little intros before each act. I even wrote a little backstory. I had the basic game up and running after a few days and spent a week adding polish. That’s the part of any game project that can take forever, so I made it “good enough” and let it be. Play now! While I could have worked on this little game forever, I knew I mentally needed the win of releasing. I think it’s entertaining for a few games at least. Head on over to itch.io and play now in the browser. If you want to see the source, that’s on GitHub.About this mess2022-11-17T00:00:00+00:002022-11-17T00:00:00+00:00https://jason.famularo.org/about-this-mess<h2 id="here-we-go-again">Here we go again</h2>
<p>Every so many years I look at my blog or <a href="https://famularo.org">personal website</a> and get that urge to tinker with it and try something new. And that time was recently, as I’ve moved my blog from <a href="svbtle.com">Svbtle</a> to <a href="https://jekyllrb.com/">Jekyll</a> hosted on <a href="https://pages.github.com/">GitHub Pages</a>. It all started when I tried to update Svbtle to use the newer Google Analytics setup, but found it was not supported. From that problem, I got <a href="https://www.youtube.com/watch?v=B-_oeTTQIH4">squirreled</a> and ended up moving to a new blog host.
<!--more--></p>
<h2 id="why-jekyll">Why Jekyll?</h2>
<p>Jekyll may not be the hot new thing, and as I get older—I mean more experienced—I realize that the latest thing isn’t always best in the long term. Instead of basing things on a tech, I’m basing them on a format: <a href="https://en.wikipedia.org/wiki/Markdown">Markdown</a>.</p>
<p>Svbtle already used Markdown, so that part was (mostly) painless. I did end up using <a href="https://github.com/bwhaley/svbtle-jekyll">svbtle-jekyll</a>, a small Python tool that extracts Svbtle posts and puts them in Jeykll format (from what I can tell is <a href="https://kramdown.gettalong.org/">kramdown</a> + a header). svbtle-jekyll required a few tweaks to get it to read the HTML correctly (it is 7 years old—it almost worked out-of-the-box!)</p>
<p>Now that my blog posts are in Markdown and stored in a <a href="http://github.com/Fammy/blog">git repo I own</a>, it should be easy to move them elsewhere if—and when—I decide to move to a new platform.</p>
<p>Jekyll also made it easy to keep the same URLs for my posts so I don’t have to mess with <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/301">HTTP 301</a> redirects.</p>
<h2 id="theming">Theming</h2>
<p>In looking for Jekyll themes, I quickly found <a href="https://github.com/mmistakes/minimal-mistakes">Minimal Mistakes</a>, which is a very popular—if not most popular—theme for Jekyll. Once I made it through setup and dependencies, I was off and running. So now I am running on a static website that is free to host and doesn’t look half bad.</p>
<h2 id="whats-next">What’s next?</h2>
<p>Am I going to (re)commit to blogging more? No, but I’ll try. At a minimum something new will come along in a few years and I may be tempted to switch to that. 😉</p>Jason FamularoHere we go again Every so many years I look at my blog or personal website and get that urge to tinker with it and try something new. And that time was recently, as I’ve moved my blog from Svbtle to Jekyll hosted on GitHub Pages. It all started when I tried to update Svbtle to use the newer Google Analytics setup, but found it was not supported. From that problem, I got squirreled and ended up moving to a new blog host.Why developers don’t explain every last bug fix in release notes2015-10-28T00:00:00+00:002015-10-28T00:00:00+00:00https://jason.famularo.org/why-developers-dont-explain-every-last-bug-fix-in-release-notes<p>I’ve seen a lot of frustration by smartphone users when app release notes are vague about what’s actually being updated. We’ve all seen the dreaded “bug fixes and performance enhancements”. We fall in love with our apps, love to see updates, but developers aren’t spending the time to explain every last nuanced update. What’s up with that? Power users thrive on this information. So why don’t developers detail the entire set of changes?</p>
<p>As a power user, I feel this frustration too. I really do want to know what is being updated. There may be a particular annoying bug that I’m waiting to get fixed. Maybe it’s a new feature that I might not know about otherwise. But as a developer, I have a second set of concerns that sometimes conflicts with what users want. So here’s why developers don’t (always) explain every last bug fix in release notes:</p>
<h2 id="time">Time</h2>
<p>Often, release notes are an afterthought, something that’s done quickly as an app approaches release. Developers, or someone on the team, is given the assignment to write release notes. The team wants to see what updates in the store just as much as you do, and equally as soon. Release notes are an (important) task that gets ignored until it has to be done. And when time is short, shortcuts get taken.</p>
<h2 id="embarrassment">Embarrassment</h2>
<p>No software is perfect. No app is bug free. Developers are not coding ninjas (regardless of what recruiters think). The developer may feel that certain bugs reflect poorly on their skills. Writing quality software is difficult, and everyone makes mistakes. Sometimes those mistakes are extremely dumb and best swept under the rug, right?</p>
<h2 id="security">Security</h2>
<p>Some fixes are security related. It’s not always wise to announce all the security problems your app had. Users may not update, and installing old versions of apps is not hard. If you announce your security problems, you potentially make it easier to exploit the app.</p>
<p>I’m not saying this is the correct way to handle security issues. I’m saying this way of thinking easily enters your mind. No one wants their app to be “hacked” or exploited.</p>
<h2 id="limited-space">Limited space</h2>
<p>Did you know that Google only allows for 500 characters in the release notes field? That’s stupid short. And it’s also not enough to list all the bug fixes that occur in a single app release. More important features will get the majority of the space in the release notes and bug fixes get lumped together, if mentioned at all.</p>
<p>Apple is more generous and gives 4000 characters. That’s almost enough space to write four <a href="http://js1k.com/2014-dragons/demos">Javascript demos</a>.</p>
<h2 id="laziness">Laziness</h2>
<p>Stop me if you’ve heard this before: developers are lazy. We work hard at being lazy. It’s an overused trope, but has some truth. The last thing a developer wants to do is write release notes. Most of us like writing software. When preparing a set of release notes, it can be very time consuming to review every last issue that was fixed. It’s just easier to say “yo, we fixed some bugs” and actually go and fix some more bugs.</p>
<h2 id="the-middle-ground">The middle ground</h2>
<p>I’m not saying I agree with all the reasons above. I think there is a middle ground. Something between the spartan “bug fixes and performance enhancements” and a full copy of the commit log.</p>
<p>My personal strategy is to put the following in the release notes.</p>
<ul>
<li>New features</li>
<li>Major enhancements and changes</li>
<li>Significant bug fixes, especially if users have been reporting the issue</li>
</ul>
<p>Users, I understand your frustration. I want to see good release notes. Hopefully it gets better. Especially frustrating are especially terse notes:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Bug fixes
</code></pre></div></div>
<p>(Google, I’m looking at you again ಠ_ಠ)</p>Jason FamularoI’ve seen a lot of frustration by smartphone users when app release notes are vague about what’s actually being updated. We’ve all seen the dreaded “bug fixes and performance enhancements”. We fall in love with our apps, love to see updates, but developers aren’t spending the time to explain every last nuanced update. What’s up with that? Power users thrive on this information. So why don’t developers detail the entire set of changes? As a power user, I feel this frustration too. I really do want to know what is being updated. There may be a particular annoying bug that I’m waiting to get fixed. Maybe it’s a new feature that I might not know about otherwise. But as a developer, I have a second set of concerns that sometimes conflicts with what users want. So here’s why developers don’t (always) explain every last bug fix in release notes: Time Often, release notes are an afterthought, something that’s done quickly as an app approaches release. Developers, or someone on the team, is given the assignment to write release notes. The team wants to see what updates in the store just as much as you do, and equally as soon. Release notes are an (important) task that gets ignored until it has to be done. And when time is short, shortcuts get taken. Embarrassment No software is perfect. No app is bug free. Developers are not coding ninjas (regardless of what recruiters think). The developer may feel that certain bugs reflect poorly on their skills. Writing quality software is difficult, and everyone makes mistakes. Sometimes those mistakes are extremely dumb and best swept under the rug, right? Security Some fixes are security related. It’s not always wise to announce all the security problems your app had. Users may not update, and installing old versions of apps is not hard. If you announce your security problems, you potentially make it easier to exploit the app. I’m not saying this is the correct way to handle security issues. I’m saying this way of thinking easily enters your mind. No one wants their app to be “hacked” or exploited. Limited space Did you know that Google only allows for 500 characters in the release notes field? That’s stupid short. And it’s also not enough to list all the bug fixes that occur in a single app release. More important features will get the majority of the space in the release notes and bug fixes get lumped together, if mentioned at all. Apple is more generous and gives 4000 characters. That’s almost enough space to write four Javascript demos. Laziness Stop me if you’ve heard this before: developers are lazy. We work hard at being lazy. It’s an overused trope, but has some truth. The last thing a developer wants to do is write release notes. Most of us like writing software. When preparing a set of release notes, it can be very time consuming to review every last issue that was fixed. It’s just easier to say “yo, we fixed some bugs” and actually go and fix some more bugs. The middle ground I’m not saying I agree with all the reasons above. I think there is a middle ground. Something between the spartan “bug fixes and performance enhancements” and a full copy of the commit log. My personal strategy is to put the following in the release notes. New features Major enhancements and changes Significant bug fixes, especially if users have been reporting the issue Users, I understand your frustration. I want to see good release notes. Hopefully it gets better. Especially frustrating are especially terse notes: Bug fixes (Google, I’m looking at you again ಠ_ಠ)The customer may not always be right, but they’re still our customer2015-03-02T00:00:00+00:002015-03-02T00:00:00+00:00https://jason.famularo.org/the-customer-may-not-always-be-right-but-theyre-still-our-customer<p>One summer in high school, I had a mandate from my parents to get a job. If I was going to work thirty-plus hours a week, I wanted more than minimum wage. Growing up in Orlando, Disney World was an attractive place for teenagers to work during the summer. They paid a whole $1.10 over minimum wage ($4.25 at the time, for a whopping $5.35).</p>
<p>In the end, my illustrious career working for The Mouse didn’t last long. I quit after four days (that’s a story for another time). But during that time I learned two valuable lessons:</p>
<ol>
<li>Some days your boss is The Mouse, some days your boss is “The Rat”. (I had The Rat unfortunately).</li>
<li>The customer may not always be right, but they’re still our customer.</li>
</ol>
<h2 id="software-customers">Software customers</h2>
<p>Working in software development, there is always a customer. Sometimes it is an actual paying customer, other times it’s another department within the company. Both types of customers, while different in many aspects, share one commonality: they don’t do software development full time. At best, the customer has utilized your services in the past, and understands the process. At worst, they’ve never interacted with software development before and have movie-link expectations.</p>
<p>I’ve often found that the customer thinks they know what the want. As a consultant, customers would come to my company and ask us to create a solution to help them solve a problem. They have nebulous needs such as “we need a website to accept applications” and “we need an app to reconcile our accounts payable and receivable”. The solutions to these problems can vary greatly, depending on what is truly needed.</p>
<h2 id="the-true-need">The true need</h2>
<p>And that’s the hard part. Finding out the true need from the customer. The customer has spent some time thinking about what they need, and has an idea of how that might come to fruition. “Build a website, something something yada yada, applications processed”. As software developers (and business analysts, QA engineers, project managers, and so on), we’ve been on this ride before. We know what’s coming. It’s the eternal battle of expectations versus a true understanding of what’s needed. It’s usually a trying journey. The customer is likely wrong, and it’s our job to make things right.</p>
<h2 id="saying-no">Saying no</h2>
<p>So, in the name of quality software, we tell our customers “no”. We explain to them why they’re wrong, or slightly off-path. We put them on a better path. Sometimes we do it without even telling them. “They’ll thank us later”, we tell ourselves. We’ve taken some moral high ground that allows us to do the opposite of what the customer wants — I mean — thinks they want.</p>
<h2 id="two-endings">Two endings</h2>
<p>This usually ends one of two ways (and depends on how you treat the customer). In the happy ending, we’ve helped the customer to see why their original plan wasn’t quite right, assisted them in coming up with a better solution. One that both parties have worked together to achieve. The customer has been a part of the process. They have learned. They’re thankful. They’ll enlist the magic of software development again, and have an even better experience the next time.</p>
<p>Or they won’t get what they want. They’ll be told they’re wrong constantly along the way. They’ll go along with (almost) anything you say, believing that you, as the expert, know how to sail the confusing ship that is software development. In the end, they’ll have a solution that, according to the new direction you’ve set the project on, works as agreed. And they’ll be confused, bitter, but contractually satisfied.</p>
<h2 id="becoming-the-rat">Becoming “The Rat”</h2>
<p>So how did you become “The Rat”? How did the journey to this perfect solution end horribly? Why didn’t you see this before?</p>
<p>I don’t know if there are any easy answers to how to fix this problem. You’ve taken the relationship between you and your client for granted. They gave you trust, as the expert, and you used that trust to steer them away from what they needed. Or perhaps to you did deliver what they needed, but through some of the most treacherous waters they’ll ever travel.</p>
<p>The best advice is to take preventative action. To see the situation before it happens, and to fix you (and not the customer). This is hard advice to follow until you’ve made the mistake. But there are warning signs. If you are resenting you customer at any point, especially the beginning, you’ve probably set yourself up to be The Rat.</p>
<p>Communicate regularly. Let the customer know what you’re thinking, why you’re thinking it, and what you’ve seen happen in similar situations. Help them to discover the answer. Getting the answers for free deprives the customer an opportunity to learn and grow. As tempting “just trust me, we need to do it this way” is, that confines the result to some mystery the customer can’t explain.</p>
<p>You won’t be able to be The Mouse every day, with every client. But put yourself in their shoes. Try to understand how they feel and what the gaps in their understanding are. Build the bridge with them, not for them.</p>Jason FamularoOne summer in high school, I had a mandate from my parents to get a job. If I was going to work thirty-plus hours a week, I wanted more than minimum wage. Growing up in Orlando, Disney World was an attractive place for teenagers to work during the summer. They paid a whole $1.10 over minimum wage ($4.25 at the time, for a whopping $5.35). In the end, my illustrious career working for The Mouse didn’t last long. I quit after four days (that’s a story for another time). But during that time I learned two valuable lessons: Some days your boss is The Mouse, some days your boss is “The Rat”. (I had The Rat unfortunately). The customer may not always be right, but they’re still our customer. Software customers Working in software development, there is always a customer. Sometimes it is an actual paying customer, other times it’s another department within the company. Both types of customers, while different in many aspects, share one commonality: they don’t do software development full time. At best, the customer has utilized your services in the past, and understands the process. At worst, they’ve never interacted with software development before and have movie-link expectations. I’ve often found that the customer thinks they know what the want. As a consultant, customers would come to my company and ask us to create a solution to help them solve a problem. They have nebulous needs such as “we need a website to accept applications” and “we need an app to reconcile our accounts payable and receivable”. The solutions to these problems can vary greatly, depending on what is truly needed. The true need And that’s the hard part. Finding out the true need from the customer. The customer has spent some time thinking about what they need, and has an idea of how that might come to fruition. “Build a website, something something yada yada, applications processed”. As software developers (and business analysts, QA engineers, project managers, and so on), we’ve been on this ride before. We know what’s coming. It’s the eternal battle of expectations versus a true understanding of what’s needed. It’s usually a trying journey. The customer is likely wrong, and it’s our job to make things right. Saying no So, in the name of quality software, we tell our customers “no”. We explain to them why they’re wrong, or slightly off-path. We put them on a better path. Sometimes we do it without even telling them. “They’ll thank us later”, we tell ourselves. We’ve taken some moral high ground that allows us to do the opposite of what the customer wants — I mean — thinks they want. Two endings This usually ends one of two ways (and depends on how you treat the customer). In the happy ending, we’ve helped the customer to see why their original plan wasn’t quite right, assisted them in coming up with a better solution. One that both parties have worked together to achieve. The customer has been a part of the process. They have learned. They’re thankful. They’ll enlist the magic of software development again, and have an even better experience the next time. Or they won’t get what they want. They’ll be told they’re wrong constantly along the way. They’ll go along with (almost) anything you say, believing that you, as the expert, know how to sail the confusing ship that is software development. In the end, they’ll have a solution that, according to the new direction you’ve set the project on, works as agreed. And they’ll be confused, bitter, but contractually satisfied. Becoming “The Rat” So how did you become “The Rat”? How did the journey to this perfect solution end horribly? Why didn’t you see this before? I don’t know if there are any easy answers to how to fix this problem. You’ve taken the relationship between you and your client for granted. They gave you trust, as the expert, and you used that trust to steer them away from what they needed. Or perhaps to you did deliver what they needed, but through some of the most treacherous waters they’ll ever travel. The best advice is to take preventative action. To see the situation before it happens, and to fix you (and not the customer). This is hard advice to follow until you’ve made the mistake. But there are warning signs. If you are resenting you customer at any point, especially the beginning, you’ve probably set yourself up to be The Rat. Communicate regularly. Let the customer know what you’re thinking, why you’re thinking it, and what you’ve seen happen in similar situations. Help them to discover the answer. Getting the answers for free deprives the customer an opportunity to learn and grow. As tempting “just trust me, we need to do it this way” is, that confines the result to some mystery the customer can’t explain. You won’t be able to be The Mouse every day, with every client. But put yourself in their shoes. Try to understand how they feel and what the gaps in their understanding are. Build the bridge with them, not for them.Story of the utility developer2015-01-17T00:00:00+00:002015-01-17T00:00:00+00:00https://jason.famularo.org/story-of-the-utility-developer-language-doesnt-matter<p>A few years into my career, I noticed I was only working with the (even then) outdated “classic” ASP. I certainly did not want to work with ASP forever. This .NET thing was new and cool, and it seemed to fix 90% of my complaints with classic ASP. My company had various projects underway. One was a rather large (and important) Java project. I pulled a few strings and got put on the project.</p>
<p>I few things I should note: I would have preferred a .NET project at the time, but the company didn’t have one (I don’t recall if there wasn’t one, or just one that I could be placed on). I had done some work with Java back in college, yet I was worried it wouldn’t be smooth transition. I had worked exclusively with ASP and Visual Basic 6 (VB6) since college, and felt comfortable with those languages. In addition, .NET had VB.Net, the successor to VB6. Taking up Java at this time seemed a little crazy. Maybe it spoke to how much I wanted to do something other than ASP.</p>
<p>I arrived at my new assignment and promptly setup my development environment on my workstation. I was placed on a small sub-team with three others, led by a newer hire that knew Java very well. Even though I was nervous, I felt good about my situation. I had been in a similar situation on my first project while I was learning ASP. Even better, I now had a few years of professional experience. The non-programming parts of software development wouldn’t be as foreign to me as it had been just out of college.</p>
<p>As expected, much of Java looked foreign. The language itself was familiar, but the projects and applications were structured nothing like I was used to. On top of that, we were using a bunch of weird middleware products I’d never heard of (and would never come across again after this project). I was having a hard time getting a handle on everything. There was so much to learn, and that was just my small little sub-team.</p>
<p>I plodded along in my assignments, turning out what I thought was decent code given the circumstances. I knew what I wrote six months down the road would be a lot better, but that was the best I could do at the time. I interacted with a few of the other sub-teams, ensuring our work integrated with theirs. All the sub-teams were growing, and quite a few new developers joined us on the project. All of them had more Java experience than I did. I was now the odd man out. The Microsoft guy on the Java team.</p>
<p>A quick aside — I enjoy helping people, especially helping others learn to code (or learn to code better). I am very grateful for the mentors and coworkers I’ve had over the years that have taken time to help me be a better me. The least I can do is give back.</p>
<p>Given my nature, I found myself working with another developer on a different sub-team. I don’t recall how we got on the subject, but he was struggling to create the code for the UI in the design documents (a UI that only corporate apps can dream up). This developer had been working on Java his whole career, and our careers were similar in length (2-4 years).</p>
<p>As I helped him, I had a one of the more important revelations of my career: It didn’t matter what the language was, the core concepts and patterns used where universal. While the language might change, the same things I’d done in ASP where just as applicable in Java.</p>
<p>I found myself in this situation a handful of times. For the first time on the team, I felt like I was adding significant value. And I wasn’t even working on my assignments half the time. The project lead was a friend, and I found myself talking to him in his office (usually after hours when he wasn’t in his endless meetings). I kept him briefed on what I was doing and how I was assisting the team.</p>
<p>A few weeks later, the lead called me into his office. “Jason, I have a new assignment for you.”</p>
<p>Great, I thought. I finally found my groove and now things would be changing. I prepared myself for something new, but not quite what he had in store.</p>
<p>“I want you to be a utility developer.”</p>
<p>What’s a utility developer, I thought. That sounds weirded. I wasn’t sure I wanted to be a utility developer, whatever it was.</p>
<p>“We’re going to take you off your [sub-]team and have you assist everyone on the project, as needed. You won’t have any tasks on the project plan. Just help anyone who needs it and keep the project moving forward.”</p>
<p>My mind was blown. On the positive side, this was high praise. I was helping people and that provided more value than working on tasks directly. On the other hand, I was going to have to learn, at least at a high level, all the various technologies and parts of the whole system. I cautiously accepted my new assignment and got to work.</p>
<p>Over the next few weeks, I helped all the teams, as needed. I learned more technology in those weeks than I had on the project to date. I got to talk to everyone, learn from everyone, and generally grow myself more than I had in a long while. I continued to learn that I could tackle any problem (except for being on time for the 8:30 AM daily meeting).</p>
<p>Unfortunately, the role of utility developer didn’t last forever. I don’t recall exactly how it ended. I did leave the project before it was completed (only to return later, it was large and long project). Perhaps I was needed in classic ASP land again. Whatever the reason, I left the project with more confidence than I had had at any point in my career up to then.</p>
<p>Soon after, I started to be the team/project lead on many of my projects. I’m thanking for the time I spent as the utility developer, doing a little bit of everything, but most importantly, making sure the project moved forward.</p>Jason FamularoA few years into my career, I noticed I was only working with the (even then) outdated “classic” ASP. I certainly did not want to work with ASP forever. This .NET thing was new and cool, and it seemed to fix 90% of my complaints with classic ASP. My company had various projects underway. One was a rather large (and important) Java project. I pulled a few strings and got put on the project. I few things I should note: I would have preferred a .NET project at the time, but the company didn’t have one (I don’t recall if there wasn’t one, or just one that I could be placed on). I had done some work with Java back in college, yet I was worried it wouldn’t be smooth transition. I had worked exclusively with ASP and Visual Basic 6 (VB6) since college, and felt comfortable with those languages. In addition, .NET had VB.Net, the successor to VB6. Taking up Java at this time seemed a little crazy. Maybe it spoke to how much I wanted to do something other than ASP. I arrived at my new assignment and promptly setup my development environment on my workstation. I was placed on a small sub-team with three others, led by a newer hire that knew Java very well. Even though I was nervous, I felt good about my situation. I had been in a similar situation on my first project while I was learning ASP. Even better, I now had a few years of professional experience. The non-programming parts of software development wouldn’t be as foreign to me as it had been just out of college. As expected, much of Java looked foreign. The language itself was familiar, but the projects and applications were structured nothing like I was used to. On top of that, we were using a bunch of weird middleware products I’d never heard of (and would never come across again after this project). I was having a hard time getting a handle on everything. There was so much to learn, and that was just my small little sub-team. I plodded along in my assignments, turning out what I thought was decent code given the circumstances. I knew what I wrote six months down the road would be a lot better, but that was the best I could do at the time. I interacted with a few of the other sub-teams, ensuring our work integrated with theirs. All the sub-teams were growing, and quite a few new developers joined us on the project. All of them had more Java experience than I did. I was now the odd man out. The Microsoft guy on the Java team. A quick aside — I enjoy helping people, especially helping others learn to code (or learn to code better). I am very grateful for the mentors and coworkers I’ve had over the years that have taken time to help me be a better me. The least I can do is give back. Given my nature, I found myself working with another developer on a different sub-team. I don’t recall how we got on the subject, but he was struggling to create the code for the UI in the design documents (a UI that only corporate apps can dream up). This developer had been working on Java his whole career, and our careers were similar in length (2-4 years). As I helped him, I had a one of the more important revelations of my career: It didn’t matter what the language was, the core concepts and patterns used where universal. While the language might change, the same things I’d done in ASP where just as applicable in Java. I found myself in this situation a handful of times. For the first time on the team, I felt like I was adding significant value. And I wasn’t even working on my assignments half the time. The project lead was a friend, and I found myself talking to him in his office (usually after hours when he wasn’t in his endless meetings). I kept him briefed on what I was doing and how I was assisting the team. A few weeks later, the lead called me into his office. “Jason, I have a new assignment for you.” Great, I thought. I finally found my groove and now things would be changing. I prepared myself for something new, but not quite what he had in store. “I want you to be a utility developer.” What’s a utility developer, I thought. That sounds weirded. I wasn’t sure I wanted to be a utility developer, whatever it was. “We’re going to take you off your [sub-]team and have you assist everyone on the project, as needed. You won’t have any tasks on the project plan. Just help anyone who needs it and keep the project moving forward.” My mind was blown. On the positive side, this was high praise. I was helping people and that provided more value than working on tasks directly. On the other hand, I was going to have to learn, at least at a high level, all the various technologies and parts of the whole system. I cautiously accepted my new assignment and got to work. Over the next few weeks, I helped all the teams, as needed. I learned more technology in those weeks than I had on the project to date. I got to talk to everyone, learn from everyone, and generally grow myself more than I had in a long while. I continued to learn that I could tackle any problem (except for being on time for the 8:30 AM daily meeting). Unfortunately, the role of utility developer didn’t last forever. I don’t recall exactly how it ended. I did leave the project before it was completed (only to return later, it was large and long project). Perhaps I was needed in classic ASP land again. Whatever the reason, I left the project with more confidence than I had had at any point in my career up to then. Soon after, I started to be the team/project lead on many of my projects. I’m thanking for the time I spent as the utility developer, doing a little bit of everything, but most importantly, making sure the project moved forward.Quickly switch to a “Presentation Mode” in Visual Studio2014-08-13T00:00:00+00:002014-08-13T00:00:00+00:00https://jason.famularo.org/quickly-switch-to-a-presentation-mode-in-visual-studio<p>As I prepared to give a <a href="http://www.meetup.com/TechnologyGrows/events/199648072/">presentation</a> tomorrow night, I stumbled upon a <a href="http://blogs.msdn.com/b/pstubbs/archive/2010/06/16/presentation-mode-in-visual-studio.aspx">great article</a> explaining how to setup Visual Studio for a “presentation mode.” Presentation Mode are the font sizes required so the folks sitting in the back row don’t repeatedly say “can you zoom in a little?”</p>
<p>I’ve <a href="http://jason.famularo.org/presentation-considerations">written</a> about presentations before, but failed to go into any detail about configuring your IDE of choice. Mine for tomorrow will be Visual Studio. Since it’s been a while since I’ve presented, I didn’t quite remember the required settings to change the fonts. And Visual Studio has a lot of settings:</p>
<figure class="full">
<a href="/assets/images/quickly-switch-to-a-presentation-mode-in-visual-studio/i8khh6mxukafma.png"><img src="/assets/images/quickly-switch-to-a-presentation-mode-in-visual-studio/i8khh6mxukafma.png" /></a>
</figure>
<p>Thankfully, I found the article I mentioned above, and saved myself a small fortune of time trying to find and toggle all the correct settings. I’ve perfected the following quick process for my presentations.</p>
<h2 id="4-simple-steps-to-a-better-presentation">4 simple steps to a better presentation</h2>
<p>Step 1: <a href="https://raw.githubusercontent.com/Fammy/vs-presentation-mode/master/presentationmode.vssettings">Download</a> this Visual Studio settings files</p>
<p>Step 2: Import into Visual Studio via the Tools->Import and Export Settings menu item</p>
<ul>
<li>Select “Import selected environment settings” and click “Next”</li>
<li>Select “Yes, save my current settings”. Do this so you can revert back after your presentation. Type in a name, I called mine “dev.vssettings”, and pick a folder to store them in. Click “Next”</li>
<li>Click “Browse…” and find presentationmode.vssettings. Click “Next”</li>
<li>Leave all the defaults, and click “Finish”</li>
</ul>
<p>Step 3: Give your presentation with fonts the back row can read</p>
<figure class="full">
<a href="/assets/images/quickly-switch-to-a-presentation-mode-in-visual-studio/2gqazflstjuceg.png"><img src="/assets/images/quickly-switch-to-a-presentation-mode-in-visual-studio/2gqazflstjuceg.png" /></a>
</figure>
<p><img src="/assets/images/quickly-switch-to-a-presentation-mode-in-visual-studio/shibe.jpg" alt="Shibe" class="align-left" />
Wow, such big</p>
<p>Step 4: Revert back to your original settings by repeating Step 2 and choosing your saved settings (you did save them, right?!)</p>Jason FamularoAs I prepared to give a presentation tomorrow night, I stumbled upon a great article explaining how to setup Visual Studio for a “presentation mode.” Presentation Mode are the font sizes required so the folks sitting in the back row don’t repeatedly say “can you zoom in a little?” I’ve written about presentations before, but failed to go into any detail about configuring your IDE of choice. Mine for tomorrow will be Visual Studio. Since it’s been a while since I’ve presented, I didn’t quite remember the required settings to change the fonts. And Visual Studio has a lot of settings: Thankfully, I found the article I mentioned above, and saved myself a small fortune of time trying to find and toggle all the correct settings. I’ve perfected the following quick process for my presentations. 4 simple steps to a better presentation Step 1: Download this Visual Studio settings files Step 2: Import into Visual Studio via the Tools->Import and Export Settings menu item Select “Import selected environment settings” and click “Next” Select “Yes, save my current settings”. Do this so you can revert back after your presentation. Type in a name, I called mine “dev.vssettings”, and pick a folder to store them in. Click “Next” Click “Browse…” and find presentationmode.vssettings. Click “Next” Leave all the defaults, and click “Finish” Step 3: Give your presentation with fonts the back row can read Wow, such big Step 4: Revert back to your original settings by repeating Step 2 and choosing your saved settings (you did save them, right?!)The cult of the one-★ review2014-03-22T00:00:00+00:002014-03-22T00:00:00+00:00https://jason.famularo.org/the-cult-of-the-one-star-review<h2 id="playing-the-game">Playing the game</h2>
<p>Like any many fixed systems, the supposedly fair system of user reviews is horribly broken. The process was ripe for gaming. And gamed it has been. Companies optimize their apps and websites to get you to leave ★★★★★ reviews. EA, with their Dungeon Keeper on mobile platforms has optimized this to the extreme:</p>
<p><a href="/assets/images/the-cult-of-the-one-star-review/auqjryi3ljl4na.png"><img src="/assets/images/the-cult-of-the-one-star-review/auqjryi3ljl4na.png" alt="rate1" class="align-center" /></a></p>
<p>Clicking “5 Stars” take you to the store to give that ★★★★★ rating. While clicking “1-4 Stars”…</p>
<p><a href="/assets/images/the-cult-of-the-one-star-review/q5xk1pcy1xcgtg.png"><img src="/assets/images/the-cult-of-the-one-star-review/q5xk1pcy1xcgtg.png" alt="rate2" class="align-center" /></a></p>
<p>Emails, as far as I know, don’t show up as app store reviews. Instead, you get ushered away from app store to some back room where no one knows what was said. That, in theory, leads to more ★★★★★ reviews and a higher score. EA’s tactic may have gone unnoticed if it wasn’t for <a href="http://www.independent.co.uk/life-style/gadgets-and-tech/dungeon-keeper-mobile-remake-deemed-unplayable-due-to-inapp-purchases-9119140.html">other issues</a> with the game.</p>
<h2 id="beating-the-system">“Beating” the system</h2>
<p>Less than satisfied users on the other hand, in response to all the ★★★★★ reviews, or perhaps just in anger and spite, leave ★ reviews and scathing comments. “I’d give it no stars if that was possible!” raves one review. “Doesn’t support feature <em>X</em>, thus ★.” says another.</p>
<p>In response to EA, the masses gathered to “correct” the injustice: an unfair playing field. Their response, ★ reviews. This behavior is called <a href="http://en.wikipedia.org/wiki/Griefer">Griefing</a>.</p>
<h2 id="the-test">The test</h2>
<p>Go to <a href="http://www.amazon.com/">Amazon</a>, or <a href="http://www.bestbuy.com/">Best Buy</a>, or the <a href="https://itunes.apple.com/us/genre/ios/id36?mt=8">App Store</a> or <a href="https://play.google.com/store/apps">Google Play</a> and read a few reviews. Play close attention to the ★ reviews.</p>
<h2 id="results">Results</h2>
<p>What did you find? I went to the Apple App Store (which is hard to navigate from a browser, but I digress) and looked at the first app in the first category: <a href="https://itunes.apple.com/us/app/ibooks/id364709193?mt=8">iBooks</a>.</p>
<p>Here are the three reviews I saw:</p>
<figure class="full">
<a href="/assets/images/the-cult-of-the-one-star-review/iqrametknyu3w.png"><img src="/assets/images/the-cult-of-the-one-star-review/iqrametknyu3w.png" /></a>
</figure>
<p>Pay special attention to the middle review. Other than a thirst for violence, what sticks out? To me, it’s the desire to get a single thing changed (the new UI design to match iOS 7’s massive overhaul). So does this ruin the experience? I don’t know, I’m not the review’s author, shr00mie. Only shr00mie knows how shr00mie feels. And if we take shr00mie at his or her word, the app is ruined. Reading books is ruined.</p>
<p>The review has an agenda. The agenda is to get something changed. And the way the user has decided is to attempt griefing with a ★ review. This behavior exists anywhere a user can leave a review. Let’s check the Google Play store. Maybe it’s just Apple zealots, right?</p>
<p>This comes from the first app the store shows, <a href="https://play.google.com/store/apps/details?id=com.ncaa.mmlive.app">NCAA® March Madness</a> (so glad they got that ® mark in there. I was totally going to steal their mark!)</p>
<p><a href="/assets/images/the-cult-of-the-one-star-review/5exhgq0lucfk8a.png"><img src="/assets/images/the-cult-of-the-one-star-review/5exhgq0lucfk8a.png" alt="googleplay" class="align-center" /></a></p>
<p>This was the first review of the app. In a way, the reviewer is correct, if the user only installed the app to watch women’s basketball, and it only shows men’s basketball, then it’s useless, and worthy of a ★ review. But the app’s description states that allows “unlimited access to live streaming video of all 67 games of the 2014 NCAA® Division I Men’s Basketball Tournament”. I’ll let you be the judge.</p>
<h2 id="how-i-handle-user-reviews">How I handle user reviews</h2>
<p>Honestly, I’ve had my fair share of “does not support move to SD” reviews (on Android, the ability to run an app from an SD Card vs. internal memory). Does the app deserve a ★ review because you have too many apps installed on your phone?</p>
<p>I can not longer trust review scores. Between the “I ran this app for 2 minutes and it looks awesome ★★★★★” and the obvious attempts at review griefing, the signal to noise ratio is much to low for me.</p>Jason FamularoPlaying the game Like any many fixed systems, the supposedly fair system of user reviews is horribly broken. The process was ripe for gaming. And gamed it has been. Companies optimize their apps and websites to get you to leave ★★★★★ reviews. EA, with their Dungeon Keeper on mobile platforms has optimized this to the extreme: Clicking “5 Stars” take you to the store to give that ★★★★★ rating. While clicking “1-4 Stars”… Emails, as far as I know, don’t show up as app store reviews. Instead, you get ushered away from app store to some back room where no one knows what was said. That, in theory, leads to more ★★★★★ reviews and a higher score. EA’s tactic may have gone unnoticed if it wasn’t for other issues with the game. “Beating” the system Less than satisfied users on the other hand, in response to all the ★★★★★ reviews, or perhaps just in anger and spite, leave ★ reviews and scathing comments. “I’d give it no stars if that was possible!” raves one review. “Doesn’t support feature X, thus ★.” says another. In response to EA, the masses gathered to “correct” the injustice: an unfair playing field. Their response, ★ reviews. This behavior is called Griefing. The test Go to Amazon, or Best Buy, or the App Store or Google Play and read a few reviews. Play close attention to the ★ reviews. Results What did you find? I went to the Apple App Store (which is hard to navigate from a browser, but I digress) and looked at the first app in the first category: iBooks. Here are the three reviews I saw: Pay special attention to the middle review. Other than a thirst for violence, what sticks out? To me, it’s the desire to get a single thing changed (the new UI design to match iOS 7’s massive overhaul). So does this ruin the experience? I don’t know, I’m not the review’s author, shr00mie. Only shr00mie knows how shr00mie feels. And if we take shr00mie at his or her word, the app is ruined. Reading books is ruined. The review has an agenda. The agenda is to get something changed. And the way the user has decided is to attempt griefing with a ★ review. This behavior exists anywhere a user can leave a review. Let’s check the Google Play store. Maybe it’s just Apple zealots, right? This comes from the first app the store shows, NCAA® March Madness (so glad they got that ® mark in there. I was totally going to steal their mark!) This was the first review of the app. In a way, the reviewer is correct, if the user only installed the app to watch women’s basketball, and it only shows men’s basketball, then it’s useless, and worthy of a ★ review. But the app’s description states that allows “unlimited access to live streaming video of all 67 games of the 2014 NCAA® Division I Men’s Basketball Tournament”. I’ll let you be the judge. How I handle user reviews Honestly, I’ve had my fair share of “does not support move to SD” reviews (on Android, the ability to run an app from an SD Card vs. internal memory). Does the app deserve a ★ review because you have too many apps installed on your phone? I can not longer trust review scores. Between the “I ran this app for 2 minutes and it looks awesome ★★★★★” and the obvious attempts at review griefing, the signal to noise ratio is much to low for me.Technical debt: now or never2014-02-26T00:00:00+00:002014-02-26T00:00:00+00:00https://jason.famularo.org/technical-debt-now-or-never<p>I started a new project at work a few months ago. Literally, a new project, as in File -> New Project. It was very liberating (and scary) to not worry about the company’s main code base that was 10+ years old. While in decent shape, nothing that old is going to be without problems. I call those problems <a href="http://en.wikipedia.org/wiki/Technical_debt">technical debt</a>. (You also don’t get all the niceties and helpers that someone else has spent 10 years perfecting, but I digress).</p>
<p>Like any project, my new project started accruing technical debt. I was faced with the decision that every project is: pay back the debt or build shippable (and thus profitable) features. Most projects choose the latter. That’s probably the right decision in some cases. But being scared that one day the new project would be the old project, I couldn’t live with the decisions made weeks earlier. They didn’t sit right with me.</p>
<p>The other developer and I decided to fix them. It was now or never. Once we got out of the “build a thing that compiles and does the first thing” and into production, there wasn’t going to be a lot of time to circle back around. We’d be any other project at that point. Always enhancing, always maintaining. As we found the nasty regions in the code, we tore them out and replaced them with something better.</p>
<p>Technical debt is said to accrue interest. The longer it sits around, the more code that gets piled on top of it that makes it harder to change and fix. That’s one reason why we were able to pay so much back. The cost to do so was not yet high.</p>
<p>I’m not saying you can’t go back and pay back your technical debt at some point in the future. I think you should. Business needs in general don’t allow development teams the time they need to fix everything. We sometimes settle for what’s the worst code, or what’s easiest to fix. Slow and steady in those cases.</p>
<p>If you get a chance to pay back your debts, do so. The sooner you pay them back, the easier it’ll be. And you’ll feel a lot better about the code you leave behind.</p>Jason FamularoI started a new project at work a few months ago. Literally, a new project, as in File -> New Project. It was very liberating (and scary) to not worry about the company’s main code base that was 10+ years old. While in decent shape, nothing that old is going to be without problems. I call those problems technical debt. (You also don’t get all the niceties and helpers that someone else has spent 10 years perfecting, but I digress). Like any project, my new project started accruing technical debt. I was faced with the decision that every project is: pay back the debt or build shippable (and thus profitable) features. Most projects choose the latter. That’s probably the right decision in some cases. But being scared that one day the new project would be the old project, I couldn’t live with the decisions made weeks earlier. They didn’t sit right with me. The other developer and I decided to fix them. It was now or never. Once we got out of the “build a thing that compiles and does the first thing” and into production, there wasn’t going to be a lot of time to circle back around. We’d be any other project at that point. Always enhancing, always maintaining. As we found the nasty regions in the code, we tore them out and replaced them with something better. Technical debt is said to accrue interest. The longer it sits around, the more code that gets piled on top of it that makes it harder to change and fix. That’s one reason why we were able to pay so much back. The cost to do so was not yet high. I’m not saying you can’t go back and pay back your technical debt at some point in the future. I think you should. Business needs in general don’t allow development teams the time they need to fix everything. We sometimes settle for what’s the worst code, or what’s easiest to fix. Slow and steady in those cases. If you get a chance to pay back your debts, do so. The sooner you pay them back, the easier it’ll be. And you’ll feel a lot better about the code you leave behind.Two Factor Authentication with the same email address2013-05-09T00:00:00+00:002013-05-09T00:00:00+00:00https://jason.famularo.org/two-factor-authentication-with-the-same-email-address<h2 id="update">Update</h2>
<p>Google Authenticator no handles this situation correctly, and this article is less useful than it once was.</p>
<h2 id="original-article">Original Article</h2>
<p>Microsoft recently added two factor authentication. You should add this to your account. It’s a good thing.</p>
<p>I recently tried on my Android phone to scan the barcode, but it wasn’t working. My co-workers and I figured out that the Google accounts we already had setup on the Android authenticator app shared the same email address. Both Google and Microsoft were using that for their account name, so the second account wasn’t being added.</p>
<p>To get around this, I manually added the account and gave it a name other than my email address. I now have notmyrealemail@gmail.com” for Google and “Microsoft” for Microsoft.</p>Jason FamularoUpdate Google Authenticator no handles this situation correctly, and this article is less useful than it once was. Original Article Microsoft recently added two factor authentication. You should add this to your account. It’s a good thing. I recently tried on my Android phone to scan the barcode, but it wasn’t working. My co-workers and I figured out that the Google accounts we already had setup on the Android authenticator app shared the same email address. Both Google and Microsoft were using that for their account name, so the second account wasn’t being added. To get around this, I manually added the account and gave it a name other than my email address. I now have notmyrealemail@gmail.com” for Google and “Microsoft” for Microsoft.