Предупреждение: контент для разработчиков

Несколько недель назад я заметил, что мой школьный библиотекарь управляет библиотекой с помощью старого доброго Microsoft Excel — без каких-либо его сложных приемов. Это крайне неэффективный способ всем управлять, и я предложил построить для него систему управления библиотекой (LMS). Если вам интересно, я буду время от времени публиковать здесь новости о своем прогрессе.

Для завершения CS50x в Гарварде я создал чрезвычайно простую систему управления библиотекой, используя Flask Python и простой SQL. Я развил репозиторий и начал адаптировать его к Django, в котором у меня больше опыта. Я внезапно понял, что могу использовать Svelte, фреймворк JavaScript, который я недавно изучал. Однако в самый первый раз, когда я использовал Svelte, я влюбился. Я никогда не видел такой красивой и простой в работе инфраструктуры пользовательского интерфейса. Невероятная скорость, малое время компиляции и великолепная документация были всего лишь дополнениями. Раньше я работал с Vue. Это, несомненно, было лучше, чем React, который я давно ненавидел по причинам, которые не могу точно сформулировать, но многие вещи могли быть лучше. Однако Svelte был далеко за пределами этой лиги, будучи передовой современной структурой.

Три года назад я очень хорошо изучил Django, создав продвинутый проект с использованием Django, поэтому решил применить ту же стратегию и здесь — я переключил свою LMS на Svelte + SvelteKit (официальный фреймворк, эквивалент Svelte Next.js от React). Я решил использовать MongoDB с Mongoose для управления БД. К сожалению, я не смогу использовать расширенную ORM Django, одну из лучших, с которыми мне приходилось работать.

С MongoDB + Mongoose все было в порядке, но, работая с ним, я обнаружил, что многие вещи утомляют. В частности, я никогда не работал с NoSQL, и меня это во многом раздражало. После небольшого исследования я обнаружил, что SQL также намного быстрее, чем MongoDB, поэтому я решил сменить систему, хотя проект был уже на полпути. Я перешел на Prisma с PostgreSQL, одной из самых быстрых и популярных баз данных на рынке SQL. Prisma была более понятной во многих отношениях, даже несмотря на то, что она требовала большого количества кода для вещей, которые я считал предполагаемыми (например, нельзя ли привести идентификаторы, передаваемые в виде строк с сервера, к правильному типу данных вместо того, чтобы вызывать ошибку?)

Однако здесь в моих планах произошли изменения: оглядевшись, я увидел, что большинство библиотек не имеют хорошего программного обеспечения. Даже в библиотеке Столетия Анны, одной из крупнейших библиотек Индии, было ужасное глючное программное обеспечение. У себя дома я тоже долго искал и не нашел хорошего решения для управления всеми моими книгами. Поэтому я решил сделать общий продукт для всех библиотек, в том числе и личных. В этом духе я решил включить тестирование и даже зашел так далеко, что начал использовать разработку через тестирование для создания проекта.

Поскольку я все равно переписывал код с помощью Prisma, я одновременно запустил TDD. После недели доблестных попыток, признаюсь, я бросил. Это было слишком сложно, слишком загадочно, а Svelte, будучи относительно новым фреймворком, просто не имел такого уровня поддержки, как, например, у Django. Однако сейчас я читаю книгу о Svelte с TDD, так что, возможно, вернусь к ней в будущем. TDD или нет, я думал, что миграция будет легкой, но это было совсем не так. В первую очередь это произошло потому, что я изменил множество вещей одновременно, и это один урок, который я хотел бы усвоить: одно изменение за раз, и чем больше постепенных изменений, тем лучше. (Давным-давно я однажды узнал об этом на курсе TDD… и быстро забыл.)

Я начал с использования обычных таблиц Bootstrap для отображения данных. Затем я перешел на Svelte Simple Datatables, фреймворк, который показался мне отличным и хорошо продуманным для Svelte. К сожалению, с этим было сложно справиться, требовалось много кода, и его было недостаточно настраиваемо для моих нужд. Затем я немного поискал и нашел таблицы данных Frappe. После моей предыдущей провальной попытки с программным обеспечением Frappe я нервничал, но все равно попробовал, потому что оно выглядело потрясающе, было настраиваемым и требовало небольшого количества кода. Работать с ним было весело, даже несмотря на то, что он был очень плохо документирован, немного глючил и вызывал непонятные ошибки. Я не буду слишком осуждающим, потому что создание собственного проекта через некоторое время напоминает мне, как легко закрадываются ошибки. Сразу после того, как сегодня утром я закончил перенос всего в Frappe Datatables… я понимаю, что в нем нет поиска функциональность, которая для меня является требованием. Вздох. Сейчас я думаю о Grid.js, который кажется неплохим. Я сообщу вам, что я выберу напоследок — возможно, в отдельном посте.

Теперь у меня есть базовый CRU — создание, чтение, обновление и еще необходимость удаления — пользователей, книг и транзакций (заимствований и возвратов). Он довольно глючный, над этим я буду работать на этой неделе. В окончательном продукте будет панель, на которой пользователи смогут просматривать все книги и «отмечать» книгу для получения — функция, которая определенно сэкономит время обеим сторонам, поскольку библиотекарям просто нужно будет держать книгу под рукой, а пользователи подберут ее и двигаться дальше. У него также будет возможность сканирования, которая частично реализована прямо сейчас — библиотекари смогут зайти на сайт со своих мобильных телефонов и отсканировать штрих-код книги, чтобы автоматически добавить ее в систему или чтобы кто-то мог ее одолжить. Мой библиотекарь рассказал мне, что он вручную добавил в файл Excel 12 000 книг по 20 полей в каждой. Глоток.

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

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

Ресурсы