?

Log in

No account? Create an account
Открыл для себя заново IDE - Дважды мудак — ЖЖ [entries|archive|friends|userinfo]
Декларативное рулит

Site Meter

[ website | Мой сайт ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Открыл для себя заново IDE [июн. 14, 2019|14:47 pm]
Andy Melnikov
[Tags|, , ]

Я тут несколько недель бьюсь с багом моей системы поиска дубликатов через Bloom filters. Почему-то часть входных данных пропадает, не попадая ни в "хорошие", ни в "плохие".

В процессе поиска бага перевёл компонент на TS и основательно его порефачил. В TS тоже, после JS, "если билдится после рефакторинга - значит работает". Не так конечно как в х-е, но в сравнении с ЖС бомба.

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

Сегодня с утра решил, что надо писать доку. Решил писать в формате не "как устроено", а

1. какая задача стоит
2. как можно было бы сделать
3. почему сделано не так, как можно было бы, а так, как сделано

В процессе придумывания, как описать задачу в одно предложение для дебилов, понял, что хорошо бы ввести 3 определения и получилось:

{Component name} is a tool to filter out records having non-unique Z. For example, if more than one record has Z, then the output should not contain _any_ record with Z.

А дальше псевдокодом, используя комбинации слов из текста в качестве идентификаторов, написал на псевдокоде алгоритм.
foreach (record in dataset) {
   Z = extractZ(record)
   if (hasUnique(Z)) {
      keep(record)
   }
   else {
      filterOut(record)
   }
}
На самом деле текста и кода поболее, но они не прошли цензуру NDA. Но суть та же. Далее я замечаю, что в один проход не выйдет реализовать hasUnique(), поэтому нужен доп. проход:
allZ = empty
foreach (record in dataset) {
   allZ += extractZ(record)
}
Ну и дальше если allZ у нас например мультисет - то hasUnique реализуется тривиально. Но такой подход не работает потому что нас порвёт по памяти.

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

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

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

Насчёт IDE - те примитивные рефакторинги, которые поддерживаются (cross-module rename, move definition to a separate file, extract function) - ужасно полезны на практике.

И ещё открыл для себя киллер-фичу - студия в тултипе показывает tsdoc даже по локальным идентификаторам. Ну и в reasonably sized tooltip помещается овердохуя информации, 2 коротких предложения - запросто.

Другая подсветка unreachable code и unused identifiers (привет любителям расцвечивать всё только регулярками) - тоже внезапно полезна при работе с всякими подгнившими кодобазами.

Upd: выяснил тут, что я не дебил - наивная реализация на маленьких файликах правильно классифицирует, но на средних очень быстро создает Map на 3.6 гб и падает. Хез почему именно 3.6.
СсылкаОтветить

Comments:
[User Picture]From: zinal
2019-06-14 07:51 pm
На самом деле даже простейшие инструменты автоматизации работы с кодом офигительно полезны, так как снимают большой объём механической работы - добавляя время на работу содержательную.
(Ответить) (Thread)
[User Picture]From: theiced
2019-06-16 10:34 am
3.6 + 0.4 - зуп даю.
(Ответить) (Thread)
[User Picture]From: nponeccop
2019-06-16 01:41 pm
Ну там общее потребление 3.6. То есть скорее 3.0 - 0.6. Зная нодовцев (хромовцев-v8-щиков на самом деле), не исключено что там у Map какая-то внутренняя таблица, которая больше Х ключей не бывает, потому что это никому не нужно.

У них в начале GC не работал на кучах больше 1.6 гб, даже в 64-битном варианте. Профайлер кучи падал уже при стометровых кучах и т.д.
(Ответить) (Parent) (Thread)
[User Picture]From: theiced
2019-06-16 04:01 pm
как хорошо что я от этого максимально далеко :)
(Ответить) (Parent) (Thread)
[User Picture]From: nponeccop
2019-06-16 04:58 pm
Старожилы помнят ещё CGI, печать HTML-страниц без шаблонов, борьбу с 4 нетскейпом, табличную вёрстку с 1-пиксельными прозрачными гифами и  , перл в браузере через activex! А эти схемы с лонг-поллингом невидимых iframe!

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


(Ответить) (Parent) (Thread)
[User Picture]From: thedeemon
2019-06-17 03:41 pm
Недавно услышал, что когда изобретателям транзистора давали нобелевку, это звучало как "за открытие транзистора", т.к. за изобретения нобелевку не дают.
(Ответить) (Parent) (Thread)
[User Picture]From: daedmen
2019-06-17 03:47 pm
"for their researches on semiconductors and their discovery of the transistor effect"
(Ответить) (Parent) (Thread)
[User Picture]From: nponeccop
2019-06-17 04:43 pm
В этом плане нобелевка за виагру чемпион :)

https://www.nobelprize.org/prizes/medicine/1998/summary/
(Ответить) (Parent) (Thread)
[User Picture]From: pappadeux
2019-06-30 09:22 pm
"one part to the person who shall have made the most important discovery or invention within the field of physics ...” (Excerpt from the will of Alfred Nobel)
(Ответить) (Parent) (Thread)
[User Picture]From: rdia
2019-06-24 02:29 am
На днях заценил VS Code - ну понятно, почему народу так нравится. Действительно, сделано отлично.
(Ответить) (Thread)
[User Picture]From: pappadeux
2019-07-16 05:41 pm
дональд кнут, literate programming
(Ответить) (Thread)