Sibprompost.ru

Стройка и ремонт
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Декомпозиция задач: что это и зачем нужно

Декомпозиция задач: что это и зачем нужно

И как сделать так, чтобы всё шло по плану.

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

  • добавить на страницу товара счётчик, сколько раз его купили.

Для маркетолога это одна строчка текста. Он думает, что такую простую задачку можно сделать за 15 минут. А разработчик пожимает плечами: «Подумаю, потом назову срок». Что за дичь? А вот так.

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

  • Добавить в базу товаров столбец с количеством покупок.
  • Написать новый или доработать старый метод для АПИ, чтобы сайт получал значение из этого столбца.
  • Добавить строку текста на страницу товара.
  • Протестировать метод и вёрстку.
  • Подумать, что делать с редкими случаями, например, товар купили, а потом вернули; или если товар суперпопулярный и его купили 9999999999999999 раз.

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

Чем крупнее задача, тем сложнее обойтись без декомпозиции. «Покрасить кнопку в красный» можно не раскладывать. А «Добавить новый раздел в админку» точно стоит сначала разобрать по частям: тут работа и для фронтенда, и для бэкенда. Декомпозиция нужна не всегда, но очень часто.

Была одна большая задача, стало несколько маленьких.

Зачем декомпозировать

Понять, что и в каком порядке делать. «Добавить счётчик на страницу» кажется задачей для фронтенд-разработчика. Но на самом деле он сможет сделать свою часть, только когда будет готова база данных и АПИ — механизм, по которому эти данные подтягиваются на сайт.

Если фронтенд попробует сам предположить, как будет выглядеть запрос, то после интеграции могут всплыть непредвиденные баги: бэкенд мог реализовать АПИ не так, как думал фронтенд-разработчик. Декомпозиция поможет понять, с какой стороны подступиться и в какой последовательности двигаться.

Оценить сроки. Когда задача разложена на части, можно оценить по времени каждую и понять, сколько потребуется на всё вместе. Понятно, что не получится запустить счётчик за день, если только на базу данных и АПИ нужно два.

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

Расставить приоритеты. Декомпозиция может показать, что задача большая и требует времени. Например, если маркетолог хочет указать не только количество покупок, но и количество городов, в которые товар доставляли. Разработчик может показать, что делать всё вместе — две недели, но счётчик покупок можно выкатить быстрее. А маркетолог уже решит, как лучше поступить.

Как декомпозировать

Декомпозировать можно по-разному, это зависит от масштаба и сути задачи.

Например, запуск мобильного приложения можно декомпозировать сначала на уровне платформ: iOS и Android. Потом — на уровне пользовательских сценариев: регистрация, просмотр контента, покупка, переписка с контактами. Сценарии можно разложить на интерфейс и серверную часть. А их — на отдельные конкретные задачи.

Читайте так же:
Как добавить счетчик яндекс метрика wix

Чаще всего задачи раскладывают вертикально и горизонтально. Вертикально — значит по типам работ. Горизонтально — значит вглубь одного типа работы. Вот как это работает со счётчиком покупок в интернет-магазине:

Вертикальная декомпозиция:

Бэкенд: считать количество покупок и отдавать данные на фронт.

Фронтенд: запрашивать данные при загрузке страницы и выводить.

Горизонтальная декомпозиция:

  • добавить столбец с количеством покупок в БД;
  • считать в этом столбце, сколько раз товар купили;
  • добавить метод, который будет возвращать количество покупок по id товара.
  • добавить на страницу товара строку с количеством покупок;
  • обращаться с помощью метода к БД во время загрузки страницы;
  • настроить отображение счётчика на экранах разных размеров.

Кто должен декомпозировать

Декомпозировать задачу может сам разработчик, тимлид, менеджер проекта или другой компетентный сотрудник: универсальных правил здесь нет. Руководитель службы разработки Яндекс.Практикума Александр Трегер рассказывает, как это работает у них:

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

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

👉 Почитайте полное интервью с Александром Трегером. Там больше подробностей о разработке Практикума.

Циклы в Паскале

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

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

Цикл for

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

В заголовке цикла указываются два значения. Первое значение присваивается так называемой переменной-счетчику, от этого значения начинается отсчет количества итераций (повторений). Отсчет идет всегда с шагом равным единице. Второе значение указывает, при каком значении счетчика цикл должен остановиться. Другими словами, количество итераций цикла определяется разностью между вторым и первым значением плюс единица. В Pascal тело цикла не должно содержать выражений, изменяющих счетчик.

Читайте так же:
Квартплата при наличии счетчиков

Цикл for существует в двух формах:

Счетчик – это переменная любого из перечисляемых типов (целого, булевого, символьного, диапазонного, перечисления). Начальные и конечные значения могут быть представлены не только значениями, но и выражениями, возвращающими совместимые с типом счетчика типы данных. Если между начальным и конечным выражением указано служебное слово to, то на каждом шаге цикла значение параметра будет увеличиваться на единицу. Если же указано downto, то значение параметра будет уменьшаться на единицу.

Количество итераций цикла for известно именно до его выполнения, но не до выполнения всей программы. Так в примере ниже, количество выполнений цикла определяется пользователем. Значение присваивается переменной, а затем используется в заголовке цикла. Но когда оно используется, циклу уже точно известно, сколько раз надо выполниться.

Цикл while

Цикл while является циклом с предусловием. В заголовке цикла находится логическое выражение. Если оно возвращает true, то тело цикла выполняется, если false – то нет.

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

Цикл repeat

Цикл while может не выполниться ни разу, если логическое выражение в заголовке сразу вернуло false. Однако такая ситуация не всегда может быть приемлемой. Бывает, что тело цикла должно выполниться хотя бы один раз, не зависимо оттого, что вернет логическое выражение. В таком случае используется цикл repeat – цикл с постусловием.

В цикле repeat логическое выражение стоит после тела цикла. Причем, в отличие от цикла while, здесь всё наоборот: в случае true происходит выход из цикла, в случае false – его повторение.

В примере, даже если n будет равно 0, одна звездочка все равно будет напечатана.

Система АСКУЭ. Что это и как работает. Электронный счетчик

Инженеры-энергетики еще в прошлом веке начали проектировать эффективные системы, способные самостоятельно контролировать потребление электрической энергии. В настоящее время такую систему называют автоматической системой контроля учета электроэнергии, сокращенно система АСКУЭ.

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

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

Инженеры не остановились на этом, и постоянно совершенствовали эту систему. Стали разрабатываться электронные счетчики, установка которых дает более качественные показатели расхода энергии. Далее появилась сотовая связь, которая обеспечила условия функционирования системы АСКУЭ по беспроводной технологии. Это значительно повысило эффективность эксплуатации этой системы и быстрый доступ к ее информационным данным.

Читайте так же:
Доктор борменталь счетчик калорий регистрация

Для чего служит система АСКУЭ

Главной задачей и принципом действия системы контроля электроэнергии является сбор информации по всем потребителям энергии, состоящим в этой системе, по напряжению и мощности. Затем система обрабатывает полученные показания расхода, и на их основе выдает результат в виде отчета. В обязательном порядке система проводит анализ работы и прогнозирование ситуаций на будущие периоды. Основным моментом является анализ финансовых параметров и определение стоимости за израсходованную электроэнергию.

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

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

Первый уровень

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

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

В системе имеется приемник цифрового сигнала, обладающего сопротивлением 12 кОм. Существуют некоторые ограничения передатчика цифрового сигнала, что ограничивает число приемников сигнала. Поэтому стандартный интерфейс способен принимать электронные сигналы всего от 32 датчиков, что является недостатком.

Второй уровень

Это связующий элемент системы контроля. На его линии расположены разные контроллеры, передающие сигналы. Обычно это преобразователи, модифицирующие сигнал от стандартного интерфейса к специальному устройству, совместимому с компьютером. Именно такой измененный сигнал может обрабатывать программное обеспечение.

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

Третий уровень

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

Электронные счетчики являются сложными электронными устройствами. Они применяются для учета расхода энергии, и имеют такое устройство, что могут быстро подключиться к системе АСКУЭ. Но существуют старые счетчики, не способные подключаться к системе контроля. Для решения этой проблемы в качестве дополнительного оборудования можно установить специальный оптический порт, способный считывать данные и передавать их на компьютер. Такой порт можно устанавливать на подключенном функционирующем счетчике.

В системах контроля над расходом электроэнергии кроме электронных счетчиков могут применяться индукционные виды счетчиков. Если посмотреть на маркировку индукционного счетчика, то в ней может иметься буква «Д», что означает пригодность этих моделей для работы в системе АСКУЭ. В таких счетчиках имеется импульсный датчик с возможностью телеметрического выхода, который и передает данные по двухпроводной связи.

Читайте так же:
Если сработал счетчик knox

Но вряд ли стоит применять старые счетчики индукционного типа, они уже свое отработали, и привязать их к современной системе контроля уже становится сложнее. Такие виды лучше использовать для учета потребления энергии отдельных участков, не входящих в систему контроля АСКУЭ.

Электронные счетчики

Система АСКУЭ включает в себя основные элементы – электронные счетчики, которые являются преобразователями аналогового сигнала в импульсную частоту, учет которых дает объем израсходованной электрической энергии.

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

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

Дисплей представляет собой цифровой индикатор, и служит для выдачи информации о режимах работы, потреблении энергии, времени и даты.

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

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

Оптический порт дает возможность считывать данные со счетчика и служит для установки параметров счетчика.

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

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

Система АСКУЭ работает по сложной схеме, состоит из разных уровней. Чтобы обеспечить эффективность и точность ее работы, требуется правильно связать между собой все уровни, и применять только новые современные приборы, привлекать для настройки квалифицированных мастеров.

Держать счетчик с ExecutorService?

Я хотел бы сохранить счетчик выполненных потоков, чтобы использовать его в тех же потоках, которые я выполняю.

Проблема здесь в том, что хотя счетчик увеличивается, он увеличивается неравномерно, и из вывода консоли я получил это (у меня есть for loop, который выполняет 5 потоков с ExecutorService):

Как видите, вместо того, чтобы получить 1,2,3,4,5 , я получил 3,4,4,4,4 .

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

Читайте так же:
Бесплатный счетчик времени сайта

Вот код (он меньше, и нет никакого осмысленного использования для счетчика):

Да, aldo счетчик ( с несколькими другими списками, я думаю) отсутствует в коде (они очень просты).

2 ответа

  • ExecutorService с количеством запущенных задач

Я хочу получить количество задач, которые отправлены в службу исполнителя и еще не завершены (то есть в данный момент запущены/активны или поставлены в очередь). Служба исполнителя не имеет встроенного метода для этого. ((ThreadPoolExecutor) executorService).getActiveCount() Это Returns the.

Могу ли я перезапустить ExecutorService , чтобы начать принимать новую задачу после ее завершения? Или я должен всегда создавать новый экземпляр ExecutorService ?

aldo не изменяется задачами в потоке, но вместо этого изменяется в основном потоке, здесь:

Кроме того, поскольку вам нужен счетчик, который может увеличить свое значение в нескольких потоках, вы можете использовать AtomicInteger , а не int .

Ваш код должен выглядеть следующим образом:

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

Вы также можете использовать вместо этого строковый объект, если хотите назвать потоки.

Похожие вопросы:

Я столкнулся с проблемой при закрытии моего приложения, что ExecutorService был terminated. What’s хорошим способом справиться с этим? public class TradingLock < private ExecutorService.

Этот основной дает ExecutorService 1000 runnables (тестерам), что все, что они делают, это спят 10 миллисекунд, а затем добавляют 1 к статическому счетчику, основной должен был ждать, пока ALL.

Мне нужно выполнить некоторое количество задач по 4 за раз, что-то вроде этого: ExecutorService taskExecutor = Executors.newFixedThreadPool(4); while(. ) < taskExecutor.execute(new MyTask()); >.

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

Могу ли я перезапустить ExecutorService , чтобы начать принимать новую задачу после ее завершения? Или я должен всегда создавать новый экземпляр ExecutorService ?

У меня есть две таблицы в отношениях one-to-many. Предположим , что для каждой строки в таблице foo может быть 0 или более строк в таблице bar , которые ссылаются на строку в foo . Клиент хочет.

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

Я знаю, что могу указать фиксированный размер пула потоков с помощью ExecutorService executor = Executors.newFixedThreadPool(10); Я могу добавить запускаемые объекты в executor, и они выполняются.

У меня есть executorService , который не ждет завершения части executorService , и он непосредственно возвращает возвращаемое значение без ожидания ниже приведен мой код: пожалуйста, посмотрите.

У меня есть спокойное веб-приложение. запрос может содержать большой набор данных. поэтому внутри логики restful webservice я хочу разделить обработку на 2 части. 1-я часть будет получать данные.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector