Clicky

Tuesday, 19 July 2016

"No comment" – now Amazon are removing even Neutral feedback. Do not buy from Polimil Ltd.




It’s no secret that Amazon’s review system is utterly corrupt and broken. It’s bad enough that Amazon and Sellers solicit reviews from buyers, even if your preferences have been set to specifically avoid that type of spam. But, as myself and other customers have found, they’re only interested in keeping those reviews that turn out to be positive. Any negative reviews are quietly deleted without announcement or explanation. It’s hard to see this as anything other than fraud. Because ratings heavily influence and inform the buying decisions of future would-be buyers. So giving the misleading impression of uniform satisfaction amounts to false advertising. Ironically, it's well known uniformly-positive reviews reduce buyer trust for the whole system in general. At this juncture, Amazon's customer reviews have about as much credibility as North Korean news media.

The above state of affairs is bad enough. However, a recent experience has left me with an even lower opinion of Amazon than previously. They are now removing even Neutral feedback. Yes, you heard that correctly. 3 out of 5 stars reviews are being deleted. It’s difficult to see this as anything other than even more desperate whitewashing than before.


I recently left a review like this*:




(* full disclosure:  I had to mock the above image up from a nearly-identical review I'd left another less needy seller about the same time. Because my actual review was deleted I can't show you that. My review was exactly as shown.)


Seem innocuous to you? Me too. However, it unleashed a barrage of harassment, abuse, and unfounded claims of "fraud" by the seller. And ultimately led to my review being deleted without explanation or notification by Amazon.

The harassment started about a week after I’d left the review. When I’d made the order, I had supplied a phone number to Amazon, to be used for delivery purposes only. The item was being delivered to my place of work, so I left the main switchboard number. Experience has taught me never to trust Amazon with any more specific or personal means of contact.

Instead of being used for delivery purposes, the seller in this case (Polimil Ltd) actually had the gall to use the above number to call my place of work and attempt to demand a reason why I had left such “negative” feedback? I happened to be on annual leave (and I wouldn’t have taken such a presumptuous call anyway.) However, rather than belatedly realise that they were behaving like an idiot, this prompted the following email from the seller:



The above message demonstrates some of the many reasons I don’t leave detailed feedback nor engage in discussions about the feedback I do leave. Not only is it presumptuous in the extreme to ask a customer to explain why they find your service merely “Fair” rather than outstanding. I generally find people that are unhinged and socially deficient enough to try and demand such impertinent conversations to be factually incorrect as well. In this case, Polimil claimed that I had made allegations that I had not in fact made. Namely that the goods had been delivered late and were not as described. As you can see from my review above, I didn’t even answer the questions about whether the goods arrived on time or were as described. That’s why those sections have “N/A” against them. My review in its totality was simply “3 out of 5 stars, no comment.”

Anyway, I responded as follows. And expected this to be the end of the matter:



Apparently this clear instruction not to contact me again fell on deaf ears, however. Because a short while later, I received the following email:



By this stage, “Nick” was starting to look like this guy here:




I find the best way to deal with companies that can’t take Do not contact me” for an answer is to ignore their repetitive ranting, and focus instead upon repeating the “Do not contact me” message. In this case, I also felt that this further contact warranted a complaint to the body that are meant to prevent this type of abuse of personal contact information: the Information Commissioners’ Office. My response was:




You’d think that would be clear enough, wouldn’t you? Apparently not:



At this stage “Nick” (Nick Dunkley, btw, I looked him up for the Restraining Order that would surely be coming if he persisted in this pathological nonsense) sent the message above. (Yes, for the record, that’s the 4th contact in one day, including the initial phone call. Two of which emails were sent after being told in no uncertain terms to cease and desist his harassment. I guess Do not contact me” means Persist until you are taken to Court” for some people):

By now, Nick Dunkley had gone full circle and ended up looking like this guy:


 
(That's Basil Fawlty, btw, for you millennial readers that make me feel old so often by failing to 'get' my cultural references!)


I must admit at this juncture to laughing out loud at the farce this had become. Polimil's inept display of customer disservice had turned mild, neutral feedback into a blogworthy piece of bad press.
 
The unprofessional way I’d been stalked by these lunatics after making this one-time, low-value purchase had already guaranteed I’d never consider purchasing from Polimil ever again. Only an idiot would persist in contacting a customer that had already said Do not contact me” twice, and who had promised further formal action in the form of a complaint to the regulator if the harassment didn’t stop.


I think that some Amazon sellers lose track of the fact that most customers don’t purchase from them. We purchase from Amazon. They are just a smalltime supplier to Amazon, of which there are many that can be easily replaced. Their business model is so fundamentally-flawed that they actually need to use a third party website to sell their goods. Whose only function is to insulate customers from them. And they need to pay Amazon for the privilege. Sellers are ultimately just a small fish supplier to Amazon, whose crappy customer service Amazon has unwisely tried to outsource to customers to deal with.

Behaviour like this, I believe, will ultimately cause customers to abandon Amazon in the same way we abandoned the High Street a few years back. You can only get away with so much customer abuse and dishonesty. On the high street, it was constant obnoxious upselling at the till that forced once-dominant companies like HMV out of business. Customers made their way onto the internet to avoid that type of tedious and unpleasant behaviour. I think that in time Amazon will also to lose their present place at the top of the supply chain. Because of Amazon's tolerating and encouraging the type of behaviour I and others have experienced from unprofessional sellers like this.

Anyway, as mentioned in the emails, I did contact Amazon to complain about this Seller's complete lack of professionalism, and their seemingly-unhinged staff. I asked for compensation for the harassment I had been subjected to. This was Amazon’s response:




So, a stock letter admitting no responsibility whatsoever by Amazon. Even though the seller stated that Amazon had “advised” them to contact me. Incidentally, I also found this illuminating discussion on an Amazon Sellers’forum. It demonstrates two things. 1) Even Amazon sellers themselves find obnoxious the constant nagging by some sellers for positive feedback. 2) Amazon doesn’t just condone or turn a blind eye to sellers harassing buyers for positive feedback in this way. Amazon goes out of their way to advise sellers to do it. So, I think it’s pretty credible that Amazon have equal or greater liability than the seller for the harassment they solicit from sellers upon buyers.

Anyway, later in the day there was a somewhat ranting response posted against my feedback by the seller. I guess by that stage Amazon had advised them they couldn’t remove my feedback, as I hadn’t given them any plausible rationalisation for doing so. 

I don’t have a copy of the Seller's full rant, but basically they accused me of “lying” and suggested my review may have been "malicious." I think it’s worth re-iterating at this juncture that I had done nothing more than give them a “3 out of 5 stars – Fair” rating, and posted the simple message “No comment.” Even though their subsequent Customer Disservice insanity wouldn’t have warranted nearly such favourable feedback.


This morning, I see that my review has been deleted entirely. So, reviewing Amazon's response above, apparently my feedback being "invaluable to us" and an undertaking that it will be taken with the "utmost seriousness" is code for "We will delete it as soon as we think your back is turned. All the Seller needs to do is rant at us like Basil Fawlty and we'll fold like a cheap suit."

I’ve contacted Amazon customer services this morning for an explanation as to why my feedback was removed, and have demanded that they reinstate it. I won’t hold my breath. I guess companies like Amazon can get so big they forget that they don’t control the whole internet. So this sorry tale of customer abuse and whitewashing gets posted on other review sites and my blog. Instead of being an innocuous “3 out of 5, no comment” rating on a website whose reviews they delete at will.

_______________________________________________

Update: here is some bonus insanity from Basil. I mean Nick Dunkley. I received the following email from him today:




You can't fix stupid. I find more and more this is the type of low intelligence alpha personality that you encounter as a buyer on Amazon. Which is why I give it a miss whenever possible. 

Still, it was something else to add to the complaint I sent ICO that demonstrates how unbalanced this buffoon of an Amazon Seller/Stalker is.

Friday, 25 December 2015

Building a Total Quality Software environment, with Continuous Integration, Unit Testing, and Dependency Injection. And Futurama.


Recently at work, I’ve been working with my colleagues to set up a Total Quality software environment. I’ve been learning a lot from my peers about topics such as VMware, RTI and Code-First EF. (I’d previously used Schema-First, but Code First brings its own advantages and challenges). What I brought to the party was some project experience in: 

  • Continuous Integration platforms (specifically in this case, TeamCity.)
  • Unit Testing and Test-Driven Development techniques.
  • Dependency Injection to support writing testable code.
  • NAnt scripting.
  • Futurama.

We’ll get to that last one in a minute. Let’s go through the others in order first.


Continuous Integration (CI)





Everygeek who’s anynerd is using it these days. But lots of development teams and companies still avoid it, imagining it to be too difficult, too time-consuming, or just not worth the hassle. (For that matter, those same fallacious criticisms can be levelled at every other item in the list above too. Except Futurama.) A decade ago people used to say the same things about Source Control; thankfully there aren’t too many teams I encounter these days that haven’t got their head around how important that is.

Some teams aren’t even sure what CI is, what it does, or what advantages it brings. They’ve always worked by developers just producing software on their own PCs. And they just deal with any time-consuming fallout when it comes to making that software work in the real world as part of the cost of doing business.


OK, so here’s the unique selling point if you’re trying to make the case for introducing this where you work. Are you ready? What CI adds to your team’s game is simply this: repeatable, verifiable deployment. 


Unit Testing and Test-Driven Development techniques 

Unit Testing has been around for a Very Long Time. I know a lot of people who are otherwise very good developers but who “don’t see the point” of unit testing. And I have been such a developer myself in the murky past. 

The misconception that unit testing is pointless generally comes down to a few fallacies:

  • They believe that their own code always works.
  • The wider team and stakeholders place more value on quantity of new features than upon quality of existing features.
  • They believe that they will always personally be around to ensure that their code doesn’t get broken in the future.

Like most good fallacies, there’s just enough truth in most of these to preserve the illusion that unit testing doesn’t provide enough advantages to the person that has to implement it. Not when compared to the opportunity costs of them learning how to do it, or the kudos of pushing out new features (that don’t work as intended.)

Part of the reason more developers don’t give it a go, is that you have to change the way you write code. Most code I’ve seen in the wild is tightly-coupled. This is a phrase that many developers are familiar with, but in my experience vanishingly few know what it means. Basically, it means that if you are writing Class A, and your class depends upon Class B to do its job, your class will instantiatiate a new instance of Class B itself. This means that if Class B stops working, all you (and Users) know is that your class “doesn’t work.” They won't care if your code is perfect, and it's just that damn Class B that let you down.

So, when doing test-driven development, developers need to add another couple of skills to their arsenal. Which brings us to… 


Dependency Injection (DI)

One type of Tight Coupling is defined above. Code is also tightly coupled when it is too closely tied to one UI. So, if you’re a developer that puts all their business logic in code-behind files or controller actions, your code won’t be testable. Because your code needs the UI to do its job, before it will be able to be verified.

Fortunately, there are frameworks and coding styles out there that help developers implement loose coupling, to make their code independently testable. 

The basic idea behind all of these is that instead of your Class A consuming Class B directly to perform some function, it consumes Interface B instead. That is, some object that Class A doesn’t instantiate itself, satisfies some interface that represents the job Class B was doing for Class A. Typically this is achieved by making the constructor of Class A look like this :




 The above pattern is known as Constructor Injection. What it gives you is the ability to swap out whatever is implementing Interface B when it comes to unit testing Class A. So, instead of the object that really does implement Interface B in live use, you can use what is called a mock instance of Interface B. That is typically some object that always gives you anticipated responses. So you can concentrate on testing Class A. That way, any errors you see can be wholly attributed to Class A.

When you write your classes using the Constructor Injection pattern demonstrated above, DI frameworks provide concrete implementations of objects that implement interfaces at runtime. So, you 'magically' find a usable implementation or Interface B available in Class A's constructor. As the developer of Class A, you don't care particularly about where that implementation of Interface B comes from; that is the responsibility and concern of the developer of Interface B and your chosen DI framework.

This is just one of the techniques that developers moving from code that "just works" need to learn if they want their code to be verifiable. It is difficult to embrace. Because frankly writing code that "just works" is hard enough. And because using these techniques opens up the possibility of developers having to recognise errors in their own code. But unit testing also brings with it a huge number of advantages: The ability to prove that a given piece of code works, not just at the time of writing but every single time you build. And it protects your work from being modified in adverse ways by subsequent developers. 

Unit testing and Dependency Injection are whole topics on their own, so I won't say more about them here. (I'll perhaps save that for future blogs.) With regard to understanding tight and loose coupling, though, I'll leave you with an analogy. If a traveller wants to get to some destination, they don’t need to know what the bus driver’s name will be, the vehicle registration, what type of fuel the bus uses, etc. They just need to know what bus stop to be at, what time, and what is the correct bus number to get on. Similarly, Class A doesn’t need to know everything about Class B or where it comes from. It just needs to know that when it requires an object to do some job, one will be available at an agreed time. Class A instantiating Class B itself is analogous to a traveller trying to build their own bus.

Last time I checked, there were something like 22 DI frameworks that you can use with .Net. The one I implemented at work recently is called Castle Windsor, which I’ve been using for a few years. In benchmark tests it’s not the fastest. It’s not the simplest. And it’s not the most customisable/powerful. But it is the one that for my money strikes the right balance between those competing factors. And it integrates particularly well with ASP.Net MVC and Entity Framework. 


NAnt Scripting 

Continuous Integration platforms on their own give you a powerful way of automating builds and deployments. However, there are advantages to be gained to farming out some of that work to a more specialised tool. NAnt is one such tool.

For any system that gets developed, there are typically 10-25 individual “jobs” that are involved in setting up a copy of the system that Testers and ultimately Users can access. e.g, for a web app you might need to:


  • Create some Virtual Directories in IIS.
  • Copy the files that the website is made of into the folders those VDs point at.
  • Customise a web config that tells the site how to access the underlying database.
  • Create the underlying database in SQL Server.
  • Populate the database with data.
  • Create an App Pool in IIS under which the site will run.
  • Grant the relevant App Pool access to the database


You’d also be well-advised to have steps that involve:


  • Running unit tests, so you don’t deploy broken code.
  • Updating Assembly Information so that each build has an identifying number. That way, bugs can be reported against specific builds.
  • Backing up any prior version so that you can rollback any of the above steps if the deployment fails.


If you put these in a script that lives in your project instead of in build steps on your CI server, you can more easily mirror steps between different branches in your builds. 


Futurama 

One of the things that motivates me is getting to have a bit of fun whilst I work. In the team I joined a few months ago, there has been one common theme tying all of the above threads together: Futurama.

Myself and my colleagues have set up about 10 Windows Server 2012 machines that perform various jobs. e.g., One of them is a Domain Controller. Another is our CI server. Several more act as paired web and sql servers that can be temporarily allocated to testing, by internal testers or by end users. Or they can be used by developers to test the deployment process.


Each of our VMs is named after a Futurama character and has its own distinct colour scheme. (NB: They have a fully-qualified name too, like DVL-SQLALPHA, that describes their actual role.) This helps developers stay oriented when RDP-ing around what would otherwise be nearly-identical machines. It’s also fun.  

You saw how TeamCity / Professor Farnsworth looked above. This is how one of our Web Servers, characterised after Zapp Brannigan, looks. As you can see, it's easy to tell which VM you're on, even from a distance:

 





There are Futurama-themed Easter Eggs hidden in other parts of our build process too. e.g., each CI build produces a log file. At the end of which, a build gets reported as “Successful” or “Failed” for some detailed reason. A recent evening in my own time, I wanted to test implementing custom NAnt functions. (NAnt is written in C#, and you can write functions in C# to augment what it does.) In order to test this with something non-critical, I augmented that custom “Success” or “Failure” method thus:






The exact piece of ASCII art that gets rendered reflects whether the build was successful or not, and is semi-random. So, you might get Hermes with a brain slug saying something dumb if the build is broken. Or you might get Professor Farnsworth announcing “Good news, everyone!” if all went as planned.

These 'features' are of course whimsical. But at worst they give developers a smile during some of the tougher moments of the job. And at best they give you a chance to test out new techniques on non-critical features. As well as giving your brain a rest between more intensive tasks.

The best teams  I’ve worked with all knew their onions on a technical level, but also knew when to have fun too. I'm glad to be working in such a team at present. e.g., I recently implemented the following function:







My colleague Ian made me chuckle when I discovered this in our code repository a few weeks later:



Saturday, 10 October 2015

Product Review - Wrappz Laptop Decals and Custom Phone Skins



Like many developers, I get my money's worth out of the laptops I buy. Sometimes it seems I use them every minute of the day. And, over the years, I've accumulated quite a collection of physical machines in addition to the various VMs I have carrying out miscellaneous tasks around the house.

I secretly love the obviously-marketed-at-women ones that have cases made of pink brushed aluminium and the like. But, also being a professional developer, I have to say that almost always that fancy case comes accompanied by last year's technology (or older.) It simply isn't a good business decision to buy them when you review the spec.

As a wise philosopher once said, I'm a Barbie Girl in a Barbie World.


So, I often end up buying machines that have phenomenally-fast dual/quad processors with acres of RAM capable of running lots of memory-intensive applications concurrently. And I switch out the standard platter drive for a 1 TB SSD. (I usually also swap out the optical drive for a second 1TB SSD. And 2TB SSDs that I've not yet had a chance to get my hands on have also now become available, so my next dev machine will have 4TB total, but that's really a different review.)

Anyway, for some reason the most performant laptops always seem to come in boring black boxes. When you acquire a few of these over the years, it becomes difficult to tell them apart. So for a few years now I've been putting decals on the back and naming the machine according to which decal adorns it. I also make the login screen and desktop background of these machines match the decal. This all helps keep you oriented when you're navigating around, RDP-ing from one machine to another.

TaylorHe Decals

Up to now, my go-to decal manufacturer has been TaylorHe. They do some very nice pre-made patterns that suit almost every taste. With my new work laptop, however, I fancied doing something a bit more bespoke. I'm a huge Breaking Bad fan, so I wanted a machine that had a theme related to that. 



 
Since the device that I usually take pictures with is in this photo, my friend Ian O'Friel
kindly helped me take this. Which made it a much better photo than it would otherwise have
been as he has a real eye for photography. (You can see more of Ian's fab photos here. I
particularly like the one of the old rusty gate and the South Side At Night.)
 
Looking around, I found a company called Wrappz that provides exactly this type of product. Not only do they produce decals with custom designs, but they also print them on a custom-sized sheet. So you don't have to trim them to fit your machine. This may seem like a small advantage, but it was nice just to be able to use them out of the box like that rather than messing around with a scalpel or scissors.

Like TaylorHe, Wrappz also do custom phone cases. So I got one of those to match the decal. (Not that I actually own a phone, incidentally - I'm one of the few people I know that doesn't use one, and doesn't miss it. I have a Samsung Galaxy S2 'phone', but it acts as a personal organiser rather than as a communication device. I only put a temporary SIM in it when I have a reason to, which is almost never.)

If you want to order some of these decals / phone cases for yourself, here are some discount codes you can use to get them more cheaply. NB: I've got no commercial relationship with Wrappz, and I haven't benefitted in any way from this review. Also, I won't know whether anyone has used these codes:
 
Wrappz discount codes

More Wrappz discount codes

Last small tip for those who, like me, have multiple laptops in their network to access. You can place the name of each machine in the Task Bar by creating a new Toolbar, and calling it "\\%computername%", as described here. It makes it amazingly easy to see which machine you're on, even if you have a full-screen program running, and even if you're accessing it from another physical device.

Computer Name on Task Bar