Favorite Websites, 2014 edition

Since I’ve given up twitter for the next ten weeks, I still need some way to keep up to date on news and technology.

Normally, I’d just check twitter. Anything I need is on there. Without it, I find myself having to remember to visit different websites.

For Tech News:

news.ycombinator.com

It doesn’t update with new topics as much as I’d like, and it has a terrible user interface for mobile, but otherwise it works.

For snail news:

cnn.com

It’s less inflammatory than FoxNews, and as long as I stay away from the opinion pages, I don’t feel the need to throw my computer.

brentozar.com

The home for Brent Ozar Unlimited; a boutique SQL Server consulting firm. I’ve attended their SQL Server Performance Troubleshooting class in Chicago, and I worked with them when Jeremiah consulted with us on how to improve our SQL Server performance. They have daily blog posts about the world of SQL Server. It’s a must follow if you’re at all tangentially exposed to it in your daily work.

Ozar.me

Brent Ozar’s personal blog. All of the above still applies, of course.

DBAReactions.com

A GIF driven Database Learning site. I’ve submitted a few reactions, but I’ve learned a whole lot more from the ones there. It’s learning disguised as funny.

Hanselman.com

Scott Hanselman’s blog. He’s one of the premier technologists in the .NET World, and blogs daily about different tech related topics. Sometimes it’s .NET, sometimes it’s wearables.

jwz.org

Jamie Zawinksi’s blog. He’s one of the guys responsible for Mozilla. His blog is sometimes educational, but always funny.

Joey Devilla

The Accordion Guy. Equal parts Canadian, Funny, and Insightful.

Eric Lippert

Used to be part of the C# compiler team. Now works for Celerity. The only thing I know about them is that they hired Eric Lippert.

Miguel De Icaza

Xamarian founder; founder of Mono.

Jeff Atwood

The man behind the Coding Horror blog. Founder of Stack Overflow, Discourse, and one of the principal proponents behind Standard Common Markdown.

Stack Overflow

Probably the best place on the internet to find answers to programming problems. type site:stackoverflow.com before your programming question to make sure you’re only getting answers from Stack Overflow.

Of course, there are others; but these are the sites I check daily.

A Day of Twitter

It’s 6am.

My alarm is blaring. I turn it off, open twitter, and pull down the top of the screen to refresh.  A new blog post about Go comes across my twitter feed, along with the newest tech controversy. There’s not enough there to figure out what’s going on. I scroll on. A few more twitter posts down, there’s a screed on how the world’s going to pot because of the Republicans. The next one says the same thing about the Democrats.  Both have replies that start with “Thanks, Obama.”  One of them is Ironic. I’m not sure which one.

After breakfast, I pull my phone out again, and this time I see an update to the #Ferguson shooting on my twitter feed. @AntonioFrench is relaying the latest.  Being 1,000 miles away, I can do little but Retweet.

I check my follower count.  Lost two in the past day. Was it something I said?  It’s probably the confusing nature of my political tweets: Conservative leaning one second, liberal the next.  All libertarian, of course.  No one wants to follow a libertarian. We’re nutjobs.

I head to work.  On the metro I read the latest tweets I’ve favorited over the last few days. There’s a new blog post about SQL Server restore strategies, and something about another security breach, this time affecting Home Depot.  #GamerGate is still going strong; although with the subtweets, I don’t understand what’s going on.  Someone is mad about something someone else did, but no one links to it, so I have nothing to read more about. I take their anger at face value. Anything I say will be misconstrued, so I say nothing.

At work, I settle in, today I’m working on automating restores with 500 databases across 4 servers.  There’s a new post from SQLServerCentral, and working on the script it provides, I find out it doesn’t do what I need it to do. I look to see if the author is on twitter. They’re not.

Frustrated, I look for their blog and leave a comment detailing the problems I’m seeing.  I don’t know enough to know if I’m wrong or if the script actually has a bug.  The author isn’t on twitter so I can’t send them  a quick note.  Instead, I reply to their blog post. I get a reply a day or two later. Definitely not twitter speed.

After lunch, my @ParallelsMac installation decides to crap on me for the second time this week.  I tweet with pictures, and their support people get back to me and ask me to submit a bug. I do, and then they ask me to try to reproduce it. As a programmer, I know that’s a not so subtle brush-off. No one wants to work on a bug that only exhibits itself sometimes, on some configurations, and only when the moon is full. No one.  The twitter rant makes me feel better though.

Write code. Compile. Wait for launch. Check Twitter. See funny post. Ctrl+tab back to development site. Still JITing. Go back to twitter. See twitter post I want to RT; remember that the original tweeter still has me blocked for a snarky comment I made in 2010. Manually ReTweet. Back to code now. Realize there’s a runtime error in the String.Format() call. Back to twitter.  Open new Tab. This time to Linked In. Yet another recruiter wants to tell me about an ‘Amazing opportunity’. Doesn’t say what. Check Facebook. Facebook’s a mess. Log off of Facebook.

Back to code. It’s almost the end of the day, and I’ve spent most of my time on the internet. Scramble to get some productive work done. It’s going to be another nighttime of coding.

My wife picks me up with the kids in the car. They’re always happy to see me, giggling and laughing as they see me approach the car. I get in, kiss my wife, and ask how her day has been.  She responds with a perfunctory ‘good’, and we take off for home.  “Let it go ipone, daddy?’ My 2 year old wants to watch Frozen on the iPhone. I say no; partly because I don’t want her to use up our data plan that’s already at its limit, and partly because I really want to have my phone on me in case anything happens on the internet.

We’re almost home now, and I check my phone under the guise of making sure the servers haven’t melted down in the 20 minutes since we left the office. They haven’t, although there are some issues with the code I checked in right before I left.  I tell my wife I’ll need to work for a few minutes when we get home to correct the problem.  As I say this I switch to Twitter, and see if anyone’s replied to me today.  I feel validated when I see people Retweeting my tweets or replying to me.

At home, my daughter repeats her demand for “Let it go ipone”. We settle on the iPad, and she starts the movie. She’s pretty apple savvy, she can open the app, find the movie she wants to watch, and she can skip around to her favorite scenes. I don’t know whether to think it’s awesome or to be horrified.  My youngest daughter plays at my feet while I fix the code I messed up earlier.  While the build is running, I check Twitter again.  Four Retweets today, that’s a good day.

After dinner, we play for 30 minutes.  I show my daughter how to do a back flip in my arms. ‘AGAIN?’ she asks, for the 6th time.  My youngest daughter, almost a year, wants to do the same.  I oblige, and my wife chides me, reminding me that she’s not a toddler.

After the kids are in bed, I check Twitter again.  Sometimes I make what I think are funny jokes, only to have them fall flat. Other times they play off of the humor.  It’s hard to gauge humor on the internet.  I decide to work on some of my side projects, whether it’s the HTML5 based game, or one of the stealth ones.  Twitter again.

I look up, and it’s 10pm. In 8 hours I have to be up. Time for bed.

Walking into the bedroom, I see my wife on her phone. She’s waiting for me. She can’t sleep unless I’m in bed too. She’s on Facebook, letting me know about the latest drama in my family. There’s always drama. I set my alarm, check twitter, and confident that I’m up on everything, I plug in my phone.  I need the battery for the morning commute.

Taking a break from Distraction

I check twitter thirty or forty times a day. Numbers wise, I check twitter more than I interact with my family on a given day.  I check twitter more than I interact with coworkers.  I almost check it more than the lines of code I produce in a day. Facebook, LinkedIn? Same story.

I fear being disconnected, to not be ‘in the know’.  I told my wife once that I needed to be on twitter because “That’s just how things work in the software world. That’s where all the “Who’s who” hangout. ”

More numbers: I’ve checked social media enough over the past three years to ship at least one project, maybe more.

I’m an addict. I’m addicted to the now. To what people are saying.  I’m not addicted to the doing.

I want to be an addict to doing.

For the next ten weeks, no Facebook, no Twitter, no LinkedIn. Just my family, my Work, and my project.

Since this auto-posts to my twitter, I’ll keep that around; but I won’t be posting or reading twitter, Facebook, or checking Linked In.

I’ve deleted all the apps from my phone, shut down all notifications.

The only thing stopping me from finishing what I’ve started is me. No more excuses. No more social media.

I start now.

Your Cancellation Process is Bullshit and it hurts your Company Image

I’ve tried unsuccessfully to cancel my eldest daughter’s Gymboree membership for the past three days.  Gymboree’s process to cancel is as follows:

  • Call the Gymboree location
  • They *email* you a form to print, fill out, and return
  • fill out that form, and either: 1) Turn it into that location, or 2) fax it into the number on the form

Once you cancel, they charge you an additional month for tuition.  Their service does not bill in arrears; it bills for that coming month. So, once you cancel, you are still paying for another month of service for a product you have cancelled.

And that’s if  they acknowledge that you’ve turned in the form on time.  You see, here’s how it goes:

  1. We got the form on Friday (1 August 2014).
  2. Emily filled it out and faxed it using HelloFax on Saturday.
  3. The fax number was disconnected.
  4. Hello Fax tries again automatically on Sunday; fax number is still disconnected.
  5. Emily emails it Sunday (3 August 2014).

We get billed today, 4 August, for 4-August to 4 September.

Now, We have not yet gotten confirmation of cancellation. That’s important, because if they receive it today, they’re going to charge us an additional month, effectively turning a 30 day cancellation into a 60 day cancellation (Since we’ll be charged for September as well):

Screen Shot 2014-08-04 at 9.07.09 AM

And that’s just the latest example of a company throwing roadblocks in a customer’s way in the name of profit.  Comcast was recorded doing something similar just a week ago. In an internal Comcast memo, the COO, Dave Watson, even says the process was put into place on purpose:

The agent on this call did a lot of what we trained him and paid him — and thousands of other Retention agents — to do,” continues Watson. “He tried to save a customer, and that’s important, but the act of saving a customer must always be handled with the utmost respect.

How a company deals with people who cancel is indicative of company culture. If they make canceling their service a ‘process’, they value profit over people.  Even some of the best companies have a bullshit cancellation process.
One of the companies I formerly worked for has (in my opinion) a terrible process for cancellation. You can sign up online; you can upgrade online, but if you want to cancel, you have to call a customer service number or email a customer service email that you aren’t guaranteed to get a response to.
If you call, you’ll likely have someone ask you if you’d like to downgrade or receive a discount to stay.  This is standard practice in the industry, and even Forbes puts it out as a ‘proven technique’:

4. Offer discounts to accounts before they churn. If you analyze your cohort retention rates, you might discover a certain timeframe that has an increased level of churn. Some products won’t have this — they’ll consistently churn out the same percentage every month. But if yours does, you can consider proactively and automatically offering discounts based on their continued usage. This is undoubtedly risky and should only be considered if you have some serious churn issues (which you should hope to eventually correct with product improvements). You should also make sure they have to jump through some minimal hoops to get the discount (like filling out a more in-depth satisfaction survey). Bonus points for driving them to tweet/like the fact that you just gave them an unexpected discount.
5. Require a reason for downgrades and cancellations. If you don’t know why a customer is leaving you, it’s really hard to figure out how to increase future satisfaction. And making the downgrade reason optional means most people will just skip it. Turn mandatory responses into direct tickets that your customer team can categorize and hopefully follow up on (just like they do with your satisfaction surveys). The right follow-up can often rescue a customer. Finally, the right language goes a long way too — be sure to communicate how important this information is to you and how much you appreciate the favor.

All of these things save money, but they lose Good-will, which is in infinitely shorter supply than Money is.
Put another way, if your company’s health depends upon you making it hard for customers to cancel, that’s a sign that you have a problem with your product. It could be many things, and some of them may even be out of your control, but punishing the paying customer for your product’s inadequacies reflects your company culture.
Netflix does it right, even in a competitive market where they’re fighting for their very existence:
Screen Shot 2014-08-04 at 9.42.08 AM
Two clicks, and my membership would be cancelled. No “You must fax/email/call our customer service department to cancel.”
There should be parity in your signup / cancellation process.  If I can signup online, I should be able to cancel online. It should be as easy as signing up. If it’s not, that indicates a cultural attitude that puts profits over people, and is that really the sort of company you want to give your business to?

How I got An Army Medal for Programming in VBA

I read a story on Hacker News a few days ago about an individual who received an Army Commendation Medal for programming, and thought I’d share mine. 

During start of Operation Iraqi Freedom, lots of National Guard and Reservists were placed on Active Duty orders to deploy to Iraq.  In October of 2003, I received a set of orders to do just that, along with the rest of my National Guard brigade.  After four months of training, to include NTC and JRTC, we deployed to Iraq.  After a brief stint in country, I found myself returning to the States for medical reasons.  

When I arrived back at Fort Bragg, I was a part of what was then known as a Medical Holdover Unit, or “MedHold” for short.

There’s a hierarchy in the Active Army.  First it’s SFOD-D (“Delta”), then SF, then Rangers, then Airborne and Air Assault, then the line units, and then the Combat support units, then the support units, then the garrison units, then the TRADOC units, and then, after all that, the Medical Holdover units.  

It is quite literally the lowest of the low to the rest of the Army.  If you can’t fight, you can’t be a soldier, and if you can’t be a soldier, then you’re just getting a paycheck.  

During my first few months at the MedHold unit (at that point re-aligned to be a part of the Garrison, and rebranded as the “Medical Retention Processing Unit”), I witnessed hundreds of National Guard and Reserve soldiers coming back to be placed in Medhold status (we were segregated into different units from the Active Duty soldiers for administrative reasons).  Some were combat wounded, but for the most part, they were returned because they should have never been deployed in the first place (due to medical issues).

Very quickly, the size of the unit increased from 150 to around 450 or so.  At this point, I was recuperating from the first of two knee surgeries, and because of my computer skills, was placed in the S-1 shop (The Administrative section, responsible for inprocessing, outprocessing, and handling the administrative issues for these 450 soldiers).

One of the first things I noticed is that the entire database that held all the administrative information about these soldiers was kept in an Access Database.  Moreso, it was kept in one large table. There were no backups, no disaster recovery, nothing — just one Access database shared by 6 people. Luckily we’d be able to re-type in everything from paper records — but even so it is a scary thought.

This Access database was not only used for CRUD operations; but also for reporting to the various commands that wanted to know what was going on.  At this time there was a lot of scrutiny placed on MedHold soldiers, and that timely reporting important.

One E-6’s job on a Monday was to gather together that morning’s strength report, compare it with the previous week, and send a tally to 1st Army that included all relevant information about the size of our unit; and the number of soldiers in each status (inprocessing, under care, going through the Medical Review Board Process, Outprocessing, or discharged)

It took him an entire day to compile this information.

The S-1 shop went on like this for some time; and then one day we were assigned an Administrative NCO, someone whose MOS was actually Administrative in nature (42A, IIRC) and he was able to help us get on the right track and do things the way a “real” S-1 shop would.

But that report still took an entire day to do.  

One of his first assignments to me was to figure out what was taking so long to do that report and to find a way to make it faster.

Using VBA and Access Forms, I was able to create a form that made it dead simple for me to correlate daily strength with weekly changes and trends, and use that to output a Crystal Report  (I think it was crystal reports; it could have been Access’s own internal Reporting utility) that compiled this information.  The time to compile that report went from a whole day to about 15 minutes, all told.

And that’s the interesting part of how I received my Army Commendation medal.

How to be a Productive Programmer

A few months ago, I wrote about How to Destroy Programmer Productivity.  Since then, I’ve had people ask me how to be productive.

There’s no One Weird Trick! to being productive, and anyone who says there is is selling you something.  What makes you productive may not make me productive, and vice versa.

I rail against open floor plans, but that’s because they make an easy foil. I’ve never met a programmer who thought they were good for getting actual programming done, and I’ve never met a business person who thought they were bad for business.  If anything, when a company goes to an open floor plan, there’s almost a cultish reverence of it, complete with tours and media opportunities (never mind the documented negative effects it has on productivity).  See? There I go again.

Open Floor Plans are just like everything else on that list: They’re a vehicle for distraction. Distraction is easy; concentration is hard. As many times as not, I’m not productive because of me, because of something I’ve let distract me.

It may seem tautological, but:

Remove anything that distracts you, and you’ll be productive. If you’re lucky

 

Don’t Trust the Cloud

If someone hacked your Cloud account, could they knock you out of business?

For the company CodeSpaces, the answer was a resounding yes:

The beginning of the end was a DDoS attack initiated yesterday that was accompanied by an intrusion into Code Spaces’ Amazon EC2 control panel. Extortion demands were left for Code Spaces officials, along with a Hotmail address they were supposed to use to contact the attackers.

“Upon realization that somebody had access to our control panel, we started to investigate how access had been gained and what access that person had to the data in our systems,” Code Spaces said. “It became clear that so far no machine access had been achieved due to the intruder not having our private keys.”

 

Code Spaces said it changed its EC2 passwords, but quickly discovered the attacker had created backup logins, and once recovery attempts were noticed, the attacker began deleting artifacts from the panel.

“We finally managed to get our panel access back, but not before he had removed all EBS snapshots, S3 buckets, all AMI’s, some EBS instances and several machine instances,” Code Spaces said. “In summary, most of our data, backups, machine configurations and offsite backups were either partially or completely deleted.

ThreatPost adds:

Within 12 hours, Code Spaces went from a viable business to devastation. The company reported that all of its svn repositories—backups and snapshots—were deleted. All EBS volumes containing database files were also deleted.

When it comes to platforms, there is a constant refrain from the programmer community to “not to put your eggs in someone else’s basket“, or “What Apple Giveth, Apple taketh away“, and yet we still do it. We still think that just because someone else promises redundancy, we’ll be OK.

We won’t.  Gmail goes down. AWS goes down

Being in the ‘cloud’ doesn’t change your disaster recovery plan. Scott Hanselman refers to it as the Backup Rule of Three:

  • 3 copies of anything you care about – Two isn’t enough if it’s important.
  • 2 different formats – Example: Dropbox+DVDs or Hard Drive+Memory Stick or CD+Crash Plan, or more
  • 1 off-site backup – If the house burns down, how will you get your memories back?

As a business, who do you trust with your data? More importantly, who do you trust to make sure you don’t go out of business?

 

Mavericks crashes when using Skype and sharing a Parallels VM screen

This *may not* be Parallels fault, although due to the error message I get afterwards, I get to blame Parallels for it (I really think it’s the latest Mavericks Release, as it didn’t happen before this).

  1. Open Skype
  2. Start non-video call with another user.
  3. Share screen that is hosting a parallels VM
  4. Wait a few minutes
  5. OS crashes back to login.

On Login (nothing has started up yet), I get the following error from Parallels:

Image

That’s funny, since I check Parallels and it says “Up to date”.

I’m running Mavericks version 10.9.3.

 

Parallels – Daily Annoyance – Window doesn’t show up on Desktop unless I hit Ctrl+Up

Yesterday, I made a ‘threat’ on twitter:

Today, I’m following through. I love Parallels. I’ve purchased it twice for myself, and had it purchased for me by a business entity at least twice. It let’s me have the best of both worlds: The usability and stability of a Mac, combined with the “I can’t get away from Windows Development”-ness of Windows.

It’s not all sunshine and rainbows, however.

Parallels gives me pet peeves, but sometimes they turn into George Carlin Pet Peeves. I really have had enough of them. So every day, I’ll post that day’s Parallels bug.

This morning I brought my MBPr out of sleep mode. I had shut down Parallels the night before (it gets really cranky with multiple monitors if you don’t shut it down before connecting it to different monitors), and I boot it up.

If I hit Ctrl+Up, I can see it ‘supposedly’ on that desktop:

Screen Shot 2014-05-21 at 7.33.14 AM (3)

But when I hit Ctrl+Up again? No where to be seen:

Screen Shot 2014-05-21 at 7.33.43 AM (3)

The only way to fix it? Click “Window” and “Zoom”.