• Оригинальная озвучка (1)

    Чтобы насладиться продуктом в полной мере (игрой, фильмом, книгой), потребляйте его на языке оригинала. Особенно это касается английского контента, и вот почему.

    Я не знаю, как устроена русская озвучка в целом – я имею в виду общие принципы, – но она довольно странная. Там, где в оригинале персонаж шепчет, перводчик орет, словно над ухом. Русская озвучка до неприличия громкая как в маршрутке: громко, четко и заранее.

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

    Послушайте персонажей из “Омерзительной восьмерки” Тарантино. Там каждый голос – праздник. Южный выговор, северный, мексиканский акцент, оттяжки, проглатывание слогов и целых слов. Красота!

    То, что пропадают игра слов и различные отсылки, нет смысла писать. Видимо, на их адаптацию не остается времени.

    Теряются акценты речи. Например, босс называет чернокожего подчиненного “black cunt” – в переводе мы получаем “урод”. Конечно, я бы не хотел слышать дословный перевод, но вместе с тем и не должно быть беззубого сглаживания. Это же бандиты! Персонаж высказался грубо и уничижительно, и нужно как-то это передать.

    Приведу пример, который особенно меня расстроил. В игре Resident Evil 4 Remake есть дополнение за второстепенного персонажа. Это полноценная кампания, которая называется Separate ways – раздельные пути. В русской версии она называется “Два пути”. Казалось бы, довольно близко. Не все ли равно?

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

    I think we both know this is where we go our separate ways.

    Полагаю, мы оба знаем, что теперь наши пути – врозь.

    То есть речь идет о разобщении, о том, что альянсу конец.

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

    Скажите на милость, как русский перевод “Два пути” все это передаст? Ответ – никак, игрок просто проезжает мимо.

    Ясно, что не всегда уровень английского позволяет все понять без пауз и перемоток. Но результат того стоит. То же самое касается книг: в свободное время почитываю Остров сокровищ и Гарри Поттера на английском. Попадаются отличия, но об этом – в другой раз.

  • Гугл и Эпл

    Пишут, что Гугл закручивает гайки: запрещает ставить приложения из .apk-файлов. Основание – борьба с вирусами и обманом пользователей, когда под видом официального приложения им впаривают невесть что.

    Насколько я понял из комментариев, на самом деле будет так: приложения из .apk все-таки можно поставить, но только если они подписаны ключом разработчика. Чтобы получить этот ключ, нужно пройти верификацию Гугла, и, возможно, заплатить (последнее – неточно). Разумеется, если разработчик проштрафится, Гугл отзовет его ключ и все .apk, им подписанные, превратятся в тыкву.

    В этом плане установка из .apk не отличается от установки из магазина, потому что ограничения остаются в силе. Подойдет разве что приложениям, которые по требованию властей убрали из Play Store: фирма может выложить подписанный apk на сайте.

    Особым приложениям новое правило навредит. Это некая серая зона: софт, который полезен людям, но не пройдет модерацию Гугла. Например, приложение для диабетиков, которое дает указания по приему инсулина и других лекарств. Рекомендация лекарств запрещена в Гугле, поэтому люди выкладывают самосборный .apk. Что им теперь делать – не знаю.

    Я тоже получил письмо от Гугла с предложением пройти верификацию. Все потому, что лет пятнадцать(!) назад выкладывал в стор приложение – личный кабинет Читинского Энергосбыта. Им даже пользовались, а однажды какая-то УК хотела его купить.

    Вторая новость – Эпл создаст внутренний магазин приложений для России. Там смогут публиковаться те, кто под санкциями: всякие сберы-тиньковы и так далее. Пока что магазина нет, но Эпл сам идет навстречу.

    Я пишу это не для того, чтобы сказать: Гугл плохой, а Эпл – хороший. Дело в другом: принципы айти-гигантов всегда оказываются соглашением в моменте. Многие выбирали Андроид только затем, чтобы ставить ломанные приложухи с 4pda. Яблочников стыдили: у вас рабство. А теперь ситуация если не переменилась, то близка к этому: один гигант закручивает гайки, другой – ослабляет, хотя оба били себя пяткой в грудь и заявляли, что никогда такого не будет.

    Открытый код, бесплатность, убеждения руководителя – все это условно и справедливо только в моменте. Проходят годы и то, что было свободным, открытым или без рекламы, становится закрытым и собирает данные. Руководитель взрослеет и предпочитает не бороться, а договариваться.

    Словом, уверенность в положительных сторонах софта или сервиса сегодня не может быть долгой. Все течет, все меняется.

  • ИИ-выжимка

    Я часто гуглю и привык, что на первом месте – уже не ссылка или реклама, а блок с выжимкой ИИ (Gemini или как там ее). Должен признать, выжимка довольно точно пересказывает оригинал, и порой ее достаточно. Фактически, гуглить сегодня – все равно что пользоваться GPT: в обоих случаях вам покажут чей-то текст или их комбинацию.

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

    Полезным упражнением может быть вот что. Загуглите что-нибудь, над чем работали только вы. Например, библиотеку на Гитхабе с осмысленным readme. У меня есть такие, где в readme написано много. Скажем, “clоjure github deed” или “clоjure github pg2”. В результате Gemini покажет пересказ твоего же текста.

    Может быть, не совсем ясен смысл моего сообщения, но постараюсь объяснить. Большинство пользователей интернета – потребители. Они смотрят обучающие видео, статьи, подключают чужой код. Алгоритм, который собрал сотню источников и выдал их сжатую версию, кажется чудом. Но чудо пропадает, когда у какого-то кусочка знания один источник и работал над ним один человек – особенно если это вы.

    Когда понимаешь, что источник выжимки — ты сам, возникает интересное сопоставление. Своего рода маппинг между тем, что было в твоей голове и тем, что выдал Гугл. Примерно как смутно догадываешься, что будет по нажатию кнопки до того, как это сделаешь. Становится видна машинная природа алгоритма. Месяц тренировки – и научишься думать как он, чтобы выжимка была точнее и охватывала то, что нужно. По аналогии с сео-оптимизаторами, которые по множеству действий угадывали алгоритм ранжирования и пусть худо-бедно, но проталкивали одни сайты выше других.

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

    Если бы такой кусочек был, они бы увидели, как сильно заблуждаются.

  • A fake Clojure Object equals to what you want

    Imagine you write a unit test where you compare two maps:

    (is (= {:some {:nested {:id ...}}}
           (get-result)))
    

    Turns out, this map has a random UUID deep inside so you cannot blindly compare them with the “equals” function:

    (defn get-result []
      {:some {:nested {:id (random-uuid)}}})
    
    (is (= {:some {:nested {:id ???}}}
           (get-result)))
    

    This won’t work because the nested :id field will is random every time.

    What to do? Most often, people use libraries for fuzzy matching, DSLs, etc. Well, a single case still doesn’t mean you should drag in another library. Apparently, it could be solved with a dummy object that equals to any UUID:

    (def any-uuid
      (reify Object
        (equals [_ other]
          (uuid? other))))
    
    (= any-uuid (random-uuid))
    true
    
    (= any-uuid 42)
    false
    

    Now replace the value in your map, and the test will pass:

    (is (= {:some {:nested {:id any-uuid}}}
           (get-result)))
    

    It works the same for numbers:

    (def any-number
      (reify Object
        (equals [_ other]
          (number? other))))
    
    (= any-number 42)
    true
    
    (= any-number -99)
    true
    

    The only caveat is, this dummy object must be the first one in the = function. It does equal to any object on the left but the opposite is false: a normal UUID doesn’t equal to a fake UUID.

    For the rest, it short and trivial, and no other libraries are needed.

  • Индекс по created_at

    Маленькая техническая заметка про SQL. Такая: если в таблице есть поле created_at, по нему должен быть btree-индекс. Если поля нет, его нужно добавить вместе с индексом.

    Объяснение следующее. Срез по времени – это самая частая задача в работе с данными. Если не фиксировать время события, это обернется бедой.

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

    Я хотел выбрать события по времени, благо интервал небольшой, всего неделя. Но оказалось, что у поля created_at нет индекса. В таблице 400 миллионов записей, и отбор по нему работает страшно медленно: limit 10 занимает 8 минут.

    Добавить индекс в такую таблицу – страшно дорого. Это нужно делать ночью на выходных, кто на это пойдет?

    Скажете: используй create index CONCURRENTLY. А я скажу, что конкурентный индекс не работает для партицированных таблиц, а наша именно такая. Нужно делать либо обычный индекс в лоб, либо создавать конкурентный индекс для каждой партиции. Все сложно.

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

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

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

  • Собеседования (2)

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

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

    Недавно на Хабре была отличная статья: человек собеседовался в разные бигтехи: тиньковы, озоны и прочее. Если коротко – половина мест не отвечает, другая половина запускает бесконечный цикл собесов. Автор очень хотел в Тиньков, но когда ему назначили восьмой(!) собес, ушел в 2Гис.

    Мне кажется, причина простая – бюрократия и страх ответственности. Человек, который проводит собес, не может принять решение, но вместо того, чтобы признаться, говорит: вроде норм, но пусть посмотрит отдел X. Назначают собес с X, по итогам говорят: вроде норм, но пусть посмотрит отдел Y. И так далее, принцип ясен. Только когда совсем припрет, собираются и принимают решение.

    Допускаю, что в больших фирмах действует порочная система: если взяли хорошего человека, то ничего не будет, а если плохого – интервьюеру дадут по шапке. Отсюда трусливое поведение: выгодней свалить ответственность на другого, чем решать самому.

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

    Разумеется, система работает только на долгой дистанции. Если интервьюер или соискатель ушли по своему желанию, будет трудно понять, как все было.

    Когда я проводил собесы, делал это ответственно. На мой взгляд, интервьюер обязан твердо сказать: берем, не берем или, на крайний случай, берем с оговорками, например на грейд ниже. Если интервьюер жует сопли “вроде норм, но пусть еще посмотрят”, его нужно снять с собеседований. Ему дали работу, а он не справился и прячется за других.

    Ребята, которые собеседуют в тиньках-озонах-яндексах по 8 раз – у вас все плохо. Вы безответственные и трусливые. Давайте подтягивайтесь.

  • Собеседования (1)

    Переписывался на тему собеседований (привет, А.!) и вспомнил: в черновиках лежит заметка о том, как бы я провел собес сейчас.

    Надо сказать, что я давно этого не делал. Уже 10 лет я удаленьщик без права принимать решения, в том числе в плане найма. Однако я вижу, что происходит в индустрии, замечаю, как работают те, кто прошел собес. На базе этого складываю (теоретическое) представление о том, как собеседовать сегодня.

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

    Я уже рассказывал, как знакомый собеседовался в Яндекс. Он прошел один технический собес, дали второй. Он прошел второй, дали третий. Третий он не прошел, и в работе отказали. Знакомый тут же устроился в Газпром. Спрашивается, что это было?

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

    В чистом виде подход Яндекса: если ты прошел собес, это наша недоработка. Держи еще. Ты должен его провалить, познать унижение и пойти на грейд ступенью ниже.

    Чтобы не уподобляться Яндексу, давайте задания, которые проверяют все понемножку. Пусть человек форкнет пустой репозиторий и скачает себе. Далее пусть напишет физ-баз и проверит, нет ли в нем ошибок. Попросите добавить тест – выясните, пишет ли кандидат тесты в принципе, какой фреймворк использует. Встанет вопрос о том, как перехватывать вывод в консоль, здесь может быть до пяти вариантов. Предложите сделать функцию чистой. Попросите сделать физ-баз ленивым, то есть написать генератор. В чем разница между генератором и лист-компрехеншеном? Что такое оператор yield и как он здесь поможет?

    Результат запушить в форкнутый репозиторий и открыть мердж-реквест в исходный репозиторий.

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

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

    Дизайнер Людвиг Быстроновский рассказывал про сумму навыков. Речь вот о чем: профессионал считается таковым потому, что каждый этап он делает качественно. Спортсмен дышит, набирает скорость, отрывается от земли, летит, приземляется – и все это правильно. Даже если он накосячил на одном этапе, суммарное качество ставит его выше любителя. Так и в айти – если человек владеет гитом, пишет код, тесты, понимает продвинутые моменты, ходит в базу – на кой хрен гонять его целый час по деревьям? Или требовать с него интерпретатор Лиспа?

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

    Похожие мысли я читал у Кирилла Мокевнина. Он проводит собеседование так: нужно скачать реальный проект (один из сервисов Хекслета), запустить локально, поправить минорный баг, отправить пул-реквест. Все. С этим справляются единицы, большинство виснут на первом шаге, не могут выполнить две команды make.

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

  • Умиление дикарями

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

    Почему это так, понять не трудно. Еще несколько сотен лет назад белый человек завоевывал мир варварским способом, и в результате исчезли даже не особи (кто их считал), а виды – как животных, так и людей. Сегодня это умиление – своего рода плата за бесчинства в прошлом. Смотрите, теперь мы добрые.

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

    Хотели бы? То-то же. Поэтому умиление правильно назвать лицемерием. Если говоришь, что нравится, но не хочешь себе такого же, значит не нравится.

    Умиляясь дикарями, помните, что когда-то они были детьми, у которых отняли право жить цивилизованно. В случае с Африкой, конечно, ребенку нелегко выбраться из саванны в город. Однако те же амиши живут в километре от моллов и городов. Помеха в данном случае одна – родители.

    Амишам официально разрешено не иметь номера социального страхования. Их детям официально разрешено не посещать школу, если родители против. Разумеется, закон в последнюю очередь интересуется мнением ребенка. Родители не пустили в школу – ок, пусть сидит дома.

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

    Поэтому к черту разнообразие культур и языков; традиций, как правильно креститься: двумя или тремя пальцами, слева направо или наоборот. Из-за подобных штучек поубивали слишком много людей, чтобы ими интересоваться. Образованный человек без скреп, культурных кодов и прочих наслоений – самый мирный представитель нашего вида.

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

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

  • Айтишные вузы

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

    Рекрутеры жалуются, что месяцами не могут найти сеньорного разработчика.

    В первом случае можно винить ИИ: свежий выпускник примерно ему и соответствует. С точки зрения фирмы, зачем его брать? Возьмем опытного, а где новичку набирать опыт — его дело.

    Мне кажется, проблема вот в чем: выпускники не готовы к работе в айти. Даже после пяти лет обучения их нужно учить Гиту, рабочему процессу, минимальной рабочей этике. Фирма берет на себя то, что должен быть дать университет.

    Появилось великое множество онлайн-школ; слово “айти-курсы” стало мемом, потому что влечет за собой контекст, одновременно смешной и грустный. И все равно на рынке кадров несоответствие спроса: много выпускников, мало опытных ребят.

    Проблема в том, что многие преподы не понимают предмета, который преподают. Годами они дают студентам Паскаль или Си с классами, не понимая, что это бесконечно далеко от реальности.

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

    Зачем так учить студентов?

    А препод — писал ли он хоть раз код за деньги? Имеет ли представление о промышленной разработке? Знает ли, что такое код-ревью? Спорю на что угодно: большинство айти-преподов не пройдет собеседование на джуниора. Причина не в возрасте, а в отсталости от реалий: нужно знать Линукс, терминал, язык, тулинг к нему, тесты, фреймворки, хорошие практики и все остальное.

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

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

    Беда в том, что сфера образования зарегулирована по самые помидоры. Наши учителя и врачи — это самый подневольный слой общества. Учитель учит лишь в последнюю очередь, а так у него стек задач от министерства образования. Если он накосячит, дадут по голове директору, тот — завучу, а завуч съест учителя с потрохами.

    В университетском образовании не сильно лучше. Когда работал в Датаарте 10 лет назад, некоторые сотрудники преподавали в воронежском ВГУ. Постоянно жаловались на бюрократию и бумажную работу, многие в итоге ушли. А ведь это были специалисты с реальным опытом работы! Не Си с классами за 98 год, а настоящая промышленная разработка! Большая потеря для студентов.

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

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

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

    Нужно всего лишь начать.

    UPD: в комментариях в Телеграме накидали примеры подобных вузов. Не знал, спасибо!

  • Даты и файлы

    Бывает, мы сохраняем файл в папку, а такой файл уже есть. Возникает диалог что делать, в котором чаще всего нас интересует переименование. Поскольку мы уже выбрали имя, то хотели бы оставить его как есть и добавить хвостик. Обычно программы дописывают в конец счетчик: document, document (1), document (2) и так далее.

    Счетчик – это, конечно, лучше, чем ничего. Но еще лучше было бы дописывать в конец дату. С ней document, document (1), document (2) становятся document, document_20250807, document_20250808 и так далее. Как быть, если замена происходит в рамках одного дня? Добавлять часы и минуты, например:

    document_20250808.doc
    document_202508081442.doc
    document_202508081446.doc
    document_202508081458.doc
    

    Уже слышу как вы пишете: дата изменения хранится в мете файла, зачем таскать ее в имени? Дело в том, что эта дата всегда теряется. Это же мета – поэтому файловый менеджер может ее скопировать, а может и нет. Если закинуть файл в какой-нибудь S3, всю мету вы потеряете.

    Или скинул файл коллеге в каком-нибудь Teams, тот загнал его в Шарепоинт, а третий человек получил его в электронной почте. Уверены, что мета сохранится? Я бы очень удивился, если бы это было так.

    Однажды я работал с женщиной, у которой был пунктик. Каждый файл на ее компе начинался с префикса YYYYMMDD_. Она часто шарила экран, и я видел как при сохранении файлов она прописывала дату вручную. И таких файлов – сотни, если не тысячи. Скорее всего она знала про поиск файлов по датам, но с именем ей было удобней.

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

    Короче, я бы не отказался, если бы в диалоге сохранения файла был выбор, какой паттерн использовать: счетчик или дату. Еще лучше, если это будет глобальная настройка системы. Но вряд ли это скоро случится.

Страница 14 из 112