По свежим следам
Я часто пишу вещи, связанные с работы, по свежаку, потом сохраняю, а потом забываю опубликовать. Потом натыкаюсь на них, и вот результат перед вами.
Список тем в моем уютненьком довольно ограничен, и в этот раз будет профессиональное. Коллеги насладятся, для непрофессионалов попытаюсь дать обьяснения там, где это возможно.
История первая: одобрение кредита.
Сейчас решением выдавать вам кредит или нет в западных банках занимаются не живые люди, как таковые, а экспертные системы. Хорошая экспертная система оценивает чертову уйму параметров: ваш пол, возраст, место рождения, гражданство, доход, наличие/отсутствие партнера/ши, детей и еще массу других вещей, часто не очень очевидных.
Экспертная система, которая используется организацией, на которую я трудился до недавнего времени, является неким "черным ящиком": ей надо отослать сотни полторы параметров, запрашиваемых этой самой системой, а она в ответ, слегка подумав, выдаст что-то типа: "Нет, столько денег ему мы дать не можем", или "ок, выдаем".
Соответственно, менеджмент наш, в неизьяснимой мудрости своей, поручил мне написать хреновину, которая собирает данные из нашей системы и приводит их в форму, которую согласна жрать уже написанная другими людьми экспертная система. Эта самая форма жестко задана, я не могу от нее отступить ни на йоту, это не обсуждается.
Сел я клепать это. Начал разбираться с тем, где, в какой форме и какие именно данные хранятся в нашем волшебном проекте. О том,что я обнаружил, и будет мой рассказ.
1. Мальчики и девочки.
- Экспертная система требует пол кредитополучателя, и допускает два определения: HERR или FRAU. В нашем банке работают творческие личности, которым было впадлу заполнять это значение, поэтому они ввели третье значение: "UNBEKANNT" ("неизвестен"). Подсистемы валидации введенных данных, хранения этих самых введенных данных и обработки оных на нашей стороне заточены как раз на три определения пола. Пытаюсь взять за тестикулы улыбчивого загорелого сына Востока:
- Родное сердце, "UNBEKANNT" мне как интерпретировать: как HERR или FRAU?
- Я не знаю.
- Я тоже.
- Ты должен провести расследование и выяснить этот вопрос.
- Родной, я программист, а не сексопатолог.
Родной молчит третьи сутки.
2. Чьих будешь, холоп?
- Все та же система требует данных о гражданстве кредитополучателя. В нашей чарующей системе хранятся три разновидности гражданства (три переменных в разных местах, причем все три - разного типа) для каждого аппликанта, причем никто не знает, какое из них является истинным. Документации к проекту нет, комментариев нет НИ К ОДНОЙ переменной в коде, поэтому откуда взялись еще два гражданства, не знает никто. Могучим напряжением интеллектуальной мышцы выяснилось, что два других гражданства - это промежуточные данные, полученные из первого гражданства, предназначенные для пересылки в две других системы. Что это за две других системы, не знает никто. Точнее, один знал, но уволился год тому. Два дополнительных гражданства возникли потому, что кому-то было впадлу эти самые данные сохранить где-то еще, поэтому он их сохранил прямо по месту, а хрена ли морочиться, после нас хоть потоп.
3. Календарь.
Еще один шикарный диалог:
- Коллега, в нашей системе количество месяцев кредитования хранится как величина с запятой. В экспертной системе это целочисленное значение. Как будем конвертировать?
Тон ответа был потрясающим:
- Я удивлен, что тебе необходимо обьяснять, как конвертировать значения с запятой в значения без запятой в Java.
- Родной, ты не выпендривайся, а головой подумай, что произойдет, если кредит выдан на 21,4 месяца, а я округлю это до 21 месяца согласно правилам округления. Так что я повторяю свой вопрос: как округлять будем?
- Ну... я не знаю...
- Это я уже понял. Выясни у тех, кто знает, будь любезен.
4. Семья и брак.
Наша система допускает различные семейные статусы. Женат. Разведен. Вдовец. Живут раздельно. Сожительство. Кроме того, есть семейный статус "Австрийское партнерство". Ни одна сволочь не знает, что это такое. Я с коллегами пофантазировал на тему возможных сексуальных перверсий, мы решили, что австрийцы наверняка - изрядные шалуны (ну так, заочно). Экспертная система тоже не знает, что это такое. На всякий случай конвертировал это для экспертной системы в "Сожительство". Документации, как я уже сказал, у нас нет, и спрашивать о ней - все равно что прилюдно испортить воздух в лифте: как-то неприлично.
5. Змея, кусающая собственный хвост.
Змей, пожирающий себя самого, или Уроборос - это не только распространенный религиозно-философский символ различных цивилизаций, но и живое воплощение нашего проекта. Такие вещи, как вызов обьекта самим себя через прокси-обьект из удаленного обьекта - это норма вещей.
Для тех кто ничего не понял: вы берете за руку партнера, которой он держит вашу вторую руку, которой вы чешете себе пузо. Почему нельзя почесать себе пузо самостоятельно - великая тайна есть: ни одного разумного соображения для подобных действий не придумано. Иногда в системе количество задействованных для чесания пуза партнеров больше одного. С нетерпением жду Рагнарёка, по слухам он будет.
А вот теперь только для профессионалов. Насладитесь комментарием к enum'у, ощутите тот же трепет в чреслах, что ощутил я. И нет, господа, я не о грамматической ошибке в комментарии, а о сути его.
ProcessLoanRequestHelper.java
/*
PLEAE DO NOT CHANGE THE ORDER OF DECLARATION - it defnies the error code of each instance
*
* @author (скрыт мною из соображений гуманизма)
*
*/
public enum SyntaxValidationErrorCode implements ErrorCode {
- cynic's blog
- Login to post comments
Я в таких
Я в таких случаях вспоминаю анекдот "А мужики-то не знают!" :)
Я чем чаще
Я чем чаще читаю про униженных и оскорбленных жизнью пидорасов, тем чаще возникает идея о том, что гибель 7% (или сколько там этих девиантов) населения - не такая уж большая плата за тишину и покой.
О. Скоринговые
О. Скоринговые системы. Интерфесы, миграции. Читал и плакал. Как все знакомо. Это еще у вас цветочки, кстати.
По поводу 5. пункта: проклят тот день, когда было придумано объектно-ориентированное программирование:
а. Если в обычном линейном/функциональном программировании можно выстрелить себе в ногу Н-способами, то в ООП - это Н в степени Н способов.
б. На проекте с ООП - независимо от размера проекта всегда найдется минимум один "гений", который-таки "выстрелит себе в ногу".
8-)
ЗЫ: да, я противник и ненавистник самого принципа ООП. В обшем случае хоть инструмент и не виноват, виноват тот, кто его использует неверно - но сама концепция ООП открыла ящик пандоры, в массовом сознании сушественно снизив требования к уровню интеллекта программиста и убедив массы, что благодаря ООП все станет делать существенно лучше/легче/проще. На самом деле все ровно наоборот. :-(
Отличная
Отличная концепция, я категорически не согласен. Просто ООП это инструмент. Точнее, инструмент плюс методология. Ты же не даешь своим детям перфоратор? Скальпель? Ножи? Аналогично и тут. Криворукий пациент кривыми руками сделает дерьмо из чего угодно. Точно так же криворукий повар из сьедобных продуктов сделает несьедобную еду. Точно так же криворукий фотограф, вооруженный Хассельбладом, снимет дерьмо. Инструмент сам по себе ни в чем не виноват, вопрос всегда упирается в людей, которые его взяли в руки.
Я слышал народный стон о том, что Линукс - дерьмо. Что Никон - дерьмо, потому что на профессиональных моделях нет переключателей "портрет", "пейзаж", "спорт" и пр. Попытки убедить людей в том, что профессиональная камера лишь предьявляет к пользователю несколько более высокие требования, наталкивались на глухую стену непонимания: она же профессиональная? Почему получается отстой? Камера отстой!
Я все же
Я все же остаюсь при своем мнении: ооп это специфический инструмент для специальных применений. А сейчас его используют везде, где надо и где не надо. В итоге монстроузный софт с монстроузными требованиями к железу, работающий медленно и криво и только все больше обрастающий ненужным говном.
Не, секунду,
Не, секунду, давай различать оттенки:
Когда речь идет о чем-то простеньком, примитивном и узкоспециальном, я тоже не хватаюсь за Джаву или С++, а сажусь и пишу короткий скрипт. Но вот интересная штука: я в последние годы пишу все, что мне надо, как набор пакетов и и библиотек, потому что выясняется очень часто, что то, что ты вчера по-быстрому сваял на колене, сегодня нужно еще в паре проектов.
Монструозные требования в основном к памяти. Да, это Джава. Но такая недобрая слава сложилась в этой области именно потому, что там работают криворукие загорелые братья. Только что разговаривал с компаньоном, он поведал мне, что после грамотного переписывания кода, который сваяли вышеупомянутые братья, ключевой процесс длится теперь не 4,5 часа, а 48 секунд. Это лишь руки и голова, не более того.
ООП крайне удобен, как концепция. Он позволяет при наличии ясного и логичного мышления связывать между собой сущности, делать код чистым и прозрачным. Я второй день правлю проект, который был написан мною 6 лет назад. И не имею никаких проблем с пониманием, что это было, где и почему, именно потому, что с самого первого символа я старался писать его правильно, так, чтобы он не доставлял мне головной боли. Это себя оправдало, теперь я лишь добавляю и улучшаю функционал.
:-) О! Прекрасная
:-) О! Прекрасная иллюстрация моей правоты!
Твой пример - это когда нужный иснструмент в нужном месте применяется человеком, который знает, что, как, зачем и почему именно так делает.
Более того - чем больше и лучше ты это делаешь - тем сильнее ты углубляешься в определенную специализацию (по кругу задач, технологиям, итп.) - и тем лучше возможность повторного использования твоих ООП-наработок, но уже ареал их эффективности. Это как раз и был главный пойнт при продаже идеи ООП бизнесу/массам. И это прекрасно! Просто не нужно тащить ООП туда, где от него вреда больше, чем в пользы. (иначе получаются драйвера мыши на 390 Мб размером и пр. прекрасные "решения").
Еще раз, мое мнение - всему свое место и время, а ООП - это ни в коей мере не "золотая пуля" и не панацея для всего программирования, как его пытаются везде впихнуть.
Свежак, сегодня
Свежак, сегодня из анекдотов, по поводу 1 пункта:
В ПАСЕ предложили разделить российскую делегацию на шесть полов. Даже тут полнейшая дискриминация по половому признаку, ведь пока известно 54 пола:
1. Agender - бесполый
2. Androgyne - андроген, гермафродит (мужчиноженщина)
3. Androgynous - мужеженственный (внутренне, по ощущениям)
4. Bigender - ощущающие себя в разное время то мужчиной, то женщиной
5 Cis - латинск. «пред-», т.е. «недо-» (без негативной коннотации)
6. Cis Female - предженский, недоженский
7. Cis Male - предмужской, недомужской
8. Cis Man - предмужчина, недомужчина
9. Cis Woman - предженщина, недоженщина
10. Cisgender - предполовой, недополовой
11. Cisgender Female - женский предпол, недополовой женский
12. Cisgender Male - мужской предпол, недополовой мужской
13. Cisgender Man - предполовой мужчина, недополовой мужчина
14. Cisgender Woman - предполовая женщина, недополовая женщина
15. Female to Male - от женского к мужскому
16. FTM - женщина, хирургически, внешне, принявшая облик мужчины
17. Gender Fluid - неустойчивый, «текучий»
18. Gender Nonconforming - отрицающий традиционную классификацию
19. Gender Questioning - пол, остающийся под вопросом
20. Gender Variant - пол, допускающий несколько вариантов
21. Genderqueer - свой особенный, своеобычный
22. Intersex - межполовой
23. Male to Female - от мужчины к женщине
24. MTF - мужчина, хирургически, внешне, принявший облик женщины
25. Neither - ни тот, ни другой (из двух традиционных)
26. Neutrois - стремящиеся устранить половые признаки во внешнем виде
27. Non-binary - отрицающий систему двух полов
28. Other - другое
29. Pangender - всеобщеполовой
30. Trans - переходной к другому полу
31. Trans Female - переходной к женскому половому состоянию
32. Trans Male - переходной к мужскому половому состоянию
33. Trans Man - переходной к мужчине
34. Trans Person - переходной к лицу, вне половой классификации
35. Trans Woman - переходной к женщине
36. Trans(asterisk) - переходной к другому полу (* - с сохранением тайны)
37. Trans(asterisk)Female - переходной к женскому половому состоянию (*)
38. Trans(asterisk)Male - переходной к мужскому половому состоянию(*)
39. Trans(asterisk)Man - переходной к мужчине(*)
40. Trans(asterisk)Person - переходной к лицу, вне половой классификации(*)
41. Trans(asterisk)Woman - переходной к женщине(*)
42. Transexual - транссексуальный
43. Transexual Female - женский траннсексуальный
44. Transexual Male - мужской транссексуальный
45. Transexual Man - мужчина транссексуал
46. Transexual Person - лицо траннсексуал
47. Transexual Woman - женщина транссексуал
48. Transgender Female
49. Transgender Male
50. Transgender Man
51. Transgender Person
52. Transgender Woman
53. Transmasculine - «за пределами мужского» (фантазии на тему мужского пола)
54. Two-spirit - две души, «двудушный» (без негативной коннотации)
Будем надеяться, что остальные 48 полов будут представлены другими странами...