10 Shady Software Practices That Bug Me

As a software developer I can see both sides of the software “coin” and as an informed user I take offense to some of the shadier tricks I’ve seen lately.

This isn’t specific to any single vendor or even type of app/game but it seems at a certain point every software developer hits a moral crossroads where they have to decide if the increased revenue potential is worth crossing the ethical line in the sand.

Admittedly these scenarios are often a very gray area but I’m going to play a trump card on each that I’m calling the “Usability First Card“.

In short it’s really simple… If the software avoids basic usability in order to take advantage of a user where the upshot is potential financial gain – I call Shinanigans!

#1 – Overlay popup windows with ridiculously tiny ‘(x)’ buttons to close them.

Especially on mobile web sites/apps this is insanely frustrating as 50% of the time you end up missing the (x) and clicking the popup window. Inevitably 9 times out of 10 this isn’t just a message box, it’s an advertisement for something you could care less about.  Are the developers doing this on purpose? there might be some naive developers out there that are doing this accidentally but I bet that most are taking advantage of this usability issue to increase their ad click rates, and thus their ad revenue!

#2 – Randomly placing the close (x) on the top left, or the top right.

Does the (x) belong on the top right? or top left?… we could argue that for days but what is for sure is that it should be placed consistently within a site/app.  There’s several mobile games I’ve seen that randomly change the location and thus clicking in the spot where the (x) was before now becomes an ad click. Shame on you developers… even you know that this tactic is shady!

#3 – Placing the “Continue” button jammed up against the “Buy Stuff” button

If you’ve ever played mobile games you have likely been snagged by this where the button you want to click to “Continue” is placed right above/below the “Buy Stuff” button such that if you are off by 1 or 2 pixels in your click you are taken to a purchase screen.  General usability tells us that placing 2 distinctly different buttons so close to each other is not a good idea but shady developers are just hoping that if you get there (even by accident) you might buy more gems, diamonds, coins, tickets, tokens etc. for your game.

#4 – Sizing buttons such that the “free” button is 1/2 the size of the “pay” button

From a marketing perspective and the “Art of Persuasion” it makes sense to make the Call To Action (CTA) e.g. purchase button larger in size as it is easier to click and much more prominent… however if you do the inverse and make the free option so small that it can’t be easily clicked, or try your best to hide it then you are doing your users a serious dis-service.  It’s important to note that your current “non or low paying” users might be your high paying users in the future – so you don’t want to tick them off with silly stuff like making their user experience suffer.

#5 – Don’t let me use an app for “Free” and then only when I’ve spent an hour on it tell me that I can’t save my file!

There’s nothing wrong with a freemium model that let’s a user sign up for free to try out a product… and then once they discover they like it provide an option for them to purchase it.  However you won’t make any friends and you’ll likely get bad reviews if you let them create a file, work on it for an hour then tell them they can’t save their work without paying. I actually used a web app recently that did this… and even though I was making the purchase… they didn’t save my work! This left a really bad taste in my mouth, and I opted to cancel my subscription instead. If they didn’t care about me as a user right from the beginning – what chance do I have once they’ve “cashed my check”?… am I going to have to pay to export my data later if I decide to leave the app?

#6 – Cranking up the volume when playing a video ad

I find this one particularly offensive when I’m lying in bed trying to wind down before going to sleep. A video ad comes on and the developer has chosen to jack up the volume. If I have the volume setting at 1 or 2 it’s at that level because in my current surroundings that’s the volume I need.

#7 – Playing “The old switcheroo

You’re playing a simple tapping game on your phone where a tap is “gas”, “jump”, “shoot” or similar and it’s the only thing you need to do. By default (and not to obscure your view) you tend to tap in the middle of the screen about 1/4 the way up from the bottom. This works perfectly when playing a single handed game. When your game ends you just tap on the “Start Game” button conveniently placed where your finger already is to start over. This is where the evil sneaks in, randomly inserting a full screen ad after a game ends so that you tap the ad instead of starting a new game. To add insult to injury you place the download/install button in the exact same spot as the Start Game button.

#8 – App install required to play video

We connect with our friends and family on Facebook and similar social media outlets.

Sooner or later one of your friends has shared a video “OMG! I can’t believe what this dog does to this poor little girl!” The title alone is extremely “click bait” in nature but if your friend shared it, it must be good, right?!

You click the video link and you’re prompted to install some sort of app/plugin to see it that needs full access to your contacts and your Facebook profile in order for you to watch it.

This is ludicrous as any modern browser can play a video or in the worst case download it so you can watch it in the app of your choice. Instead it is a very thinly veiled con into you installing their crapware and/or letting them mine your social circle… Or worse yet spam them – in fact you now have to wonder if that’s why your friend <air-quotes>shared</air-quotes> this video in the first place!?

#9 – Pre-checked spam/upsell items

You go to install, upgrade or just plain load some software and behold you are presented with a few options and a Next button… Your brain is so well trained to just accept the defaults and go but a closer look reveals those less than stellar options are pre-checked! Do you want to sign up for a spammy newsletter? Of course you don’t, want some useless toolbar installed in your browser? Nuh uh! Want us to sell your email profile to our “partners” with very likely even shadier business practices? – oh he** no!

I’ve commented on this one before as I find it not only frustrating but it directly negatively affects my image of your brand!

#10 – Auto-renew from free to paid

Often a software company will give you the chance to try software for free. Conceptually this is awesome as it lets you experience a piece of software on your own terms and decide if it fits your needs. However some folks have decided that this signup requires a credit card and that after the trial period you will be automatically billed *unless* you reach out to them and cancel first. If I catch on that this is how a company operates their trials, I immediately drop out of the free trial as this is not how I want to be treated as a potential customer.

#11. – (bonus 2 for 1) Fake Billing

If you’ve ever bought an Internet domain where your name and address are on record as the owner of a domain you’ve likely received what appears to be a bill to renew your domain(s) well before they will expire… by a completely unrelated company!

The scammers behind this send you what looks like a bill (though to cover themselves legally it has fine print indicating that this is only an offer to use their services). If you don’t take the time to scan the details you end up paying the new fees (which transfers ownership of the domain) and often the fees are not as competitive as where you are currently.

The 2 for 1 part of this item, is that domain sellers can alleviate this issue if they put their own details in for the public listing (Whois record), to obtain a “private listing”… and they do provide this service!, at an extra cost! It would be best if domain sellers/hosting companies just put the private registration right in the cost of the domain up front.

Advertisements

The Getting Things Done Trap

In the world of software development there is an interesting bi-polar fascination with the “GTD” (Getting Things Done) mantra.

On the outside, GTD seems awesome and exactly what you want to strive for and a quality you want to look for in a team member.

However there is a dark side to GTD and that’s going to be the subject of this post.

There’s a classic quote I first heard from my grade 8 math teacher.

“No one ever plans to fail, they fail to plan.”

This statement is so simple yet so prolific. It is entirely accurate 99% of the time.

Let’s break down the things that can go wrong and cause a project to fail.

1.) There isn’t enough time to complete the project (even if you were Superman)
2.) The requirements are never solidified until a point at which #1 kicks in
3.) A technical challenge crops up that can’t be solved within time/budget (you find out you need to support infrared communication on a mobile device that has no IR sensors) and #1 kicks in
4.) Pure incompetence by 1 or more of your team members
5.) An external event beyond your companies control de-rails the project (e.g. A flood wipes out your building and electrical for 6 weeks and #1 kicks in

Everything except for #5 is something that could have been resolved if it was discovered and raised in time.

This is where the quote comes into play. If you plan out all the important aspects of your project, and maintain up to date digital documentation that everyone on the team can reference, then you almost completely remove the risk that the project goes south.

With software, there’s 100’s of moving parts that need to work together and not getting the right design from the get go can cause significant pain, cost and stress… In the worst case cause the code to be throwaway and require starting from scratch.

Of course “building” the software project is really only phase 1. Once built it takes on a new life and has a new set of requirements.

  1. It needs to perform well once released to the masses
    • Are the SQL/NoSQL queries as optimized as they can be? Are new DB indexes needed, or further DB normalization?
    • Are the loading/rendering response times as fast as they can be?
    • Are there any wasted code paths that are chewing up CPU, Network, Memory, or bloating data payloads etc. that should be cleaned up?
  2. It needs to be maintained, adapting to changes in the business requirements over time
  3. It needs to be flexible (code design wise) to handle tweaks and changes as part of #1 and #2 above

So what’s the moral of the story? Well in short, I’m fully behind the GTD mantra when it pertains to getting focused on solving a problem and working fast & hard on a solution. However it is really key not to get caught up in the excitement and “just start coding” without working out the key requirements and implementation details.

If you or your teammates are diving in without *really* knowing what you are building, there’s a very high risk that it won’t be the right thing.  You’ll either have to throw that work/effort away, or you’ll end up with a poor and/or cumbersome solution because you went too far down the wrong path and didn’t have enough time (or courage to admit defeat) and go back and start over.

This is where the GTD mantra can get you in trouble… and let’s call a spade a spade… Where the Agile “build, fail fast, iterate” can get you begging for mercy too.

So how do you detect when your project’s planning is being skipped? Here’s the telltale signs:

  1. If developers are anxious to build “part a” and worry about “part b” later… But there are aspects of “part b” that affect how “part a” should be designed or work… You need to stop and plan.
  2. If developers are not asking about or clarifying the ambiguous multiplicity of business entity relationships before coding… You need to stop and plan.
  3. If anywhere along the development process a developer says they can’t do “X” because the just built model/data structure doesn’t support it… You need to stop and plan.
  4. If the UI (User Interface) can not do what it needs to do because it is missing key information… You need to stop and plan.

I’ve seen developers that have worked on small projects plow ahead and duct tape their way through an implementation but in the real world of business / enterprise software development these are the things that kill progress and create fragile software if not caught early.

An hour of planning now can save you weeks or months down the road if you have to go back and re-engineer something that you built wrong because the plan wasn’t there or complete.

(Plan, Build, Test), Iterate

 

Why are Small Development Teams so much more Productive?

For anyone that has read “The Mythical Man Month” this should really come as no surprise but there is a very simple way to see and understand why the larger the team you have – the slower you’ll actually develop.

Its all about communication.  In an ideal world every member of the team will share everything they are doing with the rest of the team and each of them will share their updates with everyone else.  In this scenario everyone would know what is going on and there wouldn’t be mistakes or duplication due to lack of communication.

In fact when you develop by yourself (team of 1) there’s not even the possibility of communication issues because you have no one that you need to share info with… and no one you depend on for critical data.

If your team is 2, you have 2 channels of communication to maintain… A to B… and B to A

Team of 3? now you’re up to 6 channels… and it keeps growing exponentially.

Even with a team of 10 people your communication channels jumps up to a massive 90 communication channels! # of channels = (n * (n-1))

peopleVsChannels

So whenever you are embarking on a new project try to keep the team size as small as you can while still enough to be effective.  If your team is part of a bigger organization be sure to have a “Point Person” that is the one who interfaces with other teams to both broadcast updates and collect any info from external sources that is to be passed to the team.

Managing Communication is key to not getting caught in a project that just seems to stall and run in circles.

The 40+ year quest to improve the numeric input control

I hereby present a challenge to the Internet…

Challenge: Design an improved numeric input field that could trump the 40+ year version we’ve all used… the standard horizontal string of digits.

Over time software developers have improved many fundamental aspects of graphical user interfaces constantly raising the bar for both design & usability.

We now have several enhancements on input controls that have become standard. Date inputs present calendars, Integer inputs contain spinners, multi-line text inputs contain character counts and auto expand to not require scrolling etc.

However dealing with numeric input is much more tricky. There’s some improvements that have been made in mobile for numeric inputs to present the numeric only keyboard… But beyond limiting the input to digits and decimals there isn’t really anything you can do to improve the actual input control.

Realistically here’s the set of constraints a numeric input field should be able to handle.

  1. The field must accept any valid number input between Negative Infinity and Positive Infinity
  2. The field must accept decimal values
  3. The field must support input from the keyboard (physical or software based)
  4. The field must support pasting input from the clipboard (on OSes with a clipboard)
  5. The field must support dragging input from elsewhere in the OS (on OSes that support this)
  6. The field should support locale based input, thus 49.99 in English could be entered as 49,99 in French locales

I’d argue that the first 2 bold constraints are hard requirements, and that the remaining are softer, ideal requirements

The shear number of possible values that a user could enter is truly infinite… and here in lies the rub… trying to design a specialized input control for data input of an infinite number of possibilities doesn’t allow for providing a special, customized control.

Don’t get me wrong though as soon as you alter or remove any of those constraints above other options do become available.

e.g. If you need to provide a field for input of an integer value between 1 and 10 you could use a <select> element to constrain input.

Or with HTML5 you could use an <input> of type range that can present a visual slider.

Neither of these allow for pasting in input but one could argue with such a small range of input this paste option feature is less of a need/requirement.

So… do you think you can come up with a better design that increases usability while handling the required constraints?

I’d love to see what ideas or creative solutions you might have.  I’ll admit I’m pretty adamant that there simply isn’t a better option, however I’m totally open to, and would love to be proven wrong too!

Programming Rule #3

“Thou shalt always leave the code cleaner than when you found it.”

If you’ve ever had to work on a medium to large size code base you very quickly learn that the level of effort to maintain such a beast is indirectly proportional to the level of quality and cleanliness of the source code.

Every dirty hack, every one-off, every “chunk of ‘this-is-just-temporary’ code”, every badly named variable/method, every bit of sloppily formatted code makes maintaining it that much harder.

As a result you get into a mindset that you are dammed & determined that you will not let code rot on your watch and you start to do everything you reasonably can to prevent it.

If you’ve never worked in a wide-sweeping role that brings to light how the little issues become big problems… trust me they do. One badly named method becomes several hundred badly named methods in no time flat, and suddenly you now have a confusing and complicated API due to the lack of foresight.

The end result of learning about the “Broken Windows Theory” (the problem this rule is solving) is that you very quickly adjust your approach and work extra hard to ensure that you do your 110% to ensure it not only doesn’t get worse – but it has to get better… even if only just a little.

When you come across a file, no matter how you got there… if you see a problem you do something about it.

  • Bad spacing or indentation?…  you FIX it!
  • Inconsistent attribute quoting?… you FIX it!
  • Funky statement formatting?… you FIX it!
  • Risky error prone code?… you FIX it!
  • Dead, empty or commented out code blocks?… you DELETE them!
  • Useless comments?… you DELETE them!
  • Redundant line breaks?… you DELETE them!
  • Trailing whitespace?… you DELETE it!
  • Badly named local variables?… you RENAME them!
  • Unused variables?… you DELETE them!
  • Typos or grammatical errors?… you FIX them!

The 30-60 seconds of your time to attack these problems will save many minutes for every future developer that looks at this code and in time save aggregated hours or even days of time and frustration for future developers attempting to debug when something goes wrong.

You’ll notice that many of the above issues are resolved by deleting code.  This is a good thing! In fact you’ll find that there is very little in programming that is more satisfying than deleting code! Just ask Jeff Atwood (aka @CodingHorror)!

Related: Programming Rule #1, Programming Rule #7

Every Web User Deserves Usable Form Controls – Even in Internet Explorer!

As a Web App Developer – Internet Explorer is the browser we love to hate.  However end users that use Internet Explorer (by choice or by force) shouldn’t have to suffer poor usability when we can do something about it.

The usability item I want to mention today is with regards to <textarea> elements.  Conceptually the textarea field is dead simple, a multiline text field control… but it is the little details that really matter.

The 1st problem is that by default IE renders textarea controls with a disabled vertical scrollbar when it isn’t required. Visually it is just extra noise and consumes valuable space, but it is also potentially misleading as it implies that the field itself might be disabled.

However the 2nd problem is that IE didn’t keep up with the times as browsers advanced.  All other browsers have added a usability tweak enabling the user to stretch the textarea to their desired width/height so they can see more of the content in the textarea or shrink it to see more of the surrounding screen.

I’d love to see the stretchable textarea become a native feature in Project Spartan (the new browser from Microsoft (think IE12)) but even if it never makes it in – we can always apply a little JavaScript magic to bring the stretchable feature to Internet Explorer!

Presenting StretchableTextareas! a jQuery plugin I wrote (MIT license) that adds a simple overlay to mimic the gripper in other browsers (see screen capture below).

ieStretchableTextareas

Go ahead and download/fork the StretchableTextareas jQuery plugin code on Github.

Required Web Developer Toolbox Item Number 3

Opening the Toolbox

Every developer (and in particular) every Web Developer should have several tools in their toolbox.

I’ll reserve #1 for their assorted Web Browsers + devices, and accept #2 for their favorite text editor (Sublime, HippoEDIT, Notepad++, etc.) but that leaves us with the #3 slot open.

I think this is where every developers next tool depends more on their personal approach to development and what role they are filling that day etc.  If I’m doing graphics today then PhotoShop is my next weapon, Schema refactoring? then that will be my DB management tool… or based on how long it stays open when we are coding maybe its our console(s)?

However there is one tool I think is really important to developers that gets overlooked and that’s because you typically have to write this tool yourself – and its different for everyone!

Welcome to Searching your code base!

Search & Replace with our friend Regular Expressions

On the surface this is a super easy concept… you want to:

  1. Find all occurrences
  2. of ${someValue}
  3. in files of type ${theseFileTypes}

So you put your grep fu to work using whatever search tools you like, possibly with a funky regular expression to find that dynamic/variable value that you are looking for. It works great, you find everything you’re looking for… right?… wrong!

Sometimes you can’t find what you’re looking for because basic searching is quite limited and as powerful as they are, Regular Expressions have (IMHO) a severe limitation in that you can’t search for:  (find this)(but not this word)(followed by this)

You can abuse a RegEx to find matches that don’t contain a word… (great StackOverflow.com example answer) however you will always want to find stuff before/after it and thus it all starts to fall apart.

Other things that aren’t simple to find:

  • All files containing ${keywordA} but not ${keywordB}
  • All files containing ${keywordA} somewhere in the file after ${keywordB}
  • All files containing ${keywordA} without ${keywordB} directly following it

In the case of HTML files (regardless what language you use to generate them) there’s things you might want to be able to check for that go well beyond basic searching. How would you do some of these?

  • All files that define ID attributes (e.g. <div id=”foo”>) but only those that accidentally generate duplicate IDs… and if so list which IDs are duplicated
  • All files that include a specific JavaScript file but don’t contain any calls to the functions defined in it
  • All files that include 3 specific components in any order

The solution is both obvious and just painful enough that many developers give up and don’t attempt to solve the problem – heck I was one of them… for years!

The Solution:

The solution is to write code to do your dirty work 😉 the language you use doesn’t matter as long as you can fairly quickly script up what you need including:

  • Recursively search your project directory of files (and be able to cap/control iterations)
  • Filter by multiple file types
  • Search multiple keywords (simple & RegEx)
  • Track and compare result findings
  • Output some sort of a log of all the findings

Although you might be thinking… what about the ability to make code replacements? You’re right that would be a bonus but if you get too caught up trying to handle that part (which can double your overall effort) you’ll likely give up or risk causing damage to your code files due to a corner case condition you weren’t expecting.

The good news is that omitting the replacement part actually doesn’t matter because once you have a log of files matching your query its easy to load them in your favorite editor and then run search & replace across your open files as needed.

My Solution:

As I said the language you use doesn’t matter. I went with something easy, it works with the tools I already have at hand, & requires no compiling… PHP!

I’ve created several “base” scripts that are easy to extend/edit as needed for any task at hand and whenever I need one I just hit that file’s URL in my browser and let it do all the hard work 😉

I’ve hosted the base files for this up on GitHub in  a project called ProjectQuery (under MIT License) feel free to grab them and start building your own collection of custom code searching tools!