← Назад к вопросам

Делал ли Pet-проекты

1.6 Junior🔥 241 комментариев
#Soft Skills и карьера

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Pet-проекты для Java Developer

Определение

Pet-проект — это личный проект, который разработчик создаёт для обучения, экспериментов и демонстрации навыков. Не связан с официальной работой, но очень ценен для резюме и собеседований.

Типичные Pet-проекты на Java

1. REST API с Spring Boot

// Проект: Todo Application API
// Технологии: Spring Boot, PostgreSQL, JWT, Docker

@RestController
@RequestMapping("/api/v1/todos")
public class TodoController {
    
    @Autowired
    private TodoService todoService;
    
    @GetMapping
    public ResponseEntity<List<TodoDTO>> getAllTodos() {
        return ResponseEntity.ok(todoService.getAll());
    }
    
    @PostMapping
    public ResponseEntity<TodoDTO> createTodo(@RequestBody CreateTodoRequest request) {
        return ResponseEntity.status(HttpStatus.CREATED)
                .body(todoService.create(request));
    }
    
    @PutMapping("/{id}")
    public ResponseEntity<TodoDTO> updateTodo(
            @PathVariable Long id,
            @RequestBody UpdateTodoRequest request) {
        return ResponseEntity.ok(todoService.update(id, request));
    }
    
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteTodo(@PathVariable Long id) {
        todoService.delete(id);
        return ResponseEntity.noContent().build();
    }
}

// Демонстрирует: REST API, CRUD операции, обработка ошибок, DTO pattern

2. E-Commerce платформа

// Проект: Online Shop
// Технологии: Spring Boot, Spring Security, JPA/Hibernate, MySQL

@Service
public class OrderService {
    
    @Autowired
    private OrderRepository orderRepository;
    
    @Autowired
    private PaymentService paymentService;
    
    @Transactional
    public Order createOrder(OrderRequest request, User user) {
        // Проверка товаров
        List<OrderItem> items = request.getItems().stream()
                .map(item -> validateAndCreateItem(item))
                .collect(Collectors.toList());
        
        // Расчет стоимости
        BigDecimal total = items.stream()
                .map(OrderItem::getPrice)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        
        // Обработка платежа
        Payment payment = paymentService.process(total, user);
        
        // Сохранение заказа
        Order order = new Order();
        order.setUser(user);
        order.setItems(items);
        order.setTotal(total);
        order.setPayment(payment);
        order.setStatus(OrderStatus.CONFIRMED);
        
        return orderRepository.save(order);
    }
}

// Демонстрирует: транзакции, безопасность, обработка платежей

3. Чат приложение (WebSocket)

// Проект: Real-time Chat Application
// Технологии: Spring Boot, WebSocket, Redis, Vue.js

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new ChatWebSocketHandler(), "/ws/chat")
                .setAllowedOrigins("*");
    }
}

@Component
public class ChatWebSocketHandler extends TextWebSocketHandler {
    
    private final Set<WebSocketSession> sessions = ConcurrentHashMap.newKeySet();
    
    @Override
    public void afterConnectionEstablished(WebSocketSession session) {
        sessions.add(session);
    }
    
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) 
            throws Exception {
        // Broadcast сообщение всем подключённым клиентам
        for (WebSocketSession s : sessions) {
            if (s.isOpen()) {
                s.sendMessage(message);
            }
        }
    }
}

// Демонстрирует: WebSocket, реал-тайм коммуникация, асинхронность

4. Микросервисная архитектура

// Проект: Microservices Shopping System
// Сервисы: Order Service, Product Service, Payment Service, User Service
// Технологии: Spring Cloud, Eureka, Feign, Spring Cloud Gateway

// Order Service
@RestController
@RequestMapping("/api/orders")
public class OrderController {
    
    @Autowired
    private ProductServiceClient productServiceClient;
    
    @Autowired
    private PaymentServiceClient paymentServiceClient;
    
    @PostMapping
    public ResponseEntity<OrderDTO> createOrder(@RequestBody OrderRequest request) {
        // Вызов Product Service через Feign Client
        Product product = productServiceClient.getProduct(request.getProductId());
        
        // Вызов Payment Service
        Payment payment = paymentServiceClient.processPayment(
                request.getAmount(), 
                request.getUserId()
        );
        
        // Сохранение заказа
        Order order = new Order();
        order.setProduct(product);
        order.setPayment(payment);
        
        return ResponseEntity.ok(new OrderDTO(order));
    }
}

// Feign Client для взаимодействия между сервисами
@FeignClient(name = "product-service")
public interface ProductServiceClient {
    @GetMapping("/api/products/{id}")
    Product getProduct(@PathVariable Long id);
}

// Демонстрирует: микросервисы, Feign, Circuit Breaker, распределённые системы

5. Система мониторинга и логирования

// Проект: Application Monitoring System
// Технологии: Spring Boot, Micrometer, Prometheus, Grafana

@RestController
@RequestMapping("/api/metrics")
public class MetricsController {
    
    private final MeterRegistry meterRegistry;
    private final Counter requestCounter;
    private final Timer requestTimer;
    
    public MetricsController(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
        
        // Создание кастомных метрик
        this.requestCounter = Counter.builder("api.requests.total")
                .description("Total number of API requests")
                .tag("version", "1.0")
                .register(meterRegistry);
        
        this.requestTimer = Timer.builder("api.requests.duration")
                .description("Request processing time")
                .publishPercentiles(0.5, 0.95, 0.99)
                .register(meterRegistry);
    }
    
    @GetMapping("/health")
    public ResponseEntity<String> health() {
        requestCounter.increment();
        
        return requestTimer.recordCallable(() -> 
                ResponseEntity.ok("Healthy")
        );
    }
}

// Демонстрирует: мониторинг, Prometheus, метрики приложения

6. Задачный планировщик (Quartz)

// Проект: Task Scheduler Application
// Технологии: Spring Boot, Quartz, PostgreSQL

@Component
public class EmailNotificationJob implements Job {
    
    @Autowired
    private EmailService emailService;
    
    @Autowired
    private UserRepository userRepository;
    
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        try {
            // Получить пользователей с невысланными уведомлениями
            List<User> users = userRepository.findByNotificationsPending(true);
            
            // Отправить уведомления
            for (User user : users) {
                emailService.sendNotification(user);
                user.setNotificationsPending(false);
                userRepository.save(user);
            }
        } catch (Exception e) {
            throw new JobExecutionException("Failed to send notifications", e);
        }
    }
}

@Configuration
public class QuartzConfig {
    
    @Bean
    public JobDetail emailNotificationJobDetail() {
        return JobBuilder.newJob(EmailNotificationJob.class)
                .withIdentity("emailNotificationJob")
                .storeDurably()
                .build();
    }
    
    @Bean
    public Trigger emailNotificationTrigger() {
        return TriggerBuilder.newTrigger()
                .forJob(emailNotificationJobDetail())
                .withIdentity("emailNotificationTrigger")
                .withSchedule(CronScheduleBuilder.cronSchedule("0 0 * * * ?"))
                .build();
    }
}

// Демонстрирует: планирование задач, Quartz, асинхронные операции

7. File Management System

// Проект: Cloud Storage Service
// Технологии: Spring Boot, AWS S3, MongoDB, Spring Security

@Service
public class FileStorageService {
    
    @Autowired
    private AmazonS3 amazonS3;
    
    @Autowired
    private FileMetadataRepository fileRepository;
    
    public String uploadFile(MultipartFile file, User user) {
        // Генерация уникального имени
        String fileName = UUID.randomUUID().toString();
        String key = user.getId() + "/" + fileName;
        
        try {
            // Загрузка в S3
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(file.getSize());
            metadata.setContentType(file.getContentType());
            
            amazonS3.putObject("my-bucket", key, 
                    file.getInputStream(), metadata);
            
            // Сохранение метаданных в БД
            FileMetadata fileMetadata = new FileMetadata();
            fileMetadata.setUser(user);
            fileMetadata.setOriginalName(file.getOriginalFilename());
            fileMetadata.setStoragePath(key);
            fileMetadata.setSize(file.getSize());
            fileMetadata.setUploadedAt(LocalDateTime.now());
            
            fileRepository.save(fileMetadata);
            
            return key;
        } catch (IOException e) {
            throw new FileUploadException("Failed to upload file", e);
        }
    }
}

// Демонстрирует: работа с облаком (AWS), загрузка файлов, асинхронные операции

Что важно для собеседования

1. Хорошая архитектура

// ПРАВИЛЬНО: Layered Architecture
- controllers/      // Presentation layer
- services/         // Business logic layer
- repositories/     // Data access layer
- entities/         // Domain layer
- dtos/
- exceptions/
- configs/

2. Тестирование

@SpringBootTest
public class TodoServiceTest {
    
    @InjectMocks
    private TodoService todoService;
    
    @Mock
    private TodoRepository todoRepository;
    
    @Test
    public void testCreateTodo() {
        // Arrange
        TodoRequest request = new TodoRequest("Test task");
        Todo expected = new Todo(1L, "Test task");
        
        when(todoRepository.save(any(Todo.class)))
                .thenReturn(expected);
        
        // Act
        TodoDTO result = todoService.create(request);
        
        // Assert
        assertThat(result.getTitle()).isEqualTo("Test task");
        verify(todoRepository, times(1)).save(any(Todo.class));
    }
}

3. GitHub репозиторий

  • Хорошая документация (README.md)
  • История коммитов
  • .gitignore
  • Лицензия (MIT, Apache 2.0)

Проекты для разных уровней

Junior

  • Todo приложение
  • Простой блог
  • Калькулятор с историей

Middle

  • REST API с авторизацией
  • E-commerce (без микросервисов)
  • Чат (WebSocket)
  • Система рейтинга

Senior

  • Микросервисная архитектура
  • Высоконагруженная система
  • Система с кешированием
  • Распределённая очередь задач

Резюме

Pet-проекты — это возможность:

  1. Демонстрировать практические навыки
  2. Экспериментировать с новыми технологиями
  3. Показать способность к самообучению
  4. Иметь готовый пример кода для обсуждения

Наиболее ценные для собеседования проекты:

  • REST API с Spring Boot
  • Микросервисная архитектура
  • Реал-тайм приложения (WebSocket)
  • Приложения с интеграцией внешних сервисов

Главное — качество кода, архитектура и тестирование, а не количество функций.