gradomyr: (jagainu)
SQL Server сильно оптимизировал свой cardinality estimator. Это такая штука, которая в оптимизаторе плана исполнения SQL-запроса отвечает за оценку, сколько записей вернёт запрос. Если записей ожидается много, запрос будет выполняться одним методом, если побольше - то уже другим. Грубо говоря, если вы уронили пуговицу, её проще поднять рукой. А если 200 - то уже надо идти за веником.

Так вот, не знаю, зачем я это объяснял, потому что непрограммистам дальше всё равно будет непонятно.

Эти микроредиски заявили, что их эстиматор теперь "предполагает", что таблицы в запросе связаны между собой, даже когда этого из структуры базы не следует. Фактически же, они теперь наткнувшись на любое дополнительное условие, связывающее таблицы, сильно урезают Estimated Number of Rows. Иногда это верно. Но не всегда же! И что делать, если у тебя возвращается 20 миллионов записей, а эстиматор в своей новообретённой мудрости ожидает всего 10 тысяч и начинает пестрить nested loop-ами и lazy spool-ами, совершенно неясно. Более того, нигде никаких рекомендаций по преодолению. Я опять что ли одинок в своей проблеме?

Точнее рекомендация есть - включить compatibility mode с 2012 версией и наслаждаться старым эстиматором. Но это же не настоящее решение. И в ряде случаев новый работает хорошо. Есть конечно ещё замечательный вариант - перепроектировать те части базы, где возникают подобные проблемы. Непонятно пока, как. И непонятно, кто мне это даст сделать. Ибо части не мои, я из них только читаю.
gradomyr: (jagainu)
Говорила мне мама: под всякую хрень типа автономера выделяй bigint, чтоб с гарантией. Не послушал я маму, пожадился, сделал int. Думал, что 2 миллиардов мне на несколько лет хватит. Щаз. Не просто закончились, а закончились в пятницу вечером. Когда все кто может поправить продакшен уже ушли домой. При жалких 300 миллионах записей в таблице. Ща буду прыгать через обручи.
gradomyr: (jagainu)
Скажи мне, как часто ты используешь DISTINCT, и я скажу тебе, как далеко тебя надо гнать из программистов БД.
gradomyr: (jagainu)
What is the worst thing you can do in SSAS calculation? Try to use any math in it.

Вчера родилось вот после очередного фейла.
gradomyr: (Default)
Внезапно вспомнил про своё давнишнее оружие: Кларион. Решил проверить, как он поживает. Мало того, что он оказывается успел развиться до версии 9.1 (я последний раз работал на 6.3), так ещё и статья про него в Википедии представляет из себя самую наглую и неприкрытую рекламу, что я когда-либо видел на этом сайте. Реальная цитата из статьи: The Clarion Language is widely advertised with the slogan "Develop Applications 10x Faster". This is a serious understatement.

Причём пишет всё один мужик, явно оголтелый фанат. Потом кто-нибудь его бред потирает. Потом он пишет ещё больше. По истории замечательно видно.
gradomyr: (jagainu)
Я в своей жизни сталкивался со всеми видами багов. А вы?

Шрёдинбаг самый крутой и крышесносный из всех. Хотя как материалист я понимаю, что он просто обязан быть кажущимся.
gradomyr: (jagainu)
А мне сегодня книжечку на курсах подарили. Вот эту. Точнее не подарили, а вручили за лучшую домашку. Домашка была максимально ускорить дурацкий запрос. Я его довел с 30 секунд до одной, да еще и выпендренулся с дополнительным условием не апдейтить строки, которые не поменялись. Оказалось, что я до сих пор не знал одной крайне удобной для этого дела функции. Но обошелся и без нее, через except. Чисто олимпиадное решение, в которых я всегда был слаб. А тут вдруг само явилось.
gradomyr: (jagainu)
Я бы непременно нанял человека, честно ответившего на все вопросы. Возможно, это одна из причин, по которым мне такой функции не доверяют.

Originally posted by [livejournal.com profile] airin_nav at post
Нормальные вопросы для IT-собеседования:

more )(c)перто
gradomyr: (jagainu)
Вот казалось бы, что может быть проще проектирования базы данных. Смотришь на реальный мир. И создаёшь таблицу для каждого обнаруженного в нём класса сущностей. Профит! Но нет, поколения криворуких недокодеров упорно отображают в своих базах всё что угодно, кроме реального мира. Чаще всего их таблицы отображают структуру отчётности. Иногда её усугубляют разделением функций по пользователям. В результате один и тот же заказ одновременно в таблице отправленных заказов и неотправленных. Заказ Шрёдингера, блин.
gradomyr: (jagainu)
Программистские маразмики, обнаруженные в коде одного индуса чисто просто так, за сегодня.
программистам онли )
ЗЗЫ Что обиднее всего, во время интервью все требуют каких-то глубоких и широких знаний. А потом откроешь код, а там испещрено следами бандерлогов.
gradomyr: (Default)
Достиг нового уровня владения шарепоинтом: понимаю все слова в объявлениях о найме. Спасибо Викасу (моему предшественнику) за то что ни одного решения не сделал по уму и закону божьему best practices. Отличная прокачка.
gradomyr: (Default)
Посмотрел пару тьюториалов про InfoPath 2010. Это просто неимоверный лютый П. С большой буквы П.

Сейчас с программистов-базовиков майкрософтовского уклона при найме стало модно требовать знание SharePoint. Который я ещё не смотрел. А посмотрел я InfoPath, который есть к нему примочка по созданию формочек. Вот тут имеется парочка видео про него.

Челюсть моя нижняя стучала по клавиатуре весь просмотр. При создании простейшей формы по заказу мороженки было добавлено 6 практически одинаковых формул по расчёту стоимости заказа. Причём копипейстом. Причём сам инфопас имеет соблазнительно удобный интерфейс для копипейстинга. То есть ОНО ТАК ЗАДУМАНО. Причём во втором видео в районе 9 минуты видно, как формула, повешенная на поле Quantity, не срабатывает. Приходится всё равно давить кнопку "расчитать стоимость".

Что ещё весёлого было. Повесили эту форму на вебсайт. Заполнили, нажали кнопку Submit. Не произошло ничего. То есть оно сработало, но пользователю об этом не сказало. Как вы думаете, сколько раз пользователь нажмёт на эту кнопку? Раз 100500, а потом ещё позвонит в суппорт и попросит "проверить всё ли прошло".

Там ещё много хорошего, начиная от уродливого дизайна и заканчивая невразумительными сообщениями по нажатии кнопки Cancel. Вопрос который мучает меня: зачем, зачем Майкрософт возвращает нас в Dark Ages? Это ж блин уровень девяностых с кривыми самопальными программами. И разумеется полезшие туда бухгалтера раскопируют свои формулы и 6 и 120 раз. И будут их править всякий раз при изменении цен. А на двадцатой правке они утомятся, выбросят это щастье к едреней фене и купят нормальный интернет-магазин, написанный программистами.
gradomyr: (Default)
Я всегда с большим подозрением относился ко всяческому thinking outside the box. Все эти хитрожопые решения часто не учитывают какого-нибудь частного случая. Сейчас среди "продвинутых" компаний типа Гугла модно давать на интервью задачки на смекалку. Как житейскую, так и алгоритмическую. Одна из известных задач ставится так:

Дан массив чисел положительных и отрицательных чисел. Например такой: [31, -41, 59, 26, -53, 58, 97, -93, -23, 84]. Надо найти в нём непрерывную последовательность с максимальной суммой. В данном случае ответом будет 187, сумма с 3 по 7 элемент: [59, 26, -53, 58, 97]. Фишка задачи в том, что отрицательные числа тоже могут быть включены в ответ, если они позволяют "присоединить" дополнительный ряд положительных чисел, которые перевесят отрицательные.

И что же я обнаружил, изучая известные быстрые решения этой задачи? На массиве из одних только отрицательных чисел они возвращают 0. Потому что минимальную сумму начинают считать от нуля. Что далеко не очевидно из постановки задачи.
gradomyr: (Default)
Я тут между прочим уже который день сижу на Андроиде 4.0 ака мороженка-бутерброд. Попал в число осчастливленных владельцев Nexus S. Пока что все плохо. Тормоза. Программы валятся налево и направо, причём даже не пытаются слать никакие там отчёты и дампы. Просто, жмёшь на кнопочку - и оказываешься обратно на десктопе, как в старые добрые времена. Новая загрузочная анимация преотвратная, вся в бандинге. Сразу понимаешь какое безнадёжное старьё твой годовалый телефон. Но хуже всего стало с полями ввода. Кому-то в гугле показалось хорошей идеей растягивать их до бесконечности вправо. Так что теперь можно видеть только последние 3 слова из напечатанного. Навигация по напечатанному ухудшилась ещё больше, хотя казалось что некуда. Теперь ещё постоянно мешается какой-то дебильный словарь, предлагающий добавить в себя все слова русского языка. Откуда он вылез и как его засунуть обратно, не знаю. Теперь вся надежда на выход версии 4.1.

Только 2 положительных прикола могу отметить.
Первое: Придумали-таки анлок-слайдер, который не как у айфона. До сих пор был слишком похож, и наверняка Апл докапывался. А теперь по сути осталось то же самое, но выглядит совсем иначе, никакой суд не подкопается.
И второе: у Андроида появился собственный муму мейкер. Ничего с ним я редактировать не пытался, но сам факт греет душу. Ждём новых амв-клипов, собранных на телефоне!
gradomyr: (Default)
Всячески пытался осуществить фильтр для TreeView. И так подходил, и эдак. Вышла совершенно удручающая вещь. "Правильно" реализованный фильтр безбожно тормозит. Если фильтровать коллекцию, являющуюся сорсом для для контрола, то во время рефреша происходит и рефреш байндинга. Который тормозит как сто старушек на одном пешеходном переходе. Все замечательные примеры из интернета работают на трёх с половиной записях. На моих 1700 фильтр тормозит уже до целой секунды. Кроме байндинга грешить не на что, все тормоза укладываются в вызов ICollectionView.Refresh.

С нормальной (мгновенной) скоростью неожиданно для меня сработал вариант, когда подлежащему под TreeViewItem-ом классу заводишь проперти IsVisible, и в случае смены фильтра тупо проходишься по коллекции циклом и пересчитываешь и прописываешь её значение. Я понимаю, что это "неправильно" и "не по wpf-ному". Но из правильно и быстро я всегда выберу быстро. А одновременно пока не выходит.

Можно наверное как-то повесить обработчик события изменения фильтра, чтобы само пересчитывалось. Но я не уверен, что оно будет более правильно. Классу данных явно не положено знать о классе фильтра. О нём знает только ViewModel, владеющая коллекцией этих классов. Да и что тогда будет, 1700 обработчиков события зарегистрировано, что ли? Такое нормально? Этого я пока не понимаю, не проникся ещё до конца.
gradomyr: (Default)
Решил больше писать о работе. Дабы приманивать в журнал других программистов. А то всё лоли, да лоли. XD

Всю свою (взрослую) жизнь я программировал на Кларионе. Сейчас, когда его популярность кажется уже начала уступать Коболу, пытаюсь перепрофилироваться под C# и WPF. Мне очень нравится. За исключением новейшей идеологии MVVM, по которой надо наворотить кучу слоёв. Поэтому сначала я написал программу тупо в лоб, как привык. А теперь учусь делить её на эти самые слои. Наконец завершил расслоение фильтров. Очень забавно. Программа делает то же самое, что и месяц назад, но теперь на это уходит в 3 раза больше классов.

Для связи с базой данных использую DataSets. С моей привычкой решать все проблемы за счёт SQL-я Entity Framework мне совершенно не понравилось. Уж больно оно ограничивающее. Заточено под entity=таблица, и ни шагу в сторону. Отложил Entity Framework на чёрный день. Разумеется, если бы в моей базе было не тысяча записей, а миллионов десять, я бы употел вручную разруливать какой-нибудь paging или lazy load. А так - особо не думая вжик всё в датасет и делай что хочешь.
ещё не надоело? )
Вот за что люблю C#. Целый день ищешь решение, а потом пишешь 1 строчку и работает. А если провозишься месяц, то и строчек как раз около 30 набежит.
gradomyr: (Default)
У меня на работе полно идиотов. Постоянно натыкаюсь в коде на пассажи, после которых хочется кататься по полу с плачем и криками "make me unsee it!" дальше нудно и несмешно, только для программистов )
gradomyr: (jagainu)
Пример построения работы кода, в котором я вынужден ежедневно рыться. Вдохните поглубже.

1. Функция GetCurrentConvention роется по конфигурации продуктов, пытаясь найти в какой системе измерений сконфигурирован данный кейс (примеры: метрическая, имперская). Если повезёт, находит внутренний Id этой самой конвенции. По нему тут же лезет в соответствующую таблицу, находит название для системы. Возвращает название.
2. Полученный результат отдаётся функции GetConventionId, которая лезет в ту же самую таблицу и по названию обратно находит Id.
3. Полученный Id передаётся третьей функции GetConventionUnits, которая на самом деле ожидает название, и первым делом снова лезет в ту же таблицу в поисках Id. Не находит. Получает error. Который игнорируется.
And nobody cares. Как минимум с 2005 года, когда была переконфигурирована система контроля версий. Раньше в прошлое отследить нет возможности.

Заберите меня кто-нибудь к себе работать! Я вам кофе сварю. Т_Т

Profile

gradomyr: (Default)
gradomyr

April 2017

S M T W T F S
       1
2345678
9 101112 131415
16171819202122
23242526272829
30      

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 20th, 2017 05:32 am
Powered by Dreamwidth Studios