Задать вопрос
  • Как сменить стэк?

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

    Что лично вижу сейчас. На данный момент почти каждая вакансия senior вакансия на golang, которую приносят приятные девушки HR содержит требование 3 лет в Golang или опыт работы senior на другом стеке с желанием переучиться на go.

    На менее хайповых стеках такое тоже бывает. Бывают готовы обучать на редкие языки - ruby, например вспоминают пару раз в год. Лет 7 назад также массово вербовали на nodejs. А сагитировать с PHP в Python так вообще святое дело. Такое происходит и на позиции мидлов. На тот же go в крупные компании часто достаточно хорошего опыта мидла и желания изучать go. Зп будет из грейда мидла.

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

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    Господи, изучите сначала теорию о работе с базами данных, перед тем как задавать такие вопросы, потому что это просто смешно уже...

    Во первых, если вам нужно установить связь между этим
    public List<CodeSnippet> LikedCodeSnippets { get; set; } = new List<CodeSnippet>();


    И этим
    public List<User> UsersWhoLiked { get; set; } = new List<User>();


    Вам нужна дополнительная таблица. Почему? Потому что тут связь много-ко-многим. Вот она:
    public sealed class UserCodes
    {
        public int UserId { get; set; }
        public User User { get; set; }
    
        public int CodeId { get; set; }
        public CodeSnippet Code { get; set; }
    }


    Через эту таблицу далее конфигурируете связь много-ко-многим

    Что значит эта запись?
    public User User { get; set; } = null!;

    В чём смысл говорить, что она null и ставить ! как обозначение того, что она not null?
    Ответ написан
    2 комментария
  • Реально ли трудоустроиться на работу после курсов it?

    На каких-то курсах предусмотрено гарантированное трудоустройство в договоре.

    Гарантировать трудоустройство невозможно, что бы тебе там не писали в договоре.
    В лучшем случае будет одно из двух:
    1. Трудоустройство в ту же контору, где тебе предлагают эти курсы, за бесплатно.
    2. Десяток собеседований в день в течение месяца с требованием на получение письменного отказа, чтобы получить возврат средств за эти курсы.

    Пробовала сама изучать Excel, SQL-это нужно в аналитике данных, создала резюме, откликалась на вакансии на hh.ru без результатов.

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

    Если со знаниями проблем нет, то курсы вам ничего не дадут - смотрите в своё резюме, оформляйте его так, чтобы в хорошем ключе выделиться на фоне других соискателей, пробуйте писать напрямую рекрутерам, подавайте заявки на стажировки, не чурайтесь откликами в мелкие или непрофильные компании (вам на этом этапе опыт нужен. Крупные компании часто даже не рассматривают кандидатов без опыта)
    Ответ написан
    Комментировать
  • Что думаете о Livewire и Inertia.js?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    Про inertia почти ничего не скажу. Про livewire - Для mvp, низкобюджетных стартапов, инди-проектов, того что по умолчанию для ограниченной аудитории и не должно быть слишком нагруженным, админок каких-то... вполне себе вариант.
    Для более серьёзных вещей и с расчетом на перспективу - я бы оставалась на проверенных технологиях.
    Из подводных камней - с технологической стороны - дикое смешение ответственностей. С практической - каждый чих изменения в интерфейсе - та же кнопочка счетчика, смена таба, или еще чего, реализованного без православных скриптов - это запросы на сервер. И еще - серьёзный локинг на этих технологиях, их апдейтах.
    А конкретно tailwind мне таки зашёл, если его с умом готовить и выносить наборы в scss. В компании с purgecss на выходе можно получить очень лёгкий css файлик. Но он обязательно в компании с компонентами - блейд, или js -фреймворков (И это, разумеется с позиции бекендера. Если на проекте есть заведующий фронтом - то ему и править балом).
    В любом случае я бы посоветовала не полагаться только на мнение других, а покрутить и пощупать всё самому. Как минимум - они на хайпе, и значит есть вероятность что все равно с ними столкнётесь рано или поздно
    Ответ написан
    Комментировать
  • Как добавить новый реквизит в План Видов Расчета в Расширении?

    @Dementor
    программист, архитектор, аналитик
    Не могу понять в чем дело. Как быть?

    Подтверждаю наличие этой ошибки в версии 8.3.22
    (возможно и в более поздних - нет под рукой для проверки)

    Как быть?

    1. Написать письмо на v8@1c.ru с описанием воспроизведения и номером вашего активного договора ИТС (иначе не зарегистрируют). Вам дадут номер ошибки, по которому сможете отслеживать статус исправления. Возможно починят в ближайшем 8.3.26
    2. Включить возможность редактирования в настройках поддержки основной конфигурации и добавить недостающий реквизит. Распространенная практика править структуру в основной конфе, а логику выносить в расширения, каждое из которых будет видеть новый реквизит.
    3. Добавить в расширении регистр сведений с измерениями как в вашем регистре расчета и с нужными реквизитами. При записи набора записей по регистру расчета делать синхронную запись в новый регистр сведений. В точке использования (отчет? динамический список формы?) добавить левое соединение с новым регистром.
    Ответ написан
    1 комментарий
  • Как маппить результат запроса бд в структуры со вложенностями Golang?

    - Я считаю, что свой кастомный маппер - это отличное решение. Чтобы быть уверенней, обязательно напишите тесты. Как unit, так и интеграционные, например, с помощью testcontainers.

    - Можете вместо pgx посмотреть в сторону sqlc. У него совершенно другой подход. Вы пишете запрос со всеми джойнами, а он вам автоматически генерирует код со всеми структурами и функциями. Правда, там по джойнам практически отсутствует документация, но уж погуглите.

    - Ну, и если совсем сложно... то... может одним глазком глянуть в сторону ORM? Я никому не расскажу...
    Ответ написан
    5 комментариев
  • Как хранить изображения в PostgreSql?

    @rPman
    Базы данных не очень эффективны с BLOB-ами, большими объемами данных, вопрос даже не в скорости работы с ними, а в том что инструменты резервного копирования к примеру будут работать значительно медленее, чем если копировать файлы того же объема но размещенные на диске.

    Поэтому вместо хранения файлов, в базе данных размещают способ получения имени файла на диске, иногда это буквально поле с именем файла (например если имя файла такая же полезная информация) а чаще всего это буквально идентификатор с базы данных (число или его hex/base64 представление), иногда это хеш от содержимого (например чтобы эффективно хранить одинаковые файлы) иногда комбинация хеша и имени...

    Тебе нужно будет продумать дополнительную прослойку по указанию места на диске для всего каталога (а их может быть несколько) либо помещая идентификатор каталога либо размещая полный путь к файлу (не рекомендую), либо формируя имя из идентификатора (части его бит) либо и то и другое. Рекомендую по возможности сохранять расширение имени файла для быстрой идентификации его типа для веб сервера (который очень эффективно отдает статику из файлов)

    Причина - большое (десятки тысяч) количество файлов в одном каталоге не совсем удобно в том плане, что многие утилиты резервного копирования (да и просто работа с файлами, получение списка или удаление с помощью bash rm, он до сих пор глючный и тормозит), поэтому вместо хранения файла 031432532341234123.jpeg делать подкаталоги 0314/3253/2341/234123.jpeg заранее расчитав количество уровней от прогнозируемого количества файлов.
    Ответ написан
    1 комментарий
  • Как добавить отношения "многие-ко-многим" между таблицами из разных баз данных?

    Если вы разделяете проект на микросервисы, но связываете при этом их данные, то вы просто делаете распределённый монолит. А когда вы ещё и базу разрываете на два куска, при этом пытаясь сохранить между ними традиционные связи, как внутри одной базы данных, то вы:
    1. Не решаете абсолютно ни одной из задач микросервисов, т к. сервисы остаются жёстко связанными. Всё можно было бы решить просто при помощи "Clean architecture", DDD и т.д.
    2. Вы добавляете себе невероятное количество головной боли, связанной с самой микросервисной архитектурой, но и плюс все прелести из п.1.
    3. И тогда нафига козе баян?

    - Микросервисы должны иметь полностью независимые базы данных
    - Все взаимодействия должны осуществляться исключительно по API (это мой ответ на ваш вопрос). Как только вы связываете схемы данных, вы теряете весь смысл микросервисов.
    - Вы должны обязательно реализовать распределенные транзакции. Вы должны сами писать код для таких транзакций. А вспомните, как приятно и просто делать транзакции в монолите с одной базой данных.
    - Взаимодействие между микросервисами должно осуществляться на базе строжайших контрактов, которые можно менять только после обсуждения со всеми людьми, разрабатывающими данные микросервисы. Вам неплохо было бы выдумать или позаимствовать какой-то фреймворк, где четко будут описаны общие и частные принципы общения микросервисов.
    - Вы должны обеспечить мониторинг всего и вся, оповещение об отказах и деградации микросервисов
    - Вы должны обеспечить распределенное логирование, чтобы уметь отслеживать даже, например, простые запросы между логами из нескольких независимых систем.
    - И т.д. и т.п.

    Оно вам надо?
    Ответ написан
    Комментировать
  • Как правильно разрабатывать symfony приложение локально?

    Я использую для локальной разработки docker compose.
    В его конфигурационном файле собираю все нужные контейнеры (PHP, MySQL, Rabbit, Mongo и т.д.) в сеть. Для PHP делаю два контейнера из разных образов:
    Один из образа php-fpm, это сам сервер.
    Второй из образа php-cli, он используется как раз для всех консольных команд. Именню в него устанавливаю Composer.
    Для того, чтобы не писать для запуска консольных команд постоянно это заклинание "docker compose run ...", я делаю Makefile, в котором прописываю часто-используемые команды.
    И, набрав "make cc" на самом деле запускаю "docker-compose run --rm php-cli bin/console c:c"
    Чтобы это всё работало без необходимости постоянно перезапускать docker-compose, я файлы проекта пробрасываю внутрь контейнеров не копированием, а через вольюм, и когда я буду их менять, они будут меняться и внутри контейнера. Так же подключаю прямо внутрь контейнера .env файл, чтобы все переменные окружения туда пробросились.
    Я вам прямо закину кучу файлов из одного из своих старых проектов, может накопаете там идей каких-то для себя:
    1. docker-compose.yml
    version: '3.8'
    services:
      # Поднимаю сразу реверс-прокси, чтобы пробросить всё наружу на нужный мне порт.m
      nginx:
        build:
          context: ./.docker/nginx
          dockerfile: Dockerfile.dev
        volumes:
          - ./:/app
        depends_on:
          - php-fpm
        ports:
          - "8080:80"
    
      php-fpm:
        build:
          context: ./.docker/php
          dockerfile: Dockerfile.fpm-dev
          args:
            IMAGE_ENV: dev
        volumes:
          # Вот тут вся магия) Мы просто подключаем файлы проекта в виде вольюма
          # Т.е. имеем доступ ко всем файлам и изнутри и снаружи контейнера. 
          # Внутри контейнера файлы будут видны по пути /app
          - ./:/app
        environment:
          # Даже XDEBUG можно пробросить для IDE
          XDEBUG_CONFIG: 'discover_client_host=true client_host=127.0.0.1 log_level=0 client_port=9003'
          PHP_IDE_CONFIG: "serverName=Docker"
        env_file:
          - .env.local
        depends_on:
          - mysql
    
      # Делаю отдельный контейнер для комманд-лайн утилит, 
      # чтобы не проще запускать консоль Symfony. Мне так удобнее.
      # Здесь будет всё практически как и у php-fpm, только без самого php-fpm процесса
      php-cli:
        build:
          context: ./.docker/php
          dockerfile: Dockerfile.cli-dev
          args:
            IMAGE_ENV: dev
        volumes:
          - ./:/app
          - composer:/root/.composer/cache
        environment:
          XDEBUG_CONFIG: 'discover_client_host=true client_host=127.0.0.1 log_level=0 client_port=9003'
          PHP_IDE_CONFIG: "serverName=Docker"
        env_file:
          - .env.local
        depends_on:
          - mysql
    
      mysql:
        build:
          context: ./.docker/db
          dockerfile: Dockerfile
        volumes:
          - mysql:/var/lib/mysql
        env_file:
          - .env.local
        environment:
          MYSQL_ROOT_HOST: '%'  # needs to be enclosed with quotes
        ports:
          - "6603:3306"
    
    # Тут ещё два дополнительных вольюма. Один для кэша composer, а второй для файлов базы данных, чтобы она не убивалась при перезапуске наших контейнеров. Убивать мы её будем только сознательно. если нам надо её очистить.
    volumes:
      composer:
      mysql:


    2. Все три докерфайла
    Файлы с конфигурациями, которые будут копироваться внутри докерфайлов, кидать не буду, у вас всё своё будет в любом случае.

    Dockerfile.dev - для nginx.
    # Образ Nginx
    FROM nginx:alpine
    
    # Копируем файл с настройками
    COPY ./task/default.conf /etc/nginx/conf.d/default.conf
    
    # Устанавливаем рабочую директорию
    WORKDIR /app


    Dockerfile.fpm-dev - для сервера php-fpm
    # Образ php-fpm
    FROM php:8.2-fpm
    
    ARG IMAGE_ENV
    
    # Устанавливаем нужные пакеты и расширения
    RUN apt-get update && apt-get install -y -qq libpq-dev unzip libxml2-dev libicu-dev libonig-dev zlib1g-dev libpng-dev librabbitmq-dev \
        && docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd && docker-php-ext-install pdo_mysql && \
        docker-php-ext-configure intl && docker-php-ext-install intl && \
        pecl install xdebug amqp && rm -rf /tmp/pear && docker-php-ext-enable xdebug amqp && \
        rm -rf /var/lib/apt/lists/*
    
    # Use the default development configuration
    RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
    
    # Копируем файл с настройками xdebug
    COPY ./php.d/${IMAGE_ENV}/default.ini /usr/local/etc/php/conf.d/default.ini
    COPY ./php.d/${IMAGE_ENV}/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
    
    
    # Создаем пользователя app, чтобы не работать под рутом
    RUN adduser --disabled-password --gecos '' --uid 1000 app
    USER app
    
    # Устанавливаем рабочую директорию
    WORKDIR /app


    Dockerfile.cli-dev - это наш консольный php для запуска консольных команд. Тут практически то же самое, плюс тот самый Composer, ради которого это всё и писалось)
    # Образ php-cli
    FROM php:8.2-cli
    
    ARG IMAGE_ENV
    
    # Устанавливаем нужные пакеты и расширения
    RUN apt-get update && apt-get install -y -qq git unzip libpq-dev libxml2-dev libicu-dev librabbitmq-dev && \
        docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd && docker-php-ext-install pdo_mysql && \
        docker-php-ext-configure intl && docker-php-ext-install intl && \
        pecl install xdebug amqp && rm -rf /tmp/pear && docker-php-ext-enable xdebug amqp && \
        rm -rf /var/lib/apt/lists/*
    
    # Use the default development configuration
    RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
    
    # Копируем файл с настройками xdebug
    COPY ./php.d/${IMAGE_ENV}/default.ini /usr/local/etc/php/conf.d/default.ini
    COPY ./php.d/${IMAGE_ENV}/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
    
    # Качаем и устанавливаем composer
    RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/bin --filename=composer --quiet
    
    # Если всё же будете работать в контейнере под рутом, то заставляем composer работать под рутом
    # ENV COMPOSER_ALLOW_SUPERUSER 1
    
    # Создаем пользователя app, чтобы не работать под рутом
    RUN adduser --disabled-password --gecos '' --uid 1000 app
    USER app
    
    # Устанавливаем рабочую директорию
    WORKDIR /app


    3. И далее звезда шоу - Makefile с кучей разных скриптов, облегчающих жизнь.
    make init - чистая сборка проекта, тут можно очищать базу и загружать в нее фикстуры
    make up - просто запуск проекта, без очистки, перед началом обычного рабочего дня.
    make down - остановка проекта
    make cc - очистка кэша Symfony.
    И т.д. и т.п.
    # Если надо подключить shell переменные, то создаём тут же ..env.local файл и делаем.
    include .env.local
    export
    
    # Поддержка возможности запускать шелл-скрипты
    SHELL:=/bin/bash
    
    # Кэш
    c: cache-clear cache-warmup
    cc: cache-clear
    cw: cache-warmup
    cache-clear:
    	docker-compose run --rm php-cli bin/console c:c
    cache-warmup:
    	docker-compose run --rm php-cli bin/console c:w
    
    up: docker-up
    down: docker-down
    restart: docker-down docker-up
    init: docker-down init-common
    reset: docker-down-clear init-common
    init-common: clear docker-pull docker-build docker-up app-init
    test: test
    test-coverage: test-coverage
    test-unit: test-unit
    test-unit-coverage: test-unit-coverage
    
    # Если в контейнере другой пользователь, то будут ошибки доступа при редактировании файлов.
    # Поэтому надо сделать chown и chmod для папки var (кэш и логи)
    chown:
    	sudo chown -R 1000:1000 . # Тут указываем свои данные пользователя с хоста
    	sudo chmod -R 777 ./var/
    
    docker-up:
    	docker-compose up -d
    
    docker-down:
    	docker-compose down --remove-orphans
    
    docker-down-clear:
    	docker-compose down -v --remove-orphans
    
    docker-pull:
    	docker-compose pull
    
    docker-build:
    	docker-compose build
    
    app-init: composer-install app-wait-db app-migrations ready
    
    clear:
    	docker run --rm -v ${PWD}:/app --workdir=/app alpine rm -f .ready
    
    ready:
    	docker run --rm -v ${PWD}:/app --workdir=/app alpine touch .ready
    
    test:
    	docker-compose run --rm php-cli php bin/phpunit
    
    test-coverage:
    	docker-compose run --rm php-cli php bin/phpunit --coverage-clover var/clover.xml --coverage-html var/coverage
    
    test-unit:
    	docker-compose run --rm php-cli php bin/phpunit --testsuite=unit
    
    test-unit-coverage:
    	docker-compose run --rm php-cli php bin/phpunit --testsuite=unit --coverage-clover var/clover.xml --coverage-html var/coverage
    
    composer-install:
    	docker-compose run --rm php-cli composer -V
    	docker-compose run --rm php-cli composer install
    
    app-create-db:
    	docker-compose run --rm php-cli ./bin/console doctrine:database:create
    
    app-wait-db:
    	#docker-compose exec lkui-mysql mysqladmin --user=root --password=password ping --silent --wait=60 &> /dev/null
    	#sleep 20
    	until docker-compose exec -T mysql mysqladmin ping -u root -P ${MYSQL_TCP_PORT} -p${MYSQL_ROOT_PASSWORD} | grep "mysqld is alive" ; do >&2 echo "MySQL is unavailable - waiting for it... " ; sleep 5 ; done
    
    app-migrations:
    	docker-compose run --rm php-cli ./bin/console doctrine:migrations:migrate --no-interaction
    
    app-fixtures:
    	docker-compose run --rm php-cli ./bin/console doctrine:fixtures:load --no-interaction
    
    migration:
    	docker-compose run --rm php-cli ./bin/console make:migration
    
    migrate:
    	docker-compose run --rm php-cli ./bin/console doctrine:migrations:migrate #--no-interaction
    
    fixtures:
    	docker-compose run --rm php-cli ./bin/console doctrine:fixtures:load
    Ответ написан
    2 комментария
  • Переписать грамотнее и с помощью Laravel реально ли и каким лучше образом?

    vhood
    @vhood
    Не забывайте отмечать решения
    Выводить HTML через echo точно не правильно, изначально PHP полюбили как раз за то, что можно закрыть PHP тег ?> и писать чистый HTML, можно посреди HTML открыть PHP тег <?php и воспользоваться языком, например вывести HTML в цикле (опять же, закрыв тег после начала цикла), или использовать переменную как значение, или выводить HTML по условию.

    В Laravel используется шаблонизатор Blade, но если есть ощущение, что Laravel изучать еще рано, можно через composer поставить какой-нибудь самостоятельный шаблонизатор (искать не сложно) и научиться пользоваться им.

    тут всякие визуальные уточнения страницы; форма, css специфика для страницы
    css стоит писать отдельно и подключать как файл/файлы, для формы будет отдельный шаблон

    тут всякие оперативные реакции на действия в браузере требуемые страницей.
    js тоже стоит писать отдельно и подключать как файл/файлы

    Работа с шаблонами - не самое востребованное знание, скорее очень базовое. Стоит так же изучить:
    • Архитектурный паттерн MVC (Model, View, Controller), т.к. его все популярные фреймворки реализуют и с ним так или иначе придется работать
    • Базы данных и SQL. Обязательно нужно уметь проектировать таблицы и индексы, забирать данные из базы и обновлять их
    • Безопасность, или как правильно писать приложения, что-бы их не взломали SQL инъекциями, XSS атаками и т.д.
    • Маршрутизацию. Можно попробовать найти какой-нибудь php-router на github и изучить работу с ним, внедрить в проект

    Таким образом, приложение будет обрабатывать запрос через некий роутер, посылать его в контроллер (буква C из MVC), контроллер запросит данные в какой-нибудь модели (M), отправит их в шаблон некого шаблонизатора и вернет с его помощью готовый HTML.

    После этого можно будет написать такое же приложение на Laravel, где все это уже есть (и даже больше, разумеется), познакомиться с ActiveRecord (объект, который представляет строку в базе данных) и ORM (для построения запросов). Перед началом стоит прочитать всю документацию, изучить возможности.

    Так же добавлю, что первую работу лично я нашел без знания фреймворков, но хорошее знание языка и баз данных, а так же знания HTML, CSS и базовые знания JS - обязательно. Да и без фронтенда динамичный сайт не сделать, но начать изучение фронтенда лучше всего с изучения чистого javascript, т.к. знание языка важнее и открывает правильную дорогу дальше. А вот на каком этапе изучения останавливаться и куда больше делать упор - решать Вам.
    Ответ написан
    1 комментарий
  • В какую сторону учиться, QA, front end или back end для реалистичного входа?

    vhood
    @vhood
    Не забывайте отмечать решения
    чуйка говорит, что через QA реалистичнее "ворваться". Что думаете?
    Думаю, это маркетинг.

    Вообще, хотелось бы, конечно, выучить хорошо Excel, SQL и дэшборды делать какие-нибудь на первых порах:), но судя по всему требуется знать финанализ, опыт в бизнесе и маркетинге и тд, чего у меня нет.
    Это требуется тем, кто ставит задачи, а разработчикам лишь для ознакомления и не обязательно.
    Смотри в сторону "разработчик баз данных / SQL разработчик" стажер/trainee.
    Советую хорошо изучить устройство баз данных, язык SQL и поработать с тестовыми данными и задачами.
    Ответ написан
    Комментировать
  • В какую сторону учиться, QA, front end или back end для реалистичного входа?

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    Ок, обо всём по порядку

    IT в самом худшем положении чем когда-либо

    Да, есть такое. В первую очередь это вызвано из-за быстрорастущей сферы ИИ. Я думаю вы в курсе, что уже сейчас есть нейронки, которые могут по наброску написать страницу сайта на React, что в 1 000 раз быстрее, чем сделал это джун, и в столько же раз дешевле. Зачем тогда держать джунов? Это и есть одна из причин, по которой требования растут.

    Вторая причина, это конечно же мировой кризис, войны, пандемия так же принесла свой вклад в это.

    И третья причина, это огромный приток людей в сферу ИТ. У нас очень любят шутить: "Если ты попробовал всё и у тебя ничего не получилось в жизни, иди в IT, сюда идут все кто ничего не смог добиться". Вообще это достаточно странно, потому что программисты должны быть умными и знать очень много, тут люди могут всю жизнь учиться. Почему так случилось? Потому что пришёл тот же PHP, Python и прочее, где низки порог вхождения, и тут уже всё стаёт на свои места. Даже школьники пишут всякую дичь на PHP и очень этим гордятся.

    Со стороны работодателя, как понять, что ты принимаешь на роботу человека с опытом и мозгами в голове, а не школьника? Поднимать требования!

    Почему поднимаются ЕЩЁ требования? Потому что если очень много людей на рынке, ты можешь выставлять более высокие требования. Это природны отбор и тут нет ничего удивительного. Скоро это всё будет на уровне вундеркиндов (с вундервафлями). За год выпускается группа в универе где есть обученные студенты программирования. В такой группе может быть человек 30, на потоке 120 и больше. Таких университетов 100500. Как понять кто лучше из них, кто знает и хочет работать, а кто пошёл сюда чисто, потому что он тупой и больше никуда его не взяли?

    конкуренция адская, front-end, UX/UI дизайнеров и тестировщиков/QA -- как собак нерезаных и все профнепригодны

    Ещё одна причина по которой это всё происходит. Почему вообще IT стало очень популярное? Потому что большинство заказов на проекты были западные, соответственно, з/п в долларах это очень сладкая и желательная вещь для всех. Но теперь рынок в странах бывшего СССР очень сильно просел из-за таких вещей.

    А теперь подумайте, выгнали целый отдел программистов, мидлы, синьйоры и т.д. и сидят они без работы. Месяц, два, пол года. Мидл, который по факту стоит около 4000 долларов, за пол года без работы будет пробовать подавать заявку на вакансии джун/джун-стронг с зп 2000-3000 долларов. Почему? Потому что у него нет работы

    А как со стороны работодателей? Взять перспективного джуна по цене 1000 долларов на вакансию 2000 долларов, либо взять мидла, который стоит 4000 долларов, по платить ему 2000-3000? Конечно, тут все очевидно.

    А теперь все эти факты в совокупности дают очень большой регресс для рынка. Хочешь нормально зарабатывать? Ты должен составить конкуренцию и победить в этом среди этих 300 человек. А среди них может быть кто угодно. И при этом всё, вероятность пройти хотя бы ДО СОБЕСЕДОВАНИЯ крайне мала. Скорее всего ваш непрочитанный отзыв завернут после 3х недель ожидания и всё.

    КУДА ИДТИ И КЕМ БЫТЬ?
    Вообще в вашей ситуации, тут больше вопрос "Как?", а не "Кем?". Если вы посмотрите на статистику, то примерно все developer стеки получают одинаково на уровне senoir.

    Так же не стоит думать, что перейти из QA и Dev'ы можно вот просто так. Сейчас разработчики сами отлично умеют всё тестировать, так что тут сложно сказать что-то... Вообще QA стек используется одни инструменты, deve стек использует другие инструменты для работы, по этому тут так же не получится прыгать туда-сюда. Даже если вы будете QA и захотите перейти в dev'ы и программирования не убежишь

    А вообще я бы посоветовал заводить общение с программистами и учить, учить и ещё раз учить. Потому что тут играет ещё одно очень важное правило, что вы никому даже бесплатно не нужны, если вы приносите прибыть. Что бы приносить прибыть, не получится прийти и сказать: "Давайте я тут у вас потусуюсь, что-то учить буду, 3 строки напишу, а вы мне стакан риса". Да, так не прокатит, как бы это печально не звучало.

    Года 2 назад даже с небольшими, но уверенными знаниями программирования вас бы с руками и ногами забрали, если бы вы сказали, что вы там алгоритмы знаете, или на C++ умеет писать программы. Та вам все дороги открыты были бы
    Ответ написан
    2 комментария
  • Для чего нужен nodejs?

    @Alex_At_Net
    Обращайтесь, помогу - https://t.me/codecraft_phd
    самое простое объяснение: node.js - это exe-файл `node.exe`, который выполняет инструкции из .js файла. Запускать из коммандной строки:

    node.exe server.js

    Инструкцией в JS файле может быть: создать web-server, который на запрос /users возвращает HTML строку со списком пользователей.

    server.js файл может быть таким:

    require('http').createServer((req, res) => {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.end('Привет!');
    }).listen(3000, () => { });


    express - это набор функций (в примере выше require, createServer - вызовы функций), которые упрощают написание правил "запрос -> генерация ответа". Посмотрите на примеры: https://expressjs.com/en/starter/hello-world.html

    хост-провайдер, в данном случае, предоставляет машину, с windows или linux, на которой можно запустить node.exe с приведенным server.js. Хост провайдер, в отельной системе, настраивает так, что запросы www.mysite.com направляются на эту машину, на её 3000 порт.

    php - это, в большинстве случаев, модуль Web-server-а. В терминах этого примера, php - это функция, которой передается php файл, а на выходе - строка результата. Например:

    require('http').createServer((req, res) => {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.end(php('c:\\projects\\app\\main.php')); // вызов PHP
    }).listen(3000, () => { });
    Ответ написан
    7 комментариев
  • Почему такая долгая загрузка в Яндекс Диск?

    @Maxim_Q
    Яндекс специально ограничивает скорость и вставляет палки в колеса при использовании Яндекс Диска по webdav, это уже разбирали тысячу раз и все матюкались на это дело. Янедексу не выгодно чтобы вы напрямую подключались к диску, т.к. за вами нельзя шпионить через их приложения.
    Это никак не исправить и никак на это не повлиять, проблема не у вас, а у Яндекса и он это решать не будет.
    Ответ написан
    Комментировать
  • Как ведут себя данные при удалении?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В реляционных БД не существует гарантий относительно порядка записей внутри таблицы. Этот порядок
    - это особенности технической реализации хранения данных внутри блоков и сегментов. Это - "know how"
    и это будет зависеть от типа DBMS (Postgres, MySQL, Oracle) и от типа таблицы (heap, index-organized, clustered e.t.c)

    Если говорить грубо, то записи (data-rows) лежат не плотно а вразнобой с пробелами с выравниванием
    к блокам. Ну тоесть вообще-вообще не так как в Excel. Удаление data-rows в Postgres насколько я помню
    физически не удаляет запись а помечает ее мертвой используя служебные поля. Впоследствии VACUUM
    делает работы по уплотнению.

    Поэтому порядок ты сам обеспечиваешь, делая запрос с опцией ORDER BY some_date_time.
    Ответ написан
    1 комментарий
  • Как создавать, принимать и обрабатывать socket?

    1. Вебсокеты - это сложновато.
    2. Вебсокеты на PHP - вдвойне сложно. Проблема в том, что PHP задуман как скриптовый язык, т.е. скрипт выполняется заканчивает свою работу. А вебсокет - это постоянное соединение, т.е нам надо, чтобы программа постоянно крутилась в фоне. Вебсокеты можно реализовать на PHP, но, как персонально мне кажется, проще будет выучить Go )) , или же, как в ответе уважаемого Артём , сделать сервер на ноде.
    3. Если ваш чат не такой супер-функциональный, как чат в мессенджерах, то вместо вебсокетов можно обойтись SSE (Server Sent Events). SSE так же требует постоянного соединения, но всё работает через HTTP, и это ну прямо намного проще. Единственный недостаток - это то, что SSE работает только в одну сторону: от сервера в браузер. Т.е. запросы из браузера можно получать обычным POST запросом, а отдавать обратно информацию уже через SSE.

    С SSE есть два пути:
    1. Написать сервер самому, используя какую-то простую библиотеку вроде этой https://github.com/hhxsv5/php-sse
    2. Но я бы сделал ещё проще. Есть такой великолепный проект под названием Mercure https://mercure.rocks
    Это отдельный сервис на Go, задача которого как раз поддерживать SSE соединение и отправлять сообщения в браузеры. Сервис сидит в фоне, а браузеры подписываются на события через EventSource буквально в три строчки, как описано тут https://mercure.rocks/docs/getting-started
    Прелесть этого в том, что для того, чтобы отправить сообщение всем браузерам из кода на PHP, вам надо просто сделать обычный POST запрос на специальный адрес этого сервиса Mercure с телом самого сообщения и его id. Т.е. вам не надо делать никаких долгоживущих процессов на PHP, всё будет работать как раньше.

    Т.е. подытожим:
    - Браузеры пользователей подписываются на события в Mercure
    - Пользователь 1 отправляет текстовое сообщение обычным POST запросом на обычный PHP сайт.
    - PHP сайт получает этот POST запрос, определяет, что его надо отправить Пользователю 2, и отправляет соответствующее сообщение обычным POST запросом в сервис Mercure
    - Mercure отправляет сообщение Пользователю 2 через SSE, на которые он подписан.
    - Сообщение появляется у него на страничке
    Ответ написан
    5 комментариев
  • Чем занимаются Middle Frontend разработчики?

    Праграмиравает, вот чем он занимается)
    А если серьёзно, то такая градация работников является чистой усвовностью, которая позволяет крупным конторам контролировать ЗП своих работников в зависимости от их скилла. Эта градация хорошо сортируется в их эксель-табличках с перформанс-метриками.
    В разных компаниях миддл может иметь совершенно разные навыки. Миддл в SpaceX и миддл на сайте для продажи женского белья - это два человека с космической бездной между ними в плане профессиональных навыков.

    Т.е. если вы в объявлении пишете, что ищете миддла, то вы сразу обговариваете категорию его зарптаты в вашей компании. И когда вы его наймёте, он не будет сильно сокрушаться, когда узнает, что сеньоры получают больше него.
    Ответ написан
    Комментировать
  • Как создать процедуру, которая будет возвращать что-то?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вам нужно начать с туториала и примеров, а не с тупых статей в интернете и собственных догадок.
    Просто возьмите учебник и потратьте некоторое время на изучение самых базовых основ. Если вам лень этим заниматься. то почему вы думаете, что людям тут будет не лень сочинять вам индивидуальные экспресс-курсы по изучению основ баз данных?
    Ответ написан
    Комментировать
  • Как организовать архитектуру приложения?

    emekhanikov
    @emekhanikov
    Разработчик и архитектор программного обеспечения
    Надо подумать о том как раздавать видео. Статику, коим является видео, через Java слать не сильно целесообразно, для статики больше подходит NGINX. Если будет большая нагрузка можно быстро упереться в ширину Интернет канала и скорость диска, придется добавлять больше серверов. Видео лучше распространять через CDN (когда статика в S3, например, если говорить про Амазон, у других облачных провайдеров наверняка есть аналоги).

    Надо еще подумать про контроль доступа к видео, будут ли они публичные или не всегда.

    Если будут не публичные ссылки на видео надо генерировать в Java так чтоб у них была ограничение время жизни, CloudFront позволяет генерировать подписанные ссылки в которых можно указать время жизни и много сего еще.

    Еще про видео, нужен формат в котором можно начинать смотреть видео полностью не скачивая, что-то типа HLS, там же можно настроить различные качества для различных клиентов
    Ответ написан
    Комментировать
  • Какой выбрать стек технологий?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    2) Есть видеопоток, на котором, например, обнаруживаются автомобильные номерные знаки и отправляется запрос в базу данных для проверки его наличия. В результате возвращается какой-то результат.
    Обычно делается полная обработка видео до конца, после чего все найденные номера пишутся в базу с метками времени, по необходимости делаются снэпшоты конкретного фрейма и сохраняются отдельно, ссылка на место хранения картинки так же пишется в бд. Далее уже можно делать запросы в бд на сопоставление двух таблиц - имеющегося списка владельцев и распознанных номеров. По необходимости заводится табличка связей, типа найдено юзер.айди / парсед_нумбер.айди для того чтобы не бегать с выборочными запросами по пользователю и т.п...

    3) Для этой базы данных я хочу создать WEB с личной учетной записью и реализацией в виде пользователя - администратора...
    Это базовый функционал любого современного фреймворка, авторизация и роли. Здесь вы никакого функционала по идее не пишете вообще. Только создаете и настраиваете соответствующие роли и права. "создать WEB" в вашем случае логично просто написав АПИ с десятком рутов, далее будет не особо важно будет ли у вас веб страничка или приложение.

    1) PostgreSQL
    Любая рбд. Специфичных задач я тут не вижу, подойдет все что можно установить и с чем вы знакомы лучше.

    2) Python + Tenserflow и/или что-то в этом роде + psycopg2
    Опять же, задача чисто прикладная, любые инструменты выполняющие поставленную задачу подойдут. Производительность и качество можно проверить только тестами на конкретных данных.

    По п.2, ожидается, что не будет необходимости отслеживать сразу несколько объектов и отправлять несколько параллельных запросов. Однако это не исключено.
    Это в любом случае будет работа с командной строкой, любой процесс из которой можно запустить отдельным потоком.

    3) Python + Flask и связанное с этим, например, Bootstrap и тому подобное
    Скорее всего апи на любом фреймворке + какой-нибудь реакт/вью.

    4) Android Studio, Kotlin + что-то для работы с БД
    По описанию скорее какой-нибудь PWA хватит с головой. Вся работа с бд идет через апи, ничего дополнительного особо придумывать не надо.

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