Ответ
На последнем проекте в команде было 3 фронтенд-разработчика. Мы работали в кросс-функциональной команде, которая также включала:
- 4 бэкенд-разработчика (Java/Spring Boot)
- 2 QA-инженера
- 1 DevOps-инженера
- 1 менеджера продукта
Пример взаимодействия фронтенда и бэкенда:
1. Бэкенд (Spring Boot) предоставляет REST API:
@RestController
public class UserController {
@GetMapping("/api/users")
public List<UserDto> getAllUsers() {
return userService.getAllUsers();
}
}
2. Фронтенд (React) потребляет этот API:
// Хук для получения данных
const useUsers = () => {
const [users, setUsers] = useState([]);
useEffect(() => {
const fetchUsers = async () => {
const response = await fetch('/api/users');
const data = await response.json();
setUsers(data);
};
fetchUsers();
}, []);
return users;
};
Такое разделение ролей и четкие контракты (API) позволяли эффективно работать параллельно и масштабировать разработку.
Ответ 18+ 🔞
А, слушай, вот это история, блядь! На последнем проекте нас, фронтендеров, было трое, понимаешь? Три человека, которые отвечали за то, чтобы у пользователя глаза на лоб не полезли от интерфейса.
А работали мы в команде, где, ёпта, было овердохуища народу, если честно:
- Четыре бэкендера, которые только и делали, что на Java с Spring Boot'ом колдовали. Сидят, блядь, как будто в пещере алхимика, эндпоинты какие-то строчат.
- Два QA-инженера — эти, сука, только и ждали, чтобы наш красивый фронтенд сломать. Находят баг — радуются, как дети, пидары.
- Один DevOps — этот вообще отдельная песня, блядь. Весь такой загадочный, с кубернетесами и докерами. Спросишь что — "всё в пайплайне", и всё.
- И один менеджер продукта — который постоянно приходит с идеями: "А давайте сделаем кнопку, которая будет мигать радугой!". Ну, в рот меня чих-пых, конечно давайте.
Но самое, блядь, интересное — это как мы с этими бэкендерами общались. У них там свой храм, у нас — свой. А связывает нас, сука, этот самый REST API, как контракт, написанный кровью.
Вот смотри, как это выглядело, ёпта:
1. Бэкендер (сидит, кодит, думает, что он бог):
@RestController
public class UserController {
@GetMapping("/api/users")
public List<UserDto> getAllUsers() {
return userService.getAllUsers(); // Типа, "на, фронтенд, лови данные, чмошник"
}
}
2. А мы, фронтендеры (уже предвкушая, как будем это всё красиво рисовать):
// Хук для получения данных
const useUsers = () => {
const [users, setUsers] = useState([]); // Изначально пусто, блядь, как моя бутылка пива
useEffect(() => {
const fetchUsers = async () => {
const response = await fetch('/api/users'); // Тыкаем палкой в их эндпоинт
const data = await response.json(); // Если повезёт, и они не отдадут нам хуйню вместо JSON
setUsers(data); // Ура, товарищи, данные приехали!
};
fetchUsers();
}, []);
return users; // Возвращаем это добро
};
И вот в этом, блядь, и был весь секрет! Пока они там свои "сервисы" и "репозитории" городили, мы уже интерфейсы лепили на моковых данных. Чёткие контракты, ёбана! Никаких "ой, а мы тут поле userName переименовали в username, извините". Пиздец, если так сделаешь — вилкой в глаз получишь, сразу.
Такое разделение — это, блядь, как хороший брак: каждый занимается своим делом, не лезет в кастрюлю к другому, и в итоге всем хорошо. Масштабировалось всё на ура. Нового фронта наняли — дал ему Swagger (или, там, OpenAPI), и пусть себе работает, не отвлекая бэкендеров от их священных ритуалов с хибернейтом.
Вот так-то, блядь. Казалось бы, ерунда — API да эндпоинты. А без этого — терпения ноль ебать, все друг другу мозги вынесут на раз-два.