Привет всем! Добро пожаловать в специальный выпуск Code Review, нашу еженедельную серию задач по программированию и материалов, связанных с работой. В этом посте я расскажу об одном из моих любимых побочных проектов, Кормилец, и о том, как вы можете произвести впечатление на будущих работодателей, изменив свои навыки программирования и решения проблем! Я расскажу, из чего можно сделать отличный побочный проект и как рассказать о своих проектах в резюме и на собеседованиях.

Поиск отличных идей для проектов

С технической точки зрения, хорошая идея проекта - это, пожалуй, наименее важная часть любого хорошего побочного проекта. Но поверьте мне, убедительный проект, решающий реальную проблему, производит большее впечатление на собеседника, чем другое «приложение-будильник». Так как же вам найти отличные проектные идеи?

У вас может быть своя собственная, но поскольку вы разработчик, скорее всего, вы знаете, что кто-то умеет находить интересные проблемы, которые нужно решить. Лично я связался с основателем первой компании, в которой я работал, Nis Frome. У предпринимателей есть опыт решения проблем, и я обнаружил, что у них обычно есть накопившиеся идеи, большие и маленькие. Вы, вероятно, знаете больше, чем несколько человек, которые хотели бы стать партнером.

У Ниса было несколько проектов, над которыми он хотел работать, но один, в частности, требовал передовых технологий, что сделало его привлекательным для меня. Сегодня этот проект называется Кормильцы, и он решает проблему, которой очень увлечен Нис: помогать людям в его сети найти работу в компаниях, входящих в его сеть.

Каждую неделю Ниш получает 5–6 запросов от соискателей с просьбой познакомить его с компаниями, с которыми у него есть контакты. До Breadwinnerss Нис проводил время, просматривая страницы карьеры компаний в своей сети, чтобы найти совпадения и вступления. Кормильцы были рождены, чтобы облегчить часть этой ручной работы. По сути, мы создали массивный веб-скребок, который очищает страницы вакансий и объединяет вакансии в одну прямую ленту (что-то вроде RSS-ленты… поняли? Кормильцы?). Таким образом, когда кто-то запрашивает у Ниса вступительное слово, он может просто отправить ему одну ссылку на его ленту Breadwinnerss, где пользователь может запросить заставки для любых ролей, которые им интересны, в десятках компаний. Уже сейчас Нис и другие наши пользователи помогли нескольким людям получить действительно классную новую работу.

Развивайте свои навыки разработки

Основной целью этого побочного проекта было обучение, поэтому я специально выбрал технологии, с которыми раньше не работал. Это отличный повод для разговора в интервью. Это возможность показать вашему собеседнику, что именно вы можете делать, когда сталкиваетесь с новыми или незнакомыми технологиями, что, по сути, будет происходить практически на каждой новой работе, которую вы когда-либо выполняете.

При этом не нужно изобретать велосипед. Для Breadwinnerss я выбрал Javascript с полным стеком, потому что это то, с чем мне комфортно, но я выбрал почти все новые фреймворки и инструменты для работы с ним. Я использовал Узел и библиотеки парсинга под названием Cheerio и Puppeteer для создания парсера. Я развернул это в функции Google Cloud, которая работает ежедневно. Сам скрипт парсера очищает страницу карьеры каждой компании с помощью созданной мной специальной функции парсера и сохраняет все эти результаты в файл в корзине AWS S3. Часть веб-приложения Breadwinnerss также построена с использованием Node, с express в качестве среды маршрутизации и Postgres в качестве базы данных. Интерфейс был построен с использованием Vue.js. Веб-приложение считывает скопированные задания из s3 и передает их клиентской части. Он живет на Heroku.

filterDepts (data, $) {
  // needed to capture the class instance (at this point the ‘this’    context) which becomes the document in the cheerio callbacks ‘this’ context
  const that = this
  const filteredDepts = data.filter(function () {
    const dept = $(this).closest(‘.ptor-jobs-list__department-section’).find(‘h2’).text()
    return utils.myFilter(that.targetDepts, that.badDepts, dept)
  })
  const ret = []
  filteredDepts.each(function () {
    const jobTitle = $(this).find(‘a’).text()
    const url = $(this).find(‘a’).attr(‘href’)
    const location = $(this).find(‘.ptor-jobs-list__item-location’).text()
    ret.push({
      jobTitle,
      location,
      url
    })
  })
  return ret
}
filterJobs (jobs) {
  return _.filter(jobs, (job) => _.includes(usCities, job.location))
}

Подчеркните технические проблемы и решения

В значительной степени технические собеседования - это, по сути, одно большое имитационное упражнение по решению проблем. Можете ли вы устранить неполадки? Вы можете быстро учиться? Можете ли вы прыгнуть в изменчивую среду и адаптироваться? При создании проекта важно подчеркнуть, как вы решали технические проблемы - это снизит давление во время собеседования.

Одним из самых больших изменений, которые мы внесли в архитектуру приложения, стало изменение того, как и когда происходило фактическое сканирование. Когда мы начинали, первоначальная проверка концепции предназначалась только для Ниша и вычеркивала 8–10 компаний из его сети. Естественно, я просто просмотрел каждую компанию на странице загрузки корма Nis ’Breadwinnerss. Парсер был связан с кодом веб-приложения и получал последний список заданий каждый раз, когда кто-то заходил в ленту. Это действительно работало для нас довольно долгое время, и именно поэтому наш MVP позволил нам выпустить раннюю рабочую версию. Некоторые люди могут подумать, что изучение 5 вещей сразу и совершенствование технического стека перед выпуском будет выглядеть очень впечатляюще, но чаще всего это просто мешает вам когда-либо выпустить его.

Это было нормально, пока мы не проанализировали около 20 компаний. В этот момент запрос очищенных заданий занимал больше времени, чем максимально допустимый Heroku для выполнения запроса (около 30 секунд). Это было тогда, когда мы решили кэшировать результаты каждой очистки в файле в корзине S3. Мы также переместили код парсера в автономный модуль, который мы развернули в облачных функциях Google для ежедневного запуска в cron. Все это позволило фидам, которые загружались быстро, и ~ 100 компаниям, которые мы теперь включаем в анализ каждый вечер.

async function processCompanies (browser, companies) {
  const processedCompanies = []
  for (const connectorCompany of companies) {
    const { target_jobs, bad_jobs, target_depts, bad_depts, module_name, scrape_url, base_url, companies_name, company_url, type } = connectorCompany
    console.log(`Scraping ${module_name}…`)
    const companyModule = require(`./companies/${module_name}.js`)
    const connectorCompanyModule = new companyModule(target_jobs, bad_jobs, target_depts, bad_depts, scrape_url, base_url, companies_name, company_url, type)
    const result = await scrape(connectorCompanyModule, browser)
    processedCompanies.push(result)
  }
  return processedCompanies
}

Продемонстрируйте проекты в своем резюме

Большинство разработчиков уже добавили свои профили на GitHub в свое резюме. Если ваш проект находится в публичном репо, опытные рекрутеры могут его проверить. Но это, по сути, похоронение того, что дает вам значительное преимущество.

Я бы порекомендовал вместо этого создать специальный раздел, чтобы описать ваш проект, любые передовые технологии, использованные для его создания, и любые рыночные возможности или подтверждения, которые у вас есть, такие как количество пользователей или даже доход.

Основные выводы

В общем, вот 4 моих основных совета, когда дело доходит до создания побочного проекта:

1. Найдите и решите серьезную проблему.
2. Используйте проект как возможность поработать с новыми технологиями.
3. Итерируйте! Создайте быстрый прототип менее чем за месяц, а затем улучшите его на основе отзывов пользователей.
4. Сотрудничайте с друзьями, с которыми вам обычно не удается работать. Побочные проекты не должны быть одинокими!

Посмотрите код на github!

Мы сочли важным сделать код общедоступным, чтобы другие люди могли узнать о том, как мы создавали этот проект. Зайдите на github и поделитесь с нами своим мнением.