Thursday, January 25, 2007

Писатель или читатель?

Пирамида

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

1/x

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

Писатели

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

Читатели

Как правило, забраться на такую же высоту проще и быстрее (должен я сказать "дешевле"?), если там кто-то уже находится и способен кинуть вам верёвку, при помощи которой можно карабкаться дальше.

Этот изменчивый мир

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

Серебряные пули

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

Где верх?

Где вы находитесь сейчас и куда хотите двигаться? Вы идёте наверх или вы просто находитесь вверх ногами?

Что дальше?

Как только вы забрались на очередную высоту и обнаружили, что писателей выше больше не осталось - вы узнаете кто вы.

Monday, January 08, 2007

Кот в мешке

А был ли кот?

Не так просто поместить кота обратно в мешок, после того как он оттуда выпрыгнул. При детальном осмотре мешок стал больше похож на ящик пандоры. Я могу лишь догадываться, чем был "кот"...

Ящик пандоры

Мои Рождественские открытия продолжаются.

Нулевое исключение

Представьте себе функцию получения баланса клиента в конце которой стоит when others then return 0. Это был клиент с нулевым балансом или что-то из этого списка? Попробуйте узнать.

Покажите мне deterministic

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

У всех есть недостатки

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

Sunday, January 07, 2007

"Подарки" на Рождество

Лёгкая мишень

Если в вашем поле зрения есть парень по имени Legacy - стреляйте в него. Призрак прошлого не сможет вас достать. Или сможет?...

Что в имени тебе моём?

Legacy - широко распространённый термин в мире программного и аппаратного обеспечения. Это так же распространённый ответ на "почему ваш программный продукт похож на инженерный кактус"?

Инженерный кактус

"Проблема в том, что это Legacy-система". Возможно... Но у меня есть две мои проблемы с этим выражением.

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

Вторая проблема связана с первой - инженерный кактус всю свою жизнь был кактусом. Даже по Legacy-меркам.

Призрак прошлого

Логично ожидать, что постоянно ссылающаяся на Legacy, как причину проблем, софтверная компания пытается понять уроки прошлого. Очень странно, что при этом она продолжает делать кактусы... Или нет?

В ночь перед рождеством

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

Вы не должны знать это

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

Зачем им нужна эта фраза, возвращённая в виде конкатенации кодов символов, чтобы её было нельзя рассмотреть открытым текстом после работы wrap? Если вы надеетесь на утилиту wrap, как сохранность своих секретов... Этот тонкий лёд не сможет выдержать никого.

Ох... ситуация с шифрованием паролей настолько классическая, что такого я не ожидал. Это оказался ключ шифрования DES. У меня заняло примерно 5 минут, чтобы понять, как расшифровать любой пароль в этой системе. Если вся ваша защита построена на недоступности исходных кодов - то это уже security through obscurity. Похоже, что призрак прошлого в очередной раз замаячил где-то неподалёку...

Всё дело в параметрах

Это просто смешно. Вам нужно сделать выборку из all_tab_columns на основе переданных в процедуру параметров - чтобы получить описание колонок в таблице. Проблема в том, что кто-то умудрился обозвать параметры как owner и table_name - точно так же, как и колонки во view :) Что теперь? Ах - мы оформим select в виде динамического SQL и приклеим туда наши параметры owner и table_name. Хм - увидят ли разработчики тот день, когда в качестве параметра им передадут имя функции, которая (например) просто дропнет таблицу, для которой запрошено описание колонок? Кому-нибудь здесь хочется иметь процедуру, которая выполнит любой код с правами владельца схемы?... Между прочим - причём здесь bind-переменные? Они не умели их использовать и 5 лет назад...

Декларативная процедурность

Меня всегда забавляло, зачем люди изобретают процедуры вида DeleteFromTableById. В конечном итоге, чем DeleteFromTableById('my_tab', 'id', 10) проще, чем delete from my_tab where id=10? Зато, какие большие просторы для полёта фантазии любителей SQL Injection... В реальности эта процедура должна называться DoWhateverYouWant.

Какие колонки

Это я приберёг на последок. Контролировать количество и имена возвращаемых запросом колонок можно, если переписать всё на динамический SQL и сразу после select клеить функцию, которая этот список возвращает. Дайте мне отдохнуть - я забыл, когда в Oracle появились view...

Призрак в ваших дверях

Вы видите его. Он никуда не делся. И, что самое страшное, - он не похож на Legacy.

Можно ли убить призрака

Нет. Но его можно отправить в Legacy-мир. Для начала призрака прошлого стоит найти. И я посоветую им начать свой поиск с зеркала.