Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Category:

Открыл для себя заново IDE

Я тут несколько недель бьюсь с багом моей системы поиска дубликатов через 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.
Tags: programming, все пидарасы а я, до чего техника дошла
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 11 comments