<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Eugene Yan</title>
    <description>The latest articles on DEV Community by Eugene Yan (@eugeneyan).</description>
    <link>https://dev.to/eugeneyan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F487698%2F45a202cf-f5c8-4cf9-b844-54150d27474a.png</url>
      <title>DEV Community: Eugene Yan</title>
      <link>https://dev.to/eugeneyan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eugeneyan"/>
    <language>en</language>
    <item>
      <title>Almost Everything You Need To Know About Data Discovery Platforms</title>
      <dc:creator>Eugene Yan</dc:creator>
      <pubDate>Mon, 02 Nov 2020 01:23:10 +0000</pubDate>
      <link>https://dev.to/eugeneyan/almost-everything-you-need-to-know-about-data-discovery-platforms-13ap</link>
      <guid>https://dev.to/eugeneyan/almost-everything-you-need-to-know-about-data-discovery-platforms-13ap</guid>
      <description>&lt;p&gt;In the past year or two, many companies have shared their data discovery platforms (the latest being &lt;a href="https://engineering.fb.com/data-infrastructure/nemo/"&gt;Facebook’s Nemo&lt;/a&gt;). Based on this &lt;a href="https://github.com/eugeneyan/applied-ml#data-discovery"&gt;list&lt;/a&gt;, we now know of more than 10 implementations.&lt;/p&gt;

&lt;p&gt;I haven’t been paying much attention to these developments in data discovery and wanted to catch up. I was interested in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The questions these platforms help answer&lt;/li&gt;
&lt;li&gt;The features developed to answer these questions&lt;/li&gt;
&lt;li&gt;How they compare with each other&lt;/li&gt;
&lt;li&gt;What open source solutions are available&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end of this, we’ll learn about the key features that solve 80% of data discoverability problems. We’ll also see how the platforms compare on these features, and take a closer look at open source solutions available. &lt;/p&gt;

&lt;h3&gt;
  
  
  Why do we need data discovery platforms and what do they do?
&lt;/h3&gt;

&lt;p&gt;Data discovery platforms help us find data faster. Imagine yourself as a new joiner in the organization. You need data for analysis, or to build a machine learning system. How would you find the right tables and columns to use? How would you quickly assess their suitability?&lt;/p&gt;

&lt;p&gt;Finding the right data can take a lot of time. Before Lyft implemented their data discovery platform, &lt;a href="https://eng.lyft.com/amundsen-lyfts-data-discovery-metadata-engine-62d27254fbb9#c4df"&gt;25% of the time&lt;/a&gt; in the data science workflow was spent on data discovery. Similarly, &lt;a href="https://engineering.shopify.com/blogs/engineering/solving-data-discovery-challenges-shopify"&gt;80% of Shopify’s data team&lt;/a&gt; felt that the discovery process hindered their ability to deliver results.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gJFn6hfh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tqq6zzvw7zhtns8951q8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gJFn6hfh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tqq6zzvw7zhtns8951q8.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class="image-caption"&gt;Lyft found that 25% of time is spent on data discovery (&lt;a href="https://eng.lyft.com/amundsen-lyfts-data-discovery-metadata-engine-62d27254fbb9"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Data discovery platforms catalog data entities (e.g., tables, ETL jobs, dashboards), metadata (e.g., ownership, lineage), and make searching them easy. They help answer “Where can I find the data?” and other questions that users will have.&lt;/p&gt;



&lt;h2&gt;
  
  
  Questions we ask in the data discovery process
&lt;/h2&gt;

&lt;p&gt;Before discussing platform features, let’s briefly go over some common questions in the data discovery process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where can I find data about ____?&lt;/strong&gt; If we don’t know the right terms, this is especially challenging. For user browsing behavior, do we search for “click”, “page views”, or “browse”? A common solution is free-text search on table names and even columns. (We’ll see how Nemo improves on this in the next section.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the data about?&lt;/strong&gt; What columns does the data have? What are the data types? What do they mean? Displaying table schemas and column descriptions go a long way here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who can I ask for access?&lt;/strong&gt; Ownership and how to get permissions should be part of the metadata displayed for each table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is the data created? Can I trust it?&lt;/strong&gt; Before using the data in production, we’ll want to ensure its reliability and quality. Who’s creating the data? Is it a scheduled data cleaning pipeline? Or does an analyst manually run it for monthly reporting? Also, how widely is the data used? Displaying usage statistics and &lt;a href="https://en.wikipedia.org/wiki/Data_lineage"&gt;data lineage&lt;/a&gt; helps with this. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How should I use the data?&lt;/strong&gt; Which columns are relevant? What tables should I join on? What filters should I apply to clean the data? To address this, one way is to display the most frequent users of each table so people can ask them. Alternatively, we can provide statistics on column usage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How frequently does the data refresh?&lt;/strong&gt; If delays are common, what is the extent of it? Stale data can reduce the effectiveness of time-sensitive machine learning systems. Also, what is the period of data? If the table is only a few weeks old, we won’t have enough for machine learning. A simple solution is to show table creation dates, partition dates, and when it was last updated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features to find, understand, and use data
&lt;/h2&gt;

&lt;p&gt;The features of data discovery platforms can be grouped into the various stages of data discovery. First, identifying the right data. Then, learning and assessing the suitability of the data. Last, figuring out how to use it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finding via free-text search or other smarter ways
&lt;/h3&gt;

&lt;p&gt;How do we help users find the data they need? All data discovery platforms &lt;strong&gt;allow users to search&lt;/strong&gt; for table names that contain a specified term. Some go beyond that by also searching column names, table and column descriptions, and user-input description and comments. This is usually implemented by indexing the metadata in Elasticsearch.&lt;/p&gt;

&lt;p&gt;Assuming we have many search results, how should we rank them? For &lt;a href="https://eng.lyft.com/amundsen-lyfts-data-discovery-metadata-engine-62d27254fbb9#ebfe"&gt;Lyft&lt;/a&gt; and &lt;a href="https://engineering.atspotify.com/2020/02/27/how-we-improved-data-discovery-for-data-scientists-at-spotify/"&gt;Spotify&lt;/a&gt;, ranking based on popularity (i.e., table usage) was a simple and effective solution. While not always correlated, widely used tables tend to relevant, better maintained, and more production worthy. This is implemented by parsing query logs for table usage and adding it to Elasticsearch documents (i.e., tables) for ranking.&lt;/p&gt;

&lt;p&gt;Facebook’s &lt;a href="https://engineering.fb.com/data-infrastructure/nemo/"&gt;Nemo&lt;/a&gt; takes it further. First, search terms are parsed with a &lt;a href="https://spacy.io"&gt;spaCy&lt;/a&gt;-based library. Then, table candidates are generated via &lt;a href="https://research.fb.com/publications/unicorn-a-system-for-searching-the-social-graph/"&gt;Unicorn&lt;/a&gt;, the same infra they use for scalable search on the social graph. Finally, candidates are ranked based on social signals (e.g., table users) and other features such as kNN-based scoring. Taken together, this gives Nemo the ability to parse natural language queries. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kFNOwXQe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/770nwrv13ena527cehg9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kFNOwXQe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/770nwrv13ena527cehg9.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class="image-caption"&gt;Nemo's search architecture; don't expect this in other platforms (&lt;a href="https://engineering.fb.com/data-infrastructure/nemo/"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;While seldom mentioned, &lt;strong&gt;another way to help users find data is via recommendations&lt;/strong&gt;. This is usually on the home page. Recommendations can be based on popular tables within the organization and team, or tables recently queried by the user. New, “golden” datasets by data publishers can also be recommended to raise awareness. 20% of monthly active users used homepage recommendations when Spotify implemented this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding via schemas, previews, statistics, lineage
&lt;/h3&gt;

&lt;p&gt;As users browse through tables, how can we help them quickly understand the data? To address this, most platforms &lt;strong&gt;display the data schema&lt;/strong&gt;, including column names, data types, and descriptions.&lt;/p&gt;

&lt;p&gt;If the user has read permissions, we can also provide a &lt;strong&gt;preview of the data&lt;/strong&gt; (100 rows). Pre-computed column-level statistics can also be made available. They include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All columns: Counts and proportion of null values&lt;/li&gt;
&lt;li&gt;Numerical columns: Min, max, mean, median, standard deviation&lt;/li&gt;
&lt;li&gt;Categorical columns: Number of distinct values, top values by proportion&lt;/li&gt;
&lt;li&gt;Date columns: Range of dates in the data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--whvtvxvz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/r77kekcwmje0oy6yoa5n.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--whvtvxvz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/r77kekcwmje0oy6yoa5n.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class="image-caption"&gt;Column statistics in Amundsen (&lt;a href="https://eng.lyft.com/amundsen-lyfts-data-discovery-metadata-engine-62d27254fbb9"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Providing data lineage&lt;/strong&gt; also helps users learn about upstream dependencies. ETL jobs (e.g., scheduled via Airflow) can be linked to let users inspect scheduling and delays. This is helpful when evaluating data sources for production.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learning how to use via other user behavior
&lt;/h3&gt;

&lt;p&gt;After users have found the tables, how can we help them get started? A simple way is to &lt;strong&gt;show people associated with the table&lt;/strong&gt;. Owners can help with granting permission. Frequent users can help with a walk-through of the data and its idiosyncrasies. (Lyft’s and LinkedIn’s platforms include people as an entity that can be attached to a table). &lt;/p&gt;

&lt;p&gt;However, the availability of such gurus can be a bottleneck. A more scalable approach is to attach additional metadata to the table itself. &lt;/p&gt;

&lt;p&gt;To help users find the most relevant columns, we can provide &lt;strong&gt;column usage statistics&lt;/strong&gt; for each table. Also, users will need to learn which tables to join on. Providing a list of mostly &lt;strong&gt;commonly joined tables&lt;/strong&gt;, as well as the joining columns, can help with this. Getting such data requires query log parsing.&lt;/p&gt;

&lt;p&gt;To give users even greater detail on how the data is used, we can provide &lt;strong&gt;recent queries&lt;/strong&gt; on the table. Users can then examine how others are cleaning (which columns to apply &lt;code&gt;IS NOT NULL&lt;/code&gt; on) and filtering (how to filter on product category). This makes tribal knowledge more accessible. Spotify’s platform displays this, together with columns usage statistics and commonly joined tables.&lt;/p&gt;

&lt;p&gt;Another useful feature is &lt;strong&gt;data lineage&lt;/strong&gt;. This helps users learn about downstream tables that consume the current table, and perhaps the queries creating them. Users can learn how queries are adapted for different uses cases (i.e., tables) and reach out to downstream users to learn more. They might also find downstream tables that fully meet their requirements and use them directly. This reduces compute and storage costs. Several platforms support lineage, including Twitter’s &lt;a href="https://blog.twitter.com/engineering/en_us/topics/insights/2016/discovery-and-consumption-of-analytics-data-at-twitter.html"&gt;Data Access Layer&lt;/a&gt;, Uber’s &lt;a href="https://eng.uber.com/databook/"&gt;Databook&lt;/a&gt;, and Netflix’s &lt;a href="https://netflixtechblog.com/metacat-making-big-data-discoverable-and-meaningful-at-netflix-56fb36a53520"&gt;Metacat&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Before using the data in production, users will want to know how frequently it’s updated. Indicating &lt;strong&gt;how the data is partitioned&lt;/strong&gt; by time (e.g., day, hour) can help. Alternatively, data discovery platforms can integrate with an orchestrator like Airflow. Users can then examine scheduled ETL jobs and the time taken for them to complete. Lyft’s Amundsen has Airflow integration through I’m uncertain about the extent of it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wH05Uj_2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ciliv4f6uxrix7vfn0ft.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wH05Uj_2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ciliv4f6uxrix7vfn0ft.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class="image-caption"&gt;Task durations on Airflow (&lt;a href="https://www.agari.com/email-security-blog/airflow-agari/"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  High-level comparison across features
&lt;/h2&gt;

&lt;p&gt;I’ve compiled a high level comparison based on publicly available information. (Note: This is likely to be incomplete; please &lt;a href="https://twitter.com/eugeneyan"&gt;reach out&lt;/a&gt; if you have additional information!) A few observations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All platforms have free-text search (via Elasticsearch or Solr). Only Amundsen (Lyft) and Lexikon (Spotify) include recommendations on the home page.&lt;/li&gt;
&lt;li&gt;All platforms show basic table information (i.e., schema, description). Amundsen (Lyft) and Databook (Uber) include data previews and column statistics. &lt;/li&gt;
&lt;li&gt;Most platforms have data lineage built-in. A notable exception is Amundsen. Nonetheless, native data lineage is a priority in the &lt;a href="https://www.amundsen.io/amundsen/roadmap/"&gt;2020 roadmap&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt; Five platforms are open-sourced (we’ll discuss them below). Nonetheless, &lt;a href="https://engineering.atspotify.com/2020/02/27/how-we-improved-data-discovery-for-data-scientists-at-spotify/"&gt;Spotify has shared about Lexicon&lt;/a&gt; in great detail with a focus on product features. Maybe it’ll be open-sourced soon?
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;|                             | Search | Recommendations | Schemas &amp;amp; Description | Data Preview | Column Statistics | Space/cost metrics | Ownership | Top Users | Lineage | Change Notification | Open Source | Documentation | Supported Sources                                     | Push or Pull |
|-----------------------------|--------|-----------------|-----------------------|--------------|-------------------|--------------------|-----------|-----------|---------|---------------------|-------------|---------------|-------------------------------------------------------|--------------|
| Amundsen &lt;span class="o"&gt;(&lt;/span&gt;Lyft&lt;span class="o"&gt;)&lt;/span&gt;             | ✔      | ✔               | ✔                     | ✔            | ✔                 |                    | ✔         | ✔         | Todo    |                     | ✔           | ✔             | Hive, Redshift, Druit, RDBMS, Presto, Snowflake, etc. | Pull         |
| Datahub &lt;span class="o"&gt;(&lt;/span&gt;LinkedIn&lt;span class="o"&gt;)&lt;/span&gt;          | ✔      |                 | ✔                     |              |                   |                    | ✔         | ✔         | ✔       |                     | ✔           | ✔             | Hive, Kafka, RDBMS                                    | Push         |
| Metacat &lt;span class="o"&gt;(&lt;/span&gt;Netflix&lt;span class="o"&gt;)&lt;/span&gt;           | ✔      |                 | ✔                     |              | ✔                 | ✔                  |           | Todo      |         | Todo                | ✔           |               | Hive, RDS, Teradata, Redshift, S3, Cassandra          |              |
| Atlas &lt;span class="o"&gt;(&lt;/span&gt;Apache&lt;span class="o"&gt;)&lt;/span&gt;              | ✔      |                 | ✔                     |              |                   |                    |           |           | ✔       | ✔                   | ✔           | ✔             | HBase, Hive, Sqoop, Kafka, Storm                      | Push         |
| Marquez &lt;span class="o"&gt;(&lt;/span&gt;Wework             | ✔      |                 | ✔                     |              |                   |                    |           |           | ✔       |                     | ✔           |               | S3, Kafka                                             |              |
| Databook &lt;span class="o"&gt;(&lt;/span&gt;Uber&lt;span class="o"&gt;)&lt;/span&gt;             | ✔      |                 | ✔                     | ✔            | ✔                 |                    |           |           | ✔       |                     |             |               | Hive, Vertica, MySQL, Postgress, Cassandra            |              |
| Dataportal &lt;span class="o"&gt;(&lt;/span&gt;Airbnb&lt;span class="o"&gt;)&lt;/span&gt;         | ✔      |                 | ✔                     |              | ✔                 |                    | ✔         | ✔         |         |                     |             |               | Unknown                                               |              |
| Data Access Layer &lt;span class="o"&gt;(&lt;/span&gt;Twitter&lt;span class="o"&gt;)&lt;/span&gt; | ✔      |                 | ✔                     |              |                   |                    |           |           | ✔       |                     |             |               | HDFS, Vertica, MySQL                                  |              |
| Lexikon &lt;span class="o"&gt;(&lt;/span&gt;Spotify&lt;span class="o"&gt;)&lt;/span&gt;           | ✔      | ✔               | ✔                     |              |                   |                    | ✔         | ✔         |         |                     |             |               | Unknown                                               |              |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p class="image-caption"&gt;Scroll right 👉 (Is there a better way to do this in Markdown?)&lt;/p&gt;

&lt;h2&gt;
  
  
  Assessing five open source solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  DataHub (LinkedIn)
&lt;/h3&gt;

&lt;p&gt;LinkedIn’s DataHub started as &lt;a href="https://engineering.linkedin.com/blog/2016/03/open-sourcing-wherehows--a-data-discovery-and-lineage-portal"&gt;WhereHows&lt;/a&gt; (released in 2016). Since then, WhereHows has been re-architected (based on the &lt;a href="https://engineering.linkedin.com/blog/2019/data-hub"&gt;lessons&lt;/a&gt; they’ve learned) into DataHub. In the process, the monolithic WhereHows has been broken into two stacks: a modular UI frontend and a generalized metadata backend. DataHub was officially released on GitHub in &lt;a href="https://engineering.linkedin.com/blog/2020/open-sourcing-datahub--linkedins-metadata-search-and-discovery-p"&gt;Feb 2020&lt;/a&gt; and can be found &lt;a href="https://github.com/linkedin/datahub"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;DataHub has all the essential features including search, table schemas, ownership, and lineage. While WhereHows cataloged metadata data around a single entity (datasets), DataHub provides additional support for &lt;a href="https://github.com/linkedin/datahub/blob/master/docs/how/entity-onboarding.md"&gt;users and groups&lt;/a&gt;, with more entities (e.g., jobs, dashboards) &lt;a href="https://github.com/linkedin/datahub/blob/master/docs/features.md#data-constructs-entities"&gt;coming soon&lt;/a&gt;. It has good &lt;a href="https://github.com/linkedin/datahub#documentation"&gt;documentation&lt;/a&gt; and can be &lt;a href="https://github.com/linkedin/datahub/tree/master/docker"&gt;tested locally via docker&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mZpICR3h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nqn24a31wt5ee1nnyaig.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mZpICR3h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nqn24a31wt5ee1nnyaig.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class="image-caption"&gt;Ownership types on DataHub (&lt;a href="https://engineering.linkedin.com/blog/2019/data-hub"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;The open-source version supports metadata from Hive, Kafka, and relational databases. The internal version has support for additional &lt;a href="https://engineering.linkedin.com/blog/2020/open-sourcing-datahub--linkedins-metadata-search-and-discovery-p"&gt;data sources&lt;/a&gt; and more connectors might be made available publicly. &lt;/p&gt;

&lt;p&gt;Given the maturity of DataHub, it’s no wonder that it has been &lt;a href="https://github.com/linkedin/datahub#adoption"&gt;adopted&lt;/a&gt; at nearly 10 organizations include Expedia, Saxobank, ad Typeform. Also, 20+ other organizations are building a POC or evaluating the use of DataHub.&lt;/p&gt;

&lt;h3&gt;
  
  
  Amundsen (Lyft)
&lt;/h3&gt;

&lt;p&gt;Lyft wrote about Amundsen in &lt;a href="https://eng.lyft.com/amundsen-lyfts-data-discovery-metadata-engine-62d27254fbb9"&gt;April 2019&lt;/a&gt; and open-sourced it in &lt;a href="https://eng.lyft.com/open-sourcing-amundsen-a-data-discovery-and-metadata-platform-2282bb436234"&gt;Oct that year&lt;/a&gt;. Nonetheless, the &lt;a href="https://github.com/amundsen-io/amundsen"&gt;code&lt;/a&gt; has been available since Feb 2019 as part of the open-source soft launch. Since then, Amundsen has been working with early adopter organizations such as ING and Square. &lt;/p&gt;

&lt;p&gt;Amundsen helps us find data via search (with popularity ranking) and recommendations (via the home page). Table detail pages are rich with information including row previews, columns statistics, owners, and frequent users (if they’re made available). While Amundsen lacks native data lineage integration, it’s on the 2020 &lt;a href="https://www.amundsen.io/amundsen/roadmap/"&gt;roadmap&lt;/a&gt;. Other items on the roadmap including integration with a data quality system (&lt;a href="https://github.com/great-expectations/great_expectations"&gt;Great Expectations&lt;/a&gt; perhaps?), improving search ranking, and displaying commonly joined tables.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xPaXZb4v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q9sxugutst29a1ad3nnq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xPaXZb4v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q9sxugutst29a1ad3nnq.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class="image-caption"&gt;Amundsen's detail page (&lt;a href="https://github.com/amundsen-io/amundsen/"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Since its release, an amazing community has gathered around Amundsen. The community has contributed valuable features such as extractors for BigQuery and Redshift, integration with Apache Atlas, and markdown support for the UI. &lt;/p&gt;

&lt;p&gt;Amundsen has a rich set of &lt;a href="https://github.com/amundsen-io/amundsen#supported-integrations"&gt;integrations&lt;/a&gt;. This includes connecting to over 15 types of data sources (e.g., Redshift, Cassandra, Hive, Snowflake, and various relational DBs), three dashboard connectors (e.g., Tableau), and integration with Airflow. Many of these have been contributed by the community. It also has good &lt;a href="https://www.amundsen.io/amundsen/"&gt;documentation&lt;/a&gt; to help users get started and &lt;a href="https://www.amundsen.io/amundsen/developer_guide/#testing-amundsen-frontend-locally"&gt;test it locally&lt;/a&gt; via Docker. &lt;/p&gt;

&lt;p&gt;Despite being the new kid on the block, Amundsen has been popular and is &lt;a href="https://github.com/amundsen-io/amundsen#who-uses-amundsen"&gt;adopted&lt;/a&gt; at close to 30 organizations, including Asana, Instacart, iRobot, and Square. In July 2020, it joined the Linux AI Foundation as a &lt;a href="https://lfai.foundation/blog/2020/08/11/amundsen-joins-lf-ai-as-new-incubation-project/"&gt;new incubation project&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Metacat (Netflix)
&lt;/h3&gt;

&lt;p&gt;Netflix shared about &lt;a href="https://netflixtechblog.com/metacat-making-big-data-discoverable-and-meaningful-at-netflix-56fb36a53520"&gt;Metacat&lt;/a&gt; in Jun 2018. In addition to the usual features such as free-text search and schema details, it also includes metrics that can be used for analyzing cost and storage space. There’s also a push notification system for table and partition changes. This allows users to be notified of schema changes, or when a table is dropped so that infra can clean up the data as required.&lt;/p&gt;

&lt;p&gt;Metacat supports integrations for Hive, Teradata, Redshift, S3, Cassandra, and RDS. In addition to data discovery, Metacat’s goal is to make data easy to process and manage. Thus the emphasis on physical storage metrics (e.g., cost) and schema change notifications. Netflix also shared that it was working on schema and metadata data versioning and metadata validation. &lt;/p&gt;

&lt;p&gt;While &lt;a href="https://github.com/Netflix/metacat"&gt;Metacat is open source&lt;/a&gt;, there isn’t any documentation for it (currently &lt;code&gt;TODO&lt;/code&gt; on the project &lt;code&gt;README&lt;/code&gt;). There’s also no information about other organizations adopting Metacat. &lt;/p&gt;

&lt;h3&gt;
  
  
  Marquez (WeWork)
&lt;/h3&gt;

&lt;p&gt;WeWork shared about Marquez in &lt;a href="https://www.datacouncil.ai/talks/marquez-a-metadata-service-for-data-abstraction-data-lineage-and-event-based-triggers"&gt;Oct 2018&lt;/a&gt;, with a focus on data quality and lineage. (Additional &lt;a href="https://www.slideshare.net/WillyLulciuc/marquez-an-open-source-metadata-service-for-ml-platforms"&gt;slides&lt;/a&gt; on Marquez). It focuses on metadata data management including data governance and health (via Great Expectations), and catalogs both datasets and jobs.&lt;/p&gt;

&lt;p&gt;Marquez includes components for a &lt;a href="https://github.com/MarquezProject/marquez-web"&gt;web UI&lt;/a&gt; and &lt;a href="https://github.com/MarquezProject/marquez-airflow"&gt;Airflow&lt;/a&gt;, and has clients for &lt;a href="https://github.com/MarquezProject/marquez-java"&gt;Java&lt;/a&gt; and &lt;a href="https://github.com/MarquezProject/marquez-python"&gt;Python&lt;/a&gt;. While it’s easy to &lt;a href="https://github.com/MarquezProject/marquez#quickstart"&gt;test Marquez locally&lt;/a&gt; via docker, there isn’t much documentation on its &lt;a href="https://marquezproject.github.io/marquez/"&gt;website&lt;/a&gt; or &lt;a href="https://github.com/MarquezProject/marquez/tree/main/docs"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apache Atlas (Hortonworks)
&lt;/h3&gt;

&lt;p&gt;Atlas started incubation at Hortonworks in Jul 2015 as part of the Data Governance Initiative. It had engineers from Aetna, JP Morgan, Merck, SAS, etc. collaborating with Hortonworks. While initially focused on finance, healthcare, pharma, etc., it was &lt;a href="https://cwiki.apache.org/confluence/display/ATLAS/Atlas+Home"&gt;later extended&lt;/a&gt; to address data governance issues in other industries. Atlas 1.0 was released in Jun 2018 and it’s currently on &lt;a href="https://atlas.apache.org/#/WhatsNew-2.1"&gt;version 2.1&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Atlas’ primary goal is data governance and helping organizations meet their security and compliance requirements. Thus, it has rich features for tagging assets (e.g., sensitive, personally identifiable information), tag propagation to downstream datasets, and security on metadata access. It also has notifications on metadata changes. For data discovery, it has free-text search, schema details, and data lineage. It also includes &lt;a href="https://atlas.apache.org/#/SearchAdvance"&gt;advanced search&lt;/a&gt; where users can query via a syntax similar to SQL. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bAEZs8bQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oy5ifkqfhs3vx2tu98y9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bAEZs8bQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oy5ifkqfhs3vx2tu98y9.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class="image-caption"&gt;Personally identifiable information tag propagation on Atlas (&lt;a href="https://atlas.apache.org/#/ClassificationPropagation"&gt;source&lt;/a&gt;)&lt;/p&gt;
  

&lt;p&gt;Atlas supports integration with &lt;a href="https://atlas.apache.org/#/Architecture"&gt;metadata sources&lt;/a&gt; such as HBase, Hive, and Kafka, with more to be added in the future. It also allows users to create and update metadata entities via REST API. &lt;a href="https://atlas.apache.org/#/"&gt;Documentation for Atlas&lt;/a&gt; is comprehensive and the code can be found &lt;a href="https://github.com/apache/atlas"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  How other organizations have adopted these platforms
&lt;/h3&gt;

&lt;p&gt;Various organizations have shared their experiences with DataHub and Amundsen. Expedia &lt;a href="https://www.youtube.com/watch?v=ajcRdB22s5o"&gt;shared&lt;/a&gt; about evaluating both Atlas and DataHub and going into production with DataHub (the video also includes a demo). Square &lt;a href="https://developer.squareup.com/blog/using-amundsen-to-support-user-privacy-via-metadata-collection-at-square/"&gt;shared&lt;/a&gt; how they adopted Amundsen to support user privacy.&lt;/p&gt;

&lt;p&gt;It was particularly interesting to see how ING &lt;a href="https://medium.com/wbaa/facilitating-data-discovery-with-apache-atlas-and-amundsen-631baa287c8b"&gt;adopted both Atlas and Amundsen&lt;/a&gt;. Atlas handled metadata management, data lineage, and data quality metrics, while Amundsen focused on search and discovery. Table popularity scores were calculated via Spark on query logs to rank search results in Amundsen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N4N6SCvh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/w2cbd977qcqn140s7uc5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N4N6SCvh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/w2cbd977qcqn140s7uc5.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class="image-caption"&gt;How ING uses both Atlas and Amundsen (&lt;a href="https://medium.com/wbaa/facilitating-data-discovery-with-apache-atlas-and-amundsen-631baa287c8b"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;A few other companies shared how they evaluated various open source and commercial solutions (e.g., &lt;a href="https://www.slideshare.net/SheetalPratik/linkedinsaxobankdataworkbench#14"&gt;SaxoBank&lt;/a&gt;, &lt;a href="https://www.slideshare.net/SheetalPratik/linkedinsaxobankdataworkbench#14"&gt;SpotHero&lt;/a&gt;). Do you know of more? Please let me know!&lt;/p&gt;

&lt;h3&gt;
  
  
  Whale, a lightweight data discovery tool
&lt;/h3&gt;

&lt;p&gt;While not a full-fledged data discovery platform, &lt;a href="https://github.com/dataframehq/whale"&gt;Whale&lt;/a&gt; helps with indexing warehouse tables in markdown. This enables search, editing, and versioning.&lt;/p&gt;

&lt;p&gt;It’s still fairly new and not much is written about it yet. Given the lack of search and a UI, it seems targeted towards developers for now. Nonetheless, if you’re looking to try a lightweight solution, you might find it useful. &lt;a href="https://github.com/dataframehq/whale-bigquery-public-data"&gt;Testing&lt;/a&gt; it with data scraped from the Bigquery public project seems easy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not as sexy, but a critical first step
&lt;/h2&gt;

&lt;p&gt;While not as sexy as machine learning or deployment, data discovery is a crucial first step of the data science workflow. I’m glad more attention is being paid to it, and grateful for the teams open sourcing their solutions.&lt;/p&gt;

&lt;p&gt;Is your organization struggling with data discovery? If so, take a look at Amundsen, Atlas, and DataHub. Or if you’re trying to develop one in-house, consider how your features will help users answer their questions.&lt;/p&gt;

&lt;p&gt;How has your experience with data discovery platforms been? Would love to hear how they helped, and the challenges you faced.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://eng.lyft.com/amundsen-lyfts-data-discovery-metadata-engine-62d27254fbb9"&gt;Amundsen — Lyft’s Data Discovery &amp;amp; Metadata Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://eng.lyft.com/open-sourcing-amundsen-a-data-discovery-and-metadata-platform-2282bb436234"&gt;Open Sourcing Amundsen: A Data Discovery &amp;amp; Metadata Platform&lt;/a&gt; (&lt;a href="https://github.com/lyft/amundsen"&gt;Code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eng.lyft.com/amundsen-1-year-later-7b60bf28602"&gt;Amundsen: One Year Later&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.twitter.com/engineering/en_us/topics/insights/2016/discovery-and-consumption-of-analytics-data-at-twitter.html"&gt;Discovery and Consumption of Analytics Data at Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/airbnb-engineering/democratizing-data-at-airbnb-852d76c51770"&gt;Democratizing Data at Airbnb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eng.uber.com/databook/"&gt;Databook: Turning Big Data into Knowledge with Metadata at Uber&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://netflixtechblog.com/metacat-making-big-data-discoverable-and-meaningful-at-netflix-56fb36a53520"&gt;Metacat: Making Big Data Discoverable and Meaningful at Netflix&lt;/a&gt; (&lt;a href="https://github.com/Netflix/metacat"&gt;Code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://engineering.linkedin.com/blog/2019/data-hub"&gt;DataHub: A Generalized Metadata Search &amp;amp; Discovery Tool&lt;/a&gt; (&lt;a href="https://github.com/linkedin/datahub"&gt;Code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://engineering.atspotify.com/2020/02/27/how-we-improved-data-discovery-for-data-scientists-at-spotify/"&gt;How We Improved Data Discovery for Data Scientists at Spotify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://engineering.shopify.com/blogs/engineering/solving-data-discovery-challenges-shopify"&gt;How We’re Solving Data Discovery Challenges at Shopify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://engineering.fb.com/data-infrastructure/nemo/"&gt;Nemo: Data discovery at Facebook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://atlas.apache.org/#/"&gt;Apache Atlas: Data Goverance &amp;amp; Metadata Framework for Hadoop&lt;/a&gt; (&lt;a href="https://github.com/apache/atlas"&gt;Code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marquezproject.github.io/marquez/"&gt;Collect, Aggregate, and Visualize a Data Ecosystem's Metadata&lt;/a&gt; (&lt;a href="https://github.com/MarquezProject/marquez"&gt;Code&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;Thanks&lt;/strong&gt; to Yang Xinyi and Okkar Kyaw for reading drafts of this.&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>database</category>
      <category>tooling</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why Have a Data Science Portfolio and What It Shows</title>
      <dc:creator>Eugene Yan</dc:creator>
      <pubDate>Thu, 22 Oct 2020 04:12:02 +0000</pubDate>
      <link>https://dev.to/eugeneyan/why-have-a-data-science-portfolio-and-what-it-shows-3hab</link>
      <guid>https://dev.to/eugeneyan/why-have-a-data-science-portfolio-and-what-it-shows-3hab</guid>
      <description>&lt;p&gt;Thinking of building your data science portfolio? If we google for “data science portfolio”, we’ll get many results on “&lt;strong&gt;how&lt;/strong&gt;” to build one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Lb5u7TWq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/egd7i7p9kltujcrq2yh1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Lb5u7TWq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/egd7i7p9kltujcrq2yh1.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, most resources don’t discuss enough about the “&lt;strong&gt;why&lt;/strong&gt;” and the “&lt;strong&gt;what&lt;/strong&gt;”. Why work on personal projects and build a portfolio? What does a portfolio demonstrate, &lt;em&gt;other&lt;/em&gt; than technical skills?&lt;/p&gt;

&lt;p&gt;Whether you’re starting on your first or fifth personal project, I hope this will help you find a meaningful “why” and make projects more enjoyable and sustainable. &lt;strong&gt;We'll also hear from awesome creators on their motivations&lt;/strong&gt; for building and writing (please view in the original &lt;a href="https://eugeneyan.com/writing/data-science-portfolio-how-why-what/"&gt;post&lt;/a&gt;). In addition, we’ll discuss the various &lt;strong&gt;skills&lt;/strong&gt; (technical and non-technical) and &lt;strong&gt;traits&lt;/strong&gt; projects demonstrate so you can pick projects that better demonstrate your strengths.&lt;/p&gt;

&lt;p&gt;(Note: I’ll address portfolios and personal projects interchangeably. Nonetheless, portfolios can extend beyond personal projects to include work-related projects too.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting a job shouldn’t be the &lt;em&gt;only&lt;/em&gt; “Why”
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Getting a job&lt;/strong&gt; is usually the main reason for building a portfolio. Sometimes, it’s necessary if we don’t have the relevant education or experience. Nonetheless, it’s &lt;strong&gt;extrinsic&lt;/strong&gt; motivation, where we do something for an external reward (i.e., a job) and not for its own sake. This can &lt;a href="https://psycnet.apa.org/buy/1999-01567-001"&gt;reduce &lt;strong&gt;intrinsic&lt;/strong&gt; motivation&lt;/a&gt; and &lt;a href="https://www.verywellmind.com/what-is-the-overjustification-effect-2795386#mntl-sc-block_1-0-11"&gt;lead to dependence on external rewards&lt;/a&gt;. We might stop once we get that job or continuously fail (and don’t get rewarded).&lt;/p&gt;

&lt;p&gt;Thus, other than to get a job, we should also find intrinsic reasons for working on personal projects. These reasons will &lt;strong&gt;make the project naturally satisfying, where the work is its own reward&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One reason is &lt;strong&gt;to learn and practice&lt;/strong&gt;. Perhaps we’re fascinated by a branch of deep learning. Or we want to get more hands-on experience to hone our skills. Either way, the knowledge and skills gained are often transferable to work and will make us more effective data scientists. It also aligns with a key &lt;a href="https://www.mindtools.com/pages/article/autonomy-mastery-purpose.htm"&gt;factor of motivation&lt;/a&gt;: Mastery, the desire to improve. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Learning is a treasure that will follow its owner everywhere." — Chinese Proverb (学习是永远跟随主人的宝物)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Another reason is &lt;strong&gt;to help others&lt;/strong&gt;. This includes volunteering with non-profit organizations such as &lt;a href="https://www.datakind.org"&gt;DataKind&lt;/a&gt;, developing and releasing a helpful package, or sharing about what we’ve learned (via writing or talks). This aligns with another key motivation factor: Purpose, the desire to contribute to the bigger picture.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If you want to lift yourself up, lift up someone else." — Booker T. Washington&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finally, we do personal projects because they’re &lt;strong&gt;enjoyable&lt;/strong&gt;. We start projects for the sake of fun, or to scratch a “this should exist” itch. They could also be hobbies. Nonetheless, over time, it builds up to become an impressive portfolio created through consistent effort. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"It’s hard to beat someone who’s having fun.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the next section, we'll see some amazing personal projects and hear from their creators on their &lt;strong&gt;"why"&lt;/strong&gt;. Often, it's to scratch an itch, a way to learn, and to help others. &lt;/p&gt;

&lt;h2&gt;
  
  
  Portfolios come in &lt;em&gt;two&lt;/em&gt; flavors: Code and Content
&lt;/h2&gt;

&lt;p&gt;Most of the time, discussions on data science portfolios refer to &lt;strong&gt;code&lt;/strong&gt;. Such projects involve acquiring public data, performing statistical analysis, plotting visuals, or training machine learning models. It could also include contributions to open-source libraries, as well as data science competitions. Some people may obsess over how much code they write, but don’t sweat it if you’re not committing daily. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content-based&lt;/strong&gt; projects are less discussed. These are (technical) content you share via papers or writing online, or talks you give at conferences and meetups. It includes well-written READMEs on git repos, as well as video walkthroughs (e.g., how-tos, summaries, etc.). After we complete a code-based project, &lt;a href="https://eugeneyan.com/writing/why-you-need-to-follow-up-after-your-data-science-project/#dont-keep-your-awesome-work-to-yourselfshare-it"&gt;we should follow up by writing about it&lt;/a&gt; and share it so others can benefit from it too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Portfolios don’t &lt;em&gt;just&lt;/em&gt; demonstrate technical skills
&lt;/h2&gt;

&lt;p&gt;Most portfolios demonstrate &lt;strong&gt;skills &lt;em&gt;and&lt;/em&gt; traits&lt;/strong&gt;. On skills, &lt;strong&gt;both technical &lt;em&gt;and&lt;/em&gt; soft skills&lt;/strong&gt; are shown and important to hiring managers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technical skills&lt;/strong&gt; are straightforward to demonstrate and also the most observable. Code-based portfolios show we’re able to do the work and are another data point beyond the resume. They also help to earn trust with recruiters and hiring managers. Depending on the project, you can demonstrate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data acquisition and preparation (e.g., scrape some data, and format and clean it)&lt;/li&gt;
&lt;li&gt;Data storytelling (e.g., tell a story around the data, with statistics and visuals)&lt;/li&gt;
&lt;li&gt;Machine learning (e.g., train and deploy a model, with validation and metrics)&lt;/li&gt;
&lt;li&gt;Deployment (e.g., serve your machine learning app online for others to use)&lt;/li&gt;
&lt;li&gt;Software engineering (e.g., readability, maintainability, unit tests, documentation)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Portfolios also demonstrate &lt;strong&gt;soft skills&lt;/strong&gt;. Over the long term, they have as much, if not greater, impact on performance. Their effect is obvious when tackling nebulous problems and working with other people. They include: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solving problems from scratch: Problem framing and figuring out the right metrics &lt;/li&gt;
&lt;li&gt;Writing and talks: Ability to communicate, a key skill for an effective data scientist&lt;/li&gt;
&lt;li&gt;Teaching: Understanding of a subject and the ability to explain it simply&lt;/li&gt;
&lt;li&gt;Contributing to a project: Teamwork and ability to collaborate remotely on code&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;"In a high-IQ job pool, soft skills like discipline, drive, and empathy mark those who emerge as outstanding." — Daniel Goleman&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Beyond skills, portfolios also demonstrate traits&lt;/strong&gt;. These are seldom mentioned but I think they can be more important when making hiring decisions.&lt;/p&gt;

&lt;p&gt;Having personal projects demonstrate &lt;strong&gt;curiosity and passion&lt;/strong&gt;. It shows you’re curious to learn about something on your own. And working on it in your free time demonstrates you’ve more passion than 99% of people. Given the fast pace that tech—especially data and machine learning—evolves, this curiosity is essential to staying effective.&lt;/p&gt;

&lt;p&gt;It also shows &lt;strong&gt;willingness and ability to learn&lt;/strong&gt;. Working on projects exposes challenges not faced in MOOCs. How to clean data. How to explore the search space of data preparation, feature engineering, and machine learning. How to build a basic front-end. How to train and deploy in the cloud. These aren’t taught in MOOCs; the way to learn is through hands-on experience. Personal projects show self-learning beyond regular MOOCs.&lt;/p&gt;

&lt;p&gt;Finally, a portfolio is evidence of &lt;strong&gt;persistence&lt;/strong&gt;. Most data science projects are vague and difficult. If you’re new to programming, you might get frustrated with bugs and syntax errors, or mess up your virtual environment for the 128th time. You’ll also face less obvious issues such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to work with data that doesn’t fit in memory (e.g., images, click logs)&lt;/li&gt;
&lt;li&gt;How to make models converge faster, if they converge at all&lt;/li&gt;
&lt;li&gt;How to run experiments quickly and cheaply in the cloud&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Having a portfolio of non-beginner projects and being able to share the challenges faced while working on them demonstrates grit, which is a &lt;a href="https://www.forbes.com/sites/lisaquast/2017/03/06/why-grit-is-more-important-than-iq-when-youre-trying-to-become-successful/"&gt;good predictor of success&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When deciding between two similar entry/mid-level candidates, one who’s less technically qualified but is high on curiosity, grit, and learning ability (“traits”), and another who’s &lt;em&gt;only&lt;/em&gt; strong on technical skills (“tech-skills”), &lt;strong&gt;I’m more likely to hire on traits&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I’ve observed both tech-skills and traits candidates hired and their progress over time. The tech-skills candidate will start contributing value earlier. But with the right environment, challenges, and mentoring, the traits candidate will learn fast, outperform, and eventually deliver superior results.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hire for attitude, train for skill." – Herb Kelleher&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A great portfolio vs. the traits and skills to build one
&lt;/h2&gt;

&lt;p&gt;Job offers are sometimes attributed to having a great portfolio. That’s no surprise as portfolio artifacts are directly observable relative to skills and traits. (And occasionally, it’s bootcamps touting themselves.) However, I think it’s hard to distinguish if someone got a job because of an awesome portfolio, or because they had the skills and traits to build one.&lt;/p&gt;

&lt;p&gt;IMHO, the &lt;strong&gt;traits and skills are a prerequisite to building a great portfolio&lt;/strong&gt;. And they reinforce each other. As we work on a project, we gain hands-on experience and improve our technical and soft skills. It also hones our persistence and learning ability. The growth is then reflected in the next project—it’s a virtuous cycle.&lt;/p&gt;

&lt;p&gt;What’s more likely to help land a job? A great portfolio? Or the skills and traits to build one? The portfolio will help a resume stand out among the sea of resumes and get a first-round interview. But it’s the traits and skills that will secure the job offer and lead to high performance in the role.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don’t focus on the portfolio; focus on the process
&lt;/h2&gt;

&lt;p&gt;A portfolio is just an artifact of our skills, traits, and working process. It’s the destination; it’ll take care of itself if we focus on the journey.&lt;/p&gt;

&lt;p&gt;While trying to build our portfolios, we should find projects that are intrinsically rewarding. They should be fun, personally meaningful, and stretch our abilities—this makes it more sustainable. Over time, brick by brick, a portfolio emerges. It’ll take a while, so let’s get to work.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Thanks&lt;/strong&gt; to &lt;a href="https://twitter.com/fishnets88"&gt;Vincent Warmerdam&lt;/a&gt;, &lt;a href="https://twitter.com/alvations"&gt;Liling Tan&lt;/a&gt;, &lt;a href="https://twitter.com/JayAlammar"&gt;Jay Alammar&lt;/a&gt;, &lt;a href="https://twitter.com/amitness"&gt;Amit Chaudhary&lt;/a&gt;, and &lt;a href="https://twitter.com/DrElleOBrien"&gt;Elle O’Brien&lt;/a&gt; for generously sharing their work and process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks&lt;/strong&gt; to Yang Xinyi, &lt;a href="https://xdg.me"&gt;David Golden&lt;/a&gt;, &lt;a href="https://kylascanlon.com"&gt;Kyla Scanion&lt;/a&gt;, &lt;a href="https://rob.co.bb"&gt;Robert Cobb&lt;/a&gt;, &lt;a href="https://wearenotsaved.com"&gt;Ross Richey&lt;/a&gt;, and &lt;a href="https://www.compoundwriting.com/"&gt;Compound&lt;/a&gt; for reading drafts of this.&lt;/p&gt;
&lt;h2&gt;
  
  
  Great projects and why their creators built them
&lt;/h2&gt;

&lt;p&gt;Vincent Warmerdam has several projects listed on his &lt;a href="https://koaning.io/projects.html#skedulord"&gt;site&lt;/a&gt; and most of the &lt;a href="https://github.com/koaning?tab=repositories"&gt;code&lt;/a&gt; is open source. The projects are a combination of useful (e.g., &lt;a href="https://rasahq.github.io/whatlies/"&gt;word embedding visualizations&lt;/a&gt;, &lt;a href="https://scikit-lego.readthedocs.io/en/latest/"&gt;scikit-lego&lt;/a&gt;) and fun (e.g., &lt;a href="https://koaning.github.io/skedulord/"&gt;cron scheduler&lt;/a&gt;) and have great documentation. Here’s his take on why he builds and shares these projects:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Some of those tools (mainly; &lt;a href="https://rasahq.github.io/whatlies/"&gt;whatlies&lt;/a&gt;) are written as part of my job. So I gotta admit that I’m a ‘lil bit lucky there. A lot of the other tools originated more from a “this should exist”-feeling. I’ve learned a lot from making these tools, sure, but the reason why they exist is because it is scratching an itch.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Another great example is &lt;a href="https://github.com/alvations"&gt;Liling Tan’s work on NLP&lt;/a&gt;. He builds corpora and tools for NLP. This includes multilingual corpus, &lt;a href="https://github.com/alvations/pywsd"&gt;word sense disambiguation&lt;/a&gt;, and &lt;a href="https://github.com/alvations/charguana"&gt;“character vomiting”&lt;/a&gt;. There’s a mix of quirky and useful, and a lot of learning. Here’s why he built them and his advice on sharing code publicly (without being embarrassed):&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Usually it starts with scratching my own itch or satisfying some curiosity. For example, the &lt;a href="https://github.com/alvations/charguana"&gt;“character vomiting” tool&lt;/a&gt; was built to identify all possible unicode characters that can be generated for specific languages for an NLP task. So I dug into the &lt;a href="https://unicode.org/versions/Unicode13.0.0/"&gt;unicode specification&lt;/a&gt; and learned a whole lot about similarities and peculiarities of languages and how Unicode categorize different character sets.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Like viral TikTok videos, you’ll never know which open source becomes popular, so open sourcing your code often is a good way to expose yourself to feedbacks and sometimes get great ideas from feature requests. And for those that are afraid of people being critical at your code publicly, my two cents worth is never to be ashamed of the code you write/release, we all started from zero and everyone is constantly learning in the computing/data world, see &lt;a href="https://stackoverflow.com/questions/12453580/how-to-concatenate-items-in-a-list-to-a-single-string."&gt;how to concatenate strings&lt;/a&gt;.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://madewithml.com"&gt;Made With ML&lt;/a&gt; (MWML) has a &lt;a href="https://twitter.com/madewithml/status/1284503478685978625"&gt;thread of personal projects&lt;/a&gt; showcased on their platform. It includes applying research to product, building ML apps, as well as teaching and sharing about data science journeys. The MWML team shared that a few of these folks got hiring into computer vision and joined &lt;a href="https://www.wandb.com"&gt;Weights and Biases&lt;/a&gt;. (Also, here’s a great collection of projects from their &lt;a href="https://madewithml.com/collections/7828/ds-incubator-summer-2020/"&gt;DS Incubator&lt;/a&gt;.)&lt;/p&gt;
&lt;h2&gt;
  
  
  Great writing and why their creators share
&lt;/h2&gt;

&lt;p&gt;Jay Alammar’s &lt;a href="http://jalammar.github.io"&gt;site&lt;/a&gt; is a great example of amazing content-based projects. There’s virtually no one that learns about &lt;a href="http://jalammar.github.io/illustrated-transformer/"&gt;Transformers&lt;/a&gt; or &lt;a href="http://jalammar.github.io/illustrated-bert/"&gt;BERT, ELMo, and co.&lt;/a&gt; without Jay’s illustrated guides. It’s clear that he enjoys demystifying NLP techniques for the rest of the world, and puts in care and effort into creating his content. This is due to his curiosity and desire to help others understand research easier.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“My ML work is motivated by:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Intense curiosity about the topics I write about and fascination about the developments in NLP.&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Writing, visualizing, and publishing my work forces me to learn much deeper than if I was just to read a paper.&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Reading cutting-edge work in the field is often intimidating, I find. But I found if I give a certain concept enough time and focus, I can understand it in simpler terms than I would gleam from original papers. By elucidating my new-found understanding visually, I hope to make it easier for others to quickly grasp these concepts.&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;I love the collaborative and open sharing of code and concepts in software and ML fields. I’ve benefitted from incredible software, documentation, and research that people voluntarily put out there for everyone. I want to be a part of that virtuous cycle.”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Along the same vein, Amit Chaudhary writes weekly to explain machine learning concepts using diagrams, animations, and intuition. It’s part of his approach of taking small steps to get better at his craft. I enjoyed his breakdown of &lt;a href="https://amitness.com/2020/07/checklist/"&gt;behavioral testing for NLP models&lt;/a&gt; and &lt;a href="https://amitness.com/2020/08/information-retrieval-evaluation/"&gt;information retrieval evaluation metrics&lt;/a&gt;. It started as a hobby and has since helped him make new friends.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“I initially started writing just as a hobby to share what I was learning. In the process of helping others, it turned out to be a great way to discover my interest areas, connect with interesting people in the ML space, and build a portfolio. I feel everyone faces some unique challenges and resource gaps in their space and can help fill that gap through their writing.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Another interesting example is Elle O’Brien’s writing. Her content is data science with a touch of quirky. I enjoyed her content on using machine learning to &lt;a href="https://pudding.cool/2018/05/cookies/#conclusion"&gt;bake the most average cookie&lt;/a&gt; and &lt;a href="https://pudding.cool/2019/11/big-hair/"&gt;visualizing big data of big hair&lt;/a&gt; (mouse over the visuals!). They go beyond the cookie-cutter content we see on Medium. Here's her process of using side projects to learn and pay it forward, which also led to her current role.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“I use side projects as a way to motivate myself to learn data science techniques really thoroughly. For example, once I realized you could teach neural networks to generate completely ridiculous content, I figured I could finally know how a computer would make up romance novel titles. And that started me wanting to use deep learning.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;My process is to start with a question, go wherever that question takes me, and then share the project. Sharing your work is important. &lt;em&gt;Everything&lt;/em&gt; I learned about the practical, hands-on aspects of data science, I learned, from people who have shared their software and their datasets and their thinking. So sharing is “paying it forward”. It also helps you build credentials and network; I got my current job through Twitter after I shared a project using a generative adversarial network.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Something worth noting: When I did these side projects, I was doing a doctoral degree that was teaching a lot, but not much about modern machine learning (all the action happening the last few years in deep learning, for example). Side projects made sure I was establishing some credentials there, so I’d be able to get the jobs I wanted when I graduated. And also so I didn’t “miss out” on all the action :) ”&lt;/em&gt;&lt;/p&gt;



</description>
      <category>datascience</category>
      <category>learning</category>
      <category>career</category>
    </item>
    <item>
      <title>How to Install Google’s Scalable Nearest Neighbors (ScaNN) on Mac</title>
      <dc:creator>Eugene Yan</dc:creator>
      <pubDate>Thu, 15 Oct 2020 02:44:49 +0000</pubDate>
      <link>https://dev.to/eugeneyan/how-to-install-google-s-scalable-nearest-neighbors-scann-on-mac-64l</link>
      <guid>https://dev.to/eugeneyan/how-to-install-google-s-scalable-nearest-neighbors-scann-on-mac-64l</guid>
      <description>&lt;p&gt;A few months back, Google shared about Scalable Nearest Neighbors, &lt;a href="https://ai.googleblog.com/2020/07/announcing-scann-efficient-vector.html" rel="noopener noreferrer"&gt;ScaNN&lt;/a&gt; (&lt;a href="https://arxiv.org/abs/1908.10396" rel="noopener noreferrer"&gt;Paper&lt;/a&gt;, &lt;a href="https://github.com/google-research/google-research/tree/master/scann" rel="noopener noreferrer"&gt;Code&lt;/a&gt;) for efficient vector similarity search. It seemed to beat the SOTA benchmarks on angular distance (i.e., &amp;gt;2x throughput for a given recall level).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0t0f7nbf6x5yj0851dfg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0t0f7nbf6x5yj0851dfg.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
ANN Benchmarks on the GloVe embeddings (dim=100) (&lt;a href="https://ai.googleblog.com/2020/07/announcing-scann-efficient-vector.html" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Recently, I found some time to try it out but was frustrated by how tricky it was to install on a Mac. Here are the steps I took to install it successfully.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step-by-step walkthrough
&lt;/h2&gt;

&lt;p&gt;First, we install the necessary compilers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;bazel
brew &lt;span class="nb"&gt;install &lt;/span&gt;llvm
brew &lt;span class="nb"&gt;install &lt;/span&gt;gcc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we set up our Python version via &lt;code&gt;pyenv&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; brew upgrade pyenv
pyenv &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; pyenv 1.2.21

pyenv &lt;span class="nb"&gt;install &lt;/span&gt;3.8.6. &lt;span class="c"&gt;# Doesn't work with 3.9 yet&lt;/span&gt;
pyenv &lt;span class="nb"&gt;local &lt;/span&gt;3.8.6
python &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Python 3.8.6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we create our virtual environment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; pip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ScaNN&lt;/code&gt; is part of the &lt;a href="https://github.com/google-research/google-research" rel="noopener noreferrer"&gt;google-research repo&lt;/a&gt; which is huge. There are more than 200 directories in there and we don’t need all of them. Thus, we’ll do the following to only checkout the ScaNN directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--depth&lt;/span&gt; 1 &lt;span class="nt"&gt;--filter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;blob:none &lt;span class="nt"&gt;--no-checkout&lt;/span&gt; https://github.com/google-research/google-research.git
git checkout master &lt;span class="nt"&gt;--&lt;/span&gt; scann
&lt;span class="nb"&gt;cd &lt;/span&gt;scann
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we’ll need to install the Python dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;wheel
python configure.py
&lt;span class="c"&gt;# There might be complaints about "tensorflow 2.3.1 requires numpy&amp;lt;1.19.0,&amp;gt;=1.16.0, but you'll have numpy 1.19.2 which is incompatible." but it's fine&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Several issues prevent a direct installation and we’ll be manually fixing them here. &lt;/p&gt;

&lt;p&gt;First, we’ll update &lt;code&gt;.bazelrc&lt;/code&gt; and &lt;code&gt;.bazel-query.sh&lt;/code&gt;. (It’s not absolutely necessary to update &lt;code&gt;.bazel-query.sh&lt;/code&gt; but I thought we do it anyway for completeness). We should replace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;TF_SHARED_LIBRARY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ensorflow_framework.2"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;TF_SHARED_LIBRARY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"libtensorflow_framework.2.dylib"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we’ll need to update the C++ imports by replacing (there are four of these):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;hash_set&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;ext/hash_set&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we can build it via &lt;code&gt;bazel&lt;/code&gt;. Instead of using &lt;code&gt;clang-8&lt;/code&gt; as specified, I just used the latest version of &lt;code&gt;clang&lt;/code&gt; and it worked fine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;CC&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;llvm&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;clang&lt;/span&gt; &lt;span class="n"&gt;CXX&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt; &lt;span class="n"&gt;bazel&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;opt&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;copt&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="n"&gt;mavx2&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;copt&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="n"&gt;mfma&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;cxxopt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"-D_GLIBCXX_USE_CXX11_ABI=0"&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;cxxopt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"-std=c++17"&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;copt&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="n"&gt;fsized&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;deallocation&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;copt&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;build_pip_pkg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it builds successfully, we should see output similar to this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;INFO: Elapsed &lt;span class="nb"&gt;time&lt;/span&gt;: 316.366s, Critical Path: 206.32s
INFO: 1066 processes: 319 internal, 747 local.
INFO: Build completed successfully, 1066 total actions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we build the Python wheel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./bazel-bin/build_pip_pkg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now we can install it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;scann-1.1.1-&amp;lt;replace with your package suffix&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can test if the installation was successful in Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;scann&lt;/span&gt;
&lt;span class="n"&gt;scann&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scann_ops_pybind&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nc"&gt;Traceback &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;stdin&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nb"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;missing&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="n"&gt;positional&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;db&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;num_neighbors&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;distance_measure&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should get the error if installation was successful. Here’s a &lt;a href="https://github.com/google-research/google-research/blob/master/scann/docs/example.ipynb" rel="noopener noreferrer"&gt;sample demo on using it&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How Prototyping Can Help You to Get Buy-In</title>
      <dc:creator>Eugene Yan</dc:creator>
      <pubDate>Mon, 12 Oct 2020 01:06:34 +0000</pubDate>
      <link>https://dev.to/eugeneyan/how-prototyping-can-help-you-to-get-buy-in-23m</link>
      <guid>https://dev.to/eugeneyan/how-prototyping-can-help-you-to-get-buy-in-23m</guid>
      <description>&lt;p&gt;Sometimes, well-thought-out proposals backed by extensive research and data will fail to convince decision-makers. But a demo of a simple prototype will get them excited and ready to commit. I'm surprised how often this happens.&lt;/p&gt;

&lt;p&gt;While we should still &lt;a href="https://eugeneyan.com/writing/what-i-do-before-a-data-science-project-to-ensure-success/#first-draw-the-map-to-the-destination-one-pager"&gt;start projects with a one-pager&lt;/a&gt; to clarify, socialize, and get feedback on our ideas, if we're not making headway, one option is to build and demo a prototype. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why prototypes work: They're more concrete
&lt;/h2&gt;

&lt;p&gt;Prototypes make &lt;strong&gt;our vision more accessible&lt;/strong&gt;. For non-technical laymen, ideas and designs can be &lt;em&gt;too abstract&lt;/em&gt;. It’s hard to imagine the end-user experience from a document. In contrast, prototypes—especially those with a graphical user interface (GUI)—make it easier to understand the deliverable's look and feel. By helping others understand our ideas better, we increase our chances of getting buy-in.&lt;/p&gt;

&lt;p&gt;Prototypes also serve as &lt;strong&gt;proof of technology&lt;/strong&gt;. What we claim to do with data and machine learning can be a stretch. (That said, the reverse, where we’re expected to do magic with a 500-row excel, also happens.) While trying to get buy-in, I’m occasionally met with skepticism—“Is that &lt;em&gt;really&lt;/em&gt; doable?” By building a prototype, the proposal becomes real and achievable, making it easier to convince decision-makers.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"It always seems impossible until it is done." – Nelson Mandela&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Last, prototypes make it &lt;strong&gt;easier to get feedback&lt;/strong&gt;. Instead of attending a presentation or reading a proposal, people can interact with our app. They can test it with their data (e.g., product images, user interactions) and see the outcomes. By letting them interact with a prototype of our proposed idea, we increase our chances of getting feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  But prototypes don't explain "Why"
&lt;/h2&gt;

&lt;p&gt;While prototypes can show "What does it look like?" and "How will it work?", &lt;strong&gt;they don't explain “Why should we build it?”&lt;/strong&gt; Thus, if the &lt;em&gt;"why"&lt;/em&gt; for the project is still unclear, we're better off writing a &lt;a href="https://eugeneyan.com/writing/what-i-do-before-a-data-science-project-to-ensure-success/#first-draw-the-map-to-the-destination-one-pager"&gt;one-pager&lt;/a&gt; to clarify the problem, intent, and success criteria. Else, it doesn’t matter how well our prototype works if it doesn't solve the &lt;em&gt;right&lt;/em&gt; problem.&lt;/p&gt;

&lt;p&gt;Also, &lt;strong&gt;depending on the scale of the project, a quick prototype may not be viable&lt;/strong&gt;. Large scale projects (e.g., drone delivery, self-driving cars, in-house ML platform) will need significant resources and can't be prototyped in a week or two. Getting a first prototype off the ground might require months, if not years.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a prototype worked when a roadmap didn’t
&lt;/h2&gt;

&lt;p&gt;In a previous role, I tried convincing stakeholders that our team should start working on computer vision. We had a massive catalog of product images and could use it to serve customers better. We would start with image classifiers to improve product categorization, before adapting them for image search and recommendation.  &lt;/p&gt;

&lt;p&gt;However, I failed to get buy-in. Some felt that our team lacked the expertise (read: "You won't be able to do it") and that it wasn’t a viable business opportunity.&lt;/p&gt;

&lt;p&gt;I was disappointed but undeterred. If I couldn’t build it at work, I would have to build it in my free time. Using image data scraped from Amazon, I hacked together a &lt;a href="https://en.wikipedia.org/wiki/Theano_(software)"&gt;&lt;code&gt;Theano&lt;/code&gt;&lt;/a&gt; implementation (it was a &lt;em&gt;while&lt;/em&gt; back) of &lt;a href="https://en.wikipedia.org/wiki/Residual_neural_network"&gt;ResNet&lt;/a&gt; and applied transfer learning for &lt;a href="https://eugeneyan.com/writing/image-categorization-is-now-live/"&gt;image classification&lt;/a&gt;. To build &lt;a href="https://eugeneyan.com/writing/image-search-is-now-live/"&gt;image search&lt;/a&gt;, I used embeddings from the penultimate layer and calculated cosine similarity. This took months to learn and build but it worked decently.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t8ebQBgz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1otqahh17n29femmubg1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t8ebQBgz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1otqahh17n29femmubg1.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class="image-caption"&gt;Demo of image classifier and image search on fashion products&lt;/p&gt;

&lt;p&gt;The effort was well worth it. Stakeholders were clearly excited when I demo-ed the prototypes. In particular, they found image-based search &amp;amp; recommendation to be a compelling use case, especially for visual shopping (e.g., fashion, furniture, toys). (A big chunk of transactions came from fashion.) This kickstarted our effort to invest in GPU clusters and work on computer vision applications. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L8mcSY6m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/u3gh9qjxk9fu9ttz341m.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L8mcSY6m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/u3gh9qjxk9fu9ttz341m.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5XNmC1hP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q6lapus3zoi73p0ldwww.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5XNmC1hP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q6lapus3zoi73p0ldwww.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class="image-caption"&gt;Image search on toys and furniture&lt;/p&gt;

&lt;p&gt;In 2018, the image search feature went live on the app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s1ijxEMB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/34a64yu9or7b11w2tljf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s1ijxEMB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/34a64yu9or7b11w2tljf.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class="image-caption"&gt;Now customers can visually search for products via photos (&lt;a href="https://liveatpc.com/lazada-introduces-ai-powered-image-search-feature/"&gt;source&lt;/a&gt;)&lt;/p&gt;
&lt;h2&gt;
  
  
  How to build a prototype now?
&lt;/h2&gt;

&lt;p&gt;Many libraries make it easier to build and deploy machine learning prototypes in &lt;code&gt;Python&lt;/code&gt;. For web application frameworks, &lt;a href="https://palletsprojects.com/p/flask/"&gt;&lt;code&gt;Flask&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://bottlepy.org/docs/dev/"&gt;&lt;code&gt;Bottle&lt;/code&gt;&lt;/a&gt; are widely used while &lt;a href="https://fastapi.tiangolo.com"&gt;&lt;code&gt;FastAPI&lt;/code&gt;&lt;/a&gt; is gaining popularity. I recently switched to &lt;code&gt;FastAPI&lt;/code&gt; and like it very much. Here’s a &lt;a href="https://amitness.com/2020/06/fastapi-vs-flask/"&gt;great comparison&lt;/a&gt; for &lt;code&gt;Flask&lt;/code&gt; users by &lt;a href="https://twitter.com/amitness"&gt;Amit Chaudhary&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To build a basic front-end, we can use a combination of &lt;a href="https://palletsprojects.com/p/jinja/"&gt;&lt;code&gt;Jinja&lt;/code&gt;&lt;/a&gt; templates and &lt;a href="https://www.w3.org/Style/CSS/Overview.en.html"&gt;&lt;code&gt;CSS&lt;/code&gt;&lt;/a&gt;, and perhaps a framework like &lt;a href="https://getbootstrap.com"&gt;&lt;code&gt;Bootstrap&lt;/code&gt;&lt;/a&gt;. &lt;a href="https://www.streamlit.io"&gt;&lt;code&gt;Streamlit&lt;/code&gt;&lt;/a&gt; is also a popular option. (I haven’t tried &lt;code&gt;Streamlit&lt;/code&gt; though and would love to hear your experience with it.)&lt;/p&gt;

&lt;p&gt;To serve our prototype, we can use &lt;a href="https://www.docker.com"&gt;&lt;code&gt;Docker&lt;/code&gt;&lt;/a&gt; to wrap and deploy it in a &lt;a href="https://www.docker.com/resources/what-container"&gt;container&lt;/a&gt;. For cloud servers, I tend to use Amazon Elastic Compute Cloud (EC2) &lt;a href="https://aws.amazon.com/ec2/spot/"&gt;spot instances&lt;/a&gt; as they’re cheap. There are also options such as &lt;a href="https://www.heroku.com"&gt;Heroku&lt;/a&gt; and &lt;a href="https://www.digitalocean.com"&gt;Digital Ocean&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Not sure how to get started? Here are a couple of additional resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://testdriven.io/blog/fastapi-machine-learning/"&gt;Deploying machine learning with FastAPI and Heroku&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eugeneyan.com/writing/how-to-set-up-html-app-with-fastapi-jinja-forms-templates/"&gt;Setting up FastAPI with Jinja, Forms, and Templates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eugeneyan.com/writing/fastapi-html-checkbox-download/"&gt;Adding a checkbox and download button to a FastAPI web app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Learn from my mistake with an early prototype: &lt;code&gt;curl&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;One of my first machine learning projects was a title-based product classifier. I was able to build a system that achieved 95% accuracy and was looking to get user feedback. Thus, I wrapped it in a &lt;code&gt;Flask&lt;/code&gt; app and deployed it on our internal servers. &lt;/p&gt;

&lt;p&gt;To use the product classifier, all you had to do was to update the product title in the &lt;a href="https://curl.haxx.se/docs/manpage.html"&gt;&lt;code&gt;curl&lt;/code&gt;&lt;/a&gt; command below. It was as simple as it could get (or so I thought). After sharing the &lt;code&gt;curl&lt;/code&gt; command and API specs with business and ops stakeholders, I eagerly monitored the logs for my first users.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"title":"title of product"}'&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://internal-url/categorize
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No one used it 😞. I learned that most of my stakeholders were on windows machines and didn’t have easy access to &lt;code&gt;curl&lt;/code&gt;. They were also unfamiliar with using the terminal or a tool like &lt;a href="https://blog.postman.com/curl-and-postman-work-wonderfully-together/"&gt;Postman&lt;/a&gt;—I had to simplify it further.&lt;/p&gt;

&lt;p&gt;To get around this, I spent some time building a simple front-end (the predecessor to the image classifier and image search UI) and shared my prototype again. This time around, instead of a &lt;code&gt;curl&lt;/code&gt; command, stakeholders received a web url.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kWFSp0Ja--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rkmv5kcc05rkn8s1zwf9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kWFSp0Ja--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rkmv5kcc05rkn8s1zwf9.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class="image-caption"&gt;A simple GUI for product classification&lt;/p&gt;

&lt;p&gt;The result? My tiny two-thread &lt;code&gt;Flask&lt;/code&gt; server crashed from too many concurrent requests. &lt;/p&gt;

&lt;p&gt;I learned a valuable lesson from this experience: No matter how good your tech is, non-technical users are unlikely to try unless it has a GUI and is easy to use. Since then, I’ve always taken the time to add a simple GUI to my prototypes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try building a prototype early in your next project
&lt;/h2&gt;

&lt;p&gt;Are you having difficulty communicating your vision and getting buy-in? Why not spend a week or two building a prototype? You'll be surprised how effective they can be. &lt;/p&gt;

&lt;p&gt;Do you have stories and experiences of prototypes helping to push a project forward? I would love to hear about them in the comments below.&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>productivity</category>
      <category>career</category>
    </item>
  </channel>
</rss>
