Alexey Mishurovskiy
На джуна берут
ну это норм, можно сменить направление если понравится
Konstantin
?
Konstantin
Почему позорный?
Konstantin
вы уж извините. помочь-то могу, если делать нехер, но вам это повод задуматься о собственных навыках, это детсад "я не знаю как порезать задачу на интерфейсы"
Alexey Mishurovskiy
Konstantin
Max
Konstantin
позорно не сделать, а чувак ищет решение
позорно на собеседование принести чужой код, не? и чужие мысли. а потом, если не дай бог возьмут, сосать с работодателя деньги, не умея решить вот такое?
Max
Max
Ты гуглу глупые вопросы не задаешь?)
Alexey Mishurovskiy
Konstantin
это, на мой взгляд, не совсем честно
Alexey Mishurovskiy
Max
Alexey Mishurovskiy
если тот кто берет на работу не идиот он до всего докапается
Alexey Mishurovskiy
я вот когда беру человека мне важно как он думает. что то не знать это нормально
Konstantin
это, на мой взгляд, не совсем честно
Я не понимаю, что тебе не нравится. Что плохого в том, чтоб спросить совета, как сделать лучше, тем более, если ты делаешь это в первый раз. Работодатель знает, что до этого я ни разу в жизни не писал на симфони
Alexey Mishurovskiy
Konstantin
Я считаю, имею полное право искать информацию как угодно, и где угодно. Это не тест на знания, а тест на поиск решения задачи, с которой никогда ранее не сталкивался
Alexey Mishurovskiy
Konstantin
Спасибо всем!
Vlad
Юра
Парсер хорошой написать чтобы, знать надобно не мало
Юра
Например для начала надо скачать страницы
Юра
Не всегда нужно, но бывает что-то вдруг надо допарсить
Юра
Но в твоём случае главное реализация возможности поддержки разных сайтов
Юра
Без этого думаю твое задание не примут
Max
Konstantin
короче, что я бы хотел увидеть на собеседовании от джуна:
1) надо спроектировать таблицу для новости: id, title, text, source (с какого сайта спарсили - rbk, habr, etc), created_at, external_id (уникальное поле чтобы не спарсить одну статью дважды).
этот шаг мы опустим как тривиальный, сводится к настройке сущности Article
2) сделать DTO ParsedArticle - типизированную обертку для того, что напарсил парсер чтобы не обмениваться массивами неизвестной структуры в разных слоях приложения
2) сделать ArticleFactory - фабрику, что будет создавать новости из нашей дто-шки. пока опустим обработку дубликатов, в условиях задачи этого нет
class ArticleFactory {
public function create(ParsedArticle $input): Article {
// тут мы вставляем в доктрину сущность статьи и ее возвращаем
}
}
3) интерфейс парсера. нужен чтобы абстрагироваться от имплементации парсера конкретного сайта. в процессе будем добавлять новые парсеры, но весь остальной код про это не знает
interface SourceParserInterface {
/** @return ParsedArticle[] */
public function parseNews(int $limit): array;
}
class RbkParser implements SourceParserInterface {
...
// тут уже работаем с парсингом конкретного сайта. в будущем общие части (например, "скачать хтмл" или "распарсить хтмл" можно вынести в абстрактный класс и наследоваться от него, чтобы не приходилось утилитную работу делать в каждом парсере)
}
4) registry парсеров - некий контейнер, что по ключу (например, rbk, habr) будет возвращать инстанс парсера. нужно чтобы вызывающий парсер код не знал о конкретной реализации парсера.
я бы это сделал через tagged_iterator - см. доку симфони
class ParserRegistry {
public function getParser(string $id): SourceParserInterface {
if (isset($this->parsers[$id])) {
return $this->parsers[$id];
}
throw new \InvalidArgumentException(sprintf('parser %s does not exist', $id));
}
}
4) команду, что запустит парсер. ей мы будем передавать input argument-ом id парсера, что хотим спарсить. допустим
./bin/console parser:run rbk
или
./bin/console parser:run habr
class RunParserCommand extends Command
{
public function __construct(
private readonly ParserRegistry $registry,
private readonly NewsFactory $factory,
) {
parent::__construct();
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$parser = $this->registry->getParser($input->getArgument('id'));
$articles = $parser->parseNews(10);
foreach ($articles as $article) {
try {
$obj = $this->factory->create($article);
} catch (\Exception $e) {
// так как мы работаем с батчем, нужно понимать, что ошибка в обработке одной новости сломает всю пачку.
// поэтому тут надо тщательно эту ошибку обработать
}
$output->writeln(sprintf('<info>created article with title %s</info>', $article->getTitle()));
}
}
}
Konstantin
да мне действительно нефиг делать и я всё это пишу, не знаю зачем
Konstantin
но я бы примерно такой ответ, либо хотя бы ход мыслей ждал. разумеется, я опускаю настройку симфони, доктрины, контейнера и прочее
Konstantin
но по мне, если честно, на джуна это довольно объемное задание, даже я бы на всю мелочь и вылизывание до идеала (особенно с учетом парсинга) потратил на это, наверное, час бы точно. а то и два. джун легко бы неделю копался и всё равно сделал бы не то
Konstantin
разве что не описывать конкретные парсеры, а обойтись просто схемой взаимодействий
Konstantin
Парсер хорошой написать чтобы, знать надобно не мало
я почти уверен, тут основной упор на организацию кода, классы, команды, интерфейсы, а не тупо парсинг, это как раз самое слабо интересное работодателю. парсить любая макака умеет, а вот код организовать - уже проблема
Юра
Еще надо подумать о масштабируемости, завернуть все это в кубер кластер, настроить репликацию, dns round robin, BGT protocol, поднять p2p CDN. А и blockchain nft токены
Konstantin
да не, это как раз минимальный набор, я прям старался все выкинуть лишнее
Alexey Mishurovskiy
я тут на убунту 22-ю обновился. теперь такие белые пятна в шторме появляются. куда копать ?
Konstantin
свингопроблемы :)
Konstantin
Alexey Mishurovskiy
в багтрекер шторма
надо наверное сначала попробовать его переставить с нуля
Alexey Mishurovskiy
Alexey Mishurovskiy
написал им в поддержку короч
Юра
Линукс только в теории можно сделать dist upgrade
Юра
На практике лучше с нуля поставить
Alexey Mishurovskiy
Alexey Mishurovskiy
вот чистый аккаунт, то же самое
Юра
Java, write once, run everywhere
Burlakovmax
Шрифтов нет может каких?
Юра
Поэтому мне нравится флатер, который сам рисует все по максимуму и которому пофигу что там в системе творится
Alexey Mishurovskiy
буду переставлять с нуля ) я думаю 100% вылечится )
Alexey Mishurovskiy
вопрос в чем причина
Юра
Может там Wayland
Юра
Или еще что-то
Burlakovmax
Ну или что то такое
Burlakovmax
Ну как выше писали с нуля…
Alexey Mishurovskiy
Burlakovmax
Но как по мне шрифт свалил какой или что то такое
Burlakovmax
Хотя шторм должен тащить все…поддержка?:/ Ну это я фантазирую
Alexey Mishurovskiy
Alexey Mishurovskiy
у меня уже было давно что то подобное после апгрейда. все же нормально апгрейд не работает
Spider
интересно что сейчас перспективнее для удадленки симфа или лаварель?
Alexey Mishurovskiy
Alexey Mishurovskiy
самый перспективный
Spider
а если из этих вариантов? без доп
Burlakovmax
Konstantin
перспективнее уметь программировать и решать задачи, на ларавеле больше говнопроектов за двадцать баксов, на симфони больше шанс попасть на нормальный проект, где люди даже что-то нормальное делают
Spider
ладно нафиг - останусь в битриксе
Konstantin
с ларавелем это исключено
Burlakovmax
Alexey Mishurovskiy
но на симфе больше серьезных проектов, это факт