• Стоит ли использовать 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, но это не должно пугать, т.к. в ООП платформозависимое по сути только наследование, и то, синтаксически во всех С-подобных языках оно +- одинаковое.
    Ответ написан
    Комментировать
  • Как делать деплой с помощью deployer из docker-контейнера?

    DollyPapper
    @DollyPapper Автор вопроса
    Нашел в доке деплоера как сделать ссылка
    Ответ написан
    Комментировать
  • Может кто-нибудь дать реальную задачу на которой можно применить ООП?

    DollyPapper
    @DollyPapper
    В том беда современного обучения программированию, что учат ООП на наследовании кошечек и собачек от абстрактных животных, а нахера это делать и зачем это появилось не учат. Плохая для вас новость - вы не поймете прелести подхода пока не проработаете хотя бы годик на реальном проекте. Но понять сам ООП вы можете не работая. Попытаюсь натолкнуть вас на мысль, и обьяснить истоки, откуда пошло ООП и зачем, через какое-то время вы осознаете эти концепции. Итак.
    Когда мы пишем программу, мы так или иначе моделируем какую-то часть реальности. Модель это несовершенное представление самой этой реальности, с выделенными атрибутами необходимыми для нашей решаемой задачи (абстрагирование, один из принципов ООП), например детская игрушка самолет, это модель реального самолета который копирует лишь внешний реального самолета, при этом игнорируется его внутреннее устройство, и игрушка таким образом не умеет летать, но наша задача (развлечь ребенка) при этом выполняется.
    Существует несколько парадигм праграмирования. Каждая парадигма это стиль моделирования программы. Затронем например процедурное программирование. В нем существуют для моделирования задачи такие сущности как: структуры данных и процедуры которые эти структуры обрабатывают. Дело в том, что в программе есть всего две еденицы которыми мы управляем: данные и поведение. Структуры данных это собственно данные, процедуры это поведение. Смысл зачем появилось процедурное программирование именно чтобы дать программисту абстрагировать поведение (засунуть код обработки данные в именованную сущность, она еще называется функция или процедура). Что это нам дает? Раньше у нас была простыня кода которая расчитывала например зп сотрудников, если нам нужно было посчитать зп в разных местах нам нужно было копипастить эту простыню. А сначала нужно было разобраться что простыня делает. Это сложно. Теперь у нас появилась именованная сущность (процедура) которпя имеет метку имени calculateSalary. Ну и что? А то, что теперь нам во первых не нужно копипастить код, во вторых (в идеале) не нужно разбираться как он работает. Мы просто знаем что calculateSalary считает зп для сотрудника. Как оно это делает, нам совершенно похер. Снизилась когнитивная нагрузка на мозг при моделировании задачи и повысилась переиспользуемость кода, тем самым сократилось время разработки. Но умные люди на этом не остановились и стали развивать идею дальше. Дальше они подумали, что не плохо было бы обьеденить в одной сущности данные и действия над этими данными, назвали это обьектами, которые могут формироваться на основе классов. Теперь у нас обьеденены данные и процедуры в одной именованной сущности (это инкапсуляция). Подробнее об инкапсуляции можете почитать в другом моем ответе https://qna.habr.com/q/1174988#answer_2194198
    В общем вы не поймете прелесть ООП пока не поработаете по той причине, что нужно набрать массу сложности в проекте, которую генерируете как вы сами так и другие программисты, и не поймете прелесть повторного использования кода которое дает ООП, потому что у вас нет горящих сроков. Тут еще можно в целом много чего написать на тему ООП, но я бы вам посоветовал следующие книги:

    Стив Макконел - Совершенный код
    Гради Буч - Обьектно ориентированный анализ и проектирование
    Сергей Типляков - Паттерны проектирования на платформе .NET (это вместо банды четырех, т.к. там более современно раскрывается тема паттернов, не пугайтесь что она про C# .NET, книга в самом деле очень хорошая)

    Так же список терминов на погуглить
    GRASP - Information Expert
    Information Hiding
    Software Complexity (это то откуда всё начинается, управление сложностью)
    Cohesion & Coupling

    Если вы все эти темы осознаете, то будете понимать в ООП и проектировании больше 95% ваших будующих коллег, я вам гарантирую.
    Ответ написан
  • Стоит ли идти в 3д в 2022?

    DollyPapper
    @DollyPapper
    Не знаю правда ли в 22 году сложно найти работу, но если реально трудно, то попробуйте тут помониторьте стажировки
    Ответ написан
    Комментировать