Skip to content

XML is not bad, just misused

There is the usual grumbling on Hacker News about XML

The problem isn’t with XML the problem is with the way it is used (or rather misused).

What are XMLs strengths:

  1. Valid files are definable. i.e. this element has a child elements or this element must contain only digits.
  2. Textual: errors are fixable with text editing tools.
  3. Textual: means compressible with gzip.
  4. all that “cruft”, “verboseness” makes XML files self-documenting. An XML element that looks like this:


    is clearly containing a first name. A developer reading the XML can figure out the meaning of the data in order to extract the information.

    Binary formats are definitely NOT! self-documenting. Once the binary data layout description document is lost, the data is lost even if the file is still present. For binary formats, the “definition document” is often the code that created the file. Lose the program or the hardware that can run the program and the data is lost.

    JSON is NOT self-documenting either. Did XML need to be heavy with the open/close tag syntax – probably not but gzip exists for a reason.

  5. when a standards body needs to define industry-standard interchange formats: For example, filing information with the Security Exchange Commission.
  6. data persistence across years in a way that will survive the programs that created it. (SEC filings, Government filings, Drug testing data, etc.) Or even a standard way to describe the Bible.

Losing data for many applications is not that big a deal. Does it really matter if Google can’t read old search history logs from 5 years ago. Probably not. However, it does matter if the SEC can’t pull up security files from 5 years ago, because that filing might be relevant to a criminal probe of a bank (hah-hah).

Ask NASA how much they wish they could have recovered lost satellite data from the 1970s. Especially when trying to figure out the rate of climate change. Bitrot and technology obsolence is a problem that has been talked about for many years.

XML is really appropriate for the data persistent situation – where there is high value to the data being accessible years later.

XML is NOT a good choice for:

  1. API calls. No company should use XML-RPC. Tighter formats exists. XML is hard to parse on small devices. Just use HTTP semantics.
  2. Files whose loss is inconsequential.
  3. Data Serialization
  4. Transferring data between systems under the control of a single entity.
  5. Any situation that requires speedy parsing or generation of data.

There is a reason why XHTML didn’t last. XML and its constraints are not suitable for the transient world of web pages.

Like any other tool, XML’s purpose and limitations should be known and respected.

Don’t complain about XML being a poor solution for a problem it was not intended to solve.

Posted in rants, technical.

California is awesome for business ( The myth of the importance of low taxes)

Really how important is business taxes? I talk about the myth of low tax utopia in this post.

The myth of the importance of low taxes

I decided to write this because of yet another debate on Hacker News about how California is somehow “losing” companies because of taxes:

You are thinking locally. Nobody cares where Tesla or Toyota build their cars. Having your business located “in the largest economy” isn’t a factor for a huge number of businesses.
Another way to put it is: You can build a massively successful business anywhere in the country. There is no particular magic in California in this regard. What is different here is that it cost more to simply exist in this state. And there’s far more to it than wages at play.

No one cares *where* their Tesla or Mazda is built. But they do care if it is built well.

Tesla does care if they can get qualified machinists to maintain the equipment that manufactures the Tesla. Sure Tesla can move to a random low tax location – and then spend years training the inexperienced low-quality workers available at the location.

It is possible, maybe. For low skill occupations, sure this is possible.

But the costs of running a business are much more than taxes and regulations:

  1. supply chain and logistics cost ( if suppliers are now further away there is now greater shipping and logistics management cost )
  2. infrastructure costs : does the selected location have an adequate power supply and transportation access
  3. Support services: everything from cleaners to the people who maintain the physical plant
  4. Access to airports so executives, customers, and suppliers can get to the plant
  5. relocation costs: moving existing infrastructure is not cheap.
  6. customer issues: if the company in question is in the middle of a supply chain: is the company now moving away from their primary customers facilities (which can make sales process more expensive and give less visibility to the customer needs)
  7. Will your key people agree to relocate?
  8. Is your key talent pool for new hires geographically fixed: There is a reason why Silicon Valley is successful place to be for software companies. There is a reason why New York/London is the place for finance. There is a reason why actors and actresses are in LA/New York/Bollywood : that is where the key talent is located.
  9. availability of labor: movies aren’t just about the actors and actresses. Film crews, set designers, lighting technicians, sound technicians, continuity experts, etc.: This is true for many, many industries. Detroit (area) is still the home of U.S. automakers for a reason.

So yes a business can make a decision based on taxes: Hollywood shoots movies in Vancouver, BC for a reason: but the main decisions and key talent are in LA and will always be in LA. Sure Mercedes-Benz could put a plant in Alabama and compel suppliers to move some facilities to be close to them. But could a MB supplier make the move on their own? No. That MB supplier can’t decide to move to North Dakota. Mercedes insists that part of the contractual agreement for their business is physical proximity.

When it comes to high value workers, California is the best:

  1. Non-compete agreements are unenforceable – I don’t have to worry that a job candidate will be blocked from joining my startup.
  2. Obamacare means that I can hire people from big companies without them having to worry about affordable healthcare.
  3. State government is pretty reasonable about things like Unemployment Insurance, etc. So I spend less time hassling with things.
  4. Lawyers and VCs have a reasonable attitude about certain things that make it easier to get shit done: less time dicking with screwy contracts: part of this is that California law makes some things illegal.
  5. educated population
  6. proximity to existing similar employers – new employees don’t have to relocate

Posted in marketing, political, rants.

Low business tax utopia myth

Really how important is business taxes?

Here is the TL;DR:

Businesses want the benefit of low taxes (lower immediate expenses) with the benefit of high taxes locations (government provide services that the business would otherwise have to pay).

But low tax utopia fails if no one pays high taxes needed to provide the services.

Basic business realities:

  1. Business depends on customers.
  2. Unemployment results in less customers
  3. Net costs must be lower than net revenue
  4. Customers must perceive a value to purchasing goods/service from the business at the price charged by the business
  5. It doesn’t matter how low cost the workers or the taxes are if there is no customers. A business without customers is out of business.
  6. If a business can get the benefit of a high-tax/high spending state without paying the taxes themselves, this is the best for that business.

Low tax utopia myth

That last point is critical. This is why companies try to get sweetheart tax deals to relocate to a state, city, or region. The business gets a lower tax rate than their competitors just down the street. The business gets the benefits of a quality infrastructure and a quality workforce at a discount.

Where the low tax utopia falls apart is when everyone gets their taxes lowered OR where the taxes are applied regressively so as to directly affect the ability of customers to buy goods.

An experiment has been conducted that proves this point. In 2012, California raised its taxes; Kansas slashed its income taxes and other taxes.

In 2014, California is paying down its debt and is able to fund services at a higher level, unemployment is falling. Obamacare has rolled out, health insurance premiums are dropping. California is planning for the future with a new water project, High Speed Rail, and education funding. California pays more in federal tax dollars than it receives. Governor Brown is cruising to an easy reelection, and as far as I can tell the Democrats are cruising on all statewide offices. I have not seen 1 TV ad nor received any mailer about any statewide office.

In 2014, Kansas’s state revenue is falling, schools are closing, economy is going down, unemployment is rising. Kansan debt is being downgraded by the rating agencies. Kansas is in survival mode. Gov. Sam Brownback is in serious trouble. Republicans are endorsing the Democratic challenger.

To summarize, in Kansas, low taxes resulted:

  1. in less employment
  2. lower services
  3. local businesses losing customers
  4. lower quality of life
  5. lower ability to invest in transportation infrastructure

This article from Forbes does a nice job of highlighting results of the Kansan experiment:

The tax cuts in Kansas have been breathtaking. In 2012, at Brownback’s urging, the legislature cut individual tax rates by 25 percent and repealed the tax on sole proprietorships and other “pass-through” businesses. It also increased the standard deduction (though it eliminated some individual credits as well).

In 2013, the legislature cut taxes again. It passed a measure to gradually lower rates even more over five years. By 2018, the top rate, which was 6.45 percent in 2012, will fall to 3.9 percent. It also partially restored some of the credits it eliminated in 2012. This time, it did raise some offsetting revenue for the first few years but far less than the statutory tax cuts. The Center on Budget & Policy Priorities wrote up a nice summary of all the tax changes.

So what happened after all those tax cuts? Revenues collapsed.

From June, 2013 to June, 2014, all Kansas tax revenue plunged by 11 percent. Individual income taxes fell from $2.9 billion to $2.2 billion and all income tax collections plummeted from $3.3 billion to $2.6 billion, a drop of more than 20 percent.

Besides, while Kansas individual income tax revenues bumped up a bit in 2013 over 2012 (as the fiscal cliff theory would suggest), the increase was only about $23 million. From 2013 to 2014, income tax revenue dropped by far more–by $713 million.

And that brings us to the bottom line. Since the first round of tax cuts, job growth in Kansas has lagged the U.S. economy. So have personal incomes. While more small businesses were formed, many of them were merely individuals taking advantage of the newly tax-free status of those firms by redefining themselves as businesses.

The business boom predicted by tax cut advocates has not happened, and it certainly has not come remotely close to offsetting the static revenue loss from the legislated tax cuts.

As Forbes says:

Kansas Governor Sam Brownback and his state legislature have embarked on a wonderful natural experiment. Once again we are testing the question: Can tax cuts pay for themselves? The answer– yet again– is a resounding no.

Posted in political.

Yerka – a great innovation on making a bicycle unstealable!

What a great idea! For a thief to really profit from stealing this bike they have to do extra work. Plus they have to be willing to do this extra work while stealing the bike. They can’t just cut a chain and go.

The students built the first working prototype bike, code-named the Yerka Project. The bike’s down tube at the bottom of the frame splits apart and wraps around an object such as a post or tree, and the bike’s seat post is then slotted through both ends of the down tube to complete the lock. Once you’ve got everything in place, you simply take out the lock pin on the end of the down tube to seal the lock. The whole process takes less than 20 seconds, letting you be on your way in almost no time.

Clearly the any lock could be broken at some point but if the lock is in the seat post, it is very protected. If the Yerka bike makes the post not anchored to the frame portion then the post just spins if someone tries to break the lock with leverage.

Posted in great ideas, random silliness.

Do not let client code pick ids

I am having a discussion over on Meteor Hacks about how bad it is to let the client code pick ids.

The meteorhacks post shows how to make new items show up in a sample Meteor program before the server has completed its processing. The meteor folks call it latency compensation.

The problem is that latency compensation (in its current form) relies on the client code choosing the permanent id.{
  "click button": function() {
    var title = $('#title').val();
    var content = $('#content').val();

    var post = {
      title: title,
      content: content,
      _id: Meteor.uuid()
    };'addPost', post, function(err) {
      if(err) {

    Router.go('/post/' + post._id);

Key points for non-Meteor developers to be aware of:

  1. Meteor is a node.js framework. Server code is in javascript
  2. good Meteor code is written so as to be used both on the client and the server.
  3. Meteor has a ‘minimongodb’ that acts as a partial cache of the items in the server database.

Now if we rely on the client to select the database ids used by the server, there are a number of interesting attacks.

The original example was inserting new Posts. If we wanted to make a more exciting example, a permission table (i.e. Users or Roles could be the attack target).

Example #1: Insert race condition so the attacker can own the inserted post:

The attacker deliberately chooses an id known to exist. If the server code in question uses Posts.upsert() rather than Posts.insert() the attacker can modify an existing post and take control of the post.

Remember that in good Meteor code, the server and the client will share a lot of code, thus it is likely that an attacker could spot upsert() usages. But that isn’t really necessary.

The “counter” is “but, but the original insert will then fail”. However, lets use some real examples.

In the real world, the good client is trying to send the new post to the server over a flaky internet or to a busy server.

  1. The good client tries to send the new post but gets no response from the server.
  2. The good client tries again which succeeds on the server-side. However, the server response was lost.
  3. The good client tries a third time, the server reports the post exists.
  4. Finally, client then tells the server to please add that post to its ‘hot list of posts’ that is always displayed.

Flaky internet / busy servers are a fact of life.

Now make a slight alteration. On step #2 instead of the good client sending the second attempt it is really the attacker.

  1. The good client tries to send the new post but gets no response from the server.
  2. The good client tries againThe attacker sends a post insert which succeeds on the server-side.
  3. The good client tries a second time, the server reports the (attacker’s) post exists.
  4. Finally, client then tells the server to please add the attacker’s post to its ‘hot list of posts’ that is always displayed.

But how could the attacker know the the id that the client used? ( see below for that answer)

Example #2: (modifying an existing record).

However, if instead of Posts.insert() the post creation code is using upsert then the malicious client can happily modify whatever it wants into the database. Because the post upsert code is shared between client and server. The malicious hacker can just scan the code looking for places where upsert is used.

“But, but why would anyone use upsert on Posts creation?” Why was upsert created? Because it is useful for cases where the developer does not want to do a query + insert combination. Client id generation + upsert() = attacker fun.

This can be most fun in situations where an attacker can grant some privileges to the victim. So the victim’s call look successful, but the attacker can still control the database Post entry.

Example #3: ( Flooding the Db – and why the attacker does not need to know the actual id generated)

This is a brute force attack – but lets say that there was a weakness in the way the client chose the id. A predictable pattern. Remember uuid() is concerned with uniqueness NOT unpredictability.

If an attacker can predict what the set of possible uuids will be, the attacker can flood the server with bogus posts having likely ids as predicted by analyzing the uuid() algorithm. Note that an attacker can confirm their ability to predict the id by generating their own posts.

If the attacker targets a table that is likely to have a large number of new entries, the change for the attacker to have a successful collision increases.

Fundamentally, the client should never be trusted with the ability to select anything that effects how things work.

Posted in technical.

In praise of Javascript’s undefined

One of the unique[*] features of javascript is two different ways to represent ‘no value’: null and undefined.

[*] = unique as many popular languages do not have both null and undefined.

In my years and years of programming Java, I always missed not having a way to represent the ‘not value YET’ condition.

null always end up being needed to represent the ‘no value’ condition which made it difficult to handle the ‘no value YET’ condition.

‘no value’ is a definitive terminal condition: there is no value available. Period.

‘no value YET’ means the information is still being retrieved/calculate, a non-terminal condition. The requestor should ask again at some future date.

The ‘no value YET’ condition occurs frequently in internet coding. For example, server A initiates a request to another server, server B, for some information (V). V could take seconds to arrive or may never arrive.

The code on server A wishes to continue to run while waiting for server B to respond with the value of V. What value for V should be used for the server A code that is asking for V‘s value? In an idealized world all the calling code uses concepts like Promises and Futures and the problem is kicked upstairs.

In the real world, often times this doesn’t work in practice:

  1. This change almost certainly requires changing the contract about the object/value being returned. Every caller would then need to be changed. Often times this change will cause ripple effects that extend through massive amounts of the code.
  2. external libraries are not designed to deal with the complexities of getting V they just want V.
  3. Maybe V is part of a larger calculation where some value of V must be used. The caller supplies defaultV if there is no V. But the calculation involving V should be skipped if no V is available.
  4. Callers have their own timing constraints and may not be able to wait for V to arrive.
  5. the caller is happy to use a cached value of V even if Vcached is expired.
  6. exposing the details of the V being ‘on its way’ is too much information for the caller. The caller doesn’t have any alternative path available
  7. returning a value that is some type other than the return type expected by the caller is breaking the function’s contract with all the existing calling code.
  8. Lastly, leaking the implementation details of getting V means that if those details change all the callers are impacted.

This is where the beauty of null and undefined come into play.

For those callers that just need V today, null and undefined can be easily tried identically:

var V = undefined;
console.log( V == null );
console.log( null == null );

both return true.

so ….

if ( V == null ) V = defaultV;

Which is the same code the callers previously had. Thus, the vast majority of the existing callers continue unchanged.

For the minority of callers wanting to know if they should come back for the final answer:

V === undefined

will give them the answer they need.

Posted in software design, technical.

Code review #10: No emailed code questions

[Update #1: below is added in response to Hersh’s comment]
Developers have this:

Yet developers are (should be) willing to spend time explaining the code to new developers. Including emails and chats conversations, in-person conversations, etc.

I don’t insist on arbitrary mounds of (unnecessary) comments. Rather I want minimal comments (once again read this previous post about commenting the “why”)
[/update #1]

However when the questions do come up, developers I work with are not allowed to ask in person, NOR chat, NOR email me questions about specific pieces of code.

Instead, they must ask their questions as comments in the code. I will reply as a comment as well.

For example from production code:

// TO_KOSTYA why are we getting nvr records?
// TO_PAT this is because we create FILTER_BY_CATEGORY message end point records, for every broadcast envelope. So a message endpoint record is created for every endpoint, even if a message never goes in there. Such records are never posted to external services, which results in the externalEntityStatus to be returned as 'nvr'.
// TO_KOSTYA : we need to filter at the server. Those records are essentially a server implementation detail that clients should not see.
if ($envelopeStatus['externalEntityStatus'] == 'nvr') {

This technique has huge benefits:

  1. Other developers will see the conversation only if they care about the conversation (i.e. they are debugging something that passes through the block of code with the question)
  2. The thinking/reasoning that would normally be lost and buried in the mass of email is preserved for others – including new developers that show up months or years later.
  3. No speculative commenting: Developers writing the same text that they would in a chat or email and in the process are commenting code that is the most troublesome/confusing and needs commenting the most.
  4. If the underlying issue is resolved, then the comment block can be rolled up into a coherent more generic comment.
  5. Decisions about what should NOT be done are also captured right where an uninformed developer is likely to reintroduce a bug

As to my no chat/no in-person/no email rule: I am naturally flexible (we do have to get work done after all) about this with the requirement. However, the person asking the question must:

  • take the chat log and put it as a comment in the code
  • OR create a comment that would have answered their question if they saw the comment.

Notice what is happening, instead of putting developer time into an email exchange, the same effort is being put into the comments:

  • Developer time is unchanged,
  • the text is unchanged,
  • only the location of the conversation is changed.

Posted in code review, self improvement, technical.

Ask for code samples, skip the coding tests during the interview

I always ask for code samples when interviewing a new technical candidate. I rarely ask for people to code during an interview.

Asking people to code well can easily become an exercise in how well they have a language memorized. Quite honestly, I have forgotten bits of languages that I no longer need. I am occasionally surprised, a few days ago I helped another developer by remembering about ‘cpp’. [1]

A code sample shows a candidate at their best (or worse):

  • They have time to do the code right.
  • Google is at their disposal.
  • They can test the code.
  • Do they comment?
  • Do they use meaningful variable names?

The code sample allows you to avoid mental traps:

  • The smooth-talker
  • The pretty face (both sexes)
  • The “everyone else liked the candidate” conformity

With 5 minutes or less to code a solution, you get sloppy code that does not reveal their true ability to code.

If someone’s sample code is pretty much as good as it gets for them. Ugly sample code means ugly code in *your code base* if you hire them.

A simple test to see how good that Java developer is.

Another question developer candidates

Below the fold for a real sample of bad coding. Can you find the issues?

[1] (cpp is the standalone program that C uses as its preprocessor. Running cpp allows you to see the post preprocessing text to be sent to the C compiler)

Posted in management, technical.

The Dangers of Knight in Shining Armor and Princesses who need them

Some women want a Knight in Shining Armor to sweep them off their feet to rescue them.

It all seems very romantic. Except, that the princess in the story usually is insecure, helpless and dependent.

Fairy tales aside, helpless women are exhausting, needy and emotional dangerous.

My best friend in High School recently killed himself. Tom spent over 20 years trying to save a girl with low self-esteem as a result of parental abuse. He sacrificed all his potential (and he was quite smart – CalTech student). In the end, she is living and he was destroyed.

There is a good reason for therapists and lifeguards. Both are trained to rescue others without becoming a victim themselves. Unless you are one of those, attempting a rescue potentially results in your own destruction.

I understand bouts of self-doubt, suicidal thoughts, depression, etc that we go through. My own SO has weight issues. But the low-esteem issues are narrow issues. In other parts of her life, she is confident and successful.

Global self-esteem issues need professional help. In the end, the person with self-esteem issues needs to know the path to raise their self-esteem.

For example, if you are insecure at work: why are you insecure? Find a way to have small successes to counteract those doubts that you can use to remind yourself in the future of your competence. Don’t ask others to validate your competence – they might have reasons of their own to put you down.

Lastly, remember you get what you attract. Insecure people attract insecure people or people that prey on insecurity. The princess can be the victim of the Knight in (not-so) Shining Armor

Posted in self improvement.

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.