Jeff Kaufman  ::  Blog Posts  ::  RSS Feed  ::  Contact

Adding dormers to our house

Over the last year we added three dormers to our house. This added two bedrooms to our third floor, bringing it to four bedrooms. We changed:




The biggest cost was the construction itself, which makes sense! The contractor was responsible for demolition, construction, and finish, while subcontracting the electrical and plumbing (forced hot water).


The initial contractor we hired, Brendin Lange, defrauded us for about $10k. He did one day of demolition (interior only, luckily!) and then didn't come back, giving a series of less and less plausible excuses. He eventually stopped returning calls. I did some research, and he's started many different companies, gotten complaints, and then started new ones. As far as I can tell from reading reviews online he's still at it, ripping off one person after another. I reported him to the Somerville police, gave them all the information we have, and the last time I checked in with their detective they said they're still waiting for a court date.

Wiring Smoke Detectors

Wiring smoke detectors in the construction area wasn't difficult, but the city electrical inspector decided that this was a large enough change that we needed to retrofit the rest of the house as well. This included the entryway on the first floor, and because this isn't within a unit the city required the detector to be on a common-area meter. Because we didn't already have a common-aarea meter, and the city requires new meters to be outside the house (and requires the meters to be together) we needed to move our existing meters outside and get a new line of service. Because there wasn't anywhere far enough from the windows on that side of the house we needed to move all the meters to the other side of the house. This required running new wires from the middle of the electrical pole.

There are two things about this that annoy me:

  • Why do we need to wire smoke detectors in parts of the house we're not changing? I understand a general principle of "while you've got stuff opened up you should bring it up to modern best practices," but our first and second floors weren't being opened up as part of this construction, so this required a lot of fishing.

  • The amount of work and expense that went into installing new service so a single smoke detector can be separately metered is nuts! It draws about half a Watt! The power it uses is a rounding error compared to rent, whoever pays for it. As the landlords we're already paying the electric bill for the whole building, because some circuits power both units, so attaching the detector to either existing unit should have been fine. When I asked the inspector if they could give us some leeway here they weren't interested.

    This should work like heat: the city doesn't require us to have a separate boiler to heat the water for the radiator in the entryway, just that we pay for the fuel for the boiler that does.

Structural engineering

It's possible we could have found someone who would be able to do both the architecture and the engineering together, and would have done better that way, but when I called around to engineers trying to get started they all told me they wanted plans from an architect first.

Tree trimming

Neither us nor our contractor noticed until the day they were supposed to start work that there were some tree branches that were too close to where the dormers were going to be. I was able to find a tree trimming company that could do the job the next day, and probably paid more for the responsiveness, but I didn't want our main contractor to need to get started on something else while they were waiting for the trees to get cleared.

This was a tricky job because our house is too close to the neighbors' for them to be able to come in with a truck. Instead they needed to climb the tree manually, cutting pieces off and lowering them to the ground with pulleys.


What we wanted was pretty straight-forward, and probably not as interesting for them as working on something more complex. They did suggest doing the rear bay extension, though, which is not a thing we had thought of, and which I'm pretty happy with.


The main fee here was $1,253 for the building permit, because this includes a per-sqft portion. The other half was a lot of little things, with zoning appeals fees, deed recording fees, advertising fees, and many other things.

Lights and fans

I wanted to put a ceiling fan in each room, for a lot of reasons: quieter than box fans, less worry of kids poking their fingers inside, less hassle, more air movement. We picked out and bought the lights and fans, to make sure we were getting exactly what we wanted.


Parking permits for contractors, site visit from a structural engineer we decided not to go with, plastic sheeting to cover some of the stuff we left on the third floor in an area the didn't need to modify.


$6,700Wired smoke detectors in the rest of the house
$5,550Structural engineering
$3,600Tree trimming
$2,155Government payments
$716Lights and fans



Working with architect


Getting approval from the Somerville Zoning Board of Appeals. The house was already non-conforming in terms of having too much floor area for its lot size, so we just had to demonstrate that it would be no more deterimental to the neighborhood than it currently was. Dormers are very common here, so this wasn't hard.


Trying to find a structural engineer.


Gave up on finding an engineer first, decided to find a contractor and have them subcontract the engineering. Talked to several companies, picked Brendin Lange (unfortunately).


We move out, Lange does one day of demo. Excuses for why things aren't moving along.


Less plausible excuses from Lange.


Terrible excuses from Lange, followed by his stopping returning my calls.


Trying to find another contractor.


Found good contractor, they started almost right away on demo and shell, after I got the trees trimmed.


Shell finished to being watertight. Framing, strapping, electrical.


Siding, plumbing.


Insulation, plaster, painting, flooring, final electrical.


Floor varnish, waiting for fumes to subside, moved back in.


Common-area smoke detector work.

Cost Effectiveness

The overall cost was $110k for adding two bedrooms and 238 sqft, which is $55k/bedroom or $462/sqft. How reasonable is this?

Zillow thinks our part of Somerville is about $430/sqft, based on sales over the last few years, so $462/sqft is on the high side. Though this also involved converting the attic to conditioned space by insulating the roof instead of the ceiling, and converting 90sqft from having 5-8ft sloped ceilings to being full-height, so the effective gain is a bit higher.

Alternatively, from a per-bedroom perspective it looks pretty good. The marginal bedroom [1] in our area is currently $645/month, [2] so at $55k/bedroom you're only talking 7 years to make the investment back. And having separate rooms for everyone in the family while still being able to have housemates is worth a lot to us!


[1] This is the cost difference between an apartment with N bedrooms and one N+1, not the cost of an apartment divided by its number of bedrooms, which is much higher.

[2] I used the difference between a 3br and a 4br unit here, because there aren't enough 5br or 6br units on the market to extrapolate from. The $645 estimate is the average of each month's delta over the last year:

  • 2017-03: $610
  • 2017-02: $610
  • 2017-01: $585
  • 2016-12: $605
  • 2016-11: $555
  • 2016-10: $565
  • 2016-09: $675
  • 2016-08: $675
  • 2016-07: $655
  • 2016-06: $690
  • 2016-05: $735
  • 2016-04: $770

full post...

Slack tool: predict

I wrote a Slack tool that implements a CFAR-style prediction market:

/predict create rain-2017-03-18 "it will rain tomorrow" tomorrow 40%
/predict rain-2017-03-18 70%
/predict rain-2017-03-18 80%
/predict resolve rain-2017-03-18 true

A contract is some proposition that isn't known now, but will be known later, at which point it can be resolved true or false. When you create a contract, you give some details about how you'll resolve it, a time when it will close and stop taking new predictions, and some "house odds". These odds try and start the predicting in a reasonable place, so no one gets a big windfall from noticing things first.

When the market closes, people earn points in proportion to how much they improved the group consensus. [1] This isn't a traditional prediction market in the sense of having buyers and sellers. The downside is that it offers windfall profits to the first person to react to news, but the upside is that anyone can make a prediction at any time without needing to have a counterparty.

The code is on github. I've been using heroku to host it, but it can run anywhere. If you're having trouble adding it to slack let me know.

[1] Specifically, you get (or lose) points in proportion to the log of the ratio of your prediction to the one before. So if you predict 60%, I predict 70%, and it's resolved true, then I earn log(70/60) points. If it's resolved false we recast these predictions as if they were predicting the opposite, so 30% and 40%, and I earn (lose) log(30/40) points.

full post...

Diving into a floating point bug

Yesterday I refactored some python code that effectively changed:

   floor(n * (100 / 101))
   floor(n * Decimal(100/101))
For most integers this doesn't change anything, but for multiples of 101 it gives you different answers:
  floor(101 * (100 / 101))       -> 100
  floor(101 * Decimal(100/101))  ->  99
In python2, however, both give 100:
  floor(101 * (100.0 / 101))       -> 100
  floor(101 * Decimal(100.0/101))  -> 100
What's going on? First, what's the difference between python2 and python3 here? One of the changes not listed in What's New In Python 3.0 is that floor now returns an int instead of a float:
  • 2.x: Return the floor of x as a float, the largest integer value less than or equal to x.
  • 3.x: Return the floor of x, the largest integer less than or equal to x. If x is not a float, delegates to x.__floor__(), which should return an Integral value.
Since these are positive numbers, we can use int() instead of floor() and now python2 and python3 give the same result:
  2.x: int(101 * Decimal(100.0/101)) -> 99
  3.x: int(101 * Decimal(100/101))   -> 99
The root of the problem is that 100/101 is a repeating decimal, 0.99009900..., and so can't be represented exactly as a Decimal or a float. To store it as a Decimal python defaults to 28 decimal digits and rounds it: more...
Housing Without Street Parking

One of the major reasons existing residents often oppose adding more housing is that as more people move in it gets harder to find on-street parking. [1] This gives us things like requirements that there be at least one off-street parking place per unit, or just prohibitions on building out. What if, in places like Somerville where all parking is already by-permit-only, we added a new category of housing unit, one that didn't come with any rights to street parking?

The requirements for building these would be lower, and they would end up renting somewhat more cheaply. I know a lot of people who don't own cars and walk / bike / taxi / take public transit everywhere, who I think would be happy to rent units classified this way. more...

Early Exercise and 83b

This is a post where I'm trying to figure out what I should do from a tax perspective. I'm not that knowlegable about taxes, but I still have to make a tax-relevant choice. So please read this as "Jeff writes down what he's currently thinking about how to make this decision" and not "Jeff tells me how to decide whether to early exercise."

Update 2017-03-07:: Ben Kuhn has a much better post, Stock options are really complicated. Go read that instead.

Update 2017-02-17: The modelling in this post is wrong to the point of not being useful. I had thought that the reason to exercise early was to get capital gains treatment on options, but ISOs already have this if you're careful with them. The reason to exercise early is the alternative minumum tax.

I recently started at a startup, and as is typical part of my compensation is in the form of stock options vesting over four years. I have two choices about how to handle this: more...

Carcassonne For Kids

Standard Carcassone is too complicated before about age 9, but if you adjust the rules (substantially) it can be a lot of fun with much younger kids. Stages of play:

  1. You just take turns playing tiles, and edges don't matter.
  2. Still just playing tiles, but now edges do matter.
  3. When you play a city tile, you can put a person on it, and when the city completes you get the person back.
  4. Same with roads.
  5. Same with monastaries.
  6. Start counting points and having a winner.
  7. Add farms

I've been playing stage #1 with Lily (nearly three years old) a lot lately, I've played stage #2 with a five year old, and stage #3 with a six year old. The exact rules don't matter that much, the important thing is to have fun and to teach the idea of playing a game that has rules you need to follow. For example, Lily wanted to play with the meeple as well, so we play that every time you put down a tile you also have to put a person on it.


More Posts

Jeff Kaufman  ::  Blog Posts  ::  RSS Feed  ::  Contact  ::  G+ Profile