Houzz.com

Dribbble in the Houzz

image

Last Thursday our Design team hosted our first Dribbble Meetup, which brought together nearly a hundred Bay Area designers for some great food, drinks and networking. It was fun to meet other members of the design community and to welcome new friends to our home. 

Here are a few photos from the night.

image

Some happy Houzzers

image

Taking over the “Houzz Cafe”

image

Arya Goudarzi, one of our engineers, joining the party

image

Dribble swag

Houzzer Profile: Tom Hacohen, UX and Visual Designer

image

At Houzz, Tom has worked on everything from branding and visual identity to web and mobile products. When Tom is not at work you’ll find her taking a painting class, snapping photos or exploring San Francisco, the place she’s called home for two years.

When did you realize design was in your future?
It was during my semester abroad in Paris. My French was terrible when I first arrived and I could barely understand what people were saying to me. For one of my classes, I had created a bunch of posters and mood boards to present as part of an assignment, but I couldn’t understand what the professor and the other students said during the critique that followed. After class, my friend told me that the professor had liked the colors, composition and design of my work, but that it had nothing to do with the assignment! What I took away from that experience was the power of design; where language failed, design could be a powerful medium for communication.

How did you get into product design?
I actually wanted to be a photographer early on. When I was 16, I bought an old Pentax camera, and I was always taking photos and developing them in darkrooms. I loved creating compositions and beautiful frames. A few years later I decided to study graphic design and immediately fell in love. I worked as a print and brand designer for a couple of years and then decided to get into product design where I found my new passion.

What inspires you?
Many things inspire me. People, for one. I like looking at people and trying to understand their behavior, and how they think. Talking to other designers is also inspiring. It’s incredible how you can fill a room with designers, give them the same task, and each will come up with something different. Identifying a problem to solve is another great source of inspiration for me. That’s a lot of what we do at Houzz. I’m constantly asking questions and trying to find ways to create something that will not only be beautiful but also solve a real problem for our community members.

What’s your favorite part about working at Houzz?
My favorite part is our design process. We work fast. We’re fearless. We try new things and we get to explore. I also love the people and the culture at Houzz. Everyone here is talented and passionate, and I’m always learning from them. Finally, I love the content. Who doesn’t like to look at beautiful homes all day?

What is the style of your home?
I like very minimal and clean designs. I would say my style is contemporary and a bit eclectic. I like to incorporate unique items, such as pieces I’ve found at a flea market, or a photograph I’ve taken into my decor.

What’s one of the things you’ve worked on at Houzz that you’ve most enjoyed?
It’s tough to answer this question because we always seem to be working on a fun project! It goes back to what I love about our process; we’re constantly in the mode of redesigning and thinking of new ways to deliver the best experience and tools for our users. We recently kicked off a redesign of the user experience on our site, which includes new profile pages that give users, especially home professionals, even more control over how they present themselves on Houzz. I love getting instant feedback from our users and being able to evolve our product in real-time to address their needs.

Data Pipelines for Non-engineers

Data pipelines manage some of the most important tasks for a web company. As data comes in from users, it needs to come right back out as improved user experiences and provide fresh analytics to the team as quickly as possible. I was quite proud of having built an easy to use pipeline framework at Houzz that made it simple to add new mapreduce jobs, hive/impala queries and data transfers, while integrating them seamlessly with existing jobs. The framework grew with the needs of my fellow engineers and did a really good job at what we needed. It became an integral part of everyone’s jobs and met all their needs. Then I discovered that analysts just a few seats over from me were scheduling cron jobs to run their analytics jobs rather than use our pipeline.

Beyond the cron
Cron jobs are great for making sure something runs regularly, but they have a lot of limitations that make them poorly suited for data pipelining. They aren’t guaranteed to run after their inputs are ready. They don’t automatically retry upon failure, validate outputs, or transfer data to our reporting structure. The Houzz data pipeline did all of these things and more. So why would an analyst use a cron job rather than the pipeline? The initial answer was pretty simple. They didn’t know that the data pipeline existed. All of the data engineers knew about it because it’s what we work on and with. It’s all over our internal chat rooms, e-mail threads and group discussions. Of course everyone knows about the pipeline and how to use it, unless they aren’t participating in engineering chat rooms, e-mail threads and discussions. The first step to getting non-engineers to use your tools is to let them know the tools exist.

More than just letting them know the tool exists, you have to walk them through how to use it. When other engineers wanted to know how to use the pipeline, I would just send them code paths for usage examples and the underlying framework code. This was usually enough to get them started. This doesn’t work for less technical people. Instead, sit next to them and help them use the pipeline for the first time. They’ll likely take detailed notes that can become the reference you point people to for how to use the data pipeline. Make sure these notes get shared. This will likely even be useful to engineers. Encourage the person you’re helping to post their notes on an internal wiki or website or offer to do it for them. This will save you a lot of future effort.

Users versus pipelines
Once you have non-engineers using your pipeline, you have an entirely new and more intractable problem: non-engineers are using your pipeline. They’ll tend to do things in ways you never anticipated. When the assumptions behind the design of your pipeline are broken, your pipeline is broken. Our pipeline was originally written so that a single misconfigured job would completely break the pipeline, making it completely obvious that the job was misconfigured and ensuring that all jobs are properly configured. This worked well with engineers, who either tested before merging or at least quickly noticed and responded when they broke something. Non-engineers don’t have the same aversion to broken builds that we do. They will merge code without testing it, never check to see that it’s working, and be slow to respond when informed that they’ve broken the pipeline. You need to either prevent these jobs from being merged or handle them gracefully. Our data pipeline now safely prunes misconfigured jobs and their dependents and prints a warning. Not seeing their data produced is enough to alert people that their jobs aren’t working, and the warning makes it clear to anyone who tries to test their job at all.

Complexity is another enemy of wider pipeline adoption. Reducing complexity helps every user of your pipeline, so you should see this problem as a partial blessing. The part of our pipeline that gets used by non-engineers is the reporting structure for running sql-like queries against hdfs data using hive or impala. A job consists of a query template and a configuration for how and when the template should be filled and run. The configuration causes all sorts of problems for non-engineers and should really be eliminated as much as possible.

Consider the following configuration that used to be in production for one of our impala queries:

user_segments:
   <<: *report_table_date
   table_name: user_segments 
   first_time: 2013-09-01
   report_name: "user_segments"
   dependencies: 
      - web_request 
   frequencies: 
      - daily
   dependencies:
      - primary_db

This is in yaml format, and is very confusing. First, we have the initial line of <<: *report_table_date. This copies entries from a mapping defined earlier in the file to save some typing, but obscures the configuration. This is not something you want to be doing. We also have the name user_segments appear twice in the mapping, even though the whole mapping is nested underneath a key user_segments already. This makes 3 places that someone who has copy-pasted a configuration needs to make the exact same edit. As an engineer, this makes sense. The config identifier, storage table, and query template identifier are 3 different things. But if they tend to be the same, you can just make that the default so people who don’t understand or care about the distinction will have an easier time. Similarly, we can also remove the daily frequencies specification by making that the default too. Pulling out all this cruft, we end up with the more streamlined

user_segments:
   db: logs
   first_time: 2013-09-01
   dependencies:
      - web_request
   dependencies:
      - primary_db

The db: logs line was originally hidden in report_table_date but now it’s clear that you must specify the storage db. Now a nasty bug in the configuration has become more apparent. The dependencies sub-map has been defined twice. Because this is a yaml configuration, this means that the first map will be overridden, and we will only have primary_db as a dependency. This section specifies which tables the query depends on, so this report might now get run before the web_request table is ready for that day. This is an easy mistake to make, as updating the report config is usually an afterthought after changing the query template. Oftentimes people would neglect to even update the configuration at all. In this case, the actual query did not depend on either of web_request and never had. This was probably just a bad combination of copy-pastes. To avoid these unnecessary mistakes, we now automatically infer table dependencies from the query itself, resulting in the shorter config that actually gets the dependencies right:

user_segments:
   db: logs
   first_time: 2013-09-01

We could probably even get rid of the two lines in this config for most cases, and may well do so in the future, but this is enough of an improvement that misconfigurations rarely cause problems anymore.

The template language used for our queries has also been a challenge. We’ve kept things simple by just using mustache templates to substitute in variable information like dates and times. This is pretty easy to use. People have no problem replacing where dt <= ‘2015-01-11’ with where dt <= ‘{{dt}}’ in a query to generalize it. They simply write a query template like

select photo_id, count(*) from photo_views 
where dt = {{dt}} group by photo_id

and you can easily produce daily reports on photo views. The problem is that needs grew beyond simple daily reporting, so people started writing queries like

select photo_id, count(*) from photo_views
where dt between DATE_SUB({{dt}}, 30) and {{dt}}
group by photo_id

to get a 30-day window. This contains an annoying fencepost error leading to a 31-day window rather than the desired 30-day window as well as breaking the dependency inference. When the pipeline tries to run this query, it will only ensure that photo_views is ready for the one day corresponding to {{dt}}, and not other days. I had already fixed this by allowing a template like

select photo_id, count(*) from photo_views
where {{dt_window}}
group by photo_id

We can then control the window size via configuration and everything will work properly. The only problem is that only the other engineers knew that I had done this, as it was only mentioned in engineering chat rooms. It’s important to keep educating users about new features and requirements. I had to correct a lot of templates and make public announcements to make sure that everyone knew how to use this feature going forward. I also took the time to add clear explanations of all template features to the internal pipeline documentation.

Fixing broken queries
Most surprising of all the challenges presented was the way in which a non-developer develops a query. An analyst or salesperson doesn’t really care about maintainability or scalability. They only care that it produces the desired results. This is a very pragmatic view, but it means that the queries will often break as systems change and the underlying data grows.

It’s not uncommon to see jobs failing and inspect them to find a 500+ line query. Trying to figure out what’s going wrong with such a query can be a daunting task, but most of these lines were probably not hand-written. If you look for patterns, you’ll likely see where copy-paste was used and be able to refactor it into something smaller. Often there are a few repeated sub-queries that can be put into their own tables. If you check other jobs, you may find that these sub-queries can be factored out of many other queries as well. Not having to store these intermediate results fully in memory can make a big difference. Another common issue is the use of UNION and WHERE clauses to achieve what GROUP BY is meant for. For example, you may find a query like the following to count the number of users in different age brackets:

select "<18" as age_bracket, count(*) from users where age < 18
union
select "18-24" as age_bracket, count(*) from users where age between 18 and 24
union
select "25-34" as age_bracket, count(*) from users where age between 25 and 34
union
select "35-44" as age_bracket, count(*) from users where age between 35 and 44
union
select "45-54" as age_bracket, count(*) from users where age between 45 and 54
union
select "55-64" as age_bracket, count(*) from users where age between 55 and 64
union
select "65+" as age_bracket, count(*) from users where age > 65

which causes a lot of unnecessary extra work and can actually break if the query runner tries to load 7 copies of the user table simultaneously in memory to run the queries in parallel. It’s also easy for errors to creep in when the unioned sub-queries get more complicated, as every edit needs to be repeated 7 times. It’s fairly simple to remove all the unions by using a case statement for age_bracket and grouping by age bracket:

SELECT
   CASE
      WHEN age < 18 THEN "<18"
      WHEN age BETWEEN 18 AND 24 THEN "18-24"
      WHEN age BETWEEN 25 AND 34 THEN "25-34"
      WHEN age BETWEEN 35 AND 44 THEN "35-44"
      WHEN age BETWEEN 45 AND 54 THEN "45-54"
      WHEN age BETWEEN 55 AND 64 THEN "55-64"
      ELSE "65+"
   END AS age_bracket,
   COUNT(*)
FROM users
GROUP BY age_bracket

Simplifications like this make queries easier to read and debug and can also actually fix them sometimes. It’s important to keep an eye out for these issues and help both to fix these types of issues and show your pipeline’s users how to avoid them in the future.

Conclusions 
These are just a few of the things we’ve had to do to keep the Houzz data pipeline accessible to non-engineers. It’s a lot of hard work, but quite worth it. Over 40% of our report queries are now written by non-engineers, providing a lot of useful data that is always ready when needed. This makes everyone’s jobs easier. For more technical details on how our pipeline works, stay tuned for an upcoming post on how we use Luigi for pipelining. Or apply to work at Houzz now to become a part of it.

Maison&Objet Paris? Oui!

image

Last week, Houzz France joined the biannual Maison&Objet, one of the largest trade shows in Europe dedicated to all things home decor, including furnishings, textiles, tableware, decorative accessories, and more. Celebrating its 20th anniversary, Maison&Objet brings together more than 80,000 industry professionals to preview the latest innovations in design and new collections from brands from all over the world. Set across nine halls in Northern Paris covering over 135,000 square meters (over 33 acres!), the fair is a true celebration of creativity, vibrant colors and materials. The Houzz booth buzzed with activity during the five days of the fair as our local team met with thousands of industry professionals and members of the Houzz community. It was busy and exhilarating week for our team, and we’re excited to see what the September event has in store!

image

Meow! 1 Million Views and Counting

image

We love to celebrate milestones, whether it’s through a champagne toast, a walk out for gelato, or tasty treats for breakfast. This week was a feline frenzy as one of our first HouzzTV videos surpassed one million views (as of this writing, we’re at 1.8 million!). A few months ago, our editorial team found Peter Cohen, a California home builder who constructed elaborate catwalks, tunnels, platforms and perches throughout his home to keep his 15 rescue cats occupied. Peter opened his doors to the Houzz community and gave us a glimpse of his unique home. Check out the video for yourself here:

Thanks to Peter for sharing his home – and story – with us!

Houzz Germany Takes Over imm Cologne 2015

image

Every January, the city of Cologne becomes the center stage for trends in interior design and home furnishings as leading brands and designers unveil their newest collections to industry professionals and the public at imm Cologne. As the first leading trade fair of the year in Europe, imm Cologne attracts over 100,00 architects, interior designers, product designers and other home design professionals who want to discover the products, styles and trends that will influence design in the coming year.  

Just three months after our launch in Germany (and lots of exciting preparation), Houzz unveiled our first booth at the fair and welcomed thousands of design professionals and home design enthusiasts. The Houzz booth was a hub of activity, where our local team shared the findings of our recent survey of German homeowners and renters on their remodeling and decorating activity, motivations and plans; and helped thousands of pros learn tips and best practices for getting the most out of their free Houzz profile.

We can’t wait to join imm Cologne again in 2016!  

image

Holy Home Building!

image

Our booth at #IBS2015, the International Builders’ Show, was packed with folks from the amazing Houzz professional community who came out to meet our team, get one-on-one support, and hear about our latest consumer research.

From pros just getting started on Houzz to our earliest adopters, everyone was excited to get best practices for building their brand on Houzz and learn more about our Pro+ local advertising program.

Builders, remodelers, major brands, and specialty vendors also took the time to share their experiences with Houzz and how it has helped them connect and collaborate with both clients and prospective customers. But don’t take our word for it, watch this video for some of our show highlights and interviews:

A New, Old Home in Palo Alto

image

When we moved into our 10,000 square foot office space in downtown Palo Alto in May, 2013, it seemed enormous - we were used to our cozy, startup quarters. Even though it was our third office in two years, we thought we would be able to comfortably call it home for a while. Little did we know that the huge space would quickly come to feel snug as we filled it with amazing new Houzzers. To accommodate our team’s continued growth, half of us moved back into our beautiful “old” space across the street last week.

For those of us who were here before, it does feel a bit like coming back home. In true Houzz style however, the office has been redesigned and decked out with home-themed conference rooms: a wine cellar, cozy study, laundry room, patio, living room and dining room. Of course, all of the rooms were furnished from the Houzz Marketplace. Here’s a peek into our “new” space… we’re pretty sure our friends across the street are especially jealous of the wine room!

image

image

image

Bay Area Girl Geek Dinner in the Houzz

image

With a team that’s over 50% female, we’re no stranger to a room full of talented women, but last night we had a truly full Houzz when we welcomed nearly 100 female technologists as part of Bay Area Girl Geek’s popular dinner series. Our co-founders (and married couple) Adi Tatarko and Alon Cohen were our speakers for the night and shared some lesser known facts about themselves, our product and the journey we’re on at Houzz. Some highlights include how Adi and Alon met on a 15-hour bus ride in Thailand, how the Houzz site has evolved from its early black background into the simple, beautiful site of today, and how recruiting the right people has maintained our family culture as we’ve grown to a team of 400-strong.

While we had plenty of food, photo booth fun and raffles, the best part of the night for our team was meeting other incredible women in tech.

We hope Bay Area Girl Geek Dinner will visit us again soon!

image

An Insider’s Take: Engineering Culture at Houzz

image

I almost always get asked one question when I’m interviewing for our team: “What’s the engineering culture like at Houzz?” The first word that comes to mind is entrepreneurial. Here’s a quick look at the values that I think define working on our team.

Entrepreneurial Mindset 
I think a good entrepreneur continuously watches the status quo to uncover opportunities to solve problems that can transform the status quo to a better state. Everyone on the engineering team at Houzz is doing the same thing. We’re all empowered — and expected — to find new ways to do things better, and to enhance the experience for our users. Anyone on the team can identify a problem, model a solution and build a working prototype. Of course, the solution may not always provide the desired impact, but we can iterate to another solution and repeat until we are satisfied with the outcome.

Fast Failure 
As “entrepreneurs,” engineers at Houzz are encouraged to succeed, but are not discouraged by failure. I am not a skateboarder, but I admire Tony Hawk who has made a $160M brand with his name. I imagine that he wasn’t born knowing how to skateboard and weathered many falls, scratches and bumps until he learned. No one on our team was born with the knowledge to solve all of the challenges that we face today. The concept of a website and mobile application to help people improve their homes from start to finish did not exist before Houzz, and it has taken numerous iterations to bring the product to its current state. Moreover, we’ve had to evolve our backend systems to support our current scale. We’ve made plenty of mistakes as we have evolved, but our culture is about recovering from failure rather than avoiding it. This has helped us to move fast and stay ahead of our game.

Data-Driven Decision Making 
Recently we kicked off a redesign of our user experience. One of our objectives was to make it easier for people to find the right content by promoting the search functionality. As an experiment, we changed our header and tested it with a subset of users. We found that a majority preferred our original navigation, and that page views to certain content categories decreased. Without this testing, a simple product design change could have had a negative effect on the user experience without us knowing.  

Data-driven decision making is not limited to product changes. We apply the same principles of testing when we’re evaluating different technology solutions to support the variety of services we provide our users. Even though a similar solution may have worked for another venture, it might not work for us. We use a combination of data and intuition to find the right solution for Houzz.

Kaizen, Change is Good! 
Houzz is growing fast. The scope of challenges that we have to solve changes every day, and we have doubled in size in less than a year. If we don’t continuously evaluate our culture and processes as part of a long-term strategy, a routine that worked for only a few engineers and designers may not work for a larger team, and might impair us.

At Houzz, we believe that change is good. We’re always evaluating the tools and systems that we use to make sure that they are efficient and make our lives easy. You may ask if we have a routine process for evaluating things, and the simple answer is “no.” Instead we promote a culture where people on the team can openly share their feedback and changes follow.

image

Welcome Home 
One of the biggest differentiators in our culture is our sense of family. Houzz was founded by, and is run by, a married couple who believe that when you’re at work, you should feel like you’re at home. You should enjoy the time you spend with your coworkers. We have built a culture that makes our life in the office truly feel like an extension of life outside of the office. We love coming to work because we enjoy spending time together and building a great product that millions of people use every day.