← Назад к вопросам
Расскажи о своем текущем проекте
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 миграции запускаются автоматически
Чему я научился
- Масштабирование - как проектировать БД для миллионов вопросов
- Оптимизация - профилирование и оптимизация SQL
- Архитектура - как сохранять чистоту при росте проекта
- DevOps - Docker, миграции, CI/CD pipelines
- Командная работа - code reviews, git workflow
Это очень интересный проект, где я применяю все свои знания Java и backend разработки!