🫣 Устали от HR-сказок про «дружный коллектив» и «печеньки в офисе»?
Давайте честно поговорим о том, что действительно происходит на IT-рынке. Не в розовых презентациях, а в реальной жизни разработчиков, тестировщиков, аналитиков и всех, кто живет кодом.
🧐 Мы проводим исследование, чтобы выяснить:
— Как часто мы прыгаем между компаниями (и почему)
— Какие красные флаги заставляют бежать без оглядки
— Где реально находят работу
— Что бесит в HR больше всего
— Сколько кругов собеседований — это уже перебор
Результаты покажут реальную картину рынка. Без приукрашиваний. Может, компании поймут, что нужно менять, а специалисты — куда двигаться дальше.
😈 Опрос займет 5 минут, но результаты будут работать на всех нас → https://clc.to/9aaXVg
Давайте честно поговорим о том, что действительно происходит на IT-рынке. Не в розовых презентациях, а в реальной жизни разработчиков, тестировщиков, аналитиков и всех, кто живет кодом.
🧐 Мы проводим исследование, чтобы выяснить:
— Как часто мы прыгаем между компаниями (и почему)
— Какие красные флаги заставляют бежать без оглядки
— Где реально находят работу
— Что бесит в HR больше всего
— Сколько кругов собеседований — это уже перебор
Результаты покажут реальную картину рынка. Без приукрашиваний. Может, компании поймут, что нужно менять, а специалисты — куда двигаться дальше.
😈 Опрос займет 5 минут, но результаты будут работать на всех нас → https://clc.to/9aaXVg
🎯 Как настроить JWT аутентификацию в Spring Boot
Для настройки JWT аутентификации в Spring Boot следуйте этим шагам:
1️⃣ Добавьте зависимости
2️⃣ Создайте класс для генерации JWT
3️⃣ Создайте фильтр для JWT токенов
4️⃣ Настройте Spring Security
5️⃣ Создайте контроллер для логина
🐸 Библиотека джависта #буст
Для настройки JWT аутентификации в Spring Boot следуйте этим шагам:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.11.5</version>
</dependency>
public class JwtTokenUtil {
private static final String SECRET_KEY = "secretKey";
public static String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
public static String getUsernameFromToken(String token) {
return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject();
}
public static boolean isTokenExpired(String token) {
return getExpirationDateFromToken(token).before(new Date());
}
private static Date getExpirationDateFromToken(String token) {
return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getExpiration();
}
public static boolean validateToken(String token, String username) {
return (username.equals(getUsernameFromToken(token)) && !isTokenExpired(token));
}
}
public class JwtAuthenticationFilter extends OncePerRequestFilter {
private static final String HEADER_STRING = "Authorization";
private static final String TOKEN_PREFIX = "Bearer ";
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String header = request.getHeader(HEADER_STRING);
if (header != null && header.startsWith(TOKEN_PREFIX)) {
String token = header.substring(TOKEN_PREFIX.length());
try {
if (JwtTokenUtil.validateToken(token, JwtTokenUtil.getUsernameFromToken(token))) {
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
JwtTokenUtil.getUsernameFromToken(token), null, new ArrayList<>());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
} catch (ExpiredJwtException e) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
}
}
filterChain.doFilter(request, response);
}
}
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter());
}
}
@RestController
public class AuthController {
@PostMapping("/login")
public String login(@RequestBody AuthRequest authRequest) {
if ("admin".equals(authRequest.getUsername()) && "admin123".equals(authRequest.getPassword())) {
return JwtTokenUtil.generateToken(authRequest.getUsername());
}
return "Invalid credentials";
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
Сравнение двух крупных фреймворков до сих пор вызывает жаркие споры.
Любители Spring Boot хвалят скорость старта, гибкость и богатую экосистему. Фанаты Jakarta EE ценят стандартизацию, долгосрочную поддержку и интеграцию с корпоративными решениями.
⚡️ На практике:
— Spring Boot отлично подходит для быстрых проектов и микросервисов.
— Jakarta EE удобен для крупных систем с акцентом на стандарты и масштабируемость.
Please open Telegram to view this post
VIEW IN TELEGRAM
Когда нужно аккуратно скопировать блок кода, метод, выражение или просто цепочку вызовов — забудьте про мышь. У IntelliJ есть инструмент поумнее.
Хоткей: Ctrl + W (или Cmd + W на macOS)
🔹 Что делает
По нажатии IDEA «расширяет» выделение:
— сначала слово,
— потом выражение,
— затем строку целиком,
— потом блок кода,
— и так до всего метода или класса.
🔹 Зачем это нужно
— Быстро выделить логически связанный фрагмент без лишней возни.
— Удобно вырезать или перемещать части кода.
— Работает даже внутри строк, SQL-запросов, JSON и XML.
🔹 Как использовать
— Поставьте курсор в нужное место.
— Нажимайте Ctrl + W по очереди — и наблюдайте, как IDEA понимает структуру кода.
— Ctrl + Shift + W — отменяет шаг назад.
Please open Telegram to view this post
VIEW IN TELEGRAM
Офер VK для бэкенд-разработчиков за выходные
VK проводит Weekend Offer для бэкенд-разработчиков. Если вы больше 3 лет пишете на Java, Go, Python или C++ — у вас есть все шансы получить приглашение на работу за 2 дня: технические собеседования 28 июня, а финалы, знакомство с командами и офер 29 июня.
Отправляйте заявку до 25 июня и станьте частью VK! Подробнее о мероприятии — на сайте.
VK проводит Weekend Offer для бэкенд-разработчиков. Если вы больше 3 лет пишете на Java, Go, Python или C++ — у вас есть все шансы получить приглашение на работу за 2 дня: технические собеседования 28 июня, а финалы, знакомство с командами и офер 29 июня.
Отправляйте заявку до 25 июня и станьте частью VK! Подробнее о мероприятии — на сайте.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥴 Средний разработчик меняет работу каждые 1,5 года
И это не потому, что мы такие непостоянные. Просто рынок показывает свое истинное лицо быстрее, чем успевают напечатать визитки.
Поэтому мы собираем инсайды от тех, кто находится в окопах digital-трансформации каждый день. От джуниоров, которые только въезжают в профессию, до сеньоров, повидавших всякого.
😳 О чем говорим откровенно:
— Job-hopping и что за этим стоит
— Red flags, которые мгновенно убивают мотивацию
— Реальные источники вакансий (не те, что рекламируют)
— Боль от общения с рекрутерами
— Сколько этапов отбора — норма, а сколько — издевательство
Когда мы объединим опыт сотен IT-специалистов, получится настоящая карта того, как устроена индустрия. Не по версии HR-отделов, а по версии тех, кто пишет код, тестирует продукты и двигает технологии вперед.
🚀 Участвовать в исследовании → https://clc.to/9aaXVg
И это не потому, что мы такие непостоянные. Просто рынок показывает свое истинное лицо быстрее, чем успевают напечатать визитки.
Поэтому мы собираем инсайды от тех, кто находится в окопах digital-трансформации каждый день. От джуниоров, которые только въезжают в профессию, до сеньоров, повидавших всякого.
😳 О чем говорим откровенно:
— Job-hopping и что за этим стоит
— Red flags, которые мгновенно убивают мотивацию
— Реальные источники вакансий (не те, что рекламируют)
— Боль от общения с рекрутерами
— Сколько этапов отбора — норма, а сколько — издевательство
Когда мы объединим опыт сотен IT-специалистов, получится настоящая карта того, как устроена индустрия. Не по версии HR-отделов, а по версии тех, кто пишет код, тестирует продукты и двигает технологии вперед.
🚀 Участвовать в исследовании → https://clc.to/9aaXVg
Please open Telegram to view this post
VIEW IN TELEGRAM
Классическая книга о многопоточности — до сих пор актуальна или устарела?
Сторонники считают, что она даёт фундаментальное понимание и помогает избегать типичных ошибок. Критики говорят, что современные подходы (виртуальные потоки, реактивное программирование) частично вытеснили классическую модель.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔹 Mastering JVM Memory Troubleshooting
Интересная статья о диагностике и устранении проблем с памятью в Java-приложениях. Узнайте о разных видах ошибок: переполнении heap-а и метапространства, утечках собственной памяти, о методах их обнаружения и решения.
🔹 Strings Just Got Faster
Автор описывает улучшение производительности строк в JDK 25. Метод String::hashCode может быть оптимизирован компилятором, используя свертывание констант (constant folding), что улучшает производительность строковых ключей в Map<String, V>.
Please open Telegram to view this post
VIEW IN TELEGRAM
❗Вакансии «Библиотеки программиста»
Привет! Мы ищем контент-менеджеров, которые будут вести наши телеграм-каналы о разработке.
👾 Требования:
— знать принципы залетающего контента
— разбираться в темах, связанных с разработкой
Большим плюсом будет навык программирования на каких-либо языках.
✨ Условия:
— удаленка
— частичная занятость
— сдельная оплата в зависимости от количества задач
🔥 Оставляйте отклик, и мы свяжемся с вами: https://forms.gle/o4BZnsQ526JoqsCq9
Привет! Мы ищем контент-менеджеров, которые будут вести наши телеграм-каналы о разработке.
👾 Требования:
— знать принципы залетающего контента
— разбираться в темах, связанных с разработкой
Большим плюсом будет навык программирования на каких-либо языках.
✨ Условия:
— удаленка
— частичная занятость
— сдельная оплата в зависимости от количества задач
🔥 Оставляйте отклик, и мы свяжемся с вами: https://forms.gle/o4BZnsQ526JoqsCq9