Skip to content

Kitchen Experts of California: the official complaint letter

Update: 6 September 2016
I have had a number of people ask me about Kitchen Experts since I posted this. I honestly am extraordinarily surprised that they are still around.


Q. How did your case turn out?
A. I got most of my money back.

Q. How long did it take to write this letter?
A. A whole day of writing and reading the law. Plus I went down to get a few quotes for the cabinets that KE was trying to install. I decided to be utterly complete in my documentation. I didn’t want to get into a long debate. I wanted the problem solved. I didn’t know which sins were considered the most egregious. Most importantly, I wanted to make it abundantly clear that it was perfectly reasonable to demand a refund. I did NOT want Kitchen Experts to try to “fix” the problems.

Q. What did you do with the letter?
A. I filed it via Fed Ex with Contractor State License Board.

Q. How long did it take after that to get your money back?
A. This is from my memory on the exact timeline. I Fed-Exed it Thursday. I got a call from the CSLB on Monday. I got my refund check on Thursday-ish.

Q. Why do you think it happened so fast? I don’t believe it!
A. I spent the time to do a very, very complete letter. It wasn’t just this letter. It was photos and other supporting documentation. The packet that landed at the CSLB was about 90 pages. I wanted the regulator to take one look and think “this is going to be an easy case to address”. The conversation with the CSLB person was at most 30 minutes long. She just flipped through it and said, “I will give them a call.”

Q. What is the most important thing I should do?

Q. What Next?

  1. Next, document everything!
  2. Boxes that the cabinets came in. Packing slips.
  3. Notes about what you remember and what promises were made.
  4. Look at their website: Are they still making promises about materials that they did not deliver.
  5. When did you make payments? For how much? Look in this letter for the rules about payments
  6. Refer to the California Contractors License Law & Reference Book – 2016 Edition and look for the bits that have you most concerned.

Q. Then what?
A. Set aside the time. Turn off the TV and write a timeline of what happened and when. And just keep on writing.

Q. That sounds like a lot of effort.
A. That is why this letter is online. Use it as an example starting point.

Q. The job based inspection by the city. Kitchen Experts told me that means they did a good job.
A. FALSE. The purpose of the inspection is ONLY to make sure the house is not dangerous to live in. The inspectors are not looking at anything else. Most importantly, it says nothing about Kitchen Experts following the law and delivering what is promised.

Lastly, two points:

  1. rumor has it that many other people have had the same experience with Kitchen Experts. The only way good contractors survive is if bad contractors are stopped. You have to help by following through and getting your money back.
  2. Vote Democrat. I was only successful because we have people in Sacramento who actually want to have government solve problems. Right now only the Democratic Party is making government work.

Contracting State License Board
Sacramento Intake & Mediation Center
P.O. Box 269116
Sacramento, California 95826-9116

Dear Contracting State License Board Investigator,
Our complaint is concerning our kitchen remodeling project at our home

We contracted with:
Kitchen Experts of California
License #960046
7055 Commerce Circle
Pleasanton, CA 94588

on 3 November 2012 to do the interior portion of our kitchen remodel.

This letter was prepared without any legal assistance as such we relied on common English reading of Contractor State Licensing Board legal documents. All quotes and references to the law are from the PDF file available via links on and stored at (California Contractors Law)
This letter has taken a considerable amount of time. As a result, not all the issues have been full articulated.


On November 3, 2012 we visited the Kitchen Experts Of California showroom and spoke with John Gonzalves.

We explained to John that we wished to remodel our kitchen. We wanted a durable long-term kitchen. We had lived in our present residence for nearly 16 years. We had no intention of selling the property and wanted a kitchen that would last for decades.

We contracted with construction company, A&G Construction, to do the required structural and exterior work.

The City issued 2 separate permits:

  • 20 December 2012 for A&G Construction’s work
  • 3 January 2013 for Kitchen Experts work

A&G Construction completed the work needed for Kitchen Experts to begin work in the second week of January.

Payment History

We made the following payments in good faith that Kitchen Experts would deliver a quality kitchen:

  • $1000 Deposit ( 3 November 2012)
  • $15565.20 ( 28 November 2012 ) This second payment was due upon “blueprints” – The “blueprints” consisted of little more than an output of a sales tool that generates simplistic cabinet placement.
  • $15565.20 ( requested payment 24 January 2013; payment made 28 January 2013 ) This third payment was requested by Kitchen Experts upon delivery of the cabinets. Payment was made by Cashiers check.

On 28 November 2012, Kitchen Experts had requested and was receipt of 42.6% of the total contracted amount:

  • 22 days before A & G Construction received their permit on 20 December 2012
  • 35 days before Kitchen Experts’ received their permit on 3 January 2013.

As of 6 March 2013, Kitchen Experts requested and received payment of $32,130.40 (82%) of the total project cost of $38913.00. This significant amount of money was requested and paid prior to cabinets being installed, and granite and flooring being delivered and installed.

Such early advanced payments seems in clear violation of Section 7159.5(a)5 :

Except for a downpayment, the contractor may neither request nor accept payment that exceeds the value of the work performed or material delivered.
Section 7159.5(d)9C states that :
(C) The section of the contract reserved for the progress payments shall include the following statement in at least 12-point boldface type:
“The schedule of progress payments must specifically describe each phase of work, including the type and amount of work or services scheduled to be supplied in each phase, along with the amount of each proposed progress payment. IT IS AGAINST THE LAW FOR A CONTRACTOR TO COLLECT PAYMENT FOR WORK NOT YET COMPLETED, OR FOR MATERIALS NOT YET DELIVERED. HOWEVER, A CONTRACTOR MAY REQUIRE A DOWNPAYMENT.”

This language does not appear in the contract provided by Kitchen Experts.


This list may not be complete as we have discovered numerous issues over the past 4 weeks. We are not certain that all issues have been discovered.

Misrepresentation and false advertising
Based on the Kitchen Experts site and conversations, we had expectations that include but were not limited to:

  • 3/4” construction
  • full-overlay
  • quality slides and cabinets

We understood that this would mean that the kitchen would cost more.

During the initial conversation Kitchen Experts on their web site ( ) and on their Diamond Certified page ( referred to many of the quality aspects that we had expected to see. (The relevant web pages are included in Attachments):

  • “Every one of the company’s products is custom built by its in-house craftsmen, and it also offers complimentary in-home design consultation.”
  • Metal shelf rests
  • and other representations as to quality

Demolition and Preparation

On 17 January 2013, Kitchen Experts began demolition. During the demolition process there were several issues:

  • On the wall above the stove, the existing drywall had cooking grease coating and linoleum. Kitchen Experts’ foreman, Efrain, had no plan to remove the grease and linoleum. We had to insist that Efrain remove the drywall and grease. We are not certain the grease was removed as we did not observe it being removed. That spot on the wall was covered with a fresh layer of mud.
  • After the initial demo work on 17 January 2013, Kitchen Experts left a dripping water line with one of our buckets propped underneath the line. We did not notice this until after the bucket had overflowed. We had to empty the bucket multiple times during that night.
  • During the initial demo work, water damage under the sink was discovered. Kitchen Experts once again had to be pressed to fix the damaged subfloor.
  • Efrain had no plan to remove the old flooring. According to Efrain, the new flooring would be laid over the old flooring. This would have meant an uneven transition to the dining room floor which also was to be done by the Kitchen Experts. We had to insist that the old flooring needed to be demo-ed.
  • On or about Tuesday 22 January 2013, Kitchen Experts brought a single worker out to quickly demo the old linoleum.
  • Uncovered openings in the floor: In the hallway cabinet area and the section of damaged flooring under the sink were left open or partially open. These openings allow animal access into the crawl space. These opening were repeatedly left open resulting in our cat getting trapped under the house.
  • Only after 2 personal visits from John Gonzalves, John Lupo and Tim Bergeson was the garbage mostly collected on 18 February 2013, 32 days after the demolition started, from our side yard. This in spite of Kitchen Experts being notified repeatedly both on the phone and in person. (See Attachment-Demolition Photos).
  • On 18 February 2013, the clean-up crew arrived with no tools such as wheelbarrows, brooms or shovels. They borrowed our yard waste container as an improvised wheelbarrow. In the process of cleaning up they left a trail of debris through our yard and out to the curb. See Attachment-Demolition Photos, their clean-up was considerably less than complete.

“Build to fit” commitment not met

Kitchen Experts commits to a kitchen that is built to fit and customized to the kitchen dimensions. Kitchen Experts promised and is responsible to build the kitchen to the plans on file with the City and attached to the permit. (See Attachment-Build To Fit Photos).

This responsibility has not been met:

  • On 28 November 2012, Tim Bergeron and John Gonzalves came to our house to do the blueprints. During that meeting, they were both reminded that the kitchen dimensions were being changed as was indicated on the architectural plans. They also received the second payment of $15565.20
  • A&G Construction, the contractor hired to do the structural work, was paid in part to widen the opening between the kitchen and hallway from 32” to 42”. A&G Construction completed the framing for the structural alterations that created the refrigerator alcove and the hallway cabinet openings. This work was completed and signed off prior to the Kitchen Experts starting work.
  • Kitchen Experts did not do field measurements after A&G Construction completed work.
  • Kitchen Experts cabinet installation team discovered that the widened opening was too wide for the cabinets that Kitchen Experts had ordered. On their own initiative, Kitchen Experts narrowed the opening back down to 36”
  • The refrigerator opening is 38” wide. Kitchen Experts installed a cabinet that was too narrow (36”) and too shallow ( 24” instead of 30 3/4” ). Kitchen Experts installed recessed panels to narrow the opening.
  • The hallway cabinet opening is 15 3/4”, the floor cabinet installed was 18 1/8”. The hung cabinet was similarly missized. Furthermore the delivered hung cabinet was 40” high, which completely covers the plugins in the hallway alcove. The protruding cabinets are shown on the building plans as recessed into the hallway alcove. As currently installed, people to bump their hips into the exposed corner of the hallway cabinet. Adding the granite top will cause further intrusion into the hallway.
  • Cabinet size choice shows a similar failure to build to fit.
    • On the hallway side of the kitchen there are 2 cabinets side-by-side sized 33” and 24”. This difference of 11” is quite noticeable.
    • On the outside wall, there is a 6” fill piece
    • The dishwasher opening is an inch too wide and too high – requiring additional fill pieces
      The kitchen sink cabinet is off-centered to the right by 3/4”

Electrical work

Kitchen Experts team did a poor and incomplete electrical installation. (See Attachment-Electrical Plumbing Photos)

  1. Lighting is poorly positioned with very little light near the refrigerator and excess light near the sink
  2. Unnecessary junction boxes that require holes to be cut in the cabinet bodies to access:
    • 2 junction boxes installed in the outside wall upper corner cabinet
    • 1 junction box in the cabinet over the refrigerator
  3. Power was cut to the existing outlet in the dining room to the left of the kitchen opening.
  4. An existing base-level socket next to the dining room slider was incorrectly removed.
  5. The dishwasher will require cutting an additional hole to connect.
  6. A light is not flush with the ceiling

Plumbing work

  • The new airgap connection is protruding into the kitchen unnecessarily
  • As was previously mentioned, during initial plumbing work a water line was left dripping
  • During the inspection, the inspector noted that the hot water line was missing a hammer valve.
  • There is no water line installed to the refrigerator as required by the architectural plans


  • Existing drywall was minimally impacted. Painting was scheduled to occur prior to the cabinets being installed. No painting occurred.
  • The ceiling furnace vent is not flush with the ceiling. This existing problem was not addressed in spite of being pointed out numerous times.

Cabinet Quality

During our initial visit to the Kitchen Experts showroom, John Gonzalves stated that Kitchen Experts only provide high quality products. Kitchen Experts voicemail greeting, literature and website makes statements touting the quality of the cabinets provided by Kitchen Experts. Unfortunately, we have found those statements inconsistent with the reality in our kitchen. Several friends in the construction field have seen our cabinets and are appalled at the poor quality of the cabinets.

We had paid specifically for quality cabinets. Kitchen Experts delivered DECO brand cabinets. DECO has a showroom on 450 McLaughlin. On January 28, we obtained a quote for the exact same cabinets from the DECO showroom for $7300 + $700 for installation. (See attached DECO quote) (See Attachment Cabinet Quality)

The low-cost of the DECO brand is reflected in these problems we have discovered:

  • Stain Consistency:
    • Different tones of stain (many times with in the same cabinet)
    • Incompletely applied (dry spots)
    • Drip marks
    • Bubbling that indicates a finish that was still tacky was placed agains another surface
    • Scrap marks
    • Unstained portions
    • Texture inconsistencies
    • Over-applied drips
    • Dovetails not stained
  • Cabinet box dimensions. The only dimension mentioned in our contract is 3/4” so we were expecting 3/4” cabinet box construction, instead we got 1/2”
  • Multiple drawers bind:
    • peninsula pullout drawers
    • spice racks next to stove opening
  • Loose glass in the outside wall corner cabinet door
  • Exposed nail in a drawer
  • Drawers that are mounted crooked so as to block a door from closing.
  • The facing in the hallway-side lazy susan is separated from the cabinet floor
  • All cabinets exhibit gaps around the sides and back to easily shine light through.
  • Numerous broken dovetails
  • Plastic shelf anchors when all Kitchen Expert’s advertising states metal shelf holders
  • no pleats in the cabinet interior to properly hang cabinets
  • The cabinet doors with in a pair are often times misaligned from each other.
  • Inconsistent gaps between doors in a pair
  • 3/4” overlay for doors rather than the full overlay promised both by contract and the web site.
  • Hung corner cabinets have wood shelves rendering the cabinet overhead light pointless, contract states glass shelves.

Cabinet installation

  • As noted earlier, there are 3 unnecessary electric junction boxes that are accessible via the cabinets. This results in holes that are hacked into the cabinet sides and backs.
  • Saw burn marks:
    • 2 spice racks were cut to fit next to the stove
    • the unnecessary side paneling in the refrigerator opening
  • Filler for nail holes do not match the original stain
  • Crown on the hung cabinet between slider and bay window is crooked.
  • Crown on the hung cabinet to the right of sink has a gap big enough for a screw to be inserted
  • Floor Cabinets are shimmed up too high
  • dishwasher cabinet is 36” high rather than 34” high as required.
  • granite countertop will not properly go into the bay window.
  • Kitchen Experts crew requested that A & G Construction lower the height of the bay window by 1/4”.
  • Kitchen Experts installed the base cabinets on the outside wall too high for the granite to go into the bay window.

Supervision / Project Management

  • There has been no on-site supervision.
  • Dominique Lupo, the project manager has never been to our job site.
  • Tim Bergeron, the designer, only visited our house twice. Once before A & G Construction began and once with John Lupo on 14 February 2013. Tim arrived over 50 minutes late for the meeting indicating that perhaps he did not know the location of our house.
  • There was no consistent onsite contact person
  • All the issues highlighted in this letter were issues that we as the homeowners have had to discover.

Brief Timeline since 29 January 2013

  • These construction issues have lead to us, on 29 January 2013 notifying Dominique Lupo that we were suspending work on our kitchen until the issues could be addressed. This suspension occurred prior to the template for the granite counter top being cut and prior to any flooring being delivered or installed.
  • 5 February 2013 – During John Gonzalves (the Kitchen Experts sales person) visit:
    • John Gonzalves was informed verbally of the nature of the issues listed in this letter.
    • John Gonzalves repeatedly insisted that the cabinets were of excellent quality.
    • when the numerous cabinet issues detailed in this letter were pointed out to John Gonzalves, he repeatedly insisted that those issues existed only because the cabinet installation was not complete,
    • John Gonzalves was informed about the demolition garbage pile. John Gonzalves acknowledged that the garbage should have been picked up,
  • 14 February 2013 – A signed certified letter was sent to Kitchen Experts providing written notification that the project was being suspended until the issues were resolved. (Attachment #3)
  • 14 February 2013 – John Lupo and Tim Bergeron visited for approximately 3.5 hours. Tim was approximately 1 hour late. During this meeting,
    • the list of issues in this letter was conveyed;
    • a copy of the letter sent previously that day (Attachment #3)
    • John and Tim were also informed again about the demolition garbage pile;
    • John Lupo, when confronted with the major cabinet flaws, repeatedly insisted that that those issues existed only because the cabinet installation was not complete;
    • John Lupo acknowledged that:
      • as of that morning, this was the first he had heard of the _____ project and was unaware of our project and its status. Multiple times during this meeting, John had to be told by the _____s significant details concerning the project. The ____s had to repeat many details provided to John Gonzalves 9 days earlier. These details included:
        • AFTER work was suspended, the granite installer called to schedule a time to template the granite
        • AFTER work was suspended, the flooring installer had called T_____ to confirm a time to start installation of the flooring on Friday, February 1, 2013. T____ informed the installer that the project was on hold
        • John was unaware who was the foreman on the project and who the project manager was.
      • the cabinet installation work was not in fact complete,
      • Kitchen Experts’ electrical installation passed a code inspection but was of lesser quality
      • Kitchen Experts’ plumbing installation was incomplete ( water line to refrigerator was not installed and no hammer valves installed )
      • incorrectly narrowed the opening between the hallway and the kitchen
      • missized the hallway cabinet and cabinets in the kitchen itself
      • the cabinets were DECO cabinets
    • John Lupo talked with Gary Garcia (A & G Construction) about the positioning of the kitchen bay window using P_____’s phone. During this call, John Lupo was quite rude to Gary Garcia and tried to blame Gary and his team for positioning the bay window too low. Gary Garcia was personally present when the Kitchen Experts foreman made a mark on the framing stud to indicate the correct window height. John Lupo demanded to know why Gary Garcia accepted and followed the Kitchen Experts request.
    • because there were many verbal statements made over the 3 1/2 hour conversation, John Lupo was asked to send to the _____s a written proposal to address the issues. This proposal has not been received
  • 18 February 2013 – A Kitchen Experts cleanup crew cleaned up the large debris only in the backyard. They left a trail of drywall and other garbage going to the curb. This incomplete cleanup happened 35 days after the garbage was created; 13 days after John Gonzalves was informed, 4 days after John Lupo and Tim Bergeron were informed of the continuing garbage issue. This “cleanup” was not complete – there continues to be bits of garbage left behind including a broken radio and nails.
  • 21 February 2013 Gary Garcia from A & G Construction contacted Tim to try to resolve the issue of window height and how the granite should be laid. Gary conveyed to P_____ (via text messages) that when Gary called Tim Bergeron at Kitchen Experts. Tim transferred him to Kristine who knew nothing of our project. Dominique has not return Gary’s calls in the past week.
  • 7 March 2013, we sent a notice to Kitchen Experts certified priority demanding that Kitchen Experts respond to the issue. Kitchen Experts replied requesting that we journey 40 miles to the Pleasanton showroom, on weekdays, during the day. This would require that we take a full day’s vacation and arrange evening babysitting for our children.

Next steps

At this point, we feel that our efforts to resolve this issue have reached an impasse.

To summarize:

  • we were sold cabinets that we do not want at any price
  • excessive early payments that seem to be prohibited by law
  • contract was violated in numerous ways
  • potential state law violations
  • no supervision or quality control
  • misrepresentation of cabinet quality
  • poor installation quality
  • Kitchen Expert representatives repeated insistence that the cabinets and the installation was a “quality” job
  • every issue we had to push to get recognized as an issue

Kitchen Experts of California has failed to deliver a quality job. My wife is a CPA and I am a software engineer – we are not experts in kitchen design and construction. In spite of this lack of professional construction knowledge we have been able to uncover numerous severe problems with Kitchen Experts Of California’s work.

At no time did any Kitchen Experts employee notice any of these problems. John Gonzalves on his visit kept on asserting that it was a great job and a quality installation.

We are not prepared nor able to monitor and supervise Kitchen Experts to ensure that the next time they will do a quality job and deliver the quality merchandise.

At this point we would like Kitchen Experts to return our money paid so far minus a reasonable allowance for the demolition. We do not feel that they should be compensated for any electrical work. Because of the random wires and disconnected outlets, the electrical is in an unsafe condition.

The plumbing work also does not deserve compensation as it is incomplete and questionable.

In light of the circumstances, we request Kitchen Experts Of California:

  1. refund $30,000 (please note that neither the granite nor flooring was cut or installed)
  2. pay for the cost of repairing the electrical work and the cost of completing the plumbing work,
  3. remove the DECO cabinets (or pay for the removal)
  4. provide a written release of all liens
  5. provide a release so that the building permit can be reassigned to another contractor.
  6. released unconditionally from all aspects of the contract between Kitchen Experts Of California and the _____

Posted in rants.

Even for the web the pain of installed software exists

Years ago I worked on code that was shipped to customers for them to install on their computers. THe amount of testing needed across all sorts of configurations was painfully and annoying. Then the web came along and life was (mostly good).

Of course the asterisks on the “mostly” good was caused by Internet Explorer’s determination to be different than every other browser (and often different even with itself running on different OSes).

But then Microsoft actually started caring about web standards, jquery helped mask the browser differences and life was now good.

Except now… We are shipping our Social Marketing Plugin, which has to content with:

  • Different versions of PHP
  • Different web servers (apache, nginx)
  • Other plugins messing with things
  • Different versions of WordPress
  • Different configurations with regards to what is writeable
  • Different ability to do things like send email

Argh… even on the web there is the pain of installed software.

Posted in amplafi, rants, software design, technical.

Google is not doing Mountain View any good.

Mountain View must realize Google’s prestige is not paying the bills. Google does not generate the tax revenue Mountain View needs to pay for basic city services.

For cities, sales tax revenue is the main commercial real estate benefit, both from corporate sales and employee purchases made during the day.

Google’s billions in corporate service sales are not subject to sales tax, so Google billions in corporate sales do nothing for Mountain View.

Costco, San Antonio Center, Shoreline Amphitheatre and the other Mountain View businesses generate more sales tax revenue.

Before 2003, SGI occupied the North Bayshore buildings. SGI’s computer sales generated millions in revenue. Mountain View invested that revenue in $20 million for the light rail extension, a renovated downtown, Stevens Creek Trail and other community amenities. SGI employees patronized local businesses, generating more sales tax revenue and increasing employment opportunities for non-technical residents.

In 2003, Google moved in. Google’s free food, onsite-everything (oil changes to chiropractic care), and bussed-in employees is an excellent way to keep employees and their money sealed in the Googleplex bubble.

Since 2003, Google has IPOed and made billions. Google is now on a real-estate buying spree expanding the Googleplex bubble. Other North Bayshore businesses’ leases have been terminated and moved out.

Google’s success is more than Mountain View can afford. City staff has downsized and cut city services. This year, City Hall janitors had their salary cut. Mountain View’s Capital Improvement Plan has over $19 million in unfunded projects. Mountain View can only afford to replace 2 1960-era traffic signals/year. Good projects aren’t even considered because there is no money.

This year, Google has graciously donated money for 3 flashing signals on Shoreline and a study to figure out how even more Google employees can get to the Googleplex bubble. Perhaps Google will even find a few more pennies to pay Google security guards a living wage.

Google is looking at a Palo Alto campus – this is a good idea. Sunnyvale and San Jose also have available property. Mountain View can no longer afford the lost sales tax revenue. We need businesses that generate direct economic benefit – not unbankable “prestige”.

Google may try to “Do no evil”, but Google is not doing Mountain View any good.

Posted in political.

SocialMarketing WordPress plugin version released

A really great feeling:

Our second update to the plugin. This time the server is forcing the plugin to upgrade.

  • Fixed configuration issues with languages that require UTF-8 ( Thai ). (Categories were not properly registering on the server)
  • When server cannot be contacted because it is being updated, the plugin will now look for the status message.
  • Warn sites that are multi-homed wordpress that the plugin does not support those sites now. (we have not tested it)
  • only register users that have an email address ( users without an email address can not publish content social media sites)

A bit of a scary moment because I have multiple accounts at multiple ISPs and each had their own private DNS entry for

Posted in technical.

Quick and dirty upgrading a SaaS (Software-as-a-Service) when then there is bad data

One of the under-appreciated, but very important, parts of running a SaaS (Software-as-a-Service) business is the upgrade path. This is particularly hard when you are trying to be a lean startup.

The pure SAAS (Software-as-a-Service) model means “no installed” software on the client machine. In the ideal case, a new server is pushed to production instantly and the users never notice any downtime. They just suddenly have a better experience.

The reality is not that easy. This is particularly true if the new release includes bug fixes to bad data or misplaced data problems. Now you have to make sure that the bug fix doesn’t cause new bugs.

For example, lets say that there was a bug when storing user email addresses. The bug was that email addresses where not stripped of whitespace before and after the email address. As a result, the database had email entries:


ID EMAIL_ADDRESS (the problem)
1 ‘’ space at beginning
2 ‘ ‘ space at end
3 ‘’

The EMAIL_ADDRESS column is also UNIQUE.

Furthermore, USER_EMAIL table ID maybe a foreign key in other tables, fixing the existing data maybe more trouble than it is worth.

For this post, lets just assume that there is no foreign key problem. The next problem is that updating the existing rows will result in violating the UNIQUE constraint.

Lastly, there is this nagging (or there should be) question in the back of your head: “Is my fix as complete as I think it is?” Some where was there a query that will be looking for the email address with the space at the end? An audit table perhaps? Some sales report that will now no longer run correctly “ “?

Important NOTE: give yourself an escape path:

  1. Backup the database
  2. Test your fixes on a backup

It is for these doubts of invincibility, my approach is to add an new column that is not UNIQUE but just indexed.

new USER_EMAIL table:

1 ‘’
2 ‘ ‘
3 ‘’

I then modify the queries that search for email address to look at the NORMALIZED_EMAIL column.
For new entries, both columns are written with the same whitespace stripped values.

Usually the biggest problem are queries that are expecting a single row being returned now returning multiple rows ( after all EMAIL_ADDRESS was supposed to be unique )

After running local tests, then push to production. Let everything run for a while. Confirm that the code works as expected.

The next step is to rename the EMAIL_ADDRESS column to WHITE_SPACED_EMAIL_ADDRESS and see if there any queries that break. Fix the broken queries and repeat.

At this point, revisit and determine if the duplicate (if considering just the NORMALIZED_EMAIL column ) can be consolidated.

These steps are not the most complete and they are not the most bulletproof. But for a smaller startups, they are “good enough”.

Posted in technical.

Does the javascript community have a repository

Apple, Microsoft, Google, Adobe, et. al. install software have automatic code to handle pushing out security fixes.

On the development side, Java has maven or ivy to retrieve dependent jars from various public repositories.

Ruby has even better dependency retrieval tools: gem and bundle.

Does the Javascript community have any equivalent tool? I have found a number of tools to manage dynamically loading dependencies into the browser. I am NOT looking for those tools.

Specifically, I am looking for a tool that a new developer uses to retrieve the javascript files they need. The developer runs this tool and:

  1. It looks at the project dependency description file
  2. Discovers that the project needs jquery-ui-1.10.2, tiny_mce-3.5.8 and prettyLoader-1.0.1
  3. Retrieves jquery-ui-1.10.2.min.js, prettyLoader-1.0.1.js, tiny_mce-3.5.8 from the web
  4. Installs the .js and the .css into a local repository
  5. Realizes that jquery-ui relies on jquery-1.9.1 and downloads/installs jquery
  6. Determines that the tiny_mce needs the jquery plugin, and downloads and installs it.

After all this, the developer has a local copy of all the js/css files needed.

If a new tiny_mce or jquery comes out, the project file is updated and the developers just return the tool and they get all the new files.

If no version of a js library is specified then the latest release version is retrieved.

Please NOTE I am talking about a tool the website developer runs when they are updating the website code; the tool does not run in the browser. This is not dynamic loading of javascript.

Posted in technical.

Always check twice

You should always double check your timing testing methodology.

Robbie Ferguson got very excited about:

So I thought, let’s run the world’s simplest test: how fast does wget receive the jQuery library on Linux? It may not be a realistic benchmark in all cases, but it gives us a bit of a look at how quickly each service delivers the js.

uh oh …. “simple” tests aren’t so simple sometimes.


Connecting to||:80... connected
92,629      --.-K/s   in 0.05s   
2013-03-22 14:04:54 (1.73 MB/s) - ‘jquery.min.js’ saved [92629]


Connecting to||:80... connected.
92,629      56.3KB/s   in 1.6s   
2013-03-22 14:05:10 (56.3 KB/s) - ‘jquery.min.js.1’ saved [92629]

But then on the second (and third and …) request:


Connecting to||:80... connected.
HTTP request sent, awaiting response... 200 OK
92,629      --.-K/s   in 0.1s    
2013-03-22 14:08:07 (893 KB/s) - ‘jquery.min.js.6’ saved [92629]


Connecting to||:80... connected.
92,629      --.-K/s   in 0.1s    
2013-03-22 14:08:01 (643 KB/s) - ‘jquery.min.js.5’ saved [92629]

Notice that Google and Cloudflare both download at about the same rate (and very fast).

Notice the difference? In both cases, the second time out the DNS resolved to a different and closer server:

Cloudflare traceroute to server:

 3 (  17.153 ms  9.443 ms  12.030 ms
 4 (  15.320 ms (  20.916 ms (  17.887 ms
 5 (  18.458 ms  22.712 ms  23.970 ms
 6 (  20.503 ms  19.316 ms  19.999 ms
 7 (  39.213 ms  25.379 ms  20.759 ms
 8 (  17.737 ms (  31.771 ms (  20.209 ms
 9 (  15.915 ms  17.249 ms  16.325 ms

Cloudflare occasionally sent me to a different server but the speed was consistently 0.1s

Google traceroute to first server:

 3 (  9.586 ms  11.568 ms  11.461 ms
 4 (  12.663 ms (  19.735 ms (  47.036 ms
 5 (  19.118 ms  21.943 ms  35.681 ms
 6 (  13.524 ms  13.981 ms  34.744 ms
 7 (  14.712 ms  16.271 ms  14.320 ms
 8 (  14.418 ms  13.487 ms (  21.560 ms
 9 (  17.685 ms (  44.087 ms  20.266 ms
10 (  48.702 ms (  31.927 ms (  31.606 ms
11 (  65.608 ms (  39.036 ms (  43.722 ms
12 (  33.895 ms  39.076 ms (  36.646 ms
13  * * *
14 (  66.471 ms  35.639 ms  76.047 ms

Google traceroute to second server:

 3 (  11.852 ms  10.684 ms  11.592 ms
 4 (  16.404 ms (  23.193 ms (  20.005 ms
 5 (  40.921 ms  20.899 ms  23.967 ms
 6 (  20.604 ms  18.826 ms  17.855 ms
 7 (  20.478 ms  18.200 ms  21.693 ms
 8 (  15.495 ms (  16.727 ms (  34.721 ms
 9 (  16.346 ms  16.799 ms  35.777 ms

I then tried with a different file and for both google and cloudflare I got 0.1s

So what does this mean? The initial delta was related to which server replied to the DNS lookup. For whatever reason google responded to the first DNS request for with a server that was far away. Later requests got better.
Cloudflare was consist about providing a better server on the first try.

Posted in technical.

Do Something: Tom’s legacy (my remarks at my best friend’s memorial service)

On Christmas 2012, my best friend from high school committed suicide. He sent a final goodbye email to many people. In that email, he didn’t blame anyone. He was incredibly considerate for other people’s feelings even in death. I didn’t hear Tom say anything bad about anyone else ever, even when they were very nasty to him. But that was just Tom.

The email was timed so that it was received after he had already died, so that no one could stop him, so that no one could help him.

These are my comments at Tom’s memorial service:

I met Tom 4 times in my life. 33 years ago. 28 years ago. 24 years ago. 3 years ago.

33 years ago I had just transfered to Tom’s high school. I was in 10th grade and Tom in 8th. Just a few months ago I had discovered that the computers in science fiction books were real.

I was shy, Tom wasn’t as much. Through the magic of study hall we played with the Trash-80s together, played startrek. Tom showed us the perfect way to say NO-O-O-O. Mr. P. was our bechalked benevolent god. We came in 2nd at a programming content. I became a janitor because it gave me the power of keys and late night access to the computer lab. I wasn’t the best janitor.

I remember him as my best friend for those 3 wonderful years in high school. But he was also very private about his home life. He would come over to our house – but for some reason or another I could never go to his. I never saw his family – there was some secret there. But being in high school, it was enough that we were friends.

I graduated and left for college. I am not very good at keeping in touch and neither was Tom.

28 years ago. We got back together. I remember Chicago and LA Origins. Late night games of Pit.

24 years ago, Tom invited me to LA after I had gotten laid off. I packed my bags and headed west. Tom’s offer pulled me to where I would thrive.

He then disappeared trying to help Kristina. He stopped answering the phone or the door. For 2 decades my best friend cut me off and disappeared trying to save another. And died. And I mourned. I moved on.

He then reappeared 3 years ago. He was both the same and different. He was desparate and trying to not be desparate. He need help getting his mother’s things moved.

He needed money. After 20 years of no contact I was both happy and wary. People change after 20 years. Tom’s personality and heart hadn’t. I helped him and his mother’s things got moved.

He was still trying to save everyone else in his life. In the emergency instructions on an airplane, you are told to make sure you fasten your air mask on first before trying to help others. Tom didn’t do that – he sacrificed a brilliant career and potential to try to save others. And he didn’t. And he didn’t save himself.

3 months ago, he asked for help again. This time I didn’t. I took a principled stand that I wish I hadn’t – and for that I am eternally sorry. There were very specific – very doable things that I could have done; things that wouldn’t have cost much. And I didn’t.

Tom is dead. But others are living. Tom’s death is the 4th suicide in my life. I promise you this, everyone us is young enough that we will know another person who is considering suicide or will commit suicide. Everyone of us needs to do something to help. Not to offer advice – to do. To give of our time, to help with something – get a piece of paper over to the DMV so that they don’t lose their driver’s license, help with babysitting, help with time. Help take the weight of the world off their shoulders so they can breathe. Do not ask why they can’t do something “so simple” – they can’t. Depression is overwhelming engulfing. The world suffocating with burdens and demands. Help lighten the load. Do something. No advice – just do. Not money – but time and energy. Share the burden. 3 months ago when Tom emailed me for help – I was too busy.

December 14th – 11 days before Tom committed suicide on Christmas, he emailed me and it was a very positive email. Things were looking up, things were going great. When people are dying, often times there is an apparent great improvement just before death. People come out of coma, they are responsive and coherent in the hours before death. That final note was the artificial improvement before Tom died from depression.

All of us know someone else still alive who will die from depression – do what you can to help stop it before it becomes terminal. Otherwise I promise you this, you will be attending another memorial service

Posted in social commentary.

Code Review #9 : The importance of doing the small things right

door-to-nowhere-winchesterDo the small things right. Make sure your craftmanship shows pride.

The code “working” is not enough. The craftmanship. The attention to detail is equally important.

Part of the way that Steve Jobs made Apple great is his insistance on craftmanship

Craft, Above All
Under Jobs, Apple became famous for a level of craft that seemed almost gratuitous: For example, on the “Sunflower” Macintosh of a few years ago, there was an exquisitely fine, laser-etched Apple logo. As an owner, you might see that logo only once a year, when moving the computer. But it mattered, because that single time made an impression. In the same way, Jobs spent a lot of time making the circuit boards of the first Macintosh beautiful — he wanted their architecture to be clean and orderly. Who cared about that? But again, that level of detail would have made a deep impression on the few people that would have seen the inner guts.

So in a way, it’s not a surprise that this level of craft was one of the first design lessons that Jobs ever got, and he learned at the hands of his father. Quoting Walter Isaacson, from his biography of Steve Jobs:

Fifty years later the fence still surrounds the back and side yards of the house in Mountain View. As Jobs showed it off to me, he caressed the stockade panels and recalled a lesson that his father implanted deeply in him. It was important, his father said, to craft the backs of cabinets and fences properly, even though they were hidden. … In an interview a few years later, after the Macintosh came out, Jobs again reiterated that lesson from his father: “When you’re a carpenter making a beautiful chest of drawers, you’re not going to use a piece of plywood on the back, even though it faces the wall and nobody will ever see it. You’ll know it’s there, so you’re going to use a beautiful piece of wood in the back. For you to sleep well at night, the aesthetic, the quality, has to be carried all the way through.”

For that reason, I insist that developers spend the time to complete the craftmanship of their code. Their code must blend seamlessly with the rest of the code. There must be no oddity, no idiocracy.

Coding standards/styling is to be followed rigorously so that the true beauty of the code’s functionality can be appreciated. But like doors, the code must fit with the overall design of the project.

Posted in code review.

Luddites are right

Timothy Geigner (giggling fool) gets a good titter in at Techdirt

I love luddites.

Those examples aside, I have to admit this is a new one for me. Apparently there once were radios that you had to wind up to use and Trevor Baylis, the guy that invented them, says Google is making younger generations brain dead.

“Children have got to be taught hands-on, and not to become mobile phone or computer dependent. They are dependent on Google searches. A lot of kids will become fairly brain-dead if they become so dependent on the internet, because they will not be able to do things in the old-fashioned way.”

Let’s see if I can break down the pure wrongness of this kind of thinking with a couple of fun little analogies.

  1. Children have to be taught how to tend to their horses and not become dependent on automobiles or public transportation, otherwise they may not be able to ride horses any longer.
  2. Children have to be taught how to use an abacus and not become dependent on calculators, otherwise they not be able to use abacuses in their adult daily lives.
  3. Children have to be taught how to unhook a chastity belt, otherwise they may not be able to have sex once they are married and somehow chasisty belts come back into circulation because….yeah, because.

If a student always relies on a google search to solve a problem – they never deeply understand the answer. As a result, they never understand if the answer supplied is correct for their QUESTION.

They never learn to think analytically.

I hire many developers. My first interview question is to ask how the operating system handles multi-threaded applications. The best developers know the basics of an operating system. The mediocre developers – the ones that produce race conditions, code with security vulnerabilities, bloated data structures and crappy db access are all people like Timothy (the author) that laugh at “luddites” like Trevor.

Posted in management, social commentary.