juan_gandhi: (Default)
[personal profile] juan_gandhi
Памяти сейчас много стало; большое количество кода вполне манипулируемо. И уже эпоха маленького кода, в стиле интервью, прошла.
Прошла также эпоха джавабинзов, адаптеров, адаптерменеджеров, и всякой этой нелепой ахинеи, придуманной досужими бангалорскими браминами.

Код должен:
- быть хорошо абстрагирован
- быть читабелен
- быть хорошо модулирован
- быть тотален
- не мусорить в логах
радовать глаз ([personal profile] gxachaturov )
- переводить все случающиеся дефекты на:
  -- простой человеческий
  -- язык статистики и МЛ (чтоб анализировать и машины могли)

Абстракции вообще главное. Код, требующий бойлерплейт - плохой код.

 

Не удержался

Date: 2019-02-22 10:29 pm (UTC)
From: [personal profile] malobukov
Любую проблему можно решить добавлением уровня абстракции, кроме проблемы слишком большого количества уровней абстракции.

Re: Не удержался

Date: 2019-02-23 06:43 am (UTC)
From: [personal profile] mikkim08
Можно размерность добавить. И тогда все абстракции сливаются в одну картинку.

Не понял. Можно пример ?

Re: Не удержался

Date: 2019-02-23 05:19 pm (UTC)
From: [personal profile] mikkim08
Спасибо. Но без примеров к сожалению это всё не очень хорошо понятно.

Re: Не удержался

Date: 2019-02-23 07:16 pm (UTC)
From: [personal profile] mikkim08
А может уже кто и написал.

Date: 2019-02-23 03:56 am (UTC)
gxachaturov: (Default)
From: [personal profile] gxachaturov
код должен радовать глаз

Date: 2019-02-24 04:07 am (UTC)
pappadeux: (Default)
From: [personal profile] pappadeux
левый глаз

Date: 2019-02-26 12:14 am (UTC)
From: [personal profile] anonim_legion
Do what you want, 'cause pirate a free...
You are a pirate!

Date: 2019-02-23 08:20 am (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Конкретика типа "не мусорить в логах" или "переводить случающиеся дефекты на язык статистики и МЛ" выглядит уж очень домен-специфично.

Date: 2019-02-23 09:07 am (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
- не мусорить в логах

То есть должен скрывать все внутренние проблемы.

Заметим, нет главного свойства:
- делать то что нужно, и не делать то, что не нужно

Плюс ещё два, о которых я сейчас не готов затевать дискуссию.

Date: 2019-02-23 12:31 pm (UTC)
uselessextras: (Default)
From: [personal profile] uselessextras
Наоборот же. Демонстрировать только проблемы, с достаточным количеством деталей для анализа. А не поносить в логи все, что на вход пришло, помноженное на внутренности.

Date: 2019-02-23 01:08 pm (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
Демонстрировать только проблемы, с достаточным количеством деталей для анализа

Угу. А непонятные проблемы не демонстрировать. Короче, be agile

Date: 2019-02-25 12:46 am (UTC)
pappadeux: (Default)
From: [personal profile] pappadeux
А Вы, я гляжу, отказываетесь присоединяться к нашей новой, прогрессивной и гуманистической религии

На кол еретика!

Date: 2019-02-25 11:17 am (UTC)
snowps: (Default)
From: [personal profile] snowps
Nobody expects the spanish inquisition. (c)

Date: 2019-02-23 05:08 pm (UTC)
snowps: (Default)
From: [personal profile] snowps
То, что не нужно, обычно делается кодом как раз при избытке уровней абстракции, поскольку код - это интегрально всё, что выполняется на процессоре, а не лаконичный текст высокоуровневой программы, который сам по себе - абстракция кода.

Date: 2019-02-23 07:17 pm (UTC)
snowps: (Default)
From: [personal profile] snowps
Алгоритм решения задачи - это абстракция решении задачи. То есть если программисту удобнее облечь задачу в некоторую абстрактную форму, то надо чётко понимать, что результат работы программы - это не просто решение, которое описано программистом в виде текста, а интегральный набор всех действий, которые были выполнены на железе для получения этого результата. Если для того, чтобы умножить 123 на 456 нужно 456 раз суммировать 123, то формально задача выполнена, а практически - выполнена с издержками, что как раз и попадает под определение "делать то, что не надо и не делать то, что надо". Формальное решение задачи - это Малевич, практическое решение задачи - это фотография. Первое радует программиста-художника, второе - программиста-инженера, а заказчика обычно радует что-то среднее.

Date: 2019-02-23 08:21 pm (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
Заказчика обычно радует, когда о нём помнят. Но это сейчас необязательно. У программистов совсем другие цели.

Date: 2019-02-24 08:53 am (UTC)
snowps: (Default)
From: [personal profile] snowps
Да, есть такая проблема. :)

Date: 2019-02-24 08:41 am (UTC)
snowps: (Default)
From: [personal profile] snowps
Скорее я понимаю узость чисто инженерного (и близкого мне) подхода, когда идеальный код должен радовать не столько формой, сколько содержанием, поскольку есть множество юзкейзов, где содержание не важно, а важна форма (как, к примеру, графический интерьерный дизайн Поллока или Ротко, который в реальности живописью не является, но прекрасно вписывается в аскетичные современные модные интерьеры), но я так же и понимаю, что когда стоит задача нарисовать похожий портрет, то поздний Пикассо, к примеру, при всём формальном отнесении к живописи, эту задачу решает плохо. То же самое и с программированием. :) Нет такого понятия - "правильный код", есть понятие "код, правильно решающий поставленную задачу" и посыл "правильный код - это код, который нравится писать программисту" - это не характеристика качества кода, а характеристика пристрастий программиста, не более того.

Я сейчас не занимаюсь программированием, но когда занимался, искал баги практическим использованием кода, тесты делал и т.п. Более того - на своей первой работе я факультативно занимался QA для мультимедиа-продуктов, которые контора писала, и постоянно находил баги, которые пропускал штатный стафф QA. :) Формальные тесты - это хорошо для задач обработки данных, в которых не случается ничего непредвиденного, а в реальной жизни всё куда сложнее:
:)
Edited Date: 2019-02-24 08:52 am (UTC)

Date: 2019-02-23 07:56 pm (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
это ж модульност

Э-э-э-э-э?

Во времена моей молодости это было V&V (verification & validation), но, видимо, с тех пор компьютерные науки ушли далеко вперёд.

Date: 2019-02-23 08:18 pm (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
Ох. Опять я откопал то, про что знал, но что старался не замечать. Так что просто закрою тему.

Date: 2019-02-24 08:47 am (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
Это тема сложная. Слишком много объяснять надо. Если когда-нибудь напишу книжку, то после этого.

Date: 2019-02-23 11:49 am (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
Для того, чтобы улучшить читабельность кода, код должен быть сгруппирован так, чтобы логически связанный код был рядом друг с другом (в одном и том же файле), а логически несвязанный код - подальше друг от друга (в разных файлах и без ссылок друг на друга).

Date: 2019-02-23 01:09 pm (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
Код многомерен. Так что попытка свалить всё связанное рядом по одной координате ни к чему хорошему не приведёт.

References space

Date: 2019-02-23 01:25 pm (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
Все связанное класть рядом совсем необязательно.
Рядом должно быть наиболее логически связанное.

Кроме того, "рядом" - это не одна координата.
Рядом может быть в тексте.
Также "рядом" может быть потому что ссылка указывает. Например, вызов функции - это тоже "рядом", даже если вызванная функция находится в совсем другом файле.

Пространство ссылок тоже лучше не замусоривать.
С этой точки зрения, наследование - опасный инструмент, потому что он часто связывает друг с другом не относящуюся друг к другу функциональность (условные Cat и Dog при наследовании от Animal связываются гораздо сильнее, чем нужно и замусоривают пространство ссылок).

Re: References space

Date: 2019-02-23 09:59 pm (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
What "trait" do you mean?

Re: References space

Date: 2019-02-23 10:46 pm (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
Do you mean that grouping functionality into classes helps to keep the most relevant things together?

What to bundle together

Date: 2019-02-23 11:42 pm (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
> You bundle stuff together, and from outside the thing looks like a small piece

Right, that is the way to go with excessive complexity.
But just bundling together -- is not enough. If we bundle together irrelevant things, then such code still would be much harder to understand than more optimally bundled code.

We should bundle together things that are the most logically relevant to each other.

Re: What to bundle together

Date: 2019-02-24 01:56 am (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
Yes, some harmony would help. The problem is that "get harmony" advice is not actionable without defining what kind of harmony specifically we need.

Re: References space

Date: 2019-02-23 08:19 pm (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
Все связанное класть рядом совсем необязательно.
Рядом должно быть наиболее логически связанное.


Это такие шедевры логики, что мне даже и спорить не хочется.

Re: References space

Date: 2019-02-23 10:00 pm (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
Уровень связанности может быть разным.
Все связанное можно отсортировать по уровню связанности, и держать поблизости только верхнюю часть списка.

Re: References space

Date: 2019-02-23 10:39 pm (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
Рассмотрим какой-нибудь элемент E0 в коде (например переменная).
Он логически связан с другими элементами в коде [E1 ... EN] (другие переменные, функции, классы, ...).

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


> Вот у нас есть граф

Граф состоит из вершин (и связей между ними).
Для каждой вершины можно создать список связей и выбрать наиболее значимые из этих связей.

Re: References space

Date: 2019-02-23 11:37 pm (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
Да: к узлам эта сортировка не будет иметь прямого отношения.

Re: References space

Date: 2019-02-24 08:55 am (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
Каждой такой связи программист может назначить Rank, в соответствии со своим пониманием кода.

"Силой, данной нам в ощущениях"

Re: References space

Date: 2019-02-24 08:37 am (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
Ох. Когда надо добавить функциональность - связано одно. Когда убрать потери времени - другое. Когда вылезла ошибка в полученных данных - третье.

Многомерное пространство, плюс одна ось линейная, другая логарифмическая, третья вооще странная, и ещё мно других. И теперь нам по разным параметр предлагается вывесть единственное число? Или нам каждый раз под новую задачу код перетасовывать?

Re: References space

Date: 2019-02-24 12:58 pm (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
> по разным параметр предлагается вывесть единственное число?

Скорее список чисел[*] (для упорядочивания и выборки наиболее связанного кода). С учетом текущего понимания взаимодействия кода.

[*] На самом деле, формально ранк связанности элементов кода друг с другом вычислять, обычно, нет смысла. Для грубой сортировки - достаточно интуитивного представления того, насколько элементы кода связаны друг с другом.

> каждый раз под новую задачу код перетасовывать?

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

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

Date: 2019-02-24 01:06 am (UTC)
pappadeux: (Default)
From: [personal profile] pappadeux
все должно быть в одном большим файле

Date: 2019-02-24 01:54 am (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
Нет.
Потому что когда все в одном большом файле, то непонятно что к чему релевантно, и что не релевантно.

Date: 2019-02-24 04:10 am (UTC)
pappadeux: (Default)
From: [personal profile] pappadeux
я к тому,почему меня вообще должно волновать в каких файлах (и в файлах ли вообще) это все лежит?

я думаю о модулях, API и пр, железка должна думать о том, как это хранить физически. Причем у железки есть простой и ясный критерий - скорость компиляции. Если надо порезать на 3 файла и 7 хреней в ДБ - so be it.

Date: 2019-02-24 12:46 pm (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
> почему меня вообще должно волновать в каких файлах

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

Date: 2019-02-24 11:01 pm (UTC)
pappadeux: (Default)
From: [personal profile] pappadeux
> Потому что программист, когда анализирует код - смотрит на содержимое файла.

я, конечно, не настоящий программист, каску на стройке нашел, но давно уже не смотрю на уровне "содержимое файла". Есть namespace, внутри некий модуль с API, перемещаешься от функции к функции мышкой, х.з. какие там файлы подгружаются. Какие-то, наверно, подгружаются...

> Если соседние методы имеют сильную логическую связь с анализируемым методом, то это помогает создать правильную модель того, как взаимодействует код.

и как этому могут помочь "файлы"?

модель и так лежит в голове, а если физическое представление оптимально в виде 78 файлов - so be it.

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

они в системе прорграммирования должны быть где-то рядом, а один файл или два, или 33 - не должно волновать

Relevant code in the same file

Date: 2019-02-25 01:02 am (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
> перемещаешься от функции к функции мышкой

Необязательно мышкой. Часто удобнее клавиатурой перемещаться. Впрочем, в контексте дискуссии "какой код класть в тот же файл?" это непринципиально.

> х.з. какие там файлы подгружаются

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

> они в системе прорграммирования должны быть где-то рядом

Да.

> один файл или два, или 33 - не должно волновать

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

Re: Relevant code in the same file

Date: 2019-02-25 08:12 pm (UTC)
pappadeux: (Default)
From: [personal profile] pappadeux
> Ну вот файл подгрузился, и курсор указывает на имплементацию интересующей нас функции.
Часто бывает полезно взглянуть какие еще функции имплементированы поблизости, чтобы дополнить ментальную модель.

ну так надо определиться, что значит "поблизости". Нужна метрика - семантическая дистанция. Близок - это когда функции в одном неймспейсе. Еще ближе - когда меотды одного класса. Близость от того, что в файле что-то находтися близко это полная архаика.

Семантический анализ, сeмaнатические merge und search.

Деление этого добра на файлы - это для удобства железяки, а не человека

Re: Relevant code in the same file

Date: 2019-02-25 08:23 pm (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
> что значит "поблизости"

Например, "поблизости" может означать - видно на одном экране монитора.

> Близок - это когда функции в одном неймспейсе.

Так тоже полезно измерять.
Но метрика "поблизости в текстовом файле с кодом" - тоже удобна.

> Деление этого добра на файлы - это для удобства железяки, а не человека

Человеку неудобно читать и скроллить файлы слишком большой длины.

Date: 2019-02-24 07:09 am (UTC)
From: [personal profile] sassa_nf
Continuation passing is against all of this.

(Event driven too, as a consequence)

Date: 2019-02-24 10:31 am (UTC)
From: [personal profile] cross_join
Блин горелый, я пытался возвестить о начале конца Ада Паттернов лет 10-15 назад, о чем честно написал в "Дефрагментации мозгп" :)
Тактические паттерны должны умереть вместе с легаси, стратегические останутся: делать какую-нить подсистему авторизации в ERP придется одинаково вне зависмости от языка и среды.

Date: 2019-02-24 03:54 pm (UTC)
From: [personal profile] cross_join
Это моя узкая терминология :) В массах использовали понятия паттернов как бы "проектирования" и аналитические. То что эпоха ушла я тоже вижу, туда и дорога всем этим MVVMVMPC вместо простой идеи разделения логики от экранных формочек, но ушла-то она не вверх, в абстракции, а вниз, в сторону массового "говнокода".
Edited Date: 2019-02-24 04:14 pm (UTC)

Date: 2019-02-24 01:19 pm (UTC)
zhiva: (Default)
From: [personal profile] zhiva
> Абстракции вообще главное. Код, требующий бойлерплейт - плохой код.

cries in Go

Date: 2019-02-26 12:16 am (UTC)
From: [personal profile] anonim_legion
...oh no, it's retarded

Date: 2019-02-25 12:28 am (UTC)
pappadeux: (Default)
From: [personal profile] pappadeux
перефразируя булгакова

-- Кароши? -- строго спрашивал сиреневый мэнэджер.

-- Мировой, -- отвечал программер, кокетливо ковыряя код в IntelliJ

-- Кароши люблю, плохой -- нет, -- сурово говорил мэнэджер.

-- Как же! -- восторженно отвечал программер.

Profile

juan_gandhi: (Default)
Juan-Carlos Gandhi

June 2025

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
2930     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 2nd, 2025 05:21 pm
Powered by Dreamwidth Studios