Создание сайта в виде личного кабинета для участников негосударственного пенсионного фонда: баланс, выписка и заявления теперь открываются на телефоне так же легко, как на компьютере. Старый портал на J2EE Евгений Росляков не переписывал, а обновил вокруг работающих расчётов. Сайты и корпоративные системы он делает с 2016 года, работает самозанятым, подписывает договор, а юрлицам выдаёт закрывающие документы. С заказчиками встречается в Москве, остальную работу ведёт удалённо.
Портал фонда написан в 2008 году. Бизнес-логика лежит в EJB, страницы собраны на JSP под управлением Struts 1, а с базой всё общается через Hibernate. Внутри считаются накопления, взносы и выплаты. Эти формулы годами сверяли с бухгалтерией и актуариями, и лезть в них никто не хотел.
Снаружи кабинет выглядел как сайт из другой эпохи: мелкий шрифт и широкие таблицы, которые на телефоне уезжают за край экрана. А участники фонда заходят чаще с телефона, чем с компьютера. Потом они звонят в поддержку и спрашивают, где их накопления и как подать заявление.
Переписать всё с нуля предлагали не раз. Фонд отказывался, и правильно: ошибка в расчёте — это чья-то пенсия. Новую систему пришлось бы долго сверять формула за формулой.
Нужно было сделать кабинет современным и удобным с телефона, а всё, что считает деньги, оставить как есть.
Сначала я прочитал код и нарисовал карту. Какие EJB что считают, какие JSP какие методы вызывают, где лежат сущности Hibernate. По карте решили: расчётное ядро остаётся нетронутым, ни одну формулу не меняем.
Затем обновил сервер приложений и библиотеки. Часть версий давно не получала исправлений безопасности, а Struts 1 снят с поддержки уже много лет. Переходил по шагам на тестовом стенде. После каждого шага расчёты прогонялись на обезличенной выгрузке и сравнивались с эталонными значениями от специалистов фонда.
Над EJB появился REST-слой. Это тонкие методы: они вызывают прежние компоненты и отдают результат в JSON. На каждом вызове проверяется, что участник запрашивает только свой счёт и свои документы.
Новые страницы сделал для трёх самых частых сценариев: баланс, выписка за выбранный период и заявление. Вёрстка адаптивная, шрифт крупный, выписка скачивается файлом. Старые экраны на Struts для этих сценариев закрыты, прежние адреса ведут на новые. Остальные разделы пока живут на JSP, но в том же оформлении, и участник разницы почти не видит. Их переносят по очереди, когда фонд выбирает следующий сценарий.
Отдельно занялся безопасностью. Вход подтверждается одноразовым кодом, число попыток ограничено. Журнал действий записывает, кто и когда открыл выписку или подал заявление, и специалист фонда по информационной безопасности выгружает его за любой период.
Включал по одному сценарию и сначала для части участников. Если что-то шло не так, старая страница возвращалась за минуты, а расчёты не страдали, потому что их никто не менял.
Участник открывает кабинет с телефона, и баланс виден на первом экране. Выписка за нужный период скачивается за пару нажатий, заявление подаётся без бумаги и почты. В поддержку реже звонят с вопросами вроде «где это найти».
Для самого фонда важнее другое: расчёты те же, которым привыкли доверять. Сверять с нуля было нечего, поэтому риск ошибки в деньгах не вырос. Портал ни разу не останавливали, новые страницы включались постепенно.
Цену этого подхода я называю сразу. Стек остался прежним: J2EE-приложению с EJB по-прежнему нужны внимание, обновления и люди, которые его понимают. Пока часть разделов остаётся на старых JSP, у сайта два способа устроить экран, и новым сотрудникам фонда придётся об этом рассказывать.
Следующий шаг очевиден: переносить остальные сценарии по частоте обращений. Когда старых страниц останется мало, можно подумать, нужно ли выносить расчёты из EJB. Спешить с этим не стоит: пока формулы работают и сверяются, это не главная проблема.
Старый корпоративный портал на Java выглядит устаревшим, а переписывать его страшно? Откройте мой профиль на freelance.ru и отправьте сообщение: расскажите, что в нём считается, и я предложу, какие сценарии вынести первыми.