Образовательный веб-сервис «IronBrain» (beta)
Хотелось бы поделится с вами системой для обучения, которую я разрабатываю уже в течении нескольких лет и которая уже принесла мне большую огромную пользу. Система представлена в виде веб сайта.
В этой статье вы узнаете, откуда зародились идеи, лежащие в основе IronBrain, как она эволюционировала, как правильно её использовать, а также конкретные практические случаи — в чём IB может помочь конкретно вам и насколько сильно. Также подробно расскажу, с какими проблемами столкнулся при разработке и как их решал, про некоторые детали технической реализации IB.
Сразу предупреждаю — система нацелена на очень высокий и качественный уровень обучения и подойдёт далеко не каждому.
P.S.: Проект полностью открытый и свободный, не имеет никакой коммерческой направленности, сделан от души и выложен на ваше рассмотрение — вдруг кому пригодится…
Вступление
Сразу оговорюсь — вполне возможно, что сайт ironbrain.org упадёт из-за хабра-эффекта или будет сильно тормозить в дни публикации статьи, поэтому я предусмотрел запасной вариант — вы можете просто скачать и запустить сервер у вас на ПК (под Windows). Всё-таки, главная цель этой статьи — донести идею, а не реализацию.
Как зародилась идея
Чтобы донести наиболее точно идеологию программы и область её применения, нужно понимать, зачем она создавалась, какие задачи решала и как развивалась. Коротко о себе — меня зовут Ярослав и на момент публикации статьи я учусь на 4 курсе СПБ ГУАП. Идеи, которые лежат в основе IB, зародились много лет назад. Но обо всём по порядку.
Я начал увлекаться программированием ещё в далёком 2007 году. Тогда большинство изучало языки самостоятельно и, как правило, по книгам или руководствам. Для начала я просто читал книги и проверял на практике то, что в них написано. Но со временем пришло осознание неэффективности данной методики. Я начал искать более продуктивные пути обучения — и со временем нашёл их.
Знакомые посоветовали завести тетрадку 48 листов и записывать в неё краткое изложение того, что есть в книге. По началу идея «конспектировать книгу» казалась мне странной и бесполезной. Зачем переписывать то, что уже есть? Ведь я всегда могу открыть книгу и найти нужную мне информацию. Книг много и не всегда есть возможность брать их с собой? Электронные копии можно раздобыть без труда для большинства книг, а с появлением электронных чернил граница практически стирается — можно иметь 1000 книг в одном устройстве. И вообще, сама идея конспектов казалась мне пережитком прошлого — тогда книги было не достать, приходилось их конспектировать или вовсе переписывать.
Но я ошибался. Главная польза от конспектирования книг была далеко не в этом. Когда вы пишете конспект, ваш мозг перерабатывает информацию и делает выводы. Он пропускает её через себя и записывает в том виде, в котором она лучше конкретно для вас. И эта переработанная информация запоминается существенно лучше. Особенно если вы в вашем конспекте добавляете что-то своё — возникшие мысли, неочевидные выводы или замечания. Написание конспекта заставляет вас думать и делать теоретические выводы — что в конечном итоге хорошо скажется на практике. В этом и есть главная польза. Польза номер два — если вы долго не использовали полученные знания, например, по библиотеке или языку программирования, вам существенно проще вспомнить прочитанный материал.
На самом деле, можно достичь примерно того же эффекта, делая конспект устно — читая и вдумываясь в прочитанное. Так в 2010 я готовился к ЕГЭ по физике — без составления конспекта. О чём, кстати говоря, пожалел в начале первого курса, так как перечитывать книжечку желания не возникало, но освежить в памяти основы — хотелось.
Много лет я, изучая те или иные технологии, вёл по ним конспекты в бумажной форме — сохранились тетрадки по Assemler, Pascal, AcrionScript 2,3. Конспектирование книг для меня было тогда крутым прорывом в обучении. Но потом я стал чувствовать, что чего-то не хватает. Первая проблема, над которой я начал думать — почему бы не заменить бумажные конспекты на электронные? Я попробовал, но никакого прорыва там не было — doc или odt — документ это по сути та же самая тетрадка, только бесконечно прочная и бесконечно лёгкая — бери куда хочешь. Но эти свойства были не очень то и нужны. А вот недостатки были — тетрадку всё-таки было куда приятнее вести, да и глаза отдыхали. Таким образом, электронные конспекты в традиционной форме у меня никак не прижились.
Когда я готовился к первой сессии на первом курсе ГУАПа (это был далёкий 2011 год), передо мной встала задача за короткий срок — всего за неделю — изучить алгебру на ВУЗовском уровне. Экзамен обещал быть суровым, списать там крайне трудно. Часть материала была в моём конспекте лекций, часть — пришлось брать из книги. Когда я перечитывал конспекты, обратил внимание, что лектор давал существенно больше, чем было в списке вопросов к экзамену. Что, если бы я в дальнейшем собирался работать инженером и углублённое знание алгебры мне бы пригодилось? В общем, я глубоко задумался над этой разницей в объёме подаваемого материала. А также я заметил, что сам по себе подход составления билетов очень даже хорош для обучения, причём может пригодится для личных целей, например в изучении новых языков программирования или библиотек к ним. Билет заставляет думать. Подготовился я классическим образом, написав большую часть билетов по заданному списку вопросов — и сдал этот экзамен на отлично.
Во втором семестре первого курса, когда у нас начался курс физики, я задумался о том, чтобы поглубже её изучить, а за одно и заранее подготовится к экзамену. Почему бы не составлять билеты по всем топикам, которые зачитывает лектор? И создавать побольше вопросов, которые «вытаскивают» весь материал, заставляя его вспоминать и обдумывать? Я попробовал составлять их во второй половинке тетрадки, но на бумаге это было крайне неудобно, было непонятно, какой вопрос к чему относится, а отдельно переписывать весь материал не хотелось. Нужна была именно программа, которая, помимо всего прочего, умеет нарезать билеты случайным образом, а также хранит, помню я данный билет или нет, чтобы повторно его не выдавать. Но я тогда не догадался её сделать.
Когда летом в 2011 году я отдыхал на Кипре, ко мне пришла идея создать универсальную программку для хранения документов личного характера и добавляющую нужные мне функции, которых нет в Word/Writer. Помимо всего прочего, я вспомнил про идею конспектирования в билеты, и решил, что её можно будет без труда реализовать на основе этой программы. Решил назвать программу IronBrain. По изначальной идее, программа должна была синхронизировать знания вашего мозга с компьютером, пускай очень приближённо и не напрямую — через мышь и монитор. Но эта общая идея не была реализована тогда в той мере, которую я хотел. По сути, когда вы пишите некоторый документ, а потом перечитываете его — вы синхронизируете ваши знания с ПК, но это очень не эффективно. Если у вас много документов, вам будет не интересно просто их всех перечитывать с опеределённым периодом.
Эволюция IronBrain
На втором курсе я сразу же приступил к работе. Тогда я видел IronBrain в виде суровой десктопной программы, которая работает моментально быстро, сидит в панели уведомлений и запускается по глобальным горячим клавишам. Так я и сделал. Долгий поиск в интернете и исследования показали, что лучшим решением задачи будет использование C++/Qt. Под «лучшим» я понимал, что программа будет лучшей именно для пользователей — не будет требовать установки сторонних виртуальных машин, запускаться как чистый исполняемый файл и выглядеть как большинство десктопных программ. При этом Qt даёт желаемую кроссплатформенность — я не хотел привязываться к конкретной операционной системе. Я также смотрел в сторону Java/Swing, но отбросил эту идею. Мне казалось, что интерфейсы на Java будут жутко тормозить.
Тогда я столкнулся с двумя крупными проблемами — незнание С++ и незнание Qt. Именно отсутствие того самого базового курса по С++ — у меня не было по нему конспектов и не нашлось времени его нормально изучить. По Qt пришлось прочитать несколько глав из книги, чтобы понимать самые основы. В конечном итоге, незнание С++ умножилось на его сложность, и я порой часами сидел и пытался добиться элементарного — компиляции программы. Разработка шла очень медленно, и только к концу семестра я представил что-то рабочее. Надо признать, знания С++/Qt не сильно выросли в процессе разработки, особенно C++. Это кстати ещё одно наглядное доказательство, почему не надо изучать языки типа С++ на ходу и лучше потратить отдельное время для обучения «по книге».
На самом деле, разработку замедляло то, что я не очень хорошо представлял, как должна работать моя программа. Я поступил весьма глупо и сделал просто большой массив объектов, которые хранили предложения, и при этом была возможность ставить вопрос от одного предложения к другому. Идея была такая — сначала пользователь пишет ответы — т.е. сам фрагмент конспекта. Потом программа заставляет его ставить вопрос к каждой строчке, и, таким образом, большую часть конспекта можно вытащить с помощью вопросов. Но это была крайне неудачная идея. В добавок ко всему, программа часто вылетала с типичной ошибкой «программа выполнила недопустимую операцию и будет закрыта» — где-то были ошибки с указателями. Однако основная идея была реализована и работала, я сидел на QIronBrain пару месяцев в начале 2013 года. Он уже тогда начал приносить существенную пользу. Как он выглядел, можете посмотреть на снимке экрана ниже.
Потом я понял, что мне нужно было просто два RichTextEditor для вопросов и ответов. Нужно было кардинально менять архитектуру приложения, в идеале — переделать полностью. Я так и сделал. Используя те же небольшие знания С++/Qt, я меньше чем за неделю с нуля написал работающий прототип Examiner — выдрав из QIronBrain единственно успешную идею. Именно эту реинкарнацию IronBrain я использовал потом больше года, создав в ней около 600 билетов по разным темам. Причём парадокс в том, что я её вообще не дорабатывал — использовал в том виде, в котором выпустил первую версию. Она почти никогда не вылетала, получилась весьма дубовой и надёжной. Данные, как и в QIronBrain, хранились в виде одного XML-файла. В качестве основы использовался класс QTextEdit, который позволял получать его содержимое в виде HTML и строить его же на основе HTML.
Всё, что делал Examiner — создавал билеты и иерархию для них, а также позволял линейно прогнать билеты из определённого раздела. Этого было более чем достаточно. В середине 2013 года я решил выбрать некий эталонный язык программирования и углублённо его изучить, т.к. мои знания были разбросаны поверхностно и по разным языкам. Изначально я думал, что таким языком станет С++. Однако после долгих раздумий, вдумчивого чтения холиваров, анализа вакансий на различных сайтах и рейтингов, я пришёл к выводу, что мне нужна Java. Сказано — сделано. За пол года я прочитал и законспектировал больше половины книги Шилдта, а также прогнал множество разных тестов, начиная от Quizful и заканчивая Enthuware. Кстати говоря, из тестов я получил почти столько же знаний, сколько из книги, и это были расширенные знания по тонкостям языка — я детально разбирал непонятные мне вопросы и составлял билеты по ним. В сумме я создал примерно 500 билетов по Java SE 6 и поднял свои знания на совершенно новый уровень. Это дало мне возможность сдать на довольно хардкорном тренажёре экзамен «Java SE 6 Programmer Certified Professional», что весьма круто, а потом сдать «Java SE 7 Programmer I» уже в реальном центре сертификации, что было совсем просто (так как он на основы), но открывало путь сертификации Oracle по Java и возможность дальнейшей сдачи более крутых экзаменов.
В начале 2014 года я увлекся андроидом и создал ещё около 100 билетов по андроиду. Надо признать, андроид изучается по книге не очень хорошо. Или, может быть, я взял слишком сложную книгу. В любом случае, я бы мог вполне успешно создавать билеты на основе полученного или нагугленного опыта, но Examiner был строго иерархичен — я не мог создать билет на пустом месте и привязать его к нескольким областям знаний. В середине 2014 года я пришёл к выводу, что не помешает доработать Examiner и пустить его в народ — написать статью на хабре про всё это дело. Я решил, что перепишу программу на Java/Swing и добавлю ряд удобных функций, таких как поиск по базе билетов и добавление билета вне иерархии.
Примерно за 2 месяца работы я создал работающий прототип JIronBrain, в котором были реализованы новые функции и улучшено много всего. Однако я понял, что совершил фундаментальную ошибку. Те средства GUI, которые я использовал, считались далеко не самыми лучшими. Когда я разрабатывал Examiner на Qt, оказалось, что библиотеку QtWidgets, в которой находился дорогой мне QTextEdit, не собираются развивать дальше. На замену приходит QtQuickControls, которые не давали на тот момент многое из того, что я хотел. И не известно, когда их доработают до этого уровня. Я надеялся, что в Java/Swing не будет такого. Однако оказалось, что Swing также считается устаревшей библиотекой и давно не дорабатывается, критические баги не исправляются, а Oracle позиционирует JavaFX как замену Swing. Я лично столкнулся с проблемой в JTextPane, когда пользователь вводит несколько пробелов подряд и они теряются при setHtml(getHtml()). Конечно можно всё это костылями исправлять, но неужели нет средства получше? Я подумывал переписать интерфейс на JavaFX, но потом понял, что это также будет критической ошибкой.
Самым правильным решением было делать IronBrain в вебе. Как оказалось, уже довольно давно существует аттрибут contenteditable, который даёт мне тот самый идеальный RichTextEditor, который так хотелось. И HTML5 уж точно никуда не денется. Причём этот RichTextEditor отлично работает как под разными десктопными браузерами, так и под андроидом. А Swing под Android запустить практически не реально. Этот факт меня очень сильно задел, и я понял, что имеют в виду, когда говорят, что будущее за вебом. Веб-приложение это своеобразный трансформер — он может работать в режиме клиент-сервер, а можно запустить его как десктопную программу, не имея выхода в интернет.
Я достал листок формата А4 и написал анализ моего Java/Swing приложения и какие преимущества я получу при переходе на веб-архитектуру. Они были весьма существенными, начиная от очень перспективной технологии к построению GUI (HTML5), заканчивая удобством для конечного пользователя — не нужно ничего скачивать, устанавливать и так далее. Я понял, что имеет смысл переписать IronBrain ещё раз. Четвёртый раз. За ошибку неправильного выбора технологии пришлось дорого заплатить временем и силами. Но переход того стоит.
И действительно, HTML5 дал мне всё и даже больше. Это, по всей видимости, самая совершенная в мире технология для построения GUI малой и средней сложности, хотя, учитывая современные процессоры и быстрые браузеры, я думаю на HTML можно построить интерфейс практически любой сложности. Я даже и представить себе не мог, что в нём есть очень мощный встроенный RichTextEditor. Практически на всех форумах, на которых я работал, нужно сначала ввести код, и только потом он визуализируется в режиме «предпросмотра». К тому же, многие сайты жутко тормозят, и я думал, что моя система также будет тормозить. Но размещённый на VPS WIronBrain работал тоже практически моментально! К тому же, на крайний случай я мог запускать его локально, тогда уж по скорости работы он будет таким же, как и десктопные приложения.
Примерно за пару месяцев я с нуля разработал WIronBrain, с серверной частью на Java/Spring, а клиентской — на HTML5/CSS/JS. Старую базу перегнал в MySQL, чем кстати очень доволен.
Идея
Обучение имеет огромное значение в нашей жизни, особенно для IT специалиста. Если вы постоянно изучаете что-то новое, то наверняка сталкиваетесь с проблемой потери ценной информации — человеку свойственно забывать. Каждый пытается решить эту проблему по-своему — например с помощью конспекта или записной книжки.
Я предлагаю вам особый формат хранения знаний — в виде билетов. Все ваши знания и навыки, практически весь ваш жизненный опыт можно разложить в форме билетов. Что такое билет? Это некий набор вопросов и ответов на них. Это могут быть как теоретические вопросы, так и задачи с развёрнутым ответом. Вам нужно всего лишь научится их составлять — и чтобы это вошло в привычку.
Если вы будете забывать что-то из определённой области, вы можете нарезать билеты по этой области, составленные вами же и прогонять их в виде теста. Огромное преимущество билетов над повторным прочитыванием книги или конспекта — они заставляют вас думать. Много думать, вспоминать и анализировать. Вы проверяете сами себя — соответствует ли ваш ответ задуманному и выбираете, появится ли этот билет ещё раз в текущем тесте. И после долгого размышления над вопросами забытого билета — вы легко его вспомните, посмотрев ответы.
Система IronBrain позволяет автоматизировать создание билетов, организовать их нарезку и поиск по ним, а также множество других полезных функций. Если вы что-то регулярно изучаете, вы можете перед каждым новым занятием благодаря вопросам полностью вспомнить основные моменты прошлого занятия. Можете смотреть на IronBrain как на учителя, который перед каждым новым уроком накидывает вам вопросы за прошлый и разъясняет, если вы где-то ошиблись. А также заставляет вас заучивать основные моменты. Именно в этом и есть основная польза IronBrain. Обучение станет существенно интереснее и приятнее, так как вы будете видеть свой прогресс и много думать. Одно из самых главных приемуществ IB — повышение удовольствия от обучения и как следствие — крутой рост вашей производительности. На самом деле, чтобы прочувствовать главные преимущества IronBrain и увидеть разницу с классическим подходом к обучению, нужно всего 3-4 дня, каждый по 1-1,5 часа. Просто попробуйте.
Тонкости использования системы нет смысла описывать в пределах данной статьи, можете почитать про них в разделе «Документация -> Руководство пользователя» внутри IB.
Конкретные случаи применения
Изучение языка программирования общего назначения
HTML/CSS/JS можно изучить на ходу, без чтения книг или руководств (так делают большинство фрилансеров), на уровне, достаточном для создания небольших сайтов на заказ. С более сложными языками программирования, такими, как C++ или Java, такой подход не эффективен. Если вы будете изучать их по ходу разработки проектов, то рискуете наделать архитектурных ошибок, за которые потом дорого заплатите. Конечно, всё можно изучить через практику и на своих ошибках — но на это потребуются годы, в то время как можно перенять чужой опыт из книг существенно быстрее.
Алгоритм следующий — берёте книгу по C++/C#/Objective-C/Java или по другому промышленному языку. Открываете IB, заходите в раздел [Билеты]→[Группы] и там создаёте раздел для вашего языка и в нём — раздел для книги. В нём строите иерархию — как вам удобнее — от раздела до главы и подразделов. В них уже — непосредственно сами билеты. Читаете книгу, конспектируете теорию, потом практикуетесь — вводите код и играетесь с ним, меняйте его и смотрите на результат. Обязательно проверяйте ВЕСЬ подаваемый материал на практике, так вскрываются опечатки, интересные моменты и полезные особенности. По всем извлечённым знаниям и тонкостям, которые вы обнаружили — составляете билеты, типа «как написать такую-то программу, какие там тонкости». Причём области для билетов НЕ проставляете. Лучше для каждой главы укажите область по названию языка. Это позволит вам потом, при необходимости, вытащить этот набор билетов и соединить его с билетами, полученными опытным путём по этой же теме и с другими книгами.
Обязательно каждый раз перед новым занятием прогоняйте билеты, которые вы создали в прошлом занятии — тогда знания будут существенно лучше укладываться, будет происходить переосмысление многих вещей. Именно это повторение билетов — и есть главная польза от IB в данном конкретном случае. Ваше обучение программированию будет существенно более эффективным и приятным. Польза номер 2 — через поиск вы можете просто легко найти ваши билеты и использовать базу как личный FAQ.
Довольно часто случается так — начинаешь читать новую сложную главу, причём сложную именно концептуально — новые понятия, подходы и принципы. Порой читаешь и просто не понимаешь, что и зачем. IB помогает постепенно «взять» такие главы без особого труда. Нужно всего лишь составить 3-4 билета с теорией, хотя бы с простейшими определениями. А на следующий день — прогнать и выучить эти билеты. Затем, продолжив обучение, вы заметите, что очень многое прояснилось и обучение пойдёт в гору. Возникает это потому, что ваш конспект — выжимка теории — даёт некий «каркас» для вашего мышления, «основу», от которой вы можете отталкиваться и расставить всё на свои места.
Используя IB, я изучил Java SE на довольно приличном уровне и до сих пор использую эти знания по нескольким направлениям. Было составлено около 300 билетов по книге «Шилдт Java 7 полное руководство». Это было совсем не трудно, как вам может показаться на первый взгляд. И очень продуктивно. В день нужно заниматься примерно по 1,5-2 часа, составляя около 4-6 билетов.
Изучение пакета по работе с графикой
В 2013 году меня интересовала тема создания игр, хотелось создать свою маленькую инди-игру, пускай и не сложную, но выполненную от начала до конца. Но незнание программ для 3D моделирования тянуло назад. Обычно в таких случаях берут отдельного человека-дизайнера, но для начала хотелось самому попробовать эту область.
Лицензионный 3D max стоил огромных денег, а использовать взломанную версию и к тому же не кроссплатформенную мне не хотелось. Я увидел, что есть достойная замена — Blender — и решил изучить его. Скачал очень хорошую серию видеокурсов на русском языке по нему, стал просматривать и экспериментировать. А также — параллельно создавать билеты по полученным знаниям. Тогда QIronBrain не позволял вставлять снимки экрана, но мне они были не сильно нужны. Достаточно было в тексте сформулировать вопрос, например «Как произвести экструзию полигона?» или «Как сколлапсировать три точки?» — и ответы в виде горячих клавиш, или же описание где находятся необходимые кнопки. Кроме вопросов-ответов по элементарным темам я также задавал чисто технологические вопросы-ответы, например «Как сделать чашку через 2D рисование и вращение на 360 градусов» — а затем описание алгоритма по пунктам. На обучение ушло примерно 2 недели, почти каждый день я занимался в среднем 1,5-2 часа.
Основы блендера я изучил, но проект по созданию игры отложил на будущее, так как было много других задач. И через полгода в новом семестре у меня была курсовая работа по компьютерной графике. Вот тут то и сказались огромные преимущества IronBrain. Я открыл Blender и понял, что 60% изученного не помню в принципе, а ещё 30% помню крайне смутно. Полгода я не практиковал 3D моделирование, да и я вообще ни разу не практиковал полученные знания — изучил и забыл. Что делать? Времени то на обучение было потрачено прилично. Пересматривать те же самые видеокурсы по второму разу было утомительно и непродуктивно. Конечно, повторное изучение материала идёт существенно быстрее — я бы смог пересмотреть и вспомнить всё это за неделю — по 1,5-2 часа каждый день. Но был более эффективный путь.
Прогон всех билетов по Blender занял у меня примерно 3 дня по 2 часа каждый день. Это в два раза меньше, чем если бы я повторно смотрел видеокурс. И в три раза приятнее, так как, опять же, вопросы заставляют думать. Я создал отличные 3D модели (для курсовой) и без проблем сдал её. С тех пор прошёл год и я опять всё забыл, но если мне снова понадобится Blender — смогу также легко его вспомнить.
В добавок ко всему, поиск по вашим билетам в данном случае даёт большие преимущества. Если в случае книг вы ещё могли скачать электронную версию и искать по ней, то для большинства видеокурсов текстовый поиск не возможен, а проматывать туда-сюда в поисках нужного фрагмента — весьма утомительное занятие.
Алгоритм такой — берёте видеокурсы (именно они наиболее эффективны для изучения графических пакетов), создаёте в разделе [Билеты] новый раздел «Компьютерная графика». В ней — раздел по названию вашего пакета, например, Photoshop, Gimp, 3D max и т.д. Там — раздел по названию видеокурса — и в нём уже по разделам — разделы с билетами. Всё аналогично конспектированию книги.
Подготовка к тестированию
Когда я изучал Java, после прочтения книги я решил углубиться в тесты. На сайте Quizful просто огромная коллекция тестов по Java SE и в них заключено очень много знаний и опыта. Многие примеры можно назвать чрезмерно замысловатыми, но тем не менее в них порой заключён практический опыт, о котором не пишут в книгах и который реально может пригодиться. В чужом коде и не такое можно встретить. К тому же, Java хорошо стандартизована и 95% этих самых языковых «подколов» строго определяются спецификацией языка. Если они там определены, значит кому-то они нужны, не так ли?
Допустим, вы решили тест на некотором сайте и производите работу над ошибками. Вы встречаетесь с какими-то новыми фичами языка или его библиотек, о которых не знали прежде. Открываете IDE, экспериментируете. Теперь вам нужно куда-то записать эту фичу, чтобы не забыть. Она может пригодится вам на реальном тесте, или же на собеседовании — там часто любят спрашивать всякие хитрости. И наконец, встречаются в тестах практически полезные моменты.
Но куда вам записать полученные знания, так чтобы потом их было легко вспомнить? На помощь приходит IronBrain. Да, вы будете создавать билеты на основе билетов. Вам может показаться это странным на первый взгляд, но это вполне нормально. В ваш билет вы вкладываете своё видение и понимание проблемы. Повторюсь — нельзя просто копировать вопрос и ответ из теста. Нужно самому исследовать его, проверить, продумать, переделать и сделать свой билет. Каждый пользователь IronBrain пускай создаёт свою коллекцию билетов. Это как записная книжка — вы не сможете пользоваться чужой.
Алгоритм существенно отличается. Тест -это не книга и не видеокурс. Он не имеет структуры. Там всё случайным образом перемешано и нет смысла пытаться свести это к иерархии. Просто создавайте независимый билет, нажав в меню "+Билет". Но не забудьте привязать его хотя бы к одной области.
В теории, этот подход можно использовать для подготовки практически к любому тесту по любой теме. Или для извлечения из тестов полезной практической информации, если таковая там имеется.
Хранение фрагментов исходного кода
Когда-то давно я опубликовал на хабре статью про CodePaster. Я сам долго пользовался этой программой, но со временем забил на неё, когда сделал нормальный поиск в IB. Да, фрагменты кода можно тоже хранить в виде билетов. И накидать к фрагменту список вопросов какой-нибудь, по общей логике работы или конкретным методам. И это кстати реально помогает, когда используешь поиск — список вопросов объясняет, что делает этот код. Т.е. фрагменты кода можно просто добавлять как билеты, потом НЕ прогонять их в виде теста, только находить через поиск.
Супер подготовка к собеседованию [Предположение]
Допустим, вы — программист мобильных приложений. Вы изучили Java SE по некоторой книге и составили много билетов по нему. Вы изучали андроид по видеокурсу и также составляли билеты. Затем вы поднимали свой VPS сервер и получили очень много полезных практических знаний по Linux — решив через поисковую систему и сторонние сайты большую часть проблем администрирования. И все эти знания вы также свернули в билеты. Затем вы делали проект «для себя» под андроид, и в процессе разработки наткнулись на множество вещей, о которых не написано в книгах и курсах — как по Java, так и по андроиду. Все эти практические навыки вы также перегнали в билеты. Каждый билет, который вы создавали, так или иначе входил в какую-либо область, прямо или косвенно. Потом вы пошли на курсы по Linux и вам там рассказали множество интересных вещей, которые вы также потом дома проверили и перегнали в билеты. Затем вы прочитали несколько интересных статей на хабре про Git и кое-что отметили для себя — пару новых билетов.
Итог — у вас есть следующие IB-области — Java SE, Android, Linux, Git — и в каждой этой области находятся билеты. Области иногда могут пересекаться — когда билет затрагивает уникальные знания из обеих областей. Вы смотрите вакансии и находите среди них те, которые примерно соответствуют вашим знаниям, например, вакансия в некоторую компанию MobileMegaSoft.
Вы создаёте IB-направление, которое включает все эти области и называете его «MobileMegaSoft direction». Отныне оно включает ВСЕ билеты, которые вы до этого составляли и включали в эти области. И самое главное — вычисляет процент билетов, которые вы помните на данный момент, а также позволяет производить нарезку тех билетов, которые вы, скорее всего, забыли. Вы можете, допустим, за пару недель, каждый день по пару часиков, нарезать и прогонять ваши билеты, вспоминая ваш опыт, а также прочитанное в книгах и услышанное на курсах. Все эти знания будут объединены в вашей голове воедино, и кроме того во время повторения у вас появится иной взгляд на многие вещи и новые идеи, понимание того, что раньше казалось мутным. Вполне возможно, вы даже сделаете новые выводы и получите новые знания за счёт повторения старых. Не даром говорят, что повторение — мать учения. IronBrain позволяет вам «поднять в воздух» все ваши знания, которые вы накапливали годами по тем или иным темам.
Таким образом, вы получаете практически идеальную подготовку к собеседованию. По крайней мере, она должна быть такой в теории. Я пока что студент и не устраивался в крупные компании, а на мелкие подработки итак брали. Поэтому я не могу сказать, что вот меня взяли в такую-то крутую компанию потому что я готовился через IB. Может быть, через пару лет, когда я закончу университет, я попробую это сделать.
Любая работа, которая требует обширных знаний [Предположение]
Представьте, что ваши знания — это самолёты на аэродроме. Если вы ими не пользуетесь долгое время, они простаивают без дела и со временем приходят в негодность. Вдруг вам нужно поддерживать весь ваш флот в воздухе? При традиционном подходе это требует очень больших трудозатрат и усилий…
Все теоретические и практические знания можно разложить в виде билетов. Не важно, какой источник у этих знаний — вас кто-то научил, вы научились по книжке, дошли до этого сами или же вычитали это на каком-то форуме. Приведу простой пример. IT-специалисту требуется всегда знать очень много. И тут IB может существенно вам помочь. Если вы работаете программистом, как правило вы имеете дело с большим стеком технологий. И для каждой технологии вы можете создать IB-область, и создать IB-направление, которое собирает все области, необходимые для вашей работы. Таким образом вы очертите множество билетов, которое содержит необходимые вам знания для вашей работы. Да, эти знания могут быть избыточны, вы можете использовать только 10% из всех повторяемых знаний. Но эта избыточность неизбежна и естественна. Чтобы сделать правильный выбор среди трёх библиотек, программист должен знать хотя бы на уровне основ все три библиотеки. А ошибка выбора, как известно, может дорого обойтись.
IronBrain позволяет поддерживать определённый набор знаний постоянно «в воздухе». Функция нарезки позволяет из определённого множества билетов выбрать случайные, но выбрать из тех, которые вы не помните. И когда вы отвечаете каждый билет — вы сами выбираете, когда его вспоминать, через день, месяц, через год и т.д. Надо признать, я сам создал направление «IB Developer» и включил в него области Java SE, Tomcat, HTML, JS, CSS и Linux. Когда я узнаю что-то новое — я добавляю билеты в соответствующие области. Однако я пока что не смог круто применить эту технологию нарезки, и не берусь утверждать, поможет она вам или нет. Если вы сможете — обязательно напишите об этом. В IronBrain есть бета-функции, и это одна из них.
Я слышал, что работа юриста предполагает знание теории в очень большом объёме — и от этого объёма напрямую зависит успех работы. Хочу сделать предположение, что IronBrain можно очень эффективно использовать для изучения юридических наук и при работе в этой области. Но это, опять же, предположение, и я могу ошибаться. На данный момент у меня нет знакомых, которые использовали IB эффективно в этом направлении. Аналогичное предположение сделаю для наук медицинских…
Техническая реализация
Я очень долго думал над выбором Java VS PHP для серверной части IB. Этот фундаментальный холивар, который, как и Офис VS Фриланс, не решился внутри меня и, возможно, не решится никогда. Ну, разве что, если я закончу обучение в университете и попробую себя полноценно в обеих направлениях. Я попытался выбрать сторону Java и собираюсь строить на ней свою будущую карьеру, однако я не знаю, правильное ли решение я сделал. PHP открывает, как мне кажется, фантастические возможности для фриланса, которых нет у Java. Может быть, стоило выбрать PHP. Но я на приличном уровне знал Java и выбрал именно эту платформу для серверной части.
IB основан на Java/Spring/Hibernate. Это классический стек, который используется довольно часто. Я примерно за 2 недели изучил самые азы Spring и Hibernate. Это очень сложные промышленные технологии, и у меня не было времени и возможности, чтобы нормально их попрактиковать где-либо, поэтому, скорее всего, там полно косяков, архитектурных и не только. Чтобы изучить их, требуются годы, как теории, так и практической работы в компаниях. Так что не судите строго.
Когда-то у меня была традиция открывать исходный код сайтов от друзей веб-программистов и говорить, как там всё криво и косо. Сейчас, когда я по-сути выпустил свой первый сайт, я понимаю, что мой фронтенд построен, возможно, даже хуже, чем это было у друзей веб-программистов. HTML/CSS/JS требуют отдельного изучения и кропотливой работы, а я специализируюсь, скорее, на серверной части, чем на клиентской. Может быть, стоило использовать библиотеки типа GWT, или хотя бы AngularJS подключить. Но я делал тонкий клиент на традиционном HTML/CSS/JS + JQuery. В архитектурном плане код просто ужасен, но я не знал, как сделать по-другому, когда начинал разработку.
Я бы мог выпустить JIronBrain как десктопное приложение с интерфейсом на Java/Swing. Там было бы существенно труднее докопаться до кода, но программа бы не получила огромных преимуществ веб-приложения. Поэтому я заложил её основы именно в вебе.
Как бы там ни было, текущая реализация WIronBrain, имея не самую лучшую архитектуру на клиенте, работает ЛУЧШЕ и КРУЧЕ, чем все предыдущие реализации. HTML5 дал мне просто фантастические возможности — начиная от свойства contenteditable и заканчивая поддержкой веб-сокетов. Ещё раз повторюсь — текущая версия IronBrain, хоть и бета, но она отлично работает, если её правильно использовать и её уже можно применять для обучения.
В качестве СУБД использована MySQL, и все данные хранятся в ней. Весьма интересный факт — в исходном коде нет ни одной строчки, написанной на SQL. Вся работа с БД идёт через прослойку ORM Hibernate и это, надо признать, очень удобно. Таким образом, проект не привязан к конкретной СУБД и в теории его можно использовать с любой реляционной СУБД. А сам сервер поднят на бюджетном VPS под управлением ОС Debian.
Заключение
Прошу прощения, если статья получилось большой, я просто хотел выложить на максимум всё, что связано с IB. Давно хотел, кстати, написать эту статью…
Исходники системы полностью открыты и доступны на GitHub.
Если вам получиться применить IronBrain в какой-либо из областей вашей жизни, обязательно напишите мне вашу историю во всех подробностях на kciray8@gmail.com. Можете сделать это анонимно или же указать, чтобы я не выкладывал её в публичный доступ. Но, в любом случае, буду рад любым отзывам.
Кроме того, мне было бы очень интересно услышать про вашу личную систему обучения, как вы обучаетесь, по каким методикам и так далее. Пишите…
С наилучшими пожеланиями, Ярослав aka KciRay.
UPDATE:
Идею в целом очень хорошо восприняли, особенно много положительных отзывов было на email. Всем спасибо, буду постепенно развивать идею и систему дальше.
Публикация на хабре за 3 дня принесла системе около 4000 уникальных посещений и около 200 регистраций.
Интересный факт — сервер ironbrain.org ни разу не упал и сайт не тормозил вообще, успешно выдержав хабраэффект.