Блін, чому я все життя роблю такі тупі помилки?
Оце тільки що: колись давно написав скрипт, який час від часу отримує масив даних input_array про недавні логіни певного типу юзерів і щось з ним робить. Зберігаючи в локальному списку array_size довжинu масиву, len(input_array), тому, що залежно від того, чи останній раз функція повернул масив довжиною більше 50 тисяч, ми відкладаємо наступний запуск коду лише на годину, коли більше 40 тисяч -- на дві, і т.п., аж до того, що коли масив має менше тисячі елементів, ми чекаємо цілу добу.
І все працювало, але мене попросили забрати зайві порогові значення, залишити лише оде: > 50 тисяч або ні. І все перестало працювати! Я облазив все, що міг, в таблиці вхідних юзерів -- ну явно ж, якщо щось таке помінялося, то проблема на вході, нє?... Бо мого коду там було піврядка, нема де помилитися!
І лише після кількох днів дурної роботи я зрозумів, що коли робив останню заміну, я замість написати порівняння
array_size[-1] >= 50000
написав
len(array_size) >= 50000
Отакий я дурень :(
P.S. Хто не знає, в Пітоні вираз x[-1] означає останній елемент впорядкованого масиву (списку) x.
Оце тільки що: колись давно написав скрипт, який час від часу отримує масив даних input_array про недавні логіни певного типу юзерів і щось з ним робить. Зберігаючи в локальному списку array_size довжинu масиву, len(input_array), тому, що залежно від того, чи останній раз функція повернул масив довжиною більше 50 тисяч, ми відкладаємо наступний запуск коду лише на годину, коли більше 40 тисяч -- на дві, і т.п., аж до того, що коли масив має менше тисячі елементів, ми чекаємо цілу добу.
І все працювало, але мене попросили забрати зайві порогові значення, залишити лише оде: > 50 тисяч або ні. І все перестало працювати! Я облазив все, що міг, в таблиці вхідних юзерів -- ну явно ж, якщо щось таке помінялося, то проблема на вході, нє?... Бо мого коду там було піврядка, нема де помилитися!
І лише після кількох днів дурної роботи я зрозумів, що коли робив останню заміну, я замість написати порівняння
array_size[-1] >= 50000
написав
len(array_size) >= 50000
Отакий я дурень :(
P.S. Хто не знає, в Пітоні вираз x[-1] означає останній елемент впорядкованого масиву (списку) x.
no subject
Date: 2025-05-28 09:21 pm (UTC)no subject
Date: 2025-05-28 09:50 pm (UTC)У мене що input_array, що array_size -- одномірні цілочисельні масиви. Тому якщо мова допускає динамічне зростння масиву [десь там у мене є рядок array_size.append(len(input_array))], то все би було так само, з точністю до синтаксису того, як би я в робочій версії дивився на останній елемент масиву довжин.
no subject
Date: 2025-05-28 10:32 pm (UTC)no subject
Date: 2025-05-29 06:05 am (UTC)Ну-ну. :)
no subject
Date: 2025-05-29 07:08 am (UTC)no subject
Date: 2025-05-29 01:06 pm (UTC)no subject
Date: 2025-05-29 03:37 pm (UTC)Насправді, назви там цілком змістовні, а не такі, як я ото тут написав. І спочатку все було добре. Суть саме в тому, що я, коли правив, замість значення останнього елементу вектора довжин, написав довжину вектора довжин. А потім шукав всі можливі помилки, крім найтупішої.
Я так колись ключ від машини в холодильник поставив, і пару днів не міг знайти :)
no subject
Date: 2025-05-29 05:17 pm (UTC)"Beauty", врешті-решт (як у квантовій фізиці).
Це така само семантична помилка, як назвати member класу size або len, зробити масив із таких об'єктів, і потім дивуватися помилкам виду ts.len замість ts[0].len
Там вище у коментарі вже написали: воно не повинно компілюватися. І треба докладати зусиль, щоб воно _не_ компілювалося.
no subject
Date: 2025-05-29 05:28 pm (UTC)Як я воюю з людьми, які називають колонки в sql таблицях, наприклад, словом date. Або словом log....
FWIW, змінна називалася recent_disable_user_counts
no subject
Date: 2025-05-29 03:41 pm (UTC)Я колись давно, здається, вже писав. На моїй першій роботі в індустрії мені співробітник звернув увагу, щоб я писав змістовні назви змінний, а не i, j, k всякі. На що я йому відповів: "So, the code is ok, your only suggestion is to make the variable names more semantically meaningful?" На що Тайлер відповів: "Yes, you are being antisemantic. In our modern society this is unacceptable!"
no subject
Date: 2025-05-29 05:02 pm (UTC)Насправді, всюди є винятки.
Змінні i, j, k, lhs, rhs, ret і іжє — цілком утворюють власний паттерн.
Окрім того, конструкції виду
int s=0; // running sum
…вже давно обробляються IDE і, як мінімум, показуються на tooltip.
no subject
Date: 2025-05-29 05:08 pm (UTC)В тій компанії, де йшла мова про мій антисемантизм, з кодом частенько доводилося працювати (щось підправляти, дивитися, і т. п.) не в IDE, a використовуючи старий добрий vi, будучи залогіненим в докер-контейнер, запущений на віртуальній машині, яка в свою чергу запущена на (невідомо, віртуальному чи реальному) сервері, основною функцією якого був раутинг.
Якось я так і не навчився толком в IDE...
no subject
Date: 2025-05-30 06:32 pm (UTC)+100500
There are two hard problems in software engineering:
* cache invalidation,
* naming things,
* and off-by-1 errors.
А так підпишуся під кожним словом - в 98% треба економити не зайві 4 байта, і не час на написання імені змінної - економити треба час і зусилля на прочитання того, що написано.
no subject
Date: 2025-05-30 08:11 pm (UTC)а якщо строго казати, то й
+ mutability взагалі