All streams
Search
Write a publication
Pull to refresh
23
0
Aleksandr Kondaurov @kondaurovDev

Программер

Send message

Да, это очередное преимущество возможность вставить свое JSON резюме в LLM, и попросить исправить ошибки.

JSON это универсальный формат и для него еще есть JSON Schema

я попросил ChatGPT сгенерировать пример резюме на TeX, это правильно?

пример TeX и moderncv
% Пример файла resume.tex

\documentclass[11pt,a4paper,sans]{moderncv}

% Выбор стиля и цветовой схемы moderncv (есть варианты: casual, classic, banking, oldstyle, fancy)
\moderncvstyle{classic}
\moderncvcolor{blue}

% Кодировка и поддержка кириллицы
\usepackage[utf8]{inputenc}    % Если компилируете через pdfLaTeX. Для XeLaTeX можно убрать.
\usepackage[T2A]{fontenc}
\usepackage[russian]{babel}

% Настройки полей страницы
\usepackage[scale=0.85]{geometry}

% Личные данные
\name{Иван}{Иванов}
\title{Резюме}                 % Заголовок (профессия или должность)
\address{ул. Пушкина, 1}{Москва, 123456}{Россия} 
\phone[mobile]{+7~123~456~7890}
\email{ivan@example.com}
\homepage{www.example.com}
\social[github]{ivanivanov}    % Логин на GitHub, если есть

\begin{document}

% Создание заголовка CV
\makecvtitle

% Опыт работы
\section{Опыт работы}
\cventry{2018--2023}{Senior Developer}{Компания «Пример»}{Москва}{\textit{Полная занятость}}{%
\begin{itemize}
  \item Разработка веб-приложений;
  \item Координация команды разработчиков;
  \item Внедрение CI/CD процессов.
\end{itemize}}

\cventry{2015--2018}{Junior Developer}{Компания «Другая Компания»}{Москва}{\textit{Полная занятость}}{%
Участие в создании программного обеспечения, отладка и тестирование приложений.}

% Образование
\section{Образование}
\cventry{2010--2015}{Бакалавр в области информатики}{Московский Государственный Университет}{Москва}{\textit{С отличием}}{}

% Навыки
\section{Навыки}
\cvitem{Языки программирования}{C++, Python, Java}
\cvitem{Инструменты}{Git, Docker, Jenkins}

% Владение языками
\section{Языки}
\cvitemwithcomment{Русский}{Родной}{}
\cvitemwithcomment{Английский}{Продвинутый}{B2/C1}
\cvitemwithcomment{Немецкий}{Базовый}{A2}

% Дополнительная информация
\section{Дополнительная информация}
\cvitem{Хобби}{Спорт, чтение, путешествия}

\end{document}

TeX сам позиционирует всё как нужно.

Я хотел еще сделать так, чтобы резюме выглядело красиво и мне было намного проще использовать HTML. CSS/HTML позволяют сделать любое представление.

Мой инструмент позволяет еще группировать скилы, которые указаны в местах работ. Не нужно самому перечислять то, что вы указываете на конкретных позициях

Скриншот с навыками

Считает еще период, сколько человек проработал в компании

Скриншот по периодам

Период, навыки, и тому подобное, можно высчитывать самому вручную но мой инструмент делает это сам.

правда с относительно небольшим количеством ключевых слов TeX

в моем инструменте используется JSON и HTML (JSX если быть точнее), все достаточно просто.

Спасибо за комментарий!

А вот заполнить свой профиль на всех сайтах для поиска работы - это тот ещё геморрой..

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

Введите каждое поле отдельно, выберите дату рождения из трёх выпадающих списков (день, месяц, год), потом для каждого прошлого места работы - дата начала (день, месяц, год) и дата окончания (день, месяц, год), название компании, размер компании, имя собачки начальника,

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

Сейчас практически на всех формах отклика вакансии, есть обязательный пункт "attach CV", и нужно прикладывать файл.

Это я говорю про зарубежный рынок, в HH/HabrCareer вроде просто можно кнопочку нажать и работодатель увидит все в вашем профиле, нет необходимости ему отдельно присылать файлы.

потому что парсить резюме из pdf они не хотят (и никто не хочет, спасибо)

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

Вот если бы вы написали инструмент, который всё это автоматизирует на разных сайтах - тогда это было бы более нужно.

это сложно технически, можно написать расширение для браузера, которое будет заполнять форму используя JSON с опытом и LLM, но овчинка не стоит выделки 😀

А тут ещё и к вам это всё надо ввести.

Да, заполнить нужно, но вот в этом случае как раз только 1 раз. JSON это универсальный формат, им можно описать что угодно, и я не придумывал JSON 😅

Спасибо за мысль

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

жесть конечно 🤯

Тимлид дал мне несколько месяцев на исправление ситуации

Я не понимаю что у этой компании делает Тимлид, если он не видит банального:

  • И приходилось перерабатывать, чтобы успевать в дедлайны. 

  • К обеду терял способность справляться даже с простыми задачами

  • Я брался за несколько проектов одновременно, постоянно переключался между задачами

Ну а вообще вы дело говорите, эта тема интересная

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

https://www.youtube.com/watch?v=252slbrmk8M

Вручную не пишется, все ошибки отслеживаются Effect и из них делается union.

Например вот тут, todo это эффект, который не имеет смысла, просто показал как Effect отслеживает ошибки, он может завершиться либо Error1, либо Error2.

import { pipe, Data, Effect } from "effect"

export class Error1 extends Data.TaggedError("Error1")<{}> {}
export class Error2 extends Data.TaggedError("Error2")<{}> {}

const todo = 
  pipe(
    Effect.fail(new Error1),
    Effect.andThen(
      Effect.fail(new Error2)
    )
  )

// const todo: Effect.Effect<never, Error1 | Error2, never>


Но если хотите то всегда можно явно написать тип.

https://effect.website/docs/error-management/expected-errors/#error-tracking

Как effect поймет если ошибка, например, кастомная?

Хороший вопрос 🙂

У кастомных ошибок должно быть свойство _tag: string, в примере выше этот тег проставляется в классе Data.TaggedError


https://effect.website/docs/error-management/yieldable-errors/

Суть в том что в вашем случае вы можете забыть какой тип ошибки, вам нужно знать класс ошибки чтобы пользоваться оператором instance of

в случае с effect работает typescript inference и все возможные ошибки аккумулируются в эффекте и все они известны в compile time

import { HttpClient } from "@effect/platform"
import { Effect, Schedule } from "effect"

declare const httpClient: HttpClient.HttpClient

const getTodoWithRecover = (
  id: number
) =>
  httpClient.get(`/todos/${id}`).pipe(
    Effect.andThen((response) => response.text),
    Effect.scoped,
    Effect.timeout("1 second"),
    Effect.retry({ // будет 3 раза пытаться с любой ошибкой
      schedule: Schedule.exponential(1000),
      times: 3
    }),
    Effect.withSpan("getTodo", { attributes: { id } }),
    Effect.catchTags({ // это отработает когда эффект с ошибкой завершился, даже retry не помог
      TimeoutException: () => Effect.succeed("timed out"), 
      ResponseError: (error) => Effect.succeed(`response error. status = ${error.response.status}`),
      RequestError: (error) => Effect.succeed(`request error. url = ${error.request.url}`)
    })
  )

// такой эффект возвращает теперь getTodo
// const getTodo: (id: number) => Effect.Effect<string, never, never>

const getTodoWithoutRecover = (
  id: number
) =>
  httpClient.get(`/todos/${id}`).pipe(
    Effect.andThen((response) => response.json),
    Effect.scoped,
    Effect.timeout("1 second"),
    Effect.retry({ // будет 3 раза пытаться с любой ошибкой
      schedule: Schedule.exponential(1000),
      times: 3
    }),
    Effect.withSpan("getTodo", { attributes: { id } }),
  )

// const getTodoWithoutRecover: (id: number) => Effect.Effect<unknown, HttpClientError | TimeoutException, never>
// HttpClientError это union из двух типов RequestError, ResponseError

Сам по себе Promise не типиризует ошибки,  он типизирует только успешный результат. То есть Promise<A> это Effect<A, any, never>

В вашем примере React Query больше похож на одно из применений Effect, мне нравится.

Я немного знаю по React Query но думаю что он заточен под работы с Реакт непосредственно и с хуками Реакта. Ну а так да, вам не нужны тут эффекты, и так хорошо код выглядит

Effect же это про программирование на эффектах, есть система эффектов, рантайм и тп.


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

Не понимаю при чем тут это

Effect это не про реактивное программирование, в вашем коде видно что вы во фронте Loader скрываете.

Просто со стримами API похож на работу с эффектами но это совсем другая история

я напишу в следующий раз статью получше и расскажу почему это не реактивный фреймворк

Никакую технику suspense я не видел, да и код его вообще не понятно на чем, похоже на $mol или какой то псевдокод. Никаких генераторов тоже не видно

он пишет код который похож на какой то реактивный фреймворк

А без React, на ванильном js чтобы работало в браузере или nodeJS? Можете прям сниппет здесь написать?

Не очень понимаю про что вы 😅

Повторюсь что с Promise<any> невозможно пробрасывать ошибки и компилятор никогда не догадается что там за тип, так как такого Generic параметра просто не задумано.

Promise<number> это Effect<number, any, never> то есть ошибка может быть типа any то есть вообщем любым значением

Effect<A, E, R> это типа "умный" Promise, у которого в типе есть информация о типе с успешним значением A, или возможной ошибкой типа E, и которому требуется контекст типа R, для того чтобы система типов (Effect runtime) мог запустить этот промис

Хм, можете наглядный и простой пример привести? Я вот что то не знаю как сделать так, чтобы fetch возвращал не Promise а сразу его значение

Не совсем понял про что вы говорите, можете сказать про что именно вы хотите подчеркнуть разницу?


В Effect много что поддерживает Dual Api
https://effect.website/docs/code-style/dual/

Information

Rating
Does not participate
Registered
Activity