polenova: (Default)
[personal profile] polenova
У меня есть друг детства Жорик. Мы с ним примерно в одно время закончили школу и поступили в институт. Но я, как дура, пять лет училась, а Жорика выгнали из института на втором курсе. За сионизм. Как армянин Жорик оказался сионистом - это сюжет для другого рассказа. Но зарабатывать деньги программированием он начал раньше меня. Когда я пришла к этому решению, Жорик был уже опытным программистом. И когда он менял одну работу на другую и один язык на другой ( не такой большой выбор был в СССР в начале 80-х ), я спросила
- Жор, как тебе это так легко удается?
- Ой, ну какая разница, какие веники считать! - ответил Жора. И был прав.
Выучила я эту jQuery. И Телерик тоже. Такие же веники, как и все остальное. И теперь в полной мере ощутила, в каком же я, блин, говне.

Вы знаете - что такое спецификация? Ну functional spec? Чтобы исполнитель - а я не дизайнер, не архитектор,- я конрактор, исполнитель, знал, что он собственно должен написать. Я-то знаю, а вот мое начальство почему-то нет. Мне выдают картинку. Функциональность я должна додумать исходя из здравого смысла. Картинки выдаются по одной, общей архитектуры нет и общего смысла проекта тоже нет. Может у них в голове и есть, но не на вербалном уровне. Вообще-то фирма должна собирать заказы у желающих срентовать чартерный самолет и договориться с фирмой, у которой эти самолеты есть.
Вот есть три чартера на приколе в НЙ, два в Сан-Франциско и один завис в Денвере. А заказчик хочет слетать из Монтаны в Канзас, там пару дней повисеть и потом добраться до Сан-Диего. Заказчиков много, чартеров - тоже. Надо оптимизировать спрос и предложение. На оптимизации, по идее, наша фирма должна и делать деньги. Огромный простор для математических алгоритмов, правда? Но как я говорила - чего нет, того нет. Вся оптимизация в голове оператора. А наш продукт предоставляет им информацию, где какие самолеты стоят и позволяет спланировать полет и его записать. Т.е. оператор получая заказ из Монтаны, прикидывает на глазок, где поближе свободный самолет, отправляет его порожняком в Монтану, оттуда в Канзас и там он зависает на 2 дня. В системе записано, что он кочумает в Канзасе и его можно срентовать, но не больше, чем на 2 дня, потому что через два дня он должен стартовать в Сан-Диего, именно он и никто другой, потому что туда уже загрузили нужную команду, напитки и девочек. Разгадывать, почему эта фирма не разорилась и что в голове у операторов - дело не мое, мне за это не платят. Мне надо написать немудреный вебсайт. Только спека на него нет. Я например писала страничку, на которой фиксировальсь порожние рейсы. Это табличка ( грид, Карл, давненько я гридов не писала) с колонками - номер самолета, пункт старта, пункт прилета, время вылета, время приземления. И усе. Причем я - только фронт-энд. Как они эту херню в базе хранят - я не знаю, база - тайна за семью замками. Я получаю список, отражаю его в гриде и должна предоставить возможность этот грид редактировать. Удалить строчку, изменить или добавить. Зачем для этого jQuery, Телерик, и прочие прибамбасы - х.з. Я успешно решала эту задачу на Джаве (апплетами, сервлетами, бинами, RMI и черта-дьявола), на первой версии .NET, на .NET 2.0, на всех последующих, и вообще при помощи кирки и такой-то матери. Я решала ее на Телерике, правда в прошлых версиях и Девэкпрессе, и даже на пакетах, которые давно почили в бозе. На веб-сервисах и без, с Ajax, без Ajax. Грид - он и в Африке грид. Но у каждого грида есть такая штука, которая назывется business rules - правила, т.е. Какие поля обязательные, например, а какие - нет. Это ж от задачи зависит. Можно удалять записи, или нельзя? Ведь если я решу, что мой самолет из Монтаны в Канзас вовсе не полетит, а кто-то уже запланировал, что он торчит в Канзасе и запланировал его куда-то еще? Значит его плану - кирдык? Это из здравого смысла. А с точки зрения базы данных - это коррупция данных. А если я заполню новую строчку так, что у меня время вылета позже чем время прилета? Человек же данные вводит, может ошибиться? А если у меня самолет вылетает 31 июня
- Валидация данных, - спрашиваю я вкрадчиво у начальства, - у вас предусмотрена или у вас серверная валидация? - это когда мои абсурдные данные сервер отвергает и возвращает сообщение об ошибке. Начальство морщит лоб и смотрит на меня с недоверием, как будто я у них попросила ключ от квартиры, где деньги лежат. Проверяю. Ввожу 31-е июня. Сервер данные не записывает (уже спасибо), но и об ошибке не сообщает. А грид показывает на одной страничке 5 записей. Если там страницы 3, то я, оператор, никогда не узнаю, появилась мой новая запись или нет.  Показываю начальству. Начальство озаряется:
- Нам нужна валидация на клиенте!
Мать вашу, сервер тоже не должен молчать как рыба об лед и иметь один код возврата - SUCCESS. Но сервер пишет китаец Родригес и показывать мне его боится. Я у него спросила, что происходит, если SQL выдает ошибку.

- Я не пишу на SQL, мы используем Entity Framework.
- А Entity Framework что использует?
- LINQ!
Спокойно, Лиля, спокойно, не надо искать тяжелых предметов, он не виноват, что он китайский Родригес, или мексиканский китаец! (Кстати, имечко у него тоже классное, его зовут Эдмон. Граф Монте-Кристо, бля)
- А LINQ во что преобразуется? А exceptions кто будет ловить, Пушкин? - но это я уже не говорю. И так ясно, что Пушкин уехал в Баден-Баден и не надо пугать этого Монте-Кристо словом exceptions. Оставляю в покое несчастное Монте-Кристо, приступаю к начальству.
- Ладно, примитивные валидаторы я напишу - только вы мне под это сроки-то не предусмотрели, вы хотели форму за день, а мне с валидаторами Телерика разбираться.
- Предусмотрим, учтем, исправимся! Дадим время, вставь валидаторы.
- Это примитивные, а логические как? У вас время локальное или UTC? Как я проверять буду, что самолет вылетел раньше, чем от приземлился, если вылетел он из НЙ, а приземлился он в Калифорнии, три часа разницы?
- Мы в базе храним абсолютное время, UTC.
- А на клиента передаете?
- Локальное.
- А часовой пояс вы на клиента передаете? У меня только код аэропорта, откуда я на клиенте знаю как его переводить?
Моей начальнице лет столько же или поболее, чем мне, у нее сыну 30 лет. Значит ей за полтинник. А лобик морщит - я так в 15 лет не умела, совершенно незамутненное создание.
- Вы правы, проблема часовых поясов - это очень сложная проблема, мы еще не решили, как ее решить.
Весь мир как-то решил, а они все не могут.
- Интересно, - говорю, - а если я все-таки введу время вылета позже времени прилета в абсолютном времени, ваша база раком встанет или съест?
Ввожу вылет из Бостона, прилет в Калифорнию, это я в уме пересчитать могу. База глотает и не морщится. На этот случай у них и серверной валидации не предусмотрено. Т.е. ждет заказчик самолет в своем Сан-Диего, по расписанию прибыть должен, ах, незадача, он еще из Бостона не вылетел.

Думаете, это все? Не-а. Я тут с начальницей обсуждала, что хорошо бы иметь регрешн-тесты. Ну когда мы новую функциональность добавляем, знать, что старая не сломалась. Потому что, чем больше функциональности, тем больше возможностей ее сломать. А у нас ведь нет QA - потому что зачем он нужен. И тест-кейзов нет. Ну, напишу я тест-кейзы ( за отдельные деньги, я по часам работаю), а кто их проверять-то будет? Или по кнопкам шлепать, или код писать. А у нас UI, юнит-тесты не напишешь, автомэйшн нужен. (Монте-Кристо юнит-тестами не затрудняется, хотя как можно API без юнит-тестов писать? Это только Монте-Кристы умеют. Ошибок, как грязи. Я ему показала ошибочку в сервисе - при определенном сочетании параметров - неверный результат. Починил. При любом сочетании параметров сервис вообще ничего не возвращал).  Автомэйшн - это деньги. И QA, который по кнопкам шлепает и с инструкцией сверяется - деньги.
Когда эти дебилы завалят проект - это тоже будут деньги. И их попрут. И меня за компанию. Кому я понаблюсь с уникальными знаниями jQuery, Телерика, с тем, что я забыла все, что знала до этого - у меня чердак маленький, вытесняется лишнее.

Одна радость - сидела я сегодня вечером на кухне и тосковала. Пришел муж и начал своей работой хвастаться.
- Ты знаешь WPF?
- Не так чтоб очень. Я на нем меньше года писала, да и то раз от разу. Считай, что не знаю.
- А как вот такую штуку сделать, знаешь? - и объясняет какую.
- Ну такую знаю, конечно. Если этого не знать, считай, вообще WPF не знаешь. А че?
- Ни че. Неинтересно с тобой разговаривать. Я вот сегодня узнал. А ты LINQ через reflection написать можешь?
- Ну написала как-то раз. Два дня ебалась, еще день отлаживала. Написала.
- Молодец!
Подумаешь, рефлекшн. Я, как кот Матросскин, еще и крестиком вышивать умею. Правда-правда, на самом деле умею. Только криво.

Date: 2015-08-21 03:01 pm (UTC)
From: [identity profile] ex-juan-gan.livejournal.com
Ты там контрактор? Я бы не мучался, а вздыхал, изолировал площадку, и делал, что пациенты просят, но с тестами и валидейшенами.

Date: 2015-08-21 05:31 pm (UTC)
From: [identity profile] polenova.livejournal.com
Противно очень и скучно.

Date: 2015-08-25 08:42 am (UTC)
From: [identity profile] cema.livejournal.com
Ну и что? Не кирпичи таскать.

Date: 2015-08-25 08:42 am (UTC)
From: [identity profile] cema.livejournal.com
Ага.

May 2022

S M T W T F S
123 4 5 67
8 9 10 1112 1314
15 161718 192021
22 232425 2627 28
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 23rd, 2025 04:04 am
Powered by Dreamwidth Studios