Мир Plat.Form
2.67K subscribers
594 photos
22 videos
7 files
196 links
Привет! Это официальная страница Мир Plat.Form в Telegram. И ты тут наверняка не просто так, а чтобы узнать последние новости, послушать экспертов, чему-то научиться или стать частью нашей ИТ-команды.
Download Telegram
Исследовали офис на предмет дофамина: нашли уточек и мини-йоду

В карточках делимся своими любопытными находками в офисе, которые со временем стали частью интерьера 😄

👇 Мы в MAX
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍1095😁1
А задачки заразные?... Ещё как 😄

Поэтому возвращаемся с новой разминкой для бэкенд-разработчиков ⬇️

При внедрении новых фич в СБП изменения часто раскатывают постепенно: сначала для одних банков, потом для других. Их идентификаторы передаются строкой через разделитель: bankId1;bankId2

Иногда нужно включить фичу сразу для всех банков или, наоборот, для всех, кроме указанных.

Для этого Пётр добавил специальные значения:
ALL — фича включена для всех
I — при добавлении этого значения (в любом количестве) список начинает работать в режиме инверсии.

👍 К сожалению, Пётр заболел Stream'лянкой поэтому реализацию он написал так:
static class StringSet {
private static final String DELIMITER = ";";
private static final String ALL = "ALL";
private static final String INVERTED = "I";

private Set<String> stringSet;

public StringSet(@Nonnull String s) {
stringSet = new HashSet<>(Arrays.asList(s.split(DELIMITER)));
}

public boolean isEntityInSet(String entity) {
return stringSet.stream()
.reduce(false,
(acc, item) -> {
if (item.equals(entity)) return true;
else if (item.equals(ALL)) return true;
else if (item.equals(INVERTED)) return !acc;
else return acc;
},
(a1, a2) -> a1 || a2
);
}
}


Пётр проверил код тестами — и все они успешно прошли:

@Test
void stringSetTest() {
assertTrue(new StringSet("a").isEntityInSet("a"));
assertFalse(new StringSet("a").isEntityInSet("b"));
assertTrue(new StringSet("a;b").isEntityInSet("b"));
assertTrue(new StringSet("a;b").isEntityInSet("a"));
assertTrue(new StringSet("ALL").isEntityInSet("a"));
assertFalse(new StringSet("I;a").isEntityInSet("a"));
assertFalse(new StringSet("a;I").isEntityInSet("a"));
assertFalse(new StringSet("I;I;a").isEntityInSet("a"));
assertFalse(new StringSet("I;ALL;a").isEntityInSet("a"));
}


🏃‍♀️ Задача: найти ошибку, объяснить, почему тесты успешно проходили, и предложить вариант, при котором проверка будет работать корректно.

➡️ Пиши свою версию в комментариях и не забывай спрятать ответ под спойлер 😄

С правильным ответом вернемся в конце недели 🤝
Please open Telegram to view this post
VIEW IN TELEGRAM
👾9🔥53😁1
Руки так и тянутся переписать код 😁

Как справляешься с такой ситуацией?

😄 — работает? не трогаю
❤️ — аккуратно провожу рефакторинг
🔥 — никакие верёвки меня не удержат
Please open Telegram to view this post
VIEW IN TELEGRAM
178😁5🔥3👾1
Мир Plat.Form
А задачки заразные?... Ещё как 😄 Поэтому возвращаемся с новой разминкой для бэкенд-разработчиков ⬇️ При внедрении новых фич в СБП изменения часто раскатывают постепенно: сначала для одних банков, потом для других. Их идентификаторы передаются строкой через…
Выяснили, где Пётр подхватил Stream’лянку? 😄

Ошибка спряталась в инверсии: в текущей реализации I просто меняет накопленный результат внутри reduce.

Такая логика сработает корректно только если I попадёт в стрим последним. Но stringSet — это HashSet, а у него нет гарантированного порядка обхода элементов. Петру просто повезло: во всех тестах с инверсией I обрабатывался в нужный момент, поэтому тесты прошли.


📌 Например, этот кейс уже помог бы поймать ошибку:
assertFalse(new StringSet("I;a;z;c;ALL").isEntityInSet("z"))


Чтобы не зависеть от порядка элементов, перепишем проверку через обычные логические выражения:
var result = stringSet.contains(ALL) || stringSet.contains(entity);
return stringSet.contains(INVERTED) != result;


➡️ Так код становится проще, предсказуемее и быстрее: вместо линейного обхода получаем проверки по HashSet, которые в среднем выполняются за константное время.

Ставь ❤️, чтобы пожелать Петру скорейшего выздоровления от Stream’лянки
Please open Telegram to view this post
VIEW IN TELEGRAM
10👨‍💻3🔥2
10 лет на одном месте ≠ 10 лет в одной роли 😄

В 2016 году Саша пришёл в НСПК на позицию консультанта. Сегодня он — директор направления в Департаменте разработки.

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

👇 А тем, кто думает о смене работы, но пока сомневается, Саша советует:
«Главное — не где расти, а хотеть развиваться через новые вызовы. Если внутри компании есть и вызовы, и возможность на них ответить — значит, вы на верном пути».


Кажется, 10+ лет — вполне убедительный аргумент 😉

👇 Мы в MAX
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18105👍3🙈1😎1
Please open Telegram to view this post
VIEW IN TELEGRAM
65🔥4
Что происходит с Java после Loom? 🤔

Разбираться будем на JVM Day — конференции для тех, кому интересно не только писать код, но и знать, что происходит с ним под капотом.

👇 В программе — выступление Александра Ланцова, эксперта отдела расчётных систем Мир Plat.Form, с докладом «Java после Loom: альтернативные модели конкурентности».

Александр разберёт, что изменилось после появления Virtual Threads, и покажет, как теперь можно работать с моделями CSP и actors без лишней тяжеловесности.

✍️ Когда? 29 августа, доклад Александра с 11:40 до 12:30
✍️ Где? T-Space, Москва, ул. Грузинский Вал, д. 7

Если Java и устройство бэкенда — твоя тема, приходи послушать 🙌

➡️ Подробнее о докладе и конференции
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1176
$ happy_birthday_linux 🎉👍

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

Что вошло в их личный топ — смотри в карточках.

Делись своей любимой командой в комментариях 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉1083😁3