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') {
continue;
}

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 | 2 Comments

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)
Continue reading

Posted in management, technical | Leave a comment

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 | Leave a comment

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.

Questions:

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?
A. Do NOT fire KE them!!! IF YOU FIRE THEM, THEY ARE LEGALLY OFF THE HOOK.

Q. What Next?
A.

  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 cslb.ca.gov and stored at http://www.lexisnexis.com/clients/caagencylaw/CA_Contractors_2013.pdf (California Contractors Law)
This letter has taken a considerable amount of time. As a result, not all the issues have been full articulated.

Background

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.

Issues

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 (http://KitchenExpertsOfCalifornia.com ) and on their Diamond Certified page ( http://www.diamondcertified.org/report/kitchen-experts-of-california) 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

Drywall/Painting

  • 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 | 16 Comments

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 | Leave a comment

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 | Leave a comment

SocialMarketing WordPress plugin 1.7.3.1 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 FarReach.es 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 farReach.es

Posted in technical | Leave a comment

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:

USER_EMAIL table:

ID EMAIL_ADDRESS (the problem)
1 ‘ konstantin@mailinator.com’ space at beginning
2 ‘konstantin@mailinator.com ‘ space at end
3 ‘konstantin@mailinator.com’

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 “konstantin@mailinator.com “?

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:

ID EMAIL_ADDRESS NORMALIZED_EMAIL
1 ‘ konstantin@mailinator.com’ konstantin@mailinator.com
2 ‘konstantin@mailinator.com ‘ konstantin@mailinator.com
3 ‘konstantin@mailinator.com’ konstantin@mailinator.com

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 | Leave a comment

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 | 1 Comment

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.

FIRST TIME
Cloudflare:

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

Google:

Connecting to ajax.googleapis.com|74.125.28.95|: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:

Cloudflare:

Connecting to cdnjs.cloudflare.com|141.101.123.8|: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]

Google:

Connecting to ajax.googleapis.com|74.125.141.95|: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  te-0-1-0-1-ur05.santaclara.ca.sfba.comcast.net (68.87.196.113)  17.153 ms  9.443 ms  12.030 ms
 4  te-1-1-0-0-ar01.sfsutro.ca.sfba.comcast.net (69.139.198.82)  15.320 ms
    te-1-1-0-9-ar01.sfsutro.ca.sfba.comcast.net (69.139.198.178)  20.916 ms
    te-1-1-0-7-ar01.sfsutro.ca.sfba.comcast.net (69.139.198.174)  17.887 ms
 5  he-3-8-0-0-cr01.sanjose.ca.ibone.comcast.net (68.86.94.85)  18.458 ms  22.712 ms  23.970 ms
 6  pos-0-5-0-0-pe01.11greatoaks.ca.ibone.comcast.net (68.86.87.162)  20.503 ms  19.316 ms  19.999 ms
 7  173.167.57.122 (173.167.57.122)  39.213 ms  25.379 ms  20.759 ms
 8  as13335.xe-9-0-2.ar2.sjc1.us.nlayer.net (69.22.153.74)  17.737 ms
    as13335.xe-8-0-5.ar2.sjc1.us.nlayer.net (69.22.130.146)  31.771 ms
    as13335.xe-9-0-2.ar2.sjc1.us.nlayer.net (69.22.153.74)  20.209 ms
 9  190.93.242.8 (190.93.242.8)  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  te-0-1-0-1-ur05.santaclara.ca.sfba.comcast.net (68.87.196.113)  9.586 ms  11.568 ms  11.461 ms
 4  te-1-1-0-5-ar01.sfsutro.ca.sfba.comcast.net (68.86.143.94)  12.663 ms
    te-1-1-0-4-ar01.sfsutro.ca.sfba.comcast.net (68.85.155.66)  19.735 ms
    te-1-1-0-3-ar01.sfsutro.ca.sfba.comcast.net (68.85.155.62)  47.036 ms
 5  he-1-5-0-0-cr01.sanjose.ca.ibone.comcast.net (68.86.90.93)  19.118 ms  21.943 ms  35.681 ms
 6  pos-0-2-0-0-pe01.529bryant.ca.ibone.comcast.net (68.86.87.6)  13.524 ms  13.981 ms  34.744 ms
 7  66.208.228.226 (66.208.228.226)  14.712 ms  16.271 ms  14.320 ms
 8  72.14.232.138 (72.14.232.138)  14.418 ms  13.487 ms
    72.14.232.136 (72.14.232.136)  21.560 ms
 9  209.85.250.63 (209.85.250.63)  17.685 ms
    209.85.250.66 (209.85.250.66)  44.087 ms  20.266 ms
10  72.14.232.63 (72.14.232.63)  48.702 ms
    216.239.49.198 (216.239.49.198)  31.927 ms
    72.14.232.63 (72.14.232.63)  31.606 ms
11  72.14.233.200 (72.14.233.200)  65.608 ms
    72.14.233.202 (72.14.233.202)  39.036 ms
    72.14.233.140 (72.14.233.140)  43.722 ms
12  64.233.174.125 (64.233.174.125)  33.895 ms  39.076 ms
    64.233.174.97 (64.233.174.97)  36.646 ms
13  * * *
14  pc-in-f95.1e100.net (74.125.28.95)  66.471 ms  35.639 ms  76.047 ms

Google traceroute to second server:

 3  te-0-1-0-1-ur05.santaclara.ca.sfba.comcast.net (68.87.196.113)  11.852 ms  10.684 ms  11.592 ms
 4  te-1-1-0-5-ar01.sfsutro.ca.sfba.comcast.net (68.86.143.94)  16.404 ms
    te-1-1-0-4-ar01.sfsutro.ca.sfba.comcast.net (68.85.155.66)  23.193 ms
    te-1-1-0-3-ar01.sfsutro.ca.sfba.comcast.net (68.85.155.62)  20.005 ms
 5  he-1-6-0-0-cr01.sanjose.ca.ibone.comcast.net (68.86.90.157)  40.921 ms  20.899 ms  23.967 ms
 6  pos-0-9-0-0-pe01.11greatoaks.ca.ibone.comcast.net (68.86.88.110)  20.604 ms  18.826 ms  17.855 ms
 7  173.167.57.122 (173.167.57.122)  20.478 ms  18.200 ms  21.693 ms
 8  as13335.xe-8-0-5.ar2.sjc1.us.nlayer.net (69.22.130.146)  15.495 ms
    as13335.xe-9-0-2.ar2.sjc1.us.nlayer.net (69.22.153.74)  16.727 ms
    as13335.xe-8-0-5.ar2.sjc1.us.nlayer.net (69.22.130.146)  34.721 ms
 9  141.101.123.8 (141.101.123.8)  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 ajax.googleapis.com 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 | 1 Comment