Жадность — двигатель прогресса: как начинающий C# разработчик пилил бесплатную замену Quizlet, трогал React и боролся с Frontend-ом

По традиции статей Хабра начну с описания проблемы.

Я изучаю C#, .NET, ASP.NET и ищу работу Backend-разработчика. Сейчас дело дошло до собеседований и фундаментальных вещей (синтаксис, паттерны проектирования, принципы SOLID), я понял, что информации море и она вываливается из головы.

Вспомнил про метод карточек (Flashcards), который обычно используют для иностранных языков. Пошел на популярные ресурсы: Quizlet, RemNote и прочие. Зарегистрировался, начал создавать колоды, мне понравилось, вошел во вкус и каково было мое разочарование когда я везде натыкался на платные подписки. Где-то ограниченное количество карточек, где-то постоянная реклама, где-то очень замудренный интерфейс сделанный вообще не понятно для кого (привет Anki).

Хочешь больше функций? Плати. — Хочешь учить без рекламы? Плати. — Хочешь добавить картинку? Ну, ты понял...

Я смотрел на эти интерфейсы и во мне кипела злость: «Ну это же обычное CRUD-приложение! Две таблицы в базе, простейший API. Что тут сложного? Я сам могу такое сделать!»

Так родилась идея: написать свой сервис. Бесплатный. Без ограничений. Для себя. Это и проблема решится, и пет-проект для резюме будет.

Я не Fullstack

Еще одна проблема была в том что я понятия не имею за фронтенд. Я могу прочесть и понять чужой код на js(ts), но сам что-то спроектировать и как это все работает не знаю. Все мои познания исключительно поверхностные, на уровне фундаментальных вещей в программировании. Я умею в C#, могу спроектировать базу в PostgreSQL, написать API. Но фронтенд для меня — это темный лес. Я могу прочитать чужой JS-код и примерно понять, что он делает, но написать с нуля что-то сложнее alert('Hello World') — нет.

Принятие

Несколько дней я сомневался. Стоит ли ввязываться? Но каждый раз, натыкаясь на очередное ограничение у конкурентов, я убеждался: надо пробовать.

Решил так: Начну писать бэкенд, а там как пойдет. Архитектуру выбрал такую: ASP.NET Web API, PostgreSQL + Entity Framework. Как-то до этого применял Identity для аутентификации и авторизации, решил и его закрепить тут (на самом деле я не знаю альтернативы).

А вот с фронтом решил схитрить. Подумал: «Я же .NET разработчик, возьму Blazor! Буду писать на C# прямо в браузере, зачем мне этот ваш JavaScript?»

Реализация (позор)

С бэком проблем вообще не было. Я сел, написал. Запустил.

А вот фронт мне даже стыдно показывать (но я покажу)

Главная страница
Главная страница
Страница просмотра карточек
Страница просмотра карточек
Страница изучения
Страница изучения

И тут я понял что это провал. Мне даже самому не хотелось тут что-то делать :D

Это был позор. Компоненты работали криво, стили разъезжались, приложение весило как чугунный мост из-за WebAssembly. Я понял, что Blazor крутая технология, но если ты не понимаешь, как работает веб (DOM, CSS, события), магии не случится.

Помощь зала (поиск решения проблемы с фронтом)

В век кодогенерации AI, я не хотел прибегать к его использованию, потому что лично мне это практически не помогает в изучении и дает ложное ощущение прогресса. Я использую AI, но скорее как справочный материал. Когда мне нужно что-то узнать или подсмотреть. Но написать весь фронт в котором ты сам ничего не понимаешь для меня не приемлемо. Поэтому было принято решение искать такого же бедолагу как я.

Я понял, что один не вывезу. Пошел на форумы искать фронтендера-энтузиаста, которому, как и мне, нужен опыт для портфолио.

Так я нашел Айбека (https://github.com/AiserKz). Мы договорились: я держу бэк, он помогает переписать фронт на человеческий стек. Айбек искренне проработал со мной две недели.

За это время мы: Ушли от Blazor и переписали всё на React + Vite. Ну как переписали (он переписал).

Айбек объяснил мне логику компонентов, хуков и как вообще живет современный фронтенд. У меня появилось небольшое понимание, что и как взаимодействует на фронте.

Потом Айбек ушел по своим делам (спасибо ему огромное!), но проект уже обрел приемлемое лицо.

Главный экран
Главный экран

Бросать было нельзя. Пришлось мне, стиснув зубы, самому ковырять React, разбираться в стейт-менеджменте, и по ходу работы мне постоянно хотелось что-то добавить или улучшить. Разумеется будет полным враньем если я скажу что сам написал все что ниже. Во всем остальном мне помогал Claude. Но я уже хотя бы понимал что и какой компонент что делает и за что отвечает. Мог отследить и подправить логику (в силу своего понимания).

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

Показал приложение паре своих знакомых, и первое что я услышал «Мне впадлу делать карточки самому„...» Возможно я не так понимал себе процесс сам обучения, но потенциальный пользователь требует, так родилась следующая идея. А почему бы мне не делиться своими карточками с другими пользователями? Я делаю карточки для себя, что мне мешает дать на изучение их другому?

Так и появился следующий функционал расшаривания своих карточек для всех пользователей.

Библиотека общих колод
Библиотека общих колод

Теперь любой пользователь может даже не делать свои карточки, а искать и выбирать то что ему по нраву.

Раз уж появился такой функционал, нужно дорабатывать геймификацию. Теперь у меня есть лидерборд пользователей. Самые лучшие авторы колод, будут повышаться в рейтинге за каждую подписку на его колоду. А заодно тут впервые изучил библиотеку SignalR (сразу скажу очень крутая штука оказалась).

Потом разумеется хотелось где-то видеть всю эту красоту и статистику про себя, так появилась страница пользователя

Страница пользователя
Страница пользователя

И совсем забыл упомянуть крутую штуку для фронта, это библиотека tiptap. Как же просто и легко стало делать красивые и понятные карточки для изучения.

Предпросмотр колоды карточек
Предпросмотр колоды карточек
Сторона вопроса карточки
Сторона вопроса карточки
Отформатированный красивый ответ
Отформатированный красивый ответ

Возможно для кого-то это покажется простым, но я для себя неимоверно рад этой работе. Показывать всякие UI/UX элементики можно еще долго, но суть статьи не в этом. Хочу поделиться полным ходом мыслей и размышлений, как от прототипа я пришел к MVP релизу.

PS: Забыл про мобильную адаптацию UI рассказать, но базово она есть если что.

Размещение сервиса

Когда я закончил с базовой реализацией фишек которые я хотел, я был очень доволен собой и встал вопрос, а как бесплатно это все разместить в настоящем интернете и так чтобы даже люди заходили?

Немного почитав про все это, я понял что любой даже самый дешевый VPS, всегда будет лучше бесплатных вариантов. Пошел в интернет, нашел самый дешманский хостинг который был. Купил 1 ядро и 2 Гб оперативки.

Просто чтобы разобраться в вопросе, как размещать что делать и т.д.

И тут мне пришлось знакомиться с Docker. Очень часто вижу это требование в вакансиях и тут такая прекрасная возможность. Что меня очень удивило, это то что для базового понимания Docker много и не нужно. Там по сути пару файлов настроек и все, вы можете базово разместиться где угодно со своим контейнером.

Для того чтобы снизить нагрузку на и так полумертвый сервер, я решил что фронтенд буду размещать на Cloudflare. Купил там домен FlashcardsLoop.org и на этом все. Получил SSL из коробки. Больше никаких действий делать не пришлось.

ОКОК! А что тебе нужно-то?

Зачем я это пишу?

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

Я выложил проект в Open Source вот сам сайт и вот тут открытый репозиторий github.

Я буду рад любой помощи:

  1. Пользователям: просто потыкайте, создайте пару колод. Если найдете баг — пишите.

  2. Фронтендерам: мой React-код всё еще местами наивный. Если есть желание порефакторить или поправить CSS — Welcome

  3. Бэкендерам: если есть примечания или вопросы к архитектуре задавайте. Буду рад объективной оценке

Для меня это был огромный опыт выхода из зоны комфорта. Я перестал бояться фронтенда и понял, что лучший способ выучить технологию — это сделать продукт, который решает твою собственную проблему.

Пользуйтесь на здоровье!

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


  1. withkittens
    02.12.2025 23:18

    где-то очень замудренный интерфейс сделанный вообще не понятно для кого (привет Anki).

    Есть такое. Но основная ценность Anki - и почему есть смысл посидеть, поплеваться, но разобраться в интерфейсе - это алгоритмы интервального повторения. Сколько карточек показывать в день, как скоро их повторять после правильного ответа, а как скоро после неправильного - всё это чертовски важно, чтобы запоминать эффективно.