metaclass: (Default)
[personal profile] metaclass
Очередной раз уткнулся на работе в безумие.
Безумие заключается в том, что теоретически правильные методики работы приводят к разрастанию непонятного кода.
Теоретическая правильность заключается в DRY. Т.е. куски кода и данных, являющиеся отражением одних и тех же сущностей или потоков данных предметной области выносятся в отдельные модули, обобщаются, делаются универсальными и прочее.
Причем тут именно что не натягивание совы на глобус, когда "похожие" функции и данные насильственно обобщаются, а только те, где написание двух раздельных заведомо приведет к необходимости синхронной правки двух и более разных мест кода.

А возникающая непонятность - это то, что в результате один конечный результат работы зависит от десятков модулей, в каждом из которых функции высшего порядка посылают другие функции третим функциям, возвращающим функции, которые обрабатывают списки функций.
Это условно говоря, на практике там ничего сложнее "передать функцию-конвертор и параметры в обобщенную функцию и получить результат" нету. В паре мест есть reduce внутри reduce для сложной группировки, все это занимает 10-20 строк кода и спокойно целиком вмещается на экран.
Подобные вещи для меня являются достаточно простыми и самоочевидными. Даже в чужом коде (нормально написанном) понятно, как с таким работать: открываешь самую верхнюю функцию и начинаешь от нее идти по дереву вызовов, постепенно отсекая неинтересные ветки, пока не доберешься до нужной. Это даже в крестиках-жабах-дотнетах-питонах просто, а в функциональных языках с их лаконичностью и того проще.

А проблема в том, что потом это нужно объяснить коллегам. И тут начинается какая-то знатная хрень, потому что я объяснить не могу.
Для меня очевидно, что map/filter/reduce - это как 2+2, обработка последовательностей, на которой вообще вся эта функциональщина стоит, и что структура данных определяет вызываемые для нее функции и что общие функции и данные нужно выносить в отдельные модули, а не писать каждый раз заново одно и тоже. Но процесс раскладывания в уме ТЗ на эти базовые блоки и обратной сборки конечного результата из блоков - объяснению не поддается.
Писать же код в "понятном стиле", в том смысле, чтобы минимизировать сложность за счет написания в лоб, без зависимостей, не выделять отдельные функции для удобства чтения - это, по моему, какой-то совсем уже бред.

Date: 2012-07-15 02:01 pm (UTC)
From: [identity profile] falcrum.livejournal.com
Если ты не можешь объяснить коллегам свой код - для твоего начальства это повод биться в истерике: завтра ты свалишь, и останется непонятное вуду.

Date: 2012-07-15 02:11 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Начальство пять лет игнорировало мои требования нанять хотя бы еще одного программиста.
Еще 2.5 года назад это можно было сделать нормально - т.е. взять обычного программиста на C#/Delphi/SQL, то сейчас уже все, поезд ушел - с непрерывно нарастающей рабочей нагрузкой я смог справиться, только используя сначала кодогенерацию на F#, затем DSL на Clojure.

Date: 2012-07-15 02:16 pm (UTC)
From: [identity profile] falcrum.livejournal.com
Ну, и... всё. Ситуация ничем не отличается от "ушёл и потёр за собой исходники". Нет связки "понимание предметной области + хотя бы знание, где что поправить". Для конторы - плохо, для тебя - хорошо, в общем-то. :)

Date: 2012-07-15 03:04 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Как раз с предметкой и мелкими правками вроде ок. Там все, что нужно править вынесено в явно подписанные файлы типа "ДанныеДокумента.clj" :)
Проблемы начинаются, когда надо придумать структуру нового документа, или разобраться, пригодна ли старая структура к повторному использованию, и вообще при изучении внутренностей.

Date: 2012-07-15 03:06 pm (UTC)
From: [identity profile] falcrum.livejournal.com
Ты понял, о чём я. Как только тебя перекупит Айсед, дети ребе Б начнут кушать картофельные очистки. :)

Date: 2012-07-15 03:21 pm (UTC)
From: [identity profile] aamonster.livejournal.com
Почему-то у меня "перекупит Айсед" однозначно воспринимается как "перекупит и пустит на органы", потому как готовность ребе Айседа признать пригодность отличных от него человеческих существ к какой-либо деятельности - ну никак в голове не укладывается.

Date: 2012-07-15 03:30 pm (UTC)
From: [identity profile] falcrum.livejournal.com
Ну, данный социопат :) (хотя он что-то такое уже и озвучивал) упомянут лишь в смысле "тот, кто даст в два раза больше денег". Но, вообще, то, что топикстартер начинает подобные проблемы обсуждать публично - уже вполне симптом.

Date: 2012-07-15 03:36 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Я их уже давно обсуждаю, в том числе и на работе. Проблема не решается, а меня потиху начинает бесить, что приходится объяснять элементарные вещи.

Date: 2012-07-15 03:47 pm (UTC)
From: [identity profile] aamonster.livejournal.com
Я подобные проблемы (про число грузовика == 1) на прошлой работе обсуждал несколько лет. Но таки когда жареный петух в задницу клюнул (пришло интересное предложение... в итоге, правда, устроился в третье место, и как раз примерно с удвоением зарплаты) - сумел за разумное время передать дела.

Date: 2012-07-15 09:22 pm (UTC)
From: [identity profile] mend0za.livejournal.com
В оффлайне он милый и вежливый. Особенно на работе. Там может и в еблет прилететь, не то что в жежешечке, воен и берсеркер.


Date: 2012-07-16 03:13 am (UTC)
From: [identity profile] nivanych.livejournal.com
Он же такой большой и толстый!
Кто на него полезет-то!
;-)

Date: 2012-07-16 08:12 am (UTC)
From: [identity profile] aamonster.livejournal.com
Сенсация дня! Айседа бьют по лицу на работе! :-D

Date: 2012-07-15 08:56 pm (UTC)
From: [identity profile] juan-gandhi.livejournal.com
А что, им кто-то должен, что ли?

Date: 2012-07-16 04:15 am (UTC)
From: [identity profile] falcrum.livejournal.com
Не понял вопроса?

Date: 2012-07-16 07:34 am (UTC)
From: [identity profile] juan-gandhi.livejournal.com
Ну, этой конторе. Человек работает, выполняет поставленную задачу, решает проблемы. Или он им ещё обязан создать условия, когда его можно выгнать и заменить двумя студентами? А если они будут так же действовать - создавать условия замены их на двух девочек?

Date: 2012-07-16 07:35 am (UTC)
From: [identity profile] falcrum.livejournal.com
"Этот человек" озвучивал, что на конторе трудится не чисто программистом, а в ранге замдиректора, если ничего не путаю. Так что это должны быть и его проблемы, нет?

Date: 2012-07-16 07:45 am (UTC)
From: [identity profile] metaclass.livejournal.com
Это мои проблемы были еще до того, как меня официально назначили зам-директора. Реализуются не все потенциальные проекты, из-за нехватки рабочей силы. Или реализуются с задержкой.

Date: 2012-07-16 08:38 am (UTC)
From: [identity profile] juan-gandhi.livejournal.com
А, я не в курсе.
Ну может быть.

Date: 2012-07-15 02:52 pm (UTC)
From: [identity profile] guamoka.livejournal.com
А проблема в том, что потом это нужно объяснить коллегам. И тут начинается какая-то знатная хрень, потому что я объяснить не могу.

Вообще, имхо, даже безотносительно к фп, у народа явные заструднения с пониманием того, что структура рождается из функционального предназначения. Что при любой парадигме пограммирования сначала идет FA, a уже потом всяческие SA. Говоришь вроде самоочивидные вещи, а на тебя непонимающими глазенками хлопают и опяь за старое, а что если сделать так, а можно сделать так. Да, так а что вы делать-то собрались? Для чего это предназначено, какие функции выполнять будет? А в ответ- хлоп-хлоп.

Date: 2012-07-15 02:58 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Да, вот это плясание от печки очень сложно кому-либо объяснить. Все сразу проскакивают кучу этапов и начинают пытаться что-то кодировать.

Date: 2012-07-15 06:06 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Если объяснять сложно, то абстракции слишком искусственны или слишком низкого уровня. Или имена надо было давать другие

Date: 2012-07-15 06:25 pm (UTC)
From: [identity profile] blackyblack.livejournal.com
Методика работы правильная, но не совсем. Вынесение в отдельные модули, общие данные и фнкции должно быть не только обусловлено избежанием дублирования кода, но и логически обосновано. То есть должно иметь внятное имя и описание, понятную абстракцию. В случае сильно функционального подхода допустимы ссылки на соответствующий матан.
Если у вас разделение на функции нелогично - тушите свет.

Date: 2012-07-16 02:28 pm (UTC)
From: [identity profile] thinker8086.livejournal.com
Тут есть момент - у автора ПРИНЦИПИАЛЬНЫЙ момент, когда необходимость синхронно править код в двух местах - это большой головняк, потому что забудут 100%, и получится жопа. Опердени же.

Отсюда и попытка писать общие модули/обработки везде, где они хотя бы немного общие.

Date: 2012-07-15 07:05 pm (UTC)
From: [identity profile] osdm.livejournal.com
Вам всего-навсего нужно сменить работу на такое место, где коллеги будут вашего уровня и смогут сами разобраться в том, что вы там понаваяли.

Date: 2012-07-15 08:36 pm (UTC)

Date: 2012-07-15 07:13 pm (UTC)
From: [identity profile] veremeenko-alex.livejournal.com
Нанимать уже надо 2-3 программистов, чтобы они работали с твоим кодом, вникали в него, вникали в прктики и идеи, делились знаниями с друг другом.

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

Date: 2012-07-15 07:16 pm (UTC)
From: [identity profile] berezovsky.livejournal.com
самоубийцы

Date: 2012-07-15 07:17 pm (UTC)
From: [identity profile] alexandr0.livejournal.com
Пора заменить коллег.

Date: 2012-07-15 07:24 pm (UTC)
From: [identity profile] besm6.livejournal.com
На первом курсе я услышал от своего лектора фразу "Понятие группы естественно, как дыхание". Осознал я ее лет через 6, и полагаю, что вследствие этой естественности он и сам не мог объяснить это понятие нам, которым оно еще не было так естественно. То есть нас можно было научить формально с ним оперировать, а чувствовать, что тут вот будет вот такое (не вполне тривиальное) поведение, потому что вот это вот - группа, мы еще очень долго не могли.

Date: 2012-07-16 02:28 pm (UTC)
From: [identity profile] thinker8086.livejournal.com
>> вследствие этой естественности он и сам не мог объяснить это понятие нам,

Таки да, плюсую.

Date: 2012-07-16 07:15 pm (UTC)
From: [identity profile] os80.livejournal.com
>вот будет вот такое (не вполне тривиальное) поведение, потому что вот это вот - группа
А такое вообще бывает? Можно примеры?

Date: 2012-07-17 06:53 am (UTC)
From: [identity profile] besm6.livejournal.com
Вообще бывает, но сейчас вот примеры что-то в голову не приходят. Математикой я не занимаюсь уже довольно давно, а в функциональное программирование понятие группы запихивается плохо из-за, в общем случае, высокой сложности поиска обратного элемента. Полугруппа есть, но это слишком слабая абстракция для того, чтобы иметь действительно нетривиальные свойства.

В моей практике интересные случаи c "потому что группа" сводились в основном к факторизации. Вся линейная алгебра, кстати, построена на "потому что группа", правда, там связка из нескольких групп, часть из которых абелевы.

Date: 2012-07-15 08:52 pm (UTC)
From: [identity profile] juan-gandhi.livejournal.com
Я бы dry перевёл в более душевную форму. Нужно вводить абстракции, и действовать на максимально абстрактном уровне.

И коллег подбирать способных к абстракции.

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

Date: 2012-07-16 03:17 am (UTC)
From: [identity profile] nivanych.livejournal.com
Ну так тут, в этой части, чуть не противоположное.
"Теорию категорий вспоминать не нужно" —
metaclass.livejournal.com/710583.html

Date: 2012-07-16 01:21 am (UTC)
From: [identity profile] smalgin.livejournal.com
Ну поддается же процесс дизайна SQL DB какому-то объяснению. Можно framework и для определения блоков набросать как-то.

Если же объяснять map/filter/reduce людям безграмотным, то я бы, пожалуй, только через linq смог бы :)

Такое чувство, что им нужен ликбез, но фирма ликбез не спонсирует, если я правильно понял.

Date: 2012-07-16 09:19 am (UTC)
From: [identity profile] victor bolshakov (from livejournal.com)
Мне вот интересно, много ли людей осознают модель данных, с которыми они работают, глубже чем "это перемножить с этим а результаты просуммировать"?

Date: 2012-07-16 02:31 pm (UTC)
From: [identity profile] thinker8086.livejournal.com
>> Для меня очевидно, что map/filter/reduce - это как 2+2, обработка последовательностей, на которой вообще вся эта функциональщина стоит

А вот это кстати хитрый момент, 100% согласен, что на этом функциональщина стоит, но сам так думать не умею. Более высокий уровень абстракции, так думать ещё научить надо.

В идеале - ещё в универе на модельных задачах, но тут Вы понимаете...

UPD: Это я всё к тому, что дело не в допустимой сложности (который для меня, скажем, связан с количеством объектов, которыми надо одновременно оперировать), а в допустимом для индивида уровне абстракции.
Edited Date: 2012-07-16 02:36 pm (UTC)

Date: 2012-07-16 07:20 pm (UTC)
From: [identity profile] os80.livejournal.com
По-моему, в таких случаях помогает написать статью "для внутреннего пользования".

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 19th, 2025 10:01 am
Powered by Dreamwidth Studios