Система грейдов разработчиков — front-end программист

front-end developer

Посмотреть наши предыдущие статьи по рейдам можно тут: грейды общими словами, хард-скиллы, грейды full-stack и back-end разработчиков

Тут мы рассмотрим грейды фронт-энд разработчика со стеком технологий:

  • Javascript, Sass, React, Redux, Chromium браузерные расширения

А теперь — подробнее и с различением по уровням

  1. Джуниор

Комментарии: принимаем на этот уровень новичков без значимого опыта. На этот уровень не подымаются по системе грейдов.

  1. Джуниор+
  • Сильная экспертиза в следующих технологиях и инструментах: html, css
  • отличное владение функционалом препроцессора sass, использование css Variables
  • Верстка: респонсивная, адаптивная, кроссбраузерная, pixel-perfect верстка
  • базовое знание css анимаций, понимание принципа «mobile first»
  • Средний уровень знания в следующих технологиях  и инструментах: JavaScript, bootstrap, jQuery

Комментарии: по сути, это основы. С чего начинают фронт-енд разработчики веб-сайтов. Хорошая и эффективная верстка

  1. Джуниор++
  • Разбирается в основном проекте
  • Сильная экспертиза в следующих технологиях и инструментах: JavaScript (знание особенностей работы в браузером окружении, работа с DOM) , Redux, Git
  • Понимание следующих терминов/концепций: Иммутабельность, Чистая функция, Рекурсия, Замыкание
  • Уверенная работа с инструментами разработчика в браузере (dev-tools)
  • Средний уровень знания в следующих технологиях  и инструментах: React, webpack, gulp (на уровне настройки существующей сборки)

Комментарии: чтобы подняться на этот уровень, начинаем углубляться в front-end. Конфигурация сборок проекта

  1. Мидл
  • Разбирается в основном проекте на уровне, что может пояснять бизнес процессы коллегам
  • Помощь менеджерам в формировании более полных требований с технической точки зрения.
  • Понимание устройства и работы браузерных расширений. 
  • Создание React Component-ов, рефакторинг существующих компонентов.
  • Продвинутая работа с состоянием приложений: написаны состояние и экшены для целой страницы или крупной фичи. 
  • Сильная экспертиза в следующих технологиях  и инструментах: React (классовые/функциональные компоненты, жизненный цикл компонентов, использование возможностей стандартных хуков библиотеки react), redux-thunk, webext-redux

Комментарии: Мидл разработчик подразумевает более высокие компетенции, чем Джуниор. Он может принимать «решения». Например, разрабатывать архитектуру небольших приложений или «фичи». Так же, он более самостоятелен в работе и, постепенно, становится экспертом в своей области. И владеет более сложными технологиями. Значительно углубляемся в основную технологию — React. Причем, с практической точки зрения.

  1. Мидл+
  • Приличная экспертиза в Frontend части одного из проектов из экосистемы (наряду с основным проектом), уверенное выполнение задач
  • Написать кастомный React Hook, который используется в проекте.
  • Написана статья в Confluence об используемых ранее технологиях (разбор типичных ошибок, практики хорошего кода)
  • Сильная экспертиза в следующих технологиях и инструментах: React Hooks (написание кастомных хуков, оптимизация рендера компонентов — ускорение загрузки, уменьшение вычислительных затрат), 
  • webpack, gulp (на уровне самостоятельной разработки сборки проекта и автоматизации процессов), babel
  • Придерживается принципам программирования: YAGNI (You Ain’t Gonna Need It)

Комментарии: Еще глубже погружаемся в фронт-энд. Документируем опыт. Работаем с пакетными менеджерами и сборками. Экспертиза мидлов не ограничивается кодированием, т.е. активно применяет общепринятые принципы программирования и чистого кода

  1. Мидл++
  • Разбираться в бизнес-процессах одного из эко-системных продуктов на уровне чтобы передать знания
  • Опыт в оптимизации загрузки страниц сервиса. Понимание SSR & CSR в контексте оптимизации загрузки. 
  • Оптимизирована скорость загрузки (уменьшена в 1.5-2 раза) одной из ключевых точек проекта (страница).
  • Продвинутая работа с css/js анимациями. 
  • Сильная экспертиза в следующих технологиях и инструментах: Vue.js, Service Worker, Web Worker 
  • Придерживается принципам программирования: KISS (Keep It Simple, Stupid)

Комментарии: Более сложные технологии front-end, которые увеличивают гибкость реализации задач. Вопросы хорошего кода, безопасного и понятного кода, который легко поддерживать. Огромная польза от ускорения сервисов

  1. Сеньор
  • Не менее 5 лет работы в программировании (включая предыдущий опыт)
  • Написан новый крупный компонент (соизмеримый с проектом из микро-сервисной архитектуры) или проект, или сделан рефакторинг крупного компонента
  • Наставничество: ученик был повышен на 2 грейда
  • Сильная экспертиза в следующих технологиях и инструментах: SSR, CSR, SSG (знание плюсов, минусов, умение правильно выбрать подход для конкретного случая)
  • Понимание работы разных сетевых протоколов (HTTP, WebSocket)
  • Придерживается принципам программирования: DRY (Don’t Repeat Yourself)

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

  1. Сеньор+
  • Сильная экспертиза в следующих технологиях  и инструментах: Node.js, Создание npm пакетов
  • Создан полезный для проекта npm-пакет, который используется в нашем проекте.
  • Написана статья об этом компоненте или того же уровня в общедоступном айти ресурсе с большой аудиторией (habr или что-то подобное) от корпоративного аккаунта, на этом грейде или ранее
  • Занимается релизами в проекте над которым работают 2+ человек
  • Наставник 2+ человек, делает код ревью их кода
  • Придерживается принципам программирования: SOLID

Комментарии: добавляем не совсем профильные, но очень перспективные технологии, которые должны двинуть разработку за новые горизонты. Еще больше наставничества. А так же социальная активность от имени компании. Все в выигрыше.

  1. Сеньор++
  • Наставничество: ученик был повышен с Мидла до Мидла++
  • Создано несколько полезных для проекта npm-пакетов, которые используются в нескольких проектах из микро-сервисной архитектуры
  • Сильная экспертиза следующих технологиях и инструментах: Node.js, koajs, mySQL, Jenkins

Комментарии: еще больше взаимной пользы. И программисту и компании

Система грейдов разработчиков — back-end программист

back-end developer

Ранее, мы исследовали грейды в общем, порассуждали про хард скиллы и рассмотрели пример грейдов фулл-стек программиста.

В этой статье, нас интересуют грейды бэк-енд разработчика

Пример основного стека:

  • язык: PHP, Laravel, Codeigniter (язык программирования и фреймворки на нем: новый, современный и старый, легаси)
  • Основная база данных: MySQL, дополнительные: Sphinx, Redis
  • Сервера Linux, Nginx, PHP-FPM, Docker

А теперь — подробнее и с различением по уровням:

  1. Джуниор

Комментарии: принимаем на этот уровень новичков без значимого опыта. На этот уровень не подымаются по системе грейдов.

  1. Джуниор+
  • Базовые знания composer и фрейворк Laravel (на примере оформления цикла жизни http запроса)
  • знание git, gitflow, 
  • навыки работы с консолью linux

Комментарии: предполагается, что Laravel — основной фреймворк, на котором разрабатываются все новые задачи. Ну а систему контроля версий, тоже, нужно знать как можно раньше

  1. Джуниор++
  • Продвинутые знания Laravel: джобы, гейты, политики, посредники, composer пакеты, продвинутые знания в ОРМ в части родительских и полиморфных связей), 
  • знание Codeigniter на примере цикла жизни http запроса, включая основы безопастности передачи данных
  • понимание принципов юнит тестирования, архитектуры тонких контроллеров, принципов проектирования rest api

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

  1. Мидл
  • Разбирается в основном проекте на уровне, что может пояснять бизнес процессы коллегам
  • Принимать архитектурные решения. Связка 2 и больше таблиц для решения поставленных требовании
  • Нереляционная база данных, кеширование, Redis
  • юнит тестирование
  • понимание значения индексов MySQL, умение писать оптимальные сырые запросы (без ORM)

Комментарии: программист на уровне Мидл должен быть выше Джуна принципиально. Он может принимать «решения». Например, разрабатывать архитектуру небольших приложений или «фичи». Так же, он более самостоятелен в работе и, постепенно, становится экспертом в своей области. И владеет более сложными технологиями. Так как на этом грейде, речь была про архитектуру, добавляем хорошее знание баз данных.

  1. Мидл+
  • Приличная экспертиза в одном из проектов из экосистемы (наряду с основным проектом), уверенное выполнение задач
  • грамотное применение паттернов проектирования, 
  • работа с Docker, Docker-compose
  • хорошая база знаний чистого php (не в рамках фреймворков)
  • Придерживается принципов программирования: YAGNI (You Ain’t Gonna Need It)

Комментарии: полезные, современные бэкэнд технологии. Алгоритмы. Оптимальный код Экспертиза мидлов не ограничивается кодированием, т.е. активно применяет общепринятые принципы программирования и чистого кода

  1. Мидл++
  • Разбираться в бизнес-процессах одного из эко-системных продуктов на уровне чтобы передать знания
  • описание и дополнение статей  лучших практик в рамках проектов компаний
  • знание Manticore (Sphinx)
  • Jenkins (сборка проектов)
  • Придерживается принципам программирования: KISS (Keep It Simple, Stupid)

Комментарии: еще больше полезных и сложные технологии бэкенда, которые увеличивают гибкость реализации задач. Так же подымаются вопросы сборок, релизов, CI/CD

  1. Сеньор
  • Не менее 5 лет работы в программировании (включая предыдущий опыт)
  • Сильная экспертиза в следующих технологиях  и инструментах:
  • Linux server console / Nginx config
  • Написан новый крупный компонент (соизмеримый с проектом из микро-сервисной архитектуры) или проект, или сделан рефакторинг крупного компонента
  • Наставничество: ученик был повышен с Джуна+ или Джуна++ до Мидла
  • Придерживается принципам программирования: DRY (Don’t Repeat Yourself)

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

  1. Сеньор+
  • Сильная экспертиза в следующих технологиях  и инструментах: создание Composer-пакетов
  • Написан необходимый Composer-пакет для одного из наших модулей (или блока, который необходимо выделить в модуль). Подключение в нашем проекте
  • Написана статья об этом компоненте или того же уровня в общедоступном айти ресурсе с большой аудиторией (habr или чтото подобное) от корпоративного аккаунта, на этом грейде или ранее
  • Занимается релизами в проекте над которым работают 2+ человек
  • Наставник 2+ человек, делает код ревью их кода
  • Придерживается принципам программирования: SOLID

Комментарии: добавляем профильные, очень перспективные технологии, которые должны двинуть разработку за новые горизонты. Еще больше наставничества. А так же социальная активность от имени компании. Все в выигрыше.

  1. Сеньор++
  • Знание работы ядер фреймворков, задействованных в компании
  • Сильная экспертиза в CI/CD. Внедрение промывных процессов в разработке
  • Наставничество: ученик был повышен с Мидла до Мидла++
  • Выступление на айти конференции от лица компании по актуальной теме, на этом грейде или ранее

Комментарии: Уровень «бог программирования». Лидер мнений в компании и айти сфере. Еще больше взаимной пользы: и программисту, и компании

Система грейдов разработчиков — full-stack программист

full-stack developer

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

Пришло время посмотреть реальные примеры грейдов хард-скиллов программистов.

В этой статье «под прицелом» фулл-стек разработчик со стеком технологий:

  • Бэкенд: PHP, Laravel, Codeigniter (язык программирования и фреймворки на нем: новый, современный и старый, легаси), MySQL
  • Фронтенд: JS, React (основная библиотека), Vue.js (так же используется)

А теперь — подробнее и с различением по уровням

  1. Джуниор.

Комментарии: принимаем на этот уровень новичков без значимого опыта. На этот уровень не подымаются по системе грейдов.

  1. Джуниор+

Необходима сильная экспертиза в следующих технологиях  и инструментах: HTML / CSS / Sass / JS / Jquery / Bootstrap / Git

Комментарии: по сути, это основы. С чего начинают разработчики вебсайтов. Ну а систему контроля версий, тоже, нужно знать как можно раньше

  1. Джуниор++
  • Разбирается в основном проекте
  • Сильная экспертиза в следующих технологиях  и инструментах: PHP / Composer / PhpShtorm / MVC / Codeigniter / REST API

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

  1. Мидл
  • Разбирается в основном проекте на уровне, что может пояснять бизнес процессы коллегам
  • Принимать архитектурные решения. Связка 2 и больше таблиц для решения поставленных требований
  • Помощь менеджерам в формировании более полных требований с технической точки зрения  
  • Сильная экспертиза в следующих технологиях  и инструментах: mySQL, postgresql, Laravel and Codeigniter ORM

Комментарии: Мидл разработчик подразумевает более высокие компетенции, чем Джуниор. Он может принимать решения. Например, разрабатывать архитектуру небольших приложений или «фичи». Так же, он более самостоятелен в работе и, постепенно, становится экспертом в своей области. Владеет более сложными технологиями. Так как на этом грейде, речь была про архитектуру, добавляем хорошее знание баз данных.

  1. Мидл+
  • Приличная экспертиза в одном из проектов из экосистемы (наряду с основным проектом), уверенное выполнение задач
  • Сильная экспертиза в следующих технологиях  и инструментах:
    • React (фронт основного проекта), npm, WordPress (например),
    • VueJS (фронт второго проекта)
  • Придерживается принципам программирования: YAGNI (You Ain’t Gonna Need It)

Комментарии: так как фул-стек программист должен знать и фронт-енд, то глубже погружается в него. Там же пакетый менеджер, без которого, серьезные вещи значительно сложнее реализовать. Экспертиза мидлов не ограничивается кодированием, т.е. активно применяет общепринятые принципы программирования и чистого кода

  1. Мидл++
  • Разбираться в бизнес-процессах одного из экосистемных продуктов на уровне чтобы передать знания
  • Сильная экспертиза в следующих технологиях  и инструментах: Laravel (сервисы, обработчики очередей, консольные команды, мидлвары, реквесты и валидация)
  • Знакомство и способность редактировать: Jenkins(сборка проектов), Gulp / Webpack для сборки и автоматизации сборок
  • Придерживается принципам программирования: KISS (Keep It Simple, Stupid)

Комментарии: Более сложные технологии бэкенда, которые увеличивают гибкость реализации задач. Вопросы хорошего кода, безопасного и понятного кода, который легко поддерживать. Так же подымаются вопросы сборок, релизов, CI/CD

  1. Сеньор
  • Не менее 5 лет работы в програмировании (включая предыдущий опыт)
  • Сильная экспертиза в следующих технологиях  и инструментах: Linux server console / Nginx config / Docker (для создания локальных сред)
  • Написан новый крупный компонет (соизмеримый с проектом из микросервисной архитектуры) или проект, или сделан рефакторинг крупного компонента
  • Наставничество: ученик был повышен с Джуна+ или Джуна++ до Мидла
  • Придерживается принципам программирования: DRY (Don’t Repeat Yourself)

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

  1. Сеньор+
  • Сильная экспертиза в следующих технологиях  и инструментах: Node.js, Создание Npm пакетов
  • Создан полезный для проекта npm-пакет, который используется в этом проекте
  • Написана статья об этом компоненте или того же уровня в общедоступном айти ресурсе с большой аудиторией (habr или чтото подобное) от корпоративного аккаунта, на этом грейде или ранее
  • Занимается релизами в проекте над которым работают 2+ человек
  • Наставник 2+ человек, делает код ревью их кода
  • Придерживается принципам программирования: SOLID

Комментарии: добавляем не совсем профильные, но очень перспективные технологии, которые должны двинуть разработку за новые горизонты. Еще больше наставничества. Социальная активность от имени компании. Все в выигрыше.

  1. Сеньор++
  • Сильная экспертиза в следующих технологиях  и инструментах: создание Composer-пакетов
  • Написан необходимый Composer-пакет для одного из наших модулей (или блока, который необходимо выделить в модуль). Подключение в нашем проекте
  • Написана статья об этом компоненте или того же уровня в общедоступном айти ресурсе с большой аудиторией (habr или чтото подобное) от корпоративного аккаунта, на этом грейде или ранее
  • Наставничество: ученик был повышен с Мидла до Мидла++
  • Выступление на айти конференции от лица компании по актуальной теме, на этом грейде или ранее

Комментарии: еще больше взаимной пользы. И программисту и компании. Оптимизация кода. Уровень качества кода на профессиональном уровне.

Система грейдов разработчиков — профессиональные скиллы

Programmer hard skills

В целом, система трейдов была рассмотрена в статье Общие положения грейдов. 

А в этой статье, рассмотрим прогресс по знаниям разработчика в его профессии

  1. В общем

Самое полезное, что компания ждет от разработчика, — это его знания и опыт в выбранное профессии. Чем он опытнее, тем быстрее будет выполнять задачи. Тем самым, двигая прогресс компании и принося прибыть.

  1. Стеки технологий — специализация

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

Сперва разделим разработчиков на такие категории (наиболее часто встречающиеся):

  • Фронт-енд разработчик
  • Бэк-енд разработчик
  • Фул-стек разработчик
  • Разработчик десктопных приложения
  • Разработчик приложения под Android
  • Разработчик приложения под iOS

Но и теже Бекенд разработчики не знают всех бекенд языков (PHP, Python, Java, Go, Ruby, NodeJS, C# и многие другие) и технологий (Linux, Windows, Docker, Nginx, Apache, MySQL, PostgreSQL, MongoDB, MS SQL, GraphQL, React, Vue.js, Sphinx, Elastic Search, Redis, MQ Rabbit, Machine Learning и многие другие).

В первую очередь, нужно определиться в используемом стеке, поделить его на более простые или жизненно-важные технологии и более сложные или менее часто используемые. Затем, грубо-говоря, «разбросать» требования по уровням грейдов.

В следующих статьях будут примеры для PHP Бэк-енд разработчика (Linux + PHP + MySQL), Фронт-енд (JS, React, Node) и Android-разработчика, Фул-стек программиста.

  1. Общие концепции программирования

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

Это, например 

  • git, git-low, 
  • ООП, 
  • REST-Api, 
  • Agile, Scrum
  • YAGNI, KISS, DRY, SOLID 
  • Юнит-тесты
  • CI/CD
  • SSH
  • и многое другое. 

Про них не стоит забывать при составлении грейдов разработчиков.

  1. Лидерство и наставничество

На самом деле, высокие грейды редко обходятся без наставничества и лидерства.

В качестве требования для перехода на высокие уровни (мидл++, сеньор), можно включать:

  • Наставничество: повышение ученика с X на Y уровень
  • Код-ревью и Релизы
  • Статьи во внутренних (локальная wiki, Confluence) или внешних источниках (Habr, форумы, сообщества, бумажные статьи в сборниках)
  • Выступления на конференциях от имени компании

5. Вопросы безопасности кода

Уже с малых грейдов, нужно знать как писать код, защищенный от основных атак и уязвимостей

Система грейдов разработчика — общие положения

junior developer

Зачем нужна система грейдов разработчиков ПО?

  1. Рано или поздно, полезным разработчикам повышают зарплату. Самые сложные вопросы: когда и на сколько повышать? Система грейдов должна отвечать на эти вопросы. Это, с точки зрения компании или руководителей
  2. А с точки зрения самих разработчиков, необходимы понятные критерии повышения уровня компетентности и вознаграждений
  3. Качественная система грейдов способствует скорейшему прогрессу программистов. Так же как и мотивации, заинтересованности в развитии компании

Какие грейды могут быть у разработчиков?

Все слышали о такой градации:

  1. Джуниор
  2. Мидл
  3. Сеньор

Но три уровня, это мало для полноценной системы грейдов. Поэтому прибегают к внутренним грейдам или под-уровням. Например:

  • Джуниор
  • Джуниор+
  • Джуниор++
  • Мидл
  • Сеньор+
  • Сеньор++

Как часто можно повышать грейды?

Это один из самых интересующих разработчика вопросов. Тут нужно выбрать баланс для компании и разработчиков. Неплохим вариантом будет: пол-года. Пол-года — это время, за которое разработчик, действительно, может «подрасти». Можно сделать промежуток времени «плавающим», например, первые грейды — через пол-года, последние — через год.

Кандидат может провалить защиту на следующий грейд. Нужно предусмотреть сколько минимум время нужно закладывать на очередную защиту по грейду. Могу предложить — 3 месяца

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

На сколько будeт расти зарплаты?

Можно отталкиваться от минимальной зарплаты (на уровне Джуниора) и максимальной (Сеньор++). А далее равномерно распределить увеличение между уровнями.

Финансовый рост при переходе по «внутренним» грейдам (Мидл, Мидл+) может быть менее значителен, чем на новый основной грейд (Мидл, Сеньор). А еще, рост внутри уровней Сеньора может быть больше, чем Мидла. А внутри Мидла — больше чем внутри Джуниора.

Какие основные критерии для перехода на новый уровень?

  1. Конечно же скилы (hard skills). 

Другими словами, знания в технологиях, применяемых в компании или планируемых к применению в ближайшем будущем

Конкретная градация скиллов сильно зависит от используемого стека технологий. 

Каждый новый грейд включает в себя скиллы предыдущих. Т.е. необходима экспертиза по технологиям из всех нижестоящих грейдов

Рассмотрим подробнее в следующих статьях

  1. Повышающаяся продуктивность (полезность компании)

Если используются гибкие методологии, это может быть повышающийся уровень выполнения спринтов или же неизменно хороший уровень

  1. Здоровые отношения в коллективе (это можно узнать у кадровика или самостоятельно наблюдать за кандидатом) и положительное влияние на атмосферу в коллективе (не приносит ли он больше вреда, чем пользы, не конфликтный ли)
  2. Прочитанные книги

Чем больше в кандидате теории, тем вариативнее будут принимаемые им решения.

Это могут быть книги как по разработки, так и по личностному росту или же процессам (опять таки, гибкие методологии или другие методологии разработки)

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

Подробнее рассмотрим в следующих статьях

Кто и как принимает решение о защите грейдов?

Ниже привожу один из вариантов «целостной картины»:

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

Как работает cron с переменными времени @daily, @weekly, @monthly

linux crontab daily

Простыми словами, переменные расписания запускают команды:

  • @daily — раз в день
  • @weekly — раз в неделю
  • @monthly — раз в месяц

Как же понять, в какое именно время запускаются команды?..

…Заходим в консоль сервера и используем команду:

cat /etc/anacrontab

Вывод примерно такой:

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly

Пояснения к этой системе можно найти, введя команду:

man anacrontab

Вывод будет примерно такой:

       The  START_HOURS_RANGE  variable  defines an interval (in hours) when scheduled jobs can be run.  In case this time interval is missed, for example, due to a power down, then scheduled jobs are not executed that day.

       The RANDOM_DELAY variable denotes the maximum number of minutes that will be added to the delay in minutes variable which is specified for each job.  A RANDOM_DELAY set to 45 would  therefore add, randomly, between 0 and 45 minutes to the delay in minutes for each job in that particular anacrontab.  When set to 0, no random delay is added.

       Empty lines are either blank lines, line containing white spaces only, or lines with white spaces followed by a '#' followed by an arbitrary comment.

       You can continue a line onto the next line by adding a '\' at the end of it.

       In case you want to disable Anacron, add the 0anacron cron job (which is a part of crontab(1)) into the /etc/cron.hourly/jobs.deny directory.

EXAMPLE
       This example shows how to set up an Anacron job similar in functionality to /etc/crontab which starts all regular jobs between 3:00 and 22:00 only.  A RANDOM_DELAY which can be 45 minutes at the most is specified.  Jobs will run serialized in a queue where each job is started only after the previous one is finished.

       # environment variables
       SHELL=/bin/sh
       PATH=/sbin:/bin:/usr/sbin:/usr/bin
       MAILTO=root
       RANDOM_DELAY=45
       # Anacron jobs will start between 6am and 8am.
       START_HOURS_RANGE=3-22
       # delay will be 5 minutes + RANDOM_DELAY for cron.daily
       1         5    cron.daily          nice run-parts /etc/cron.daily
       7         0    cron.weekly         nice run-parts /etc/cron.weekly
       @monthly  0    cron.monthly        nice run-parts /etc/cron.monthly

Пояснения:

  • Если запускается несколько команд с одной и той же переменной времени (например, @daily), они все ставятся в очередь, сереализуются и выполняются по порядку, при этом
  • START_HOURS_RANGE=3-22 — значит, что команды выполняются только во временном интервали с 3:00 до 22:00
  • RANDOM_DELAY=45 — значит, что следующая команда выполнится только после окончания предыдущей, и через 5 минут (из таблицы с примерами команд) + рандомное количество минут между 0 и 45. Другими словами, через рандомное время между 5 и 50 минутами

Как установить Redis на MAC системе с M1 (семейство процессоров M)

Чтобы установить Редис на Mac компьютер/ноутбук на процессоре M1, необходимо сделать следующее:

  • Открыть Терминал для ввода команд: Launchpad > Other > Terminal.
  • Установить Homebrew. Вводим следующую команду в Терминале и подтверждаем ввод Энтером:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  • Если, по окончанию успешного процесса установки увидите сообщение ошибки: Warning: /opt/homebrew/bin is not in your PATH. Необходимо добавить Homebrew в PATH (2е команды):
(echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') /Users/quest/.bash_profile 
eval "$(/opt/homebrew/bin/brew shellenv)"
  • Затем, обновляем Homebrew:
brew update
  • Теперь, мы готовы к непосредственной установке Редиса:
brew install redis
  • Когда установка будет завершена, стартуем сервис Redis:
brew services start redis
  • Чтобы проверить корректную установку, «пропингуем» сервис:
redis-cli ping

В ответе на нашу команду, если Редис установлен и запущен, мы увидим «PONG» в Терминале.

Это все. Мы установили, запустели и проверили установку Redis на вашем Mac M1.

How to install Redis on Mac with M1

You can follow these steps to install Redis on your Mac M1:

  • Open Terminal by going to Launchpad > Other > Terminal.
  • Install Homebrew by pasting this command in the Terminal and pressing Enter:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  • If you see error message: Warning: /opt/homebrew/bin is not in your PATH, run the following 2 commands:
(echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') /Users/quest/.bash_profile
eval "$(/opt/homebrew/bin/brew shellenv)"
  • Once Homebrew is installed, update it by running this command:
brew update
  • Now you can install Redis by running this command:
brew install redis
  • After the installation is complete, start the Redis server by running this command:
brew services start redis
  • To check if Redis is running, you can run the command:
 redis-cli ping 

If Redis is running, it will return «PONG» in the Terminal.

That’s it! Redis is now installed and running on your Mac M1.

Django python — выгрузка результатов тяжелого запроса в CSV c разделителем

Исходные данные:

  • Джанго проект, база данных
  • Есть сложный запрос, с большим количеством данных. Часто запрос моно описать моделями, чтобы усложнить задачу, будем писать сырой запрос mysql
  • Необходимо надежно выгрузить в CSV. Может даже миллионы строк
  • первой строкой в выгрузке будет хедер с названием столбцов
  • кастомный разделитель полей, например точка с запятой

1) views.py

  • добавляем необходимые импорты в начале кода
from django.http import StreamingHttpResponse
import csv
  • файло-подобный объект, который понадобится для добавления строк запроса в выходной CSV
class Echo:
    def write(self, value):
        return value
  • сам метод выгрузки в csv
def download_csv(filename, rows):
    pseudo_buffer = Echo()
    # используем кастомный разделитель полей - точка с запятой, по умолчанию, разделитель - запятая
    writer = csv.writer(pseudo_buffer, delimiter=';')
    return StreamingHttpResponse(
        (
            writer.writerow(row) for row in rows
        ),
            content_type="text/csv",
            headers={'Content-Disposition': 'attachment; filename="' + filename + '.csv"'},
        )
  • и пример его использования:
def download_orders_for_user(request):
    # например, запрос всех заказов пользователей с айдишниками от 1 до 10000 и суммой больше 10
    query = """
        SELECT order.number, 
            order.date, 
            order.sum, 
            order.status
        FROM order
        LEFT JOIN user ON user.id = order.user_id
        WHERE user BETWEEN 1 and 10000
        AND order.sum > 10
    """

    with connections["default"].cursor() as cursor:
        cursor.execute(query)
        rows = cursor.fetchall()

    # формируем имя файла
    filename = 'orders_for_users'

    # первой строкой у нас будет хедер с названием столбцов
    header_row = (('Номер', 'Дата', 'Сумма', 'Статус'),)
    rows = header_row + rows
    return download_csv(filename, rows)

2) urls.py

Зададим 2 урла:

  • для страницы, со ссылкой на выгрузку
  • для запроса выгрузки (нажатие на ссылку выгрузки)
…
urlpatterns = [
…
path('download_page/', views.download_page, name='download_page'),
path('download_page/csv/', views.download_orders_for_user, name='download_orders_for_user'),
]

3) создадим темплейт с HTML страничкой

для размещения ссылки скачивания и проверки работы наших скриптов
download_page.html
со следующим содержимым:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Download SCV</title>
</head>
<body>
    <div>
        <h4>Скачать заказы пользователей: </h4>
        <a id="download" href="csv/">CSV</a>
    </div>
</body>
</html>

Это все!