Re: Это сеньорский код?
От: DiPaolo Россия  
Дата: 21.12.21 04:56
Оценка: 21 (4) +5
SA>Все довольно просто, никакого рокетсайенс.
SA>Реализация
SA>https://github.com/d3/d3-scale/blob/9fe496e6d708bf30435c15f03ab9e5ae994ea7be/src/continuous.js

Именно этот код — да, крутого сеньора или даже выше. Для этого надо пойти посмотреть на весь файл целиком, а также понять контекст проекта. А суть там такая: это специальная узкоспециализированная либа-числодробилка (с поправкой на JS). Да, есть ряд областей, где важен именно такой "суровый" код. Человеку со стороны покажется какой-то херней, но человеку в теме все будет понятно. Ну или, при необходимости, новый человек, взявший на поддержку, сможет через какое-то время разобраться.

Тут надо вот что отметить:
— код всего файла выполнен в одном стиле; аккуратный, небольшой по размеру; есть комментарии
— при этом важно: код изменялся буквально 4 раза за 5 лет (https://github.com/d3/d3-scale/commits/9fe496e6d708bf30435c15f03ab9e5ae994ea7be/src/continuous.js); то еть это как раз код из разряда "кака-то базовая хрень, которую написал один раз и крайне редко туда лезешь"
— ко всем проекту есть развернутое ридми с комментариями, туториалами, примерами. Крайне все понятно. НЕ каждый сеньор сможет такое оформить. К вопросу о сеньорстве
— если взглянуть на профиль чувака — он, блин, создал d3 и куча либ вокруг. Думаю многие фронтендеры встречались с этой либой. Крайне популярная и известная штука. То есть он не только код может писать, но и: сопровождать его описанием, документацией, настраивать CI, всю инфраструктуру обвязку, а также находить и координировать людей вокруг этого.

В коде по перекладыванию JSON в базу и обратно, там да — такой код плохо бы смотрелся. Но важен контекст проекта. Для примера: есть еще ряд областей, где код пишут в стиле, чтобы было быстрее или короче текст. Кому надо — поймет. И ничего в этом страшного нет. Пишут такой код вполне себе крутые спецы. Вот например:

static ALWAYS_INLINE void deblock_edge_luma_c( pixel *pix, intptr_t xstride, int alpha, int beta, int8_t tc0 )
{
    int p2 = pix[-3*xstride];
    int p1 = pix[-2*xstride];
    int p0 = pix[-1*xstride];
    int q0 = pix[ 0*xstride];
    int q1 = pix[ 1*xstride];
    int q2 = pix[ 2*xstride];

    if( abs( p0 - q0 ) < alpha && abs( p1 - p0 ) < beta && abs( q1 - q0 ) < beta )
    {
        int tc = tc0;
        int delta;
        if( abs( p2 - p0 ) < beta )
        {
            if( tc0 )
                pix[-2*xstride] = p1 + x264_clip3( (( p2 + ((p0 + q0 + 1) >> 1)) >> 1) - p1, -tc0, tc0 );
            tc++;
        }
        if( abs( q2 - q0 ) < beta )
        {
            if( tc0 )
                pix[ 1*xstride] = q1 + x264_clip3( (( q2 + ((p0 + q0 + 1) >> 1)) >> 1) - q1, -tc0, tc0 );
            tc++;
        }

        delta = x264_clip3( (((q0 - p0 ) * 4) + (p1 - q1) + 4) >> 3, -tc, tc );
        pix[-1*xstride] = x264_clip_pixel( p0 + delta );    /* p0' */
        pix[ 0*xstride] = x264_clip_pixel( q0 - delta );    /* q0' */
    }
}


Вполне аккуратный хороший код. Да, человеку, который впервые его видит и ваще не в теме, будет ничего непонятно. Но ему и не править этот код. А при необходимости — разберется.

Более того, бывает вообще вот такой код:
;-----------------------------------------------------------------------------
; void add8x8_idct8( uint8_t *p_dst, int16_t dct[8][8] )
;-----------------------------------------------------------------------------
%macro ADD8x8_IDCT8 0
cglobal add8x8_idct8, 2,2,11
    add r0, 4*FDEC_STRIDE
    pxor m7, m7
    TAIL_CALL .skip_prologue, 0
cglobal_label .skip_prologue
    SWAP 7, 9
    movdqa  m0, [r1+0x00]
    movdqa  m1, [r1+0x10]
    movdqa  m2, [r1+0x20]
    movdqa  m3, [r1+0x30]
    movdqa  m4, [r1+0x40]
    movdqa  m5, [r1+0x50]
    movdqa  m6, [r1+0x60]
    movdqa  m7, [r1+0x70]
    IDCT8_1D      w,0,1,2,3,4,5,6,7,8,10
    TRANSPOSE8x8W 0,1,2,3,4,5,6,7,8
    paddw         m0, [pw_32] ; rounding for the >>6 at the end
    IDCT8_1D      w,0,1,2,3,4,5,6,7,8,10
    DIFFx2 m0, m1, m8, m9, [r0-4*FDEC_STRIDE], [r0-3*FDEC_STRIDE]
    DIFFx2 m2, m3, m8, m9, [r0-2*FDEC_STRIDE], [r0-1*FDEC_STRIDE]
    DIFFx2 m4, m5, m8, m9, [r0+0*FDEC_STRIDE], [r0+1*FDEC_STRIDE]
    DIFFx2 m6, m7, m8, m9, [r0+2*FDEC_STRIDE], [r0+3*FDEC_STRIDE]
    STORE_IDCT m1, m3, m5, m7
    ret
%endmacro ; ADD8x8_IDCT8


Тоже пишут, поддерживают и работают с ним весьма неглупые люди. Просто тут контекст другой: числодробительный код, для поддержки которого надо глубже понимать тематику.
Патриот здравого смысла
Re[2]: Это сеньорский код?
От: CreatorCray  
Дата: 21.12.21 07:40
Оценка: 19 (2) +5
Здравствуйте, DiPaolo, Вы писали:

DP>Именно этот код — да, крутого сеньора или даже выше.

Люди с опытом стараются писать просто, тут же местами налеплено в кучу.
Если приходится писать сложно то пишут коммент, что за нафиг и почему так.
По коммитам кстати видно что написано было изначально более просто и наглядно, это потом уже автор "улучшил".
Впрочем да, на фоне другого js что я видел этот довольно таки чистый.

DP>- код всего файла выполнен в одном стиле;

Да? А почему функция bimap в одном стиле, под ней polymap — в другом?

DP>есть комментарии

Ровно один
В других файлах вообще никаких нету.

DP> при этом важно: код изменялся буквально 4 раза за 5 лет

Да вроде как больше раз менялся: https://github.com/d3/d3-scale/commits/main/src/continuous.js

DP>Пишут такой код вполне себе крутые спецы. Вот например:

Круглые скобки странновато расставляет но в целом ок.

DP>Более того, бывает вообще вот такой код:

А вот этому не помешает нормальное оформление

DP>Просто тут контекст другой: числодробительный код, для поддержки которого надо глубже понимать тематику.

Это всё лирика.
Но вот для куска, который привёл ТС, было бы неплохо хотя бы написать комментарий WTF там и зачем.
Ну или разбить это всё на несколько строк, ибо много сущностей в одной строке ухудшают читаемость кода.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[2]: Это сеньорский код?
От: Pavel Dvorkin Россия  
Дата: 21.12.21 11:00
Оценка: 5 (1) +5
Здравствуйте, DiPaolo, Вы писали:

DP>Именно этот код — да, крутого сеньора или даже выше. Для этого надо пойти посмотреть на весь файл целиком, а также понять контекст проекта. А суть там такая: это специальная узкоспециализированная либа-числодробилка (с поправкой на JS). Да, есть ряд областей, где важен именно такой "суровый" код. Человеку со стороны покажется какой-то херней, но человеку в теме все будет понятно. Ну или, при необходимости, новый человек, взявший на поддержку, сможет через какое-то время разобраться.


Совершенно согласен. Просто этот код не для тех, кто привык писать бизнес-приложения, и не им о нем судить. Там другие правила и требования.
With best regards
Pavel Dvorkin
Re: Это сеньорский код?
От: Osaka  
Дата: 20.12.21 20:10
Оценка: +2 :))) :)
SA>Попытки объяснить, что это нежелательно, про LSP, трехзвенку или SOLID также встречаются полным непониманием.
У тебя недостаточный ранг в стае, чтобы спорить с самим Сеньором. Поэтому все твои наукообразные слова — наглые необоснованные претензии на более высокий ранг, чем тебе разрешили, и ничего более.
SA>Люди эти все, конечно, тимлиды и сеньоры, или даже сеньоры всех сеньоров. По происхождению, конечно, из html-программистов, тестировщиков и прочих активных пользователей хабра типа войтивайти. Возможно эти все части паззла как-то связаны.
SA>Что скажет общество?
SA>Как по вашему мнению, такая ситуация в сфере разработки ПО теперь нормальна?
SA>Или это только во фронтенде?
Это в любой кастовой системе. "Сначала поделай как у сеньоров 'принято', и заслужи". (Если засчитают )
Отредактировано 22.12.2021 12:36 Osaka . Предыдущая версия .
Re[5]: оцените код
От: RonWilson Россия  
Дата: 23.12.21 09:53
Оценка: 24 (2) +2
Здравствуйте, kaa.python, Вы писали:

KP>Потому что оно приносит деньги сейчас. То что его нельзя менять и развивать... это не такая большая проблема пока платят. Не так давно была забавная история о том, как одно небольшое изменение в оракловой базе легко занимает квартал с объяснением почему.


Она?
Re[7]: а как Вам такой кусочек кода ?
От: Pavel Dvorkin Россия  
Дата: 27.12.21 06:48
Оценка: 6 (2) +2
Здравствуйте, CreatorCray, Вы писали:

CC>Машине всё равно. Код рефакторится для понимания его человеком.


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

CC>Однобуквенные переменные ОК если это очевидный индекс в каком нить не очень большом и локальном цикле.


А также если это математический или физический расчет и есть общепринятые обозначения


double x = -p/2 + sqrt(p*p/4 - q)


лучше чем что-то иное.

PD>> Ну а в том примере, что такое s, x и m — мне так не очень понятно.

CC>Ну т.е. ты в итоге со мной согласился что "Имена надо давать внятные"

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

https://github.com/veximtokora/WR_JacobiEigen/blob/master/WR_Jacobi_Eigen.cpp

Несомненно, тут можно претензии предъявить к коду, да и вообще это перевод с Алгола алгоритма из книги, которой я пользовался еще в молодости.
Да, можно код причесать. Но никакой заменой имен этот код понятнее не сделать — для этого надо хорошо понимать сам алгоритм.
Более того. Книги этой у меня под рукой нет, проверить не могу, но скорее всего описание алгоритма там дано с использованием этих u,v,d,b,z. И гораздо лучше, если они в программе и используются — читающему не хватает только в голове держать map от имен в книге на имена в программе

Так что опять же — в разных случаях разные требования.

Мое мнение — ты взял, в общем-то, вполне разумное требование к коду : код должен быть понятным. Я и не спорю с этим. Разница между нашими точками зрения в том, что для тебя эта максима, нарушение которой никогда не возможно и ведет в геенну огненную. Для меня это лишь одно из требований к коду, которое может быть первоприоритетным, если нет других, более существенных в данном случае требований.
With best regards
Pavel Dvorkin
Re: Это сеньорский код?
От: Пофигист Россия  
Дата: 21.12.21 06:03
Оценка: :))) :)
Здравствуйте, StandAlone, Вы писали:

SA>
SA>function scale(x) {
SA>    return (output || (output = piecewise(domain.map(transform), range, interpolate)))(+transform(clamp(x)));
SA>  }

SA>  scale.invert = function(y) {
SA>    return clamp(+transform.invert((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));
SA>  };
SA>

И что не так? Шикарный код, нифига непонятно. Сразу ясно, что писал крутой спец.
Подытожим
От: CreatorCray  
Дата: 22.12.21 01:09
Оценка: +1 :)))
https://coub.com/view/2wpfed
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[5]: Это сеньорский код?
От: StandAlone  
Дата: 21.12.21 23:59
Оценка: 14 (2) +1
Здравствуйте, CreatorCray, Вы писали:

CC>return clamp (+transform.invert (input, y))

CC>[/code]

Почти, но нет.
clamp (+transform.invert (input ( y))

input — это локальная переменная, хранящая в себе указатель на анонимную функцию в биндинг контексте функции-хоста. Это реализация хранения состояния сущности максимально ублюдочным и криворуким способом из всех, допустимых JS, через анонимные замыкания, с кучей возможных побочных эффектов и полной невозможностью отладки.
За + же надо долго и старательно бить ногами. Когда тут пишут про "попытки оптимизации" через +, безусловно создающий новый объект типа number независимо от необходимости в этом, и без всякой обработки ошибок — мне становится плохо от смеха.

CC>Его чтоб прочесть надо либо сначала переформатировать либо читать в редакторе с подсветкой пар скобок.


Для отладки этого и аналогичного говна его, натурально, приходится сперва переписывать. А потом бороться с желанием ткнуть аффтора мордой в результат... .
Re[6]: оцените код
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 23.12.21 10:47
Оценка: 12 (1) +2
Здравствуйте, RonWilson, Вы писали:

KP>>Потому что оно приносит деньги сейчас. То что его нельзя менять и развивать... это не такая большая проблема пока платят. Не так давно была забавная история о том, как одно небольшое изменение в оракловой базе легко занимает квартал с объяснением почему.


RW>Она?


Да-да-да! Но это же реально трэш!
Re[11]: оцените код
От: Stanislav V. Zudin Россия  
Дата: 24.12.21 05:35
Оценка: 12 (1) +2
Здравствуйте, CreatorCray, Вы писали:

SVZ>>И где так делают?

CC>Везде, где есть настоящие seniors, по полученному опыту а не жопочасам.
CC>Которые говнокод в production просто не пускают изначально.

Я бы с удовольствием взглянул на образцы промышленного кода настоящих seniors.
Желательно, что-нибудь вычислительное, а не чтение атрибутов из ORM
_____________________
С уважением,
Stanislav V. Zudin
Re[6]: Это сеньорский код?
От: Pavel Dvorkin Россия  
Дата: 22.12.21 11:24
Оценка: 5 (1) +1 -1
Здравствуйте, CreatorCray, Вы писали:

PD>>Лепить в одну строку, может, и не стоило бы, хотя ИМХО от разбития этой строки на части мало что бы изменилось.

CC>Понятность кода бы улучшилась.

PD>>Возьми любую реализацию серьезного математического алгоритма. Код, конечно, понятный, если это хорошая реализация, но обеспечить понятность кода — это не самая главная задача для автора.

CC>Что именно в этой строке такое важное для производительности что нельзя было написать в более понятном виде?

Не получилось, видимо, у меня объяснить. Попробую еще раз.

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

Дело в акцентах, в тех приоритетах, которые важны при той или иной разработке.

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

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

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

Нужно ли потом отрефакторить и привести к более читаемому виду? It depends. Зависит от того, что с этим кодом потом будут делать. Вполне возможно (и похоже, что так и было в случае ТС), что автор вообще не предполагал возможной модификации этого кода кем бы то ни было, кроме самим собой. Это может показаться странным, но такое бывает, и в таком проекте я участвовал. Единственное требование, которое мне было в нем поставлено — максимальная производительность. Ради этого разрешались любые отступления от любых канонов. А модифицировать этот код предстояло мне самому, до тех пор, пока он вообще не будет выброшен и заменен новым. Скажешь — такое не бывает ? Бывает

В общем, есть задачи и задачи, и приоритеты бывают разные.
With best regards
Pavel Dvorkin
Re: Это сеньорский код?
От: Умака Кумакаки Ниоткуда  
Дата: 21.12.21 03:45
Оценка: +1 :))
Здравствуйте, StandAlone, Вы писали:


SA>Реализация

SA>https://github.com/d3/d3-scale/blob/9fe496e6d708bf30435c15f03ab9e5ae994ea7be/src/continuous.js

SA>[php]

SA>function scale(x) {
SA> return (output || (output = piecewise(domain.map(transform), range, interpolate)))(+transform(clamp(x)));
SA> }

я дико извиняюсь, но что не так с этим кодом? Ну, т.е. какой фрагмент конкретно непонятен и вызывает затруднение?
нормально делай — нормально будет
Re[2]: Это сеньорский код?
От: Умака Кумакаки Ниоткуда  
Дата: 21.12.21 15:20
Оценка: +2 -1
Здравствуйте, Ватакуси, Вы писали:

а с этим кодом что не так? ну т.е. он абсолютно читаем, да, написан слегка небрежно, да, можно (нужно) его разбить на пару подфункций, использовать async/await вместо явных промисов, но в треде что-то похоже компания совсем непуганых собралась. Вот когда вам реально достанется код, а-ля inverse sqrt или генерённый код с кучей goto и ручными правками в нём, тогда у вас волосы на жёппе зашевелятся, а так, ну ужас, ну ужас-ужас, но не ужас-ужас-ужас же.
нормально делай — нормально будет
Re[6]: Это сеньорский код?
От: Умака Кумакаки Ниоткуда  
Дата: 22.12.21 04:13
Оценка: -1 :))
Здравствуйте, CreatorCray, Вы писали:

CC>Что именно в этой строке такое важное для производительности что нельзя было написать в более понятном виде?


он не настолько непонятный, чтобы из функционального стиля код преобразовывать в императивный.
нормально делай — нормально будет
Re[7]: Это сеньорский код?
От: so5team https://stiffstream.com
Дата: 22.12.21 12:36
Оценка: +3
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>И если на этом этапе ко мне придут и скажут, что у меня не в порядке отступы и табы, длинные строки и т.п. — я их и слушать не буду, более того, буду, наверное, довольно резок. Мне просто не до этого, у меня совсем другие проблемы.


А тут не нужно думать. Еще на стадии обучения программированию на подкорке должно были быть выбиты навыки выбора внятных идентификаторов и аккуратного написания кода.

Вы когда сильно голодны про вилку с ложкой забываете и все поглощаете исключительно с помощью рук? Или все-таки приобретенные в детстве навыки позволяют вам использовать столовые приборы?
Re[12]: оцените код
От: CreatorCray  
Дата: 23.12.21 06:01
Оценка: +3
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Мсье, а что ты к этой строке прицепился?

Ну дык тема то про неё и началась

PD> Ну написал бы он ее в 3 строчки (больше там взять неоткуда) — ты был бы доволен?

Как уже говорилось — было бы лучше.
Впрочем тут знатоки js там ещё нашли проблем.

PD>Да какая там точка невозврата пройдена! Этот код был написан, скорее всего, изначально таким

Его писали дофига лет ващета.

PD>На тебе еще один симпатичный кусок кода.

"кск гвн" (С)

PD>Мне тут особенно нравится "+ (2-128)"

Это гораздо лучше чем "-126", ибо так хоть чуток понятнее что за магическая константа.
Впрочем константы надо было делать именованными

PD>http://download.osgeo.org/libtiff/

libpdf точно так же уродски написан.
Как и большинство "libXXX", включая png, jpg, итп
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Это сеньорский код?
От: StandAlone  
Дата: 20.12.21 19:36
Оценка: 9 (1) -1
Возможно, тема для КСВ, если да прошу перенести.
Для начала создам здесь.
Недавно возникло некоторое недопонимание во взаимодействии на проекте. Код естественно под НДА, поэтому показываю очень близкий по стилю и смыслу.

Описание задачи:

Scales are a convenient abstraction for a fundamental task in visualization: mapping a dimension of abstract data to a visual representation. Although most often used for position-encoding quantitative data, such as mapping a measurement in meters to a position in pixels for dots in a scatterplot, scales can represent virtually any visual encoding, such as diverging colors, stroke widths, or symbol size. Scales can also be used with virtually any type of data, such as named categorical data or discrete data that requires sensible breaks.

For continuous quantitative data, you typically want a linear scale. (For time series data, a time scale.) If the distribution calls for it, consider transforming data using a power or log scale. A quantize scale may aid differentiation by rounding continuous data to a fixed set of discrete values; similarly, a quantile scale computes quantiles from a sample population, and a threshold scale allows you to specify arbitrary breaks in continuous data.

For discrete ordinal (ordered) or categorical (unordered) data, an ordinal scale specifies an explicit mapping from a set of data values to a corresponding set of visual attributes (such as colors). The related band and point scales are useful for position-encoding ordinal data, such as bars in a bar chart or dots in an categorical scatterplot.

Все довольно просто, никакого рокетсайенс.
Реализация
https://github.com/d3/d3-scale/blob/9fe496e6d708bf30435c15f03ab9e5ae994ea7be/src/continuous.js

function scale(x) {
    return (output || (output = piecewise(domain.map(transform), range, interpolate)))(+transform(clamp(x)));
  }

  scale.invert = function(y) {
    return clamp(+transform.invert((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));
  };


Код достался мне на поддержку. Автор доступен, но по поводу своего творения не может сказать ни слова, кроме общих предположений.
Я попытался выяснить, как такое вообще попало в мастер, в ответ услышал — "Этот человек выше чем сеньор, в подробном ревью не нуждается".
"Сеньор всех сеньоров"(с)habr.
Моя точка зрения — написать в одну строку с кучей побочных эффектов способен любой не острый стажер, а вот решить сложное просто, понятно и поддерживаемо как раз способен только опытный разработчик. Встретил полное непонимание.
От людей, которые модифицировали внешние переменные в теле Array.some(), игнорируя результат, и меняли элементы массива в Array.forEach(). Они же в условном button1Click лезли в базу(диспатчили редаксовские экшены) или на сервак прямым Http запросом, в результате код презентационных компонент содержит по 3-4-5-10 тысяч строк кода в попытке охватить треть логики всего UI одним компонентом.
Попытки объяснить, что это нежелательно, про LSP, трехзвенку или SOLID также встречаются полным непониманием.
Люди эти все, конечно, тимлиды и сеньоры, или даже сеньоры всех сеньоров. По происхождению, конечно, из html-программистов, тестировщиков и прочих активных пользователей хабра типа войтивайти. Возможно эти все части паззла как-то связаны.
Что скажет общество?
Как по вашему мнению, такая ситуация в сфере разработки ПО теперь нормальна?
Или это только во фронтенде?
Re: Это сеньорский код?
От: 4058  
Дата: 21.12.21 11:07
Оценка: 9 (1) +1
Здравствуйте, StandAlone, Вы писали:

SA>Все довольно просто, никакого рокетсайенс.

SA>Реализация
SA>https://github.com/d3/d3-scale/blob/9fe496e6d708bf30435c15f03ab9e5ae994ea7be/src/continuous.js

SA>Код достался мне на поддержку. Автор доступен, но по поводу своего творения не может сказать ни слова, кроме общих предположений.


А как Вам такое:

The following code is the fast inverse square root implementation from Quake III Arena, stripped of C preprocessor directives, but including the exact original comment text


float Q_rsqrt( float number )
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y  = number;
    i  = * ( long * ) &y;                       // evil floating point bit level hacking
    i  = 0x5f3759df - ( i >> 1 );               // what the fuck? 
    y  = * ( float * ) &i;
    y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
//    y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed

    return y;
}


The algorithm was approximately four times faster than computing the square root with another method and calculating the reciprocal via floating-point division


Источник: https://en.wikipedia.org/wiki/Fast_inverse_square_root#Overview_of_the_code

Если честно, лень разбираться в кишках D3, но есть предположение, что автор занимается своего рода "битовыжиманием" на javascript (для которого язык совсем не предназначен), возможно у него ранее были более очевидные для восприятия реализации, но уступающие по производительности.
Re[2]: Это сеньорский код?
От: StandAlone  
Дата: 21.12.21 23:46
Оценка: 5 (1) +1
Здравствуйте, DiPaolo, Вы писали:

DP>Именно этот код — да, крутого сеньора или даже выше. Для этого надо пойти посмотреть на весь файл целиком, а также понять контекст проекта. А суть там такая: это специальная узкоспециализированная либа-числодробилка (с поправкой на JS).


Нет, Вы серьезно называете аффинное преобразование в целочисленной Римановской геометрии "узкоспециализированной числодробилкой"?

DP>Тут надо вот что отметить:

DP>- код всего файла выполнен в одном стиле; аккуратный, небольшой по размеру; есть комментарии

Действительно, целых две строки комментариев.

Насчет единого стиля и содержания, марксизма и диалектики аккуратности. Знаю, всем лень ходить по линкам, поэтому вот, братишки, я вам покушать принес.
function normalize(a, b) {
  return (b -= (a = +a))
      ? function(x) { return (x - a) / b; }
      : constant(b);
}

function bimap(domain, range, interpolate) {
  var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
  if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);
  else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);
  return function(x) { return r0(d0(x)); };
}


DP>- при этом важно: код изменялся буквально 4 раза за 5 лет (https://github.com/d3/d3-scale/commits/9fe496e6d708bf30435c15f03ab9e5ae994ea7be/src/continuous.js); то еть это как раз код из разряда "кака-то базовая хрень, которую написал один раз и крайне редко туда лезешь"


Правда, на этом модуле висит 19 открытых ишшуев и более 70 уже закрытых аффтаром с комментарием "пошлина, на текущем уровне развития науки невозможно" https://github.com/d3/d3-scale/issues
А так-то да,аккуратный, небольшой. Правда, можно же было вообще в одну строку написать все?
Это же и так, и сяк WRITE-only code. Ну, чукча же писатель, а не читатель... если Вы понимаете, о чем я.

DP>- ко всем проекту есть развернутое ридми с комментариями, туториалами, примерами.


Правда, если кому-то зачем-то нужно что-то на байт в сторону от ридми, то нихера не работает, а значит оно ему не надо. Сеньор же писал, сеньору виднее.

DP>Крайне все понятно. НЕ каждый сеньор сможет такое оформить. К вопросу о сеньорстве

DP>- если взглянуть на профиль чувака — он, блин, создал d3 и куча либ вокруг. Думаю многие фронтендеры встречались с этой либой. Крайне популярная и известная штука. То есть он не только код может писать, но и: сопровождать его описанием, документацией, настраивать CI, всю инфраструктуру обвязку, а также находить и координировать людей вокруг этого.

А еще он внезапно former @nyt. Как Вы полагаете, не связано ли это с тем, что "фронтендеры встречались с этой либой"? Против своего желания — поскольку некое узколобое существо прочло — "ООО, оно используется в САМОЙ NY TIMES!!!111адынадын. Берем немедля"? При этом у 99.999% этих ... не хватило квалификации даже поверхностно оценить качество кода внутри?

DP>Вполне аккуратный хороший код. Да, человеку, который впервые его видит и ваще не в теме, будет ничего непонятно. Но ему и не править этот код. А при необходимости — разберется.


Да-да. Для непрофессиональных разработчиков, всяких там математиков и прочих — сойдет.

DP>Более того, бывает вообще вот такой код:

DP>[asm]

Вот-вот. Этот самый D3 старательно превращен в некое подобие ASM. Без единой на то причины, поскольку примененные подходы серьезно ухудшили перфоманс, а не улучшили. Впрочем, чтобы понять мои слова, надо хотя бы не знать JS... Поэтому не старайтесь, все уже очевидно.
Re[12]: оцените код
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 24.12.21 10:10
Оценка: 4 (1) +1
Здравствуйте, Sharov, Вы писали:

S>А CI какой, Teamcity, например?


Jenkins поверх K9s кластера с кучей скриптов собственного производства. Выглядит довольно монструозно, особенно если для своего проекта надо что-то поменять при этом другим ничего не сломать, но пока держится
Re[5]: оцените код
От: Pavel Dvorkin Россия  
Дата: 22.12.21 14:04
Оценка: 3 (1) :)
Здравствуйте, kaa.python, Вы писали:

PD>>А вот почему не надо — можно поподробнее ? Почему его не отрефакторить как следует ? Чтобы понятно было


KP>Почему не надо трогать? Потому что а) оно или работает или все знают стандартный обходной путь, б) это говно может совершенно непредсказуемо себя вести и угадать что сломает малейшее изменение сложно, в) не факт что такое чудовище корректно покрыто тестами, т.к. оно скорее всего меняет внешние состояния (тот же lf_pin).


Совершенно верно. И по коду ТС то же самое.

PD>>Почему Oracle это не делает ?


KP>Потому что оно приносит деньги сейчас. То что его нельзя менять и развивать


Ну как сказать... Меняют, и порой не в лучшую строну. Правда, насчет ядра сервера я не в курсе, а вот в Java драйвере при переходе от 5.x к 8.x сделали ошибку при работе с датой. Я им даже баг-репорт на эту тему написал, ошибку признали и написали — мы решили переписать этот код. На мой наивный вопрос, нельзя ли этот фрагмент взять из старого кода, ответ был — ничего оттуда взять нельзя, там все настолько запутано, что никак не взять


PD>>И если на этом этапе ко мне придут и скажут, что у меня не в порядке отступы и табы, длинные строки и т.п. — я их и слушать не буду, более того, буду, наверное, довольно резок. Мне просто не до этого, у меня совсем другие проблемы. Мне задачу бы решить, а никак не получается, проблем выше крыши, а Вы мне про табы и длинные строки!


KP>В компании с современными процессами, такой код нельзя даже банально собрать на сборочном конвеере. CI его забракует еще до того как попытается собрать.


Какой там CI, какой там сборочный конвейер, какие там процессы! Я алгоритм придумать не могу, бьюсь над ним уже бог знает сколько времени, а результаты неудовлетворительные. А ты мне про CI.

Никак ты понять не хочешь, что бывают разные задачи.

Кстати, а как насчет этого кода MySQL ? В Oracle есть этот CI ? И как он его пропускает ?
With best regards
Pavel Dvorkin
Re[4]: Это сеньорский код?
От: StandAlone  
Дата: 23.12.21 14:43
Оценка: 2 (1) +1
Здравствуйте, Sharov, Вы писали:

S>Судя по коду это отголоски до сих пор не прошедшей моды на ФП -- хаскель, монады и вот это вот все.


Да ё-мое. Какое, аппликатив, ФП?
export default function continuous(transform = identity) {
  var domain = unit,
      range = unit,
      interpolate = interpolateValue,
      clamp = identity,
      piecewise,
      output,
      input;

  function rescale() {
    piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
    output = input = null;
    return scale;
  }

Я зря, что ли, вот это вот все помечаю тегом php?

S>Типа быть таким крутым замороченным спецом, которому ну никак нельзя сделать просто, а надо

S>сделать трушно, с множеством слов из мира ФП и теории типов.

Сделать просто — сложно. И требует напряжения интеллекта, декомпозиции, правильного нейминга, вот это вот все. Попробуйте любой свой код университетской-джуниорской эпохи почитать и поймете, о чем речь.
Об том и речь — аффтар этого говнокода воспользовался тем, что менеджеры тупо следуют моде и просто насрал как на читаемость, так и на качество. Там куча багов, поверьте, я в эти кишки не просто так когда-то лез. Отнюдь не для гадания. В конечном итоге дошло до рантайм патчей.
Re[3]: а как Вам такой кусочек кода ?
От: Pavel Dvorkin Россия  
Дата: 26.12.21 07:16
Оценка: 1 (1) +1
Здравствуйте, CreatorCray, Вы писали:

CC>Самую малость причесать (первый раз вижу чтоб A & ~B писали как A &~ B) и нормально.


Напиши автору

Но ты не ответил на вопрос. Код действительно понятен ? Вносить изменения будет легко ?
Или надо было его разбить на несколько функций, дать имена из 10-15 символов и сделать так, чтобы интуитивно были понятны все эти "++s &~ *++m" и т.п. ?
Я себе представляю, что бы тут завопили, если бы я представил код с несколькими однобуквенными именами и методом с именем ffz для бизнес-приложения. И правильно бы завопили.

Я все это к тому же самому — разный бывает код и разные задачи.
With best regards
Pavel Dvorkin
Отредактировано 26.12.2021 7:22 Pavel Dvorkin . Предыдущая версия .
Re[2]: Это сеньорский код?
От: bnk СССР http://unmanagedvisio.com/
Дата: 20.12.21 20:48
Оценка: +2
Здравствуйте, CreatorCray, Вы писали:

SA>>https://github.com/d3/d3-scale/blob/9fe496e6d708bf30435c15f03ab9e5ae994ea7be/src/continuous.js

SA>>
SA>>function scale(x) {
SA>> return (output || (output = piecewise(domain.map(transform), range, interpolate)))(+transform(clamp(x)));
SA>> }

CC>Вай какой дурдом!!!


И все же, это код вроде как от создателя небезызвестной D3 и кучи других известных штук?
IMHO такое не подходит для работы в команде, а если он его один видит, почему нет, если у него мозг так устроен
А может если ты привык к такому стилю, такое даже нормально читается и понимается.
Отредактировано 20.12.2021 20:52 bnk . Предыдущая версия . Еще …
Отредактировано 20.12.2021 20:51 bnk . Предыдущая версия .
Re[2]: Это сеньорский код?
От: StandAlone  
Дата: 20.12.21 23:13
Оценка: +1 :)
Здравствуйте, CreatorCray, Вы писали:

CC>Вай какой дурдом!!!


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

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

CC>Идиоты нынче лезут везде, увы.


Цель создания топика именно здесь была попытка выяснить обстановку по миру. У меня была идея, дескать все это может быть связано с оттоком специалистов, в итоге бизнес призвал под знамена всех способных держать клавиатуру хоть как-то выполнить хотелки кастомера.
Но вот смотрю медиум, стековерфлоу, реддит... Там в посвященных фронтенду разделах прослеживается подобное. В крупных FE OS репозиториях от крупнейших вендоров тоже.
Что происходит? Специалисты не пишут ни статей, ни заметок на SO, ни в репы опенсорс?
Или базовые принципы инженерного дизайна уже девальвировались и устарели?
Re[3]: Это сеньорский код?
От: CreatorCray  
Дата: 21.12.21 19:21
Оценка: +2
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Совершенно согласен. Просто этот код не для тех, кто привык писать бизнес-приложения, и не им о нем судить. Там другие правила и требования.


Какие другие правила и требования? Писать чистый код?
Какие такие особые требования заставляют тут лепить кучу кода в одну строку?
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[5]: Это сеньорский код?
От: Mystic Artifact  
Дата: 22.12.21 01:58
Оценка: +2
Здравствуйте, StandAlone, Вы писали:

SA>Я про нейминг, в котором clamp() это на самом деле boundaryLimits(), даже не заикаюсь. Это здесь наименьшее из прочих зол.

Это уже похоже на придирку. clamp есть практически везде исторически. Оно уже даже есть в CSS... А формулировка boundaryLimits() это что-то очень нестандартное. Хотя, вызов clamp без задания границ конечно вызывает вопросы.
Re[5]: Это сеньорский код?
От: CreatorCray  
Дата: 22.12.21 04:08
Оценка: +2
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Лепить в одну строку, может, и не стоило бы, хотя ИМХО от разбития этой строки на части мало что бы изменилось.

Понятность кода бы улучшилась.

PD>Возьми любую реализацию серьезного математического алгоритма. Код, конечно, понятный, если это хорошая реализация, но обеспечить понятность кода — это не самая главная задача для автора.

Что именно в этой строке такое важное для производительности что нельзя было написать в более понятном виде?
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[6]: оцените код
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 22.12.21 14:32
Оценка: +2
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Какой там CI, какой там сборочный конвейер, какие там процессы! Я алгоритм придумать не могу, бьюсь над ним уже бог знает сколько времени, а результаты неудовлетворительные. А ты мне про CI.


Я попробую упростить мысль. Исследовательскому коду "я алгоритм придумать не могу" не место в продукте. Автор поста обсуждает именно продуктовый код, пример из MySQL тоже продуктовый код. Ни в первом, ни во втором месте такого быть не должно. При этом у MySQL есть довольно веское оправдание для этого безобразия — в то время когда код был написан, такой код не считался говнокодом, т.к. инженерные практики еще толком не сложились. Писать сейчас так же — вот это уже плохой знак.
Re[6]: Это сеньорский код?
От: DiPaolo Россия  
Дата: 22.12.21 17:38
Оценка: +2
SA>>Я про нейминг, в котором clamp() это на самом деле boundaryLimits(), даже не заикаюсь. Это здесь наименьшее из прочих зол.

УК>с этого надо было и начинать. clamp это настолько типичный нейминг для этой мат.логики, что сразу выдаёт нулевой опыт у вас к компьютерной графике. отсюда и все проблемы.


Абсолютно согласен. В разработке, связанной с видео, повсеместно используется clamp(), и сразу понятно, о чем это. А вот boundaryLimits() ни разу не встречал. Такое бы как раз было непонятно.
Патриот здравого смысла
Re[9]: оцените код
От: Stanislav V. Zudin Россия  
Дата: 23.12.21 13:51
Оценка: +2
Здравствуйте, CreatorCray, Вы писали:

CC>Нет. По нормальному, как только исследовательский код начинает работать его либо итерационно рефакторят до production ready состояния, либо просто по мотивам пишут рядом новый, сразу нормально.


И где так делают?
В каких-нибудь сильно богатых Гуглах?

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

CC>Но вот если "я его слепила из того что было" как есть приклеивать к production — это надо сразу тапком.


Надо бы. Но!
Будешь переписывать — пользователи ждать не будут, уйдут к конкурентам и компания разорится
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: оцените код
От: StandAlone  
Дата: 23.12.21 15:00
Оценка: +2
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Ну и как ?


Попытки объяснить словами как-то, похоже, теряются в пустоте, попробую наглядно.

Ваш пример.


Работает? Работает! Ну, почти...если опрессовку не делать.

Как должно быть:


И то, и другое — сварочный шов, который выполняет функцию соединения деталей. Только первый делает это из рук вон плохо. Он не удерживает, а придерживает. И никакими размазываниями соплей по тарелке про высокие эмпиреи, алгоритмы и структуры зоны термического влияния и межкристаллитную коррозию, оправдать это дерьмо — невозможно. Поскольку это не работа профессионала, а чистый брак. Который впоследствии непременно приведет, и уже приводил, и приводит к материально-временным затратам неизвестного масштаба.
Это же, Рабинович, относится и к вашему вопросу(с).
Re[3]: оцените код
От: Pavel Dvorkin Россия  
Дата: 23.12.21 15:18
Оценка: +1 -1
Здравствуйте, StandAlone, Вы писали:

<skipped>

Я же не раз объяснял — разные требования применяются в разных ситуациях.

Если уж хочется наглядное сравнение, то пожалуйста

https://okru.ru/files/images/20210713/ibq586tkgqmr.jpg

https://zen.yandex.ru/media/eurowelder/kak-sdelat-hudojestvennye-shvy-ruchnoi-dugovoi-svarkoi-sekrety-talanlivogo-svarscika-aleksandra-zyrianova-5f6b620c108c12349df9fd7d

(Привел ссылку, а не картинку потому что она понятна только в контексте)

Второй вариант едва ли выдержит серьезные нагрузки. Вот только этого от него никто и не требует. И никакие "материально-временные затраты неизвестного масштаба" тут возникнуть не могут. Иная задача совсем.
With best regards
Pavel Dvorkin
Re[10]: оцените код
От: CreatorCray  
Дата: 23.12.21 22:12
Оценка: +1 :)
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>И где так делают?

Везде, где есть настоящие seniors, по полученному опыту а не жопочасам.
Которые говнокод в production просто не пускают изначально.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[6]: оцените код
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 23.12.21 14:04
Оценка: 10 (1)
Здравствуйте, Sharov, Вы писали:

S>Ух ты, метрики качества\сложности кода прикручены? Типа большая цикломатическая сложность или связанность?


Да, очень много чего автоматом проверяется еще до какого-либо ревью человеком. Проверяется форматирование, отсутствие дубликатов, статический анализ (несколько разных линтеров), несколько видов динамического анализа, ну и куча разных тестов. С именно что цикломатической сложностью в C++ всё плохо — всегда в коде может оказаться макрос и всё, беда, накрылась проверка. так что эта часть отключена. С цикломатической сложностью в C++ две крайности выходят, либо ты получаешь код где в одном случае функция из условных 10 линий считается нормальной, а а рядом функция на 9 линий уже много, либо ограничения такие большие, что от этой проверки фактически нет толку
Re[4]: Это сеньорский код?
От: StandAlone  
Дата: 21.12.21 23:47
Оценка: 5 (1)
Здравствуйте, bnk, Вы писали:

bnk>Чувак сделал работу за компилятор.

Какую? С моей точки зрения, он только усложнил работу интерпретатору.

bnk>Впрочем, вся D3 в стиле юниксовых команд 80-х, с дурацкими сокращениями типа x.classed() ака "class edit".


Я про нейминг, в котором clamp() это на самом деле boundaryLimits(), даже не заикаюсь. Это здесь наименьшее из прочих зол.
Re[4]: Это сеньорский код?
От: Pavel Dvorkin Россия  
Дата: 22.12.21 02:32
Оценка: 5 (1)
Здравствуйте, CreatorCray, Вы писали:

CC>Какие другие правила и требования? Писать чистый код?

CC>Какие такие особые требования заставляют тут лепить кучу кода в одну строку?

Лепить в одну строку, может, и не стоило бы, хотя ИМХО от разбития этой строки на части мало что бы изменилось.
Приоритеты тут другие.
Возьми любую реализацию серьезного математического алгоритма. Код, конечно, понятный, если это хорошая реализация, но обеспечить понятность кода — это не самая главная задача для автора.

Мне как-то довелось участвовать в одном проекте, и при постановке задачи я просто не знал, что делать. Речь шла о весьма специфической очистке картинки. Какой именно алгоритм тут окажется успешным — я не знал и знать не мог. Надо было пробовать, чем я и занимался. Когда, наконец, все это более или менее заработало, код я, конечно, слегка причесал перед тем, как отдать заказчику, но мне и в голову не приходило (и заказчик не требовал) переписывать его в соответствии с канонами чистого кода.
With best regards
Pavel Dvorkin
Re[2]: оцените код
От: so5team https://stiffstream.com
Дата: 22.12.21 12:42
Оценка: 5 (1)
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Ну и как ?


Редкостное Г. Неинициализированные переменные, явная потребность вынести содержимое do-while в отдельные функции, непонятно что спрятано за LF_BACKOFF, навороченное сочетание бесконечного цикла+переходы по goto+преждевременный возврат через return. Говнокод как он есть.

Да, в старых и давно работающих продуктов такого навалом. Хорошего в этом только ничего нет.
Re[4]: оцените код
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 22.12.21 12:52
Оценка: 5 (1)
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А вот почему не надо — можно поподробнее ? Почему его не отрефакторить как следует ? Чтобы понятно было


Почему не надо трогать? Потому что а) оно или работает или все знают стандартный обходной путь, б) это говно может совершенно непредсказуемо себя вести и угадать что сломает малейшее изменение сложно, в) не факт что такое чудовище корректно покрыто тестами, т.к. оно скорее всего меняет внешние состояния (тот же lf_pin).

PD>Почему Oracle это не делает ?


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

Кстати, про:

PD>И если на этом этапе ко мне придут и скажут, что у меня не в порядке отступы и табы, длинные строки и т.п. — я их и слушать не буду, более того, буду, наверное, довольно резок. Мне просто не до этого, у меня совсем другие проблемы. Мне задачу бы решить, а никак не получается, проблем выше крыши, а Вы мне про табы и длинные строки!


В компании с современными процессами, такой код нельзя даже банально собрать на сборочном конвеере. CI его забракует еще до того как попытается собрать.
Re[7]: оцените код
От: so5team https://stiffstream.com
Дата: 22.12.21 14:45
Оценка: 5 (1)
Здравствуйте, kaa.python, Вы писали:

KP>При этом у MySQL есть довольно веское оправдание для этого безобразия — в то время когда код был написан, такой код не считался говнокодом, т.к. инженерные практики еще толком не сложились.


Да ладно. Конечно, в 1995-ом не было TDD, юнит-тестов и CI, но такой код уже тогда считался говном.
Re[9]: оцените код
От: Pavel Dvorkin Россия  
Дата: 23.12.21 01:42
Оценка: 5 (1)
Здравствуйте, CreatorCray, Вы писали:

CC>Нет. По нормальному, как только исследовательский код начинает работать его либо итерационно рефакторят до production ready состояния, либо просто по мотивам пишут рядом новый, сразу нормально.


Сложный вопрос.
Нашел я вчера вечером у себя этот код, долго искал, забыл, куда засунул. 2010 год. Интересно было пссмотреть с позиций нынешнего времени.

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

Ну, например, основная часть оформлена в виде одной функции строк так на 200. Надо бы разделить, выделить ну и т.д.
Насчет структур данных можно было бы подумать заново. Хотя особо там не разойдешься — pure C.

Но вот тут какой нюанс.

Этот окончательный код — не первый в production, а где-то 4-5. До этого были другие версии, похуже. И я знал, что они не последние, и имел планы на улучшение, которые и реализовал потом.

Но это будет потом, а пока что надо код в production отправлять — ждать не будут, все равно это намного лучше, чем ничего.

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

Сейчас мне этот код ясен и понятен. Настолько ясен, что могу описать все его детали, не глядя на текст. Я на его разработку и отладку не один десяток часов потратил. И править мне лучше его, а не переделанный его вариант, к которому еще привыкнуть надо. Добро бы переделка по существу что-то меняла, а так ведь это косметика, по большому счету. А держать 2 версии — нет уж, увольте. Какую мне дорабатывать ? Старую ? И потом опять рефакторить ? Новую ? См. выше.

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

Да, после последней итерации я его слегка причесал. Но и только.

Подозреваю, что авторы MySQL кода руководствовались примерно теми же соображениями.
With best regards
Pavel Dvorkin
Re[8]: оцените код
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 23.12.21 14:28
Оценка: 5 (1)
Здравствуйте, Sharov, Вы писали:

S>А зачем все это на CI, если на уровне IDE многое можно выловить? Или это последний рубеж?


У нас нет какой-либо стандартной IDE, каждый как ему удобнее.

S>Ну с другой стороны человек может на предупреждения IDE забить, а результаты CI видны всем.

S>Скорее всего имеет смысл.

Многие тесты довольно тяжело запускать локально и они жрут прорву вычислительного времени. Тот же SonarQube не очень удобно стартовать локально по моим ощущениям. Ну и как еще быть уверенным что они реально были запущены перед коммитом? Плюс некоторые специфичные линтеры будут иметь сложности с лицензиями если за пределами CI. Куча проблем которые быстро и универсально решаются если все эти проверки часть CI. Локально же хватает предупреждений от ClangTidy, после него довольно редко что-то еще находится уже во время сборки на CI, хотя и бывает.
Re[10]: оцените код
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 23.12.21 23:58
Оценка: 5 (1)
Здравствуйте, Sharov, Вы писали:

S>Речь о предупреждения по итогу компиляции, зачем еще тесты запускать? Получил замечание от компилятора, линтеров,

S>исправил, и далее по кругу.

Оговорился, не тесты, а проверки статическими анализаторами. Локально ты правишь только то, что тебе говорят локально установленные анализаторы (ты волен ничего не устанавливать), а вот анализаторы как часть CI проверяют что код соответствует минимально допустимому уровню в компании. Короче, правильный CI должен быть
Re: Это сеньорский код?
От: #John Европа https://github.com/ichensky
Дата: 20.12.21 21:05
Оценка: 3 (1)
Здравствуйте, StandAlone, Вы писали:

SA>Как по вашему мнению, такая ситуация в сфере разработки ПО теперь нормальна?

Обычный код написанный без код-ревью, если пишешь скрипт который решит проблему тут и сейчас какая разница как он написан.
На проекте где налажено код-ревью такой код не пропустят.
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re[7]: оцените код
От: Pavel Dvorkin Россия  
Дата: 22.12.21 15:00
Оценка: 3 (1)
Здравствуйте, kaa.python, Вы писали:

KP>Я попробую упростить мысль. Исследовательскому коду "я алгоритм придумать не могу" не место в продукте. Автор поста обсуждает именно продуктовый код, пример из MySQL тоже продуктовый код. Ни в первом, ни во втором месте такого быть не должно. При этом у MySQL есть довольно веское оправдание для этого безобразия — в то время когда код был написан, такой код не считался говнокодом, т.к. инженерные практики еще толком не сложились. Писать сейчас так же — вот это уже плохой знак.


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

Ладно. Чтобы было понятнее, расскажу про задачу.

Есть фотографии конвертов. На конверте клеточки, а в них рукой написан числовой индекс. Этот индекс потом будет опознаваться соответствующим engine, это не моя проблема. Конверты не российские, стилизованных цифр там нет, пишут просто от руки.
Проблема в том, что эти клеточки мешают распознаванию.
Задача — клеточки убрать. Текст в клеточках не трогать. Все. Вся задача.
Ну казалось бы просто — найти линии и их удалить.
Если бы так...
Во-первых, пишут бог знает как и порой цифры пересекают линию. Начинаешь удалять линию — портишь цифры.
Во-вторых, сканер не всегда эти клеточки точно сканирует. Иногда от них только кусочки линий остаются, остального нет.
В третьих, хотя все эти линии должны быть горизонтальными или вертикальными, в реальности все это далеко не так. Не совсем аккуратно лег конверт — получите 10-15 градусов уклон.
В четверых, толщина линий различна, и на разных картинках, а порой и на одной.
В пятых, мусор тоже есть. Какие-то посторонние точки и линии, бог его знает, откуда они.

CI нет. Конвейера тоже нет. Тестов искусственных тоже нет.
Что есть — фотографии, несколько сот штук. Все.
Оценка будет производиться так. Запустят они мой код на всех этих картинках, потом визуально посмотрят, что получилось и скажут — вот тут хорошо, а вот тут нет, цифру испортил, не опознают потом ее.
Начинаю править код, чтобы цифры не портить — линии остаются.
Вот так и работал. Экспериментировал с поиском линий, с удалением мусора, подбирал параметры для известных алгоритмов, конструировал свой собственный для данного конкретного случая.

Надеяться тут на 100% успех — невозможно. А пока что то, что есть, надо отправлять в production, а мне улучшать дальше.
With best regards
Pavel Dvorkin
Re[9]: оцените код
От: Pavel Dvorkin Россия  
Дата: 23.12.21 02:06
Оценка: 1 (1)
Здравствуйте, kaa.python, Вы писали:


KP>Нет, так ни в коем случае делать не надо и в приличных компаниях так не делают. Тут есть только два приемлемых решения. 1) говнокодер-ученый учится писать код. Лучший вариант, у нас гора PhD в ML и robotics и они, внезапно, пишут отличный код промышленного качества. 2) если корона не позволяет ученому научиться программировать, то говнокод используется строго как концепт и выкидывается после окончания исследования.


Ответил в ответе CreatorCray, не буду повторяться

http://rsdn.org/forum/job/8160106.1
Автор: Pavel Dvorkin
Дата: 23.12.21


KP>Надеюсь что своих студентов вы несколько иначе учите тому как надо писать код, потому что от "уважительных причин" для говнокодинья волосы дыбом встают. Им же потом работу работать, уволят с испытательного срока


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

Что же касается их работы — пока вроде никто не жаловался и никого не уволили.
https://xn----7sbb1bdckl3bc1dyd.xn--p1ai/#rec351063040

А вот когда пару лет назад пришлось решать задачу, похожую на ту, что я описал — тут требования были те же. Найти алгоритм, который решает задачу. Увы, не нашли.
With best regards
Pavel Dvorkin
Отредактировано 23.12.2021 2:10 Pavel Dvorkin . Предыдущая версия .
Re: Это сеньорский код?
От: ononim  
Дата: 20.12.21 20:33
Оценка: :)

Когда-то жил мастер-программист, который писал неструктурированные программы. Ученик, пытаясь подражать ему, тоже стал писать неструктурированные программы. Когда ученик просил мастера оценить его труд, тот раскритиковал его за написание неструктурированных программ: "Что подходит мастеру, не подходит ученику. Ты должен постичь Дао, прежде чем переступить через структуру"

а вообще это же джаваскрипт, там так и надо
Как много веселых ребят, и все делают велосипед...
Re[3]: Это сеньорский код?
От: bnk СССР http://unmanagedvisio.com/
Дата: 21.12.21 09:13
Оценка: :)
Здравствуйте, CreatorCray, Вы писали:

DP>>Именно этот код — да, крутого сеньора или даже выше.


CC>Люди с опытом стараются писать просто, тут же местами налеплено в кучу.

CC>Если приходится писать сложно то пишут коммент, что за нафиг и почему так.
CC>По коммитам кстати видно что написано было изначально более просто и наглядно, это потом уже автор "улучшил".
CC>Впрочем да, на фоне другого js что я видел этот довольно таки чистый.

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

DP>>Просто тут контекст другой: числодробительный код, для поддержки которого надо глубже понимать тематику.

CC>Это всё лирика.
CC>Но вот для куска, который привёл ТС, было бы неплохо хотя бы написать комментарий WTF там и зачем.
CC>Ну или разбить это всё на несколько строк, ибо много сущностей в одной строке ухудшают читаемость кода.

Да чего тушеваться, код конкретно нечитаемый, невзирая на лица.
Если автор просидел на этой либе последние 10 лет, это его все равно не оправдывает, IMHO можно было более человечный код написать.

Впрочем, вся D3 в стиле юниксовых команд 80-х, с дурацкими сокращениями типа x.classed() ака "class edit".
Такой уж склад мышления у некоторых.
Отредактировано 21.12.2021 9:18 bnk . Предыдущая версия .
Re: Это сеньорский код?
От: sr_dev  
Дата: 21.12.21 11:48
Оценка: -1
Здравствуйте, StandAlone, Вы писали:

SA>Код достался мне на поддержку. Автор доступен, но по поводу своего творения не может сказать ни слова, кроме общих предположений.

SA>Я попытался выяснить, как такое вообще попало в мастер, в ответ услышал — "Этот человек выше чем сеньор, в подробном ревью не нуждается".

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

касательно "в подобном ревью не нуждается" — понимайте это как "у человека есть дела поинтереснее чем доказывать таким как вы что-то про эту одну строчку".

кстати говоря, объявить себя умником и охотником на идиотов — это лучший способ привлечь внимание социума. я не против, привлекайте, привлекайте — но хотя бы делайте это прогрессивно что ли, более смело что ли. проще простого доковыряться до отсутсвия проверки на null, или до выражения шириной, о боже мой, в полэкрана. это же каким тупым надо быть чтобы написать выражение в полэкрана ха ха. гораздо сложнее объяснить понятным образом общественности (среди которой будут такие юмористы как вы) про то же самое отсутствие семанитики и хреновое ридабилити в масштабах проекта.
Re[3]: Это сеньорский код?
От: Умака Кумакаки Ниоткуда  
Дата: 21.12.21 15:37
Оценка: +1
Здравствуйте, CreatorCray, Вы писали:


CC>Но вот для куска, который привёл ТС, было бы неплохо хотя бы написать комментарий WTF там и зачем.


что блэт там понимать то? это фактически один вызов функции piecewise, которая возвращает функцию, которая маппит значения из одного диапазона на другой диапазон (это и называется scale, и у топикстартера это описано в первом посте). Я тут один самый умный или что? Или никто вообще не пытался дальше одной строки код прочесть?
нормально делай — нормально будет
Re[2]: Это сеньорский код?
От: CreatorCray  
Дата: 21.12.21 19:21
Оценка: +1
Здравствуйте, 4058, Вы писали:

4>Если честно, лень разбираться в кишках D3, но есть предположение, что автор занимается своего рода "битовыжиманием" на javascript

Да вот что то приведённый код совсем не похож на битовыжимание. Скорее на экономию байтиков файла сурсов.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[6]: Это сеньорский код?
От: CreatorCray  
Дата: 22.12.21 01:01
Оценка: +1
Здравствуйте, StandAlone, Вы писали:

CC>>return clamp (+transform.invert (input, y))


SA>Почти, но нет.

SA>
SA>clamp (+transform.invert (input ( y))
SA>


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

Касательно остального полагаю что тебе виднее, ибо я js практически не пользуюсь (максимум для наколенной скриптоты в greasemonkey) а потому прочих тонких нюансов не знаю.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[5]: Это сеньорский код?
От: Умака Кумакаки Ниоткуда  
Дата: 22.12.21 04:07
Оценка: +1
Здравствуйте, StandAlone, Вы писали:

SA>Я про нейминг, в котором clamp() это на самом деле boundaryLimits(), даже не заикаюсь. Это здесь наименьшее из прочих зол.


с этого надо было и начинать. clamp это настолько типичный нейминг для этой мат.логики, что сразу выдаёт нулевой опыт у вас к компьютерной графике. отсюда и все проблемы.
нормально делай — нормально будет
Re[7]: Это сеньорский код?
От: CreatorCray  
Дата: 22.12.21 06:49
Оценка: +1
Здравствуйте, Умака Кумакаки, Вы писали:

УК>из функционального стиля

Аааа, так вот как называется этот, гм... стиль
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[8]: Это сеньорский код?
От: Умака Кумакаки Ниоткуда  
Дата: 22.12.21 10:13
Оценка: :)
Здравствуйте, CreatorCray, Вы писали:

CC>Аааа, так вот как называется этот, гм... стиль


ну что тут сказать, дожить до седин и удивляться функциональной композиции, да ещё и в js, это признак опыта! Можно сразу в раздел декларативное программирование заходить на этом форуме и смеяться, какие все дураки.
нормально делай — нормально будет
Re[3]: оцените код
От: Ватакуси Россия  
Дата: 22.12.21 12:56
Оценка: :)
KP>Посмотри как может и должен выглядеть код в 202х годах https://github.com/cockroachdb/cockroach/blob/master/pkg/keys/keys.go

KP>Особо советую обратить внимание на комментарии и обработку ошибок.

Это тот самый таракан, который отваливается регулярно по тыщще разных причин? И где вставил-получил данные вполне может привести к тому, что данных ещё нет-)))
?
Все будет Украина!
Re[8]: оцените код
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 23.12.21 01:35
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Попробую тоже упростить. Исследовательский код типа "я алгоритм придумать не могу" со временем, если проект не проваливается окончательно, превращается в код, который "в общем-то работает, но не всегда дает хорошие результаты, а поэтому требует улучшения". И не потому он не дает, что плохо написан, а потому что совсем хороший алгоритм придумать так и не удалось, а то, что есть — ну более или менее работает, но надо улучшать и улучшать, а улучшая, можно и ухудшить. А пока что в продукт идет этот код, так как работать надо.


Нет, так ни в коем случае делать не надо и в приличных компаниях так не делают. Тут есть только два приемлемых решения. 1) говнокодер-ученый учится писать код. Лучший вариант, у нас гора PhD в ML и robotics и они, внезапно, пишут отличный код промышленного качества. 2) если корона не позволяет ученому научиться программировать, то говнокод используется строго как концепт и выкидывается после окончания исследования.

Надеюсь что своих студентов вы несколько иначе учите тому как надо писать код, потому что от "уважительных причин" для говнокодинья волосы дыбом встают. Им же потом работу работать, уволят с испытательного срока
Re[10]: оцените код
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 23.12.21 02:15
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Ответил в ответе CreatorCray, не буду повторяться

PD>http://rsdn.org/forum/job/8160106.1
Автор: Pavel Dvorkin
Дата: 23.12.21


Очередная запутанное объяснение почему корону снять влом

PD>Что же касается их работы — пока вроде никто не жаловался и никого не уволили.

PD>https://xn----7sbb1bdckl3bc1dyd.xn--p1ai/#rec351063040

А вот тут уже интересно, почему никто из них не гуглится? Они вообще существуют? Так, на будущее, если хочется добавлять отзывы от успешных программистов выпускников — стоит давать линки на их профиль в LI.
Отредактировано 23.12.2021 2:20 kaa.python . Предыдущая версия .
Re[11]: оцените код
От: Pavel Dvorkin Россия  
Дата: 23.12.21 03:16
Оценка: -1
Здравствуйте, CreatorCray, Вы писали:

PD>>Этот окончательный код — не первый в production, а где-то 4-5. До этого были другие версии, похуже. И я знал, что они не последние, и имел планы на улучшение, которые и реализовал потом.

PD>>Но это будет потом, а пока что надо код в production отправлять — ждать не будут, все равно это намного лучше, чем ничего.
PD>>И что тут делать ? Рефакторить ? Я же знаю, что из этого кода многое уйдет, многое будет изменено. В общем, на следующей итерации изменится этот код существенно.

CC>Камрад, я всё понимаю, но какое это всё имеет отношение к обсуждаемому коду из одной (ОДНОЙ, КАРЛ!) строки?


Мсье, а что ты к этой строке прицепился ? Ну написал бы он ее в 3 строчки (больше там взять неоткуда) — ты был бы доволен ?

PD>>Подозреваю, что авторы MySQL кода руководствовались примерно теми же соображениями.


CC>Там скорее уже пройдена точка невозврата, когда это ещё можно было исправить итерационно, всё время откладывали на потом. И вот теперь его будет проще взорвать чем причесать, что конечно теоретически возможно но усилия потребуются даже бОльшие чем написать всё то же с нуля.


Да какая там точка невозврата пройдена! Этот код был написан, скорее всего, изначально таким, и никому в голову не приходит его менять, потому что совершенно незачем.

На тебе еще один симпатичный кусок кода.

    for (shft = 8; shft >= 0; shft -=8) {
        for (i = 0; i < npixels && cc > 0; ) {
            if (*bp >= 128) {        /* run */
                if( cc < 2 )
                    break;
                rc = *bp++ + (2-128);
                b = (int16_t)(*bp++ << shft);
                cc -= 2;
                while (rc-- && i < npixels)
                    tp[i++] |= b;
            } else {            /* non-run */
                rc = *bp++;        /* nul is noop */
                while (--cc && rc-- && i < npixels)
                    tp[i++] |= (int16_t)*bp++ << shft;
            }
        }
        if (i != npixels) {


Мне тут особенно нравится "+ (2-128)"

Догадаешься сам, откуда взял ? Ответ внизу





















































http://download.osgeo.org/libtiff/
With best regards
Pavel Dvorkin
Re[10]: оцените код
От: StandAlone  
Дата: 23.12.21 14:47
Оценка: +1
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Потому что в обычных компаниях переписыванием работающего кода не занимаются.


Только он не работает(за пределами трех с половиной изначальных тест-кейзов) и ежеспринтно приносит кучу новых багов... а так-то да. Написано-(спихнуто на поддержку какому-то лоху)-забыто. Чукча не читатель, однако!

SVZ>Надо бы. Но!

SVZ>Будешь переписывать — пользователи ждать не будут, уйдут к конкурентам и компания разорится

А пока эти самые пользователи генерят сотни багрепортов практически кажный божий день, они конечно страсть как довольны.
Re[5]: Это сеньорский код?
От: Sharov Россия  
Дата: 24.12.21 13:40
Оценка: +1
Здравствуйте, StandAlone, Вы писали:

SA>Здравствуйте, Sharov, Вы писали:


S>>Судя по коду это отголоски до сих пор не прошедшей моды на ФП -- хаскель, монады и вот это вот все.


SA>Да ё-мое. Какое, аппликатив, ФП?

SA>
SA>export default function continuous(transform = identity) {
SA>  var domain = unit,
SA>      range = unit,
SA>      interpolate = interpolateValue,
SA>      clamp = identity,
SA>      piecewise,
SA>      output,
SA>      input;

SA>  function rescale() {
SA>    piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
SA>    output = input = null;
SA>    return scale;
SA>  }
SA>

SA>Я зря, что ли, вот это вот все помечаю тегом php?

Тегов языка не видно, это мог быть как js, так и scala какая-нибудь.
Правда синтаксис (+transform(clamp(x))) несколько смущал. Но я за этими
языками не слежу, мож чего нового ввели.

А то, что выше я написал относилось к этом фрагменту:
function scale(x) {
    return (output || (output = piecewise(domain.map(transform), range, interpolate)))(+transform(clamp(x)));
  }

  scale.invert = function(y) {
    return clamp(+transform.invert((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));
  };



output = piecewise(domain.map(transform), range, interpolate)))(+transform(clamp(x)))

Типичный функциональный стиль -- ф-ия от ф-ии, через ф-ию прямо в ф-ию.
Кодом людям нужно помогать!
Re: а как Вам такой кусочек кода ?
От: Pavel Dvorkin Россия  
Дата: 26.12.21 05:29
Оценка: :)
Здравствуйте, StandAlone, Вы писали:


    x = *s &~ *m;
    if (x) {
        if (x & SYNCHRONOUS_MASK)
            x &= SYNCHRONOUS_MASK;
        sig = ffz(~x) + 1;
        return sig;
    }

    switch (_NSIG_WORDS) {
    default:
        for (i = 1; i < _NSIG_WORDS; ++i) {
            x = *++s &~ *++m;
            if (!x)
                continue;
            sig = ffz(~x) + i*_NSIG_BPW + 1;
            break;
        }
        break;

    case 2:
        x = s[1] &~ m[1];
        if (!x)
            break;
        sig = ffz(~x) + _NSIG_BPW + 1;
        break;


Все понятно ? Беретесь сопровождать после 10 минут знакомства с этим кодом ?

Или тоже объявите это говнокодом ?

Специально не укажу источник
With best regards
Pavel Dvorkin
Re[5]: а как Вам такой кусочек кода ?
От: Pavel Dvorkin Россия  
Дата: 26.12.21 11:26
Оценка: :)
Здравствуйте, CreatorCray, Вы писали:

PD>>Но ты не ответил на вопрос. Код действительно понятен ? Вносить изменения будет легко ?

CC>С бОльшего понятен. Немного простого рефакторинга и будет совсем хорошо.

Да и так вроде неплохо. Работает на всех Дебианах, Убунтах и прочих Редхетах уже не один десяток лет.

CC>Имена надо давать внятные а не из "10-15 символов".


Одно другому противоречит ? Однобуквенные имена внятные только если это переменные из математики или физики. Не удосужились там до сих пор давать переменным многобуквенные имена, так и пишут v = s/ t и всем понятно. Ну а в том примере, что такое s, x и m — мне так не очень понятно.

CC>Но такой код очень легко превращается в удобночитаемый через refactor rename, структуру там не надо править.


Ох, что-то я сомневаюсь, что "++s &~ *++m" станет намного понятнее, если заменить s и m на что-то иное с помощью refactor rename.

PD>>Я себе представляю, что бы тут завопили, если бы я представил код с несколькими однобуквенными именами и методом с именем ffz для бизнес-приложения. И правильно бы завопили.

CC>Имена поправить проще чем вывихнутую логику.

Логика, я думаю, тут в полном порядке.
With best regards
Pavel Dvorkin
Re[2]: а как Вам такой кусочек кода ?
От: Sharov Россия  
Дата: 28.12.21 10:12
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Специально не укажу источник


А то в 21 веке найти сложно -- https://github.com/torvalds/linux/blob/master/kernel/signal.c#L207
Кодом людям нужно помогать!
Re[3]: а как Вам такой кусочек кода ?
От: Pavel Dvorkin Россия  
Дата: 28.12.21 10:58
Оценка: :)
Здравствуйте, Sharov, Вы писали:

S>А то в 21 веке найти сложно -- https://github.com/torvalds/linux/blob/master/kernel/signal.c#L207


Само собой, это было просто для создания эффекта
With best regards
Pavel Dvorkin
Re: Это сеньорский код?
От: CreatorCray  
Дата: 20.12.21 19:53
Оценка:
Здравствуйте, StandAlone, Вы писали:

SA>Реализация

SA>https://github.com/d3/d3-scale/blob/9fe496e6d708bf30435c15f03ab9e5ae994ea7be/src/continuous.js

SA>
SA>function scale(x) {
SA>    return (output || (output = piecewise(domain.map(transform), range, interpolate)))(+transform(clamp(x)));
SA>  }

SA>  scale.invert = function(y) {
SA>    return clamp(+transform.invert((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));
SA>  };
SA>


Вай какой дурдом!!!

SA>Автор доступен, но по поводу своего творения не может сказать ни слова, кроме общих предположений.


Не удивительно.

SA>Я попытался выяснить, как такое вообще попало в мастер, в ответ услышал — "Этот человек выше чем сеньор, в подробном ревью не нуждается".

SA>"Сеньор всех сеньоров"(с)habr.

Не, гнать нахрен на мороз таких пейсак. Это не senior, это скорее mumbling elderly.

SA>Моя точка зрения — написать в одну строку с кучей побочных эффектов способен любой не острый стажер, а вот решить сложное просто, понятно и поддерживаемо как раз способен только опытный разработчик.


Совершенно верно.

SA>Как по вашему мнению, такая ситуация в сфере разработки ПО теперь нормальна?

SA>Или это только во фронтенде?

Идиоты нынче лезут везде, увы.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[3]: Это сеньорский код?
От: CreatorCray  
Дата: 20.12.21 22:58
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>И все же, это код вроде как от создателя небезызвестной D3 и кучи других известных штук?

Да пофигу от кого на самом деле.

bnk>IMHO такое не подходит для работы в команде

Не подходит, да.

bnk>А может если ты привык к такому стилю, такое даже нормально читается и понимается.

Ну как бы уже было сказано что даже аффтар сего гм... кода не может внятно сказать "Щито это за хня?!" (tm)
Неудивительно что остальные смотрят на сие как Адептус Механикус на вооружение орков.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re: Это сеньорский код?
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 21.12.21 01:07
Оценка:
Здравствуйте, StandAlone, Вы писали:

SA>Код достался мне на поддержку. Автор доступен, но по поводу своего творения не может сказать ни слова, кроме общих предположений.


Говницо, да...

SA>Я попытался выяснить, как такое вообще попало в мастер, в ответ услышал — "Этот человек выше чем сеньор, в подробном ревью не нуждается".

SA>"Сеньор всех сеньоров"(с)habr.

Если зайти в профайл автора на GitHub, там, собственно ответ на все вопросы:

Building a better computational medium. Founder @observablehq. Creator @d3. Former @nytgraphics. Pronounced BOSS-tock.


SA>Попытки объяснить, что это нежелательно, про LSP, трехзвенку или SOLID также встречаются полным непониманием.

SA>Люди эти все, конечно, тимлиды и сеньоры, или даже сеньоры всех сеньоров. По происхождению, конечно, из html-программистов, тестировщиков и прочих активных пользователей хабра типа войтивайти. Возможно эти все части паззла как-то связаны.
SA>Что скажет общество?

Почему ты сам до сих пор там?

SA>Как по вашему мнению, такая ситуация в сфере разработки ПО теперь нормальна?


Нет, это не нормальная ситуация. Нормальная ситуация это когда никто не может залить изменения в мастер, пока код не будет одобрен 2-3 другими разработчиками.

SA>Или это только во фронтенде?


Мне кажется, это часть проблемы. Фронтэнд штука довольно специфичная тем, что за ней не стоит каких-то базовых знаний (теория баз данных, теория криптографии, теория распределенных систем, там даже теория алгоритмов особо и не нужна) и каждый год очередной "прорыв" который всем срочно надо внедрить.
Re[2]: Это сеньорский код?
От: CreatorCray  
Дата: 21.12.21 07:40
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Если зайти в профайл автора на GitHub, там, собственно ответ на все вопросы:

KP>Pronounced BOSS-tock.[/q]
Это он объясняет как произносится его фамилия, зовут его Mike Bostock
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[2]: Это сеньорский код?
От: Skorodum Россия  
Дата: 21.12.21 09:37
Оценка:
Здравствуйте, Osaka, Вы писали:

O>Это в любой кастовой системе. "Сначала поделай как у сеньоров 'принято', и заслужи". (Если засчитают

Или смени "стаю"
Re[2]: Это сеньорский код?
От: Skorodum Россия  
Дата: 21.12.21 09:40
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Мне кажется, это часть проблемы. Фронтэнд штука довольно специфичная тем, что за ней не стоит каких-то базовых знаний (теория баз данных, теория криптографии, теория распределенных систем, там даже теория алгоритмов особо и не нужна) и каждый год очередной "прорыв" который всем срочно надо внедрить.

Есть свежий местный пример: Артемка недавно восхищался реализацией обычной state machine в какм-то веб фреймворке и утверждал что это мега-вау прорыв.
Re[4]: Это сеньорский код?
От: CreatorCray  
Дата: 21.12.21 10:42
Оценка:
Здравствуйте, bnk, Вы писали:

CC>>Но вот для куска, который привёл ТС, было бы неплохо хотя бы написать комментарий WTF там и зачем.

CC>>Ну или разбить это всё на несколько строк, ибо много сущностей в одной строке ухудшают читаемость кода.

bnk>Да чего тушеваться, код конкретно нечитаемый, невзирая на лица.


Ну я в общем то сразу и сказал что там дурдом
Автор: CreatorCray
Дата: 20.12.21

Сейчас уже обсуждаем что можно сделать чтобы стало лучше.

bnk>Если автор просидел на этой либе последние 10 лет, это его все равно не оправдывает

Ну там в истории коммитов он один, так что наверное писал под себя.

bnk> IMHO можно было более человечный код написать.

Можно. Там даже уже было раньше почище написано.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re: Это сеньорский код?
От: Ватакуси Россия  
Дата: 21.12.21 12:25
Оценка:
Здравствуйте, StandAlone, Вы писали:

SA>Или это только во фронтенде?

Кто там работал в цирке не смеётся, да.

  public login({ username, password }: Authenticate): Promise<any> {
    username = username.toLowerCase();
    return new Promise((resolve, reject) => {
      return this.cognitoService
        .authenticate(username, password)
        .then(result => {
          let foundTenant = false;
          const tenants: Array<Tenant> = [];
          if (result.idToken.payload['custom:PlatformTenantId']) {
            const tenantDTO = JSON.parse(result.idToken.payload['custom:PlatformTenantId']);

            const tenantArray = tenantDTO.t;
            tenantArray.map((_, index) => {
              tenants.push({ id: tenantArray[index].id, name: '-' });
              foundTenant = true;
            });
          }

          const userName = result.idToken.payload.name ? result.idToken.payload.name : result.idToken.payload.email;
          const userEmail = result.idToken.payload.email;
          const userPhone = result.idToken.payload.phone_number ? result.idToken.payload.phone_number : '-';
          const exp = result.accessToken.payload.exp;

          const user: User = {
            name: userName,
            email: userEmail,
            phone: userPhone,
            tenants,
            selectedTenant: tenants[0],
            accessToken: result.getAccessToken().getJwtToken(),
            accessTokenExpiryTime: exp,
            userProfile: null
          };

          if (foundTenant) {
            return this.userService.userProfile(user).subscribe(
              up => {
                user.userProfile = up;
                // set the user in the local storage
                userUtil.set(user);
                // set the user in the service
                this.setUser(user);
                resolve(user);
              },
              () => {
                resolve(user);
              }
            );
          } else {
            resolve(user);
          }
        })
        .catch(err => {
          reject(err);
        });
    });
  }
Все будет Украина!
Отредактировано 21.12.2021 12:26 Ватакуси . Предыдущая версия .
Re[3]: Это сеньорский код?
От: Ватакуси Россия  
Дата: 21.12.21 19:17
Оценка:
УК>а с этим кодом что не так? ну т.е. он абсолютно читаем, да, написан слегка небрежно, да, можно (нужно) его разбить на пару подфункций, использовать async/await вместо явных промисов, но в треде что-то похоже компания совсем непуганых собралась. Вот когда вам реально достанется код, а-ля inverse sqrt или генерённый код с кучей goto и ручными правками в нём, тогда у вас волосы на жёппе зашевелятся, а так, ну ужас, ну ужас-ужас, но не ужас-ужас-ужас же.

1) Рукопашные промисы
2) Вытаскивание и втаскивание инфы в local storage — кеш себе нашли!
3) Это повторяется десятки раз по всему коду
4) Обработка ошибок очень наивная
5) Постоянные разбивки и поиски по строкам
Все будет Украина!
Re[4]: Это сеньорский код?
От: CreatorCray  
Дата: 21.12.21 19:21
Оценка:
Здравствуйте, Умака Кумакаки, Вы писали:

УК>что блэт там понимать то? это фактически один вызов функции piecewise, которая возвращает функцию, которая маппит значения из одного диапазона на другой диапазон (это и называется scale, и у топикстартера это описано в первом посте).


Напомню:
clamp(+transform.invert((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));


По сути там вот что:
// pseudocode
if (!input)
    input = piecewise (range, domain.map (transform), interpolateNumber);

return clamp (+transform.invert (input, y))

Просто налеплено в одну строку непонятно зачем.

УК> Я тут один самый умный или что?

Нет, поди просто привык читать lisp

УК> Или никто вообще не пытался дальше одной строки код прочесть?

Его чтоб прочесть надо либо сначала переформатировать либо читать в редакторе с подсветкой пар скобок.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[4]: Это сеньорский код?
От: ononim  
Дата: 21.12.21 19:34
Оценка:
CC>Какие такие особые требования заставляют тут лепить кучу кода в одну строку?
Может чувак код писал на смартфоне, не всеж только порно на нем смотреть.
Как много веселых ребят, и все делают велосипед...
Re[4]: Это сеньорский код?
От: StandAlone  
Дата: 21.12.21 23:52
Оценка:
Здравствуйте, Умака Кумакаки, Вы писали:

УК> Я тут один самый умный или что?


Бугага. А Вы точно понимаете, что именно там написано?
Лично я на основании одной этой строки в теле каждой функции могу устроить беседу часа на 2-3 любому самоуверенному "знатоку JS".
По результатам которой, при желании, засыплется любой.
Re[2]: Это сеньорский код?
От: StandAlone  
Дата: 22.12.21 00:05
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Почему ты сам до сих пор там?


Я жертва цепи несчастных случайностей.
Как и все мы.

(с)

KP>Нет, это не нормальная ситуация. Нормальная ситуация это когда никто не может залить изменения в мастер, пока код не будет одобрен 2-3 другими разработчиками.


Так ведь ревью там было. "Покликали, работает, господин Сеньор!". И все на этом. В код никто не вкуривал, ибо не осилили, или лень.
Вот мне интересно, прочие сферы разработки ПО тоже поражены этим недугом?

KP>Мне кажется, это часть проблемы. Фронтэнд штука довольно специфичная тем, что за ней не стоит каких-то базовых знаний (теория баз данных, теория криптографии, теория распределенных систем, там даже теория алгоритмов особо и не нужна) и каждый год очередной "прорыв" который всем срочно надо внедрить.


Но ведь тут суть даже не в алгоритмах, коих нет. А общем подходе, см. имена переменных a, b в примере выше. Совершенно все базовые нормы этики и морали разработки похерены. Отсюда гармонично следует полное незнание ничего про архитектуру, паттерны, инженерию и промышленный дизайн.
Как эти люди попадают вместо условных Яндекс.Еду и Яндекс.Такси в Яндекс.Разработку?
И специфично ли это явление для РУ-области, или поражение глобально?
Re[5]: Это сеньорский код?
От: Mystic Artifact  
Дата: 22.12.21 01:45
Оценка:
Здравствуйте, StandAlone, Вы писали:

SA>Какую? С моей точки зрения, он только усложнил работу интерпретатору.

Тут жирным выделять совершенно лишнее, если не хотите подчеркнуть свою неосведомленность.

Один факт того, что JS позволяет делать forward-references — делает его не так что бы особо интерпретируемым.

А если взять и открыть V8, то под капотом там есть бэкэнд на платформе которого, сделано аж 3 JIT-компилятора. Iginition, который как бы называется интерпретатором, на самом деле генерирует байт код. И всё это в тандеме.
Re[5]: Это сеньорский код?
От: Умака Кумакаки Ниоткуда  
Дата: 22.12.21 04:11
Оценка:
Здравствуйте, StandAlone, Вы писали:

SA>Бугага. А Вы точно понимаете, что именно там написано?

я точно понимаю что там написано. что не так?
нормально делай — нормально будет
Re: оцените код
От: Pavel Dvorkin Россия  
Дата: 22.12.21 11:43
Оценка:
Здравствуйте, StandAlone, Вы писали:


Источник внизу.

  uint32 cur_hashnr;
  const uchar *cur_key;
  size_t cur_keylen;
  LF_SLIST *link;

retry:
  cursor->prev = head;
  do /* PTR() isn't necessary below, head is a dummy node */
  {
    cursor->curr = (LF_SLIST *)(*cursor->prev);
    lf_pin(pins, 1, cursor->curr);
  } while (*cursor->prev != cursor->curr && LF_BACKOFF);
  for (;;) {
    if (unlikely(!cursor->curr)) {
      return 0; /* end of the list */
    }
    do {
      /* QQ: XXX or goto retry ? */
      link = cursor->curr->link.load();
      cursor->next = PTR(link);
      lf_pin(pins, 0, cursor->next);
    } while (link != cursor->curr->link && LF_BACKOFF);
    cur_hashnr = cursor->curr->hashnr;
    cur_key = cursor->curr->key;
    cur_keylen = cursor->curr->keylen;
    if (*cursor->prev != cursor->curr) {
      (void)LF_BACKOFF;
      goto retry;
    }


Ну и как ?

Источник — файл mf_keycaches.cc из исходников MySQL сервера.
With best regards
Pavel Dvorkin
Re[2]: оцените код
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 22.12.21 11:51
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Ну и как ?


Кусок старого говна которое к счастью работает и трогать не надо.

PD>Источник — файл mf_keycaches.cc из исходников MySQL сервера.


Посмотри как может и должен выглядеть код в 202х годах https://github.com/cockroachdb/cockroach/blob/master/pkg/keys/keys.go

Особо советую обратить внимание на комментарии и обработку ошибок.
Re[3]: оцените код
От: Pavel Dvorkin Россия  
Дата: 22.12.21 12:17
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Кусок старого говна которое к счастью работает и трогать не надо.


К счастью работает — это неинтересно. Неработающий код в SQL сервере — не было бы сервера

А вот почему не надо — можно поподробнее ? Почему его не отрефакторить как следует ? Чтобы понятно было

Почему Oracle это не делает ?
With best regards
Pavel Dvorkin
Re[4]: оцените код
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 22.12.21 12:59
Оценка:
Здравствуйте, Ватакуси, Вы писали:

В>Это тот самый таракан, который отваливается регулярно по тыщще разных причин? И где вставил-получил данные вполне может привести к тому, что данных ещё нет-)))

В>?

Говнокод решает проблемы согласованности данных. Ай молодца, вот это я понимаю инженерный образ мысли!
Re[5]: оцените код
От: Ватакуси Россия  
Дата: 22.12.21 13:35
Оценка:
KP>Говнокод решает проблемы согласованности данных. Ай молодца, вот это я понимаю инженерный образ мысли!

Это где я это писал?
Все будет Украина!
Re[8]: Это сеньорский код?
От: Pavel Dvorkin Россия  
Дата: 22.12.21 13:50
Оценка:
Здравствуйте, so5team, Вы писали:

S>А тут не нужно думать. Еще на стадии обучения программированию на подкорке должно были быть выбиты навыки выбора внятных идентификаторов и аккуратного написания кода.


На стадии обучения программированию любое имя переменной не могло иметь больше 6 символов и GOTO был в каждой десятой строчке . Потому что писал я тогда на Фортран-4.
With best regards
Pavel Dvorkin
Re[9]: Это сеньорский код?
От: CreatorCray  
Дата: 22.12.21 22:56
Оценка:
Здравствуйте, Умака Кумакаки, Вы писали:

УК>ну что тут сказать, дожить до седин и удивляться функциональной композиции, да ещё и в js, это признак опыта! Можно сразу в раздел декларативное программирование заходить на этом форуме и смеяться, какие все дураки.


В иронию ты не умеешь, понятно.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[7]: Это сеньорский код?
От: CreatorCray  
Дата: 22.12.21 22:56
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Не получилось, видимо, у меня объяснить. Попробую еще раз.

Да не, просто мы чутка под разным углом смотрим.

PD>А есть разработки, в которых основная проблема — не сопровождение и не модифицирование, а то, как вообще сделать.

Приведённый код очевидным образом не попадает в этот случай.

PD>И если на этом этапе ко мне придут и скажут, что у меня не в порядке отступы и табы, длинные строки и т.п. — я их и слушать не буду, более того, буду, наверное, довольно резок.

Совершенно верно. Но опять таки: этот код явно не относится к описываемой ситуации.

PD>Нужно ли потом отрефакторить и привести к более читаемому виду? It depends. Зависит от того, что с этим кодом потом будут делать.

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

PD> Вполне возможно (и похоже, что так и было в случае ТС), что автор вообще не предполагал возможной модификации этого кода кем бы то ни было, кроме самим собой.

И как оно оправдывает нечитабельность кода?
Ну и да, такой код обычно в паблик не выкладывают.

PD>Скажешь — такое не бывает ? Бывает

Скажу что это не тот случай.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[2]: оцените код
От: CreatorCray  
Дата: 22.12.21 22:56
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Ну и как ?

Ужасно
Но даже эту кашу можно сделать куда более читабельной.

PD>из исходников MySQL сервера.

Мускуль — один из самых плохих херовейших примеров говнокода.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[4]: оцените код
От: CreatorCray  
Дата: 22.12.21 22:56
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Почему Oracle это не делает ?

Потому что это nonfunctional change который потребует много усилий, за которые никто не хочет платить.
Затем это потенциально может внести новые баги. Ну и ещё пучок прочих разнообразных "но".
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[8]: оцените код
От: CreatorCray  
Дата: 22.12.21 22:56
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Исследовательский код типа "я алгоритм придумать не могу" со временем, если проект не проваливается окончательно, превращается в код

Нет. По нормальному, как только исследовательский код начинает работать его либо итерационно рефакторят до production ready состояния, либо просто по мотивам пишут рядом новый, сразу нормально.
Но вот если "я его слепила из того что было" как есть приклеивать к production — это надо сразу тапком.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[5]: оцените код
От: Pavel Dvorkin Россия  
Дата: 23.12.21 01:51
Оценка:
Здравствуйте, CreatorCray, Вы писали:

PD>>Почему Oracle это не делает ?

CC>Потому что это nonfunctional change который потребует много усилий, за которые никто не хочет платить.
CC>Затем это потенциально может внести новые баги. Ну и ещё пучок прочих разнообразных "но".

Вот-вот.

Подытожим, как ты сам написал

Этот код вполне благополучно работает лет так 15, а то и больше, на всех установках MySQL сервера
Этот код совершенно не соответствует современным требованиям к качеству написания кода.
Эти требования влияют на читабельность, сопровождаемость и т.д. кода, но не влияют на его поведение.
Изменение этого кода с целью сделать его соответствующим этим требованиям "потребует много усилий", "может внести новые баги", и никакого профита.

Вывод — "работает — не трогай".
With best regards
Pavel Dvorkin
Re[10]: оцените код
От: CreatorCray  
Дата: 23.12.21 02:25
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Нет, не говнокод по большому счету. Хотя претензий с точки зрения чистого кода можно было бы высказать немало.


Я такое могу сказать про любой свой код через 10 лет, всегда есть что улучшить после того как посмотришь на него с новым опытом.

PD>Ну, например, основная часть оформлена в виде одной функции строк так на 200.


К такому у меня как раз обычно мало претензий, особенно если это Pure C — он крайне многословный по причине отсутствия в языке какой либо автоматизации рутины. Макросами же можно сделать только хуже.

PD>Этот окончательный код — не первый в production, а где-то 4-5. До этого были другие версии, похуже. И я знал, что они не последние, и имел планы на улучшение, которые и реализовал потом.

PD>Но это будет потом, а пока что надо код в production отправлять — ждать не будут, все равно это намного лучше, чем ничего.
PD>И что тут делать ? Рефакторить ? Я же знаю, что из этого кода многое уйдет, многое будет изменено. В общем, на следующей итерации изменится этот код существенно.

Камрад, я всё понимаю, но какое это всё имеет отношение к обсуждаемому коду из одной (ОДНОЙ, КАРЛ!) строки?

PD>Подозреваю, что авторы MySQL кода руководствовались примерно теми же соображениями.


Там скорее уже пройдена точка невозврата, когда это ещё можно было исправить итерационно, всё время откладывали на потом. И вот теперь его будет проще взорвать чем причесать, что конечно теоретически возможно но усилия потребуются даже бОльшие чем написать всё то же с нуля.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[6]: оцените код
От: CreatorCray  
Дата: 23.12.21 02:25
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Вывод — "работает — не трогай".

Нет.
Вывод должен быть в оценке risk/benefit ratio.
Почти как военная медицина: если код ещё можно спасти его надо спасать, если уже поздно то поместить в карантин и ходить туда в скафандре.
Принцип же "работает — не трогай" применяется для молодёжи, которые ещё не понимают с какого конца скальпель держать.
Дедушки вооружённых сил должны уже сами понимать что стоит спасать а что надо просто оставить засыхать и потиху готовить ему замену, на момент когда оно неминуемо отвалится.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[11]: оцените код
От: CreatorCray  
Дата: 23.12.21 02:31
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>А вот тут уже интересно, почему никто из них не гуглится? Они вообще существуют? Так, на будущее, если хочется добавлять отзывы от успешных программистов выпускников — стоит давать линки на их профиль в LI.


Кстати да.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re: Это сеньорский код?
От: vaa  
Дата: 23.12.21 02:45
Оценка:
Здравствуйте, StandAlone, Вы писали:

SA>Попытки объяснить, что это нежелательно, про LSP, трехзвенку или SOLID также встречаются полным непониманием.

Пробовали переписать? Вас просто не поняли вероятно. Технические люди. Может если они увидят чистый код, то поймут вашу мысль.
В любом случае убедитесь, что вас поняли прежде чем делать окончательные выводы.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[11]: оцените код
От: Pavel Dvorkin Россия  
Дата: 23.12.21 03:05
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>А вот тут уже интересно, почему никто из них не гуглится? Они вообще существуют?


Не волнуйся, существуют, там и работают. Мы за 10 лет существования этой Школы (в разных формах) выпустили сотни две человек. Некоторые из них в Тамтэке и работают, другие уже в других местах.

>Так, на будущее, если хочется добавлять отзывы от успешных программистов выпускников — стоит давать линки на их профиль в LI.


Подумаем, спасибо.
With best regards
Pavel Dvorkin
Re[7]: оцените код
От: Pavel Dvorkin Россия  
Дата: 23.12.21 03:22
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Принцип же "работает — не трогай" применяется для молодёжи, которые ещё не понимают с какого конца скальпель держать.

CC>Дедушки вооружённых сил должны уже сами понимать что стоит спасать а что надо просто оставить засыхать и потиху готовить ему замену, на момент когда оно неминуемо отвалится.

http://rsdn.org/forum/job/8160128.1
Автор: Pavel Dvorkin
Дата: 23.12.21


Не знаю, дедушки его до сих пор поддерживают или нет, но спасать его совсем не требуется, он прекрасно себя чувствует и не собирается отвалиться.
With best regards
Pavel Dvorkin
Re[7]: оцените код
От: 4058  
Дата: 23.12.21 05:34
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>... При этом у MySQL есть довольно веское оправдание для этого безобразия — в то время когда код был написан, такой код не считался говнокодом, т.к. инженерные практики еще толком не сложились.


Стоит заметить, что и PostgreSQL местами не эльфами написан:

for (;;)
    {
        int            ret;

        /* Fetch next row if we didn't already */
        if (TupIsNull(agg_row_slot))
        {
            if (!window_gettupleslot(agg_winobj, winstate->aggregatedupto,
                                     agg_row_slot))
                break;            /* must be end of partition */
        }

        /*
         * Exit loop if no more rows can be in frame.  Skip aggregation if
         * current row is not in frame but there might be more in the frame.
         */
        ret = row_is_in_frame(winstate, winstate->aggregatedupto, agg_row_slot);
        if (ret < 0)
            break;
        if (ret == 0)
            goto next_tuple;

        /* Set tuple context for evaluation of aggregate arguments */
        winstate->tmpcontext->ecxt_outertuple = agg_row_slot;

        [... тут еще строк 10 кода]

next_tuple:

но это не мешает им быть наиболее популярными продуктами среди БД (на данный момент):

1. Oracle
2. MySQL
3. Microsoft SQL Server
4. PostgreSQL
5. MongoDB

https://db-engines.com/en/ranking

На почётном 58 месте находится вышеупомянутый
Автор: kaa.python
Дата: 22.12.21
CockroachDB, к которому бывают претензии в рамках эксплуатации.

KP>Писать сейчас так же — вот это уже плохой знак.


Сейчас аппаратные (и программные) ресурсы совсем другие, сейчас можно всегда инициализировать переменные (даже когда это делать излишне), выносить тело цикла в функции (т.к. ф-я скорее всего будет про-inline-ена) и делать прочие увлекательные вещи, которые раньше не во всех случаях стоило делать, по причине слабости железа и оптимизации компиляторов. Да, и то что код попадёт в интернет для всеобщего ухахатывания тогда совсем не задумывались.
Re[13]: оцените код
От: Pavel Dvorkin Россия  
Дата: 23.12.21 06:48
Оценка:
Здравствуйте, CreatorCray, Вы писали:

PD>> Ну написал бы он ее в 3 строчки (больше там взять неоткуда) — ты был бы доволен?

CC>Как уже говорилось — было бы лучше.
CC>Впрочем тут знатоки js там ещё нашли проблем.

Да я и не спорю — вполне возможно, и было бы. Просто это, скажем так, для автора приоритет N-го порядка.

PD>>Да какая там точка невозврата пройдена! Этот код был написан, скорее всего, изначально таким

CC>Его писали дофига лет ващета.

А бог его знает. По-хорошему надо их релизы смотреть (или репозиторий, если он публичный), чтобы выяснить, когда это было написано. Но скорее всего в прошлом веке.

PD>>На тебе еще один симпатичный кусок кода.

CC>"кск гвн" (С)

PD>>Мне тут особенно нравится "+ (2-128)"

CC>Это гораздо лучше чем "-126", ибо так хоть чуток понятнее что за магическая константа.

Несомненно. Что такое -126 — поди догадайся. А тут лишь надо расшифровать эти биты.

CC>Впрочем константы надо было делать именованными


+1

CC>libpdf точно так же уродски написан.

CC>Как и большинство "libXXX", включая png, jpg, итп

В общем, я и не спорю. Да, это не шедевр кода. Но работает на бог знает каком количестве компьютеров и никто не собирается его переписывать.

Вспомнил еще один случай из своей практики.

Банальный if, а внутри него sqrt от чего-то с чем-то сравнивается. Все бы ничего, но стоит это под O(MNK), где M, N — размеры картинки, K — размер окна. А от меня опять же требуют, чтобы было быстро.

Сделал, отдал заказчику — говорит : медленно. Не верю, у меня быстро. Начинаем выяснять, кто виноват — sqrt оказывается. У него он почему-то гораздо медленнее выполняется , чем у меня.

В общем, задача ясна — придется от sqrt избавляться. Благо он лишь под if стоит, больше нигде не нужен.

Беру листок бумаги и вспоминаю алгебру 10 класса — равносильные преобразования неравенств. Преобразую так, чтобы вместо sqrt сравнивалось подкоренное выражение. Образуется какая-то чудовищная дробь. Вылезают граничные условия, на них свои if пишутся

Результат — вместо одной простой и понятной строчки получилось примерно 20 строчек кода с вложенными if, интуитивно совершенно непонятными. Хоть комментарии пиши

Но результат достигнут — не там больше sqrt и жалоб на скорость нет.

Я все это к тому, что задачи разные бывают. Для одних важно обеспечить понятность и возможность сопровождения и модификации. Для других — это приоритет N-го порядка, а первыми приоритетами совсем иное.
With best regards
Pavel Dvorkin
Re[10]: Это сеньорский код?
От: Умака Кумакаки Ниоткуда  
Дата: 23.12.21 08:13
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>В иронию ты не умеешь, понятно.


или ты не умеешь в иронию над иронией
нормально делай — нормально будет
Re[8]: оцените код
От: Pavel Dvorkin Россия  
Дата: 23.12.21 08:37
Оценка:
Здравствуйте, 4058, Вы писали:


4>Да, и то что код попадёт в интернет для всеобщего ухахатывания тогда совсем не задумывались.


А точнее, никому в голову и не пришло бы, что этот код будет предметом для ухахатывания для кого-то.
With best regards
Pavel Dvorkin
Re[11]: Это сеньорский код?
От: CreatorCray  
Дата: 23.12.21 08:46
Оценка:
Здравствуйте, Умака Кумакаки, Вы писали:

CC>>В иронию ты не умеешь, понятно.

УК>или ты не умеешь в иронию над иронией

Ещё один переобулся в прыжке
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[8]: оцените код
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 23.12.21 10:50
Оценка:
Здравствуйте, 4058, Вы писали:

4>но это не мешает им быть наиболее популярными продуктами среди БД (на данный момент):

4>

4>1. Oracle
4>2. MySQL
4>3. Microsoft SQL Server
4>4. PostgreSQL
4>5. MongoDB

4>https://db-engines.com/en/ranking

Не мешает само собой с учетом того, сколько денег в них влито.

4>На почётном 58 месте находится вышеупомянутый
Автор: kaa.python
Дата: 22.12.21
CockroachDB, к которому бывают претензии в рамках эксплуатации.


Да, при очень скромном бюджете по сравнению с теми базами что в начале списка. При бесконечном потоке денег как у Оракла, даже такое чудище
Автор: RonWilson
Дата: 23.12.21
можно развивать.
Отредактировано 23.12.2021 11:04 kaa.python . Предыдущая версия .
Re[7]: оцените код
От: RonWilson Россия  
Дата: 23.12.21 11:00
Оценка:
Здравствуйте, kaa.python, Вы писали:

RW>>Она?


KP>Да-да-да! Но это же реально трэш!


Если не ошибасю, авто этого опуса сошел с ума в итоге (без шуток), найти только вот не могу, там была как раз прицеплена эта его статья.
Re: Это сеньорский код?
От: MaximVK Россия  
Дата: 23.12.21 11:24
Оценка:
Здравствуйте, StandAlone, Вы писали:

SA>Что скажет общество?

Если в контексте командной разработки — то плохо.
Если человек сам пишет и сам поддерживает, то это его дело.

SA>Как по вашему мнению, такая ситуация в сфере разработки ПО теперь нормальна?

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

SA>Или это только во фронтенде?

А переписать и предложить свой чистый и понятный вариант?
Если автор кода будет против, то тогда да, это прям звоночек.
Re[3]: Это сеньорский код?
От: Sharov Россия  
Дата: 23.12.21 12:51
Оценка:
Здравствуйте, StandAlone, Вы писали:

SA>Цель создания топика именно здесь была попытка выяснить обстановку по миру. У меня была идея, дескать все это может быть связано с оттоком специалистов, в итоге бизнес призвал под знамена всех способных держать клавиатуру хоть как-то выполнить хотелки кастомера.

SA>Но вот смотрю медиум, стековерфлоу, реддит... Там в посвященных фронтенду разделах прослеживается подобное. В крупных FE OS репозиториях от крупнейших вендоров тоже.
SA>Что происходит? Специалисты не пишут ни статей, ни заметок на SO, ни в репы опенсорс?
SA>Или базовые принципы инженерного дизайна уже девальвировались и устарели?

Судя по коду это отголоски до сих пор не прошедшей моды на ФП -- хаскель, монады и вот это вот все.
Типа быть таким крутым замороченным спецом, которому ну никак нельзя сделать просто, а надо
сделать трушно, с множеством слов из мира ФП и теории типов.
Кодом людям нужно помогать!
Re[5]: оцените код
От: Sharov Россия  
Дата: 23.12.21 13:25
Оценка:
Здравствуйте, kaa.python, Вы писали:

PD>>И если на этом этапе ко мне придут и скажут, что у меня не в порядке отступы и табы, длинные строки и т.п. — я их и слушать не буду, более того, буду, наверное, довольно резок. Мне просто не до этого, у меня совсем другие проблемы. Мне задачу бы решить, а никак не получается, проблем выше крыши, а Вы мне про табы и длинные строки!

KP>В компании с современными процессами, такой код нельзя даже банально собрать на сборочном конвеере. CI его забракует еще до того как попытается собрать.

Ух ты, метрики качества\сложности кода прикручены? Типа большая цикломатическая сложность или связанность?
Кодом людям нужно помогать!
Re[9]: оцените код
От: Sharov Россия  
Дата: 23.12.21 13:37
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Надеюсь что своих студентов вы несколько иначе учите тому как надо писать код, потому что от "уважительных причин" для говнокодинья волосы дыбом встают. Им же потом работу работать, уволят с испытательного срока


Дед дело говорит: требования к R&D и каким-нибудь стартапам, а вроде заказчик подобный, там реально
нужно быстро и чтобы работало, а не качество кода. Вы выше описали процесс, который, кмк, надо радикально
менять, и, кмк, ML к этому постепенно идет (хотя могу ошибаться). А именно речь о том, чтобы
программист становился ученным и максимально быстро писал и прототипы и делал бы это еще
качественно -- SOLID, паттерны, композиция и т.п. вещи.
Кодом людям нужно помогать!
Re[7]: оцените код
От: Sharov Россия  
Дата: 23.12.21 14:08
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Да, очень много чего автоматом проверяется еще до какого-либо ревью человеком. Проверяется форматирование, отсутствие дубликатов, статический анализ (несколько разных линтеров), несколько видов динамического анализа, ну и куча разных тестов.


А зачем все это на CI, если на уровне IDE многое можно выловить? Или это последний рубеж?
Ну с другой стороны человек может на предупреждения IDE забить, а результаты CI видны всем.
Скорее всего имеет смысл.
Кодом людям нужно помогать!
Re[10]: оцените код
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 23.12.21 14:09
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>И где так делают?

SVZ>В каких-нибудь сильно богатых Гуглах?

Так делали во всех 3-х компаниях где я работал за последнии 7 лет. Две богатые, но сильно не Гугл — Autodesk и Motional, и один стартап (там CTO крайне продвинутый и понимает цену технического долга и последующие проблемы развития).

SVZ>Потому что в обычных компаниях переписыванием работающего кода не занимаются.


Чувствую пришло время определиться с тем, что же такое "обычная компания"
Re: Это сеньорский код?
От: Stanislav V. Zudin Россия  
Дата: 23.12.21 14:11
Оценка:
Здравствуйте, StandAlone, Вы писали:

SA>Люди эти все, конечно, тимлиды и сеньоры, или даже сеньоры всех сеньоров. По происхождению, конечно, из html-программистов, тестировщиков и прочих активных пользователей хабра типа войтивайти. Возможно эти все части паззла как-то связаны.

SA>Что скажет общество?
SA>Как по вашему мнению, такая ситуация в сфере разработки ПО теперь нормальна?
SA>Или это только во фронтенде?

Вылизывание кода я за 24 года видел только в одном проекте.
И то — этот проект был опенсорсным на довольствии у очень богатой компании.
Парни работали неспешно, никаких сроков, никаких релизов. Каждый тикет могли переписывать раз по пять. Обсуждать детали реализации по паре месяцев.
В таких условиях почему бы и нет

А в остальных компаниях за красотой кода не гнались, главное, чтобы работало.
_____________________
С уважением,
Stanislav V. Zudin
Re[11]: оцените код
От: Stanislav V. Zudin Россия  
Дата: 23.12.21 14:26
Оценка:
Здравствуйте, kaa.python, Вы писали:

SVZ>>Потому что в обычных компаниях переписыванием работающего кода не занимаются.


KP>Чувствую пришло время определиться с тем, что же такое "обычная компания"


В моём понимании это компания, где количество народу исчисляется десятками. Компания живёт на самообеспечении, никаких "томатных спонсоров".

В проектах, с которыми я сталкивался, технический долг возникал не из-за оформления кода, а тупо из-за эволюции.
Изначально архитектура разрабатывалась под одни требования. Потом, по мере развития технологий, появлялись новые требования, часто абсолютно противоречащие друг-другу.
И тогда да, лет через 10 вклячить в проект очередную хотелку становится ой как трудно.
_____________________
С уважением,
Stanislav V. Zudin
Re[9]: оцените код
От: Sharov Россия  
Дата: 23.12.21 14:44
Оценка:
Здравствуйте, kaa.python, Вы писали:

S>>Ну с другой стороны человек может на предупреждения IDE забить, а результаты CI видны всем.

S>>Скорее всего имеет смысл.
KP>Многие тесты довольно тяжело запускать локально и они жрут прорву вычислительного времени. Тот же SonarQube не очень удобно стартовать локально по моим ощущениям. Ну и как еще быть уверенным что они реально были запущены перед коммитом? Плюс некоторые специфичные линтеры будут иметь сложности с лицензиями если за пределами CI. Куча проблем которые быстро и универсально решаются если все эти проверки часть CI. Локально же хватает предупреждений от ClangTidy, после него довольно редко что-то еще находится уже во время сборки на CI, хотя и бывает.

Речь о предупреждения по итогу компиляции, зачем еще тесты запускать? Получил замечание от компилятора, линтеров,
исправил, и далее по кругу.
Кодом людям нужно помогать!
Re[11]: оцените код
От: Stanislav V. Zudin Россия  
Дата: 23.12.21 14:53
Оценка:
Здравствуйте, StandAlone, Вы писали:

SVZ>>Будешь переписывать — пользователи ждать не будут, уйдут к конкурентам и компания разорится


SA>А пока эти самые пользователи генерят сотни багрепортов практически кажный божий день, они конечно страсть как довольны.


Реакция на багрепорты не зависит от красоты кода. Это исключительно политика компании.
Одни кидаются сразу исправлять, другие прикидываются ветошью и не исправляют, пока не возбухнет какой-нибудь очень богатый корпоративный клиент.
_____________________
С уважением,
Stanislav V. Zudin
Re[11]: оцените код
От: Sharov Россия  
Дата: 24.12.21 09:34
Оценка:
Здравствуйте, kaa.python, Вы писали:

S>>Речь о предупреждения по итогу компиляции, зачем еще тесты запускать? Получил замечание от компилятора, линтеров,

S>>исправил, и далее по кругу.
KP>Оговорился, не тесты, а проверки статическими анализаторами. Локально ты правишь только то, что тебе говорят локально установленные анализаторы (ты волен ничего не устанавливать), а вот анализаторы как часть CI проверяют что код соответствует минимально допустимому уровню в компании. Короче, правильный CI должен быть

А CI какой, Teamcity, например?
Кодом людям нужно помогать!
Re: Это сеньорский код?
От: yenik  
Дата: 24.12.21 10:50
Оценка:
Знал я одного человека, который и как архитектор, и как руководитель был очень хорош. Он давно ушёл на высокую должность.
А вот код он писал такой, что кровь из глаз. Строки по 500 знаков, функции по 200 строк и т.д.
Он просто настолько хорошо соображал, что ему любой говнокод было не в тягость читать. Ну и сам он писал соответственно.
Re[2]: Это сеньорский код?
От: CreatorCray  
Дата: 24.12.21 12:57
Оценка:
Здравствуйте, yenik, Вы писали:

Y>Он просто настолько хорошо соображал


Нет, говнокод пишут не поэтому.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[5]: Это сеньорский код?
От: alzt  
Дата: 24.12.21 20:54
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Возьми любую реализацию серьезного математического алгоритма. Код, конечно, понятный, если это хорошая реализация, но обеспечить понятность кода — это не самая главная задача для автора.


Так математики обычно и программируют плохо. Сейчас кому только не программирует.
Но здесь же претензии именно к программисту, поэтому пусть потрудится, напишет лучше, а не по принципу — а всё равно никому не потребуется. ТС потребовалось же.
Re[8]: Это сеньорский код?
От: alzt  
Дата: 24.12.21 20:58
Оценка:
Здравствуйте, so5team, Вы писали:

S>А тут не нужно думать. Еще на стадии обучения программированию на подкорке должно были быть выбиты навыки выбора внятных идентификаторов и аккуратного написания кода.


S>Вы когда сильно голодны про вилку с ложкой забываете и все поглощаете исключительно с помощью рук? Или все-таки приобретенные в детстве навыки позволяют вам использовать столовые приборы?


Здесь не соглашусь. Всё же причесать код требует усилий. А если задача сложная, неоднозначная и алгоритм сходу не придумывается, то надо много усилий, чтобы просто заставить его хоть как-то работать. Черновая версия при этом будет выглядеть не очень.

Я как понял, что при этом человек комитит как есть и оправдывается тем, что всё равно "кому надо поймёт". Наверное, такой подход и оправдан где-то.
Re: Это сеньорский код?
От: alzt  
Дата: 24.12.21 21:11
Оценка:
Здравствуйте, StandAlone, Вы писали:

SA>Код достался мне на поддержку. Автор доступен, но по поводу своего творения не может сказать ни слова, кроме общих предположений.

SA>Я попытался выяснить, как такое вообще попало в мастер, в ответ услышал — "Этот человек выше чем сеньор, в подробном ревью не нуждается".

Я думаю ты не прав. Тебе код достался на поддержку — теперь ты за него отвечаешь. А ты вместо этого решил археологией заняться и ещё обвиняешь других людей.

При этом ты не знаешь в каких условиях они писали. Тут может быть как требование сделать здесь и сейчас, так и банальная неопытность писавшего. Может он потом исправился, а может и нет, сразу пошёл в руководители.

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

Ситуация была бы другой, если бы он это сейчас пытался закомитить, а ты бы ему не давал. Тогда да, никаких оправданий нет.
Re[2]: Это сеньорский код?
От: CreatorCray  
Дата: 24.12.21 22:40
Оценка:
Здравствуйте, alzt, Вы писали:

A>При этом ты не знаешь в каких условиях они писали. Тут может быть как требование сделать здесь и сейчас, так и банальная неопытность писавшего. Может он потом исправился, а может и нет, сразу пошёл в руководители.


Код от этого лучше не становится
Так что всё равно.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[4]: Это сеньорский код?
От: Pavel Dvorkin Россия  
Дата: 25.12.21 04:13
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Судя по коду это отголоски до сих пор не прошедшей моды на ФП -- хаскель, монады и вот это вот все.

S>Типа быть таким крутым замороченным спецом, которому ну никак нельзя сделать просто, а надо
S>сделать трушно, с множеством слов из мира ФП и теории типов.

Кстати, да.

Никого в Java не напрягает вот такой примерно код


List<String>  list = users.stream().filter(...).sorted(...).collect(...);


более того, это сейчас просто норма. Никто не предлагает разбить это на части.

Но так пишут потому, что есть класс Stream, а его методы возвращают опять же Stream.

А если бы его не было, то получилось бы нечто вроде


List<String>  list = makeStringList(sorted(filter(users)));
With best regards
Pavel Dvorkin
Re[11]: оцените код
От: no_ise  
Дата: 25.12.21 19:40
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Здравствуйте, Stanislav V. Zudin, Вы писали:


SVZ>>И где так делают?

SVZ>>В каких-нибудь сильно богатых Гуглах?

KP>Так делали во всех 3-х компаниях где я работал за последнии 7 лет. Две богатые, но сильно не Гугл — Autodesk и Motional, и один стартап (там CTO крайне продвинутый и понимает цену технического долга и последующие проблемы развития).


Это у Autodesk то внутри мамонтообразного кода нет?


SVZ>>Потому что в обычных компаниях переписыванием работающего кода не занимаются.


KP>Чувствую пришло время определиться с тем, что же такое "обычная компания"


Ага Да, у Хофштадтера, кажется, было: медианы не существует.
Re[10]: оцените код
От: no_ise  
Дата: 25.12.21 19:59
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:


PD>Здравствуйте, kaa.python, Вы писали:



KP>>Нет, так ни в коем случае делать не надо и в приличных компаниях так не делают. Тут есть только два приемлемых решения. 1) говнокодер-ученый учится писать код. Лучший вариант, у нас гора PhD в ML и robotics и они, внезапно, пишут отличный код промышленного качества. 2) если корона не позволяет ученому научиться программировать, то говнокод используется строго как концепт и выкидывается после окончания исследования.


PD>Ответил в ответе CreatorCray, не буду повторяться


PD>http://rsdn.org/forum/job/8160106.1
Автор: Pavel Dvorkin
Дата: 23.12.21


KP>>Надеюсь что своих студентов вы несколько иначе учите тому как надо писать код, потому что от "уважительных причин" для говнокодинья волосы дыбом встают. Им же потом работу работать, уволят с испытательного срока


PD>Не волнуйтесь, тут как раз все в полном порядке. Дело в том, что учу я их писать сейчас как раз код серверной части бизнес — приложений. И делаем мы это с автоматической проверкой кода, так что мои замечания к коду в основном касаются именно этого самого рефакторинга, по большому счету. Не только это, конечно, но и этого хватает.


PD>Что же касается их работы — пока вроде никто не жаловался и никого не уволили.

PD>https://xn----7sbb1bdckl3bc1dyd.xn--p1ai/#rec351063040

PD>А вот когда пару лет назад пришлось решать задачу, похожую на ту, что я описал — тут требования были те же. Найти алгоритм, который решает задачу. Увы, не нашли.



Phd Phd рознь. Вообще, (универсальность и сопровождаемость vs алгоритмическое превосходство) в условиях (ограниченного времени/ресурсов)
это тема настолько бородатая... И до сих пор кмк универсального решения толком не известно... Может ли оно вообще существовать в нашем пространстве?

Это как, например, можно представить, что реально хоть и сложно будет воспитать спортсмена мастерски играть в футбол и волейбол.
А вот одновременно мастерски играть в шахматы и поднимать штангу?

Наверно, в каком-то другом измерении все это легко выполнимо. Т.е. если будет в шахматы играть и штангу поднимать какой-нибудь
андроид на стероидах. Или алгоритмы изобретать и код хороший выдавать будет AI, ну или, хотя бы, чтоб AI одно из двух делал.
Отредактировано 26.12.2021 0:05 no_ise . Предыдущая версия . Еще …
Отредактировано 25.12.2021 20:16 no_ise . Предыдущая версия .
Отредактировано 25.12.2021 20:00 no_ise . Предыдущая версия .
Re[12]: оцените код
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 26.12.21 03:12
Оценка:
Здравствуйте, no_ise, Вы писали:

_>Это у Autodesk то внутри мамонтообразного кода нет?


В старом коде — есть, в новом коде активно борятся вполть до выкидывание целых кривых подсистем и переписывания с нуля.

_>Ага Да, у Хофштадтера, кажется, было: медианы не существует.


А еще где-то было "чукча не читатель, чукча писатель", только не помню кто сказал
Re[5]: Это сеньорский код?
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 26.12.21 03:13
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Никого в Java не напрягает вот такой примерно код

PD>
PD>List<String>  list = users.stream().filter(...).sorted(...).collect(...);
PD>


PD>более того, это сейчас просто норма. Никто не предлагает разбить это на части.


Именно, этот код читабельный и понятный.

PD>А если бы его не было, то получилось бы нечто вроде


PD>
PD>List<String>  list = makeStringList(sorted(filter(users)));
PD>


А вот что-то вроде уже бы предложили переписать
Re[5]: Это сеньорский код?
От: Lazytech Ниоткуда  
Дата: 26.12.21 03:27
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Никого в Java не напрягает вот такой примерно код

PD>
PD>List<String>  list = users.stream().filter(...).sorted(...).collect(...);
PD>

PD>более того, это сейчас просто норма. Никто не предлагает разбить это на части.

Напомню, в нелепом и убогом JavaScript подобные цепочки функций нередко записывают вертикально для улучшения читабельности:
let list = users.stream()
                .filter(...)
                .sorted(...)
                .collect(...);


jQuery Chaining

Хотя, наверное, можно писать кому как удобно.
Отредактировано 26.12.2021 3:33 Lazytech . Предыдущая версия .
Re[13]: оцените код
От: no_ise  
Дата: 26.12.21 04:06
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Здравствуйте, no_ise, Вы писали:


_>>Это у Autodesk то внутри мамонтообразного кода нет?


KP>В старом коде — есть, в новом коде активно борятся вполть до выкидывание целых кривых подсистем и переписывания с нуля.


Я не сторонник нечитаемости и нерасширяемости. К тому же, уже безотносительно Autodesk, нечитаемость и нерасширяемость
встречаются двух сортов (все реже и реже, что не может не радовать)
а) Код написанный, скажем, в 2000-х и настолько чудесно запроданный за 20 лет, что это уже священная корова,
которая кормила и поила все переписывания, слияния-поглощения, яхты и новые отделы.
б) Чей-то mortgage code.

_>>Ага Да, у Хофштадтера, кажется, было: медианы не существует.


KP>А еще где-то было "чукча не читатель, чукча писатель", только не помню кто сказал


Всех не упомнишь В смысле, что вряд ли так просто получится устаканить определение "обычной компании".
Если по всем критериям усреднить то скорее всего какая-то "необычно серая компания" получится.
Re[6]: Это сеньорский код?
От: Pavel Dvorkin Россия  
Дата: 26.12.21 04:30
Оценка:
Здравствуйте, kaa.python, Вы писали:


PD>>А если бы его не было, то получилось бы нечто вроде


PD>>
PD>>List<String>  list = makeStringList(sorted(filter(users)));
PD>>


KP>А вот что-то вроде уже бы предложили переписать


А что тут нечитабельного и непонятного ? Только то, что порядок действий справа налево и вместо точки используются круглые скобки ?
Прочие-то аргументы ТС (побочные эффекты) тут не проходят — они одни и те же.
With best regards
Pavel Dvorkin
Re[2]: а как Вам такой кусочек кода ?
От: CreatorCray  
Дата: 26.12.21 06:44
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Все понятно ? Беретесь сопровождать после 10 минут знакомства с этим кодом ?

PD>Или тоже объявите это говнокодом ?

Самую малость причесать (первый раз вижу чтоб A & ~B писали как A &~ B) и нормально.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[4]: а как Вам такой кусочек кода ?
От: CreatorCray  
Дата: 26.12.21 09:32
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Напиши автору

Зачем? Верховного пЫнвина уже не перевоспитаешь
Но он хоть старается писать просто.

PD>Но ты не ответил на вопрос. Код действительно понятен ? Вносить изменения будет легко ?

С бОльшего понятен. Немного простого рефакторинга и будет совсем хорошо.

PD>дать имена из 10-15 символов

Имена надо давать внятные а не из "10-15 символов".
Но такой код очень легко превращается в удобночитаемый через refactor rename, структуру там не надо править.

PD>Я себе представляю, что бы тут завопили, если бы я представил код с несколькими однобуквенными именами и методом с именем ffz для бизнес-приложения. И правильно бы завопили.

Имена поправить проще чем вывихнутую логику.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[6]: а как Вам такой кусочек кода ?
От: CreatorCray  
Дата: 26.12.21 23:42
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Да и так вроде неплохо. Работает на всех Дебианах, Убунтах и прочих Редхетах уже не один десяток лет.


Машине всё равно. Код рефакторится для понимания его человеком.

PD>Однобуквенные имена внятные только если это переменные из математики или физики.

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

PD> Ну а в том примере, что такое s, x и m — мне так не очень понятно.

Ну т.е. ты в итоге со мной согласился что "Имена надо давать внятные"

PD>Ох, что-то я сомневаюсь, что "++s &~ *++m" станет намного понятнее, если заменить s и m на что-то иное с помощью refactor rename.

Если ещё и ++ вынести отдельно то станет ещё чуток понятнее. Но в целом уже ок, тут ничего от глаза не прячется.

PD>Логика, я думаю, тут в полном порядке.

Тут да. Я имел в виду вывихи в других примерах.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[8]: а как Вам такой кусочек кода ?
От: CreatorCray  
Дата: 28.12.21 11:26
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

CC>>Машине всё равно. Код рефакторится для понимания его человеком.

PD>Верно, но при условии. что этот человек может разобраться в такого рода коде.

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

PD>Разница между нашими точками зрения в том, что для тебя эта максима, нарушение которой никогда не возможно и ведет в геенну огненную.

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

PD> Для меня это лишь одно из требований к коду, которое может быть первоприоритетным, если нет других, более существенных в данном случае требований.

Верно, но в рассматриваемых примерах нет совершенно никаких "других, более существенных в данном случае требований", которые бы оправдывали небрежность, которую мы там наблюдаем.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[9]: а как Вам такой кусочек кода ?
От: Pavel Dvorkin Россия  
Дата: 28.12.21 13:47
Оценка:
Здравствуйте, CreatorCray, Вы писали:

Ладно, пошли уже по кругу. Пора заканчивать.

С Новым Годом и чистым кодом!
With best regards
Pavel Dvorkin
Re[6]: а как Вам такой кусочек кода ?
От: alzt  
Дата: 28.12.21 18:27
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

CC>>Но такой код очень легко превращается в удобночитаемый через refactor rename, структуру там не надо править.


PD>Ох, что-то я сомневаюсь, что "++s &~ *++m" станет намного понятнее, если заменить s и m на что-то иное с помощью refactor rename.


Будет лучше, причём значительно. Во-первых, s и m можно назвать. Хуже от этого точно не станет. Вообще не понимаю — какой смысл называть переменную одной буквой, что именно экономится при этом?

Во-вторых, там не ++s, а s с разыменованием. И это вообще не интуитивно. Это не олимпиада по знанию приоритетов операций, код должен читаться легко. Надо явно создать переменные и их назвать. И да, выделить 100500 функций, которые пояснят что именно происходит.
Re[8]: а как Вам такой кусочек кода ?
От: alzt  
Дата: 28.12.21 18:37
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А также если это математический или физический расчет и есть общепринятые обозначения


PD>

PD>double x = -p/2 + sqrt(p*p/4 - q)

PD>


PD>лучше чем что-то иное.


Не лучше. Я не понимаю, что здесь происходит. И вообще не факт, что я не буду следующим, кто будет вынужден этот код поддерживать.
И будет сильно лучше для всех, если этот код будет выглядеть так:

PD>
double someFuncWithClearName(double p, double q) {
    return -p/2 + sqrt(p*p/4 - q);
}

PD>double x = someFuncWithClearName(p, q);
PD>


В целом это похоже на создание касты "для тех кто понимет, что здесь происходит".
Математики тоже могут так загадить код, что потом сами перестанут понимать что происходит и где какая известная для них функция используется. И наверняка эта формула там не один раз встречается. Если где-то есть ошибка, то её надо будет искать везде.
Если захочется поменять формулу по каким-то причинам, то тоже придётся её везде искать, вместо того, чтобы исправить в одном месте.
Re[9]: а как Вам такой кусочек кода ?
От: Pavel Dvorkin Россия  
Дата: 30.12.21 00:51
Оценка:
Здравствуйте, alzt, Вы писали:

PD>>А также если это математический или физический расчет и есть общепринятые обозначения


PD>>

PD>>double x = -p/2 + sqrt(p*p/4 - q)

PD>>


PD>>лучше чем что-то иное.


A>Не лучше. Я не понимаю, что здесь происходит. И вообще не факт, что я не буду следующим, кто будет вынужден этот код поддерживать.

A>И будет сильно лучше для всех, если этот код будет выглядеть так:

PD>>
A>double someFuncWithClearName(double p, double q) {
A>    return -p/2 + sqrt(p*p/4 - q);
A>}

PD>>double x = someFuncWithClearName(p, q);
PD>>


A>В целом это похоже на создание касты "для тех кто понимет, что здесь происходит".

A>Математики тоже могут так загадить код, что потом сами перестанут понимать что происходит и где какая известная для них функция используется. И наверняка эта формула там не один раз встречается. Если где-то есть ошибка, то её надо будет искать везде.
A>Если захочется поменять формулу по каким-то причинам, то тоже придётся её везде искать, вместо того, чтобы исправить в одном месте.

Хороший пример, на нем как раз можно продемонстрировать, что в разных случаях возможны разные решения.

Дело в том, что твоя someFuncWithClearName вычисляет только x1. А еще есть x2, вычисляемый почти по той же формуле.
Делать 2 штуки someFuncWithClearName1 и someFuncWithClearName2 довольно глупо — зачем деление и sqrt 2 раза производить ?
Делать одну someFuncWithClearName с дополнительным параметром типа boolean, например — можно, но будут лишние if и опять же 2 раза вычисление sqrt. И понятнее не будет, скорее наоборот.
Делать метод, который вернет их оба — можно, но результат будет типа какой то pair или tuple, а это скорее всего класс, и значит, выделение памяти в куче, boxing и потом unboxing, что тут вообще-то совсем ни к чему.
И наконец, что если в каком-то месте мне нужен только x1, а x2 совсем не нужен ? А в другом только x2, а x1 не нужен ? Лишнюю работу выполнять незачем, и будет это не понятнее, а наоборот — придется объяснять в виде комментария, зачем мы возвращаем то, что нам не нужно.

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


double t = -p/2;
double s = sqrt(t*t-q);
double x1 = t+s;
double x2 = t-s;


и все. И это будет понятнее.
With best regards
Pavel Dvorkin
Отредактировано 30.12.2021 1:30 Pavel Dvorkin . Предыдущая версия . Еще …
Отредактировано 30.12.2021 1:26 Pavel Dvorkin . Предыдущая версия .
Отредактировано 30.12.2021 1:11 Pavel Dvorkin . Предыдущая версия .
Re[10]: а как Вам такой кусочек кода ?
От: alzt  
Дата: 30.12.21 18:46
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Дело в том, что твоя someFuncWithClearName вычисляет только x1. А еще есть x2, вычисляемый почти по той же формуле.

PD>Делать 2 штуки someFuncWithClearName1 и someFuncWithClearName2 довольно глупо — зачем деление и sqrt 2 раза производить ?

Зависит от ситуации. В большинстве случаев — да. Это реально ни на что не влияет. Если это проект, где нужна скорость и есть бенчмарки, которые показывают, что 2 раза вычислить квадратный корень нельзя, тогда это не подходит. Но в большинстве случаев это будет преждевременной оптимизацией. Тормозить по факту будет что-то другое.

PD>Делать одну someFuncWithClearName с дополнительным параметром типа boolean, например — можно, но будут лишние if и опять же 2 раза вычисление sqrt. И понятнее не будет, скорее наоборот.

PD>Делать метод, который вернет их оба — можно, но результат будет типа какой то pair или tuple, а это скорее всего класс, и значит, выделение памяти в куче, boxing и потом unboxing, что тут вообще-то совсем ни к чему.
PD>И наконец, что если в каком-то месте мне нужен только x1, а x2 совсем не нужен ? А в другом только x2, а x1 не нужен ? Лишнюю работу выполнять незачем, и будет это не понятнее, а наоборот — придется объяснять в виде комментария, зачем мы возвращаем то, что нам не нужно.

Это означает, что пора создавать класс, который будет иметь функции someFuncWithClearName, someOtherFuncWithClearName и т.д. и кешировать свои данные, чтобы этот корень дважды не вызывался. А может вообще пора наплодить интерфейсов, написать фабрик и декораторов. И я не утрирую и не иронизирую. Зависит от ситуации, но почти всегда это будет лучше, чем то, что было описано выше. Потом менять что-то будет сильно проще. И не обязательно брать какого-то волшебного человека, который в этом разбирается, досаточно просто обычного программиста.
Re[11]: а как Вам такой кусочек кода ?
От: Pavel Dvorkin Россия  
Дата: 31.12.21 01:27
Оценка:
Здравствуйте, alzt, Вы писали:

A>Зависит от ситуации. В большинстве случаев — да. Это реально ни на что не влияет. Если это проект, где нужна скорость и есть бенчмарки, которые показывают, что 2 раза вычислить квадратный корень нельзя, тогда это не подходит. Но в большинстве случаев это будет преждевременной оптимизацией.


Не могу согласиться. Не делать лишние вызовы функции там, где это совсем не нужно? , более того, очевидно не нужно — это не преждевременная оптимизация, а просто правила написания хорошего кода.

A>Это означает, что пора создавать класс, который будет иметь функции someFuncWithClearName, someOtherFuncWithClearName и т.д. и кешировать свои данные, чтобы этот корень дважды не вызывался.


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

>Тормозить по факту будет что-то другое.


Ну а у меня тормозил именно sqrt, и настолько, что я вынужден был произвести аналитические преобразования в условии и избавиться от квадратного корня вообще.

>А может вообще пора наплодить интерфейсов, написать фабрик и декораторов.


М-да...


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


Только с этим согласиться могу. Найти программиста, который ради четырех строчек вычисления корней квадратного уравнения наплодит новые классы, интерфейсы, декораторы и прочие паттерны, сделает код на сотню строк, потратив на это полдня — тут и впрямь проблемы нет.

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

Поэтому продолжать не буду. За тобой, конечно, право на ответ.

С Новым Годом!
With best regards
Pavel Dvorkin
Re[12]: а как Вам такой кусочек кода ?
От: alzt  
Дата: 01.01.22 20:30
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Не могу согласиться. Не делать лишние вызовы функции там, где это совсем не нужно? , более того, очевидно не нужно — это не преждевременная оптимизация, а просто правила написания хорошего кода.


Я не понял о чём это предложение. Вызов функции является способом оформить свои мысли, и это является правилом написания хорошего кода.
Если ты про тоже — то я согласен.

PD>Тоже не могу согласиться. Заводить новый класс ради таких пустяков, тратить бог знает сколько памяти на это кеширование — с хорошей точностью хранить таблицу квадратных корней без серьезного расхода памяти невозможно, а обычное хеширование приведет к существенной просадке скорости, так как на одну машинную команду FSQRT будет приходиться десяток-два команд для поиска в хеш-таблице Да и смысла в этом нет, так как основная идея кеширования — повторяемость запросов, а тут этого ждать не приходится.


А при чём здесь кеширование? В С++ никаких накладных расходов на класс не будет. Если это Java, то там вообще никого не волнует производительность. Основные проблемы с кодом случаются не из-за производительности, а из-за того, что другим программистам сложно читать код и они не понимают, что происходит. Класс упрощает эту задачу. Понятно, что будут задачи, где один толковый человек с опытом сможет разобраться за пару часов, и там важна скорость. Тогда да — к чёрту красивый код, пусть пишет так, чтобы работало быстро. Но обычно по другому.

PD>Только с этим согласиться могу. Найти программиста, который ради четырех строчек вычисления корней квадратного уравнения наплодит новые классы, интерфейсы, декораторы и прочие паттерны, сделает код на сотню строк, потратив на это полдня — тут и впрямь проблемы нет.


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