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

Расскажи о своем текущем проекте

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

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

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

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

# Про мой текущий проект

Проект: AI Assistant для подготовки к собеседованиям (PrepBro)

Занимаюсь разработкой платформы, которая помогает разработчикам подготовиться к собеседованиям через интерактивное взаимодействие с AI.

Архитектура и стек

Backend

// Основные технологии:
// - Java 17+
// - Spring Boot 3.x (REST API)
// - PostgreSQL с миграциями Goose
// - SQLAlchemy для ORM (зависит от части проекта)
// - Docker + Kubernetes для деплоя

public class InterviewController {
    @Autowired
    private InterviewService interviewService;
    
    @PostMapping("/api/v1/interview/{profession_id}")
    public ResponseEntity<QuestionDTO> getNextQuestion(
        @PathVariable UUID professionId,
        @RequestHeader("X-User-Id") UUID userId
    ) {
        Question question = interviewService.getNextQuestion(
            professionId,
            userId
        );
        return ResponseEntity.ok(mapToDTO(question));
    }
}

Frontend

// React 19 + TypeScript
// Next.js 14 с SSG (static export)
// Tailwind CSS v4
// Playwright для E2E тестирования

interface InterviewSession {
    professionId: string;
    questionId: string;
    title: string;
    userAnswer: string;
}

export function InterviewPage() {
    const [question, setQuestion] = useState<Question | null>(null);
    
    const fetchQuestion = async () => {
        const res = await fetch(/api/v1/interview/next);
        const data = await res.json();
        setQuestion(data);
    };
    
    return (
        <div className="min-h-screen bg-surface-primary">
            {question && (
                <QuestionCard
                    title={question.title}
                    profession={question.profession}
                />
            )}
        </div>
    );
}

Мои основные задачи

1. Backend API

  • Разработка REST endpoints для управления вопросами
  • Интеграция с AI для генерации и оценки ответов
  • Кэширование популярных вопросов (Redis)
  • Оптимизация SQL queries для быстрого поиска вопросов
public class QuestionRepository {
    @Query(
        "SELECT q FROM Question q " +
        "WHERE q.profession.id = :professionId " +
        "ORDER BY q.difficulty ASC LIMIT 1"
    )
    Optional<Question> findNextQuestion(UUID professionId);
    
    // Оптимизированный query с индексами
    // Добавил индекс на (profession_id, difficulty)
}

2. Database Design

  • Проектирование схемы для хранения вопросов, ответов, истории пользователя
  • Миграции с Goose (raw SQL)
  • Оптимизация индексов для production
-- migrations/0001_init_schema.sql
CREATE TABLE professions (
    id UUID PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    created_at TIMESTAMPTZ DEFAULT NOW()
);

CREATE TABLE questions (
    id UUID PRIMARY KEY,
    profession_id UUID REFERENCES professions(id),
    title TEXT NOT NULL,
    difficulty INT,
    created_at TIMESTAMPTZ DEFAULT NOW()
);

CREATE INDEX idx_questions_profession_difficulty 
 ON questions(profession_id, difficulty);

3. Clean Architecture

  • Разделение на слои: domain → application → infrastructure → presentation
  • Dependency injection через Spring
  • Использование service layer для бизнес-логики
// Domain layer - бизнес-логика
public class Interview {
    private final UUID id;
    private final UUID professionId;
    private final List<Answer> answers;
    
    public void addAnswer(Answer answer) {
        if (answers.size() >= 10) {
            throw new IllegalStateException(
                "Interview can have maximum 10 answers"
            );
        }
        answers.add(answer);
    }
    
    public double getScore() {
        return answers.stream()
            .mapToDouble(Answer::getScore)
            .average()
            .orElse(0.0);
    }
}

// Application layer - use cases
@Service
public class InterviewService {
    @Autowired private InterviewRepository repo;
    @Autowired private QuestionService questionService;
    
    public Interview submitAnswer(UUID interviewId, String answer) {
        Interview interview = repo.findById(interviewId)
            .orElseThrow();
        
        Question question = questionService.getCurrentQuestion(interviewId);
        double score = evaluateAnswer(answer, question);
        
        interview.addAnswer(new Answer(answer, score));
        return repo.save(interview);
    }
}

// Infrastructure - database
@Repository
public class InterviewRepository {
    @Autowired private JpaRepository<Interview, UUID> jpa;
    
    public Interview save(Interview interview) {
        return jpa.save(interview);
    }
}

// Presentation - REST
@RestController
public class InterviewController {
    @Autowired private InterviewService service;
    
    @PostMapping("/interviews/{id}/answer")
    public ResponseEntity<ScoreDTO> submitAnswer(
        @PathVariable UUID id,
        @RequestBody AnswerRequest request
    ) {
        Interview result = service.submitAnswer(id, request.answer);
        return ResponseEntity.ok(
            new ScoreDTO(result.getScore())
        );
    }
}

Технические вызовы

1. Performance

  • Приходилось оптимизировать queries, чтобы вернуться от 3s до 200ms
  • Добавил кэширование часто запрашиваемых вопросов

2. Testing

  • Покрыл критические части тестами (>90% coverage)
  • Использую VCR.py для записи HTTP ответов в тестах
  • E2E тесты через Playwright
@ExtendWith(MockitoExtension.class)
public class InterviewServiceTest {
    @Mock private QuestionRepository questionRepo;
    @InjectMocks private InterviewService service;
    
    @Test
    void shouldCalculateScoreCorrectly() {
        Interview interview = createInterview();
        interview.addAnswer(new Answer("Good answer", 0.9));
        interview.addAnswer(new Answer("Excellent", 0.95));
        
        assertEquals(0.925, interview.getScore(), 0.01);
    }
}

3. CI/CD

  • GitLab CI для автоматических тестов и деплоя
  • Docker контейнеризация
  • Goose миграции запускаются автоматически

Чему я научился

  1. Масштабирование - как проектировать БД для миллионов вопросов
  2. Оптимизация - профилирование и оптимизация SQL
  3. Архитектура - как сохранять чистоту при росте проекта
  4. DevOps - Docker, миграции, CI/CD pipelines
  5. Командная работа - code reviews, git workflow

Это очень интересный проект, где я применяю все свои знания Java и backend разработки!

Расскажи о своем текущем проекте | PrepBro