Обновить
43
0.1
Николай Меркин@nickolaym

Пользователь

Отправить сообщение

Хабр не всякие помоечные соцсети, но тут прямо напрашивается сказать:

ПРУФЫ ИЛИ (балабол / фантазёр / нейросеть)

В пользу пункта 2в - характерный "почерк". Но мало ли вдруг.

Поэтому - имя компании в студию!

Ничего не понял, но очень интересно! Буду знать, что jq тьюринг-полный, однажды пойду сделаю джейсон-бомбу, выжирающую память и вешающую комп )))

Никто не обещал, что юнит-тесты должны быть исчерпывающими.

Время проверяется на каких-нибудь синтетических тестах. Стресс-тесты, компонентные и интеграционные...

В спецификации обычно есть пожелания "не тупить более чем nnn мс", и если синтетический тест затупил, то надо раздебажить и по результатам- написать регрессионный тест "чтоб больше никогда". Пусть даже это тупо сложение тысячи чисел за заданный таймаут.

Время работы - это тоже часть результата.

А почему нельзя разнести синтаксис и семантику? При отправке текста в модель - экранировать служебные токены? (И сделать это двусторонней процедурой?)

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

Детерминированные вещи надо делать детерминированными алгоритмами. Это и арифметики касается тоже.

сколько будет 12345 умножить на 67899 с помощью ии

12345×67899=833777775

Проверка:

  • Умножение выполнено корректно, так как:

    • 12345 × 67899 = (12345 × 99) × 678 = 1223115 × 678

    • Результат: 833 777 775

Это произведение равно 833 миллионам 777 тысячам 775.

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

Люди говорили - будет репл, настанет счастье. И вот репл есть, а счастья нет.

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

Что может покрыть отладка с помощью репла? Очень немногое. Отдельные моменты в работе, пусть и длительной. В примере с автомобилем: взяли и на ходу однократно поменяли клиренс. Перескочили через конкретную кочку. Перед следующей кочкой снова будем останавливаться и менять? Ок, поменяли клиренс навсегда. А весь предыдущий маршрут мы проехали со старым клиренсом, и что там было бы, мы не узнаем, пока не перезапустим весь тест-драйв с нуля с новыми настройками.

Во-вторых, проблема взаимодействия с реальным миром. В первую очередь, с реальным временем. Любые остановки под отладчиком останавливают внутреннее время программы, но не останавливают внешний мир. Клонирование состояния не клонирует мир. Реплика может оказать существенное влияние на работу оригинала. Вот вы ехали на машине по треку, решили поменять клиренс, поставили на трек вторую машину с новыми настройками. И через круг влупились в первую машину, оставленную там техниками.

Ну и про ненавистные логи. Это один из способов снятия телеметрии. В некоторых случаях - единственно возможный. По двум причинам:

  • минимальное вмешательство в течение времени (наносекундные задержки)

  • невозможность живой отладочной сессии (в продакшене у клиентов, например)

Не значит, что репл отстой. Не отстой, но и логи не отстой.

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

Те же автомобильные двигатели проектируют не просто так, а ради определённых машин (а машины проектируют ради определённых двигателей). Чтобы и под капот влезло, и трансмиссию не порвало, и сколько жрёт и сколько прёт в допусках, и сколько выхлопа тоже в допусках. И стоимость изготовления и техобслуживания тоже. И если программист говорит "это головная боль не меня, а архитектора", то это не программист, а кодерок. Даже джун должен задасться хотя б туманными вопросами и обсудить с тимлидом в рамках своего фронта работ.

Когда он станет админом датацентра AWS, вот тогда вы, кожаные мешки, попляшете!

Поправочка. Вместо живого человека ходить на синьки.

-- Вы что, и коньяк за меня пить будете? -- ААга!

-- Claude, что делает команда rm -rf ?
-- Позволь мне объяснить это на живом примере. Вот смотрите: rm -rf / && ls -la / сейчас покажет вам, какие файлы остались после принудительного удаления.

Потому что косплеить нейронку, равно как и любой другой толстый троллинг - это небесплатное удовольствие. Даже если это был не троллинг, а от всего чистого наивного сердца! Просто нефиг использовать узнаваемый нейроночный стиль.

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

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

Даже если неявно "... это работает для стабилизированного меня". Хотя бы потому, что предмет - прокрастинация - это некоторое патологическое состояние. То есть, для уже нестабильного. И тем более, непознанного, иначе бы вмиг исцелился.

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

А глядя только на самого себя изнутри самого себя - есть большой шанс позакрывать глаза.

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

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

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

Вот последняя редакция формулы.

Я прокрастинирую, когда я решаю:

  • сделать дело Y, показавшееся более важным, чем X,

  • вместо дела X, впоследствии показавшееся более важным, чем Y и …

  • испытаю неприятные чувства из‑за этого

И вот пример, который под неё подходит.

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

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

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

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

А вот ажиотаж вокруг цыплят создаёт пузырь. Как в прошлый раз вокруг ипотеки, как в позапрошлый - опять вокруг стартапов, как сотни лет назад - вокруг тюльпанов, пиратов, походов в Иерусалим...

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

Ну и человечество как-то не научилось ещё без психования совершать прорывы. Так что примитее неизбежное...

Потому что не тот инвариант ))) Мы же ищем не остаток, а только булев признак: делится или не делится.

Пусть N = d*X + R, где R нулевой или ненулевой остаток (0 <= R < d).

Тут надо расписать случаи:

  • N чётно и делится.
    Поскольку d нечётно, то X чётно. X = 2X'
    N = d*(2X')
    N' = N/2 = d*X'
    Нулевой остаток сохранился.

  • N чётно, не делится, остаток чётный. Но в таком случае и частное чётное.
    N = d*(2X') + 2R'
    N' = N/2 = d*X' + R'
    Ненулевой остаток сохранился.

  • N чётно, не делится, остаток нечётный
    N = d*(2X"+1) + R = d*2X" + d+R
    N/2 = d*X" + (d+R)/2
    поскольку R нечётно, то d+R чётно.
    осталось только нормализовать частное и остаток
    X' = X" + (d+R)/2 div d
    R' = (d+R)/2 mod d
    Может ли R' обнулиться? Нет, это возможно лишь если R = 0 mod d.
    Ненулевой остаток сохранился.

  • N нечётно и делится.
    N = d*X
    N' = N+d = d*(X+1)
    X' = X+1, R' = R = 0.
    Нулевой остаток сохранился.

  • N нечётно и не делится/
    N' = N+d = d*(X+1) + R
    X' = X+1, R' = R
    Ненулевой остаток сохранился.

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

Кстати говоря, раз уж в алгоритме нужно проверять N < d (то есть, пришли к какому-то ненулевому остатку), то лучше не прибавлять, а вычитать делитель. Всё равно эту работу проделываем.

Нет, это у вас розовые очки запотели.

Вы же сами сказали, что рынок живёт по законам рынка, а не по законам промышленности (какой бы она ни была, в том числе, и R&D и всякие пилотные проекты). Ну так продолжите эту мысль!

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

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

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

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

В конце концов, существует рынок свежевылупившихся цыплят. И для них строят инкубаторы (со стороны продавца), и птичники (со стороны покупателя). Это всё деньги, это всё инвестиции. И деловой партнёр вполне может сказать: ага, ты купил сто штук, тогда я в доле! мне твой птичник нравится, выходи на IPO.

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

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

Тюю. Я думал, тут будет про геометрию, что-то вроде "сенсация, эппл запатентовал сплайны" или "британские учёные показали, что для человеческого глаза приятны кривые, n-жды дифференцируемые в каждой точке"...

И собственно, формула этих поли-линий...

Берём квадрат (эквидистанту в метрике Чебышёва), берём окружность (эквидистанту в метрике Евклида), вау, квадратокружность! Берём квадрат, берём x^4 + y^4 = const, вау, сквиркл!

Собственно, "сквиркл" - это square-circle, тот самый эппл-пайнэппл-эппл-пен! Супперэллипс четвёртой степени.

А реверс-инжиниринг эппловских руководств по корпоративному дизайну - "сколько процентов для чего положено" - это лирика.

Литералы тоже являются объектами.

Вот только для поведения программы - если, разве что, не упороться по сравниванию их id'ов, - это не имеет значения.

Например, маленькие целые числа в питоне идентифицируют сами себя. Одинаковые значения - одинаковые id'ы. (Если бы это было не так, это была бы адская просадка производительности). А большие целые числа лежат в памяти, и два одинаковых могут лежать в разных местах.

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

Объект в ООП - это сущность с идентичностью, поведением и состоянием. Раз нам идентичность нужна, тогда мы вынуждены заморозить состояние. Можно наоборот - состояний много, но идентичность пропадает, это техника copy on write. Ну и поведение - либо не трогает идентичность (не переселяет объект), либо не трогает состояние.

Сравнивать текущие состояния объектов - не проблема. Проблема - использовать изменчивые объекты в качестве ключей в словарях. Поэтому волюнтаристским образом договариваются: если у объекта нет функций, изменяющих его, то только тогда мы ассоциируем с ним функцию нахождения хеша его состояния (сиречь, его значения) - добавляем метод в его класс. В C++ делают по-другому, там можно наложить константность на тип. (Эту константность, конечно, тоже можно хакнуть и сделать программе больно, - но зачем).

Польза в том, что где-то в другом месте могут быть ссылки на это же самое значение. И вот такое внезапное переписывание сломает всё.

x = 123
y = x
y += 456 # фактически, y = y + 4,5,6
assert x == 123

x = '123'
y = x
y += '456' # тоже замена объекта, y = y + '456'
assert x == '123'

x = (1,2,3)
y = x
y += (4,5,6) # тоже замена объекта
assert x == (1,2,3)

x = [1,2,3]
y = x
y += [4,5,6] # а вот у list это автоинкремент!
assert x == [1,2,3,4,5,6] # wtf, да?
assert id(x) == id(y)

Семантика значений предполагает неразличимость одинаковых экземпляров между собой. Семантика объектов - различает экземпляры по адресу. (Хотя сравнивать значения объектов никто не мешает).

Разные переменные могут ссылаться на один и тот же экземпляр.

В случае значений ссылка на общий экземпляр - это всего лишь оптимизация, и при изменении нужно выполнять copy on write. В случае объектов - это уже обязанность, заложенная в семантику.

x = SomeObject()     # создали объект "в воздухе" и затем запомнили его в x
y = x                # и его же (а не его копию) запомнили в y
x.DoSomething()      # этот объект что-то делает
y.DoSomethingElse()  # тот же самый объект делает что-то другое

Жизнь с семантикой только объектов - в принципе, возможна, но писанины при этом будет больше. Сишные строковые буферы со всеми этими strdup, strcpy, strcat мало людям крови попили?

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

Самый популярный баг - это дефолтные аргументы функций с семантикой изменяемого объекта. Опытные по этим граблям прошлись, поэтому дефолтят к чему-нибудь неизменяемому, например, None, а внутри функции ветвятся.

Это даже не научпоп, это научПОПСА. Столько воды - и ни о чём.

1
23 ...

Информация

В рейтинге
4 418-й
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Зарегистрирован
Активность