воскресенье, января 27, 2008

Система контроля версий, багтрак и wiki

Этот пост я начинала писать еще давно, начала с системы контроля версий и в итоге сделала про них отдельный пост - уж больно много получилось. Сейчас я хочу закончить начатое.

Система контроля версий + багтракинговая система + wiki с документацией - это минимальный набор инструментов, необходимый для эффективной работы над проектом. Эта информация обычно не является ни для кого откровением. Все и так об этом знают. Это те самые "все", которых очень мало и которых можно встретить только по большим праздникам. Потому что если у вас в компании все и так активно пользуются этими инструментами, то у вас вызовут недоумение люди, которые ими пренебрегают. На самом деле проектов, в которых нет вообще даже системы контроля версий - полно. Большие проекты при этом разрабатываются. Отговорок почему не используется что-либо из вышеперечисленного полно.

Целей у этого поста две. Рассказать новичкам зачем все это нужно и переубедить сомневающихся. Ибо отказ от этих полезных инструментов ведет к потере времени и денег.

Системы контроля версий
Про системы контроля версий, как я уже сказала, у меня есть отдельный пост, поэтому кратко. Сейчас в моду входят распределенные системы контроля версий, я чаще всего слышу названия Bazaar, Mercurial, git. На самом деле неважно какую систему контроля версий использовать, главное, чтобы она нравилась разработчикам. Основное правило работы - частые небольшие атомарные коммиты, по одному коммиту на одно логически законченное изменение кода. Не получается так - неприятно, но не критично. Главное, чтобы система контроля версий была в принципе. Отсутствие системы контрля версий приводит к зоопарку бэкапов.

Варианты, которые мне встречались в реальных проектах
MyProject.backup
MyProject.backup.old
MyProject.backup.older
MyProject.backup.oldest

Или
_MyProject.backup
__MyProject.backup

Для Windows разработчиков характерна такая картина
Copy of MyProject
Copy (2) of MyProject

Ну и вот еще вариация на тему
MyProject.oo1
MyProject.oo2
MyProject.oo3

Вспомнить в каком бэкапе какие изменения были сделаны уже никто не может.

Багтракинговая система
Наиболее известные
BugZilla - пожалуй самая популярная. Не очень юзабельный интерфейс, а так ничего
JIRA - тяжелая бюрократическая система
TaCo - не очень известная, но я ей пользовалась, потому решила про нее вспомнить

Вместо багтракинговой системы периодически используются
- Excel или .doc файл (sic!)
- текстовый файлик (sic!)
- мятые бумажки со следами от кружек (sic!)
- и "я запомню" (все рыдают)

Я работала со всеми этими вариантами. Любая багтракинговая система лучше любого из этих вариантов.

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

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

Частой заменой документации в wiki служат
- отсутствие документации как таковой.
Самый распространенный вариант. Причем есть такое мнение, что по коду все можно восстановить. Нифига. Код отвечает на вопрос "как это работает", но не отвечает на вопрос "почему". Я вижу странное и неочевидное решение в коде. Почему было принятно именно оно? Ошиблись? Спешили? Для этого были неизвестные мне причины? Иногда спасают комментарии. Иногда комментариев нет.
Иногда есть некий программист, который владеет Тайной Кода. Самое веселье начинается, когда он увольняется, уходит в отпуск или заболевает.

- .doc файлы, вообще любые текстовые файлы.
Программистов, в принципе, можно заставить вести там документацию. Но именно заставить, потому что это жутко неудобно. wiki удобна для редактирования несколькими людьми - доки нет. Правка в вики выглядит так: залез - поправил. Поскольку вики старается доку структурировать по мере написания, главы вставлять и т.п., то поиск нужного куска текста не занимает много времени. С доками правка выглядит так - скачать док, открыть, отмотать на нужно место, поправить, залить обратно. В доках нет контроля версий, которые есть в wiki. Только если док в систему контроля версий не залит, но это уже непонятная имитация wiki начинается.
Итог всего этого - доки плодятся, потому что их все ленятся скачивать каждый раз. И все бегают в поисках актуальной версии. Пока не поймут, что актуальной версии на самом деле ни у кого нет.

Мораль: source control + bugtrack + wiki ускоряют работу и искореняют бардак.

Updated 17.02.2008
Ссылки по теме:
Управление знаниями. C чего начать
Trac 0.11 beta

воскресенье, января 20, 2008

Зачем нужно выражение delete[]

Смысл существования delete[] мне всегда был не до конца ясен. Нет, понятно, что он нужен для освобождения массивов памяти, выделенных посредством new[], но почему бы все удаление не интегрировать в простой delete?

А так программисту приходится всегда помнить, что именно вызывать для освобождения памяти: delete или delete[]. Зачем - не очень понятно. Информация о том, сколько именно элементов в массиве все равно где-то да хранится. Почему бы компилятору вообще не освободить программиста от каких-либо запоминаний?

Все, что мне удалось раскопать по этому поводу - старое обсуждение в comp.lang.c++
Why does delete[] exist?

Там же приводится цитата из Страуструпа, где говорится, что вообще в delete[] нет никакой логической необходимости, а нужен он для того, чтобы сэкономить место и время.

Но экономия получается уж очень несущественная. Ну разве что для мобильных устройств она может оказаться значимой. И многие с большим удовольствием отказались бы от этой экономии, ради того чтобы не ловить таинственные глюки и утечки памяти долгими часами из-за каких-то пропущенных скобочек. Простого delete'а вполне достаточно. Более того, по словам участников вышеупомянутой дискуссии, именно так работали ранние Борландовские компиляторы.

Ссылки по теме:
Что делает выражение вида delete p

воскресенье, января 13, 2008

Хорошие книги по программированию игр

Порадовать вас тут мне нечем, прямо скажем. Книги по программированию игр переводятся на русский редко. А на английском они стоят немеряно, ну и читать на английском не каждый будет. Однако чем богаты тем и рады.

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

Переходим к основной части нашего развеселого повествования.

Программирование игр как дисциплина - очень размытое понятие. Туда входят программирование графики, программирование физики, искусственный интеллект, программирование сетевого взаимодействия (это для многопользовательских игр) и программирование звука и наверняка я еще что-то забыла. Короче, если в названии нет ключевых слов "программирование игр" это не значит, что к программированию игр книга не имеет никакого отношения.

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

Для начала те книги, которые есть в русском переводе.

Книги Андре Ламота (Andre LaMothe).
Удивительно плодовитый товарищ. Написал кучу книжек по программированию игр. Книги, на мой взгляд, средненькие.

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

В русском переводе есть две его книги.

Программирование трехмерных игр для Windows. Советы профессионала по трехмерной графике и растеризации

Название оригинала: Tricks of the 3D Game Programming Gurus: Advanced 3D Graphics and Rasterization

Не пугайтесь слова Advanced в названии. Она ни разу не advanced. Полное введение в программирование трехмерных игр с использованием DirectX. Обьем книги серьезный - почти полторы тысячи страниц.

"Программирование трехмерных игр для Windows. Советы профессионала по трехмерной графике и растеризации" есть на Ozon.ru

"Tricks of the 3D Game Programming Gurus: Advanced 3D Graphics and Rasterization" есть на Ozon.ru

"Tricks of the 3D Game Programming Gurus: Advanced 3D Graphics and Rasterization" есть на Amazon.com

Программирование игр для Windows. Советы профессионала

Название оригинала:
Tricks of the Windows Game Programming Gurus

Отзывы об этой книги хорошие, но она в основном посвящена 2D программированию с помощью DirectX, то есть DirectDraw. Это работа со спрайтами. Со спрайтами со времен восьмого DirectX особенно никто не работает. Все делается в 3D и двумерный паззл - это скорее всего трехмерная сцена, отрендеренная в ортогональной проекции. Короче, смысла покупать эту книгу я не вижу.

"Программирование игр для Windows. Советы профессионала" есть на Ozon.ru

"Tricks of the Windows Game Programming Gurus" есть на Amazon.com

DirectX: продвинутая анимация

Название оригинала: Advanced Animation With DirectX

Никакая она не продвинутая. Хорошее введение в анимацию. Включая скелетную и лицевую анимации. Интересное несовпадение. На Озоне ее рейтинг очень высокий, а на Амазоне - низкий. На Амазоне ее ругают за глюкавый код в примерах.

"DirectX: продвинутая анимация" есть на Ozon.ru

"Advanced Animation with DirectX"
есть на Ozon.ru. На момент написания поста продавалась там со скидкой 50%.

"Advanced Animation with DirectX" есть на Amazon.com

Искусственный интеллект. Современный подход

Название оригинала: Artificial Intelligence: A Modern Approach

Классическая обзорная книга по искусственному интеллекту. Качество - отличное, авторы - признанные специалисты в области искусственного интеллекта. Один из авторов - сам Питер Норвиг. Ее обязательно надо прочесть, если вы собираетесь программировать искусственный интеллект в играх. Популярностью особенной у людей не пользуется - я видела кучку слипшихся томов где-то на нижней полке в Библио-Глобусе.

"Искусственный интеллект. Современный подход" есть на Ozon.ru

"Artificial Intelligence: A Modern Approach" есть на Ozon.ru

"Artificial Intelligence: A Modern Approach" есть на Amazon.com

Создание 3D-ландшафтов в реальном времени с использованием C++ и DirectX 9

Название оригинала: Real-Time 3D Terrain Engines Using C++ and DirectX 9

Я смотрела ее наискосок, читала отзывы по ней. Это полное введение в программирование ландшафтов, включая воду и освещенность. Но на Амазоне ее ругают за неудачные примеры кода.

"Создание 3D-ландшафтов в реальном времени с использованием C++ и DirectX 9" есть на Ozon.ru

"Real-Time 3D Terrain Engines Using C++ and DirectX 9" есть на Ozon.ru. На момент написания поста продавалась там со скидкой 50%.

"Real-Time 3D Terrain Engines Using C++ and DirectX 9" есть на Amazon.com



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

Real-Time Rendering

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

"Real-Time Rendering"
есть на Ozon.ru
"Real-Time Rendering" есть на Amazon.com







Game Programming Gems

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

На Ozon.ru ссылки приводить не будут. Там часть из этой серии есть, но цены запредельные. Дешевле заказать из Амазона. Так что ссылки на Amazon.

Game Programming Gems
Game Programming Gems 2
Game Programming Gems 3
Game Programming Gems 4
Game Programming Gems 5
Game Programming Gems 6
Game Programming Gems 7 - пока не вышла, но можно предзаказать

GPU Gems

Серия книг по программированию GPU, в том числе GPGPU. Подборка инициирована NVidia, так что все заточено под GeForce. Ну опять же не для начинающих.

GPU Gems: Programming Techniques, Tips and Tricks for Real-Time Graphics.
Updated 06.04.2008: Эту книгу NVidia официально выложила в онлайн: GPU Gems.

GPU Gems 2: Programming Techniques for High-Performance Graphics and General-Purpose Computation


GPU Gems 3

Networking and Online Games: Understanding and Engineering Multiplayer Internet Games

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

"Networking and Online Games: Understanding and Engineering Multiplayer Internet Games" есть на Amazon.com




Physics for Game Developers

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

"Physics for Game Developers" есть на Amazon.com









Mathematics for 3D Game Programming and Computer Graphics
Книга для тех, кто прогуливал математику в вузе :-). Для тех, кто не прогуливал, тоже может оказаться полезной, потому что все необходимое аккуратно собрано и разложено по темам. Но все в ней изложенное - классическая математика, которую без труда можно найти Гуглом по ключевым словам.

"Mathematics for 3D Game Programming and Computer Graphics" есть на Ozon.ru

"Mathematics for 3D Game Programming and Computer Graphics" есть на Amazon.com



На Амазоне еще очень много книг по программированию игр. Можно побродить по ссылкам, начав с любой из приведенных мною книг. Почитать отзывы, посмотреть рейтинг, он обычно соответствует действительности.

Информацию по DirectX, как это ни странно, можно найти DirectX SDK. Этот SDK - это не только справочник. Там есть реально хорошие статьи по общим принципам работы DirectX.

Если вы что-то можете сказать по поводу книги, которая здесь не указана - оставьте свое мнение в комментариях, оно может кому-то сэкономить кучу времени. И если есть что добавить по поводу перечисленных мною книг - добавляйте, не стесняйтесь.

Ссылки по теме:
Книги с рейтингом есть на gamedev.net.
Еще список книг по программированию игр
Хорошие книги по C++
Хорошие книги по организации кода

среда, января 09, 2008

Возможно, самый важный const

Герб Саттер у себя в блоге рассказывает про интересный случай с использованием const.

Краткий пересказ для ленивых.


string f() { return "abc"; }

void g() {
const string& s = f();
cout << s << endl; // можно ли использовать временный объект?
}


Код несколько напрягает. Создается ссылка на временный объект. Но тем не менее, с кодом все в порядке. Почему так? Потому что в С++ явно специфицировано, что если привязать временный объект к ссылке на const в стеке, то жизнь временного объекта будет продлена. Теперь он будет жить столько, сколько живет константная ссылка на него. В приведенном примере все валидно, время жизни s заканчивается с закрывающей фигурной скобкой.

Это все относится только к объектам в стеке. На члены класса это не действует.

С++ это специфицирует, а как оно в реальности, работает? Герб проверил в нескольких компиляторах, нормально, практически во всех работает.

Легким движением руки убираем const...

string f() { return "abc"; }

void g() {
string& s = f(); // все еще нормально?
cout << s << endl;
}


И получаем невалидный код, наличие const'а тут важно. Правильный компилятор выдаст ошибку на этапе компиляции.

И есть еще момент с вызовом деструктора.

Derived factory(); // construct a Derived object

void g() {
const Base& b = factory(); // здесь вызов Derived::Derived
// … используем b …
} // здесь вызывается Derived::~Derived напрямую
//-- а не Base::~Base + virtual dispatch!


Ссылки по теме:
Использование const. Часть 1.
Использование const. Часть 2.

понедельник, января 07, 2008

MSN Search

Когда говорят о поисковых машинах и ранжировании сайтов всегда вспоминают гугловский PageRank как единственно правильный способ ранжирования. Но, как известно, что один человек придумал, другой завсегда поломать сможет. Линкопомойки и другие сомнительные изобретения человечества очень портят жизнь поисковым машинам, использующим PageRank в качестве базового алгоритма. Бороться с подобным поисковым спамом сложно. Спамеры изобретательны. По слухам, весьма высокая релевантность Гугловского поисковика объясняется тем, что там работает куча народу, которая вручную проверяет популярные запросы и вытирает определенные сайты из поисковой выдачи. Вот такие вот высокие технологии.
На самом деле это все уже проходили. Я помню еще лохматые времена, когда никакого PageRank'а не было. Поисковая выдача строилась исключительно по содержимому документа. Тогда поисковый спам был другой. Больше пытались играть с содержимым страничек. Нужные ключевые слова подпихивали в meta и писали белым по белому.
Я тут на досуге поразмыслила, а какой технологией можно PageRank заменить, кто будет следующим? Когда спамерские технологии разовьются до того момента, что PageRank потеряет смысл в принципе. Я, правда, не специалист в области поиска, ну и ладно.
Человек ведь может отличить спамерский сайт от хорошего правильного релевантного сайта, который он искал. Не все, правда, могут.
И вспомнились мне нейронные сети. Их много критикуют в последнее время, не оправдали они возложенных на них надежд. Правда, вот, в распознавании образов они очень хорошо себя ведут. Я знаю, я видела :-).
Итак, поиск на основе нейронных сетей. Ищем гуглом и находим... Что в MSN Search эта технология применяется уже довольно давно. Первые публикации, которые я нашла по этому поводу, относятся к 2005 году, есть публикации 2006 года.
Так что для тех, кто, как и я, все это время пребывал в танке, небольшой рассказ о том, что собственно делают (или делали?) в MSN Search.
Вся нижеследующая информация взята из двух статей: Beyond PageRank: Machine Learning for Static Ranking и FRank: A Ranking Method with Fidelity Loss.

В MSN Search используют fRank - нейронную сеть, основанную на их алгоритме RankNet. Эта нейронная сеть расставляет сайты в правильном порядке. Сами сайты находятся с помощью других алгоритмов, того же PageRank'а, например. Сеть учат понимать, что одна страница лучше другой, а не пробегают каждую страницу и проставляют ей рейтинг. Видно, что количество операций повышается с O(n) до O(n2), но это разработчиков как-то не особенно расстраивает.
Вот на этой картинке показано, как меняется порядок страниц в некой тестовой поисковой выдаче с течением времени, пока шло обучение нейронной сети.


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

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

PageRank стал популярен благодаря мощной рекламе Гугла. Ну, во-первых, никто не мешал им свои технологии рекламировать. А во-вторых - хороший алгоритм PageRank. Интересный, нестандартный на тот момент подход к решению проблемы.

При проставлении ссылок, повышается релевантность сайтов, интересных авторам, а не читателям. Вот это важный момент, о котором я никогда раньше не задумывалась. Авторы сайтов и читатели - это разные категории, их интересы не всегда совпадают. PageRank доверяет авторам выбирать за всех.

Один из недостатков PageRank'а, так называемый topic drift. Этому алгоритму важно только количество ссылок, содержимое сайтов неважно.

PageRank усиливает и без того популярные страницы. Чем выше ранг, тем проще страницу найти. Чем проще найти, тем чаще ссылаются. Чем чаще ссылаются, тем выше PageRank.

По ходу своей работы они активно сравнивают свой результат с PageRank'ом. Но, внимание, с каким PageRank'ом? Со своей собственной реализацией. Сами они говорят, что реализация у них отличная и хуже себя показывает исключительно по причине алгоритма. Кто их знает, может оно так и есть.

Ссылки по теме:
Learning to Rank using Gradient Descent, .pdf описание RankNet, присутствует некоторое количество математики.
Beyond PageRank, RankNet, and fRank
Web spam and TrustRank
Ссылочное ранжирование в Рунете
Глубокий веб