Пока я пишу статью, я еду в поезде и рядом со мной 79 ребят со всей России, которые 18 предыдущих дней занимались проектами в области энергетики, и среди них едут 10 победителей этой смены, которым являюсь и я. Ну a здесь мне хочется рассказать про то, какую лепту я внес в наш проект. Я программирую уже довольно давно (по крайней мере для своего возраста), однако на этот раз получилось так, что я работал в новой для меня области, на новом для меня языке и в новой для меня команде. А именно я работал над мультиагентной системой для рынка энергетики в АЭК. Встретившись впервые с проектной командой и нашим куратором, мы, после долгого обсуждения, продумали основную концепцию и нарисовали базовую схему, в которой фигурировал такой язык как Java, но ее при этом не знал никто кроме куратора. За изучение нового языка взялся именно я, так как оказался одним из самых опытных разработчиков в проекте, и по итогу, как мне кажется, это было правильное решение. Java покорилась мне довольно быстро, хотя потом я еще великое множество раз листал документацию не понимая: "А что теперь не так?". Через полчаса, решив что Java для меня уже слишком проста, я взялся за JADE -фреймворк для написания мультиагентных систем, с помощью которой мы и организовали торги. Сама схема торгов была не такой уж и сложной, однако с нулевыми знаниями по подобным системам по началу это казалось практически невыполнимым, коими и сейчас для меня кажутся многие из задач. Торги состояли из трех раундов: Все агенты совершают торги One-to-One Не заключившие контрактов агенты торгуют One-to-Many и Many-to-Many В конечном итоге нам пришлось сделать второй раунд аналогичным первому из-за отсутствия времени. Оставшиеся без продавцов покупатели заключают контракт с центральной компанией В коде вся эта система была представлена тремя основными классами - BuyerAgent, SellerAgent и Manager. Manager - это собственно точка входа, это класс который отвечал за создания JADE Runtime и за создания в нем агентов по HTTP запросам. SellerAgent и BuyerAgent - это две сущности, которые и олицетворяли производителей продающих и потребителей покупающих электроэнергию. Оба этих агента реализовывают сложное поведение на основе FSMBehaviour: С сайта приходит запрос на создание агентов из пула Агенты регистрируются в сервисе желтых страниц Первый раунд Все покупатели отправляют информацию о своих требованиях всем продавцам (REQUEST) В ответ все продавцы отправляют свои предложения (INFORM) Покупатель делает запрос в API математики на Python и после этого отправляет предложение самым подходящим покупателям (CFP) Продавец собирает сообщения несколько секунд и после этого делает запрос в API математики для выбора лучшего предложения, затем отсылает ответ на предложение покупателю (PROPOSE) Покупатель принимает первый запрос и сразу отвечает на него согласием (ACCEPT-PROPOSAL) Второй раунд - только для не заключивших контракт в первом. Все покупатели возвращают ответ на backend нашего сайта, продавцы дают ответ только если ни с кем не договорились В целом вся система выглядит довольно просто. И я даже успел ее полностью реализовать, однако... Первые проблемы появились еще на моменте связывания агентов и backend - мы долго пытались понять как нам настроить пул, чтобы случайно не перегрузить систему агентов - в итоге, в качестве подпирающего это соединения костыля, мы установили таймер ограничения на запуск торгов. Однако на этом проблемы с этим соединением не закончились - на этот раз мы разбирались с форматом возвращаемых данных, что, на самом деле, тоже не составило особых проблем. После этого оказалось, что, пока я писал мультиагентную систему, математики успели добавить поля в систему ранжирования и мне пришлось дописывать еще и это. Но самые главные "проблемы" были в последнюю ночь перед защитой - у нас не было макета. Ну то есть он был, но все что он делал - это зажигал светодиоды на ленте по кнопкам. В итоге просидев всю ночь мы кое-как связали макет с агентами и сайтом. Но вот нормально протестировать это соединение мы, конечно, забыли. Мы перенесли макет в другое здание. До выставки остается полчаса и мы начинаем поднимать сервера чтобы все отладить и выступить во всей красе, однако... Сервера падают после первого теста. Мы начинаем паниковать и в спешке начинаем выяснять в чем причина. Вскоре я узнаю что ошибка была в backend'е и она пофикшена. Мы запускаем еще один тест и все безошибочно работает. К нам подходят судьи и после непродолжительного разговора запускают торги. Вся моя команда видит как побежали огоньки на светодиодной ленте и радуется что все сработало, один лишь я стою с небольшим испугом на лице - передо мной монитор, на котором в логах агентов отображается ошибка. В итоге после презентации мы еще несколько раз проверили код, однако ошибка больше не появлялась. Этот акт не с проста имеет номер -1, это обозначает что конец - это новое начало. Уже сейчас мы начали заново продумывать структуру проекта, анализировать наши ошибки и пересматривать некоторые решения. Если вы тоже собираетесь начинать новый проект, то, пожалуйста, сразу договоритесь о схемах взаимодействия, ведь это та самая точка, с которой и начинаются все проблемы, как они начались и у нас.  Бэкенд разработчик