<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Максим</title><author><name>Максим</name></author><id>https://teletype.in/atom/madteamlead</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/madteamlead?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@madteamlead?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=madteamlead"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/madteamlead?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-24T20:34:28.661Z</updated><entry><id>madteamlead:short_ai_history</id><link rel="alternate" type="text/html" href="https://teletype.in/@madteamlead/short_ai_history?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=madteamlead"></link><title>Синусоида искусственного интеллекта: от научной фантастики до ChatGPT</title><published>2025-09-26T09:59:40.047Z</published><updated>2025-09-28T10:43:19.914Z</updated><summary type="html">Когда мы слышим искусственный интеллект, в памяти всплывают не учебники, а сцены из фантастики. В книгах и фильмах ИИ всегда был больше, чем просто программа. В «2001: Космическая одиссея» HAL 9000 рассуждал и принимал решения, Терминатор показал пугающий образ восстания машин, у Азимова роботы жили по трём законам робототехники и спорили с людьми о морали.</summary><content type="html">
  &lt;h3 id=&quot;NMDA&quot;&gt;Начало в наших мечтах&lt;/h3&gt;
  &lt;p id=&quot;sH1u&quot;&gt;Когда мы слышим искусственный интеллект, в памяти всплывают не учебники, а сцены из фантастики. В книгах и фильмах ИИ всегда был больше, чем просто программа. В «2001: Космическая одиссея» HAL 9000 рассуждал и принимал решения, Терминатор показал пугающий образ восстания машин, у Азимова роботы жили по трём законам робототехники и спорили с людьми о морали.&lt;/p&gt;
  &lt;p id=&quot;rGw2&quot;&gt;Долгое время это оставалось лишь мечтой и художественным образом. Но начиная с 1950-х исследователи на полном серьёзе пытались воплотить эти фантазии в жизнь. И путь оказался не прямой, а похожий на синусоиду: взлёты, падения, зимы и новые возрождения.&lt;/p&gt;
  &lt;h3 id=&quot;SXY3&quot;&gt;Амбиции и вера в будущее 1950-е&lt;/h3&gt;
  &lt;p id=&quot;kZVf&quot;&gt;1950-е годы — момент рождения искусственного интеллекта как дисциплины. Алан Тьюринг предлагает простой, но мощный критерий: если в диалоге машина неотличима от человека, то она обладает интеллектом. &lt;/p&gt;
  &lt;p id=&quot;EKb7&quot;&gt;В 1956 году проходит Дартмутская конференция. Джон Маккарти вводит термин &lt;em&gt;Artificial Intelligence&lt;/em&gt;, а Аллен Ньюэлл и Герберт Саймон демонстрируют программу, доказывающую математические теоремы. Впервые появляется ощущение, что создание разумных машин — не вопрос фантастики, а инженерная задача ближайших десятилетий.&lt;/p&gt;
  &lt;h3 id=&quot;Yo0N&quot;&gt;Первые результаты и рост оптимизма 1960-е&lt;/h3&gt;
  &lt;p id=&quot;Fcjd&quot;&gt;1960-е показывают: компьютеры могут больше, чем от них ожидали. Программы решают уравнения, строят доказательства, разговаривают на английском. ELIZA, первый чат-бот, симулирует психотерапевта, а робот Shakey умеет воспринимать пространство и планировать действия. &lt;/p&gt;
  &lt;p id=&quot;ra2C&quot;&gt;Появляется вера в то, что через 20 лет мы создадим полноценный машинный разум. Финансирование идёт миллионами долларов, а интерес СМИ только подогревает ожидания.&lt;/p&gt;
  &lt;h3 id=&quot;0eG9&quot;&gt;Первая зима 1970-х &lt;/h3&gt;
  &lt;p id=&quot;skqb&quot;&gt;Реальность быстро возвращает исследователей к земле. В начале 1970-х становится ясно — задачи развития искусственного интеллекта оказались куда сложнее, чем казалось. Великобритания после жёсткого отчёта Лайтхилла сворачивает большинство проектов, в США также падает уровень поддержки. Нейросети объявлены тупиковой ветвью — слишком ограниченные для реального применения. Наступает первая зима ИИ.&lt;/p&gt;
  &lt;h3 id=&quot;hSYv&quot;&gt;Практическое направление: экспертные системы&lt;/h3&gt;
  &lt;p id=&quot;Fl0S&quot;&gt;Но в тени разочарования рождается другое направление. Экспертные системы — это не универсальный интеллект, а формализация знаний узких специалистов. DENDRAL помогает химикам анализировать молекулы, MYCIN диагностирует инфекции крови, XCON экономит корпорациям десятки миллионов долларов, автоматически конфигурируя сложное оборудование. В 1980-е бизнес впервые ощущает реальную ценность ИИ. Возникает миллиардный рынок экспертных систем.&lt;/p&gt;
  &lt;h3 id=&quot;GGp6&quot;&gt;Вторая зима 1980-х&lt;/h3&gt;
  &lt;p id=&quot;5tJ3&quot;&gt;Проблема в том, что экспертные системы плохо масштабировались. Каждую базу знаний приходилось наполнять и обновлять вручную. Стоимость внедрения росла, а результат не всегда соответствовал ожиданиям. К концу 1980-х рынок рушится. DARPA сворачивает программы, сотни компаний закрываются. Вторая зима ИИ подрывает доверие к технологии.&lt;/p&gt;
  &lt;h3 id=&quot;j501&quot;&gt;Возвращение интереса — начало 2000-х&lt;/h3&gt;
  &lt;p id=&quot;uOpw&quot;&gt;1990-е и начало 2000-х дают новые инструменты: байесовские сети, статистические методы, первые шаги в области больших данных. В 1997 году IBM Deep Blue обыгрывает Гарри Каспарова. Это важный символ: пусть узко, но компьютер способен победить лучшего человека.&lt;/p&gt;
  &lt;p id=&quot;sX4R&quot;&gt;2000-е закрепляют тренд. ИИ становится встроенной частью интернет-сервисов: фильтры спама, поисковые алгоритмы, рекомендательные системы. DARPA проводит первые соревнования для беспилотных автомобилей. В 2011 году IBM Watson выигрывает шоу Jeopardy!, а в iPhone появляется Siri.&lt;/p&gt;
  &lt;h3 id=&quot;Wo7V&quot;&gt;Прорыв глубокого обучения 2012 &lt;/h3&gt;
  &lt;p id=&quot;N0ji&quot;&gt;2012 год становится поворотным — сверточные нейросети вырываются вперёд на конкурсе ImageNet. За этим следуют победы AlphaGo над чемпионом мира в го (2016), которые ознаменовали собой прорыв в области искусственного интеллекта, доказав, что системы ИИ способны решать сложные задачи в областях, где человеческая интуиция считалась преобладающей. &lt;/p&gt;
  &lt;p id=&quot;5Nj2&quot;&gt;Так же в этом году был взрывной рост качества распознавания речи и машинного перевода. &lt;/p&gt;
  &lt;p id=&quot;wa79&quot;&gt;2017 год приносит архитектуру Transformer — основу для будущих языковых моделей. ИИ начинает переходить от узких задач к более универсальным возможностям.&lt;/p&gt;
  &lt;h3 id=&quot;cbCt&quot;&gt;Эра генеративного ИИ&lt;/h3&gt;
  &lt;p id=&quot;BP4u&quot;&gt;2020-е открывает GPT-3 с 175 млрд параметров. В 2022 году выходит ChatGPT — и за два месяца им пользуются уже 100 млн человек. Параллельно взлетают DALL-E, Stable Diffusion, MidJourney. Машины начинают не только классифицировать, но и создавать — текст, изображение, музыку.&lt;/p&gt;
  &lt;p id=&quot;papW&quot;&gt;ИИ перестаёт быть инструментом для бородатых дядек в очках. Это инфраструктура для бизнеса, медицины, образования и творчества. Производственные системы предсказывают сбои, врачи используют алгоритмы для диагностики, банки — для борьбы с мошенниками.&lt;/p&gt;
  &lt;p id=&quot;BBHJ&quot;&gt;История ИИ — это американские горки. Хайп → зима → хайп → зима → и снова хайп. Но с каждым циклом технологии оставляли после себя всё больше практической пользы. Экспертные системы стали первой формой настоящего прикладного ИИ. А сейчас мы живём в эпоху, когда ИИ — это рабочий инструмент, который жрёт одни профессии и создаёт другие.&lt;/p&gt;

</content></entry><entry><id>madteamlead:PropertyDescriptor</id><link rel="alternate" type="text/html" href="https://teletype.in/@madteamlead/PropertyDescriptor?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=madteamlead"></link><title>Как заменить setAccessible(true) для приватных полей на PropertyDescriptor</title><published>2025-03-02T10:46:05.422Z</published><updated>2025-03-02T10:46:05.422Z</updated><category term="java" label="java"></category><summary type="html">Многие разработчики используют рефлексию (setAccessible(true)) для изменения приватных полей, но начиная с Java 9 это уже не так просто. Доступ к setAccessible(true) ограничен модульной системой, а с каждым новым релизом Java эта лазейка становится сложнее. Да и ломать инкапсуляцию — это очень плохая идея.</summary><content type="html">
  &lt;p id=&quot;wSqC&quot;&gt;Многие разработчики используют рефлексию (&lt;code&gt;setAccessible(true)&lt;/code&gt;) для изменения приватных полей, но начиная с Java 9 это уже не так просто. Доступ к &lt;code&gt;setAccessible(true)&lt;/code&gt; ограничен модульной системой, а с каждым новым релизом Java эта лазейка становится сложнее. Да и ломать инкапсуляцию — это очень плохая идея. &lt;/p&gt;
  &lt;p id=&quot;ZuiQ&quot;&gt;Поэтому мы будем использовать...&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;PeZm&quot;&gt;PropertyDescriptor&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;wWPo&quot;&gt;&lt;code&gt;PropertyDescriptor&lt;/code&gt; из пакета &lt;code&gt;java.beans&lt;/code&gt; позволяет получить метод &lt;code&gt;set&lt;/code&gt; для поля и безопасно вызывать его, не ломая рефлексию.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;3CMK&quot;&gt;Давай разберем на примере. Вот так делать НЕ надо:&lt;/p&gt;
  &lt;/section&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/Shopot742/f0d010325edc5f9b2d499d4f98149992.js&quot;&gt;&lt;/script&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;UFF0&quot;&gt;А теперь через &lt;code&gt;PropertyDescriptor&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/Shopot742/45dfbb6cabf826612d6d84ca0a39a550.js&quot;&gt;&lt;/script&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;CFUE&quot;&gt;Почему лучше использовать &lt;code&gt;PropertyDescriptor?&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;FfHy&quot;&gt;&lt;strong&gt;Не нарушает инкапсуляцию &lt;/strong&gt;использует публичный сеттер вместо вмешательства в приватные поля.&lt;/p&gt;
  &lt;p id=&quot;o6qS&quot;&gt;&lt;strong&gt;Совместимо с модульной системой Java&lt;/strong&gt; – не требует &lt;code&gt;setAccessible(true)&lt;/code&gt;, который ограничен в новых версиях.&lt;/p&gt;
  &lt;p id=&quot;F6n0&quot;&gt;&lt;strong&gt;Безопасно для будущих обновлений&lt;/strong&gt; – код продолжит работать даже после изменений в рефлексии.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;2fkS&quot;&gt;Еще больше статей на канале для Java разработчиков и тимлидов &lt;a href=&quot;https://t.me/madteamleadchannel&quot; target=&quot;_blank&quot;&gt;https://t.me/madteamleadchannel&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>madteamlead:spring-boot-predestroy-postconstruct</id><link rel="alternate" type="text/html" href="https://teletype.in/@madteamlead/spring-boot-predestroy-postconstruct?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=madteamlead"></link><title>Spring Boot 3+ Lifecycle: Почему стоит отказаться от @PostConstruct и @PreDestroy?</title><published>2025-02-12T08:29:06.178Z</published><updated>2025-03-02T14:32:53.204Z</updated><category term="spring-boot" label="Spring Boot"></category><summary type="html">Хотя @PostConstruct и @PreDestroy долгое время были надежными инструментами, они имеют ряд ограничений:</summary><content type="html">
  &lt;p id=&quot;7USZ&quot;&gt;Хотя &lt;code&gt;@PostConstruct&lt;/code&gt; и &lt;code&gt;@PreDestroy&lt;/code&gt; долгое время были надежными инструментами, они имеют ряд ограничений:&lt;/p&gt;
  &lt;ol id=&quot;axb9&quot;&gt;
    &lt;li id=&quot;DTdw&quot;&gt;&lt;strong&gt;Жесткая привязка к Jakarta EE/JSR-250&lt;/strong&gt;: Эти аннотации являются частью пакета &lt;code&gt;jakarta.annotation&lt;/code&gt; , что связывает ваш код с конкретным API. Это не всегда плохо, но может ограничить гибкость, если вы хотите использовать другие фреймворки или стратегии управления жизненным циклом.&lt;/li&gt;
    &lt;li id=&quot;G28D&quot;&gt;&lt;strong&gt;Ограниченная гибкость&lt;/strong&gt;: Эти аннотации работают только для методов и не предоставляют возможности для обработки более сложных сценариев, таких как условная инициализация или асинхронная настройка.&lt;/li&gt;
    &lt;li id=&quot;5j8I&quot;&gt;&lt;strong&gt;Сложности при тестировании&lt;/strong&gt;: Методы, помеченные &lt;code&gt;@PostConstruct&lt;/code&gt; и &lt;code&gt;@PreDestroy&lt;/code&gt; , сложнее мокать или тестировать изолированно, особенно при работе со сложными зависимостями.&lt;/li&gt;
    &lt;li id=&quot;ZeoC&quot;&gt;&lt;strong&gt;Современные альтернативы&lt;/strong&gt;: Spring Boot 3+ и экосистема Spring предлагают более мощные и гибкие способы управления жизненным циклом, что делает эти аннотации устаревшими.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;FJgg&quot;&gt;Современные альтернативы в Spring Boot 3+ &lt;/h2&gt;
  &lt;p id=&quot;1KXv&quot;&gt;Вот несколько современных подходов, которые могут заменить &lt;code&gt;@PostConstruct&lt;/code&gt; и &lt;code&gt;@PreDestroy&lt;/code&gt; в ваших приложениях на Spring Boot:&lt;/p&gt;
  &lt;h3 id=&quot;TYtg&quot;&gt;Использование интерфейсов InitializingBean и DisposableBean &lt;/h3&gt;
  &lt;p id=&quot;GICI&quot;&gt;Spring предоставляет два интерфейса, &lt;code&gt;InitializingBean&lt;/code&gt; и &lt;code&gt;DisposableBean&lt;/code&gt; , которые позволяют определять методы жизненного цикла непосредственно в ваших бинах.&lt;/p&gt;
  &lt;figure id=&quot;xb4e&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;data:text/html;charset=utf-8, &lt;head&gt;&lt;base target=&amp;#x27;_blank&amp;#x27; /&gt;&lt;/head&gt; &lt;body&gt;&lt;script src=&amp;#x27;https://gist.github.com/Shopot742/614cb2aea11e91e55de417b7f0bf4606.js&amp;#x27;&gt;&lt;/script&gt; &lt;/body&gt;&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;rm6P&quot;&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;:&lt;br /&gt;- Нет зависимости от &lt;code&gt;javax.annotation&lt;/code&gt; или &lt;code&gt;jakarta.annotation&lt;/code&gt;.&lt;br /&gt;- Прямая интеграция с управлением жизненным циклом Spring.&lt;/p&gt;
  &lt;p id=&quot;6v0Q&quot;&gt;&lt;strong&gt;Минусы&lt;/strong&gt;:&lt;br /&gt;- Жестко связывает ваш бин с интерфейсами Spring.&lt;/p&gt;
  &lt;h3 id=&quot;NMDn&quot;&gt;Использование методов инициализации и уничтожения в &lt;code&gt;@Bean&lt;/code&gt;&lt;/h3&gt;
  &lt;p id=&quot;T9D3&quot;&gt;При определении бинов с помощью &lt;code&gt;@Bean&lt;/code&gt; в конфигурационном классе можно указать методы инициализации и очистки напрямую.&lt;/p&gt;
  &lt;figure id=&quot;r5p8&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;data:text/html;charset=utf-8, &lt;head&gt;&lt;base target=&amp;#x27;_blank&amp;#x27; /&gt;&lt;/head&gt; &lt;body&gt;&lt;script src=&amp;#x27;https://gist.github.com/Shopot742/73a44857899520496bb4b33829d999bc.js&amp;#x27;&gt;&lt;/script&gt; &lt;/body&gt;&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7XAA&quot;&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;:&lt;br /&gt;- Отделяет методы жизненного цикла от класса бина.&lt;br /&gt;- Подходит для работы со сторонними библиотеками, где нельзя изменить исходный код.&lt;/p&gt;
  &lt;p id=&quot;MBjE&quot;&gt;&lt;strong&gt;Минусы&lt;/strong&gt;:&lt;br /&gt;- Требует явной конфигурации в определении &lt;code&gt;@Bean&lt;/code&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;VcaG&quot;&gt;Использование &lt;code&gt;SmartLifecycle&lt;/code&gt; для продвинутого управления жизненным циклом&lt;/h3&gt;
  &lt;p id=&quot;XPvx&quot;&gt;Для более сложных сценариев, таких как поэтапный запуск или завершение работы, можно реализовать интерфейс &lt;code&gt;SmartLifecycle&lt;/code&gt;.&lt;/p&gt;
  &lt;figure id=&quot;KcTg&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;data:text/html;charset=utf-8, &lt;head&gt;&lt;base target=&amp;#x27;_blank&amp;#x27; /&gt;&lt;/head&gt; &lt;body&gt;&lt;script src=&amp;#x27;https://gist.github.com/Shopot742/2ea9394f88f4b31194a267239f574c1e.js&amp;#x27;&gt;&lt;/script&gt; &lt;/body&gt;&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;EA1j&quot;&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;:&lt;br /&gt;- Предоставляет детальный контроль над этапами запуска и завершения.&lt;br /&gt;- Поддерживает упорядоченную инициализацию и завершение.&lt;/p&gt;
  &lt;p id=&quot;deQs&quot;&gt;&lt;strong&gt;Минусы&lt;/strong&gt;:&lt;br /&gt;- Более сложен в реализации по сравнению с другими решениями.&lt;/p&gt;
  &lt;h3 id=&quot;DZed&quot;&gt;Использование &lt;code&gt;@EventListener&lt;/code&gt; для событий жизненного цикла контекста&lt;/h3&gt;
  &lt;p id=&quot;rlr2&quot;&gt;Вы можете слушать события &lt;code&gt;ContextRefreshedEvent&lt;/code&gt; и &lt;code&gt;ContextClosedEvent&lt;/code&gt; для выполнения инициализации и очистки. А также &lt;code&gt;@EventListener(ApplicationReadyEvent.class)&lt;/code&gt; или &lt;code&gt;@EventListener(ApplicationPreparedEvent.class)&lt;/code&gt; для задач, которые необходимо запустить в момент старта приложения.&lt;/p&gt;
  &lt;figure id=&quot;mAhv&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;data:text/html;charset=utf-8, &lt;head&gt;&lt;base target=&amp;#x27;_blank&amp;#x27; /&gt;&lt;/head&gt; &lt;body&gt;&lt;script src=&amp;#x27;https://gist.github.com/Shopot742/174301ceafc666fe8edc02322ecded9c.js&amp;#x27;&gt;&lt;/script&gt; &lt;/body&gt;&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ylo9&quot;&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;:&lt;br /&gt;- Отделяет логику жизненного цикла от самого бина.&lt;br /&gt;- Подходит для глобальной инициализации и очистки.&lt;/p&gt;
  &lt;p id=&quot;GdB0&quot;&gt;&lt;strong&gt;Минусы&lt;/strong&gt;:&lt;br /&gt;- Применяется ко всему контексту, а не к отдельным бинам, то есть мы создаем &lt;code&gt;@Component&lt;/code&gt; для отдельных задач - запуска инициализации БД, например.&lt;br /&gt;-  В случае, когда в приложении существует несколько контекстов, обработчик событий может реагировать на события из всех контекстов. Если для приложения важно реагировать только на события основного, родительского контекста, то события можно отфильтровать проверкой &lt;code&gt;@EventListener(condition = &amp;quot;event.applicationContext.parent == null&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;h2 id=&quot;MQWq&quot;&gt;Какой подход выбрать?&lt;/h2&gt;
  &lt;p id=&quot;jDz8&quot;&gt;Лучший подход зависит от вашего конкретного сценария:&lt;/p&gt;
  &lt;p id=&quot;KTj3&quot;&gt;- Для простой инициализации и очистки подойдут методы &lt;code&gt;@Bean&lt;/code&gt; или &lt;code&gt;InitializingBean|DisposableBean&lt;/code&gt;.&lt;br /&gt;- Для продвинутого управления жизненным циклом используйте &lt;code&gt;SmartLifecycle&lt;/code&gt;.&lt;br /&gt;- Для логики, основанной на событиях жизненого цикла приложения выбирайте &lt;code&gt;@EventListener&lt;/code&gt;&lt;/p&gt;

</content></entry></feed>