• Как HR реагируют на "NDA" в резюме вместо места работы?

    DollyPapper
    @DollyPapper
    Т.е. в резюме у вас будет NDА, а в трудовой название компании? Што?
    Мне прям интересно, что это за компания которая не хочет чтобы ее в резюме упоминали. Гидра какая нибудь :)
    Ответ написан
    1 комментарий
  • Зачем именно нужны связи в бд?

    DollyPapper
    @DollyPapper
    Вы перепутали связи и ограничения в БД. Неформально связи как раз и закрепляются ограничениями типа внешний ключ, но в целом связи это вопрос формализации моделируемого мира в контексте вашей БД. У вас уже есть связь между сообщинем и пользователем. Тот факт что у вас в сообщении имеется колонка userid как раз и есть факт связи, что две сущности: сообщения и пользователи связаны. Однако эти связи принято подкреплять на уровне самой БД теми самыми огланичениями. как указал mayton2019 я могу в вашей системе в теории создать сообщение которое не принадлежит ни одному пользователю в вашей базе. Рассматривайте ограничения как штуки которые не позволяют нарушить логику ваших связей.
    Еще почитать на тему проектирования связей
    Ответ написан
    Комментировать
  • Стоит ли переписывать старый проект на .NET6 (на голом энтузиазме)?

    DollyPapper
    @DollyPapper
    Чистая архитектура это не серебряная пуля, в чем профит то? Какие ваши проблемы она решит? Выглядит так, что вы устали работать с легаси говнищем и хотете на текущее место работы привнести новые технологии. Если это так, то это не работает. Поверьте, я проверял. Лучше смените проект.
    Ради опыта напишите полезный пет проект, или опять же - смените место работы. Загнивание на работе с технологиями которые вам не нравятся это путь в выгорание. Опять же поверьте, я проверял.
    Ответ написан
    2 комментария
  • Стоит ли использовать SPA для проекта вроде каталога/доски объявлений?

    DollyPapper
    @DollyPapper
    Если у вас обычный среднестатистический сайт/интернет магазин/CRM/etc. берите тот который знают разрабы которые будут реализовывать. Если у вас ожидается высокий RPS, то тут нужно в сторону более производительных языков смотреть. Оптимальный на текущий момент это Go/Node. И среди них есть разделение. Если у вас CIA (CPU intensive application), то Go лучше взять. Если DIA (data intensive application), берите либо ноду либо go, тут разницы нет. А так при прочих равных уже сказали - берете тот, который знает команда
    Ответ написан
    Комментировать
  • Как написать скрипт, который будет получать какие-то данные и обрабатывать их параллельно?

    DollyPapper
    @DollyPapper
    Пулишь свою задачу из апи асинхронно, всё по классике. Дальше используешь Worker Threads.
    Ответ написан
    Комментировать
  • Стоит ли разработчикам платить за баги?

    DollyPapper
    @DollyPapper
    Надеюсь никогда не попаду в компанию, где вы являетесь ПМом :) Без обид, ничего личного, но даже возникновение мысли об этом поспорить уже абсурд. Сначала заказчик/начальник хочет чтобы функционал был сделан еще вчера, а на архитектуру, практики кодирования мы положим ботл, а потом у них возникают вопросы откуда баги. Ну вот оттуда и баги. Производство ПО это такое же производство как и любое другое производство. Если бы мы говорили про автомобильную индустрию, то на сколько бы вам хотелось ездить на машине которую сделали за вечер потому что сроки горят, конкуренты нас обходят? Мне вот тоже не хотелось бы. По этому в любом другом производстве уже давно выстроены процессы, есть отделы тестирования качества и прочие вещи, которые позволяют уменьшить/исключить брак. И только в ИТ почему то до сих пор является нормальным забить болт на все практики производства и потом спрашивать за баги с разработчика. Когда у вас появится формальное описание ТЗ (именно формальное, т.е. формализованное) в котором просто не может иносказаний одного и того же пункта, когда у вас появится опытный архитектор который будет довольно долго планировать архитектуру проекта, когда у вас появится нормальная процедура тестирования специально обучеными людьми и у вас все равно будут баги, тогда можно и задуматься, а стоит ли платить разработчику за баги, ведь теперь у меня есть все условия для того, чтобы багов не было. А до тех пор советую на эту кривую дорожку не вставать. Вот простой пример, рассудите сами:
    Есть некоторый код который использует некоторую библиотеку. В библиотеке есть баг который всплыл у вас на проде. Разработчик в этом виноват? Может он виноват в том, что выбрал не качественную библиотеку? А у вас выстроен формальный процесс верификации запчастей из который состоит ваш проект? А у разработчиков библиотеки хорошие процессы разработки были? Это ведь тоже программный код который так же кто-то разрабатывал.
    Ответ написан
    Комментировать
  • Как организовать архитектуру кода для взаимодействия с БД в Golang?

    DollyPapper
    @DollyPapper
    Тут все зависит от того как вам удобно, кто бы что не говорил, нет единого стандарта нужно/не нужно. Я наоборот чаще вижу что вместо прямого источника данных подают репозитории в сервисы. И сам так делаю. Это банально удобней тестировать.
    Ответ написан
    Комментировать
  • Бэкенд node.js разработка без изучения фронта возможна?

    DollyPapper
    @DollyPapper
    Как уже сказали хайп на ноду закончился, хотя ИМХО в России он никогда особо не начинался, особо как-то не хотели в эту платформу тут человеко-деньги инестировать. Разработка на ноде несомненно возможна без фронта, это вообще две разные стези программирования, бек и фронт. Но так сложилось исторически, что нода популизировалась как экосистема, где код пишут "фулстеки". Я пытался в прошлом году свичнуться в ноду, при условии, что буду заниматься только беком, т.к. фронт колупать мне втягость. Не получилось, везде куда я откликался нужны были именно фулстеки.
    Ответ написан
    4 комментария
  • Как обновлять сайт на nuxt.js в контейнере Docker?

    DollyPapper
    @DollyPapper
    Вам нужна оркестрация. Есть решения большие и сложные типа кубера, но вам вероятно подойдет docker swarm
    Ответ написан
    Комментировать
  • Существуют ли в opensource-проекты с хорошей архитектурой?

    DollyPapper
    @DollyPapper
    Надо исходить из изначального посыла - что такое хорошая архитектура и надо различать понятия дизайн и архитектура. Архитектура это высокоуровневая концепция. Это вопрос какую БД выбрать, какой прокси сервер, определение нагрузки на приложение. Так же архитектура это то сколько и какие слои в вашем приложении будут. А вот SOLID это как раз про дизайн отдельных модулей и классов. Итак. Какие изначальные постулаты "хорошего дизайна"?
    1. Понятность/читаемость кода
    2. Слабая связанность и сильная связность (зацепление) отдельных модулей
    3. Разделение компонентов по ответственностям
    4. Возможность повторного использования компонентов
    5. Надежность (вопрос устойчивости и корректности ПО)


    Исходя из этих критериев и нужно рассматривать архитектуру приложения. Но вот так просто "с улицы" зайти в проект и понять хорошая там архитектура или плохая ИМХО нельзя. Если пресловутые принципы SOLID нарушаются в приложении, то может так и задумано? Мартин вот категорично говорит, что нельзя зависеть от конкретных реализаций. Если у вас в зависимостях есть конкретный класс, а не интерфейс, то это якобы плохой дизайн, вы нарушаете принцип SOLID. Так ли это важно и нужно? Да не особо. Если нет смысла зависеть от интерфейса, то не надо пихать его. В этом и заключается чуйка архитектора. Если он считает, что реализация меняться не будет, то не нужно усложнять код. Если он считает, что требования будут меняться и следственно реализация, то вероятно стоит защитить конкретный компонент и выделить интерфейс. Если класс на 30к строк это не значит, что там плохая архитектура. Кто-то скажет, что это вполне себе Domain Model паттерн, вместо Anemic Model и это хороший дизайн, кто-то скажет что нарушается SRP. Нет четких правил, тут именно что нужно понимать предметную область с которой работаешь и вырабатывать чуйку.
    Ответ написан
    Комментировать
  • Является ли чтение Readonly свойств объекта нарушением инкапсуляции?

    DollyPapper
    @DollyPapper
    Вы путаете инкапсуляцию и сокрытие информации. Инкапсуляция это логическое объединение взаимосвязанных логических едениц в одной сущности. Т.е. методы и поля объекта объединяются в одном классе. Это и есть инкапсуляция. А есть такое понятие как сокрытие информации. Это не только про обращение к закрытым полям класса, это вообще про ракскрытие внутренней структуры нашего объекта для внешнего пользователя. Например если мы создаём юзера который в конструкторе принимает id как целое число, это нарушение сокрытия информации, т.к. внешний по отношению к обьекту пользователь знает, что технически внутри наш id это целое число, и например захочет его инкрементировать, а мы не хотим чтобы так было.
    Ответ написан
    3 комментария
  • Для каких проектов и задач в backend предпочтительнее Python с фреймворком Django?

    DollyPapper
    @DollyPapper
    Все современные языки это один х прокладка между базой данных и клиентом. Нет разницы. Java выбирают чаще всего и энтерпрайзе, потому что там решения проверенные временем, есть специалисты проверенные временем. В остальном создается вакансия "Требуется разрабочик на %язык_name%", потому что уже написано решение на этом языке, команда имеет экспертизу в этом языке. Объективных технических причин выбора например между php-laravel/python-django нет. Бытует мнение что например в php устроится джуну проще чем в python. Но оно складывается из: найти работу на wordpress/битрикс/etc. проще чем в нормальный e-commerce проект питоне. Потому что для такого разряда вакансий требований к разработчику меньше. Одинаковую сложность вы найдете в сравнении: нормальный e-commerce php/нормальный e-commerce python. Но так исторически сложилось что php у нас популярней, потому что банально найти уже матерых спецов на нем проще чем на питоне, вот и пишут на php. Разницы между этими двумя языками в бекенде? Да никаких. Но это я про классический бек - запрос ответ. Php вам уже не подойдет например для вебсокет серверов. Тут уже нужен язык в котором довольно просто сделать durable соединение.
    Т.е. резюмируя - выбор языка и стека это чисто политический и бизнесовый аспект в большинстве проектов.

    Действительно ли в backend разработке на этом стэке (Python Django и др. фреймворки) новичку найти работу гораздо сложнее, чем на других языках (например, java, php)?
    - да сложнее. Потому что на единицу вакансии приходится 10 вкатывающихся в IT единиц. А вакансий этих меньше того же php по озвученым выше причинам. Вопрос лишь в том - боитесь ли вы трудностей и сколько готовы потратить на поиск работы.
    Ответ написан
    Комментировать
  • Зачем паттерн одиночка?

    DollyPapper
    @DollyPapper
    Разница в том, что одичка создает объект который доступен в единственном экземпляре в системе. А статические классы это не объекты, это классы.
    Ответ написан
    Комментировать
  • Как лучше учить документацию?

    DollyPapper
    @DollyPapper
    63baa7f4db4d6024854462.png
    Обратите вмание на выделеное красным. Тут уже 1000 раз повторили про важность практики, и я не буду исключением. Практика исключительно важна. Темы сами будут запоминаться если вы будете писать код который использует базу которую вы прочитали. Блок "интервальное повторение" это как раз про кривую забывания которую здесь уже упоминали.
    Ответ написан
    Комментировать
  • Как отменить слияние веток?

    DollyPapper
    @DollyPapper
    Слияние это собственно слияние контента из двух веток которые пошли независимыми путями. Если вы хотите отменить слияние, то логично что вы хотите отменить изменение одной из веток, тогда вам нужно сделать следующее:
    git revert <хеш коммита который хотите отменить> -m 1
    Ответ написан
    3 комментария
  • Фундаментальное отличие async await в python и javascript?

    DollyPapper
    @DollyPapper
    Не могу сказать за Python, но не уверен, что вы правильно понимаете его механизм await. Сомневаюсь, что он продолжает выполнять текущий исполняемый поток после await, т.к. это нарушит исполение кода.
    Про JS могу сказать, что вы видимо не до конца понимаете какой код будет исполнен действительно асинхронно, а какой последовательно (т.е. блокируя основной поток).
    const axios = require('axios')
    
    async function doReq1(){
        const res = await axios.get('http://localhost:12000?id=1')
        return res
    }
    
    async function main(){
        doReq1().then((data) => {
            console.log(data.data)
            console.log("After req")
        });
        console.log("Before req")
    }
    main()

    Данный код выведет 1) Before req 2) Hello 1! 3) After req
    Т.е. AfterReq будет исполнен после того как асинхронная операция получит результат, т.е. подождет (await) результата.
    Аналогичный код с await
    const axios = require('axios')
    
    async function doReq1(){
        const res = await axios.get('http://localhost:12000?id=1')
        return res
    }
    
    async function main(){
        console.log("Before req")
        let res = await doReq1()
        console.log(res.data)
        console.log('After req')
    }
    
    main()
    Ответ написан
    2 комментария
  • Насколько хорошо бэкенд-разработчик должен знать SQL?

    DollyPapper
    @DollyPapper
    Если говорить про собесы - хз, как повезет. Обычно гоняют на столько, насколько собеседующий сам разбирается. Непосредственно в работе тоже по разному бывает. Из своего опыта могу сказать так: непосредственно при написании системы редко пригождаются какие то специфические вещи типа оконных функций. С другой стороны приходилось пилить сложные запросы когда делал отчеты. Там приходилось даже свои аггрегатные функции писать на plpgsql. Так что единого ответа тут нет.
    Ответ написан
    Комментировать
  • Как использовать классы через интерфейсы?

    DollyPapper
    @DollyPapper
    Суть в том, что как вы и сказали: интерфейс это контракт. Можно его еще назвать "тип". Т.е. завязываясь на интерфейс мы обязуем вызывающий код передать нам штуку которая умеет делать определенный список вещей. Собственно все. Немного не правильно противопоставлять интерфейсы наследованию. Наследование это когда одна штука является спицифичной версией другой штуки. Интерфейс же в свою очередь это больше клиентская часть, когда код говорит - я хочу на вход переметр такого-то типа. Давайте простой высосаный из пальца, но довольно ясный пример:
    Есть класс Parser
    class Parser
    {
    	public function getPage($url){
    		return $this->load($url);
    	}
    	protected function load($url){
    		return file_get_contents($url);
    	}
    }

    Есть класс Exchanger
    class Exchanger extends Parser
    {
    	public function getRate($currency){
    		return $this->load('...?id=' . $currency);
    	}
    }

    В примере выше в классе Exchanger мы унаследовали метод load из базового класса. Дальше используем
    $parser = new Parser();
    $parser->getPage('...');
    
    $exchanger = new Exchanger();
    $exchanger->getRate('USD');

    Т.е. и там и там должен быть метод load который по http что-то откуда-то грузит и выдает данные которые дальше как-то используются и т.к. метод load уже есть в классе Parser, ну мы просто унаследовали его и все работает. Но при таком подходе появляются проблемы. Не понятно по какому принципу вообще Exchanger наследуется от Parser, это два семантически друг с другом не связанных класса. И почему у Exchanger есть метод getPage тоже не ясно. Можно пойти по другому. Сделать отдельный класс Loader с методом load и оба унаследовать от него. Это в целом тоже задачу решает, но если появится еще специфичная функциональность которую могут использовать оба наших класса? Множественного наследования нет. Добавлять эту функциональность в Loader? Опять же нарушится консистентность нашего Loader. Можно пойти третим путем. Сделать интерфейс Loader и указать что Parser и Exchanger требуют в качестве зависимости что-то, что имеет метод load. В этом случае нет проблем описанных выше, и есть доп. плюшки, например упрощается тестирование, потому что можно будет вместо обьекта который реально лезет куда-то по http передать заглушку которая просто в методе load возвращает готовые данные.
    Ответ написан
    Комментировать
  • Где можно найти задачи для практики ООП?

    DollyPapper
    @DollyPapper
    Сама поставновка вопроса говорит о том, что никуда вы в этом плане не продвинулись. Посмотрите курс "Дмитрий Елисеев - Неделя ООП". Там примеры на PHP, но это не должно пугать, т.к. в ООП платформозависимое по сути только наследование, и то, синтаксически во всех С-подобных языках оно +- одинаковое.
    Ответ написан
    Комментировать