如何打造一个能给未来雇主留下深刻印象的副业

2025-05-24

如何打造一个能给未来雇主留下深刻印象的副业

大家好!欢迎来到《代码回顾》特别版,这是我们每周推出的编程挑战和工作相关内容系列。在这篇文章中,我将讨论我最喜欢的业余项目之一——Breadwinnerss,以及如何通过展示你的编程和解决问题的能力来打动未来的雇主!我将讲解如何打造一个优秀的业余项目,以及如何在简历和面试中展现你的项目。

请记住,如果您喜欢此内容并希望获得更多,请在此处订阅我们的时事通讯,以接收我们在 Dev.to 和Coderbyte上发布的最新和最精彩的内容

寻找出色的项目创意

从技术角度来看,好的项目创意或许是任何优秀副业中不重要的部分。但是,相信我,一个能够解决实际问题的引人入胜的项目,比一个“闹钟应用”更能打动面试官。那么,如何找到优秀的项目创意呢?

你可能也有自己的问题,但既然你是一名开发者,你很可能认识一些擅长发现并解决棘手问题的人才。就我个人而言,我联系上了我在Nis Frome工作的第一家公司的创始人。企业家们通常都擅长解决问题,而且我发现他们通常有很多想法,无论大小。你可能认识不少愿意合作的人。

Nis 有很多想参与的项目,但其中一个项目特别需要一些尖端技术,这对我来说很有吸引力。如今,这个项目名为“Breadwinnerss”,它解决了 Nis 非常热衷的一个问题:帮助他的人脉圈内的人在他的公司里找到工作。

Nis 每周都会收到 5-6 个求职者的请求,要求我们为他介绍一些他有关系的公司。在推出 Breadwinnerss 之前,Nis 需要花时间浏览其人脉网络中公司的招聘页面,以进行匹配和介绍。Breadwinnerss 的诞生正是为了帮助减轻这些手动工作。我们本质上构建了一个庞大的网络抓取工具,它可以抓取招聘页面并将职位聚合到一个实时信息流中(有点像 RSS 信息流……明白了吗?Breadwinnerss?)。这样,当有人要求 Nis 提供介绍时,他只需向他们发送一个 Breadwinnerss 信息流的链接,用户可以在该链接中请求数十家公司中他们感兴趣的任何职位的介绍。Nis 和我们的其他用户已经帮助一些人找到了非常棒的新工作。

替代文本

展现你的开发技能

这个副项目的主要目标是学习,所以我特意挑选了一些我之前很少接触的技术。这在面试中是一个很好的切入点。这是一个向面试官展示你在面对新技术或不熟悉的技术时能够做到的事情的机会,而这几乎是你接手的每一份新工作都会遇到的情况。

话虽如此,你不必重新发明轮子。对于 Breadwinnerss,我选择了全栈 Javascript,因为这是我熟悉的,但我选择了几乎所有与之配合的新框架和工具。我使用Node和名为CheerioPuppeteer的抓取库来构建抓取工具。我将其部署到每天运行的Google Cloud 函数中。抓取脚本本身使用我构建的自定义抓取功能抓取每个公司的职业页面,并将所有结果保存到AWS S3存储桶中的文件中。Breadwinnerss 的 Web 应用程序部分也是使用Node构建的,使用express作为路由框架,使用Postgres作为数据库。前端是使用Vue.js构建的。Web 应用程序从 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))
  }
Enter fullscreen mode Exit fullscreen mode

强调技术挑战和解决方案

很大程度上,技术面试本质上就是一场大型的模拟问题解决练习。你能解决问题吗?你能快速学习吗?你能融入并适应不断变化的环境吗?强调你在项目构建过程中如何解决技术问题非常重要——这会在面试中减轻很多压力。

我们对应用架构做出的最大改变之一,就是改变了实际数据抓取的方式和时间。最初的概念验证只针对Nis,从他的网络中抓取8到10家公司的数据。自然而然地,我直接抓取了Nis的“Breadwinnerss”动态页面加载时的所有公司数据。抓取工具与Web应用程序代码集成,每次有人访问动态时都会获取最新的职位列表。这种方法在我们身上确实有效了一段时间,将其作为MVP(最小可行产品)也让我们得以发布一个早期的可运行版本。有些人可能会认为,一次性学习五项技能并在发布前完善技术栈会非常了不起,但通常情况下,这只会阻碍我们最终发布产品。

一切顺利,直到我们开始抓取大约 20 家公司的数据。那时,抓取作业的请求耗时超过了 Heroku 允许的最大请求时长(大约 30 秒)。这时,我们决定将每次抓取的结果缓存到 S3 bucket 中的一个文件中。我们还将抓取代码移到了一个独立的模块中,并将其部署到 Google Cloud Functions,每天按计划运行。所有这些措施使得数据流加载速度更快,也使得我们现在每晚的抓取数据中可以包含大约 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
}
Enter fullscreen mode Exit fullscreen mode

在简历上展示项目

大多数开发者已经把他们的 GitHub 个人资料写进了简历。如果你的项目在公开仓库,精明的招聘人员可能会查看一下。但这实际上会埋没一些能给你带来显著优势的东西。

我建议创建一个专门的部分来介绍您的项目、用于构建它的任何尖端技术以及您拥有的任何市场吸引力或验证,例如用户数量甚至收入。

主要内容

总而言之,以下是我在构建副项目时提出的 4 个主要建议:

  1. 找到并解决一个引人注目的问题。
  2. 利用该项目作为尝试新技术的机会。
  3. 迭代!在不到一个月的时间内构建一个快速原型,然后根据用户反馈对其进行改进。
  4. 与平时难以共事的朋友合作。副业项目不必孤单!

查看 github 上的代码!

我们认为公开代码非常重要,这样其他人就可以学习我们构建这个项目的流程。欢迎前往GitHub查看,并告诉我们您的想法。

替代文本

文章来源:https://dev.to/coderbyte/how-to-build-a-side-project-that-will-impress-future-employers-nl2
PREV
提高你的算法和数据结构技能
NEXT
Google 的 JavaScript 面试题