bash.im ithappens.me zadolba.li

Базы данных

8851

До вторых петухов

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

Wine — не панацея. Заставь-ка MS SQL работать под Вайном! Сомневаюсь, что из этого что-то путное выйдет. А 1С седьмой версии на другую RDBMS нормально не вешается, а гонять пятигиговую базу, в которой одновременно работают десятки операторов и ещё больше торговых агентов оставляют заявки, в режиме DBF я не буду. Чтобы перевести такую контору на другое решение, надо, во-первых, уже очень хорошо знать, что делать, и быть уверенным, что всё получится. Во-вторых, менталитет начальства — отдельная история. Попробуй выбей денег на такие метаморфозы — a там их надо сразу много. Это когда петух жареный клюнет, тебе заявят: «Что ж ты молчал, мы оплатим», а по факту — пока говоришь, что скоро настанут проблемы, и надо начинать двигаться, всем всё по барабану.

Если же мне кто хочет посоветовать переход на 1С 8.x, так тоже поймите, что сделать такой переход прозрачным, да и с учётом всех прикладных наработок в «семёрке», не так просто, и не всегда можно улучить момент. Это, конечно, произойдет. Тогда и под линукс с PostgreSQL можно перескочить, но это будет потом, когда клюнет ещё один жареный петух.

8779

Буря в песочнице

Я просто обалдеваю с некоторых программных решений.

Задача: обеспечить параллельную разработку новых возможностей у одного и того же программного продукта.

Решение: «песочницы». Одну папку исходного кода дублируют множество раз, по числу групп разработчиков, создавая так называемые версии. Каждая группа разработчиков мучает свою версию, ковыряясь в ней, как детишки в песочнице, и не пачкает чужие версии, то есть не мешает остальным группам. Перед релизом все версии, которые успели достичь половой зрелости и продемонстрировали хотя бы 15 минут стабильной работы, сливают в одну, её называют основной, выжигают на компакт-дисках и продают клиентам. После чего отдел тестирования начинает бегать кругами и орать, потому что две разные группы ковырялись в одних и тех же файлах, а слияние выполнялось левой ногой через правое ухо, и теперь не работают ни код первой группы, ни код второй, а грузовики с дисками уже выехали в магазины.

Итак, одновременно существуют несколько десятков версий. Разработчики занимаются своими малопонятными делами и время от времени вносят забагованный исправленный код в одну из «песочниц». Еженощно на всех «песочницах» бежит регрессия, а следующим утром ещё не проснувшиеся разработчики получают сто пятьдесят шаблонных сообщений электронной почты уровня «особой важности» с результатами тестирования для каждой версии и со стандартным заголовком: «А-а-а-а, мы все умрём, регрессия упала по ТВОЕЙ вине, а ну быстро исправляй свои баги». До сих пор всё хорошо.

Раз в какое-то время эти «песочницы» нужно изменять. Добавить, убрать, переименовать. Для этого используется доморощенная программа, написанная для своего удобства студентом-первокурсником в свободное от занятий фигнёй время и доведённая до ума тремя поколениями мудрых специалистов. Опций там на самом деле всего две («добавить „песочницу”» и «удалить „песочницу”»), поэтому переименование реализовано просто и красиво: старая «песочница» удаляется, создаётся новая, и разработчикам рассылается сообщение: «Из-за технических проблем мы потеряли весь код в такой-то версии; если вы вносили туда изменения, внесите их вот в такую-то версию, пожалуйста».

Пока всё ещё неплохо, да? Подождите, сейчас начнётся самое весёлое.

Рассылать сообщения вообще всем работникам — идея, конечно, благая, но будет проще и правильнее рассылать сообщения только тем, кто уже вносил код в эту конкретную «песочницу». Сделать это просто и легко: все внесения кода в «песочницу» есть, они выстроены в красивую таблицу, авторы изменений указаны отдельной колонкой, и есть специальная галочка «сообщить авторам изменений об удалении». Если отметить галочку, скрипт вытащит имена из таблицы и отправит каждому автору персональное извещение.

То есть у нас классическая двухходовка: во-первых, вытащить все имена авторов изменений из таблицы и что-то с ними сделать; во-вторых, удалить всю таблицу изменений.

Так вот, вы в жизни не догадаетесь, в каком порядке выполняются эти два шага.

8691

Герой IT-джамшутинга

Взяли на работу нового администратора базы данных. Первым заданием ему было проверить списки логинов к базе и обновить имена-телефоны, которым эти логины принадлежат, — вдруг кто-то имя сменил или в другой офис переехал. Что может быть проще? Взял логин из базы, посмотрел на владельца, проверил по новой телефонной книге номер, позвонил, уточнил, записал изменения.

Наш герой IT-джамшутинга убил все логины из базы, а по корпоративной почте сделал рассылку: «В целях усиления контроля за безопасностью просьба всем сотрудникам, которым нужен доступ к базе данных, заново заполнить форму запроса логина». Геноциду подверглись не только личные логины простых сотрудников и автоматических систем, но и логины всей административной группы, включая самого героя.

Итог: полдня на отпаивание главного админа валидолом (она у нас уже в возрасте дама), изъятие орудий убийств у вторичных админов и один прячущийся в туалете выпусник престижного университета.

8690

С миру по нитке, с программера по байту

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

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

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

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

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

Начальство подумало, вспомнило о премиях за новые идеи, согласилось и приказало программу доработать. Вот только старая версия была на C# и MSSQL, а разработчик, которого наняли взамен старого, знал PHP и чуть-чуть SQL. Благо все идеи о доработке сводились к созданию пары запросов. Однако срок доработки по приказу был месячный, потому разработчик перекрестился и сделал новую программу на PHP. Да, она выводила только результаты этих двух запросов. Да, оформление было просто никакое, но программа работала — и работала очень быстро. А ещё она использовала старую базу и была веб-ориентированной. Потом разработчик предложил перевести всё на веб, потому что так модно, и через полгода ушёл работать в крупному региональную контору.

Когда вышло новое обновление большой программы и новые замечания по местной, на должности разработчика сидел вчерашний студент, который знал Firebird и Delphi, а ещё очень любил линукс и открытое ПО. Примерно тогда же выяснилось, что давно используемый MSSQL нелегальный, и денег на его легализацию не предвидится. Так как разом отказаться от старой базы было невозможно, то пришлось для начала писать скрипт, который копировал данные каждую ночь из старой базы в новую, и потихоньку переписывать функциональность двух старых программ в новую разработку. Естественно, прежде всего студент написал то, что требовало начальство, и в тестовую эксплуатацмю ушла третья программа, которая работала с одной задачей, но выполняла новые функции. Пользователям под роспись полетели новые инструкции о работе с программным продуктом, и на рабочем столе каждого из них появился очередной ярлычок.

Через полгода к разработкам подключились безопасники и потребовали внести множество изменений. Московский разработчик отказался от проекта, предоставив госконторе развивать его дальше своими силами, а студент уволился с тоски.

8505

Базы — не игрушки

Работаю в небольшой IT-компании. Мы арендуем пару серверов в крупном датацентре. Как-то лет шесть-семь назад (вот вспомнилось почему-то) приютили мы на одном из этих серверов неких друзей тогдашнего директора с «молодым, но активно развивающимся проектом» — на первое время, пока запустятся, немного раскрутятся и определятся с собственным железом.

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

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

Созвонившись с «разработчиком» этого безобразия, я вежливо, как мог, объяснил суть проблемы и описал в общих чертах, что нужно делать. Сказать, что ответ сразил меня наповал — это сильно преуменьшить:

— Там не может быть проблем с производительностью, я всё тестировал на домашнем компе!

Я не стал расспрашивать, как он это делал, не стал и объяснять очевидных вещей. Знаю только, что проект доводили до ума (если доводили) уже где-то в другом месте.

8349

Индус — не национальность, а диагноз

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

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

შენ მოგიტყან ტრაკი! Спасибо товарищу, который научил ругаться по-грузински — окружающие не понимают смысла. Ну почему в функцию имя поля должно передаваться в виде (field_name), а не field_name — без скобок?

И пофиг, что автор этого кода британец. Всё равно он индус.

8347

Ракомстоятель I категории

Разбираю архивы своих исходников с 87 года. С каждым связаны какие-то воспоминания.

Вот 89 год. Волшебный язык CLIST. Фреймворк ISPF/PDF + CLIST + немножко PL/I = рабочее место бухгалтера по учёту машинного времени на ЕС-1066. Банальщина. Но с приколом. CLIST — язык без типов с целочисленной математикой. Если a = 2 и b = 2, то a + b = 4, а вот a and b = 22. Точность была нужна до второго знака.

Где наша не пропадала? И вот вам имитация деления столбиком путём добавления нулей к строке и последующим делением полученного числа. Это уже потом выборки из логов я переписал на PL/I — там было округление. Зато первоначальное ТЗ было закрыто за три недели. Конкурент за это время написал на ASM/360 модуль выборок и только-только дошёл до стадии отладки — даже не до deep alpha.

* * *

Вот 91-й. Рабочее место заместителя директора НИИ по науке. Интерфейс к базе научных работ. База лежит в СУБД ADABAS. Обработчик на PL/I. Интерфейс — всё тот же ISPF/PDF. Ну, и CLIST — как же без него? Обработчик ошибок диагностировал две ситуации. Ничего не нашли — «Х%ЙНАНЫ». Потеряли связь с базой — «П#$ДЕЦ». Каждая буква набиралась из звёздочек матрицей 10×16 и выдавалась на экран терминала 7927 со всеми доступными атрибутами: инверсно, с миганием и писком.

Сел замдиректора, д. т. н., профессор и вообще хороший человек за терминал, набрал данные для выборки, а ему — опа! Замдиректора в шоке. Техническим нутром он догадывается, что, возможно, облажался во входных данных, и набирает какую-то полную галиматью. Раза с десятого он получает и второе сообщение.

Я сижу у себя. Предвкушаю премию. Тут до меня доходит, что премии может и не быть, ибо внедрение произошло вместе с моим обработчиком — точнее, с его сообщениями. Ну, ничего, ща поправим — авось замдиректора ещё не успел попробовать. Правлю на что-то приличное. И аккурат в момент, когда я сохраняю модуль, раздаётся звонок от директора НИИ с указанием явиться с вазелином на ковёр и дать объяснения.

Отвертелся. Спасло то, что между звонком и явкой прошло время, явно недостаточное для правки программы. Даже вазелин не понадобился. Но премию дали в половинном размере — на всякий случай.

* * *

Вот 94-й. Крошечная базейка по учёту кадров и распределению отпусков. Даже тестовая база сохранилась: ФИО, должность, примечание. Примерно такая:

Иванов Иван Иванович — Директор — Получает мильён
Петров Пётр Петрович — Замдиректора — Главсамец
Васильев Дядя Вася — Дворник — Метёт себе и метёт
Сидоров Сидор Сидорович — Ракомстоятель I категории — Стоит себе и стоит

Базу эту я забыл занулить. Функции полного просмотра ТЗ не предусматривалось, только выборки. А где-то через месяц на работу приняли Сидорова С. С. — в общем, полного тёзку. Вбивает кадровица нового сотрудника, собирается нажать кнопку «Добавить» — а ему рубрикатор сразу должность подставляет и комментарий…

За замдиректора по АХО надолго закрепилось прозвище из базы.

8342

Structured Query Magic

Работаю в отделе кадров в крупной софтверной компании. Приходит сегодня молодой человек на должность начинающего программиста С++ для разработки БД на SQL.

— Почему вы уволились с предыдущего места работы?
— Да вот, приношу ведущему программисту работающую программу. Он смотрит на код, видит описание команд SQL и заворачивает обратно со словами: «Оно так не умеет!» Даже доказывать не стал, что программа работает, и отдел тестирования её уже проверил.

Парень отлично выполнил все тестовые задания.

8328

В Индию со своим самоваром

Устроился я на работу в небезызвестную московскую фирму, занимающуюся производством софта. В первый же день мне дали почитать «правила» компании — то, как надо, как принято и как правильно писать код и работать с базой данных в этой конторе. Прочитал — всё разумно вроде, стандартно, как у всех. Но в процессе работы мне дали понять, что правила эти далеко не для всех, что есть такие очень опытные и незаменимые сотрудники, которым в силу их незаменимости и высокоопытности можно писать непонятный остальным говнокод.

Дальше — больше. Оказалось, о нормальных формах тоже никто не слышал. База данных предоставленного мне проекта имела чудовищную структуру, была не нормализована, во многом избыточна и нелогична. Выяснилось также, что самые основы — SQL — эти горе-разработчики не знают: везде и всюду я натыкался на чудовищные, громадные и неудобные запросы. Складывалось ощущение, что на словах SELECT, FROM и WHERE изучение разработчиками SQL закончилось.

Полгода я пытался разобраться в этом бардаке. Полгода я регулярно задерживался на работе, пахал без выходных. Полгода я пытался внести хоть какую-то логику и красоту в то, что они делали, за что постоянно получал по шапке со словами: «У нас так не принято, мы так не делаем». И через полгода этого издевательства над моей логикой и разумом меня уволили с формулировкой: «Ты не справляешься».

Задолбали люди, которые не хотят прислушиваться к конструктивной критике. Достали те, которые считают себя специалистами, но категорически отказываются воспринимать новое. Устал я от тех, кто не старается сделать свою работу хорошо и качественно. Пугают такие конторы: когда к ним устраивается специалист без опыта, они могут научить его только плохому.