<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Максим</title><generator>teletype.in</generator><description><![CDATA[Максим]]></description><image><url>https://img1.teletype.in/files/0e/cd/0ecd75aa-4f23-40df-ba53-2d725d814300.png</url><title>Максим</title><link>https://teletype.in/@madteamlead</link></image><link>https://teletype.in/@madteamlead?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=madteamlead</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/madteamlead?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/madteamlead?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Fri, 24 Apr 2026 20:34:27 GMT</pubDate><lastBuildDate>Fri, 24 Apr 2026 20:34:27 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@madteamlead/short_ai_history</guid><link>https://teletype.in/@madteamlead/short_ai_history?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=madteamlead</link><comments>https://teletype.in/@madteamlead/short_ai_history?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=madteamlead#comments</comments><dc:creator>madteamlead</dc:creator><title>Синусоида искусственного интеллекта: от научной фантастики до ChatGPT</title><pubDate>Fri, 26 Sep 2025 09:59:40 GMT</pubDate><description><![CDATA[Когда мы слышим искусственный интеллект, в памяти всплывают не учебники, а сцены из фантастики. В книгах и фильмах ИИ всегда был больше, чем просто программа. В «2001: Космическая одиссея» HAL 9000 рассуждал и принимал решения, Терминатор показал пугающий образ восстания машин, у Азимова роботы жили по трём законам робототехники и спорили с людьми о морали.]]></description><content:encoded><![CDATA[
  <h3 id="NMDA">Начало в наших мечтах</h3>
  <p id="sH1u">Когда мы слышим искусственный интеллект, в памяти всплывают не учебники, а сцены из фантастики. В книгах и фильмах ИИ всегда был больше, чем просто программа. В «2001: Космическая одиссея» HAL 9000 рассуждал и принимал решения, Терминатор показал пугающий образ восстания машин, у Азимова роботы жили по трём законам робототехники и спорили с людьми о морали.</p>
  <p id="rGw2">Долгое время это оставалось лишь мечтой и художественным образом. Но начиная с 1950-х исследователи на полном серьёзе пытались воплотить эти фантазии в жизнь. И путь оказался не прямой, а похожий на синусоиду: взлёты, падения, зимы и новые возрождения.</p>
  <h3 id="SXY3">Амбиции и вера в будущее 1950-е</h3>
  <p id="kZVf">1950-е годы — момент рождения искусственного интеллекта как дисциплины. Алан Тьюринг предлагает простой, но мощный критерий: если в диалоге машина неотличима от человека, то она обладает интеллектом. </p>
  <p id="EKb7">В 1956 году проходит Дартмутская конференция. Джон Маккарти вводит термин <em>Artificial Intelligence</em>, а Аллен Ньюэлл и Герберт Саймон демонстрируют программу, доказывающую математические теоремы. Впервые появляется ощущение, что создание разумных машин — не вопрос фантастики, а инженерная задача ближайших десятилетий.</p>
  <h3 id="Yo0N">Первые результаты и рост оптимизма 1960-е</h3>
  <p id="Fcjd">1960-е показывают: компьютеры могут больше, чем от них ожидали. Программы решают уравнения, строят доказательства, разговаривают на английском. ELIZA, первый чат-бот, симулирует психотерапевта, а робот Shakey умеет воспринимать пространство и планировать действия. </p>
  <p id="ra2C">Появляется вера в то, что через 20 лет мы создадим полноценный машинный разум. Финансирование идёт миллионами долларов, а интерес СМИ только подогревает ожидания.</p>
  <h3 id="0eG9">Первая зима 1970-х </h3>
  <p id="skqb">Реальность быстро возвращает исследователей к земле. В начале 1970-х становится ясно — задачи развития искусственного интеллекта оказались куда сложнее, чем казалось. Великобритания после жёсткого отчёта Лайтхилла сворачивает большинство проектов, в США также падает уровень поддержки. Нейросети объявлены тупиковой ветвью — слишком ограниченные для реального применения. Наступает первая зима ИИ.</p>
  <h3 id="hSYv">Практическое направление: экспертные системы</h3>
  <p id="Fl0S">Но в тени разочарования рождается другое направление. Экспертные системы — это не универсальный интеллект, а формализация знаний узких специалистов. DENDRAL помогает химикам анализировать молекулы, MYCIN диагностирует инфекции крови, XCON экономит корпорациям десятки миллионов долларов, автоматически конфигурируя сложное оборудование. В 1980-е бизнес впервые ощущает реальную ценность ИИ. Возникает миллиардный рынок экспертных систем.</p>
  <h3 id="GGp6">Вторая зима 1980-х</h3>
  <p id="5tJ3">Проблема в том, что экспертные системы плохо масштабировались. Каждую базу знаний приходилось наполнять и обновлять вручную. Стоимость внедрения росла, а результат не всегда соответствовал ожиданиям. К концу 1980-х рынок рушится. DARPA сворачивает программы, сотни компаний закрываются. Вторая зима ИИ подрывает доверие к технологии.</p>
  <h3 id="j501">Возвращение интереса — начало 2000-х</h3>
  <p id="uOpw">1990-е и начало 2000-х дают новые инструменты: байесовские сети, статистические методы, первые шаги в области больших данных. В 1997 году IBM Deep Blue обыгрывает Гарри Каспарова. Это важный символ: пусть узко, но компьютер способен победить лучшего человека.</p>
  <p id="sX4R">2000-е закрепляют тренд. ИИ становится встроенной частью интернет-сервисов: фильтры спама, поисковые алгоритмы, рекомендательные системы. DARPA проводит первые соревнования для беспилотных автомобилей. В 2011 году IBM Watson выигрывает шоу Jeopardy!, а в iPhone появляется Siri.</p>
  <h3 id="Wo7V">Прорыв глубокого обучения 2012 </h3>
  <p id="N0ji">2012 год становится поворотным — сверточные нейросети вырываются вперёд на конкурсе ImageNet. За этим следуют победы AlphaGo над чемпионом мира в го (2016), которые ознаменовали собой прорыв в области искусственного интеллекта, доказав, что системы ИИ способны решать сложные задачи в областях, где человеческая интуиция считалась преобладающей. </p>
  <p id="5Nj2">Так же в этом году был взрывной рост качества распознавания речи и машинного перевода. </p>
  <p id="wa79">2017 год приносит архитектуру Transformer — основу для будущих языковых моделей. ИИ начинает переходить от узких задач к более универсальным возможностям.</p>
  <h3 id="cbCt">Эра генеративного ИИ</h3>
  <p id="BP4u">2020-е открывает GPT-3 с 175 млрд параметров. В 2022 году выходит ChatGPT — и за два месяца им пользуются уже 100 млн человек. Параллельно взлетают DALL-E, Stable Diffusion, MidJourney. Машины начинают не только классифицировать, но и создавать — текст, изображение, музыку.</p>
  <p id="papW">ИИ перестаёт быть инструментом для бородатых дядек в очках. Это инфраструктура для бизнеса, медицины, образования и творчества. Производственные системы предсказывают сбои, врачи используют алгоритмы для диагностики, банки — для борьбы с мошенниками.</p>
  <p id="BBHJ">История ИИ — это американские горки. Хайп → зима → хайп → зима → и снова хайп. Но с каждым циклом технологии оставляли после себя всё больше практической пользы. Экспертные системы стали первой формой настоящего прикладного ИИ. А сейчас мы живём в эпоху, когда ИИ — это рабочий инструмент, который жрёт одни профессии и создаёт другие.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@madteamlead/PropertyDescriptor</guid><link>https://teletype.in/@madteamlead/PropertyDescriptor?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=madteamlead</link><comments>https://teletype.in/@madteamlead/PropertyDescriptor?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=madteamlead#comments</comments><dc:creator>madteamlead</dc:creator><title>Как заменить setAccessible(true) для приватных полей на PropertyDescriptor</title><pubDate>Sun, 02 Mar 2025 10:46:05 GMT</pubDate><category>java</category><description><![CDATA[Многие разработчики используют рефлексию (setAccessible(true)) для изменения приватных полей, но начиная с Java 9 это уже не так просто. Доступ к setAccessible(true) ограничен модульной системой, а с каждым новым релизом Java эта лазейка становится сложнее. Да и ломать инкапсуляцию — это очень плохая идея.]]></description><content:encoded><![CDATA[
  <p id="wSqC">Многие разработчики используют рефлексию (<code>setAccessible(true)</code>) для изменения приватных полей, но начиная с Java 9 это уже не так просто. Доступ к <code>setAccessible(true)</code> ограничен модульной системой, а с каждым новым релизом Java эта лазейка становится сложнее. Да и ломать инкапсуляцию — это очень плохая идея. </p>
  <p id="ZuiQ">Поэтому мы будем использовать...</p>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="PeZm">PropertyDescriptor</p>
  </section>
  <p id="wWPo"><code>PropertyDescriptor</code> из пакета <code>java.beans</code> позволяет получить метод <code>set</code> для поля и безопасно вызывать его, не ломая рефлексию.</p>
  <section style="background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="3CMK">Давай разберем на примере. Вот так делать НЕ надо:</p>
  </section>
  <figure>
    <script src="https://gist.github.com/Shopot742/f0d010325edc5f9b2d499d4f98149992.js"></script>
  </figure>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="UFF0">А теперь через <code>PropertyDescriptor</code></p>
  </section>
  <figure>
    <script src="https://gist.github.com/Shopot742/45dfbb6cabf826612d6d84ca0a39a550.js"></script>
  </figure>
  <p id="CFUE">Почему лучше использовать <code>PropertyDescriptor?</code></p>
  <p id="FfHy"><strong>Не нарушает инкапсуляцию </strong>использует публичный сеттер вместо вмешательства в приватные поля.</p>
  <p id="o6qS"><strong>Совместимо с модульной системой Java</strong> – не требует <code>setAccessible(true)</code>, который ограничен в новых версиях.</p>
  <p id="F6n0"><strong>Безопасно для будущих обновлений</strong> – код продолжит работать даже после изменений в рефлексии.</p>
  <section style="background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="2fkS">Еще больше статей на канале для Java разработчиков и тимлидов <a href="https://t.me/madteamleadchannel" target="_blank">https://t.me/madteamleadchannel</a></p>
  </section>

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

]]></content:encoded></item></channel></rss>