Комментарии

Gridmaniac
Оставлен: Автоматически
Смело оставляйте комментарии, критикуйте, задавайте вопросы

Генератор резюме

Опубликовано: 17.02.2018

Однажды появилась необходимость в массовой генерации множества CV рандомных разработчиков.

Не спрашивайте зачем :3

Задача состояла в следующем:

  • Реализовать добавление стеков технологий;
  • Генерировать места работы, период и умения на основе опыта работы;
  • Реализовать добавление профессий и выбор уровня компетенции.

Common Lexicon

Для начала определил общий лексикон:

Словарь “Обо мне”

Свободное владение английским
Чтение документации на английском языке любой сложности
Работа в команде
Понимание поставленных задач и выполнение в срок
Имеется большой арсенал шаблонов проектирования
Профессиональный рост для меня имеет наивысший приоритет.
Карьера разработчика — number one priority.
Аналитическое мышление
Внимание к деталям
Блестящие аналитические навыки
Готов решать самые сложные задачи
Гибкий в работе
Инициативный
Обладаю грамотной письменной и вербальной коммуникацией
Открыт к изучению новых технологий
Эффективная работа в быстро развивающейся среде

Словарь “Имена”

Александр
Дмитрий
Антон
Алексей
Марат
Вячеслав
Артем
Игорь

Словарь “Фамилии”

Кац
Требушетов
Сапожников
Лакунин
Пневманенко
Фабулос
Деловитов
Покровный
Трезвый
Последний

Словарь “Общие навыки”

Git
SVN
Markdown
Unit Testing
Scaling databases
ACID
ORM
Unix администрирование
ООП
Рефакторинг
Code Review
Логическое мышление
Ability to Code Automated Tests
Ability to Work Independently and In Team Based Environment
Analyze Test Results
Break Project Into Attainable Progress Goals
Capable of Using Source Code Repositories
Communicate With Technical and Non-Technical Resources
Create Test Plans
Develop Standards and Procedures to Determine Product Quality and Release Readiness
Discover Bugs Within Software
Document Test Cases
Drive Innovation and Streamline Overall Testing Process
Experience With Agile Development Process
Experience With Web Based Testing Applications
Identify Areas of Improvement
Identify, Isolate and Track Bugs Throughout Testing
Identify Potential Problems Users May Encounter
Interpret Technical and Business Objectives and Challenges
Perform and Document Risk Analysis
Perform Manual and Automated Testing
Record Test Progress and Results
Research and Analyze Product Features Being Tested
Research New tools, Technologies, and Testing Processes
Review User Interfaces For Consistency and Functionality
Solid Understanding of QA Testing Environments
Thorough Understanding of Software Development Life Cycles
Work Closely With Development and Product Teams

Словарь “Роли в компании”

Проектирование архитектуры
Разработка приложений
Ответственный за автоматизацию процессов разработки
Реализация комплексных задач
Повышение производительности существующих в компании решений
Оптимизация баз данных
Рефакторинг legacy кода
Разработка новых инструментов управления данными для внутреннего использования
TDD, Code review
Использование систем управления версиями Git
Разработка плагинов
Разработка модулей
Рзработка кастомных расширений
Фикс багов
Развертывание Open Source решений
Наращивание Open Source решений

Словарь “Названия компаний”

Фрилансер
TEL Corp.
ГикПайнс
TV MEL
Перекресток
Лидком
НПО Компьютер
Новые технологии
Star Mage Technology
Onliner.by
Max-blatform.com

Результат

Массовая генерация CV.

Даже с небольшим количеством лексикона складывается хорошее впечатление от такого резюме.

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

Добавляем профессиональные навыки

Для этого я решил создать папки для разных специфик. Для примера вот такой получился вариант с Blockchain Expert.

Роли в компании

Blockchain Developer
Blockchain Expert
ICO Аудитор
Консультант ICO
Solidity Expert
Разработчик смарт-контрактов
Прикладной full-node разработчик
Программист на MultiWallet
Ответственный за безопасность

Скилзы

A deep understanding of ledgers Сonsensus methods, blockchains, and cryptocurrencies in general
Strong expertise in threat analytics, anomaly detection, and performance management.
Strong understanding of algorithms, data structures, cryptography and data security, and decentralized technologies.
Strong coding skills with at least one of the following languages: Go, C, C++ , JAVA, Python.
A good understanding of distributed storage, like RDBMS or NoSQL, for instance.
Exposure / eagerness to learn atleast one of the blockchain platforms like Ethereum, Stellar, Ripple, Hyperledger etc.
Good understanding of Bitcoin or other crypto-currencies
Experience working with distributed databases. Understanding of various distributed consensus methodologies
Understanding of cryptography, including asymmetric (pub/priv key), symmetric, hash functions, encryption/signatures.
Hands-on experience in using any of the following (or similar) languages: Java, Golang, Rust, Scala, Haskell, Erlang, Python, C, C++, C#
Hands-on experience in working on Open source technologies and learn new languages like Solidity

А если нужно несколько проф в одном резюме?

Без проблем. Этот момент разберем ниже.

Немного кода на NodeJS

function generateCV(name, sname, specs, level, role, lexicon)

Определяем опыт работы и кол-во компаний, в которых работал наш воображаемый разработчик:

let years = 0,
    companies = 0,
    skills = 0

switch (level) {
    case 'junior':
        years = getRandomInt(1, 1)
        companies = getRandomInt(1, 2)
        skills = 6
        break;
    case 'middle':
        years = getRandomInt(2, 4)
        companies = getRandomInt(2, 5)
        skills = 9
        break;
    case 'senior':
        years = getRandomInt(4, 10)
        companies = getRandomInt(3, 7)
        skills = 12
        break;
    case 'legendary':
        years = getRandomInt(7, 20)
        companies = getRandomInt(5, 12)
        skills = 15
        break;
}

let y = ''
if (years == 1) {
    y = 'год'
}

if (years > 1 && years < 5) {
    y = 'года'
}

if (years > 4) {
    y = 'лет'
}

const exp = `Опыт работы: ${years} ${y}`

Генерируем блок Обо мне:

let about = ''
for (let i = 0; i < 6; i++) {
    about += lexicon['common'].about.splice(Math.random() * lexicon['common'].about.length | 0, 1)[0] + '. '
}

Генерируем список компаний и года относительно опыта работы и выбранных профессий:

const contributions = lexicon['common'].contributions
for (let spec of specs) {
    if (lexicon[spec].contributions) {
        for (let c of lexicon[spec].contributions) {
            contributions.push(c)
        }
    }
}

const roles = lexicon['common'].roles
for (let spec of specs) {
    if (lexicon[spec].roles) {
        for (let r of lexicon[spec].roles) {
            roles.push(r)
        }
    }
}

const work = []

let range = years / companies
range = range * 365 * 24 * 60 * 60
syears = years * 365 * 24 * 60 * 60

for (let i = 0; i < companies; i++) {
    const start = moment().subtract(range * i, 'seconds')
    const end = moment(start).add(range, 'seconds')

    const cons = []
    for (let j = 0; j < getRandomInt(2, 7); j++) {
        cons.push(contributions.splice(Math.random() * contributions.length | 0, 1)[0])
    }

    work.push({
        start: start.format('DD.MM.YY'),
        end: moment().add(2, 'months') > end ? end.format('DD.MM.YY') : 'Наст. время',
        role: roles.splice(Math.random() * roles.length | 0, 1)[0],
        company: lexicon['common'].companies.splice(Math.random() * lexicon['common'].companies.length | 0, 1)[0],
        contributions: cons
    })
}

Подбираем общие и профессиональные навыки:

const generalSkills = []
for (i = 0; i < getRandomInt(skills - 1, skills + 1); i++) {
    generalSkills.push(lexicon['common'].skills.splice(Math.random() * lexicon['common'].skills.length | 0, 1)[0])
}

const proSkills = []
for (let spec of specs) {
    for (i = 0; i < getRandomInt(skills - 1, skills + 1); i++) {
        proSkills.push(lexicon[spec].skills.splice(Math.random() * lexicon[spec].skills.length | 0, 1)[0])
    }
}

Выбираем фотку и получаем готовое резюме:

const photos = fs.readFileSync(`${__dirname}/photos.txt`, 'utf8').split(/\r?\n/)

return {
    name,
    sname,
    role,
    exp,
    about,
    work,
    generalSkills,
    proSkills,
    photo: photos.splice(Math.random() * photos.length | 0, 1)[0]
}

Вердикт и ссылка на генератор

В целом такой генератор можно использовать не только в IT сфере, но и в любых других.

Открыть генератор резюме