Сказ о том, что есть общего в разработке "уникальных" веб-сервисов и стартапов
Всё еще вступление (до сути осталось чуть-чуть)
Конечно, как и многие начинающие стартаперы, я решил сделать свой сервис полезным "для всех", хотя те, кто давно в теме, говорят, что нужно в первую очередь выбрать чётко очерченную аудиторию.
Дополнительным мотивом создания своего проекта стало желание собирать свои (и чужие) наработки в сфере веб-разработки на единой платформе, что теоретически позволило бы запускать новые проекты быстрее, собирая их из блоков/модулей.
И чтобы сделать его максимально полезным "для всех" и решить - какие конкретно наработки следует собирать на платформе - мне нужно было задуматься над вопросом - Что общего у различных веб-сервисов?
* для тех, кто, возможно, не “в теме”, под терминов "веб-сервис” имеется ввиду веб-сайт, предоставляющий какие-то определённые полезные функции своим пользователям.
** далее по тексту термины веб-проект и веб-сервис имеют равное значение
А теперь ближе к сути
Стандартные функции, используемые в различных веб-сервисах, такие как Регистрация, Личный кабинет пользователя, Форма обратной связи, Создание различных страниц, Управление SEO-данными и многие другие, для первой версии приложения не имеет смысла писать с нуля (хотя многие продолжают этим заниматься). Поэтому, в качестве основы своего проекта, я использовал платформу Magento, изначально предназначенную для проектов в сфере электронной коммерции.
К тому же эта платформа имеет модульную структуру (позволяет устанавливать, включать/выключать различные модули для каждого проекта) и большое сообщество, поэтому дополнительных модулей создано уже очень много.
Но поскольку каждый новый веб-проект стремится быть уникальным, то вопрос встал еще острее - Как разработать общий функционал, позволяющий каждому проекту стать более уникальным?
Я сразу выделил четыре основных направления, функции, которые используются в большинстве проектов:
1) CRUD - Создание и редактирование, обновление, удаление данных.
Все проекты имеют дело с данными. В большинстве случаев эти данные создаются пользователями или генерируются автоматически. Администраторы сервисов, естественно, всегда могут модерировать данные или создавать свои собственные.
Платформа Magento позволяет легко использовать модель EAV для хранения данных https://en.wikipedia.org/wiki/Entity%96attribute%96value_model
Если говорить вкратце - вы можете создать шаблон объекта, дать ему название и присвоить ему атрибуты разных типов (текст, картинка, выпадающий список и т.д.), расположив их в нужном порядке. А потом на основе этого шаблона ваши пользователи смогут создавать свои данные (например как тут http://p.innl.co/)
Таким образом каждый проект может создавать свои уникальные, Динамические данные.
2) Отображение данных пользователю.
Создать данные еще не достаточно. Все веб-проекты (как ни странно) отображают что-то на экранах своих пользователей. (а экраны могут быть разными! =)
Каждый проект стремится быть уникальным в дизайне и удобным в плане пользования.
Поэтому наши Уникальные данные нужно уникально отобразить.
Для этого решено было использовать механизм Шаблонов, в которых можно создать свой дизайн, разбавив его динамическими данными, созданными пользователями сервиса (или его владельцем).
Чтобы позволить проекту стать еще уникальнее, нужно позволить вставлять динамические данные “куда угодно" и "как угодно”, а также обрамлять их различными стандартными функциями, блоками.
Для этого лучше всего подходит механизм Виджетов, используемый во множестве CMS, конструкторов и самописных проектов, позволяющий вставлять динамические блоки на статические страницы, а также настраивать каждый динамический блок с помощью набора его параметров, чтобы он выглядел (или работал) по-разному на разных страницах или проектах.
3) Связи между данными
Данные, создаваемые пользователями, назовём Объектами (собственно в программном коде моего проекта они таковыми и являются)
На различных веб-сервисах имеется множество структур данных, в зависимости от их технической реализации, но между многими структурами данных почти всегда существуют связи. Например посты в блоге могут быть привязаны к категории, или фотографии в социальной сети объединены в альбом.
Когда для разных объектов используются разные структуры данных, связи между ними нужно разрабатывать отдельно.
У нас же все данные одной структуры, поэтому почти все связи одинаковы и вы можете связать любой объект с любым (или многие со многими).
Самая простая связь - Родительский-Дочерний.
Раз мы позволяем пользователям создавать данные любой конфигурации, мы не можем угадать как они захотят их связать.
Поэтому и связи могут быть абсолютно любыми. У любого объекта, созданного на основе шаблона “А”, может быть сколько угодно родительских и дочерних элементов, созданных на основе других шаблонов. Два разных объекта могут быть одновременно и родительским и дочерними для друг друга (раз на то пошло), хотя ситуацию, когда такая логика может понадобится, представить сложно.
Возвращаясь на секунду к Отображению данных - Каждый объект может иметь свою собственную страницу, на которой могут быть отображены его родительские и/или дочерние элементы разных типов. При этом для основной страницы используется один шаблон, а внутри него, для отображения родительских/дочерних элементов используются другие шаблоны (свой шаблон для каждого типа объектов)
Например как тут - http://www.ewergy.com/ru/revyoume.html (сам проект еще в разработке) : основной объект - это Проект, его дочерние объекты - это Вакансии, Статьи, Задания и Вопросы. Как видно, каждый из них использует свой шаблон для отображения.
Также платформа Magento позволяет связывать Объекты в коллекции по абсолютно любым параметрам. Пример такой коллекции можно увидеть на странице http://p.innl.co/ru/
В добавок ко всему - объекты можно и нужно привязывать к пользователям. Это можно использовать чтобы обозначить Владельца объекта (и позволить пользователю просматривать свои объекты) или реализовать более сложную функциональность (например - Личные сообщения, где к одному объекту (“Сообщение”) будут привязаны два или более пользователей)
4) Взаимодействие со сторонними сервисами
Лирическое отступление:
Очень часто люди, желающие создать новый веб-сервис, считают, что их идея проста, гениальна и уникальна.
В одних случаях - они просто не уделяют достаточно времени поиску аналогов (или вообще не ищут на западном рынке, например).
В других случаях - они не раскручивают идею до конца, чтобы понять, что всё не так радужно, как им казалось.
Но, если смотреть с философской точки зрения, каждая идея уникальна, потому что уникален её автор.
Даже люди, прямым текстом говорящие “Хочу создать новый facebook”, могут это сделать, вложив в идею свою индивидуальность.
Но при технической реализации любого проекта этот проект разбивается на части (модули, функции).
И если рассмотреть каждую функцию в отдельности - в 99% случаев ничего уникального в ней нет.
Поэтому зачастую нет смысла реализовывать функции, уже работающие на других проектах, особенно если этот проект позволяет задействовать свои функции через API.
И таких функций/проектов на самом деле ооочень много - https://www.publicapis.com/
Через тот же механизм API можно создавать данные на вашем проекте или отправлять уже созданные данные на сторонний сервис.
Моя задумка в том, чтобы позволить синхронизировать любой Объект или Коллекцию объектов с любым сторонним API. А также предоставить свой внутренний API для любых объектов.
И что интереснее всего - несколько разных API можно свести в одной точке - применить их на Объекте или Коллекции.
Это открывает в сотни раз больше возможностей для того чтобы сделать проект уникальным, а также может позволить сделать процесс обработки данных (если такой требуется) полностью автоматизированным.
Если вы знакомы с IFTTT (http://ifttt.com), то тут можно сделать почти то же самое, только все ваши данные (или данные ваших пользователей) будут не кочевать из одного сервиса в другой, а концентрироваться на вашем сайте, где вы сможете настроить их удобное отображение, а также создать связи между ними. Например связать двух друзей из разных соц сетей, или прикрепить закладку/ссылку из одного сервиса к заметке/статье из другого сервиса.
И Ваш сайт будет работать за Вас!
Дальше - больше
Описанное выше - это лишь моё видение. На данный момент на платформе параллельно разрабатываются несколько абсолютно разноплановых проектов, авторы которых имеют разное представление о веб-сервисах и, естественно, разные цели.
При реализации этих проектов я ищу новые общие моменты, общий функционал, необходимый Разным веб-проектам (такой функционал, который каждый проект может использовать по-разному). Но об этих изысканиях я расскажу уже в следующих статьях…
PS Спасибо что дочитали до конца!
Что бы Вы не создавали, помните - чтобы сделать проект уникальным, за ним должны стоять действительно уникальные люди!