19-20 мая в Астане проходил Astana Hackathon, организованный "Astana Innovations" хакатон с призовым фондом в 1,000,000 тенге. Хакатон - отличная возможность перестать обсуждать свои бесконечные идеи с друзьями за кружкой пива по пятницам (только для того, чтобы на следующий день забыть обо всем и погрязнуть в рабочей рутине) и, наконец, все-таки взяться за реализацию. Мировая практика показала: за 24 часа можно создать ядро по-настоящему больших проектов. GroupMe, мобильное приложение для группового обмена смс-сообщениями, было создано за полторы сутки в мае 2010 года во время хакатона на TechCrunch Disrupt New York. Чуть более года спустя GroupMe был куплен Skype за сумму порядка 80 миллионов долларов. Начальные версии FB Chat и FB Video были написаны за ночь во время хакатона в офисе Facebook в Пало Альто. И таких примеров десятки. В течение двух месяцев прошлой осени мне в качестве разработчика довелось поучаствовать в четырех hackathon'ах: PennApps (место проведения: University of Pennsilvania), Facebook Hackathon, Princeton Startup Weekend, hackNY (New York University). В этом посте хотелось бы поделиться некоторыми идеями на тему того, как успешно выступить на хакатоне.
1. Четко знайте свой проект до того, как прозвучит стартовый свисток. Хотя до начала хакатона ничего кодить нельзя, это не значит, что нужно приходить на мероприятие абсолютно без подготовки. Очень помогает приходить на событие с хорошо продуманной идеей, обсужденными "за и против", набросками и flow-chart'ами по интерфейсу.
2. Дизайн: в простоте - гениальность. В конечном итоге, именно дизайн продукта создает первое впечатление. И под этим я подразумеваю не только, как он выглядит, но и как он работает. Во всяком случае вы не хотите, чтобы ваш сайт словами Дмитрия Кирсанова выглядел, как "попугай в нечищенной клетке". Конечно, невозможно создать дизайн уровня Path, Flipboard или Pinterest, за сутки, однако, если знать пару "трюков", дела обстоят не настолько плохо. Один из таких "трюков" - Twitter Bootstrap, библиотека готовых HTML, CSS и Javascript компонентов для начинающих дизайнеров. Безусловно, важно кастомизировать эти шаблоны, иначе ваш сайт или приложение будут уж очень сильно напоминать тысячи других.
3. Minimum Viable Product. Важно помнить о том, что такое MVP (детали - в книгах/блогах Эрика Риса и Стива Бланка). Проект не должен быть неповоротливым и бесполезным гигантом (благо, учитывая лимит по времени, это и не очень возможно): он должен ясно передавать основное видение. Проект должен быть минималистичен, но полностью функционален. Все компоненты, которые вы не успели закончить, лучше полностью исключить. Как говорил Стив Джобс: "Фокус - это искусство говорить 'нет'".
4. Фреймворки на помощь. Ваша продуктивность не будет такой, как прежде, если твердо знать один веб-фреймворк. Последнее, что вы хотите делать во время соревнования - так это писать доморощенное управление базами данных или пользовательскими сессиями (подразумевается, что вы не пишете на PHP :-)). Если уже есть опыт использования Ruby on Rails или Django, то - вперед и с песней! Эти фреймворки - проверенный временем золотой стандарт. Если нет, то рекомендую научиться использовать "легковесные" микрофреймворки, такие как web.py, Flask или CherryPy, если вы знаете Python; и Sinatra, если вы пишите на Ruby.
5. Хостинг? Ваш проект будет более наглядным, если по истечении 24 часов он будет доступен онлайн. Опять же, настраивать сервер во время хакатона - потеря ценного времени, а перекидывание PHP файлов через FTP - мягко говоря, не очень эффективно. На помощь приходят такие облачные платформы (PaaS - platform as a service), как Google App Engine или Heroku. Очень рекомендую последний. Наряду с Ruby, Heroku также поддерживает разработку на Python, Scala, Node.js, Clojure и Java.
6. "Преждевременная оптимизация - корень всех зол" (Дональд Кнут). Нужно оставить на полке такие мысли и бесполезные сомнения, как "Будет ли мой код эффективен, когда сервис будет использовать миллион человек?" Ваша цель быстро сделать работающий прототип и попытаться избежать ловушки перфекционизма. Есть огромное количество более полезных вариантов улучшения проекта, чем пытаться оптимизировать уже работающий алгоритм. Это не IOI, не ACM ICPC и не TopCoder =) Здесь работает лозунг Facebook: "Done is better than perfect".
7. Команда или прицип синергии: 1 + 1 = 10. Несмотря на то, что хакатоны - отличное место для того, чтобы встретить интересных людей, лучше приходить на них с уже готовой командой. Командой, где каждый хорошо знает свои сильные стороны и эффективно дополняет друг друга. Эмпирически, мне кажется команды в 2-3 человека работают лучше всего. Превысьте эту норму и получите типичный эффект, описанный Фредериком Бруксом в небезызвестной книге "Мифический человеко-месяц". Вкратце, этот эффект можно сформулировать так: "Если проект не укладывается в сроки, то добавление рабочей силы задержит его еще больше".
8. API: стойте на плечах гигантов. Набор различного рода функций и процедур, предоставляемый всевозможными сервисами, позволит быстро получить доступ к интересным данным, готовым для дальнейшего анализа. Twitter предоставляет доступ ко всей публичной информации, с которой ассоциируется сервис: твиты, фолловеры, пользовательские профайлы, листы, местоположения, тренды и т.д. Если, к примеру, вы хотите сделать каталог мобильных фотографий по тематическим категориям или по разным городам нашей страны, к вашим услугам - Instagram API. Вот классный пример того, что можно построить, используя Instagram. Если есть желание создать онлайн-гид по городу, систему рекомендаций ресторанов или приложение, которое отвечает на сакраментальный вопрос: "Куда пойти сегодня вечером?", отличным выбором мне видится Foursquare API. А вот и галерея примеров лучших приложений, построенных на 4sq. Набор алгоритмов машинного обучения от Google Prediction API в свою очередь может помочь в создании рекомендательных систем, классификации email'ов и документов, анализа текста и тому подобное. Есть много других интересных API, но это заслуживает отдельного поста.
9. Не тратьте время впустую. Часто был свидетелем того, как команды часами спорили о том, какое название придумать своему проекту. На хакатоне это совершенно не имеет значения, поэтому не стоит уделять этому "упражнению" более 10 минут. На худой конец напишите простой скрипт на Питоне, который генерирует разные благозвучные последовательности согласная-гласная-согласная-гласная-согласная разной длины и проверяет доступен ли данный домен (примечание: на это может уйти больше 10 минут). В конечном счете, название наверняка придет к вам во второй половине хакатона, когда ваш проект начнет принимать более или менее полноценный вид. Время конечно. Создайте девелопер-аккаунты на API, которые планируйте использовать, и напишите для тренировки пару примеров API вызовов до начала хакатона. Подготовьте и настройте весь набор инструментов, которые вы обычно используете, будь то Xcode, MySQL, Photoshop или Git. Не гнушайтесь использовать open source code на Github, заимствуйте понравившиеся элементы дизайна (css, javascript) с помощью Chrome Web Inspector или Firebug. Все дьяволы (и к слову, ангелы) - в деталях.
10. Хакатон не время изучать новые технологии. Если ваша цель выиграть, оставьте без внимания желание выучить новый язык программирования или новый фреймворк. Сосредоточитесь на том, что знаете, и выжмите из этого максимум.
11. Презентация: действия важнее слов. Жюри и аудитория не увидят, сколько труда было вложено в ваш код. Они будут оценивать конечный продукт и то, как вы его презентуете. Слайды - признак того, что вам нечего показать. Даже, если вы используете Prezi :) Поэтому уделите все отведенное время на непосредственное демо проекта. Приведите пример того, как реальные пользователи найдут продукт полезным. "Болеутоляющее продается лучше, чем аспирин". Покажите проблему и как вы ее решаете. Не стоит заставлять аудиторию скучать описанием использованных технологий или того, чего не хватает в вашем продукте. Фокусируйтесь на том, что есть. Презентация должна быть динамичной, интерактивной (в этом аспекте преимущество, к примеру, имеют приложения, которые могут в реальном времени анализировать твиты или смс-сообщения зрителей, сидящих в зале), полна страсти и воодушевления со стороны участников команды.
12. Знайте критерии оценки и свою аудиторию. Такими критериями на астанинском хакатоне, к примеру, были локальность проекта, его полезность, степень готовности и техническая сложность, уникальность и новизна идеи, удобство использования и дизайн. В перерывах общайтесь с менторами и другими коллегами-участниками, внимательно слушая их отзывы и замечания. Пригласите на демо своих друзей/родственников: поддержка и шум трибун во время презентации только помогают!
13. Не забывайте о простых лайф-хакинг принципах эффективной работы. Прийти выспавшимся. Не игнорировать питательный завтрак/обед/ужин. По возможности брать пятиминутный перерыв каждый час, чтобы прогуляться, "перезарядить" батарейки и, в конечном счете, взглянуть на проблему свежими глазами. Иначе сэкономленные полчаса выльются в часы долгой, медленной и непродуктивной разработки.
14. Путь важнее цели, но цель важнее пути. Ну и следуя законам жанра, ни одна из выше описанных идей не будет действенной "серебряной пулей", если в итоге не построить классный проект и не получить удовольствие от процесса.
Удачи и побед!
Мой Твиттер: @suleimenov
P/S: Источник "невтемной" фотографии - мой инстаграм. На ней запечатлен момент из хакатона в ноябре 2011 года в компании Ooyala (Mountain View, CA). Если есть фотографии победителей Astana Hackathon 2012, отправляйте, буду рад заменить =)