Блог

Написать простейшую игру

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

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

Блокировки чтения SQL запросом with nolock

Продолжаем тему SQL. Однажды с одним программистом зашел разговор о блокировках, и я вскользь сказал, что есть такие блокировки на чтение данных. Он не поверил, а я доказать наличие блокировок не смог. Почему я вспомнил? Да просто в последнее время что-то у нас на сайте участились блокировки. За последние два дня пришлось решать 5 подобных проблем и в одном случае снова пришлось объяснять человеку, который проверяет качество кода, когда можно использовать антиблок, а когда нельзя.

Итак, любители Oracle просто закрывают эту заметку и высоко задрав нос спокойно пинают Microsoft обеими ногами. Их такая проблема не волнует. Почему? Даже по умолчанию Oracle работает так, что никакие блокировки не блокируют данные от чтения. Это значит, что вы можете держать открытыми транзакции столько, сколько душе угодно. Допустим, что вы запустили большую транзакцию, в которой обновили данные в таблице:

begin transaction
update tablename
set column1 = column1 * 10

Оптимизация SQL запросов - курсоры

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

Очень часто курсоры используют в тех случаях, когда нужно выполнить две операции над одними и теми же данными. Например, нужно взять данные из одной таблицы, и обновить ими две другие. В этом случае почему-то создается курсор, который бежит по данным и обновляет построчно две таблицы. Это никогда не будет работать быстрее, чем два банальных UPDATE на две таблицы. Курсоры проиграют в скорости, да и наглядности программирования.

Количество мониторов для программиста

У нас на работе почему-то используют мониторы 19-го размера максимум, а большинство мониторов 17 дюймов. Не знаю почему так, но этого пространства капитально не хватает. На предыдущей работе использовались ноутбуки от Apple, но у каждого на столе стояли еще мониторы, размером с телевизор. Я как-то не смотрел, сколько там люймов, но 22 точно будет. Рабочего пространства становится немеренно, если объеденить экран ноутбука с экраном монитора.

После такой поляны, как-то неуютно себя чувствовал с одним монитором в 17-ть люймов. Задолбался переключаться между окнами и попросил второй монитор. Мне принесли моник чуть больше в 19 дюймов, но за счет того, что он старее, разрешение экрана такое же, как у семнашки. Да, теперь у меня два раза по 1280 точек, но все равно я задалбливаюсь переключаться между окнами. У меня постоянно запущено как минимум 12 окон, из которых я постоянно работаю с большинством из них, и хочется, чтобы эти окна были на виду, но тут даже и четырех мониторов не хватит.

Новая информация на Hackish Code

Вчера я залил свежак на английскую версию сайта Hackish code, а сегодня сразу три статьи на русской версии:

Статьи хоть и старые, но кому-то могут показаться интересными. В DirectX 11 все очень сильно изменилось, поэтому в современной версии инициализация идет по другому, но некоторые вещи еще актуальны.

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

P.S. Недавно приобрел Final Fantasy 13. Очень даже интересная игра. Хотя игрой я ее называю с натяжкой, потому что больше похоже на отличное интерактивное кино. Более подробно об игре читай: Обзор Final Fantasy 13.

Управлени исходным кодом будущего

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

Если ты работал с классическими программами контроля версий, то при переходе на git будут проблемы потому, что у него совершенно другой подход к хранению изменений. А точнее, он хранит именно изменения в файле, а не создает версии, как это делают классические системы. Чтобы к этому привыкнуть и понять, нужно время. Это как переход с Windows XP на Vista - это не эволюция, а революция. Нужно сделать усилие и заставить себя разок по бренчить код и мерджить его.

Столько лет мы жили вневедении, как слепые кроты, и думали, что нужно хранить именно версии. Но это серьезное заблуждение, которое делает разработку и управление исходным кодом только дороже. Попробую объяснить силу git на примере. Допустим, что у вас есть основная ветка кода, которую вы компилируете в исполняемый файл версии 1.0. На определенном этапе вы создали новую ветку для работы над новой версией программй 2.0. Теперь нужно пофиксить один баг, который есть в обеих ветках. Вы создаете новую подветку для 2.0 и называем ее "branch2-0/fix1". Фиксим код в этой ветке и в ней будут храниться только изменения fix1, а не весь код. Теперь вы можете смёрджить (даже не знаю, какое тут лучше слово придумать английскому merge, может слить или объединить) фикс с веткой исходников версии 2.0 и веткой исходников версии 1.0, и одним разом зафиксить обе ветки.

Глобальные переменные в C#

Сегодня задали интересный вопрос - как и где хранить глобальные переменные. Человек привык создавать в Delphi отдельный модуль, в котором хранил глобальные переменные и методы. Это большая проблема Delphi, что он умеет создавать глобальные переменные. По правилам OOP не должно быть такой возможности, и в C# такой возможности нет!

Но как же тогда поступить, если хочется создать что-то глобальное? Сначала нужно подумать 10 раз, а действительно ли нужна эта глобальность. Забудьте Delphi как страшный сон и вообще забудьте, что может быть такая возможность, как глобальная переменная или метод. Просто подумайте и ответьте себе на следующие вопросы:

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

.NET компонент созданяи отчетов

Сегодня обновил сайт Heapar Software. Причем обновлен не только дизайн небольшой косметикой, но и обновлен компонент для создания отчетов Heapar Small Report . Изменения небольшие, но удобные. Сам их использую в своих утилитах под маркой CyD, которые так же недавно серьезно обновил. Но об этих утилитах чуть позже, потому что версия еще не стабильна. Изменений много, и я наверно поторопился выкладывать ее.

Но вернемся к компоненту Small Report. В нем исправлен глюк с отображением, если для скроллинга использовать колесико. Добавлена возможность скролла с клавиатуры клавишами стрелок и Page Up Page Down, а так же возможность скролла на определенную строку. Это будет удобно для создания закладок в тексте. Опять же, на эту идею меня подтолкнул собственный проект. Я сам использую то, что создаю, иначе нафига создавать?

Система контроля на основе тикетов

Для того, чтобы контролировать работу программиста, какой-то очень гениальный человек придумал тикеты и их учет. Один из ярых приверженцев этого подхода - знаменитый Джоел. Но если почитать его книгу, то он явно использует это изобретение правильно и для того, чтобы повысить производительность труда и избавиться от лишних загрузов друг-друга, а четко определять кто и что делает. Все остальные компании, где я работал, использую тикеты (если вообще используют) для того, чтобы заниматься ерундой и пинать себя в грудь, что у них поставлен учет. Когда я работал в Интерстепе, то там начальник просто кепяточком писал от этих тикетов. Я один раз написал тикет, о том как я писал тикет, для того, чтобы написать тикет. Жопа полная творилась. Благодаря этой системе планирования, я придумывал кучу причин, чтобы не работать. Можно было написать в систему любое фуфло, все равно высшее начальство туда не смотрит, а мой начальник пару раз увидел, что я туда пишу, поржал, и забыл.

К чему я это? У несколько дней назад на работе не работала тестовая база данных. ping идет с моей машины прерывистый и постоянно пропадает. На все остальные компьютеры и сервера я коннекчусь без проблем, а с этим какая-то лажа. А это основная база, которую я использую в разработке и моя работа на прочь встала. Хорошо, что у меня была не срочная работа и я мог переключиться на аналитический сервак и с него работать над другими тикетами. Я подошел к администратору и объяснил ситуацию. Она меня послала к администратору базы данных. Объяснил этому администратору. Тут меня послали создавать тикет. Создал тикет на администратора базы данных. Через пять минут его перекинули на администратора сети, потому что проблема явно не с БД, ведь даже пинг не проходит. Там тикет уснул на долго.

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

Параметры по умолчанию в C#

Чего я с нетерпением жду от C# 4 - так это параметров по умолчанию. Скорей бы уже эта спецификация набрала популярности. Лично я в своих проектах буду использовать 4-ю версию, но не уверен, что на работе она войдет в обиход так же быстро.

Сегодня просто намучался из-за того, что нет параметров по умолчанию и пришлось создавать кучу перегруженных методов. С расширением проекта и большим количеством перегрузов, код становится неуправляемым. Странно, что Microsoft не подумала о такой маленькой и удобной фишки заранее, а вспомнила только при создании 4-й версии. С другой стороны, если все продумать заранее, то что же делать потом?

А есть что-то, что не хватает тебе? Не обязательно в C#, это может быть другой язык программирования.

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

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

Пишите мне