Стандарты и шаблоны для ТЗ на разработку ПО / Хабр
Введение
Недавно ко мне обратились, чтобы я посоветовал стандарты для написания технического задания (ТЗ) на разработку автоматизированных систем (АС) и программного обеспечения (ПО). Вот думаю, сейчас зайду в Яндекс, найду подходящую статейку и отправлю её. Но не тут-то было! Одной статьи, где перечисляются стандарты для ТЗ, включая шаблоны и примеры готовых документов, я не нашел. Придется сделать такую статейку самому…
И так, основные стандарты, методологии и своды знаний, где упоминается ТЗ или SRS (Software (or System) Requirements Specification):
• ГОСТ 34
• ГОСТ 19
• IEEE STD 830-1998
• ISO/IEC/ IEEE 29148-2011
• RUP
• SWEBOK, BABOK и пр.
ГОСТ 34
ГОСТ 34.602-89 Техническое задание на создание автоматизированной системы рекомендует структуру ТЗ на создание именно СИСТЕМЫ, в которую входят ПО, аппаратное обеспечение, люди, которые работают с ПО, и автоматизируемые процессы.
Согласно ГОСТ 34 техническое задание должно включать следующие разделы:
1. Общие сведения
2. Назначение и цели создания (развития) системы
3. Характеристика объектов автоматизации
4. Требования к системе
5. Состав и содержание работ по созданию системы
6. Порядок контроля и приемки системы
7. Требования к составу и содержанию работ по подготовке объекта автоматизации к вводу системы в действие
8. Требования к документированию
9. Источники разработки
При разработке ТЗ для государственных проектов Заказчики, как правило, требуют соблюдение именно этого стандарта.
ГОСТ 19
“ГОСТ 19.ххх Единая система программной документации (ЕСПД)” — это комплекс государственных стандартов, устанавливающих взаимоувязанные правила разработки, оформления и обращения программ (или ПО) и программной документации. Т.е. этот стандарт относится к разработке именно ПО.
Согласно ГОСТ 19.201-78 Техническое задание, требования к содержанию и оформлению техническое задание должно включать следующие разделы:
1. Введение;
2. Основания для разработки;
3. Назначение разработки;
4. Требования к программе или программному изделию;
5. Требования к программной документации;
6. Технико-экономические показатели;
7. Стадии и этапы разработки;
8. Порядок контроля и приемки;
9. Приложения.
Естественно ГОСТ 34 (и 19) уже устарели, и я не люблю их использовать, но при правильном интерпретации стандартов, можно получить хорошее ТЗ, см. Заключение.
IEEE STD 830-1998
Достаточно хорошее определение стандарта 830-1998 — IEEE Recommended Practice for Software Requirements Specifications дано в самом его описании:
Описывается содержание и качественные характеристики правильно составленной спецификации требований к программному обеспечению (SRS) и приводится несколько шаблонов SRS. Данная рекомендуемая методика имеет своей целью установление требований к разрабатываемому программному обеспечению, но также может применяться, чтобы помочь в выборе собственных и коммерческих программных изделий.
Согласно стандарту техническое задание должно включать следующие разделы:
1. Введение
- 1. Назначение
- 2. Область действия
- 3. Определения, акронимы и сокращения
- 4. Ссылки
- 5. Краткий обзор
2. Общее описание
- 1. Взаимодействие продукта (с другими продуктами и компонентами)
- 2. Функции продукта (краткое описание)
- 3. Характеристики пользователя
- 4. Ограничения
- 5. Допущения и зависимости
3. Детальные требования (могут быть организованы по разному, н-р, так)
- 1. Требования к внешним интерфейсам
- 1. Интерфейсы пользователя
- 2.
Интерфейсы аппаратного обеспечения
- 3. Интерфейсы программного обеспечения
- 4. Интерфейсы взаимодействия
- 2. Функциональные требования
- 3. Требования к производительности
- 4. Проектные ограничения (и ссылки на стандарты)
- 5. Нефункциональные требования (надежность, доступность, безопасность и пр.)
- 6. Другие требования
4. Приложения
На самом деле новичку достаточно трудно понять, что должно содержаться в данных разделах по вышеприведенной структуре (как и в случае с ГОСТом), поэтому нужно читать сам стандарт, который легко найти в Интернете. Как и примеры, правда, на англ. языке.
Мне же больше нравится адаптированный шаблон Карла Вигерса, который я использую при разработки ТЗ для коммерческих компаний. И вообще дедушка Вигерс предоставляет множество полезных рекомендаций по работе с требованиями (куда идут деньги при покупке этих рекомендаций, читайте в начале красным). Ну а его книжку вы уже несколько раз, надеюсь, перечитали.
ISO/IEC/ IEEE 29148-2011
Стандарт IEEE 29148-2011 обеспечивает единую трактовку процессов и продуктов, используемых при разработке требований на протяжении всего жизненного цикла систем и программного обеспечения. Он приходит на смену стандартов IEEE 830-1998, IEEE 1233-1998, IEEE 1362-1998.
Данный стандарт содержит два шаблона спецификации требований:
• System requirements specification (SyRS)
• Software requirements specification (SRS)
System Requirements Specification (SyRS) определяет технические требования для выбранной системы и удобства взаимодействия предполагаемой системы и человека. Она определяет высокоуровневые требования к системе с точки зрения предметной области, а также информацию об общей цели системы, ее целевой среде и ограничениях, допущениях и нефункциональных требованиях. Она может включать в себя концептуальные модели, спроектированные для иллюстрации содержания системы, сценариев использования, основных сущностей предметной области, данных, информаций и рабочих процессов. Из определения следует, что это аналог ТЗ, описанного в ГОСТ 34.
SyRS может содержать следующие разделы:
1. Введение
- 1. Назначение системы
- 2. Содержание системы (границы системы)
- 3. Обзор системы
- 1. Содержание системы
- 2. Функции системы
- 3. Характеристики пользователей
- 4. Термины и определения
2. Ссылки
3. Системные требования
- 1. Функциональные требования
- 2. Требования к юзабилити
- 3. Требования к производительности
- 4. Интерфейс (взаимодействие) системы
- 5. Операции системы
- 6. Состояния системы
- 7. Физические характеристики
- 8. Условия окружения
- 9. Требования к безопасности
- 10. Управление информацией
- 11. Политики и правила
- 12. Требования к обслуживанию системы на протяжении ее жизненного цикла
- 13.
Требования к упаковке, погрузке-разгрузки, доставке и транспортировке
4. Тестирование и проверка (список необходимых приемочных тестов, которые отражают зеркально раздел 3)
5. Приложения
- 1. Предположения и зависимости
- 2. Аббревиатуры и сокращений
SRS это спецификация требований для определенного программного изделия, программы или набора программ (продукт), которые выполняют определенные функции в конкретном окружении. Из определения следует, что это аналог ТЗ, описанного в ГОСТ 19, а по структуре очень напоминает SRS из стандарта IEEE 830.
SRS может содержать следующие разделы:
1. Введение
- 1. Назначение
- 2. Содержание (границы)
- 3. Обзор продукта
- 1. Взаимодействие продукта (с другими продуктами и компонентами)
- 2. Функции продукта (краткое описание)
- 3. Характеристики пользователей
- 4.
Ограничения
- 4. Термины и определения
2. Ссылки
3. Детальные требования
- 1. Требования к внешним интерфейсам
- 2. Функции продукта
- 3. Требования к юзабилити
- 4. Требования к производительности
- 5. Требования к логической структуре БД
- 6. Ограничения проектирования
- 7. Системные свойства ПО
- 8. Дополнительные требования
4. Тестирование и проверка (список необходимых приемочных тестов, которые отражают зеркально раздел 3)
5. Приложения
- 1. Предположения и зависимости
- 2. Аббревиатуры и сокращений
Данный стандарт достаточно сложно найти в открытом виде в Интернете, но постараться можно, и опять же только на англ.
RUP
Структура SRS в RUP(Rational Unified Process) представляет собой документ, в котором необходимо описать артефакты, полученные в процессе специфицирования требований.
Шаблон SRS в RUP адаптирован из стандарта IEEE STD 830 и содержит два варианта:
• Традиционный шаблон SRS со структурированными функциональными требованиями по функциям Системы, максимально похож на 830 стандарт.
• Упрощенный шаблон SRS со структурированными функциональными требованиями в виде вариантов использования (use cases):
1. Введение.
- 1. Цель.
- 2. Краткая сводка возможностей.
- 3. Определения, акронимы и сокращения.
- 4. Ссылки.
- 5. Краткое содержание.
2. Обзор системы
- 1. Обзор вариантов использований.
- 2. Предположения и зависимости.
3. Детальные требований
- 1. Описание вариантов использования.
- 2. Дополнительные требования.
- 3. Другие функциональные требования.
- 4. Нефункциональные требования.
4. Вспомогательная информация.
Естественно, что в Интернете можно найти шаблон и примеры SRS от RUP.
SWEBOK, BABOK и пр.
SWEBOK, BABOK, а также множество других методологий разработки ПО и сводов знаний при упоминании SRS ссылаются на вышеупомянутые зарубежные стандарты.
Также стоит сказать, что для описания требований к АС и ПО используются и другие виды документов, кот каждый называет по разному: FRD (Functional Requirements Document), RD (Requirements Document), ПЗ (Постановка задачи или Пояснительная записка) и пр. Но это все производные документы от вышеупомянутых стандартов, не имеющих отраслевой стандартизации, хотя, в некоторых случаях, уже и с устоявшейся терминологией.
А как же Agile?
Я скажу одной фразой из Манифеста Agile: “Working software over comprehensive documentation”. Поэтому в Agile документации отводится совсем мало места.
Мое же убеждение, что разработать АС без ТЗ можно (используя техники/рекомендации Agile), но вот в дальнейшем сопровождать — невозможно. Поэтому сразу задумайтесь, как вы будете писать ТЗ и другую документацию, при разработке ПО по Agile.
Заключение
Как говорится, каждому проекту свое техническое задание. При правильном использовании любого из вышеперечисленных стандартов можно брать эти шаблоны для написания ТЗ, естественно адаптируя их под себя.
Но главное, чтобы ТЗ не превращалось в ХЗ, а, именно, содержание (наполнение) в ТЗ — самое главное! Но это уже совсем другая история… Если есть интерес, то можно пройти он-лайн курс Разработка и управление требованиями к ПО.
Ну а кто дочитал до конца — тому бонус: пример ТЗ, который я писал много лет назад (сейчас уже просто аналитиком давно не работаю, да и другие более удачные примеры запрещает открывать на всеобщее обозрение NDA).
Также рекомендую ознакомиться со следующими материалами:
- Презентацией Юрия Булуя Классификация требований к программному обеспечению и ее представление в стандартах и методологиях.
- Анализ требований к автоматизированным информационным системам. Лекция 11: Документирование требований.
- Правила составления Software requirements specification (читать вместе с комментариями)
- Примеры ТЗ и другой документации по разработке АС для МЭР
- ГОСТ-овский стиль управления. Статья Gaperton по правильной работе с ТЗ по ГОСТ
- Шаблоны документов для бизнес-аналитиков из группы ВК «Business Analysis Magazine»
Как составить техническое задание (ТЗ) для копирайтера на английском + Пример
Статья от HighTime Agency — российского SEO-агентства, которое занимается продвижением SaaS-компаний с 2011 года. Команда агентства имеет успешный опыт продвижения своих и клиентских проектов в США, Германии, Франции и России.
Автор — основатель HighTime Agency: Роман Макаров. В статье: советы по выбору темы и сбору информации для информационной статьи, пошаговый образец и пример для создания грамотного ТЗ копирайтеру.
![]()
Информационные статьи помогают при прокачке money-статей (то есть статей, приносящих основной доход). Дело в том, что людям помимо обзоров на товары и услуги, в которых мы вешаем реферальные ссылки, интересны инфо-статьи, так как они помогают упростить им жизнь и получить выгоду.
Что в статье:
- Как это работает?
- Что из себя представляют инфо-статьи?
- Какие шаги к написанию ТЗ для информационной статьи?
- Что дальше?
- О чем важно помнить?
Money-статьи приносят больше ценности нам, чем пользователям. Но в то же время важно, чтобы сайт не был сборником обзоров для заработка на читателях. Асессоры Google оценивают качество ресурсов и понижают в рейтинге сайты без полезного для пользователей контента. Люди со временем также начинают понимать, что сайт не настолько хорош, если кругом одни статьи с рефералками. И нам не нужны «пустые» статьи, чтобы были, потому что «надо», так они не работают и не приносят доход. Задача не из легких.
Для решения этой проблемы подойдут информационные статьи. В них будет содержаться полезная для конечного пользователя информация (например, ресурсы и гайды, связанные с товарами, которые мы продвигаем). Плюсом эти статьи будут напрямую связаны с нашими основными статьями, делиться с ними трафиком и тем самым приносить больший доход. Выглядят инфо-статьи приятно и полезно, и для пользователей, и для всевидящего ока Google, и денег нам помогают заработать. Все рады.
Если написать инфо-статьи качественно, другие ресурсы будут ссылаться на них, тем самым нагоняя нам трафик, и делая наш сайт круче. Ну разве не восхитительно?
Как это работает?
Информационные статьи не хуже money-старей, а иногда даже лучше, генерируют трафик. В случае инфо-статей мы зарабатываем деньги не напрямую, а через связку инфо-статьи и money-статьи ссылкой. То есть мы ненавязчиво привлекаем пользователей, ищущих полезную информацию, на наш сайт, копим авторитет ресурса и монетизируем трафик.
Что из себя представляют инфо-статьи?
К таким статьям могут относиться:
- How-To статьи. Это своеобразный гайд с шагами, советами, хитростями, выполняя или придерживаясь которых можно достичь определенного результата. Пример заголовка статьи — How to Make [keyword] in 3 Steps. Примеры статей:
— https://www.instructables.com/id/How-to-Eat-a-Banana-Like-a-Monkey/
— https://blog.hubspot.com/blog/tabid/6307/bid/33363/memejacking-the-complete-guide-to-creating-memes-for-marketing.aspx
— https://www.lifehack.org/articles/money/the-six-best-ways-to-get-rich.html
- Статьи с советами и идеями, где можно найти вдохновение для своего дела или работы. Пример заголовка статьи — N Ways/Things to [keyword]. Примеры статей:
— https://backlinko.com/find-content-ideas
— https://www.starwars.com/news/5-signs-you-might-be-a-sith-in-training
— https://backlinko.com/content-marketing-tips
- Research-статьи.
Статьи-исследования, то есть мы ищем только трастовые источники с исследованиями для написания статьи (.edu + .gov + журналы-сборники научных статей).
Как сделать качественную инфо-статью, чтобы она точно принесла пользу сайту? Для этого нужно проделать следующие шаги.
Какие шаги к написанию ТЗ для инфо-статьи?
Одна из самых главных вещей для составления технического задания для копирайтера — контент-план. Это список ключевых запросов, сгруппированный по статьям. Для одной статьи — одна группа ключевых запросов. На их основе контент-план помогает составить правильное ТЗ для копирайтера. А авторам будет проще и понятнее о чем писать статьи.
Пример контент-планаИ вот, у нас есть контент план под рукой, мы готовы писать. Что делать дальше?
1. Изучаем ключи из контент-планаСмотрим частотность и на какие моменты (хвосты в ключах) пользователи обращают свое внимание. Так мы соберем примерные темы, которые нужно осветить в статье. Важно понимать, что есть основной ключ, вокруг которого пишется вся статья, и именно он идет в заголовок. И есть дополнительные ключи с хвостами, которые помогают найти информацию вокруг основного ключа. Основной ключ находится через инструменты SEO-анализа (например, Ahrefs). Подбирает ключи автор контент-плана (не обязательно вы).
Так, если мы посмотрим на пример контент-плана выше, мы будем писать статью «как чистить кухонную мойку» (How to Clean Kitchen Sink). Смотрим на хвосты:
- Добавляем информацию о том как чистить не только раковины, но и слив (sink drain).
- Обращаем внимание про нержавеющую сталь (stainless steel), нам нужно будет указать особенности мытья раковины из этого материала + другие виды материалов раковин и как их чистить.
- Добавляем информацию об использовании «домашних методов», в данном случае — пищевая сода и уксус (baking soda + vinegar).
- Также можно дополнительно расширить гайд, добавив информацию про то, как дезинфицировать мойку (sanitize + disinfect).
2. Определившись с темами, начинаем собирать информацию
Ищем всю возможную информацию, при этом обязательно сохраняем ссылки на ресурсы. Даже если мы не будем использовать все, полезно иметь полных охват ресурсов, ведь иногда понадобиться заменить источник на другой. Так вместо поиска и траты дополнительных ресурсов времени, мы просто обратимся к уже готовому списку.
Начинаем с банального — вводим в поисковую строку Google ключ — how to clean kitchen sink. Далее идем смотреть топы, обращаем внимание и на 2-3 страницы. Также можно посмотреть ссылки на другие статьи внутри статей конкурентов, собираем идеи, мысли и ресурсы в отдельный файлик. Когда кажется, что уже все найдено, начинаем перебирать ключи из нашего контент-плана, и ищем дополнительные идеи там.
Промежуточный вариант файлика со всем ресурсами статьи3. При сборе информации уже начинаем продумывать примерный макет статьи
При массиве текста, чтобы пользователям было не скучно читать статью, нам просто необходимо «вдохнуть в нее жизнь». Какими бы интересными ни были тема и текст, без хорошего визуала она ничем не отличается от вырезки из словаря или заумной научной работы, что в нашем случае недопустимо.
Для этого нам нужны видео c YouTube, картинки с лицензией на использование и изменение, графики, диаграммы, таблицы, списки. Необязательно на этом этапе иметь готовый список ссылок на картинки. А вот список видео желательно уже иметь, ведь для каждого должно быть прописано, связанное с текстом статьи, описание, а это нужно продумать заранее.
Подборка видео4. Структурируем собранную информацию
Ищем места, которые необходимо «закрыть» другим источником или другой темой/информацией. Стараемся выстроить логичную цепочку из тем и блоков информации. Добавляем ссылки на видео в статью в нужные и логичные места.
Структурированная информация5. Пишем текст технического задания
Прописываем цели, задачи, аудиторию, структуру и советы по оформлению. Не нужно много воды. Нужно достаточно подробно и емко объяснить автору, что от него требуется, чтобы не возникало много дополнительных вопросов или вам потом не пришлось бы вносить кучу правок на этапе приема статьи.
Тут как раз пригодится структура, которую мы прописали выше, просто нанизываем больше «мяса» на костяк структуры.
Вот как изменилась наша начальная структура в конечном ТЗОбратите внимание на пункт I. Title and description. В этом пункте мы указываем, как копирайтеру нужно написать одни из главных инструментов SEO — meta title и meta description, которые мы затем будем добавлять в сниппет — визитную карточку нашей статьи. Чтобы понять, что это такое, зачем нужно, и как лучше их писать читайте статьи ниже, а также добавьте их в ТЗ для копирайтеров:
— https://blog.alexa.com/seo-meta-descriptions/
— https://yoast.com/meta-descriptions/
А если вкратце, то meta title и meta description — это лицо вашей статьи, потому что именно они добавляются в сниппет, который появляется в поисковой выдаче, и именно эти инструменты помогут привлечь внимание к статье. Поэтому не стоит пренебрегать ими.
Сниппет. Филетовый заголовок — meta title. Серый текст после даты — meta descriptionКонечно же не забываем указывать автору, чтобы он добавил ссылку на нашу money-статью, которую необходимо прокачать.
Основные цель и задача, должны быть прописаны в самом начале. Обязательно укажите свой сайт, чтобы автор примерно понимал стиль написания, аудиторию и в целом настроение сайта. Чтобы автор мог адаптироваться под ваш проект.
Если хотите, чтобы Ваш текст был «живым», то и попросите написать его «живым» — с персональным мнением, обращением к читателю, эмоциями и эмодзи:)6. Рассчитываем и прописываем примерное количество слов
Чтобы посчитать количество слов, необходимо оценить несколько факторов: объем информации, который мы нашли и хотим его осветить в статье, посмотреть сайты конкурентов, в целом оценить конкуренцию по нише или ключу. И если с информацией, которую мы нашли сами и хотим добавить в статью все более-менее понятно, то с конкурентами нужно учитывать несколько факторов:
Считаем количество слов в статьях конкурентов
Забиваем основной ключ в поиск, считаем количество слов в статьях конкурентов (вбиваем текст всей статьи в знакосчиталки, например, https://www. 8nog.com/counter/), на основе среднего и максимального количества накидываем ещё примерно 100-200 слов. Наша задача перебить самую большую и жирную статью по ключу и в количестве написанных слов, и в качестве. Идеально — максимум слов, и все нужные и полезные.
Анализируем качество статей конкурентов
Смотрим сколько реальных конкурентов по нашему основному ключу, насколько у них полезный контент и насколько хорошо составлена статья. Таким образом мы понимаем, что нам либо можно сократить количество найденной информации, либо наоборот отправиться на дополнительный анализ, если конкуренты очень хороши.
Примерная таблица с анализом конкурентов
Конкурент | Выглядит, польза | Вердикт |
https://www.bhg.com/homekeeping/house-cleaning/tips/how-to-clean-kitchen-sinks-drains/ | Короткая статья, мало медиа (фото, видео, графики). Информации много, но есть ещё что добавить им. ![]() | Статья выглядит скучно, слабый конкурент. Обратить внимание на оформление с медиа (должно быть много). |
https://www.realsimple.com/home-organizing/cleaning/how-to-clean-your-kitchen-sink | Короткая статья, нет медиа. Информация разнообразная. | Слабый конкурент, статья выглядит скучно. Взять ключи How to сlean a sink faucet + garbage disposal |
https://www.oxo.com/blog/cleaning-and-organizing/best-way-clean-kitchen-sink/ | Короткая статья, больше медиа, неплохо оформлено. Очень мало информации. | Слабый конкурент, выглядит лучше, но инфы мало. Можно взять оформление шагов, хорошо выглядит. |
https://www.popsugar.com/smart-living/How-Clean-Your-Stainless-Steel-Sink-30688216 | Короткая статья, больше медиа, но однообразно. Занишевались под stainless steel. Но и так не особо подробно описали. | Занишевались, не совсем наши конкуренты, но даже так — мало инфы.![]() |
https://www.simplemost.com/how-clean-disinfect-kitchen-sink/ | Прямо коротулька. Без медиа. Нет комментариев, слов 800 от силы. | Совсем не конкурент. |
https://www.thekitchn.com/how-to-clean-your-kitchen-sink-249020 | Короткая статья, больше медиа. Информации мало. | Слабо. |
https://www.wikihow.com/Clean-a-Kitchen-Sink | Как обычно у WikiHow, много всего, картинки. списки, инструкции. ГИФКИ!Информации много. | Основной конкурент, 1600 слов, будем ориентироваться на них. Нужно попробовать намутить гифки, выглядит классно + Q&A и Tips. А еще крутой интерактивный чек-лист, что нужно для чистки. |
https://truemoneysaver.com/diy/how-to-clean-stainless-steel-sink/ | Добротная статья, живые фотки, немного частями проседает медиа (не хватает в паре мест). Много информации + посчитана стоимость (особенность сайта). | 2 конкурент. В целом, все моменты учтены, их статья меньше, чем WikiHow.![]() |
В итоге анализируем и совмещаем информацию из двух предыдущих пунктов, так понимаем примерное количество слов для статьи. Если есть сомнение, и ниша не сильно конкурентная, лучше указать меньше слов, чтобы посмотреть, как сам автор справится со статьей. Добавить всегда можно, а вот убрать будет тяжелее. НО если конкуренция по ключу высокая, то нужно семь раз подумать — посчитать количество слов и один раз составить качественное ТЗ для копирайтера .
По итогу что мы имеем после анализа: у нас два хороших конкурента со статьями в 1500-1600 слов. У них достаточно медиа и различных блоков. Так у нас появляются в ТЗ пункты про How to сlean a sink faucet + garbage disposal + Q&A + Tips. Решаем, что самое лучшее — это поставить лимит слов в 1800-2000, так мы обойдем текущих конкурентов + будет чем крыть будущих. А также на будущее думаем, как добавить интерактивный чек лист, чтобы самим мониторить, что уже есть для мойки, а что нужно раздобыть и как сделать гифки, чтобы выглядело прям ВАУ. Но это уже будет на этапе публикации статьи.
7. Ещё раз проверяем ТЗ статьи, мысленно представляя макет
Тут же важно откорректировать техническое задание в соответствии с количеством слов и повторным анализом конкуренции. Все основные изменения, которые появились после анализа конкурентов, описаны выше.
8. Убедившись, что вы выложились на полную, и особо добавить больше нечего, отправляем ТЗ автору
Вот и сам пример готового ТЗ копирайтеру на информационную статью для сайта на английском языке.
Что дальше?
Далее проходит следующий этап работы — редактирование с автором. Вносятся поправки в статью, согласно ТЗ. И все продолжается, пока статья не будет устраивать вас на 99,9%. Техническое задание, своего рода, юридический документ, на который вы можете ссылаться, когда автор в порыве своего вдохновения отклонился от темы, либо раздул объем статьи, либо вовсе забыл раскрыть одну из важных тем.
О чем важно помнить?
От написания технического задания для копирайтера зависит конечный продукт — статья. Статья — это инструмент заработка, в который мы вкладываемся заранее. Поэтому нужно осознавать всю важность и ценность правильно собранного и прописанного ТЗ. Особенно важно это правило для конкурентных ниш. Логика проста: выше конкуренция по ключу → нужна больше и качественнее статья → нужно много слов + хороший автор → нужно больше денег на статью → выше риски и больше потеряешь, если статья не выстрелит. Но в таких нишах гораздо больше шансов получить высокий трафик, который потом можно конвертировать в высокий доход. Поэтому к написанию технического задания нужно подходить с холодной головой и горячим сердцем. Четко анализировать и добавлять уместный креатив. Дерзайте!
- Об авторе
- Недавние публикации
Роман Макаров
Основатель, генеральный директор и руководитель отдела роста в HighTime Agency
11 лет продвигает SaaS-компании в США, Франции, Германии, ОАЭ и России. Увеличил поток трафика и триалов в 3 раза для компании EdTech. Создал 2 онлайн-журнала с нуля и продал с мультипликатором x33.
Роман Макаров недавно публиковал (посмотреть все)
tz — документация dateutil 2.8.2
Этот модуль предлагает реализации часового пояса, подклассы абстрактного datetime.tzinfo
тип. Существуют классы для обработки формата tzfile.
файлы (обычно находятся в /etc/localtime
, /usr/share/zoneinfo
,
д.), строка окружения TZ (во всех известных форматах), заданные диапазоны (с помощью
от относительных дельт), часовой пояс локальной машины, часовой пояс с фиксированным смещением и UTC
часовой пояс.
Объекты
-
dateutil.tz.
Всемирное координированное время
Удобный экземпляр
dateutil.tz.tzutc
.Новое в версии 2.7.0.
Функции
-
dateutil.tz.
гетц
( имя = нет ) Получить объект часового пояса из строкового представления
Эта функция предназначена для получения подкласса
tzinfo
.который лучше всего представляет часовой пояс, который будет использоваться, если POSIX Переменная TZ была установлена на то же значение.
Если в
не передается аргумент или пустая строка, gettz
, местное время возвращается:>>> получить() tzfile('/etc/localtime')
Эта функция также является предпочтительным способом сопоставления ключей базы данных IANA tz. до
tzfile
объектов:>>> gettz('Тихий океан/Киритимати') tzfile('/usr/share/zoneinfo/Pacific/Kiritimati')
В Windows стандарт расширен за счет включения специфичных для Windows имена зон, предоставленные операционной системой:
>>> gettz('Стандартное время Египта') tzwin('Стандартное время Египта')
При передаче спецификации часового пояса строки в стиле GNU
TZ
возвращаетсяцстр
объект:>>> gettz('AEST-10AEDT-11,M10.1.0/2,M4.1.0/3') tzstr('AEST-10AEDT-11,M10.1.0/2,M4.1.0/3')
Параметры: имя — название часового пояса (IANA, или, в Windows, ключи Windows), местоположение tzfile(5)
файл zoneinfo илиTZ
часовой пояс с переменным стилем спецификатор.Пустая строка, без аргумента или
None
интерпретируется как местное время.Возвращает: Возвращает экземпляр одного из dateutil
tzinfo
подклассы.Изменено в версии 2.7.0: После версии 2.7.0 любые два вызова
gettz
с использованием одного и того же входные строки вернут один и тот же объект:>>> tz.gettz('Америка/Чикаго') is tz.gettz('Америка/Чикаго') Истинный
Помимо повышения производительности, это гарантирует, что Семантика «той же зоны» используется для даты и времени в той же зоне.
-
гетц.
нокаш
() Некэшированная версия gettz
- классметод
gettz.
cache_clear
()
-
-
dateutil.tz.
свернуть
( dt , свернуть = 1 ) [источник] Предоставляет единый интерфейс для назначения атрибута
fold
datetime как до, так и после реализации PEP-495.Параметры: fold — значение атрибута fold
в возвращаемой дате и времени. Этот должен быть либо 0, либо 1.Возвращает: Возвращает объект, для которого возвращает getattr(dt, 'fold', 0)
сложите
для всех версий Python. В версиях до Python 3.6, это_DatetimeWithFold
объект, который является подклассdatetime.datetime
сраз
добавлен атрибут, есликратно
равно 1.Новое в версии 2.6.0.
-
dateutil.tz.
datetime_ambiguous
( dt , tz=нет )[источник] Учитывая дату и время и часовой пояс, определить, является ли данная дата и время неоднозначно (т. е. если есть два времени, различающихся только их DST положение дел).
Параметры: - dt — A
datetime.
(чей часовой пояс будет игнорироваться, еслиdatetime
tz
предоставляется.) - tz — файл
datetime.tzinfo
с поддержкой атрибутаfold
. ЕслиНет
или не указано, будет использоваться собственный часовой пояс даты и времени.
Возвращает: Возвращает логическое значение независимо от того, является ли «время стены» неоднозначным в
тз
.Новое в версии 2.6.0.
- dt — A
-
dateutil.tz.
datetime_exists
( dt , tz=нет )[источник] Учитывая дату и время и часовой пояс, определить, является ли данная дата и время попал бы в пропасть.
Параметры: - dt — A
datetime.datetime
(чей часовой пояс будет игнорироваться, еслитз
предоставляется.)
- tz — файл
datetime.tzinfo
с поддержкой атрибутаfold
. ЕслиНет
или не указано, будет использоваться собственный часовой пояс даты и времени.
Возвращает: Возвращает логическое значение независимо от того, существует ли «время стены» в
тз
.Новое в версии 2.7.0.
- dt — A
-
dateutil.tz.
resolve_imaginary
( dt )[источник] Учитывая дату и время, которая может быть мнимой, вернуть существующую дату и время.
Эта функция предполагает, что воображаемая дата-время представляет то, что время стены было бы в зоне, если бы переход смещения не произошел, поэтому он всегда будет смещаться вперед при изменении смещения перехода.
>>> from dateutil import tz >>> из даты и времени импортировать дату и время >>> Нью-Йорк = tz.gettz('Америка/Нью-Йорк') >>> print(tz.
resolve_imaginary(datetime(2017, 3, 12, 2, 30, tzinfo=NYC))) 2017-03-12 03:30:00-04:00 >>> KIR = tz.gettz('Тихий океан/Киритимати') >>> print(tz.resolve_imaginary(datetime(1995, 1, 1, 12, 30, tzinfo=КИР))) 1995-01-02 12:30:00+14:00
В качестве примечания:
datetime.astimezone()
гарантированно выдает действительный, существующая дата и время, поэтому для получения существующая дата-время, однако это обычно «возвращается» к более раннему времени вместо того, чтобы перейти на сторону STD (хотя никаких гарантий не дается об этом поведении).Параметры: dt – A datetime.datetime
, который может существовать, а может и не существовать.Возвраты: Возвращает существующий datetime.datetime
. Еслиdt
не было мнимый, возвращаемый datetime гарантированно будет тем же объектом передается в функцию.Новое в версии 2.7.0.
Классы
- класс
dateutil.tz.
цуц
[источник] Это объект tzinfo, представляющий часовой пояс UTC.
Примеры:
>>> из импорта даты и времени * >>> из импорта dateutil.tz * >>> datetime.now() datetime.datetime(2003, 9, 27, 9, 40, 1, 521290) >>> datetime.now(tzutc()) datetime.datetime(2003, 9, 27, 12, 40, 12, 156379, tzinfo=tzutc()) >>> datetime.now(tzutc()).tzname() 'УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ'
Изменено в версии 2.7.0:
tzutc()
теперь является одноэлементным, поэтому результатtzutc()
будет всегда возвращать один и тот же объект.>>> из dateutil.tz импортировать tzutc, UTC >>> tzutc() — это tzutc() Истинный >>> tzutc() — это UTC Истинный
- класс
dateutil.tz.
tzoffset
( имя , смещение )[источник] Простой класс для представления фиксированного смещения от UTC.
Параметры: - имя – Имя часового пояса, которое будет возвращено, когда
Вызывается tzname()
. - offset — смещение часового пояса в секундах или (начиная с версии 2.6.0, представленное
как объект
datetime.timedelta
).
- имя – Имя часового пояса, которое будет возвращено, когда
- класс
dateutil.tz.
tzlocal
[источник] Подкласс
tzinfo
, построенный вокруг функций часового поясаtime
.
- класс
dateutil.tz.
tzwinlocal
[источник] Класс, представляющий информацию о местном часовом поясе в реестре Windows
Хотя
dateutil.tz.tzlocal
выполняет системные вызовы (через времяtzwinlocal
извлекает правила прямо из реестра Windows и создает объект типаdateutil.
.tz.tzwin
Поскольку в Windows нет эквивалента
time.tzset()
, на Windows, экземплярыdateutil.tz.tzlocal
всегда будут отражать настройки часового пояса на момент запуска процесса , что означает изменения настроек часового пояса машины во время выполнения программы в Windows , а не , будет отражатьсяdateutil.tz.tzlocal
. Посколькуtzwinlocal
читает реестр напрямую, на него не влияют Эта проблема.Примечание
Доступно только в Windows
-
дисплей
() Вернуть отображаемое имя часового пояса.
-
переходы
( год ) Для заданного года получить время перехода на летнее время, выраженное всегда на стороне стандартного времени. Для зон без переходов это функция возвращает
Нет
.Параметры: год – Год, переходы которого вы хотите запросить. Возвраты: Возвращает кортеж объектов datetime.datetime
,(dston, dstoff)
для зон с ежегодным переходом на летнее время илиНет
для зон с фиксированным смещением.
-
- класс
dateutil.tz.
tzrange
( stdabbr , stdoffset=Нет , dstabbr=Нет , dstoffset=Нет , start=Нет , конец=Нет )[источник] Объект
tzrange
представляет собой часовой пояс, определяемый набором смещений и сокращения, эквивалентные способу указания переменнойTZ
в POSIX-подобных системах, но с использованием дельта-объектов Python для указания летнего времени начало, конец и смещения.Параметры: - stdabbr – сокращение стандартного времени (например,
'EST'
). - stdoffset –
Целое число или объект
datetime.timedelta
или эквивалент указание базового смещения от UTC.Если не указано, используется +00:00.
- dstabbr –
Аббревиатура летнего/летнего времени (например,
«EDT»
).Если указано, без другой информации о переходе на летнее время предполагается, что наступает летнее время. и поведение по умолчанию или
dstoffset
,начало
иконец
использовал. Если не указано и не указана другая информация о переходе на летнее время, предполагается, что в этой зоне нет летнего времени.Если это не указано, а другая информация о переходе на летнее время указана или , Летнее время происходит в зоне, но аббревиатура часового пояса остается без изменений.
- dstoffset — Целое число или объект
datetime.timedelta
или эквивалент указание смещения UTC во время летнего времени.Если не указано и любое другое летнее время информация указана, предполагается, что это смещение STD +1 час.
- начало –
A
относительнаядельта.относительнаядельта
объект или эквивалентное указание время и время года, когда начинается переход на летнее время. К указать, например, что переход на летнее время начинается в 2 часа ночи во 2-е воскресенье в Март, проход:относительная дельта(часы=2, месяц=3, день=1, день недели=ВС(+2))
Если не указано и указана любая другая информация о переходе на летнее время, по умолчанию значение равно 2 часам ночи в первое воскресенье апреля.
- end — Объект
relativedelta.relativedelta
или аналогичный представляющие время и время года, когда переход на летнее время заканчивается тем же методом спецификации, что и вначало
. Одно примечание что это должно указывать на первый раз в зоне стандарта , поэтому, если переход происходит в 2 часа ночи в зоне летнего времени, и часы переводятся вспять 1 час до 01:00 установите для параметрачаса
значение +1.
Примеры:
>>> tzstr('EST5EDT') == tzrange("EST", -18000, "EDT") Истинный >>> из импорта dateutil.relativedelta * >>> range1 = tzrange("EST", -18000, "EDT") >>> range2 = tzrange("EST", -18000, "EDT", -14400, ... относительная дельта (часы = + 2, месяц = 4, день = 1, ...день недели=ВС(+1)), ... относительная дельта (часы = + 1, месяц = 10, день = 31, ...день недели=SU(-1))) >>> tzstr('EST5EDT') == диапазон1 == диапазон2 Истинный
- stdabbr – сокращение стандартного времени (например,
- класс
dateutil.tz.
tzstr
( s , posix_offset=False )[источник] tzstr
объекты — это объекты часового пояса, заданные строкой часового пояса как он будет передан в переменнуюTZ
в системах в стиле POSIX (см. Библиотека GNU C: переменная TZ для более подробной информации).Существует одно заметное исключение, которое заключается в том, что часовые пояса в стиле POSIX используют инвертированный формат смещения, поэтому обычно
GMT+3
будет проанализировано как смещение 3 часа позади по Гринвичу.Объект часового пояса
tzstr
будет анализировать это как смещение на 3 часа вперед по Гринвичу. Если вы хотите поддерживать POSIX поведение, передайте значениеTrue
вposix_offset
.Объект
tzrange
обеспечивает ту же функциональность, но указано с использованиемобъектов relativedelta.relativedelta
. скорее, чем струны.Параметры: - s – Строка часового пояса в формате переменной
TZ
. Это может бытьбайта
(2.x:str
),str
(2.x:unicode
) или поток, испускающий символы юникода (например,StringIO
). - posix_offset — Необязательно. Если установлено значение
True
, интерпретировать такие строки, какGMT+3
илиUTC+3
на 3 часа отстает от UTC, а не опережает его, согласно Стандарт POSIX.
Осторожно
До версии 2.7.0 эта функция также поддерживала часовые пояса в формате:
-
EST5EDT,4,0,6,7200,10,0,26,7200,3600
-
EST5EDT,4,1,0,7200,10,-1,0,7200,3600
Этот формат является нестандартным и устарел; эта функция вызовет
DeprecatedTZFormatWarning
до тех пор, пока поддержка удалена в будущей версии.- s – Строка часового пояса в формате переменной
- класс
dateutil.tz.
циклический
( fileobj )[источник] Этот объект предназначен для анализа структуры
VTIMEZONE
в стиле iCalendar. как указано в RFC 5545, раздел 4.6.5, в один или несколько объектов tzinfo .Параметры: fileobj — файл или поток в формате iCalendar, который должен быть в кодировке UTF-8 с окончаниями CRLF. -
получить
( tzid=None )[источник] Получить объект
datetime.tzinfo
по егоtzid
.Параметры: tzid – если доступен ровно один часовой пояс, опуская tzid
или передача значенияNone
возвращает его. В противном случае действительный требуется ключ (который можно получить изkeys()
).Поднимает: ValueError — Вызывается, если tzid
не указан, но их больше или менее 1 определенной зоны.Возвращает: Возвращает объект datetime.tzinfo
, представляющий соответствующий часовой пояс илиNone
, еслиtzid
был не найдено.
-
ключей
()[источник] Извлекает доступные часовые пояса в виде списка.
-
- класс
dateutil.tz.
tzwin
( имя )[источник] Объект часового пояса, созданный на основе информации о поясе в реестре Windows
Они аналогичны объектам
dateutil.tz.tzrange
в том, что данные часового пояса предоставляются в формате единого правила смещения за 0 или 2 смены часовых поясов в год.Параметр: имя Имя ключа часового пояса Windows, например. «Восточное стандартное время». Полный список ключей можно получить с помощью tzwin.list()
.Примечание
Доступно только в Windows
-
дисплей
() Вернуть отображаемое имя часового пояса.
- статический
список
() Возвращает список всех часовых поясов, известных системе.
-
переходы
( год ) Для заданного года получить время перехода на летнее время, выраженное всегда на стороне стандартного времени. Для зон без переходов это функция возвращает
Нет
.Параметры: год – Год, переходы которого вы хотите запросить. Возвраты: Возвращает кортеж объектов datetime.datetime
,(dston, dstoff)
для зон с ежегодным переходом на летнее время илиНет
для зон с фиксированным смещением.
-
часовых поясов | Документация Джанго
Обзор
Когда включена поддержка часовых поясов, Django сохраняет информацию о дате и времени в
UTC в базе данных, использует внутренние объекты datetime с учетом часового пояса и
переводит их в часовой пояс конечного пользователя в шаблонах и формах.
Это удобно, если ваши пользователи живут более чем в одном часовом поясе, и вы хотите отображать информацию о дате и времени в соответствии с настенными часами каждого пользователя.
Даже если ваш сайт доступен только в одном часовом поясе, это все равно хорошо практика хранения данных в формате UTC в вашей базе данных. Основная причина — светлое время суток. экономия времени (летнее время). Во многих странах есть система перехода на летнее время, когда часы переводятся весной вперед и осенью назад. Если вы работаете по местному времени, вы, вероятно, столкнетесь с ошибками два раза в год, когда происходят переходы. Это, вероятно, не имеет значения для вашего блога, но это проблема, если вы переплатите. или по счету ваших клиентов на один час, два раза в год, каждый год. Решение этой проблемы состоит в том, чтобы использовать в коде UTC и использовать местное время только тогда, когда взаимодействие с конечными пользователями.
По умолчанию поддержка часовых поясов отключена. Чтобы включить его, установите
USE_TZ =
True
в вашем файле настроек.
Примечание
В Django 5.0 поддержка часовых поясов будет включена по умолчанию.
Поддержка часовых поясов использует zoneinfo
, что является частью стандарта Python.
библиотека из Python 3.9. Пакет backports.zoneinfo
автоматически
устанавливается вместе с Django, если вы используете Python 3.8.
Примечание
По умолчанию settings.py
файл, созданный django-admin
startproject
включает USE_TZ = True
для удобства.
Если вы боретесь с конкретной проблемой, начните с часового пояса ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ.
Концепции
Наивные и осведомленные объекты datetime
Объекты Python datetime.datetime
имеют атрибут tzinfo
, который
может использоваться для хранения информации о часовом поясе, представленной в виде экземпляра
подкласс datetime.
. Когда этот атрибут установлен и описывает
смещение, объект datetime знает . В противном случае это наивное . tzinfo
Вы можете использовать is_aware()
и is_naive()
, чтобы определить,
осознанный или наивный.
Когда поддержка часового пояса отключена, Django использует наивные объекты даты и времени в локальном время. Этого достаточно для многих случаев использования. В этом режиме для получения текущее время, вы должны написать:
импорт даты и времени сейчас = datetime.datetime.now()
Когда поддержка часового пояса включена ( USE_TZ=True
), Django использует
объекты datetime с учетом часового пояса. Если ваш код создает объекты даты и времени, они
тоже должен быть в курсе. В этом режиме приведенный выше пример становится следующим:
из часового пояса импорта django.utils сейчас = часовой пояс.сейчас()
Предупреждение
Работа с осведомленными объектами даты и времени не всегда интуитивно понятна. Например,
аргумент
tzinfo
стандартного конструктора datetime не работает
достоверно для часовых поясов с летним временем. Использование UTC в целом безопасно; если вы
используя другие часовые пояса, вы должны просмотреть информация о зоне
документацию тщательно.
Note
Объекты Python datetime.time
также содержат tzinfo
атрибут, и PostgreSQL имеет соответствие времени с типом часового пояса
.
Однако, как говорится в документации PostgreSQL, этот тип «обладает свойствами, которые
привести к сомнительной полезности».
Django поддерживает только наивные объекты времени и вызовет исключение, если вы попытаться сохранить осведомленный объект времени в качестве часового пояса для времени без связанная дата не имеет смысла.
Интерпретация наивных объектов datetime
Когда USE_TZ
равно True
, Django по-прежнему принимает наивное datetime
объекты, чтобы сохранить обратную совместимость. Когда уровень базы данных
получает один, он пытается сообщить об этом, интерпретируя его в
часовой пояс по умолчанию и выдает предупреждение.
К сожалению, во время перехода на летнее время некоторые даты и время не существуют или
двусмысленный. Вот почему вы всегда должны создавать осведомленные объекты даты и времени, когда время
поддержка зоны включена. (см. Использование раздела ZoneInfo в файле zoneinfo
docs
для примеров использования атрибута fold
для указания
смещение, которое должно применяться к дате и времени во время перехода на летнее время.)
На практике это редко является проблемой. Django дает вам осведомленные объекты даты и времени
в моделях и формах, и чаще всего новые объекты datetime создаются из
существующие через timedelta
арифметику. Единственный
datetime, которое часто создается в коде приложения, является текущим временем, а timezone.now()
автоматически делает
правильная вещь.
Часовой пояс по умолчанию и текущий часовой пояс
Часовой пояс по умолчанию — это часовой пояс, определенный параметром TIME_ZONE
параметр.
Текущий часовой пояс — это часовой пояс, который используется для рендеринга.
Вы должны установить текущий часовой пояс на фактический часовой пояс конечного пользователя с помощью активировать()
. В противном случае часовой пояс по умолчанию
использовал.
Примечание
Как поясняется в документации TIME_ZONE
, Django устанавливает
переменные среды, чтобы его процесс выполнялся в часовом поясе по умолчанию.
Это происходит независимо от значения USE_TZ
и
текущий часовой пояс.
Когда USE_TZ
равно True
, это полезно для сохранения
обратная совместимость с приложениями, которые по-прежнему полагаются на местное время.
Однако, как объяснялось выше, это не
полностью надежен, и вы всегда должны работать с осведомленными датами и временем в UTC
в вашем собственном коде. Например, используйте отметка времени()
и установите для параметра tz
значение utc
.
Выбор текущего часового пояса
Текущий часовой пояс является эквивалентом текущего языкового стандарта для переводов. Тем не менее, нет никакого эквивалента Accept-Language
HTTP-заголовок, который Django может использовать для определения пользовательского
часовой пояс автоматически. Вместо этого Django предоставляет выбор часового пояса.
функции. Используйте их для построения часового пояса
логика выбора, которая имеет смысл для вас.
Большинство веб-сайтов, которые заботятся о часовых поясах, спрашивают пользователей, в каком часовом поясе они живут.
и сохранить эту информацию в профиле пользователя. Для анонимных пользователей они используют
часовой пояс их основной аудитории или UTC. zoneinfo.available_timezones()
предоставляет набор доступных часовых поясов, которые
вы можете использовать для построения карты от вероятных местоположений до часовых поясов.
Вот пример сохранения текущего часового пояса в сеансе. (пропускает
обработка ошибок исключительно ради простоты. )
Добавьте следующее промежуточное ПО в СРЕДНЕЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
:
import zoneinfo из django.utils импортировать часовой пояс класс TimezoneMiddleware: def __init__(я, get_response): self.get_response = получить_ответ def __call__(я, запрос): tzname = request.session.get("django_timezone") если имя: часовой пояс.активировать(zoneinfo.ZoneInfo(tzname)) еще: часовой пояс.деактивировать() вернуть self.get_response (запрос)
Создайте представление, которое может установить текущий часовой пояс:
из django.shortcuts import redirect, render # Подготовьте карту общих мест для выбора часового пояса, который вы хотите предложить. common_timezones = { «Лондон»: «Европа/Лондон», «Париж»: «Европа/Париж», «Нью-Йорк»: «Америка/Нью-Йорк», } определение set_timezone (запрос): если request.method == "POST": request.session["django_timezone"] = request.POST["часовой пояс"] вернуть перенаправление ("/") еще: вернуть рендеринг (запрос, "template.html", {"часовые пояса": common_timezones})
Включите форму в template.html
, которая отправит POST
в это представление:
{% load tz %} {% get_current_timezone как TIME_ZONE %}